Robustnost (informatika)

Robustnost je v informatice schopnost počítačového systému vyrovnat se při svém fungování s chybami[1][2], zejména s chybnými vstupy.[2] Robustnost může zahrnovat mnoho oblastí informatiky, jako například robustní programování, robustní strojové učení a robustní síťová bezpečnost. Pro prověřování robustnosti jsou důležité formální techniky jako například fuzz testování, které zahrnují používání neplatných vstupů a neočekávaných situací. Pro testování robustnosti se používají například injekce chyb. Některé komerční výrobky provádějí testování robustnosti softwarové analýzy.[3]

Úvod

Obecně platí, že vytváření robustních systémů, které zahrnují každý bod možného selhání, je obtížné kvůli obrovskému množství možných vstupů a jejich kombinací.[4] Protože prověřování všech vstupů a jejich kombinací by vyžadovalo extrémní množství času, není možné, aby vývojáři procházeli všechny případy. Místo toho se snaží různé případy zobecnit.[5] Představme si například zadávání celočíselných hodnot. Ze všech vstupů je třeba prověřit chování při zadání záporného čísla, nuly a kladného čísla. Pokud vývojář použije takováto čísla pro testování software, zobecňuje chování na všech vstupech z těchto tří čísel. Tato metoda je efektivnější a zvládnutelnější, ale také náchylnější na selhání. Zobecnění testovacích případů je příkladem pouze jedné oblasti, v niž je třeba řešit selhání – konkrétně selhání způsobené neplatným vstupem od uživatele. Systémy obecně mohou selhat i z jiných příčin, například kvůli odpojení od sítě.

I složité systémy by měly zpracovávat všechny myslitelné chyby elegantně. Existuje mnoho příkladů takových úspěšných systémů. Známkou robustnosti systému je to, že je možné jej snadno dále vyvíjet a upravovat pro nové situace.[4]

Problémy

Programy a software jsou nástroje zaměřené na určitý úkol, a proto je jejich obecnost a flexibilita omezená.[4] V systémech, jako je internet nebo biologický systém, lze však pozorovat, jak se přizpůsobují změnám prostředí. Jedním ze způsobů, jak se biologické systémy mohou adaptovat na změny prostředí, je použití redundance.[4] V lidském těle jsou důležité orgány zdvojené, například ledviny. Člověku obecně stačí k životu pouze jedna ledvina, ale existence dvou ledvin zvyšuje pravděpodobnost, že případné selhání nebude fatální. Podobný princip lze použít i na software, i když může přinášet určité těžkosti. Slepé přidávání kódu při aplikaci principu redundance v informatice může být nebezpečné, protože obvykle přináší další chyby a činí systém složitějším a obtížnějším na pochopení.[6] Kód, který neposkytuje žádné posílení stávajícího kódu, je nežádoucí. Nový kód musí mít obdobnou funkčnost, takže pokud určitá funkce nefunguje dobře, bude možné ji nahradit využitím jiné funkce, ať již manuálním nebo automatickým přepnutím na jinou funkčnost (tzv. softwarová diverzita). Aby to fungovalo, nový kód musí vědět jak a kdy překlenout selhání.[4] To znamená, že do systému je třeba přidat více logiky. Ale jak se do systému přidává více logiky, komponent a zvyšuje se jeho velikost, stává se komplikovanějším. Zvýšení redundance tedy může vést k robustnějšímu systému, který však bude také komplikovanější, takže vývojáři musí dobře zvažovat vyvážení redundance a složitosti.

Matematická informatika se v současnosti příliš nezaměřuje na vytváření robustních systémů[4], ale spíše na škálovatelnost a efektivitu algoritmů. Jedním z hlavních důvodů, proč tomu tak je, je komplikovanost to dělat obecně.[4]

Oblasti

Robustní programování

Robustní programování je styl programování, který se zaměřuje na zpracovávání neočekávaných ukončení a neočekávaných akcí.[7] Vyžaduje, aby zpracování těchto ukončení a akcí bylo elegantní zobrazením přesné a jednoznačné chybové zprávy. Chybové zprávy by měly vést uživatele k nápravě chyb.

Principy

Paranoia – Při tvorbě softwaru programátor předpokládá, že uživatelé jsou připraveni poškodit jejich kód.[7] Programátor také předpokládá, že jím vytvořený kód může selhat nebo fungovat nesprávně.[7]

Hloupost – Programátor předpokládá, že uživatelé bude zkoušet nesprávný, falešné a poškozené vstupy.[7] V takové situaci musí program vracet uživateli jednoznačné a intuitivní chybové zprávy, které nevyžadují vyhledávání chybových kódů. Chybová zpráva by měla být co nejpřesnější a přitom nebýt zavádějící, aby uživateli ulehčila řešení problému.

