Warum sich mit detaillierten Spezifikationen beschäftigen?

8

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?

Dsimcha
quelle
7
Warum muss es "toter Baum" sein? Warum nicht ein Wiki oder PDF?
Philip Regan
@Philip: Grundsätzlich kein Grund. Es ist nur so, dass sehr formelle Dokumente dazu neigen, auf toten Bäumen geschrieben zu werden, insbesondere bei großen, bürokratischen Organisationen wie den, die ich mir vorstelle.
Dsimcha
Software-Spezifikationen eignen sich hervorragend für Programmierer, aber noch besser für Kunden, damit sie ihre Erwartungen an das Endprodukt konkret definieren ... bevor Sie mit der Arbeit an Ihrer Magie beginnen.
ToTheBeach
2
Ich bin für hohe Spezifikationen. Gerade genug Details, damit der Kunde versteht, was er bekommt, und die Entwickler verstehen, was der Kunde will. Wenn Sie mehr Details als dies tun, werden Sie am Ende Dokumente anstelle von Code verwalten.
Berin Loritsch
@Berin: Richtig, das habe ich mit einer informellen Spezifikation auf hoher Ebene gemeint. Als ich diese Frage schrieb, dachte ich mehr an Standards (zum Beispiel C ++ - Compiler) als an Unternehmenssoftware.
Dsimcha

Antworten:

37

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. "

Satanicpuppy
quelle
13
Ich bedaure nur, dass ich nur eine Gegenstimme für diese Weisheit habe.
Dan Ray
3
+1. Weisheit. Das letzte Geschäft, in dem ich gearbeitet habe, war ein abonnementbasiertes Geschäftsmodell, bei dem die Kunden weiterhin für die vorhandenen Lizenzen bezahlen und über andere Funktionen schreien, die sie nur haben müssen (z. B. Sie riskieren, sie irgendwann zu verlieren, wenn Sie ihre nicht implementieren Scope Creep - aber sie bezahlen dich gleichzeitig, damit du sie glücklich machen willst. In der Regel werden Sie jedoch bei der Implementierung von Scope Creep nicht bezahlt. Außerdem: Durch dieses Geschäftsmodell können sich die Entwickler wirklich wie Sackgassen-Codemonkeys fühlen.
Bobby Tables
1
+1 Ich kam zur Programmierung über technische HLK-Steuerungssysteme - eine typische Spezifikation für ein Gebäude wäre mehrere hundert Seiten. Projekte wurden vom Berater / Kunden angenommen, wenn alle Punkte angekreuzt waren - Abweichungen würden Kosten verursachen und die Frist verlängern. Die Sache ist - aus irgendeinem Grund scheint es in der allgemeinen Softwareentwicklung zu sein, dass die Spezifikation vom Implementierer geschrieben werden sollte - ich denke, das ist falsch - in der HLK kam die Spezifikation durch einen Bauberater (obwohl der Implementierer abfragen und herausfordern konnte die Spezifikation jederzeit).
HorusKol
1
"Wenn die Fertigstellungszeit vergeht, werden sie 10.000 kleine Dinge entdecken, die sie unbedingt haben müssen." Aber das gilt nur für maßgeschneiderte Software. Wenn Sie eine eingeschweißte Software oder eine interne Software entwickeln, geschieht dies, wenn Sie sagen, dass dies erledigt ist. Es wird immer Anfragen nach zusätzlichen Funktionen geben. Einige von ihnen werden in einer zukünftigen Version enthalten sein, andere nicht. Ich sehe hier nicht den Vorteil detaillierter Spezifikationen.
Nikie
2
@nikie: Erzähl es dem Duke Nukem Design Team. Sie müssen sich mit Qualitätssicherung, Marketing, Phbs befassen, die zu viele Zeitschriften lesen ... Es ist immer noch wichtig.
Satanicpuppy
8

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
8

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).

FrustratedWithFormsDesigner
quelle
1
+1 für die Aufrechterhaltung der Spezifikationen während der gesamten Projektlaufzeit.
Chuck Stephanski
6

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.

Adam Crossland
quelle
1
Ich glaube, dass das OP nach der Nützlichkeit von Detail-Design-Spezifikationen gefragt hat. Jeder weiß, dass ein gut geschriebenes Anforderungsdokument für den Erfolg eines Projekts entscheidend ist. Ich bin mir nicht so sicher, ob Detail-Design-Spezifikationen heute so nützlich sind wie damals, als wir viel niedrigere Programmiersprachen verwendeten. Damals wurde im Pseudocode eine detaillierte Designspezifikation festgelegt, die codiert werden musste. Der implementierte Code wurde während einer Codeüberprüfung mit dem Pseudocode verglichen, um die Richtigkeit sicherzustellen. Diese Ausrichtung hatte auch den Nebeneffekt, dass eine Unterklasse von Codierern erzeugt wurde, die nach Spezifikation codierten.
Bit-Twiddler
3

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.

BillThor
quelle
3

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:

  • Wenn Ihr Design für die Größe des Teams, die Komplexität der Arbeit und die Anforderungen der Tore, durch die Sie gehen müssen (Sicherheitsüberprüfungen, Sicherheitsüberprüfungen usw.), zu detailliert ist, haben Sie wertvolle Zeit und Geld verschwendet Ein Artefakt, das Sie niemals benutzen werden.
  • Wenn Ihr Design nicht detailliert genug ist, verschwenden Sie Geld, da die Teammitglieder falsche Annahmen treffen, die zu Integrationsproblemen führen, und Sie riskieren schwere Nacharbeiten, wenn ein abschließendes Sicherheitsaudit Probleme aufdeckt, die frühzeitig und kostengünstig hätten behoben werden können, wenn sie aufgetreten wären klare Aspekte des Designs vor der Implementierung.

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.

bethlakshmi
quelle
2

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.

HLGEM
quelle
+1 - Manchmal muss man erkennen, dass es sich um ein Geschäft handelt, bei dem technische und nichttechnische Mitarbeiter das Gesamtbild auf vielfältige Weise sehen.
JeffO
2

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.

Nikie
quelle
1

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.

JeffO
quelle