Rechen, auf den es sich nicht zu treten lohnt

Von einem Übersetzer: Dies ist eine Übersetzung eines Artikels von Joel Spolsky. Nach zwei Jahren kann dieser Artikel bereits in den USA und nach zwei weiteren Jahren - und nicht nur dort - die Autorechte erwerben. Ja, sie ist 14 Jahre alt (oder eher 14 Jahre und 11 Tage), aber sie hat kein einziges relevantes Gramm verloren. Ich sehe regelmäßig, wie Programmierer (und manchmal ich selbst) versuchen, auf diesen Rechen zu treten. Die Tatsache, dass ich ihre Übersetzung auf Habré nicht gefunden habe, könnte darauf hindeuten, dass ich schlecht aussah. Ich bitte Sie, Übersetzungsfehler im

UPD LAN zu melden : Es stellt sich heraus, dass Joels Artikel, einschließlich dieses Artikels, auch in der Papierausgabe Joel on Programming enthalten sind

Schließlich wird die erste öffentliche Beta von Netscape 6.0 veröffentlicht. Version 5.0 existiert nicht. Die vorherige Hauptversion, Version 4.0, wurde vor fast drei Jahren veröffentlicht. Drei Jahre sind eine unglaublich lange Zeit in der Welt des Internets. Während dieser ganzen Zeit saß Netscape und beobachtete hilflos, wie ihr Marktanteil sank.

Es ist ein bisschen gemein von mir, sie für ein so langes Warten zwischen den Veröffentlichungen zu kritisieren. Sie haben es nicht mit Absicht gemacht , oder?

Nicht wahr Genau das haben sie getan. Und dies war der größte strategische Fehler , den ein Softwareunternehmen jemals machen kann.

Sie beschlossen, den Code von Grund auf neu zu schreiben.

Netscape war nicht das erste Unternehmen, das einen solchen Fehler begangen hat. Borland schloss es mit dem Kauf von Arago ab und beschloss, es in dBase für Windows umzuwandeln - ein Projekt, das so lange dauerte, dass alle Extras an Microsoft Access gingen. und dann machten sie es noch einmal, indem sie Quattro Pro von Grund auf neu schrieben und alle beeindruckten, wie wenig das Programm konnte. Microsoft selbst wiederholte fast denselben Fehler, als es versuchte, Word für Windows von Grund auf neu in ein zum Scheitern verurteiltes Projekt namens Pyramid zu schreiben, das minimiert, weggeworfen und vergessen wurde. Zum Glück für Microsoft hörte die Arbeit an dem alten Code nicht auf, und sie mussten etwas veröffentlichen, sodass sich herausstellte, dass dies alles eine finanzielle Katastrophe war, aber keine strategische.

Wir sind Programmierer. Und Programmierer im Herzen sind Architekten, und das erste, was sie tun möchten, wenn sie zur Arbeit gehen, ist, mit einem Bulldozer herumzulaufen und etwas Großartiges zu tun. Wir sind mit den nachfolgenden Verbesserungen nicht zufrieden: Verschärfen, optimieren.

Es gibt einen heimtückischen Grund, warum Programmierer immer den gesamten vorhandenen Code wegwerfen und neu schreiben möchten. Sie denken, dass der alte Code ein Durcheinander ist. Und hier ist eine interessante Beobachtung: Wahrscheinlich irren sie sich. Der Grund, warum sie den Code für schrecklich halten, liegt im fundamentalen Gesetz der Programmierung: Das

Lesen von Code ist schwieriger als das Schreiben

Deshalb ist es so schwierig, den Code wiederzuverwenden. Deshalb hat jeder im Team seine eigene Funktion, um die Zeichenfolge in ein Array aufzuteilen. Sie schreiben ihre Funktionen, weil das Schreiben ihrer eigenen Funktion einfacher und lustiger ist als das Verstehen der Arbeit der alten.

Zur Unterstützung dieses Axioms können Sie fast jeden modernen Programmierer nach dem Code fragen, an dem er arbeitet. "Es ist nur ein verdammtes Durcheinander", wird er sagen. "Alles was ich tun möchte, ist ihn in die Hölle zu treten und von vorne anzufangen."

Warum ein Durcheinander?

„Sehen Sie sich diese Funktion an“, wird er sagen. Sie ist zwei Seiten lang! Es ist fast alles unnötig. Ja, ich weiß nicht einmal, warum die Hälfte dieser API-Aufrufe hier ist. "

Vor der Veröffentlichung von Borlands neuem Windows-Tabellenkalkulations-Manager lobte die Presse Philip Kahn, den Gründer des Unternehmens, dafür, wie cool Quattro Pro wäre als Microsoft Excel, da es von Grund auf neu geschrieben wurde. Völlig neuer Code! Als ob der Code rosten würde.

Die Vorstellung, dass der neue Code besser ist als der alte, ist eindeutig absurd. Alter Code wurde verwendet . Es ist getestet . Viele Fehler wurden gefunden und behoben . Und das ist in Ordnung. Der Code erzeugt keine Fehler, die nur auf der Festplatte auftreten. Genau das Gegenteil! Welche Software ist ein alter Dodge Dart, der nur im Leerlauf in einer Garage rostet? Ist das ein Teddybär, der schlecht aussieht, wenn er nicht exklusiv hergestellt wird?neues Material?

