So come programmare e come imparare a programmare, ma come / dove impari come realizzare correttamente i sistemi? [chiuso]


11

Ci sono molte cose che devono essere prese in considerazione quando si crea un sistema, ad esempio un sistema basato sul Web in cui gli utenti accedono e interagiscono tra loro, creando e modificando il contenuto. Ora devo pensare alla sicurezza, alla convalida (non credo nemmeno di essere sicuro al 100% di ciò che ciò comporta), "assicurandomi che gli utenti non si calpestino" (termine per questo?), Prevenendo errori in molti casi, assicurandoti che i dati del database non diventino problematici in situazioni impreviste ...? Tutte queste cose che non so come o dove imparare, c'è un libro su questo genere di cose? Come ho detto, sembra esserci un'enorme differenza tra la scrittura del codice e la scrittura del codice giusto, sai cosa intendo? Sento che il mio attuale lavoro di programmazione manca di molto di quello che ho descritto e posso vedere i problemi che provoca in seguito, e quindi i problemi sono molto più difficili da risolvere perché i dati esistono e le persone li usano. Quindi qualcuno può indicarmi libri o risorse o il sottoinsieme corretto di programmazione (?) Per questo tipo di apprendimento?

PS: sentiti libero di correggere i miei tag, non so di cosa sto parlando.

Modifica: presumo che alcuni degli esempi che ho scritto si applichino anche ad altri tipi di sistemi, semplicemente non conosco altri buoni esempi perché sono stato principalmente coinvolto nel lavoro sul web.

Risposte:


10

Per quanto ne so, i programmatori professionisti imparano queste cose in tre modi principali:

  1. Imparare da una brutta esperienza : ti imbatti in qualcosa di sbagliato. Lo aggiusti. Dici "Ehi, non dovrei farlo di nuovo. La prossima volta farò X." Sei chiaramente nel bel mezzo di quello.
  2. Imparare prima di una brutta esperienza - Alla fine, impari a vedere arrivare alcuni tipi di problemi. Quando lo fai, proverai ad evitarlo. Forse leggi un libro, forse cerchi nel web, forse provi alcuni esperimenti.
  3. Imparare da colleghi esperti - Questo è di gran lunga il più semplice, anche se non è ancora facile. Il trucco sta nel capire se il collega sta rispondendo a una brutta esperienza ancora rilevante. La tecnologia va avanti, dopo tutto.

Ti incoraggio a sparare per tutti e tre. Trova un posto con colleghi intelligenti ed esperti che risponderanno alle tue domande. Assicurati che sia un luogo che ti permetta di spedire presto e spesso, in modo da poter provare molte cose. E prenditi del tempo per la ricerca e la riflessione.


Quanto al n. 1), tieni presente che le brutte esperienze e gli errori da cui stai imparando non devono necessariamente essere tue. Trascorri del tempo sul web, esci dove fanno i programmatori, impara alcune delle loro storie dell'orrore di errori folli che hanno fatto o che incontrano, tienili nella parte posteriore della testa mentre programmi.
Shadur,

1
Concordo, Shadur, ma penso che alcune delle brutte esperienze debbano davvero essere tue. Alcune persone cercano di sedersi a margine, in attesa di poter fare la cosa perfetta. Ma hanno davvero bisogno di entrare e iniziare a fare se vogliono migliorare le loro abilità.
William Pietri,

4

Quando si tratta di app Web, ci sono più buone informazioni compilate in questa risposta di qualsiasi altro singolo posto che abbia mai visto.

Ma la realtà è che c'è molto da sapere per mettere insieme un sistema completo. Esistono studi a supporto di 10.000 ore come quantità di pratica necessaria per raggiungere un livello di padronanza, e lo sviluppo di sistemi di informazione non fa eccezione.


Quindi immagino che sia diverso per cose diverse, eh?
MetaGuru

Molti problemi saranno, per esempio, specifici delle app Web e molti saranno più generali. Non sono sicuro di aver capito bene cosa stai chiedendo.
Quentin-starin,

3

Mi piace molto la risposta di William Pietri (+1), ma credo che debba essere aggiunto. Persino presumendo che ciò che intendi per sistema comprenda esclusivamente software.

Ma prima di andare nella carne, non conosco un libro per aiutare. Tutto ciò che segue, ho imparato dall'esperienza (intendendo i tre punti che William ha fatto).

Di cosa stai parlando si estende in almeno quattro ruoli generali. A volte una persona può ricoprire tutti quei ruoli, per progetti di piccole e medie dimensioni, ma quando inizi su progetti di grandi dimensioni devi almeno separare un po 'quei ruoli. È difficile per chiunque essere esperto in tutti in modo significativo.

  1. Analista di affari

    Questa è la persona che parla con il cliente e traduce le sue esigenze in qualcosa che un architetto può dare un senso. Fondamentalmente un elenco di requisiti adeguatamente formulati. Ciò include gli ovvi requisiti funzionali (cosa deve fornire questo sistema?), Ma anche i requisiti non funzionali (quali sono le caratteristiche generali che il sistema deve soddisfare? Ciò può includere sicurezza, affidabilità, disponibilità, resilienza, capacità, prestazioni, robustezza e altri requisiti di questo tipo dal punto di vista dell'utente).

    Questo è il primo passo per ciò che il sistema deve fare, l'inizio del pensiero serio.

  2. Architetto di sistema

    Questa persona produce il quadro tecnico di alto livello all'interno del quale lavorare. Danno il piano di abbinamento del profilo. Gli strumenti generali, le tecniche, i costrutti. Rompono l'intero sistema in componenti più piccoli, come si adattano l'uno all'altro, come si adattano al mondo esterno ...

    Questo aiuta in molti modi a perfezionare ciò a cui bisogna pensare. Molto spesso in quella fase verranno scoperti problemi relativi ai requisiti scritti dall'analista aziendale. Torniamo a loro per alcune iterazioni per migliorare la loro comprensione di ciò che vogliono e la loro espressione.

  3. Progettista di sistema

    Questo ruolo riguarda come far funzionare tutto. Questo potrebbe essere più lavoro di gruppo di uno spettacolo individuale. Ma è probabile che un lead designer sovrintenda alla progettazione dell'intero sistema. Questa persona deve scavare nei dettagli e assicurarsi che la vista dell'architetto sia qualcosa che può essere effettivamente costruito.

    Aspettati un ulteriore perfezionamento dell'architettura del sistema e quindi potenzialmente dell'analisi aziendale.

  4. Responsabile dei test

    Questo ruolo è molto spesso dimenticato. Ma alla fine della giornata, se non puoi provarlo, come puoi provare che puoi costruirlo? Deve esserci una revisione dei risultati di tutte le fasi: analisi di business, architettura e progettazione da parte di qualcuno competente nei test che sarà in grado di evidenziare le carenze e quindi consentire correzioni anticipate, molto prima che venga scritto qualsiasi codice.

Questo è un breve riassunto.

Quei ragazzi / ragazze sono solo la corsa generale dei mulini della catena per pensare a cosa bisogna pensare.

Per progetti complessi come le grandi applicazioni bancarie o spaziali solo per fare due esempi (pensate da molte centinaia a molte migliaia di giorni-uomo), ci sono molti esperti in materia mentre li chiamiamo per rivedere e supportare progetti in ogni fase. Questi ruoli includono analisi della sicurezza, dimensionamento del sistema, capacità, prestazioni, database, clustering e molte altre aree di competenza così ristrette, comprese aree di business precise. La varietà dei ruoli dipende dalle dimensioni e dalla complessità dei sistemi.

Tutto ciò per dire che non dovresti provare a sapere tutto, non lo farai. Puoi comunque avere una visione d'insieme del quadro e su piccoli progetti puoi approfondire molto più che su grandi progetti, semplicemente perché il livello di complessità ti consente di essere più arrotondato.

Se vuoi sapere come progettare i sistemi, allora devi iniziare a fare domande pensando fuori dagli schemi. Mettiti abbastanza nei panni del cliente e prova a pensare a cosa potrebbe andare storto, a cosa bisogna testare. Quindi si incontrano con un cliente reale e li spingono a spiegare le estensioni e i limiti del sistema che immaginano di aver bisogno. Inoltre ogni volta che dico "cliente", devi capire che questo comprende molte persone molto diverse. C'è la persona che usa il sistema giorno dopo giorno per quello per cui è stata progettata. C'è l'operatore, il supporto tecnico, il manager che ha bisogno di un rapporto o altro, il revisore, il team dell'infrastruttura, il portatore di interessi che lo ha pagato, il responsabile della qualità che ha bisogno di mezzi per testare il sistema ... Chiedi a tutti (e se sono una persona, chiedi loro di indossare tutti questi cappelli uno alla volta), quindi chiedi loro tutto ciò di cui hanno bisogno e avrai un buon inizio per sapere quali sono i tuoi requisiti di sistema. Da lì è possibile ricavare l'architettura e da lì il design.

Per i sistemi complessi (sia software che da integrare con l'hardware nel senso più generico) non solo una persona non è sufficiente per ciascuno dei quattro ruoli che ho elencato sopra, ma è necessario gestire il progetto anche la definizione di ciò che il sistema deve fare, figuriamoci le altre fasi.

HPH, asm.


2

qui per imparare, c'è un libro su questo genere di cose?

Non "un libro". Molti libri.

Non c'è strada reale

Come ho detto, sembra esserci un'enorme differenza tra la scrittura del codice e la scrittura del codice giusto

Giusto.

Stai parlando di "architettura", di programmazione in generale.

Passaggio 1. Leggere molto codice. Molto. Pensa alle cose che vorresti fare. Trova progetti open source correlati. Leggi il codice Tutto.

Passaggio 2. Leggi altro codice. Molto più.

Passaggio 3. Leggi i libri sull'architettura.


2
Leggi leggi leggi. Ma devo suggerire che non è esattamente lo stesso di quello che impari quando realizzi effettivamente sistemi reali.
Quentin-starin,

@qes: La domanda era "dove impari come realizzare correttamente i sistemi?" Non lo impari costruendo male sistemi reali. In effetti, implementare male i sistemi reali è esattamente l'opposto dell'apprendimento.
S.Lott

3
Da Code Complete, una delle cose che mi è piaciuta di più: "Il campo dell'ingegneria del software fa un uso straordinariamente limitato di esempi di successi e fallimenti passati. Se tu fossi interessato all'architettura studieresti i disegni di [famosi architetti] ... visitare alcuni edifici ... ".
Jacob

@ S.Lott: chi ha detto qualcosa sul farlo male?
Quentin-starin,

@qes: senza leggere l'arte nota, quali sono le probabilità di fare bene un programma su larga scala? Per un genio come te, è possibile che si possa semplicemente scrivere buoni programmi in ogni momento e su tutte le scale. Ma per tutti gli altri che non hanno esaminato la programmazione su larga scala, iniziare cercando di implementare un sistema di grandi dimensioni senza aver letto nulla è un percorso verso la scrittura di qualcosa che contiene così tanti errori che non si può imparare nulla di utile da esso. La tua esperienza potrebbe essere diversa, ma so che non sono abbastanza intelligente per lavorare senza prima leggere.
S.Lott

1

Per amplificare leggi molti libri ....

Ora sai di avere un problema, c'è qualche motivo nel dirti di leggere questi libri. (Prima di aver fatto un vero lavoro, non ha senso discutere di questi libri)

Design Patterns di Gamma, Helm, Johnson e Vlissides Pattern Lingue di progettazione del programma 1,2,3 e 4.

Ma non provare ad applicare ogni scalpiccio ovunque tu veda che potrebbe essere usato

anche questa è una brutta cosa.

Spero che questo ti aiuti.


1

Il modo migliore per imparare a fare qualsiasi cosa è farlo. Se vuoi imparare a parlare il francese, devi parlare il francese, leggere il francese e scrivere il francese, leggere il francese e andare in Francia e parlare con i francesi in francese. Se vuoi sapere come suonare il piano, devi effettivamente suonare il piano. Devi suonare canzoni semplici e imparare la struttura del piano e la struttura della musica. Devi imparare a leggere la musica e come esprimere la musica attraverso un pianoforte usando le dita. Devi imparare come suona la musica e che tipo di suoni può fare un piano rispetto a ciò che può fare una chitarra, un flauto o un sassofono.

La programmazione è esattamente la stessa. Se sai come progettare un database, devi progettare database. Se si desidera comprendere la crittografia, implementare algoritmi crittografici e protocolli crittografici. Se si desidera scrivere software in grado di servire più utenti contemporaneamente, è necessario capire come funzionano l'IO del disco, l'IO della rete e i thread. Per capire come funziona, hai un codice di scrittura che legge e scrive dai file, trasmette i dati attraverso una rete e sincronizza l'accesso alle risorse. Tutto ciò richiede pratica.

Un "sistema" è, generalmente, solo una raccolta di cose. Pezzi che si coordinano per formare un tutto. Per costruire qualcosa di grande, devi costruire un mucchio di piccole parti. Quindi, se vuoi imparare a costruire sistemi, inizia a costruire sistemi. Prendi un problema, scomponi in pezzi e implementa ogni pezzo uno per uno. Alla fine avrai un "sistema" integrato. Probabilmente fallirai alcune volte lungo la strada, ma va bene. Se non fallisci, di solito significa che non stai provando abbastanza.

Inoltre, consiglierei di andare a scuola per studiare Informatica. Ciò non sarà di grande aiuto con la parte "pratica". Dovrai farlo da solo, ma ti aiuterà con la parte di esposizione. Imparerai molto, praticamente tutto ciò che riguarda il funzionamento dei computer e dei sistemi di computer, che è difficile da imparare da solo.


1
+1, anche se suggerirei che fare semplicemente non è abbastanza. Non saprai se l'hai fatto bene o male fino a quando non rivisiti lo stesso codice dopo che è trascorso un po 'di tempo. E anche allora, potresti sapere che qualcosa non va, ma non come può essere migliorato. Un modo per abbreviare tutto ciò è garantire un sacco di feedback tempestivo da persone più esperte su ciò che stai cercando di imparare. Quindi sì, "fare" è molto importante, ma il feedback su ciò che fai probabilmente anche di più per accelerare il processo di apprendimento.
Marjan Venema,
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.