Wie codieren Sie etwas, wenn Sie keine Ahnung haben, wie es tatsächlich funktioniert? [geschlossen]


14

Ich habe kürzlich C gelernt und möchte ein Projekt starten, um mein Wissen zu festigen. Ich habe mich für einen sehr einfachen Texteditor entschieden, so etwas wie vim. Das Problem ist, dass ich wirklich keine Ahnung habe, wie ein Texteditor überhaupt funktioniert, und ich weiß nicht, wonach ich googeln soll, um mehr darüber zu erfahren.

Das Googeln führte zu Vims GitHub-Repo, das für mich nutzlos ist, weil die Codebasis riesig ist und mich der Code verwirrt. Ich habe auch Tutorials gefunden, um einen Texteditor in C zu erstellen, der ähnlich wie vim funktioniert.

Obwohl ich darüber nachgedacht habe, den Tutorials zu folgen, fühlt es sich an, als würde ich schummeln. Wie haben die VIM-Entwickler herausgefunden, wie man VIM ohne spezielle Tutorials codiert? Oder sind sie von einfacheren Texteditoren ausgegangen? Wie haben sie das nur aus Sprachkenntnissen und ihrer Dokumentation herausgefunden?

Was genau brauche ich, um mit dem Schreiben dieses Texteditors zu beginnen, ohne direkt einem Tutorial zu folgen? Ein anderes Beispiel, an das ich gerne denke, ist: Wie haben Dennis Ritchie und Ken Thompson Unix codiert? Ich habe eine Vorstellung davon, wie das Betriebssystem funktioniert, aber ich habe keine Ahnung, wie ich es in Code umsetzen soll. Was fehlt mir? Wie übertrage ich diese Sprachkenntnisse in die Praxis?


14
Sie vergleichen sich mit Projekten mit langer Geschichte und außergewöhnlichen Menschen. Unix entstand in einer Forschungsgruppe mit langjähriger Erfahrung in der Programmierung auf Systemebene und profitierte von den Erfahrungen mit dem komplexeren Multics-Betriebssystem. Vim basierte auf vi, das auf ed basierte. Diese Programme tauchten nicht plötzlich auf, sie waren eine Entwicklung, die von Hunderten von Menschen entwickelt wurde. Seien Sie also nicht frustriert, wenn Sie Schwierigkeiten haben, diese ganze Geschichte zu überspringen. Niemand kann. Versuchen Sie stattdessen, Projekte zu realisieren, die am Rande Ihres Verständnisses liegen - ganz in Ihrer Reichweite, aber dennoch herausfordernd.
amon

8
Sie haben gerade gelernt, einige Melodien auf dem Xylophon zu spielen, und möchten jetzt in einem großen internationalen Orchester spielen? Komm schon, du erwartest zu viel. Das Programmieren ist wie das Spielen eines Instruments - Sie beginnen mit kleinen, einfachen Melodien und lernen nach einigen Jahren des Übens, eine Symphonie zu spielen.
Doc Brown

3
Einverstanden. Nehmen Sie es zum Anlass, etwas zu lernen, das viele Anfänger auf harte Weise lernen. Fange klein an . Lesen Sie auch den Code von vim. Sie können viel lernen, wenn Sie vorhandenen Code lesen.
Laiv,

17
Ihr grundlegendes Problem ist mangelnde Klarheit in Ihrem Denken. Sie sagen "ein einfacher kleiner Texteditor wie vim" und stellen sofort fest, dass seine Codebasis riesig und verwirrend ist. Dies sollte ein starkes Signal für Sie sein, dass nichts, was Vim sehr ähnlich ist, einfach ist . Sogar erfahrene Programmierer geraten in die mentale Falle, in die Sie geraten sind. Dinge, die Sie noch nicht verstehen, sind nicht einfach . Sie sind kompliziert . Computerprogrammierung verwandelt mentale Logik in Realität. Denken Sie zunächst klarer über die Programmierung nach.
Eric Lippert

4
Hören Sie auch auf, sich Gedanken über "Betrug" zu machen. Das ist kein Spiel. Sie haben Ziele und sie sind gute Ziele. Tun Sie, was Sie tun müssen, um diese Ziele zu erreichen . Sie denken, professionelle Computerprogrammierer schauen nicht auf die Quelle, wenn sie lernen möchten, wie etwas funktioniert? Zu lernen, wie man aus einer Quelle lernt, die Sie nicht geschrieben haben, ist eine der wichtigsten Programmierfähigkeiten. Beginnen Sie also damit, sie zu üben.
Eric Lippert

Antworten:


17

