Come posso davvero padroneggiare un linguaggio di programmazione?


103

So che imparando una lingua, puoi semplicemente acquistare un libro, seguire gli esempi e quando possibile provare gli esercizi. Ma quello che sto davvero cercando è come padroneggiare la lingua una volta imparata.

Ora so che l'esperienza è un fattore importante, ma per quanto riguarda l'apprendimento degli interni della lingua, qual è la struttura sottostante, ecc.

Ci sono articoli che dicono che leggi questo libro, leggi quel libro, crea questo gioco e quel gioco. Ma per me questo non significa padroneggiare una lingua. Voglio essere in grado di leggere il codice di altre persone e comprenderlo, non importa quanto sia difficile. Capire quando usare una funzione e quando un'altra, ecc. Ecc.

L'elenco potrebbe continuare all'infinito, ma credo di aver fatto il punto. :)

E infine, prendi qualunque linguaggio come esempio se necessario, anche se sarebbe meglio se C fosse preso come esempio.


11
L'esperienza è tutto ciò a cui si riduce davvero. Tutta la teoria in cui sei un esperto è inutile a meno che tu non possa applicarla praticamente.
Simon Whitehead,

2
Implementa un compilatore per questa lingua. In realtà, questo è il mio modo preferito di provare qualsiasi nuova lingua. Se sembra un po 'troppo semplice e noioso, prova invece a definire la semantica del linguaggio formale, usando K framework o qualcosa di simile.
SK-logic,

6
"uomo, la patata è dinossaur, universo automobilistico". non importa quanto si padroneggia una lingua, se il codice è cattivo e non ha senso, è ancora difficile da capire.
Renato Dinhani,

2
Mi sento come se mancasse un po 'il punto. I linguaggi si evolvono, quindi non c'è padronanza di una lingua, cresci con essa, più la usi e più devi imparare.
nycynik,

2
Codice e codice di lettura. Prendi un pezzo casuale del kernel linux (Programmazione C) e scopri cosa fa una funzione.
Alex Hart,

Risposte:


166

Devo rispondere "Tutto quanto sopra". Le persone discutono se la codifica sia un'arte, un mestiere, una disciplina ingegneristica o una branca della matematica, e penso che sia più giusto dire che è una parte di ciascuna. Come tale, più tecniche porti alla padronanza della lingua, meglio è. Ecco un elenco parziale:

  • Usa la lingua tutto il giorno, tutti i giorni. Di solito questo significa essere impiegati a tempo pieno nella lingua.

  • Leggi tutto quello che puoi sulla lingua. In particolare, "migliori pratiche" e modi di dire.

  • Unisciti a un gruppo di utenti per parlare con gli altri della lingua e di cosa ne fanno.

  • Lavora con il codice di altre persone! Non c'è modo più veloce per imparare cosa non fare in una lingua se non quello di dover ripulire dopo qualcuno che ha fatto qualcosa di terribile.

  • Supporta il codice che scrivi: ogni errore diventa un tour delle tue decisioni peggiori!

  • Studia informatica e lingue in generale

  • Impara una lingua molto diversa. Un grande complimento a C sarebbe un linguaggio funzionale come Lisp. Ciò rivoluzionerà il modo in cui pensi al tuo linguaggio procedurale.

  • Impara a usare i framework e le API disponibili per quella lingua.

  • Prenditi il ​​tempo per fare i tuoi esperimenti con la lingua. SICP non è applicabile a C, ma l'atteggiamento di apprendere una lingua testandone i limiti è molto produttivo.

  • Leggi la storia della lingua per scoprire perché è stata creata così com'è.

  • Partecipa alle conferenze per ascoltare la lingua degli autori o per sapere cosa stanno facendo i leader del settore con la lingua.

  • Segui un corso di lingua.

  • Insegna la lingua agli altri (grazie a Bryan Oakley )

In sintesi, fai tutto ciò che ti viene in mente. Non c'è modo di sapere tutto sulla maggior parte delle lingue. Ogni tecnica di apprendimento che usi offre una prospettiva aggiuntiva alla tua comprensione.


