čtvrtek 26. prosince 2013

Odkaz Michaila Kalašnikova softwarovému vývoji

V tomhle článku trochu navážu na armádní speciál, který nezávazně píšeme s Banterem. On se v posledním díle Co se firmy můžou přiučit od armády 2 rozepsal o uniformách. Já bych chtěl využít aktuálního tématu, úmrtí Michaila Kalašnikovat [1.], konstruktéra útočné pušky AK-47 (zkráceně pojmenované kalašnikov), která to dotáhla až na vlajku státu Mozambik. Poprvé tuším paralelu se softwarovým vývojem a návrhem AK-47 zmínil Karel Minařík [2.]. Návrh AK-47 může být inspirací pro návrh spolehlivého software, o kterém mluvím a píšu pod hlavičkou Cynický software.

Z nouze ctnost

M. Kalašnikov vycházel při návrhu ze zkušeností a možností tehdejší sovětské průmyslové výroby, kdy bylo prakticky nemožné vyrobit jednotlivé části zbraně přesně na míru. Kromě hlavně a závorníku, které musely přesně pasovat, mohl mít zbytek součástí zbraně odchylky od předepsaných rozměrů. Jako veterán Druhé světové války, počítal s tím, že v boji bude jediným nástrojem dostupným k opravě pouze kladivo [3.]. Návrh zbraně byl velmi jednoduchý a umožňoval lacinou výrobu, další z nutností reflektující ekonomickou realitu tehdejšího Sovětského svazu. Jednoduchý a tolerantní design umožnil spolehlivost s nulovými nároky na údržbu. Z nouze se stala ctnost. Zbraň, která prošla úspěšně prakticky všechny válečné konflikty po Druhé světové válce, se stala legendární a oblíbená právě díky spolehlivosti. Přestože zbraň nedosahovala takové přesnosti střelby, díky toleranci chyb výroby, jako konkurenční útočná puška M16, její jednoduchost a spolehlivost tyto atributy přesvědčivě převážily.

Nadřazenost a úspěch jejího designu potvrzuje i fakt, že byla licencovaně vyráběná v dalších zemích nejenom Varšavské smlouvy. Vychází z ní například izraelská útočná puška Galilcite> nebo finská Velmetcite> [4.]. Přestože je design zbraně starý přes 60. let, došlo prakticky pouze k drobným úpravám. Za tu dobu se nedošlo v oblasti útočných pušek k lepšímu designu, který by AK-47 výrazně překonal [6.].

Odkaz Michaila Kalašnikova

Co si můžeme odnést z designu AK-47 a pro softwarový vývoj? Je několik oblastí, ve kterých se můžeme inspirovat.

M. Kalašnikov, podobně jako řada dalších vynálezců, nebyl osvícen z nenadání. Prošel si celou řadu designu pušek a samopalů, které se běžně používaly v Druhé světové válce. Zároveň mu pomohla vlastní bojová zkušenost - mimochodem navrhl například počítadlo výstřelů k tankovému kanonu nebo úpravu pistole Tokarev pro střelbu z tanku [3.] - díky které dokázal posoudit, co je kritické pro fungování útočné pušky. Pokud začnete designovat nějaký systém je celkem dobrá šance, že někdo dělal něco podobného před vámi. Je užitečné studovat podobná řešení a hledat v nich inspiraci. M. Kalašnikov sám o sobě nevymyslel nic nového, jenom spojil existující nápady do nového celku a zohlednil technická omezení tehdejšího Sovětského svazu.

Věděl, že jednoduchost návrhu umožní levnou výrobu. Výhody jednoduchého designu jsou zřejmé - jednoduché na pochopení a jednoduché na implementaci. Pokud se něco rozbije, bude jednoduché to opravit. Jeho design byl přímo učebnicovým příkladem KISS principu. Jednoduchý design nabízí menší prostor pro rozbití. Během softwarového vývoje je naopak často příliš akcentovaná funkcionalita na úkor provozních nákladu. Bohužel je to dané tím, že výsledné náklady na spravovatelnost celého řešení jsou skryté. Problém spolehlivosti americké útočné pušky M16 během Vietnamské války byl v tom, že se počítalo s její údržbou. Jenom někdo zapomněl dodat čistící soupravy. Oproti tomu M. Kalašnikov počítal s tím, že údržba zbraně nebude na vysoké úrovni.

Vždycky když designujeme nějaký systém a nastane problém s mazáním zastaralých dat, najde se minimálně jedno řešení navrhující formu nějakého garbage collectoru. V klasické podobě to je většinou nějaký cron job. Tohle řešení bohužel funguje jako ten zapomenutý vytěrák k M16. Pokud ho nezapnete zapnout při každé instalaci, pokud není nějakým způsobem založený na tom, že běží jenom jednou a to i v clusteru, pokud nežere moc paměti, pokud doběhne do dalšího naplánovaného běhu. Je tam celá řada ale. Proto vždy preferuji design, kde je mazání zastaralých dat automatické (například MongoDB podporuje takzvané capped kolekce, kde se data mažou automaticky).

Nepřesná výroba a z toho vycházející design by přibližně odpovídal návrhu, kde jednotlivé vazby systému mají pouze volné vazby [5.]. Volné vazby umožňují, aby jednotlivé části systému nezávisely přímo na implementačních detailech. Umožňuje to jednoduše vyměnit jednu implementaci za druhou, aniž by to mělo vliv na funkci celku. Volná vazba rovněž znamená nebo by měla znamenat, že systém je funkční, přestože se mění podmínky prostředí v němž funguje. Stejně jako chcete, aby vám puška fungovala přestože vám ji právě počůral velbloud, chcete aby systém fungoval přestože jedna z jeho částí může mít problémy. Počítejte s tím, že specifikace bude málokdy kompletní případně jí vždy všichni bezchybně splní. Navrhujte systém, který bude z principu tolerantní k chybám, přesně jako s nimi počítal M. Kalašnikov.


Samozřejmě to můžete takový systém těžko navrhnout, pokud předpokládáte, že systém bude fungovat v absolutně spolehlivém prostředí. M. Kalašnikov, díky vlastním zkušenostem z boje, věděl v jakém prostředí se bude jeho zbraň používat. Věděl, k jakým situacím může dojít, a zohlednil tyto situace při návrhu. Pokud se chcete při návrhu a provedení zlepšit, musíte si projít zkušenostmi z prostředí, kde bude výsledný systém nasazený. V softwarovém vývoji si stačí na pár týdnů zkusit provozovat vlastní systém případně se přepnout do DevOps módu.

Největší odkaz Michaila Kalašnikova je asi v tom, že systém nemusí mít tisíc a jednu funkci, ale musí dělat přesně to k čemu se reálně používá a musí to dělat spolehlivě.


Aktualizace: Doporučuji rovněž článek What designers can learn from the AK-47 od Scotta Berkuna (autor excelentní knihy The Myths of Innovation)

Odkazy