Insegnare a me stesso, come fisico, a diventare un programmatore migliore [chiuso]


17

Mi è sempre piaciuta la fisica, e mi è sempre piaciuta la programmazione, quindi quando ho ottenuto l'offerta per un posto di dottorato facendo fisica numerica (i dettagli non sono rilevanti, è principalmente una programmazione parallela per un cluster) in un'università, era un no -brainer per me.

Tuttavia, come la maggior parte dei fisici, sono autodidatta. Non ho una vasta conoscenza di fondo su come programmare in modo orientato agli oggetti, o sul nome di quello specifico algoritmo che ottimizza la ricerca in qualche albero kD.

Dato che finora tutto il mio lavoro è stato più preoccupato per la fisica e per i risultati scientifici, ho indubbiamente delle cattive abitudini, soprattutto perché il mio codice è il mio e non proprio il lavoro di squadra. Ho usato principalmente C poiché è molto semplice e "ciò che scrivi è ciò che ottieni" - non sono necessarie astrazioni fantasiose. Tuttavia, di recente sono passato al C ++ poiché mi piacerebbe saperne di più sulla potenza derivante dall'astrazione, ed è piuttosto simile al C (almeno per quanto riguarda la sintassi).

Come posso insegnare a programmare in modo buono e astratto come un laureato in informatica?

So che il mio codice è efficiente, ma voglio che sia anche elegante e leggibile. Tieni presente che non ho tempo di leggere diversi tomi di 1000 pagine sulla programmazione astratta. Ho bisogno di dedicare tempo alla ricerca reale, correlata alla fisica (il mio supervisore riderebbe di me se sapesse che ho trascorso del tempo a pensare a come programmare elegantemente). Come posso valutare se il mio lavoro è buono anche dal punto di vista di un programmatore?


12
Una domanda: come fai a sapere se il tuo codice è efficiente?
Matsemann,

Ho visto molte persone dire di no al C ++ come primo linguaggio OO. Sto imparando java e ho trovato i tutorial video di Mark Dexter qui eclipsetutorial.sourceforge.net/totalbeginner.html , sono abbastanza buoni e ti insegneranno in modo TDD. Dai un'occhiata anche a Head First Java, è abbastanza buono per nascondere Java in modo OO.
Garv,

4
@DeveloperDon, il calcolo era una parte centrale della fisica ancor prima che esistessero i computer elettronici. I calcoli sono stati eseguiti a mano o su calcolatori meccanici. Fin dalla seconda guerra mondiale i fisici sono stati profondamente coinvolti nel software. Se stai calcolando il ritorno di una cometa, simulando la produzione di neutroni in una reazione a catena nucleare o analizzando gigabyte di dati alla ricerca di segni del bosone di Higgs, devi fare un sacco di scricchiolii di numeri. Nel 1974 la prima metà del mio primo anno di laboratorio di fisica era dedicata all'insegnamento del FORTRAN.
Charles E. Grant,

1
@DeveloperDon Quando i fisici del CERN, ad esempio, ottengono dati, ottengono dati da milioni di collisioni di particelle. È necessario un computer per gestire questa quantità di informazioni. Considera anche un'area come la fisica dello stato solido in cui provi a capire le proprietà macroscopiche di un materiale dalle interazioni microscopiche degli atomi. In un tale sistema un singolo elettrone sente la repulsione / l'attrazione da miliardi di nuclei ed elettroni - e per descrivere un tale sistema con precisione è necessario un computer veloce e algoritmi efficienti (e alcune buone approssimazioni alle equazioni fondamentali).
user787267,

1
Forse dovresti cambiare la tua lingua da C / C ++ a Python in modo da poter avere più tempo? Python è spesso usato dagli scienziati , ci sono moduli come NumPy - pacchetto per il calcolo scientifico con Python o SciPy . Se hai bisogno della velocità di C / C ++ in Python, usa Cython , ti consente di usare tipi e strutture C / C ++ in modo da ottenere una velocità simile a C / C ++, è anche facile da integrare con le librerie C / C ++ esistenti usando Cython.
Czarek Tomczak,

Risposte:


20

Tieni presente che non ho tempo di leggere diversi tomi di 1000 pagine sulla programmazione astratta.

Quindi stai chiedendo a qualcuno di darti un elenco di controllo in cinque passaggi che ti renderà un programmatore esperto? Non succederà !

