Sviluppando una profonda conoscenza della programmazione

132

A volte vedo domande su casi limite e altre stranezze su Stack Overflow a cui sono facilmente risposto Jon Skeet ed Eric Lippert, che dimostrano una profonda conoscenza della lingua e delle sue molte complessità, < a href="http://blogs.msdn.com/b/ericlippert/archive/2011/06/30/following-the-pattern.aspx"> come questo:

You might think that in order to use a foreach loop, the collection you are iterating over must implement IEnumerable or IEnumerable<T>. But as it turns out, that is not actually a requirement. What is required is that the type of the collection must have a public method called GetEnumerator, and that must return some type that has a public property getter called Current and a public method MoveNext that returns a bool. If the compiler can determine that all of those requirements are met then the code is generated to use those methods. Only if those requirements are not met do we check to see if the object implements IEnumerable or IEnumerable<T>.

È una cosa interessante da sapere. Posso capire perché Eric lo sa; è nella squadra dei compilatori, quindi deve saperlo. Ma che dire di quelli che dimostrano una conoscenza così profonda che non sono addetti ai lavori?

Come fanno i comuni mortali (che non fanno parte del team di compilatori C #) a scoprire cose del genere?

In particolare, ci sono metodi che queste persone usano per sradicare sistematicamente tale conoscenza, esplorarla e interiorizzarla (farla propria)?

    
posta Robert Harvey 11.07.2011 - 22:34
fonte

10 risposte

165

Innanzitutto, grazie per le gentili parole.

Se vuoi avere una profonda conoscenza di C # è indubbiamente un vantaggio avere le specifiche della lingua, dieci anni di note di progettazione, il codice sorgente, il database dei bug e Anders, Mads, Scott e Peter in fondo al corridoio. Sono certamente fortunato, non c'è dubbio.

Tuttavia, anche senza questi vantaggi è ancora possibile ottenere una profonda conoscenza dell'argomento.

Quando ho iniziato a lavorare su Microsoft, stavo lavorando all'interprete JScript fornito con Internet Explorer 3. Il mio manager mi ha detto qualcosa che era uno dei migliori consigli che avessi mai ricevuto. Ha detto che voleva che diventassi l'esperto riconosciuto di Microsoft sulla sintassi e la semantica del linguaggio JScript e che dovrei fare questo cercando domande su quegli aspetti di JScript e rispondendoli. Rispondendo in particolare alle domande non sapevo le risposte, perché quelle sono quelle da cui vorrei imparare.

Ovviamente StackOverflow e altri forum pubblici di Q & A sono come bere da un firehose per quel genere di cose. Allora, leggevo comp.lang.javascript e i nostri forum interni "JS User" di Microsoft religiosamente e seguivo il consiglio del mio manager: quando ho visto una domanda riguardante la semantica del linguaggio che non conoscevo la risposta a, ho fatto il mio lavoro per scoprirlo.

Se vuoi fare un'immersione così, devi scegliere con attenzione. Fino ad oggi sono notevolmente ignorante su come funziona il modello a oggetti del browser. Da quando mi sono concentrato a diventare l'esperto di linguaggio C # negli ultimi anni, sono straordinariamente all'oscuro di come funzionano le varie classi nelle librerie di classi base. Sono fortunato perché ho un lavoro che premia una profonda conoscenza specifica; se il tuo lavoro oi tuoi talenti sono più in linea con l'essere un generalista, andare in profondità potrebbe non funzionare per te.

Anche scrivere un blog è di grande aiuto; richiedendomi di spiegare argomenti complessi ad altre persone, sono costretto a confrontarmi con la mia inadeguata comprensione di vari argomenti in ogni momento.

    
risposta data 13.07.2011 - 00:59
fonte
63

Essendo stati sul lato "guru" della conversazione una o due volte, posso dirti che molte volte ciò che percepisci come "profonda conoscenza" di un linguaggio o di un sistema di programmazione è spesso il risultato del "guru" recentemente lottando per un mese per risolvere esattamente lo stesso problema. Ciò è particolarmente vero in un forum in cui le persone possono scegliere a quali domande rispondere. Anche Jon Skeet ed Eric Lippert hanno dovuto imparare il mondo ciao ad un certo punto. Raccolgono le loro conoscenze un concetto alla volta, come chiunque altro.

    
risposta data 11.07.2011 - 23:58
fonte
47

Parafrasando Yogi Bhajan:

"If you want to learn something, read about it; if you want to understand something, write about it; if you want to master something, program it."

La programmazione è come l'ultima sfida di insegnamento. Insegnare al computer fare qualcosa richiede, che tu sappia le tue cose molto bene - o imparerai a padroneggiarlo.

Ad esempio, se vuoi imparare la fisica, scrivi un motore fisico. Se vuoi imparare gli scacchi, programma una partita a scacchi. Se vuoi approfondire la conoscenza di C #, scrivi un compilatore C # (o qualche altro strumento).

    
risposta data 11.07.2011 - 23:17
fonte
25

Per quanto ne so, i modi per imparare questo sono:

  • Leggi informazioni su qualcuno come Eric Lippert
  • Esperienza e risoluzione dei problemi di prima mano.

Il secondo modo potrebbe richiedere molto più tempo, ma probabilmente porterà a una comprensione più profonda (ma non sempre).

    
risposta data 11.07.2011 - 22:39
fonte
23

Direi di fare quanto segue:

Dopo aver imparato una serie di lingue relativamente utili (quelle di cui hai bisogno per un vero lavoro) al livello in cui puoi svolgere le attività più comuni, smetti di imparare più lingue finché non ne hai approfondito almeno una. Parte del problema nel nostro settore in questo momento, secondo me, è che le persone imparano solo il primo 5-10% della lingua prima di passare ad un'altra lingua. Una volta che hai la capacità di svolgere le attività più comuni in un lavoro, inizia a guardare a una cosa in profondità. (Puoi tornare indietro per ottenere l'ampiezza dopo aver ottenuto una certa profondità, quindi andare avanti e indietro tra i due.)

