Die Aufzeichnung beschreibt einen Softwareentwicklungsansatz, bei dem Code nicht nur für Computer, sondern für menschliche Lesbarkeit optimiert wird. Der Sprecher plädiert dafür, in Java Code so zu gestalten, dass er wie ein englischer Satz lesbar ist, damit Fachexperten ohne Programmierkenntnisse Logik überprüfen können.
Am Beispiel eines Kartenspiels entwickelt er eine „fluide“ API mit Begriffen wie „Selection“, „Option“ und „Action“. So wird ein Satz wie „find all cards that are spades and less than five then print“ schrittweise in ausführbaren Java-Code überführt. Ziel ist es, Missverständnisse zwischen Entwicklern und Domainexperten zu vermeiden und keine veralteten Kommentare oder separate Spezifikationen zu benötigen.
Kritisch bleibt der hohe Vorabinvest zu betonen: Die gemeinsame Terminologie und technische Infrastruktur müssen erst mühsam definiert werden. Der Nutzen entfaltet sich erst bei häufig wechselnden Anforderungen im selben Fachgebiet, etwa bei Testfällen, die direkt vom Auftraggeber validierbar sind. Für einmalige Projekte lohnt sich der Aufwand weniger. Zudem ist die entwickelte Minisprache nicht portabel, lässt sich aber als Philosophie auf andere Programmiersprachen übertragen.
📜 Transkript
Ich dachte, worüber wir heute sprechen, ähnelt dem Programmieren, nur dass wir uns nicht nur darauf konzentrieren, unser Programm korrekt zum Laufen zu bringen, sondern vielmehr darauf, es für Menschen lesbar zu machen und nicht nur für den Computer. Und sind das dann so sehr viele Kommentare und ähnliches? Macht ihr es alle zu wortreich? Wie, was, wie macht man das? Wir könnten unzählige Kommentare haben, aber das Problem bei unzähligen Kommentaren ist, dass sie schnell nicht mehr mit dem übereinstimmen, was der Code selbst tut, und es ist ja eigentlich nicht mehr dasselbe, oder? Dann gibt es zwei Teile: einen für Kommentare für Menschen und einen für den Code für den Computer. Das ist, als würde man überall Haftnotizen hinkleben , nicht wahr? Also, jemand kommt zurück und sagt: „Ach ja, das ist … Wissen Sie, wie das ist? Der Haftzettel ist falsch, aber jeder weiß, dass der Haftzettel falsch ist, und man muss stattdessen tatsächlich diese Sache so machen.“ Der Grund, warum ich darüber nachgedacht habe, ist folgender: Wenn man Softwareentwickler ist, baut man normalerweise etwas für jemanden, und dieser Kunde hat eine Reihe von Anforderungen, die er erfüllen muss , und er kennt sich damit auch bestens aus, aber er kennt sich wahrscheinlich nicht mit Computerprogrammierung aus. Und wenn Sie der Softwareentwickler sind, kennen Sie sich hoffentlich mit Computerprogrammierung aus, aber natürlich werden Sie nicht die genauen Details ihres Geschäfts oder dessen, was sie betreiben, verstehen. Wir brauchen also eine gute Zusammenarbeit, und es wäre hilfreich, wenn wir etwas fänden, worüber wir gemeinsam sprechen könnten, sodass wir sagen könnten: „Ja, wissen Sie, das machen wir jetzt so, und das ist richtig, und das ist falsch.“ Und so schrieb üblicherweise jemand ein großes Dokument, gab es einem Programmierer, der es las, es dann aber auch ein wenig interpretierte und es anschließend in der entsprechenden Programmiersprache kodierte. Und die einzige Möglichkeit, wirklich zu überprüfen, ob das System, das man kennt, richtig verstanden wurde, besteht darin, die Anwendung auszuführen, sie auszuprobieren und dann festzustellen : „Oh, nun ja, in diesem speziellen Fall funktioniert sie nicht ganz richtig. Also, irgendetwas stimmt nicht.“ Zu welchem Zeitpunkt sind seitdem Monate vergangen? Ja, genau. Es wäre also schön, wenn wir stattdessen eine Möglichkeit hätten, bei der sich die Leute zusammensetzen und den Code tatsächlich ansehen könnten und sagen: „Okay, ist das richtig? Oder ist das so? Oh, vielleicht sollten wir es so ändern.“ Aber natürlich verwenden wir Programmiersprachen üblicherweise so, dass es sich um gängige Sprachen handelt, die darauf ausgelegt sind, alle Probleme zu lösen, aber nicht speziell auf bestimmte Probleme zugeschnitten sind. Es gibt also eine Klasse von Dingen, die man domänenspezifische Sprachen nennt, mit denen wir maßgeschneiderte Programmiersprachen entwickeln können, die für bestimmte Probleme geeignet sind. Aber es ist eine Menge Arbeit, so etwas zu bauen . Man kann sich vorstellen, dass die Entwicklung einer Programmiersprache keine triviale Aufgabe ist. Man kann also nicht davon ausgehen, dass jeder Softwareentwickler das ständig tut . Ich dachte, wir könnten uns heute ansehen, ob wir eine gängige Programmiersprache nehmen und, wenn wir schon an die Programmierung denken, die Lesbarkeit für Menschen in den Vordergrund stellen können. Wir wollen sehen, ob wir den Code so gestalten können, dass ihn jemand, der kein Programmierer ist, lesen und vielleicht nicht selbst schreiben kann, aber zumindest bestätigen kann: „Ja, genau das habe ich gemeint.“ oder „Nein, das ist falsch, und wir sollten das so ändern.“ Ich dachte, wir könnten etwas zum Thema Kartenspiele machen, und Sie können sich vorstellen, dass ich vielleicht, wissen Sie, ein Kartenspiel hätte. Ich werde es neu mischen und wir wollen bestimmte Dinge damit machen. Wir könnten also nach allen Pik-Symbolen suchen oder nach allen Symbolen, deren Wert größer als fünf ist, oder nach allen Pik-Symbolen, die größer als fünf sind, und dann könnten wir sie zum Beispiel ausdrucken oder etwas anderes damit machen. Es gibt eine Vielzahl von Möglichkeiten, und wenn man beispielsweise… nun ja, das ist jetzt kein wirklich praktisches Beispiel, aber man könnte sich vorstellen, dass man eine Reihe von Dingen tun möchte . Ich schreibe vielleicht gerade das Programm, um das zu versuchen, und möchte dann bei Ihnen nachfragen: „Oh, ist das so, wie Sie es wollten? Oder wollten Sie etwas anderes? Okay, ändern wir es einfach.“ und damit wir über diesen Codeabschnitt sprechen können. Eine gängige Programmiersprache auszuwählen, die dafür definitiv nicht geeignet ist. Wir programmieren etwas in Java. Es ist ziemlich weit verbreitet. Das schreiben viele Menschen auf der Welt. Nicht besonders schick, in keiner Hinsicht. Ähm, also, was ich bisher geschrieben habe – falls die Leute es auf dem Bildschirm sehen können – ist Folgendes: Ich habe etwas erstellt, das eine Karte darstellen soll, und etwas, das eine Kartenfarbe darstellen soll. Ich öffne das mal, um es Ihnen zu zeigen, und zwar so, dass es ein komplettes Kartenset darstellt, bei dem wir sagen können: Das ist ein vollständiges Kartenset. Wir müssen hier eigentlich nicht mehr nachsehen, aber das sind eben die grundlegenden Dinge, mit denen wir arbeiten werden. Das Programm, das ich bisher geschrieben habe, sagt also einfach: Erstelle ein komplettes Kartenspiel und mische es anschließend. Und das war einfach die Nutzung der in der Sprache integrierten Mischfunktionen. Es gibt also nichts Besonderes, was wir hier getan haben. Und dann möchte ich vielleicht eines dieser Szenarien, über die wir gerade gesprochen haben, aufschreiben, so nach dem Motto: Mal sehen. Nehmen wir also an, wir wollten … Ich schreibe es einfach als Kommentar, wie in einem englischen Satz. Okay . Wie wäre es, wenn wir alle Pik-Karten mit einem Wert unter fünf finden und ausdrucken? Wissen Sie, das könnte eine Anweisung sein, die Sie mir geben könnten, in das Programm einzugeben. Ich könnte also einen Code schreiben, der das tut, aber es wäre schwierig für Sie zu sagen: „Ja, das stimmt.“ Und deshalb möchten wir, dass der Code genau so aussieht. Vielleicht nicht ganz genau so, aber so nah wie möglich dran, und ich denke, das ist etwas, was wir beim Programmieren oft nicht als primären Aspekt betrachten. Wir übertragen das gewissermaßen auf die Sprache der Programmierung, wie z. B. while-Schleifen und Wenn-wenn-das-dann-tue-das. All diese Dinge. Und ich frage mich, ob wir etwas herstellen können, das so aussieht . Also, ich werde versuchen, den Code so zu schreiben. Das wird nicht funktionieren, aber versuchen wir einfach, die richtige Form zu finden und dann zu sehen, ob wir es zum Laufen bringen können. Okay. Vielleicht hätten wir in Java Funktionen, also könnten wir eine Funktion ausprobieren, die alle Karten findet – das ist etwas, was wir bereits im Programm haben. Vielleicht könnte ich also sagen, dass wir das an diese Funktion übergeben könnten. Und dann kommt das, was als nächstes kommt, und man sagt, das seien Pik. Und dann kann ich mir tatsächlich vorstellen, dass die Pik-Einstellung etwas sein könnte, das wir hier ändern möchten. Man könnte sich also vorstellen, dass wir etwas anderes tun wollen, nämlich alle Karten zu finden, die Karo-Karten sind. Vielleicht ist das also etwas, wo wir die Möglichkeit haben sollten, hier eine Option zu übergeben. Vielleicht setze ich das in Klammern, um anzudeuten, dass wir hier eine Funktion haben könnten, der man etwas anderes übergeben könnte. Und wir möchten auch sagen, dass es weniger als fünf ist. Wiederum fühlt sich fünf wie eine Sache an, die ein bisschen… Manchmal möchte man vielleicht weniger als sechs oder ja sagen. Genau. Versuchen wir es also mit weniger als fünf. Und diese beiden, Pik und Kleiner als, wirken wie Auswahlkriterien oder so etwas in der Art . Es handelt sich also im Grunde um ähnliche Dinge. Also, ich habe sie in beiden Fällen an diese weitergegeben . Und was wollen wir dann tun, wenn wir sie gefunden haben? Und dann sagen wir, äh und Und nochmal, wir wollten sie drucken, aber ich kann mir vorstellen, dass wir noch andere Dinge tun wollen . Nehmen wir also an, wir werden sie ausdrucken. Und weil es Java ist, muss ich am Ende ein Semikolon setzen. Hier ist also mein Code, so wie ich ihn mir wünsche – ich wünschte, er würde existieren. Wir müssen es einfach dafür schaffen . Und so, weil wir mit dieser Herangehensweise begonnen haben, um zu sagen: Nicht wie der Code am Ende aussehen wird, sondern wie ich ihn haben möchte. Und nun verändern wir die Programmiersprache, um genau das zu erreichen. Was genau sind also definierte Funktionen, die diese Eigenschaften besitzen? Rechts. Ja . Anstatt also zu sagen: „Welche Funktionen habe ich?“ und dann mein Programm aufzubauen, möchte ich lieber damit beginnen: „ Wie soll es sich lesen lassen, sodass wir uns darauf einigen können?“ Und an diesem Punkt könnte man sogar sagen, dass das falsch ist. Und selbst wenn es noch nicht funktioniert, könnte man trotzdem sagen: „Oh nein, nicht Pik.“ Rechts? Ja . Oder so ähnlich. Und so könnten wir es an diesem Punkt beheben. Und dann können wir es so machen, sobald wir wissen, dass es richtig ist. Die etwas knifflige Frage ist also, ob es überhaupt funktioniert. Äh, also, wir können ein paar Dinge definieren. Rechts? Eines der Dinge, die ich hier mit IntelliJ für meinen Java-Code verwende, ist, dass es mir in Rot mitteilt, dass einige Dinge nicht existieren. Also, wir könnten die herstellen. Also, das ist zunächst einmal eine kleine Beschwerde über diese „ weniger als“-Sache. Also, lasst uns zunächst eine Funktion erstellen, die kleiner als ist, und einfach dafür sorgen, dass sie nicht mehr ständig meckert . Also, „kleiner als“ ist eine Funktion, die eine Zahl entgegennimmt und äh, nun ja, ich weiß noch nicht genau, was sie tut, aber zumindest habe ich aufgehört, mich darüber zu beschweren. Und dann gibt es da noch Spades. Lasst uns zuerst die Reihenfolge herausfinden. Das heißt, die Funktion „find order“ benötigt eine Liste von Karten, die wir bereits im Programm haben. Und es wird etwas bewirken, aber ich bin mir noch nicht sicher. Äh, und ich muss es sagen: Oh nein, es ist eine Kartenliste. So, jetzt haben wir's. Es wird also etwas besser. Wir haben noch ein paar rote Sachen. Äh, also, wir haben etwas, das Pik-Symbole sind, und wir haben etwas, das sie ausdruckt. Also, wir sprachen darüber, dass es so etwas wie ein Kriterium, eine Auswahl, eine Einschränkung oder so etwas sein könnte. Welche davon fühlt sich am besten an? Nun ja, es ist ja eine Option, nicht wahr? Von den vier verschiedenen möglichen Anzügen. Es ist also etwas, das man selbst auswählen möchte. Ja, eine Wahl. Eine Wahl. Nun gut , dann war's das. Nehmen wir also an, wir erfinden etwas namens „Wahlmöglichkeit“ und nehmen es in das Programm auf, denn wir haben uns darauf geeinigt, dass dies der Begriff ist, der am sinnvollsten erscheint . Also, das ist das englische Wort dafür. Ja, okay. Also, äh, wir werden etwas erstellen, ich werde eine Schnittstelle erstellen, die einfach so etwas wie „Dies wird die Auswahl definieren“ besagt, aber wir werden noch nicht wirklich viel darüber sagen, aber es wird etwas sein, das in der Sprache vorhanden ist. Bislang wollen wir nicht mehr sagen, als dass es existiert und Pik dann eine Option sein kann. Ich habe also die Wahl zwischen zwei Pik-Figuren. Und dann wird es nicht rot. Und dann drucke sie aus. In ähnlicher Weise empfinde ich das Ausdrucken als eine Handlung, die wir vielleicht ausführen möchten, nachdem wir unsere Auswahl getroffen haben. Also, lasst uns etwas erschaffen. Lasst uns dasselbe tun. Lasst uns eine Schnittstelle namens „Aktion“ erstellen. Und ich werde eine Aktion namens „ Drucken“ erstellen. Und dann haben wir es fast geschafft. Wir müssen nur diese Funktion so aufrufen, dass sie lautet: Diese Aufgabe ist etwas komplizierter, da wir in Java arbeiten. Es handelt sich um eine objektorientierte Sprache. Dies, das sind, kommt nach einem Punkt. Es handelt sich also um eine Methode eines Objekts. Was wir bisher noch nicht besprochen haben, aber als ich es ursprünglich aufgeschrieben habe, wissen Sie, habe ich es in einem englischen Satz geschrieben, von links nach rechts. Und dann haben wir eine Codezeile geschrieben, die ein bisschen komisch aussah, weil sie ziemlich lang ist. Es handelt sich nicht um eine Reihe von Aussagen, die besagen: Zuerst tu dies, dann tu jenes, tu jenes. Das ist also das, was wir als flüssiges Design, als flüssiges API-Design bezeichnen würden. Das bedeutet also, dass wir versuchen, es so zu schreiben, als wäre es ein Satz, aber wir müssen ein paar kleine Anpassungen vornehmen, damit es trotzdem richtig ausgeführt wird. Wir brauchen also etwas, das alle Karten findet und uns zu dem zurückführt, wo wir etwas tun können, das man als Verfeinerung oder Ähnliches bezeichnet. Das war's also fast . Ja, also es wird entweder etwas sein, das man filtern kann, oder ich dachte eher an eine Art Auswahl oder so etwas in der Art. Vielleicht müssen wir also alle Karten finden, um eine Auswahl zurückgeben zu können. Vielleicht handelt es sich um eine Auswahl? Es ist so ziemlich das Einzige, was man auswählen kann. Oh, das ist so eine Art „Ja, nun, nun“-Liste. Ich denke, ja, aber es könnte etwas konzeptioneller sein. Okay. Weil ich denke, dass eine Liste etwas mit Programmierung zu tun hat . Okay, also ein Ja, nun ja , so ein „ Ja“, weil mir das Wort nicht einfällt. Mir fällt es nicht ein. Ja, also das ist ein interessanter Punkt: Während wir es gemeinsam entwickelten, fragten wir uns immer wieder: „Wie nennt man das?“ Und so versuche ich nur, ein bisschen mehr herauszukitzeln. eine gemeinsame Terminologie. Damit wir in Zukunft über diese Dinge sprechen können. Ich würde sagen: „Oh ja, genau das ist es.“ Jetzt aber zu Option, Optionen. Ähm, ich stelle mir vor, dass ein großer Konzern eine große Besprechung zu diesem Thema abhält. Was ist es wert? Ja, es ist viel Whiteboard und viel Stifte. Stifte und Menschen kommen heraus. Ja ja . Was, wie ich finde, in manchen Fällen hilfreich sein kann. Ähm , also, nehmen wir mal eine Auswahl. Das stimmt so nicht ganz. Wir könnten es später noch verfeinern. Aber ich werde mich für die Auswahl entscheiden. Zusammenfassend lässt sich sagen, dass die Methode „Alle finden“ eine Auswahl zurückgibt. Rechts. Das bedeutet, dass wir all dies mit der Auswahl tun können, um sie zu verfeinern. Also, ich werde das erstellen. Nicht umbenennen. Machen wir das. Das alles ist also eine Methode der Selektion. Also , sagen wir mal, das ist alles, und es dauert… Nun haben wir zwei Möglichkeiten. Man könnte also sagen, dass es eine Reihe von Entscheidungen erfordert. Und darüber beschwert es sich. Warum beschwert es sich über die Wahlmöglichkeiten? Nein, ich glaube, das ist… Oh ja, nun, das ist ein Problem. Es beschwert sich hier, weil wir beim letzten Mal gesagt haben, dass es sich um eine Funktion handelte, die void zurückgab. Ich habe nichts zurückgegeben. Aber eigentlich wollen wir, dass es eine Entscheidung trifft. Wir wollen, dass es eine Wahlmöglichkeit ist. Sagen wir also Folgendes: Und wir sind jetzt schon ziemlich nah dran. So, jetzt können wir sagen: „Okay, und ist eine weitere Methode. Das sollte eine Methode für den Rückgabewert von R sein, [schnaubt] was wir gleich herausfinden können. Ähm, R gibt im Moment void zurück. Also wird es zurückgeben. Machen wir eine kleinere Auswahl. Du hast also mit einer Auswahl von Karten angefangen. Du hast sie etwas verfeinert und hast jetzt eine kleinere Auswahl. Also, eine weitere Auswahl, ja, okay. Und ähm, dann können wir sagen: Sobald du eine Auswahl hast, kannst du Dinge damit machen.“ Und das, was hier vielleicht etwas ungewöhnlich ist, ist, dass wir in der Programmierung normalerweise, wenn wir ein Wort wie „und“ verwenden, sehr darauf achten würden, es logisch zu verknüpfen. Aber wir haben den Satz so geschrieben: Wähle diese Dinge aus und gib sie aus. Also eine Art Sequenzierung. Es ist effektiv: Mach das damit, nicht wahr? Also, würdest du lieber „ dann“ sagen? Würde das Sinn ergeben? Nun , vielleicht, vielleicht würde das Sinn ergeben, ja, ja. Also, wir könnten das ändern. Also, das ist Okay. Also, dann drucken wir sie aus. Und nochmal , um sicherzugehen, dass wir alles richtig verstanden haben. Dann erstelle ich eine Methode namens `then`, die auf Auswahlen angewendet wird. Sie erledigt das für uns. Ja, los geht's . Erstellen wir also eine Methode, mit der man Aktionen auf Auswahlen anwenden kann. Man kann Auswahlen Aktionen zuweisen. Solange eine Aktion vorhanden ist, kann man sagen: „Okay, dann führe diese Aktion aus.“ Bisher haben wir es noch nicht zum Laufen gebracht . Aber fangen wir zumindest an und versuchen wir, es zum Laufen zu bringen, um zu beweisen, dass wir nicht nur herumexperimentieren, sondern dass wir es tatsächlich zum Laufen bringen können. Ich könnte jetzt versuchen, es auszuführen . Natürlich wird es nicht funktionieren, aber es hilft uns, die Fehlerquellen zu finden. Also, äh, ich Ich kann mein Programm ausführen. Also, versuchen wir es. Okay, und es gibt eine Fehlermeldung, dass in Zeile 21 ein Nullwert vorliegt. Was ist das? Okay, irgendwo in unserer langen Codezeile ist der Fehler aufgetreten, weil der Wert null war. Ich denke, das Problem ist, dass die Funktion „Alle Karten finden“ einen Nullwert zurückgibt. Wir rufen also „Alle Karten finden“ auf, und die Fehlermeldung lautet: „Ja, okay, hier ist ein Nullwert.“ Wenn man dann versucht, damit etwas anderes zu machen, stürzt das Programm sofort ab. Genau . Man kann sich also die Codezeilen durcharbeiten und den gesamten Code – vielleicht ist das nicht der richtige Ausdruck – in den Backend-Bereich auslagern, den die Person, mit der man zusammen sitzt, nicht kennen muss. Richtig. Sie kann aber sehen, was der Code tun soll . Und wenn das erste Problem behoben ist, können wir wieder zur obersten Ebene zurückkehren. und sagen: "Okay, jetzt willst du noch eine machen, die sich um Diamanten dreht." „Also, jetzt wollen Sie das machen. Oh, jetzt haben Sie Dinge, die kleiner als acht und größer als drei sind und Pik darstellen.“ An diesem Punkt könnten wir hoffentlich weitermachen, ohne weitere dieser grundlegenden Programmierstrukturen schreiben zu müssen. Ja. Wir hätten vielleicht ein oder zwei Stunden damit verbracht, diese grundlegenden Strukturen zusammenzustellen, aber gleichzeitig quasi unsere eigene Programmiersprache entwickelt, mit der wir über – in diesem Fall Kartenauswahlen, aber in anderen Fällen Studentendatensätze, Einzelhandelstransaktionen, Versicherungstarife oder was auch immer – sprechen können, und zwar mit der Terminologie, auf die wir uns geeinigt haben und die für uns beide verständlich ist. Ja. So verwende ich keine Programmierbegriffe, und Sie sprechen in Geschäftssprache, und wir könnten leicht ein Missverständnis haben, wenn ich denke, ein bestimmtes Wort bedeutet etwas anderes, als Sie . Auf diese Weise erreichen wir, dass das Programm zumindest auf dieser Ebene alle Wörter verwendet. Aus unserem vereinbarten gemeinsamen Vokabular, das keine Programmierbegriffe verwendet . Ich denke, wenn wir diesen Punkt erreichen und diesen Ansatz konsequent verfolgen, können wir immer mehr Code auf einem Niveau entwickeln, auf dem wir darüber sprechen können . Darunter befindet sich dann eine Ebene, über die wir nicht gemeinsam sprechen, da diese die Verkabelung und die Infrastruktur umfasst, die wir für die Funktionsfähigkeit benötigen. Stellen Sie sich vor, jemand möchte ein Haus bauen lassen und wünscht sich eine Steckdose. Er muss nicht wissen, wie die Kabel dorthin verlegt wurden, sondern nur die Steckdose . Ist es so ähnlich? Ich denke, er könnte beispielsweise darüber sprechen, ob er einen zwei- oder dreipoligen Stecker, ein USB-C-Ladegerät oder Ähnliches benötigt. Wie das hinter dem Verteilerkasten funktioniert, ist nicht wichtig. Wichtig ist nur, dass man sich in diesem Fall mit dem Elektriker über ein bestimmtes, vereinbartes Vokabular verständigen kann. Es geht darum, die verschiedenen Aspekte abzuwägen, damit man das gewünschte Ergebnis erzielt. Es scheint, als würde viel Aufwand betrieben, um die Kommunikation über diesen Code zu gewährleisten. Lohnt sich das wirklich? Sollte ich Ihnen einfach eine Spezifikation geben, sagen, ich brauche den Code für dies und das, und in einem Monat wiederkommen und hoffen, dass er funktioniert? Ich denke, es ist schwer zu sagen, ob sich der Aufwand immer lohnt . Wie Sie richtig sagen, mussten wir einiges an Arbeit in die Entwicklung investieren, aber hoffentlich wäre es sinnvoll, wenn es sich um einen Bereich handeln würde, in dem wir häufig arbeiten. Wenn wir also in einem Unternehmen arbeiten und viele Funktionen für Handelsstrategien oder Ähnliches entwickeln würden, müssten wir solche Änderungen ständig vornehmen. Und eine elegante Sprache zu haben, um diese schnell und einfach auszudrücken, wäre von Vorteil. Wenn wir nur eine einmalige Sache entwickeln würden, etwas völlig anderes als alles andere im System, wäre der Aufwand vielleicht nicht so groß. Aber ich denke, wenn es etwas im Kern gibt, das Wir werden an vielem arbeiten, und ich denke, es kann sich lohnen . Du scheinst dich deutlich mehr anzustrengen als ich. Ich glaube fast, du passt das Ganze an meine Bedürfnisse an, und ich denke, das stimmt im Moment. Aber wenn wir in einer Woche zurückkämen und du sagtest: „Oh, es gibt da eine neue Funktion, und wir müssen etwas mit bestimmten Kartenkombinationen machen“, und wir dann sagen würden: „Okay.“ Nun ja, eigentlich haben wir einen Großteil der sprachlichen Dinge bereits letzte Woche definiert. Hoffentlich müssen wir das also nicht noch einmal durchmachen . Wir haben uns sozusagen eine eigene Sprache geschaffen, die unser Problem sehr gut beschreibt. Und hoffentlich geht das Schreiben der neuen Teile sogar noch schneller, als wenn wir sie alle von Hand in den Code schreiben würden. Es erfordert also vielleicht etwas Vorarbeit, aber ich denke, dass wir durch die Diskussion über die Entdeckung der Terminologie und die Bedeutung der Konzepte und darüber, was diese Dinge wirklich sind, wertvolle Erkenntnisse gewonnen haben, insbesondere im Hinblick auf den Versuch, das Ganze überhaupt erst aufzubauen . Nutzt das wirklich irgendjemand? Macht das irgendjemand ? Ich glaube, es gibt eine kleine Gruppe von Leuten, die das in ihrem Implementierungscode tun . Entwickler sprachen immer davon, sauberen Code zu schreiben. Ich denke, so etwas wie lesbarer Code. Ich glaube, das geht noch einen Schritt weiter. Aber ich denke, seine Stärken kommen erst richtig zum Tragen, wenn man Tests schreibt, um die eigene Software zu testen. Heutzutage schreiben wir typischerweise eine ganze Reihe von Tests, um sicherzustellen, dass unsere Software korrekt ist. Wenn Ihr Test sehr verständlich ist und von der Person, die das System haben wollte, bestätigt werden kann, sodass diese sagen kann: „Dieser Test ist korrekt und wurde bestanden.“ Stellen Sie sicher, dass Ihre Software korrekt ist. Wenn ein Test bestanden wird, aber niemand genau versteht, was er bedeutet, kann man kaum Vertrauen darin haben . Wenn wir also diese Anstrengungen unternehmen, um Tests zu erstellen, die validiert werden können, indem ich Ihnen den Test zeige, den wir für das System geschrieben haben, und Sie sagen: „Das ist der richtige Test.“ Oder, genauer gesagt, in diesem Fall ist das nicht ganz korrekt, es sollte so sein, und dann führen wir diesen Test durch, und wenn dieser Test erfolgreich ist, dann bin ich zuversichtlich, dass wir das Richtige für Sie entwickeln. Und gibt es dazu vielleicht noch eine letzte Frage ? Offensichtlich haben Sie das in dieser speziellen Sprache in Java gemacht. Ist sie portabel oder ist das dasselbe Problem wie bei jedem anderen Code, den Sie portieren müssen? Die kleine Sprache, die wir entwickelt haben, ist nicht portabel. Und wenn wir das Gleiche in Python, JavaScript oder C# machen könnten, würden wir zwar etwas andere Tricks und Techniken verwenden, um die Sprache zu gestalten, aber ich denke, man könnte dieselbe Philosophie verfolgen: Ich versuche, den Code so zu schreiben, dass zumindest die Problembeschreibung auf oberster Ebene sehr verständlich ist , und lasst uns die Merkmale der jeweiligen Sprache nutzen, um dies zu erreichen, anstatt alles von Grund auf neu aufzubauen und zu sagen: „So drücke ich das Problem in meiner Sprache aus, und so sieht es aus .“ Mir gefällt es also viel besser, von dem aus ich das gewünschte Aussehen entwickle, anstatt es Schritt für Schritt aufzubauen und dann so zu gestalten. Ein mögliches Interleaving wäre beispielsweise, dass ich zuerst die Rechtsoperation auf X ausführe, also diese hier, und dann die Rechtsoperation auf Y. Die beiden Rechtsoperationen werden also ausgeführt, bevor ich mit den beiden Leseoperationen fortfahre. Als Ergebnis werden beide Lesevorgänge den aktualisierten Wert beobachten und beide den Wert eins lesen. Also, ich kann eins lesen. Eine weitere mögliche Verschachtelung ist