Open System Interconnection – Referenzmodell

Das OSI-Referenzmodell (auch: OSI-Schichtenmodell, OSI-Modell, engl.: „Open Systems Interconnection Reference Model“) ist ein, in der Computer-Netzwerktechnik relevantes Modell der Internationalen Organisation für Normung (ISO).
Das OSI-Referenzmodell ist ein mehrschichtiges System eines offenen Netzwerksystems. Es ist die Grundlage, auf der Netzwerkkommunikationsprotokolle aufbauen.

Maßgeblich ist das OSI-Modell für offene Netzwerksysteme; dieses sind Netzwerke, in denen jeder Anwenderprozess mit jedem anderen über offengelegte Schnittstellen kommunizieren kann.

Das OSI-Modell basiert auf sieben Schichten nach dem Prinzip der Kapselung, welche für sich jeweils alleine für eine in sich geschlossene Ebene stehen.

→ WEITERLESEN

Selbstbeschreibungsfähigkeit (Self-descriptiveness)

Ergonomische Software sollte selbstbeschreibungsfähig sein. Die gesamte Benutzeroberfläche sollte selbsterklärend sein, idealerweise sollte der Benutzer nicht erst das Benutzerhandbuch einstudieren müssen, um mit der Software von der Installation bis hin zum erwünschten Ergebnis kommen zu können.

Dennoch sollte es ein Benutzerhandbuch geben, welches alle Funktionen verständlich und ausführlich beschreibt, jedoch den Nutzen jeder Funktion auf  den Punkt bringt. Für das richtige Schreiben des Benutzerhandbuchs gibt es eine  Reihe eigener Regeln für Struktur, Sprache und Technik. In Deutschland ist das Fehlen eines verständlichen und vollständigen Handbuchs sogar als ein Mangel nach dem BGB zu sehen.

Fern ab vom Handbuch, sollte die Software selbst jedoch selbstbeschreibungsfähig sein, denn dies gewährleistet den flexiblen Einsatz der Software.

Probleme durch falsche Bedienung sowie auch Programmfehler sollen durch Dialoge angezeigt und erklärt werden, zudem sollen nach Möglichkeit Lösungswege vorgeschlagen werden. Dabei ist auf eine Sprache zu achten, die an die Zielgruppe des Programms angepasst ist, in jedem Fall aber klar formuliert, ohne Rechtsschreib- und Grammatikfehler (diese stellen nicht nur die Software-Qualität in Frage, sondern könne auch für sprachliche Mehrdeutigkeiten sorgen).

Die Benutzeroberfläche ist dann nicht selbstbeschreibungsfähig, wenn Funktionen sowie der funktionale Zusammenhang ganz oder teilweise unverständlich ist. Wenn dazu noch keine weiterführenden Informationen (z. B. als Hilfe, FAQ etc.) abgerufen werden können, ist die Software bei entsprechender Komplexität quasi nur noch für an der Entwicklung beteiligten Experten bedienbar und somit weder wirtschaftlich noch flexibel einsetzbar.
Der Benutzer muss sich über den Funktionsumfang und den aktuellen Systemzustand informieren können, diese Informationen müssen ihm leicht zugängig sein. Es ist für den optimalen Softwareeinsatz außerdem unabdingbar, dass der Benutzer sich leicht über den Programmvorgang leicht verständlich und schnell erfassbar in Kenntnis gesetzt wird. Beispielsweise ist es sehr ärgerlich, wenn das Programm auf Parameter wartet, der Benutzer dieses jedoch gar nicht weiß und den Programmfortschritt abwartet.

Die Software soll Rückmeldungen an den Benutzer geben können und darüber informieren, wie das Ergebnis erreicht wurde (Prozesse) bzw. auftretende Probleme erläutern.

Um Routinetätigkeiten jedoch nicht unnötig auszubremsen, sollte der Informationsgrad jedoch vom Benutzer bis zu einem verantwortbaren Bereich einschränkbar sein.

Fehlerrobustheit (Error tolerance)

Ergonomische und wirtschaftliche Software muss eine Robustheit gegenüber Fehlern bei der Benutzung aufweisen (Error Tolerance).

Die Fehlerrobustheit betrifft sowohl die Zuverlässigkeit der Arbeitsergebnisse (Berechnungen) als auch der Zuverlässigkeit der Software selbst (Software-Stabilität).

Eine zu lange Zahl oder Zeichenkette oder Daten, welche in einem anderen Format erwartet wurden, können das Arbeitsergebnis unbrauchbar machen oder gar zum Programmabsturz führen.

