Permalänk
Medlem
Skrivet av CyberVillain:

Har de inte uppfunnit tester i flygbranschen ännu?

I och med att du drar flygbranschen över en kam så är det bara konstatera att flygbranschen har haft tester länge och bidragit till mycket av dom metodiker du använder för testning i din kodning sen att man kan bryta ner det till delområden och grupperingar där testningar är mer ovanligt är lika sant i flygbranschen som i all andra branscher där programmering förekommer.

Permalänk
Datavetare
Skrivet av CyberVillain:

Har de inte uppfunnit tester i flygbranschen ännu?

Tja, har du 100% state coverage (alla permutationer av alla brancher har körts minst en gång av ett test) på dina unit-tester vilket är ett krav för level A, högsta nivå där en defekt antas kunna vara katastrofal "Catastrophic - Failure may cause multiple fatalities, usually with loss of the airplane.".

Frågan är om de unit-tester du normal skriver ens klarar level C "Failure significantly reduces the safety margin or significantly increases crew workload. May result in passenger discomfort (or even minor injuries).". Där krävs bara att man har 100% line-coverage, en rad som inte körs av något test får inte finnas med, vilket då inkluderar alla felfall, loggning etc.

Varje sats du skriver som ska klara DO-178C måste ha en förklaring till varför den behövs och varför den utför sin uppgift korrekt. Denna förklaring skrivs på ett format som gör att man kan automatisk generera beroendeträd till/från en högnivåbeskriving ner till varje enskild rad. Gissar att du har det i dina program också eftersom de tydligen testas betydligt grundligare än kod för flygindustrin.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare
Skrivet av Teknocide:

Jag är intresserad av varför, inte att.

Har grävt lite och enda jag hittar är att det baserar sig på statisk och erfarenhet, man hittade helt enkelt oftare buggar i konstruktioner med "?:" än när det skrevs mer explicit. Hittar däremot inte om man jämfört om det är originalförfattaren av koden som oftare gör ett fel eller om det är så att "?:" oftare missförstås av andra när de ska sätta sig in i koden för att göra en ändring/tillägg.

Tycker det är rätt viktigt att separera dessa fall. Det är t.ex. inte speciellt att skriva Perl, men det är fan så svårt att begripa vad någon annan kokat ihop eller ens förstå sin egen kod efter ett tag

Skrivet av Teknocide:

Jag ser inte hur det skulle vara bättre. Jag kan hålla med dig om att det är konstigt att char konverteras till int (och double!) men det har inget att göra med vare sig typinferens eller ?:.

Korrekt, det har att göra med att implicit typ-konvertering är i princip alltid en dålig idé (vilket är orsaken till att kodingstandard för C i "manuellt" fått förbjuda sådant i kritiska program). Blir dock en ännu sämre idé ihop med typinferens och hur "?:" normalt beter sig.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Härligt och se att en så simpel fråga kan få igång dessa diskussionerna

Visa signatur

Console: Xbox Series X TV: Samsung Q70T 4K 120HZ Headset: Turtle Beach Stealth 700 Gen 2

Permalänk
Avstängd
Skrivet av Yoshman:

Frågan är om de unit-tester du normal skriver ens klarar level C "Failure significantly reduces the safety margin or significantly increases crew workload. May result in passenger discomfort (or even minor injuries).". Där krävs bara att man har 100% line-coverage, en rad som inte körs av något test får inte finnas med, vilket då inkluderar alla felfall, loggning etc.

Jag jobbar alltid med TDD och BDD som grundprincip, att skriva bra tester och bra testdriven/testbar kod är det som skiljer en junior/hacker och en senior utvecklare, i den kod vi diskuterat är det ganska lätt att skapa ett för. Dock brukar jag hellre blackboxtesta kod som denna och se till att detta övergripande test testar denna underliggande logiken. Många nybörjare testar metoder istället för som de borda testa beteende

edit: Jag kan faktiskt inte se hur ? skulle göra koden med svårläst tex

assembly = assembly ?? Assembly.GetEntryAssembly();

vs

if(assembly == null) { assembly = Assembly.GetEntryAssembly(); }

Visa signatur
Permalänk
Medlem

Jag tycker det är givet att det är svårare.

Citat:

assembly är lika med assembly frågetecken Assembly.GetEntryAssembly();

Citat:

Om assembly är lika med null ska assembly vara lika med Assembly.GetEtnryAssembly();

Jag är möjligen lite underlig, men ju mer likt vanlig skriven text kod är, desto lättare är det för mig att tolka den omedelbart. Jag har läst betydligt mer fritext än jag har läst kod i mina dagar och jag läser fritext oändligt mycket fortare.

