Wie kann die Schulung der Schüler in Bezug auf die Wartbarkeit verbessert werden? [geschlossen]


18

Die Wartbarkeit spielt bei der professionellen Softwareentwicklung eine wichtige Rolle. In der Tat ist die Wartung fast immer der längste Teil eines Software-Lebenszyklus, da sie von der Projektfreigabe bis zum Ende der Zeit andauert.

Darüber hinaus machen Projekte in der Instandhaltung einen großen Teil der Gesamtzahl der Projekte aus. Laut http://www.vlegaci.com/298/interesting-statistics-%E2%80%93-numbers-of-programmers-inmaintenance-vs-development/ beträgt der Anteil der Projekte, die in der Wartung sind, ungefähr 2 /3.

Ich bin kürzlich auf diese Frage gestoßen, bei der der Typ ziemlich überrascht aussieht, als er feststellt, dass es bei seiner Arbeit hauptsächlich um Instandhaltung geht. Ich beschloss dann, eine Diskussion (auf Französisch) auf der Hauptseite der französischen Community von Softwareentwicklungsfachleuten ( http://www.developpez.com/ ) zu eröffnen . Die Diskussion trägt den Titel "Sind die Studierenden gut genug auf die Realität der professionellen Softwareentwicklung vorbereitet?" und geht es hauptsächlich um Wartbarkeit . Es wurde darauf hingewiesen, dass die Menschen zumindest in Frankreich nicht gut genug darauf vorbereitet sind, sich in beiden Aspekten der Instandhaltung zu stellen:

  • bestehenden Code pflegen
  • machen wartbaren Code

Meine Frage hier spiegelt diese Diskussion wider und zielt darauf ab, einen guten Weg zu finden, Wartbarkeit zu lehren.

  • Wie können wir Wartbarkeit vermitteln?
  • Welche Art von Übung würden Sie vorschlagen?
  • Wenn Sie in Bezug auf Wartbarkeit gut geschult wurden, welche speziellen Kurse haben Sie besucht?

[edit] Nach einigem Missverständnis denke ich, dass ich meine Frage klären muss. Als Projektleiter und Softwareentwickler arbeite ich oft mit Auszubildenden oder frisch graduierten Studenten. Ich war selbst einmal frisch graduiert. Die Sache ist, dass die Schüler normalerweise nicht mit Prinzipien wie SOLID vertraut sind, die die Wartbarkeit eines Projekts verbessern. Oft haben wir große Schwierigkeiten, Projekte weiterzuentwickeln (geringe Wartbarkeit). Was ich hier suche, ist ein konkretes akademisches Beispiel für eine erfolgreiche Lehre über die Bedeutung der Wartbarkeit und wie man einen besseren Code in Bezug auf diesen bestimmten Punkt erstellt; oder mögliche Vorschläge zur Verbesserung der Art und Weise, wie Schüler ausgebildet werden.



PS: Schauen Sie sich meine Antwort dort an, vielleicht finden Sie das Spaghetti-Experiment lohnenswert
PhD

@Nupul Da Sie ein Lehrer sind und sich mit der Pflege des Codes befassen, geben Sie uns bitte eine vollständige Antwort und erläutern Sie, wie Sie vorgehen: Spaghetti-Code ist nur ein kleiner Teil davon
Matthias Jouan

Gepostet eine Antwort ... hoffe, es bietet Mehrwert für Sie :)
PhD

Das API-Design- und Wartbarkeitsprojekt in "Practical API Design" ist IMHO ein Projekt, bei dem die Schüler die Herausforderungen der Wartbarkeit (und der Abwärtskompatibilität) lernen.
Marco

Antworten:


8

Wie können wir Wartbarkeit vermitteln?

Das ist eine Frage der Übung.

Der einfachste Weg , um es in eines der praktizierenden kontrollierte ich denken kann ist , zu simulieren über typisches Wartungsprojekt wie folgt.

