In grado di leggere il codice ma fatica a scriverlo [chiuso]


22

Ho avuto il mio primo esame di programmazione di recente ... e ho praticamente fallito. Non ha fatto affatto bene. Ho solo me stesso da incolpare perché al di fuori del college, praticamente non ho fatto nulla.

Ora ne ho un'altra in arrivo vicino all'ora legale e non permetterò che ciò accada di nuovo. Da un paio di settimane sto leggendo, leggendo e leggendo ancora un po '. Continuo a ripassare le cose più vecchie che mi sono perse e le cose più recenti che stiamo facendo. Quindi, ovviamente, posso notare un'enorme differenza nella mia comprensione della lingua. Tuttavia, questo è tutto. Riesco a leggere il codice e ora ho un'idea di cosa sta succedendo nel codice ... ma quando mi viene in mente di scrivere il codice da solo non ho idea. È come se non sapessi mai quale approccio adottare e non riuscirò mai a comprendere appieno le domande.

Ho letto un bel po 'di letture (ho fatto circa 5-6 ore nell'ultimo mese circa) ogni giorno ... Ma quando apro il mio IDE mi sento sempre condannato, è davvero demotivante. Soprattutto perché ho conoscenza di nodi, elenchi, arrailisti, interfacce eccetera, ma oltre a leggerli su una pagina che lo riguarda. Posso sottolineare esattamente tutto ciò che sta succedendo in un programma, quindi l'annotazione di un codice di pre-campionamento lo trovo bene ... ma scrivere il mio codice è un'altra storia ...


8
Aiuta ad avere un obiettivo. Se, ad esempio, volessi creare un gioco, puoi scaricare un framework o una libreria e seguire tutorial introduttivi. Se qualcosa di meno complesso, puoi iniziare cercando esempi di questi programmi, decostruirli e modificarli in base alle tue esigenze o interessi.
Kai Qing,

10
Leggi di meno e programma di più. Trova progetti semplici e realizzali. Non preoccuparti di farlo alla perfezione, fai semplicemente fare loro quello che dovrebbero fare. Quindi pensa a come puoi fare di meglio.
Philipp,

1
Da un paio di settimane sto leggendo, leggendo e leggendo ancora un po '. - La lettura è un inizio, in realtà la codifica è molto meglio. Prova a scrivere un programma in psuedocode su carta, quindi traducilo in java. È un po 'più semplice se sai già cosa devi fare.
Andreas,


1
Ho trovato questo un articolo molto interessante mentre cercavo di capire come programmare e insegnare agli altri le basi del codice: The Camel ha due gobba . Alcune persone lo capiscono immediatamente, altri non lo faranno mai, ma la maggior parte di noi può imparare. Se riesci a leggere e capire il codice, sei partito alla grande :)
Brichins,

Risposte:


45

Impara come scrivere programmi scrivendo programmi.

Ma devi iniziare in piccolo, amico.

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}  

Da lì, inizia a costruire ...

public class HelloWorld {
    static String test = "This is a test";

    public static void main(String[] args) {
        System.out.println(test);
    }
}

e poi...

public class HelloClass {
    String test;

    public void setTest(String str)
    {
        test = str;
    }  

    public String getTest()
    {
        return test;
    }
}

public class HelloWorld {
    HelloClass myHelloInstance;

    public static void main(String[] args) {
        myHelloInstance = new HelloClass();
        myHelloInstance.SetTest("Hello World.")
        String myResult = myHelloInstance.getTest();
        System.out.println(myResult);
    }
}  

... e così via. Una volta comprese le basi del funzionamento degli oggetti, sarà molto più semplice scrivere programmi più grandi.


8
Il secondo esempio non dovrebbe essere compilato perché si accede a una variabile non statica in un contesto statico.
Brandon,

34
@Brandon: allora è un esercizio di debug bello e precoce.
Bryan Boettcher,

È così che tutti imparano a programmare, immagino, o dovrebbero imparare a programmare.
mrudult,