Ja gillar när det är tydligt och konsekvent. Till exempel alltid skriva måsvingar, även när man "inte behöver det" och att inte skriva ? : - Varför ibland skriva på ett sätt och ibland på ett annat? Lika bra att hålla sig till ett sätt, hela tiden, konsekvent.

Eftersom man sällan kan använda sig av shorthanden konsekvent i all kod, tycker jag inte man ska använda det alls faktiskt. Men som sagt, jag gillar verbös kod och konsekvens. Jag tror närapå orubbligt att ju närmare vanligt skrivet eller talat språk man gör sin kod, desto lättare är det att förstå den och att det minskar antalet buggar. Hade jag kunnat hade jag bytt ut alla "<" och ">" med LESS THAN och GREATER THAN t.ex. hehe.

Permalänk
Avstängd
Skrivet av Ernesto:

Jag tycker det är givet att det är svårare.
Jag är möjligen lite underlig, men ju mer likt vanlig skriven text kod är, desto lättare är det för mig att tolka den omedelbart. Jag har läst betydligt mer fritext än jag har läst kod i mina dagar och jag läser fritext oändligt mycket fortare.

Ja gillar när det är tydligt och konsekvent. Till exempel alltid skriva måsvingar, även när man "inte behöver det" och att inte skriva ? : - Varför ibland skriva på ett sätt och ibland på ett annat? Lika bra att hålla sig till ett sätt, hela tiden, konsekvent.

Eftersom man sällan kan använda sig av shorthanden konsekvent i all kod, tycker jag inte man ska använda det alls faktiskt. Men som sagt, jag gillar verbös kod och konsekvens. Jag tror närapå orubbligt att ju närmare vanligt skrivet eller talat språk man gör sin kod, desto lättare är det att förstå den och att det minskar antalet buggar. Hade jag kunnat hade jag bytt ut alla "<" och ">" med LESS THAN och GREATER THAN t.ex. hehe.

Okej så du använder inte lambda heller?

var validData = data.Where(d => d.IsValid);

Visa signatur
Permalänk
Datavetare
Skrivet av Ernesto:

Jag är möjligen lite underlig, men ju mer likt vanlig skriven text kod är, desto lättare är det för mig att tolka den omedelbart. Jag har läst betydligt mer fritext än jag har läst kod i mina dagar och jag läser fritext oändligt mycket fortare.

Ja gillar när det är tydligt och konsekvent. Till exempel alltid skriva måsvingar, även när man "inte behöver det" och att inte skriva ? : - Varför ibland skriva på ett sätt och ibland på ett annat? Lika bra att hålla sig till ett sätt, hela tiden, konsekvent.

Eftersom man sällan kan använda sig av shorthanden konsekvent i all kod, tycker jag inte man ska använda det alls faktiskt. Men som sagt, jag gillar verbös kod och konsekvens. Jag tror närapå orubbligt att ju närmare vanligt skrivet eller talat språk man gör sin kod, desto lättare är det att förstå den och att det minskar antalet buggar. Hade jag kunnat hade jag bytt ut alla "<" och ">" med LESS THAN och GREATER THAN t.ex. hehe.

Tror du är inne på exakt varför det har visat sig att "?:" rent statiskt visat sig ge fler buggar än "if (pred)...", det går att konsekvent använda det andra sättet och många utvecklare använder endast den metoden vilket leder till att andra är mer van men den konstruktionen.

Just att en viss typ av konstruktion ska vara konsekvent är en stor orsak till många designval i Go, men fick ändå känslan att anledningen till att man utelämnade "?:" hade mer att göra med vilken typ av konstruktioner man flera gånger sätt folk gjort, konstruktioner som skulle bli mer uppenbart dåliga med "if...".

Det du skriver om måsvingar är en sak som dels är ett krav i alla kod-standarder jag sett för säkerhetskritisk kod + Go just för konsekvens och att det inte helt sällan leder till buggar senare valde att kräva måsvingar även om det bara är en sats i blocket.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare
Skrivet av CyberVillain:

Jag jobbar alltid med TDD och BDD som grundprincip, att skriva bra tester och bra testdriven/testbar kod är det som skiljer en junior/hacker och en senior utvecklare, i den kod vi diskuterat är det ganska lätt att skapa ett för. Dock brukar jag hellre blackboxtesta kod som denna och se till att detta övergripande test testar denna underliggande logiken. Många nybörjare testar metoder istället för som de borda testa beteende

