Cosa c'è di così brutto nella codifica creativa? [chiuso]


42

Stasera stavo guardando Bob Ross dipingere degli "alberi felici" e ho capito cosa mi ha stressato il mio codice ultimamente.

La comunità di persone qui e su Stack Overflow sembra rifiutare qualsiasi soffio di imperfezione. Il mio obiettivo è scrivere codice rispettabile (e quindi mantenibile e funzionante), migliorando le mie capacità. Eppure, codice in modo creativo.

Lasciami spiegare cosa intendo per "codifica in modo creativo":

  • I miei primi passi in un progetto sono spesso sedermi e sottrarre un po 'di codice. Per cose più grandi, ho in programma un po 'qua e là, ma soprattutto mi tuffo e basta.
  • Non faccio uno schema delle mie lezioni, a meno che non stia lavorando con altri che stanno creando altri pezzi nel progetto. Anche allora, non è certo la prima cosa che faccio. In genere non lavoro su grandi progetti e non trovo la grafica molto utile.
  • Il primo giro di codice che scrivo verrà riscritto molte, molte volte mentre collaudo, semplifico, rifaccio e trasformo l'hack originale in qualcosa di riutilizzabile, logico ed efficiente.

Durante questo processo, pulisco sempre. Rimuovo il codice inutilizzato e commento tutto ciò che non è ovvio. Provo costantemente.

Il mio processo sembra andare controcorrente di ciò che è accettabile nella comunità degli sviluppatori professionisti e vorrei capire perché.

So che la maggior parte delle lamentele sul cattivo codice è che qualcuno si è bloccato con il pasticcio di un ex dipendente, e costava molto tempo e denaro da risolvere. Che ho capito. Quello che non capisco è come il mio processo sia sbagliato, dato che il risultato finale è simile a quello che otterresti con la pianificazione di tutto dall'inizio. (O almeno, è quello che ho trovato.)

Ultimamente la mia ansia per il problema è stata così grave che ho smesso di scrivere codice fino a quando non so tutto quello che c'è su ogni metodo per risolvere il problema specifico su cui sto lavorando. In altre parole, per lo più ho smesso del tutto di codificare.

Apprezzo sinceramente il tuo contributo, non importa quali siano le tue opinioni in merito.

Modifica: grazie a tutti per le risposte. Ho imparato qualcosa da ciascuno di essi. Siete stati tutti molto utili.


6
Non c'è niente di sbagliato nel modo in cui lavori, sai cosa è importante nel risultato finale, ed è quello che conta davvero. È solo che potresti avere difficoltà a lavorare con una grande squadra in quel modo, ma probabilmente ti adatterai in questo caso. Sembra davvero che tu stia andando dritto per Analisi Paralisi: sourcemaking.com/antipatterns/analysis-paralysis
Bjarke Freund-Hansen,

39
Mesi di riscrittura ti faranno risparmiare giorni di pianificazione!
Jonas,

3
@Jonas: buono. Ma non dovresti davvero sottovalutare l'analisi della paralisi. Con tutti i "buoni consigli" su metodologie, modelli di progettazione, ecc. In questi giorni, è davvero facile avere l'impressione che dovresti pianificare, analizzare e progettare per giorni e giorni prima ancora di toccare una singola riga di codice . E questo può facilmente diventare molto controproducente. La realtà che credo è capire quale pianificazione e progettazione in anticipo può aiutarti a lungo termine e capire quando immergerti per avere un po 'di feeling con ciò su cui stai lavorando e per realizzare qualcosa.
Bjarke Freund-Hansen,

4
Dal manifesto Agile: "Il software di lavoro è la misura principale del progresso".
Gary Rowe,

2
È quasi come se il mondo della programmazione fosse pieno di primadonne. Non posso dirti quanto sia frustrante andare su SO e vedere una domanda perfettamente valida annullata 5 volte perché l'utente non scrive in un inglese perfetto o il codice è considerato "troppo principiante" per l'elite.
Scottie,