1
Abbraccia la tua Nike interna e "fallo".
NotMe,

15

Ottima domanda! È importante rendersi conto che hai più curve di apprendimento da scalare. Solo per non pensare di imparare solo un linguaggio di programmazione. Stai facendo molto di più.

Stai imparando ...

  1. Gli strumenti che usi per scrivere il codice. Il tuo ambiente di sviluppo, l'editor, il debugger, il tuo compilatore. Ci sono manuali e file di aiuto per tutti questi strumenti, dai un'occhiata. Più conosci gli strumenti, più facile è creare codice.
  2. La sintassi del linguaggio di programmazione in fase di studio, dal tuo post sembra che tu stia concentrando molta attenzione qui e sicuramente devi farlo.
  3. Competenze nella progettazione di soluzioni . Come mettere insieme un pezzo di codice utile e mantenibile. Questo è il muscolo che devi costruire. Come altri poster hanno indicato, impari facendo.

Sospetto che sia il terzo punto in cui stai lottando. Stai imparando a dire cose nel codice (sintassi) ma davvero ci stai chiedendo cosa dovrei dire in codice. C'è un modo giusto e un modo sbagliato di fare le cose?

Suggerirei di affrontare una sfida. Dai un'occhiata a quanto segue come esercizio.

http://en.wikipedia.org/wiki/Eight_queens_puzzle

Questa è una sfida difficile. Devi posizionare otto regine su una scacchiera in modo che ciascuna delle regine sia al sicuro l'una dall'altra.

Quindi, come studente, questo può essere un problema, tuttavia puoi guardare questo problema e usarlo per imparare a scrivere il codice.

Ecco una strategia per provare ...

  1. Ridefinire il problema per essere molto più semplice del problema dichiarato da risolvere . Dimentica le otto regine. Concentrati solo su uno. Impara come scrivere il codice per rappresentare una scacchiera in memoria, posizionare una singola regina su quella scacchiera e quindi visualizzarla sullo schermo per l'utente in solo testo.

  2. Dopo aver effettuato una pugnalata al punto 1. Collocare due regine in modo che siano entrambe al sicuro.

  3. Infine, prova a posizionare più di 2 regine sul tabellone in modo che siano tutte sicure.

I passaggi precedenti sono una svolta in una strategia di progettazione chiamata Step-sise Refinement. È un po 'vecchio stile in termini di design, ma ti porterà da uno schermo vuoto a un codice interessante in pochissimo tempo.

Esistono altre strategie di progettazione e implementazione: Test Driven Design, Object Oriented Design e Design Patterns per citarne alcuni.

Col tempo, aggiungerai queste strategie all'arsenale e le userai come e quando richiesto. Più strategie di progettazione studi e pratichi, più facile sarà.

Possa la fonte essere con te.


In che modo OO Design è diverso da Design Patterns? O stai mettendo insieme i due?
Pierre Arlaud,

1
La raffinatezza graduale e OO non si escludono a vicenda, ma probabilmente lo sapete. Possa la fonte essere con te. +1
Gusdor,

15

Una rapida premessa

Impara facendo: conoscenza vs know-how

C'è una differenza enorme conoscenza e know-how. È un errore comune per i nuovi studenti pensare che, poiché possono "capire" un programma mentre lo leggono, in realtà comprendono il ragionamento per il programma che viene scritto così com'è.

E l'unico modo per arrivare a quella seconda parte è esercitarsi. Siediti, apri un editor di testo, una riga di comando e scendi.

Programmazione in piccolo

È probabile (e previsto) che in questa fase la capacità di comprendere in che modo diversi componenti software complessi interagiscono tra loro è limitata. Ed è in realtà una buona cosa, in quanto ti costringe a iniziare dalle basi. Non saltare la pistola e muoverti al ritmo giusto: inizia con piccoli esercizi per piccoli compiti.

