Concezione e design prima della codifica: quanto è vero? [chiuso]


14

Ho imparato a scuola e ho letto dappertutto che una buona metodologia di sviluppo necessita di concezione e progettazione prima di programmare correttamente.

Questa non è una nuova informazione nemmeno per un programmatore principiante. Tuttavia, mi chiedo se questo sia un buon consiglio perché da quando ho iniziato a sviluppare in diversi linguaggi di programmazione non sono mai riuscito a progettare e concepire tutto dall'inizio.

Voglio dire, ho sempre fuso design, concezione e programmazione. Sono il peggior sviluppatore del mondo o l'idea che impariamo a scuola è solo un vecchio dogma religioso insignificante ?

Come possiamo persino concepire e progettare qualcosa che non abbiamo mai sperimentato e programmato prima? Non è ridicolo? La programmazione non guida invece l'ideazione e il design?



@gnat il link che hai dato qui potrebbe essere una risposta per un aspetto della mia domanda. Non penso che questa sia una domanda duplicata.


13
Nessun piano è mai sopravvissuto al contatto con il nemico, ma ciò non significa che non dovresti averne uno. Inizia con un piano ma non aver paura di modificarlo in seguito
Richard Tingle,

2
L'unica volta che capisci veramente e completamente un problema è dopo averlo risolto, quindi ha senso solo una volta capito il problema, puoi risolverlo meglio. Ma devi affrontare l'esercizio della scoperta per capire davvero il problema.
Matt Klinker,

Risposte:


5

Penso che la risposta debba essere: pianifica il più possibile, ma non di più.

Poche persone parlerebbero contro le virtù della pianificazione, ma il dibattito trascura soprattutto un aspetto importante. La pianificazione funziona solo nella misura in cui hai l'abilità di fare un buon piano, quell'abilità tende a venire con l'esperienza. Se non hai molta esperienza, qualsiasi piano elaborato avrà probabilmente un discreto numero di problemi, questo significa che per realizzare un prodotto che non sia un disastro totale, il piano dovrà essere fortemente rivisto durante lo sviluppo, se il piano è dettagliato, probabilmente questo invaliderà molti dettagli o, peggio ancora, proverai a ridurre al minimo le regolazioni per poter seguire il piano.

Alcune cose richiedono sicuramente una pianificazione, e se non hai le competenze per creare il livello di piano richiesto, l'unica via percorribile che posso immaginare è la prototipazione, la scrittura di codice semplicemente per acquisire l'esperienza con l'attività richiesta per fare un piano adeguato .

Che tu sia pronto o meno a scrivere il codice di produzione, una volta raggiunto il massimo livello di pianificazione non resta altro che codificare. Forse sarà un disastro, ma quelle sono buone esperienze di apprendimento e sarai molto meglio attrezzato per fare un piano rivisto.


30

È assolutamente vero Più grande e complesso è il requisito, più vero è questo.

Per una piccola app console per calcolare la sequenza di Fibonacci, potresti non aver bisogno di più di qualche minuto di riflessione su come strutturare l'algoritmo e l'interfaccia utente (che, sì, potrebbero semplicemente essere stdin e stdout).

Ma che ne dici di una piattaforma di trading in tempo reale che dovrebbe fare milioni di transazioni al secondo, distribuita a livello globale e che richiede 99.9999 di uptime e il 100% di correttezza? Passeresti semplicemente al codice?

Ci sono molte altre opzioni tra questi due estremi.

Dai un'occhiata al progetto Euler . Risolvi alcuni problemi, nella sequenza presentata. Scoprirai che, al fine di risolvere alcuni dei problemi in tempi ragionevoli, devi effettivamente pensare prima di saltare al codice.

Se non hai bisogno di prendere tempo per pensare e progettare il tuo programma prima di iniziare a programmare, stai lavorando su cose banali o ti manca qualcosa di più grande.


Non sono mai riuscito a progettare e concepire tutto dall'inizio

Nessuno fa altro che i problemi più banali. Ancora una volta, più grande e complesso è il progetto, più vero è questo: i progetti avranno errori, cose che verranno trascurate ecc ...

L'arte è in primo luogo progettare ad alto livello, vedere se i pezzi di grandi dimensioni si adattano. Quindi ottenere un elenco di priorità: iniziare a lavorare prima sull'infrastruttura / cruciale. Quindi andiamo e suddividiamo i pezzi più grandi in pezzi più piccoli, assicurandoci che ogni pezzo più grande sia composto da pezzi che abbiano un senso.

Ciò richiede tempo e fatica e potrebbe non essere completo o completamente corretto all'inizio.

Ma questo è il motivo per cui si chiama morbida -Ware e non difficile -Ware. È malleabile e può essere modificato.


4
Bella risposta. Si noti che, sebbene il software sia malleabile (in effetti, questa è una delle cose straordinarie e uniche al riguardo), le modifiche non sono gratuite . Più un sistema software è strettamente accoppiato e incoerente, più sarà difficile e costoso modificarlo. Il risultato è che parte di ciò che va nella progettazione del software dovrebbe essere la capacità di cambiare in futuro , se si desidera trarre vantaggio dalla malleabilità del software.
voithos,

