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

17

Mi è sempre piaciuta la fisica, e mi è sempre piaciuta la codifica, quindi quando ho ottenuto l'offerta per una posizione di dottorato di ricerca sulla fisica numerica (i dettagli non sono rilevanti, è principalmente la programmazione parallela per un cluster) in un'università, è stato un gioco da ragazzi per me.

Tuttavia, come molti fisici, sono autodidatta. Non ho una vasta conoscenza di base su come codificare in modo orientato agli oggetti, o il nome di quell'algoritmo specifico che ottimizza la ricerca in qualche albero kD.

Dal momento che tutto il mio lavoro finora è stato più preoccupato per la fisica e i risultati scientifici, ho indubbiamente alcune cattive abitudini, soprattutto perché la mia codifica è mia e non è veramente lavoro di squadra. Ho usato principalmente C dal momento che è molto semplice e "quello che scrivi è ciò che ottieni" - non c'è bisogno di astrazioni fantasiose. Tuttavia, di recente sono passato al C ++ dal momento che mi piacerebbe saperne di più sulla potenza fornita con l'astrazione, ed è piuttosto simile a C (almeno sintassi).

Come faccio a insegnare a me stesso a codificare in modo buono e astratto come un laureato in informatica?

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

    
posta user787267 25.08.2012 - 20:14
fonte

12 risposte

20

Keep in mind that I don't have time to read several 1000-page tomes about abstract programming.

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

Come per qualsiasi altra disciplina, se vuoi essere bravo a programmare devi dedicare tempo e sforzi alla pratica e allo studio. Impari a scrivere un codice chiaro ed elegante scrivendo molto codice e leggendo attentamente il codice di altre persone. Alcuni di quei 1000 tomi di pagina ti faranno risparmiare tempo riassumendo le dure lezioni che altri hanno imparato. È illusorio pensare di poter diventare un abile programmatore come un effetto collaterale indolore di ottenere un dottorato di fisica. Non è che non si possa uscire da un dottorato di fisica. con pazze capacità di programmazione, è solo che ti costerà tempo e problemi.

Codice completo è una buona introduzione ai meccanismi dello sviluppo del software, inclusi consigli su come scrivere e strutturare codice chiaro e manutenibile. Sì, è un enorme volume, ma certamente non così denso come dire, Dirac "Principles of Quantum Mechanics" o "Gravitation" di MTW. Il codice completo è il più vicino possibile a una lista di controllo in cinque fasi per scrivere un software migliore.

Matlab, VIM, C, MPI e Valgrind sono strumenti eccellenti per sapere. Non si menziona l'utilizzo di un sistema di controllo della versione. Se per caso non stai già utilizzando un sistema di controllo della versione, devi iniziare a usarne uno immediatamente. Il controllo della versione è anche un dio-invio 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 devi leggere un libro di 1000 pagine per ognuno di questi. Lavora attraverso i tutorial online per ottenere le basi e quindi iniziare a lavorare con loro. Analizza più a fondo la documentazione man mano che le tue esigenze diventano più sofisticate.

Informarti sull'apprendimento dei fondamenti dell'informatica (al contrario dei fondamenti della costruzione del software) è più difficile. Non si specifica su quale problema si sta lavorando, se si stanno sviluppando nuovi algoritmi o si applicano algoritmi esistenti. A seconda del tuo problema di ricerca, potrebbe essere utile un sondaggio sulle strutture di dati di base e sugli algoritmi standard. Altri problemi trarrebbero maggiore beneficio da un solido background nell'analisi numerica. Se vuoi imparare le basi dell'analisi degli algoritmi, ci sono molti buoni testi. Manuale di progettazione dell'algoritmo e Introduzione agli algoritmi viene in mente. Ci sono anche un paio di buoni corsi introduttivi disponibili online: Progettazione e analisi degli algoritmi e Algoritmi .

    
risposta data 26.08.2012 - 03:06
fonte
9

