Forum: PC-Programmierung Softwareentwicklung-Vorgehensweise


von Frank (Gast)


Lesenswert?

Hallo zusammen,

ich würde mal gerne eure Vorgehensweisen erfragen, wenn ihr neue 
Projekte angeht.

Zu dem Hintergrund:
Ich programmier gerade Software-Paket, für Mikrocontroller in C und .NET 
in Basic und Java. Alles für das gleiche Projekt. Es handelt sich um ein 
größeres Projekt mit mehreren selbstdefinierten 
Kommunikationsprotokollen. Ich selber programmier schon was länger (5-6 
Jahre) auch größere Sachen. Auf PC-Basis Objektorientiert und mit C 
soviel es geht :D

Jetzt steh ich aber manchmal vor dem Code und weiss einfach nicht, wie 
ich weiter machen soll.

Wie macht ihr das? Weil Flussdiagramme meiner Meinung eher ungeeignet 
sind (mit Ausnahme Mikrocontroller) und UML-Diagramme zwar die Objekte 
wiedergeben, aber eher weniger wie die Software interagieren soll.

Also würde mich freuen, wenn ihr mal berichtet, wie ihr das so macht?

Gruß
Frank

: Verschoben durch User
von Thomas B. (nichtessbar)


Lesenswert?

Vor meinem Schreibtisch steht ein Flipchart (Whiteboard wär noch 
besser...) und ich zeichne für Komplexere Algorithmen und Abläufe immer 
Flussdiagramme. Erst wenn ich das Flussdiagramm fertig hab und wenn 
möglich mit jemand anderem besprochen, dann erst mach ich mich an die 
Implementierung.

Bei Objekten notiere ich mir meistens was ich von der Klasse erwarte, 
wie ich erwarte die in meinem nächsten Programmverlauf zu verwenden 
(sprich Interfaces definieren), ... private Methoden und Variablen 
kommen dann während des Programmierens einfach so dazu, über das äußere 
Erscheinungsbild mach ich mir vorher Gedanken. Wird dann leider öfters 
mal "außen hui, innen pfui.."

Sind die Schnittstellen definiert, erstelle ich die Klasse mit den 
Schnittstellen, die bleiben aber vorerst leer.

Danach schreibe ich (ab und zu auch innerhalb der Klasse) eine 
Testfunktion, die Soll- und Fehlfunktionen testet und in einer Übersicht 
printed (Test bestanden, Test nicht bestanden). Sprich einfach unit 
testing..

Ist der Test fertig, implementiere ich die Funktion der Klasse.

Ich muss aber zugeben, dass das eher eine theoretische Vorgehensweise 
ist, fällt mir oft schwer sie exakt einzuhalten, aber mit der hab ich 
bis jetzt am wenigsten Fehler übersehen.

Am uC - wenn er von außen gesteuert wird - am besten auch schonmal 
Testszenarien vordefinieren (Tasten drücken, bestimmte Befehle schicken, 
wild auf der Tastatur hämmern, ...) und auch das erwartete Verhalten 
festlegen. Nach Fertigimplementierung dann diese vorher erstellte 
Beschreibung abarbeiten und validieren...

von adr23gwe (Gast)


Lesenswert?

Es gäbe da z.B. das Modellierungstool "Innovator"
von MID aus Nürnberg. Ohne Werbung machen zu wollen.

von Sebastian L. (Gast)


Lesenswert?

ALso ich mach das immer so

1. Anforderungen Definieren
Wichtig weil man sonst nicht weiß was man überhaupt zum Schluss haben 
will

2. Layer definieren
welche ebenen hat man
-logisch
-darstllung
-datenhaltung

3. Architektur erstellen (Klassendiagramm)
nicht immer einfach, je gründlicher desto einfacher die umsetzung

4. Modell in Module zerlegen
meinst wie layer evtl mehr je nach Komplexität

5. Schnittstellen definieren
so weiß jede seite das es von der anderen zu erwarten hat

6. Ablaufdiagramme erstellen
wird meist erst hinterher zur Übersichtlichkeit gemacht. grundlegendes 
sollte aber schon vorher definiert sein.

7. Hauptprogrammierarbeit

8. Testen

Wenn man 1-6 vorher erledigt hat sehe ich keinen punkt wo man nicht 
weiter wissen sollte außer man hat das problem noch nicht ganz 
verstanden.

An welcher stelle kommst du denn nicht weiter?

von Sebastian L. (Gast)


Lesenswert?

bzw. wie kann man nicht wissen wie man weitermachen soll?

von Kein Name (Gast)


Lesenswert?

>Jetzt steh ich aber manchmal vor dem Code

Einfach den Standpunkt wechseln.

Wenn du vor lauter Code den Wald nicht siehst einfach was anderes 
anschauen. Wie von Sebastian vorgeschlagen Anforderungsliste, 
Modulstruktur, Oberfläche, Datenstrukturen oder einen anderen Aspakt 
betrachten.