9

Ho imparato a scuola e ho letto dappertutto che una buona metodologia di sviluppo necessita di concezione e progettazione prima di programmare correttamente.

Questo è vero.

Tuttavia, mi chiedo se questo sia un buon consiglio perché da quando ho iniziato a sviluppare in diversi linguaggi di programmazione non sono mai riuscito a progettare e concepire tutto dall'inizio.

E c'è il tuo problema.

Per la maggior parte dei problemi non banali, dovrai fare qualche pensiero per capire come funzioneranno le cose - come le cose si adatteranno insieme. Paradossalmente, per la maggior parte dei problemi non banali, non è possibile pianificare tutto . C'è semplicemente troppo sconosciuto per te da tenere in considerazione, troppi cambiamenti che accadranno durante lo sviluppo. Agile ha guadagnato la trazione che ha perché accetta questa seconda metà dell'accordo: le persone non sono onniscienti e il cambiamento è costante.

Quindi è certamente vero che devi progettare in anticipo, ma è anche vero che è impossibile progettare solo in anticipo.


5

Devi assolutamente avere un po 'di design prima di scrivere codice.

Il motivo è piuttosto semplice: se non hai un design, non sai cosa stai facendo .

Devi assolutamente avere un po 'di codice prima che il design sia definitivo.

Il motivo è piuttosto semplice: il design cambierà e lo sviluppo di parti del design rivelerà domande, opportunità e sfide che sono difficili da anticipare senza iniziare a lavorare sulla soluzione.

Lo sviluppo è iterativo.

Indipendentemente dal piano o meno, dal fatto che il team lo realizzi o meno, ogni progetto software viene eseguito in modo iterativo: parte del lavoro viene completata e quindi valutata e la valutazione porta a cambiamenti nel modo in cui viene svolto il resto del lavoro.

Prova più di un approccio.

Ci vuole pratica ed esperienza per conoscere il modo migliore per bilanciare il design iniziale con la creazione di codice. È un'abilità che quasi nessuno ha acquisito padronanza e che ogni progetto avrà ideali diversi (considera la possibilità di progettare un piccolo strumento per il tuo uso rispetto a una squadra che crea un prodotto di grandi dimensioni a rilascio singolo come un videogioco importante).


1

Ho progettato e oscurato altri progettando più sistemi in passato e ho visto il processo svolgersi in molti modi diversi, ma quello che trovo comune è che l'architettura iniziale dovrebbe almeno pianificare l' esistenza delle principali funzionalità.

Per esempio, ho visto un sistema di controllo HVAC che non aveva il concetto di edifici, piani, stanze ecc. Che venivano adattati con quelli e il risultato era brutto come loro. O un dispositivo musicale mobile costruito con componenti più adatti al tuo orologio da tasca (non intelligente). Inutile dire che i prodotti finali in entrambi i casi non erano i preferiti dai clienti.

Quando dici "concezione" questo è solo un passo avanti rispetto a "idea" e un concetto può essere molto confuso. Gli affari di solito si preoccupano dei concetti. Di solito i clienti si preoccupano di UX: un concetto che diventa realtà in un modo facile e piacevole da usare e porta un valore attraverso il suo utilizzo.

Devi fare un "concetto" prima di qualsiasi programmazione, non riesco a immaginarmi di aprire Visual Studio (o il tuo IDE preferito) e scrivere casualmente il codice, per vedere dove va.

Non puoi fare un progetto completo (e non dovresti) prima della codifica, ma dovresti avere uno schizzo approssimativo di quale sarebbe il flusso di lavoro dell'utente.

La progettazione e la codifica di UX si nutrono abbastanza spesso l'una dell'altra, probabilmente sarai costretto a usare un approccio Agile per progetti tutt'altro che piccoli come modo per incorporare questo fatto nel modo in cui approcci il lavoro. Quindi non pensare di essere il peggiore dei programmatori se non riuscissi a vederlo tutto in una volta: nessuno può e le persone che pensano di poter essere sono quelle che ignorano abbastanza il problema in modo da poter affermare di avere un completo immagine.


Un esempio per dare una dimensione a qualcosa di grande. Concetto: "Creare uno strumento basato su cloud visivo che consenta alle aziende di integrare le proprie piattaforme software". Sembra fantastico e si può iniziare a scrivere materiale di marketing e venderlo prima ancora che sia lì. Devi avere questo prima di scrivere codice.

Pre-progettazione: "Avere forme e frecce come in Visio per descrivere la logica; avere funzionalità plug-in per consentire connessioni a varie piattaforme (SAP, SF, database ...); avere una console di monitoraggio in cui è possibile cercare i dati passando attraverso il sistema; avere un modo di descrivere visivamente i dati e trasformare un formato in un altro ". Un altro grande blob di marketing. Ti dà anche alcune idee su ciò che è importante, dovrebbe avere uno schizzo così approssimativo prima di scrivere anche il codice.

