Scrittura del codice vs Calcolare la risposta a un problema?

1

Perché scrivere codice quando si incontra un problema difficile considerato una pratica di programmazione "cattiva"? E perché pensare un problema completamente attraverso la carta o nella tua testa prima di scrivere il codice "buono"? Da quello con cui ho lavorato, sono in grado di vedere i problemi in più modi o casi speciali a cui non pensavo all'inizio digitando il codice e il debugging piuttosto che risolvere il problema completamente prima?

Inoltre, non riesco a trovare alcun hashtag appropriato per questo. Quindi qualsiasi aiuto è molto apprezzato!

    
posta Tejaswi Yerukalapudi 29.04.2011 - 20:23
fonte

11 risposte

4

Dopo aver riflettuto sulla mia risposta precedente, mi sono reso conto che la migliore risposta alla domanda originale è di presentare una terza opzione: scrivi test . Test Driven Development combina le migliori qualità di "solo scrittura del codice" con le migliori qualità di "pensare il problema nella tua testa". Puoi pensare il problema tramite nei tuoi test .

    
risposta data 29.04.2011 - 23:56
fonte
5

Vale la pena pensare a qualsiasi problema durante la codifica, indipendentemente da quanto tu possa percepirlo.

Perché? (in ordine di importanza)

  • La tua implementazione può influire su qualsiasi numero di diverse aree, e tu può influire negativamente sui dipendenti con le tue modifiche.
  • Puoi buttare via i disegni della carta un lotto più veloce della riscrittura del codice
  • Puoi chiedere a qualcun altro di controllare le tue idee in modo più semplice sulla carta che cercare di farle guardare attraverso il codice che non hanno familiarità con
  • Progettare su carta ti costringe a riflettere sul problema intero piuttosto che sul piccolo pezzo che stai scrivendo.
risposta data 29.04.2011 - 21:00
fonte
2

Il mio motto:

Se non funziona su carta, non funzionerà nel computer. Questo vale anche per il processo di business. Se si automatizza un processo manuale non funzionante, si finisce con un processo informatico rotto.

    
risposta data 29.04.2011 - 22:34
fonte
1

dipende dalla dimensione del problema :-) Inoltre c'è un elemento di "impegno". È difficile buttare via il codice che di solito impieghiamo per scrivere e fare il debug, mentre possiamo buttare via un po 'di "carta" più facilmente.

Il problema è banale, allora sì dovresti scrivere codice "solo", ma se esiste un grosso algoritmo con chiamate / sistemi esterni, ecc.? Pensa a un sistema di pagamento di una grande azienda o di un videogioco o di un database. Inizierebbe da void main (args)?

    
risposta data 29.04.2011 - 20:25
fonte
1

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.

    
risposta data 29.04.2011 - 22:11
fonte
1

Diversi problemi richiedono approcci diversi per risolverli. Ad esempio ...

Quando risolvo problemi con dati non corretti o dati fraintesi in un database, trovo molto utile creare viste interattive (modificando costantemente i filtri) per limitare il problema. Quando penso di aver identificato il problema o il modello, rinforzo il punto di vista o creo diversi punti di vista per convalidare le mie ipotesi. Poi passo a pensare a come correggere i dati.

Durante lo sviluppo di un processo da zero mi piace usare gli stickies gialli (ruotandoli di 90 gradi per le decisioni). Ciò mi consente di spostarli, inserirli o riorganizzarli finché il processo di pensiero e il flusso non sono stati elaborati e mi sento a mio agio nella scrittura del codice.

Ci sono altre volte in cui ho bisogno di creare qualcosa che sia simile ma diverso da qualcosa che ho già creato. A questo punto di solito faccio una copia del codice originale e inizio a commentare blocchi e aggiungere nuovi blocchi.

    
risposta data 29.04.2011 - 22:14
fonte
1

Quando cerchi di risolvere un problema durante la scrittura del codice, improvvisamente devi risolvere due problemi

  1. Il problema con cui hai iniziato e
  2. Come esprimere la soluzione per 1) nel codice. . . e tu non hai ancora quella soluzione.

Alcune persone (che tendono a prendere il secondo approccio) pensano che questi siano lo stesso problema, ma no, sono due problemi.

