Warum ist Lese- und Schreibprogrammierung nicht Mainstream? [geschlossen]


32

Literarische Programmierung hat gute Ideale. Warum denkst du, dass dies kein Mainstream ist? Liegt es daran, dass es nicht geliefert hat?


2
Weil die Tools, die dafür entwickelt wurden, noch ziemlich schwach sind. Microsoft hat wahrscheinlich die Chance, in dieser Hinsicht führend zu sein.
Job

3
Wenn ich mich einem neuen Problem nähere, benutze ich oft meine eigene Kurzschrift 'Literate Programming' mit Bleistift und Papier. Es erlaubt mir , Sprachsemantik zu ignorieren und in der menschlichen Sprache mischen , um diese Dinge zu beschreiben , die Funktionen aufgerufen werden usw.
Oosterwal

1
Sogar Knuth ist von diesem Konzept nicht mehr überzeugt: "Und wir geben den alten Begriff der" gebildeten Programmierung "auf, den ich bei der Entwicklung von TEX82 verwendet habe, weil sich die Dokumentation als zu schmerzhaft erwiesen hat." tug.org/TUGboat/tb31-2/tb98knut.pdf .
h0b0

6
Für diejenigen, die mit TeX und seiner Philosophie nicht vertraut sind, sollte erwähnt werden, dass das Knuth-Zitat höchstwahrscheinlich ironisch gemeint ist.

3
@ h0b0 & user1249: Der ganze Artikel von Knuth ist ironisch, wie man durch überfliegen herausfinden kann. Er verspottet auch Steve Jobs, das Web, Agile, Refactoring, OOP, AOP und viele andere Dinge. Es ist ein Witz!
Andres F.

Antworten:


35

Ich habe es zum ersten Mal in einem Buch mit Knuths Schriften gesehen und fand es ordentlich. Dann habe ich versucht, über die Anzeige der literarischen Programmierung nachzuvollziehen, was in dem Programm vor sich geht, und fand es schwieriger, als es aussah. Es mag sein, dass ich zu gewohnt war, Programmlisten durchzugehen, aber es schien verwirrend.

Dann habe ich mir den Quellcode angesehen, und das hat mich dann und dort ausgeschaltet. Ich musste lernen, Programme auf eine völlig neue Art und Weise zu schreiben, mit weniger Korrespondenz zwischen dem Programmtext und dem, was der Compiler sah, und sah keinen entsprechenden Nutzen.

Außerdem können die Leute lange und überzeugende Argumente schreiben, dass der Code X tut, wenn er tatsächlich Y tut, und ich bin auf meinen Anteil irreführender Kommentare gestoßen. Ich habe eine Vorliebe dafür entwickelt, den Code zu lesen, um zu sehen, was er ziemlich früh tut. Literarische Programmierung ist das Gegenteil davon.


4
Bei der literarischen Programmierung sowie bei Kommentaren im Allgemeinen geht es nicht darum, was Ihr Code tut. Das können Sie am Code selbst ablesen. Es geht nur darum, warum und wie , und diese wesentlichen Informationen fehlen fast immer ohne eine ordnungsgemäße Lese- und Schreibprogrammierung. Es erübrigt sich zu erwähnen, dass der " Warum? " - Teil ziemlich oft aufwändige und komplizierte Mathematik beinhalten würde, manchmal Zeichnungen und Tabellen, manchmal Diagramme. Um solche Kommentare lesbar zu halten, sind geschulte Programmiertools erforderlich.
SK-logic

1
@ SK-Logik fair, aber der Punkt, den David Thornley macht, ist, dass sich sogar das WARUM als irreführende Lüge herausstellen kann (eine, die eigentlich noch schwerer zu verstehen ist).
MrFox

1
+1 Knuth schrieb in den (thematischen) Tagen des Wilden Westens des Programmierens zurück, als es in einer "fortgeschrittenen" Sprache bedeutete, "C" fast auf das Metall zu schreiben, anstatt Maschinencode zu verwenden. Der Speicher war so eng Variablen und andere Namen waren in der Regel nur einzelne Buchstaben, oft von Umfang zu Umfang wiederverwendet. Die überwiegende Mehrheit der Programme bestand aus schlüsselfertigen Aufnahmen, die von einer Person mit jeweils eigenem exzentrischen Stil geschrieben und gepflegt wurden. Die Übernahme einer Codebasis war entschlüsselter als das Lesen. Es gab keine Quellcodeverwaltung usw., um zu helfen.
TechZen

