Encouraging Critical Thinking On Programs Before Students Write Them
I agree very much with ctrl-alt-delor that the level of "total novice" might be rather early to introduce larger-scale meta-design techniques into coursework.  The work being done at that level simply does not require (at a cognitive level) such deep planning to execute properly.  Since the need is not self-apparent, efforts to bring it into their work will typically feel like extra, needless work.

If you would like to help them understand how to use plans (and how to utilize good, structural thinking), here is a way you might go about it.  Provide a diagram in class, and talk through it as a group.  Next, ask the students to work with a buddy to make a series of modifications for different purposes.  At the end of this exercise, they will have several different diagrams.

Ask them to choose one of their diagrams, and imagine that some other coder will have provided some source code that attempts to follow their specification.  However, it is their job to verify that the code that they receive truly will work as specified.  They should now work with their buddy to design the trickiest test cases that they can think of!

You can encourage this by enthusiastically placing great examples of test cases on the board as students come up with them.  "Look, how wonderful! Testing for the empty string!"  Or "Using a negative number is a great way to try to trip things up!  Great thinking!"

Finally, whichever project they chose for their test code, they should actually program as a lab.  (This could be done as paired programming or as solo work.)  When they submit their lab, they will provide a UML diagram, thoughtful test cases, and their coded solution.

Congratulations! You've now integrated student choice, prior design, unit-testing (well, the core of it anyway), pair programming, and created an assignment that is harder to cheat on than the standard mainstays (like sorting algorithms) in a way that feels natural and un-forced.