Holen Sie sich ein Projekt ( Projekt A ), das gut gemacht ist, und führen Sie einige Probleme ein: Fügen Sie einige Fehler ein, eine Menge duplizierten und toten Codes, löschen Sie einige Funktionen, Komponententests und Dokumentation hier und da usw. Möglicherweise haben Sie sogar ein dediziertes Programm Name dafür, wie Project A - beschädigte Version .

Richten Sie einen Issue Tracker ein und füllen Sie ihn mit Anfragen, die bestimmten Schäden entsprechen, die Sie angerichtet haben. Stellen Sie grundlegende Regeln und Praktiken für den Entwicklungsprozess auf - VCS-Commits, Codeüberprüfungen, Qualitätssicherung usw. - und ziehen Sie in Betracht, was Sie aus der Checkliste in The Joel Test entnehmen können .

  • Kursarbeit 1.
    Beheben Sie Fehler, fügen Sie fehlende Komponententests, Dokumentationen und Funktionen hinzu.
  • Kursarbeit 2.
    Refactor.
  • Kursarbeit 3.
    Wartung / Verbesserung von Originalprojekten zur Verwendung durch Studenten des nächsten Jahres
    - Projekt A Version 2.0 bzw. Projekt A - beschädigte Version 2.0 .
    Unter Verbesserung der beschädigten Version verstehe ich den besseren Schaden für die Bildung. :)

Achten Sie bei den oben genannten Vorgehensweisen besonders auf die Codeüberprüfung . Dies ist wahrscheinlich der effektivste Weg, um sicherzustellen, dass der Code einfach zu warten ist, wie z. B. in der oberen Antwort auf eine verwandte Frage angegeben .

WTFs pro Minute


11

Haftungsausschluss: Ich habe gerade meinen CS-Abschluss gemacht. Ich bin kein Lehrer.

Das mag sich offensichtlich anhören, aber ich denke, der beste Weg, um die Codewartung zu lehren, besteht darin, dass die Schüler die Codewartung durchführen. Folgendes würde ich tun:

  1. Nehmen wir ein mäßig komplexes Problem und zwei Implementierungen, die semantisch identisch sind, von denen jedoch eine viel besser zu warten ist als die andere.
  2. Fordern Sie eine Reihe von Änderungen / Funktionserweiterungen an, die auf der besseren Codebasis viel einfacher zu implementieren sind. Eine Hälfte der Schüler muss diese auf der wartbareren Codebasis implementieren, die andere Hälfte auf der weniger wartbaren.
  3. Aus Gründen der Fairness sollten Sie diese Übung mit vertauschten Rollen wiederholen.
  4. Vergleichen Sie die durchschnittliche Anzahl der erfolgreich implementierten Änderungen zwischen der guten und der schlechten Codebasis und den Zeitaufwand für deren Implementierung. Lassen Sie die Schüler ihre Erfahrungen austauschen, ihre Beschwerden ausdrücken und allgemein über die von ihnen geleistete Arbeit sprechen.

Die Idee ist, die Schüler nicht nur mit dem Code einer anderen Person arbeiten zu lassen, sondern auch eine Wertschätzung für wartbaren Code zu entwickeln, mit der sie hoffentlich ihre Designfähigkeiten verbessern können.


+1 für die Übung. Das ist etwas sehr Ähnliches, das ich schon lange laufen wollte. Obwohl in meiner Version die Schüler etwas zu einer Spezifikation schreiben würden, würde es jemand anderem (von mir ausgewählt) gegeben, um es zu modifizieren. Sie können die Aktivität wiederholen, nachdem Sie über Wartbarkeit und bewährte Praktiken unterrichtet haben.
Andy Hunt

1
Sie könnten einen wirklich guten Minikurs zur Wartbarkeit zusammenstellen, der auf dem Kapitel "Codegerüche" von Fowlers Refactoring
MJFGATES

2

