Praktikumsbericht (2)

Das Praktikum nähert sich dem Ende, und die grundlegende Codierung des Backend-API-Servers ist im Wesentlichen abgeschlossen. Hier möchte ich eine Zusammenfassung geben.

Als Teamleiter des Projektteams stammt mein einziges Wissen über Software-Projektmanagement aus der einmaligen Lektüre von “The Mythical Man-Month” während der Winterferien. Nach dieser praktischen Erfahrung stelle ich fest, dass ich noch viel zu unerfahren bin. Dennoch glaube ich, dass ich einiges gelernt habe.

Design

Im Vergleich zu der Zeit vor zwei Jahren, als ich C-Programmieraufgaben ohne großes Nachdenken in VS erledigte, hat sich mein heutiges Vorgehen offensichtlich verändert.

Zunächst einmal habe ich VS schon lange nicht mehr geöffnet.

Jedenfalls habe ich in diesen zwei Jahren verschiedene Phasen intensiver Programmiererfahrung durchlaufen: die naive und reine Lernphase mit Python, die Herausforderungen beim Schreiben der Roboter-Steuerungssoftware im Robotik-Team, die Erfahrung mit dem Schreiben von Web-Crawlern für die Lehr- und Studentenseite der Universitätsverwaltung und die Entwicklung eines Dateiverwaltungstools für das “Orange Juice”-Projekt. Am Anfang ging es natürlich draufgängerisch zur Sache, aber nachdem ich oft genug die bitteren Folgen von Widersprüchlichkeit geschmeckt habe, weiß ich inzwischen, dass eine vorherige Planung notwendig ist. Hat man einmal die Tür zum Design aufgestoßen, geht es nur noch um den Grad der Ausführung – daher war diese Erfahrung, ein gesamtes Projekt zu leiten, eine sehr nützliche Übung.

Zunächst muss klar sein, was gemacht werden soll. Diese Frage ist für ein Team, das ernsthaft ein Produkt entwickeln möchte, von entscheidender Bedeutung: Das eigene Produkt zu definieren ist eine strategische Angelegenheit. Leider gab es diesbezüglich keine besonders originellen Ideen, und da die Verantwortung auf meinen Schultern lag, war meine Erwartung an dieses Praktikum, ein solides, einfaches Projekt ernsthaft umzusetzen.

Kurz gesagt handelt es sich um eine traditionelle Webanwendung mit Schwerpunkt auf WeChat Mini Programs – konkret soll ein Zielmanagementsystem entwickelt werden.

Davon gibt es bereits unzählige, daher findet man für die Modellierung der anstehenden Aufgaben viele ausgereifte Lösungen: beispielsweise Worktile für projektorientierte Arbeit, WonderList für persönliches Lebensmanagement, My Study Life für Studenten, und sogar Apples “Erinnerungen” sowie andere Tools, die ich zwar kenne, aber nie benutzt habe. Indem ich die Merkmale dieser Tools zusammenfasse, entsteht ein klassisches, von WeChat inspiriertes Zielmanagementsystem – das wird unser zu entwickelndes Seed.

Erforderliche Eigenschaften

Was sollte Seed also können?

  • Ein einfaches Benutzersystem besitzen, um die Synchronisation zu erleichtern und die Benutzerbindung zu erhöhen.
  • Benutzer können frei Ziele erstellen und verwalten, ähnlich wie “Projekte” in Worktile.
  • Benutzer können in die Ziele anderer eingeladen werden.
  • Ziele werden unterteilt in tägliche Check-in-Typen (wiederkehrend) und projektbezogene Typen (einmalig, können Meilensteine enthalten).
  • Die primäre Frontend-Plattform sind WeChat Mini Programs.
  • Kompatibilität mit anderen potenziellen Clients.

Daraus folgt, dass Seed ein kleines, schlankes und praktisches Dienstangebot sein sollte, was perfekt mit der ursprünglichen Idee von WeChat Mini Programs übereinstimmt.

Hier muss das Merkmal “klein und schlank” betont werden. Warum klein und einfach? Erstens, weil personelle Ressourcen und Zeit begrenzt sind. Zweitens, um den Fehler zu vermeiden, der laut “The Mythical Man-Month” typisch für “zweite Projekte” ist: blinde Selbstüberschätzung und das wahllose Hinzufügen endloser Redundanzen zu einem Projekt. Das ist eine undankbare Dummheit, zumal – wir keine Werbeeinnahmen generieren. Ein einfaches Beispiel: Die Mac OS-Version von Thunder im Vergleich zur Win-Version. Offensichtlich bevorzugen alle die schlankere und benutzerfreundlichere Mac-Version.

Gleichzeitig muss eine gute Kompatibilität mit WeChat Mini Programs gewährleistet sein. Um eine reibungslose Benutzererfahrung zu bieten, sollte neben der E-Mail-Adresse als Login auch die WeChat-openId als Anmeldeinformation unterstützt werden.

Systemarchitektur

Wie bereits erwähnt, wollen wir eine Webanwendung mit Schwerpunkt auf WeChat Mini Programs entwickeln. Das bedeutet, dass Seed die Fähigkeit und den Anspruch besitzen sollte, mit anderen Frontends kompatibel zu sein. Daher ist ein RESTful-API-Ansatz die beste Wahl: vollständige Entkopplung von Frontend und Backend, klare Struktur und einfache Nutzung.

