C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?

Permalänk
Medlem
Skrivet av Dimman:

Jag tror vi behöver vända på steken här; hur gör du för att verifiera att olika scenarion fungerar med dina lösningar?

Om du ger en bra förklaring hur du kan testa den här koden utan att behöva skriva testkod i två veckor så skall jag berätta

#20955298

enhetstester har troligen blivit poppis för det är lätt att förstå för chefer som inte kan programmera

använder tester men inte för att testa kod, de är bra för annat. exempelvis att låsa kod

Permalänk
Medlem
Skrivet av Dimman:

Jag tror vi behöver vända på steken här; hur gör du för att verifiera att olika scenarion fungerar med dina lösningar?

Vi har ställt den frågan och då gick dialogen ungefär så här:
- klk testar genom asserts -> lång diskussion om asserts.
- någon frågade om unit testning -> klk redogör en hel lista med missförstånd om unit testning.
- klk kör HN istället för testning -> lång diskussion om HN och varför HN inte ersätter testning.
- klk slänger ur sig att han återanvänder kod och kör applikationen istället för testning.
- någon frågade om vad klk menar med återanvändbar kod -> klk svara överlagring och lång diskussion om överlagring och klk svara tänk på en telefonbok istället för att svar "ja, det är function overloading jag syftar på".

@klk kör HN, asserts, återanvändbarkod ihop med att testköra det på sin dator, sedan sätter han sin stämpel på det och säger "trust me, bro".

Han har nämn regressionstestning men aldrig redogjort för hur han implementerar eller när han kör sina regressionstester.

Kort och gått så går @klk i cirklar och trollar...

Permalänk
Medlem
Skrivet av orp:

Vi har ställt den frågan och då gick dialogen ungefär så här:
- klk testar genom asserts -> lång diskussion om asserts.
- någon frågade om unit testning -> klk redogör en hel lista med missförstånd om unit testning.
- klk kör HN istället för testning -> lång diskussion om HN och varför HN inte ersätter testning.
- klk slänger ur sig att han återanvänder kod och kör applikationen istället för testning.
- någon frågade om vad klk menar med återanvändbar kod -> klk svara överlagring och lång diskussion om överlagring och klk svara tänk på en telefonbok istället för att svar "ja, det är function overloading jag syftar på".

@klk kör HN, asserts, återanvändbarkod ihop med att testköra det på sin dator, sedan sätter han sin stämpel på det och säger "trust me, bro".

Han har nämn regressionstestning men aldrig redogjort för hur han implementerar eller när han kör sina regressionstester.

Kort och gått så går @klk i cirklar och trollar...

tack för hjälpen

Permalänk
Medlem
Skrivet av klk:

Om du ger en bra förklaring hur du kan testa den här koden utan att behöva skriva testkod i två veckor så skall jag berätta

#20955298
...

Du beskriver att metoden gör följande:

* This method processes a list of regex patterns and applies them to the files stored in the cache. * It generates a list of lines in each file where the patterns are found and stores the results * in the "file-linelist" cache table.

Det låter väl som ett utmärkt tillfälle att plocka fram ett blandat set av input-data tillsammans med förväntad output-data, och sedan köra din metod på alltihop. Diffa output med expected output. Släng in några scenarior där input-data är felformaterad, eller annat som är fel och kolla så att din metod hanterar det som förväntat? Om du inte 100% happy-hackar så testar du ju precis på detta sättet manuellt redan.

Skrivet av klk:

...
enhetstester har troligen blivit poppis för det är lätt att förstå för chefer som inte kan programmera

använder tester men inte för att testa kod, de är bra för annat. exempelvis att låsa kod

Så du använder tester men inte för att testa kod, men för att låsa kod; den där får du nog utveckla för det makes no sense.

Skrivet av klk:

tack för hjälpen

Om du instämmer i beskrivningen av situationen som @orp la fram så finns det nog inte mycket mer att diskutera, i något ämne

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem
Skrivet av Dimman:

Du beskriver att metoden gör följande:

* This method processes a list of regex patterns and applies them to the files stored in the cache. * It generates a list of lines in each file where the patterns are found and stores the results * in the "file-linelist" cache table.

Det låter väl som ett utmärkt tillfälle att plocka fram ett blandat set av input-data tillsammans med förväntad output-data, och sedan köra din metod på alltihop. Diffa output med expected output. Släng in några scenarior där input-data är felformaterad, eller annat som är fel och kolla så att din metod hanterar det som förväntat? Om du inte 100% happy-hackar så testar du ju precis på detta sättet manuellt redan.

