![]() | ![]() |
Home › JurPC Web-Dok. 141/2020 Subsumieren und Programmieren - die neue Doppelnatur der prozessualen Hilfsaufrechnung
JurPC Web-Dok. 141/2020, Abs. 1 - 179Viele Computerprogramme dürften aus einer Überlegung entstanden sein (oder zwei): „diese immer gleiche Abfolge von Denkschritten oder Handlungen schreite ich immer wieder ab - kann das nicht der Computer für mich tun?“, und: „Die Hälfte der Zeit rechne ich mit ‚krummen‘ Zahlen - kann der Computer das nicht ohnehin besser?“ Vielleicht kommt Ihnen ja jetzt oder während Sie weiter lesen genau diese eine juristische Tätigkeit in den Kopf, die die immer gleiche Rechnerei bedeutet? Behalten Sie sie im Kopf, vielleicht kommt Ihnen eine Idee zur Umsetzung dabei. Die wichtigen juristischen Entscheidungen fußen auf menschlichen Wertungen aufgrund einer soliden juristischen Ausbildung, Erfahrung und nicht zuletzt komplexen kommunikativen Prozessen. Das kann einem Richter (derzeit) kein Computer abnehmen. Aber ein grundlegendes Werkzeug, das Herz des juristischen Denkens, das Subsumieren, hat mit dem Programmieren mehr als die letzen beiden Silben gemeinsam. Das möchte ich beispielhaft an zwei Themenfeldern verdeutlichen, die jedem Juristen im ersten halben Jahr seiner praktischen Ausbildung begegnet sein dürften: der Hilfsaufrechnung und der Entscheidung über die vorläufige Vollstreckbarkeit. Zu diesem Zweck möchte ich Ihnen zunächst die typische juristische Denkabfolge beim Subsumieren unter Vorschriften zeigen (I.). Sodann möchte ich im Vergleich dazu vorführen, wie der Programmierer anhand von Algorithmen und Programmabläufen denkt, die der Computer Punkt für Punkt durchgeht (II.). Bevor ich darstellen kann, wie der Computer diese Prüfung bewältigen könnte, führe ich zunächst die juristischen Prüfungsschritte der prozessualen Hilfsaufrechnung und der Entscheidung über die vorläufige Vollstreckbarkeit eines Zivilurteils vor (III.). Es folgt der Blick in den Werkzeugkasten der Programmiersprache Java, welche Programmiertechniken bei diesen juristischen Themen helfen könnten (IV.). Die gesamte Darstellung steuert auf den Höhepunkt der Umsetzung in einem Java-Programm (V.) zu. Der Beitrag soll keine Einführung in die Informatik oder zum Programmieren in Java (oder anderen Sprachen) sein. Vielmehr möchte ich anhand eines juristischen Themas Appetit auf das Programmieren machen. Dazu gebe ich nur einen kleinen Einblick in eine Materie, die Sie dann anhand einer der zahlreichen Einführungen in die Programmiersprache Java vertiefen können. I. Juristisches DenkenDer Jurist denkt grundsätzlich anhand von Vorschriften. Hier möchte ich zeigen, was Subsumtion ist und wie Schemata dabei helfen können. Wann ist eine Vorschrift, ein Rechtssatz aber anwendbar? Man wendet einen Rechtssatz an und spricht dessen Rechtsfolge aus, wenn man den konkreten Lebenssachverhalt unter den Tatbestand subsumieren kann. Subsumtion ist die Unterordnung eines bestimmten Lebenssachverhalts unter den Tatbestand einer Rechtsnorm. Mit Tatbestand ist dabei die Summe der Merkmale gemeint, von deren Verwirklichung das Gesetz eine Rechtsfolge abhängig macht.[1] Wenn ich etwa einen Anspruch in dem aus dem Studium noch hinlänglich bekannten Gutachtenstil prüfe, was mache ich dann? Ich gebe eine Vorschrift an, deren Voraussetzungen auf den Sachverhalt oder deren Rechtsfolge wenigstens dem Begehr entspricht. Sodann nenne ich die Voraussetzungen der Vorschrift und prüfe sie der Reihe nach durch. Die ein oder andere Voraussetzung muss ich gegebenenfalls verschachtelt prüfen, weil sie ihrerseits Vor-Voraussetzungen hat. Vielleicht stehen diese Vorvoraussetzungen in anderen Normen, z.B. Hilfsnormen oder Definitionsnormen. Und auch, wenn ich keine juristischen Klausuren mehr schreibe, gehe ich gedanklich doch die tatbestandlichen Merkmale durch, bevor ich die Rechtsfolge annehme, der Klagepartei also etwa ihr zusprechendes Urteil gebe, um dieses zu begründen. Zu nicht wenigen Vorschriften habe ich irgendwann einmal ein Prüfungsschema gelernt, das ich im Kopf durchgehe. Dabei stellt das Schema mehr oder weniger die Gesetzesvorschrift dar, in Gliederungspunkte zerlegt und mit Erläuterungen versehen. Den Lebenssachverhalt betrachte ich dann nur im Hinblick auf die Tatbestandmerkmale und blende andere Aspekte aus (sofern sie nicht zu anderen Tatbeständen führen). Zum Beispiel könnte so ein Schema aussehen, um die Wirksamkeit einer Aufrechnung zu prüfen:
II. Informatisches DenkenWenn ich — als Fachfremder — sage, ein Informatiker (II.2.) arbeitet vor allem mit Algorithmen (II.1.), dann möchte ich diese Begriffe auch ganz kurz vorstellen. Zudem stelle ich als Parallele zum Prüfungsschema das Ablaufschema (II.3.) vor. 1. AlgorithmenEin Algorithmus ist eine Reihe von Anweisungen, die eine Aufgabe ausführen.[2] Oder man nennt ihn allgemein eine Anleitung, um aus Eingabedaten bestimmte Ausgabedaten zu produzieren und zurückzugeben.[3] Man kann das römische Rechtssprichwort als Algorithmus lesen: „da mihi facta, dabo tibi ius“, nämlich: „gib mir die Tatsachen (Eingabedaten), dann gebe ich dir das Recht (Ausgabedaten).“ Sodann kann man sich dieses Bild vorstellen: Anders als der allgemein gehaltene lateinische Rechtsspruch, stellt ein Algorithmus aber für ein einzelnes, eigentümliches Problem einen darauf bezogenen Lösungsweg dar. Um die Erinnerungen an den Matheunterricht zu bemühen, könnte man den Algorithmus auch einen Rechenweg nennen. 2. InformatikAls Informatik bezeichnet man die Wissenschaft von der systematischen Darstellung, Speicherung, Verarbeitung und Übertragung von Informationen, besonders der automatischen computergestützten Verarbeitung.[4] Im angelsächsischem Raum definiert man sich über die Untersuchung von Prozessen, die mit Informationen umgehen und die sich als Programme darstellen lassen.[5] Neben ihren mathematischen Ursprüngen hat sie sich aus dem Bedarf entwickelt, schnell und automatisch Berechnungen durchzuführen.[6] Den Namen prägte Karl Steinbruchs „Informatik: Automatische Informationsverarbeitung“ aus dem Jahr 1957.[7] 3. AblaufschemaEin Ablaufdiagramm veranschaulicht einen Arbeitsablauf, indem es eine Abfolge von Entscheidungen und Anweisungen vorschreibt.[8] Ein Ablaufdiagramm, das die einzelnen Operationen eines Algorithmus grafisch darstellt, nennt man Programmablaufplan (PAP) oder „flow chart“.[9] Ich habe im Informatikunterricht noch von ihnen gehört. In der Praxis sind sie jedoch selten geworden: stattdessen setzt man dort eher den im vorigen Teil (dort Abs. 18) beschriebenen Pseudocode ein. Trotzdem möchte ich kurz darauf eingehen, da Bilder veranschaulichen und ich die Ähnlichkeit zum Prüfungsschema schätze. Laut Wikipedia[10] werden hauptsächlich folgende Symbole nach DIN 66001 genutzt:
Später werde ich noch einmal auf ein solches Diagramm zurückkommen. III. Die juristische ProblemstellungEine Behauptung fordert ein Beweisangebot. Da ich behaupte, juristische und informatische Denkweisen ähneln sich, möchte ich das anhand der bereits erwähnten zwei Beispielen aufzeigen: Die prozessuale Hilfsaufrechnung und die vorläufige Vollstreckbarkeit sind jedem Volljuristen seit Beginn des Referendariats bekannt. Und sie lassen sich zudem zwar mit einprägsamen Schema, aber doch nur mit einem gewissen Rechenaufwand lösen. 1. Die prozessuale Hilfsaufrechnung - das Doppelnatürlichste der WeltDie Aufrechnung hat bekanntermaßen eine Doppelnatur und zwar gleich in mehrfacher Hinsicht. Sie ist Erfüllungssurrogat (sog. „Tilgungsfunktion“ hinsichtlich der Gegenforderung), und gleichzeitig Mittel der Vollstreckung (sog. „Vollstreckungsfunktion“ hinsichtlich der Hauptforderung). Erklärt der Beklagte gegenüber der Klageforderung die Aufrechnung mit einer (vermeintlich) bestehenden eigenen Forderung, so hat dies materiell-rechtliche Wirkungen wie auch prozessrechtliche: materiell-rechtlich die bekannten Wirkungen des Gestaltungsrechts, prozessrechtlich ist es eine Einrede. Die prozessuale Aufrechnung ist das „Doppelnatürlichste“ der juristischen Welt. a. GrundsatzDie materiell-rechtlichen Voraussetzungen wie Fälligkeit, Durchsetzbarkeit, Erfüllbarkeit möchte ich an dieser Stelle ausblenden und die Gleichartigkeit (meist sind beide Forderungen Geldforderungen) und die Wechselseitigkeit (beide Parteien sind an beiden Forderungen beteiligt, wenn auch in wechselnden Rollen) unterstellen. Es sei nur kurz erwähnt, dass die Mathematik auch materiell-rechtlich nicht zu kurz kommt. Stattdessen möchte ich mich auf die Folge konzentrieren.
Denn nur „soweit sie sich decken“, erlöschen die sich gegenüber stehenden Forderungen, § 389 BGB. Also der kleinere der beiden Beträge ist der maßgebliche, sofern Hauptforderung und Gegenforderung nicht gleich hoch sind. Vom vormaligen Betrag der höheren Forderung verbleibt das Ergebnis der Subtraktion <Betrag der höheren Forderung> minus <Betrag der niedrigeren Forderung>. Ist die höhere Forderung die Klageforderung, wird der Beklagte nur in Höhe der Differenz verurteilt. Ist die Klageforderung hingegen niedriger als die Aufrechnungsforderung, wird die Klage vollständig abgewiesen: Anders als in der Mathematik ist hier keine Verurteilung zu einem negativen Betrag möglich. Dass der Beklagte mit seiner Forderung in Höhe des noch verbleibenden Betrags eine Widerklage erheben könnte, soll uns hier nicht interessieren. Verteidigt sich der Beklagte ausschließlich mit der Aufrechnung gegen die Klageforderung, spricht man auch von einer Primäraufrechnung. Das ist aber nur der Fall, wenn der Beklagte die anspruchsbegründenden Tatsachen nicht bestreitet und keine weiteren Einreden vorbringt.[11] Der praktische Regelfall ist die Hilfsaufrechnung, d.h. neben der Aufrechnung bestreitet der Beklagte noch anspruchsbegründende Tatsachen oder bringt Einreden vor.[12] Das Zauberwort „hilfsweise“ muss nicht verwendet werden, ist aber der Regelfall. Der Beklagte kann gestaffelt mit mehreren Forderungen aufrechnen. Eine Vorschrift aus dem Gerichtskostengesetz GKG bringt die Rechnerei in die Streitwertentscheidung und damit auch in die Kostengrundentscheidung:
Und inwieweit ergeht eine der Rechtskraft fähige Entscheidung auch über die Hilfsaufrechnung? Auch zur Frage des Umfangs der Rechtskraft kann man das Gesetz befragen. Zu der Doppelnatur kommt hier ein Zweigespann. Das sagt nämlich wiederum die Zivilprozessordnung:
Die Aufrechnungsforderung erhöht den Streitwert also nicht in jedem Fall und auch nicht immer in voller Höhe. Ist etwa schon die Klageforderung für sich betrachtet gänzlich unbegründet, so erhöht die Hilfsaufrechnung den Streitwert gar nicht. Auch aus diesem Grund ist die Klageforderung (ich nenne die ursprüngliche Höhe hier kf.wert) immer zuerst zu betrachten, bevor man sich der Hilfsaufrechnungsforderung (ich nenne deren Ausgangshöhe hier af.wert) zuwendet. Wie berechnet man nun den Streitwert und das jeweilige Unterliegen der Parteien? Indem man Schritt-für-Schritt vorgeht, eins nach dem anderen. Die Haupt-Rechenschritte sind also folgende:
Der Streitwert erhöht sich nun um effektiverWert (die einfarbige Fläche des rechten Balkens). Parallel dazu schaue ich nun, wie hoch die Verluste der einzelnen Partei sind.
Die zuzusprechende Klageforderung verringert sich demgegenüber um effektiverErfolg. Dazu einmal ein Beispielsfall:[14] Mit seiner Klage verlangt der Kläger vom Beklagten, ihm 10.000 EUR zu zahlen. Der Beklagte bestreitet erheblich und rechnet zudem mit einer Forderung von 15.000 EUR auf, die wiederum der Kläger angreift. Das Gericht prüft: beide Forderungen bestehen. Der Streitwert zu Beginn ist wie gewohnt derjenige der Klageforderung, also 10.000 EUR.
Bei einem Streitwert von 20.000 EUR trifft den Kläger und den Beklagten jeweils ein Verlust von 10.000 EUR. Sie tragen die Kosten je zur Hälfte, sofern das Gericht nicht die Kosten gegeneinander aufhebt (§ 92 Abs. 1 ZPO). b. StaffelungIst nach dem ersten Durchgang noch etwas von der Klageforderung übrig und macht der Beklagte mehrere Hilfsaufrechnungen gestaffelt geltend, geht man die Rechenschritte mit der zweiten Hilfsaufrechnungsforderung und der verringerten Klageforderung von neuem bei 1 beginnend durch. Das kann dazu führen, dass sich der Streitwert stark erhöht.[15] Das macht man „immer wieder“ (dazu später, merken Sie sich diesen Ausdruck), bis entweder die zuzusprechende Klageforderung aufgezehrt ist oder keine Aufrechnungsforderungen mehr im Pfeilköcher des Beklagten stecken. Die Staffelung von Hilfsaufrechnungen ist rein sprachlich oft schwer zu vermitteln und verlangt nach grafischen Hilfsmitteln. Abwandlung zum Beispielfall:[16] Der Kläger verlangt Zahlung von 10.000 EUR. Der Beklagte bestreitet die Klageforderung und erklärt hilfsweise die Aufrechnung mit Gegenforderungen von
Da sich hier nicht jede schematische Lösung verbietet, führe ich daran meinen Dreischritt von eben vor. Erster Durchgang (zu Gegenforderung a)
Mit der auf 5.000 EUR reduzierten Klageforderung wage ich mich in den Zweiten Durchgang mit Gegenforderung b)
Bei einem Streitwert von 24.000 EUR spricht das Gericht dem Kläger demnach noch 4.000 EUR zu, sein Verlust ist 6.000 EUR (5.000+1.000), der Verlust des Beklagten beträgt 18.000 EUR (10.000+5.000+3.000). Die Kosten muss der Kläger demnach zu 25% (6.000 durch 24.000), der Beklagte zu 75% (18.000 durch 24.000) tragen. Und Kosten des Verfahrens können bei diesem Streitwert schon fast 6.000 EUR bedeuten (doch das ist eine andere Geschichte und soll ein anderes Mal erzählt werden). 2. Vorläufige VollstreckbarkeitAls zweite juristische Problemstellung möchte ich Ihnen die Entscheidung über die vorläufige Vollstreckbarkeit nahebringen. Dazu wiederhole ich die Vorschriften, rufe mir die Systematik ins Gedächtnis und ende mit einem kleinen Ablaufdiagramm. Das Urteil ist grundsätzlich nur vollstreckbar, wenn es rechtskräftig ist, sagt § 704 ZPO. Das kann den Gläubiger u.U. über Gebühr belasten, da er das Insolvenzrisiko des Schuldners trägt, während er auf die Rechtskraft wartet.[17] Eine Ausnahme besteht deshalb, wenn das Urteil (im Tenor) für vorläufig vollstreckbar erklärt wurde.
Urteile mit vollstreckbarem Inhalt sind daher grundsätzlich für vorläufig vollstreckbar zu erklären. Eine Anordnung der vorläufigen Vollstreckbarkeit schon vor Rechtskraft eines Urteils würde ohne Weiteres aber wiederum den Schuldner unzumutbar belasten: Wenn sich das Urteil nach der Vollstreckung nämlich in höherer Instanz als falsch herausstellt, vom Gläubiger aber nichts mehr zu holen ist.[18] Deshalb ordnet das Gericht im gesetzlichen Grundfall des § 709 ZPO die vorläufige Vollstreckung nur gegen eine Pflicht zur Sicherheitsleistung an. Kann der Schuldner seine Rückforderungen nicht mehr gegen den Gläubiger richten, kann er auf die Sicherheit zurückgreifen. Nur in einzeln aufgezählten Fällen des § 708 ZPO verzichtet das Gericht auf eine Sicherheitsleistung. Der wichtigste Fall ist der Fall sogenannter Bagatellurteile.[19] Der Gläubiger kann ohne Sicherheitsleistung grundsätzlich vollstrecken. Der Schuldner ist trotzdem nicht schutzlos gestellt: wegen § 711 ZPO, aber der trifft eine andere Abwägung der Interessen: Will der Schuldner die Vollstreckung verhindern, kann er selbst Sicherheit leisten, in Höhe des gesamten Werts, der aufgrund des Urteils vollstreckbar ist. Er versetzt damit den Gläubiger in die Lage, in der er bei Anordnung der Vollstreckbarkeit gegen Sicherheitsleistung wäre: er (der Gläubiger) muss jetzt Sicherheit leisten, wenn er vollstrecken will. Trotzdem ist er in einer besseren Lage: wenn er mit der Vollstreckung wartet, besteht zu seinen Gunsten eine Sicherheit.
Auch zu § 711 ZPO besteht eine Ausnahme: Die Pflicht zur Sicherheitsleistung gemäß § 713 ZPO entfällt ohne Abwendungsbefugnis, wenn die Zulässigkeitsvoraussetzungen für ein Rechtsmittel gegen das Urteil unzweifelhaft nicht vorliegen, es aber noch nicht rechtskräftig ist. So will das Gesetz vermeiden, dass die unterlegene Partei ein aussichtsloses Rechtsmittel einlegt, um die Vollstreckung hinauszuschieben.[20] Das sind vor allem die Fälle, in denen der Rechtsmittelwert nicht erreicht ist.
Mein Vorschlag zu einer Prüfung ist, mit diesem Punkt anzufangen, da er sich leicht prüfen lässt. Der § 511 Abs. 2 Nr. 1 ZPO fordert, dass die Beschwer 600 EUR übersteigt. Dabei ist auf jeden Beteiligten gesondert abzustellen: ist für diesen die Beschwer nicht mehr als 600 EUR? Die Frage muss man für alle Parteien bejahen können, damit man insgesamt ein Rechtsmittel ausschließen kann. Einfach ist die Frage dann für alle Seiten zu bejahen, wenn der Streitwert insgesamt nicht mehr als 600 EUR beträgt. Bei einem Streitwert bis 1200 EUR besteht zudem die Möglichkeit, dass für jeden einzelnen die Beschwer die Grenze nicht überschreitet (Teilunterliegen). Überschreitet die Beschwer auch nur für eine Partei die Rechtsmittelgrenze, so entscheidet das Gericht im nächsten Schritt, ob es die vorläufige Vollstreckbarkeit gegen Sicherheitsleistung anordnet oder stattdessen eine Abwendungsbefugnis ausspricht. Dafür trennt es zunächst die Vollstreckungsverhältnisse. Wer kann gegen wen was vollstrecken? Da Widerklagen in diesem Beitrag außer Betracht bleiben sollen, kann in der Hauptsache lediglich der Kläger vollstrecken. Auch diese Möglichkeit entfällt, wenn das Gericht die Klage vollständig abweist. Aus der Kostenentscheidung hingegen können unter Umständen (in Kombination mit einem Kostenfestsetzungsbeschluss) beide Seiten vollstrecken. Beispiel: Die Prüfung kann z.B. so ausgehen, dass der Kläger bei einem Streitwert von 3.000 EUR hinsichtlich der Hauptsache 1.500 EUR und der Hälfte der Kosten vollstrecken kann (ca. 460 EUR), der Beklagte die Hälfte seiner Kosten (ca. 300 EUR). Dann fällt die Entscheidung, ob sich die vorläufige Vollstreckbarkeit bei dem jeweiligen Vollstreckungsverhältnis nach § 708 Nr.11 oder § 709 ZPO richtet. Hinsichtlich der Hauptsache ist im Beispiel die Grenze von 1.250 EUR überschritten, in der das Gericht die vorläufige Vollstreckbarkeit ohne Sicherheitsleistung aussprechen könnte. Für den Kläger richtet sich die Vollstreckbarkeit nach § 709 ZPO. Hinsichtlich der Vollstreckung der Kosten gilt eine andere Grenze, nämlich 1.500 EUR. Da die Parteien zu diesem Zeitpunkt des Verfahrens ihre Kosten üblicherweise noch nicht vollständig angemeldet haben, kann die Höhe der Kosten nur überschlagsmäßig geschätzt werden, so auch im Beispiel oben. Da der Kläger bereits aus dem Urteil in der Hauptsache vollstrecken kann, werden seine Kosten (deutlich unter 1.500 EUR) nicht betrachtet („nur über die Kosten vollstreckbar“). Anders beim Beklagten: Er kann aus der Hauptsache nicht vollstrecken. Für sein Vollstreckungsverhältnis kommt es also darauf an, welche Kosten er vollstrecken kann. Im Beispiel sind das ca. 300 EUR, die Hälfte der üblicherweise bei einem Streitwert von 3000 EUR auf Beklagtenseite anfallenden Anwaltsvergütung (Verfahrensgebühr, Terminsgebühr und Umsatzsteuer). Dieser Betrag überschreitet 1500 EUR nicht. Für den Beklagten richtet sich die Vollstreckbarkeit nach §§ 708 Nr.11, 711 ZPO. Als Ablaufplan möchte ich diese Prüfung einmal wie folgt darstellen: Die Bedeutung der Symbole hatte ich oben unter II.3. dargestellt.
3. Kombination: vorläufige Vollstreckbarkeit und HilfsaufrechnungIm Grundsatz lassen sich vorstehenden Überlegungen auch auf die Fälle übertragen, in denen eine Hilfsaufrechnung vorliegt. Man muss jedoch Besonderheiten beachten, wenn man die Unanfechtbarkeit prüft. Denn der Rechtsmittelstreitwert bzw. die Beschwer ist grundsätzlich vom Gebührenstreitwert zu unterscheiden, den § 45 GKG behandelt. Wann ist also die Beschwer nicht über der Rechtsmittelgrenze? Was beschwert den Kläger? Egal, wie viele Hilfsaufrechnungen gestaffelt sind: der Kläger unterliegt maximal in Höhe seiner Klageforderung, namentlich in Höhe der Differenz zwischen Klageforderung und dem zugesprochenen Betrag. Die Beschwer des Beklagten ist höher: Sie besteht zum einen aus dem Betrag, zu dessen Zahlung ihn das Gericht verurteilt hat, aus dem abgesprochenen Teil der Aufrechnungsforderungen, soweit die Entscheidung darüber der Rechtskraft fähig ist (in der Rechnung oben, III.1.a. hatte ich ihn effektiverWert genannt), denn auch insoweit hat er das Verfahren verloren. Aber auch die erfolgreiche Aufrechnung ist hinzuzurechnen, denn eigentlich hatte der Beklagte die Klageforderung in dieser Höhe vorrangig (Hilfsaufrechnung) auf andere Weise zu Fall bringen wollen.[21] Für den Rechenweg kann ich also auf die Berechnung des Streitwerts oben verweisen. Nur ist nicht der Streitwert der Klage der Ausgangspunkt, sondern allein der Verlust des Beklagten daran.[22]
IV. Handwerkszeug des ProgrammierensUm diesen Ablauf in Java™ umsetzen zu können, möchte ich einige Befehle und Techniken vorstellen. Zuerst führe ich einfache Befehle und Strukturen auf (IV.1.), dann Mehrheiten von Dingen (IV.2.), dann Wiederholungen (IV.3.) und letztlich Wenn-Dann-Sonst-Entscheidungen (IV.4.). 1. Einfache Abläufe (eins nach dem anderen)a. Grundsätzlicher AblaufDer Urtyp des Programms ähnelt der Prüfung der §§ 387—395 BGB nach dem Schema unter I.: der Computer arbeitet einen Punkt nach dem anderen ab. Im Beispiel unter I. liefe zum Beispiel ein Programm so ab: erst Prüfung der Aufrechnungserklärung, dann Prüfung der Aufrechnungslage, dann Prüfung der Wirkung. Da der Computer hier praktisch einen Befehl nach dem anderen befolgt, nennt man Programmiersprachen dieser Art „imperativ“,[23] heute meist in der Erweiterung als „prozedurale Programmierung“.[24] Eine weitere prominente Vertreterin ist die Programmiersprache C, Pionierin war Fortran. Auf diese Weise zu programmieren, nennt sich dann „imperatives Programmierparadigma“ (Wenn Sie dieses Wort auf einer Party bringen, brauchen Sie sich über Social Distancing keine Sorgen zu machen). Auch in imperativen Sprachen teilt man das Gesamtkonzept häufig in überschaubare Teilprobleme auf, die von Prozeduren (Unterprogrammen) mit vordefinierten Parametern gelöst werden. Daher der Name der „prozeduralen Programmierung“. Der Computer geht dabei ähnlich vor wie ein Jurist, wenn er eine Aufrechnung nach dem Schema nach §§ 387—395 BGB prüfen muss und hier insbesondere prüft, ob die Aufrechnungsforderung „fällig“ ist. Hier würden Sie wahrscheinlich „abzweigen“ und etwa nach § 271 Abs. 1 BGB prüfen, ob eine Leistungszeit vertraglich bestimmt ist oder sich aus den Umständen ergibt. Nach Abschluss dieser Prüfung würden Sie dann zur Prüfung der weiteren Prüfungsschritte zu den §§ 387—395 BGB zurückkehren. Das heißt aber nicht, dass andere Programmiersprachen dies nicht unterstützen, praktisch jede Programmiersprache unterstützt auch imperatives Programmieren.[25] Auch im eigentlich Objekt-orientierten Java kann man imperativ programmieren. Die Anweisungen „tu dies, tu das, tu jenes“, muss man aber in einer Klasse unterbringen. In der Objektorientierung haben die Klassen ihre Methoden, die den Prozeduren ähneln. Diese müssen vorher in eine Klasse eingebettet werden. b. Einzelne BefehleDer anfänglich
gewöhnungsbedürftige Befehl
In dem juristischen Beispiel zur
Hilfsaufrechnung habe ich viele Platzhalter (Variablen) genutzt.
Diese braucht man in der Programmierung in ungeahnter
Häufigkeit, denn so reserviert der Computer Speicherbereiche.
Diese muss man zwingend deklarieren: so weist man ihnen einen Typ
zu. Es gibt in Java folgende sogenannte primitive Typen, also Typen,
die keine Objekte sind: vor allem
Es ist erlaubt, aber nicht vorgeschrieben, der Variable direkt auch einen Wert zuzuweisen:
Der Wert kann danach beliebig oft geändert
werden, etwa mit Rechenoperationen. Dabei wird der Typ nicht erneut
angegeben. Als Rechenoperationen gibt es
Dies erhöht den vorigen Wert von i um 10. Soll der Wert unveränderlich sein, also
endgültig, schreibt man das Schlüsselwort „
Methoden schreiben Sie in Java in der Form <Optionen> <Rückgabetyp> <Methodenname> (<Parameter>), gefolgt von einem Anweisungsblock, etwa
public ist die Option dafür, dass man die Methode
auch überall außerhalb der Klasse aufrufen kann. Der
Rückgabetyp ist hier auf long gesetzt. Soll die
Methode gar nichts zurückgeben, setzt man den Typ auf
„leer“, englisch: void. Als Methodenname
habe ich hier berechneStreitwert gewählt.
Methodennamen beginnen in Java konventionell mit Kleinbuchstaben.
Als Parameter bekommt die Methode ein Array (dazu sogleich, IV.2.) mit Elementen der Klasse Forderung
übergeben. Anweisungsblöcke werden in Java wie in C in
geschweifte Klammern eingeschlossen: {...}. Weil ein
Rückgabetyp angegeben ist, müsste ich noch mit der
Anweisung return ...; einen long
zurückgeben. Hätte ich mit void auf einen
Rückgabetyp verzichtet, könnte ich mir das sparen.
In dem folgenden Beispielprogramm gibt es genau
eine Methode „
Da Java sich in vielen Punkten an der Programmiersprache C orientiert, hat es auch einen Befehl übernommen, um den Wert einer Variablen um genau 1 zu erhöhen (sogenanntes Inkrementieren):
Das ist das gleiche wie „
c. KlassendiagrammeKlassendiagramme sind eine schematische Darstellung einer Klasse,[26] in denen man ihre Eigenschaften (Variablen) und Methoden/Operationen (Unterprogramme) darstellt. Schon im ersten Teil hatte ich die Klassen mit solchen Schemata dargestellt, ohne sie ausdrücklich als Klassendiagramm zu bezeichnen. Die Klassendiagramme baue ich so auf, dass ich
unter dem Namen nach der ersten Trennlinie zunächst die
Eigenschaften aufführe. Entsprechend der üblichen
Schreibweise nenne ich den Typ der Variable erst nach dem
Variablennamen — also umgekehrt der Java-Schreibweise —,
getrennt durch einen Doppelpunkt. Ein kleines Pluszeichen Im folgenden Beispiel zeige ich die später
benötigte Klasse
2. Arrays und Listen: Arrays, Listen und (besser) Objekte mit StrukturDie Computerei wird auch Datenverarbeitung (EDV) genannt. Der Computer verarbeitet also Daten. Diese speichert er zum einen in Variablen, also kleinen Datenportionen, und spricht sie auch so an. Oft benötigt man aber Sammlungen von Daten. In dem Beispiel zur Hilfsaufrechnung kam etwa eine Sammlung von Forderungen vor (Klageforderung und mehrere Aufrechnungsforderungen), in dem Beispiel zur vorläufigen Vollstreckbarkeit gab es mehrere Vollstreckungsverhältnisse. Außerdem habe ich mehrere Forderungshöhen, Streitwerte und Verluste gezeigt. Datensammlungen gibt es in verschiedenen Varianten. Die grundlegende Variante ist das Array, zu
deutsch Feld oder Reihe.[27]
Es speichert eine vorab bestimmte Anzahl von Daten desselben Typs,
zum Beispiel 100 ganze Zahlen oder 50 Zeichenketten. Manche
vergleichen ein Array mit einem Buchregal,[28] andere mit einem Setzkasten.[29] Der Programmierer ruft dann die
Inhalte über den Index ab, etwa Die andere Möglichkeit, mehrere Daten
(Elemente) vom gleichen Typ zu sammeln, sind Listen. Ich habe sie im
Informatikunterricht noch als verkettete Listen kennengelernt, in
der damals beliebten Programmiersprache Turbopascal. Jedes Element
besteht nicht nur aus dem eigenen Wert, sondern zeigt auch bei einer
solchen Liste auf die Speicheradresse des jeweils nächsten
Elements. Da der Speicherbereich nicht zusammenhängend sein
muss, lassen sich neue Elemente beliebig hinzufügen: nicht nur
ans Ende, sondern auch mitten darin. Im Informatikunterricht mussten
die Schüler damals selbst die Zeiger biegen. In Java sind die
Funktionen einfach integriert, der Programmierer merkt nichts von
der Ablage in den Speicher. Er fügt ein Element mit der Methode
Java bietet sogar eine Kombination aus beidem,
die Eine weitere Möglichkeit, mehrere Daten an
einer Stelle zu halten, ist das Objekt. Zu Objekten und der
objektorientierten Programmierung hatte ich ja schon im ersten Teil
(unter III.,
Abs. 11) geschrieben. Ein Vorteil der Sammlung dieser Art ist,
dass die Eigenschaften (also die Einzeldaten) verschiedenen Typen
angehören können, also die erste Eigenschaft eine Ganzzahl
(Integer oder int), die zweite ein Dezimalbruch (eine sogenannte
Fließkommazahl, Float oder Double bzw. float oder double) sein
kann und die dritte eine Zeichenkette. Zudem ist es möglich,
jeder Eigenschaft eine besondere Bedeutung zuzuweisen. So
könnte man die Höhe der Klageforderung und die Höhe
des Erfolgs der Klageforderung in ein Array oder eine Liste mit der
Länge 2 speichern. Der Index 0 wäre dann die
Forderungshöhe und der Index 1 die Erfolgshöhe. Das
müsste man sich dann nur merken. Wenn ein weiterer
Programmierer den Programmcode verstehen muss, weil er das Team
verstärkt, müsste man es ihm erklären. Besser ist es
in so einem Fall, dass die Einzelelemente bestimmte Bedeutungen
haben, ein Objekt mit Eigenschaften zu entwerfen, die man dann
benennt. So könnte man eine Klasse Nehme ich eine Instanz (d.h. ein Exemplar) 3. SchleifenWiederholung ist die Mutter jedes Studiums, sagt der Lateiner (Horaz). Wiederholungen gefallen nicht, sagt der Dichter (auch Horaz). Horaz hielt Wiederholungen dann wohl für unbeliebt, aber nötig. „Immer das Gleiche“, sagt der Informatiker.[30] Erinnern Sie sich noch, wie ich oben schrieb: „immer wieder“? Bei der gestaffelten Hilfsaufrechnung bin ich dieselben 3 Schritte immer wieder durchgegangen. In der Programmierung sagt man zu dem
„immer wieder“ einfach „Schleife“. Schleifen
unterscheiden sich je nach Bedürfnis und Programmiersprache.
Aber sie sind grundsätzlich ähnlich aufgebaut wie die
Suche nach einem freien Parkplatz in Köln-Ehrenfeld: so lange
immer wieder dieselbe Runde abfahren, solange (englisch „ Die einfache „
Oder:
Der Unterschied ist, dass der Computer bei der ersten Variante die Bedingung vor jedem Durchlauf prüft. Ist die Bedingung von Anfang an nicht erfüllt (bereits vor dem ersten Herumkurven findet man einen Parkplatz), durchläuft er die Schleife kein einziges Mal. Bei der zweiten Variante prüft der Computer die Bedingung immer am Ende eines Schleifendurchlaufs; die Schleife wird also immer mindestens einmal durchlaufen. Häufiger nutze ich eine Erweiterung dieser
Schleife, die die Durchläufe mitzählt. Denn häufig
muss man genau fünf Brötchen backen, zwanzig
Schäfchen zählen, 100 mal „ROMANI ITE DOMUM“
schreiben usw... Die Anweisung würde dann heißen:
für (englisch „ Die Syntax in Java, also die vorgeschriebene Befehlsfolge, ist an die Programmiersprache C angelegt und vielleicht nicht unmittelbar einleuchtend. Man behält am besten im Hinterkopf, dass die klassische for-Schleife im Grunde eine while-Schleife mit Zähler ist. „Schreibe 100 mal ‚ROMANI ITE DOMUM‘“,[31] würde als while-Schleife so aussehen:
Die Zählervariable
Will man die (fiktive) Methode „
Moderne Sprachen bieten noch eine erweiterte
„
Für jeden Schleifendurchgang nimmt Java ein
neues Element aus der Sammlung „ 4. Immer diese Entscheidungen: if/then/elseNur sehr wenige Programme sollen völlig unkontrolliert vor sich hin rechnen. Ein Programm zur vorläufigen Vollstreckbarkeit sollte z.B. eine andere Entscheidung vorschlagen, wenn der Streitwert über oder bis 600 EUR liegt. Programmiersprachen halten daher Elemente bereit, mit denen man den Programmablauf steuern kann. Man nennt sie Kontrollstrukturen.[33] Wenn-Dann-Gedankengänge sind sowohl für die Informatik, wie auch für Rechtsanwendung typisch.[34] Viele Rechtssätze beruhen auf der Vorstellung, dass ihre Rechtswirkung gerade dann eintritt, wenn ihre Voraussetzungen vorliegen.[35] Ich verweise nur auf die o.g. Überlegungen zur vorläufigen Vollstreckbarkeit: wenn das Urteil nicht mit einem Rechtsmittel angegeriffen werden kann, dann richtet sich die vorläufige Vollstreckbarkeit nach § 708, § 713 ZPO. Wenn in der Hauptsache nicht mehr als 1250 EUR vollstreckbar sind, dann richtet sich die vorläufige Vollstreckbarkeit nach § 708 Nr.11, § 711 ZPO. Ansonsten kann das Gericht die vorläufige Vollstreckbarkeit nur gegen Sicherheitsleistung anordnen, § 709 ZPO. In der abstrakt immer noch an die englische
Sprache angelehnte Programmiersprache Java dient das
Schlüsselwort
{}
weglassen.
Die Und sonst? Wenn der Computer dann (und nur
dann), wenn die Bedingung nicht zutrifft, etwas bestimmtes
ausführen soll, kann man ihm das mit dem Schlüsselwort
// leiten Kommentare ein: Java ignoriert
jeglichen Text danach bis zum Ende der Zeile.
Nein, aber... Befehle, die Java ausführen
soll, wenn zwar die erste Bedingung nicht zutrifft, aber eine
andere, lassen sich mit einem „
Sie haben es sicherlich gemerkt: die zweite Bedingung, die zu § 708 Nr. 11 ZPO führt, ist unvollständig formuliert. Eigentlich müsste sie lauten: wenn in der Hauptsache nicht mehr als 1250 EUR vollstreckbar sind ODER nur Kosten vollstreckbar sind UND diese 1500 EUR nicht übersteigen. Die Wörter, die ich da hervorhebe, nennt man logische Operatoren. Diese Operatoren haben eine schärfer abgegrenzte Bedeutung als in der alltäglichen Sprache. Sie verbinden Wahrheitswerte in klar definierter Weise.
Dazu folgt ein Entscheidungsdiagramm, bei dem
horizontal die Werte für
(false || false) = false; (true || false) = true;
(false && false) = false; (true && false) = false; Nun erweitere ich mein Beispiel von eben: Meine
Methode von eben erhält jetzt vollstreckbaren Betrag in der
Hauptsache und in den Kosten jeweils als Parameter vom Typ
Zu dem ersten „ Wenn man UND und ODER in einer einzigen Abfrage
mischt, sollte man mit Klammern arbeiten, um keine
unerwünschten Ergebnisse zu bekommen. Warum? Grundsätzlich
wertet Java die Wahrheitswerte von links nach rechts aus. Aber: Java
beachtet dabei eine Rangfolge der Operatoren. Was ist eine
Rangfolge? Ähnlich wie die Regel „Punktrechnung vor
Strichrechnung“ haben einige Operationen in Java sozusagen die
„Vorfahrt“ vor anderen. „Punkt vor Strich“
bedeutet in Java, dass die Operatoren
führt Java zuerst die Berechnung „
Ein solches Rangverhältnis gibt es auch
zwischen Als dritten Operator sollte man den
Umkehrungsoperator „NICHT“ kennen, der den Wahrheitswert
einer Bedingung umkehrt: NICHT bedingung. Aus „ Habe ich etwa eine Methode „
Also im Zusammenhang:
V. Umsetzung in ein ProgrammDarauf läuft es natürlich hinaus, dass ich zu den vorgestellten Techniken und Überlegungen noch die Umsetzung in Programmcode liefere, und zwar zunächst die Klassendiagramme (vgl. oben IV.1.c) der für die Hilfsaufrechnung nötigen Klassen Forderung, KlageForderung und AufrechnungsForderung (1.), dann den Programmcode der eigentlichen Klasse zur Berechnung der Hilfsaufrechnung AngriffsVerteidigungsmittelStaffelung (2.) und zuletzt das Klassendiagramm der Klasse Vollstreckbarkeit mit dem Programmcode der Methode, die §§ 709 und 708 Nr. 11 ZPO abgrenzt (3.). Die eigentliche Berechnung werde ich als Programmcode wiedergeben. Daneben brauche ich aber auch Klassen, die bestimmte Daten repräsentieren, vor allem Klageforderungen und Gegenforderungen. Diese wiederzugeben, würde den Text aufblähen und Sie langweilen. Deshalb fasse ich diese Klassen als Klassendiagramm zusammen. 1. Forderung, Klageforderung, AufrechnungsforderungUm die Streitwerterhöhung und die
Kostenquoten bei der Hilfsaufrechnung zu berechnen, brauche ich die
Elternklasse
2. Hilfsaufrechnung: Hauptsache-, Kosten- und Streitwertentscheidung
3. VollstreckbarkeitDie Klasse Vollstreckbarkeit stelle ich mit
einer Besonderheit dar: Erst zeige ich Ihnen das Klassendiagramm,
denn diese Klasse dient vor allem der Datenhaltung. Eine Methode
stelle ich aber im Anschluss ausführlich dar, denn sie
enthält den Programmcode, um §§ 709 von 708
Nr. 11 ZPO zu trennen. Sie gibt hier eine Instanz der Klasse
zurück, deren Werte sie je nach Prüfungsergebnis setzt.
Sie werden sehen, dass die Variablennamen den Paragraphen
entsprechen, also steht
VI. ZusammenfassungIch hoffe, Sie können mir nun zustimmen, dass Juristen und Programmierer durchaus ähnlich denken. Sei es, dass sie Denkschritte verschachelten, einige Schritte immer wieder ausführen und Wenn-Dann-Konstruktionen lieben. Vielleicht stimmen Sie mir nun auch darin zu, dass viele juristische Denkschritte sich gut als Programm umsetzen lassen, vor allem die rechenlastigen. Vielleicht haben Sie sogar Lust bekommen, Ihr meist geliebtes juristisches Problem als Programm umzusetzen. Die Bereiche der ZPO, die ich hier vorstelle, sind auch Teil eines Java-Programms, das Sie sich unter https://www.kostentenor.de herunterladen können. Fußnoten* Fortsetzung des Beitrags in jurPC Web-Dok 189/2014. Dr. iur. Peter Felix Schuster ist Richter am Landgericht in Düsseldorf und derzeit abgeordnet zum Ministerium der Justiz des Landes Nordrhein-Westfalen. Der Verfasser dankt Herrn Prof. Dr. Maximilian Herberger für die Anregung zu diesem Artikel sowie seiner Frau, Ri.inAG Dr. Agnes Schuster, und RiLG Dr. Daniel Lübcke für wertvolle Hinweise und Anregungen. Der Artikel gibt nur die persönliche Meinung des Verfassers wieder. [1] Musielak, GK BGB, Rn 19-20. [2] Vgl. Bhargava, Algorithmen kapieren, 2019, S. 19; Anschaulich nennt Herberger (jurPC 1989, S. 2—7, S. 6) den Algorithmus: einen „Weg vom ‚Problem‘ zur ‚Lösung‘“. [3] Vgl. Boockmeyer u.a., Fit fürs Studium Informatik, 2017, S. 28. [4] Vgl. de.wikipedia.org/wiki/Informatik, Abruf vom 02.08.2020; Herberger (a.a.O., S. 4) fasst den Arbeitsbereich zusammen als „Datenstrukturen und deren Verarbeitung“. [5] Vgl. en.wikipedia.org/wiki/Computer_science, Abruf vom 02.08.2020. [6] Vgl. de.Wikipedia, ebenda. [7] Vgl. de.wikipedia.org, ebda. [8] Vgl. de.wikipedia.org/wiki/Ablaufdiagramm, Abruf vom 02.08.2020. [9] Vgl. de.wikipedia.org/wiki/Programmablaufplan, Abruf vom 02.08.2020. [10] Vgl. de.wikipedia.org/wiki/Programmablaufplan, Abruf vom 02.08.2020. [11] Vgl. Anders/Gehle, Das Assessorexamen im Zivilrecht (im Folgenden: Anders/Gehle), 12. Auflage, Rn. G-15. [12] Vgl. Vgl. Anders/Gehle, Rn. G-16. [13] Vgl. etwa LG Lübeck, Beschl. vom 07.07.2015, Az. 7 T 335/15: Klageforderung von 880,60 EUR, Aufrechnung mit 5.148,28 EUR, Streitwert 1.761,20 EUR (zweimal 880,60 EUR). [14] Nach Anders/Gehle, G-22. [15] Vgl. dazu etwa OLG Düsseldorf, Beschl. vom 21.08.2009, Az. 5 W 58/08, III.2.c: Streitwert 23.000,00 EUR bei einer Klagesumme von 11.000,00 EUR; auch OLG München, Beschl. vom 11.12.2017, Az. 9 W 1897/17, Rn. 5. [16] Nach Anders/Gehle, G-22, G-23. [17] Vgl. Oberheim, Zivilprozessrecht für Referendare, 11. Auflage, Rn. 546. [18] Vgl. Oberheim, Rn. 546. [19] Oberheim, Rn. 549. [20] Vgl. Oberheim, Rn. 552. [21] Vgl. BGH, Beschl. vom 09.07.2009, Az. IX ZR 135/08; Oberheim, Rn. 1219; Eicker, JA 2020, S. 48, 55; Zöller/G. Vollkommer, ZPO, § 322, Rn. 17; hinsichtlich vollständigen Nichtbestehens der Aufrechnungsforderung BGH, Urteil vom 01.06.1967, Az. II ZR 130/65, Rn. 8 bei juris; Rosenberg/Schwab/Gottwald, Zivilprozessrecht, § 135 Rn. 33. [22] Vgl. Thomas/Putzo/Reichold, ZPO, 37. Aufl., 2016, § 511, Rn16. [23] Lat. imperare = befehlen, vgl. de.wikipedia.org/wiki/Imperative_Programmierung, Abruf vom 02.08.2020. [24] Vgl. de.wikipedia.org/wiki/Prozedurale_Programmierung, Abruf vom 02.08.2020. [26] Vgl. Ullenboom, Java ist auch eine Insel, Kap. 3.3.2. [27] Vgl. Ullenboom, Java ist auch eine Insel, Kap. 3.8. [28] Vgl. Broockmeyer u.a., Fit fürs Studium Informatik, Kap. 3. [29] Vgl. Ullenboom, Java ist auch eine Insel, Kap. 3.8. [30] Vgl. Ullenboom, Java ist auch eine Insel, Kap. 2.6. [31] Wer den Film „Das Leben des Brian“ nicht kennt, sei an dieser Stelle eingeladen, ihn sich anzusehen. [32] Vgl. Ullenboom, Java ist auch eine Insel, Kap. 2.6. [33] Vgl. Habelitz, Programmieren lernen mit Java, 1. Aufl. 2012, Kap. 3 Einleitung. [34] Vgl. auch Schwintowski, Rethinking Law 2020 (1), 54ff., Digitalisierung des rechtlichen Subsumtionsprozesses: „Rechtssätze haben eine spezifische Wenn-Dann-Architektur“, dort für § 433 BGB; L. Philipps, „Rechtssätze in einem Expertensystem - am Beispiel der Willenserklärung eines Minderjährigen“, in: Fiedler et.al., Automatisierung im Recht, 1986, S. 96—114, 98: „Der Wenn-Dann-Satz ist die typische Form Naturgesetzes und nach vorherrschender Meinung auch die des Rechtssatzes“. [35] Gmür, Rechtswirkungsdenken in der Privatrechtsgeschichte, Bern, 1981, Seiten 26, 66. [36] Ullenboom, gibt in Java ist auch eine Insel, Kap. 2.4.9, eine vollständige Rangliste, streitet aber ebenfalls ab, diese auswendig zu kennen. |