Fast vad bevisar du med TDD och BDD? Har kan du garantera 100% line-coverage i alla filer, 100% branch-coverage eller till och med 100% state-coverage i alla funktioner? Kan du garantera det någonstans, i så fall hur kan du formellt bevisa det? Allt detta är saker som standarder för säkerhetskritisk kod har rutiner och specifikationer för, MTBF på kod som är bara är certifierad till t.ex. DO-178C nivå C är så brutalt mycket högre än vad man normalt ser i industrin så även om det finns tester kan man undra vad de testar egentligen.

Vad är man då om man fixar att skriva tester för DO-178C level A? Zen-master of testing

Skrivet av CyberVillain:

edit: Jag kan faktiskt inte se hur ? skulle göra koden med svårläst tex

assembly = assembly ?? Assembly.GetEntryAssembly();

vs

if(assembly == null) { assembly = Assembly.GetEntryAssembly(); }

Som jag skrev innan, vet inte varför det är så. Men statistiken visar tydligen att något gör att det oftare leder till buggar.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av CyberVillain:

Okej så du använder inte lambda heller?

var validData = data.Where(d => d.IsValid);

Jag använder i stort sett bara lambda och "aldrig" (man ska aldrig säga aldrig):

var validData = (from item in allData select item where item.IsValid)

Jag skriver även väldigt ofta

if(valid == true) { }

Helt onödigt med == true givetvis, speciellt när variabeln heter valid, men det följer lite min lite knasiga besatthet att vara verbal.

Oftast blir det ju dock i motsatsen. !valid skriver jag i stort sett aldrig, utan där blir det närapå alltid valid == false - Tycker att "== false" sticker ut och syns bättre än utropstecknet

Permalänk
Avstängd

Du borde byta språk till VB

Visa signatur
Permalänk
Avstängd
Skrivet av Yoshman:

Som jag skrev innan, vet inte varför det är så. Men statistiken visar tydligen att något gör att det oftare leder till buggar.

Skulle jag gärna vilja veta, koden tar exakt lika många vägar så det är ingen skillnad i risk för fel. ?? ersätter bara if(assembly == null)

Mao ord måste logiken i båda fallen ha tester för att säkerställa output, dock brukar jag inte testa att koden gör exakt detta utan istället blackboxa testet och kolllar på att beteendet stämmer.

Visa signatur
Permalänk
Avstängd
Skrivet av Ernesto:

Oftast blir det ju dock i motsatsen. !valid skriver jag i stort sett aldrig, utan där blir det närapå alltid valid == false - Tycker att "== false" sticker ut och syns bättre än utropstecknet

Jag tycker att dubbelnegation är farligt typ

if(notValid == false) {}

men ser inget problem med

var valid = !data.Any(d => d.InValid)); if(valid) {}

Dock ganska sällsynd att ha en InValid flagga istället för en Valid

Visa signatur
Permalänk
Datavetare
Skrivet av CyberVillain:

Skulle jag gärna vilja veta, koden tar exakt lika många vägar så det är ingen skillnad i risk för fel. ?? ersätter bara if(assembly == null)

Mao ord måste ogiken i båda fallen ha tester för att säkerställa output, dock brukar jag inte testa att koden gör exakt detta utan istället blackboxa testet och kolllar på att beteendet stämmer.

Som Ernesto påpekar, kanske bara har med vana och det faktum att konsekvent använda ett sätt är i praktiken bättre än försöka ha lite godtyckliga regler kring vad som är bäst vid varje givet tillfälle.

Med andra ord så skulle det möjligen kunna fungera precis lika bra med "?:" om man bara använder det. Problemet kommer väl när man har funktioner/metoder som bara anropas för deras sidoeffekter (return void), blir rätt krystat med "?:" då om man gjorde det möjligt. Lisp är ju ett exempel på ett språk när man bara har motsvarande "?:", nu vet jag ingenstans man kör säkerhetskritisk kod i Lisp men rent generellt så verkar Lisp-språk leda till enkel kod (enkelt -> typiskt bra).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Avstängd

Det håller jag med om, ett produktföretag eller ett projekt ska köra med en standard som alla i projektet/företaget följer, tex via att

Köra Resharper med samma config fil. Men att en säkerhetsstandard har åsikter om saker som inte spelar roll för säkerheten verkar bara dumt.

Sedan i fallet med ? ?? eller if-sats så kan ju svaret bara vara true : false, och vägen att få true eller false är ofta ganska begränsad så det är enkelt att skriva testfall för det. Men som sagt man ska unvidka kodnära tester utan istället BDD-testa istället. Gärna med ett testverktyg som använder metadata/syntax som Kravavdelningen kan förstå, tex .NET Specflow.

