Fehler machen ist meiner Meinung nach kein Verbrechen, mich wunderst meist wenn eine neu geschriebene function ohne jegliche Fehlermeldung startet.
Fehler die (bei mir) häufig auftreten:
- tippfehler
- semikolon vergessen
- runde klammer zu wenig ")" (beim schließen)

Aber das ist nicht wirklich schlimm, da steht dann ja die zeile und man guckt noch mal in den code rein.
Wenn es hingegen reibungslos beim ersten mal startet, teste ich die function noch umso ausführlicher um sicher zugehen, dass sie auch das tut was ich will

Das mit dem debug fenster ist ein guter Tipp, hab mir gestern abend erstmal selbst eins geschrieben.
Nützlich ist es auch, wenn man viele werte hat die in dem fenster ausgegeben werden, sie gleichzeitig in eine datei zu schreiben (bei jedem neustart der debug function wird die datei bei mir "gelöscht") um dann später in ruhe alles noch mal durchlesen zu können.

Sehr nützlich ist es, wie schon angesprochen, wieder verwendbaren code zu schreiben. (Module)
Dieser sollte dann jedoch sehr ausführlich kommentiert werden um eine wiederverwendbarkeit zu garantieren (auch schon angesprochen).

Was vermieden werden sollte:
Mehrere functions die zwar verschiedene parameter erhalten aber im prinzip das gleiche machen.
Besser ist es eine function zu haben die "das große" ganze macht und die kleinen anderen functions wandeln ihre erhaltenen parameter in die entsprechende form um, um dann letzten endes nur die "große" function damit aufzurufen.
Spart sich einiges an tipp arbeit und debug bzw. änderungs arbeit.

Um kleinere code snippets zu schreiben, wenn man z.b. anderen usern hier im Forum hilft, ist es nützlich dafür ein eigenes test level zu haben in dem man dann die snippets schnell und bequem einbinden und testen kann.
Das lohnt sich auch bei größeren projekten um neue funktions, die nichts mit anderen zu tun haben, also ein eigenständiges programm modul darstellen, zu testen.

Aber genug der worte, das meiste wurde ja schon gesagt.