Inom datavetenskap (informatik) är tillförlitlighet ett datorsystems förmåga att klara av felaktiga data och fel under utförandet av uppgifter [1] [2] . Tillförlitlighet kan täcka många områden inom datavetenskap , till exempel pålitlig programmering, pålitlig maskininlärning och pålitlig nätverkssäkerhet. Formella metoder som fuzzy testning är viktiga för att visa tillförlitlighet eftersom denna typ av testning involverar felaktiga eller oväntade indata. Alternativt kan ett körande systemfel användas för att testa stabiliteten. Olika kommersiella produkter utför tillförlitlighetstester genom mjukvaruanalys [3] .
Generellt sett är det svårt att skapa tillförlitliga system som täcker varje punkt av möjliga fel på grund av det enorma antalet möjliga indata och deras kombinationer [4] . Eftersom det skulle ta för lång tid att testa alla indata och deras kombinationer, kan utvecklare inte uttömmande undersöka alla fall. Istället kommer utvecklaren att försöka generalisera sådana fall [5] . Tänk dig till exempel att du anger heltalsvärden . Vissa valda ingångar kan bestå av ett negativt tal, noll och ett positivt tal. Genom att använda dessa siffror för att testa programvara på detta sätt generaliserar utvecklaren uppsättningen av alla fall till tre siffror. Detta är en mer effektiv och hanterbar metod, men mer benägen att misslyckas. Testfallsgeneralisering är ett exempel på bara en metod för att hantera ett felproblem, nämligen ett fel på grund av ogiltig användarinmatning. System kan vanligtvis också misslyckas av andra orsaker, som att kopplas bort från nätet.
Trots detta måste komplexa system hantera eventuella fel. Det finns många exempel på sådana framgångsrika system. Några av de mest robusta systemen är under utveckling och kan lätt anpassas till nya situationer [4] .
Program och mjukvara är verktyg inriktade på en mycket specifik uppgift och är därför inte generaliserade och flexibla [4] . Observationer av system som Internet eller biologiska system visar dock en så viktig egenskap som anpassning till miljön . Ett sätt att anpassa biologiska system till miljön är att använda redundans [4] . Många organ är funktionellt överflödiga i en biologisk organism. Till exempel är njuren ett sådant exempel. Människor behöver vanligtvis bara en njure, men att ha en andra njure bevarar kroppens förmåga när den första misslyckas. Samma princip kan tillämpas på programvara, men det finns några problem. När principen om redundans tillämpas på datavetenskap avråds tillägg av blind kod. Att blindt lägga till kod leder till fler buggar, komplicerar systemet och gör det svårare att förstå [6] . Kod som inte ger förstärkning för redan befintlig kod är inte önskvärd. Istället måste den nya koden ha motsvarande funktionalitet så att om en funktion går sönder kan kod som ger samma funktion ersätta den med manuellt eller automatiskt programavstånd. För att göra detta måste den nya koden veta hur och när man ska beakta punkten för fel [4] . Detta innebär att mer logik måste läggas till i systemet. Men när systemet lägger till mer logik, komponenter och växer i storlek, blir det mer och mer komplext. När man bygger ett mer redundant system blir det alltså också mer komplext, och designers måste överväga att balansera redundans med komplexitet.
För närvarande syftar datorteknik inte till att skapa tillförlitliga system [4] . Snarare tenderar de att fokusera på skalbarhet och effektivitet. En av huvudorsakerna till att reliabilitet försummas idag är att det är svårt att göra det på ett generellt sätt [4] .
tillförlitlig programmering är en programmeringsstil som fokuserar på att hantera oväntad uppsägning och oväntade åtgärder [7] . Specialkod används för att på ett elegant sätt hantera dessa slutföranden och åtgärder genom att visa exakta och entydiga felmeddelanden. Dessa felmeddelanden gör det lättare för användaren att anpassa programmet.
PrinciperParanoia - När man skapar mjukvara utgår programmeraren från att användare vill bryta sin kod. Programmeraren antar också att hans egen skrivna kod kanske inte fungerar eller fungerar felaktigt.
Dumhet - programmeraren antar att användare kommer att försöka skriva in felaktiga, falska och felaktiga data. Som en konsekvens returnerar programmeraren ett entydigt, intuitivt felmeddelande till användaren som inte behöver söka efter felkoder. Felmeddelandet ska vara så korrekt som möjligt utan att vilseleda användaren så att problemet enkelt kan åtgärdas.
Farliga verktyg – Användare ska inte komma åt bibliotek, datastrukturer eller pekare till datastrukturer. Denna information bör döljas för användaren så att användaren inte av misstag kan ändra den och införa ett fel i koden. När sådana gränssnitt är byggda på rätt sätt använder användarna dem utan att hitta kryphål för att ändra gränssnittet. Gränssnittet bör redan vara korrekt implementerat, så användaren behöver inte göra ändringar. Därför fokuserar användaren enbart på sin kod.
Kan inte hända - mycket ofta ändras koden och kan leda till det "omöjliga" fallet. Därför antas omöjliga fall vara extremt osannolika. Utvecklaren förstår hur man hanterar fall som är extremt osannolika och implementerar designen därefter.
Robust maskininlärning hänvisar i allmänhet till robustheten hos maskininlärningsalgoritmer. För att en maskininlärningsalgoritm ska anses tillförlitlig måste antingen testfelet matcha träningsfelet, eller så måste prestanda förbli stabil efter att ha lagt till lite brus till datasetet [8] .
Robust nätverksdesign är studiet av nätverksdesign under varierande eller osäkra krav [9] . På sätt och vis är tillförlitligheten i nätverksdesign lika bred som i mjukvarudesign, på grund av de stora möjligheterna till förändring eller input.
Det finns algoritmer som gör fel i indata [10] eller under beräkningar [11] . I det här fallet konvergerar beräkningarna så småningom till den korrekta slutsatsen. Detta fenomen har kallats "correctness attraction" (engelsk correctness attraction) [11] .
Programvara kvalitet | |||||
---|---|---|---|---|---|
Egenskaper |
| ||||
Standarder och rekommendationer |
| ||||
Processer och organisationer |
|