Leitfaden für Vorstellungsgespräche: Senior Backend-Entwickler (Python)

Milad Bonakdar
Autor
Meistern Sie die fortgeschrittene Python-Backend-Entwicklung mit wichtigen Fragen für Vorstellungsgespräche, die Systemdesign, Datenbankoptimierung, Parallelverarbeitung und Architektur abdecken. Perfekte Vorbereitung für Vorstellungsgespräche als Senior Backend-Entwickler.
Einführung
Dieser umfassende Leitfaden enthält 30 wichtige Fragen für Vorstellungsgespräche, die fortgeschrittene Python-Backend-Entwicklung abdecken. Diese Fragen sollen erfahrenen Backend-Entwicklern bei der Vorbereitung auf Vorstellungsgespräche helfen, indem sie Schlüsselkonzepte in fortgeschrittenem Python, Systemdesign, Datenbankoptimierung und Sicherheit abdecken. Jede Frage enthält eine detaillierte Antwort, eine Seltenheitsbewertung und eine Schwierigkeitsstufe.
Als erfahrener Entwickler wird von Ihnen erwartet, dass Sie nicht nur das "Wie", sondern auch das "Warum" und die Kompromisse kennen, die mit Ihren technischen Entscheidungen verbunden sind.
Fortgeschrittene Python-Konzepte (8 Fragen)
1. Wie funktioniert die Speicherverwaltung von Python, und welche Rolle spielt der Garbage Collector?
Antwort: Python verwendet einen privaten Heap, um den Speicher zu verwalten, in dem alle Objekte und Datenstrukturen gespeichert werden. Der Programmierer kann nicht direkt auf diesen Heap zugreifen; er wird vom Python-Speichermanager verwaltet.
- Referenzzählung: Der primäre Mechanismus. Jedes Objekt hat einen Referenzzähler. Wenn dieser auf Null sinkt, wird der Speicher freigegeben.
- Garbage Collector (GC): Behandelt zyklische Referenzen, die die Referenzzählung nicht erfassen kann. Er wird regelmäßig ausgeführt, um diese Zyklen zu finden und zu bereinigen.
- Generationen-GC: Der GC von Python teilt Objekte in drei Generationen (0, 1, 2) ein. Neue Objekte beginnen in Generation 0. Wenn sie eine Sammlung überleben, werden sie in die nächste Generation verschoben. Ältere Generationen werden seltener gesammelt, um die Leistung zu verbessern.
Seltenheit: Häufig Schwierigkeit: Schwer
2. Erläutern Sie den Global Interpreter Lock (GIL) und seine Auswirkungen auf die Nebenläufigkeit. Wie umgehen Sie ihn?
Antwort: Der GIL ist ein Mutex, der den Zugriff auf Python-Objekte schützt und verhindert, dass mehrere native Threads gleichzeitig Python-Bytecode ausführen. Dies macht CPython Thread-sicher, beschränkt CPU-lastige Programme jedoch auf einen einzigen Kern.
- Auswirkung: Multi-Threading ist effektiv für I/O-lastige Aufgaben (Warten auf Netzwerk/Festplatte), aber nicht für CPU-lastige Aufgaben (starke Berechnung).
- Umgehung des GIL:
- Multiprocessing: Verwenden Sie das Modul
multiprocessing, um separate Prozesse zu erstellen, jeder mit seinem eigenen Python-Interpreter und Speicherbereich. - C-Erweiterungen: Schreiben Sie leistungskritischen Code in C/C++ und geben Sie den GIL frei, während er ausgeführt wird.
- Alternative Interpreter: Verwenden Sie Jython oder IronPython (die keinen GIL haben), obwohl CPython der Standard ist.
- Multiprocessing: Verwenden Sie das Modul
Seltenheit: Sehr Häufig Schwierigkeit: Schwer
3. Was sind Metaklassen in Python und wann sollten Sie sie verwenden?
Antwort:
Eine Metaklasse ist "die Klasse einer Klasse". So wie eine Klasse das Verhalten einer Instanz definiert, definiert eine Metaklasse das Verhalten einer Klasse. In Python sind Klassen auch Objekte, und sie sind Instanzen von type (der Standard-Metaklasse).
- Verwendung: Sie können die Klassenerstellung abfangen, um die Klasse automatisch zu ändern.
- Anwendungsfälle:
- Automatisches Registrieren von Klassen (z. B. für Plugins).
- Erzwingen von Codierungsstandards (z. B. sicherstellen, dass alle Klassen Docstrings haben).
- Implementierung des Singleton-Musters.
- ORM-Frameworks (wie Django) verwenden sie, um Klassenattribute Datenbankfeldern zuzuordnen.
Beispiel:
Seltenheit: Ungewöhnlich Schwierigkeit: Schwer
4. Erläutern Sie den Unterschied zwischen __new__ und __init__.
Antwort:
__new__: Eine statische Methode, die für das Erstellen einer neuen Instanz einer Klasse verantwortlich ist. Sie ist der erste Schritt bei der Instanzerstellung. Sie gibt die neue Instanz zurück. Sie überschreiben sie selten, es sei denn, Sie erstellen Unterklassen von unveränderlichen Typen (wiestr,int,tuple) oder implementieren ein Singleton.__init__: Eine Instanzmethode, die für das Initialisieren der erstellten Instanz verantwortlich ist. Sie wird nach__new__aufgerufen. Sie gibt nichts zurück.
Seltenheit: Mittel Schwierigkeit: Mittel
5. Wie funktioniert asyncio in Python? Erläutern Sie die Event Loop.
Antwort:
asyncio ist eine Bibliothek zum Schreiben von nebenläufigem Code mit der Syntax async / await. Sie verwendet ein Single-Threaded, kooperatives Multitasking-Modell.
- Event Loop: Der Kern von
asyncio. Sie führt asynchrone Aufgaben und Rückrufe aus, führt Netzwerk-IO-Operationen durch und führt Subprozesse aus. Sie wechselt zwischen Aufgaben, wenn diese auf I/O warten (mitawait), wodurch andere Aufgaben in der Zwischenzeit ausgeführt werden können. - Coroutinen: Funktionen, die mit
async defdefiniert sind. Sie können pausiert und fortgesetzt werden.
Seltenheit: Häufig Schwierigkeit: Schwer
6. Was sind Python-Dekoratoren und wie können Sie einen Dekorator erstellen, der Argumente akzeptiert?
Antwort: Dekoratoren sind Funktionen, die das Verhalten anderer Funktionen oder Klassen ändern. Um Argumente zu akzeptieren, benötigen Sie eine dreistufige, verschachtelte Funktionsstruktur.
Beispiel:
Seltenheit: Mittel Schwierigkeit: Mittel
7. Erläutern Sie das Konzept der Context Managers und der with-Anweisung.
Antwort:
Context Manager ermöglichen es Ihnen, Ressourcen genau dann zuzuweisen und freizugeben, wenn Sie es möchten. Die häufigste Verwendung ist die with-Anweisung.
- Mechanismus: Sie implementieren die Methoden
__enter__und__exit__.__enter__: Richtet den Kontext ein und gibt die Ressource zurück.__exit__: Bereinigt die Ressource (schließt die Datei, gibt die Sperre frei), auch wenn eine Ausnahme auftritt.
contextlib: Der Dekorator@contextmanagerermöglicht es Ihnen, Context Manager mit Generatoren zu erstellen.
Seltenheit: Häufig Schwierigkeit: Einfach
8. Was ist der Unterschied zwischen @staticmethod und @classmethod?
Antwort:
@staticmethod: Empfängt kein implizites erstes Argument (wederselfnochcls). Sie verhält sich wie eine reguläre Funktion, gehört aber zum Namensraum der Klasse. Wird für Hilfsfunktionen verwendet, die keinen Zugriff auf den Klassen- oder Instanzstatus benötigen.@classmethod: Empfängt die Klasse (cls) als erstes implizites Argument. Sie kann auf den Klassenstatus zugreifen und ihn ändern. Wird häufig für Factory-Methoden verwendet, die Instanzen der Klasse auf unterschiedliche Weise erstellen.
Seltenheit: Häufig Schwierigkeit: Einfach
Systemdesign & Architektur (8 Fragen)
9. Wie würden Sie einen URL-Shortener (wie bit.ly) entwerfen?
Antwort: Dies ist eine klassische Frage zum Systemdesign.
- Anforderungen: Lange URLs kürzen, kurze URLs auf das Original umleiten, hohe Verfügbarkeit, geringe Latenz.
- Datenbank: Key-Value-Store (NoSQL) wie DynamoDB oder Redis eignet sich für schnelle Suchvorgänge. Eine relationale Datenbank ist auch in Ordnung, erfordert aber möglicherweise eine Skalierung.
- Algorithmus:
- Base62-Codierung: Konvertieren Sie eine eindeutige ID (automatisch inkrementierende Ganzzahl) in Base62 (a-z, A-Z, 0-9).
- Hashing: MD5/SHA256 der URL, nehmen Sie die ersten 7 Zeichen (Kollisionsrisiko).
- Skalierung:
- Caching: Redis/Memcached, um beliebte Weiterleitungen zu cachen (80/20-Regel).
- Load Balancing: Verteilen Sie den Datenverkehr auf mehrere Webserver.
- Database Sharding: Partitionieren Sie Daten basierend auf dem Präfix der kurzen URL.
Seltenheit: Sehr Häufig Schwierigkeit: Schwer
10. Erläutern Sie das CAP-Theorem.
Antwort: In einem verteilten Datenspeicher können Sie nur zwei der folgenden drei Eigenschaften garantieren: Konsistenz, Verfügbarkeit und Partitionstoleranz:
- Konsistenz (C): Jede Leseoperation empfängt die aktuellste Schreiboperation oder einen Fehler.
- Verfügbarkeit (A): Jede Anfrage empfängt eine (nicht fehlerhafte) Antwort, ohne die Garantie, dass sie die aktuellste Schreiboperation enthält.
- Partitionstoleranz (P): Das System arbeitet weiterhin, obwohl eine beliebige Anzahl von Nachrichten vom Netzwerk zwischen den Knoten fallen gelassen (oder verzögert) wird.
- Realität: In einem verteilten System ist P obligatorisch. Sie müssen zwischen CP (Konsistenz über Verfügbarkeit) und AP (Verfügbarkeit über Konsistenz) wählen.
Seltenheit: Häufig Schwierigkeit: Mittel
11. Microservices vs. Monolithische Architektur: Wann wählt man welche?
Antwort:
- Monolith: Einzelne Codebasis, einzelne Bereitstellungseinheit.
- Vorteile: Einfach zu entwickeln/testen/bereitzustellen, einfacheres Debuggen, keine Netzwerklatenz zwischen Komponenten.
- Nachteile: Schwer, bestimmte Teile zu skalieren, enge Kopplung, Technologie-Lock-in, lange Build-Zeiten.
- Anwendungsfall: Start-ups in der Frühphase, einfache Anwendungen, kleine Teams.
- Microservices: Sammlung kleiner, unabhängiger Dienste, die über APIs kommunizieren.
- Vorteile: Unabhängige Skalierung, technologieagnostisch pro Dienst, Fehlertrennung, einfachere parallele Arbeit für große Teams.
- Nachteile: Komplexe Operationen (Bereitstellung, Überwachung), Netzwerklatenz, Herausforderungen bei der Datenkonsistenz (verteilte Transaktionen).
- Anwendungsfall: Große, komplexe Systeme, schnell skalierende Teams, Bedarf an unabhängiger Skalierung.
Seltenheit: Häufig Schwierigkeit: Mittel
12. Was ist Load Balancing und welche verschiedenen Algorithmen gibt es?
Antwort: Load Balancing verteilt den eingehenden Netzwerkverkehr auf mehrere Server, um sicherzustellen, dass kein einzelner Server zu stark belastet wird.
- Algorithmen:
- Round Robin: Verteilt Anfragen sequenziell.
- Least Connections: Sendet Anfragen an den Server mit den wenigsten aktiven Verbindungen.
- IP Hash: Verwendet die IP-Adresse des Clients, um zu bestimmen, welcher Server die Anfrage empfängt (nützlich für die Sitzungspersistenz).
- Typen:
- L4 (Transport Layer): Basierend auf IP und Port (schneller).
- L7 (Application Layer): Basierend auf Inhalt (URL, Cookies, Header) (intelligenter).
Seltenheit: Häufig Schwierigkeit: Mittel
13. Wie handhaben Sie Caching in einem Backend-System?
Antwort: Caching speichert Kopien von Daten an einem temporären Speicherort für schnelleren Zugriff.
- Schichten:
- Client-seitig: Browser-Caching.
- CDN: Cacht statische Assets näher am Benutzer.
- Load Balancer/Reverse Proxy: Varnish, Nginx.
- Anwendung: In-Memory (lokal) oder verteilt (Redis/Memcached).
- Datenbank: Query-Cache.
- Strategien:
- Cache-Aside (Lazy Loading): App überprüft den Cache; wenn ein Fehler auftritt, liest sie die Datenbank und aktualisiert den Cache.
- Write-Through: App schreibt synchron in den Cache und in die Datenbank.
- Write-Back: App schreibt in den Cache; der Cache schreibt asynchron in die Datenbank (Risiko von Datenverlust).
- Eviction: LRU (Least Recently Used), LFU (Least Frequently Used), TTL (Time To Live).
Seltenheit: Häufig Schwierigkeit: Schwer
14. Was ist Database Sharding?
Antwort: Sharding ist eine Methode zum Aufteilen und Speichern eines einzelnen logischen Datensatzes in mehreren Datenbanken. Es ist eine Form der horizontalen Skalierung.
- Horizontal vs. Vertikal: Vertikal = größere Maschine; Horizontal = mehr Maschinen.
- Sharding-Schlüssel: Die Logik, die zum Verteilen von Daten verwendet wird (z. B. UserID % NumberOfShards).
- Herausforderungen:
- Joins: Cross-Shard-Joins sind teuer oder unmöglich.
- Transaktionen: Verteilte Transaktionen sind komplex (Two-Phase Commit).
- Rebalancing: Das Verschieben von Daten beim Hinzufügen neuer Shards ist schwierig.
Seltenheit: Mittel Schwierigkeit: Schwer
15. Erläutern Sie das Konzept der Idempotenz in REST-APIs.
Antwort: Eine idempotente Operation ist eine Operation, die mehrmals angewendet werden kann, ohne das Ergebnis über die anfängliche Anwendung hinaus zu ändern.
- Sichere Methoden: GET, HEAD, OPTIONS (ändern keinen Zustand).
- Idempotente Methoden: PUT, DELETE. Das 10-malige Aufrufen von DELETE für eine Ressource hat den gleichen Effekt wie das einmalige Aufrufen (die Ressource ist weg).
- Nicht idempotent: POST. Das 10-malige Aufrufen von POST kann 10 Ressourcen erstellen.
- Implementierung: Verwenden Sie einen Idempotenzschlüssel (eindeutige ID) im Anfrageheader. Der Server prüft, ob er diese ID bereits verarbeitet hat.
Seltenheit: Mittel Schwierigkeit: Mittel
16. Was ist ein Reverse Proxy und warum sollte man ihn verwenden?
Antwort: Ein Reverse Proxy sitzt vor einem oder mehreren Webservern und leitet Clientanfragen an diese weiter.
- Vorteile:
- Load Balancing: Verteilen des Datenverkehrs.
- Sicherheit: Verbirgt die Identität/IP von Backend-Servern; kann SSL-Terminierung verarbeiten.
- Caching: Cachen statischer Inhalte.
- Komprimierung: Komprimieren von Antworten (gzip), um Bandbreite zu sparen.
- Beispiele: Nginx, HAProxy.
Seltenheit: Häufig Schwierigkeit: Einfach
Datenbank & Optimierung (7 Fragen)
17. Erläutern Sie die ACID- vs. BASE-Konsistenzmodelle.
Antwort:
- ACID (Relational): Atomicity, Consistency, Isolation, Durability. Konzentriert sich auf starke Konsistenz. Transaktionen sind alles oder nichts.
- BASE (NoSQL):
- Basically Available: Das System garantiert Verfügbarkeit.
- Soft state: Der Zustand des Systems kann sich im Laufe der Zeit ändern, auch ohne Eingabe.
- Eventual consistency: Das System wird schließlich konsistent, sobald es keine Eingaben mehr empfängt.
- Kompromiss: ACID bietet Sicherheit und Konsistenz; BASE bietet Verfügbarkeit und Skalierbarkeit.
Seltenheit: Mittel Schwierigkeit: Mittel
18. Wie optimieren Sie eine langsame SQL-Abfrage?
Antwort:
- Analysieren: Verwenden Sie
EXPLAINoderEXPLAIN ANALYZE, um den Ausführungsplan der Abfrage zu verstehen. - Indizierung: Stellen Sie sicher, dass Spalten, die in
WHERE-,JOIN- undORDER BY-Klauseln verwendet werden, indiziert sind. Vermeiden Sie Überindizierung (verlangsamt Schreibvorgänge). - Wählen Sie nur das aus, was Sie benötigen: Vermeiden Sie
SELECT *. - Vermeiden Sie das N+1-Problem: Verwenden Sie
JOINs oder Eager Loading (in ORMs), anstatt für jede Zeile in einer Schleife eine Abfrage auszuführen. - Denormalisierung: Wenn Joins zu teuer sind, sollten Sie das Duplizieren von Daten in Betracht ziehen (Kompromiss: Datenkonsistenz).
- Partitionierung: Teilen Sie große Tabellen in kleinere Teile auf.
Seltenheit: Sehr Häufig Schwierigkeit: Mittel
19. Welche verschiedenen Arten von Datenbankindizes gibt es?
Antwort:
- B-Baum: Der Standard und der häufigste. Gut für Bereichsabfragen und Gleichheitsprüfungen.
- Hash-Index: Gut nur für Gleichheitsprüfungen (key = value). Sehr schnell, unterstützt aber keine Bereichsabfragen.
- GiST / GIN: Wird für komplexe Datentypen wie Volltextsuche, geometrische Daten oder JSONB (in PostgreSQL) verwendet.
- Clustered vs. Non-Clustered:
- Clustered: Die Datenzeilen werden physisch in der Reihenfolge des Index gespeichert. Nur einer pro Tabelle (normalerweise PK).
- Non-Clustered: Eine separate Struktur, die auf die Datenzeilen verweist.
Seltenheit: Mittel Schwierigkeit: Schwer
20. Erläutern Sie das N+1-Abfrageproblem und wie man es behebt.
Antwort: Das N+1-Problem tritt auf, wenn Ihr Code N zusätzliche Abfrageanweisungen ausführt, um dieselben Daten abzurufen, die beim Ausführen der primären Abfrage hätten abgerufen werden können.
- Szenario: Sie rufen eine Liste von 10 Autoren ab (1 Abfrage). Dann rufen Sie für jeden Autor seine Bücher ab (10 Abfragen). Summe = 11 Abfragen.
- Behebung:
- SQL: Verwenden Sie einen
JOIN, um Autoren und Bücher in einer einzigen Abfrage abzurufen. - ORM (Django): Verwenden Sie
select_related(für Fremdschlüssel/One-to-One) oderprefetch_related(für Many-to-Many/Reverse-Fremdschlüssel).
- SQL: Verwenden Sie einen
Seltenheit: Sehr Häufig Schwierigkeit: Mittel
21. Redis vs. Memcached: Welchen sollte man wählen?
Antwort:
- Memcached: Einfach, flüchtig, Multithreaded. Gut für einfaches Key-Value-Caching (HTML-Fragmente, Sitzungsdaten).
- Redis: Erweiterter Key-Value-Store.
- Datenstrukturen: Unterstützt Listen, Mengen, sortierte Mengen, Hashes, Bitmaps, Hyperloglogs.
- Persistenz: Kann Daten auf der Festplatte speichern (RDB, AOF).
- Replikation: Eingebaute Master-Slave-Replikation.
- Pub/Sub: Unterstützt Message Brokering.
- Wahl: Verwenden Sie Redis, wenn Sie komplexe Datenstrukturen, Persistenz oder Sortierung benötigen. Verwenden Sie Memcached für einfaches, hochdurchsatzstarkes Caching, wenn Sie Multithreading benötigen.
Seltenheit: Mittel Schwierigkeit: Mittel
22. Was ist Datenbanknormalisierung?
Antwort: Normalisierung ist der Prozess des Organisierens von Daten in einer Datenbank, um Redundanz zu reduzieren und die Datenintegrität zu verbessern.
- 1NF: Atomare Werte (keine Listen in Zellen), eindeutige Zeilen.
- 2NF: 1NF + keine partielle Abhängigkeit (alle Nicht-Schlüsselattribute hängen vom gesamten Primärschlüssel ab).
- 3NF: 2NF + keine transitive Abhängigkeit (Nicht-Schlüsselattribute hängen nur vom Primärschlüssel ab).
- Kompromiss: Höhere Normalisierung bedeutet mehr Tabellen und mehr Joins (langsamere Lesevorgänge). Denormalisierung wird häufig für leselastige Systeme verwendet.
Seltenheit: Häufig Schwierigkeit: Einfach
23. Wie behandelt PostgreSQL Nebenläufigkeit (MVCC)?
Antwort: PostgreSQL verwendet Multi-Version Concurrency Control (MVCC).
- Mechanismus: Wenn eine Zeile aktualisiert wird, überschreibt Postgres die alten Daten nicht. Stattdessen wird eine neue Version der Zeile erstellt.
- Leser: Leser sehen einen konsistenten Snapshot der Datenbank, wie er zum Zeitpunkt des Starts ihrer Transaktion war. Sie blockieren keine Schreiber.
- Schreiber: Schreiber erstellen neue Versionen. Sie blockieren andere Schreiber in derselben Zeile, blockieren aber keine Leser.
- Vacuuming: Alte Versionen (tote Tupel), die für keine Transaktion mehr sichtbar sind, müssen vom
VACUUM-Prozess bereinigt werden, um Speicherplatz freizugeben.
Seltenheit: Ungewöhnlich Schwierigkeit: Schwer
Sicherheit & DevOps (7 Fragen)
24. Erläutern Sie OAuth 2.0 und seinen Ablauf.
Antwort: OAuth 2.0 ist ein Autorisierungsframework, das Anwendungen ermöglicht, eingeschränkten Zugriff auf Benutzerkonten in einem HTTP-Dienst (wie Google, Facebook) zu erhalten, ohne das Kennwort des Benutzers preiszugeben.
- Rollen: Resource Owner (Benutzer), Client (App), Authorization Server, Resource Server (API).
- Ablauf (Authorization Code Grant):
- Benutzer klickt auf "Mit Google anmelden".
- Benutzer wird zum Google-Auth-Server umgeleitet.
- Benutzer genehmigt den Zugriff.
- Google leitet mit einem "Authorization Code" zurück zur App.
- App tauscht den Code gegen ein "Access Token" (Back-Channel).
- App verwendet das Access Token, um auf die API zuzugreifen.
Seltenheit: Häufig Schwierigkeit: Schwer
25. Was ist JWT (JSON Web Token) und wie unterscheidet es sich von Session Auth?
Antwort:
- Session Auth: Der Server erstellt eine Sitzung, speichert sie in DB/Cache und sendet eine Sitzungs-ID (Cookie) an den Client. Stateful.
- JWT: Stateless. Der Server generiert ein Token, das die Identität des Benutzers enthält, und signiert es mit einem geheimen Schlüssel. Der Client speichert das Token und sendet es mit jeder Anfrage. Der Server überprüft die Signatur. Kein DB-Lookup erforderlich.
- Vorteile von JWT: Skalierbar (stateless), gut für Microservices, mobilfreundlich.
- Nachteile von JWT: Schwer zu widerrufen (Blacklisting/kurze Ablaufzeit erforderlich), Token-Größe ist größer.
Seltenheit: Sehr Häufig Schwierigkeit: Mittel
26. Was sind die OWASP Top 10 Sicherheitsrisiken? Nennen Sie ein paar.
Antwort: Ein Standard-Awareness-Dokument für Entwickler und Webanwendungssicherheit.
- Injection: SQL, NoSQL, OS Injection.
- Broken Authentication: Schwache Kennwörter, Session Hijacking.
- Sensitive Data Exposure: Daten werden nicht während der Übertragung/im Ruhezustand verschlüsselt.
- XML External Entities (XXE): Angriffe gegen XML-Parser.
- Broken Access Control: Benutzer agieren außerhalb ihrer beabsichtigten Berechtigungen.
- Security Misconfiguration: Standardkonten, ausführliche Fehlermeldungen.
- Cross-Site Scripting (XSS): Einschleusen von schädlichen Skripten.
Seltenheit: Häufig Schwierigkeit: Mittel
27. Was ist CI/CD?
Antwort:
- Continuous Integration (CI): Entwickler führen Codeänderungen häufig in ein zentrales Repository zusammen. Automatisierte Builds und Tests werden ausgeführt, um die Änderungen zu überprüfen. Ziel: Fehler schnell erkennen.
- Continuous Deployment (CD): Automatisches Bereitstellen von Code in der Produktion nach dem Bestehen von CI.
- Continuous Delivery: Automatisches Vorbereiten des Codes für die Freigabe, aber eine manuelle Genehmigung kann für den endgültigen Push erforderlich sein.
Seltenheit: Häufig Schwierigkeit: Einfach
28. Erläutern Sie Docker vs. Virtual Machines.
Antwort:
- Virtual Machines (VM): Virtualisieren die Hardware. Jede VM hat ein vollständiges Betriebssystem (Gastbetriebssystem), einen Kernel und Apps. Schwergewichtig, langsamer Start.
- Docker (Container): Virtualisieren das Betriebssystem. Container teilen sich den Kernel des Hostbetriebssystems, haben aber isolierte Benutzerbereiche (bins/libs). Leichtgewichtig, schneller Start, portabel.
Seltenheit: Häufig Schwierigkeit: Einfach
29. Was ist Kubernetes?
Antwort: Kubernetes (K8s) ist eine Open-Source-Container-Orchestrierungsplattform. Sie automatisiert die Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen.
- Funktionen:
- Service Discovery & Load Balancing: Stellt Container bereit.
- Self-healing: Startet fehlgeschlagene Container neu.
- Automated Rollouts/Rollbacks: Aktualisiert Apps ohne Ausfallzeiten.
- Secret & Configuration Management: Verwaltet sensible Daten.
Seltenheit: Mittel Schwierigkeit: Mittel
30. Wie sichern Sie eine Python-Webanwendung?
Antwort:
- Input Validation: Bereinigen Sie alle Eingaben (Formulare, API-Bodies, Abfrageparameter).
- SQL Injection: Verwenden Sie ORMs oder parametrisierte Abfragen. Niemals String-Verkettung.
- XSS: Escapen Sie Benutzerausgaben in Vorlagen (Jinja2 tut dies standardmäßig).
- CSRF: Verwenden Sie CSRF-Token für zustandsändernde Anfragen.
- Dependencies: Halten Sie Bibliotheken auf dem neuesten Stand (verwenden Sie
pip-auditoder Snyk). - HTTPS: Erzwingen Sie SSL/TLS.
- Headers: Setzen Sie Sicherheitsheader (HSTS, X-Frame-Options, CSP).
- Secrets: Committen Sie niemals Secrets in Git. Verwenden Sie Umgebungsvariablen.
Seltenheit: Häufig Schwierigkeit: Mittel



