web-dev-qa-db-fra.com

Capable de lire le code, mais a du mal à l'écrire

J'ai eu mon premier examen de programmation récemment ... et bien je l'ai plutôt floppé. N'a pas fait grand du tout. Je n'ai que moi-même à blâmer car en dehors de la période universitaire, je n'ai pratiquement rien fait.

Maintenant, j'en ai un autre qui approche vers l'heure d'été et je ne permets pas que cela se reproduise. Depuis quelques semaines, je lis, lis et lis encore. Je reviens toujours sur les anciennes choses que j'ai manquées et les nouvelles choses que nous faisons. Donc, évidemment, je peux remarquer une énorme différence dans ma compréhension de la langue. Mais c'est à peu près tout. Je peux lire le code et j'ai maintenant une idée de ce qui se passe dans le code ... mais pour ce qui est de l'écriture du code moi-même, je ne sais rien. C'est comme si je ne savais jamais quelle approche adopter et je ne pouvais jamais vraiment comprendre les questions.

J'ai fait pas mal de lecture (depuis environ 5-6 heures depuis environ un mois) chaque jour ... Mais quand j'ouvre mon IDE je me sens toujours condamné, c'est vraiment démotivant. Surtout parce que je connais les nœuds, les listes, les tableaux, les interfaces ect ect mais en plus de les lire sur une page c'est à peu près tout ça. mais écrire mon propre code est une autre histoire ..

22
user3339333

Vous apprenez à écrire des programmes en écrivant des programmes.

Mais tu dois commencer petit, mec.

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

De là, commencez à construire ...

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

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

et alors...

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);
    }
}  

... etc. Une fois que vous aurez compris les bases du fonctionnement des objets, il sera beaucoup plus facile d'écrire des programmes plus volumineux.

45
Robert Harvey

Grande question! Il est important de réaliser que vous avez plusieurs courbes d'apprentissage pour grimper. Juste pour ne pas penser que vous apprenez seulement un langage de programmation. Vous faites bien plus que cela.

Vous apprenez ...

  1. Les outils que vous utilisez pour écrire du code. Votre environnement de développement, l'éditeur, le débogueur, votre compilateur. Il existe des manuels et des fichiers d'aide pour tous ces outils, consultez-les. Plus vous en savez sur les outils, plus il est facile de créer du code.
  2. La syntaxe du langage de programmation à l'étude, à partir de votre post, il semble que vous mettez beaucoup l'accent ici et vous en avez certainement besoin.
  3. Compétences en conception de solutions . Comment assembler un morceau de code utile et maintenable. C'est le muscle dont vous avez besoin pour construire. Comme d'autres affiches l'ont souligné, vous apprenez en faisant.

Je soupçonne que c'est le point trois où vous vous débattez. Vous apprenez à dire des choses en code (syntaxe) mais vous nous demandez vraiment ce que je dois dire en code. Y a-t-il une bonne et une mauvaise façon de faire les choses?

Je vous suggère de relever un défi. Jetez un œil à ce qui suit comme exercice.

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

Maintenant, c'est un défi difficile. Vous devez placer huit reines sur un échiquier afin que chacune des reines soit à l'abri les unes des autres.

En tant qu'apprenant, cela peut être une portée excessive, mais vous pouvez regarder ce problème et l'utiliser pour apprendre à écrire du code.

Voici une stratégie à essayer ...

  1. Redéfinissez le problème pour qu'il soit beaucoup plus simple que le problème déclaré à résoudre. Oubliez les huit reines. Concentrez-vous sur un seul. Apprenez à écrire le code pour représenter un échiquier en mémoire, placez une seule reine sur ce plateau, puis affichez-le à l'utilisateur à l'écran en texte simple.

  2. Une fois que vous avez fait un coup de poignard à l'étape 1. Placez deux reines de telle sorte qu'elles soient toutes les deux en sécurité.

  3. Enfin, essayez de placer plus de 2 reines sur le plateau afin qu'elles soient toutes en sécurité.

Les étapes ci-dessus sont une variante d'une stratégie de conception appelée raffinement par étapes. C'est un peu old-school en termes de design mais cela vous fera passer d'un écran vide à un code intéressant en un rien de temps.