Volontari per i compiti più complessi e difficili, quelli che ti fanno andare in profondità per risolvere i problemi. Se non c'è nessuno in cui lavori, cerca attività open source da fare o inizia a lavorare su un progetto personale che ti farà andare in profondità. Se il tuo lavoro non ha problemi interessanti, considera la ricerca di un lavoro più impegnativo.

Leggi i libri avanzati in una lingua (per SQl Server, ad esempio, questo include la lettura di tuning delle prestazioni e interni del database) invece di imparare X in 30 giorni di libri.

Leggi le domande interessanti qui e in altri luoghi dove vengono poste e cerca di risolverne alcune. Se vuoi imparare, prova a risolverne alcuni senza prima leggere le altre risposte. Anche se la domanda ha già avuto risposta, imparerai di più se trovi la risposta da solo. Potresti anche trovare una risposta migliore rispetto a quella della domanda.

Fai alcune delle domande più difficili. Valuta le risposte che ti vengono date, non limitarti a usarle. Assicurati di capire perché la risposta avrebbe funzionato o meno. Usa quelle risposte come punto di partenza per la ricerca.

Trova alcuni buoni blog tecnici di esperti conosciuti sul campo e leggili.

Smetti di buttare via le tue conoscenze dopo averle finite. Impara a conservare. La maggior parte degli esperti non deve cercare la sintassi comune. Non devono reinventare la ruota ogni volta che affrontano un problema perché ricordano come si sono avvicinati a un problema simile prima. Possono collegare i punti e vedere come il problema X che hanno fatto due anni fa è simile al problema Y che hanno in questo momento (mi stupisce il modo in cui poche persone sembrano in grado di fare connessioni del genere). Di conseguenza, hanno più tempo a disposizione per dedicarsi alla ricerca di argomenti più interessanti.

    
risposta data 12.07.2011 - 00:57
fonte
9

Puoi iniziare profondamente a studiare le specifiche linguistiche di quelle che cerchi di essere un esperto. Ad esempio:

risposta data 11.07.2011 - 23:32
fonte
6

Scarica Reflector o qualsiasi altro decompilatore (poiché sta pagando ora) e inizia ad aprire alcune delle librerie .NET più usate impara come funzionano gli interni. Combinato con un libro come CLR via C # diventerai molto profondo (più profondo di quanto la maggior parte di noi andrà a lavoro regolare).

    
risposta data 11.07.2011 - 22:56
fonte
4

Ho sviluppato questo tipo di conoscenza in C ++ uscendo in comp.lang.c++.moderated per un paio di anni, anche se in quel momento non stavo davvero lavorando tanto per codificarlo. Non sono sicuro di come posso dire di essere un guru, però.

Penso che ci siano due tipi di conoscenza che si possono cogliere su un linguaggio di programmazione:

  1. Conoscere le curiosità sulla lingua e sapere come evitare le insidie.
  2. Sapere come risolvere i problemi in modo efficace.

Il numero 2 può essere raggiunto solo programmando nella lingua e guardando il codice di altre persone, ma il numero 1 può essere ottenuto prendendo molto tempo per leggere la lingua sui suoi forum di discussione, vedendo che tipo di domande le persone chiedono, e quali sono le risposte. StackOverflow è un buon posto anche per questo.

    
risposta data 12.07.2011 - 03:48
fonte
4

Conoscenza approfondita e competenza nella programmazione significa essere a proprio agio a tutti i livelli di astrazione. Cioè.

  • librerie e API
  • semantica della lingua
  • ottimizzazioni del compilatore
  • interno del compilatore e generazione del codice
  • comportamento di runtime e garbage collector
  • problemi relativi all'architettura e alle istruzioni

Tutto quello che ho visto negli ultimi 15 anni ha dimostrato che solo se riesci davvero ad entrare nel compilatore e nel runtime hai la possibilità di diventare molto abile. Potresti dover forzare te stesso a fare il passo e iniziare a ragionare (e costruire) il software al livello successivo di astrazione più in basso nello stack , ma è l'unico modo per fare esperienza.

Tutto ciò che abbiamo è linguaggio per l'astrazione. Devi capire come i linguaggi di programmazione sono progettati e costruiti per sapere veramente cosa sta facendo la macchina.

    
risposta data 27.05.2012 - 23:07
fonte
3

Leggi il Manuale Fine Questa non è una conoscenza particolarmente approfondita. È pubblicato nella specifica del linguaggio C # sezione 8.6.4. Dovresti prendere l'abitudine di sfogliare almeno le specifiche per le lingue che usi e sfogliare la documentazione per tutte le librerie incorporate.

Ad ogni modo, questa non è la mia idea di profonda conoscenza; è solo un dettaglio di implementazione poco interessante. Potrebbe essere più interessante se il progettista spiegasse perché è stato fatto in questo modo più dinamico, invece di controllare che l'oggetto implementa Iterable.

    
risposta data 28.05.2012 - 08:08
fonte

Leggi altre domande sui tag