Beim Programmieren geht es nicht darum, auf die Tastatur zu hauen und so schnell wie möglich zu tippen. Es geht nicht darum, religiös Tastenkombinationen auswendig zu lernen und die Maus letztendlich überflüssig zu machen. Es geht nicht darum, jede einzelne Programmiersprache zu lernen, wenn das überhaupt möglich ist. Ein guter Programmierer wird nicht durch die Marke, den Preis, die Leistung und das Betriebssystem seines Computers definiert, noch durch seine Vorliebe für Code-Editoren und IDEs – VS Code, Atom, IntelliJ IDEA, Vim, Notepad++ oder andere. Entgegen der landläufigen Meinung, die dank vieler Hollywood-Filme entstanden ist, ist Programmieren definitiv nicht gleichbedeutend mit Hacken.
Außerdem geht es über das Auswendiglernen der Syntax und der eingebauten Funktionalitäten einer Programmiersprache hinaus. Logik, Bedingungen, if
Anweisungen und Algorithmen – insbesondere Sortieralgorithmen – geben kein vollständiges Bild davon, was Programmieren wirklich ist. Auch Mathematik, Rekursion, Informatik und Entwurfsmuster werden ihr nicht gerecht. Obwohl sie einen großen Teil dessen ausmachen, was Programmieren ist, sind sie nur ein Teil des Puzzles.
Entwerfen und Planen
Bevor eine einzige Zeile Code geschrieben wird, werden das Design und die Architektur eines Projekts gründlich geplant, um einen reibungslosen Entwicklungszyklus zu gewährleisten oder zumindest die Wahrscheinlichkeit dafür zu erhöhen. An dieser Stelle kommt das Softwaredesign ins Spiel. Toolchains, Pipelines, Abstraktionsschichten für öffentliche und interne APIs, Modularisierung, Objektbeziehungen und Datenbankstrukturierung werden in dieser Phase der Entwicklung geplant.
Wir sind lebende, atmende Debugger
Die Kunst des Programmierens verlangt von uns, über den Tellerrand zu schauen und Probleme mit den pragmatischsten, effektivsten und machbarsten Lösungen zu lösen. Das ist wahrscheinlich der Grund, warum wir am ehesten der „I.T.-Typ“ oder der „Kundensupport“ im Haushalt sind. Es ist praktisch unsere Aufgabe, zu reparieren, was kaputt ist. Es ist, als ob „Programmieren“ eine verherrlichte Form von „Problemlösung“ ist.
Mit anderen Worten, wir sind lebende, atmende Debugger auf und neben unseren Computern, und deshalb ist es wichtig, dass wir wissen, wie man Dokumentation liest und schreibt. Richtige Dokumentation – in Form von Seiten mit detaillierter Dokumentation oder einfach nur durch das Einstreuen von wertvollen Kommentaren in die Codebasis – ist eine der wichtigsten Lebensadern eines Programmierers. Ohne sie tappen wir im Dunkeln und sind nicht in der Lage, unsere eigentlichen Aufgaben als Debugger zu erfüllen. Wir können kaum Fortschritte machen, weil wir die meiste Zeit mit Experimenten und der Untersuchung der Funktionsweise eines Frameworks oder einer Legacy-Codebasis verbringen würden. Insgesamt würde dies zu einer schrecklichen Erfahrung für Entwickler führen.
Betrachten Sie alle möglichen Szenarien
Debugging ist schon schwer genug. Erschwerend kommt hinzu, dass die Ausführung von Code in der Regel nicht linear ist. Bei großen Projekten gibt es mehrere „Verzweigungen“ möglicher Ausführungspfade aufgrund der Programmlogik mit der if
-Anweisung. Wir müssen jedes einzelne mögliche Szenario und jeden Fehler berücksichtigen, vor allem wenn es sich um Benutzereingaben handelt. Die kognitive Belastung, die erforderlich ist, um jeden möglichen Ausführungspfad im Auge zu behalten, macht die Programmierung umso schwieriger.
Benutzererfahrung
Wenn wir aus der Welt der Entwicklung heraustreten, versetzen wir uns in die Lage eines durchschnittlichen Benutzers. Neben der Bereitstellung von Funktionen, dem Hinzufügen neuer Features, der Behebung von Fehlern und der Dokumentation unserer Codebasis konzentrieren wir uns auch darauf, wie ein durchschnittlicher Benutzer mit unserer App oder Software interagiert. Wir berücksichtigen mehrere Faktoren, die zu einer großartigen Benutzererfahrung führen, wie z. B. (aber nicht nur) Zugänglichkeit, Benutzerfreundlichkeit, Auffindbarkeit, UI-Design, Farbthemen, funktionale Animationen und Leistung.
Leistung und Optimierung
Also, Leistung ist eine große Facette der Programmierung an sich. Wir, besonders diejenigen mit einem Hintergrund in Informatik, bemühen uns, die zeit- und platzsparendsten Algorithmen zu verwenden und zu schreiben. Wir sind besessen von der unergründlichen Zeitskala von Mikrosekunden, um das Beste aus unserem verfügbaren Speicher, unseren CPUs und GPUs herauszuholen.
Im Zusammenhang mit der Webentwicklung ist die Netzwerkoptimierung ein wichtiges Konzept, das es zu verstehen gilt. Wir machen uns die Mühe, unser HTML, CSS und JavaScript zu minifizieren und zu komprimieren, nur um die Nutzlast einer Antwort vom Server zu minimieren. Bilder und andere Ressourcen werden ebenfalls komprimiert und verzögert geladen, um die Datenmenge zu minimieren, die der Benutzer herunterladen muss, bevor eine Seite aussagekräftig und benutzbar wird.
Es gibt jedoch Momente, in denen wir uns zu sehr auf die Leistung konzentrieren. Verfrühte Optimierung wird zum Problem, wenn wir uns unnötigerweise mit der Optimierung bestimmter Teile einer Codebasis beschäftigen, anstatt uns auf das zu konzentrieren, was für den tatsächlichen Fortschritt und die Produktivität getan werden muss. In diesem Fall müssen wir die Weisheit besitzen, zu beurteilen, welche Teile der Codebasis wirklich optimiert werden müssen.
Sicherheit
Außer der Benutzeroberfläche und der Logik unserer Software sind wir als Programmierer auch für die Sicherheit unserer Benutzer verantwortlich. In der heutigen Zeit, in der Daten sehr begehrt sind und stark monetarisiert werden, ist es wichtiger denn je, dafür zu sorgen, dass die persönlichen Informationen unserer Benutzer sicher sind. Wir unternehmen zusätzliche Schritte zum Schutz privater Daten, weil unsere Nutzer unserer Software vertrauen. Wenn wir dieser Verantwortung nicht gerecht werden, sind wir sicherlich keine echten Programmierer, nicht einmal im Entferntesten.
Wenn es um Sicherheit geht, kann man nie zu sicher sein. Als allgemeine Faustregel gilt: „Vertraue niemals auf Benutzereingaben“. Es kann sogar als „beste Praxis“ angesehen werden, Daten und Benutzereingaben mit großem Aufwand zu bereinigen. Wir setzen nicht nur unsere Software und Infrastruktur einem großen Risiko aus, wenn wir nicht vorsichtig damit umgehen, sondern wir laufen auch Gefahr, sensible Benutzerdaten zu gefährden – genau die Daten, die wir als Programmierer zu schützen versprechen.
Sicherheit bezieht sich jedoch nicht nur auf Benutzerdaten und -eingaben. Viren, Würmer, Trojanische Pferde, Adware, Key Logger, Ransomware und andere Formen von Computerschädlingen verbreiten sich weiter und plagen Millionen von Computern und Geräten auf der ganzen Welt. Selbst nach jahrzehntelangen technologischen Verbesserungen bei Hard- und Software gibt es kein System, das unverwundbar ist. Sicherheit ist einfach ein Handwerk, das immer weiter verfeinert wird, aber nie perfekt sein wird, denn es wird immer ein paar Neugierige geben, die nach jeder Möglichkeit suchen, ein System zu „hacken“.
Aus diesem Grund entwickeln wir unsere Software unabhängig vom Anwendungsfall und der Benutzerbasis so, dass die Sicherheit eine der höchsten Prioritäten ist, wenn nicht sogar die höchste Priorität. Wir tun dies, um unsere Benutzer vor den oben genannten Bedrohungen zu schützen, die zu Unannehmlichkeiten wie Datenverlust, Dateibeschädigung und Systemabstürzen führen können, um nur einige zu nennen.
Teamwork makes the dream work
Auch wenn es nicht unbedingt etwas mit Programmierung zu tun hat, spielt Teamwork bei der Softwareentwicklung eine äußerst wichtige Rolle. Bei all der Komplexität und den beweglichen Teilen eines Großprojekts ist es für eine einzelne Person unmöglich, qualitativ hochwertige Software in dem zügigen Tempo regelmäßiger Iterationen oder unter den strengen Fristen und Zeitvorgaben eines Kunden oder einer überwachenden Instanz zu entwickeln.
Deshalb gibt es verschiedene Teams von Personen, die sich auf eine der vielen Facetten der Programmierung spezialisiert haben. Eine Person wird niemals alle Fähigkeiten und Kenntnisse besitzen, die erforderlich sind, um alle Facetten effektiv und kohärent zusammenzufügen. Ein Team kann für das Design der Benutzeroberfläche und die Zugänglichkeit zuständig sein, während ein anderes an der Funktionalität der Software selbst arbeitet. Wenn alle Kompetenzen der verschiedenen spezialisierten Teams kombiniert werden, wird die resultierende Software die beste Funktionalität, Benutzerfreundlichkeit, Leistung und Sicherheit aufweisen, die im Rahmen der finanziellen und praktischen Möglichkeiten möglich ist.
Für das Zeitmanagement und die Einhaltung von Fristen sind Workflow-Organisation und Automatisierung von größter Bedeutung. Wir nehmen uns die Zeit, unsere Build-Tools und Pipelines richtig zu konfigurieren, weil uns das in Zukunft viel Zeit sparen wird. Im Allgemeinen steigt die Rentabilität der Investition mit der Zeit.
Gute Zusammenarbeit mit anderen
Um den Gedanken der Teamarbeit und Kooperation zu vertiefen, bauen wir gesunde Beziehungen zu unseren Kollegen auf, denn der Erfolg eines Projekts hängt letztendlich stark vom Erfolg des dahinter stehenden Teams ab. Wir bemühen uns um eine unterstützende Arbeitsumgebung, in der erfahrene Senioren Neulinge behutsam anleiten.
Da wir Software im Team entwickeln, müssen wir darauf achten, dass andere unseren Code lesen. Um den Entwicklungszyklus langfristig aufrechtzuerhalten, sind Lesbarkeit und Wartbarkeit genauso wichtig wie die Logik und Funktionalität eines Projekts. Wir schreiben durchweg guten, lesbaren Code und stellen gleichzeitig informative Commit-Meldungen und Dokumentationen zur Verfügung, weil diese uns und anderen definitiv helfen, unseren Code besser zu verstehen.
Als ob andere unseren Code lesen würden, ist ein Code-Review eine großartige Gelegenheit, mehr über die besten Praktiken beim Programmieren zu lernen. Es ist auch eine weitere Möglichkeit, sich mit einer Codebasis und dem ihr zugrunde liegenden Design und der Architektur vertraut zu machen. Auch wenn konstruktive Kritik unangenehm und schwer zu ertragen ist, ist es wichtig, sie als guten Rat anzunehmen, damit wir uns als Programmierer verbessern können.
Programmieren ist schwer
Programmieren umfasst viele Aspekte, die über die Funktionalität hinausgehen, wie Benutzerfreundlichkeit, Leistung, Sicherheit und Teamarbeit. Es reicht nicht aus, sich nur auf einen Aspekt zu konzentrieren und die anderen zu vernachlässigen. Bei Projekten von nennenswerter Größe und Bedeutung reicht es nicht aus, einfach nur ein paar Zeilen Code einzugeben. Um erfolgreich zu sein, bedarf es einer sorgfältigen Planung, Konzeption, Überlegung und Zusammenarbeit im Team. In der Tat verbringt man beim Programmieren mehr Zeit mit Nachdenken als mit Tippen, vor allem während langer Debugging-Sitzungen.
Letztendlich geht es beim Programmieren um kontinuierliches, ununterbrochenes Lernen. Anpassungsfähigkeit und ständiges Lernen sind der Schlüssel zum Überleben in dieser Branche. Wir können nicht erwarten, dass wir relevant bleiben, wenn wir nicht unseren Teil dazu beitragen, ständig zu lernen. In einer so unbeständigen Branche mit exponentiellen technologischen Verbesserungen müssen wir mit dem schnellen Tempo Schritt halten, um nicht im Staub zu landen.
Zum Abschluss dieses Artikels möchte ich die harte Arbeit aller Entwickler auf der ganzen Welt würdigen. Um diesen Artikel zu schreiben, musste ich über den täglichen Arbeitsablauf eines Entwicklerteams nachdenken. Ich musste mich mit den vielen Aspekten der Programmierung und Softwareentwicklung befassen, die normalerweise unbeachtet bleiben. Seitdem habe ich ein größeres Verständnis für all die Software, die auf meinem Computer installiert ist. In diesem Sinne möchte ich jeden ermutigen, sich heute bei einem Programmierer zu bedanken, unabhängig von seiner Erfahrung. Wo wären wir ohne sie?
Nehmen Sie ihre harte Arbeit nie als selbstverständlich hin.