Dies ist ein neues Blog, geschrieben von Christian Meesters, Computational Scientist in Mainz:

Wegen eines Rechenfehlers wird die Sanierung des Burgbergtunnels bei Bernkastel-Kues deutlich teurer. Bei der Berechnung des benötigten Betons wurde zuerst Quadrat- statt Kubikmeter verwendet.

Ui, sind die doof!

Diese Meldung hat mich an etwas denken und mich meinen Erstlingstext komplett überarbeiten lassen. Denn mir kam eine Anekdote in den Sinn, die meine Kollegen und Kolleginnen vielleicht zum Überdruß kennen: Während meiner Promotion habe ich eine Software zur Modellierung der Konformation von Proteinkomplexen gegen Röntgenstreudaten geschrieben. Kurz gesagt: Damit konnte die Gestaltsänderungen von großen Eiweißen nachvollzogen werden. Zwei Wochen lang habe ich mich mit einem Problem herumgeschlagen: Was auch immer ich änderte – meine Moleküle “explodierten”. Nach langem Suchen bin ich schließlich auf die Ursache gekommen: Ich hatte Radius und Durchmesser der Atome verwechselt!

Auch ich mache – ehrlich gesagt – kleine, vermeidbare Fehler bei Schreiben von wissenschaftlichem Code. Ich kann nicht sagen, warum den Verantwortlichen besagter Tunnelsanierung dieser Fehler unterlaufen ist. Wichtig ist: Niemand ist vor solchen Fehlern sicher!

Bekannt ist, dass in so ziemlich jedem Softwarecode Fehler schlummern und die Zahl der Fehler pro Codezeilen unabhängig ist von der gewählten Programmiersprache.

Anfänger machen andere Fehler

Ab und an unterrichte ich Programmierung. Und das ist nicht leicht, weil jedem Programmierunterricht einige Schwierigkeiten innewohnen – aber darüber möchte ich ein anderes Mal mehr schreiben. Wichtig ist: Anfänger machen immer wieder bestimmte Fehler. Da muss ich tolerant sein, ich war auch mal Anfänger. Und ich bin überzeugt: Die gute Verwendung einer Programmiersprache lernt man nicht in einem Kurs, sondern durch Anwendung. Das ist ganz ähnlich wie beim Lernen von natürlichen Sprachen (in der Schule habe ich bestenfalls Grundlagen gelernt).

In meinem aktuellen Job habe ich täglich mit dem Code anderer Leute zu tun. Ich arbeite nämlich als “Computational Scientist” und betreue an einem Großrechner MedizinerInnen und BiologInnen, die bei uns rechnen möchten.

Oh, keine Angst, dies wird nicht noch ein Blog über Bioinformatik. Doch: Wenn von “Code” die Rede ist, dann eben von Zeilen eines Programms in einer Programmiersprache.

Mich treibt das Verhältnis von Lehre und Wissenschaft um. Und auch darüber wie Lehre Umsetzung findet, wie man also Lehre gestalten kann bzw. sollte. Und ich finde zu guter Lehre in der (Bio-)Informatik, jedenfalls dort, wo Programme geschrieben werden, gehört “Code Review”.

Und was ist Code Review?

Na ja, wie der Name sagt geht es um einen Prozess bei dem ein Stück Computercode untersucht wird. Im Allgemeinen soll sichergestellt werden, dass das fragliche Programm funktioniert. Und natürlich möchte man verbessern wo möglich. Das ist zwar eine etwas verkürzte Darstellung, aber auch an den Universitäten wird Code Review praktiziert. Meist schauen sich die Erfahrenen einer Arbeitsgruppe ihre Änderungen untereinander und die der “Neuen” an, suchen nach Fehlern, geben Tipps zur Struktur etc..

Warum ist das wichtig? Schließlich sind alle Beiteiligten kompetent und wissen was sie tun, oder? Sicherlich kann man Programme veröffentlichen ohne das ständig jemand über die Schulter guckt. In der Praxis gibt es eine Reihe von Gründen, warum die Kontrolle durch Dritte zur Kultur gehören sollte:

Fehlerrisiken werden limitiert – Das ist der wohl wichtigste Grund. Das Vieraugenprinzip schadet selten und die Gefahr übersehener Fehler sinkt einfach. Auch gute EntwicklerInnen leiden ab und zu unter dem Tunnelblick.
Code Qualität verbessern – Hierzu vorweg: Es geht nicht um Standards und Korinthenkackerei. Es geht darum, Code effizienter zu machen: In einem Team wo jeder einen bestimmten Hintergrund und eigene Stärken hat, schadet es einfach nicht nach Vorschlägen zu fragen. Es ist immer eine gute Idee. Irgendjemand wird fast sicher eine elegantere Lösung in petto haben, ein geeigneteres Lösungsmuster, eine schlichtere Lösung oder auch nur den Code schneller machen.
Alle profitieren – Wenn man zusammenarbeitet, können alle im Team dazulernen und besser werden. Wer den Code beiträgt bekommt Feedback, wird darauf hingewiesen, wo mögliche Probleme sind. Auch die Reviewer profitieren, lernen vielleicht etwas für ihre Aufgaben, lernen bestimmt etwas durch das Lesen der Arbeit der KollegInnen.
Die Persönlichkeit profitiert – Man lernt ganz schnell Kritik so zu formulieren, dass sie sachlich bleibt. Sonst …
Man kennt das Projekt besser – Wenn ein Team an einem Projekt arbeitet, ist es verdammt unwahrscheinlich, dass alle EntwicklerInnen auf dem selben Stand sind. Manchmal arbeiten einige fokussiert auf bestimmte Teilfragen. Jemand anderer arbeitet auf einem ganz anderen Teil des Projektes.

Wie geht Code Review?

Viele Wege führe nach Rom. Und es gibt verschiedene Ansätze zum Code Review . Nehmen wir an, dass das fragliche Projekt einen Aufbewahrungsort  hat, auf den alle Teammitglieder Zugriff haben. Wer ein Stück Arbeit erledigt hat, fragt an dieses Stück dem Projekt zuzufügen (häufig ein sog. “Pull Request”) und einem Kollegen wird die Aufgabe zugewiesen sich das Stück Programmcode durchzulesen. Eine gute Versionsverwaltung lässt dann zu genau diesem Codestück einen Unterhaltungthread zu, ähnlich den Threads hier in Scienceblogs.

flattr this!

1 / 2 / Auf einer Seite lesen

