Ich bin ein Student der Informatik, der derzeit ein Praktikumsjahr bei einem Unternehmen absolviert, das eine Webanwendung für große Unternehmen erstellt und unterstützt. Ich mag die Erfahrung, zu sehen, wie Software in der realen Welt hergestellt wird, und ich bin sehr glücklich, ein Unternehmen zu finden, das die Möglichkeit bietet, nicht nur vorhandene Funktionen beizubehalten und zu erweitern, sondern auch völlig neue Funktionen für das Produkt zu entwickeln.
Trotzdem bin ich mir sehr bewusst, dass dies sehr, sehr unwahrscheinlich ein perfektes Beispiel dafür ist, wie man sich richtig entwickelt. Weit davon entfernt. Ich habe das Gefühl, dass ich aus meinen Erfahrungen hier eine Menge lerne, und ich möchte nicht die falschen Dinge lernen oder schlechte Gewohnheiten von Kollegen aufgreifen, die sich später möglicherweise nur schwer abschütteln lassen. Meistens ist es leicht zu sagen, was gut ist und was nicht - zum Beispiel ist die Unit-Test-Berichterstattung hier aus verschiedenen Gründen praktisch nicht vorhanden (meistens schlechte Ausreden, gemischt mit ein oder zwei gültigen Punkten). In letzter Zeit habe ich jedoch ein regelmäßiges Ereignis bemerkt, bei dem ich mir einfach nicht sicher bin.
Wann immer wir ein neues Projekt starten, müssen wir natürlich jeden relevanten Code finden, der erweitert, geändert oder entfernt werden muss. Es scheint mir, dass in den allermeisten Fällen alles, was nicht in den am häufigsten verwendeten Abschnitten der Anwendung enthalten ist, ein Alter benötigt, um in der Codebasis gefunden zu werden. Es gibt ein oder zwei technische Leiter, die ihren Abschnitt des Codes gut kennen, aber selbst sie sind manchmal ratlos und müssen lange nach dem suchen, was sie benötigen, oder sich an jemanden wenden, der diesen Teil des Codes kürzlich bearbeitet hat ( wenn jemand) um Hilfe. Wenn ich lange sage, meine ich (normalerweise) nicht Stunden, aber es scheint mir, dass eine gute Codebasis im schlimmsten Fall innerhalb weniger Minuten zu jedem Punkt navigierbar ist, für jeden, der mit dem System nur vage vertraut ist.
Also meine Frage. Liegt das obige Problem an schlecht strukturiertem Code? Oder liegt es daran, dass Entwickler nicht genügend Kenntnisse über die Codebasis haben? Oder ist es in großen Anwendungen einfach unvermeidlich, unabhängig davon, wie viel Arbeit in die Klarheit der Dateistruktur investiert wird?
Oder verschwende ich nur meine Zeit mit einem Thema, das wirklich keine Rolle spielt?
Antworten:
Große Codebasen sind nicht entworfen, sie entwickeln sich weiter. Viele Dinge, die beim Betrachten eines aktuellen Schnappschusses keinen Sinn ergeben, sind unter Berücksichtigung der Geschichte durchaus sinnvoll. Und ich meine nicht nur die individuelle Geschichte der Codebasis, sondern auch die Geschichte der Softwareentwicklungspraktiken im Allgemeinen.
Unit-Tests gab es so gut wie immer bis zu einem gewissen Grad, wurden aber erst dann wirklich verbreitet, wenn extreme Programmier- und testgetriebene Entwicklungen in den Jahren 1999 bis 2003 "erfunden" wurden. Viele Codebasen waren älter als diese und waren es folglich nicht Entwickelt in einer Weise, die das Testen von Einheiten vereinfacht.
Andere Softwareentwicklungspraktiken haben eine ähnliche Geschichte. Zum Beispiel hat die DVCS-Revolution von 2005 die Art und Weise verändert, wie Menschen über Workflows und Verzweigungsmodelle denken, selbst bei nicht verteilter Versionskontrolle. Zum anderen hatte, obwohl es existierte, fast niemand von dem MVC-Entwurfsmuster gehört, bis Microsoft ein Framework mit diesem Namen erstellte, und jetzt wird davon abgeraten, Modell und Ansicht nicht mehr zu trennen, selbst in Projekten die nicht Microsoft Framework verwenden.
Die Erstellung und Popularisierung von Online-Peer-Review-Tools beendete im Wesentlichen die Praxis eines Peer-Reviews als formelles Meeting und machte sie viel einfacher durchzuführen und daher allgegenwärtiger. Die Popularisierung von Garbage-Collected-Sprachen führte zu Innovationen in der Speicherverwaltung in C ++ wie Smart Pointern und RAII, die heute als Standardpraxis gelten, aber noch nicht bekannt waren, als viele aktuelle Codebasen gestartet wurden. Ich könnte weiter und weiter gehen.
Wenn Unternehmen wachsen, versuchen sie, die Wiederverwendung von Code so weit wie möglich zu nutzen, sodass eine für ein Produkt ideale Codearchitektur mit geringen Änderungen in ein anderes Projekt übernommen werden kann, auch wenn die Architektur im neuen Kontext möglicherweise etwas umständlich ist . Wenn dies über Jahrzehnte hinweg mehrmals vorkommt, macht das Gesamtbild keinen Sinn mehr.
Es ist nicht so, dass Unternehmen sich nicht mit der Zeit ändern wollen, aber Codebasen sind wie Ozeandampfer. Sie brauchen viel Zeit und sorgfältige Planung, um sich umzudrehen. Daher ist es sehr unwahrscheinlich, dass Sie jemals eine große Codebasis finden werden, die nicht anders gestaltet werden würde, wenn Sie heute von vorne anfangen. Das Wichtigste ist, wenn ein Unternehmen sich in die richtige Richtung wendet.
quelle
Sicherlich gibt es eine Grenze für die Komplexität, die der menschliche Geist erfassen kann. Sie können nicht erwarten, dass sich jemand mit Millionen von Codezeilen auskennt. Deshalb sollten Sie es vernünftig und verständlich strukturieren und dokumentieren. Normalerweise werden Chancen zur Strukturierung von Code ausgelassen. Sie finden im Paket keine Datenbankklasse für eine grafische Benutzeroberfläche. Möglicherweise findet eine Datenbankklasse jedoch auch etwas ganz anderes (z. B. Berichterstellung). Klassen und Module wachsen fast organisch. Das Organisieren von Code in mehr, aber kleineren Klassen mit einzelnen Verantwortlichkeiten ist vorzuziehen, um das Verständnis des Codes zu erleichtern. Leicht verständlicher Code ist der Schlüssel zum Erreichen der Ziele des Software-Engineerings, z. B. korrekte, robuste, wiederverwendbare und erweiterbare Software.
quelle
Sie werden keinen Entwickler finden, der viel Code schreiben möchte. Die Idee ist, nur so viel zu schreiben und es auf eine Weise schreiben zu lassen, die erweiterbar ist.
Leider müssen Entwickler die S / W-Anforderungen von Business / Vertrieb / Marketing erfassen und sind in der Regel nie spezifisch. Sie haben also Anwendungsfälle, die in einen Code gepatcht werden müssen, der nie dazu gedacht war, das zu tun, was er überhaupt tut.
Es gibt keine Möglichkeit, diese Situation zu ändern, es sei denn, Sie haben einen Weg mit dem menschlichen Verstand. Was Sie sparen können, sind obligatorische Dokumentation, ein starkes Framework für Unit- und Integrationstests, ein Fehlerverfolgungssystem, eine Entwickler-Mailingliste innerhalb des Unternehmens, mit der E-Mails archiviert, Peer-Reviews durchgeführt und allgemeine Programmiertechniken erlernt werden können.
Erwägen Sie außerdem, so viel wie möglich von Open Source-Komponenten zu verwenden, da diese im Allgemeinen eine gute Benutzerbasis und einen moderaten Dokumentationsgrad aufweisen. Noch wichtiger ist, dass Sie Leute haben, denen Sie Fragen stellen können, wenn Ihr technischer Leiter im Urlaub ist.
Umfangreiche Bücher zum Thema Software-Design sind ebenfalls eine willkommene Ergänzung.
quelle
Wenn Sie eine Brownfield-Anwendung in Angriff nehmen, besteht der ideale erste Schritt darin, Unit-Tests dafür zu schreiben.
Dies bewirkt mehrere Dinge:
Ob die Organisation die Neigung hat, dies zuzulassen, ist eine andere Frage. Sie haben so lange ohne Unit-Tests gelebt; Es wird schwierig sein, sie dazu zu bringen, die technische Verschuldung auf diese Weise zu reduzieren.
quelle