Wartbarkeit ist eine Tugend, keine Fähigkeit. Es gibt viele Wege, um wartbare Projekte zu erstellen, aber keine Formel, die diese garantiert hervorbringt.

Wenn Sie Tugenden wie Freundlichkeit und Großzügigkeit schätzen, suchen Sie nach Wegen, um dasselbe in Ihrem täglichen Leben zu praktizieren. Das Gleiche gilt für die Wartbarkeit: Wenn Sie und Ihr Unternehmen Wert auf Wartbarkeit legen, behalten Sie dies im Hinterkopf, während Sie Ihr Projekt entwerfen und implementieren. Es wird ein legitimer Grund sein, etwas mehr Zeit für den Aufbau zu verwenden, da Sie wissen, dass Wartungsfreundlichkeit geschätzt wird. Umgekehrt wird davon abgeraten, aus Gründen der Wartbarkeit zusätzliche Zeit in einer Organisation zu verbringen, die dies nicht schätzt.

Wenn Sie den Leuten beibringen möchten, Dinge wartbar zu machen, sollten Sie zunächst klarstellen, dass Ihre Organisation Wartbarkeit schätzt. Geben Sie dies in den Anforderungen für Ihre Projekte an. Machen Sie es zu einem der Kriterien für eine erfolgreiche Codeüberprüfung. Kurz gesagt, machen Wartbarkeit Teil Ihrer Kultur .

Als nächstes sollten Sie bereit sein, einige Ressourcen für die Verbesserung der Wartbarkeit Ihrer vorhandenen Projekte bereitzustellen. Identifizieren Sie die Teile eines Projekts, in denen Fehler immer wieder auftauchen oder in denen das Beheben von Fehlern oder das Vornehmen von Änderungen sehr schwierig und zeitaufwändig ist.

Schließlich indoctrinate neue Entwickler in der Kultur der Wartbarkeit von ihnen Teams zuweisen , dass es bereits täglich üben. Es gibt keinen besseren Weg, um jemandem zu helfen, einen Wert anzunehmen, als ihm viele gute Beispiele und Anleitungen zu geben.


1
Es fällt mir schwer, die Ablehnung hier zu verstehen. Sie können das Software-Design beliebig oft aus Ihrer Bibel zitieren, aber das Hauptproblem ist, dass Entwickler häufig den Eindruck haben, dass es keine Rolle spielt, weil niemand die Möglichkeit hat, ihnen eine bessere Alternative zu dem zu bieten, was sie getan haben . Wenn Sie den Schülern nicht das Gefühl vermitteln, dass es wichtig ist, ständig an der Qualität der von ihnen produzierten Arbeit zu zweifeln und die von ihnen getroffenen Entscheidungen in Frage zu stellen, dann bezweifle ich wirklich, inwieweit sich ein Kurs zur Wartbarkeit für sie als nützlich erweisen könnte.
Filip Dupanović

@ FilipDupanović Zustimmen. Noch einen Schritt weiter gehen, obwohl die Leute die mangelnde Bereitschaft neuer Absolventen mit CS-Abschlüssen beklagen, glaube ich nicht, dass das Problem entweder überraschend oder einzigartig für die Programmierung ist. Natürlich gibt es einen Unterschied zwischen einem neuen Absolventen und einem erfahrenen Arbeiter: Man hat Erfahrung! Ein guter Studiengang in jedem Bereich ist konzeptionell und nicht beruflich. Nur die Erfahrung lehrt neue Absolventen, die Konzepte anzuwenden, die sie gelernt haben, und bei jedem Job, in dem sie landen, effektiv zu arbeiten.
Caleb

1

Ich jedenfalls mag den Begriff Wartbar in Bezug auf Softwareentwicklung nicht. Die Realität ist, dass alle Software insofern gewartet werden kann, als sie Wartungsarbeiten unterzogen werden kann. Die eigentliche Frage ist also, ob die Wartung von Software relativ teuer oder kostengünstig ist. Ich weiß, dass dies wie eine sehr umständliche Aussage zu Beginn einer Antwort klingt, aber mein Punkt wird in einem Moment klarer.

