Comment codez-vous quelque chose lorsque vous ne savez pas comment cela fonctionne réellement? [fermé]

14

J'ai récemment appris le C et je veux démarrer un projet pour consolider mes connaissances. J'ai décidé de créer un éditeur de texte très simple, quelque chose comme vim. Le problème auquel je suis confronté est que je n'ai vraiment aucune idée du fonctionnement d'un éditeur de texte, et je ne sais pas quoi chercher sur Google pour en savoir plus.

Googler à ce sujet a conduit au dépôt GitHub de vim, ce qui est inutile pour moi car la base de code est énorme et le code me déroute. J'ai également trouvé des tutoriels pour créer un éditeur de texte en C qui fonctionne un peu comme vim.

Bien que j'aie pensé à suivre les tutoriels, j'ai l'impression de tricher. Comment les développeurs de vim ont-ils compris comment coder vim sans tutoriels spécifiques? Ou sont-ils partis d'éditeurs de texte plus simples? Comment ont-ils compris cela uniquement grâce à la connaissance des langues et de leur documentation?

De quoi ai-je besoin exactement pour commencer à écrire cet éditeur de texte sans suivre directement un tutoriel? Un autre exemple auquel j'aime penser est: comment Dennis Ritchie et Ken Thompson ont-ils codé Unix? J'ai une idée du fonctionnement du système d'exploitation, mais je ne sais pas comment le mettre en code. Qu'est-ce qui me manque? Comment puis-je transférer cette connaissance de la langue dans une utilisation réelle et pratique?

Infidèles
la source
14
Vous vous comparez à des projets avec une longue histoire et des personnes exceptionnelles. Unix est né dans un groupe de recherche avec de nombreuses années d'expérience dans la programmation au niveau système, et a profité de l'expérience avec le système d'exploitation Multics plus complexe. Vim était basé sur vi qui était basé sur ed. Ces programmes ne sont pas apparus soudainement, ils étaient une évolution, construite par des centaines de personnes. Alors ne soyez pas frustré lorsque vous avez du mal à ignorer toute cette histoire. Personne ne peut. Au lieu de cela, essayez de faire des projets qui sont à la limite de votre compréhension - juste à votre portée, mais toujours difficiles.
amon
8
Vous venez d'apprendre à jouer des airs sur le xylophone, et maintenant vous voulez jouer dans un grand orchestre international? Allez, vous attendez trop. La programmation, c'est comme jouer d'un instrument - vous commencez avec de petites mélodies simples et après plusieurs années de pratique, vous apprenez à jouer une symphonie.
Doc Brown
3
D'accord. Prenez-le comme une chance pour vous d'apprendre quelque chose que de nombreux débutants apprennent à la dure. Commencez peu . Et lisez aussi le code de vim. Vous pouvez en apprendre beaucoup en lisant le code existant.
Laiv
17
Votre problème fondamental est le manque de clarté dans votre façon de penser. Vous dites «un simple petit éditeur de texte comme vim», puis suivez immédiatement cela en notant que sa base de code est énorme et déroutante. Cela devrait être un signal fort pour vous que rien qui ressemble étroitement à vim n'est simple . Même les programmeurs expérimentés tombent dans le piège mental dans lequel vous êtes tombé. Les choses que vous ne comprenez pas encore ne sont pas simples . Ils sont compliqués . La programmation informatique transforme la logique mentale en réalité; commencez par réfléchir plus clairement à la programmation.
Eric Lippert
4
Arrêtez également de vous inquiéter de la «tricherie». Ce n'est pas un jeu. Vous avez des objectifs et ce sont de bons objectifs. Faites ce que vous devez faire pour atteindre ces objectifs . Vous pensez que les programmeurs informatiques professionnels ne regardent pas la source lorsqu'ils veulent apprendre comment quelque chose fonctionne? Apprendre à apprendre à partir d'une source que vous n'avez pas écrite est l'une des compétences de programmation les plus importantes, alors commencez à la pratiquer.
Eric Lippert