Wenn dies Ihr erstes Programmierprojekt ist, kann sogar ein einfacher Texteditor zu kompliziert sein. So etwas wie vim oder ein OS kommt überhaupt nicht in Frage.

Annäherung an das Problem

Im Allgemeinen ist der Einstieg für die meisten Projekte in etwa ähnlich:

  • Sie erfassen Ihre Anforderungen. Was genau macht die Software?
  • Sie beginnen mit sehr wenigen Anforderungen und fügen dann nach und nach Funktionen hinzu.
  • Sie zerlegen die Probleme, die sich aus Ihren aktuellen Anforderungen ergeben, in Teilprobleme.
  • Sie zerlegen Ihre Unterprobleme so lange, bis Sie etwas haben, das Sie implementieren können.

Beispiel

Nehmen wir das Beispiel eines Texteditors.

  • Sie möchten einen Teil einer Textdatei auf dem Bildschirm anzeigen, Zeichen einfügen und entfernen und die aktuelle Version speichern.

  • Beginnen Sie einfach mit dem Lesen einer Datei und dem Anzeigen ihres Inhalts.

  • Sie werden (unter anderem) die folgenden Unterprobleme identifizieren:

    • Woher weiß ich, welcher Dateiname angezeigt werden soll?
    • Wie erhalte ich bei einem vorgegebenen Dateinamen den Dateiinhalt?
    • Wie zeige ich den Inhalt einer Datei an?

Sobald Sie einen Punkt erreicht haben, an dem Ihre Anforderung (Laden und Anzeigen der Datei) abgeschlossen ist, können Sie überlegen, wie Sie nur einen Teil anzeigen, der auf den Bildschirm passt, in Ihrer Datei navigieren usw.

Der nächste Schritt

Mit der Zeit werden Sie feststellen, dass es immer schwieriger wird, geeignete Wege zu finden, um Ihre Probleme zu lösen, wenn Sie sich immer komplexeren Problemen stellen. Sie werden auch feststellen, dass das Ändern von Code mit der Zeit langwierig werden kann.

An diesem Punkt ist es Zeit, einige grundlegende Architektur- und Designkonzepte zu erlernen.


Hey Mann danke für den Rat! Ich denke, ich werde diesen Ansatz nehmen. Ich bin ein wenig eigensinnig, wenn es darum geht, meine Meinung zu ändern, aber nach Ihren Vorschlägen werde ich versuchen, einen Datei-Viewer zu erstellen. Vielleicht auch eine Möglichkeit hinzufügen, die Dateimetadaten auf irgendeine Weise anzuzeigen? Ich kann das wahrscheinlich selbst herausfinden. Danke vielmals!
Faithlesss

2
Um dies hinzuzufügen, kann "Wie zeige ich sie an?" Wahrscheinlich weiter unterteilt werden, um ein bestimmtes Zeichen an eine bestimmte Position auf dem Bildschirm zu schreiben (wenn es sich um einen Befehlszeileneditor handelt). Dies sollte möglich sein einfach eine antwort auf online finden.
Dukeling

2
"Selbst ein einfacher Texteditor kann zu kompliziert sein" Texteditoren sind überraschend kompliziert. Stellen Sie sich vor, Sie bearbeiten eine 20-MB-Datei. Groß genug, um Pufferung zu erfordern, aber nicht groß genug, um einen modernen Computer zu belasten. Sie müssen in der Lage sein, einen Bildlauf durchzuführen, Text einzufügen und zu entfernen, den Text in Echtzeit neu anzuordnen und die Bildlaufleistenmarkierung in Echtzeit zu aktualisieren, wenn sich das Modell dahinter ändert. Wenn Sie irgendeine Art von Formatierung haben, wird dies noch komplizierter.

15

Das tust du nicht.

Wenn Sie nicht einmal eine vage Vorstellung davon haben, wie Sie etwas tun sollen, ist dies ein Zeichen dafür, dass es Ihre derzeitigen Fähigkeiten übersteigt. Denn wenn Sie keine Ahnung haben, wie Sie überhaupt anfangen sollen, werden Sie sicherlich keine Ahnung haben, was den schwierigsten Teil der App betrifft.


Was wäre dann ein gutes Projekt? Ich habe bereits mein eigenes Henkerspiel (im Terminal) sowie ein Tic-Tac-Toe-Spiel erstellt. Ich sehe einfach keinen Weg, weiterzumachen, daher dachte ich, ein Texteditor wäre eine gute Idee.
Faithlesss

3
@faithlesss - etwas, das Dateien liest und schreibt, scheint ein grundlegender Zwischenschritt zu sein.
Telastyn

