Asi nikoho nepřekvapilo, že spuštění systému pro rezervaci na očkování proti koronaviru bylo provázeno mnohými problémy. Na to jsme v České republice zvyklí, pravděpodobně bychom dlouho hledali významnější informační systém veřejné správy, který fungoval na první pokus správně. Co je ale příčinou? To nám umožní odhalit tři čísla za lomítkem.

Jedním z mnoha problémů systému bylo, že jako nevalidní vyhodnocoval rodná čísla, která mají jenom devět číslic. Tj. všechna, která patří lidem narozeným před rokem 1954. Nechci být za hnidopicha, ale u systému určeného osobám seniorského věku mi to přijde jako chyba dosti podstatná. Je to závada triviální, leč poměrně hodně vypovídající. A rozhodně nikoliv první svého druhu.

Tento článek patří do placené sekce.

Pro vás jej odemknul někdo, kdo má předplatné.


Pokud budete předplatitelem, budete moci stejným způsobem odemykat placené články i pro své přátele.
A získáte i řadu dalších výhod.

Před devíti lety zažil výpadek informační systém řešící vydávání osobních dokladů. Příčina byla zkušenému programátorovi jasná, když se podíval do kalendáře, na kterém bylo datum 29. února 2012. Přestupný rok. Co se stalo? V programu byla chyba, která jako dobu konce platnosti dokladu vygenerovala neexistující datum tím, že použila dnešní datum a k jeho roku přičetla desítku. V jazyce C# by takový kousek kódu mohl vypadat třeba následovně:

var zacatekPlatnosti = DateTime.Today;

var konecPlatnosti = new DateTime(zacatekPlatnosti.Year + 10, zacatekPlatnosti.Month, zacatekPlatnosti.Day);

Bude to fungovat velmi pěkně, pokud ovšem kód neběží devětadvacátého února. V roce 2012 by vygeneroval jako konec platnosti 29. února 2022, což není platné datum. Program napsaný v C# by spadl s následujícím chybovým hlášením:

Unhandled exception. System.ArgumentOutOfRangeException: Year, Month, and Day parameters describe an un-representable DateTime.

Celé si to můžete vyzkoušet ve webovém prohlížeči na webu .NET Fiddle, který umožňuje zkoušet si chování programového kódu v C#, aniž byste museli cokoliv programovat.

Jaký je správný postup? Řádek pro výpočet datumu konce platnosti by měl vypadat například takto:

var konecPlatnosti = zacatekPlatnosti.AddYears(10);

V takovém případě by výsledkem byl 28. únor 2022, což je datum zcela validní. Že nebyl použit, je pro stav českého státního IT naprosto symptomatické.

Práce s datem a časem v počítačových systémech je věc náročná a často může způsobit problémy. Existují nejenom přestupné roky a devětadvacátý únor, ale třeba i přestupné sekundy (ta poslední nastala 31. prosince 2016 ve 23:59:60). A nechtějte, abych začal mluvit o časových zónách. V seznamu, který na GitHubu udržuje Kevin Deldycke, se dozvíte o datu a času a problémech s nimi víc, než jste kdy chtěli vědět.