Il existe d'autres stratégies de conception et de mise en œuvre: conception pilotée par les tests, conception orientée objet et modèles de conception pour n'en nommer que quelques-uns.

Avec le temps, vous ajouterez ces stratégies à l'arsenal et les utiliserez au besoin. Plus vous étudiez et pratiquez de stratégies de conception, plus cela deviendra facile.

Que la source soit avec vous.

15
Rob Kielty

Un rapide avant-propos

Apprendre en faisant: connaissances vs savoir-faire

Il y a une énorme différence de connaissances et de savoir-faire. C'est une erreur courante pour les nouveaux apprenants de penser que parce qu'ils peuvent "comprendre" un programme en le lisant, ils comprennent en fait le raisonnement pour que le programme soit écrit tel qu'il est.

Et la seule façon d'arriver à cette deuxième partie est de pratiquer. Asseyez-vous, ouvrez un éditeur de texte, une ligne de commande et allez-y.

Programmation dans le petit

Il est probable (et attendu) qu'à ce stade, votre capacité à comprendre comment plusieurs composants logiciels complexes interagissent entre eux est limitée. Et c'est en fait une bonne chose, car cela vous oblige à partir des bases. Ne sautez pas le pistolet et avancez au bon rythme: commencez par de petits exercices pour de petites tâches.

Pour être honnête, je n'ai jamais été convaincu que commencer à apprendre la programmation avec Java est le chemin à parcourir (j'avais l'habitude d'enseigner la programmation pour vivre à l'université, et je fais toujours des cours particuliers à l'occasion)). Il est en soi trop complexe pour vous aider à démarrer, et la plupart des livres Java apparaîtront assez intimidants. Néanmoins, cela peut certainement être fait (au moins pour certains domaines de cette connaissance globale que nous attendons des programmeurs). ), tant que vous vous limitez à apprendre étape par étape.

Livres

Comme vous êtes sur Java, et si vous avez besoin d'un livre Java Java décent, je recommanderais:

  • Penser en Java . C'est OK, mais maintenant légèrement dépassé.
  • Le Java . Ce n'est pas exactement le meilleur compagnon de l'apprenant, mais une excellente référence à garder à portée de main, car il couvre toutes les bases et fournit des exemples. Le - Apprendre le Java Language Trail devrait probablement être sur votre liste de lecture, bien que je pense que cela peut être intimidant pour les débutants complets car il présente des concepts qui peuvent être difficiles à saisir au début.
  • Java efficace . Ce n'est pas un excellent livre pour apprendre, mais aussi une référence géniale que vous devriez avoir à portée de main pour plus tard. Pas pour lire en une seule séance, mais en morceaux de la taille d'une bouchée.

Je ne fais que mentionner cela car je ne sais pas ce que vous utilisez en classe. Il y a des tonnes d'autres livres. Certains sont bons. Certains paralyseront les étudiants pendant des années.


Votre processus d'étude

Le workflow de base

À partir de maintenant, je vous conseille de suivre ce processus en 2 étapes pour tous les exercices et exemples de code que vous avez vus en classe:

  1. lire et étudier
    1. lire les exercices
    2. assurez-vous de les avoir compris
  2. code
    1. ferme le livre
    2. asseyez-vous devant un ordinateur avec cet éditeur de code et cette ligne de commande
    3. essayez de réécrire le programme par vous-même

En cas de défaillance

Si vous échouez et sentez que vous devez jeter un œil au livre, votre échec sera probablement:

  • (très probablement) que vous n'avez pas réellement compris la solution,
  • (moins probable) que vous avez oublié à quoi ressemble un élément particulier de la solution: syntaxe, utilisation de l'API, ...

La première cause est probablement celle à laquelle vous faites face le plus souvent. La seconde est anecdotique. Les deux sont traités par une pratique récurrente.

Chaque fois que vous ne parvenez pas à mettre en œuvre l'un de ces premiers exemples, consultez à nouveau le livre, puis fermez-le à nouveau. Ne codez pas en regardant le livre. Je vous conseillerais même de supprimer toute votre solution et recommencer. La répétition est une partie ennuyeuse mais importante du processus d'apprentissage.