Réponses:

17

S'il s'agit de votre premier projet de programmation, même un simple éditeur de texte peut être trop compliqué. Quelque chose comme vim ou un OS est complètement hors de question.

Aborder le problème

En général, la façon de commencer est à peu près similaire pour la plupart des projets, cependant:

  • Vous rassemblez vos exigences. Que fera exactement le logiciel?
  • Vous commencez avec très peu d'exigences, puis ajoutez des fonctionnalités petit à petit.
  • Vous décomposez les problèmes posés par vos besoins actuels en sous-problèmes.
  • Vous continuez à décomposer vos sous-problèmes jusqu'à ce que vous ayez quelque chose à savoir mettre en œuvre.

Exemple

Prenons l'exemple de l'éditeur de texte.

  • Vous souhaitez afficher une partie d'un fichier texte à l'écran, insérer et supprimer des caractères et enregistrer la version actuelle.

  • Commencez par lire un fichier et afficher son contenu.

  • Vous identifierez (entre autres) les sous-problèmes suivants:

    • Comment connaître le nom du fichier à afficher?
    • Étant donné un nom de fichier, comment puis-je obtenir le contenu du fichier?
    • Étant donné le contenu d'un fichier, comment puis-je les afficher?

Une fois que vous atteignez un point où votre exigence (charger le fichier et l'afficher) est terminée, vous pouvez commencer à envisager comment afficher uniquement une partie qui s'adaptera à l'écran, naviguer dans votre fichier, etc.

La prochaine étape

Au fil du temps, à mesure que vous affronterez des problèmes de plus en plus complexes, vous vous rendrez compte qu'il devient de plus en plus difficile de trouver des moyens appropriés de décomposer vos problèmes. Vous remarquerez également que le changement de code peut devenir fastidieux avec le temps.

À ce stade, il est temps d'apprendre quelques concepts d'architecture et de conception de base.

doubleYou
la source
Hé mec merci pour les conseils! Je pense que je vais adopter cette approche. Je suis un peu têtu quand il s'agit de changer d'avis, mais d'après ce que vous avez suggéré, je pense que j'essaierai de voir comment créer une visionneuse de fichiers. Peut-être aussi ajouter un moyen de montrer les métadonnées du fichier d'une manière ou d'une autre? Je peux probablement le comprendre moi-même. Merci beaucoup!
Faithlesss
2
Pour ajouter à cela, "comment puis-je les afficher" peut probablement être décomposé en écrivant un caractère spécifique à une position spécifique sur l'écran (si nous parlons d'un éditeur de ligne de commande), ce qui devrait être quelque chose que l'on peut trouver facilement une réponse en ligne.
Dukeling
2
"même un simple éditeur de texte peut être trop compliqué" les éditeurs de texte sont étonnamment compliqués. Imaginez éditer un fichier de 20 Mo. Assez grand pour nécessiter une mise en mémoire tampon, mais pas assez grand pour être imposé à un ordinateur moderne. Vous devez pouvoir le faire défiler, insérer et supprimer du texte, le réorganiser en temps réel, le marqueur de barre de défilement se met à jour en temps réel à mesure que le modèle derrière lui change. Si vous avez n'importe quel type de formatage, cela devient encore plus compliqué.
15

Non.

Si vous n'avez même pas une vague idée de comment faire quelque chose, c'est un signe que cela dépasse vos compétences actuelles. Parce que si vous ne savez même pas par où commencer, vous n'aurez certainement aucune idée en ce qui concerne la partie la plus difficile de l'application.

