Bei djangsters sind wir überzeugt: Jede Anwendung kann besser werden - wartbarer, erweiterbarer, testbarer. Mit unserem strukturierten Bewertungsansatz sorgen wir gemeinsam dafür, dass Ihre Webanwendung stabiler, zuverlässiger, leistungsfähiger und sicherer wird.
Wir sehen Ihr Projekt aus einer anderen Perspektive, mit frischen Augen und ohne die Hintergründe der getroffenen Entscheidungen aus erster Hand zu kennen. Dies ermöglicht es uns, bei unserer Analyse objektiver zu sein.
Vor kurzem haben wir die noxt! engineering GmbH kennengelernt - ein Unternehmen, das sich auf Gutachten für Windparks spezialisiert hat. Um ein Gutachten zu erstellen, müssen sie komplizierte Simulationen durchführen, z.B. um die akustischen Auswirkungen der Windkraftanlagen auf die Umgebung zu prognostizieren und die Ergebnisse zu visualisieren.
Ein firmeninternes Team von Entwicklern arbeitet an einer Django-Anwendung zur Verwaltung der Windparkprojekte des Unternehmens. Dort werden Informationen über die Windparks gespeichert, Simulationen angefordert, ihre Ergebnisse gespeichert und visualisiert - alles an einem Ort.
Auch die besten Entwicklungsteams profitieren von einer neuen Perspektive. noxt! engineering wollte sicherstellen, dass ihre Django-basierte Plattform auf einem soliden architektonischen Fundament steht. Anstatt zu warten, bis Probleme auftauchen, verfolgten sie einen proaktiven Ansatz und holten uns ins Boot, um ihre Architektur, Best Practices und Entwicklungsabläufen effizienter zu gestalten.
Gehen wir im Detail auf einige Themen ein, die wir im Rahmen unseres Beratungsdienstes für das Unternehmen in Angriff genommen haben. Unser Ziel war es, die allgemeine Struktur, Wartbarkeit und Flexibilität des Projekts zu verbessern. Dies bedeutet auch sicherzustellen, dass die Entwicklungsarbeiten weiterhin effizient ablaufen können, auch wenn die Codebasis, das Team und die Komplexität des Systems zunehmen.
Manchmal kommt es bei Anwendungen zu einer engen Kopplung zwischen Logik und Datenbankdaten, was dazu führt, dass ein spezifischer Datenbank-Dump erforderlich ist, um ein neues System (z. B. Entwicklungs- oder Staging-System) zu initialisieren.
Normalerweise werden solche Dumps von der Produktionsdatenbank erstellt. Produktionsdaten, insbesondere benutzer- oder geschäftssensible Daten, müssen mit Vorsicht behandelt werden und dürfen nicht in zahlreichen Dumps und laufenden Systemen weiterleben.
Im Idealfall ist die Anwendung nicht auf bestimmte Daten in der Datenbank angewiesen, um zu funktionieren. Dies wird als Unabhängigkeit von der Produktionsdatenbank bezeichnet.
Um das Problem zu lösen, analysieren wir zunächst die in der Datenbank gespeicherten Daten, um zu verstehen, um welche Art von Daten es sich handelt. Normalerweise gibt es drei Kategorien:
Für Daten, die nach dem Zufallsprinzip generiert werden können, empfehlen wir das Schreiben von Factories, z. B. mit factory_boy. Diese eignen sich sowohl zur Generierung von Daten für die Entwicklung als auch zur Verwendung in automatisierten Tests. Wir haben mehrere Factories geschrieben, um den Prozess in Gang zu bringen.
Für allgemein bekannte Daten, die nicht generiert werden können, finden wir Wege, sie zu importieren, zum Beispiel können Geodaten von Deutschland automatisch aus den Datenquellen wie https://basemap.de/ gezogen werden.
Tests, sowohl im Backend als auch im Frontend, erhöhen das Vertrauen in die Implementierung und reduzieren die Entwicklungszeit bei der Weiterentwicklung oder Umstrukturierung der Anwendung.
Wir untersuchten die Anwendung und wählten zusammen mit dem internen Entwicklungsteam einen der geschäftskritischsten Teile aus. Wir haben unterschiedliche Arten von Tests geschrieben: Unit- und Integrationstests, aber auch Tests für verschiedene Teile der Anwendung: Django Models, Django Views, API Views, Hilfs-Funktionen.
Wir konfigurierten das pytest Framework, erweiterten es mit Plugins wie pytest-mock und pytest-django, schrieben Factories zur Erstellung von Testdaten und erstellten die Testbeispiele. Dadurch wurde eine vollständige Testumgebung für das interne Team geschaffen, das nun selbständig die Testabdeckung weiter erhöhen kann.
Tests können erst dann erfolgreich sein, wenn der Code so geschrieben ist, dass er sich gut testen lässt. Dies wird als Testbarkeit von Code bezeichnet. Es gibt mehrere Indikatoren für testbaren Code, die wir untersucht haben:
Beim Arbeiten mit CI achten wir besonders auf das Abhängigkeitsmanagement, um zu gewährleisten, dass die Paketversionen in allen Umgebungen identisch sind. Im aktuellen Projekt werden die Simulationen mit dem Softwarepaket durchgeführt, das von einem anderen Entwicklungsteam des Kunden entwickelt wird. Wir haben den Build-Prozess verschlankt, indem wir vom direkten Abrufen des Simulationscodes zur Installation als Abhängigkeit in Form eines vorpaketierten Python-wheels wechselten.
Wir haben die Ruff-Linter-Konfiguration optimiert und Django-spezifische Checks hinzugefügt, um z.B. sicherzustellen, dass keine Datenbankmigration versehentlich vergessen wurde.
Außerdem haben wir Continuous Deployment auf das Staging System eingerichtet, welches durch das erfolgreiche Durchlaufen der CI bei Mergen ausgelöst wird..
Christoph Lehmann, CTO noxt! engineering GmbH:
“Djangsters haben unsere Herausforderungen schnell erfasst und die passenden Lösungen gefunden. Die Zusammenarbeit war unkompliziert, ehrlich und direkt. Ihre Vorschläge haben nicht nur akute Probleme gelöst, sondern unsere Plattform stabiler, flexibler und zukunftssicher gemacht.”