Implementatie van blauw-groen versus kanarie: Verschillen, afwegingen en hoe te kiezen
Met beide strategieën kunt u vrijgeven zonder de site offline te halen, maar ze beheren de risico’s op tegenovergestelde manieren. Ontdek hoe ze allemaal werken, wat het werkelijk kost, hoe je met de database omgaat en wat bij jouw team past.
- Blauwgroen behoudt twee volledige omgevingen en schakelt al het verkeer in één keer om.
- Canary stuurt de nieuwe versie eerst naar een klein deel van de gebruikers en breidt deze vervolgens geleidelijk uit.
- Blauwgroen biedt een zeer snelle terugdraaiing. Canary beperkt het aantal gebruikers dat een slechte release kan beïnvloeden.
- Beide zijn afhankelijk van achterwaarts compatibele databasewijzigingen en goede monitoring.
Het uitbrengen van software betekende vroeger een onderhoudsvenster en gekruiste vingers. Moderne teams gebruiken strategieën die releases routine maken, en de keuze blauw-groen versus kanarie is een van de eerste waarmee u te maken krijgt. Beide verminderen het risico, maar ze doen dit op tegenovergestelde manieren: de één bereidt een volledige vervanging voor, terwijl de ander beetje bij beetje met echte gebruikers test.
In deze handleiding wordt uitgelegd hoe elk ervan werkt en wat het in de praktijk kost. We hebben de kleine voorbeelden van gebruikersrouting en rollback uitgevoerd in Python 3.13, en de uitvoer komt uit die run. De Kubernetes-voorbeelden zijn illustratief, maar die hebben we niet uitgevoerd. Beschouw de percentages en drempels als startvoorbeelden om aan te passen.
Het korte antwoord
Met blauw-groene implementatie beheert u twee identieke productieomgevingen. De ene bedient gebruikers terwijl u de nieuwe versie implementeert en test, aan de andere kant, en vervolgens schakelt u al het verkeer in één beweging over.
Bij canary-implementatie wordt de nieuwe versie naast de oude uitgevoerd. Je stuurt het een klein percentage van het echte verkeer, vergelijkt de resultaten en vergroot het aandeel stap voor stap totdat het iedereen bedient. De naam komt van de kanaries die mijnwerkers ooit gebruikten als een vroege waarschuwing voor gevaar.
Blauwgroen versus kanarie naast elkaar
| Aspect | Blauwgroen | Kanarie |
|---|---|---|
| Verkeersverschuiving | Allemaal tegelijk | Geleidelijk |
| Gebruikers blootgesteld aan een slechte release | Allemaal, totdat je terugschakelt | Alleen het kanarie-aandeel |
| Terugdraaien | Schakel het verkeer terug | Stel het kanarie-aandeel in op nul |
| Laat snelheid los | Snelle overstap | Langzamer, in fasen |
| Infrastructuurkosten | Tot het dubbele tijdens de release | Een klein extra aandeel |
| Verkeersroutering nodig | Een simpele schakelaar | Op percentages gebaseerde routering |
| Toezicht nodig | Goed | Uitstekend, met statistieken per versie |
| Versies leven samen | In het kort, of helemaal niet | Voor de gehele uitrol |
| Feedback van echte gebruikers vóór de volledige release | Nee | Ja |
Hoe blauw-groene implementatie werkt
- Blue is live en bedient al het verkeer.
- Implementeer de nieuwe versie naar groen, die geen gebruikersverkeer ontvangt.
- Test groen grondig, in de echte productieomgeving, met behulp van rooktesten en interne gebruikers.
- Schakel de router, load balancer of DNS om verkeer naar groen te sturen.
- Let goed op, terwijl blauw nog steeds loopt en klaar is.
- Als er iets mis is, schakel dan terug. Als alles goed is, wordt blauw de volgende inactieve omgeving.
In Kubernetes kunt u de overstap maken door de selector van een service te wijzigen, zodat het verkeer naar verschillend gelabelde pods gaat:
apiVersion: v1
kind: Service
metadata:
name: shop
spec:
selector:
app: shop
version: green # was: blue
ports:
- port: 80
targetPort: 8000
Sterke punten: Het is conceptueel eenvoudig: u kunt de exacte productie-instellingen testen voordat gebruikers deze zien, en het terugdraaien is vrijwel onmiddellijk mogelijk. Zwakke punten: Dubbele infrastructuur kan duur zijn, een bug die langs je tests glipt, bereikt iedereen tegelijk, en open sessies en werk tijdens de vlucht hebben tijdens de overstap zorg nodig. Als u DNS voor de overstap gebruikt, kunnen in de cache opgeslagen records dit vertragen. Nieuw bij de concepten? Bekijk onze Kubernetes-tutorial voor beginners.
Hoe kanarie-inzet werkt
- Implementeer de nieuwe versie naast de stabiele versie.
- Leid een klein deel van het verkeer, bijvoorbeeld 5%, naar de kanarie.
- Vergelijk foutpercentages, latentie en zakelijke statistieken met de stabiele versie.
- Als u gezond bent, verhoog dan naar 25%, dan 50% en dan 100%.
- Als er iets verslechtert, stuur dan al het verkeer terug naar de stabiele versie.
Veel teams beginnen met een kanarie met intern personeel, dan met een laagrisicoregio, en dan pas met het bredere publiek.
Sterke punten: Een slechte release treft slechts een kleine groep, en je leert van echt verkeer dat geen enkele testomgeving deze volledig kan reproduceren. Zwakke punten: Je hebt op percentages gebaseerde routing en statistieken per versie nodig, implementaties duren langer en twee versies werken een tijdje samen. Een kleine kanarie kan ook te stil zijn om een betekenisvol signaal te geven, vooral op tijden met weinig verkeer.
Stabiele gebruikersroutering
Het willekeurig kiezen van een versie bij elk verzoek geeft gebruikers een verwarrende ervaring, omdat ze tussen oud en nieuw kunnen stuiteren. Een veel voorkomende oplossing is om een stabiel gebruikers-ID in een bucket te hashen, zodat elke gebruiker altijd hetzelfde antwoord krijgt:
import hashlib
def bucket(user_id):
digest = hashlib.sha256(user_id.encode()).hexdigest()
return int(digest, 16) % 100
def version_for(user_id, canary_percent):
return "v2" if bucket(user_id) < canary_percent else "v1"
users = [f"user-{i}" for i in range(10000)]
for percent in (5, 25, 50, 100):
share = sum(version_for(u, percent) == "v2" for u in users) / len(users)
print(percent, round(share * 100, 1))
# 5 5.0
# 25 24.5
# 50 49.9
# 100 100.0
Het daadwerkelijke aandeel volgde nauwgezet de doelstelling. Deze methode heeft nog twee nuttige eigenschappen, en onze run bevestigde beide. Dezelfde gebruiker ontving altijd dezelfde versie. En iedereen in de 5%-groep zat nog steeds op 25%, dus niemand die de nieuwe versie al had, werd teruggezet naarmate de uitrol groeide.
In echte systemen zorgt een service mesh, load balancer of een tool zoals Argo Rollouts of Flagger meestal voor deze routing, dus je hoeft het niet zelf te schrijven. Het is nog steeds nuttig om te begrijpen wat ze doen.
Automatisering van de beslissing
Een kanarie werkt alleen als iemand de versies daadwerkelijk vergelijkt. Geautomatiseerde controles zijn betrouwbaarder dan iemand die naar grafieken kijkt. Hier is het kernidee, waarbij het foutenpercentage van de kanarie wordt vergeleken met dat van de stabiele versie:
def should_rollback(canary_errors, canary_total, base_errors, base_total,
tolerance=1.5, min_requests=500):
if canary_total < min_requests:
return False # not enough data to decide
return (canary_errors / canary_total) > (base_errors / base_total) * tolerance
should_rollback(3, 100, 10, 5000) # False: too few requests
should_rollback(30, 1000, 100, 10000) # True: 3% against 1%
should_rollback(12, 1000, 100, 10000) # False: 1.2% is within tolerance
Let op het eerste geval. Het foutenpercentage lijkt hoog, maar met slechts 100 verzoeken is dit nog niet voldoende bewijs. Echte tools passen zorgvuldiger statistieken toe en kijken samen naar verschillende signalen:
| Signaal | Voorbeeld |
|---|---|
| Fouten | Percentage van 5xx reacties |
| Latentie | p95 en p99, zoals uitgelegd in belastingtesten versus stresstesten |
| Verzadiging | CPU, geheugen, verbindingspools |
| Zakelijk | Aanmeldingen, afrekenen, betalingssucces |
Tip: Vergelijk de kanarie met de stabiele versie over hetzelfde tijdsbestek, in plaats van met de cijfers van vorige week. Verkeer en gedrag veranderen elk uur, dus een vergelijking naast elkaar geeft u een veel eerlijker signaal.
Het databaseprobleem
Applicatiecode kan binnen enkele seconden worden verwisseld, maar gegevens niet. Beide strategieën delen doorgaans één database, dus tijdens een implementatie en na een rollback moeten de oude en nieuwe versie beide met hetzelfde schema werken.
Het standaardantwoord is het patroon uitbreiden en inkrimpen. Stel dat u name wilt hernoemen naar full_name:
- Uitbreiden: voeg de nieuwe kolom toe. De oude code blijft onaangetast.
- Migreren: code vrijgeven die naar beide kolommen schrijft en oude rijen aanvult.
- Schakelaar: geeft code vrij die uit de nieuwe kolom leest.
- Contract: zodra niets de oude kolom gebruikt, verwijdert u deze in een latere release.
Hiervoor zijn meerdere releases nodig, maar elke stap kan veilig worden teruggedraaid. Het in één keer uitvoeren van RENAME COLUMN zou elke versie kapot maken die de andere naam verwachtte. Wees ook voorzichtig met langlopende schemawijzigingen, omdat deze blokkeringen kunnen veroorzaken. Lees voor meer informatie over SQL-transacties.
Rollen en andere strategieën
| Strategie | Hoe het werkt | Goed voor |
|---|---|---|
| Herscheppen | Stop met het oude en begin dan opnieuw, met downtime | Interne tools, batchsystemen |
| Rollend | Vervang exemplaren een paar tegelijk | Een veel voorkomende standaard, ook in Kubernetes |
| Blauwgroen | Schakel tussen twee omgevingen | Snelle omschakeling en terugdraaiing |
| Kanarie | Breid een klein aandeel geleidelijk uit | Veel verkeer, hoog risico |
| Schaduw | Kopieer verkeer naar de nieuwe versie en verwijder de reacties ervan | Testen met echte belasting, zonder impact voor de gebruiker |
Een Kubernetes-implementatie voert standaard een rolling update uit, wat bij veel services past. Een voortschrijdende update verschuift ook geleidelijk, maar het aandeel ervan is afhankelijk van het aantal exemplaren en analyseert niet zelf de resultaten of pauzeert niet bij slechte statistieken.
Hoe zit het met feature flags?
Bij de implementatie wordt code op servers geplaatst en release maakt een functie beschikbaar voor gebruikers. Functievlaggen houden deze gescheiden, doordat u een functie kunt inschakelen voor gekozen gebruikers zonder iets te implementeren. Ze werken heel goed met beide strategieën: inzetten met de vlag uit en vervolgens geleidelijk inschakelen. Ze vervangen deze strategieën niet, omdat een vlag je niet kan beschermen tegen een release die crasht bij het opstarten. Vergeet niet om oude vlaggen te verwijderen, aangezien deze zich ophopen als technische schulden.
Hoe te kiezen
| Jouw situatie | Redelijke keuze |
|---|---|
| Eenvoudige app en weinig gebruikers | Rollende update |
| Zeer snelle cutover en rollback nodig | Blauwgroen |
| Wilt u testen in productie vóór de overstap | Blauwgroen |
| Veel verkeer en hoge faalkosten | Kanarie |
| Sterke monitoring en statistieken per versie | Kanarie |
| Weinig verkeer | Blauw-groen, omdat de signalen van de kanaries te zwak zijn |
| Strak infrastructuurbudget | Kanarie of rollend |
Ze kunnen ook gecombineerd worden. Sommige teams zetten een groene omgeving in en verplaatsen het verkeer er vervolgens geleidelijk naartoe, waardoor ze een schone omgeving en een beperkte explosieradius krijgen. Wat je ook kiest, automatiseer het via je CI/CD-pijplijn, zoals onze GitHub Actions-gids uitlegt.
Veel voorkomende fouten
- Schakelwijzigingen doorvoeren. Terugdraaien helpt niet als de oude code de gegevens niet kan lezen.
- Er zijn geen terugdraaicriteria. Bepaal wat ‘slecht’ betekent voordat de release begint, en niet tijdens een incident.
- De omgevingen laten veranderen. Als groen verschilt van blauw, bewijzen je tests minder. Definieer beide met infrastructuur als code.
- Alleen technische statistieken worden gemeten. Een release kan foutloos zijn en toch het afrekenproces verstoren.
- Oefen nooit met terugrollen. Oefen het, zodat het werkt als je onder druk staat.
- Achtergrondtaken vergeten. Werknemers en geplande taken hebben ook een plan nodig tijdens een overstap.
Tot slot
Blauw-groen geeft u een schone, snelle omschakeling. Canary geeft je een kleine, afgemeten belichting. Als uw monitoring nog steeds eenvoudig is, begin dan met rolling updates of blauw-groen, en investeer in statistieken per versie voordat u canaries uitprobeert. Oefen vervolgens een rollback voor uw volgende release, inclusief de database. Die ene oefening heeft de neiging om te onthullen wat er echt moet worden opgelost.
Veelgestelde vragen
Wat is het verschil tussen blauwgroene en kanarie-implementatie?
Blauw-groen schakelt al het verkeer in één keer van de ene volledige omgeving naar de andere. Canary stuurt een klein deel van het verkeer naar de nieuwe versie en breidt dit geleidelijk uit.
Wat is veiliger: blauwgroen of kanarie?
Canary beperkt hoeveel gebruikers een slechte release treft, en blauwgroen biedt een zeer snelle terugdraaiing. De veiligere keuze hangt af van uw verkeer, tooling en monitoring.
Is blauw-groene inzet duur?
Dat kan, aangezien u tijdens een release twee volledige omgevingen kunt gebruiken. Het automatisch schalen van de cloud en het afsluiten van de inactieve omgeving kunnen de kosten verlagen.
Met welk percentage moet een kanarie beginnen?
Teams beginnen doorgaans met ongeveer 1 tot 5 procent, zolang dat maar voldoende verkeer oplevert voor een betekenisvol signaal. Systemen met weinig verkeer hebben mogelijk een groter aandeel nodig.
Hoe gaan Canary en Blue-Green om met databasewijzigingen?
Meestal met achterwaarts compatibele wijzigingen zoals expand en contract, omdat beide versies één database mogen delen en beide moeten werken tijdens de uitrol.
Blijf leren
Hulp nodig met testen, WordPress of SEO?
We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.
Meer handleidingen over testen, AI en moderne ontwikkeling
Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.
AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen
AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…
Lees artikel →DevOpsOmgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan
Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…
Lees artikel →SoftwareontwikkelingAPI-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten
API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…
Lees artikel →TestautomatiseringSpotten in Python: unittest.mock, patch en de fouten die tests doen liegen
Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…
Lees artikel →SoftwaretestenCodedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent
Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…
Lees artikel →Databases & SQLDELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken
DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…
Lees artikel →Databases & SQLSQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden
SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…
Lees artikel →SoftwareontwikkelingTypeScript-interface versus type: echte verschillen, getest met de compiler
TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…
Lees artikel →SoftwareontwikkelingPython *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden
Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…
Lees artikel →SoftwareontwikkelingPython Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken
Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…
Lees artikel →Kunstmatige intelligentieWat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren
Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…
Lees artikel →DevOpsMonitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen
Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…
Lees artikel →DevOpsDocker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier
Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…
Lees artikel →TestautomatiseringTDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt
TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…
Lees artikel →SoftwaretestenGebruikersacceptatietesten (UAT): proces, checklist en echte voorbeelden
Gebruikersacceptatietesten uitgelegd: wie voert het uit, hoe het verschilt van QA, een proces in zeven stappen, een UAT-testcase-sjabloon, een check…
Lees artikel →Databases & SQLSQL NULL-waarden uitgelegd: IS NULL, COALESCE, NULLIF en de te vermijden vallen
SQL NULL-waarden uitgelegd met query's die we hebben uitgevoerd: logica met drie waarden, IS NULL, COALESCE, NULLIF, hoe aggregaten, joins en sorter…
Lees artikel →Databases & SQLSQL CASE WHEN-instructie: syntaxis, echte voorbeelden en veelvoorkomende fouten
SQL CASE WHEN uitgelegd met vragen die we hebben uitgevoerd: eenvoudige en doorzochte formulieren, volgorde van de voorwaarden, draaipunten met SUM,…
Lees artikel →SoftwareontwikkelingWat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld
Wat is JWT? JSON Web Tokens uitgelegd: de drie delen, een token gebouwd en waarmee is geknoeid in de code die we hebben uitgevoerd, JWT versus sessi…
Lees artikel →SoftwareontwikkelingJavaScript-gebeurtenislus uitgelegd: call-stack, microtaken en timers met voorbeelden
De JavaScript-gebeurtenislus uitgelegd met code die we hebben uitgevoerd: call-stack, taak- en microtask-wachtrijen, waarom setTimeout 0 niet onmidd…
Lees artikel →SoftwareontwikkelingPython-generatoren en opbrengst uitgelegd: bespaar geheugen met echte voorbeelden
Python-generatoren en opbrengst uitgelegd met code die we hebben uitgevoerd: hoe ze pauzeren en hervatten, gemeten geheugenbesparingen, pijplijnen, …
Lees artikel →Kunstmatige intelligentieWat zijn inbeddingen? Vectoren en cosinusovereenkomst eenvoudig uitgelegd
Wat zijn insluitingen? Een gids in duidelijke taal over vectoren, cosinusovereenkomst en semantisch zoeken, met een klein voorbeeld dat we hebben ui…
Lees artikel →DevOpsImplementatie van blauwgroen versus kanarie: verschillen, afwegingen en hoe te kiezen
Blauw-groen versus kanarie-implementatie uitgelegd: hoe elk werkt, kosten, risico's en terugdraaien, stabiele gebruikersbucket die we hebben getest,…
Lees artikel →TestautomatiseringSchilferige tests: wat de oorzaak ervan is en hoe u ze voorgoed kunt oplossen
Zwakke tests uitgelegd met demo's die we hebben uitgevoerd: de belangrijkste oorzaken, hoe je er een kunt bevestigen en diagnosticeren, goede oploss…
Lees artikel →SoftwaretestenBelastingtesten versus stresstesten: verschillen, statistieken en k6-voorbeelden
Belastingtesten versus stresstesten uitgelegd: wat elk bewijst, piek- en soak-tests, de statistieken die er toe doen, waarom gemiddelden misleiden, …
Lees artikel →SoftwaretestenTestcase versus testscenario: belangrijkste verschillen, voorbeelden en wanneer deze te gebruiken
Testcase versus testscenario uitgelegd: duidelijke definities, een tabel naast elkaar, één functie voor het opnieuw instellen van wachtwoorden, over…
Lees artikel →Databases & SQLOptimalisatie van SQL-query's: lees uitvoeringsplannen en repareer langzame query's, met timing
Optimalisatie van SQL-query's getest op een miljoen rijen: lees uitvoeringsplannen, voeg de juiste indexen toe, repareer niet-sargeerbare filters, g…
Lees artikel →Databases & SQLSQL UNION versus UNION ALL: verschillen, voorbeelden en geteste prestaties
SQL UNION versus UNION ALL uitgelegd met de query's die we hebben uitgevoerd: duplicaten, de regels volgen beide, een echte databug, gemeten prestat…
Lees artikel →SoftwareontwikkelingJavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs
Een JavaScript Fetch API-tutorial getest tegen een lokale server: GET en POST, waarom 404 niet gooit, een herbruikbare helper, queryreeksen, time-ou…
Lees artikel →SoftwareontwikkelingPython-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden
Het verwerken van Python-bestanden uitgelegd met code die we hebben uitgevoerd: open modi, met het lezen van grote bestanden, CSV, JSON, pathlib, bi…
Lees artikel →SoftwareontwikkelingPython-klassen en -objecten: OOP-zelfstudie met echte voorbeelden
Python-klassen en -objecten uitgelegd met code die we hebben uitgevoerd: __init__, methoden, klasse versus instantie-attributen, overerving, eigensc…
Lees artikel →Kunstmatige intelligentieWat is een groot taalmodel? Hoe LLM's werken, uitgelegd zonder de hype
Wat is een groot taalmodel? LLM's uitgelegd in duidelijke taal: tokens, inbedding, aandacht, training, temperatuur- en contextvensters, een kleine d…
Lees artikel →DevOpsLinux-opdrachten voor beginners: de essentiële terminalgids met voorbeelden
Linux-opdrachten voor beginners, gegroepeerd op taak: navigatie, bestanden, logboeken bekijken, grep, pipelines, machtigingen, processen en archieve…
Lees artikel →TestautomatiseringSelenium versus toneelschrijver: belangrijkste verschillen, code vergeleken en welke te kiezen
Selenium versus Playwright vergeleken: architectuur, wachten, browser- en taalondersteuning, debuggen, dezelfde test in beide tools, migratieadvies …
Lees artikel →SoftwaretestenEquivalentiepartitionering: testontwerptechniek uitgelegd met uitgewerkte voorbeelden
Equivalentiepartitionering uitgelegd: hoe je geldige en ongeldige partities kunt vinden, uitgewerkte voorbeelden voor leeftijden, wachtwoorden en ko…
Lees artikel →SoftwaretestenErnst versus prioriteit bij het testen van software: verschillen, matrix en echte voorbeelden
Ernst versus prioriteit bij het testen van software uitgelegd: duidelijke definities, een vierwegmatrix met voorbeelden, niveauschalen, wie deze bep…
Lees artikel →Databases & SQLTutorial voor SQL-subquery's: typen, gecorreleerde subquery's en BESTAAN met voorbeelden
Een SQL-subquery-tutorial met query's die we hebben uitgevoerd: scalaire, IN-, FROM- en SELECT-subquery's, gecorreleerde subquery's, EXISTS, de NOT …
Lees artikel →Databases & SQLSQL-transacties en ACID uitgelegd: COMMIT-, ROLLBACK- en isolatieniveaus
SQL-transacties en ACID uitgelegd met een bankoverschrijving die we hebben uitgevoerd: COMMIT, ROLLBACK, savepoints, locks, isolatieniveaus, dirty r…
Lees artikel →SoftwareontwikkelingGit merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt
Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.
Lees artikel →SoftwareontwikkelingPython list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt
Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.
Lees artikel →Databases & SQLSQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)
Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.
Lees artikel →