Wie dokumentieren/definieren professionelle Entwickler Projekte?

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo,

ich habe eine Frage an Euch, die nur indirekt etwas mit dem aktiven Programmieren zu tun hat: wie definieren oder dokumentieren "professionelle" Entwickler ihre Projekte?

Bis jetzt mache ich mir einige Gedanken im Kopf, schreibe mir vieles auf und dann ist das mein Projekt. Aber ich könnte mir vorstellen, dass die "richtigen" Programmierer in einem Unternehmen formale Vorgaben und inhaltliche Vorgaben für soetwas haben.

Kennt jemand einige von diesen Vorgaben? Wie könnte man an ein Beispiel kommen (ich stelle mir da so ein pdf oder so vor, in dem die Entwicklung einer Software mit Anforderungen und co. beschrieben wird)? Wie macht Ihr das?

Ich hoffe, dass Ihr mir da helfen könnt, denn Google hat keine passenden Ergebnisse ausgeworfen ...

Gruß,
CPU :)
 
Naja....es gibt ja einen richtigen "Softwareentwicklungsprozess".....dort gibt es die Analyse und Konzeptionsphase, in der geplannt wird. Da entstehen unter anderem Lasten- und Pflichtenheft. Werkzeuge, die dabei oft verwendet werden, sind UML oder ähnliche Notationen.

Google einfach mal danach....Softwareentwicklung kann auch ingeneursmäßig mit Werkzeugen/Modellen und Prozessen betrieben werden :).
 
Schau dir dafür auch mal Programme für Inline Dokumentationen, wie z.B. Doxygen an.
Für Java gibt es ein eigenes Tool, was sich Javadoc nennt.
 
Geht es um die Dokumentation des Sourcecodes oder der Software an sich, oder um die Planungs- und Umsetzungsphase?
 
  • JavaDoc, phpDoc oder ähnliches
  • UMl-Diagramme (Sequenzdiagram für komplexe Abläufe usw)
  • Entity-Relationship-Modell + PDF der noch einige Designentscheidungen dokumentiert
  • PDF über die Architektur (Grundideen, Konzepte, Erklärung der Strukturierung: wo kann man leicht finden und modifzieren)

Umso mehr Informationen du lieferst, umso besser. Vergiss aber nicht, dass diese Dokumente angepasst werden müssen, wenn die Software verändert wird. Deswegen ist es meist sinnvoller nur Grundgedanken der Architektur zu erklären und die spezifischen Details aus dem Sourcecode mittels JavaDoc und Co zu generieren.

UnitTests sollten auf jedenfall auch dabei sein, obwohl es keine Dokumentation ist. Man fühlt sich gleich viel sicherer, wenn man eine Modifikation komplett inkl. aller Seiteneffekte durchtesten kann. Ein wenig Dokumentation bieten sie aber auch, wenn man es richtig macht: Agile Dokumentation
 
Zuletzt bearbeitet:
also normal ists ja auch immer Vision -> Scope -> Specification -> Development
Das ganze dann per SCRUM und dann haben die Entwickler meist freie Hand
da heißt es dann z.B.
Story: As a Customer I would like to be able to delete my account, to protect my privavcy
Criteria: Account is deleted completely, Confirmation mail about deletion.

und den Rest macht der Dev wie er es für richtig hält.
 
Das wichtigste ist, dass Du überhaupt dokumentierst! Glaub mir, selbst große (und ich meine bundesweit wirklich große) Softwareunternehmen haben teilweise in dem Bereich noch echte Lücken. Sofern Du also pauschal überhaupt dokumentierst, und wenns nur Kommentare sind, ist das schonmal was.

Anders ausgerückt: Der Sinn von Dokumentation wird immer dann klar, wenn die Frage aufkommt: "warum macht dieser Teil des Codes das ganze genau so?" - insbesondere, wenn man anfängt, irgendwo einen Bug zu korrigieren. Deine Dokumentation muss darauf eine Antwort liefern.

Der einfachste Weg ist es, bei jeder Entscheidung, die im Projekt gefällt wird, das Anforderungsdokument zu aktualisieren. Es mag sich kleinlich anhören: aber es ist so unglaublich wichtig, dass Entscheidungen nicht irgendwo in PostIts oder College Blöcken verschwinden, sondern in die zentrale Dokumentation mit aufgeschrieben werden. Das ganze kann soweit gehen, dass man sagt: Code wird erst angefasst, wenn die Dokumentation fertig ist. Dies zwingt einen Entwickler, sich Gedanken zu machen, was er später entwickelt. Ich persönlich würde das ganze allerdings nicht so krass formulieren, schließlich ist Implementierung immernoch ein kreativer Prozess, in dem die meisten Problemstellungen von alleine gelöst werden - ich entwickle gerne zuerst, und ziehe die Dokumentation dann nach. Allerdings würde ich hierbei vorher ein grobes Design erstellen, wie vorzugehen ist. Das fällt dann aber eher in die Kategorie "Wegwerfdokumentation" - also Gekritzel mit Papier und Bleistift.

