Das kommt ganz auf die Größe des Programms an. Wenn es nur ein kleines Programm ist, also vielleicht 1000 Zeilen Quelltext oder so, dann habe ich die Struktur im Kopf und ich plane nicht viel.
Bei größeren Programmen benutze ich Modellingtools, mit denen ich die Struktur des Programms plane. Also die Aufteilung in Klassen, Prozeduren, etc.
Bei einem meiner Programme hat bspw. die Planungsphase alleine 8 Wochen gedauert, die Implementierung 10 Monate, die Alphatestphase 4 Wochen, Betatest 3 Wochen, Bugfixing 1 Woche, d.h. Planung + Test fast halb so lange wie die Implementierung selbst. Dafür habe ich nur genau 7 unkritische Fehler von den Benutzern gemeldet bekommen.
Was das Ausdrucken angeht: Bei mir persönlich wäre das kontraproduktiv, weil ich am PC den besseren Überblick habe, auch bei kleineren Projekten, aber natürlich erst recht bei größeren. Zudem wäre das auch zu viel Papier, bei dem eben genannten Projekt wären es ca. 800 DIN A4 Seiten...
Wichtig ist eigentlich, dass du dir vorher überlegst, was du eigentlich brauchst und nicht mittendrin plötzlich neue Prozeduren, etc, erstellst. Dann benennt man die nicht so gut meistens und es wird unübersichtlicher, natürlich meine ich jetzt nicht lokale Prozeduren innerhalb einer anderen oder so. Klar ist aber auch, dass das bei kleineren Programmen nicht so wichtig ist, auch wenn eine Planung immer gut ist, vor allem zur Übung. Denn wenn du sowas noch nie gemacht hast, kannst du es bei einem größeren Projekt schlicht und einfach nicht.
// EDIT:
Ach so: Zu den Tests:
Ich habe 3 Leute, mit denen ich zusammenarbeite, die drei testen meine Programm im Alphatest und ich deren Programme. So hat jeder drei andere Entwickler, die die Programme testen, und die auch Schwachstellen (Extremverhalten) ganz gut erraten können.
Danach im Betatest sind das dann ca. 20 Leute, je nachdem wieviele gerade Lust habe. Wichtig ist hierbei finde ich, dass da auch Leute dabei sind, die nicht so viel Ahnung am PC haben, um die Benutzerfreundlichkeit und Intuitivität der Oberfläche zu testen.