Il mio background è un po 'simile al tuo: ero un laureato in fisica che era un programmatore autodidatta. Dopo essermi laureato, ho iniziato a occuparmi di IT e alla fine sono diventato un ingegnere del software; tra cui un po 'di tempo a lavorare 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 piuttosto che provare a prenderle da te. Un mentore esperto può facilmente aiutarti a identificare dove il tuo codice è debole o dove schemi e pratiche comuni possono aiutarti. Mentre imparavo a scrivere C e Objective-C da solo, non sapevo esattamente cosa non sapessi (se capisci cosa intendo) finché non lavoravo con altre persone sullo stesso codice. Il fatto che stai chiedendo un consiglio significa che stai facendo meglio di quanto ho già fatto: -).

Ora, dove trovi un addetto al software professionale addomesticato? Di recente mi sono iscritto a MentorNet , un sistema che collabora con programmatori esperti con i protetti.

Ma non devi andare per un sistema formale come quello. Trovare un gruppo di incontro per programmatori locali (o dove il dipartimento di ingegneria del software della tua università vada dopo il lavoro di venerdì) è un ottimo punto di partenza.

    
risposta data 25.08.2012 - 22:18
fonte
5

Nessuna strada reale verso il software

Nei tempi antichi, a Euclide fu posta una domanda come la tua dal suo allievo, il re Tolomeo. La sua risposta: "Non esiste una strada regale per la geometria".

Hai detto che il tuo supervisore riderebbe se sapesse quanto tempo passi a cercare di scrivere codice come uno sviluppatore professionista. Altri hanno risposto alle tue domande con una lista di cose da imparare che vanno dal controllo del codice sorgente al design e all'analisi degli algoritmi.

Non sono all'altezza del tuo obiettivo:

"I need to spend time on actual physics"

Concert Pianist o One Man Band?

Il mondo si muove troppo velocemente perché le persone si dilettano. Se vuoi essere un pianista da concerto, non dividere i tuoi strumenti di apprendimento del tempo per diventare una one man band.

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

Come valuto se il mio lavoro è anche buono dal punto di vista del programmatore?

Se vuoi impostare la barra in alto, inizia da qui:

Architettura software in pratica, Len Bass, Paul Clements, Rick Kazman