Daher sollte Seed aus WeChat Mini Programs und anderen potenziellen Formen als Frontend bestehen, die über das HTTP-Protokoll die vom Backend bereitgestellten “Ressourcen” konsumieren.

Das Backend stellt über APIs einen sicheren und zuverlässigen Dienst bereit.

Dazu habe ich auch einiges gelernt und bin auf das Konzept von HATEOAS (Hypermedia As The Engine Of Application State) gestoßen. Obwohl noch nicht ausgereift, stellt es eine mögliche Zukunft dar.

Implementierung

Da ich nur an der Codierung des API-Servers beteiligt war, spreche ich hier nur über die Backend-Implementierung.

Ich teile das Design gerne in die strategische Ebene (das “Dao”) ein, die restliche Arbeit fällt in die taktische Ebene (die “Shu”). Daher zählen hierzu die Wahl der Technologien und die konkrete Umsetzung eines Systems.

Technologie

Aufgrund der Praktikumsanforderungen und aus dem Wunsch heraus, die Java-Sprache sinnvoll einzusetzen, wurde das Spring Framework als Backend-Framework gewählt, inklusive des Spring-Ökosystems:

  • Spring Boot als Anwendungscontainer
  • Spring Framework für die Geschäftslogik
  • Spring Data als DAO
  • Spring Session für die Session-Verwaltung
  • Spring Test für Tests

Zusätzlich wurden Tools wie Git, TravisCI und Heroku eingesetzt, um die Entwicklungserfahrung zu verbessern.

Entwicklungsprozess

Wie bereits erwähnt, ähnelt die Erfahrung beim Schreiben von Spring-Controllern stark der mit dem Python Flask Web Framework. Vielleicht hat Flask sich von Spring inspirieren lassen? Ressourcenorientierte Controller-Klassen finde ich viel kompakter als die traditionelle Java-Web-Entwicklung, bei der für jede Ressource ein eigenes Servlet geschrieben werden muss.

Spring fördert testgetriebene Entwicklung. Dies konsequent umzusetzen ist nicht einfach, da Tests nicht gerade beliebte Arbeit sind. Einen speziellen Mitarbeiter nur für Testcode abzustellen, wäre erstens mit hohen Lernkosten verbunden und zweitens gäbe es zwischenmenschliche Probleme. Daher habe ich in der Entwicklung entschieden, dass jeder für das Testen seines eigenen Codes verantwortlich ist. Die finale Code-Überprüfung übernahm ich.

Zusammenfassung

Die erwähnenswerten Aspekte von Seed selbst sind besprochen, nun zu anderen Punkten.

Persönliche Zusammenfassung

Ich habe im Praktikum viel gelernt, aber es gibt noch Probleme.

Als Projektmanager bin ich ziemlich unerfahren. Die Kontrolle des Fortschritts, die Personalverteilung und die Beachtung anderer Details weisen viele Mängel auf.

Beispiele:

  • Mein Mangel an Frontend-Kenntnissen führt wahrscheinlich dazu, dass am Ende nur der API-Server funktioniert.
  • Nur die Hälfte der Projektgruppenmitglieder war wirklich involviert.
  • Die Schulung der beteiligten Personen wirkte oberflächlich und ungeduldig.

Offensichtlich brauche ich weitere Übung. Gleichzeitig hat die Doppelrolle als Projektmanager und Entwickler mich zum Nachdenken über ein anderes Problem gebracht.

Diskussion über zwei Fähigkeiten von SEers

Die Fähigkeit, die Architektur und Kontrolle eines gesamten Systems zu übernehmen und die Fähigkeit, Algorithmen für einzelne Funktionen auszuwählen, anzupassen und einzusetzen.

Die Unterrichtsausbildung an unserer Fakultät für Software scheint sich nur auf Letzteres zu konzentrieren. Das ist nicht verwunderlich, da die Beherrschung von Algorithmen leicht messbar ist und Unterschiede in den Fähigkeiten deutlich sichtbar sind – ähnlich wie beim Lösen von Mathematikaufgaben, wo Kreativität unter strengen Voraussetzungen und Einschränkungen leicht bewertet werden kann. Die Fähigkeit, diese “strengen Voraussetzungen und Einschränkungen” angemessen festzulegen, ist jedoch zwar wichtig, aber schwer zu bewerten.

Warum das widersprüchlich ist? Ein einfaches, vielleicht nicht ganz passendes Beispiel: Jeder weiß, dass Eltern aus Angst vor Lernbeeinträchtigung frühe Beziehungen verbieten, aber gleichzeitig erwarten, dass ihr Kind nach dem Abschluss sofort eine Familie gründet – eine naive und unrealistische Vorstellung. Die implizite Erwartung, dass Studenten nach dem Abschluss allein aufgrund guter Noten zu Allround-Talenten werden, ist ebenfalls eine etwas verzerrte Vorstellung. Der Unterschied liegt darin, dass der Widerspruch im letzteren Fall nicht so offensichtlich ist.

Ich denke, dass ein solches Praktikum tatsächlich eine Kompensation für die Mängel der Unterrichtsausbildung darstellt und eine Chance bietet, den Widerspruch zwischen den Symbolen Leistung als Ausbildungsmittel und Fähigkeit als Ausbildungsziel zu vermeiden.

/Alltag/ /Praktikum/ /Reflexion/