Was bringt es beim Schreiben von Software, eine formale, detaillierte Dead-Tree-Spezifikation zu schreiben? Zur Verdeutlichung ist für mich eine etwas informelle Spezifikation auf hoher Ebene für Personen, die den Code nicht lesen möchten, sinnvoll. Bei einer Referenzimplementierung in gut kommentiertem, lesbarem Quellcode handelt es sich jedoch um die eindeutigste Spezifikation von allem, was Sie erhalten werden, da ein Computer in der Lage sein muss, sie auszuführen. Formale Spezifikationen sind oft genauso schwer zu lesen und fast so schwer zu schreiben wie Code.
Welche Vorteile bietet eine formale Spezifikation gegenüber einer Referenzimplementierung sowie eine kleine Dokumentation darüber, welches Verhalten undefiniert / implementierungsdefiniert ist, unabhängig davon, wie es in der Referenzimplementierung funktioniert.
Bearbeiten: Alternativ, was ist falsch daran, dass die Tests die formale Spezifikation sind?
Antworten:
Wie können Sie wissen, dass Sie fertig sind, wenn Sie nicht wissen, wie es aussehen soll, wenn es fertig ist?
Feature Creep wird Sie fangen. Sie werden versuchen, für einen Kunden zu liefern, und wenn die Fertigstellungszeit abläuft, werden sie 10.000 kleine Dinge entdecken, die sie unbedingt haben müssen .
Um bezahlt zu werden und Ihren Chef von Ihrem Rücken zu bekommen, wenn die Frist abgelaufen ist, müssen Sie in der Lage sein, die Spezifikation herauszuholen und zu sagen: "Alle meine Zeit- und Kostenschätzungen waren für diese Sache, nicht für diese neue was jeder entschieden hat, dass er will. "
quelle
Mit den Spezifikationen können Sie über Dinge nachdenken, ohne vorher viel Code geschrieben zu haben, der geändert werden müsste, wenn sich die Spezifikation ändert. Betrachten Sie es als zwischen Tafel und tatsächlicher Codierung
Dies ist auch eine sehr gute Idee, wenn mehrere unabhängige Parteien Komponenten schreiben, die zusammenpassen müssen.
quelle
Zusätzlich zu einigen der anderen bereits erwähnten sehr guten Gründe können Sie mit einer formalen Spezifikation CYA - Cover Your Ass! Wenn die Manager / Analysten / Tester sagen, dass Sie etwas nicht richtig erstellt haben, können Sie auf die Spezifikation verweisen und sagen: "Ich habe es so erstellt, wie Sie es wollten!". Dazu gehören Dinge auf niedriger Ebene wie "Alle Daten, die in der Tabelle AXX_RGV gespeichert sind, müssen sich in GROSSBUCHSTABEN befinden", "Webformulare mit weniger als 3 Eingabefeldern sollten die Schaltfläche" Senden "unten links haben" usw.
Auch wenn Leute bei einem sehr langen und großen Projekt Dinge vergessen, kann es sehr nützlich sein, eine detaillierte Spezifikation zu haben, auf die sie sich beziehen können. Denken Sie daran, dass die Spezifikation ein lebendes Dokument sein sollte, und wenn sich die Anforderungen ändern (durch einen hoffentlich dokumentierten und formalen Prozess), muss dies auch die Spezifikation sein. Ja, das kann länger dauern. Nach meiner Erfahrung lohnt es sich (wenn es richtig gemacht wird).
quelle
Eine formale Spezifikation der Anforderungen eines Programms ist erforderlich, da der Softwareentwickler wissen muss, was zu implementieren ist. Der QS-Ingenieur muss wissen, was zu testen ist, und der Kunde muss wissen, was zu erwarten ist.
Mit einer Spezifikation können Sie feststellen, wann Sie mit dem Programmieren fertig sind.
quelle
Einer der Hauptvorteile kann die Sicherheit sein. Ich würde nicht in einem Verkehrsflugzeug fliegen wollen, in dem die Spezifikation der Steuerungssysteme eine Referenzimplementierung war. Ich möchte wirklich, dass jemand spezifiziert, was die Systeme in einer Form tun müssen, die jemand, der mit der Software nicht vertraut ist, verstehen kann. Ich würde erwarten, dass jede Anforderung durch Tests vollständig überprüft wurde.
Für weniger sicherheitskritische Systeme sind Spezifikationen Kommunikationsmittel. Sie sollten detailliert beschreiben, was das System tun muss, um das System aufzubauen und zu testen. Wie das System dies tut, liegt in der Verantwortung des Codes. Die erforderlichen Details hängen von der Fachkompetenz des Entwicklungsteams und dem Zugriff auf Domänenexperten ab.
Die Spezifikationen sollten immer mit den implementierten Systemen übereinstimmen. Wenn in der Spezifikation Fehler gefunden werden, sollte die Spezifikation aktualisiert werden.
Schätzungen zu Fehlerursachen, die ich gesehen habe, weisen darauf hin, dass Testfehler relativ gleichmäßig zwischen Fehlern in Spezifikationen, Code und Tests aufgeteilt sind.
quelle
Ich denke, diese Frage ist der Kern der Frage nach dem Lebenszyklus von Agilität und Wasserfall.
Wenn Sie agil arbeiten, ist eine Grundvoraussetzung, dass der Code in Verbindung mit einer engen Entwicklerinteraktion besser und schneller ist als die detaillierte Spezifikation. Das Team priorisiert die Veröffentlichung neuer Funktionen und hoher Qualität gegenüber anderen Dingen - wie formalen Kommunikationsmechanismen wie detaillierten Designspezifikationen. Aber hier gibt es einen Handel - Sie müssen Kommunikationskanäle zwischen Teammitgliedern haben, über die sie nach Nuancen und detaillierten Designabsichten fragen können, wenn sie diese benötigen.
Wenn Sie einen Wasserfall machen, gehen Sie davon aus, dass das Ausfüllen des Codes unter dem detaillierten Entwurf und das anschließende Testen von Bedeutung ist. Und Sie möchten den Stakeholdern frühzeitig einen Einblick geben, wie diese Arbeit ablaufen wird und wie sie aussehen wird, wenn sie abgeschlossen ist. Dies kann dazu führen, dass das Design mit dem Kunden überprüft wird, um sicherzustellen, dass Sie sinnvolle Funktionen ausgewählt haben. Es kann auch sein, es mit Experten in anderen Bereichen zu überprüfen - z. B. Sicherheitsüberprüfungen, Sicherheitsüberprüfungen und Überprüfungen durch Teammitglieder, die in Ihren Code integriert werden müssen. Es wird davon ausgegangen, dass diese Überprüfungen auf lange Sicht Zeit sparen, da Sie dadurch nicht viel Zeit für die Entwicklung des Falschen benötigen.
In letzter Zeit habe ich eine wirklich großartige Fusion zwischen detaillierten Designs und Codekommentar-Tools gesehen - zum Beispiel JavaDoc. Da die detailliertesten Designs Fußabdrücke des Codes und kurze Erklärungen dessen sind, was er tun wird, ist dies mehr oder weniger das Gleiche, was Sie als Codekommentare erwarten würden. Ein Tool, das Codekommentare in detaillierte Designspezifikationen umwandelt, ist also großartig - eine viel bessere Möglichkeit, sie auf dem neuesten Stand zu halten, als sie von Hand zu erstellen.
Ich glaube, dass eine ungenaue Einschätzung, wie detailliert das Projekt sein sollte , ein wesentlicher Faktor für das Kostenwachstum ist. Das Schlimmste ist, dass du verdammt bist, wenn du es tust, und verdammt, wenn du es nicht tust:
Ich glaube nicht, dass es sich um ein Schwarz-Weiß-Gehäuse handelt. Es kann vorkommen, dass einige Komponenten "gut genug" sind, wenn sie auf hohem Niveau entworfen werden, während andere strenge Detailarbeiten erfordern. Und sich ändernde Team- oder Projektumgebungen können neue Designanforderungen bestimmen, wenn sich ein Projekt weiterentwickelt.
quelle
Ich arbeite gerade an einem großen Projekt. Bisher hat die Spezifikation der Qualitätssicherung geholfen, herauszufinden, was getestet werden soll, und es uns ermöglicht, dem Kunden mehr (deutlich wie in Millionen) in Rechnung zu stellen, als sie beim Benutzertest entschieden haben, dass das, was sie vereinbart hatten, nicht das war, was sie wirklich wollten, und die Menschen befähigte Durch die Überprüfung des Codes, um festzustellen, ob der Code die Anforderungen erfüllt, konnten die Entwickler eine Grundlage haben, um zu überprüfen, ob sie fertig waren, und auf die Spezifikation zu verweisen, um Streitigkeiten darüber beizulegen, was das Modul enthalten sollte. Es ermöglichte uns auch, Entwickler zu identifizieren, die nicht das produzierten, was der Kunde benötigte, bevor der Kunde das Produkt sah, und dies endete als Grundlage, um einige Leute loszuwerden, die die Spezifikation nicht konsequent befolgen konnten. Die Komplexität unserer Spezifikation half dem Kunden zu erkennen, dass wir bei unseren Kosten- und Zeitschätzungen nicht unverschämt waren.
Ich wollte hinzufügen, ich habe an Projekten mit guten Spezifikationen, mit schlechten Spezifikationen und ohne Spezifikationen gearbeitet. Diejenigen, die am schlimmsten waren, waren die nicht spezifizierten, da das Entwicklungsteam und der Kunde immer eine andere interne Vision des Endergebnisses hatten. Dies sind die Projekte, in denen Sie herum murmeln: "Wo kann ich ein Gedankenlesemodul bekommen?" Zu erraten, was der Kunde möchte, ist eine schreckliche Erfahrung. Schlechte Spezifikationen sind nicht viel besser, aber zumindest können Sie sie verfeinern und sagen: "Ich bin nicht sicher, was Sie hier gemeint haben." um mehr Informationen zu erhalten, bevor Sie Ihre Zeit damit verschwenden, das Falsche zu bauen. Das große Projekt, an dem ich gerade arbeite, hat erstaunlich gute Spezifikationen, es macht das Leben einfacher und viel stressfreier.
quelle
Persönlich denke ich, dass detaillierte Spezifikationen überbewertet sind.
Nach meiner Erfahrung sind das, was die Kunden brauchen und was die Kunden zu brauchen glauben , oft zwei verschiedene Dinge. Wenn Sie Anforderungen frühzeitig einfrieren, erstellen Sie das, was sie für erforderlich halten, und nicht das, was sie tatsächlich benötigen. Rechtlich gesehen sind Sie auf der sicheren Seite und werden bezahlt, aber Sie werden keinen zufriedenen Kunden haben.
Wenn Sie jedoch akzeptieren, dass Softwareentwicklung in gewissem Maße eine Sondierungsaktivität ist, werden Sie versuchen, die Anforderungen so lange wie möglich offen zu halten. Besprechen Sie mit den Benutzern, was Sie für die aktuelle Iteration wissen müssen , nicht mehr und nicht weniger. Und wissen Sie, dass Sie diese Entscheidungen manchmal in einer späteren Iteration erneut prüfen müssen. Am wichtigsten: Denken Sie daran, dass dies nicht die Schuld des Kunden ist. Sofern Ihre Benutzer nicht auch Softwareentwickler sind, ist das Sammeln von Anforderungen nicht Teil ihrer Stellenbeschreibung. Es ist Teil Ihrer Stellenbeschreibung.
Wie verhindern Sie das Kriechen von Features? Idealerweise durch einen vernünftigen Produktmanager, der für die Annahme oder Ablehnung von Funktionsanfragen zuständig ist und der von niemand anderem außer Kraft gesetzt werden kann.
quelle
Agile ist über 10 Jahre alt, dies ist also kein neues Phänomen.
Ich würde hoffen, dass die Spezifikationen viel kürzer als der Code sind, daher weiß ich nicht, wie viele Details Sie benötigen. Es sollte genug geben, um die Teammitglieder auf dem Laufenden zu halten. Ist es praktisch / notwendig, den gesamten Code des anderen zu lesen?
Einverstanden, keine Notwendigkeit für tote Dokumente. Ich würde mich lieber einer unbekannten Codebasis ohne Dokumentation als einer falschen Dokumentation nähern.
Und wenn der Computer Ihren Code so gut ausführen kann, warum lassen Sie ihn dann nicht seine eigenen Änderungen vornehmen? Das Befolgen des Rezepts auf der Rückseite der Schachtel macht Sie nicht zum Koch.
quelle