1
Knuth schaute heute vor 30 Jahren die Straße hinunter. Er wusste, dass Programme größer und komplizierter werden würden, von Teams mit wechselnden Mitgliedern geschrieben würden, über Jahre oder Jahrzehnte laufen würden und Input, Bewertung und schließlich Akzeptanz von Nicht-Programmierern erforderten. Literarische Programmierung war eine Idee, um all das anzugehen. Er hat herausgefunden, was wir heute als Geschäftslogik und BDD bezeichnen. Die Kernidee ist, dass Programmierer wissen, was zu tun ist, und Nichtprogrammierer mitmachen können. Wie bereits erwähnt, ist die Idee gescheitert, da es keinen Mechanismus gibt, um die Verknüpfung zwischen dem Text "Literate" und dem Code zu erzwingen.
TechZen

Übrigens: Deshalb mag ich "selbstdokumentierende" Sprachen wie Objective-C. Zunächst sieht der Code so aus, als wäre er mit absurd langen Methodennamen überladen, aber selbst ein Programmierer, der die Sprache oder die API nicht kennt, kann schnell herausfinden, was der Code tut. Am besten ändern Sie den Code und die "Kommentare" werden automatisch synchronisiert. Natürlich wurde Objective-C aus diesem Grund mit integrierter Autocomplete-Funktion geschrieben. Ohne diese Funktion ist das Schreiben von Objective-C ziemlich höllisch.
TechZen

13

Ich würde den Netzwerkeffekt verantwortlich machen . Damit andere Personen Ihren Code und Ihre Dokumentation bearbeiten können, müssen sie in der Lage sein, ihn zu verstehen.

Dies schiebt die Leute von so etwas wie cweb / noweb weg, da Sie für ihre Verwendung zusätzlich zu der Programmiersprache, die Sie für das Projekt verwenden, noch das Erlernen von TeX und der programmspezifischen Syntax benötigen würden. Dies kann als eine enorme Zeitverschwendung angesehen werden, insbesondere wenn sie keinen der mathematischen Schriftsätze benötigen, die für TeX von Anfang an eine so große Anziehungskraft haben. (Und für viele Anwendungsprogrammierer wird es wirklich nicht benötigt.) Stattdessen bevorzugen sie XML-Kommentare von Visual Studio, da diese bereits beliebt und etabliert sind.

Die Orte, an denen ich die Einführung von Lese- und Schreibprogrammen gesehen habe, sind wissenschaftliche / statistische Berechnungen, bei denen die meisten Programmierer über eine umfangreiche Ausbildung (auch bekannt als PhDs) in Mathematik, CS oder Statistik verfügen und daher bereits mit LaTeX vertraut sind. Die Dokumentation, die sie schreiben, enthält mit größerer Wahrscheinlichkeit viele komplizierte Formeln, die am besten in TeX geschrieben sind, und sie programmieren mit größerer Wahrscheinlichkeit in R. Der Anteil der R-Programmierer, die SWeave kennen, ist definitiv viel höher als zum Beispiel die Anteil der C-Programmierer, die sich mit cweb auskennen.


2
Diese Antwort scheint davon auszugehen, dass alle gebildeten Programmiertools LaTeX verwenden. Ist das wahr? An dem Konzept scheint es nichts zu geben, was es erfordert.
AShelly

@AShelly: Es ist nicht erforderlich - ich weiß, dass Sie mit noweb zumindest HTML verwenden können. In der Praxis werden die Leute, die HTML-Dokumentationen schreiben, jedoch Javadoc und dergleichen verwenden, anstatt erfahrene Programmiertools zu verwenden.
Larry Wang

1
@AShelly, damit eine gute Programmierung funktioniert, müssen Sie in der Lage sein, das zu druckende Dokument zu generieren . Dies ist viel, viel einfacher, wenn das Format textbasiert ist, und meines Wissens ist TeX der leistungsfähigste textbasierte Dokumentformatierer , und der einfachste Weg, mit TeX zu arbeiten, ist die Verwendung von LaTeX.

