Inhaltsverzeichnis

  1. Was ist Software (Computerprogramme)?
  2. Programmiermethoden
  3. Arten von Softwareentwicklung
  4. Phasen der Software Entwicklung (Lebenszyklus - SDLC)
  5. Softwareentwicklungsmodelle
  6. Agile Softwareentwicklung
  7. UML
  8. Notationsformen von Algorithmen
  9. CASE (Computer Aided Software Engineering)
  10. Test Driven Development (TDD - Testgetriebene Entwicklung)
  11. Testautomatisierung
  12. Compiler und Interpreter
  13. Refactoring
  14. Legacy Software
  15. SOLID
  16. Objektorientierte Programmierung (OOP)
  17. Versionsverwaltungs-Tools 
  18. Behavior Driven Development (BDD)
  19. Rapid Application Development (RAD)
  20. Compiler und Interpreter
  21. Refactoring
  22. Softwarekonfigurationsmanagement (SCM)
  23. Programmbibliothek (Library)
  24. Software Development Kit (SDK)
  25. API (Application Programming Interface)
  26. REST-API (Representational State Transfer)
  27. Embedded Programming
  28. Frontend und Backend
  29. Virtuelle Maschine (VM)
  30. SPS (Speicherprogrammierbare Steuerung)
  31. CNC
  32. CAD
  33. Geografisches Informationssystem (GIS)
  34. Netzinformationssystem (NIS)
  35. Datenmigration
  36. Computer Grafik-Typen (Vektor und Raster)
  37. Cybersicherheit
  38. Hacker
  39. E-Kommerz (Electronic Commerce)
  40. Application Lifecycle Management (ALM)
  41. Customer-Relationship-Management-System (CRM)
  42. ERP (Enterprise Resource Planning)
  43. Soft-Skills eines guten Softwareentwicklers
  44. Arten von Softwareentwickler
  45. Anzahl und Gehalt von Softwareentwickler weltweit
  46. Code-Beispiel für ein einfaches Programm in C++
  47. Typen von Software
  48. Qualitätsmerkmale von Software
  49. Geschichte der Programmiersprachen
  50. Wo wird welche Programmiersprache eingesetzt?
  51. Welche bekannter Software wurde in welcher Sprache geschrieben?
  52. IDEs
  53. Frameworks
  54. Anzahl Source Code-Zeilen von bekannter Software
  55. Softwarefehler (Bugs)
  56. Berühmte Softwarefehler und Computer-Attacken

Controlling complexity is the essence of computer programming."

"Another effective [debugging] technique is to explain your code to someone else. This will often cause you to expin the bug to yourself..."

"Programming language is very specific to instructing a computer to do a particular structure of a sequence. It's the very way you tell the machine what you want it to do."

"Don't comments bad code - rewrite it."

"No matter what, the way to learn to program is to write code and rewrite it and see it used and rewrite again. Reading other people's code is invaluable as well."

"The most effective debugging tool is still careful thought, coupled with judiciously placed print statements."

"Debugging is twice as hard as writing the code in the first place. Therefore, if you wirte the code as cleverly as possible, you are, by definition, not smart enough to debug it."

(Alle Zitate oben von Brian Kernighan)

 

"Und Computer zu programmieren war so faszinierend.
Man erschafft sein kleines Universum, und dann tut es, was man der IT sagt."

(Vinton Cerf, US-amerikanischer Informatik-Ingenieur)

 

"Das Messen des Programmierfortschritts anhand von Codezeilen ist wie das Messen des Fortschritts beim Flugzeugbau anhand des Gewichts."

(Bill Gates, Mitbegründer von Microsoft)

 

"Das Gehen auf dem Wasser und das Entwickeln von Software aus einer Spezifikation ist einfach, wenn beides eingefroren sind."

(Edward B. Berard, Software-Entwickler)

 

"Wenn du einen von dir vor zwei Wochen geschriebenen Code ansiehst, kommt es dir vor, als hättest du ihn noch nie gesehen."

(Dan Hurvitz, Software-Entwickler)

Was ist Software (Computerprogramme)?

Ein Programm ist eine Folge der Anweisungen nach der Regel einer Programmiersprache, mit dem man Aufgaben mit Hilfe eines Computers lösen kann.

Der Begriff Software bezeichnet die Gesamtheit der Programme für den Computer.

Über die Software (erstellt mit Hilfe einer Programmiersprache) erfolgt die Kommunikation mit dem Computer.

Der Sinn und Zweck, Programme für einen Computer zu schreiben, liegt in der Datenverarbeitung, die dieser viel besser und schneller erledigen kann als der Mensch. Das Prinzip, das dahinter steckt, kennzeichnet das Verhältnis von Mensch und Maschine. Dieses Prinzip nennt sich EVA-Prinzip:

 Eingabe
V  Verarbeitung
A  Ausgabe

Software ist ein immaterielles Wirtschaftsgut und ist (außer von triviellen Programmen) mit das komplexeste Gebilde, die Menschen je geschlafen haben.

Die Fehlerrate in Software ist in den letzten Jahren stetig gesunken Dank des Einsatzes von modernem Software-Engineering und von verbesserten Qualitätssicherungs-Massnahmen.

Software Engineering umfasst vor allem jene Aspekte, die sich mit der Planung, Entwicklung sowie der Anwendung und Instandhaltung von Software befassen. Sein Ziel ist, effiziente und zuverlässig funktionierende Software unter wirtschaftlichen Gesichtspunkten herzustellen. Die Teilbereiche des Software Engineerings beinhalten grundsätzlich die Softwareentwicklung, das Projektmanagement, die Softwarequalitätssicherung sowie die Softwaretechnologie.

Die Welt kann heutzutage nicht ohne Software existieren.

In Deutschland nutzen ca. 36 Millionen Menschen Software für ihre tägliche Arbeit.

Multiprocessing

  • Echte Gleichzeitigkeit
  • Aufteilung der Instruktionsbearbeitung auf Mehrkernprozessoren

Vorteile:

  • kostengünstiger, da mehrereschwächere Prozessoren - leichter mehr Leistung zu erzielen
  • Arbeitsteilung nach Gebieten (z.B. ein Kern für Physikberechnung)

Nachteile:

  • Software kann ausbremsen, da Instruktionen parallelisiertwerden müssen

Ausblick (gegenwärtig)

  • Ausbau des Multiprocessing durch den Einsatz von mehr Kernen - Voranschreitende Miniaturisierung der Bauelemente
  • Prozessorkerne in der Größevon roten Blutkörperchen (ca. 7,5 μm)
  • Mooresches Gesetz: Verdoppelung der Anzahl der Transistoren pro Flächeneinheit alle 18 bis 24 Monate
  • Grid-Computing: Zusammenschluss mehrerer Computer zu einem einzigen Supercomputer
  • Beispiel: Blizzard im DKRZ: 8448 Prozessoren, über 20 TeraByte Speicher, Leistung von 158 TeraFLOPS (Floating Operations Per Second)
  • Cloud-Computing: Auslagerung von Ressourcen
  • Erweiterung der I/O-Schnittstelle (z.B. Bewegungssteuerung, augmented reality)

Ausblick (zukünftig)

  • Einsatz von Licht als Informationsträger
  • Biocomputer (Einsatz von DNS als Speichermedium)
  • Quantencomputer

 

Software ist präsent als PC-Programm, als Smartphone-App oder als eingebettete Software (Firmware) in jedem komplexen System. So findet man Software in der Infrastruktur, in der industriellen Produktion, in Roboter, im Transportwesen, im Finanzwesen, in der Medizin (Diagnostik - z.B. Röntgen oder Computertomografie, Patienten-Vitalfunktionen-Überwachungsgeräte), bei Computer-Simulationen, im Filmwesen, an der Supermarkt-Kasse, in den Flughafen-Scanner, in Haushaltsgeräten, elektronische Unterhaltung, in Autos, in Flugzeugen, in Züge und in Schiffe, in Satelliten und Raumschiffe, bei der Künstlichen Intelligenz, dem Internet der Dinge, im Maschinellen Lernen, in der Mustererkennung, in der kognitiven Modellierung, im Erkennung natürlicher Sprache und ihrer Übersetzung, bei der Erkennung und Verarbeitung von Bildern, Digitalkameras, Smart-TVs, Druckern, den meisten Automaten, beim assistierten Fahren und  Navigation, bei der Wettervorhersage, in der Wissenschaft und Forschung (z.B. Windtunnel-Berechnungen, Modellierung von Anlagen zur Kernfusion, Modellierung komplexer Moleküle und Lösung komplexer mathematischer Probleme).

Software-Herstellung ist auch deswegen so teuer weil bei großen Software-Projekten hunderte von Entwickler mitwirken und auch weil kleinste (fehlerhafte) Änderungen im Source Code zu unerwartete Effekte und fehlerhafte Funktionalität des Softwares führen können und dann die aktuelle Entwicklung zurückgefahren werden muß (die letzte korrekte Version des Quellcodes muss aus der Repository geholt werden oder der letzte Backup wird wieder eingesetzt), weil seine Qualitätssicherung große Ressourcen in Anspruch nimmt und auch weil bei älteren Software fast immer eine teuere Refactoring notwendig ist.

Die Fertigstellung einer durchschnittlichen Individualsoftware kostet um die 50000€.

Die durchschnittliche Zeit für die Erstellung einer App liegt bei etwa 20 bis 22 Wochen.

Weil der Source Code so leicht veränderbar ist, spielen die Software-Qualitätssicherung, die Software-Sicherung (Backup) und die Software-Versionierung eine zentrale Rolle in der Software-Herstellung.

Die größten Software-Hersteller 2021 weltweit sind Apple (366 Milliarden $), Alphabet-Google (256 Milliarden $ Umsatz), Microsoft (194 Milliarden $ Umsatz), IBM, Accenture, Facebook, Oracle, SAP und Hewlett Packard.

Die größten IT-Firmen in Deutschland sind SAP SE (31 Milliarden $ Umsatz), Microsoft Deutschland (2,8 Milliarden $ Umsatz), Diebold Nixdorf Systems GmbH, Software AG (958 Millionen € Umsatz), adesso SE (920 Millionen€ Umsatz), Vector Informatik GmbH (799 Millionen € Umsatz), Teamviewer (566 Millionen € Umsatz), IBM Deutschland, Avira Operations, Plankraft, Instaffo und Oracle.

Die größten Softwareunternehmen im Großraum Stuttgart sind Microsoft Deutschland (2,8 Milliarden $ Umsatz), Vector Informatik GmbH (799 Millionen € Umsatz), RIB Software SE (215 Millionen € Umsatz) und CENIT AG (172 Millionen € Umsatz).

Programmiermethoden

  • Strukturiertes Programmieren
  • Modulares Programmieren
  • Objektorientiertes Programmieren
  • Ereignisorientiertes Programmieren

Arten von Softwareentwicklung

  • Top-down
  • Bottom-up