Das Problem mit IT-Abschlüssen, die einen Schwerpunkt in der Softwareentwicklung haben, besteht darin, dass sie den Schülern nur das Minimum beibringen, das sie zum Schreiben von Software benötigen. Berufliche Fähigkeiten und Kenntnisse durch das Lernen erworben , die in den ersten Jahren erfolgen nachQualifikation für den Abschluss. Dies ist der Zeitpunkt, an dem ein Absolvent beginnt, an Projekten zu arbeiten, die für einen Kunden tatsächlich von Bedeutung sind, in einem Umfeld, in dem ein hoher Leistungsdruck herrscht und die Erwartung besteht, ein Produkt zu schaffen, das einem professionellen Standard entspricht. Leider fördern viele Unternehmen keine Kultur, in der professionelle Standards in Bezug auf Software aufrechterhalten werden, und es entstehen Projekte, deren Entwicklung und Pflege sich als kostspielig herausstellen. Unglücklicherweise lernen unsere Absolventen in den ersten Jahren ihrer Karriere viele schlechte Gewohnheiten in solchen Umgebungen, und es kann lange dauern, bis sie lernen, wie sie diese Gewohnheiten überwinden können ... wenn überhaupt.

Sie sollten den Schülern besser beibringen, wie man sauberen Code schreibt und wie man Probleme in Software identifiziert, die normalerweise technische Schulden verursachen . Lesen Sie in Büchern über Clean Code , Refactoring und Lean Software Development nach, und bringen Sie den Schülern bei, Unit-Tests vor dem Implementierungscode zu schreiben, um sicherzustellen, dass ein hohes Maß an Testabdeckung vorliegt. Bringen Sie den Schülern bei, duplizierte und sich wiederholende Muster in ihrem Code zu erkennen und den Code zu überarbeiten, um solche Duplikate zu entfernen. Helfen Sie den Schülern, Prinzipien wie SOLID und DRY zu verstehen und anzuwenden. Am wichtigsten ist, dass Sie die Idee aufgeben, dass die Fähigkeit, Code zu verwalten, ausschließlich auf dem Entwurf und der Implementierung des Codes basiert und stattdessen von Anfang an ein Gespür für Handwerkskunst und Qualität bei der Erstellung von Software vermitteln soll Verfeinern Sie den Code bei der Implementierung, um die Auswirkungen technischer Schulden zu minimieren und die Kosten für die Wartung der Software im Laufe der Zeit so gering wie möglich zu halten.


Ich habe Ihre Antwort mit Aufmerksamkeit gelesen und auch Ihren Artikel über "wartbar", und ich muss sagen, dass ich Ihnen fast vollständig zustimme. Ich habe ein paar der Bücher gelesen, die Sie erwähnen, und verwende - oder verwende - Prinzipien wie SOLID jeden Tag bei der Arbeit (ich bin übrigens kein Lehrer). Aber ich denke, Ihre Antwort ist ein bisschen unangebracht. Ich werde meine Frage bearbeiten, um zu klären, wonach ich suche.
Matthias Jouan

1
Sie machen einen guten Punkt, aber es ist auch fair zu sagen, dass ein Projekt mehr oder weniger wartbar ist als ein anderes. Wörter, die mit -able oder -ible enden, können absolut oder relativ sein, und es scheint ziemlich klar, dass das OP es in einem relativen Sinn verwendet.
Caleb

0

Ich denke, der beste Weg, um diese Art von Fähigkeiten zu erlernen, besteht darin, Code-Reviews und Pair-Programme durchzuführen. Während der Codeüberprüfung können erfahrene Mitarbeiter aufzeigen, wie Code besser gewartet werden kann (in der Regel durch eine bessere Lesbarkeit) und begründen, warum bestimmte Entscheidungen zu besser gewartetem Code führen können.