Risolvi 1) prima di iniziare 2) significa che non stai cercando di risolvere due problemi completamente diversi, ti stai concentrando sul problema più difficile e prima togli tutto quello che vuoi.

    
risposta data 29.04.2011 - 23:23
fonte
0

Il primo è comunemente chiamato "coding into submission", ed è "cattivo" quando ti porta a creare soluzioni troppo complesse e mal progettate che potrebbero essere state semplificate da una certa quantità di pensiero prima di farlo. Tuttavia, scrivere una soluzione prototipo in codice può essere un utile aiuto a pensarci finché non provi a mettere in produzione il codice prototipo.

D'altra parte, quest'ultimo (quando portato al suo estremo logico) può anche essere "cattivo". Troppo tempo per pensare significa non fare abbastanza tempo. Perfetto è il nemico del bene, e così via.

La cosa migliore da fare è la cosa più semplice che potrebbe funzionare. Ciò significa riflettere abbastanza sul problema per trovare una soluzione ragionevole (e non di più) e quindi provare a risolvere questa soluzione. Cerca di trovare un buon equilibrio tra pensare e fare.

    
risposta data 29.04.2011 - 20:50
fonte
0

Se guardi tutti gli approcci (alcuni li chiamerebbero "metodologie") allo sviluppo di software, si riduce sempre a:

  1. Definisci i requisiti: che cosa stai cercando di risolvere esattamente
  2. Definisci le specifiche funzionali - se hai più moduli, come potranno interagire tra loro. Cosa sono gli input, quali sono gli output
  3. Definisci la progettazione software di ciascun modulo
  4. Codice

Un errore fatto in anticipo, sarà sempre il più difficile da risolvere dopo la scrittura del codice. Se si verifica un errore di codifica, in genere è possibile risolverlo entro poche righe. Se si verifica un errore di progettazione, in genere è necessario tornare indietro, ridefinire le classi, spostare le cose e creare nuove interfacce. Se hai commesso un errore nei requisiti, il tuo progetto potrebbe non risolvere nemmeno il problema giusto.

Questo è il motivo per cui dicono che invece di saltare nel codice non appena si è davanti a un computer, fare un passo indietro e in realtà definire cosa esattamente si sta facendo e fare la determinazione a quel punto data la portata del problema, come molti requisiti e design dovresti davvero fare in anticipo. All'inizio potrebbe volerci più tempo, ma 9/10 volte risparmia molto tempo lungo la strada. E anche per progetti più semplici, consiglierei di passare attraverso il design down layout perché è sempre una buona pratica per il futuro quando inizi a fare un lavoro non banale.

    
risposta data 29.04.2011 - 21:02
fonte
0

Non penso che sia sempre un problema chiaro / negativo, dipende molto dal programmatore. Non ho dubbi sul fatto che ci sono alcune persone che sono completamente efficaci nel vedere le soluzioni ad alcuni problemi chiaramente nella loro mente, e possono iniziare a codificare le prime bozze senza dover estrarre le cose. Per la maggior parte delle persone, me compreso, i problemi oltre un certo grado di complessità tendono a prestarsi a un lavoro a matita e carta.

Detto questo, quando entri nella pratica "cattiva" è quando qualcuno che non può visualizzare chiaramente la soluzione al loro problema inizia a buttare giù il codice invece di fare il lavoro di pensiero e progettazione di cui hanno bisogno fare. Rein lo chiama "coding into submission" nella sua risposta, personalmente lo chiamo "debugging le cose in esistenza". Indipendentemente da come lo chiami, tende a produrre risultati mediocri con casi limite non gestiti, oltre la quantità necessaria di codice e una scarsa organizzazione.

    
risposta data 29.04.2011 - 22:02
fonte
0

A volte è meglio prendere uno sgabello invece di un martello. Nel codice non pensiamo che ciò si verifichi perché il codice errato non causa danni permanenti: basta annullarlo o ripristinare il backup. Il problema è quando lasci il codice che hai appena distrutto perché "sembra" funzionare. Puoi continuare a inchiodare abbastanza schede per riparare un tetto che perde solo per scoprire che stai spostando l'acqua sul tuo pannello elettrico.

Il vero problema è che i programmatori inesperti potrebbero non essere a conoscenza di tutti gli elementi coinvolti.

    
risposta data 29.04.2011 - 22:27
fonte

Leggi altre domande sui tag