Phasen der Software-Entwicklung (Lebenszyklus -  SDLC)

  • Planung (evtl. Brainstorming)
  • Anforderungsanalyse (Konzept) (Das Lastenheft wird von Auftraggeber, der zukünftiger Benutzer erstellt)
  • Grobentwurf (Architektur - Design) (Das Lastenheft wird technisch umgesetzt --> Das Pflichtenheft entsteht - möglicher Einsatz von Modellierungs-Werkzeuge und Code-Reviews)
  • Feinentwurf (Spezifikation) (Optionaler Einsatz von Modellierungs-Werkzeuge)
  • Codierung (Implementierung, Programmierung) (der Source Code entsteht: (1) durch ein Programmierer alleine (2) durch zwei Entwickler = Pair Programming oder (3) Automatisch z.B. aus UML-Diagramme)
  • Testen (Validierung und Verifikation) (1) Code-Reviews: ein anderer Entwickler prüft systematisch den Code und/oder das Design (2) Debugging, Bugfixing: Fehler im Code werden gesucht, gefunden und beseitigt (3) Testen: Die Funktionalität der Software wird geprüft. Arten von Tests: (a) Manuelles Testen: Statische Tests, Unit-Tests, Integrationstests, Systemtests, Black-Box Tests, White Box-Tests, Regressionstests (b) Testautomatisierung (c) Statische Codeanalyse-Tools einsetzen
  • Qualitätssicherung (Qualitätsmanagement)
  • Dokumentation(a) Systemdokumentation (1) Quellcode-Dokumentation durch die Verwendung von Kommentaren (2) Von einem Teammitglied geschrieben (3) Automatisiert aus dem Sourcecode erzeugt (b) Benutzerdokumentation
  • Configurations-Manegement, Versionsverwaltung (ein oder mehrere Release(s) werden freigegeben)
  • Auslieferung an Kunde(n) (Bereitstellung,  Softwareeinführung, Markteinführung - Deployment) (Der für den Kunden bestimmter finaler Release (Version) wird übergeben)
  • Wartung, Pflege, Rollout (evtl. auch die Abschaltung) ( (1) Eine upgedatete Version des Softwares wird übergeben (2) Eine Refactoring nach Kundenwunsch oder wegen andere Faktoren wird durchgeführt

     (--Details zu diese Phasen siehe weiter unten)

Diese oben aufgelisteten Entwicklungsphasen müssen nicht zwingend sequentiell ablaufen.

Das Software Development Life Cycle (SDLC) (--> Details siehe weiter oben) - ist der Prozess des Planens, Schreibens, Änderns und Wartung von Software. Die Einhaltung der SDLC-Methodik trägt zur Optimierung des Endergebnisses bei. In der IT wurde der Begriff "Lebenszyklus"erstmals in den 1950er und 1960er Jahren verwendet, um die Phasen bei der Entwicklung eines neuen Computersystems zu beschreiben. Heutzutage bezieht er sich jedoch allgemein auf alle Phasen bei der Produktion jeglicher Art von Software.

In der Anforderungsphase (requirements) werden die funktionelle-, qualitative- und Hardware-Anforderungen an die Software festgelegt:

Funktionelle Anforderungen:

  • Systemverhalten
  • Daten
  • Input/Output

Qualitative Anforderungen:

  • Performance
  • Zuverlässigkeit
  • Sicherheit
  • Verfügbarkeit
  • Wartbarkeit

Bei der Erstellung des Lastenheftes kann man auch Use-Case-Diagramme benutzen.

In der Entwurfsphase wird festgelegt welche Entwicklungsumgebung (IDE), welche Libraries, welche IDEs, welche APIs und welche Software Development Kits (SDK) zum Einsatz kommen werden. 

Für den Entwurf (Design) der Software können ein Projekt-Ablaufplan, ein Struktogramm (Nassi-Schneidermann-Diagramm) oder auch UML-Diagramme benutzt werden.

Es gibt Programme die aus dem Sourcecode automatisch eine System-Dokumentation erzeugen (z.B. Doxygen).

Eine Beta-Version bezeichnet einen Entwicklungsstand einer Software, in dem ein Teil neuer Funktionen bereits implementiert wurde, die Entwicklung eines Releases jedoch noch nicht abgeschlossen ist. Die Kennzeichen einer Beta-Version sind u.a.

  • das Fehlen von Funktionen
  • die nicht vollumfängliche Implementierung einzelner Funktionen
  • das mögliche Vorhandensein von Hilfsmitteln wie z.B. Stubs oder Mock-Objekten
  • die noch ausstehenden Tests einzelner Funktionen bzw. der Gesamtheit der Funktionen

Es ist auch üblich, dass in der Phase der Beta-Version einer Software die Dokumentation der Neuerungen (im Handbuch, im Changelog etc.) noch nicht abgeschlossen ist.

Die bekanntesten Softwareentwicklungsmodelle sind:

  • Das Wasserfallmodell (die Phasen der Softwareentwicklung laufen sequentiell ab)
  • Das V-Modell
  • Das Spiralmodell
  • Das inkrementelles und iteratives Modell
  • Der Rational Unified Process (RUP)
  • Agile Softwareentwicklung - Extreme Programming (XP) (Scrum, Kanban)

Die Agile Softwareentwicklung verspricht eine höhere Transparenz und Veränderungsgeschwindigkeit und einen schnelleren Einsatz des entwickelten Systems.

Agile Praktiken sollen dazu dienen, dass Änderungen oder neue Anforderungen mit wenig Aufwand berücksichtigt werden können. Beispiele für agile Praktiken sind:

  • Paarprogrammierung
  • Schnelle Codereviews
  • Continous Integration
  • Continous Deployment
  • DevOps
  • Testgetriebene Entwicklung
  • Behavior Drive Entwicklung
  • Agiles Testen
  • Rapid Application Development
  • Ständige Refactorierungen

 (--> Details über die oben aufgeführten Punkte gibt es weiter unten)

Bekannteste Agile Modelle sind Scrum und Kanban. Das Scrum-Team wird von einem Scrum Master und einem Product Owner (PO) betreut. Der Scrum Master unterstützt das Entwicklungsteam. Der PO ist ein Vertreter der Kundenseite. Die Zeit wird in Sprints eingeteilt. Sobald ein Sprint vorbei ist, muss das Team ein marktreifes Produkt präsentieren. Kanban's Hauptidee ist die Visualisierung von Arbeitsabläufen. Es besteht darin, eine physische Tafel zu erstellen, auf welcher der Fortschritt visuell markiert werden kann. Kanban ist Scrum ziemlich ähnlich.

Jira ist eine Webanwendung, die in der agilen Softwareentwicklung genutzt wird. Die Schwerpunkte von Jira liegen beim Anforderungsmanagement, der Statusverfolgung, beim Beheben von Fehlern und dem operativen Projektmagement. Das zentrale Element von Jira sind die sogenannten Vorgänge oder auch Tickets bzw. Issues.

Grafische Modellierungssprachen werden in der Phasen Architektur, Design, Spezifikation, Implementierung und  Dokumentation der Softwareentwicklung eingesetzt. Die bekannteste Modellierungsprache ist UML (Unified Modeling Language). UML ist eine visuelle Modellierungssprachefür die oben genannten Phasen der Entwicklung von komplexen Softwaresystemen. UML besteht aus verschiedenen Diagrammarten. Insgesamt beschreiben UML-Diagramme die Grenzen, die Struktur und das Verhalten von Systemen und den darin enthaltenen Objekten. Zwar ist UML keine Programmiersprache, jedoch gibt es Tools (GitMind, Gliffydie UML-Diagramme nutzen um Code in verschiedenen Sprachen (Java, C++, C# oder XML-Schematazu generieren. Manche Tools rekonstruieren zudem UML-Diagramme aus vorhandenen Code. UML hat einen direkten Bezug zu objektorientierter Analyse und Design.

UML hat folgende Diagramme:

  • Klassendiagramm (Das am häufigsten verwendete UML-Diagramm und die wichtigste Grundlage für jede objektorientierte Lösung. Es zeigt die Klassen in einem System, Attribute und Vorgänge sowie die Beziehung zwischen den einzelnen Klassen.)
  • Komponentendiagramm (Stellt die strukturelle Beziehung von Softwaresystemelementen dar. Komponenten kommunizieren über Schnittstellen.)
  • Kompositionsstrukturdiagramm (werden verwendet, um die interne Struktur einer Klasse darzustellen.)
  • Implementierungsdiagramm (Illustriert die Systemhardware und die zugehörige Software. Nützlich, wenn eine Softwarelösung auf mehreren Maschinen mit individuellen Konfigurationen implementiert wird.)
  • Objektdiagramm (Zeigt die Beziehung zwischen Objekten unter Verwendung von Beispielen aus der Realität. Hierbei wird illustriert, wie ein System zu einem bestimmten Zeitpunkt aussieht.)
  • Paketdiagramm (Es gibt zwei spezielle Arten von Abhängigkeiten, die zwischen Paketen definiert werden: Paketimporte und Paketverschmelzungen. Paketabhängigkeiten können so dargestellt werden, dass die Kommunikationsmechanismen zwischen verschiedenen Schichten erkennbar sind.)

Verhaltensbasierte UML-Diagramme:

  • Aktivitätsdiagramme
  • Kommunikationsdiagramme
  • Interaktionsübersichtsdiagramme 
  • Sequenzdiagramme
  • Zustandsdiagramme
  • Zeitverlaufsdiagramme 
  • Anwendungsfalldiagramme

CASE (Computer Aided Software Engineering) oder Computerunterstützte Softwareentwicklung sind Computerprogramme, welche bei der Entwicklung von Software unter anderem folgende Aufgaben übernehmen können:

  • Planung und Überwachung aller erforderlichen Teilschritte.
  • Unterstützung der Entwurfsphase durch geeignete Methoden.
  • Automatische Umsetzung der Entwürfe in die Datenbank einschließlich Prüfung auf Vollständigkeit.
  • Automatische Umsetzung der Entwürfe in lauffähige Programme.
  • Automatische Erstellung von Datenstrukturen, Bildschirmmasken und Listenbilder.

Ein wichtiger Bestandteil von CASE-Tools ist eine grafische Notationsweise, die der Visualisierung der Architektur des Software-Systems dient. CASE-Tools sind oft in IDEs integriert. Die Erfahrungen zeigen allerdings, dass CASE-Tools in grösseren Projekten zwar hilfreich sind, dass aber das "Programmieren auf Knopfdruck" in der Realität eher schwierig zu erreichen ist.

Ein Quellcode (Sourcecode) ist eine menschenlesbare Textdatei, die vom Programmierer erstellt wird (Codierung) und Anweisungen enthält, die von einem Computer ausgeführt werden können. Der Quellcode wird in einer bestimmten Programmiersprache geschrieben, die spezifische Syntaxregeln und Schlüsselwörter enthält. Der Quellcode wird in eine ausführbare Datei oder in Bytecode kompiliert oder interpretiert, und das Resultat (die fertige Anwendung) kann vom Computer ausgeführt werden. Der Quellcode ist die Grundlage für die Entwicklung von Software und ermöglicht es Entwicklern, die Funktionsweise eines Programms zu verstehen und es zu modifizieren oder zu erweitern. Die Qualität des Quellcodes bestimmt die Effizienz, Wartbarkeit und Skalierbarkeit des endgültigen Programms.

Es gibt ein Unterschied zwischen Codieren und Programmieren: Beim Codieren werden Ideen in eine geschriebene Sprache umgewandelt, die der Computer verstehen kann. Beim Programmieren geht es um die umfassendere Aufgabe, Anweisungen festzulegen, die einem Computer gegeben werden sollen, damit dieser eine Aufgabe ausführen kann. Programmiersprachen sind das Medium, das Menschen nutzen, um mit einer Maschine zu "sprechen".

Die meisten Programmiersprachen sind frei von Formatierungsvorschriften, was den Quellcode betrifft. Trotzdem haben viele Firmen interne Code-Formatierungs-Konventionen, an denen sich alle Entwickler zu halten haben. Dadurch wird ein gleicher Codierungs-Stil gefördert und die gute Lesbarkeit des Source Codes gewährleistet. Die Quelltextformatierung ist als Funktion in manchen IDEs (z.B. Eclipse und Visual Studio) enthalten und wird dabei bei der Erzeugung von Quelltext angewendet. Auch die Editoren Emacs und Vim bieten Formatierungshilfen an. Es gibt aber auch eigenständige Software, sogenannte Quelltext-Formatierer - Beautifier, die es dem Entwickler ermöglichen, bereits vorhandenen Quelltext in ein besser lesbares Format zu bringen. In Python ist die Sourcecode-Formatierung ein Syntaxelement, Blöcke werden hier durch ihre Einrückung festgelegt, wodurch Blanks eine syntaktische Bedeutung haben.

Ein Code Snippet (Code Fragment) bezieht sich im engeren Sinne auf einen Teil des Quellcodes, der von einem Editor Programm oder IDE im Source Code eingefügt wird, und ist eine Form der Copy-and-Paste-Programmierung. Einige IDEs wie Eclipse oder Visual Studio unterstützen die Arbeit mit Code Snippets.

Ein Cheatsheet ist eine Art Merkblatt oder Spickzettel. Es wird für Programmiersprachen, Tastaturkürzel oder Programmfunktionen verwendet und soll dabei helfen den Workflow zu beschleunigen. Die wichtigsten Informationen zu einem Thema werden in einem Cheatsheet zusammengefasst und müssen nicht gesucht werden, sollten sie in Vergessenheit geraten.

Programme, die den Code, den der Programmierer schreibt - den Sourcecode - in die binäre Computersprache übertragen, heißen Compiler und Interpreter. Der Vorteil der Interpreter gegenüber dem Compiler ist, dass der gleiche Quellcode auf jeder Zielplattform ausgeführt werden kann. Skriptsprachen werden meist über Interpreter ausgeführt, während Sprachen wie C oder C++ kompiliert werden. Ein besonderer Fall liegt bei Java vor, der Weg vom Sourcecode zur Maschinencode geht hier über einen Zwischenschritt, den sogenannten Java-Bytecode (Befehlssatz des Java Virtual Machine - JVM). Somit gewinnt man auf der einen Seite den Vorteil der Portabilität, den der Interpreter bietet, auf der anderen Seite der Effizienzgewinn durch den Compiler.

Test Driven Development (TDD - Testgetriebene Entwicklung) ist ein Entwicklungs- und Designparadigma für Software, bei dem das Testen von Programmkomponenten dazu verwendet wird, den gesamten Prozess der Softwareentwicklung zu leiten. TDD ist eine Designstrategie, die das Testen vor dem Erstellen des Quellcodes ansiedelt und mit Bezug auf die Abläufe vorrangig behandelt. Das Ziel liegt darin, die Qualität der Software maßgeblich zu erhöhen und den Wartungsaufwand im Nachhinein zu verringern. TDD wird meist im Rahmen agiler Methoden und insbesondere beim Extreme Programming verwendet. Kent Beck definierte TDD Ende der 1990er Jahre. Testautomatisierung gibt es schon seit einiger Zeit, aber viele Unternehmen investieren weiterhin zu wenig in Softwaretests. Kontinuierliche Tests bleiben hinter den Investitionen in die Automatisierung von Bereitstellungen mit CI/CD, den Aufbau einer Infrastruktur als Code (IaC) und andere Entwicklungspraktiken zurück. Da immer mehr Organisationen DevOps verwenden, um die Bereitstellungshäufigkeit zu erhöhen, müssen Teams kontinuierliche Tests einführen, Feature-Flags verwenden, Canary-Releases aktivieren und AIops-Funktionen hinzufügen. Entwickler und Teams nutzen immer häufiger kontinuierliche Tests mit generativen KI.

Testautomatisierung ist das automatisierte Durchführen von Software Tests. Das Software Testing überprüft, ob die entwickelte Software den definierten Anforderungen entspricht. Diese Anforderungen lassen sich in vier Kategorien einordnen:

  • Sicherheit
  • Funktion
  • Leistung
  • Robustheit bzw. Zuverlässigkeit

"Durch Testen kann man stets nur die Anwesenheit, nie aber die Abwesenheit von Fehlern beweisen." (Edsger Wybe Dijkstra)

Reihenfolge der Tests: Unit Tests => Integrations Tests => System Tests => Abnahme Tests.

Beim Software Testing, ob manuell oder automatisiert durchgeführt, unterscheiden wir drei Arten:

  • Unit-Tests werden in der früheren Phase der Softwareentwicklung durchgeführt. Sie dienen dazu, die einzeln entwickelten Komponenten separat voneinander zu testen. Bei Unit-Tests handelt es sich um eine Methode zum Testen von Software, bei der ein Programm in seine kleinsten Funktionskomponenten, sogenannte Einheiten, zerlegt und jede Einheit gründlichen Tests unterzogen wird, um sicherzustellen, dass sie wie erwartet funktioniert. Diese Tests dienen dazu, das Verhalten einzelner Einheiten isoliert zu bewerten und sicherzustellen, dass sie für verschiedene Eingaben die erwarteten Ergebnisse liefern. Das Hauptziel von Unit-Tests besteht darin, Defekte oder Fehler im Code frühzeitig im Entwicklungszyklus zu erkennen und so die Ausbreitung von Fehlern auf höhere Integrationsebenen zu verhindern. Die Unit-Tests spielen eine entscheidende Rolle im Softwareentwicklungs-Lebenszyklus, da sie eine Reihe von Vorteilen bieten, die zur Gesamtqualität und zu Stabilität eines Softwareprodukts beitragen:
  1. Fehlererkennung
  2. Verbesserte Codequalität
  3. Dokumentation: Gut geschriebene Unit-Tests dienen als lebendige Dokumentation der Codebasis.
  4. ZusammenarbeitUnit-Tests ermöglichen die Zusammenarbeit zwischen Entwicklern.
  5. Continuous Integration and Delivery (CI/CD): Tests sind ein Eckpfeiler effektiver CI/CD Pipelines. Automatisierte Unit Tests können in den CI/CD-Prozess integriert werden, um Änderungen automatisch zu validieren und zu verhindern, das fehlerhafter Code in die Produktion gelangt.
  • Integrationstests überprüfen, wie die einzelnen Komponenten zusammen funktionieren. Es werden auch die Schnittstellen zwischen unterschiedlichen Systemen und Anwendungen getestet.
  • Akzeptanztests: Es wird die gesamte neue Anwendung End-2-End getestet. Dabei geht es vor allem darum zu überprüfen, ob die entwickelte Lösung die Anforderungen und Wünsche der zukünftigen Nutzer erfüllt. Akzeptanztests werden UI-basiert durchgeführt. Das bedeutet, dass das Verhalten der zukünftigen Nutzer auf der Benutzeroberfläche der Anwendung imitiert wird.

Bekannte Testautomatisierungs-Werkzeuge sind Selenium, Cucumber, Postman/Newman, TestComplete oder IBM Rational Functional Tester.

Vorteile von Testautomatisierung: Seitdem die Softwareentwicklung agil ist, kommt dem Testing eine größere Bedeutung zu. Mit dem Ansatz der kontinuierlichen Entwicklung (Continuous Development - CD) wird Software in Bausteinen entwickelt und kontinuierlich getestet. So können Fehler frühzeitig erkennen und beheben. Manuelles Testen ist zeitaufwendig, fehleranfällig und teuer. In einigen Fällen ist der Wartungsaufwand der Testsoftware schlichtweg höher als der Aufwand der manuellen Durchführung der Tests. Der größte Teil der Testaktivitäten können und sollen automatisiert durchgeführt werden. Gerade vor dem Hintergrund des agilen, kontinuierlichen Testens verringert sich so der Aufwand deutlich. Automatisiertes Testen schont die zeitlichen und finanziellen Ressourcen und ist weniger fehleranfällig als manuelles Testen. Mithilfe der Testautomatisierung können große Mengen an Testdaten schnell getestet werden. Große Testdatensätze sind wichtig, um alle möglichen Szenarien zu testen. Das manuelle Testen dieser großen Datenmengen ist sehr aufwändig. Robotic Process Automation (RPA) wird für die Automatisierung manueller, regelbasierter Prozesse mithilfe von Software Robotern eingesetzt. Im Kern ist ein sogenannter RPA Roboter nichts anderes als eine Testsoftware. Beide werden eingesetzt, um manuelle Aufgaben, die immer gleich und in hohem Volumen durchgeführt werden, effizienter und weniger fehleranfällig umzusetzen. Vor allem für Akzeptanztests, also UI- und End-2-End Testings, eignen sich virtuelle Roboter oft hervorragend. Auch bei den Integrationstests kann es sinnvolle Anwendungsbereiche für RPA geben. Ein Roboter kann beispielsweise schnell und mit einem hohen Volumen an Testdaten überprüfen, ob der Datentransfer zwischen zwei Systemen oder Anwendungen funktioniert. Beim Unit Testing, also dem Testen der Einzelkomponenten, lässt sich RPA ebenfalls einsetzen.

Behavior Driven Development (BDD) oder auch Specification Driven Development (verhaltensgesteuerten Entwicklung) ist eine Technik der agilen Softwareentwicklung. Ziel ist es, die Zusammenarbeit im Qualitätsmanagement und in der Geschäftsanalyse zu stärken. Im modernen Panorama der Softwareentwicklung erweist sich der BDD-Ansatz als eine zentrale Praxis. BDD ist ein Softwareentwicklungsansatz, der auf der testgetriebenen Entwicklung (TDD) aufbaut. Er legt den Schwerpunkt auf die Verwendung einer verständlichen und einfachen Sprache, um das erwartete Verhalten von Software zu beschreiben. BDD ist eine Praxis, bei der das Testen von Programmkomponenten zur Steuerung des gesamten Softwareentwicklungsprozesses verwendet wird. Heute ist es nicht mehr notwendig, eine fertige Software wochenlang auf ihre Funktionalität zu testen.  Bei BDD betrachtet man die Software aus der Perspektive des Benutzers. Dies fördert die Zusammenarbeit zwischen Entwicklern, Qualitätsmanagern und dem Kunden. Je komplexer die Softwareanwendungen werden, desto mehr Qualitäts- und Testmanagement ist erforderlich. Dies ermöglicht es, Fehler schnell auszumachen. Die gewünschten Anforderungen werden von allen Teammitgliedern definiert. Anschließend kann der Programmierer den Quellcode erstellen. Das bedeutet, dass die Teammitglieder Beschreibungen liefern können, die der Programmierer dann umsetzt. Auf diese Weise können sich alle aktiv an der Erstellung beteiligen. BDD schließt die Lücke zwischen Entwicklern und dem Rest des Teams, indem es die Zusammenarbeit und das gemeinsame Verständnis fördert. Außerdem wird in kleinen und schnellen Iterationen gearbeitet, um das Feedback zu erleichtern und es wird eine Systemdokumentation erstellt, die automatisch mit dem Verhalten des Systems abgeglichen werden kann. BDD macht den Entwicklungsprozess für alle Beteiligten zugänglicher und verständlicher, von Entwicklern und Testern bis hin zu Interessenvertretern und anderen nichttechnischen Teammitgliedern. 

Rapid Application Development (RAD) - Schnelle Anwendungsentwicklung ist eine Methode der Softwareentwicklung, bei der Rapid Prototyping und iterative Bereitstellung einen hohen Stellenwert haben. Das RAD-Modell ist daher eine gute Alternative zum typischen linearen Wasserfallmodell, das sich weitgehend auf Planung und sequentielle Entwurfspraktiken konzentriert. Die 1991 erstmals vom James Martins eingeführte schnelle Anwendungsentwicklung hat sich zu einer der beliebtesten und leistungsfähigsten Entwicklungsmethoden entwickelt. Durch die Verwendung von RAD können Designer und Entwickler das während des Entwicklungsprozesses gesammelte Wissen und Entdeckungen nutzen, um das Design zu gestalten oder die Softwarerichtung vollständig zu ändern. RSD ist eine Form der agilen Softwareentwicklungsmethodik. Im Gegensatz zu den herkömmlichen Methoden legt RAD Wert auf funktionierende Software und Rückmeldungen von Benutzern über strenge Planung und Anforderungserfassung. Weil das RAD-Modell genaue Planung erfordert gibt es ein paar Schritte und Phasen, die jedes Entwicklungsprojekt durchlaufen muss. In den meisten RAD-Systemen wird häufig Prototyping eingesetzt. Die Verwendung von Prototypen während des gesamten Entwicklungszyklus bietet eine Reihe von Vorteilen:

  • Einbindung des Benutzers (Beim herkömmlichen Wasserfallmodell muss das Entwicklerteam mit den Benutzern besprechen, welche Funktionen und Implementierungen notwendig sind und welche Spezifikationen geplant werden müssen. Im Gegensatz dazu ermöglicht das RAD-Modell die schnelle Erstellung eines Prototypen, zu dem die Benutzer ein Feedback geben, anstatt die abstrakten Umsetzungen eines Designdokuments bereitzustellen.)
  • Durchführbarkeit (Durch das Prototyping kann das Entwicklungsteam die Durchführbarkeit einer besonders komplexen oder riskanten Komponente gut und schnell beurteilen. Durch die frühzeitige Erkennung und Bearbeitung komplizierter Systeme im Entwicklungszyklus wird die Software robuster, weniger fehleranfällig und für zukünftige Konstruktionserweiterungen besser strukturiert.)
  • Fehlerreduzierung und Fehlerbehebung (Durch die schnelle Bereitstellung eines Prototyps während eines Projekts ist es wahrscheinlicher, dass Fehler viel früher im Entwicklungszyklus entdeckt und behoben werden als bei einem typischen Wasserfallansatz.)

Refactoring (Überarbeitung) bezeichnet die - manuelle oder automatisierte - Restrukturierung einer Software (meist) unter Beibehaltung des Funktionsumfangs. Er ist ein zentraler Bestandteil der Agilen Softwareentwicklung. Kaum hat ein Unternehmen eine neue Version einer Software veröffentlicht, stellen Anwender neue Anforderungen für neue Versionen. Im Laufe der Zeit wächst der Funktionsumfang, doch je umfangreicher und älter eine Software und ihre Architektur werden, desto schwieriger wird die Weiterentwicklung. Hier hilft das Refactoring.

Legacy Software ist Software, die häufig schon lange im Einsatz ist und technologisch nicht mehr auf dem aktuellen Stand ist. Legacy Software bereitet in der Regel mit zunehmendem Alter immer neue Probleme, vor allem wenn sie gemeinsam mit modernerer Technologie betrieben wird. Es gibt aber verschiedene Gründe, warum Unternehmen häufig an diese Legacy Software festhalten: weil diese alte Anwendung bildet die Basis für neuere Software, weil die ursprüngliche Entwickler der Software nicht mehr verfügbar sind, weil dieses Programm auf aktuelle Hardware nicht laufen würde und weil eine Aktualisierung dieses alten Programms (Refactoring) finanziell sich nicht lohnen würde.

SOLID ist ein Akronym für die ersten fünf Prinzipien größten objektorientierten Designs (OOD) von Robert C. Martin. Diese Prinzipien legen Praktiken fest, die sich für die Entwicklung von Software eignen. Die Übernahme dieser Praktiken kann auch zur Vermeidung von Code Smells, Refactoring von Code und agiler oder adaptiver Softwareentwicklung beitragen. SOLID kann zu einen saubererer, wartbarerer und anpassungsfähigerer Codebasis führen. SOLID steht für:

  • S - Single Responsibility Prinzip (Prinzip der eindeutigen Verantwortlichkeit)
  • O - Open Closed Prinzip (Prinzip der Offen- und Verschlossenheit)
  • L - Liskovsches Substitutionsprinzip
  • I - Interface Segregation Prinzip (Prinzip der Schnittstellentrennung)
  • D - Dependency Inversion Prinzip (Abhängigkeit Umkehr Prinzip)

Die Objektorientierte Programmierung (OOP) wurde Ende der 1960er Jahre von der Programmierlegende Alan Kay geprägt. Wie der Name schon sagt, bezieht sich OOP auf Sprachen, die Objekte in der Programmierung verwenden (wie Java, Python, C#, C++, Visual Basic, JavaScript und PHP)OOP zielt darauf ab, reale Entitäten wie Vererbung und Polymorphismus in der Programmierung zu implementieren. Das Hauptziel von OOP besteht darin, die Daten und die damit arbeitenden Funktionen so zu verbinden, dass kein anderer Teil des Codes außer dieser Funktion auf diese Daten zugreifen kann. OO-Konzepte sind:

  • Klassen (Plan eines Objekts)
  • Objekte (Repräsentation einer Entität und des jeweiligen Grundbausteins)
  • Datenabstraktion (Verhalten einer Entität aus der echten Welt)
  • Verkapselung (Mechanismus, bei dem Daten zusammengefügt werden, um diese vor der Außenwelt zu verbergen)
  • Polymorphismus (Definiert den Mechanismus, der angewendet wird, um unterschiedliche Formen anzunehmen)
  • Vererbung (Der Mechanismus, bei dem neue Klassen aus einer vorhandenen erstellt werden)
  • Dynamische Bindung
  • Nachrichtenübermittlung

Die Klasse dient als Blaupause für die Abbildung realer Objekte in Softwareobjekte und beschreibt Attribute (Eigenschaften) und Methoden (Verhalten) des Objekts. Objekte sind Instanzen einer Klasse, die mit speziell definierten Daten erstellt wurden. Methoden sind innerhalb einer Klasse definierte Funktionen, die das Verhalten eines Objekts beschreiben. Jede in Klassendefinitionen enthaltene Methode beginnt mit einem Verweis auf ein Instanzobjekt. Attribute werden in der Klassenvorlage definiert und repräsentieren den Zustand eines Objekts. Das Ziel von OOP ist es, die Flexibilität und Wartbarkeit von Programmen zu erhöhen. OOP eignet sich besonders für große oder komplexe Softwareprojekte und hat gegenüber anderen Programmiermodellen folgende Vorteile: geringere Fehleranfälligkeit, gute Wiederverwendbarkeit und geringerer Wartungsaufwand.

Design Patterns sind wiederkehrende Muster in der Softwareentwicklung und stellen eine große Erleichterung in der Programmierarbeit dar. Begrifflich ist das Design Pattern zurückzuführen auf den Architekten Christopher Alexander. Zu unterscheiden sind grundsätzlich Strukturmuster, Verhaltensmuster und Erzeugungsmuster.

  • Strukturmuster oder Structural Pattern lassen sich verstehen als Entwurfsmuster für Klassenbeziehungen. Das Ziel ist eine Abstraktion, die imstande ist, mit anderen Lösungsansätzen zu kommunizieren. Dies ist insbesondere im Zusammenhang mit der Schnittstellen-Programmierung relevant.
  • Verhaltensmuster oder Behavioral Pattern modellieren das Verhalten der Software. Es handelt sich um Pattern zur Vereinfachung komplexer Steuerungs- und Kontrollprozesse. Zu diesem Zwecke ist es möglich, zwischen Algorithmen und Objekt-Verantwortlichkeiten zu wählen.
  •  Erzeugungsmuster oder Creational Pattern dienen der   Erzeugung von Objekten, die eine vereinfachte Darstellung der Prozesse für bestimmte Instanzen ermöglicht. Das geschieht von der Art der Objekterstellung in einer Software unabhängig.

Builder Pattern dienen der Trennung der Objekt-Entwicklung von ihren Repräsentationen. Factory Pattern erzeugen ein Objekt durch den Aufruf einer Methode. Das Singleton Pattern trägt es dazu bei, dass von einer Klasse nur exakt ein Objekt existiert. Das Composite Pattern ist ausgelegt auf dynamische Strukturen und kommt beispielsweise in der Dateiorganisation oder der Datenkompression zum Einsatz. Decorator Pattern integrieren zusätzliche Funktionalitäten beziehungsweise Zuständigkeiten in bestehende Klassen. Das Facade Pattern bietet eine Schnittstelle zu anderen Systemen und Untersystemen. Das Observer-Pattern leitet Änderungen an Objekten an Strukturen weiter. Strategy-Pattern dienen der Definition von Familien austauschbarer Algorithmen. Visitor-Pattern dienen dazu, ausführbare Operationen in einer Weise abzukapseln, dass neue Operationen möglich sind, ohne Veränderungen an den entsprechenden Klassen vorzunehmen.

Die Software-Qualitätssicherung (Quality Assurance - QA) oder auch Software-Qualitätsmanagement beinhaltet folgende Maßnahmen: Vorgabe von Code-Konventionen, regelmäßige Design- und Code-Reviews, Einsatz statischer Code-Analyse-Tools (diese Tools können den Quellcode scannen und nach Schwachstellen suchen und können den Source Code anhand der unternehmensspezifischen Projektspezifikationen validieren und sicherstellen, dass Projektanforderungen erfüllt werden. Ein bekannter Code-Analyse-Tool ist SonarQube. Zur QS gehört auch die Verwendung von Testautomatisierungstools (z.B. Selenium oder Postman), automatische Erstellung von Systemdokumentationen (z. B. mit Doxygen), Verwendung von Versionsverwaltungs-Tools und von Bugtracker (Fehler-Verfolgungs-Tools).

Versionsverwaltungs-Tools (z.B. Git, GitLab, CVS, Subversion (SVN)) werden eingesetzt um Softwareentwicklung im Team zu ermöglichen also in Softwareprojekten, an denen mehrere Programmierer gleichzeitig arbeiten. Hier ist die Verwaltung der Codes unabdingbar, um dessen Evolutionsprozess nachvollziehbar abzubilden. Um das zu gewährleisten, historisiert das System jede Änderung (=> Version) die Ihre Programmierer an einer Datei bzw. Software vollziehen. Tritt bei einem Test Ihrer Software ein Problem auf, so kann  Fehlerquelle - inklusive Zeitstempel und Benutzerkennung - schnell erkannt und behoben werden. Umgekehrt besteht ebenso die Möglichkeit, einen älteren Zustand der Software wiederherzustellen. Das Versionskontrollsystem trägt somit step by step zur Optimierung des Softwareprojekts bei. Die Versionsverwaltung bietet allen beteiligten Entwickler die Möglichkeit, an einer lokal geklonte Version des Projektes zu arbeiten und mit einem lokalen Stand abzugleichen und auch den Quellcode durch andere Entwickler oder automatisierte Mechanismen überprüfen zu lassen wobei der Source Code in einer zentralen Repository abgelegt wird. Außer der Versionsverwaltung werden auch sogenannte Bug Tracker zur Verwaltung der bekannten Fehler eingesetzt.

Aktuelle Trends in der Softwareentwicklung sind Continous Integration (CI), Continous Delivery (CD) und DevOps (aus den Wörtern Development und Operations). CI stellt sicher, dass Codeänderungen von zahlreichen Entwicklern in ein Software-Projekt integriert werden. Beispiele für CI sind Bamboo, Rational Build Forge, Jenkins und Jira. Durch CD werden Funktionsänderungen sowie Bugfixes schnell und nachhaltig realisiert. DevOps umfasst CI und CD und soll dafür sorgen, dass die Bereiche, die für die Entwicklung und den Betrieb der im Unternehmen und/oder der von Kunden verwendeten Software zuständig sind, effizient zusammenarbeiten. Ein bekannter Tool der in CI eingesetzt wird ist JenkinsJenkins ist ein webbasiertes Open Source Continous Integration System. Es ist in Java geschrieben und plattformunabhängig. Die Basis von Jenkins unterstützt zahlreiche Werkzeuge darunter SVN, Ant, Maven sowie JUnit.

Die Softwarekonfigurationsmanagement (SCM) hat die Aufgabe, Änderungen in der Software zu verfolgen und zu steuern. Zu den SCM-Praktiken gehören die Revisionskontrolle und die Festlegung von Baselines. Maven ist Teil vom SCM und ist ein leistungsfähiges Werkzeug, um viele in der Softwareentwicklung immer wieder anfallende Prozeduren zu automatisieren und zu vereinfachen.

Interoperabilität bezieht sich auf die Fähigkeit von Systemen oder Anwendungen, miteinander zu kommunizieren und zusammenzuarbeiten, unabhängig davon, welche Technologien oder Plattformen sie verwenden. In der Softwareentwicklung bezieht sich Interoperabilität normalerweise auf die Fähigkeit, Softwarekomponenten aus verschiedenen Quellen oder in verschiedene Programmiersprachen zu integrieren.

Reverse Engineering ist ein Prozess, bei dem man ein ausreichendes Verständnis für ein Produkt auf Design-Ebene erlangt, um dessen Wartung, Verbesserung oder Ersatz zu unterstützen. In der Softwareentwicklung handelt es sich um einen Teil des Prozesses zur Softwarewartung, der dabei hilft, das System ausreichend zu verstehen, um Entscheidungen darüber zu treffen. Bei diesem Prozess wird das System in keiner Weise verändert. Redokumentation ist ein Teilbereich des Reverse Engineering, bei dem es darum geht, verlorene oder nicht vorhandene Dokumentation über das System wiederherzustellen. Design Recovery ist ein zweiter Teilbereich des Reverse Engineering, bei dem das Ziel darin besteht, alle Informationen zu reproduzieren, die eine Person benötigt, um vollständig zu verstehen, was ein Programm tut, wie es und warum es dies tut. Forward Engineering bezeichnet den Prozess, der von den Anforderungen über den Entwurf bis zur Implementierung eines Produkts führt. Während also das bestehende System der Ausgangspunkt für ein Reverse Engineering ist, ist es der Endpunkt beim Forward Engineering. Restrukturierung (Refactoring) ist der Prozess der Änderung der zugrundeliegenden Struktur eines Systems, ohne sein äußeres Verhalten zu beeinflussen. Reengineering bezeichnet die Neugestaltung und Implementierung eines Systems in einer neuen Form. Unterschieden werden zwei Formen: beim "reinen" Reengineering soll das System lediglich rekonstruiert werden, ohne das Funktionalität hinzukommt, beim "erweiternden" Reengineering wird das System rekonstruiert, um vorhandene Funktionalität zu verändern oder neue hinzuzufügen. Es gibt eine Reihe von Zielen, die beim Reverse Engineering adressiert werden:

  • Die Bewältigung von Komplexität
  • die Generierung alternativer Ansichten
  • die Wiedererlangung verlorener Informationen
  • das Erkennen von Nebeneffekten
  • die Synthese von höheren Abstraktionen
  • die Erleichterung der Wiederverwendung

Interessanterweise decken sich viele dieser Ziele mit den Ansätzen einer Clean Code Softwareentwicklung. Clean Code fordert die klare, verständliche, nachvollziehbare, logische und disziplinierte Implementierung von Code. Ziel ist es, Software effizient und effektiv zu produzieren und dabei den Code so zu gestalten, dass er leicht lesbar, änderbar, erweiterbar und wartbar ist. In anderen Worten: Reverse Engineering und Clean Code ergänzen sich großartigHeutzutage stehen viele Firmen  nicht nur vor dem Problem, ihre Informationssysteme durch neue zu ersetzen, gleichzeitig müssen sie auch die Kontrolle über ihre Altanwendungen bzw. ihren Legacy Code behalten. Reverse Engineering bietet zu diesem Zweck die Möglichkeit verlorene Informationen wiederzuerlangen, vorhandene Softwarearchitekturen mit ihren Komponenten und entsprechenden Zusammenhängen und Funktionsweisen zu verstehen, komplexe Systeme umzustrukturieren, alte Systeme in eine neue und besser wartbare Architektur zu überführen oder Software zu portieren. Und damit wird Reverse Engineering gemeinsam mit Forward Engineering zum Reengineering.

Eine Programmbibliothek (Library) ist eine Sammlung von (in der Regel) vorkompilierten, wiederverwendbaren Routinen, die ein Programmierer beim Schreiben von Code aufrufen kann, so dass der Programmierer ihn nicht erneut schreiben muss.

Eine Dynamische Linkbibliothek (Dynamic Link Library - DLL) ist eine Beispiel für so eine Programmbibliothek. Klassenbibliotheken haben Routinen die Klassendefinitionen für die objektorientierten Programmierung (OOP) sind. Komponenten der grafischen Benutzeroberfläche (Graphical User Interface - GUI), wie z.B. Bildlaufleisten, Schaltflächen und Fensterroutinen, werden im Allgemeinen in einer Klassenbibliothek gespeichert.

Ein Software Development Kit (SDK) besteht aus mehreren Tools, die (typischerweise) vom Hersteller einer Hardwareplattform, eines Betriebssystems oder einer Programmiersprache bereitgestellt werden.

Eine API (Application Programming Interface  - Programmierschnittstelle) besteht aus mehreren Definitionen und Protokollen zur Entwicklung und Integration von Anwendungssoftware. Eine API ist eine Schnittstelle, die es unabhängigen Anwendungen ermöglicht, miteinander zu kommunizieren und Daten auszutauschen. Mithilfe von APIs können Produkte oder Services unabhängig von ihrer Implementierung untereinander kommunizieren. Auf diese Weise lässt sich die Anwendungsentwicklung optimieren, was wiederum Zeit und Geld spart. Um wettbewerbsfähig zu bleiben, müssen Unternehmen die schnelle Entwicklung und Bereitstellung innovativer Services vorantreiben. Eine Methode zur Beschleunigung dieses Prozesses ist die cloud native Anwendungsentwicklung, die auf der Verknüpfung einer Architektur aus Microservice-Anwendungen über APIs basiert.

Der REST-API (Representational State Transfer) wird hauptsächlich in Zusammenhang mit Webservices genannt. REST ist eine Abstraktion der Struktur und des Verhaltens des World Wide Web. REST hat das Ziel, einen Architekturstil zu schaffen, der den Anforderungen des modernen Web besser genügt.

Embedded Programming beschreibt die Software-Erstellung für eingebettete Systeme. Einngebettete Systeme (Embedded Systemssind Funktionseinheiten, die über einen eigenen Rechenkern verfügen, der in das System "eingebettet" ist.   Bei einer klassischen Computer steht viel Arbeitsspeicher (viele Gigabyte als RAM Speicher und Terabyte in Festplattenspeichern oder mehrere 100 Gigabyte SSD-Speicher) zu Verfügung. Aus Sicht der Applikation werden Programm und Daten in einem gemeinsamen Arbeitsspeicher ausgeführt. Ferner glänzen die PCs durch sehr viel Rechenleistung in Form von sehr schnellen CPUs (Singlecore oder Multicore), die mit Taktraten von mehreren Gigabyte die Software-Verarbeitung durchführen. Damit lassen sich gut sehr große Softwarepakete bearbeiten/abarbeiten/ausführen. Bei Embedded-Systemen stehen jedoch nur begrenzte Speichergrößen zur Verfügung - typischerweise für Programmspeicher weniger als 10 Megabyte und für Datenspeicher weniger als 1 Megabyte. Darüber hinaus sind Programm- und Datenspeicher getrennt. In einigen Mikrocontrollern sind mehrere Core-Lokale und globale Speicher implementiert. Auch bei der Rechenleistung werden meist nur Taktraten von bis zu 200 MHz in den Embedded-CPUs erreicht. Der große Vorteil von Embedded-Systemen im Vergleich zu PC-basierenden Systemen liegt in der Realzeit-Fähigkeit (Echtzeit-Fähigkeit). Darunter versteht man die Möglichkeit, die Verzögerungs- bzw. Verarbeitungszeit eines Embedded-Systems genau zu bestimmen. D.h. Wenn ein Eingangssignal erkannt wird, kann eine maximale Reaktionszeit für die Generierung eines Signals an einem Embedded-Systemausgang genau bestimmt werden. Damit bei gleichen Eingangsbedingungen verhält sich das System immer gleich, und das Systemverhalten ist vorhersagbar.

Typische Anwendungen für Embedded-Systeme

  • Automobil-Applikationen, Kommunikations und Steuermodule im Fahrzeug
  • Weiße Ware: Steuerungen von Wasch- oder Geschirrspülmaschinen und Kühlschränken
  • Unterhaltungselektronik (Braune Ware): digitale Radios, Fernseher, Set-Top-Boxen.
  • Telekommunikations-Geräte: Mobiltelefone, Gateways (z.B. Fritz-Boxen)
  • Industrie- und Medizintechnik, Luft- und Raumfahrt, Militärtechnik

Ganz spezielle Embedded-Systeme sind die Embedded-PCs, die z.B. in Maschinensteuerungen eingesetzt werden. Die Embedded-Software wird in diesem Fall mit speziellen Embedded-Betriebssystemen (z.B. Embedded-Linux, Windows Embedded) zum Ablauf gebracht. Die Software, die für eingebettete Systeme entwickelt wird (Embedded Systems Software), muss Erweiterungen zum ANSI-C Standard enthalten, damit bei der Programmierung schon die Hardware-Nähe und damit die benötigte Zeit für die Ausführung bestimmt werden kann. Embedded-Software wird auch als Firmware bezeichnet. Typischerweise wird die Firmware in einem Flash-Speicher programmiert. Der Vorteil dieser Speicher ist die Möglichkeit von Software-Updates. Die Embedded-Systeme, in denen Embedded-Software verarbeitet wird, sind eine ideale Plattform für Realzeit-Applikationen (Real-time Applications).

Als Frontend bezeichnet man den sichtbaren Teil von Software (Benutzeroberfläche oder User Interface - UI, auch Graphical User Interface - GUI), mit welchem Nutzer interagieren können. Unter Backend versteht man den Teil der Software, welcher für die Benutzer nicht zugänglich ist.

Eine Virtuelle Maschine (VM) ist im Grunde ein virtueller Computer. Das bedeutet, dass sie die gleichen Funktionen bietet wie ein physischer Rechner, aber eigentlich "nur" aus einer Sammlung von Computerdateien besteht, die auf einem physisch vorhandenen Computer ausgeführt werden.VM-Software ist Voraussetzung für moderne Cloud-Plattformen, welche Infrastructure-as-a-Service (IaaS) anbieten. Dem Self Service-Modell folgend werden Nutzern auf Knopfdruck virtualisierte Ressourcen zugewiesen. Aber auch auf für einzelne Nutzer lohnen sich VM-Programme, denn virtuelle Maschinen dienen als reproduzierbare und sichere Arbeitsumgebungen. Bekannte VM sind VmWare und Oracle VirtualBox.

SPS (Speicherprogrammierbare Steuerung oder PLC -  Programmable Logic Controller) ist ein elektronisches Gerät, das Steuerungs- und Regelungsaufgaben im Bereich Automatisierungstechnik übernimmt. Die SPS-Programmierung ist die entsprechende Programmierung dieses Gerätes. Bekannte SPS-Software sind Siemens Step7 und CodeSys.

Die CNC (Computer Numerical Control) - Computergestützte numerische Steuerung findet in Fertigungsunternehmen Anwendung, um Programmanweisungen für Computer zur Steuerung von Werkzeugmaschinen zu erstellen.

CAD (Computer Aided Design) umfasst alle EDV unterstützten  Aufgaben bezüglich Design, Konstruktion, Planung und Verbesserung neuer Produkte. CAD-Konstrukteure erstellen am Computer digitale Zeichnungen, Konstruktionspläne und Modelle für Produkte und Maschinen, Häuser und Brücken oder ganze Infrastrukturnetze. Bekannte CAD-Software sind AutoCAD, CATIA, SolidWorks, Autodesk Inventor, SpaceClaim, SketchUp und MicroStation von Bentley Systems. MicroStation hat eine eigene Entwickungssprache, C-basiert. Für die Visualisierung von Vermessungspunkten in CAD kann ein Aufnahmepunktübertragungs-Programm (APU) eingesetzt werden.

Ein Geografisches Informationssystem (GIS) bezeichnet ein System zur Erfassung, Verwaltung und Analyse von räumlichen DatenEine GIS-Software verarbeitet räumliche Informationen. Räumliche Daten können damit:

  • erfasst
  • organisiert/reorganisiert
  • gespeichert
  • bearbeitet
  • modelliert
  • (geografisch auf digitalen Landkarten) visualisiert 
  • analysiert

werden. Die Wurzeln des GIS liegen in der Geografie, doch im GIS werden neben Geodaten noch viele weitere Datentypen verarbeitetDie gewonnenen Informationen dienen der Steuerung von Abläufen, auf ihrer Grundlage können bessere Entscheidungen getroffen werden. Mithilfe von Karten und 3D-Szenen können Sie die räumliche Lage analysieren und Layer mit verschiedensten Informationen in Visualisierungen verwandeln. Durch diese einzigartige Fähigkeit lässt uns GIS tiefere Einblicke in unsere Daten gewinnen und wir erkennen Muster, Beziehungen und Sachverhalte, die uns zu fundierteren Entscheidungen verhelfen. Zu den bekanntesten Herstellern von GIS-Software zählen Smallworld, ESRI (ArcGIS), Intergraph (GeoMedia), Bentley Systems (MicroStation), Autodesk (Topobase und Map3D) und Google Maps. Für die Kataster-Daten in Deutschland gibt es die Systeme ALK, ALKIS und ATKIS.

Ein Netzinformationssystem (NIS) ist ein Instrument zur Erfassung, Verwaltung, Analyse und Präsentation von Betriebsmitteldaten. Diese beziehen sich auf die Netzwerktopologie die in einem einheitlichen Bezugsrahmen gegeben sein muss. Mit dieser besonderen Ausprägung eines Geo-Informationssystems arbeiten Ver- und Entsorgungsunternehmen. Hierbei steht in erster Linie die geometrische und graphische Dokumentation des Leitungsbestands im Vordergrund. Ein Netzinformationssystem ist also eine besondere Ausprägung eines  Geoinformationssystems (GIS). Hierbei steht in erster Linie die geometrische und graphische Dokumentation des Leitungsbestands von Versorgungsunternehmen im Vordergrund. Daher fallen sie ebenso in die Kategorie der Betriebsmittelinformationssysteme (Facility-Management-Systeme)Um in einem Netzinformationssystem überführt werden zu können, müssen erst die umfangreichen analogen Pläne (z.B. Elektrizität - Strom, Fernwärme, Telekommunikation, Abwasser, Kataster) der Ver- und Entsorgungsunternehmen digitalisiert werden (ein sehr arbeitsintensiver Prozess). Die meisten Versorgungsfirmen benutzen heutzutage NIS für die Verwaltung Ihrer Daten. Die Grafik eines CAD, GIS oder Netzinformationssystems wird (meist für die Abgabe an den Kunden) geplotet.

Bei der Datenmigration werden Daten von einem Standort an einen anderen, von einem Format in ein anderes oder von einer Applikation in eine andere verschoben. In der Regel passiert dies nach der Einführung eines neuen Systems oder eines neuen Standorts für die Daten. Heutzutage werden Datenmigrationen häufig gestartet, wenn Unternehmen von einer lokalen Infrastruktur und Anwendungen auf cloud-basierten Storage und Applikationen umsteigen, um sie zu optimieren oder zu transformieren. Datenmigrationen gelten als schwierig und risikoreich. Ein spezieller Fall von Datenmigration ist die GIS-Datenmigration.

Bei der Computer Grafik-Typen unterscheidet man zwischen Vektor- und Rastergrafik. Vektorgrafiken bestehen aus geometrisch definierten Grundelementen. So bestehen die einzelnen Vektoren aus Linien, Kurven, Kreisen oder Polygonen die in ihrer Zusammensetzung komplexe Grafiken ergeben können. Diese sogenannten Primitiven benötigen nur wenige Angaben. Bei einem Kreis ist dies zum Beispiel die Position des Kreismittelpunktes und sein Radius. Zudem lassen sich verschiedene Eigenschaften wie die Linienstärke, die Konturfarbe oder diverse Füllmuster und Verläufe festlegen. Daher eignen sich Vektorgrafiken besonders zur Darstellung von geometrischen Designs und Schriften. Zudem benötigen sie oft bedeutend weniger Speicherplatz als Pixelgrafiken und lassen sich verlustfrei vergrößern oder verkleinern, weshalb sie in der Druckindustrie einen hohen Stellenwert besitzen. Vektorgrafiken lassen sich ohne Qualitätsverlust beliebig skalieren.

Eine Rastergrafik oder Pixelgrafik oder Bitmap genannt, besteht aus einzelnen Bildpunkten, die in einem Raster angeordnet sind und denen jeweils ein Farbwert zugeordnet ist. Diese Grafikart definiert sich daher durch ihre Abmessung aus Höhe und Breite in Pixeln, die auch Bildauflösung genannt wird, sowie durch den Umfang der darstellbaren Farben, den man auch als Farbtiefe bezeichnet. Rastergrafiken eigenen sich daher hervorragend zur Darstellung von Fotos und komplexen Farbverläufen. Ein großer Nachteil besteht jedoch in der starken Verschlechterung der Bildqualität sobald man diese Grafiken vergrößert, da durch die Rasterung ein sogenannter Treppeneffekt entsteht, welcher die Bilder dann pixelig oder unscharf wirken lässt. Zudem wird bei Bildformaten, wie zum Beispiel den JPG-Dateien, eine verlustbehaftete Bildkompression eingesetzt, welche die Qualität weiter mindern kann. Die bekannteteste Rasterformate sind JPG/JPEGPNG und BMP. Ein kostenloses Tool zu Bearbeitung von Rasterdateien ist Gimp.

HTML ("Hypertext Markup Language"), auf deutsch "Hypertext-Auszeichnungssprache", ist ein Format, in dem Webseiten geschrieben werden.

  • In einer HTML-Datei schreibt der Ersteller der Webseite den Text einer Website. Mit der HTML-Datei lässt sich ein Text strukturieren und formatieren (z.B. Schriftgröße und Schriftart). Außerdem binden Sie via HTML Links auf andere Webseiten ein oder ergänzen Ihren Text um Bilder, Videos oder Hintergrundgeräusche.
  • Browser wie Chrome, Firefox, Safari, Opera oder MS Edge lesen die HTML-Datei in Bruchteilen von Sekunden und zeigen diese anschließend grafisch an.
  • In der Regel werden HTML-Dateien nicht mehr selber geschrieben. Webseiten-Betreibern wird diese Arbeit mit einer grafischen Oberfläche abgenommen - dies geschieht z.B. mit Hilfe eines Content Management Systems (CMS).
  • Wenn man mit der rechten Maustaste in einem freien Bereich auf einer Webseite klickt und man wählt die Option "Speichern unter" oder "Seite speichern unter" kann man Anschließend die HTML-Datei dieser Webseite herunterladen und sich den Source Code  ansehen.

Mit XML (Extensible Markup Language kann man Daten auf gemeinsam nutzbare Weise definieren und speichern. XML unterstützt den Informationsaustausch zwischen Computersystemen wie Websites, Datenbanken und Anwendungen von Drittanbietern.

Mit JSON (Java Script Object Notation) ist eine Beschreibungssprache, das heißt man kann Informationen mit dieser Sprache speichern und von Computer zu Computer senden. JSON ist ein sehr leichtgewichtiges, menschen- und maschinenlesbares Datenformat und hat sich für den Datenaustausch zwischen webbasierten Software etabliert.

E-Kommerz (Electronic Commerce) umfasst alle Handelsaktivitäten, die auf elektronischem Wege stattfinden. Dazu gehören der Verkauf von Waren und Dienstleistungen, aber auch die Zahlungsabwicklung via Online-Banking, die Koordination der Logistik sowie der Kundenservice per Chat, Telefon oder Mail. Kennzeichnend ist also, dass Transaktionen über das Internet angebahnt und durchgeführt werden. Geschäftspartner treten über weite räumliche Distanzen auf einer Online-Plattform miteinander in Kontakt.

Application Lifecycle Management (ALM) bezeichnet die Überwachung einer Anwendung von ihrer anfänglichen Planung bis zum Support-Ende - also über den gesamten Lebenszyklus hinweg. Das umfasst auch, wie Änderungen an einer Applikation dokumentiert und verfolgt werden. ALM ist ein weit gefasster Begriff, der eine veränderte Wahrnehmung der Softwareentwicklung aufzeigt und sich im DevOps-Begriff widerspiegelt. DevOps bezeichnet die Vermischung von Aufgaben, die in einem Unternehmen vom Entwicklungs- (Development) und IT-Betriebsteams (Operations) wahrgenommen werden. In der Vergangenheit arbeitete das Entwicklungsteam häufig unabhängig von anderen Abteilungen und setzte dabei das Wasserfallmodell ein. Anschließend übergab die Entwicklungsabteilung die fertiggestellte Software an das IT-Betriebsteam, das sich um die Bereitstellung und Wartung der Anwendung kümmern musste. Mittlerweile ist es allerdings zur gängigen Praxis geworden, das Entwickler ein agileres Modell verfolgen und auch nach der Implementierung in die Arbeit an der Anwendung einbezogen werden. Dabei arbeiten sie sowohl mit Anwendern als auch im IT-Betrieb zusammen, um bei Bedarf inkrementelle Änderungen zu betätigen. Ein bekannter ALM ist Agosense Symphony. Andere ALMs sind: codebeamer, Jama Software, Visure Requirements, MeisterTask und Microsoft Azure DevOps.

Ein Customer-Relationship-Management-System (CRM) unterstützt das Management von Kundendaten. Es erleichtert das Vertriebsmanagement, liefert nützliche Erkenntnisse, kann mit sozialen Netzwerken integriert werden und vereinfacht die Teamkommunikation. Cloudbasierte CRM-Systeme ermöglichen komplett mobiles Arbeiten und bieten Zugang zu einem Ökosystem maßgeschneiderter Apps.

ERP (Enterprise Resource Planning) -  Unternehmensressourcenplanung ist definiert als ein System, das Geschäftsprozesse in den Bereichen Finanzen, Fertigung, Vertrieb, Lieferkette, Personalwesen und Betrieb automatisiert und verwaltet. Der bekannteste und größte  Hersteller von ERP ist SAP.

Unter Cybersicherheit versteht man Maßnahmen, um Computer, Server, Mobile Geräte, elektronische Systeme, Netzwerke und Daten gegen böswillige Angriffe zu verteidigen. Sie wird auch als IT-Sicherheit oder elektronische Datensicherheit bezeichnet. Dazu gehört auch das Einsetzen eines Antivirenprogramms (Virenscanner) und eines Firewalls. Virenscanner sind Software, die Schadprogramme (Malware) z. B. ComputervirenComputerwürmer oder Trojanische Pferde aufspüren, blockieren, gegebenenfalls betroffene Nutzer informieren und die Schadsoftware beseitigen solle. Ein Firewall ist eine Schutzmaßnahme, um unerlaubte Zugriffe von außen auf einen Rechner oder ein Netzwerk zu verhindern. Er verhindert dass Hacker zur den Daten des Computers durchdringen können. Virenscanner können prinzipiell nur bekannte Malware erkennen und somit nicht vor allen Bedrohungen schützen.

Heutzutage ist Cybersicherheit eine milliardenschwere Branche mit einer ständig wachsenden Liste von Unternehmen, die sich auf die Entwicklung und Implementierung von Cybersicherheitslösungen spezialisiert haben. Firewalls und die Verschlüsselung sollen sowohl Einzelpersonen als auch Unternehmen vor der sich ständig weiterentwickelnden Bedrohung durch Cyberkriminalität  schützen.

Einer der größten Trends in der Cybersicherheit ist die Integration von künstlicher Intelligenz (KI) und maschinellem Lernen (ML)Diese Technologien haben das Potenzial, unsere Herangehensweise an Cybersicherheit zu revolutionieren, indem sie es uns ermöglichen, riesige Datenmengen zu analysieren und Bedrohungen in Echtzeit zu identifizieren. Mithilfe von Algorithmen für ML können beispielsweise Anomalien im Netzwerkverkehr erkannt, potenzielle Angriffe identifiziert und darauf reagiert werden, bevor sie erheblichen Schaden anrichten können. KI und ML können auch zur Analyse großer Datenmengen eingesetzt werden und dabei helfen, Muster und Trends zu erkennen, die auf einen Cyberangriff hinweisen können. Im Bereich der Cybersicherheit hat das Katz-und-Maus-Spiel zwischen Hackern und Verteidigern mit dem Aufkommen der KI-Technologie eine neue Wendung genommen.

Hacker, immer auf der Suche nach effizienteren und effektiveren Möglichkeiten, die Sicherheit zu durchbrechen, haben die Macht der KI genutzt, um Passwörter auf beispiellose Weise zu knacken. So gibt es fünf Strategien, die Hacker neulich anwenden:

  • Intelligente Brute-Force-Angriffe
  • Passwortvorhersagemodelle
  • KI-gestützte Wörterbuchangriffe
  • Auf maschinellem Lernen basierende Angriffe
  • Hybride Angriffe

Es gibt 5 Cyber-Angriffe jede Sekunde und es entstehen 203 Milliarden € Schaden pro Jahr durch solche Angriffe auf deutsche Unternehmen. Bei den Cyberangriffen wurden vor allem Attacken auf Passwörter, Phishing und die Infizierung mit Schadsoftware bzw. Malware durchgeführt. Auch DDoS-Attacken, um IT-Systeme lahmzulegen und Ransomware-Attacken waren häufig.

Der Begriff Hacker (auch Computer-Hacker) bezeichnet zumeist Personen oder Personengruppen, die unautorisiert in fremde IT-Systeme eindringen. Als Hack (oder Hacking-Angriff) wird dementsprechend erst einmal der unerlaubte Zugriff auf ein Fremdgerät benannt. Neben kriminellen Hackern beziehungsweise sogenannten Black-Hat-Hackern gibt es auch White-Hat-Hacker und Gray-Hat-Hacker. Ein White-Hat-Hacker (oder ethischer Hacker) wird von einem Unternehmen angeheuert, um die Systeme auf Sicherheitsschwachstellen hin zu prüfen. Dazu führen diese Hacker Penetrationstests durch. Penetrationstests sind simulierte, wiederholte Cyberangriffe auf die Systeme eines Unternehmens.

In der Software-Engineering wird KI immer häufiger eingesetzt und kann Entwicklern dabei helfen, die Generierung und Umgestaltung von Code und die Dokumentation um 20 bis 50% zu beschleunigen (McKinsey-Bericht). Unter generativem Coding versteht man den Einsatz generativer KI zur Unterstützung der Softwareentwicklung. Es war eine der ersten Anwendungen der generativen KI-Technologie, die kommerzialisiert wurde. 

Generative KI, GPT-Engineer, ChatGPT und große Sprachmodelle (LLMs) wie GitHub Copilot und andere KI-Codegenerierungstools verändern die Softwareentwicklungspraktiken und die Produktivität.

LISP wurde zu einer gemeinsamen Sprache für die Programmierung von KI. Code Llama ist ein KI-System, das Code auf Englisch generiert und erklärt. Ähnlich wie GitHub Copilot und Amazon CodeWhisperer unterstützt Code Llama Entwickler beim Codieren und Debuggen in verschiedenen Sprachen wie Python, Java und C++. Es bestehen jedoch Bedenken, da KI-Codierungstools Sicherheitslücken schaffen oder geistiges Eigentum verletzen können. Entwickler nutzen immer häufiger kontinuierliche Tests mit generativen KI.

Computer-Simulationen werden in der Welt der Wissenschaft eingesetzt. Diese hat sich in der letzten Jahrzehnten stark verändert. Viele Experimente finden heute nicht mehr in realen Laboren statt, sondern werden virtuell am Computer simuliert. Die heutige Forschung ist ohne Simulationen kaum noch denkbar: sie werden in Medizin, Biowissenschaften, Physik, Material- oder Ingenieurwissenschaften eingesetzt. Sie ermöglichen Einblicke in Bereiche, die uns sonst aus zahlreichen Gründen verwehrt bleiben würden.

Simulationen werden eingesetzt wenn:

  • Experimente zu teuer sind (z.B. Crashtest-Simulationen, Testen des aerodynamischen Verhalten von Transportmittel im Windkanal)

  • Experimente zu gefährlich währen (z.B. Versuche zue Kernschmelze und Speicherung von CO2 im Boden)

  • Ein System sehr groß oder sehr klein ist (z.B. Experimente im Weltall oder im Bereich der Atome und Moleküle)

  • Prozesse sehr schnell oder langsam ablaufen (z.B. Entstehung und Sterben von Galaxien, Explosion eine Supernova)

  • Das System in der Wirklichkeit noch nicht existiert (z.B. Simulieren der Eigenschaften von neuen Materialien)

  • Experimente ethisch nicht vertretbar sind (z.B. in der Medizin oder Pilotenausbildung)

SourceForge ist ein Webhosting-Dienst, der auf die Ablage von Open Source Software spezialisiert ist. Er bietet Programmierern Speicherplatz für Quellcodes, binäre Dateien und eine Projektwebseite.

GitHub ist auch ein Webhosting-Dienst zur Versionsverwaltung für Software-Entwicklungsprojekte. Beide, Sourceforge und GitHub bieten Entwickler das Verwalten ihrer Open-Source-Programme und die Möglichkeit zum Download dieser Anwendungen an. 

StackOverflow ist eine internationale Plattform für Programmierer mit 8 Millionen Nutzern.

 

Soft-Skills einer guter Softwareentwickler

  • Team- und Kommunikationsfähigkeit
  • Zielorientierung
  • Durchsetzungsvermögen
  • Analytisches Denkvermögen
  • Problemlösekompetenz
  • Belastbarkeit und Flexibilität
  • Kreativität
  • Geduld
  • Demut
  • Selbstvertrauen
  • Empathie (er muss sich in die Lage der Benutzer versetzen können)
  • Lust an stetiger Weiterbildung

 

Arten von Softwareentwickler

  • Senior Developer (mehr als 5 Jahre Berufserfahrung)
  • Junior Developer (Berufseinsteiger)

  • Entwickler spezialisiert auf eine höhere Programmiersprache (z.B. C#, C++,  Java, JavaScript, Qt, Python, Perl, Ruby, Go, Kotlin, Elixir, Angular, ABAP, Next.js, Flutter)

  • Full-Stack-Entwickler (Programmierer, der sowohl in der Frontend- als auch Backendentwicklung tätig ist und dadurch Kompetenzen im Bereich von Datenbanken, Servern, Systemen und Clients besitzen. Je nach Projekt des Kunden kann dies eine mobile App, eine Webapp oder eine native App sein)

  • Software-Trainer (Ausbildung in Software)
  • Software Architekt (Entwirft das Softwaresystem, plant dieses und koordiniert dessen Umsetzung. Dabei steht er im Austausch mit den Auftraggeber)
  • Entwickler Systemintegration (Hauptsächlich Installieren und Einrichten von Software und Hardware)
  • KI/ML Ingenieur
  • IT Solution Designer
  • Frontend-Entwickler (UI/UX Entwickler)
  • Backend-Entwickler
  • Desktop-Entwickler
  • Mobile App-Entwickler
  • Web Entwickler
  • Daten-Architekt
  • Datenbank Manager
  • Netzwerk/Cloud Architekt
  • Netzwerk/Cloud Entwickler
  • DevOps Engineer
  • Datenwissenschaftler (Big Data Entwickler)
  • Spiele-Entwickler
  • Betriebssystem-Entwickler
  • System Administrator
  • Sicherheits-Entwickler
  • Entwickler E-Commerz

 

2022 gab es weltweit 27,7 Millionen aktive Softwareentwickler, die meisten in den USA und Europa.

In Deutschland, in 2019 gab es 901.000 Softwareentwickler.

Nur 27,5% der Softwareentwickler auf der Welt sind Frauen.

Die meisten Softwareentwickler programmierten 2023 mit Python.

Das Jahresgehalt 2022 für ein Senior Softwareentwickler mit mindestens zehnjährige Berufserfahrung in den USA war 110.000$ und in Deutschland 71.000€. Hochspezialisierte Entwickler bei Google verdienen 300.000$ im Jahr.

 

Typen von Software

Erste Klassifizierung

  • Systemsoftware (Programme zur Steuerung von Hard- ware - Betriebssysteme, Programmierumgebungen -  IDE (Integrated Development Environment)
  • Anwendersoftware oder Applikations-Software (Webbrowser, Textverarbeitungsprogramme, Bildbearbeitungsprogramme, E-Mail-Software, Computerspiele, Virenscanner,  Apps für Smartphones) 

Zweite Klassifizierung

  • Open Source Software (der Quelltext ist öffentlich)
  • Unternehmenssoftware (ERP, CRM)
  • Individual-Software
  • Embedded-Software oder Firmware (ist eine für eine spezifische Hardware entwickelte Software)

Dritte Klassifizierung

  • Freie Software (Freeware) wie z.B. Google online Dienste wie Google Chrome, Google Gmail, Google Maps, Google Earth, Google Translate, Google Docs, Google PlayStore, Google Apps, Google Lens sowie Microsoft Edge Chromium, Microsoft Teams, Android Studio, Mozilla Firefox, Mozilla Thunderbird, OpenOffice, VLC Media Player, Skype, Adobe Acrobat Reader, Gimp, IrfanView, GRASS GIS, Java, Python, Perl, PHP, Ruby, Qt, Eclipse, Dev-C++, viele mobile Apps und Computerspiele.
  • Open Source Software (der Quellcode ist einsehbar) wie z.B. der Mozilla Firefox Webbrowser, das Open Office Textverarbeitungsprogramm, das 7-Zip Packprogramm,  der Notepad++ Texteditor, die MySQL Datenbank oder das Betriebssystem Linux (Debian, Ubuntu).
  • Public-Domain-Software (Die Entwickler von Public-Domain-Software verzichten auf Lizenzeinnahmen, allerdings bleiben die Rechte und der Sourcecode im Besitz der Autoren)
  • Shareware (Gratis als Testversion, Demoversion oder Trial aber die Vollversion ist nur eine bestimmte Zeit kostenlos und nachher kostenpflichtg) wie z.B. WinRAR, WinZip, AVAST Virenchecker, AutoCAD.
  • Kommerzielle (proprietäre) Software (kostenpflichtig)

     

Arten von Programmiersprachen

Erste Klassifizierung

  • Maschinensprachen (besteht aus der Zeichen 0 und 1 und kann vom Computer direkt verarbeitet werden)
  • Assemblersprachen (sind nahe am Maschinensprachen)
  • Höhere Programmiersprachen (C#,  C++, Java, FORTRAN, COBOL, VisualBasic, Kotlin, Go)
  • Skriptsprachen(Python, Perl, Ruby, JavaScript, TypeScript, PHP, awk)
  • Sprachen mit visuellen Programmierumgebungen (DocBook, DITA)
  • Grafische (visuelle) Programmiersprachen (Scratch, Snap!)

Zweite Klassifizierung

  • Imperative Sprachen (BASIC, TurboPascal, C, COBOL, FORTRAN, Ada)
  • Funktionale Sprachen (LOGO, LISP,  Haskell)
  • Prädikative (logische) Sprachen (PROLOG)

  • Objektorientierte Sprachen (C++, C#, Objective-C, Java, Python, Delphi, VisualBasic, Simula, SMALLTALK 80, F#, Scala, Haskell)

Qualitätsmerkmale von Software

  • Wartbarkeit
  • Funktionalität
  • Benutzerfreundlichkeit
  • Effizienz
  • Änderbarkeit
  • Überprüfbarkeit
  • Performance
  • Interoperabilität/Kompatibilität
  • Verlässlichkeit (Robustheit)
  • Sicherheit
  • Portabilität (Übertragbarkeit)
  • Wiederverwendbarkeit

Geschichte der Programmiersprachen

 ( --> Details zu den einzelnen Sprachen siehe gleich weiter unten)

 

Charakterisierung der Programmiersprachen (1)

  • Assembler (Reverse Engineering)
  • Bash (Unix-Shell und Befehlssprache)
  • Batch (Skriptdateien in Microsoft Windows)
  • C++ (eine sehr leistungsfähige Programmiersprache, die fast überall verwendet wird)
  • Java (Leistungsstarke plattformübergreifende Sprache, native Android-Programmiersprache)
  • JavaScript (Sprache des Internets)
  • PHP (ebenfalls eine sehr leistungsfähige und weit verbreitete serverseitige Skriptsprache)
  • PowerShell (Befehlszeilen-Shell für Microsoft Windows)
  • Python (Eine sehr einfache, aber dennoch leistungsstarke Programmiersprache auf hohem Niveau)
  • SQL (Fast alles, was mit Datenbanken zu tun hat)
  • Unix Shell (Befehlssprache für UNIX)
  • ASP.NET (serverseitiges Rahmenwerk für
  • Webanwendungen von Microsoft)
  • C (Eine Menge Computersoftware und -systeme wurden in diese Sprache geschrieben)
  • C# (alles für Microsoft Windows)
  • Haxe (sehr nützlich)
  • Lisp (überall einsetzbar, wo Python oder Ruby verwendet wird)
  • Perl (Systemadministration, Netzwerkprogrammierung, Finanzwesen, Bioinformatik und andere Anwendungen, z. B. für GUIs)
  • Ruby (Muttersprache des Metasploit-Frameworks und unterhaltsame Sprache zum Erlernen)
  • ActionScript (Flash und Website-Animation)
  • Swift (iOS-Programmiersprache)
  • Tcl (wird auf Plattformen für eingebettete Systeme verwendet)
  • ActionScript (Flash und Website-Animation)
  • Ada (eingebettete Systeme, z. B. Avionik, Flugsicherung, Eisenbahn, Bankwesen, Militär und Raumfahrttechnik)
  • COBOL (wird in Geschäfts-, Finanz- und Verwaltungssystemen für Unternehmen und Regierungen verwendet)
  • Erlang (Telekommunikationssysteme und Anwendungen wie WhatsApp)
  • Fortran (wissenschaftliches Rechnen, nicht mehr so populär wie früher)
  • Lua (Spieleprogrammierung)
  • Objective-C (früher iOS-Programmierung, jetzt durch Swift ersetzt)
  • Pascal (Bildungszwecke)
  • PostScript (Drucken)
  • Visual Basic (wird in Zukunft nicht mehr benötigt)

Charakterisierung der Programmiersprachen (2)

  • C: Die langweilige und richtige Wahl.
  • C++: Dachten, es sei kompliziert.
  • Objective-C: Jetzt mit noch verwirrender Syntax!
  • C#: Es ist nicht Java.
  • Swift: Es ist kein JavaScript.
  • Java: Die praktische Wahl von Middleware-Entwicklern auf der ganzen Welt.
  • Ruby: Weil Programme Spaß machen und nicht effizient sein sollten!
  • Groovy: Einfacher als Ruby in der JVM zum Laufen zu bringen.
  • Python: Nicht zwischen funktionalem, prozeduralem und objektorientiertem Stil wählen.
  • PHP: HTML, CSS und SQL eingefügt und überall installiert.
  • JavaScript: Single-Threaded, nativ asynchron, auf jedem modernen Computer installiert.
  • Go: Vorrang für Typ- und Thread-Sicherheit
  • Rust: Viel einfacher als C, aber immer noch mit all den Syntaxfehlern.
  • Typescript: Das JavaScript des Java-Entwicklers.
  • Elm: Ist das wie Lisp oder nicht?
  • Clojure: Betrieb der schnellsten Middleware, die jemals entwickelt wurde auf der JVM.
  • Schema: Lisp für die 90er.
  • Perl: Kostenlose, etwas überstrapazierte Skriptsprache. Einmal geschrieben, nie gedebuggt.
  • Haskell: Die endgültige Schlussfolgerung zur Typsicherheit als Designprinzip.
  • Elixier: Was wäre, wenn Ruby Haskell übernehmen und dafür sorgen würde, dass Erlang läuft?

Wo wird welche Programmiersprache eingesetzt?

  • Python ist eine hochentwickelte, allgemeine Programmiersprache, die in den Bereichen Datenwissenschaft, maschinelles Lernen, künstliche Intelligenz, Webentwicklung und wissenschaftliche Berechnungen weit verbreitet ist. Ihre Beliebtheit hat in den letzten Jahren aufgrund ihrer Einfachheit, Lesbarkeit und Vielseitigkeit erheblich zugenommen. erfreut sich aufgrund seiner Einfachheit und Lesbarkeit großer Beliebtheit bei der Entwicklung von Cloud-Anwendungen. Die umfangreichen Bibliotheken und Frameworks von Python wie Django und Flask machen es zur idealen Wahl für die Erstellung webbasierter Cloud-Anwendungen. Darüber hinaus erhöht die Kompatibilität von Python mit verschiedenen Cloud-Plattformen wie AWS Lambda, Google Cloud Functions und Microsoft Azure Functions seine Attraktivität zusätzlich. Python wird häufig bei der Entwicklung von Backend, Webanwendungen, Desktop Softwareentwicklung, in der Datenwisenschaft, bei der KI und im ML. Python gilt als eine leicht zu erlernende Sprache.
  • Java ist eine klassenbasierte, objektorientierte Programmiersprache, die häufig für die Entwicklung von Anwendungen auf Unternehmensebene, mobilen Anwendungen und Spielen verwendet wird. Java ist bekannt für ihre Stabilität, ihre Sicherheitsfunktionen und ihre plattformübergreifende Kompatibilität. Java ist seit Jahren ein Eckpfeiler von Cloud-Anwendungen auf Unternehmensebene. Seine starke Typisierung, plattformübergreifende Kompatibilität und eine große Auswahl an Bibliotheken und Frameworks wie Spring Boot machen es zu einer zuverlässigen Wahl für die Cloud-Entwicklung. Das ausgereifte Java-Ökosystem gewährleistet außerdem eine nahtlose Integration mit verschiedenen Cloud-Plattformen wie Amazon Web Services (AWS) und Google Cloud Platform (GCP). Java wird wegen seiner Plattformunabhängigkeit auf vielen verschiedenen Geräten verwendet.Neben Desktop-Computern sind auch Tablets, Smartphones, Spielekonsolen oder auch TV-Geräte sowie Haushaltsgeräte mit Java ausgestattet. Laut Aussagen von Oracle wird Java auf über 3 Milliarden Geräten weltweit verwendet. Java wird in einer Vielzahl von Software-Projekten und auch in der Webentwicklung stark eingesetzt.
  • JavaScript ist eine clientseitige Skriptsprache, die für die Erstellung interaktiver Webseiten und Anwendungen verwendet wird. Sie wird auch für die serverseitige Programmierung mit Node.js verwendet. Mit der Zunahme der Webentwicklung und der steigenden Nachfrage nach dynamischen Benutzeroberflächen ist JavaScript zu einer der beliebtesten Programmiersprachen geworden. ist für seine Vielseitigkeit bekannt und die erste Wahl für die Erstellung von Cloud-Anwendungen mit einer wichtigen Front-End-Komponente. Node.js, eine Laufzeitumgebung für JavaScript, ermöglicht serverseitiges Scripting und ermöglicht so die Erstellung durchgängiger Cloud-Lösungen in einer einzigen Sprache. Mit Frameworks wie Express.js und React können JavaScript-Entwickler schnell skalierbare Cloud-Anwendungen erstellen.
  • C# wird in vielen Anwendungen verwendet, unter anderem bei der Programmierung von Webanwendungen, mobilen Apps und Computerspiele. C# ist eine vielseitige Sprache, die hauptsächlich mit Microsoft-Technologien in Verbindung gebracht wird. Es ist eine gute Wahl für die Erstellung von Cloud-Anwendungen auf der Azure-Plattform. Mit dem .NET Framework können Entwickler robuste und skalierbare Cloud-Lösungen erstellen.
  • Kotlin ist eine moderne Sprache, die eine leichtgewichtige Syntax, eine verbesserte Ausdrucksfähigkeit und ein verbessertes Typsystem bietet. Sie ist quasi Standard bei der Android-Programmierung. Kotlin ist eine platformunabhängige, statisch typisierte Programmiersprache, die in Java, JavaScript und Maschinencode umgewandelt werden kann. Kotlin, oft als modernere Alternative zu Java angesehen, hat aufgrund seiner Prägnanz und Ausdruckskraft in der Cloud-Entwicklung an Bedeutung gewonnen. Es ist vollständig mit Java kompatibel, was bedeutet, dass Kotlin-Entwickler das umfangreiche Ökosystem und die Bibliotheken von Java für Cloud-Projekte nutzen können. Kotlin bietet die gleiche Leistung wie Java bei weniger Code. Die Google Cloud Platform hat Kotlin als eine ihrer offiziellen Sprachen übernommen und damit ihre Rolle bei der Entwicklung von Cloud-Anwendungen weiter gefestigt. Sie ist daher sehr vielseitig und kann in viele Projekte einfach eingebunden werden. Die Integration erfolgt ganz ohne Kompatibilitätsprobleme und benötigt außerdem keine Schnittstellenprogrammierung.
  • Go auch bekannt als Golang, ist für die Erstellung hochleistungsfähiger und skalierbarer Cloud-Anwendungen konzipiert. Go wurde von Google entwickelt und zeichnet sich durch gleichzeitige Programmierung aus, was es ideal für die Bewältigung von Cloud-Workloads macht. Kubernetes, eine führende Container-Orchestrierungsplattform, die in Cloud-Umgebungen weit verbreitet ist, ist in Go implementiert, was seine Bedeutung für die Entwicklung cloudnativer Anwendungen unterstreicht.
  • Rust hat aufgrund seines Schwerpunkts auf Sicherheit und Leistung an Popularität gewonnen. Rust erfreut es sich bei der Entwicklung cloudnativer Anwendungen immer größerer Beliebtheit, insbesondere in Szenarien, in denen hohe Leistung und Systemzugriff auf niedriger Ebene von entscheidender Bedeutung sind.
  • VBA ist Microsoft's skriptorientierte Programmiersprache die in Microsoft Office integriert ist und die Möglichkeit bietet, die Funktionen von Excel, Access, Word etc. zu erweitern oder automatisierte Abläufe zu programmieren.
  • FORTRAN is eine Computersprache die Anweisungen nah an der englischen Sprache benutzt. Sie ist bis heute die meisbenutzte Sprache in der Wissenschaft und Forschung.
  • COBOL wird in kaufmännische Anwendungen eingesetzt. Eine Studie von 1997 schätzt das es über 200 Milliarden Zeilen COBOL-Sourcecode gibt (80% von den gesamten Code in diesem Bereich).
  • Elixir ist eine funktionale Programmiersprache, die ihre Stärke aus der virtuellen Maschine von Erlang bezieht, auf der sie ausgeführt wird. Da sie per Design immutable ist, hilft sie Entwicklern, testbaren Code zu schreiben.
  • ABAP (proprietäre Programmiersprache, die für die Programmierung von Anwendungen im SAP-Kontext entwickelt und Ähnlichkeit zu COBOL aufweist)
  • HTML ist der Standard für die Darstellung von Internetseiten durch Browser auf verschiedenen Endgeräten, wie Personal-Computern, Notebooks und Smartphones. Die Sprache wird heute von dem World Wide Web Consortium (W3C) weiterentwickelt.
  • PHP ist seit Jahrzehnten eine beliebte Wahl für die Webentwicklung und bleibt auch im Cloud-Zeitalter relevant. Das PHP-Ökosystem mit Frameworks wie Laravel bietet eine solide Grundlage für die Erstellung von Cloud-Anwendungen. Darüber hinaus kann PHP problemlos auf Cloud-Plattformen wie AWS Elastic Beanstalk und Google App Engine bereitgestellt werden.
  • C++ und C werden bei der Programmierung von eingebetteten Systemen, bei der Systemprogrammierung und bei der Spieleprogrammierung eingesetzt.
  • Ruby ist eine Skriptsprache, die speziell für die Front- und Backend-Webentwicklung sowie ähnliche Anwendungen entwickelt wurde. Es ist eine robuste, dynamisch typisierte, objektorientierte Sprache mit High-Level-Syntax, die Programmierung mit ihm wirkt fast wie Codierung in Englisch. Ruby wird für seine elegante Syntax und seinen entwicklerfreundlichen Ansatz gefeiert. Ruby on Rails, ein robustes Webanwendungs-Framework, vereinfacht die Entwicklung von Cloud-Anwendungen, indem es Konventionen gegenüber Konfiguration in den Vordergrund stellt. Heroku, eine beliebte Cloud-Plattform, bietet nahtlose Unterstützung für Ruby-Anwendungen und ist damit eine ausgezeichnete Wahl für die Cloud-Entwicklung.
  • Scala (Scalable Language) ist eine Hybridsprache, die objektorientierte und funktionale Programmierung kombiniert und einen präziseren Programmierstil unterstützt als andere Allzwecksprachen wie Java. Das reduziert die Menge an Code, die Entwickler schreiben müssen. Scala eignet sich gut für die Erstellung skalierbarer und belastbarer Cloud-Anwendungen. Es läuft auf der Java Virtual Machine (JVM) und bietet nahtlose Interoperabilität mit Java, was es zu einer guten Wahl für die Cloud-Entwicklung macht. Die Parallelitätsunterstützung von Scala und das Akka-Framework sind für den Aufbau verteilter Cloud-Systeme von Vorteil.
  • Swift ist eine objektorientierte, robuste und intuitive Programmiersprache von Apple zum Entwickeln von Apps für iOS, Mac, Apple TV und Apple Watch. Sie wurde entwickelt, damit Entwickler mehr Freiheiten haben als je zuvor. Sie ist benutzerfreundlich und Open Source.
  • R ist eine Open-Source-Software sowie eine flexible Programmiersprache für statistische Datenanalyse- und Visualisierung sowie für Grafikerstellung.
  • Im Jahr 1970 entwarf der emeritierte Professor Niklaus Wirth die Programmiersprache Pascal. Sie wurde zu einer der populärsten Lehrsprachen und prägte die Entwicklung weiterer Programmiersprachen.
  •  Delphi's erste Version wurde 1995 veröffentlicht und erzeugte nur Code für 16-Bit-Anwendungen für Windows 3.x. Heute ist Delphi im Vergleich zu Oberon und jeder anderen von Pascal abgeleiteten Sprache immer noch äußerst erfolgreich und bleibt nach den meisten Quellen eine der 20 am häufigsten verwendeten Programmiersprachen.
  • Hack ist eine Skriptsprache für die HipHop Virtual Machine (HHVM). Hack erweitert die Programmiersprache PHP u. a. um statische Typisierung und Generics.
  • Erlang ist eine Open Source Programmiersprache, die heutzutage gerne für (massiv) parallele Programmierung und verteilte Systeme genutzt wird. Die Ursprünge liegen aber Anwendungen im Bereich Telekommunikation, entwickelt wurde die Sprache für und bei Ericsson.
  • Haskell ist eine funktionale Programmiersprache dessen funktionale Ansatz stellt eine andere Art der Problemlösung (Paradigma) im Gegensatz zu einer imperativen Programmiersprache dar.
  • LISP (List Processing - Listenverarbeitung) ist eine funkionale Programmiersprache die für die einfache Manipulation von Data Strings (Zeichenketten) entwickelt wurde. Als eine der ältesten Programmiersprachen, die immer noch verwendet wird, bietet Lisp mehrere verschiedene Dialekte und hat die Entwicklung anderer Sprachen beeinflusst.
  • Kubernetes ist eine Open-Source Software die es ermöglicht, Anwendungen in Containern automatisiert zu verwalten, zu skalieren und zu Orchestrierung. Die Idee für Kubernetes hate Google. Er gilt als die beliebteste und ausgereifteste Lösung für die Container-Aneendungen. Container und Microservices werden in vielen Unternehmen genutzt.
  • Bei Docker handelt es sich um eine Technologie für die containerbasierte Virtualisierung von Software-Anwendungen. Der Einsatz von Docker hat in den letzten Jahren die Anwendungsentwicklung vorangetrieben.
  • Apache Kafka ist ein verteiltes Streaming-System mit Open-Source-Lizenz, das für Stream-Verarbeitung, Echtzeit-Daten-Pipelines und Datenintegration im hohen Maßstab verwendet wird. Kafka wurde 2011 bei LinkedIn für den Umgang mit Echtzeit-Daten-Feeds entwickelt.
  • Grafana ist eine von Grafana Labs entwickelte Open Source-Plattform zur interaktiven Datenvisualisierung, mit der Nutzende ihre Daten in Form von Diagrammen und Graphen sehen können, die in einem Dashboard (oder mehreren Dashboards) zusammengefasst sind und so die Interpretation und das Verständnis erleichtern. Man kann Informationen und Metriken abfragen und Warnmeldungen einstellen, unabhängig davon, wo diese Informationen gespeichert sind, ob es sich um traditionelle Serverumgebungen, Kubernetes-Kluster oder verschiedene Cloud- Services usw. handelt. So kann man die Daten leichter analysieren, Trends und Inkonsistenzen erkennen und letztlich die Prozesse effizienter gestalten.
  • Camunda ist eine Software zur Automatisierung von Prozessen. Sein Einsatzgebiet ist auch die Orchestrierung von Microservices.
  • Apache ist ein kostenloser Open Source Webserver. Der Apache Webserver ist der populärste Webserver, der aktuell von rund 46 % aller Webseiten weltweit genutzt wird. Die erste Version wurde 1995 veröffentlicht. Entwickelt und verwaltet wird dieser Webserver von der Apache Software Foundation (ASF).
  • Mit C#, Java, Swift, Kotlin, C, C++ und Python werden Desktop-Anwendungen entwickelt. Bei Programmen, die nur auf Windows laufen müssen, wird die Sprache C# oft verwendet, da sie besonders gut mit Windows integriert ist.
  • Für die Programmierung von mobilen Apps und Webanwendungen werden bevorzugt Java, JavaScript, TypeScript, PHP, HTML, Kotlin, Swift und Objective-C angewendet.
  • Für die Backend-Software (Software, die auf einem Server läuft) kommen meist Java, Python, PHP, Ruby, Javascript, Go und Kotlin zum Einsatz.
  • Zusammen mit CSS und anderen Techniken dient HTML dazu, Webseiten in Webbrowsern anzuzeigen.
  • In der Wissenschaft und Forschung wird am häufigsten folgende Software eingesetztPython, MATLAB, Mathematica, Labview, IDL, LaTeX, Julia, Stata und R. Numerische Berechnungen in der Wissenschaft werden meist in Fortran oder in C programmiert. Bis in die 80er Jahre hinein war Fortran nahezu die einzig benutzte Programmiersprache, während neuere Programme oft in C geschrieben wurden. Fortran hat gegenüber anderen Programmiersprachen einige Vorteile: Es ist leicht zu schreiben, und beim Compilieren kann ein effizienter und schneller Maschinencode erzeugt werden, zudem wird Fortran ungefähr alle zehn Jahre erneut standardisiert. Bei jeder Standardisierung werden nützliche Techniken aus anderen Sprachen übernommen, z.B. wurden in Fortran 90, dem im Jahre 1990 weltweit etablierten Standard, rekursive Prozeduren und Pointer implementiert. Ein Vorteil von Fortran und C ist auch dass sie über umfangreiche Programmbibliotheken verfügen.
  • Die am meisten eingesetzte Programmiersprachen 2022 waren:
  1. Python (26%)
  2. Java (21%)
  3. JavaScript (8,3%)
  4. C# (7,6%)
  5. PHP (7,4%)
  6. C/C++ (6.3%)
  7. R (4%)
  8. Objective-C (3,1%)
  9. Swift (2,6%)
  10. Matlab (2%)

Welche bekannter Software wurde in welcher Sprache geschrieben?

  • Linux, MS Windows (C)
  • Apple OS X, MS Office, Mozilla Firefox, MySQL, Adobe Photoshop (C++)
  • Skype, Sharepoint, MS Visual Studio, die meisten Apps im Windows Store (C#)
  • SAP, LinkedIn, Eclipse, MathLab, Teile von OpenOffice, NetBeans (Java)
  • Google Suchmaschine, YouTube, Netflix, Spotify, Instagram, Pinterest (Python)
  • Google, Facebook, Amazon, YouTube, Wikipedia, Yahoo und Twitter - alle Clientseitig (JavaScript)
  • Google Serverseitig (C, C++, Go, Java, Python, PHP)
  • Facebook Serverseitig (Hack, PHP, Python, C++, Java, Erlang, D, XHP, Haskell)
  • Amazon Serverseitig (Java, C++, Perl)
  • YouTube Serverseitig (C, C++, Python, Java, Go)
  • Wikipedia Serverseitig (PHP, Hack)
  • Yahoo Serverseitig (PHP)
  • Twitter Serverseitig (C++, Java, Scala, Ruby)

Entwicklungsumgebungen für Softwareentwickler (Integrated Development Environment - IDE)

Ein IDE vereint Entwicklertools auf einer zentralen grafischen Oberfläche.

Beispiele:

  • Microsoft Visual Studio (für C#, C++ und Visual Basic, seit 1985)
  • Eclipse (ursprünglich für Java entwickelt, inzwischen für weitere Sprachen einsetzbar)
  • Qt Creator (Qt)
  • NetBeans (Java, C++, C)
  • InteliJ (Java, Kotlin)
  • Dev-C++ (C++)
  • Kdevelop (Fokus auf C++)
  • Delphi (von Borland entwickelt für die Programmiersprache Object Pascal)
  • Android Studio (Webentwicklung)

Frameworks für Softwareentwickler

Frameworks vereinfachen und beschleunigen die Entwicklung und Integration verschiedener Komponenten und Module.

Beispiele:

  • WPF (Windows Presentation Foundation) - Microsofts UI-Programmierung für den Windows Desktop
  • Qt (Platformunabhängige GUI-Entwicklung)
  • Junit (Java Testing)
  • Mockito (Java Unit-Testing)
  • Hibernate (Java)
  • PHPUnit (ein in PHP geschriebenes freies Framework zum Testen von PHP-Skripten)
  • Angular (Webentwicklung, seit 2021, Google)
  • Vue.js (clientseitiges JavaScript-Webframework zum Erstellen von Single-Page-Webanwendungen)
  • Spring (Java Webentwicklung - Mittels Dependency Injection und aspektorientierter Programmierung ermöglicht es einen leichteren und besser wartbaren Programmcode)
  • Jakarta EE (früher Java Platform, Enterprise Edition, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Webanwendungen)
  • ReactJS, Jordan Walke (meist genutzte Frontend-Framework für Webanwendungen - Es ist eine Open-Source JavaScript-Bibliothek zum Erstellen von Benutzeroberflächen. Als Basis für Single Page Applications - SPA kommen dabei wiederverwendbare UI-Komponenten zum Einsatz)
  • Ruby on Rails (Webentwicklung)
  • Django (Webentwicklung)
  • Blazor (Open-Source Webentwicklung von Microsoft - verwendet wie andere Web-Frameworks HTML und CSS zur Darstellung einer Web-Anwendung, mit dem Unterschied, dass ausführbarer Programmcode mittels C# und der Razor Syntax ausgeführt wird, anstatt mit JavaScript)
  • Flutter (Apps für mobile Endgeräte - Open-Source-UI-Framework auf Basis der Programmiersprache Dart)
  • Selenium (Tests von Webanwendungen)

 

Anzahl Source Code-Zeilen von bekannter Software

Softwarefehler (Bugs)

Software ist inzwischen so komplex geworden, dass es nicht mehr möglich ist, alle Einflüsse auf die Softwarezuverlässigkeit zu kontrollieren und völlige Fehlerfreiheit (keine Bugs) zu erreichen. Mit genügend großem Zeit- und Geldaufwand lässt sich Software zwar bis zu einem vorgegebenen Grad an Sicherheit testen, allerdings stößt dieser Aufwand schnell an wirtschaftlich vertretbare Grenzen. Hinzu kommt, dass die heutige Softwareentwicklung zu einem dynamischen Prozess geworden ist, bei dem viele Einzelkomponenten parallel entwickelt werden.

Ziel ist es, schon sehr früh in der Entwicklungsphase eine Aussage über die Stabilität der späteren Software treffen zu können. Dieser Aspekt ist vor allem für Qualitätsmanager interessant, die den Ursachen möglicher Mängel an Softwarezuverlässigkeit in ihrem Unternehmen auf den Grund gehen möchten.

Im Mittel gibt es 1 bis 3 Bugs je 1000 Zeilen Sourcecode. Generell gilt der Leitsatz: Je früher in einem Entwicklungsprozess der Fehler auftritt und je später er entdeckt wird, desto aufwendiger wird es, den Fehler zu beheben. Schon möglichst früh in der Softwareentwicklung (Pflichtenheft, Design) sollen Fehler gefunden und beseitigt werden.

Eine Software, die besonders gründlich geprüft wurde, ist die des NASA Space Shuttle: man schätzt, dass in seine 3 Millionen Zeilen Quellcode nur noch 300 Fehler geblieben sind.

Arten von Softwarefehler (Bugs)

  • lexikalische Fehler (z. B.unbekannter Bezug)
  • syntaktische Fehler (z. B. vergessenes Semikolon)
  • semantische Fehler (falsche Deklaration)
  • Laufzeitfehler (falsch formatierte Eingabedaten)
  • logische Fehler (z. B. plus statt minus, Schleifenfehler)

Berühmte Softwarefehler und Computer-Attacken

  • Tippfehler im Sourcecode,1962 (Verlust des NASA Satelliten Mariner I)
  • Softwarefehler verursacht durch Überlauf eines Zählers, Bank of New-York, 1985 (Transaktion von Wertpapieren gestoppt dadurch Zinsverlust von 5 Millionen $ an  einem Tag)
  • Fehler in neuen Software bei AT&T, 1990 (60000 Menschen könnten 6 Stunden lang keine Ferngespräche führen)
  • Pentium Prozessor Divisions-Fehler, Intel, 1994 (Mehrkosten von 475 Millionen $ wegen Austausch des Prozessors)
  • Rechnerabsturz wegen zu klein bemessenen Stapelspeicher, Eisenbahn-Stellwerk Hamburg, 1995 (unbeabsichtigtes Schließen des Stellwerks)
  • Vorhandenes Programmcode des Ariane-4-Rakete übernommen, 1996 (Verlust des Ariane-5-Rakete)
  • Fehler durch Umrechnung der englischen Einheiten zu metrische  Einheiten im Programmcode, 1999 (Verlust des NASA Mars-Orbiters)
  • Datumsfehler durch Überlauf des Zählers (Jahr 2000-Y2K Bug, Jahr 2038 auf Unix-Systemen, ist ziemlich glimpflich gelaufen)
  • Fehlende Kompatibilität von Softwaremodulen, Toll Collect, 2003 (Einnahmeausfällen in Milliardenhöhe)
  • Obamacare-Software schluckt ein Drittel der Versicherungsanträge, 2010
  • Private Daten von sechs Millionen Mitgliedern eines sozialen Netzwerks weitergegeben, 2013
  • Makro-Computervirus (Malware) und E-Mail-Wurm für Outlook "Melissa" infizierte viele Rechner, 1999, USA und teilweise Europa (Schaden in Höhe von 1,1 Milliarden $)
  • "I love You!" Computerwurm, 2000 (zwang viele Outlook-Server in der Knie - Schaden von 3 Milliarden $)
  • Computerwurm "MyDom" infizierte 2004 um die 300000 Rechner (Schaden von über 30 Milliarden $)
  • Computerwurm "Stuxnet", 2010 (Eine seiner aggressiveren Varianten infizierte später über das Internet allein in China 6 Millionen Rechner)