Risposte:


29

Non c'è niente di sbagliato nel codice-test-refactor-repeat, basta dire alla gente che stai prototipando.

D'altra parte, per i progetti più grandi scoprirai che un po 'di pensiero dato al design in anticipo ti farà risparmiare un sacco di tempo nel ciclo oh-crap-now-what!

PS: le tecniche di diagramma ti aiutano ad apprendere le abilità di pensiero visivo, che sono utili anche se nessuno ti vede mai i tuoi diagrammi.


4
"code-test-refactor-repeat" (o qualche sua permutazione) è il modo in cui scriviamo il codice. Forse Superman è "codificato", ma i mortali devono iterare.
Martin Wickman,

5
@Martin: un po 'di pensiero iniziale in quel loop è spesso vantaggioso ;-)
Steven A. Lowe,

4
fintanto che sai quanto "alcuni" è!
Frank Shearar,

Grazie per la risposta. Non avevo mai pensato che quello che stavo facendo fosse la prototipazione, ma in effetti è esattamente quello che sto facendo. La tua risposta mi ha dato un nuovo modo di vedere le cose e apprezzo molto la tua risposta.
Brad,

7
@Brad, ricorda che occasionalmente i prototipi devono morire invece di evolversi.

21

Preferisco sempre un codice chiaro, leggibile e semplice a qualsiasi codice visivamente presentato, UML, con motivi di design, in cui classe / interfaccia includano nomi di pattern come "ItemVisitor" (?!). Modelli di progettazione, tecniche OO e tutto il resto devono formalizzare le regole. Quelle regole derivano dal buon senso.

È impossibile lavorare senza quella formalizzazione (a meno che non si lavori da soli sul proprio progetto) e l'eccessiva formalizzazione aumenta i costi del progetto. Non trascurare mai le esigenze degli altri di comprendere il tuo codice. Il codice migliore è il più semplice.

Non esitare mai a riscrivere il tuo codice. Per questo otterrò X downgrade (X> = 10), ma lo renderò audace: la riusabilità del codice non è la cosa più importante .

Prima di fissare il codice, è necessario considerare i casi d'uso che il codice implementerà. Perché il software deve essere usato e non sviluppato. Usabilità, utilità sono i due obiettivi più importanti e non importa chi userà quel software: un altro sviluppatore di parti dipendenti del progetto o l'utente finale.


4
+1 per "la riusabilità del codice non è la cosa più importante". A volte hai bisogno di un coltellino svizzero, a volte hai bisogno di un bisturi.
mu è troppo corto il

Grazie per i vostri commenti. Per quanto riguarda ciò per cui verrà utilizzato il software risultante, è sicuramente qualcosa che tengo presente durante l'intero processo. Sono d'accordo, questa è la parte più importante. Ho accennato alla riusabilità del codice, poiché fa molto per raggiungere questo obiettivo.
Brad,

Di nuovo +1 per "la riusabilità del codice non è la cosa più importante" e non un singolo downvote (finora)
Gary Rowe,

Penso che l'estrema attenzione alla "riusabilità" sia stata una versione ridotta di Don't Repeat Yourself e l'eliminazione della duplicazione.
Rob K

"Usa prima del riutilizzo" lo ha persino trasformato in un bel piccolo libro: 97things.oreilly.com/wiki/index.php/…
Lovis

14

Sono più o meno allo stesso modo. Ascolta quando le altre persone ti raccontano cose che hanno funzionato per loro, ma ignora chiunque ti dica cosa dovresti "fare" come se ci fosse un imperativo morale. Se trovi qualcosa che funziona per te, seguilo. Voglio dire, il risultato finale è ciò che è importante, no? A chi importa davvero del percorso che hai preso per arrivarci?

Ricorda: le persone sono diverse . È una buona cosa. Non ascoltare le persone che cercano di renderti simile a loro e resisti alla tentazione di rendere altre persone come te e farai bene.