So spontan würde ich sagen, sind folgende Dinge wichtig als Grundlage:
* Ein Software-Enwicklungsprozess
Hier gibt es verschiedene Ansätze: von klassischen Modellen bis hin zu etwas "kreativeren" Ansätzen wie SCRUM oder so. Die Kernfrage, so wie ich das sehe, ist, was steht im Vordergrund: die Dokumentation, oder der Code?
Klassische Ansätze werden immer sehr viel Dokumentation mit sich ziehen. Alternative Ansätze werden eher den Code in den Vordergrund bringen.
Wir fahren einen eher klassischen Ansatz.
* Coderichtlinien
Die Frage hierbei ist, wie weit der Code sich selbst dokumentieren soll (also Kommentierung). Es gibt ja durchaus Modelle, in denen z.B. JavaDoc genutzt wird, um am Ende eine HTML-Dokumentation zu erzeugen, aber in Aktion habe ich das auch noch nicht gesehen, außer bei der Java-Bibliothek selbst - und die haben sich nicht um Fachlichkeiten zu kümmern. Ich würde in sofern fachliche Dokumentierung aus dem Code heraushalten, und nur technische Details dort dokumentieren (Hintergedanke: dies interessiert den Kunden eh nicht, und der Entwickler hat ja den Quellcode -- es macht also wenig Sinn daraus ein Dokument zu erzeugen). Ein Funktionskommentar enthält also nur Informationen darüber, WIE etwas gemacht wird. WAS fachlich passiert, muss der Entwickler wissen, bevor er in den Code schaut. Wir trennen also bewusst Kommentierung von weiterführender Dokumentation, wie Word-Dokumenten. Nichts destotrotz wird natürlich JEDE Funktion kommentiert, bekommt ein Review, etc.


Wir entwickeln in einem eher klassischen Modell, welches jedoch abgespeckt ist - wir schreiben keine Bedienungsanleitungen, und trennen auch nicht klassisch nach Lasten- und Pflichtenheft. Wir erstellen zuerst Anforderungsdokumente (recht kleine, formlose Word-Dokumente mit fachlichen Eckpunkten, Skizzen, etc.), und entwickeln danach ein "Fachkonzept", in dem die Anwendung bereits funktional vollständig dokumentiert wird (dies geht bereits auf die Ebene, wo welcher Button landet). Dieses Dokument hat auch der Kunde, ist also offiziell, und wird von jedem Entwickler gepflegt, der etwas ander Anwendung ändert. Darüber hinaus ist das Fachkonzept auch vollständig, was dort drinsteht, ist gültig.

Dieses Vorgehen funktioniert natürlich nur, wenn die Anwendung noch halbwegs überschaubar ist (nicht > 10 Entwickler), man im Voraus in der Lage ist abzuschätzen, wie die Anwendung, die Masken, etc. später aussehen werden, und man sich mit seinem Kunden vernünftig unterhalten kann (dieser also einen Fachbereich hat, der weiß, was er will!). Andere Situationen mag ich mir aber auch nicht wirklich vorstellen^^

Test-Dokumentation habe ich hierbei jetzt mal außen vorgelassen - das ist ein recht schwieriges Thema. Wir fahren hier ein Modell mit recht aufwändigen Testplänen und Testphasen, welches jedoch meiner Meinung nach zu aufwändig ist, weswegen ich dazu nichts sagen möchte. Gänzlich ohne wird es aber kaum gehen, denn so toll einige Leute JUnit finden, es liefert nur einen oberflächlichen Test der Fachlichkeit/Technik, und den auch nur mit ordentlichem Mehr-Aufwand bei der Entwicklung. Freitests o.ä. ersetzen solche Frameworks auch nicht, um Testpläne wird man nicht drumrum kommen.
 
Zuletzt bearbeitet:
@ice-breaker... du hast recht. Es ist sehr unterschiedlich was man kommentieren muss, Planung vs SourceCode Doku.

Bei Planung muss man nur das wichtigste reinschreiben, da sonst zu viel Infos die Programmierer einfach unnötig ablenkt. Beim SourceCode sollte man nicht nur Methoden/Funktionen Kommentieren, sondern auch den Code den du schreibst. Sonst verstehst du später selbst nicht mehr wofür du diesen Code geschrieben hast. Na ja kenne aus Erfahrung :D
 
roker002 schrieb:
Beim SourceCode sollte man nicht nur Methoden/Funktionen Kommentieren, sondern auch den Code den du schreibst. Sonst verstehst du später selbst nicht mehr wofür du diesen Code geschrieben hast. Na ja kenne aus Erfahrung :D