Ne prenez pas cela à la légère. Chaque fois que vous ressentez le besoin de vous dire "ouais, ok, je sais ceci" ou "je suis à 90% là-bas, c'est presque aussi bien que fait" et je veux passer à une autre section , combattre cette envie et recommencer. Il est très difficile d'avoir l'honnêteté de vous admettre que vous n'avez pas bien compris un concept.

Note latérale: Je considère comme un mauvais service que la plupart des programmes scolaires tentent maintenant de "démarrer" les cours de programmation en simplifiant trop les choses et en fournissant des outils trop avancés pour les élèves: le but n'est pas de rendre votre vie misérable ou pour vous aussi apprendre par cœur des choses qui plus tard dans votre carrière seront automatisées par vos outils et dont vous vous souviendrez parfois à peine. C'est pour vous apprendre tous les morceaux qui flottent.

En cas de succès: allez au-delà!

Si vous réussissez à mettre en œuvre votre exercice, ne passez pas nécessairement directement au suivant. Essayez de voir ce que vous pouvez faire pour l'améliorer. Pouvez-vous modifier la sortie demandée? Ajouter une petite fonctionnalité? Une option? Essayez, car vous êtes maintenant dans cette zone amusante où vous avez passé la principale difficulté, et ces petites exigences auto-imposées sont plus susceptibles de garder votre moral un peu.

N'allez pas trop loin cependant: vous ne passez pas de l'impression de l'alphabet et de son inversion à sa soudaine apparition sur une diagonale à l'écran avec un dégradé de couleurs. Faites de petits pas. L'apprentissage est un processus long et itératif, et vous devez aborder les problèmes avec des niveaux de difficulté croissants (par exemple, voyez comment je pense habituellement à expliquant la récursivité ).


C'est juste un apprentissage - une comparaison

Votre problème n'est pas du tout lié à la programmation. C'est le même problème que des milliers de personnes rencontrent lorsqu'elles essaient d'apprendre les mathématiques.

Si vous leur posez un problème, ils ne voient pas comment trouver leur chemin vers la solution. Cependant, si vous écrivez la solution pour eux, la plupart la comprendront et penseront "sacrément, c'était si simple!". Pourtant, vous leur donnerez un problème similaire avec différentes mesures et hypothèses et ils ne parviendront pas à le résoudre: ils n'ont pas compris la logique derrière cela, et ils ont besoin de pratique pour être en mesure de le faire eux-mêmes.

Notez que c'est un problème commun avec les mathématiques, mais à mon avis, vous le voyez dans des tonnes d'autres domaines où il y a une certaine logique requise: apprentissage du solfege, grammaire du langage, physique, etc ... Et ce n'est pas dû à une capacité "naturelle" pour comprendre ces choses: cela se résume à la pratique (que ce soit dans ce domaine ou dans d'autres qui amènent l'individu à saisir plus facilement les concepts dans ce domaine).

Il n'y a aucune raison pour laquelle vous ne pouvez pas apprendre à écrire du code. Vous avez juste envie d'essayer jusqu'à ce que vous atteigniez ce "ah AH!"/Moment d'Eureka. Passez ensuite au problème suivant, plus difficile.


Ceux-ci peuvent également aider (plus tard):

15
haylem

Je sais que ce n'est pas la réponse que vous allez vouloir entendre, mais: Écrivez plus de code!

Décortiquez plus précisément le code que vous comprenez. Cela m'aide souvent à le "traduire" en anglais régulier (car je suis un débutant relatif).

N'ayez pas peur de réfléchir à votre idée d'écrire d'abord un morceau de code (c'est-à-dire "Je veux déclarer une variable ici, parcourir ce segment, etc."), et ensuite chercher pièce par pièce comment faire ces différents segments.

N'oubliez pas que le codage est moins comme un exercice de mémorisation et comme trouver un moyen de construire quelque chose à partir de blocs de construction. Tout comme l'apprentissage d'une véritable langue étrangère, la compréhension passe avant tout, c'est un bon signe que vous êtes sur la bonne voie.

Ayez simplement la foi que plus vous écrivez et lisez du code, plus cela aura du sens.

6
Xelad1

Comme d'autres l'ont dit, c'est un cas où vous devez pratiquer, pratiquer, pratiquer.

Écrivez un tas de petits programmes qui résolvent un seul problème