Chiunque dica qualcosa dovrebbe aver bisogno di un certo bisogno di avere buone ragioni per suggerirlo. Se non sono in grado di fornire una ragione valida, chiara e logica, il loro "dovrebbe" diventa un "forse dovrebbe".
Tin Man il

1
@Greg - Anche se una buona, chiara e logica ragione per te potrebbe essere completamente illogica per me.
Jason Baker,

1
+1. Chiunque dica che dovresti assolutamente farlo e questo è semplicemente sbagliato. Certo, devi studiare e ascoltare gli altri (specialmente quelli grandi e con esperienza), pensare intensamente, provare e confrontare approcci alternativi ecc., Ma alla fine, fai quello che trovi giusto. Se vuoi solo essere mediocre, vai avanti e segui The Design Process, ma per qualcosa di degno, devi fidarti di te stesso.
Joonas Pulakka,

+1 - Personalmente potrei iniziare con un diagramma o farlo nel modo ufficiale, ma questo perché il modo ufficiale sembra funzionare per me. Non puoi davvero insegnare alle persone a diventare più intelligenti o più creative. Sono adulti disposti a modo loro. O li assumi o non lo fai.
Giobbe

6

Sembra che tu sia:

  1. Provare cose per trovare l'approccio migliore (sperimentazione, progettazione incrementale)
  2. Riscrivere il codice per renderlo più pulito (refactoring)
  3. Scrivere costantemente test (sviluppo test driven)

Quello che stai facendo è fantastico! Sembra che tu lo stia facendo perfettamente bene, specialmente se l'hai capito da solo e non l'hai imparato da un (agile) libro di programmazione. C'è ovviamente di più in questo, ma hai i valori inchiodati. Ricorda solo di refactoring e migliorare il design mentre aggiungi il codice e non dovrebbe essere necessario un BDUF .

Hai pensato di concentrarti su una piccola funzione alla volta e di rilasciarla al termine di ogni funzione? Ciò potrebbe aiutarti a rimanere libero da qualsiasi problema di analisi con cui stai lottando e dimostra progressi reali per il tuo datore di lavoro.

Inoltre, non so di quale "comunità di sviluppo professionale" stai parlando, ma se lo fossi, direi loro di tornare alle loro torri d'avorio in modo da poter continuare con il tuo lavoro!


Sono pienamente d'accordo con te su questo, che fa eco alla mia risposta.
Eric O Lebigot,

4

Brad, non sei solo. Conosco programmatori molto bravi che lavorano esattamente come tu descrivi. :)

Se ripulisci il tuo codice e sai come renderlo efficiente e leggibile, allora hai sicuramente sviluppato un senso su come scrivere codice pulito ed efficiente anche in anticipo.

Inoltre, nulla può essere completamente pianificato in anticipo e il percorso più breve per scoprire le sottigliezze è spesso quello di eseguire il codice e comprendere i dettagli trascurati.

Penso che tu stia andando benissimo e che lo stile di programmazione che descrivi sia perfettamente valido.


4

Penso che valga la pena di completare le risposte sopra con una citazione di Alan J. Perlis, dalla prefazione del noto libro del MIT "Struttura e interpretazione dei programmi per computer", comunemente chiamato "SICP":

Ogni programma per computer è un modello, nato nella mente, di un processo reale o mentale. Questi processi, derivanti dall'esperienza e dal pensiero umani, sono enormi in numero, intricati nei dettagli e in qualsiasi momento solo parzialmente compresi. Sono modellati per la nostra soddisfazione permanente raramente dai nostri programmi per computer. Pertanto, anche se i nostri programmi sono raccolte discrete di simboli, mosaici di funzioni ad incastro realizzate a mano, si evolvono continuamente: le cambiamo man mano che la nostra percezione del modello si approfondisce, si allarga, si generalizza fino a quando il modello alla fine raggiunge un posto metastabile all'interno di un altro modello con cui noi lottiamo ".


ben messo. Sono modelli primitivi, modelli umanistici e infine modelli sovrumani mentre il programmatore riversa sempre più pensiero sulle azioni che stanno avvenendo all'interno del codice.
easymoden00b

3

C'è buono intelligente e cattivo intelligente.

Buona intelligenza: elevato rapporto tra linee di codice intelligenti e linee di un'alternativa non intelligente. 20 righe di codice che ti salvano dalla scrittura di 20000 sono estremamente intelligenti. Bravo intelligente, ti risparmia il lavoro.

Bad Clever: basso rapporto tra righe di codice scritte e righe di codice salvate. Una riga di codice intelligente che ti salva dalla scrittura di cinque righe di codice è Bad Clever. La cattiva intelligenza riguarda la "masturbazione sintattica".

Solo per notare: Bad Clever non viene quasi mai chiamato "Bad Clever"; viaggerà spesso sotto gli alias "bello", "elegante", "conciso" o "succinto".


1
"bello", "elegante", "conciso" o "succinto". ..... Penso di averlo visto sulla home page di Ruby on Rails contemporaneamente. MrGreen
Brad,

1
Forse sono solo io, ma penso che una riduzione dell'80% di LOC valga una certa intelligenza.
ricorsivo

Ne ho trovati molti per etichettare roba "masturbazione sintattica", quando in realtà è solo una questione di essere troppo pigri per imparare davvero la lingua che stanno usando ...
Svish

3

Posso sicuramente riconoscermi nel modo in cui descrivi il tuo flusso di lavoro. Ecco il punto: quando ho iniziato a lavorare in un ambiente di gruppo, quasi tutte quelle cose DEVONO cambiare.

Il lavoro che svolgo da circa 8 mesi è davvero la mia prima esperienza di lavoro in un team di sviluppatori in un singolo progetto. Fino ad ora, letteralmente tutta la mia carriera è stata come un programmatore di lupi solitari che non ha dovuto affrontare tutto ciò che riguarda il lavoro di squadra. Anche quando lavoravo in un gruppo, era sempre un lavoro piuttosto insensato - avevo il mio progetto che era MIO, o la mia sezione che era MIO, ecc. Era un'interessante curva di apprendimento mentre mi alzavo veloce con un ambiente di lavoro di squadra veramente collaborativo.

Ecco la cosa principale che ho capito: se non è dannatamente ovvio quello che stai facendo, probabilmente stai scrivendo il prossimo mal di testa di un collega. La maggior parte della pignoleria "orientata al processo" che vedi qui ha a che fare con il fatto che molti di noi sono STATI i colleghi con il mal di testa. E la maggior parte della teoria della gestione dei processi software ha a che fare con la riduzione al minimo di tale mal di testa.

Quindi cose come pianificare un piano concordato in anticipo, ecc ... Si tratta di avere una squadra a bordo e sincronizzata. Se sei la squadra, sei già sincronizzato con te stesso, e non è davvero necessario.


2

Non c'è niente di sbagliato nel tuo approccio come forma d'arte creativa. Se stai sviluppando per il beneficio personale, e quello che stai facendo funziona per te, e che ritieni divertente, probabilmente è importante tanto quanto il risultato finale del prodotto stesso.

In un ambiente di lavoro professionale, se i tempi del progetto sono brevi, forse circa 2-3 settimane o meno, il tuo approccio si chiama prototipazione rapida ed è abbastanza appropriato per le attività future.

Tuttavia, per progetti più lunghi, anche se si lavora da soli, tale approccio è probabilmente un lusso costoso per il proprio datore di lavoro. Trascorrere alcuni giorni del budget del progetto nella progettazione dell'architettura iniziale e quindi testare l'architettura rispetto a ciò che se la direzione decidesse di cambiare le specifiche di ... è normalmente tempo ben speso e svilupperà le tue abilità per diventare un programmatore / architetto più prezioso più avanti nella tua carriera.


2

Due prospettive:

  1. Nessuno deve mantenere un dipinto.

  2. Chiunque abbia mai visto Bob Ross dipingere un dipinto sa che i dipinti hanno una struttura. Se avessi preso una lezione di distanza da Bob Ross, sarebbe che pianificare in anticipo e lavorare in modo organizzato rende il processo regolare e semplice.


