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

Permalänk
Medlem
Skrivet av klk:

Tror du utvecklare kommer lära sig om de uppfattar kritik som gnäll? Här har du en stor orsak till varför många programmerare inte lär sig.

Dom varit igång i 10 månader och får in patchar typ varje dag. Vad är kritiken, att det går långsamt? Jag tycker inte det går långsamt.

Vad har detta med att lärande att göra? Du gnäller om att det går långsamt, det är ju inget konstruktivt och knappast kritik värd att lära sig från. Du bara slänger ur dig sådant för att du sa något dumt och mötte motstånd.

Skrivet av klk:

Mycket viktigare för säker kod än att bygga in regler i verktyg

Nope, att lyssna på någon som säger "det går långsamt" utan inblick i projektet, komplexiteten och som inte kommer med något konstruktivt är inte viktigt ur någon aspekt och borde enbart ignoreras.

Permalänk

Nya C++26. Vad för åtgärder kommer denna innehålla då?

Permalänk
Medlem
Skrivet av heretic16:

Nya C++26. Vad för åtgärder kommer denna innehålla då?

Beror på vad man är ute efter men det stora med C++26 (som ser ut och bli en mycket stor uppgradering) är enligt mig kanske inte det nya utan förbättringar i det som finns som gör det så mycket mer användbart. Räknar då in en del i C++23 för normalt tar det ett tag innan det går att använda det nyaste. Vi har fortfarande problem och använda saker i C++20 eftersom många typer av instanser i olika molnlösningar har fasligt svårt att hänga med. Kod kan till och med ha svårt att kompileras med C++17 som lägsta nivå.

Följande går nog att relatera till säkerhet. Enklare och/eller mindre kod för samma sak.

Förbättringar rörande områden constexpr och concepts som tar ner svårighetsgraden tror jag kommer uppskattas. Man behöver inte längre vara en ninja på templates för att lyckas skriva "cool" kod. Det som tidigare krävde detaljerad kunskap i hur C++ fungerar blir enklare. Mer och mer går att lösa utan templates.
Personligen så förbättringarna överlagring av index operatorn (multidimensional subscript operators) är efterlängtat, skrivs mycket beräkningskod går den och göra snyggare och enklare. Tills nu är det en hel del trixande för att få till sådan kod.
Deducing this kanske äntligen stöds av alla vanliga kompilatorer, en C++23 funktionalitet som tagit tid för dem att fixa. Gör det enklare att skriva en hel del kod men ser lite ovant ut

De två stora nyheterna med C++26 är annars reflection och contracts. Säkerhetsmässigt är contracts som hjälper, kommer säkert ta över mycket från assert och ser snyggare ut med förbättringar.
Kommer en ny header kallad <debugging>, känner inte till vad den är till för.

Permalänk
Skrivet av klk:

Beror på vad man är ute efter men det stora med C++26 (som ser ut och bli en mycket stor uppgradering) är enligt mig kanske inte det nya utan förbättringar i det som finns som gör det så mycket mer användbart. Räknar då in en del i C++23 för normalt tar det ett tag innan det går att använda det nyaste. Vi har fortfarande problem och använda saker i C++20 eftersom många typer av instanser i olika molnlösningar har fasligt svårt att hänga med. Kod kan till och med ha svårt att kompileras med C++17 som lägsta nivå.

Följande går nog att relatera till säkerhet. Enklare och/eller mindre kod för samma sak.

Förbättringar rörande områden constexpr och concepts som tar ner svårighetsgraden tror jag kommer uppskattas. Man behöver inte längre vara en ninja på templates för att lyckas skriva "cool" kod. Det som tidigare krävde detaljerad kunskap i hur C++ fungerar blir enklare. Mer och mer går att lösa utan templates.
Personligen så förbättringarna överlagring av index operatorn (multidimensional subscript operators) är efterlängtat, skrivs mycket beräkningskod går den och göra snyggare och enklare. Tills nu är det en hel del trixande för att få till sådan kod.
Deducing this kanske äntligen stöds av alla vanliga kompilatorer, en C++23 funktionalitet som tagit tid för dem att fixa. Gör det enklare att skriva en hel del kod men ser lite ovant ut

De två stora nyheterna med C++26 är annars reflection och contracts. Säkerhetsmässigt är contracts som hjälper, kommer säkert ta över mycket från assert och ser snyggare ut med förbättringar.
Kommer en ny header kallad <debugging>, känner inte till vad den är till för.

Ge ett exempel på contracts i C++26.
Kul att reflektioner kommer till C++! Helt klart ett måste.

Permalänk
Datavetare
Skrivet av heretic16:

Nya C++26. Vad för åtgärder kommer denna innehålla då?

Feature freeze är passerat för C++26, det möte som ska fast ställa de sista detaljerna hålls i Bulgarien/Sofia i juni.

Det som fortfarande är lite frågetecken kring är exakt vad kring "profiles" som kommer att vara med i C++26. Verkar som det blir väldigt lite, det som Bjarne var upprörd över för en tid sedan.

Annars är det som @klk skriver ovan, de stora sakerna är contracts och reflection.

Lyssande precis på avsnittet om libstdc++ hos CppCast: https://cppcast.com/libstdcpp/
Det belyser ett annat problem C++ har m.a.p. att agera kring minnessäkerhet.

Varje sig libstdc++ (GCC, används som förval på Linux även om man kör Clang) eller libc++ (Clang/LLVM, används som förval på MacOS även om man kör GCC) har idag en fullständig implementation av något efter C++17(!). Målet för libstdc++ är att ha fullt C++20 stöd innan C++26 spikas i slutet av 2026.