Come con qualsiasi altra disciplina, se vuoi diventare bravo a programmare devi dedicare tempo e fatica a praticare e studiare. Impara a scrivere un codice chiaro ed elegante scrivendo molto codice e leggendo attentamente il codice di altre persone. Alcuni di quei 1000 tomi di pagine ti faranno davvero risparmiare tempo riassumendo le dure lezioni che altre persone hanno imparato. È illusorio pensare di poter diventare un abile programmatore come un effetto collaterale indolore di ottenere un dottorato in fisica. Non è che non puoi uscire da un dottorato in fisica. con pazze capacità di programmazione, è solo che ti costerà tempo e problemi.

Code Complete è una buona introduzione alla meccanica dello sviluppo del software, inclusi consigli su come scrivere e strutturare un codice chiaro e gestibile. Sì, è un tomo enorme, ma certamente non così denso come dire, "Principi di meccanica quantistica" di Dirac o "Gravitazione" di MTW. Il codice completo è il più vicino possibile a una checklist in cinque passaggi per scrivere software migliore.

Matlab, VIM, C, MPI e Valgrind sono strumenti eccellenti da conoscere. Non menzionate l'uso di un sistema di controllo della versione. Se per qualche colpo di fortuna non si sta già utilizzando un sistema di controllo della versione, è necessario iniziare a utilizzarne immediatamente uno. Il controllo della versione è anche un invito a scrivere per scrivere la tua tesi. Altri strumenti di base che dovresti conoscere sono un debugger, un profiler di esecuzione, un framework di registrazione e un framework di test delle unità. Non è necessario leggere un libro di 1000 pagine per ognuno di questi. Lavora attraverso i tutorial online per ottenere le basi e quindi inizia a lavorare con loro. Analizza più a fondo la documentazione man mano che le tue esigenze diventano più sofisticate.

È più difficile consigliarti sull'apprendimento dei fondamenti dell'informatica (al contrario dei fondamenti della costruzione del software). Non specifichi su quale problema stai lavorando, sia che tu stia sviluppando nuovi algoritmi o applicando algoritmi esistenti. A seconda del problema di ricerca potrebbe essere utile un'indagine sulle strutture di dati di base e sugli algoritmi standard. Altri problemi trarrebbero maggiori benefici da una solida base nell'analisi numerica. Se vuoi imparare le basi dell'analisi dell'algoritmo ci sono molti buoni testi. Mi vengono in mente il Manuale di progettazione degli algoritmi e Introduzione agli algoritmi . Ci sono anche un paio di buoni corsi introduttivi disponibili online: Progettazione e analisi di algoritmi e algoritmi .


Grazie per i collegamenti, lo esaminerò. So che non diventerò un guru della programmazione in un fine settimana, tuttavia mi aspetto di migliorare gradualmente con il tempo, soprattutto se cerco ispirazione al di fuori della fisica (poiché molti fisici che conosco non potrebbero fregare di meno delle buone pratiche di programmazione).
user787267,

1
Aggiungerei Python negli strumenti come conteggio leggibile
Xavier Combelle,

2
+1 per suggerire il codice completo. È davvero la cosa migliore che l'op può leggere per risolvere il problema in questione.
JW01,

9

Il mio background è un po 'simile al tuo: ero un laureato in fisica che era autodidatta programmatore. Dopo essermi laureato, ho assunto alcuni lavori IT e alla fine sono diventato un ingegnere del software; compreso un po 'di tempo lavorando su OpenGDA (software utilizzato per eseguire esperimenti in vari siti di sincrotrone).

La cosa principale che ho imparato sulle domande che hai mentre stavo arrivando qui è che è molto più facile ottenere queste abilità da altre persone che provare a prenderle da soli. Un mentore esperto può aiutarti facilmente a identificare dove il tuo codice è debole o dove schemi e pratiche comuni possono aiutarti. Mentre ho imparato a scrivere C e Objective-C da solo, non sapevo esattamente cosa non sapevo (se vedi cosa intendo) finché non ho lavorato con altre persone sullo stesso codice. Il fatto che tu stia chiedendo consigli qui significa che stai facendo meglio di come ho già fatto :-).

Ora, dove trovi un ingegnere informatico professionista addomesticato? Di recente mi sono unito a MentorNet , un sistema che i partner hanno sperimentato programmatori con protégés.