Manchmal erkennt man Sackgassen im Code wenn man die Widersprüche in den 
Anforderungen betrachtet. Manchmal sieht man unrealisierbare 
Anforderungen, wenn man im Code wühlt.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frank schrieb:
> mit mehreren selbstdefinierten
> Kommunikationsprotokollen.

Wenn irgendwie möglich, greife ich bei einem Protokoll auf was 
vorhandenes zurück. Das hat den Vorteil, das es Messgeräte dafür gibt 
und evtl. sogar schon Software. Wenn das bei dir nicht geht, schade.

von Purzel H. (hacky)


Lesenswert?

Ich hab mal einen Simulator fuer eine Zusatndmaschin geschrieben. Auf 
Controllern arbeit ich immer mit Zustandsmaschinen.

von olaf (Gast)


Lesenswert?

Pico Oschi schrieb:
> Ich hab mal einen Simulator fuer eine Zusatndmaschin geschrieben. Auf
> Controllern arbeit ich immer mit Zustandsmaschinen.

...wow!

von Achim M. (minifloat)


Lesenswert?

Der Controller ist eine Zustandsmaschin' :)

Nun ja, bei Menüstrukturen lohnt es sich, soetwas zu implementieren, da 
es einem mehr Übersicht gibt und die Wartbarkeit steigt. Vor allem der 
Übergang von UML nach Code gestaltet sich da leichter.

mfg mf

von ... (Gast)


Lesenswert?

Wow. Die meisten hier scheinen ja die Software wie im Lehrbuch zu 
schreiben.

Also ich hab festgestellt, oft ist die Software nicht besonders 
kompliziert. Alles schon hundert mal programmiert. Da kann man sich 
einen Entwurf sparen und muss nur schauen, aus welchen alten Projekten 
man Code wiederverwenden kann.
Bei komplizierten Sachen überlebt der Entwurf meist nicht sehr lange, 
gerade wenn er sehr detailliert ist. Irgendwas vergisst man beim Entwurf 
immer oder es funktioniert dann nicht wie geplant.
Ich geh deshalb eher pragmatisch ran. Ich verlasse mich auf mein Gefühl, 
frag mal Kollegen, wie die das machen würden und ich schreib Prototypen. 
Aus dem Prototypen kann man dann relativ einfach ein schönes Programm 
machen.

von Frank (Gast)


Lesenswert?

Bei mir geht es gar nicht darum, dass ich zu einem konkreten Problem 
eine Frage habe. Lediglich habe ich Interesse daran meine 
Softwareentwicklung zu verbessern.

Ich mache nämlich eigentlich alles im Kopf, vom Konzept bis zur 
Realisierung. Und das ist irgendwann extrem anstrengend alles im Kopf zu 
behalten. Allerdings weiss ich zu Beginn meißt nicht, wie facettenreich 
mein Programm wird, deswegen ist es schwer dort schon eine Struktur zu 
implementieren.

Ich bin ein ähnlicher Programmierer wie mein Vorredner. In alten 
Projekten gucken und soviel wie möglich in Sinnesabschnitte (Objekte, 
Module, INterface) zu verpacken

von Wolfgang (Gast)


Lesenswert?

Frank schrieb:
> Weil Flussdiagramme meiner Meinung eher ungeeignet
> sind (mit Ausnahme Mikrocontroller)

Flußdiagramme sind so ziemlich das Unübersichtlichste was es gibt. Auch 
ein µC macht da keine Ausnahme - es sei denn, du bist ein "Goto"-Fan. 
IMHO bekommt man mit Nassi-Shneiderman-Diagrammen eine wesentlich 
bessere Strukturierung in Funktionsblöcke, die sich auch vernünftig 
überprüfen läßt.

von Kein Name (Gast)


Lesenswert?

Na ja, der einzige vernünftige Tipp ist da wohl:

Sobald man die Struktur nicht mehr überblickt wegwerfen und neu machen.
Geht schneller als man denkt.

Und Konzepte unbedingt mit Bleistift und Papierkorb machen. Vor den 
perfekten Ausdrucken der Tools hat man viel zu viel Respekt; sieht 
nicht, das die ganze Idee in einer Sackgasse endet.

Einfach mal zurücktreten. Schauen wo die Unübersichtlichkeit begann.

von Purzel H. (hacky)


Lesenswert?

Das Wichtigste bei der Controller Software Entwicklung  : Debugging ist 
Teil des Prozesses, und nicht eine Feuerloeschuebung falls es wider 
Erwarten nicht tun sollte. Man muss das Konzept und den Aufbau bereits 
debugbar planen. Die serielle Schnittstelle muss Debugcode verarbeiten 
koennen, das Protokoll muss Debugcode verarbeiten koennen. Falls die 
serielle Schnittstelle schwieriger als sonst ist, eine zweite 
Schnittstelle einplanen. Daher lieber den Mega644, wie den Mega32. 
Wenn's dann laeuft kann man den Mega32 einsetzen, er ist pinkompatibel. 
Den SPI Bus mit Vias versehen, sodass man die Scopeproben einstecken 
kann. Echtzeitdaten per externem DAC sichtbar machen. Ein Scope kann 
dann den Prozess transparent darstellen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Pico Oschi schrieb:
> ...