Kommentare (28)

  1. #1 rolak
    28. Oktober 2019

    Willkommen!

  2. #2 H.Wied
    28. Oktober 2019

    Code Review ist schwierig, wenn es nur wenige Fachleute gibt, die eine Steuerungssoftware verstehen, entwickeln und Fehler finden können. Bei Schiaparelli, dem Marslander 2016, trat ein Fehler auf “Offenbar kommunizierte das Radarhöhenmessgerät an Bord von Schiaparelli nicht richtig mit der Steuerungssoftware des Landers” (Rolf Densing, ESA)
    2020 ist mit dem ExoMarsRover eine neue Landung auf dem Mars geplant.
    Wünschen wir dem Team Alles Gute und keine Fehler!

  3. #3 SvenS
    28. Oktober 2019

    Willkommen.
    Das ganze erinnert an meine ersten Programmierversuche in C zu meiner Schulzeit. Ich sollte einen Zinsrechner schreiben. Es hat auch alles funktioniert, bis der Rechner um flexible Laufzeiten erweitert wurde. Zwei Wochen suchte ich nach dem Fehler, sogar abends am Stammtisch hatte ich das Notebook dabei und suchte nach dem Grund für die falschen Ergebnisse. Dann schaut ein Freund (Typ ich weiß nicht was ein Computer ist) über meine Schulter und fragt “Warum hast du da überall Punkte, aber an der einen Stelle ein Komma?”
    Seit diesem Moment war ich ein Verfechter des Open Source Gedanken und habe erlebt, dass Team nicht bedeutet für andere zu arbeiten sondern mit ihnen.

    • #4 Christian Meesters
      28. Oktober 2019

      Danke. 😉

  4. #5 schlappohr
    28. Oktober 2019

    Mal ehrlich, wer hat nicht einen Fehler in der Kategorie Quadratmeter mit Kubikmeter-Verwechseln schon mal selber gemacht?

    Beim Umgang mit Uhrzeiten verwende ich hin und wieder gerne Stunden zu 100 Minuten, weil damit viel einfacher zu rechnen ist.

    Die Notwendigkeit zu einer Review erkennt man recht schnell, wenn man integrierte Schaltkreise entwickelt. Die Schaltung wird mithilfe bestimmter Beschreibungssprachen entworfen, und der Code muss genau wie eine Software reviewed werden. Tut man das nicht und hat einen Fehler im Code, wird der Chip nicht wie gewünscht funktionieren. Mit einem Bugfix wie bei der Software ist es dann nicht getan. Man kann die Chips in die Tonne werfen (oder als USB-Kaffeewärmer verwenden) und muss nochmal durch die Fabrikation. Die Produktion eines Halbleiterchips geht üblicherweise in die Millionen.

    Klingt nach einem interessanten Blog. Ich werde mitlesen 🙂

    • #6 Christian Meesters
      28. Oktober 2019

      Danke.

      Die Notwendigkeit zu einer Review erkennt man recht schnell …

      Ich wünschte das wäre so 😉 edit: Es gibt halt versch. Welten.

  5. #7 Felix
    28. Oktober 2019

    Glückwunsch zum ersten Beitrag! Ich bin gespannt, was da thematisch noch kommt. Beruflich mache ich neben meiner Doktorarbeit Support für einen Bioinformatik-Cluster. Bei uns benutzen nur wenige Nutzer wirklich selbt geschriebenen Code (Jobscripts ausgenommen) und ich habe das Gefühl, dass viele Nutzer einfach nur froh sind, wenn ihr Problem gelöst wird. Die Qualität des Codes/Jobscripts scheint da dann zweitrangig zu sein. Wahrscheinlich ist meine Sicht aber beeinträchtigt, da ich nur Jobs von Leuten anschaue, die sich wegen Problemen melden.

    • #8 Christian Meesters
      28. Oktober 2019

      Danke.

      Ja, bei uns ist das ebenso: Nutzer interessiert meist die Anwendung bestehender Software (3rd Party) und die Zeit zum Paper. Nun, irgendwo muß man ja anfangen zu schreiben.

  6. #9 schorsch
    28. Oktober 2019

    ist ein Code-Review wirklich in der Lage, Fehler wie ‘Radius mit Durchmesser verwechselt’ oder ‘Quadrat- statt Kubikmeter verwendet’ aufzudecken?

    Wenn die Dokumentation oder der Quellcode-Kommentar auf den Radius referenzieren, der Code jedoch auf den Durchmesser, dann sollte ein aufmerksamer Prüfer den Fehler erkennen können.

    Dann bräuchte der Programmautor aber auch keine zwei Wochen, den Fehler selbst zu entdecken.

    Fehler, die auf falschen Grundannahmen beruhen, werden von einem reinen Code-Review m. E. eher nicht aufgedeckt.

    • #10 Christian Meesters
      28. Oktober 2019

      ist ein Code-Review wirklich in der Lage, Fehler wie ‘Radius mit Durchmesser verwechselt’ oder ‘Quadrat- statt Kubikmeter verwendet’ aufzudecken?

      Nicht per se, nein. Wesentlich ist Anfängern beizubringen, wie man guten Code schreibt und auch Kollegen, sie sich “über die Schulter schauen”. Gute Dokumentation einzufordern gehört dazu.

  7. #11 Christian Meesters
    28. Oktober 2019

    @all: Danke für die guten Wünsche.

    Ich werde mich in die ScienceBlogs WP-Einstellungen einfuchsen, damit das mit den Kommentaren besser funktioniert.

  8. #12 uwe hauptschueler
    28. Oktober 2019

    Der Fehler, bei dem o.g. Beispiel, könnte auch absichtlich gemacht worden sein um z.B. das Projekt schön zu rechnen oder unter eine Ausschreibungsgrenze zu kommen.

  9. #13 Karl Mistelberger
    mistelberger.net
    29. Oktober 2019

    Der Goldstandard des Code-Review sind Testläufe, für openSUSE Tumbleweed hier einzusehen: https://openqa.opensuse.org/tests/overview?distri=microos&distri=opensuse&version=Tumbleweed&build=20191027&groupid=1

    Während die Code Reviewer nach Fehlern suchen sind es die Praktiker, die die Fehler finden ohne danach gesucht zu haben. Als ich einen Pentium 90 kaufte war mir der Bug sofort aufgefallen. Die Software, die Daten, den Compiler konnte ich ausschließen. Es blieb nur der Prozessor als Fehlerquelle, was kurz darauf auch bestätigt wurde: FDIV-Bug.

    Aufräumen hilft aber immer. Nur sollte man es nicht übertreiben. Der Linux Kernel ist ein gutes Beispiel für adäquate Softwareentwicklung.

    Bei der Entwicklung im Team sollte man aufpassen. Man hüte vor den Leuten mit den guten Ideen, wenn die Arbeit dann von anderen erledigt werden soll. Dann sind diese Narzissten und Schaumschläger, die heisse Luft an das Management verkaufen.

    • #14 Christian Meesters
      29. Oktober 2019

      Oh, das ist gut: Das Code Review nicht das Selbe ist, wie autom. Testen und auch nicht nur darum geht Fehler zu finden, sondern eben auch den Stil zu verbessern, damit es zu besser wartbaren Code kommt, kam nicht rüber. Ich mache mal eine Notiz, zum den Stichworten – Danke!

  10. #15 Dr. Webbaer
    29. Oktober 2019

    Sog. Code-Review ist einerseits wichtig, weil “Code” immer ein Ziel hat, ein allgemein gesellschaftliches oder ein spezielles, das eines Unternehmens der Wirtschaft beispielsweise, und andererseits, weil es unterschiedliche Befähigung gibt gemeint effizienten “Code” zu entwickeln bzw. bereit zu stellen.

    Die Erstellung von “Code” folgt immer gemeinschaftlichem Interesse, bei besonderem Bedarf wird der Schreiber dieser Zeilen hier noch ein wenig zu ergänzen suchen.

  11. #16 MartinB
    29. Oktober 2019

    Huhu, neuer Blog.
    [Hektisches Winken aus dem Drachenland]

  12. #17 Joseph Kuhn
    29. Oktober 2019

    Willkommen auf der Plattform!

    Fehler der Art Radius/Durchmesser führen bei uns zur Einzahlung in eine Fehlerkasse, die bei ausreichender Füllung einen gemeinsamen Biergartenbesuch finanziert. Funktioniert wie die Beichte, man fühlt sich danach etwas besser.

  13. #18 Dr. Webbaer
    30. Oktober 2019

    Das Code Review nicht das Selbe ist, wie autom. Testen und auch nicht nur darum geht Fehler zu finden, sondern eben auch den Stil zu verbessern, damit es zu besser wartbaren Code kommt […]

    Ganz genau, Herr Meesters, Wartbarkeit und Weiterentwicklungsfähigkeit von Code sind zentral für den Erfolg von Code. (Code kann erfolgreich sein, sozusagen.)

    Die sinnhafte Verteilung von Code, der dann die fortlaufende Zusammenarbeit mit der Fachabteilung erleichtert, ist sozusagen das A und O der ingenieurshaft betriebenen Softwareentwicklung.
    Code darf in diesem Sinne auch “geschwätzig” sein, muss an Stellen, wo es nicht um Effizienz seiner Ausführung geht, vor allem (möglichst schnell) nachvollziehbar sein.
    Bestimmte Algorithmik ist zu kapseln, auszulagern sozusagen, soll nicht die Betrachtung des Codes belasten.

  14. #19 P. Berberich
    München
    30. Oktober 2019

    Meine Frage: Welchen Testlauf hätte man konkret bei dem beschriebenen Beispiel der Burgwegtunnel-Sanierung machen müssen, um den Fehler aufzudecken? Ich persönlich hätte die benötigte Betonmenge mit Papier, Bleistift und Taschenrechner oder Excel zunächst einmal grob geschätzt.

    • #20 Christian Meesters
      30. Oktober 2019

      Finde ich auch: Die Kollegen hätten vorher eine Überschlagsrechnung machen sollen. Unabhängig voneinander. Das kostet nicht viel Zeit. (Insofern hinkt der Vergleich, aber auch hinkende Vergleiche können ja zu etwas gut sein.)

  15. #21 Robert aus Wien
    Wien
    31. Oktober 2019

    “Die gute Verwendung einer Programmiersprache lernt man nicht in einem Kurs, sondern durch Anwendung.”

    Das stimmt zwar, ich bin während meines Studiums so gut wie nie in Vorlesungen für Programmiersprachen gegangen, sondern hab mich lieber an meinen Rechner gesetzt.
    Aber: Ich mache im Moment gerade etwas, was ich immer schon tun wollte: Ich lerne gerade C++. Und da gibt es einige Dinge, auf die man durch Anwenden der Sprache nie von selbst kommen würde, da hilft wirklich nur ein guter Kurs. (Ich lerne gerade nach einem C++ Primer und mache auch brav die Programmierbeispiele. Das Buch ist wirklich gut geschrieben und der Autor versteht auch viel von Didaktik.)
    Beispielsweise die Tatsache, daß der Compiler selbst manche Constructors definiert und das zu sehr merkwürdigen Effekten führen kann, wenn man es vergißt. Und leider sind auch die Ursachen dafür dann oft nicht so offenkundig – wenn man nicht über das notwendige Hintergrundwissen verfügt.

  16. #22 tomtoo
    31. Oktober 2019

    Der beschriebene Fehler hätte schon bei den Unit Tests auffallen müssen und spätestens beim user accept.. Weniger bei einem Code review. Letztlich geht es bei einem Codereview Hauptsächlich um Lesbarkeit und Verständlichkeit des Codes. Imo sind solche Fehler ein Hinweis auf schlechtes Testen, weniger ein mangelhafter Code review. Es kann nicht die Aufgabe eines Code reviewers sein Detailfehler eines Programmes zu identifizieren, dafür gibt es Tests.

  17. #23 Karl Mistelberger
    mistelberger.net
    31. Oktober 2019

    Auch Erlangen hat einen Burgbergtunnel. Züblin hat den Ausbau angeboten und schreibt:

    Im Zuge des viergleisigen Ausbaus der Bahnstrecke Nürnberg-Ebensfeld wird in Erlangen parallel zu dem alten, im Jahr 1844 eingeweihten Burgbergtunnel, eine zweite Röhre für den S-Bahn- und Fernbahnverkehr errichtet.

    Dieser neue zweigleisige Eisenbahntunnel hat eine Länge von 307 Metern, einen Innendurchmesser von 11,70 m womit sich ein Ausbruchsquerschnitt von 130 m² ergibt, was in etwa der Giebelfläche eines Einfamilienhauses entspricht. Das Ausbruchsvolumen beträgt ca. 60.000 m³.

    Der Tunnel wird im bergmännischen Vortrieb (Spreng- und Baggervortrieb) im mittleren Burgsandstein mit Ton- und Schluffstein und einer Überdeckung von 5 – 37,5 m, hergestellt.

    Die nach Fertigstellung des Vortriebs herzustellende bewehrte Innenschale hat eine Stärke von 40 cm und ist mit einer 1-lagigen Außenabdichtung mit Kunststoffdichtungsbahn ausgestattet.

    Die an beiden Tunnelenden angeordneten Portale werden als sogenannte wasserundurchlässige Betonkonstruktion in offener Bauweise hergestellt. Stützwände, Schallschutzwände und die Eisenbahnbrücke Schwabach runden das Bauvorhaben ab.

    Wer das obige erst einmal zu Papier gebracht hat weiß wovon er redet und macht auch keine dummen Fehler.

  18. #24 P. Berberich
    München
    31. Oktober 2019
  19. #25 Christian Meesters
    31. Oktober 2019

    Offenbar habe ich einen Nerv getroffen. Das ist gut. Leider etwas daneben mit ungenauen Formulierungen. Das ist mir klar gewesen als ich mich zum Blog entschloss: Meine Themen finden sicher immer Leute, die sich auch auskennen und sehr leidenschaftlich sind ;-). Aber es ist ein Blogthread, kein Buchkapitel.

    Ja, manche Themen hier liegen noch in meiner Schublade …

  20. #26 Karl Mistelberger
    mistelberger.net
    31. Oktober 2019

    > #14 Christian Meesters, 29. Oktober 2019

    > Oh, das ist gut: Dass Code Review nicht das Selbe ist, wie autom. Testen und auch nicht nur darum geht Fehler zu finden, sondern eben auch den Stil zu verbessern, damit es zu besser wartbaren Code kommt, kam nicht rüber.

    > #25 Christian Meesters, 31. Oktober 2019

    > Offenbar habe ich einen Nerv getroffen. Das ist gut. Leider etwas daneben mit ungenauen Formulierungen.

    Effektiver Code Review ist unmöglich, wenn es keine Verifizierung und Validierung gibt. Der Review steht dann auf tönernen Füßen und man kann ihn sich schenken. Ohne signifikante Beispiele ist die ganze Diskussion müßig.

    1. Vorbildliche Arbeit wird seit mehr als 70 Jahren von den Jungs und Mädels vom LANL geleistet: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/references.shtml Seit dem Castle Bravo Test (1954) ist nichts mehr Unvorhergesehenes passiert.

    2. Nicht so gut sieht es bei Boeing aus: Da haben unbedarfte Ingenieure das MCAS an das gut funktionierende Speed Trim System angeflanscht.

    Die erste Version des MCAS war durchaus brauchbar, wurde sie doch von zwei erfahrenen Mitarbeitern der FAA begleitet und abgesegnet. Die beiden langweilten sich und waren schon längst woanders angestellt, als Boeing eine Revision des MCAS vorlegte. Die FAA schickte zwei Anfänger mit annähernd Null Ahnung zur Begutachtung. Das Ergebnis ist bekannt und beschämend.

    Bei der Validierung im Simulator sahen die Piloten keine Probleme bei einer fehlerhaften Aktivierung des MCAS und nahmen an, dass die Piloten im Flugzeug einen Stab Trim Runaway sofort erkennen und mit den mittlerweile berüchtigten Kippschaltern beenden würden.

    Die technisch versierten Piloten am Simulator hatten keine Ahnung von der heutigen Pilotenausbildung. Diese junge Leute hocken zum Teil nur am Steuer weil es Vorschrift ist. Ahnung haben sie kaum und wenn der Autopilot aufgibt fangen sie erst an zu suchen. Zum sinnvollen Reagieren aus dem Gedächtnis sind sie nicht in der Lage. Selber lesen ist mühsam. Eine ziemlich brauchbare Begleitung gibt es von Juan Browne: https://www.youtube.com/playlist?list=PL6SYmp3qb3uPp1DS7fDy7I6y11MIMgnbO

    3. Eine Verbesserung des Programmierstils richtet in dieser Situation überhaupt nichts aus. Andererseits freue ich mich, dass heute selbstverständlich ist, was durchzusetzen mich vor zwanzig Jahren viel Mühe gekostet hat. Wen ich hier rein gucke bin ich nur noch begeistert: https://github.com/openSUSE/zypper Alles was man wissen will steht jedem und überall zur Verfügung und kann sehr effizient durchstöbert werden. Der Programmierstil kommt bei SUSE nicht zu kurz. Hätte es schon damals git und github gegeben wäre die Einweisung der Doktoranden von TUBS und KIT (damals KfK) ein Kinderspiel gewesen.

    4. Interessanterweise waren Werksstudenten und Doktoranden die Pflegeleichten und die Angestellten die Problembären. Erstere kapierten sofort und machten selbständig weiter. Letztere verwendeten alle ihre Energie darauf die Untauglichkeit eines geordneten Software Konfigurations-Managements zu behaupten.

  21. #27 Christoph
    7. November 2019

    Spannendes Thema. Während meines Studiums hatte ich unter anderem auch eine Vorlesung zum Thema Software Quality Assurance. Code Reviews sind ein sehr wichtiger Faktor, mit dem sich schon viele Fehler ausmerzen lassen.
    Bin selbst auch in der Open Source Szene tätig und in unserem Projekt setzen wir auch auf Code Reviews, um sicherstellen, dass wir eine gute Qualität beibehalten. Und für weniger erfahrene Coder ist es eine gute Möglichkeit ihre Kenntnisse zu verbessern.
    Idealerweise erklärt man die man etwas besser macht.

  22. #28 Karl Mistelberger
    mistelberger.net
    27. November 2019

    völlig erratisches Kommentar – gelöscht