Cerca il capitolo "Capire gli attributi di qualità". Oltre al codice, considera l'usabilità, le modifiche, le prestazioni, la sicurezza, la disponibilità, l'affidabilità, la testabilità, la sostenibilità e la portabilità (non puoi portarlo, ma puoi portare il progetto da una piattaforma all'altra). Tutti hanno bisogno di obiettivi misurabili specifici. Riferimenti simili includono:

link

link

I tuoi obiettivi contro C e C ++

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

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

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

Considera l'uso di Matlab

Matlab ha una grande base installata, è specializzato 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 i prodotti Parallel Computing Toolbox e Distributed Computing Server.

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 software, architettura software e design. L'analogia può essere un tratto, ma perché dovresti metterti lì da solo, a partire da un martello, scalpello e raspa per fare qualcosa quando hai una stampante 3D disponibile? Come potrebbe chiedere Newton, perché non stare sulle spalle di qualcuno?

    
risposta data 26.08.2012 - 17:44
fonte
4

Sarai in grado di percorrere una lunga strada in fisica senza sapere nulla di stile "professionale" (parlando dall'esperienza). Ma ho visto molte persone perdere tempo infinito perché hanno perso la cognizione di ciò che stavano facendo o dopo aver cresciuto il loro codice per un paio di anni si sono persi nella sua complessità (anche nel mondo accademico non esiste il codice "buttare via", ma cose rimani molto più a lungo di quanto pensi inizialmente).

Suggerirei di ottenere un vantaggio in algoritmi e strutture dati, ad es. con questo corso . Dopodiché dovresti essere in grado di pensare alle prestazioni a un livello più produttivo ed essere in grado di dare seguito, ad es. articoli su Wikipedia.

Dopodiché ti abitui a ciò che è disponibile nel nucleo della tua lingua, ad es. per C ++ cppreference.com . Raccomanderei inoltre vivamente di leggere la serie Effective C ++ di Scott Meyers e Accelerated C ++ di Koenig & Moe. Almeno per C ++ questo ti darà una solida base sul lato linguistico.

In parallelo, dovresti provare a conoscere bene i tuoi strumenti. Non è improbabile che sviluppi il tuo codice sotto Linux, quindi cerca di imparare come ottenere più diagnostica (avvisi) dai tuoi compilatori (almeno gcc e clang). Scopri anche gli strumenti di analisi statica come cppcheck o clang's scan-build . 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 meglio ancora qualcosa come GNU autotools / cmake / ...). Dovresti anche aggiungere strumenti di profilatura al tuo set di strumenti. Per C ++ ti consiglio vivamente di imparare tutto ciò che puoi su valgrind che può profilare su un livello molto basso (può anche aiutarti a trovare le 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. Ovviamente questo è quasi impossibile da vendere ad un consulente, ma loro (e voi) resteranno 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 abbastanza Python con numpy and scipy . Ti consente di scrivere in un linguaggio pulito e pulito a un livello molto alto (puoi persino lavorare in modo interattivo), sfruttando al contempo le routine estremamente ottimizzate implementate in C, C ++ e FORTRAN. Inoltre, l'interfacciamento del tuo codice C o C ++ con Python è quasi banale.

    
risposta data 25.08.2012 - 20:53
fonte
4

How do I assess if my work is also good from a programmer's perspective?

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

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

  • Quando il tuo supervisore dice "Ottimo, ora fallo anche X ..." devi riscrivere un sacco di codice?

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

Se puoi rispondere sì, sì, no, e 'sì, provo a creare strumenti piuttosto che calcoli una tantum', quindi stai già andando abbastanza bene. Una buona parte di ciò che facciamo come programmatori ha lo scopo di aiutare con il tipo di cose sopra elencate.

    
risposta data 25.08.2012 - 23:12
fonte
3

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

Lascia che qualche bravo sviluppatore di software riveda il tuo codice e lo ottimizzi insieme. Ti darà molta più esperienza e ti insegnerà le buone pratiche. Controlla 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 effettivamente hai bisogno di imparare qualcosa di nuovo per raggiungere i tuoi obiettivi. Fare cose inutili solo per rendere il codice più carino non aggiungerà alcun valore alle tue applicazioni.

    
risposta data 25.08.2012 - 20:42
fonte
3

Per quanto riguarda il fatto di diventare un programmatore migliore, non vi è alcun punto magico. Se sei autodidatta, la chiave è l'auto-consapevolezza, che sembra avere. Tuttavia, imparare a programmare bene dipende principalmente dalla lettura e dalla pratica.

Essere critici del proprio codice è uno dei modi migliori per migliorare. Chiedi sempre a te stesso:

  • Sarà facile cambiare?
  • È facilmente testabile?
  • Posso semplificare questo? Posso capire facilmente questo quando lo rivedo tra 3 mesi?

Il mio altro suggerimento sarebbe non chiuderti in C / C ++. Mentre quelli sono buoni linguaggi che vengono utilizzati per una ragione, richiedono che tu faccia un sacco di cose che non sono correlate all'argomento. Guarda in Matlab, sarei sorpreso se l'università non avesse quello disponibile per te. Considera un linguaggio di scripting come Python. Considera strongmente la scelta di un linguaggio funzionale come Haskell: il paradigma è di natura molto matematica e probabilmente si adatta ai tuoi problemi come un guanto. In breve, esplorate altri linguaggi / paradigmi. Anche se non diventano uno strumento permanente nella tua cintura, ti faranno diventare un programmatore migliore.

Potresti anche voler esaminare la progettazione di un algoritmo. Sospetto di aver ottenuto il lavoro, siete già relativamente ottimisti su questo argomento, ma gli algoritmi sono incredibilmente importanti quando si eseguono analisi numeriche. In effetti, sospetto, ci siano 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.

    
risposta data 24.02.2014 - 18:24
fonte
2

In primo luogo, "elegante" è un termine relativo. L'astrazione potrebbe sembrare elegante per te, ma per un altro C aficionado, potrebbe sembrare inutile. Ad ogni modo, per rispondere alla tua domanda, dovresti provare a postare il tuo codice per la revisione su link .
Divagando dal punto principale, alcuni consigli non richiesti basati sulla mia esperienza personale. Se riesci a portare a termine tutto il tuo lavoro con solo C, allora perché vuoi codificarlo in modo astratto? Con questo, vuoi abilitare gli altri a riutilizzare il tuo codice? Se hai davvero una solida ragione per passare al C ++, scegli l'astrazione e apprendi concetti C ++ e OO. Altrimenti lascia cadere l'idea. A mio modesto parere, non dovresti mirare a rendere il tuo codice più leggibile e i tuoi risultati scientifici riproducibili piuttosto che darle astrazioni OO? Io stesso avevo questo tipo di ossessione per imparare OOPS e scrivere codice "elegante". Ma il C ++ impiegherà tempo per padroneggiare. Dovrai imparare la gestione della memoria dato che la raccolta dei rifiuti non è automatica in C ++. Seguite il mio consiglio dato che ho lavorato personalmente per un laboratorio di ricerca e ho perso molto tempo ad imparare C ++ e OO, invece di concentrarmi sul lavoro principale a portata di mano.

    
risposta data 25.08.2012 - 20:49
fonte
2

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

Se hai rivisto il tuo vecchio codice dopo alcuni mesi e ti sei chiesto "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 di "eleganza" o codice "buono" a meno che non vedano che aggiunge valore al proprio lavoro. Piuttosto che leggere la teoria, ti incoraggerei a tenere gli occhi aperti al 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 questa ricerca può esporsi casualmente a concetti che possono aiutarti. Può mostrarti codice che è scritto meglio del tuo codice. Ecco quando segui su Wikipedia e scopri di più. Tale apprendimento che nasce dalla curiosità, sarà molto più duraturo e utile per te della teoria che dimenticherai quando ti svegli il giorno dopo.

Prendi in considerazione anche la possibilità di provare lingue come MATLAB o Python.

    
risposta data 26.08.2012 - 06:44
fonte
2

Essendo un fisico diventato programmatore, ho trovato il mio background di fisica più utile nel formare le giuste metafore per la comprensione dei concetti software. Questa prospettiva ha anche reso la programmazione dell'apprendimento più divertente per me e mi ha aiutato a sviluppare il senso dell'eleganza nel software, a cui sembra che tu voglia sforzarti.

Ho descritto il ruolo importante e sottovalutato delle metafore e delle analogie nei software nella colonna CUJ "Patterns di pensare - nomi, metafore, programmazione migliore e la politica della lingua ". Ad esempio, i concetti di OO dell'ereditarietà di classe sono spesso paragonati ai tratti che passano dai genitori alla prole in una famiglia. Questa è un'analogia errata. L'analogia corretta per l'ereditarietà di classe è la classificazione biologica degli organismi (ad es. Una classe RedRose è un tipo di Fiore, e un Fiore è un tipo di Pianta).

O prendi ad esempio il concetto software di una macchina a stati gerarchici. Una buona metafora qui è il concetto di un sistema quantistico legato come l'atomo di idrogeno. Come si ricorda, gli stati di un atomo sono numerati da tre numeri quantici | n, l, m & gt ;, esattamente perché sono "annidati" (gerarchici). Questa metafora ti mostra come capire che gli stati annidano all'interno degli stati (proprio come gli stati del momento angolare (l) nidificano negli stati energetici (n)) e anche tu immediatamente vedi che lo stato di nidificazione è sempre riflesso di qualche simmetria del sistema.

Un'altra interessante analogia dalla fisica è il "modello di calcolo dell'attore", che recentemente è stato riscoperto a causa delle CPU multi-core e dell'informatica distribuita nel "cloud". Ho trovato utile e divertente pensare agli eventi scambiati dagli attori di stato (a.k.a. oggetti attivi) come bosoni virtuali, come i fotoni in QED o i gluoni in QCD. Questa metafora spiega la fondamentale natura asincrona della comunicazione, l'elaborazione degli eventi da eseguire a completamento (salto quantico) e l'incapsulamento rigoroso degli oggetti attivi, che possono interagire solo l'uno con l'altro tramite le risorse esplicite intermedie.

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

    
risposta data 12.09.2012 - 22:29
fonte
2

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

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

    
risposta data 26.08.2012 - 03:25
fonte
-5

Un laureato in Informatica non sa come programmare bene quando si laurea; non sono tanto richiesti quando lasciano l'Università. Solo se ottengono l'esperienza.

La risposta alla tua domanda è che devi imparare i modelli di design. 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 es. ASP.NET. Significa che puoi saltare l'apprendimento dell'astrazione. Lingue come Perl, PHP, ecc. Hanno un basso livello di astrazione.

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

    
risposta data 26.08.2012 - 12:33
fonte