Och tyvärr är det mer än smådetaljer. Skrev ett par rätt enkla testprogram för Coroutines (C++20), std::execution (C++17/20) och använda en sådan enkel sak som std::print (C++23). Stötte på problem i alla dessa exempel med att lyckas bygga/köra ett omdifierat program som använder dessa saker på Linux (testade GCC/Clang och libstd++/libc++) och MacOS (testade Clang/GCC med libc++).

Detta problem har lyfts av många. Det tar väldigt många år från att en C++ standard idag spikas till att den faktiskt går att räkna med i programvara som måste vara portabel.

Rust, Go, C# och TS har alla "fördelen" av att nya standarder rätt mycket stöds dag #1 vid release. En orsak där är att man stoppar in saker i standarden som man redan implementerat och testat i den enda toolchain man har (vilket i sig kan vara ett problem).

Java fyllde precis 30 år. Där kommer en ny version varje år och en "LTS" var 3:e år likt som för ISO C++. Frågan är varför Java-gänget verkar kunna hålla flertalet toolchains rätt nära standarden trots samma kadens som ISO C++? Likt .NET har ju Java ett enormt standardbibliotek som fortsätter växa. Likt C++ läggs inte supermycket till i språket, men likt C++ händer ändå en del fortfarande.

Visa signatur

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

Permalänk
Skrivet av Yoshman:

Java fyllde precis 30 år. Där kommer en ny version varje år och en "LTS" var 3:e år likt som för ISO C++. Frågan är varför Java-gänget verkar kunna hålla flertalet toolchains rätt nära standarden trots samma kadens som ISO C++? Likt .NET har ju Java ett enormt standardbibliotek som fortsätter växa. Likt C++ läggs inte supermycket till i språket, men likt C++ händer ändå en del fortfarande.

För att C++ är styrt av ISO...segt...trött...byråkrati...dokumentation....surt folk....papper....
Skulle man driva C++ som det vore ett börsnoterat företag, så skulle C++ vara det bästa språket någonsin. Men utvecklarna hade fått lida under massvis med chefer som stampar och skickar hotmeddelanden om uppsägningar för minsta lilla fel.

Java är väll ett språk som drivs som affärsintresse. Jag skulle lätt kunna säga att OM java kunde tala med hårdvara lika lätt som C/C++ kan...då hade Java varit världens bästa språk. Java kan ju allt. Enormt språk.

Personligen tycker jag att minnessäkerhet verkar vara ett litet problem. Jag haft ofta problem med att jag överindexerar arrayer/vektorer i C++. Men när det kommer till objekt så använder jag ALLTID smarta pekare. Finns ingen anledning att använda vanliga pekare idag. 0% anledning. Kasta bort kunskapen att hantera vanliga pekare i C++. Det är C språk!

Permalänk
Medlem
Skrivet av heretic16:

För att C++ är styrt av ISO...segt...trött...byråkrati...dokumentation....surt folk....papper....

C++ standarden styrs av ISO. Men det är inte så himla mycket byråkrati runt framtagandet av standarden. Det som tar tid är snarare att få folk att komma överens.

De olika implementationerna av C++ och dess bibliotek har ISO däremot ingenting alls att göra med. Vilket kanske är en del av problemet.
De som jobbar med C++ kompilatorerna och biblioteken verkar inte ha någon större brådska eller intresse av att faktiskt förverkliga alla finesser och nyheter som folket i standardiseringskommittén hittat på, plus att en del av nyheterna kan visa sig lite svårare än förväntat att implementera.

På ett sätt var det bättre förr för C och C+. I början så experimenterade kompilatortillverkarna hej vilt med olika utökningar och tillägg till språken, varpå standardiseringsfolket tog med ett urval av till standarden. På det sättet fanns mycket av nyheterna i standarden redan implementerat i verkligheten.
Men sen, när det fanns en etablerad standard, så blev både kompilatorutvecklare och användare negativt inställda till icke-standardiserade utökningar, och så hamnade vi i dagens situation.

Permalänk
Medlem
Skrivet av heretic16:

Ge ett exempel på contracts i C++26.
Kul att reflektioner kommer till C++! Helt klart ett måste.

Frågade AI för vad jag vet så är contracts på vippen att vara färdigt, inte säker på att de spikat syntaxen men fick liknande exempel av AI

double square_root(double dX) pre (dX >= 0.0) // Precondition: Input must be non-negative post (r: r >= 0.0 && std::abs(r * r - dx) < 0.0001) // Postcondition: Result is non-negative and approximates sqrt(x) { contract_assert(dX >= 0.0); // Redundant assertion for demonstration return std::sqrt(dX); }

Det lilla r skall tydligen representera resultatvärdet. Tolkar jag rätt så standardiserar de makrot assert och gör det mer användbart.

Med contracts tycker jag nog att det finns än mer behov av att införa en till feature och det är att kunna skriva deklarationer och delar av definitioner av kod på flera ställen. Nu kan man deklarera så mycket om en metod för att kompilatorn skall veta hur den kan hantera och göra med metoden och det blir kladdigt. Det fyller inte så mycket av värde för programmerare när de läser koden och gör det hela krångligare. Exempelvis låter jag bli och använda attrbibutes av den anledningen. Vill gärna ha ett ställe där det är läsvänligt och då bara på det som behövs för att använda koden. Många kritiserar C++ för att de har en separat header (separering av deklaration och definition). Fattar inte det för det är bland det bästa i språket. Enligt mig är det mycket jobbigare att arbeta med kod där allt är samlat.

Permalänk
Medlem
Skrivet av heretic16:

Java är väll ett språk som drivs som affärsintresse. Jag skulle lätt kunna säga att OM java kunde tala med hårdvara lika lätt som C/C++ kan...då hade Java varit världens bästa språk. Java kan ju allt. Enormt språk.

Delar kanske inte åsikten om att Java är något bra, java har en del mycket allvarliga designmissar (exempelvis allt är ett objekt...)

Men det du skriver om affärsintresse tycker jag ändå är viktigt att förstå, hur mycket inom it som handlar om affärsintresse för enligt mig så detta med säkerhetsproblem i C/C++ är enligt mig ett försök från affärsintressen att slå mot C/C++ eftersom det är ett språk som inte är "kontrollerat".

De största IT bolagen har samma ägarstrukturer så de jobbar ihop

Permalänk
Medlem
Skrivet av klk:

Delar kanske inte åsikten om att Java är något bra, java har en del mycket allvarliga designmissar (exempelvis allt är ett objekt...)

Men det du skriver om affärsintresse tycker jag ändå är viktigt att förstå, hur mycket inom it som handlar om affärsintresse för enligt mig så detta med säkerhetsproblem i C/C++ är enligt mig ett försök från affärsintressen att slå mot C/C++ eftersom det är ett språk som inte är "kontrollerat".

De största IT bolagen har samma ägarstrukturer så de jobbar ihop

Kan väl hålla med om att affärsintresse ligger bakom det men av felanledningar. Säkerhet kommer aldrig att generera nya intäktsströmmar som nya features/tjänster/produkter utan möjligen enbart spara pengar så företag väljer att hellre satsa på garanterad vinst mot möjliga lågriskförluster.

Nu när det kommer/kommit striktare lagkrav som i större utsträckning håller företagen ansvariga så har vågskålen balanserats om något och det är inte samma låga risker som tidigare.

Jag hade hellre sett att medmänsklighet och större respekt för personlig säkerhet/integritet hade styrt detta än rena kapitalistiska incitament. Känns inte som att något utvecklas med målet att bli den bästa möjliga produkten längre utan allt ska kramas ur för att maximera vinsterna.

Permalänk
Medlem
Skrivet av orp:

Kan väl hålla med om att affärsintresse ligger bakom det men av felanledningar. Säkerhet kommer aldrig att generera nya intäktsströmmar som nya features/tjänster/produkter utan möjligen enbart spara pengar så företag väljer att hellre satsa på garanterad vinst mot möjliga lågriskförluster.

Tror nog att säkerhet är lönsamt för att inte säga extremt lönsamt. Något de flesta företag lägger väldigt mycket pengar på

Senaste miljardföretaget från Sverige "recorded future"
https://www.investingothenburg.com/news/all-news/gothenburg-b...

Permalänk
Medlem
Skrivet av klk:

Tror nog att säkerhet är lönsamt för att inte säga extremt lönsamt. Något de flesta företag lägger väldigt mycket pengar på

Senaste miljardföretaget från Sverige "recorded future"
https://www.investingothenburg.com/news/all-news/gothenburg-b...

Nu, ja. Jag insåg att jag var aningen otydlig. Jag syftade på för ca 10 år sedan och tidigare än så. Då spenderade företag hellre på utveckla nya features än att satsa på gedigen säkerhet.

De flesta företag som jag jobbat på har tagit säkerhet på stort allvar och var i en ganska bra position när CRA introducerades men jag har varit på ett som fick eld i baken först när dom insåg att CRA höll på att bli verklighet.

Oavsett jag håller med om att affärsintresse genom politiken (i sin tur pga omvärldsläget) spätt säkerhetsfokuset som pushar för minnessäkra språk.

Permalänk
Datavetare

Har hänt en del relaterat till detta under sommaren.

Dels har US Cybersecurity and Infrastructure Security Agency (CISA) och National Security Agency (NSA) återupprepat sitt budskap att man bör ha en plan för att gå till "minnes-säkra" språk.

https://www.theregister.com/2025/06/27/cisa_nsa_call_formemor...
https://media.defense.gov/2025/Jun/23/2003742198/-1/-1/0/CSI_...

Man tar upp Android som ett exempel på vilken effekt det kan ha att ta steget

"In 2019, memory safety issues accounted for 76% of all Android vulnerabilities—typical for projects predominantly developed in memory-unsafe languages."

Recognizing the high concentration of memory-related vulnerabilities in new code, the Android team made a strategic decision to prioritize MSLs, specifically Rust and Java, for all new development.

"By 2024, memory safety vulnerabilities had plummeted to 24% of the total, representing an improvement that had not been seen with previous approaches to memory safety. This success underscores the effectiveness of MSLs in proactively building a more secure foundation for software."

Vidare har C++26 spikats. Var faktiskt ovisst in i det sista om reflection skulle komma med, det hängde på röstningen i sista mötet. Det kom med

Mer relaterat till tråden: verkar "security profiles" inte kommit med. Herb Sutter nämner det inte alls i sin trip report från sista ISO C++ mötet. Detta har nämnts i tidigare "trip reports" och Bjarne var lite orolig att då man drog i lite olika riktningar kring detta så så var det inte självklart att detta skulle komma med.

Finns (minst) två läger kring var man ska gå, det andra populära som också föreslagits som framtida ISO C++ standard är det från Sean Baxter: Safe C++.

Sen en annan lite mindre sak. En käpphäst för C++ är "zero cost abstractions". Visat sig att definitionen av ABI för Windows x86_64 gör tyvärr så att saker som std::span<> inte blir zero cost abstractions, men det är "zero cost" på x86 Windows, ARM64 Windows och alla Linux-varianter.

https://developercommunity.visualstudio.com/t/std::span-is-no...

Knappast en show-stopper, mer ett olycksfall i arbetet som tyvärr nog är rätt svårt att fixa i efterhand men som å andra sidan inte ger någon gigantisk prestandaförsämring heller. Knappast på den nivån att man bör undvika std::span på Windows, bl.a. då det är en (av många) saker som minskar risken för out-of-bounds fel och liknande.

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

Inte världens mest exalterande genomgång men han förklarar det nya i C++ som från början kallades för contracts men som bytt namn till contracts assertion - https://en.cppreference.com/w/cpp/language/contracts.html

Bra ändring, det mest förvånande är kanske varför det inte gjordes tidigare men möjligen ville man få med mer saker än bara förbättringar av hanteringen för assert

https://www.youtube.com/watch?v=u73ZB_vml_c

Permalänk
Medlem

Tipsar om en fantastisk video där Casey Muratori beskriver en teknik som är typ +10 gånger (kanske 100..) bättre än allt annat. Men som är så svår att prata om.

Casey beskriver historiken bakom, han har grävt en del och tycker det var intressant i vad han hittat. Hur "kända" utvecklare som Bjarne och andra inte alltid haft rätt.

Tog ut den viktigaste delen i hela videon enligt mig:
45:29
A lot of this stuff when I diged into it, I was like, how come everyone doesn't know this because it's super cool. When he presented this paper, or I shouldn't say presented this paper, when he wrote this paper, he included discriminated unions in it. Tagged unions, whatever you want to call them. There's FP people out there in the audience are going to scream at me for using the wrong term, but you know what I'm talking about. Something that has a type in it and then subasses inside it. And you don't know which one you have until you look at the type. And then you can, you know, use whichever part makes sense for that type. And this is a super powerful programming. I use it all the time. And I think it's one of the best programming tools you have for things like dynamic polymorphism. I absolutely love it. It's in this paper in 1966, right? A long long time ago.

Vill man inte se hela så se i alla fall 40:00 - 50:00

Tycker själv att man skall kalla det här för data orienterad design och det går en del ut på att data alltid transporteras med metadata. Alla delar i dataströmmar har sin beskrivning.

Det här är också den säkraste formen av programmering eftersom data alltid kan kontrolleras oavsett var i systemet datat befinner sig. Det är mycket säkrare än någon annan teknik vad jag vet.

Permalänk
Datavetare
Skrivet av klk:

Tipsar om en fantastisk video där Casey Muratori beskriver en teknik som är typ +10 gånger (kanske 100..) bättre än allt annat. Men som är så svår att prata om.

Casey beskriver historiken bakom, han har grävt en del och tycker det var intressant i vad han hittat. Hur "kända" utvecklare som Bjarne och andra inte alltid haft rätt.

Tog ut den viktigaste delen i hela videon enligt mig:
45:29
A lot of this stuff when I diged into it, I was like, how come everyone doesn't know this because it's super cool. When he presented this paper, or I shouldn't say presented this paper, when he wrote this paper, he included discriminated unions in it. Tagged unions, whatever you want to call them. There's FP people out there in the audience are going to scream at me for using the wrong term, but you know what I'm talking about. Something that has a type in it and then subasses inside it. And you don't know which one you have until you look at the type. And then you can, you know, use whichever part makes sense for that type. And this is a super powerful programming. I use it all the time. And I think it's one of the best programming tools you have for things like dynamic polymorphism. I absolutely love it. It's in this paper in 1966, right? A long long time ago.

Vill man inte se hela så se i alla fall 40:00 - 50:00

Tycker själv att man skall kalla det här för data orienterad design och det går en del ut på att data alltid transporteras med metadata. Alla delar i dataströmmar har sin beskrivning.

Det här är också den säkraste formen av programmering eftersom data alltid kan kontrolleras oavsett var i systemet datat befinner sig. Det är mycket säkrare än någon annan teknik vad jag vet.

https://www.youtube.com/watch?v=wo84LFzx5nI

Har nu sett hela videon och är inte riktigt med på vilken poäng Casey riktigt försöker göra.

Var lite orolig när han nämnde tidigt i presentationen nämnde "problemen med GC" som var relevanta på 90-talet, men knappast är relevanta idag... Men han nämnde inte GC fler gånger, så störde inte speciellt mycket.

Han har absolut en poäng i att tekniken han pushar för, tagged unions, absolut har ett antal fall där de är ett bra val.

Men tycker han helt missar, trots att han flera gånger nämner att den "traditionella formen" av OOP är vettig inom vissa domäner, att det finns rätt många andra domäner än den han verkat spendera i stort sett hela sina karriär inom.

Casey är 70-talist precis som jag (är något äldre). Till skillnad från honom har jag aktivt försökt att inte stanna inom samma område allt för länge då det skulle göra mig uttråkad. Får känslan att han lite fastnat i sent 90-tal / tidigt 00-tal för spelutveckling. De tekniker han pushar är guld värda för den generationen inom spel och ECS pushas en del som en möjlig väg framåt även idag.

Unity nämns flera gånger, där finns ett ECS system som "trots" användning av C# kan ge rejäla prestandavinster. Men så här långt har det inte riktigt tagit fart. Dels kan det beror på att Unity ECS kommit ur beta för inte så länge sedan (det ansågs "production ready" först 2022), men dels är det så här långt nog ansett som mer komplicerat att jobba med jämfört med den mer traditionella OOP/komponent-baserade (MonoBehavior klassen) modellen.

Huvudproblemet jag ser med Casey poäng är att han rätt mycket hävdar "det här är den ultimata hammaren, alla borde använda den". Han kan mycket väl ha helt rätt där, fast utanför den sfär han befinner sig finns det rätt många problem som långt bättre löses med andra verktyg än hammare och spik...

Specifikt vad det gäller spel tror jag Tim Sweeney är inne på en långt bättre väg, givet att Sweeney fokus primärt är hur spelprogrammerare på ett så enkelt sätt som möjligt kan börja utnyttja multicore CPUer (något spel är fortfara rätt kass på att använda då de fortfarande rätt ofta optimerar för 90-tals CPU designer) än vad Casey Muratori pushar för här.