9
Ein Dateibetrachter könnte ein gutes Projekt sein dann, zum Beispiel ein Pager wie die less, moreoder viewProgramme. Sie haben einige Aspekte der Editoren gemeinsam, ohne die Komplexität von veränderlichen Bearbeitungspuffern.
amon

@ Telastyn Ich hab dich. Werde dann einen Datei-Viewer erstellen, wahrscheinlich einen einfachen, der grundlegende Textformate lesen kann, und dann herausfinden, wie man so etwas wie eine JSON- oder eine CSV-Datei liest? Sollte nicht so schwer zu analysieren sein, muss ich mir die string.h-Dokumentation wirklich ansehen, denke ich. Danke für den Hinweis!
Faithlesss

2
@Faithlesss haben auch einen Blick auf die Merkmale eines Zeileneditor , der Vorgänger von Texteditor Programme
Bergi

2

Sie müssen entscheiden , wie Sie wollen Ihren Texteditor an die Arbeit.

Dies ist eine der erschwerendsten und lohnendsten Erfahrungen bei der Entwicklung eigener Projekte von Anfang bis Ende. Niemand sendet Ihnen Anforderungen, aus denen Sie erstellen können. Sie müssen Ihre eigenen Anforderungen entwickeln.

Dies bedeutet, dass Sie eine Menge Designarbeit erledigen müssen, bevor Sie jemals Ihre erste Codezeile schreiben. Sie müssen entscheiden, wie die Benutzeroberfläche aussieht. Sie müssen entscheiden, welche Funktionen enthalten sein sollen. Beide Fragen richten sich danach, wozu Sie sich in der Lage fühlen. Wenn Sie an die "ideale" Situation denken (wie soll die Benutzeroberfläche funktionieren? ), Sich aber nicht in der Lage fühlen, sie zu codieren, müssen Sie nach alternativen Ansätzen suchen: Wie kann ich dafür sorgen, dass sie funktioniert? Dies hilft Ihnen, sich auf die Codierungsansätze zu konzentrieren, über die Sie möglicherweise mehr erfahren möchten.

Wie andere bereits gesagt haben, ist der Versuch, vim zu kopieren, möglicherweise nicht der beste Ansatz, da es sich um eine große und komplizierte Codebasis handelt. Sie verweigern sich auch die Designarbeit, die meiner bescheidenen Meinung nach dazu beiträgt, Ihre Arbeit als Entwickler abzurunden.

Dies bedeutet nicht, dass Sie die gesamte Anwendung von Anfang bis Ende entwerfen müssen, bevor Sie Ihre erste Codezeile schreiben. Es ist in Ordnung, dass sich die Anforderungen im Laufe der Zeit ändern, wenn Sie mehr lernen. Es ist in Ordnung, neue Funktionen hinzuzufügen, an die Sie erst denken, wenn Sie Ihre eigene Anwendung testen / verwenden und denken: "Wäre es nicht schön, wenn ...". Es ist in Ordnung, einfach anzufangen.


1

Es ist töricht, einen Texteditor mit vollem Funktionsumfang von Grund auf ohne Programmiererfahrung zu schreiben: Sie werden entmutigt sein und ihn aufgeben, bevor Sie viel lernen.

Mehrere Alternativen kommen in den Sinn:

  • Lesen Sie den Code eines Produkts, mit dem Sie vertraut sind. Wenn Sie sich darin auskennen vim, schauen Sie sich das an und versuchen Sie, etwas Kleines und Isoliertes zu verstehen, wie es die Daten darstellt, oder suchen Sie nach einem einzelnen Zeichen (dem fBefehl).
  • Studieren Sie den Code eines sehr einfachen Programms und arbeiten Sie sich von dort nach oben vor: catbefehlen Sie dann wcdann grepdann sedzum Beispiel.
  • Versuchen Sie, ein Programm zu schreiben, das nur eine einzige Funktion des Editors ausführt. Löschen Sie möglicherweise das zweite Zeichen in jeder Zeile einer Datei (ohne es zurückzuschreiben) oder zeigen Sie nur die Zeilen 50 bis 70 einer Datei an.

1
Ohne ein bisschen über gängige Muster Bescheid zu wissen, denke ich, dass es sinnlos sein wird, auch nur ein kleines Stück eines großen Projekts wie vim zu verstehen. Es ist jedoch eine gute Idee, sich sehr kleine Open-Source-Projekte anzuschauen. Ich würde hinzufügen, dass der Versuch, eine gezielte Änderung an einem solchen Programm vorzunehmen , eine großartige Möglichkeit wäre, dies zu lernen. Vorteil: Sie lernen einige Muster, die in realen Programmen verwendet werden. Nachteil: Möglicherweise lernen Sie auch ein Anti-Pattern.
doubleYou
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.