Telastyn
la source
Quel serait un bon projet pour commencer alors? J'ai déjà créé mon propre jeu de pendu (dans le terminal), ainsi qu'un jeu de tic tac toe. Je ne vois tout simplement pas un moyen de continuer, alors j'ai pensé qu'un éditeur de texte serait une bonne idée.
Faithlesss
3
@faithlesss - quelque chose qui lit et écrit des fichiers semble être une étape intermédiaire de base.
Telastyn
9
Un fichier spectateur pourrait être un bon projet alors, par exemple , un téléavertisseur comme less, moreou des viewprogrammes. Ils partagent certains des aspects des éditeurs, sans la complexité des tampons d'édition mutables.
amon
@Telastyn Je t'ai eu. Vous allez alors envisager de créer une visionneuse de fichiers, probablement une visionneuse simple capable de lire les formats de texte de base, puis de découvrir comment lire quelque chose comme, peut-être un fichier json ou csv? Cela ne devrait pas être si difficile à analyser, il suffit de regarder vraiment la documentation string.h je suppose. Merci pour le conseil!
Faithlesss
2
@Faithlesss Découvrez également les fonctionnalités d'un éditeur de ligne , le prédécesseur des programmes d'édition de texte
Bergi
2

Vous devez décider comment vous souhaitez que votre éditeur de texte fonctionne.

C'est l'une des expériences les plus aggravantes et les plus gratifiantes de développer vos propres projets du début à la fin. Personne ne vous envoie d'exigences pour construire à partir de. Vous devez développer vos propres exigences.

Cela signifie que vous devrez effectuer un énorme travail de conception avant d'écrire votre première ligne de code. Vous devrez décider à quoi ressemble l'interface. Vous devrez décider des fonctionnalités à inclure. Les deux questions ci-dessus seront guidées par ce que vous vous sentez capable de faire. Si vous pensez à la situation "idéale" (comment vous aimeriez que l'interface fonctionne), mais que vous ne vous sentez pas capable de la coder, alors vous devez commencer à chercher des approches alternatives: Comment pourrais-je faire fonctionner cela? Cela vous aide à vous concentrer sur les approches de codage sur lesquelles vous voudrez peut-être en savoir plus.

Comme d'autres l'ont dit, essayer de copier vim n'est peut-être pas la meilleure approche car il s'agit d'une base de code volumineuse et compliquée. Vous vous refusez également le travail de conception qui, à mon humble avis, vous aide à vous compléter en tant que développeur.

Cela ne signifie pas que vous devrez faire concevoir l'application entière du début à la fin avant d'écrire votre première ligne de code. Il est normal que les exigences changent au fil du temps à mesure que vous en apprenez davantage. C'est bien d'ajouter de nouvelles fonctionnalités auxquelles vous ne pensez pas jusqu'à ce que vous testiez / utilisiez votre propre application et que vous vous disiez "Ce ne serait pas bien si ..." C'est bien de commencer simplement.

Randall Stewart
la source
1

Il est insensé d'écrire un éditeur de texte complet sans expérience de programmation: vous serez découragé et l'abandonnerez avant d'en apprendre beaucoup.

Plusieurs alternatives me viennent à l'esprit:

  • Étudiez le code d'un produit que vous connaissez. Si vous êtes compétent vim, regardez-le et essayez de comprendre quelque chose de petit et d'isolé, comme la façon dont il représente les données, ou recherche un seul caractère (la fcommande).
  • Etudiez le code d'un programme très simple et remontez à partir de là: catcommande puis wcpuis greppuis sedpar exemple.
  • Essayez d'écrire un programme qui ne fait qu'une seule fonction de l'éditeur. Supprimez peut-être le deuxième caractère de chaque ligne d'un fichier (sans le réécrire) ou affichez uniquement les lignes 50 à 70 d'un fichier.
wallyk
la source
1
Sans en savoir un peu plus sur les modèles courants, je pense que comprendre même un petit morceau d'un grand projet comme vim va être futile. Cependant, regarder de très petits projets open source est une bonne idée. J'ajouterais que tenter d'apporter un changement ciblé à un tel programme serait une excellente façon d'apprendre. Avantage: vous apprendrez certains modèles utilisés dans des programmes du monde réel. Inconvénient: vous pourriez également apprendre un anti-modèle.
doubleYou