Framförallt begriper jag inte alls hur mer frekvent användning tagged-unions skulle göra program säkrare, vilket är vad denna tråd handlar om... En sak tagged-unions inte är optimalt för är just multicore. Finns en del optimeringar som kräver att minnesadresser är "type-constant", vilket är raka motsatsen man får med tagged-unions.

Men finns absolut fall där tagged-unions är en väldigt bra lösning!

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:

Han har absolut en poäng i att tekniken han pushar för, tagged unions, absolut har ett antal fall där de är ett bra val.

Kort svar för som du nämner är området stort han pratar om och framförallt svårt. Inte så att tekniken är svår för har polletten trillat ner är det enklare programmering. Men att ta sig dit är inte helt lätt. Det var lättare förr i tiden för att få flexibel kod (återkommer) i äldre miljöer, då var man nästan tvungen att tänka i de termer han pratar om.

Men viktigaste av allt enligt mig är att man kan referera till videon och visa att flera av "superhjärnorna" kanske inte haft 100% rätt. Därmed inte sagt att andra har rätt. Ofta när denna typ av diskussion tas upp kommer det genast upp flera stycken med länkar till kända utvecklare som säger "så här skall du göra". Sedan är diskussionen död.

Tolkar lite fritt vad han menade även om det med uteslutning går att förstå.

Kärnan i problemet: Att bygga kring fel domän

Tror han sa något om system domain eller domain, och när han säger domain tolkar jag att han menar "user domain". Alltså den domän programmet är satt att hantera. Och där nästan alla gör fel är att de bygger kod (klasser) runt "user domain".
Varför det är så illa är att den domänen normalt ändrar sig hela tiden, det är en domän utvecklare måste läsa på. Vad programmet används för är inte programmeringskunskaper utan just specifikt för varje applikation.

Istället för att bygga koden kring användardomänen, menar han att man bygger kod kring systemet (datorns system). Den typen av domän ändrar sig inte alls lika mycket, nästan inte alls. Skrevs applikation mot Win32 för 25 år sedan fungerar samma kod idag. Är koden däremot skriven mot hur en användardomän var för 25 år sedan har troligen applikationen jobbats med ordentligt eller så är koden död.

Det här är också orsaken till varför OOP blir så svårt när man väljer att bygga arkitekturen kring fel domän. OOP kopplar ihop mycket kod och när logiken ändrar sig blir det så mycket mer att skriva om. Det blir snabbt sådana mängder att hålla reda på att utvecklare tröttnar. Koden blir för tungjobbad och utvecklare behöver koncentrera sig bara för att komma ihåg alla hack.

Han beskriver då även tagged unions (taggad data). Och för att förstå varför det är så bra så behöver man förstå hur jobbigt det är att skriva om saker där mycket kod är beroende av varandra.
För när data är taggad kan man ofta göra små lösningar för att fixa edgecases mm, kanske bara lägga till en tagg för något speciellt och annan kod påverkas inte. Taggningen gör att kod blir så mycket mer flexibel på djupet.

Med taggad data kan man enkelt lägga till metod med if/switch sats eller lägga till i befintliga lösningar för att förändra utan att annan kod påverkas.
När koden är så flexibel är den också återanvändbar och det är där säkerheten kommer in. Kod som återanvänds är mycket säkrare än kod som inte gör det. Skulle ett fel inträffa smäller det ofta mycket snabbare eftersom samma kod körs hela tiden. Det blir också mindre mängd kod och mindre kod som gör mer saker är säkrare än mer kod som gör mindre saker.

Permalänk
Datavetare
Skrivet av klk:

Kort svar för som du nämner är området stort han pratar om och framförallt svårt. Inte så att tekniken är svår för har polletten trillat ner är det enklare programmering. Men att ta sig dit är inte helt lätt. Det var lättare förr i tiden för att få flexibel kod (återkommer) i äldre miljöer, då var man nästan tvungen att tänka i de termer han pratar om.

Men iktigaste av allt enligt mig är att man kan referera till videon och visa att flera av "superhjärnorna" kanske inte haft 100% rätt. Därmed inte sagt att andra har rätt. Ofta när denna typ av diskussion tas upp kommer det genast upp flera stycken med länkar till kända utvecklare som säger "så här skall du göra". Sedan är diskussionen död.

Tolkar lite fritt vad han menade även om det med uteslutning går att förstå.

Kärnan i problemet: Att bygga kring fel domän

Tror han sa något om system domain eller domain, och när han säger domain tolkar jag att han menar "user domain". Alltså den domän programmet är satt att hantera. Och där nästan alla gör fel är att de bygger kod (klasser) runt "user domain".
Varför det är så illa är att den domänen normalt ändrar sig hela tiden, det är en domän utvecklare måste läsa på. Vad programmet används för är inte programmeringskunskaper utan just specifikt för varje applikation.

Istället för att bygga koden kring användardomänen, menar han att man bygger kod kring systemet (datorns system). Den typen av domän ändrar sig inte alls lika mycket, nästan inte alls. Skrevs applikation mot Win32 för 25 år sedan fungerar samma kod idag. Är koden däremot skriven mot hur en användardomän var för 25 år sedan har troligen applikationen jobbats med ordentligt eller så är koden död.

Det här är också orsaken till varför OOP blir så svårt när man väljer att bygga arkitekturen kring fel domän. OOP kopplar ihop mycket kod och när logiken ändrar sig blir det så mycket mer att skriva om. Det blir snabbt sådana mängder att hålla reda på att utvecklare tröttnar. Koden blir för tungjobbad och utvecklare behöver koncentrera sig bara för att komma ihåg alla hack.

Han beskriver då även tagged unions (taggad data). Och för att förstå varför det är så bra så behöver man förstå hur jobbigt det är att skriva om saker där mycket kod är beroende av varandra.
För när data är taggad kan man ofta göra små lösningar för att fixa edgecases mm, kanske bara lägga till en tagg för något speciellt och annan kod påverkas inte. Taggningen gör att kod blir så mycket mer flexibel på djupet.