also das habe ich mal als Selbstverständlichkeit angesehen :D
Wobei man dabei nicht in den Code schreibt, was man macht sondern warum man es macht.
 
@ice

Ne ich sehe das nicht so... Warum man es machst ist die Sache der Softwareplanung. was man macht ist schon die Sache des Sourcecodes. Du kannst doch nicht schreiben warum du diese Methode brauchst. Du kannst nur schreiben was die Methode macht. Es ist auch nicht der Sinn des Kommentars alles ausführlich zu beschreiben.

Für mich ist was 30% der Beschreibung und warum 70%. Warum sollte immer im Softwarekonzept beschrieben werden und nicht im Sourcecode als Kommentar.
 
ich beziehe mich mit meiner Aussage auf deine Aussage, dass auch Code innerhalb von Methoden dokumentiert werden soll, und da bringt es eben nichts wenn ich sage (findeXYZ, lade XYZ aus Datenbank), wenn man erraten muss, warum du XYZ finden musst.
Eine Kommentar sollte also so ähnlich sein:
// finde Median zur Angabe der Zerteilung der Menge
long median = Median.findFastMedian(statisticalArray);

(kein optimales Beispiel, aber macht den Sinn deutlich)
 
Ja ein Kommentar sollte immer sachlich sein... Wenn man genau wissen will, steht auch im Buch von Helmut Balzert "Basiskonzepte und Requirements Engineering" ab Seite 46 ;)


Und ja den inneren Code sollte man dann auskommentieren wenn man APIs oder den Code einer dritte Person benutzt. Diese sind meist nicht auskommentiert. Am schlimmsten sind die COM-fähige DLLs. Da hast du gar nichts.


Mein Code

Code:
/// <summary>
/// Schreibt eine 2x2 Tabelle in der Zelle Adresse
/// </summary>
/// <param name="Adresse">Tabellenzelle, in der die innere Tabelle erstellt wird.</param>
private void Info(Cell Adresse)
{
    ///Erstelle die innere Tabelle in der Zelle 2x2
    Table innerTable = Adresse.Tables.Add(Adresse.Range, 1, 2, WdDefaultTableBehavior.wdWord9TableBehavior, missing);

    ///Da es nicht mit 2x2 Tabelle funktionieren will, muss man die zweite Zeile per hand noch einmal hinzufügen.
    innerTable.Rows.Add(missing);

    Cell c11 = innerTable.Cell(1, 1);
    Cell c12 = innerTable.Cell(1, 2);
    Cell c21 = innerTable.Cell(2, 1);
    Cell c22 = innerTable.Cell(2, 2);

            
    ///Ändere die Schrift
    c11.Range.Font.Size = 8;

    this.SetCell(c11, Kunde.ToString(), WdParagraphAlignment.wdAlignParagraphLeft);
    c11.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;
    ///Ändere Tabellelänge auf 70%, da sonst Design einfach hässlich ist.
    c11.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;
    c11.PreferredWidth = 70;
            
    this.SetCell(c12, Kasse.ToString(), WdParagraphAlignment.wdAlignParagraphLeft);


    c21.Range.Font.Size = 12;
    this.SetCell(c21, Kasse.ToString(Systems.Kassen.Info.Adresse), WdParagraphAlignment.wdAlignParagraphLeft);
            
    c22.Range.Text = string.Empty;

    innerTable.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;
    innerTable.PreferredWidth = 100;

    ///Deaktiviere die Tabellenborders...
    innerTable.Borders.Enable = 0;
}


Wenn man einmal die Kommentare sieht, versteht man sofort alles.
 
Zuletzt bearbeitet:
Hi
Also meine Meinung dazu ist, Kommentare stinken.

Wer seine KlassenMethoden in der Methode noch beschreiben muß damit man versteht was in der Methode passiert, hat devinitiv was falsch gemacht.

In meinem Code gibt es keine Beschreibungen ausserhalb des üblichen PHPDocumentors. Wozu auch, die Klassen und Funktionen lassen schon durch die Namensgebung genau erschließen was sie tun und was man zurück bekommt.
Weiterhin ist selten eine Funktion länger als 15 Zeilen Code. Alles was mehr Zeilen braucht, ist zu 90% schlecht abstrahiert und die Regel der "einzigen Verantwortlichkeit" für diese Methode ist zu 99% verletzt.

Gruß Maria S.
 
Also meine Meinung dazu ist, Kommentare stinken.

Wer seine KlassenMethoden in der Methode noch beschreiben muß damit man versteht was in der Methode passiert, hat devinitiv was falsch gemacht.
Naja, da gäbe es mehrere Möglichkeiten, drauf zu antworten.