@AShelly Vielleicht möchten Sie einen Blick auf org-modedie Unterstützung für Lese- und Schreibprogramme werfen . Es ist ziemlich praktisch und ich finde es viel einfacher zu verstehen (ganz zu schweigen von der Verwaltung ) als WEB oder NOWEB alleine. Ein wichtiger Aspekt des Codes ist die Lesbarkeit, und diese ist lesbar. (vgl. github.com/vermiculus/stack-mode )
Sean Allred

12

Das Konzept der literarischen Programmierung faszinierte mich Ende der 90er Jahre während des Studiums und ich bin immer noch fasziniert von Knuths Herangehensweise an Programmierung und Satz. Nichts als das Beste wird genügen.

Das von Knuth entwickelte literarische Programmiersystem ist viel, viel mehr als sofort ins Auge gefallen. Es hat nämlich viele Mängel in der zugrunde liegenden Programmiersprache behoben, die das aus Knuths Quelldokument generierte Tool zur Codegenerierung, nämlich das Standard-Pascal.

Für diejenigen, die das Glück haben, Standard Pascal nicht ausprobiert zu haben, sind hier einige der Highlights.

  • Um die Erstellung eines Single-Pass-Compilers zu vereinfachen, lautete die Sprachspezifikation, dass alle Deklarationen in einer bestimmten Reihenfolge vorliegen mussten. Auf der Wikipedia-Seite: "Jede Prozedur oder Funktion kann eigene Deklarationen von goto-Bezeichnungen, Konstanten, Typen, Variablen und anderen Prozeduren und Funktionen haben, die alle in dieser Reihenfolge vorliegen müssen." Dies bedeutete, dass Sie Ihre Objekte in der Quelldatei nicht logisch gruppieren konnten .
  • Die Handhabung der Saiten war mühsamer als bei normalem C.
  • Bezeichner dürfen keine beliebige Länge haben.
  • Viele weitere Dinge, an die ich mich nicht mehr erinnern kann.

All diese Dinge bedeuteten im Grunde, dass Knuth eine bessere Programmiersprache brauchte (so erfand er eine) und Pascal als Assemblersprache verwendete.

Die meisten modernen Sprachen können diese Dinge ohne großen Aufwand erledigen, sodass ein GROSSER Teil der Arbeit, die Literate Programming zu lösen hatte, entfällt.

Moderne Sprachen sind aussagekräftiger, sodass mehr Gedanken in den Code selbst eingefügt werden können.

Also, was ist noch übrig? Die Möglichkeit, eine gesetzte Form der Dokumentation aus dem Quellcode zu generieren, und DAS gibt es heute.

Denken Sie nur an JavaDoc - die Java-Laufzeit-API ist vielleicht das größte derzeit verfügbare Teil der literarischen Programmierung (mit der Ausnahme, dass der Code nicht wirklich präsentiert wird, aber es KÖNNTE gewesen sein, wenn Java von Anfang an Open Source war). Siehe zum Beispiel die Präsentation des Collections-Frameworks unter http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Ich glaube, es gibt ähnliche Systeme für .NET und andere Mainstream-Programme.


To make it possible to have a single-pass compiler, all declarations had to come in a certain order. Eine solche Deklarationsreihenfolge vereinfacht zwar das Compiler-Design, verhindert jedoch nicht die Kompilierung in einem Durchgang. Delphi zum Beispiel hat diese Reihenfolge nicht, aber es ist immer noch ein Pascal-Compiler mit nur einem Durchgang.
Mason Wheeler

Einverstanden. Turbo Pascal hatte diese Einschränkung auch nicht. Beachten Sie jedoch, dass diese Einschränkung von Anfang an in der Definition von Pascal enthalten war.

1
Nein, Knuth ist vor langer Zeit zu CWEB gewechselt, es geht nicht darum, Pascal-Mängel zu beheben. Nein, JavaDoc hat nichts mit Knuths "Lese- und Schreibprogrammierung" zu tun - er spricht davon , die Art und Weise, in der er Code erstellt, grundlegend zu ändern , und behauptet, dass er damit die Komplexität bewältigen kann, die er oder andere sonst nicht annehmen könnten.
Ron Burk