Ett testfall skriven i ett sådant verkyg är ca 2000% bättre än ett Krav skrivet i text

Visa signatur
Permalänk
Datavetare
Skrivet av CyberVillain:

Det håller jag med om, ett produktföretag eller ett projekt ska köra med en standard som alla i projektet/företaget följer, tex via att

Köra Resharper med samma config fil. Men att en säkerhetsstandard har åsikter om saker som inte spelar roll för säkerheten verkar bara dumt.

Sedan i fallet med ? ?? eller if-sats så kan ju svaret bara vara true : false, och vägen att få true eller false är ofta ganska begränsad så det är enkelt att skriva testfall för det. Men som sagt man ska unvidka kodnära tester utan istället BDD-testa istället. Gärna med ett testverktyg som använder metadata/syntax som Kravavdelningen kan förstå, tex .NET Specflow.

Ett testfall skriven i ett sådant verkyg är ca 2000% bättre än ett Krav skrivet i text

Tror du överhuvudtaget inte inser vilken nivå testning ligger på för säkerhetskritiska applikationer. Specflow är säkert helt OK givet den nivån man normal sett håller på källkod, men att jämföra den med testningen som t.ex. DO-178C kräver blir bara fånigt.

Kan du i de tester du skriver ta fram exakt vilka tester som exekverar en viss rad i produkten? Kan du ta fram exakt vilken/vilka tester som får en viss "if()" att ta true resp. false fallet? Kan du bevisa att varenda rad i produkten har körts minst en gång av dina tester, och så krävs, ta fram exakt vilka tester som körde en viss rad?

Samma sak för specifikationer. För varje uppgift som en modul har, kan du ta fram exakt vilka rader som kan tänkas köra för att utföra uppgiften? Eller omvänt, för en valfri rad i koden, kan du plocka fram alla uppgifter/högnivåfunktioner som beror av den raden?

Som aluser påpekar, flygindustrin och även andra grupper där fel i programvara kan orsaka väldigt allvarliga skada har tagit testning till en nivå som majoriteten av de som jobbar med programvara överhuvudtaget inte ens kan föreställa sig.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Avstängd
Skrivet av Yoshman:

Tror du överhuvudtaget inte inser vilken nivå testning ligger på för säkerhetskritiska applikationer. Specflow är säkert helt OK givet den nivån man normal sett håller på källkod, men att jämföra den med testningen som t.ex. DO-178C kräver blir bara fånigt.

Kan du i de tester du skriver ta fram exakt vilka tester som exekverar en viss rad i produkten? Kan du ta fram exakt vilken/vilka tester som får en viss "if()" att ta true resp. false fallet? Kan du bevisa att varenda rad i produkten har körts minst en gång av dina tester, och så krävs, ta fram exakt vilka tester som körde en viss rad?

Samma sak för specifikationer. För varje uppgift som en modul har, kan du ta fram exakt vilka rader som kan tänkas köra för att utföra uppgiften? Eller omvänt, för en valfri rad i koden, kan du plocka fram alla uppgifter/högnivåfunktioner som beror av den raden?

Som aluser påpekar, flygindustrin och även andra grupper där fel i programvara kan orsaka väldigt allvarliga skada har tagit testning till en nivå som majoriteten av de som jobbar med programvara överhuvudtaget inte ens kan föreställa sig.

VS har mycket bra inbyggt stöd för codecoverge sedan finns ju det en uppsjö av plugins.
Min poäng var ju iof att exemplet, if,??, ? Är ganska lättlätttestat just för att koden inte kan ta så många vägar.

Du får ge mig lite bättre argument varför ?? Och ? Skulle medföra fler buggar

Skickades från m.sweclockers.com

Visa signatur
Permalänk
Medlem
Skrivet av Ernesto:

Jag tycker det är givet att det är svårare.

Jag är möjligen lite underlig, men ju mer likt vanlig skriven text kod är, desto lättare är det för mig att tolka den omedelbart. Jag har läst betydligt mer fritext än jag har läst kod i mina dagar och jag läser fritext oändligt mycket fortare.

Ja gillar när det är tydligt och konsekvent. Till exempel alltid skriva måsvingar, även när man "inte behöver det" och att inte skriva ? : - Varför ibland skriva på ett sätt och ibland på ett annat? Lika bra att hålla sig till ett sätt, hela tiden, konsekvent.