Wird eine Zahl beispielsweise vom Typ Integer erwartet, ist das Eingabefeld auf die richtige maximale Länge zu begrenzen und zu prüfen, ob die Eingabedaten tatsächlich nur Zahlen (und nicht etwa Sonderzeichen oder Buchstaben) enthalten. Wird ein Datum erwartet, ist nicht nur die richtige Länge zu begrenzen, sondern auch ein (möglichst gängiges) Format zu definieren und auf Einhaltung zu prüfen.

Fehler können bei jeder Eingabe durch den Benutzer aus Unwissenheit, Unerfahrenheit, Missgeschick oder Unaufmerksamkeit erfolgen. Es gilt daher, dem Benutzer niemals zu vertrauen, sondern alle Eingaben auf Fehlerfreiheit zu überprüfen. Der Benutzer wird diese kritische Einstellung gegenüber seinen Eingaben mit Vertrauen in die Programmzuverlässigkeit würdigen.

Ein weiterer Aspekt ist die gezielte Ausnutzung eines Fehlers (SQL-Injection, gezielte Herbeiführung eines Buffer-Overflows für Exploits u.a.), welche durch Fehlerrobustheit so weit wie möglich erschwert werden soll.

Fehlerhafte Eingaben müssen korrigierbar sein. Trotz fehlerhafter Eingaben muss das beabsichtigte Arbeitsergebnis nur mit geringem oder besser gar keinem Korrekturaufwand (durch selbstständige Fehlerkorrektur) erreicht werden können.

Der Benutzer soll auf Fehler hingewiesen und zur Korrektur aufgefordert oder ihm diese empfohlen werden. Fehlermeldungen sowie Korrekturaufforderungen müssen verständlich, sachlich und konstruktiv formuliert und logisch, aber leicht nachvollziehbar strukturiert sein (abhängig von der Komplexität und vom zu erwartenden Kenntnisstand der Benutzer, können „logisch“ und „nachvollziehbar“ zwei gegensätzliche Adjektive sein!).

Eine selbstständige Fehlerkorrektur durch das System gilt als kritisch und sollte dem Benutzer angezeigt werden, so dass er die Korrektur bestätigen oder ggf. abändern kann.

Zur Fehlermeldung gehören Fehlererkennung, wo ein Fehler auftrat, warum er auftrat (Erklärung eines kausalen Zusammenhangs) sowie ggf. Empfehlungen zur zukünftigen Fehlervermeidung.

Durch sinnvolle Gestaltung der Mensch-Maschine-Schnittstelle (Fehlerprävention) durch sinnvolle Strukturierung, Benennung, Beschriftung und weiterführenden Informationen, soll das Auftreten von Fehlern bereits von vorne herein unwahrscheinlich werden. So sollte das richtige Format z. B. für ein Datum oder eine Telefonnummer vorgegeben werden (idealerweise mit Beispiel), bestenfalls aber kann der Benutzer sofort an Hand der Eingabefeldgestaltung das zu verwendende Format erkennen.

Bei der Software-Entwicklung ist ein systemeigenes Fehlermanagement zu überlegen. Ein solches Fehlermanagement soll negative Auswirkungen (z. B. Zeitverlust) von Fehlern begrenzen. Dazu gehört u.a. die Reversibilität von
Fehlern (z. B. mit UNDO-Funktionen zum rückgängig machen von Eingabeschritten). Je komplexer die Software wird, desto schwieriger sind allerdings i.d.R. auch der Entwurf und die Implementierung einer Reversibilität.

Aufgabenangemessenheit (Suitability for the task)

Software ist auf eine bzw. mehrere Aufgaben ausgerichtet entwickelt worden. Die Software muss für diese Aufgaben angemessen gestaltet und benutzerfreundlich sein.

Ist die Bereitstellung aller benötigten Informationen und Funktionen zur Erledigung einer vorbestimmten Aufgabe (z. B. die Erstellung von Textdokumenten oder CAD-Modellen) durch die Software nicht gegeben, so ist die Software nicht angemessen praktikabel und wenig benutzerfreundlich gestaltet.