Die erste wäre zu sagen, das ist grober unfug, gefolgt von einem abfälligen PHP-Kommentar, aber das spar ich mir.

Das vielleicht bessere Gegenargument ist, dass Kommentierung ja nicht dafür da ist, schlechten Code zu erklären. Kommentierung soll erklären, warum etwas so dasteht, wie es dasteht. Beispielsweise hat vor jeder Performance-Optimierung ein Kommentar zu stehen. Wenn Deine Anwendungen das bisher nicht nötig hatten, hast Du noch nicht richtig programmiert.

Das dritte Argument wäre, woher nimmst Du eigentlich die Selbstsicherheit, so gut wie allen SE-Lehrbüchern zu widersprechen? Bist Du Software-Architekt bei IBM, oder was?
 
Bei uns @work heißt es: wenn man seinen Code kommentieren muss, hat man wohl was falsch gemacht. Daher findet man im gesamten Projekt (welches knapp 1000 Klassen und 600 Facelets umfasst) fast keine Kommentare. Der Sinn muss sich aus der jeweiligen Bezeichnung erschließen - habe ich den Eindruck. Immer wildes rumgesuche, wie man was löst.

Dann kommt noch eine Portion Chaos und schlimmstenfalls Konzeptlosigkeit hinzu.

Bei mir ist es dann noch ein Mangel an Ahnung. ;-)
 
captmcneil schrieb:
Bist Du Software-Architekt bei IBM, oder was?
Ich bin zwar nicht bei IBM ;), darf mich aber laut meinem Arbeitgeber auch "Software Architekt" schimpfen. Und ich bin absoluter Verfechter von Kommentaren im Code. Lieber zu viel als zu wenig! Ich bin aber auch so frei bei Codereviews unseren Entwicklern auch mal zu sagen "Löscht diesen Kommentar. Der ist Dreck", "Schreibe hier noch was dazu" oder "Formuliere das um".

Und Dokumentation zu einen Projekt erschöpft sich bei Weitem nicht in Codekommentaren. Das ist nur ein kleiner Teil davon.
Ich zähle mal auch was ich als "Projekt-Doku" spontan verstehen würde:
  • Lastenheft und Pflichtenheft
  • Systemarchitektur (z.B. in einem CASE-Tool)
  • Softwarearchitektur/-design (auch gleich in einem CASE-Tool)
  • Jede Art Dokument, in dem Infos stehen warum im (Software-)System etwas gemacht wurde und wie.
  • Findings/Change Request/Bugs Reports usw. (wie auch immer das im verwendeten System genannt wird). Diese Sachen dokumentieren auch warum eine Software (um mal dabei zu bleiben) so wurde wie sie ist.
 
Hi

@captmcneil
Wie dein Nachredner schon gesagt hat. Wenn du Quellcode Kommentieren mußt weil er sich nicht selbst erschließt dann sollte man darüber nachdenken was man besser machen kann.

Dazu auch dieser schöne Artikel von den PHP Leuten: http://it-republik.de/php/artikel/Code-Smells---wenn-es-stinkt-wechsle-es!-3098.html

und nein ich bin kein SoftwareArchitekt trotzdem programmiere ich schon lange an großen Projekten und daher kann ich aus Erfahrung sprechen.

Wenn der Code so kompliziert ist das man ihn versuchen muß zu erklären dann schafft das eine Erklärung selten es wirklich anständig aufzuklären. Die beste Erklärung ist ein Code der sich selbst erklärt.
Das heißt also wenn die Codevariablen gut benannt wurden, wenn vorher über die Software nachgedacht wurde und das von anfang an anständig durchgezogen wurde so ist eine Documentation über jeder Methode vollkommen ausreichend.

Und ich bleibe bei der Aussage .. wer CodeErklärungen in den Code selber schreiben muß sollte über das Stück Code was er da schreibt nachdenken.

Gruß Maria
 
@Maria S: Du hast meinen Post nicht gelesen, meine Aussage sagt genau das NICHT, was Du mir unterstellst. Lesen lernen!

Du sagst, Kommentare sind unnütz, weil guter Code für sich selbst spricht. Das ist so schlicht falsch. Das ist insbesondere auch das, was mein Nachredner sagte.

Was er mit "unnötigen Kommentaren" meinte, war wohl sowas wie:
Code:
int add(int a, int b) {
  // returns a + b
  return a + b;
}
sowas ist natürlich blödsinn. Wie schon vielfach geschrieben, kommentiert man nicht, was man tut, sondern warum man es tut. Das ist mit sinnvoller Bezeichnerbenennung alleine nämlich nicht getan.
 
Zuletzt bearbeitet:
Also wäre dein Kommentar zu dem Quellcode da oben:

Ich addiere a zu b um die Summe aus a und b zu erhalten?

Gruß Maria
 
Zurück
Oben