Ad essere sincero, non sono mai stato convinto che iniziare a imparare a programmare con Java sia la strada da percorrere (insegnavo programmazione per vivere all'università, e ancora faccio occasionalmente lezioni private). È di per sé troppo complesso per iniziare e la maggior parte dei libri di Java apparirà piuttosto scoraggiante. Tuttavia, sicuramente può essere fatto (almeno per alcune aree di quella conoscenza globale che ci aspettiamo dai programmatori), purché ti limiti ad apprendere passo dopo passo.

Libri

Dato che sei impostato su Java e se hai bisogno di un libro Java decente, ti consiglio di:

  • Pensando in Java . Va bene, anche se ora leggermente obsoleto.
  • Il tutorial Java . Non è esattamente il miglior compagno dello studente, ma è un ottimo riferimento da tenere a portata di mano, poiché copre tutte le basi e fornisce esempi. Il Learning the Java Language Trail dovrebbe probabilmente essere nella tua lista di lettura, anche se penso che possa essere scoraggiante per i principianti completi in quanto introduce concetti che all'inizio potrebbero essere difficili da comprendere.
  • Java efficace . Non è un grande libro per l'apprendimento, ma anche un riferimento fantastico che dovresti avere a portata di mano per dopo. Non leggere in una sola seduta, ma in pezzi di dimensioni ridotte.

Sto solo citando questo perché non so cosa usi in classe. Ci sono un sacco di altri libri. Alcuni sono buoni Alcuni paralizzeranno gli studenti per anni.


Il tuo processo di studio

Il flusso di lavoro di base

D'ora in poi, ti consiglio di seguire questo processo in 2 passaggi per tutti gli esercizi e gli esempi di codice che hai visto in classe:

  1. leggi e studia
    1. leggi gli esercizi
    2. assicurati di averli capiti
  2. codice
    1. chiudi il libro
    2. sedersi davanti a un computer con quell'editor di codice e quella riga di comando
    3. prova a riscrivere il programma da solo

In caso di guasto

Se fallisci e senti di dover dare una sbirciatina al libro, è probabile che il tuo fallimento sia:

  • (molto probabilmente) che in realtà non hai capito la soluzione,
  • (meno probabile) di aver dimenticato l'aspetto di un particolare bit della soluzione: sintassi, utilizzo dell'API, ...

La prima causa è probabilmente quella che affronti più spesso. Il secondo è aneddotico. Entrambi sono affrontati dalla pratica ricorrente.

Ogni volta che fallisci nell'implementare uno di questi primi esempi, guarda di nuovo il libro, quindi richiudilo. Non scrivere codice mentre guardi il libro. Ti consiglierei anche di eliminare l'intera soluzione e ricominciare. La ripetizione è una parte fastidiosa ma importante del processo di apprendimento.

Non prenderlo alla leggera. Ogni volta che senti il ​​bisogno di dire a te stesso "sì, ok, lo so " o "Sono lì al 90%, è quasi buono come fatto" e vuoi saltare ad un'altra sezione, combattere quel bisogno e ricominciare da capo. È molto difficile avere l'onestà di ammettere a te stesso di non aver compreso appieno un concetto.

Nota a margine: ritengo sia un grande disservizio il fatto che la maggior parte dei programmi scolastici ora tenti di "dare il via" ai corsi di programmazione smorzando troppo le cose e fornendo strumenti che sono troppo avanzati per gli studenti: l'obiettivo non è rendere la tua vita infelice o anche per te imparare a memoria cose che più avanti nella tua carriera saranno automatizzate dai tuoi strumenti e che a volte ti ricorderai a malapena. È per insegnarti tutti i pezzi che galleggiano intorno.

In caso di successo: vai oltre!

Se riesci a implementare il tuo esercizio, non necessariamente passare direttamente a quello successivo. Prova a vedere cosa puoi fare per migliorarlo. È possibile modificare l'output richiesto? Aggiungi una piccola funzionalità? Un opzione? Provaci, dato che ora sei in quella zona divertente in cui hai superato la difficoltà principale, e questi piccoli requisiti autoimposti hanno maggiori probabilità di mantenere un po 'di morale.

Non andare troppo lontano però: non passi dalla stampa dell'alfabeto e dalla sua inversione fino a farla apparire improvvisamente su una diagonale sullo schermo con una sfumatura di colori. Fai piccoli passi. L'apprendimento è un processo lungo e iterativo e devi affrontare i problemi con livelli crescenti di difficoltà (ad esempio, vedi come di solito penso a spiegare la ricorsione ).


È solo apprendimento: un confronto

Il tuo problema non è in realtà legato alla programmazione. È lo stesso problema che migliaia di persone incontrano quando provano ad imparare la matematica.

Se dai loro un problema, non vedono come raggiungere la soluzione. Tuttavia, se scrivi la soluzione per loro, la maggior parte la capirà e penserà "dannazione, è stato così semplice!". Tuttavia, darai loro un problema simile con misure e ipotesi diverse e non riusciranno a risolverlo: non hanno capito la logica dietro di esso e hanno bisogno di pratica per essere in grado di farlo da soli.

Nota che questo è un problema comune con la matematica, ma secondo me lo vedi in molti altri campi in cui è richiesta una logica: apprendimento del solfege, grammatica della lingua, fisica, ecc ... E non si tratta di un'abilità "naturale" capire queste cose: si riduce alla pratica (sia in quell'area, sia in altre che portano l'individuo a cogliere più facilmente i concetti in questo campo).

Non c'è motivo per cui non puoi imparare a scrivere codice. Devi solo continuare a provare finché non raggiungi quel "ah AH!" / Momento Eureka. Quindi passa al problema successivo, più difficile.


Questi possono aiutare anche (in seguito):


6

So che questa non è la risposta che vorrai sentire ma: Scrivi più codice!

Più specificamente sezionare il codice che si capisce. Spesso mi aiuta a "tradurlo" in inglese normale (dato che sono un principiante relativo).

Non abbiate paura di fare brainstorming sulla vostra idea di scrivere prima un pezzo di codice (cioè "Voglio dichiarare una variabile qui, scorrere attraverso questo segmento ecc."), E POI cercare pezzo per pezzo come fare questi vari segmenti.

Ricorda che la codifica è meno come un esercizio di memorizzazione e come trovare un modo per costruire qualcosa dai mattoni. Proprio come l'apprendimento di una vera lingua straniera, la comprensione viene prima di tutto, questo è un buon segno che sei sulla buona strada.

Abbi solo fede nel fatto che più scrivi e leggi il codice, più avrà senso.


5

Come altri hanno già detto, questo è un caso in cui è necessario esercitarsi, esercitarsi, esercitarsi.

Scrivi un mucchio di piccoli programmi che risolvono un solo problema

A volte, la parte più difficile è in realtà trovare qualcosa che valga la pena programmare. Se puoi, prova a lavorare su un argomento che pensi di avere a che fare - come lezioni, eredità, ecc. Alcune idee fuori dalla mia testa:

  • Genera 1000 numeri casuali e inseriscili in una raccolta (coda, elenco, ecc.). Ordina la raccolta senza utilizzare i metodi forniti che ordinano la raccolta per te.
  • Elenca 10 persone che conosci. Prima ordina i loro nomi in base ai nomi e visualizzali. Quindi, ordina i loro nomi in base ai loro cognomi e visualizzali. Quindi, prova a ordinarli in base al modello "ultimo, primo" (cioè Smith, Andrew sarebbe prima di Smith, Jessica).
  • Trova tutti i numeri primi tra 1 e 100.
  • (Ereditarietà) Crea una classe Polygon e assegnale la funzione GetArea. Ora, fai in modo che le classi Triangle e Rectangle ereditino da Polygon e assicurati che implementino GetArea. Continua a farlo per poligoni di ordine superiore (pentagono, esagono, ecc.).
  • Prova a scegliere le cose dallo scambio di code golf stack *

* Lo scopo del code golf è quello di svolgere l'attività fornita utilizzando il minor numero di caratteri, byte o qualche altra metrica indicata nella domanda. Se leggi alcune delle risposte, apprezzi rapidamente i modi intelligenti in cui le persone risolvono questi problemi. Non concentrarti sulla risoluzione del problema nel minor numero di byte! Le persone che pubblicano sul codice golf sono programmatori molto esperti. Ma alcune delle domande offrono compiti facili in sé e per sé.

Alcuni esempi divertenti di golf in codice:

  • Poteri di 4 . Non preoccuparti di risolvere con una regex (è abbastanza difficile, come puoi vedere dalle risposte). Ma, invece, risolvi la domanda "Data una stringa s, la sua lunghezza è divisibile per una potenza di 4?" Puoi anche eseguire i germogli: la lunghezza di una stringa è divisibile per 4? È divisibile per 6? È primo (questo è difficile per le corde lunghe, quindi provalo se diventi coraggioso!)?
  • Sottostringhe . Data una stringa s, genera tutte le sottostringhe possibili.
  • Conteggio parole . Questo può essere difficile a seconda di quanto sei lontano nei tuoi studi di programmazione. Ci sono alcune cose che lo rendono molto semplice (come le raccolte associative), ma se non conosci queste cose può essere difficile.
  • Se il titolo ti sembra criptico, ignora la domanda. Come ho detto, il codice golf è per programmatori esperti. Concentrati solo sui semplici problemi e prova a trovare una risposta semplice.

Struttura di base per risolvere un problema:

Molti di questi ti danno una buona idea di come dovrebbe essere una funzione. Dato X, fai Y, e il risultato dovrebbe essere Z:

void foo()
{
    // Set up X here

    // Do Y here

    // Display Z here
}

Allo scopo di apprendere le basi e acquisire familiarità con una lingua, il modello sopra è sufficiente. Un modello più orientato agli oggetti sarebbe:

Z foo(input X)
{
    Z result;
    // Do Y to X
    return result;
}

Se aiuta, scrivilo anche su carta. Parla attraverso il processo di come tu , come essere umano, risolveresti questo problema. Esempio: dati i numeri i, j e k, visualizzali in ordine decrescente. Come persona, è facile da risolvere. La parte difficile è tradurre le tue idee in istruzioni riga per riga in modo che un computer possa risolverle.

Prova a trovare anche le tue idee. Può essere difficile, ma anche il più semplice dei programmi potrebbe insegnarti qualcosa che non sapevi. Il punto è esercitarsi con le basi, fino a quando non diventano una seconda natura.


4

Non arriverai da nessuna parte semplicemente leggendo il codice; devi scrivere il codice. Basta scrivere il codice. Non preoccuparti se il codice che scrivi è una schifezza; tutti hanno scritto un codice di merda. Alcune persone si guadagnano da vivere. Nessuno inizia a scrivere un buon codice e sono dell'opinione che durante l'apprendimento sia quasi necessario scrivere un codice cattivo perché solo allora la differenza tra codice buono e cattivo diventa davvero evidente.

È difficile apprezzare la differenza tra il codice buono e quello cattivo quando si leggono due blocchi di codice che fanno la stessa cosa, ma quando si scrive uno script e si ottiene qualcuno ben informato per esaminarlo e fornire feedback, la differenza spesso diventa molto più evidente perché puoi applicarlo direttamente a ciò che sai.

La programmazione non è qualcosa che puoi imparare mediante la memorizzazione automatica; non è come i tuoi orari o le date nella storia. La programmazione è un'abilità pratica che richiede una pratica costante per rimanere acuti. Imparare a programmare senza scrivere codice è come imparare a nuotare leggendo un libro.


1

Questa domanda ha già delle risposte davvero buone, ma ci sono alcuni pensieri che non ho ancora visto.

Imparare un linguaggio di programmazione è molto simile all'apprendimento di un linguaggio "reale": è sempre molto più facile leggere che scrivere, che si tratti di una sola frase, di un articolo scientifico o di un libro. Durante la lettura, molto può essere capito solo dal contesto, capendo il testo o il codice mentre lo leggi. Quando vedi una parola che non conosci, forse conosci un'altra parola con la stessa radice; quando vedi un metodo, il nome del metodo ti dà una buona idea di ciò che fa. Quando scrivi, devi ricordare non solo la sintassi, ma anche le parole reali da usare. Ed è lo stesso per la programmazione.

Come altri hanno già detto, non puoi imparare a scrivere programmi solo leggendo i programmi.

Inizia in piccolo. Cerca un tutorial Java e fai tutte le unità, una dopo l'altra. E quando sei abbastanza sicuro, scegli un piccolo progetto per testare le tue abilità, forse qualche gioco semplice che conosci bene che non richiede troppe interazioni con la GUI. Quando hai deciso, non limitarti ad aprire Eclipse e fissare la "pagina vuota". Crea uno storyboard. Non devi disegnare elaborati diagrammi UML, pensa solo a come alcuni aspetti del programma potrebbero essere risolti - come si sviluppa la storia o il tuo argomento, per così dire. E quando scrivi il codice, inizia con una bozza approssimativa. Di solito scrivo molti commenti, descrivendo cosa dovrebbe fare il programma, in quale ordine, e quindi inizio a compilare il codice del programma effettivo.


1

Come altri stanno dicendo, devi solo esercitarti a scrivere codice. Affinché ciò sia appagante, devi metterti alla prova risolvendo un qualche tipo di problema, sia che si tratti di stampare messaggi predefiniti, fare una semplice calcolatrice interattiva o risolvere un compito specifico.

Se sei a corto di ispirazione, Project Euler ha una pletora di esercizi di matematica / programmazione di difficoltà crescente. Ti danno obiettivi chiari e stimolanti da raggiungere e dovrebbero aiutarti a trovare programmi di progettazione più comodi.


1

Ho solo pensato di approfondire questo argomento perché colpisce davvero vicino a casa.

Hai solo bisogno di iniziare a scrivere codice. Non fraintendetemi, leggere è fantastico, ma ciò che ti dà davvero che lavorare con la conoscenza del codice è in realtà costruire qualcosa. Ho imparato di più da un singolo tirocinio estivo rispetto a quello dell'anno precedente a leggere.

Dovrei anche aggiungere che non dovresti iniziare a scrivere alla cieca . Crea un progetto per te stesso. Hai bisogno di una sorta di direzione per metterti in modo da sapere cosa vuoi fare. Sarai sorpreso di vedere quanto imparerai rapidamente. Se apri un IDE e inizi a fare semplici esempi di ciao mondo, quel sentimento demotivante ti si insinuerà rapidamente. Trova qualcosa con un po 'di profondità e prima di saperlo ti espanderai.


questo sembra aggiungere qualcosa di sostanziale rispetto a quello che era già stato pubblicato nelle risposte precedenti
moscerino del

@gnat Immagino che tu intendessi "non" e questa è la tua opinione. Ho attraversato la stessa identica situazione che sta affrontando e sto condividendo ciò che mi ha aiutato. Se hai dimenticato l'introduzione alla sua domanda qui è: "
Potreste

@SeanWM - I programmatori sono un po 'diversi da quelli a cui potresti essere abituato con SO. Se qualcosa ha già risposto bene, reiterare gli stessi punti nella propria risposta non è poi così costruttivo. E questo indipendentemente dal fatto che l'OP chieda suggerimenti o opinioni. Semplicemente non è un buon Q&A. È meglio votare le risposte esistenti ed eventualmente lasciare un commento costruttivo che indica un aspetto sfuggito.

+1, questa risposta aggiunge qualcosa di importante al mix. Questa è l'importanza di avere un vero progetto su cui lavorare, non solo esempi e piccoli programmi di test.
GrandmasterB,
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.