Der Benutzer soll (durch Tipps und Empfehlungen) von der Software über Informationen und Zustände informiert und unterstützt, jedoch möglichst nicht genervt werden. Dies wird mit einem Dialogsystem (vom kleinen Hinweis in der Statusanzeige bis hin zum Piepton begleitetem Fenster-Dialog) erreicht, wobei sich die Software Einstellungen (Kenntnisnahmen und Prioritäten wie Sicherheitsstufen / Warnlevel) merken muss. Wurde eine immer wieder auftauchende Information vom Benutzer zur Kenntnis genommen, soll dieser Benutzer den Hinweis auf diese Information deaktivieren können (deaktivierfähige Hinweise sind beispielsweise Tipps über die Software beim Start der Software oder bei Ausführen einer bestimmten Aktion z. B. dass eine Datei vor dem öffnen automatisch konvertiert und als temporäre Datei abgespeichert wird).

Äußerst wichtige Hinweise, insbesondere die, welche bei Unaufmerksamkeit zu Datenverlust oder schlimmeren führen können, sind jedoch von der Deaktivierfähigkeit auszuschließen. Ein Beispiel: Wird die Anwendung geschlossen, gehen nicht gespeicherte Änderungen verloren. Der Hinweis auf diese Tatsache sollte nicht automatisch umgangen werden können, es ist aber automatisch sicherzustellen, dass der Hinweis nur erscheint, wenn wirklich Änderungen nach dem letzten Speichern vorgenommen wurden.

Aufgaben, die aus der technischen Eigenheit der Software und des Systems erwachsen und aus denen keine kritischen Zustände entstehen können, sollen durch das System eigenständig ausgeführt werden (z. B. Zwischenspeicherung, Überprüfung von sowie Hinweis über Systemkomponenten und Kompatibilität).

Verfügbare Funktionen der Software sollen an wiederkehrende Aufgabenstellungen angepasst werden können (z. B. durch Standardwertdefinierung, Abspeicherung von Profilen für unterschiedliche Zwecke).

Die Komplexität der Software, ihrer Funktionalität und die Aufgabe soll auf ein angemessenes Level reduziert werden
können. Der Benutzer soll nicht permanent mit Informationen überflutet werden, sondern sich auf das im Moment Wesentliche beschränken können. Elemente (Items) sollen logisch gruppiert, Ausschnitte gezoomt, Funktionsumfänge angepasst, dabei insbesondere beschränkt (z. B. wählbare Minimalinstallation, benutzerdefinierte Installation oder Ansicht) werden können.

Ergonomische Gestaltung von Software

Ergonomie betrifft nicht nur Stühle, Schreibtische und sonstige Büromöbel, sondern auch Anzeigen und Steuerelemente (im Büro, Cockpit, Konsolen, Anlagen usw.). Die Ergonomie ist daher auch Einflussgeber in der Produktgestaltung im Maschinenbau und der Elektrotechnik. Sehr viele Anzeigen und Steuerelemente, welche vor 10 Jahren noch Hebel und analoge Anzeigen waren, sind heute digitalisiert und als Software realisiert. Die Ergonomie spielt daher auch immer mehr in der Software-Entwicklung eine Rolle.

→ WEITERLESEN

Testverfahren: White-Box vs Black-Box

In der Software-Entwicklung müssen Entwicklungsergebnisse immer verifiziert und validiert werden. Dazu werden White-Box- und Black-Box-Tests verwendet.

White-Box-Test (WB-Test):
Hier haben die Tester Zugriff auf und Kenntnis über die Entwicklung der Software (Quellcode, Entwicklungsumgebung, Diagramme [UML etc.] sowie Dokumentation). Da quasi in das Programm „hineingesehen“ wird, wird auch seltener vom „Glass-Box-Test“ gesprochen.

  1. Stufe: Dieselben Programmier, die die Software programmiert haben, führen den Test durch
  2. Stufe: Andere Programmierer, welche sich jedoch in den Code hineinarbeiten, führen den Test durch

Black-Box-Test (BB-Test):
Hier haben die Tester keinen Zugriff auf und idealerweise auch keine Kenntnis über die Entwicklung der Software.

  1. Stufe: Tester, welche als Kunden auftreten (echter Kunde oder nur „simulierter“ Kunde) testet die Software (vor allem Funktionstests)
  2. Stufe: Tester, welche Erfahrung mit Software-Tests (z. B. Penetration Tests) haben und sich in die Auftragsspezifikationen hineinarbeiten, führen den Test durch (vor allem Stresstests)

    → WEITERLESEN

