Met de billen bloot: Er gaat weleens wat mis

2018 November 1610 min read
Diana Koenraadt

Wij willen met jodiBooks 'radical transparency' beoefenen. Met andere woorden, we doen onze uiterste best om te zeggen wat we doen en te doen wat we zeggen. Dat betekent ook eerlijk zijn als er wat misgaat.

brina blum NCRlqW jkIQ unsplash
Foto door Brina Blum op Unsplash

Nou is "de vuile was buitenhangen" een spreekwoord met een andere betekenis, maar ik vond op Unsplash geen blote billen ;)

Terwijl de volgende release alweer voorbij is, schrijf ik even op wat er tijdens de release van 27 oktober misging. En waarom een van onze klanten ons daar op moest wijzen.

Foute prijslijst

De prijslijsten van onze klanten klopten niet meer. Een klant appte dat ze de prijslijst van een andere salon zag. Oh jee! :(

Ik zat op dat moment in de trein onderweg naar huis van een afspraak. En, nog onhandiger, ik had mijn laptop niet bij me. Maar ik had een telefoon! Dus ik logde in met mijn eigen testaccount, om te zien of ik het probleem ook zag.

Toen liep ik tegen een beperking aan van mijn testaccount: De testdata in dat account is eigenlijk best wel onzin… Ik weet niet uit mijn hoofd wat ik daar in heb staan, dus ik zie er niet aan of er wat mis mee is. In tegenstelling tot iemand met een eigen salon, die ziet onmiddellijk "Hee, dit is niet mijn prijslijst!". Dus dat hielp niet echt.

En om privacy redenen, kan ik niet in het account van onze klant kijken.

Privacy

De nieuwe privacywet is heel grondig opgezet en wij doen ons uiterste best om ons aan die wet te houden. Een van de regels is dat je de data van je klanten niet mag gebruiken voor andere doeleinden dan waarvoor je die gekregen hebt. Het is dus niet de bedoeling dat ik op mijn laptop in alle gegevens van onze klanten kan kijken. Nee, ook niet als dat 'handig' is tijdens het programmeren, ik kijk daar helemaal niet in. Hoeveel inkomsten jij hebt, wie jouw klanten zijn, dat gaat ons botweg geen donder aan. Dat is privé, en terecht!

Dat betekent dus dat ik helemaal niet in jullie prijslijsten kan kijken. De klant die meldde dat zij de prijslijst van een andere salon zag… ik geloofde haar op haar woord, maar ik kon het zelf niet zien.

Ik had dus weinig andere keus dan op mijn telefoon wat rondklikken in onze test accounts en onze klant vragen stellen. Ik ben haar heel dankbaar dat ze daar de tijd voor nam, want zo kon ik onderweg naar huis de oorzaak achterhalen.

Op zoek naar waar het probleem zit

Omdat ik niet mee kon kijken en in de trein zat, was het voor mij eerst nog de vraag om scherp te krijgen wat exact het probleem was. Nou lijkt een melding als "Ik zie de prijslijst van een andere salon" heel duidelijk. En voor de klant is dit een duidelijk probleem, natuurlijk. Maar om het op te kunnen lossen moest ik weten hoe jodiBooks tot de beslissing kwam om deze (verkeerde) gegevens aan onze klant te tonen. Ik moest dus bedenken waar het allemaal fout kon gaan.

Waren de toegangsrechten defect?

marcos mayer 8 NI1WTqCGY unsplash
Foto door marcos mayer op Unsplash

Natuurlijk bevat jodiBooks de prijslijsten van meerdere salons. En als jij ingelogd bent, moet jodiBooks alleen de gegevens van jouw salon teruggeven. Mijn eerste vraag was dan ook: Gaat het alleen mis met je prijslijst, of ook met je klanten, inkomsten, etc? Het antwoord was dat het alleen de prijslijst betrof. Onze klant zag een deel van haar eigen prijslijst en een deel van die van iemand anders.

Okee, dus ze kreeg niet een totaal andere salon te zien. Het euvel betrof enkel en alleen haar prijslijst. Haar inkomsten waren gewoon die van haarzelf en haar klanten ook. Ze kon dus redelijk goed doorwerken. Mijn hartslag werd ietsjes rustiger. Er ging dus alleen bij het ophalen van de prijslijst iets mis.

Werd ze verwezen naar het dashboard van een compleet andere klant? Nee.

Werd er teveel data opgehaald?

De vervolgvraag was dit: Als de prijslijst wordt opgehaald, dan haalt jodiBooks alle behandelingen en producten op die horen bij jouw salon. Ook daar zit dus nog een 'maar wel van de juiste salon'-check tussen. Maar wat als ie, alleen voor de prijslijst, dat laatste stukje vergat? Wat als ie — alleen voor de prijslijst — de behandelingen en producten van iedereen ophaalde? Mijn hartslag steeg weer iets. Bij navraag liet de klant me weten dat ze ook dingen van haar prijslijst miste. Hmmm… okee. Die theorie sneuvelde dus ook.

Toonde jodiBooks haar alle prijslijsten van alle klanten? Nee.

De zoekfunctie, bood die soelaas?

In jodiBooks, als je een inkomsten bon maakt en een product wilt toevoegen, dan toont het scherm je in eerste instantie al jouw producten. Je kunt ook zoeken. Had de zoekfunctie hetzelfde probleem? Ik vroeg haar of ze de ontbrekende producten met de zoekfunctie kon vinden. Nee, was het antwoord. Helaas. Dus… zowel de functie om alles op te halen, als de zoekfunctie, toonden een stukje van haar eigen prijslijst, en een stukje van die van een ander.

Elke gebruiker heeft haar eigen ladekastje met gegevens. Alleen in haar eigen gegevens kan zij kijken en wijzigingen maken. Als er verkeerde gegevens worden getoond, heb je twee opties:

  • jodiBooks kijkt in de verkeerde ladekast (fout in de code)
  • de ladekast bevat verkeerde data (fout in de database)

Een fout in de code zou betekenen dat als de ene gebruiker iets wijzigt in haar prijslijst, dat een andere gebruiker dan ook ineens wijzigingen zou zien.

Ik logde op mijn telefoon in op een test account en maakte een product aan met een heel herkenbare naam. Iets van de vorm "Zie je deze in een ander account?!". Toen logde ik in op een ander testaccount van ons. Het nieuw aangemaakte product verscheen daar niet. Dus… Elke gebruiker heeft zijn eigen ladekastje aan gegevens, en blijft ook binnen dat ladekastje. Daar was niks mis mee.

Zit het probleem vermoedelijk in de database of in de code? Vermoedelijk in de database.

Wat was er aan de hand?

Ik wist nog niet precies waar het probleem zat. Maar in gedachten ging ik een stap terug: Drie dagen ervoor hadden we een release gedaan. Welke wijzigingen zaten er allemaal in die release?

En toen begon ik me een beetje te schamen. Ik besefte me ineens wat er mis moest zijn gegaan.

Samenvoegen van twee velden

Tot release 1.8.0 was het mogelijk om je merken apart te beheren. Je maakte een lijst van merken aan, en als je een nieuw product of een nieuwe behandeling aanmaakte op je prijslijst, dan kon je daar een merk aan toewijzen.

Wat bleek? Er was maar één klant die dat in haar prijslijst had gebruikt, maar zij gaf aan dat ze haar inkomsten al lang niet meer vanuit de prijslijst invoerde. Zij gebruikte gewoon het "vrije invoer"-veld. Dus de enige klant die merken in haar prijslijst had staan, deed er eigenlijk niks meer mee…

Omdat het een extra handeling was en wij jodiBooks zo eenvoudig mogelijk wilden maken, besloten we om het apart beheren van merken weg te gooien.

Voor die ene klant die nog merken in haar prijslijst had, besloot ik om de merknaam en productnaam achter elkaar te plakken. Bijvoorbeeld: product "lotion" die gekoppeld was aan merk "MX", zouden we hernoemen naar "MX lotion". Daarna zou de losse merkenlijst verdwijnen.

Daar ging het mis.

Omdat mijn eigen test data nogal eum… onzinnig is, had ik niet in de gaten dat ik daar een programmeerfout maakte. Ik had niet gezien dat ik de verkeerde merken had gekoppeld aan de verkeerde producten. Dat is niet het ergste… Ik had merknamen en productnamen van _verschillende salons_door elkaar gegooid.

Een voorbeeldje van voor en na:

1 thaNT7QG8INuasO5qopZGg
Voorbeeldprijslijst (voordat de fout optrad)

1 KF6uYrMXPTSfumJzJ6d7IA
Voorbeeldprijslijst (nadat de fout optrad)

Zoals je misschien ziet, het waren alleen de namen die fout waren. De prijzen waren hetzelfde. In feite was er een soort stoelendans opgetreden.

(Bij de klant die het ons meldde, waren sommige namen wel in orde, maar sommigen niet. Daarom leek het alsof zij een deel van haar eigen prijslijst en een deel van andermans prijslijst zag.)

Waarom had ik dit niet gezien tijdens het ontwikkelen?

Allereerst, ik streef er natuurlijk naar om 0 fouten te maken. Nul. Uiteraard. Maar het is denk ik wel zo realistisch om te zeggen dat er zo nu en dan een fout in zal sluipen… Helaas.

Het is dan heel normaal dat je de vraag stelt "Hoe hadden we dit kunnen voorkomen"?

En achteraf bezien weet ik waar het mis ging. Kijk, ik kende mijn eigen prijslijst niet, dus het viel me niet zo op dat de namen door elkaar gehusseld waren. Als je een testprijslijst hebt die volstaat met "Product A", "Product B" en "lalala", dan zie je daar niet veel aan..

Wat ik had moeten doen, is een paar automatische tests schrijven die controleerden of de nieuwe naamgeving van producten en behandelingen in mijn test prijslijst juist was. Dat heb ik nagelaten, en dat was mijn grootste fout. Ik heb dit niet goed genoeg gecontroleerd en het dus domweg over het hoofd gezien.

Dat niet alleen, ik test op mijn laptop vaak maar met één gebruiker. Dus ik zag allereerst niet dat er een stoelendans optrad, maar ook niet dat die stoelendans door alle salons heen ging.

Zoals ik eerder al zei kan ik ook niet in de gegevens van onze klanten kijken. (Natuurlijk zou ik wel de echte database met echte klanten kunnen bekijken, maar omwille van de privacy doen we dat niet. Punt.) De enige backup die ik weleens gebruik voor performance tests of 'even erdoorheen klikken'-tests, hebben wij volledig geanonimiseerd. Die staat dus vol met … streepjes… Elk product heet "-" en elke behandeling heet "-" en elke klant heet "-".

Daar ging dus de laatste kans om deze fout te vangen op zijn gat. Ik zag in de laatste controle overal "- -" staan in de prijslijst. En er ging geen alarmbelletje af dat ik het misschien nog wat beter moest nalopen.

Redelijk rap opgelost

Bij jodiBooks maken we wel heel regelmatig backups :) Die backups zijn uiteraard versleuteld opgeslagen en veilig bewaakt. Maar ze bestaan uiteraard juist voor dit soort doeleinden: Om een stapje terug te kunnen doen als het nodig is. Dus kon ik vanuit de laatste backup een herstelscript maken.

kelly sikkema OJxSei48cbU unsplash
Foto door Kelly Sikkema op Unsplash

Nadat de fout ons dinsdagmiddag gemeld werd, heb ik dinsdagavond een foutherstel-script gemaakt met behulp van de laatste backup waarin alles nog goed was. Dit script ging de oude prijslijstnamen terugzetten, en dit keer de merknaam er op de juiste manier voor plakken. Op woensdagochtend kon ik onze klant melden dat het was opgelost.

Bij deze wil ik onze klant bedanken voor haar geduld en begrip ♥