Nebezpečné nástroje – Uživatelé by neměli získat přístup k knihovnám, datovým strukturám nebo ukazatelům na datové struktury.[7] Takové informace musí být před uživatelem skryty, aby je nebylo možné náhodně měnit a tak zanést do kódu chyby. Pokud je takové rozhraní správně vytvořené, uživatelé jej používají bez hledání děr pro jeho modifikace. Rozhraní by mělo být správně implementované, takže uživatel nemusí provádět jeho úpravy. Uživatel se proto zaměřuje výhradně na svůj vlastní kód.

Nemůže nastat – Kód je velmi často dodatečně upravován, takže mohou nastat i situace, které byly původně „nemožné“. Proto je vhodné uvažovat o „nemožných situacích“ jen jako o vysoce nepravděpodobných.[7] Vývojář pak musí vymyslet, jak zpracovávat i ty případy, které jsou vysoce nepravděpodobné a toto zpracovávání implementovat.

Robustní strojové učení

Pod robustním strojovým učením se typicky chápe robustnost algoritmů strojového učení. Aby byl algoritmus strojového učení považován za robustní, musí být buď testovací chyby konzistentní s tréninkovými chybami, nebo po přidání určitého šumu do datového souboru musí být zachována výkonnost.[8]

Robustní návrh sítě

Robustní návrh sítě je studie návrhu sítě při proměnných nebo nejistých požadavcích.[9] V jistém smyslu je robustnost v návrhu sítě stejně široká jako robustnost návrhu softwaru kvůli rozsáhlým možnostem změn a vstupů.

Robustní algoritmy

Existují algoritmy, které tolerují chyby vstupu[10] nebo během výpočtu.[11] V tomto případě výpočet nakonec konverguje ke správnému výsledku. Tento jev se nazývá „přitažlivost správnosti“ (anglicky correctness attraction).[11]

Odkazy

Reference

V tomto článku byl použit překlad textu z článku Robustness (computer science) na anglické Wikipedii.

  1. A Model-Based Approach for Robustness Testing [online]. [cit. 2020-08-21]. Dostupné online. 
  2. a b 1990. IEEE Standard Glossary of Software Engineering Terminology, IEEE Std 610.12-1990 definuje robustnost jako „Míru, do niž systém nebo komponenta může správně fungovat v přítomnosti neplatných vstupů nebo za mezních podmínek“
  3. BAKER, Jack W.; SCHUBERT, Matthias; FABER, Michael H. On the assessment of robustness. Structural Safety. 2008, roč. 30, s. 253–267. Dostupné online [cit. 2020-08-21]. DOI 10.1016/j.strusafe.2006.11.004. 
  4. a b c d e f g Gerald Jay Sussman. Building Robust Systems an essay [online]. 2007-01-13 [cit. 2020-08-21]. Dostupné v archivu pořízeném dne 2017-08-12. 
  5. JOSEPH, Joby. Importance of Making Generalized Testcases - Software Testing Club - An Online Software Testing Community [online]. Software Testing Club, 2009-09-21 [cit. 2020-08-21]. Dostupné v archivu pořízeném z originálu. 
  6. Agents on the wEb: Robust Software. Building Robust Systems an essay [online]. [cit. 2020-08-21]. Dostupné online. 
  7. a b c d e f Robust Programming [online]. [cit. 2020-08-21]. Dostupné online. 
  8. El Sayed Mahmoud. What is the definition of the robustness of a machine learning algorithm? [online]. ResearchGate [cit. 2020-08-21]. Dostupné online. 
  9. Robust Network Design [online]. [cit. 2020-08-21]. Dostupné v archivu pořízeném dne 2016-09-09. 
  10. CARBIN, Michael; RINARD, Martin C. Proceedings of the 19th international symposium on Software testing and analysis - ISSTA '10. [s.l.]: ACM, 2010-07-12. ISBN 9781605588230. DOI 10.1145/1831708.1831713. Kapitola Automatically identifying critical input regions and code in applications, s. 37–48. 
  11. a b DANGLOT, Benjamin; PREUX, Philippe; BAUDRY, Benoit; MONPERRUS, Martin. Correctness attraction: a study of stability of software behavior under runtime perturbation. Empirical Software Engineering. 2017-12-21, roč. 23, čís. 4, s. 2086–2119. Dostupné online. DOI 10.1007/s10664-017-9571-8. arXiv 1611.09187. 

Související články