Ich glaube das zu erzählen bringt nichts. Das muss jeder selbst 
irgendwann einsehen ("Beim nächsten mal, mache ich das /anders/").

;-)

von W.S. (Gast)


Lesenswert?

Frank schrieb:
> Ich programmier gerade Software-Paket, für Mikrocontroller in C und .NET
> in Basic und Java. Alles für das gleiche Projekt.

O ha. Du machst simultan in C, Dotnet, Basic und Java? Kann ich nicht 
empfehle, man kommt nur durcheinander.

Bei mir sieht das ganz anders aus: Da ich jedesmal sowohl die Hardware 
als auch die Software dazu mache, seh ich zuallererst vor, mit der 
soeben aufgebauten Kiste irgendwie flott zu kommen, also erstmal ein 
Kaltstartcode und dann ein Minimalst-Monitor, dann all das, was man an 
I/O braucht, zuallererst simpel per Polling, dann gepuffert, dann kommt 
sowas wie ne Event-Behandlung dazu und dann ist es Zeit, auf dieser nun 
schon benutzbaren Basis das aufzubauen, was man eigentlich braucht. Und 
das denk ich mir mit Bleistift und Papier aus. Aber sowas wie PAP, 
Flußdiagramme usw. mache ich nur für Detailprobleme, niemals für's 
Ganze. Viel wichtiger ist es, sich die Protokolle genau zu übelegen, mit 
denen die verschiedenen Teile der Kiste miteinander kommunizieren 
sollen, bevor man die erste Zeile des "Nutzinhaltes" schreibt.

W.S.

von Tom K. (ez81)


Lesenswert?

0) Eine Liste von Anforderungen definieren (grob a la "Der Benutzer kann 
mit der PC-Software eine LED am uC einschalten.", keine 
Implementierungsdetails)
1) Ein paar wenige Features von der Liste aussuchen und festlegen, wann 
diese als erfüllt gelten (einfache Testfälle). Evtl. ein paar 
Ablaufdiagramme etc. zeichnen.
2) Nur diese soweit implementieren, dass die Testfälle erfüllt werden. 
Noch nicht zuviel verallgemeinern, Hauptsache es läuft.
3) Wenn die Liste abgearbeitet ist, refactoren, aufräumen, Funktionen 
verallgemeinern/auslagern.  Die Testfälle müssen natürlich hinterher 
immer noch erfüllt werden. Ggf. Flussdiagramme und Doku zum 
geschriebenen Code erstellen und die Pläne aus 1) dem tatsächlich 
geschriebenen Code anpasssen. Keine Angst haben, Code 
wegzuwerfen/neuzuschreiben.
4) Wenn es bei 3) nichts mehr zu verbessern gibt, wieder zu 1) springen.

Schritt 3 ist der wichtigste, sonst kommt man irgendwann nicht mehr 
weiter.

Alle halbwegs komplizierten Projekte wachsen langsam, deshalb sollte man 
so ehrlich sein, den Entwicklungsprozess darauf anzupassen und sich 
nicht a la Wasserfallmodell in die Tasche lügen ;)

von Sebastian L. (Gast)


Lesenswert?

Tom K. schrieb:
> 0) Eine Liste von Anforderungen definieren (grob a la "Der Benutzer kann
> mit der PC-Software eine LED am uC einschalten.", keine
> Implementierungsdetails)

Genau das halten viele nicht fest sondern nur im Kopf und man verliert 
schnell den Fokus auf das Wesentliche.
Noch schlimmer ist es wenn Anforderungen vergessen werden.

Tom K. schrieb:
> 3) Wenn die Liste abgearbeitet ist, refactoren, aufräumen, Funktionen
> verallgemeinern/auslagern.  Die Testfälle müssen natürlich hinterher
> immer noch erfüllt werden. Ggf. Flussdiagramme und Doku zum
> geschriebenen Code erstellen und die Pläne aus 1) dem tatsächlich
> geschriebenen Code anpasssen. Keine Angst haben, Code
> wegzuwerfen/neuzuschreiben.

Gerade das machen viele zu spät bzw gar nicht.
Das macht weiteres vorgehn echt schwer

Ich persönlich finde es wichtig solche Konzepte auch im privaten zu 
"üben" und zu verbessern.

von Michael R. (dj_motionx)


Angehängte Dateien:

Lesenswert?

Hallo !
Ich finde jeder muss selbst für sich richtig entscheiden können welche 
Tools und Vorgehensweisen man im Softwareentwicklungszyklus verwendet. 
Jedoch an manche Grundlagen sollte man sich schon halten. -> Die 
Lehrbücher lügen nun mal auch nicht.

L.g.

von Sebastian L. (Gast)


Lesenswert?

http://theaddictiveblog.com/software-engineering-classics-and-comics/

hier gibts noch mehr recht zutreffende comics auf manche 
softwareentwicklung

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.