Solidność (informatyka)
Systemy złożone |
---|
Tematy |
W informatyce odporność to zdolność systemu komputerowego do radzenia sobie z błędami podczas wykonywania i radzenia sobie z błędnymi danymi wejściowymi . Solidność może obejmować wiele obszarów informatyki, takich jak solidne programowanie , niezawodne uczenie maszynowe i solidna sieć zabezpieczeń . Techniki formalne, takie jak testowanie rozmyte , są niezbędne do wykazania odporności, ponieważ tego typu testowanie wymaga nieprawidłowych lub nieoczekiwanych danych wejściowych. Alternatywnie, wtrysk usterek można wykorzystać do sprawdzenia wytrzymałości. Różne produkty komercyjne przeprowadzają testy odporności na analizę oprogramowania.
Wstęp
Ogólnie rzecz biorąc, budowanie solidnych systemów obejmujących każdy punkt możliwej awarii jest trudne ze względu na ogromną liczbę możliwych wejść i ich kombinacji. Ponieważ testowanie wszystkich danych wejściowych i ich kombinacji wymagałoby zbyt dużo czasu, programiści nie są w stanie wyczerpująco przejrzeć wszystkich przypadków. Zamiast tego deweloper będzie próbował uogólniać takie przypadki. Załóżmy na przykład, że wprowadzasz wartości całkowite . Niektóre wybrane dane wejściowe mogą składać się z liczby ujemnej, zera i liczby dodatniej. Używając tych liczb do testowania oprogramowania w ten sposób, programista uogólnia zbiór wszystkich liczb rzeczywistych na trzy liczby. Jest to metoda bardziej wydajna i łatwiejsza w zarządzaniu, ale bardziej podatna na awarie. Uogólnianie przypadków testowych jest przykładem tylko jednej techniki radzenia sobie z niepowodzeniem — w szczególności niepowodzeniem spowodowanym nieprawidłowymi danymi wprowadzonymi przez użytkownika. Ogólnie rzecz biorąc, systemy mogą również zawodzić z innych powodów, takich jak odłączenie od sieci.
Niezależnie od tego, złożone systemy powinny nadal sprawnie obsługiwać wszelkie napotkane błędy. Przykładów takich skutecznych systemów jest wiele. Niektóre z najbardziej niezawodnych systemów można ewoluować i można je łatwo dostosować do nowych sytuacji.
Wyzwania
Programy i oprogramowanie to narzędzia skupione na bardzo konkretnym zadaniu, a co za tym idzie, nie są uogólnione i elastyczne. Jednak obserwacje w systemach takich jak Internet czy systemy biologiczne wykazują przystosowanie się do ich środowiska. Jednym ze sposobów adaptacji systemów biologicznych do środowiska jest redundancja. Wiele narządów u człowieka jest zbędnych. Nerka z takich przykładów. Ludzie zazwyczaj potrzebna jest tylko jedna nerka, ale posiadanie drugiej nerki stwarza miejsce na niepowodzenia. Tę samą zasadę można zastosować do oprogramowania, ale wiążą się z tym pewne wyzwania. Stosując zasadę redundancji w informatyce, nie sugeruje się ślepego dodawania kodu. Ślepe dodawanie kodu wprowadza więcej błędów, sprawia, że system jest bardziej złożony i trudniejszy do zrozumienia. Kod, który nie zapewnia żadnego wzmocnienia już istniejącego kodu, jest niepożądany. Zamiast tego nowy kod musi posiadać równoważną funkcjonalność , aby w przypadku uszkodzenia funkcji inny kod zapewniający tę samą funkcję mógł ją zastąpić, ręcznie lub automatycznie różnorodność oprogramowania . Aby to zrobić, nowy kod musi wiedzieć, jak i kiedy uwzględnić punkt awarii. do systemu należy dodać więcej logiki . Jednak gdy system dodaje więcej logiki, komponentów i zwiększa rozmiar, staje się coraz bardziej złożony. Zatem tworząc bardziej nadmiarowy system, staje się on również bardziej złożony, a programiści muszą rozważyć zrównoważenie nadmiarowości ze złożonością.
Obecnie praktyki informatyczne nie skupiają się na budowaniu solidnych systemów. Raczej skupiają się na skalowalności i wydajności . Jednym z głównych powodów, dla których nie skupia się dziś uwagi na solidności, jest to, że ogólnie jest to trudne.
Obszary
Solidne programowanie
Programowanie solidne to styl programowania, który koncentruje się na obsłudze nieoczekiwanego zakończenia i nieoczekiwanych działań. Wymaga kodu, który sprawnie obsłuży te zakończenia i akcje, wyświetlając dokładne i jednoznaczne komunikaty o błędach . Te komunikaty o błędach umożliwiają użytkownikowi łatwiejsze debugowanie programu.
Zasady
- Paranoja
- Tworząc oprogramowanie, programista zakłada, że użytkownicy chcą złamać swój kod. Programista zakłada również, że jego własny napisany kod może zawieść lub działać nieprawidłowo.
- Głupota
- Programista zakłada, że użytkownicy będą próbować wprowadzić nieprawidłowe, fałszywe i zniekształcone dane wejściowe. W konsekwencji programista zwraca użytkownikowi jednoznaczny, intuicyjny komunikat o błędzie, który nie wymaga sprawdzania kodów błędów. Komunikat o błędzie powinien być jak najbardziej dokładny i nie wprowadzać użytkownika w błąd, aby umożliwić łatwe rozwiązanie problemu.
- Niebezpieczne narzędzia
- Użytkownicy nie powinni uzyskiwać dostępu do bibliotek , struktury danych lub wskaźniki do struktur danych. Informacje te powinny być ukryte przed użytkownikiem, aby użytkownik ich przypadkowo nie zmodyfikował i nie wprowadził błędu do kodu. Gdy takie interfejsy zostaną poprawnie zbudowane, użytkownicy będą z nich korzystać, nie znajdując luk umożliwiających modyfikację interfejsu. Interfejs powinien być już poprawnie zaimplementowany, aby użytkownik nie musiał wprowadzać modyfikacji. Użytkownik skupia się zatem wyłącznie na swoim własnym kodzie.
- To nie może się zdarzyć
- Bardzo często kod jest modyfikowany i może wprowadzić możliwość wystąpienia „niemożliwego” przypadku. Dlatego też zakłada się, że przypadki niemożliwe są wysoce nieprawdopodobne. Deweloper myśli o tym, jak poradzić sobie z przypadkiem, który jest wysoce nieprawdopodobny, i odpowiednio wdraża tę obsługę.
Solidne uczenie maszynowe
Solidne uczenie maszynowe zazwyczaj odnosi się do niezawodności algorytmów uczenia maszynowego. Aby algorytm uczenia maszynowego można było uznać za solidny, błąd testowania musi być zgodny z błędem uczenia lub wydajność jest stabilna po dodaniu szumu do zbioru danych. W ostatnim czasie, wraz ze wzrostem ich popularności, rośnie zainteresowanie wytrzymałością sieci neuronowych. Dzieje się tak zwłaszcza ze względu na ich podatność na ataki niekorzystne.
Solidna konstrukcja sieci
Solidne projektowanie sieci to nauka o projektowaniu sieci w obliczu zmiennych lub niepewnych wymagań. W pewnym sensie solidność w projektowaniu sieci jest szeroka, podobnie jak solidność w projektowaniu oprogramowania ze względu na ogromne możliwości zmian lub danych wejściowych.
Solidne algorytmy
Istnieją algorytmy tolerujące błędy na wejściu.