76
+5 per Supporta il codice che scrivi: ogni bug diventa un tour delle tue peggiori decisioni!
Jennifer S,

8
+1 esclusivamente per la frase finale:Every technique you use to learn brings and additional perspective to your understanding.
Izkata,

1
@Izkata: OMG, l'ho scritto? Sono in realtà un madrelingua inglese! L'ho corretto. Grazie!
GlenPeterson,

2
@GlenPeterson ... In realtà, ho appena copiato incollato senza prestare molta attenzione alla frase "off". Il +1 era davvero per l'intento dietro di esso. = P
Izkata,

13
+1 per "Impara una lingua molto diversa. Un grande complimento a C sarebbe un linguaggio funzionale come Lisp. Ciò cambierà completamente il modo in cui pensi al tuo linguaggio procedurale." - questo è probabilmente il più importante. Ti aiuta a imparare come imparare a programmare (cioè cosa cercare in quale situazione).
nulla101

53

10.000 ore di pratica sono ciò che serve.

Leggi "Insegnare a programmare da soli in dieci anni"

Punti chiave dall'alto:

  • Ottenere interessati alla programmazione, e fare un po 'perché è divertente. Assicurati che continui a essere abbastanza divertente in modo da essere disposto a mettere nei tuoi dieci anni / 10.000 ore.
  • Programma. Il miglior tipo di apprendimento è imparare facendo.
  • Parla con altri programmatori; leggi altri programmi.

1
Questo è quello che stavo per pubblicare! Non ho ancora trascorso abbastanza ore su P.SE, ovviamente.
Martijn Pieters,

@MartijnPieters: :-D
vartec,

8
Ottimo titolo per un libro! Non vedo l'ora che arrivi il sequel "Insegnati a programmare bene in 20 anni!"
GlenPeterson,

16
Tuttavia, devi assicurarti di non ripetere le stesse 10 ore 1000 volte ...
Izkata,

Nessuna competenza tecnica aiuterà qualcuno a sapere per cosa automatizzare o creare un programma. È come dire: vai in palestra e fai tutti gli esercizi fondamentali nel basket per dieci anni, per 1 ora al giorno. Puf! Sei una superstar del basket (maestro) ... no, è più di una semplice abilità tecnica. Pertanto, non considero questa una risposta alla domanda, ovvero come diventare un maestro? Questa potrebbe essere una parte della soluzione, ma non è la pozione magica per il dominio. Lo so - non sono un maestro!
oemb1905,

36

Non considerarti MAI il padrone di tutta la lingua fino a quando non avrai implementato una lingua migliore di quella. Il che significa, per imparare come funziona una lingua particolare dal basso, ottenere un libro che ti insegna i concetti di compilatore / interprete della lingua. Per esempio:

  • C: Il libro del compilatore LCC

  • C ++: The Design and Evolution of C ++ (E poi continua a compilare il tuo compilatore C ++ o almeno capire l'implementazione di uno usando il codice del compilatore C ++ GNU)

  • Java: ottieni "Inside JVM" e ottieni il codice sorgente javac. Anche il codice .C di "java" è utile

  • Python: implementazione di CPython.

  • Obiettivo C: Quasi tutto il materiale Apple relativo agli interni di ObjC runtime env e ai codici sorgente del compilatore ti aiuterà.

  • Lisp: SICP Book (ti insegna Scheme e un compilatore-interprete di base per il linguaggio lisp-like): Lisp in Small Pieces (un altro buon libro).


1
Questo è ciò che chiamo una risposta. Ne ho già accettato uno, ma questo meriterebbe una "migliore risposta" se fosse un po 'prima
cprogcr,

2
Non hai idea di quanto abbia aiutato la tua risposta. Sto leggendo dei libri che hai citato e sono il genere di cose di cui ho bisogno.
cprogcr,

hehe ho imparato da loro. Sono felice di aiutarti :-)
Aniket Inge,