Kehren wir zur Doppelseitenfunktion zurück. Ja, ich weiß, dies ist eine einfache Funktion zum Anzeigen eines Fensters, aber es ist mit Müll und anderem Müll überwachsen, und niemand weiß warum. Nun, ich sage, warum: Dies sind Fehlerkorrekturen. Dieses Teil behebt einen Fehler, der Nancy passiert ist, als sie versucht hat, alles auf einem Computer ohne IE zu installieren. Dies ist der Fehler, der auftritt, wenn nicht genügend Arbeitsspeicher vorhanden ist. Und das hier - wenn sich die Datei auf einer Diskette befindet und der Benutzer sie mitten in allem herausgezogen hat. Dieser Aufruf von LoadLibrary ist schrecklich, aber dank ihm funktioniert der Code auf älteren Versionen von Windows 95.

Es vergingen Wochen, in denen das Programm in Echtzeit verwendet wurde, bevor diese Fehler gefunden wurden. Ein Programmierer kann mehrere Tage brauchen, um sie zu reproduzieren und zu korrigieren. Es kommt oft vor, dass ein Patch nur eine Codezeile oder sogar ein paar Zeichen enthält, aber viel Zeit in diese beiden Zeichen investiert wird.

Wenn Sie den Code wegwerfen und erneut schreiben, werfen Sie all dieses Wissen weg. All diese Fehler behoben. Jahre der Arbeit von Programmierern.

Sie werfen Ihren Vorteil auf dem Markt weg. Sie geben Ihren Konkurrenten zwei oder drei Jahre Zeit, und das ist, glauben Sie mir, viel Zeit im Zusammenhang mit der Softwareentwicklung.

Dies ist eine sehr gefährliche Situation, wenn Sie die alte Version des Codes von Jahr zu Jahr veröffentlichen müssen, ohne die Möglichkeit strategischer Änderungen oder Reaktionen auf Marktanforderungen zu haben. Und das alles, weil das neue Produkt noch nicht fertig ist. Es ist das gleiche, als würde man ein Unternehmen für die gesamte Zeit schließen.

Dies ist die Verwendung großer Geldbeträge, um Code zu schreiben, der bereits existiert.

Welchen Ausweg daraus? Netscape-Code war wirklich schlecht. Nun, er könnte böse sein, aber weißt du was? Es funktionierte ziemlich gut auf einer wilden Anzahl von echten Computersystemen.

Wenn Programmierer sagen, dass ihr Code ein schreckliches Durcheinander ist (und das sagen sie immer), bedeutet dies normalerweise drei Arten von Problemen.

Das erste sind Architekturprobleme. Der Code wird nicht überarbeitet. Der für Netzwerkverbindungen verantwortliche Code wirft plötzlich aus dem Nichts seine eigenen Dialogfelder aus. Dies sollte im UI-Code behandelt werden. Solche Probleme können einzeln behoben werden: durch sorgfältiges Umgestalten und Ändern der Schnittstellen. Dies kann von einem Programmierer durchgeführt werden, der sorgfältig arbeitet und seine Änderungen als Ganzes einführt, ohne jemanden zu stören. Selbst beeindruckende architektonische Änderungen können vorgenommen werden, ohne Code wegzuwerfen. Im Juno-Projekt haben wir einige Monate damit verbracht, die Architektur umzugestalten: einfach alles zu verschieben, alles zu bereinigen, sinnvolle Basisklassen und Schnittstellen zwischen Modulen zu erstellen. Aber wir haben es ordentlich gemacht und mit dem aktuellen Code haben wir keine neuen Bugs eingeführt oder funktionierenden Code weggeworfen.

Das zweite Problem, das Programmierer ihren Code für ein Chaos halten, ist die Ineffizienz. Es wurde angenommen, dass Netscape einen schlechten Rendering-Code hat. Dies betraf jedoch nur einen kleinen Teil des Projekts, der optimiert oder sogar umgeschrieben werden kann. Aber nicht alles neu schreiben. Bei Optimierung auf Geschwindigkeit ergibt 1% der Arbeit 99% des Ergebnisses.

Und drittens kann der Code einfach unglaublich ekelhaft sein. Ich habe einmal an einem Projekt gearbeitet, das den Datentyp FuckedString ernsthaft verwendete. In einem anderen Projekt haben wir uns darauf geeinigt, die Eigenschaftsnamen mit "_" zu beginnen, aber später beschlossen, auf das standardmäßige "m_" zu wechseln. Daher begann die Hälfte der Funktionen mit "_" und die Hälfte mit "m_", und das war widerlich. Ehrlich gesagt sind dies Probleme, die gelöst werden, indem Makros in Emacs für fünf Minuten geschrieben werden, anstatt sie von Grund auf neu zu schreiben.

Es ist wichtig, sich daran zu erinnern, dass es keinen Grund gibt, zu glauben, dass es besser wird als beim ersten Mal , wenn Sie von vorne anfangen zu schreiben . Erstens ist das Team der Programmierer höchstwahrscheinlich nicht mehr dasjenige, das an der ersten Version gearbeitet hat, so dass es keine "mehr Erfahrung" geben wird. Alles endet damit, dass alle alten und einige neue Fehler gemacht werden, die nicht in der Originalversion enthalten waren.

Altes Mantra zum Wegwerfen"Es ist sehr gefährlich, wenn es auf ein kommerzielles Großprojekt angewendet wird. Wenn Sie mit Code experimentieren, können Sie eine Funktion ausschneiden, die vor zwei Wochen im Zusammenhang mit der Suche nach dem besten Algorithmus geschrieben wurde. Alles ist in Ordnung. Sie können die Klasse so umgestalten, dass sie einfacher zu verwenden ist. Alles ist auch da Aber das ganze Programm rauszuwerfen ist ein gefährlicher Fehler, und wenn Netscape von einem Unternehmen mit Erfahrung in der Softwareindustrie überwacht worden wäre, hätte man es wahrscheinlich nicht mit so viel Eifer in den Fuß geschossen.

Jetzt auch beliebt: