Se sei un programmatore, non considerarti un "informatico"; gli informatici sono quelli che creano la prossima generazione di computer, alcuni dei quali sono ancora fantascienza fino a quando non si ottiene il giusto mix di materiali, miniatuizzazione e teoria computazionale. Sono solo l'inizio della pipeline. Le persone che sviluppano software nel qui e ora sono "ingegneri del software"; prendono le teorie e gli strumenti, a volte sovrapponendo la teoria pratica e gli strumenti del mondo reale, per sfruttare il potere in potenza di questo complesso pezzo di magia elettronicainica e farlo fare ciò che vogliamo. Questa è a sua volta una specializzazione nel campo dell '"ingegneria informatica", che porta le teorie degli informatici e le applica, hardware e software, alle soluzioni elettroniche degli utenti finali del mondo reale.
Questo è, IMO, dove gli affari incontrano la teoria. In questi tipi di casi, il vecchio adagio "il nemico del meglio è abbastanza buono" può essere facilmente girato per leggere "il nemico del abbastanza buono è meglio". Considerarti un "ingegnere" anziché uno "scienziato" e mettere in parallelo ciò che fai in parallelo con altre discipline ingegneristiche, mette in rilievo le differenze.
Diciamo che un cliente viene da te, un ingegnere civile / strutturale, e ti chiede di costruire un ponte. Il ponte deve superare 20 piedi, sostenere se stesso e una tonnellata di carico, dovrebbe durare 10 anni con manutenzione ordinaria e lo vogliono in un mese per $ 20.000. Questi sono i tuoi vincoli; soddisfare i minimi pur non superando i massimi. Fare questo è "abbastanza buono", e ti dà la busta paga. Sarebbe una cattiva ingegneria per te costruire il Golden Gate Bridge, superando di gran lunga sia le specifiche di progettazione che il budget di diversi ordini di grandezza. Di solito si finisce per mangiare i sovraccarichi di costo e pagare penalità per perdite di tempo. Sarebbe anche una cattiva ingegneria per te costruire un ponte di corda valutato per il peso di 5 uomini adulti anche se costa solo $ 1000 in termini di tempo e materiali; non ottieni buone recensioni e testimonianze dei clienti,
Di nuovo nel software, supponiamo di avere un client che ha bisogno di un sistema di elaborazione dei file creato per digerire i file in arrivo e inserire le informazioni nel sistema. Vogliono farlo in una settimana e deve gestire cinque file al giorno, circa 10 MB di dati, perché è tutto il traffico che ottengono attualmente. Le tue preziose teorie escono in gran parte dalla finestra; il tuo compito è costruire un prodotto che soddisfi tali specifiche in una settimana, perché in tal modo soddisfi anche il budget dei costi del cliente (poiché i materiali sono generalmente una goccia nel secchio per un contratto software di queste dimensioni). Trascorrere due settimane, anche per dieci volte il guadagno, non è un'opzione, ma molto probabilmente non è nemmeno un programma costruito in un giorno in grado di gestire solo metà della velocità effettiva, con l'istruzione di far funzionare due copie.
Se pensi che questo sia un caso marginale, ti sbagli; questo è l'ambiente quotidiano della maggior parte dei proprietari. Il motivo è il ROI; questo programma iniziale non costa molto e quindi si ripaga molto rapidamente. QUANDO gli utenti finali ne hanno bisogno per fare di più o andare più veloce, il codice può essere refactored e ridimensionato.
Questa è la ragione principale dietro l'attuale stato di programmazione; l'ipotesi, confermata dall'intera storia dell'informatica, è che un programma non è MAI statico. Dovrà sempre essere aggiornato e alla fine verrà sostituito. Parallelamente, il costante miglioramento dei computer su cui sono in esecuzione entrambi i programmi consente una minore attenzione all'efficienza teorica e una maggiore attenzione alla scalabilità e al parallelismo (un algoritmo che gira in N-quadrato ma che può essere parallelizzato per funzionare su N core appare lineare e spesso il costo di più hardware è più economico di quello degli sviluppatori per escogitare una soluzione più efficiente).
Inoltre, c'è il principio molto semplice che ogni riga di codice sviluppatore è qualcos'altro che può andare storto. Meno uno sviluppatore scrive, meno è probabile che ciò che scrive abbia un problema. Questa non è una critica al "bug rate" di nessuno; è una semplice dichiarazione di fatto. Potresti sapere come scrivere un MergeSort avanti e indietro in 5 lingue, ma se hai il dito solo un identificatore in una riga di codice l'intero ordinamento non funziona e se il compilatore non lo rileva potrebbe prenderti ore per il debug. Contrastalo con List.Sort (); è lì, è efficiente nel caso generale e, ecco la cosa migliore, funziona già.
Quindi, molte delle funzionalità delle piattaforme moderne e principi delle moderne metodologie di progettazione sono state costruite tenendo presente questo aspetto:
- OOP - costruisci dati e logica correlati in un oggetto e ovunque il concetto di quell'oggetto sia valido, quindi l'oggetto o una derivazione più specializzata.
- Modelli predefiniti: un buon 60% o più di codice è un'innesto sintattico e le basi per far sì che il programma mostri qualcosa sullo schermo. Standardizzando e generando automaticamente questo codice, riduci della metà il carico di lavoro dello sviluppatore, consentendo un aumento della produttività.
- Librerie di algoritmi e strutture dati - Come in precedenza, potresti sapere come scrivere Stack, Queue, QuickSort, ecc., Ma perché devi farlo, quando c'è una libreria di codice che ha tutto questo integrato? Non riscriveresti IIS o Apache perché avevi bisogno di un sito Web, quindi perché implementare un algoritmo QuickSort o un oggetto albero rosso-nero quando sono disponibili diverse grandi implementazioni?
- Interfacce fluide - Sulla stessa linea, potresti avere un algoritmo che filtra e ordina i record. È veloce, ma probabilmente non è molto leggibile; al tuo sviluppatore junior ci vorrebbe un giorno solo per capirlo, figuriamoci fare le modifiche chirurgiche necessarie per ordinare su un campo aggiuntivo nell'oggetto record. Invece, librerie come Linq sostituiscono un sacco di codice molto brutto, spesso fragile, con una o due linee di chiamate di metodo configurabili per trasformare un elenco di oggetti in oggetti filtrati, ordinati e proiettati.