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.

Nedávno jste již předplatné aktivoval

Je nám líto, ale nabídku na váš účet v tomto případě nemůžete uplatnit.

Pokračovat na článek

Tento článek pro vás někdo odemknul

Obvykle jsou naše články jen pro předplatitele. Dejte nám na sebe e-mail a staňte se na den zdarma předplatitelem HN i vy!

Navíc pro vás chystáme pravidelný výběr nejlepších článků a pohled do backstage Hospodářských novin.

Zdá se, že už se známe

Pod vámi uvedenou e-mailovou adresou již evidujeme uživatelský účet.

Děkujeme, teď už si užijte váš článek zdarma

Na váš e-mail jsme odeslali bližší informace o vašem předplatném.

Od tohoto okamžiku můžete číst neomezeně HN na den zdarma. Začít můžete s článkem, který pro vás někdo odemknul.

Na váš e-mail jsme odeslali informace k registraci.

V e-mailu máte odkaz k nastavení hesla a dokončení registrace. Je to jen pár kliků, po kterých můžete číst neomezeně HN na den zdarma. Ale to klidně počká, zatím si můžete přečíst článek, který pro vás někdo odemknul.

Pokračovat na článek

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.

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