Med taggad data kan man enkelt lägga till metod med if/switch sats eller lägga till i befintliga lösningar för att förändra utan att annan kod påverkas.
När koden är så flexibel är den också återanvändbar och det är där säkerheten kommer in. Kod som återanvänds är mycket säkrare än kod som inte gör det. Skulle ett fel inträffa smäller det ofta mycket snabbare eftersom samma kod körs hela tiden. Det blir också mindre mängd kod och mindre kod som gör mer saker är säkrare än mer kod som gör mindre saker.

Fast han nämner flera gånger att inom den sfär Alan Kay (Biokemi) och Bjarne Stroustrup (distribuerade system) så är inte nödvändigtvis en dålig idé att modelera sin domän med arv.

Så finns fall där en hammare inte är rätt verktyg och då är inte det han pushar för inte heller rätt lösning.

Och tycker den viktigaste punkten om man håller sig till domänen Casey primärt refererar till är hur han helt "glömmer" vad vi primärt fått från 90-talet fram till nu: CPUer med långt fler CPU-kärnor.

Här tycker jag Sweeney har långt större förståelse för problemet. Han gör observationen att AAA-spel fortfarande är primärt begränsade av single-thread prestanda. Den slutsats Sweeney och Epic gjort är att en lösning på det problemet kräver att spelprogrammerarna kan inte få hela komplexiteten att effektivt utnyttja multicore. Är rätt mycket det vi gjort så här långt och det har gått rätt dåligt.