Om jag skall skriva test för det så är jag uppe i två veckor eller i alla fall väldigt mycket extra tid, metoden tog en kväll och skriva och testa i debug. Föredrar att bli klar någon gång

Min teknik för att testa domänkod är vanligen att skripta upp applikationen, kan lägga in LUA kod men i aktuell kod jag visade har jag funderingar på att använda python, mest för att lära och testa nu när python har möjlighet att köra utan GIL'en.

Skripta applikationen gör det enklare att skriva test, kan till och med vara helt andra eller om man vill introducera nya utvecklare i något så kan sådant passa bra.

Skrivet av Dimman:

Så du använder tester men inte för att testa kod, men för att låsa kod; den där får du nog utveckla för det makes no sense.

För med enhetstest skapar du teknisk skuld och coupling, det låser kod.

Permalänk
Medlem
Skrivet av klk:

Om jag skall skriva test för det så är jag uppe i två veckar eller i alla fall väldigt mycket extra tid, metoden tog en kväll och skriva och testa i debug. Föredrar att bli klar någon gång

Min teknik för att testa domänkod är vanligen att skripta upp applikationen, kan lägga in LUA kod men i aktuell kod jag visade har jag funderingar på att använda python, mest för att lära och testa nu när python har möjlighet att köra utan GIL'en.

Skripta applikationen gör det enklare att skriva test, kan till och med vara helt andra eller om man vill introducera nya utvecklare i något så kan sådant passa bra.

För med enhetstest skapar du teknisk skuld och coupling, det låser kod.

Jag vet inte varför du maniskt fastnat vid unit-testning och att allt skulle handla om det, men jag har förstått att du alltså testar lite manuellt när du skriver koden och sen är det färdigt där. Det funkar för dig, du är nöjd och du tycker alla borde jobba på det viset. Du anser att allt annat är slöseri med tid. Alla som tänker annorlunda är inte på samma intellektuella nivå som dig och besitter inte din kunskap; man har helt enkelt inte förstått saker på den nivån du förstår. Är det en ungefärligt korrekt sammanfattning?

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem
Skrivet av Dimman:

Jag vet inte varför du maniskt fastnat vid unit-testning och att allt skulle handla om det, men jag har förstått att du alltså testar lite manuellt när du skriver koden och sen är det färdigt där. Det funkar för dig, du är nöjd och du tycker alla borde jobba på det viset. Du anser att allt annat är slöseri med tid. Alla som tänker annorlunda är inte på samma intellektuella nivå som dig och besitter inte din kunskap; man har helt enkelt inte förstått saker på den nivån du förstår. Är det en ungefärligt korrekt sammanfattning?

Nej, och enhetstestning använder jag inte för att det är för dåligt. Det existerar inte utvecklare som kan skriva test så att koden är säker och priset för enhetstester är för högt, på tok för högt.

Enhetstester är alltså en dålig metod, spelar ingen roll vad du säger (eller någon annan). Skulle man anse det vara en bra metod beror det oftast på att man inte vet något annat.
Enhetstester är bra för annat men alltså inte för att testa koden.

Beskrev precis en annan metod (skripta) för givetvis testar jag koden.

Permalänk
Medlem
Skrivet av klk:

Om jag skall skriva test för det så är jag uppe i två veckor eller i alla fall väldigt mycket extra tid, metoden tog en kväll och skriva och testa i debug.

Då är du riktigt kass på att koda om det skulle ta 2 veckor. Det är som att säga "det kommer ta mig 2 veckor att skriva en funktion".

Skrivet av klk:

Nej, och enhetstestning använder jag inte för att det är för dåligt.

Låter som att du är för dålig

Skrivet av klk:

Det existerar inte utvecklare som kan skriva test så att koden är säker ...

Det finns. Du fattar verkligen inte att allt >0% är någon form av vinst. Som @Dimman var inne på, kör du bil utan bälte också?
Har du vaccinerat dig själv eller din son?
Tillagar du kyckling till >=72 grader?
Har du försäkrat din bostad?

Skrivet av klk:

... och priset för enhetstester är för högt, på tok för högt.

Du sa precis att det skulle ta dig 2 veckor att skriva test för ditt kodexempel. Om man jobbar på ett riktigt företag så är det inte många fel hos kunden innan man har orsakat skador till ett högre värde. Om man jobbar på ett startup så kanske kunden har överseende med bristande kvalitet