da quando hai citato C come esempio, lascia che ti dia i nomi di altri due libri, come regalo, che ho usato per padroneggiare C come il palmo della mia mano): 1. OOC.PDF (disponibile gratuitamente online) e 2. Minix Book (sebbene sia un libro per implementatori di sistemi operativi, questo è ciò che Linus Torvalds legge prima di implementare Linux)
Aniket Inge,

1
sì, di Andrew Tenenbaum, questo è il libro. Qualsiasi edizione è buona da leggere. Non ti dice come funziona "C", ma quando vedi come la libreria C è implementata per funzionare con un sistema operativo che hai creato, inizi a capire C ancora meglio! Forse abbastanza per permetterti di modificarlo. (Ed è qui che entra in gioco OOC)
Aniket Inge,

12

Prova a usare la lingua per qualcosa per cui non è stata progettata. Scrivi un driver di dispositivo in Python o una libreria di manipolazione di matrici in COBOL. Penso che uno dei modi migliori per padroneggiare una lingua sia spingerla davvero, cercando di far sì che i suoi punti di forza superino i suoi punti deboli.


1
Quando ero al college, avrei deciso di "padroneggiare" una lingua dopo aver scritto Pong. Questo ha funzionato abbastanza bene fino a quando ho imparato MIPS. Ho ancora incubi.
Roddy of the Frozen Peas

Il sito Web in C può essere fatto?
BigSack

10

Ti semplificherò. Non imparerai mai una lingua. Periodo. Se pensi di averlo, allora ovviamente non l'hai fatto. Non c'è una cima di montagna che improvvisamente raggiungi e dici "Bene, ora, ho imparato perfettamente quella lingua. E adesso?" Anche programmatori esperti che lavorano con la stessa lingua da decenni ti diranno che a volte incontrano ancora nuove idee, processi, pratiche, ecc. Il vero obiettivo è padroneggiare la tua comprensione concettuale di una lingua o lingue. La capacità di apprendere nuovi concetti e la velocità con cui è possibile adottare funzionalità nuove o modificate nella lingua è molto più importante della conoscenza pratica di ogni parola chiave e sintassi. Smetti di preoccuparti di "padroneggiare" una lingua e semplicemente preoccupati di migliorare e perfezionare continuamente la qualità e l'efficienza del tuo codice.


2
The true goal is to master your conceptual understanding of a language or languages.Esattamente. Questo è ciò che intendevo davvero.
cprogcr,

Qualsiasi linguaggio di programmazione è finito. È costruito con un numero finito di concetti, richiede un numero finito di trucchi idiomatici. Pertanto, è facile padroneggiare qualsiasi lingua. Ovviamente, non si può padroneggiare la programmazione in generale, c'è sempre il potenziale per un ulteriore miglioramento, ma la domanda riguarda specificamente una determinata lingua .
SK-logic,

SK-logic: i linguaggi di programmazione cambiano, così come le loro librerie e ambienti. Di conseguenza cambia anche il modo in cui lavori con la lingua. Ad esempio, jQuery ha cambiato il modo di lavorare con Javascript.
orlp,

Probabilmente è vero che nessuno può davvero padroneggiare un linguaggio come C ++, ma per quelli un po 'minimalisti come Scheme dovrebbe essere del tutto possibile - come dice @ SK-logic, è davvero la programmazione , in qualunque linguaggio, che non può essere padroneggiata, perché il il campo di applicazione è infinito.
leftaroundabout

1
@nightcracker, le lingue non si "evolvono". C99 sarà sempre C99 e non cambierà mai. C ++ 11 rimarrà sempre C ++ 11, anche dopo che è stato sostituito da un linguaggio di prossima generazione. Gli ambienti "si evolvono", sì, ma jQuery non ha introdotto nuove tecniche non conosciute prima nelle comunità di altre lingue. Erano nuovi alla ristretta comunità Javascript.
SK-logic,

5

Conosci già la risposta a questo

  • Devi usare la lingua. Un sacco. Per risolvere la più ampia gamma di problemi possibile
  • Devi leggere (e, idealmente, lavorare con) il codice di altri popoli, preferibilmente quelli che hanno un certo grado di padronanza (cioè una profonda comprensione di almeno alcuni aspetti del linguaggio). Per estensione, se puoi parlare alla gente della risoluzione dei problemi con la lingua, tanto meglio.