@ RonBurk CWEB kompiliert nur zu einer besseren "Assemblersprache". Dies macht die ursprünglichen Entwurfsentscheidungen nicht ungültig.
Thorbjørn Ravn Andersen

5

Als ich mich in den 90ern mit Lese- und Schreibprogrammen auseinandersetzte, stellte ich fest, dass es sehr leidenschaftliche Leute anzog, die genau das Richtige tun wollten - und dass sie ihr eigenes Lese- und Schreibprogrammiersystem schreiben mussten, weil kein vorhandenes für sie gut genug war. noweb war ein guter Versuch, dies zu unterbinden, indem ein ausreichend kleiner gemeinsamer Nenner für alle bereitgestellt wurde, obwohl ich selbst dann den größten Teil meiner LP-Zeit damit verbracht habe, einen hübschen Drucker dafür zu entwickeln ...

Ein weiteres Problem ist, dass es wirklich anti-agil ist. In mancher Hinsicht ist es gut, verlangsamt zu werden, weil Sie dadurch gezwungen sind, im Voraus zu denken und die Dinge gleich beim ersten Mal richtig zu machen. Auf der anderen Seite bedeutet eine sorgfältige Dokumentation, dass es eine große Hürde für die Umgestaltung Ihres Codes gibt. Und wenn Sie warten, bis Ihr Code gehärtet ist, bevor Sie LP-ify es, erhalten Sie eine mehrtägige Dokumentationsaufgabe, die Sie wirklich aufhalten kann.


Nach dem Experimentieren habe ich herausgefunden, dass der Sweet Spot von LP für den Rest von uns darin bestehen könnte, Entwurfsentscheidungen und Architekturdetails direkt neben dem eigentlichen Code zu dokumentieren . Ich bin damit einverstanden, dass LP schwerer umzugestalten ist. Nach meinem Verständnis hat Knuth das ursprüngliche Design auf Papier erstellt und erst, wenn er zufrieden war, mit der tatsächlichen Umsetzung begonnen. Dies ist höchstwahrscheinlich die gleiche Situation, in der ich Arbeit für mich finde.
Thorbjørn Ravn Andersen

3

Meiner bescheidenen Meinung nach haben viele Unternehmen eine Kultur, die den Zielen der literarischen Programmierung widerspricht: Sie wollen schnellere Ergebnisse (sie schreien nur nach Qualität, wenn die App in Produktion ist). Nach meiner eigenen Erfahrung hatten sich meine Chefs geweigert zu verstehen, dass schnellere Ergebnisse nicht "ein Programm bedeuten, das am Tag nach meiner Anfrage ausgeführt werden kann". Wenn ein Entwickler nicht damit beschäftigt ist, über seine Tastatur zu tippen, arbeitet er nicht und "verschwendet seine Zeit mit sinnlosem Design". Ja, ich weiß, mein Chef ist ein Arschloch.


Dann denken sie vielleicht, dass Sie mit Literate Programming beschäftigt sind, um Sci-Fi Book zu schreiben, anstatt einer weiteren Software! : D
Mahdi

Unternehmen wie diese verstehen nicht, dass gute Software sehr lange lebt und je besser die Dokumentation ist, desto wertvoller ist die Quelle.
Thorbjørn Ravn Andersen

2

Codierer schreiben Code nicht Englisch.

Codierer schreiben keine Dokumentation, da dies nicht zur Ausführung des Codes beiträgt.

Codierer sind nicht gut darin, Dokumentation zu schreiben, weil es ein schlechtes Medium ist, um ihre Ideen auszudrücken.

Literarische Programmierung scheint die Idee zu sein, Dokumentation auf die nächste Ebene zu bringen, wo der Code eher ein Nachdenken ist. Vielleicht würde es funktionieren, aber für die meisten Programmierer sieht es wie eine widerwärtige Dokumentation aus.


29
Codierer, die sich an die von Ihnen beschriebenen Punkte halten, sind keine Codierer, mit denen ich zusammenarbeiten möchte.
Paul Nathan

1
@ Paul, zugegeben. Aber das ist wirklich da draußen. Aber es scheint mir, dass mehr Dokumentation nicht unbedingt besser ist.
Winston Ewert

1
genug ist vielleicht am besten
mlvljr

6
Erfahrene Programmierer wissen, dass sie Dokumentation schreiben MÜSSEN, weil dort das "WARUM habe ich das so gemacht" steht.

1
@ Thorbjørn Ravn Andersen, ja das stimmt. Wie ich jedoch verstehe, empfiehlt es sich, dass Sie Code mit Ihrer Dokumentation schreiben, anstatt Dokumentation mit Ihrem Code. Ist so viel Dokumentation wirklich hilfreich?
Winston Ewert

2

Hauptsächlich, weil die Leute SEHR DUMM sind. Offensichtliches Zeugnis davon ist ein endloser Strom von Vermutungen und Missverständnissen, die von jungen Menschen über die Natur dieser einfachen Technik geäußert werden.

Die Leute verstehen LP als: (a) eine Methode zur Dokumentation (b) eine Methode zum Schreiben von geschliffenen Aufsätzen, die besondere Fähigkeiten oder Talente erfordern (c) einfach keine Ahnung haben - wie der Schöpfer des Leo-Programmiereditors selbst zugibt usw. usw. usw.

LP ist jedoch einfach: (1) Schreiben von Programmen in einer Mischung aus Code und Phrasen in einer (= beliebigen) menschlichen Sprache, wobei letztere für andere Codestücke und / oder eingeschlossene Phrasen stehen. Dies ist genau das, was Autoren zahlreicher Programmierbücher tun. Und (2) es ist ein einfacher Präprozessor, der diese Phrasen im Menschen erweitert (was so aussah, als würden Namen von eingeschlossenen Unterprogrammen verwendet), um das Ergebnis IN DER VOM COMPILER ERFORDERLICHEN REIHENFOLGE (oder) zu entwirren Dolmetscher). Andernfalls können Sie den geschriebenen Text mit einem anderen kleinen Dienstprogramm erweitern, um Formatierungssymbole hinzuzufügen, mit denen Sie aus der "gebildeten Quelle" einen schönen, gut formatierten, lesbaren Text machen können.

Junge Leute probieren diese extrem einfache Idee niemals aus - und fantasieren oder stellen sich falsche Gründe vor, warum sie es niemals versuchen oder tun.

Grundsätzlich hilft die Grundidee, "im Pseudocode" in einer menschlichen Sprache zu programmieren und diese dann mit einem einfachen Präprozessor-Dienstprogramm zu erweitern (begrenzt, eine Hauptschwierigkeit für jedes längere Programm), ähnlich wie das Falten von Code oder die Aufteilung Ihres Programmflusses in Funktionen / Unterprogramme, die erforderlich sind, damit Sie sich nicht in den Details verlieren, sondern für die Ausführung der Maschine völlig unnötig sind.


3
Sie vermissen ein wichtiges Element: (3) eine Möglichkeit, einen Code in einer beliebigen Sprache in die lesbarste und natürlichste Reihenfolge umzuordnen, die nicht unbedingt dieselbe Reihenfolge ist, mit der ein Compiler umgehen muss. Es enthält das Ausblenden der Implementierungsdetails in Fußnoten oder an einer anderen Stelle, die von der Code-Gliederung entfernt ist.
SK-logic

1

Es gibt zwei Aspekte der gebildeten Programmierung , dass ich tue Wunsch in den Hauptprogramme integriert wurde - eingebettete Bilder (zB Design - Diagramme) und Zeiger auf vorherige und alternativen Versuche (zB „Der Grund , warum es so ist , ist , weil ich diese andere Art und Weise versucht , und es hat nicht funktioniert, weil ... "). Beide Aspekte können mit Dokumentkommentaren und URIs behandelt werden.


1

Weil die Logik von Programmen nicht so funktioniert, wie wir sprechen. Ein Programm hat einen genau festgelegten Ablauf, Bedingungen und Schleifen.

Nachdem ich viel codiert habe, DENKE ich in diesen Begriffen. Mein Gehirn wandelt Probleme in die Zieldomäne von ausführbarem Code um. Und es ist für mich viel effizienter, dies in einer normalen Programmiersprache aufzuschreiben, als den zusätzlichen Transformationsschritt ausführen zu müssen, um meine Programme lesen und schreiben zu können.

Tatsächlich glaube ich, dass meine Programme bereits gut geschrieben sind ... sprechende Bezeichner, gute Funktionsnamen, Kommentare, bei denen ich einige Hacks gemacht habe, die ich selbst nach ein paar Monaten nicht sofort begreifen würde.

Fazit: Mein Java-Code ist von sich aus besser als jede "gebildete" Programmierung.


2
Ein Java-Code kann nicht lesen und schreiben. Ihre "sprechenden Bezeichner" werden niemals erklären, warum Sie diesen bestimmten Algorithmus einem anderen vorziehen, wo die Grenzen liegen, was Sie von Ihrem Leistungsprofil erwartet haben usw. Meine Lese- und Schreibprogramme bestehen hauptsächlich aus Formeln, Diagrammen und Grafiken und nicht so viel englischer Text. Aber all das kann nicht in einem Code ausgedrückt werden und in einfachen Kommentaren unschön aussehen.
SK-logic

1

Ich kam in die umgekehrte Richtung, um das Programmieren zu lernen - ich träumte davon, den Code so zu organisieren, wie er zu mir passt, und nicht so, wie es der Compiler verlangt. Ich fand Leo fast ideal für diesen Zweck. Es unterstützt auch das Verfolgen von Dateien, die außerhalb geändert wurden. Diese Dateien müssen kein spezielles Markup enthalten, sodass ich Leo für mich selbst verwenden kann, ohne dass andere im Team dies wissen müssen. Dieses Feature - "@shadow trees" - ist sehr vielversprechend, obwohl es immer noch ein bisschen fehlerhaft ist, braucht es mehr Augäpfel. Und es behebt auch das Problem "Oh nein, alles in einer großen Datei", indem sowohl alles in Baumstruktur organisiert wird als auch externe Dateien unterstützt werden.

Bei der "Literatenprogrammierung" geht es mir entgegen dem Namen überhaupt nicht um Dokumentation. Ich habe nicht mehr Unterlagen als zuvor. Es geht darum, eine Struktur zu haben, die mir hilft, mich nicht zu verlaufen . Ich schwöre darauf, besonders wenn ich riesige JSP-Dateien verwalte (und das obwohl Leo ursprünglich in erster Linie für Python gedacht war und keine Unterstützung für die JSP-Sprache bietet - ich muss die Datei manuell in einen Leo-Baum aufteilen!).


0

Ich sehe es als ein wertvolles Lehrmittel, mit dem eine Dissertation über Code geschrieben werden kann und in das dann Ausschnitte von Arbeitscode eingefügt werden, um die Leser über das Wie, Was und Warum des Codes zu unterrichten.

Außerhalb eines rein pädagogischen Umfelds, denke ich, versteht nur Knuth wirklich, wie man es am besten einsetzt.


-4

Es ist die schlimmste aller Welten - Sie müssen ein sehr korrektes, sehr spezifisches Computerprogramm in einer sehr unspezifischen Sprache schreiben = Englisch. Sie müssen es also sorgfältig mit genau den richtigen Sätzen schreiben - Sie können also auch einfach Code schreiben.


3
Sie sollten Ihren Code nicht in Englisch wiederholen. Kommentare müssen den Grund erklären, warum der Code vorhanden ist, nicht was er tut. Ich füge meinen schriftlichen Kommentaren oft Grafiken, Diagramme und Diagramme hinzu, und es hilft wirklich, den Code zu verstehen.
SK-logic

Wenn die Kommentare nicht aussagen, was der Code tut, wie ist es, die Programmierung zu beherrschen - es ist nur die normale Programmierung mit Kommentaren. Ich dachte, der Sinn der Lese- und Schreibprogrammierung sei es, das Programm in den Dokumenten zu beschreiben und das System Code aus der Dokumentation generieren zu lassen?
Martin Beckett

3
versuche "TeX, das Programm" zu lesen. Code wird dort in Kommentaren nie wiederholt. Comments erklärt, warum der Code so geschrieben ist, und erklärt die Architektur.
SK-logic

3
@MartinBeckett Was Sie beschreiben, ist nicht LP.
Andres F.
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.