Permalänk
Datavetare
Skrivet av klk:

Tror du att test plockar 100% av alla möjliga fel?

Det är fullt möjligt att skriva test som plockar 100 % av fallen. En hel klass av sådana är alla tester som verifiera alla tänkbara permutationer av funktioner där funktionerna saknar sidoeffekter.

I praktiken är de mer spännande funktionerna inte realistiskt testbara på den nivån. Vissa fuzzers kan dock analysera traces genom koden och lura ut vilka inputs som kommer leda till att man växlar mellan true-branch och false-branch i en funktion. Det kan då ge en uppsättning inputs som ger full eller i alla fall väldigt hög BC/DC (branch coverage / decision coverage).

Att göra sådant "för hand" kommer rätt snabbt bli så komplicerat att det tar till Ragnarök.

Skrivet av klk:

Har diskuterat test tidigare i tråden och kanske låter bli och repetera. Tipsar istället om den här videon https://www.youtube.com/watch?v=wo84LFzx5nI
Och att du läser om det Casey kallar för "discriminated unions" eller "Tagged unions".

Om du nu älskar unioner/variants så mycket, är verkligen C++ (ett rätt starkt typat och statiskt typat språk) rätt val?
Den säkerhet man får med "tagged unions" ger ju noll om man istället skriver sin kod så man redan har rätt statisk typ vid kompilering. Det går inte alltid, men i domäner jag jobbat med har det ändå varit normalfallet att man kan välja en statisk typ som är högst lämplig för uppgiften.

En statiskt typ lär vara minst lika snabb, även om det absolut går att göra "tagged unions" väldigt snabba.

Skrivet av klk:

För med enhetstest skapar du teknisk skuld och coupling, det låser kod.

Tar ett konkret fall som jag jobbat med idag.

Hade något som redan fungerade och där det fanns ett gäng tester. Koden "fungerade" men hade en del brister. Externa APIet (som inte är kundexternt på något sätt) var i stort sätt ok, men kunde göras lite bättre.

Totalt sett var det rätt stora interna förändringar, av de tester som fanns behövde en par stycken småjusteringar p.g.a. förändring av API.

Stora fördelen med unit-tester: efter detta gick alla tester åter igenom.

Hur skulle man få motsvarande kvitto på att nya koden inte hade sönder fall som tidigare fungerade utan testerna?

Går väl att köra manuellt, men givet vad som testades här skulle en manuell körning av allt vara något som tar en mänsklig testare dagar att genomföra (unit-testerna testar samma sak head-less med simulerad wall-clock time så man kan köra så fort CPUn orkar med)?

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 Yoshman:

Det är fullt möjligt att skriva test som plockar 100 % av fallen. En hel klass av sådana är alla tester som verifiera alla tänkbara permutationer av funktioner där funktionerna saknar sidoeffekter.

Jag pratar inte om "hello world!"-applikationer eller enkelfunktionalitet. Det du beskriver måste vara mycket simpelt, annars är det inte möjligt att täcka 100%, och det vet du. Om en programmerare vore så skicklig (sådan existerar inte) att den klarar av att skriva tester som täcker allt, då skulle den programmeraren inte behöva skriva tester eftersom personen är så pass duktig att programmeraren skriver felfri kod direkt.

Skrivet av Yoshman:

Att göra sådant "för hand" kommer rätt snabbt bli så komplicerat att det tar till Ragnarök.

Enhetstester kommer i nära nog 100% av fallen kosta mycket mer än vad det ger.

Enhetstester har sin plats men då för andra orsaker (som jag nämnt, att låsa koden är ett exempel, man vill inte att den förstörs). Det kan vara att koden är så komplicerad att den inte går att förstå (kan vara trassel, domänen är är svår eller något annat). För att andra skall våga jobba med det kan de ha test så de får en säkerhet att det fortfarande fungerar som tänkt.

Skrivet av Yoshman:

Om du nu älskar unioner/variants så mycket, är verkligen C++ (ett rätt starkt typat och statiskt typat språk) rätt val?