Ma non devi scegliere un sistema formale come quello. Trovare un gruppo di incontro programmatore locale (o dove il dipartimento di ingegneria del software della tua università va dopo il lavoro venerdì) è un ottimo punto di partenza.


MentorNet sembra molto interessante - lo esaminerò. È stata una transizione difficile dal fisico all'ingegnere del software?
user787267,

@ user787267 Poiché ero interessato alla programmazione (ed ero già un programmatore hobbista), ero motivato a rendere la transizione come sembra che tu sia, quindi non ho trovato il lato tecnico difficile. Quello che mi ci è voluto di più per capire è stato il wetware: capire il mio posto in un team di progetto più grande e che era esperto in ciò che è un grande cambiamento rispetto al codice "lupo solitario" che stavo facendo prima.

5

Nessuna strada reale verso il software

Nei tempi antichi, a Euclide venivano poste domande come la tua dal suo studente, il re Tolomeo. La sua risposta: "Non esiste una strada reale per la geometria".

Dici che il tuo supervisore riderebbe se sapesse quanto tempo impieghi a scrivere codice come uno sviluppatore professionista. Altri hanno risposto alle tue domande con un elenco di cose da imparare che vanno dal controllo del codice sorgente alla progettazione e analisi degli algoritmi.

Non raggiungono il tuo obiettivo:

"Ho bisogno di passare il tempo sulla fisica reale"

Pianista da concerto o One Man Band?

Il mondo si muove troppo velocemente perché le persone si dilettino. Se vuoi essere un pianista da concerto, non dividere il tuo tempo imparando strumenti per diventare una band unica.

Il mio concetto per il ruolo di un dottorato di ricerca in fisica su progetti di medie e grandi dimensioni è come idea leader per la definizione del sistema, esperto in teoria, esperto in materia durante la creazione di casi d'uso e utente / giudice finale per i risultati generati da artefatti software. Lavora a stretto contatto con i migliori ingegneri del software che puoi.

Come posso valutare se il mio lavoro è buono anche dal punto di vista di un programmatore?

Se vuoi impostare la barra in alto, inizia qui:

Software Architecture in Practice, Len Bass, Paul Clements, Rick Kazman