Sweeneys ansats är att man måste göra en rätt fundamental förändring för att ta sig över tröskeln. Långt större än vad som är möjligt inom ramen för de språk/tekniker som togs fram på 80-, 90-, 00-talen. Han pushar en helt ny teknik för spel som från grunden tar multicore komplexiteten i åtanke. Han ser (software) transactional memory som den kritiska komponenten, blir spännande att se om det fungerar även i praktiken med UE6 (han har nog en viss uppförsbacke, många har redan försökt lösa transactional memory i både SW och i HW, så här långt har det inte gått speciellt 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
Medlem

Exempel på lösning med "taggad data" – en metod som kanske verkar bekant

Tänk dig att du har 10 objekt som behöver kommunicera med varandra. Ett enkelt tillvägagångssätt kan vara att låta varje objekt direkt anropa funktioner i de andra. Problemet? Det blir snabbt en soppa av beroenden – särskilt när systemet växer.

En bättre lösning är att använda en "dispatcher" eller en händelsebaserad modell. Istället för att objekten anropar varandra direkt, skickar de ut taggad data (t.ex. meddelanden eller händelser). Andra objekt kan sedan lyssna på dessa meddelanden och avgöra – baserat på taggen – om de behöver agera eller ignorera informationen.

Taggad data gör systemet renare, mer hanterbart

Permalänk
Medlem
Skrivet av Yoshman:

Fast han nämner flera gånger att inom den sfär Alan Kay (Biokemi) och Bjarne Stroustrup (distribuerade system) så är inte nödvändigtvis en dålig idé att modelera sin domän med arv.

Precis och som jag tolkar det så handlar det inte om arv utan området arven byggs kring. Hur koden byggs kring domänerna. Försöka bygga kod kring sådant som inte ändrar sig

Permalänk
Datavetare
Skrivet av klk:

Exempel på lösning med "taggad data" – en metod som kanske verkar bekant

Tänk dig att du har 10 objekt som behöver kommunicera med varandra. Ett enkelt tillvägagångssätt kan vara att låta varje objekt direkt anropa funktioner i de andra. Problemet? Det blir snabbt en kaotisk soppa av beroenden – särskilt när systemet växer.

En bättre lösning är att använda en "dispatcher" eller en händelsebaserad modell. Istället för att objekten anropar varandra direkt, skickar de ut taggad data (t.ex. meddelanden eller händelser). Andra objekt kan sedan lyssna på dessa meddelanden och avgöra – baserat på taggen – om de behöver agera eller ignorera informationen.

Taggad data gör systemet renare, mer hanterbart

Fast det låter långt mer som det Tony Hoare pushar hårt, CSP, och som jag själv är en av de viktigaste paradigmerna som finns (vilket är en av tre orsaker till varför Go tilltalar mig så mycket). Men även det har sina begränsningar, det må vara världens bästa skruvdragare men ibland finns bättre saker än skruvförband!

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:

Fast det låter långt mer som det Tony Hoare pushar hårt, CSP, och som jag själv är en av de viktigaste paradigmerna som finns (vilket är en av tre orsaker till varför Go tilltalar mig så mycket). Men även det har sina begränsningar, det må vara världens bästa skruvdragare men ibland finns bättre saker än skruvförband!

Ja alltså det är egentligen en självklar lösning och vanlig, bl.a. i websystem mm. Men den går att applicera på så mycket mer

Angående Casey Muratori så pratade han strax under 2 timmar (tar inte med när han fick frågor) och tror inte han hade ett skrivet manus utan pratade fritt. Man behöver ju förstå kontexten och repeterar vad jag tycker var bra för oavsett var på nätet där man försöker diskutera sådant här så tycker 90% man pratar skit. Och beviset är länkar till andra som har hög status. De är duktiga men de är inte duktiga på allt.

Samma sak i denna tråd, det går inte att få in i skallen på en del att det finns säkrare sätt att koda än att bygga in säkerheten i kompilatorn.

Tycker exempelvis att "unit testing" är värdelöst, men det går inte att prata om det.

Permalänk
Datavetare
Skrivet av klk:

Ja alltså det är egentligen en självklar lösning och vanlig, bl.a. i websystem mm. Men den går att applicera på så mycket mer

Angående Casey Muratori så pratade han strax under 2 timmar (tar inte med när han fick frågor) och tror inte han hade ett skrivet manus utan pratade fritt. Man behöver ju förstå kontexten och repeterar vad jag tycker var bra för oavsett var på nätet där man försöker diskutera sådant här så tycker 90% man pratar skit. Och beviset är länkar till andra som har hög status. De är duktiga men de är inte duktiga på allt.

Samma sak i denna tråd, det går inte att få in i skallen på en del att det finns säkrare sätt att koda än att bygga in säkerheten i kompilatorn.

Tycker exempelvis att "unit testing" är värdelöst, men det går inte att prata om det.

Fast jag vet med 100 % säkerhet att "unit-testning" är allt annat än värdelöst. Fullt möjligt att du hittat ett sätt att jobba där det inte är en relevant komponent, men finns definitivt massor med fall där det är extremt värdefullt (ger bättre kod på kortare tid).

Har ofta jobbat med komplicerade domänproblem som också har hårda prestanda och/eller realtidskrav. För mig har TDD varit kritiskt i att kunna få ihop något som faktiskt fungerar inom givna gränser.

Är också 100 % säker att de som hävdar att ju tidigare man hittar ett problem ju bättre. Den enda rimliga konsekvensen av detta är att ju mer man hittar redan vid kompilering, ju bättre.

Rust är i nuläget helt unikt i vad det är kapabelt att hitta vid kompilering. Men det gör ändå inte Rust till "be all, end all programming languages".

Personligen har valet väldigt sällan hamnat på Rust (tycker det är allt för komplext), ofta finns andra saker som är långt viktigare. C# är knappast mitt förstahandsval som språk, men har ändå valt det för spelutvecking jag jobbar med just nu då det totalt sett var bäst. Håller på rätt mycket med SBC/MCU i privata projekt, inte heller där har det blivit Rust utan är primärt Go på SBC och C/C++ på MCU.

Om man däremot ska ge sig på ett green-field projekt där säkerhet är huvudprioritet har jag svårt att se något bättre val än Rust 2025!

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:

Fast jag vet med 100 % säkerhet att "unit-testning" är allt annat än värdelöst. Fullt möjligt att du hittat ett sätt att jobba där det inte är en relevant komponent, men finns definitivt massor med fall där det är extremt värdefullt (ger bättre kod på kortare tid).

Nej det vet du inte

Och vi har precis diskuterat ett mycket svårt problem som blir enkelt med smartare arkitektur. Att unit-testing är värdelöst har samma grund som att bygga kod kring fel domän.
Kod lever när det handlar om anävndardomänen för det är väldigt få förunnat som skriver kod kring något som aldrig ändrar sig. Att unittesta saker som ändrar sig innebär bara mer kod att skriva om med ett värdelöst sätt att hitta buggar på. Har heller aldrig mött någon som kan skriva bra tester, att skriva bra tester är svårare än att skriva produktionskod. I princip varenda annan teknik för att testa kod är bättre, enda gången unit tester är bra för att testa att kod fungerar är om man vill skydda koden, låsa "fast den"

Nackdelen är att det tar tid att lära sig andra tekniker och eftersom de flesta utvecklare inte får lägga tid på att träna alternativa tekniker blir träningen lidande.

Angående att sådant här var så mycket lättare att diskutera förr jämfört med idag. Skulle man göra Win32 applikationer i C/C++ kände i princip alla till LPARAM and WPARAM och det var automatiskt ett naturligt sätt att tänka.
När man abstraherat bort underliggande teknik får utvecklare inte kontakt med sådant och känner därför inte till det.

Permalänk
Skrivet av klk:

Att unittesta saker som ändrar sig innebär bara mer kod att skriva om med ett värdelöst sätt att hitta buggar på. Har heller aldrig mött någon som kan skriva bra tester, att skriva bra tester är svårare än att skriva produktionskod. I princip varenda annan teknik för att testa kod är bättre, enda gången unit tester är bra för att testa att kod fungerar är om man vill skydda koden, låsa "fast den"

Jag förstår inte varför du är så maniskt emot unit-tester. Den stora poängen med dem är att säkerställa att någonting uppfyller kontraktet mot omvärlden. Och att man inte oavsiktligt råkar ändra beteendet på någonting när man gör ändringar i modulen. Det är klart att unit-tester skall testa modulens gränssnitt mot omvärlden, inte implementationsdetaljer under huven. Försöker du testa internt state cementerar du fast dig i den nuvarande implementation och (det du då felaktigt kallar) unit-tester kommer omöjliggöra refactoring.

Nu vet jag inte hur det ser ut i koden du jobbar med, men när jag gör ändringar i kod finns det typiskt beroenden både "uppåt" och "nedåt" och här säkerställer unit-testerna att jag inte oavsiktligt ändrar något beteende som någon annan modul beror på. Om jag skall ändra på interfacet mellan två moduler krävs det ändringar både i produktionskoden och i testerna, men det är pris jag är villig att betala för tryggheten dessa tester ger mig.

Skrivet av klk:

Nackdelen är att det tar tid att lära sig andra tekniker och eftersom de flesta utvecklare inte får lägga tid på att träna alternativa tekniker blir träningen lidande.

Hur klarar du dig utan automatiserad testning? Du har tidigare skrivit att du kollar i debuggern, men det känns inte som en metod som varken skulle skala särskilt väl eller ge god täckning. Vilka är dessa alternativa tekniker som du använder?

Permalänk
Medlem

Utöver vad @Ingetledigtnamn redan svarat så finns där del undersökning som visar på kostnader av buggar i en utvecklingscykel.
Vanligtvis har man en testabstraktion där man delar upp testningen i olika perspektiv från fokus på kod-beteende till funktionalitet/feature-beteende.

Vanligtvis har man en release-process som ser ut något i stil med:
1. Lint -> 2. Unit tests -> 3. Functional tests -> 4. Review -> 5. System tests -> 6. Release

Ju längre till höger du kommer i processen ju högre blir kostnaden för dina misstag. Exempelvis linter och unit test kan varje utvecklare köra på sin egen maskin och skapar en så kort iterationscykel som möjligt och är tänkt att fånga fel innan man pushar det till en CI som sätter upp komplexare scenarion(t ex service:ar som kör, nätverkskonfiguration, maskinkonfiguration) som man har bland sina functional tests. Dessa kan vara bökiga att få igång på sin egen maskin pga miljöberoende.

Kostnaden för när man upptäcker en bugg ökar från att:
1+2. Utvecklaren hittar sina egna buggar på sin egen maskin och inga andra resurser som människor eller infrastruktur är inblandade.
3. Utvecklaren hittar sina egna buggar men har allokerat infrastruktursresurser i CI.
4. En annan anställd hittar buggen genom att kontrollläsa din kod, dvs timmar i personalkostnad + punkt 3.
5. Komplexa och tidskrävande tester som kräver en (dyr)miljö som efterliknar produktionsmiljön + punkt 3, 4.
6. Här är koden tillgänglig för kunden och du kan bli ersättningsskyldig till följd av missade säkerhetsproblem, kunders downtime, badwill osv + punkt 3, 4, 5.

Notera att om du hittar ett fel så börjar din process vanligtvis om som bidrar till nya kostnader.

Att därför säga att unit-tester är värdelöst visar på okunskap, du hoppar bara över ett steg som skulle kunna spara kostnader i företaget pga lathet.

Det finns andra oanade effekter av att inte ha unit-tester. Jag har kollegor som vägrar buggrätta i kod som saknar unit-tester eftersom dom inte kan verifiera koden efter sin buggrättning och därför lägger dom en ticket istället för en patch.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Jag förstår inte varför du är så maniskt emot unit-tester. Den stora poängen med dem är att säkerställa att någonting uppfyller kontraktet mot omvärlden.

Vill understryka att jag absolut inte är emot att testa kod. tvärtom så anser jag att det är så viktigt att kod skall testas att man behöver välja bättre teknik än vad unit-test är. unittester är för dåligt.

Utvecklare som sätter likhetstecken mellan "inga unit-tester" = "ingen kontrol" har inte prövat annat för att säkerställa koden.

Enligt mig skall kod designas utifrån att den skall skall vara säker, man väljer till och med lösningar för att säkra koden,

Skriver jag C++ kod så är den marinerad med assert eller för att ta javascript, där är det massor console.assert. Varenda programmeringsfel bör plockas genom att koden kontrollerar sig själv.

De två stora problemen med unit-tester är att de fångar för lite fel och gör koden mycket mer trögjobbad och det i sin tur leder till sämre kvalitet.

Man kanske då undrar hur jag vet det här? Ganska enkelt att testa genom att se vilka som får slita med buggar i deras kod.

Vet utvecklare som tycker unit-tester är superviktigt och samtidigt print-debuggar

Permalänk
Medlem
Skrivet av orp:

Vanligtvis har man en release-process som ser ut något i stil med:
1. Lint -> 2. Unit tests -> 3. Functional tests -> 4. Review -> 5. System tests -> 6. Release

Det där är inte billigt, säker kod måste vara lättarbetad. Desto mer du fångar i utvecklingsfasen desto billigare blir det.

Permalänk
Medlem
Skrivet av klk:

Skriver jag C++ kod så är den marinerad med assert eller för att ta javascript, där är det massor console.assert. Varenda programmeringsfel bör plockas genom att koden kontrollerar sig själv.

asserter kommer ju att terminera ditt program och företagen jag har jobbat för så är detta strikt förbjudet i produktion utan fel ska alltid försökas hanteras, enda undantaget har varit fel som om man misslyckas med allokering av minne men även här har jag sett fall när man gör en delvis teardown och lägger sig i en retry-loop tills man kan allokera igen.

Om du enbart har asserter påslaget under testning men inte i release så har du strikt taget release:at något annat än det du "testat".

Skrivet av klk:

De två stora problemen med unit-tester är att de fångar för lite fel ...

Då förändras inte koden eller så är dina tester dåligt skrivna.

Skrivet av klk:

.. och gör koden mycket mer trögjobbad och det i sin tur leder till sämre kvalitet.

Detta låter som lathet.

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Nu vet jag inte hur det ser ut i koden du jobbar med, men när jag gör ändringar i kod finns det typiskt beroenden både "uppåt" och "nedåt" och här säkerställer unit-testerna att jag inte oavsiktligt ändrar något beteende som någon annan modul beror på. Om jag skall ändra på interfacet mellan två moduler krävs det ändringar både i produktionskoden och i testerna, men det är pris jag är villig att betala för tryggheten dessa tester ger mig.

Nämner två saker som jag inte tror är så vanliga.

Normalt ligger mitt fokus på att arbeta bort alla möjliga beroenden som går. Är man ny i programmering och jobbar med mig tror jag de har svårt att förstå varför jag skriver kod på ett visst sätt. Men det har med ovanstående att göra, att varje del i koden skall vara lätt och byta ut. Var därför min post där casey marutori beskrvier "tagged unions", så ser min kod ut men det är fasligt svårt att förklara för utvecklare. Det går inte in, har försökt massor av gånger. Några få fattar men de flesta begriper aldrig.
Försöker också skriva program så jag kan själv kan använda den. Det innebär att jag kan lägga in funktionalitet i koden som inte har något med applikatinens funktionalitet att göra, bara att jag behöver den i utvecklingen. Då måste jag köra koden hela tiden som jag också jobbar i och det brukar alltid vara en stor vinst när utvecklare också använder koden de jobbar med.