Såg du mitt exempel tidigare om en tabell som skrevs ut, det var ingen slump att jag la upp den koden men det verkar inte som någon nappar. Nu med LLMer är det himla smidigt och testa hur funktionalitet skrivs med andra språk, inte alls svårt.
Har inte sett att andra språk gör det enklare. Framförallt ser det "konstigt" ut. För något som C++ verkligen lyckats med är att det går att få ett mer naturligt utseende, det behövs inte lika mycket omskrivningar/anpassningar för att få till funktionaliteten. Och här sticker verkligen RUST ut, språkets tvingar utvecklaren skriva kod annorlunda.
OOP språk (C#, Java) lider också kraftigt av det problemet, att allt skall ligga i objekt är ett allvarligt designfel. Exempelvis svårt att avgöra vad som är bra skrivna objekt och vad som är hack eftersom allt MÅSTE ligga i objekt.

Skrivet av Yoshman:

Den säkerhet man får med "tagged unions" ger ju noll om man istället skriver sin kod så man redan har rätt statisk typ vid kompilering.

Det där är bara okunskap, och det är självklart eftersom den typen av kod är så ovanlig. De som lärt sig, där tror jag många likt mig undrar varför inte fler använder sig av tekniken med tanke på hur mycket det effektiviserar.
Tror det beror på att svårigheterna att diskutera teknik idag, går i princip inte om det blir svårare i allmänna/större grupper.

Skrivet av Yoshman:

Det går inte alltid, men i domäner jag jobbat med har det ändå varit normalfallet att man kan välja en statisk typ som är högst lämplig för uppgiften.

En statiskt typ lär vara minst lika snabb, även om det absolut går att göra "tagged unions" väldigt snabba.

Två helt olika saker, statisk typning är att kompilatorn vet vad det är. Har inget med vad tagged unions försöker lösa. Templates som exempelvis kan upplevas som något som liknar, är bara att kompilatorn klarar generera kod. Är det fel på data i runtime har du inte en kompilator som kan kontrollera.
Tagged unions, då vet koden vad det är (maskinkoden)

Permalänk
Medlem
Skrivet av Yoshman:

Tar ett konkret fall som jag jobbat med idag.

Hade något som redan fungerade och där det fanns ett gäng tester. Koden "fungerade" men hade en del brister. Externa APIet (som inte är kundexternt på något sätt) var i stort sätt ok, men kunde göras lite bättre.

Totalt sett var det rätt stora interna förändringar, av de tester som fanns behövde en par stycken småjusteringar p.g.a. förändring av API.

Stora fördelen med unit-tester: efter detta gick alla tester åter igenom.

Hur skulle man få motsvarande kvitto på att nya koden inte hade sönder fall som tidigare fungerade utan testerna?

Går väl att köra manuellt, men givet vad som testades här skulle en manuell körning av allt vara något som tar en mänsklig testare dagar att genomföra (unit-testerna testar samma sak head-less med simulerad wall-clock time så man kan köra så fort CPUn orkar med)?

Menar alltså inte att man inte skall ha något alls för att verifiera att allt fungerar som det skall.
Kod måste skrivas så den går att verifiera och då är det (alltid) data som verifieras, alltså resultat.

Med tagged unions det normalt enklare, går alltid och granska dataströmmar om man tänkt till och verifiera att de är ok.
Annars så hade nog jag försökt bygga några olika skriptlösningar som körde kod och matcha dem med tidigare resultat.

Repeterar igen:
Problemet med extra kod är att det låser koden. Du nämner själv att det: "behövde en par stycken småjusteringar p.g.a. förändring av API". Det låter på dig som att det där är ett någon enkelt, det är det inte när koden är svårare. Och ibland behövs större refaktoreringar, de kan bli en mardröm eftersom mycket mer kod behöver skrivas om.

Gissar att de flesta utvecklare låtit bli att skriva om kod just på grund av att tester gjort det mer eller mindre omöjligt.

Permalänk
Skrivet av klk:

Gissar att de flesta utvecklare låtit bli att skriva om kod just på grund av att tester gjort det mer eller mindre omöjligt.

Det här har du fått helt om bakfoten.

Just det faktum att du har tester med god täckning gör att du vågar skriva om kod. Passerar det testerna efter din omskrivning så har du inte oavsiktligt förstört något för din användare. Testerna ger dig ett stöd som gör att du inte låter bli att ändra saker för att du är rädd att råka paja något. Med legacy-koden finns det alltid en rädsla, tänk om jag förstör något jag inte tänkt på, men är koden under test kan man göra ändringar utan att tveka. Om du skulle förstöra något hittar du felen med en gång, inte ute hos kund.