10 gängige Vorurteile über die Programmierung

  1. Funktionen/Methoden dürfen nur einen Ausstiegspunkt (return) haben
    Dies ist nicht richtig, es wird jedoch von vielen erfahrenen Entwicklern als unschön angesehen, wenn eine Funktion mehrere Ausstiegspunkte hat. Die Funktion kann so aber schneller abgehandelt werden, wenn die Funktion sofort mit „return“ verlassen wird, wenn eine Bedingung hierfür gesetzt wurde. Gibt es nur ein „return“ am Ende der Funktion, wird die Funktion in die Länge gezogen.
  2. UDP-Pakete brauchen Prüfsummen
    Natürlich nicht. Das tolle an UDP ist ja gerade, dass Pakete quasi blind (und schnell) weggeschickt werden können. UDP sollte sowieso nicht da verwendet werden, wo Daten unbedingt ankommen müssen. Wenn Daten unbedingt ihr Ziel erreichen sollen, sollte der Weg auch frei sein, gleich das verbindungsorientierte TCP statt UDP zu nutzen.
  3. C ist veraltet
    Bis jetzt gibt es viele Anwendungsbereiche, bei welchen C ziemlich alternativlos ist, z. B. teilweise in der Programmierung von Mikrocontrollern und der hardware-nahen Programmierung generell.
  4. Open Source ist Freeware
    Freeware meint nur Software, welche kostenlos zu haben ist, also „frei“ im Sinne von „kostenlos“. Dabei kann Freeware auch Open Source sein, muss aber nicht. Freeware könnte zudem auch mit einem Kopierschutz etc. ausgestattet sein. Open Source (auch bezeichnet als „Freie Software“) ist quelloffen und kann zum Nutzen für die Gemeinschaft ausgeführt, verbreitet und verändert werden.
  5. Jede nicht-objektorientierte Software ist nicht auf dem Stand der Zeit
    Objektorientiertheit zahlt sich in höheren Programmiersprachen sehr aus, jedes Skript und auch bestimmte Programme, die auf Geschwindigkeit ausgelegt sind, müssen (oder sollten?) aber nicht unbedingt objektorientiert sein.
    Ein umfangreiches Verwaltungsprogramm sollte schon in z. B. Java/C# rein objektorientiert umgesetzt werden, ein Skript, welches eine Textseite parsen soll oder ein Programm für einen Mikrocontroller muss aber nicht gleich objektorientiert sein.
  6. Globale Variablen sind immer schlecht
    Als ich meine ersten Programme in C/C++ geschrieben habe, habe ich es mit den globalen Variablen schon ein bisschen übertrieben. Das ist ein typischer Anfängerfehler. Aber wenn man mal ein paar Schritte weiter ist oder sich mal Open Source betrachtet, findet man immer wieder ein paar globale Variablen, und das völlig berechtigt. Es gibt Situationen, da müssen neben Konstanten auch ein paar Variablen überall verfügbar sein. Anders als Konstanten können gloibale Variablen verändert werden und so einen aktuellen Stand beschreiben.
  7. Arrays und Zeiger sind dasselbe
    Arrays sind in C mit Zeigern umgesetzt, dasselbe sind Zeiger und Array jedoch lange nicht. In anderen Programmiersprachen entfernen sich Array und Zeiger sogar noch weiter voneinander.
  8. Objektorientierung ist in C oder Assembler unmöglich
    Das stimmt so überhaupt nicht. Allerdings muss man da schon in C und Assembler mehr tun, als einfach eine Klasse zu definieren wie in Java/C#. Jedoch ist weder C und noch Assembler (die Programmiersprache eines Assemblers) auf Objektorientierung ausgelegt, es wird daher aufwändig und undurchsichtig mit der Objektorientierung, möglich jedoch schon.
  9. Rekursion ist immer besser als die Iteration (Schleifen)
    Rekursion wird als schöner empfunden (und einige wenige Programmiersprachen kennen auch nur Rekursion), Rekursion ist aber z. B. in C grundsätzlich langsamer und speicheraufwändiger als Iteration (da immer wieder eine Funktion aufgerufen und geladen werden muss).
  10. Java ist langsam
    Halbes Gerücht. Denn Java ist, das haben viele Tests z. B. von Fachzeitschriften gezeigt, im Vergleich zu Sprachen wie C/C++ schon langsam. Man sollte hier aber auch wirklich auf die Konzepte achten, so auch nur ein rein objektorientiertes Programm in C++ mit einem solchen in Java vergleichen (dass C++ objektorientiert ist, ist übrigens auch ein Gerücht, es handelt sich eher um eine hybride Sprache).
    Das Problem ist doch eher, dass bei Java oft übertrieben wird, was die Langsamkeit betrifft.

