Externe Beratung für Ihr Webprojekt - Was Sie davon haben!

3 März 2025

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.

Wie wir ein Projekt angehen

  1. Verstehen des Geschäftskonzepts - Wir befassen uns mit dem Zweck, der Architektur und den Schlüsselkomponenten Ihrer Anwendung: Backend, Frontend, Datenbank und externe Dienste.
  2. Optimierung des Frontend-Backend-Zusammenspiels - Wir analysieren die Aufgabenverteilung und finden den besten Weg, beide Schichten effizient zusammenarbeiten zu lassen.
  3. Überprüfung der Datenbankstruktur - Wir beurteilen die Datenbankstruktur mit Schwerpunkt auf Constraints, Indizes und Performance-Engpässen.
  4. Überprüfung der API-Sicherheit - Wir untersuchen die Sicherheitsaspekte der APIs, insbesondere im Hinblick auf die Authentifizierung, aber auch auf Bedrohungen wie CSRF oder SQL-Injection sowie auf Funktionen wie SSL/HTTPS und Session-Sicherheit.
  5. Testabdeckungs-Strategie - Gemeinsam mit dem Kunden definieren wir die Kernfunktionalität, die mit Tests abgedeckt werden muss.
  6. CI/CD-Pipeline-Einrichtung - Egal, ob wir eine neue CI/CD-Pipeline einrichten oder eine bestehende verbessern, wir sorgen für einen reibungslosen Betriebsablauf, unabhängig vom CI- oder Hosting-Anbieter.

Wenn ein Unternehmen bereits ein internes Entwicklerteam hat, warum würde es dennoch von einer Zusammenarbeit mit uns profitieren?

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.

Fallstudie: Die Django-Plattform von noxt! engineering

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.

Unabhängigkeit von der Produktionsdatenbank

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:

  • Daten, die nach dem Zufallsprinzip generiert werden können, z. B. Benutzer mit beliebigem Namen, E-Mail und Geburtsdatum.
  • Allgemein bekannte Daten, die nicht zufällig generiert werden sollen, z. B. geografische Daten. Deutschland hat 16 Bundesländer, die sehr präzise festgelegt sind, mit streng definierten geografischen Grenzen. Ein beliebiges Polygon mit einem generischen Namen ist nicht geeignet.
  • Abgeleitete Daten oder Caches. Solche Daten müssen nicht vorhanden sein, wenn das System initialisiert wird, sondern werden erst zur Laufzeit berechnet und gespeichert.

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

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.

Testbarkeit von Code

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:

  • Umstrukturierung von Funktionen, die zu viele Dinge tun, zum Beispiel durch Hinzufügen von Abstraktionen mit kleinen, klar definierten Verhaltensmustern und Verantwortlichkeiten. In einer Django-Anwendung neigen Views dazu, zu übermächtigen Funktionen zu werden, die die gesamte Verarbeitung übernehmen.
  • Einhaltung des DRY-Prinzips, um Wiederholungen der Logik zu minimieren und sie somit nur an einer Stelle testen zu müssen.
  • Überprüfung, ob wir nicht deterministische Funktionen deterministisch gestalten können. Dies stellt sicher, dass sie nur eine Ausgabe für die bestimmte Eingabe zurückgeben können. In einer Django-Anwendung könnte eine Funktion, die ein unsortiertes Queryset zurückgibt, ein geeigneter Kandidat sein.

CI/CD-Pipeline

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..

Was meint der Kunde?

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.”

djangsters GmbH

Vogelsanger Straße 187
50825 Köln

Sortlist