Non è sempre una brutta cosa, IMHO. Ma la chiave è che quando inizi a scrivere codice per risolvere un problema non capisci bene dovresti farlo per per capire meglio il problema, e perché è il modo più veloce per tu per farlo. Dovresti essere disposto a gettare via il codice una volta che è servito a tale scopo. Concomitantly non dovresti mettere più lavoro in quel codice di quanto sia necessario per servire a tale scopo.
Sono un grande sostenitore della prototipazione di alcuni problemi difficili. In realtà ho speso circa 6 mesi l'anno scorso solo a prototipare vari aspetti di un problema su cui sto lavorando. Ho anche fatto un sacco di lavoro a matita e carta durante quel periodo. Il motivo era che il problema era davvero molto difficile (almeno per me) e anche molto difficile da definire con precisione. Quindi svilupperemmo un'idea per un approccio e poi faremo un po 'di codice per vedere se ha funzionato. In molti casi abbiamo rivelato che la nostra idea era imperfetta, quindi dovevamo tornare indietro, pensare a un altro approccio e quindi codificare il test più semplice di quello che potevamo.
Un grande pericolo è che inizierai a scrivere codice prima di capire un problema e di essere così attaccato al tuo codice sub-ottimale che finisce nel prodotto finito. Un altro è che passerai troppo tempo a "placcare l'oro" qualcosa che non funzionerà mai.
Un modo in cui abbiamo evitato questo era l'implementazione dei nostri prototipi usando un linguaggio di livello superiore (e in ultima analisi troppo lento) e una piattaforma molto più leggera di quella che alla fine ci eravamo prefissati. Abbiamo ignorato molte delle regole della buona ingegneria del software: il nostro codice non era destinato a vivere molto oltre il punto in cui aveva risposto alle nostre domande in modo soddisfacente, quindi l'eccessiva ingegnerizzazione sarebbe stata una perdita di tempo. Abbiamo fatto il minimo indispensabile per ottenere le risposte di cui avevamo bisogno. E abbiamo lavorato tanto quanto potevamo stampare su carta o su una lavagna prima di iniziare un prototipo.
Sono un grande sostenitore nel pensare le cose fino a che si può ragionevolmente anticipare. Ma a volte è necessario codificare qualcosa per assicurarsi che ciò che si sta pensando abbia senso. Quando pensare e quando codificare (beh, si spera che continui a scrivere mentre si scrive il codice;)) è una domanda difficile, e come molte cose nello sviluppo del software, una questione di giudizio.
EDIT: La cosa principale che volevo trasmettere qui è che penso sia importante sapere perché stai codificando. Qualche codice è destinato a finire in produzione. Qualche codice è pensato per rispondere alle domande. Dove ti metti nei guai confonde i due.