Parfois, la partie la plus difficile consiste à proposer quelque chose qui mérite d'être programmé. Si vous le pouvez, essayez de travailler sur un sujet avec lequel vous pensez avoir du mal - comme les cours, l'héritage, etc. Quelques idées qui me viennent à l'esprit:

  • Générez 1000 nombres aléatoires et insérez-les dans une collection (file d'attente, liste, etc.). Triez la collection sans utiliser les méthodes fournies qui trient la collection pour vous.
  • Énumérez 10 personnes que vous connaissez. Triez d'abord leurs noms en fonction des prénoms et affichez-les. Ensuite, triez leurs noms en fonction de leurs noms de famille et affichez-les. Ensuite, essayez de les trier en fonction du modèle "dernier, premier" (c'est-à-dire que Smith, Andrew serait avant Smith, Jessica).
  • Trouvez tous les nombres premiers entre 1 et 100.
  • (Héritage) Créez une classe Polygon et donnez-lui la fonction GetArea. Maintenant, faites en sorte que les classes Triangle et Rectangle héritent de Polygon et assurez-vous qu'elles implémentent GetArea. Continuez ainsi pour les polygones d'ordre supérieur (pentagone, hexagone, etc.).
  • Essayez de choisir des choses dans le échange de pile de golf de code *

* Le but du code golf est de faire la tâche fournie en utilisant le moins de caractères, d'octets ou de toute autre mesure indiquée dans la question. Si vous lisez certaines des réponses, vous appréciez rapidement la façon intelligente dont les gens résolvent ces problèmes. Ne pas se concentrer sur la résolution du problème dans le moins d'octets! Les personnes qui publient sur le golf de code sont des programmeurs très expérimentés. Mais, certaines des questions proposent des tâches faciles en elles-mêmes.