1
Bob Ross non ha mai dipinto gli alberi felici prima di dipingere il cielo dietro di loro.
Rob K

1

Codifico praticamente allo stesso modo. Inizierò a scrivere e mentre vedo emergere schemi, rifletto. Puoi dipingere te stesso in un angolo in quel modo, devi sapere quando sederti e pensare a un problema, ma a volte devi solo prenderlo per capirlo davvero .

Ma sono curioso di questo:

La comunità di persone qui e su Stack Overflow sembra rifiutare qualsiasi soffio di imperfezione. [..] Il mio processo sembra andare controcorrente di ciò che è accettabile nella comunità degli sviluppatori professionisti e vorrei capire perché.

In che modo qualcuno di Stack Overflow potrebbe conoscere il tuo processo? E cosa intendi con "rifiuto"? Naturalmente, il codice inviato a una comunità di programmazione verrà esaminato in modo critico. Ma se qualcuno individua aree in cui il tuo codice può essere migliorato, può essere solo una buona cosa, giusto?

Spero che, quando pubblichi una domanda su Stackframe, ripulisci il tuo codice e provi a ridurlo nella forma più semplice possibile, per rispetto dei tuoi lettori (a volte risolvi il tuo problema solo cercando di renderlo presentabile ad altri), in cui caso qualsiasi feedback è buono. Se pubblichi un codice che sai essere negativo e sai perché è negativo prima di pubblicarlo, non dovresti prenderlo sul personale se le persone lo notano .


Non mi riferivo a domande o risposte che ho posto personalmente. Quando inserisco le domande, le divido nel caso più semplice possibile e lo stesso con le mie risposte. Ho notato che quando altri pubblicano un codice non così perfetto nelle loro domande o non sono davvero sicuri di come porre la domanda giusta, vengono ripetutamente abbattuti. In quei casi limite in cui la domanda è vicina a una buona, la modifica spesso o aggiungo commenti per spingere l'OP nella giusta direzione. Non penso che sia ciò che normalmente accade però. [altro nel prossimo commento]
Brad

In ogni caso, dopo aver letto le risposte alla mia domanda qui, sento di aver letto male la comunità e di aver proiettato critiche sulle risposte a critiche su progetti completi, che come hai chiarito, sono due cose diverse.
Brad

1

Uso anche il tuo approccio. Funziona meglio per me, poiché riduce il rischio di ingegnerizzazione eccessiva.

Quello che faccio molto spesso è risolvere un problema con probabilmente il minor codice possibile, il che di solito porta a dipendenze evidentemente inutili o ad altri problemi di progettazione. Quindi trasformo il codice di lavoro in un bellissimo codice.
Ad esempio, riduco le dipendenze tra i diversi moduli per concedere interfacce e metto in discussione quali dati dovrebbero essere conservati dove, fino a quando ogni modulo non dipende solo da astrazioni molto minimaliste degli altri moduli. Si potrebbe dire che ho posticipato la decisione finale, quale modulo dovrebbe avere quale responsabilità. Rimando l'astrazione.
Mettere troppo pensiero nel separare un problema in responsabilità distinte, in astrazioni distinte, non è buono. Ti costringerà a piegare la tua implementazione per adattarla alle astrazioni che hai fatto. Il codice funziona, se produce i risultati desiderati e se è gestibile. Una progettazione funziona, se è possibile implementarla attraverso un buon codice. Se il codice non funziona, lo si modifica. Ergo, se un disegno non funziona, dovrai cambiarlo anche tu. Puoi vedere se una progettazione funziona, una volta implementata.

Quindi avere in mente un semplice schizzo è quasi abbastanza come un disegno, prima di iniziare a dargli vita. Riprogettazione, abstract e refactoring secondo necessità .


1

Penso che se sarai bravo a programmare, almeno a volte deve essere divertente, e questo significa essere creativi.