Pair Programming ist ein noch besserer Weg, um solche Dinge zu lehren, da es weniger erfahrenen Mitarbeitern direkte Erfahrung bei der Pflege von Code mit jemandem gibt, der bereits weiß, wie man es gut macht.

Es gibt auch einige großartige Bücher, die Sie über das Schreiben von sauberem, wartbarem Code lesen können. Clean Code fällt mir ein.

Es ist schwierig, diese Erfahrung im akademischen Bereich zu sammeln, da die Schüler selten große Codebasen ändern. Die meisten dieser Fähigkeiten werden beim Lernen im Beruf erworben, und Codeüberprüfungen und das Programmieren von Paaren können dieses Lernen wirklich erleichtern.


1
Obwohl das Programmieren von Paaren eine sehr gute Möglichkeit ist, von erfahreneren Entwicklern zu lernen, und das Lesen der Robert C. Martin-Bücher mein Leben definitiv verändert hat, ging es eher um eine rein akademische Art des Lernens: Wie können Schüler besser vorbereitet werden, bevor sie dazu kommen? die professionelle Welt der Softwareentwicklung.
Matthias Jouan

1
-1: @ suszterpatts Vorschlag klingt viel besser.
Jim G.

0

Guter Code = Weniger Wartung und einfache Erweiterung / Hinzufügung von Funktionen.

Schlechter Code = Wartungs-Albtraum

Grundsätzlich müssen wir den Schülern die folgenden Punkte vermitteln: "Immer wenn ein Projekt einen beschissenen Code enthält, tritt ein neuer Entwickler in das Unternehmen ein, weil der ursprüngliche Autor des Codes darunter leidet und die Software in Mitleidenschaft gezogen wird . "

Eine der besten Methoden, um den Schülern die Wartung von Software beizubringen, besteht darin, das Beispiel für guten und schlechten Code zu zeigen und sie zu bitten, eine Funktion hinzuzufügen, und ihnen dann beizubringen, dass das Schreiben eines guten Codes nicht nur zur Selbstzufriedenheit, sondern auch zum Erstellen dient Es ist einfach für die Leute, die den Code pflegen werden.

Übung:

1) Haben Sie einen vorab geschriebenen falschen Code (z. B. einen doppelten Code), wird an 9 Stellen in einem Projekt eine Methode geschrieben, die besagt, dass "die Hypothekenzahlung berechnet wird" .

Bitten Sie den Schüler, die Funktion so zu erweitern, dass "alle Hypothekenzahlungen um 1,2% erhöht werden".

Nun wird der Schüler den Schmerz bemerken, den Code an allen 9 Stellen zu lokalisieren und zu reparieren. Es gibt viele Möglichkeiten, dass er nicht alle 9 Stellen finden konnte, an denen die "Hypothekenzahlung" berechnet wird.

2) Zeigen Sie nun den Good Code mit dieser Methode an, mit der die Hypothekenzahlung an einem einzigen Ort berechnet wird . Zeigen Sie dem Schüler, wie einfach es ist, einen gut geschriebenen Code zu verbessern, und erklären Sie ihm, wie die Wartbarkeit des Codes / Projekts verbessert wird.

Übrigens, ich fand Ihren Ansatz toll, die Studenten der Wartbarkeit der Software auszusetzen.


-1

@mattmattj: Da es viele Antworten gibt und der Link, den ich gepostet habe, auch einige gute Hinweise enthält, füge ich etwas hinzu, das hoffentlich keine Wiederholung der bereits geposteten Antworten ist.

Erstens MUSS man "Wartbarkeit" definieren - es gibt keine einzige Definition, die von allen akzeptiert wird - ähnlich wie bei der Softwarearchitektur. Wählen Sie also eine, die Ihrer Meinung nach die wichtigste ist, und geben Sie sie in 3-4 Zeilen mit max. Dann können Sie über einige Metriken sprechen, wie z. B. Zeit zum Erinnern / Verstehen Ihres eigenen Codes (oder des Codes eines anderen), Anzahl der WTFs pro Minute / Stunde usw. Behalten Sie es leicht (humorvoll) bei - das macht sie empfänglicher für das, was Sie haben danach zu sagen.