Cerca il capitolo "Comprensione degli attributi di qualità". Oltre al codice, considera usabilità, modificabilità, prestazioni, sicurezza, disponibilità, affidabilità, testabilità, capacità di manutenzione e portabilità (non è possibile trasportarlo, ma è possibile trasferire il design da una piattaforma all'altra). Tutti hanno bisogno di obiettivi misurabili specifici. Riferimenti simili includono:

http://msdn.microsoft.com/en-us/library/ee658094.aspx

http://www.sei.cmu.edu/reports/95tr021.pdf

I tuoi obiettivi contro C e C ++

Come FORTRAN, queste sono lingue dure e vecchie. Gli indicatori positivi per C / C ++ includono:

  • Applicazione con hardware, sistemi integrati.
  • Progetto esistente che desideri come punto di partenza.

Ci sono molte persone che fanno lo sviluppo web, la visualizzazione dei dati e i big data. Molti sono motivati ​​a trovare o creare altre lingue. Ad esempio, il fisico Sir Tim Berners-Lee ha fatto il suo successo con l'HTML (ma è poco conosciuto per la fisica). Valuta il tuo obiettivo rispetto al tuo linguaggio di programmazione.

Prendi in considerazione l'utilizzo di Matlab

Matlab ha un'ottima base installata, è specializzata in matematica e scienze. Ha strumenti per la visualizzazione dei dati. Permette a scienziati e matematici di esprimere problemi nel dominio del problema piuttosto che nel dominio della soluzione. Matlab crea una casella degli strumenti di elaborazione parallela e dei server di calcolo distribuito.

Mi aspetto che il successo di Matlab sia dovuto all'utilizzo di team multidisciplinari con persone esperte in fisica, matematica, elettronica e strumentazione, sistemi operativi, linguaggi di programmazione, sviluppo software, test del software, architettura e design del software. L'analogia può essere un tratto, ma perché dovresti metterti da solo, a partire da un martello, uno scalpello e una raspa per creare qualcosa quando hai una stampante 3D disponibile? Come potrebbe chiedere Newton, perché non stare sulle spalle di qualcuno?


4

Sarai in grado di fare molta strada in Fisica senza sapere nulla dello stile "professionale" (parlando per esperienza). Ma ho visto molte persone perdere tempo senza fine perché hanno perso le tracce di ciò che stavano facendo o dopo aver cresciuto il loro codice per un paio d'anni, si sono perse nella sua complessità (anche in ambito accademico non esiste un codice "buttare via", ma le cose rimanere molto più a lungo di quanto si pensi inizialmente).

Vorrei suggerire di ottenere un vantaggio in algoritmi e strutture di dati, ad esempio con questo corso . Dopodiché dovresti essere in grado di pensare alle prestazioni a un livello più produttivo e di poter seguire, ad esempio, gli articoli su Wikipedia.

Dopodiché, abituati a ciò che è disponibile nel cuore della tua lingua, ad esempio per c ++ cppreference.com . Consiglio vivamente anche di leggere la serie C ++ efficace di Scott Meyers e C ++ accelerata di Koenig & Moe. Almeno per C ++ questo ti darà una solida base dal punto di vista linguistico.

Parallelamente dovresti provare a conoscere bene i tuoi strumenti. Non è improbabile che svilupperai il tuo codice sotto Linux, quindi prova a imparare come ottenere più diagnostica (avvertimenti) dai tuoi compilatori (almeno gcc e clang). Scopri anche gli strumenti di analisi statica come cppcheck o scan-build di clang . Scopri come rendere questi strumenti parte integrante del tuo processo di sviluppo, ad es. Integrandoli nel tuo setup di build (sì, dovresti usare almeno GNU make o anche qualcosa di meglio come GNU autotools / cmake / ...). Dovresti anche aggiungere strumenti di profilazione al tuo set di strumenti. Per C ++ ti consiglio vivamente di imparare tutto ciò che puoi su valgrind che può profilare a un livello molto basso (può anche aiutarti a trovare perdite di risorse).

Tutto ciò ti aiuterà a concentrarti su ciò che ti interessa di più (la tua ricerca) invece di perdere tempo a trovare bug o fare inutili ottimizzazioni. Naturalmente questo è quasi impossibile da vendere a un consulente, ma loro (e te) rimarranno colpiti, ma la velocità con cui sarete in grado di ottenere risultati affidabili.

Hai citato C e C ++, ma per i calcoli numerici non posso raccomandare Python con abbastanza numpy e scipy . Ti consente di scrivere in un linguaggio pulito e abbastanza pulito a un livello molto alto (puoi persino lavorare in modo interattivo), pur sfruttando le routine estremamente ottimizzate implementate in C, C ++ e FORTRAN. Inoltre, l'interfacciare il proprio codice C o C ++ con Python è quasi banale.


Grazie per i collegamenti! Lo esaminerò sicuramente (ma non credo di avere il tempo di leggere diversi libri, anche se a un certo punto ho letto C ++ accelerato al liceo). Sto lavorando in un ambiente Unix (sto usando Vim come mio editor e mi piace), e uso ampiamente make e Valgrind. Ho anche attivato l'opzione -pedantic in gcc e -Wall in quanto aiuta un po '. Forse avrei dovuto menzionare che faccio un calcolo ad alte prestazioni (con la libreria MPI per la programmazione parallela) sul supercomputer dell'università.
user787267

Dovrei anche menzionare che Python non è davvero un'opzione poiché il mio codice deve essere molto veloce, anche se mi piace per esempio per la stampa. Ho usato anche Matlab molto.
user787267

Uso abbastanza spesso Python come front-end per parlare con le routine implementate nel mio C ++. Con Boost questo è davvero semplice e ottieni la piena flessibilità di Python (ad es. Per l'elaborazione dei dati per la stampa). Inoltre, Python è abbastanza pulito per la prototipazione. Una volta che so che qualcosa diventa cruciale, posso sempre spostarlo in C ++. Dato che menzioni MPI, ti consiglio di passare una serata con IPython con una bella interfaccia per il calcolo distribuito.
Benjamin Bannier,

@ user787267 Non è più necessariamente vero che Python si comporta lentamente - dai un'occhiata a youtube.com/watch?v=Iw9-GckD-gQ per esempio. La chiave è che puoi usare Python per scrivere più velocemente un codice funzionante che puoi quindi velocizzare di 1) usando numpy / scipy 2) usando Cython o shedskin e 3) inserendo solo l'algoritmo core in un modulo C / C ++ o FORTRAN se hai davvero bisogno dell'ultimo miglioramento del 5%. Ricorda anche che il tempo che dedichi alla programmazione è il momento in cui il codice non è già in esecuzione, quindi a volte potrebbe essere più efficiente avere un codice delle prestazioni dell'80% scritto in metà tempo
Tobias Kienzler,

In genere realizzo prototipi in Matlab per testare le cose semplici, ma ho voluto cambiare in Python per un po '. Lo darò un'occhiata. A causa delle grandi parti del mio codice già scritte in C ++, tuttavia, non voglio cambiare la lingua a metà. Anche se è vero, devi anche considerare il tempo reale, la programmazione del tempo (e credimi, lo faccio), non penso che dovrebbe essere una scusa per non migliorare le tue capacità di programmazione (gradualmente).
user787267,

4

Come posso valutare se il mio lavoro è buono anche dal punto di vista di un programmatore?

  • È corretto? Produce risultati corretti in tutti i casi?

  • Altre persone sono in grado di leggere e comprendere facilmente il tuo codice?

  • Quando il tuo supervisore dice "Ottimo, ora fallo anche fare X ..." devi riscrivere molto codice?

  • Quando hai scritto un programma, diventa uno strumento che puoi usare più e più volte, o lo usa una volta e lo butti via?

Se riesci a rispondere sì, sì, no e "sì, provo a fare strumenti piuttosto che calcoli una tantum", allora stai già andando abbastanza bene. Una buona parte di ciò che facciamo come programmatori ha lo scopo di aiutare con i tipi di cose sopra elencati.


3

I tuoi programmi saranno completamente diversi dal codice sorgente commerciale, quindi molte buone pratiche e approcci non si applicheranno nel tuo sviluppo quotidiano del codice sorgente. Ma c'è un buon modo per imparare alcuni consigli e trucchi.

Lascia che un buon sviluppatore di software riveda il tuo codice e lo ottimizzi insieme. Ti darà molta più esperienza e ti insegnerà le buone pratiche. Rivedi anche il codice sorgente scritto da altre persone. Cerca progetti open source su sourceforge o github e leggi il loro codice sorgente.

Ma soprattutto, pensa se hai davvero bisogno di imparare qualcosa di nuovo per raggiungere i tuoi obiettivi. Fare cose inutili solo per rendere il codice più bello non aggiungerà alcun valore alle tue applicazioni.


Leggere e partecipare a progetti open source è in realtà un'ottima idea, ma qualcosa che dovrei fare nel mio tempo libero (ma dal momento che mi piace programmare non dovrebbe essere un grosso problema). Uno dei motivi per cui desidero diventare un programmatore migliore è che non sono sicuro di rimanere nel mondo accademico. Quando il mio dottorato è possibile che potrei semplicemente trovare un lavoro nel settore - e qui un abile programmatore dovrebbe essere molto richiesto. Un altro motivo è la soddisfazione intellettuale di creare qualcosa di elegante / bello, come risolvere un'equazione differenziale davvero difficile.
user787267

Purtroppo l'industria richiede competenze che di solito non si acquisiscono nello sviluppo accademico. Le cose che scriverai durante le tue ricerche accademiche di solito sono meno del 5% del codice sorgente dell'applicazione commerciale.
Andrzej Bobak,

3

Per quanto riguarda diventare un programmatore migliore, non esiste un proiettile magico. Se sei autodidatta, la chiave è l'autocoscienza, che sembra che tu abbia. Tuttavia, imparare a programmare bene dipende principalmente dalla lettura e dalla pratica.

Essere critici sul proprio codice è uno dei modi migliori per migliorare. Chiediti sempre:

  • Sarà facile cambiare?
  • È facilmente testabile?
  • Posso semplificarlo? Posso facilmente capirlo quando lo vedrò di nuovo tra 3 mesi?

L'altro mio suggerimento sarebbe di non bloccarti in C / C ++. Mentre quelle sono buone lingue che vengono utilizzate per un motivo, richiedono che tu faccia molte cose che non sono legate all'argomento. Guarda in Matlab, sarei sorpreso se l'università non ha questo a tua disposizione. Prendi in considerazione un linguaggio di scripting come Python. Prendi in considerazione l'idea di imparare un linguaggio funzionale come Haskell: il paradigma è di natura molto matematica e probabilmente si adatta ai tuoi problemi come un guanto. In breve, esplora alcune altre lingue / paradigmi. Anche se non diventano uno strumento permanente nella tua cintura, ti renderanno un programmatore migliore.

Potresti anche voler esaminare alcuni progetti di algoritmi. Ho il sospetto di aver ottenuto il lavoro, sei già relativamente all'altezza su questo, ma gli algoritmi sono incredibilmente importanti quando si esegue l'analisi numerica. In effetti, sospetto, ci sono risorse specificamente orientate verso algoritmi di analisi numerica.

Non perdere mai di vista il tuo scopo principale nello scrivere il codice. Devi fare le cose. Diventare un programmatore migliore è un metodo per farlo. Selezionare gli strumenti giusti per il lavoro è un altro.


2

Innanzitutto, "elegante" è un termine relativo. L'astrazione potrebbe sembrare elegante per te, ma per un altro appassionato di C, potrebbe sembrare inutile. Ad ogni modo, per rispondere alla tua domanda, dovresti provare a pubblicare il tuo codice per la revisione su http://codereview.stackexchange.com .
Digressing dal punto principale, alcuni consigli non richiesti basati sulla mia esperienza. Se riesci a completare tutto il tuo lavoro con solo C, allora perché vuoi codificarlo in modo astratto? Con questo, vuoi consentire ad altri di ripristinare il tuo codice? Se hai davvero una solida ragione per passare al C ++, cerca l'astrazione e l'apprendimento dei concetti C ++ e OO. Altrimenti lascia cadere l'idea. Secondo la mia modesta opinione, non dovresti mirare a rendere il tuo codice più leggibile e i tuoi risultati scientifici riproducibili piuttosto che dargli astrazioni OO? Io stesso ho avuto questo tipo di ossessione per imparare OOPS e scrivere codice "elegante". Ma il C ++ richiederà tempo per essere padroneggiato. Dovrai imparare la gestione della memoria poiché la garbage collection non è automatica in C ++. Segui i miei consigli da quando ho lavorato per un laboratorio di ricerca e ho perso molto tempo a studiare C ++ e OO,


1
Ma C è ancora più non gestito di C ++. In C ++ c'è almeno RAII.
Benjamin Bannier,

Mi piace programmare, quindi voglio diventare un programmatore migliore. Sono un fisico prima e un secondo programmatore, ma ciò non significa che non dovrei migliorare le mie capacità di programmazione. Dopo tutto, se decido di pubblicare il mio codice insieme ai risultati scientifici, sarebbe meglio avere codice leggibile.
user787267

2

Considerando la tua menzione della mancanza di tempo per studiare la teoria.

Se hai guardato indietro al tuo vecchio codice dopo alcuni mesi e ti chiedevi "che tipo di idiota ha scritto quel codice", stai facendo progressi.

Come hai progredito? Vedendo un codice migliore scritto da altri. Una persona non conosce mai il valore dell'eleganza o del codice "buono" a meno che non lo vedano aggiungere valore al proprio lavoro. Piuttosto che leggere la teoria, ti incoraggio a tenere gli occhi aperti sul codice scritto da altri nel tuo campo di lavoro. Tieni gli occhi aperti sui concetti discussi su StackOverflow (tag C ++). Trascorrere solo quindici minuti al giorno di tale ricerca può esporti casualmente a concetti che possono aiutarti. Può mostrarti un codice che è scritto meglio del tuo codice. Questo è quando segui Wikipedia e ne scopri di più. Tale apprendimento che nasce dalla curiosità, sarà molto più duraturo e utile per te della teoria che dimenticherai quando ti sveglierai il giorno successivo.

Considera anche di provare lingue come MATLAB o Python.


Trascorro molto tempo su Stack Exchange: è una risorsa inestimabile per me nel mio lavoro quotidiano. Ho usato molto Matlab, ma è molto facile sviluppare cattive abitudini come non pre-allocare array poiché è molto tollerante.
user787267,

+1 per python @ user787267 Non capisco perché non preallocare l'array sia una cattiva abitudine
Xavier Combelle

2

Come fisico, anch'io diventato programmatore, ho trovato il mio background fisico molto utile nel formare le metafore giuste per comprendere i concetti del software. Questa prospettiva ha anche reso l'apprendimento della programmazione più divertente per me e mi ha aiutato a sviluppare il senso di "eleganza" nel software, per il quale sembra lottare.

Ho descritto l'importante e sottovalutato ruolo delle metafore e delle analogie nel software nella mia rubrica CUJ "Patterns of Thinking: nomi, metafore, migliore programmazione e politica del linguaggio" . Ad esempio, i concetti OO dell'eredità di classe sono spesso paragonati al passaggio di tratti dai genitori alla prole in una famiglia. Questa è un'analogia errata. L'analogia corretta per l'eredità di classe è la classificazione biologica degli organismi (ad esempio, una classe RedRose è un tipo di fiore e un fiore è un tipo di pianta).

Oppure prendiamo ad esempio il concetto di software di una macchina a stati gerarchica. Una buona metafora qui è il concetto di un sistema quantistico legato come l'atomo di idrogeno. Come ricorderete, gli stati di un atomo sono numerati da tre numeri quantici | n, l, m>, esattamente perché sono "nidificati" (gerarchici). Questa metafora mostra come capire che gli stati si annidano all'interno degli stati (proprio come gli stati del momento angolare (l) si annidano negli stati energetici (n)) e inoltre si vede immediatamente che l'annidamento degli stati è sempre il riflesso di una simmetria del sistema.

Un'altra interessante analogia con la fisica è il "modello di calcolo dell'attore", che recentemente è stato riscoperto grazie alle CPU multi-core e al calcolo distribuito nel "cloud". Ho trovato utile e divertente pensare agli eventi scambiati da attori statali (noti anche come oggetti attivi) come bosoni virtuali, come fotoni in QED o gluoni in QCD. Questa metafora spiega la natura asincrona fondamentale della comunicazione, l'elaborazione degli eventi da corsa a completamento (salto quantico) e l'incapsulamento rigoroso di oggetti attivi, che possono interagire solo tra loro tramite gli artefatti intermedi espliciti.

Ad ogni modo, sviluppare una metafora del sistema è una pratica raccomandata in XP (eXtreme Programming), e come fisico avrai un vantaggio nel trovare buone metafore. Acquisirai anche un senso di "eleganza", perché il tuo software erediterà l'integrità concettuale dalle buone metafore che applichi.


Sebbene la fisica sia potenzialmente una ricca fonte di metafore, l'intento di XP è trovare una metafora che faciliti la comunicazione con il cliente in loco e altri membri del team, quindi generalmente tende a scegliere metafore che sono più comunemente comprese.
Pete Kirkham,

2

Posso dirti che i maggiori guadagni che ho fatto in termini di approccio alla risoluzione dei problemi sono stati tutti ottenuti attraverso l'apprendimento di linguaggi funzionali e parser. Entrambe le scoperte sono state fatte per caso. Quindi ti sto dicendo ora se sei seriamente intenzionato a diventare un programmatore migliore, quindi devi conoscere le varie tecniche coinvolte nella scrittura di un compilatore, ad esempio parser e generatori di parser, e devi imparare a comporre calcoli con un ordine superiore funzioni.

Una risorsa eccellente per il parser e il compilatore è PL101: Crea il tuo linguaggio di programmazione . Non ho ancora trovato una buona introduzione alla programmazione funzionale, ma sento davvero cose positive su SICP .


-5

Un laureato in Informatica non sa codificare bene quando si laurea; non sono così richiesti quando lasciano l'università. Solo se ottengono l'esperienza.

La risposta alla tua domanda è che devi imparare i modelli di progettazione. Ho programmato in Java, .NET e ora lavoro come programmatore PHP, Javascript e MySQL. .NET tra l'altro ha un livello molto grande di astrazione, ad esempio ASP.NET. Significa che puoi saltare l'apprendimento dell'astrazione. Lingue come Perl, PHP, ecc. Hanno un basso livello di astrazione.

Leggi Head First Design Patterns, è un buon libro. È un libro abbastanza completo. Questo è tutto ciò di cui avrai bisogno.


Ho un'idea del perché questa risposta sia stata sottoposta a voto negativo, ma forse sarà utile se i votanti dicessero il perché?
Pierre Arlaud,
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.