Sicuramente quando si programma in gruppo ci sono almeno standard minimi che dovrebbero essere seguiti, non per ragioni "morali", ma per quelli pratici, quando si applicano.

Al di fuori di questo, è interessante e divertente sondare i confini per vedere cosa si può trovare lì. Una volta, mentre lavoravo su una Mini in linguaggio assembly, ho scoperto che potresti creare delle routine che potrebbero passare dall'una all'altra con 1 istruzione. Poi ho capito come creare un'autocronutica che potesse fare due passi avanti, un passo indietro, ecc. Ti è stato utile? Ne dubito. Non è questo il punto.

Una volta ho sentito un discorso di Edsger Dijkstra, che parlava di creatività nella programmazione. Ha menzionato il modo in cui uno studente ha trovato il modo di eseguire una rotazione n-bit di una parola n + m-bit. È stato fatto con 3 bitswap. Prima si scambiano i bit n, quindi si scambiano i bit m, quindi si scambiano tutti i bit n + m. Utile? No. intelligente? Sì.

È bello sentirsi liberi di provare cose che nessuno nella loro mente giusta farebbe.


1

Questo può essere un caso di "una taglia non va bene per tutti". Hai fatto funzionare il tuo stile per i progetti in cui hai partecipato, quindi con chi discutere? Tuttavia, i critici che stai leggendo qui e su SO potrebbero lavorare su progetti più grandi o su progetti che richiedono un coordinamento complesso tra i membri del team.

Il tuo stile di sviluppo potrebbe diventare un problema se fossi mai stato coinvolto in progetti più grandi che prevedevano la cooperazione tra più sviluppatori. È difficile programmarlo, è difficile tenere traccia dei tuoi progressi e non c'è modo per i tuoi colleghi programmatori di pianificare quel po 'del loro lavoro che dipende dal sapere cosa sta facendo il tuo po' di lavoro.

Potresti essere interessato a leggere Dreaming in Code per vedere cosa può succedere quando un grande progetto adotta uno stile di sviluppo simile al tuo.


1
Grazie per la risposta. I tuoi commenti sono utili per me.
Brad,

1

Molta rassicurazione che il tuo metodo non è sbagliato, ma lasciami aggiungere qualche esperienza personale. Ho iniziato a modo tuo, ma nel frattempo ho imparato in anticipo il vantaggio di pianificare almeno parte della struttura generale, e questo per una serie di motivi:

  • il più grande extra è che è più facile vedere quale codice può essere riutilizzato se aggirato un po '. Scrivo spesso un pezzo di codice che, mentre scrivo, sembra improvvisamente utile per un'altra parte dello schema generale che ho appeso accanto al mio schermo (disegnato su carta in uno stile solo leggibile per me).

  • Avere uno schema ti consente di refactorizzare non solo il codice, ma anche lo schema. A volte sono impegnato a scrivere una lezione che improvvisamente appare utile anche per qualche altra parte dello schema. Di conseguenza lo schema diventa più semplice quando il progetto viene eseguito

  • Ogni volta aggiorno anche quello schema con l'input richiesto e l'output dato di funzioni / metodi e slot disponibili nelle classi. Questo è più veloce per il riutilizzo dei bit: non devo immergermi nel codice ogni volta per controllare esattamente cosa accade dentro e fuori. Anche se è nei commenti, devo comunque navigare per ottenere i commenti

Quindi effettivamente uso anche il tuo metodo. Comincio, provo, refatto, riprovo, cambio un altro po 'e così via, ma anche il mio ciclo include lo schema. E quando fatto, aggiungo le informazioni per il prossimo che funziona su quel codice.

Intendiamoci, questo è per progetti su cui lavoro da solo. Se lavori con più persone sullo stesso codice, pianificare in anticipo non è solo una logica, è essenziale. Ma suppongo che tu lo sappia già.

E come altri hanno detto: questo è il mio modo, il tuo chilometraggio può variare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.