Eftersom man sällan kan använda sig av shorthanden konsekvent i all kod, tycker jag inte man ska använda det alls faktiskt. Men som sagt, jag gillar verbös kod och konsekvens. Jag tror närapå orubbligt att ju närmare vanligt skrivet eller talat språk man gör sin kod, desto lättare är det att förstå den och att det minskar antalet buggar. Hade jag kunnat hade jag bytt ut alla "<" och ">" med LESS THAN och GREATER THAN t.ex. hehe.

Mycket intressant tråd. Som tur är har TS fått svar högst upp i tråden...

En input från en som jobbar mot/med läkemedelsindustrin samt flygindustrin.

Kod som är lätt att läsa för ej insatta i kodning är mycket trevligt. Enkelt att förklara vad som sker. Måsvingarna, beroende på språk, och luft i koden är givet. Koden skall kanske förvaltas i 20 år. Testa att öppna ett projekt du gjort för tre år sedan... Jag kan bli sittande flera timmar och undra hur sjutton tänkte jag vid det tillfället. Och varför har jag skrivit så där.

Sedan tycker jag som insatt programmerare att det går snabbare att använda ? och ?? för mina behov. Autotester testar ofta bara funktionen av koden. Den bryr sig inte om utseendet. Om ni inte lägger till detta som en del av testen.

Ofta har våra kunder en färdig kodstandard att följa. Som kanske bygger på något officiellt dokument från flygindustrin eller annat organ.

Tänk också att flyg-/läkemedelsindustri inte enbart arbetar med textkod. LabView är rätt stort vid utvecklingsmomenten.

Skickades från m.sweclockers.com

Visa signatur

Lill-server(2010): SFF NAS Zotac H55ITX-C-E, Lian Li PC-Q08B, Intel Core i3 540
Stor-server(2014): SuperMicro X10SL7-F, 20GB ECC RAM, 4x2TB WD Green, E3-1230v3, 2xIntel Dual Gigabit Nic

Permalänk
Avstängd

Googla BDD, med den principen testar man beteendet inte koden.

Det kommer alltid finns kod du inte direkt förstår 2 år senare, men en bra utvecklare håller ner antalet sådana. Oftast är det någon konstig business-regel

Skickades från m.sweclockers.com

Visa signatur
Permalänk
Medlem
Skrivet av Ernesto:

Jag tycker det är givet att det är svårare.

Om man inte är van vid något så verkar det svårare. Du tycker förmodligen att CLISP är svårare än C++ också, vilket inte nödvändigtvis gör CLISP krångligare i sig.

Skrivet av Ernesto:

Jag är möjligen lite underlig, men ju mer likt vanlig skriven text kod är, desto lättare är det för mig att tolka den omedelbart. Jag har läst betydligt mer fritext än jag har läst kod i mina dagar och jag läser fritext oändligt mycket fortare.

Ja gillar när det är tydligt och konsekvent. Till exempel alltid skriva måsvingar, även när man "inte behöver det" och att inte skriva ? : - Varför ibland skriva på ett sätt och ibland på ett annat? Lika bra att hålla sig till ett sätt, hela tiden, konsekvent.

?: är ett uttryck medan if-then-else är sats(er). De må påminna om varandra men används inte på samma sätt.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Ada, som just används ganska mycket av flygindustri o.s.v. för säkerhetskritiska applikationer, hade in i det längsta inte if-expressions av anledningen att den inte behövs, och att man bör undvika att lägga till onödiga funktioner som riskerar att introducera fel utan att tillföra något mervärde i exekverad kod.

I säkerhetskritiska applikationer så skriver en kodare i snitt en (1) rad produktionskod per dag om man slår ut det över hela projektet. Verbositet är därför ganska sällan ett stort problem, så även om man bara minskar antalet buggar med 1% så är det en nästan gratis förbättring.

Ada 2012 la till if-expressions tillsist på formen (if X>0 then B else C) (Observera de obligatoriska paranteserna) mestadels på grund utav att det eliminerar behovet för att skriva kod som (från dokumentationen):
Febdays: constant := Boolean'Pos(Leap)*29 + Boolean'Pos(not Leap)*28;
Nu kan man istället skriva
Febdays: constant := (if Leap then 29 else 28);

En stor anledning till att Ternary operatorn i C (och deriverade språk) anses problematisk är kopplat till flera saker, inte minst att man kan assigna i expressions, och att booleans använder integervärden.

Visa signatur

CPU: Intel Core i5 4770k @~4.3Ghz GPU: Zotac GTX 970 SLi Nättagg:Corsair AX 1200W 80+ Gold Chassi: Define R4 SSD: Intel SSD 520 240gb RAM: 4xCorsair XMS3 1600MHz