Quelques exemples de golf à code amusant:

  • Pouvoirs de 4 . Ne vous inquiétez pas de résoudre avec une expression régulière (c'est assez difficile, comme vous pouvez le voir dans les réponses). Mais, au lieu de cela, résolvez la question "Étant donné une chaîne s, sa longueur est-elle divisible par une puissance de 4?" Vous pouvez également effectuer des ramifications: la longueur d'une chaîne est-elle divisible par 4? Est-il divisible par 6? Est-ce parfait (c'est difficile pour les longues cordes, alors essayez-le si vous êtes courageux!)?
  • Sous-chaînes . Étant donné une chaîne s, affichez toutes les sous-chaînes possibles.
  • Comptage de mots . Celui-ci peut être délicat en fonction de votre niveau dans vos études de programmation. Il y a quelques choses qui le rendent très facile (comme les collections associatives), mais si vous ne connaissez pas ces choses, cela peut être difficile.
  • Si le titre vous semble cryptique, ignorez simplement la question. Comme je l'ai dit, le golf de code est destiné aux programmeurs expérimentés. Concentrez-vous simplement sur les problèmes simples et essayez de trouver une réponse simple.

Structure de base pour résoudre un problème:

Beaucoup d'entre eux vous donnent une bonne idée de ce à quoi devrait ressembler une fonction. Étant donné X, faites Y, et le résultat devrait être Z:

void foo()
{
    // Set up X here

    // Do Y here

    // Display Z here
}

Pour apprendre les bases et se familiariser avec une langue, le modèle ci-dessus est suffisant. Un modèle plus orienté objet serait:

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

Si cela peut vous aider, notez-le également sur papier. Expliquez-vous comment vous, en tant qu'être humain, résoudrait ce problème. Exemple: étant donné les nombres i, j et k, affichez-les par ordre décroissant. En tant que personne, c'est facile à résoudre. La partie difficile consiste à traduire vos idées en instructions ligne par ligne afin qu'un ordinateur puisse les résoudre.

Essayez également de proposer vos propres idées. Cela peut être difficile, mais même le plus simple des programmes peut vous apprendre quelque chose que vous ne saviez pas. Le but est de vous forer avec les bases, jusqu'à ce qu'elles deviennent une seconde nature.

5
Shaz

Vous n'irez nulle part en lisant simplement le code; vous devez écrire du code. Écrivez simplement le code. Ne vous inquiétez pas si le code que vous écrivez est de la merde; tout le monde a écrit du code de merde. Certaines personnes en vivent. Personne ne commence à écrire du bon code et je suis d'avis qu'en apprenant, il est presque nécessaire d'écrire du mauvais code car ce n'est qu'alors que la différence entre le bon et le mauvais code devient vraiment apparente.

Il est difficile d'apprécier la différence entre le bon et le mauvais code lors de la lecture de deux blocs de code qui font la même chose, mais lorsque vous avez écrit un script et que vous obtenez quelqu'un bien informé pour le réviser et fournir des commentaires, la différence devient souvent beaucoup plus apparente car vous pouvez l'appliquer directement à ce que vous savez.

La programmation n'est pas quelque chose que vous pouvez apprendre par mémorisation par cœur; ce n'est pas comme vos tables de multiplication ou vos dates dans l'histoire. La programmation est une compétence pratique qui nécessite une pratique constante pour rester forte. Apprendre la programmation sans écrire de code, c'est comme apprendre à nager en lisant un livre.

4
Roy

Cette question a déjà de très bonnes réponses, mais il y a quelques réflexions que je n'ai pas encore vues.

Apprendre un langage de programmation, c'est un peu comme apprendre un "vrai" langage: c'est toujours beaucoup plus facile à lire qu'à écrire, que ce soit une seule phrase, un article scientifique ou un livre. Lors de la lecture, beaucoup peut être compris uniquement à partir du contexte, en comprenant le texte ou le code au fur et à mesure que vous le lisez. Lorsque vous voyez un mot que vous ne connaissez pas, vous connaissez peut-être un autre mot avec la même racine; lorsque vous voyez une méthode, le nom de la méthode vous donne une bonne idée de ce qu'elle fait. Lors de l'écriture, vous devez vous souvenir non seulement de la syntaxe, mais aussi des mots réels à utiliser. Et c'est la même chose pour la programmation.

Comme d'autres l'ont dit, vous ne pouvez pas apprendre à écrire des programmes uniquement à partir de lire programmes.

Commencer petit. Recherchez un tutoriel Java, et faites toutes les unités les unes après les autres. Et lorsque vous êtes suffisamment confiant, choisissez un petit projet pour tester vos compétences, peut-être un jeu simple que vous connaissez bien ne nécessite pas trop d'interaction avec l'interface graphique. Lorsque vous avez décidé, ne vous contentez pas d'ouvrir votre Eclipse et de regarder la "page blanche". Créez un storyboard. Vous n'avez pas à dessiner des diagrammes UML élaborés, pensez simplement à la façon dont certains aspects du programme pourrait être résolu - comment l'histoire ou votre argument se déroule, pour ainsi dire. Et lors de l'écriture du code, commencez par un brouillon. J'écris généralement beaucoup de commentaires, décrivant ce que le programme devrait faire, dans quel ordre, puis commencez à remplir le code de programme réel.

1
tobias_k

Comme d'autres le disent, il vous suffit de vous entraîner à écrire du code. Pour que cela soit satisfaisant, vous devez vous mettre au défi de résoudre un type de problème, qu'il s'agisse d'imprimer des messages prédéfinis, de créer une calculatrice interactive simple ou de résoudre une tâche spécifique.

Si vous manquez d'inspiration, Project Euler a une pléthore d'exercices de mathématiques/programmation de difficulté croissante. Ils vous donnent des objectifs clairs et stimulants à atteindre, et devraient vous aider à obtenir des programmes de conception plus confortables.

1
Emil Lundberg

Je pensais juste que j'interviendrais sur ce sujet, car il touche vraiment près de chez nous.

Vous avez juste besoin pour commencer à coder. Ne vous méprenez pas, la lecture est excellente, mais ce qui vous donne vraiment que la connaissance du codage de travail est en fait la construction de quelque chose. J'ai appris plus d'un stage d'été que l'année précédente en lisant à ce sujet.

Je dois également ajouter que vous ne devriez pas simplement commencer à coder à l'aveugle. Faites-vous un projet. Vous avez besoin d'une sorte de direction pour vous mettre afin que vous sachiez ce que vous voulez faire. Vous serez surpris de voir combien vous apprendrez rapidement. Si vous ouvrez simplement un IDE et commencez à créer des exemples simples de bonjour, cette sensation de démotivation vous envahira rapidement. Trouvez quelque chose avec un peu de profondeur et avant de le savoir, vous allez développer dessus.

1
SeanWM