Mikroprozessortechnologie – CISC vs RISC

Es gibt zwei maßgebende Architekturprinzipien in der Mikroprozessortechnologie, RISC und CISC. Die Grundunterschiede zwischen beiden Prinzipien werden bereits durch die Namensgebung klar.

RISC (Reduced Instruction Set Computing)

RISC arbeitet mit einem geringeren Grundbefehlssatz (maximal 128) aus weniger komplexen Befehlen, welche maximal vier Befehlsformate haben können. Das macht Programmausführungen mit einem RISC-Prozessor flexibler, da die Befehlsausführungszeit geringer ist. Durch geringe Befehlsausführungen können die Rechenvorgänge des Prozessors schneller und somit auch flexibler unterbrochen werden.

Da sich der Befehlssatz auf das Nötigste beschränkt und die jeweiligen Befehle so (gegenüber den Befehlen der CISC-Architektur) kurz und außerdem einheitlich lang bleiben, wird auch das Dekodieren der Befehle in kürzerer Zeit möglich. RISC-Prozessoren haben gegenüber den CISC-Prozessoren verhältnismäßig viele Register (kleinster, aber schnellst adressierbarer/ansprechbarer Speicher, welcher sich innerhalb des Prozessors befindet), was die Rechengeschwindigkeit weiterhin erhöht.

Der Code für einen RISC-Prozessor ist weniger kompakt als der eines CISC-Prozessors, denn die vielen Befehle, welche nur für eine mittelmäßig komplexe Anweisung notwendig sind, blähen den Code geradezu auf.

CISC (Complex Instruction Set Computing )

CISC-Prozessoren kamen nach den RISC-Prozessoren und begründeten sich vor allem durch eine Zeit des teuren Arbeitsspeichers und des nicht vorhandenen Cache-Speichers. So wurden viele komplexe Befehle (welche selbst aus mehreren effektiven Befehlen bestehen und unterschiedliche Größen haben können) direkt im Mikroprogrammspeicher des Mikroprozessors gespeichert, die Architektur um spezialisierte Register, viele Befehlsformate und Adressierungen erweitert. CISC-Prozessoren hatten sich in der Vergangenheit besonders bei Großrechnern durchgesetzt, aber auch in kleinere (End-)Geräten wurden CISC-Prozessoren integriert, insbesondere durch Hersteller wie IBM, Intel und Motorola.

CISC vs RISC – Keine Frage der Zukunft

Heute sind reine CISC-Prozessoren kaum mehr in Verwendung, aber auch reine RISC-Prozessoren sind heute kein Trend mehr. Heutige Prozessoren sind meistens RISC-Prozessoren, welche sich in ihrer Architektur auch an CISC-Prozessoren anlehnen. Die Prozessoren finden sich heute im Taschenrechner, in der digitalen Kamera, im PC usw. auch das aktuelle IPhone von Apple nutzt einen Prozessor, der mehr RISC- als CISC-Prozessor ist.

Die Differenzierung von RISC und CISC ist aktuell und auch in Zukunft nicht mehr notwendig, da sich die Hersteller nicht mehr nur für eine Philosophie entscheiden, sondern anforderungsgemäß Architekturen entwickeln, die Elemente aus CISC wie auch aus RISC enthalten, wobei die RISC-Eigenschaften meistens überwiegen mögen.

Datenbankmodelle

Datenbankmodelle sind das Gerüst nach welchem implementierte Daten gespeichert werden. Datenbankmodell sind abhängig vom Datenbankmanagementsystem.

Das ER-Modell als abstraktes Datenmodell und Datenmodellierungsinstrument zählt nicht zu den Datenbankmodellen.

Es gibt vier Hauptdatenbankmodelle, welche nach folgenden Adjektiven eingeordnet werden:

  • netzwerkartig bzw. vernetzt
  • hierarchisch
  • objektorientiert
  • relational

Aus diesen vier Hauptdatenbankmodellen sind einige Mischformen bzw. hybride Modelle, z.B. das objektrelationale Datenbankmodell oder relationale Netzwerk-Datenbankmodell, entstanden, welche die Eigenschaften der unterschiedlichen Datenbankmodelle kombinieren.

Das verbreiteste Datenbankmodell ist das relationale Datenbankmodell. Für kleine bis mittelgroße Softwareprojekte wird fast ausschließlich eine oder mehrere relationale Datenbanken verwendet.

→ WEITERLESEN