But don't forget that today it's often faster to program it first without a plan, and rewrite it a few times later; than to draw such nice design plans and iterate on them before writing actual code.
Also, in some cases, writing actual code reveals some unforeseen problems in design.