Capable de lire le code mais a beaucoup de mal à l'écrire [fermé]

22

J'ai eu mon premier examen de programmation récemment ... et bon je l'ai quasiment 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 continue à passer en revue les choses plus anciennes que j'ai manquées et les choses plus récentes 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 (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 qui y est. Je peux souligner exactement tout ce qui se passe dans un programme, donc annoter un code de pré-échantillon je trouve bien ... mais écrire mon propre code est une autre histoire ..

user3339333
la source
8
Cela aide d'avoir un objectif. Si, par exemple, vous vouliez créer un jeu, vous pouvez télécharger un framework ou une bibliothèque et suivre des tutoriels d'introduction. Si quelque chose de moins complexe, vous pouvez commencer par rechercher des exemples de ces programmes, les déconstruire et les modifier en fonction de vos besoins ou intérêts.
Kai Qing
10
Lisez moins et programmez plus. Trouvez des projets simples et faites-les. Ne vous inquiétez pas de le faire parfaitement, faites-les simplement faire ce qu'ils sont censés faire. Réfléchissez ensuite à comment vous pouvez faire mieux.
Philipp
1
Depuis quelques semaines, je lis, lis et lis encore. - La lecture est un début, en fait le codage est beaucoup mieux. Essayez d'écrire un programme en pseudo-code sur papier, puis traduisez-le en java. C'est un peu plus facile si vous savez déjà ce que vous devez faire.
Andreas
1
J'ai trouvé que c'était un article très intéressant en essayant de comprendre comment coder et enseigner aux autres les bases du codage: The Camel has Two Humps . Certaines personnes l'obtiennent immédiatement, d'autres ne le feront jamais - mais la plupart d'entre nous peuvent apprendre. Si vous pouvez lire et comprendre le code, vous partez du bon pied :)
brichins

Réponses:

45

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.

Robert Harvey
la source
8
Votre deuxième exemple ne doit pas être compilé car vous accédez à une variable non statique dans un contexte statique.
Brandon
34
@Brandon: alors c'est un exercice de débogage agréable et précoce.
Bryan Boettcher
C'est ainsi que tout le monde apprend à coder, je suppose, ou devrait apprendre à coder.
mrudult
1
Embrassez votre Nike intérieur et "faites-le".
NotMe
15

Grande question! Il est important de réaliser que vous avez plusieurs courbes d'apprentissage à gravir. 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 message, 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 que vous devez développer. 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. Reformulez le problème pour qu'il soit bien 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 couteau à 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: la conception pilotée par les tests, la conception orientée objet et les 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.

Rob
la source
En quoi OO Design est-il différent des Design Patterns? Ou mettez-vous les deux ensemble?
Pierre Arlaud
1
Le raffinement pas à pas et l'OO ne s'excluent pas non plus, mais vous le savez probablement. Que la source soit avec vous. +1
Gusdor
15

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 la voie à suivre (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 permettre de démarrer, et la plupart des livres Java sembleront assez intimidants. Néanmoins, cela peut sûrement ê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 décent, je recommanderais:

  • Penser en Java . C'est OK, mais maintenant légèrement dépassé.
  • Le tutoriel 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 Learning the Java Language Trail devrait probablement être sur votre liste de lecture, bien que je pense qu'il 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 est susceptible d'être:

  • (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 l'intégralité de votre solution et de 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 l'envie de vous dire "ouais, ok, je sais ça" ou "j'y suis à 90%, c'est presque aussi bien que fait" et que vous souhaitez 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 grand 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 vous rendre la vie misérable ou d'apprendre trop. par cœur des choses qui plus tard dans votre carrière seront automatisées par vos outils et dont vous vous souviendrez même 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.

Mais n'allez pas trop loin: vous ne passez pas de l'impression de l'alphabet et de son inversion à sa soudaine apparition en 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 à expliquer 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):

haylem
la source
6

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 ordinaire (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 bien sur votre chemin.

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

Xelad1
la source
5

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 sur l' é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 vous concentrez pas 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 codes de golf amusants:

  • 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, à la place, 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. Parlez-vous à travers le processus de la façon dont 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.

Shaz
la source
4

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 de 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.

Roy
la source
1

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 de choses peuvent être déterminées uniquement à partir du contexte, en comprenant le texte ou le code pendant 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 programmes de lecture .

Commencer petit. Recherchez un didacticiel Java et effectuez toutes les unités l'une après l'autre. Et lorsque vous êtes suffisamment confiant, choisissez un petit projet pour tester vos compétences, peut-être un jeu simple que vous connaissez bien qui 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 pourraient être résolus - 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 doit faire, dans quel ordre, puis je commence à remplir le code du programme.

tobias_k
la source
1

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 une sorte 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.

Emil Lundberg
la source
1

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

Vous avez juste besoin de 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é unique que l'année précédente en lisant à ce sujet.

Je dois également ajouter que vous ne devez 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 de simples exemples de bonjour, ce sentiment démotivant vous envahira rapidement. Trouvez quelque chose avec un peu de profondeur et avant de le savoir, vous allez l'étendre.

SeanWM
la source
cela semble ajouter quelque chose de substantiel par rapport à ce qui a déjà été publié dans les réponses précédentes
gnat
@gnat Je suppose que vous vouliez dire "non" et c'est votre opinion. Je suis passé par la même situation que lui et je partage ce qui m'a aidé. Si vous avez oublié l'introduction de sa question ici, c'est: "Pourriez-vous donner des conseils ..."
SeanWM
@SeanWM - Programmers est un peu différent de ce à quoi vous pouvez être habitué avec SO. Si quelque chose a déjà été bien répondu, réitérer les mêmes points dans votre propre réponse n'est pas si constructif. Et cela indépendamment du fait que le PO demande des conseils ou des opinions. Cela ne fait tout simplement pas de bonnes questions et réponses. Il est préférable de voter pour la ou les réponses existantes et éventuellement de laisser un commentaire constructif indiquant une facette qui a été manquée.
+1, cette réponse ajoute quelque chose d'important dans le mélange. C'est l'importance d'avoir un vrai projet sur lequel travailler, pas seulement des exemples et des petits programmes de test.
GrandmasterB