Si tratta di duro lavoro e determinazione e per tutto ciò che potresti non arrivare mai lì.

Pensa da dove prendiamo il termine: per diventare un Maestro Artigiano dovevi essere un apprendista e poi un giornalista e solo loro potresti avere la possibilità di diventare un maestro. Lungo la strada ti verrebbero insegnati e praticheresti e osserveresti e interrogheresti gli altri nella loro arte e (si spera) imparerai da loro.

Non c'è proiettile magico ...


2

Inizia leggendo e comprendendo cos'è SDLC (aka, ciclo di vita dello sviluppo del software). È un processo iterativo che comporta auto-miglioramento, apprendimento,**practicing, practicing...**

inserisci qui la descrizione dell'immagine

Ciò aprirebbe i tuoi orizzonti su quali aree hai bisogno per imparare o migliorare. Esistono diversi libri di ingegneria del software di base che potresti trovare molto utili da leggere dopo aver creato un paio di applicazioni da solo.

Inoltre, una volta che ci si sente sicuro con un linguaggio OOP , si può iniziare ad imparare i modelli di progettazione e Head First Design Patterns è veramente buono libro da prendere in considerazione. Adoro questo libro.


1
Grazie. Avevo già scelto la risposta quando l'ho letto, ma prenderò sicuramente il tuo consiglio.
cprogcr,

non sono sicuro del motivo per cui ho votato male, per favore fatemi sapere cosa deve essere migliorato
EL Yusubov,

2

Non c'è sostituto per l'esperienza. Per padroneggiare qualcosa, devi farlo / usarlo, per lo più, per molte cose diverse.

Quindi vai avanti e usa quel linguaggio per esercizi (come Project Euler ) e progetti personali, cose di cui hai effettivamente bisogno o cose che pensi siano interessanti. Scrivi una partita, scrivi una webapp, scrivi un parser, qualunque cosa tu voglia. E ad ogni passo, cerca di capire cosa stai facendo piuttosto che incollare insieme il codice o seguire le istruzioni.

Voglio essere in grado di leggere il codice di altre persone e comprenderlo, non importa quanto sia difficile.

È qualcosa che puoi fare subito dopo aver compreso la sintassi di base. Prendi solo un po 'di codice e prenditi il ​​tempo per capirlo in dettaglio. Cerca cose che non capisci o fai domande specifiche in luoghi come Stack Overflow .


2

Sul lato di alto livello del problema, scopri l'architettura: come organizzare i tuoi progetti, qual è la loro struttura. Non lasciarli crescere casualmente.

A livello medio, impara diverse tecniche e paradigmi. Più strumenti diversi hai nel tuo repertorio, maggiore è il potere per te. Se hai studiato solo java, python e ruby, sei stato esposto solo a una porzione molto piccola dello spazio di programmazione. Impara la programmazione imperativa e funzionale, impara Prolog e J. L'idea non è quella di "padroneggiare" centinaia di lingue, ma di imparare modi diversi di risolvere gli stessi problemi.

Sul lato a basso livello del problema, una cosa che potrebbe esserti utile per essere un programmatore migliore (in effetti migliore in qualunque cosa tu faccia) è avere un buon modello mentale della piattaforma. Ad esempio, puoi imparare come funzionano le strutture di controllo C e conoscere le librerie più comuni, ma se non hai un modello mentale di come funzionano i puntatori e la memoria, avrai problemi con espressioni moderatamente complesse.


1

Posso fare un paio di suggerimenti?

Prima di tutto puoi trovare un mentore con cui discutere del tuo uso della lingua, ottenere i migliori consigli e trucchi e rispondere quando una tecnica è migliore di un'altra.