Design / Codice: "Avere un browser HTML designer ospitato con tali e tali funzionalità; codificare il back-end in Java in modo che possa essere eseguito su qualsiasi server esistente; definire strutture di dati e UX per interrogarli o modificarli in base alle esigenze; ​​pianificare il ripristino di emergenza, errore rendicontazione, registrazione di audit; controllo della versione del piano; controllo dell'accesso al piano; .... ": più fine è l'elenco, più non realistico è prevederlo tutto.

... tuttavia si dovrebbe essere almeno consapevoli di come potrebbero apparire le cose in modo approssimativo o il tuo prodotto finale potrebbe finire con alcune implementazioni davvero inutili che finiscono per uccidere il concetto altrimenti di grande suono - diciamo che il tuo designer visivo richiede un 40 " schermata per mostrare qualsiasi flusso di lavoro nel mondo reale, oppure non c'è modo di cercare nei registri se non una corrispondenza esatta tra le stringhe limitata a uno dei 20 campi nel registro ecc. ecc. Non esiste un buon modo per impedire che ciò avvenga se non l'esecuzione della propria implementazione - alcuni avranno successo, altri falliranno.


0

Assegno sempre il tempo come segue:

  1. 1/3 design
  2. Sviluppo 1/3
  3. 1/3 Test

Design: non solo visivo, ma anche concettuale. Dividilo in parti, sia visivamente che per logica. Cerca elementi comuni che vengono riutilizzati e sono un modello di progettazione in sé.

Sviluppo: una volta che conosci le tue parti, codificale. Quindi li integri.

Test: non solo testare che il codice è stato integrato e scritto correttamente, invariabilmente ci saranno approfondimenti e lezioni apprese e creerà nuovi modi di interagire, nuove capacità saranno concepite e desiderate. Attenzione al creep di portata.

Oltre a questi aspetti, tieni presente che un progetto ha anche 3 fasi in aggiunta a queste fasi.

  1. Il primo tentativo ingegnerizzato
  2. Il secondo tentativo troppo ingegnerizzato, dalle lezioni apprese dal primo tentativo.
  3. Il terzo tentativo correttamente progettato.

Ho scoperto che meglio fai la fase di progettazione, che minimizza i tentativi aggiuntivi. Invece di ripetere tutto, potresti avere solo un sottosistema che viene rielaborato.

Sono uno sviluppatore di software e un responsabile dello sviluppo software per progetti di sviluppo interni, in outsourcing e offshore.


-1

C'è un presupposto errato fondamentale qui. Non sarai mai in grado di elaborare un buon design senza prima scrivere il codice (la scuola non te lo insegnerà mai). Eppure, la scuola ha ragione a non ottenere un buon codice senza design.

La soluzione è:

  1. Scrivi del codice che ritieni possa risolvere il problema.
  2. Elaborare un design basato su ciò che hai imparato dal codice.
  3. Butta via tutto il codice e riscrivilo da zero secondo il design.
  4. Ripeti se necessario.

Eliminare tutto il codice non è un passaggio facoltativo in questo processo, ma per i piccoli progetti che possono formalmente scrivere il disegno potrebbe essere. Per i progetti di grandi dimensioni, è più probabile che tu ripeta il passaggio " butta via tutto il codice ", anche se se hai una modularità sufficiente questo può applicarsi solo a una parte della base di codice.

Troppi progetti si aggrappano al codice legacy perché non sono disposti a cambiarlo - o perché è troppo complicato, perché non è mai stato progettato per essere gettato via. Riconoscere il fatto che il tuo primo tentativo sarà un fallimento renderà la tua vita molto migliore.


1
Esistono molti motivi validi per non eliminare il vecchio codice. Potresti fornire qualche riferimento per appoggiare l'ultimo paragrafo.
mattnz,

+1. Non so perché questo sia stato sottoposto a downgrade. "Costruisci uno per buttarlo via" è un classico consiglio di Fred Brooks.
Nikie,

Penso che in questo caso il vecchio codice provenga da un prototipo e vi sia il rischio che i prototipi vengano considerati sufficientemente validi e messi in produzione. Buttalo via per quanto riguarda il progetto attuale e non letteralmente.
JeffO,

-3

la concezione è il design chiave che può sempre essere modificato la programmazione dovrà soddisfare i requisiti dell'app completamente concepita.

1 ° qual è il punto, 2 ° come deve essere accessibile, 3 ° chi è l'utente, 4 ° espone un ambito SOW completo del lavoro definendo in termini specifici tutto ciò che questa applicazione deve fare. e come funzionerà ogni funzione che aggiungi.

prima di fare qualsiasi scelta sull'architettura della tua app web, pianificala e riflettila completamente.

quindi scegli lo stack migliore

Sono uno sviluppatore LAMP

quindi tendo a restringere la domanda a quale framework php userò. e gli script front-end che dovrò fare in modo che tutto ciò di cui ho bisogno lo faccia in modo ideale

per aggiungere questo, impara ad usare i framework MVC, ZEND e CAKEPHP sono i migliori framework di sviluppo rapido (PHP)


7
" Scegli lo stack migliore ... Sono uno sviluppatore LAMPADA " - Mentre è perfettamente ok attenersi al lavoro a maglia di qualcuno, questa affermazione sembra una leggera contraddizione, non è vero?
JensG,
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.