Einige Übungen (es klingt möglicherweise etwas überlappend mit einigen der Antworten, bitte verzeihen Sie das)

Teilen Sie die Klasse in zwei Teile auf - geben Sie einem Abschnitt eine einfache Codierungszuweisung, die in 1-2 Tagen durchgeführt werden muss. Max. Harter Abgabetermin. Sie müssen die Arbeit unter allen Umständen erledigen - Richtlinie - "Arbeitscode", wie sie es für richtig halten. Für die andere Gruppe von Schülern die gleiche Aufgabe, jedoch mit einer Liste von (Namens-) Konventionen und einigen Richtlinien zum Design und wie Punkte abgezogen werden, wenn sie nicht befolgt werden. Dies ist KEIN Betrug, auch wenn es sich so anhört;) Lassen Sie sie jetzt die Codes tauschen, dh Gruppe 1 funktioniert jetzt auf dem, was Gruppe 2 getan hat, und umgekehrt. Schlagen Sie nun eine Änderung der ursprünglichen Codierungszuordnung vor und bitten Sie sie, diese im selben Zeitrahmen durchzuführen. Treffen Sie sich und fragen Sie sie, wie einfach / schwierig es war und öffnen Sie das Wort für Diskussionen / Meinungen. Der Punkt wird definitiv ins Schwarze treffen - hohe Chancen, dass 50% der Klasse glücklich wären und es einfach fanden, und 50% fanden es schwierig. Du kannst sie auch bitten, nach 3 Wochen an ihrem eigenen Ding zu arbeiten und zu sehen, ob sie es in einem Tag schaffen;)

(Eine gute Wendung ist, dass Sie das gleiche Stück Code auf verschlungene Weise schreiben und der Klasse die Möglichkeit geben, es zusammen mit ihrem eigenen Code zu ändern.)

Hier legen Sie die Grundlage für die Wartbarkeit - jede Codezeile, die geändert / aktualisiert wird, kostet das Unternehmen Geld. Je einfacher es ist, Code zu lesen und zu speichern, desto besser / schneller ist die Änderung, die zur Verkürzung der Time-to-Market beitragen würde. Sehr wichtig im heutigen schnelllebigen technologischen Raum. Wartbarkeit ist der Schlüssel zur effizienten Weiterentwicklung von Systemen.

Es ist wichtig, den Unterschied zwischen Greenfield- und Brownfield-Entwicklung zu verstehen - nicht jedes Projekt oder System würde von Grund auf neu erstellt (es ist ziemlich schwierig, Projekte von Grund auf zu finden oder Teil davon zu sein). Erklären Sie, dass das Feld "inhärent" braun ist und Sie Zeit damit verbringen müssen, es zu formen, wenn es "außer Kontrolle" gerät. Je eher sie das akzeptieren, desto besser. Dies ist schwierig, da das Programmieren von Natur aus kreativ ist, das Verbessern des Codes eines anderen jedoch nicht als solches wahrgenommen wird. Kreativität Es gibt die Möglichkeit, den Code zu verstehen und dann "Ihre" Kreativität anzuwenden, um ihn zu verbessern. Wenn dies besser gepflegt wird, können Sie ihn in Zukunft noch kreativer verbessern.

Zögern Sie nicht, sich auf die Spaghetti-Analogie im obigen Link zu beziehen ... ich hoffe, dies hilft, einige Punkte nach Hause zu bringen. Die anderen Antworten helfen, die Lücken zu füllen und sollen Ihnen beim Unterrichten helfen! Viel Glück!


@ Downvoter - bitte hinterlassen Sie einen Kommentar, um die Chancen auf eine Verbesserung des Beitrags zu erhöhen :)
PhD
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.