In secondo luogo, esercitati il ​​più possibile e prova la lingua al massimo! Lavoravo in una squadra, che (per divertimento) sceglieva ogni giorno un verbo o un altro pezzo del linguaggio di programmazione dal manuale. Era un segno d'onore se riuscissi a metterlo nel tuo codice quel giorno. Ciò significava che tutto il team di programmazione doveva guardare e comprendere il termine (a volte) oscuro per capirlo e utilizzarlo in modo efficace. Alcuni giorni abbiamo fallito, ma quella squadra è stata divertente lavorare e tecnicamente acceso !!


0

I linguaggi di programmazione riflettono le idee alla base dei paradigmi di programmazione sviluppati per lo sviluppo di software per scopi generici o per lo sviluppo di software per scopi speciali. Ad esempio, un linguaggio di programma come Java rappresenta il paradigma del programma orientato agli oggetti, ma AspectJ (un'estensione di Java) viene utilizzato per programmare secondo una programmazione orientata all'aspetto.

Data questa breve introduzione, al fine di padroneggiare veramente una lingua, acquistare e leggere un libro da solo non sarebbe molto utile. Dovresti capire l'ambiente in cui puoi programmare usando la lingua desiderata, conoscere il paradigma e, soprattutto, costruire un'applicazione significativa usando la lingua. Costruire una piccola applicazione che può darti un assaggio di vari strumenti forniti dalla lingua è un approccio di apprendimento davvero utile.

Ho visto persone provenienti dalla pura comunità C senza apprendere nulla sull'orientamento agli oggetti e lottare nell'apprendimento di Java o dell'obiettivo-c. Ho anche visto persone che lottano con la programmazione delle interfacce utente quando non hanno veramente compreso gli elementi dell'interfaccia utente, la programmazione guidata dagli eventi, ecc.

Spero che questo possa essere d'aiuto!


0

Aggiungerei due elementi all'elenco di Glen

  • Prova a risolvere il problema difficile che altri hanno, ad esempio, dare risposte su SO
  • Leggi blog / libri di designer di lingue. Questa è la migliore risorsa di profonda conoscenza. Sapresti qual è la decisione progettuale alla base della ragione X.

0

Basarsi su ciò che ha detto @TMN. Ho avuto un grande successo nell'apprendimento delle lingue scrivendo lo stesso programma in una lingua diversa.

Ad esempio, scrivendo un programma che legge in un file CSV, analizza il testo e quindi lo riscrive in un secondo CSV con le colonne in ordine inverso.

Come questo,

Colonna1, Colonna2, Colonna3

per

Colonna3, Column2, Column1

Questo ti darà una comprensione di base o la lingua. Quindi vedi cos'altro puoi fare. Forse consentire la sostituzione del valore o il riordino o la lettura dalla riga di comando. Renderlo complesso come vuoi.

Penso anche a quello che ha detto @GlenPeterson,

Impara una lingua molto diversa. Un grande complimento a C sarebbe un linguaggio funzionale come Lisp. Ciò rivoluzionerà il modo in cui pensi al tuo linguaggio procedurale.

È un'ottima idea. Suggerirei un linguaggio come Haskell perché nelle ultime versioni è possibile programmare utilizzando tutti e quattro i paradigmi di programmazione di OO, procedurali, logici o funzionali. Anche se in realtà è un linguaggio funzionale, puoi con qualche sforzo implementare gli altri paradigmi, che sarebbe una buona esperienza di apprendimento.

Ottima lingua con cui giocare.


0

Non puoi imparare una lingua dal libro. Tutto ciò di cui hai bisogno è pratica e pratica. Non pensare di poter imparare una lingua da quel particolare libro o quella particolare fonte. Basti pensare che il linguaggio di programmazione è lo stesso del linguaggio umano. Non puoi semplicemente imparare l'inglese o il francese leggendo un libro particolare. Tutto ciò che ti serve è usarlo in un giorno per vita quotidiana. Codice da zero, estendi la sua funzionalità prova a costruire qualcosa che ti renderà un po 'soddisfatto. E se stai pensando di padroneggiare una lingua come conoscere tutto il linguaggio e usare ogni elemento del linguaggio di programmazione nella codifica pratica .. NON PUOI. O anche se puoi, potrebbero volerci 10-15 anni.

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.