Autoři vývojových platforem jsou si tohoto problému vědomi. A proto všechny prakticky používané platformy (nejenom C# zmiňovaný výše, ten jsem jenom zvolil, neb je mému srdci nejbližší) mají nějakou formu systemizované knihovny, která umí data různě sčítat, odečítat a obecně s nimi pracovat, a to s přihlédnutím k většině obvyklých problémů. Nejsou dokonalé a vševědoucí, rozličné historické špílce nemusejí vyřešit správně, ale na data ze současnosti a času jí blízké stačí s přehledem. Každý schopný a zkušený programátor o nich ví a rutinně je používá.  

Přítomnost chyby tohoto typu znamená, že kód napsal někdo nezkušený, začátečník. To samo o sobě nemusí být chybou, každý někdy začínal a od toho se při vývoji používají nástroje jako automatická analýza, code review a testování. Některé chyby tohoto typu dokážou moderní vývojářské nástroje detekovat a upozornit na ně a nabídnout řešení. Je ale nutné, aby je někdo patřičným způsobem nastavil, a také, aby jejich varování bez dalšího neignoroval. Běžnou praxí je code review, kdy napsaný kód někdo jiný, zkušenější prohlédne a podívá se, zda tam nejsou zjevné chyby. Dalším filtrem je testování, automatizované nebo lidské a součástí testerské latiny je právě zadávání různých nestandardních hodnot, přestupných dat a extrémních případů tam, kde by je nikdo nečekal:

Přijde tester do baru a objedná si jedno pivo.

Přijde tester do baru a objedná si nula piv.

Přijde tester do baru a objedná si minus jedno pivo.

Přijde tester do baru a objedná si qwertyuiop piv.

Přijde tester do baru a objedná si 2147483648 piv.

Přijde tester do baru a objedná si <script>window.alert("XSS!");</script> piv.

Přítomnost chyb tohoto druhu je důkazem selhání nikoliv individuálního, ale systémového. Všichni děláme chyby a z jediné chyby nelze vyvozovat zásadní důsledky. Ale pokud jde o chyby tradiční, často opakované, snadno odhalitelné, je to něco jiného. Chybná validace rodného čísla je případem naprosto stejného druhu. Nejenom že ten kousek kódu psal nedouk, ale ještě to po něm nikdo nezkontroloval.

Stát situaci navíc ještě dvakrát nepomáhá zmateným a protiřečícím si informováním i v takových drobnostech, jako je formát rodného čísla. V oficiálním státním katalogu datových prvků i na webu MVČR jsou totiž informace o jeho formátu uvedené jinak než v autoritativním zdroji, jímž je § 13 zákona č. 133/2000 Sb. o evidenci obyvatel. Je všeobecně známo, že k hodnotě měsíce se u žen přičítá 50 a katalog datových prvků (což je web svým vzhledem a chováním evokující devadesátá léta) jako možné hodnoty druhého dvojčíslí uvádí 01-12 a 51-62. Nicméně zákon připouští i přičítání hodnot 20 (u mužů) a 70 (u žen) v případě, že by se v jeden den narodilo tolik lidí, že by "čísla za lomítkem" nestačila. Takže validní jsou i hodnoty 21-32 a 71-82.

Související

Proč státní systémy píší nedouci? Protože stát za posledních několik desetiletí vybudoval systém, ve kterém přitahuje neschopné a odpuzuje schopné. Často se zmiňuje problém nízkých platů, ale není to jediná a většinou ani hlavní příčina. Tou je toxické pracovní prostředí, zastaralé technologie, nesmyslná zadání... Interně na projektech pracují ti, kdo by si v soukromém sektoru nevydělali ani na slanou vodu. A externí projekty jsou dodávány v téže kvalitě, protože na straně objednatele není nikdo, kdo by dokázal kvalitu zkontrolovat. Často se řeší podle manažerské poučky, že devět žen porodí jedno dítě za měsíc - na projekt se nažene velké množství juniorů, nezkušených začínajících programátorů, a prostě se to nějak slepí, bez ladu a skladu.

Není to problém pouze poslední doby, je to stav trvající desítky let. Ránu z milosti mu pak zasadila současná garnitura pod vedením Andreje Babiše. Na jaře loňského roku se tváří v tvář pandemii mnoho schopných lidí rozhodlo, že státu pomohou. Nabídli své služby, za symbolickou cenu nebo zdarma. A byli zneužiti k PR cirkusu a jejich práce spláchnuta do kanálu. Dnes většina z nich své pozice dávno opustila, s hořkostí a předsevzetím, že do státních služeb nikdy více.

Stát často nefunkčnost svých systémů obhajuje vysokou zátěží a snaží se budit dojem, že se jedná o něco super velkého a složitého, co nelze vyrobit v rozumném čase za rozumné peníze. Pro lidi znalé oboru je to očividná lež. Napsat a provozovat snadno škálovatelný systém, který zvládne tak malou zátěž jako rezervační systém na očkování (zmiňovaných 75 tisíc uživatelů objektivně není z hlediska IT mnoho), je dnes jednodušší než kdy předtím. Není třeba nic vymýšlet, jsou na to standardizované postupy a není to ani moc drahé. Podrobnosti o standardním technickém řešení provozu takového systému píše ve svém článku třeba Tomáš Herceg.

Světlo na konci tunelu bohužel nevidím. Neschopnost státní mašinerie je taková, že i kdyby se zítra konaly volby a drtivě vyhráli [zde doplňte svou oblíbenou politickou stranu], bude řešení trvat desetiletí. Zatím snad můžeme být rádi, že registrační systém po chvíli provozu ministerstvo nevypnulo, jak to předvedlo ministerstvo dopravy u prodeje dálničních známek. Na vyznamenání to ale rozhodně není.

Související

Líbil se vám článek? Chcete víc takových článků?

Kupte si předplatné a můžete si je číst všechny. Navíc bez reklam a s možností odemykat placené články pro přátele.

Vyzkoušejte předplatné HN+

Komentáře ke článku

Michal Kucera 24.01.2021 15:02
Já jsem registraci prováděl a 9 místné rodné číslo to vzalo bez problémů (podotýkám, že jsem registraci prováděl hned v 8:00). To znamená, že se chyba týkala buď jenom některých rč nebo je to nějaká fáma, kterou někdo vypustil a média se jí chytila.
Matěj Škop 17.01.2021 19:03
Strašně zajímavý článek i pro &bdquo;neajťáky&rdquo;. Jenom prosím slovo datum se skloňuje jako ve druhém pádě jako &bdquo;data&rdquo;. To znamená &bdquo;Řádek pro výpočet data&rdquo; :)
Miroslav Koula 17.01.2021 17:56
Podle mého názoru by mělo znovu vzniknout Ministerstvo informatiky a všechny podobné projekty téct přes něj. Bylo by zodpovědné za zadávací dokumentaci i kontrolu systémů přes spuštěním, ale pokud by se dle zadání muselo vyvíjet "agilně", tak v podstatě i v jeho průběhu. Něco jako MF, prostě vše z IT by musel téct přes něj. Problém vidím jen v té lidské síle, protože záleží, kdo by to řídil a koho měl pod sebou a jestli by měl dostatečné kompetence. Protože při vládnutí Andreje Babiše i mnoha jiných politických uskupení si neumím představit, že by ono MI dokázalo opravdu fungovat...
Newsletter

Týden s technologiemi Otakara Schöna

Události posledního týdne ve světě technologií podle Otakara Schöna

Editor rubriky Tech Otakar Schön pro Vás vybírá nejzajímavější nebo nejzásadnější události ze světa moderních technologií, které se odehrály v uplynulém týdnu. Každý pátek v podvečer najdete ve své mailové schránce.

Přihlášením se k odběru newsletteru souhlasíte se zpracováním osobních údajů za účelem příjmu newsletteru. Z odběru se můžete kdykoli odhlásit.

Přihlásit se k odběru