You can mass-produce hardware; you cannot mass-produce software; you cannot mass-produce the human mind.
Michio Kaku
amerikanischer Physiker
Hardwarenahe Software-Entwicklung
Requirements
Ein klare Festlegung der Anforderungen ist das Fundament für die nachfolgende Entwicklung.
In der realen Welt werden sich diese Anforderungen vielleicht mehrmals im Laufe des
Projektes ändern und unter Umständen erheblichen Mehraufwand benötigen. Um so wichtiger ist es,
die ermittelten Anforderungen gut zu dokumentieren. Tools wie Codebeamer oder Jira können
dabei hilfreich sein.
Systemdesign / Architektur
Eine gute Systemarchitektur ist die Grundlage für robuste, skalierbare und
möglichst fehlerfreie Software. Tools wie UML / Enterprise Architekt (c) können
bei der Entwicklung der Architektur unterstützen. Robuste Systeme können als
"Barebone" aufgebaut sein oder mit Echtzeit-Betriebssystemen wie FreeRTOS.
Beide Varianten haben Vor- und Nachteile. Es kommt auf den Anwendungsfall an.
Safety
Wenn die Gesundheit oder sogar das Leben von Lebewesen gefährdet ist, muss
ein besonderes Augenmerk auf die Sicherheit gelegt werden. Normen wie IEC 61508
beschreiben das nötige Vorgehen bei der Entwicklung von Software in diesem
sensiblen Bereich. Eine lückenlose Dokumentierung, robustes Design, sorgfältig
erstellte Software, ein definierter Reviewprozess und 100% abdeckende Tests sind
Pflicht. Tools wie statische und dynamische Codeanalysen können die Qualität der
Software stark verbessern. MISRA für C oder C++ ist eine gute Grundlage für
robuste Software.
Softwaredesign / Implementierung
Gutes Design verwendet definierte Schnittstellen. Module haben klar
voneinander abgegrenzte Funktionalitäten. Es exitieren klare Hirarchien zwischen den
Modulen. Insbesondere im Embeddedbereich hat sich das KISS-Prinzip bewährt. Vielfach
kam in der Vergangenheit "C" zum Einsatz, mehr und mehr "C++". Für viele Anwendungen
ist dynamischer Speicher nach wie vor tabu; trotzdem bietet "C++" eine gute
Voraussetzung für robuste embedded Software. Versionskotrollsysteme wie "git" oder
"subversion" sind unerlässlich für die Entwicklung im Team.
Dokumentation
Die lückenlose Dokumentierung der Systemarchitektur und des Designs ist wichtig.
Ebenso müssen Schnittstellen lückenlos dokumentiert sein.
Auch der Sourcecode sollte gut dokumentiert werden. Mit "Doxygen" gelingt das hervorragend.
Triviale Kommentare sind nicht hilfreich. Kommentare, die unerwartete Konstrukte beschreiben
oder komplexe Abschnitte erklaeren, koennen dagegen sehr hilfreich sein.
Tests
Eine hohe Abdeckung mit Unittests ist Voraussetzung für robuste Software. Diese sollten in einem
Continous Integration Prozess zyklisch und automatisiert durchgeführt werden.
Google Test mit Google Mock ist ein gutes Tool, um Unittests zu erzeugen.
Das Geheimnis des Erfolges liegt nicht darin, niemals Fehler zu machen, sondern niemals zweimal den gleichen Fehler zu machen.
Albert Einstein
Hardware-Entwicklung
Systemdesign
Als Grundlage für ein gutes Softwaresystem braucht es ein gutes Hardwaresystem.
Mit Eagle oder heutzutage KiCad können aufwendige Schaltungen realisiert werden.
Prozessoren wie beispielsweise der Familie STM32 mit Arm-Architektur können in
vielen Systemen eingesetzt werden, von stromsparend bis safety.
Prototyping
Die Entwicklung von Hardware ist nicht mehr so kostenintensiv wie sie einmal war,
dennoch sollte große Sorgfalt in das Hardwaredesign investiert werden.
Prototypen sollten die Möglichkeit bieten, Fehler und problematisches Verhalten
zu debuggen. Logicanalyser und Oszilloskop sind hilfreiche Werkzeuge bei der
Fehlersuche.