Minden idők legtöbbet másolt StackOverflow kódrészlete hibás

Címkék

Key Takeaways

  • Stack Overflow snippets can be buggy, even if they have thousands of upvotes.
  • Test all edge cases, especially for code copied from Stack Overflow.
  • Floating-point arithmetic is hard.
  • Do include proper attribution when copying code. Someone might just call you out on it.

Az ezt kielemző részletes blogbejegyzés itt.

Hozzászólások

Szerkesztve: 2021. 06. 17., cs – 09:01

Egy mondatban: Never Ever Copy Code from Stack Overflow!

Nyilván használni lehet (én is szoktam), de nem CTRL + C, CTRL + V, hanem a megértés segítésére. A Stack Overflow nem helyettesíti a dokumentáció (vagy annak hiányában a kód) olvasását.

Következő HUP szavazás:

Kóder vagyok és .... másoltam kódrészletet a StackOverflow-ról.

( ) már       .....................................     0% (0 szavazat)

( ) gyakran  .....................................    0%  (0 szavazat)

(X) sosem   ..................................... 100%  (1337 szavazat)

trey @ gépház

Bizony, hogy nyomós. Annak ellenére, hogy külön tisztázva van, Creative Commons licenc, a regisztrációval már a user tudomásul veszi, hogy minden jogáról lemond, felköti magát, stb.. De!!! Ahogy a cikk is írja, Gipsz Jakab hiába is nyilatkozik így, ha később meg a munkáltatója kitalálja, hogy alkalmazás alatt írta a kódot a kedves user, így a kód az övéké, hiába nyilatkozott akármit, onnantól szopás van mindenkinek, aki a kódjába azt beépítette. Persze a másik oldalról általában elméletibb kérdések vannak a SO-n, ilyen általánosabb kódok, azokról nehéz eleve bebizonyítani, hogy honnan van, főleg, ha valaki nem 1:1-ben Ctrl+C-zte kifelé, kommentestől, formázásostól, helyesírási hibástól, változó-függvénynevestől. Mert odanyomok egy for (i=0;i<10; i++) { bla-bla } alap kódrészletet, arról most az úristen se bizonyítja be, hogy SO-ról van, vagy egy könyvből, vagy saját kútfőből.

Az is igaz, hogy ez nem csak a SO-t érinti, hanem bármilyen netes kódforrást. Teljesen szabad licences git projektet is hiába forkol meg használ fel valaki, ott is kiderülhet később, hogy alkalmazásban álló írta, és onnantól bukta van.

“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

Félreértés elkerülése végett a munkáltató csak arra tarthat jogosan igényt, amit a munkád során készítettél, vagyis munkaidőben és munkaköri kötelességből. E tekintetben mindkettő fontos, tehát amit otthon vagy éppen ebédidőben a telefonodba pötyögve írsz ahhoz alapból nincs köze (szerzői jogi értelemben – és itt természetesen nem egy munkaidőben írt kód másolására gondolok), ahogy ahhoz sem, amire nem adott neked megbízást/utasítást.

Vagyis akár egy munkaszerződésben is érvénytelen minden olyan kikötés, amelyben a munkáltató jogot akar formálni mindenre, amit azon időszakban írsz, amíg a munkáltatónál alkalmazásban állsz. Ennek egy még extrémebb esete, ha például munkakörödet tekintve grafikus vagy, de szabadidődben meg kódolsz, vagy éppen fordítva. Na itt végképpen nincs semmi köze a munkáltatónak az egyéb tevékenységedből eredő szerzői jogokhoz. Hozzáteszem, hogy ennek ellenére én is láttam olyan munkaszerződést, amiben a munkáltató azt próbálta rögzíteni, hogy őt aztán minden szerzői jog megillet, de hiába, mert ha alá is írsz ilyen munkaszerződést, ezek a kikötések jogilag érvénytelenek.

Ezekben teljesen igazad van, csak ezeket a multi munkáltatókat nem ismered, milyen genyák tudnak lenni, főleg jogászcsapattal felvértezve. Kitalálják ám, hogy de igen, munkaidőben írta (aztán lehet szünetben, vagy korábban ment aznap haza, vagy kötetlenben dolgozik otthonról, távolról), meg ugyan nem munkaköri kötelességből, de felhasznált olyan hasonló kódmegoldást, amit használt abban a céges projektben is, ami meg munkaköri kötelessége volt, ergo onnan emelte át (pedig lehet fordítva történt). Aztán bizonyítsd be az ellenkezőjét. Persze, aki reálisan gondolkodik, az azonnal érzi ezekről, hogy a for ciklus céges tulajdonlása, meg egy elemi SO kódrészletbe kapaszkodás bullshit, meg napi szar szintű szánalom, de ha beüt egy ilyen, az azért elég nagy kellemetlenséget okoz, még ha meg is nyered a pert, évikig pereskedés, plusz költség, jogászkodás, szakértőzés, stb..

“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

Úgy rühellem ezt, hogy lassan egy for ciklus is ,,valakinek a tulajdona". Nevetséges.
Túl kellene már lenni azon, hogy elemi részfeladatokat megoldó kódrészletek fölött hisztizünk. (Amin egy kicsi obfuszkálás egyébként is segít, ha nagyon muszáj.)
Ezeken nem vitatkozni kellene, hanem megosztani a tudást és tovább lépni.

Amíg programoztam, a jól sikerült pici függvényeimet a saját libjeimbe is felvettem. Kb. pont ilyen jellegűeket, mint amit a cikkben is példának hoztak.
Illetve az évek során felhalmozott saját libjeimből is emeltem be kódot. Hiszen ezért készülnek: beemeled a jól kidolgozott eszenciát, hogy újra felhasználd, ami egyszer (többször) már jól végig lett gondolva és le lett tesztelve.
Ezt én szakmai elvnek, és így a feladatomnak tekintem. A jogászok meg kinyalhatják a seggemet.

Amikor SO-ról vagy más nyilvános forrásból emel be valaki kódot, akkor sem a rühes licensz miatt aggódom (elemi feladatot megoldó tizenöt soros kód licensze lol), hanem a lehetséges sérülékenység miatt.
Az ilyen kódokat én ötletadónak, gondolatébresztőnek tekintem. Megnézem, megértem a gondolatmenetét, aztán bezárom az ablakot és újraimplementálom úgy, ahogy én csinálnám.

Egy komment:

"I think key takeaway here is: prefer short and simple loops over math. As you already said, the math is very hard to get exactly right (so, error prone and hard to read). But I believe it is also at least an order of magnitude slower than the loop-based solution."

Pontosan ez volt a véleményem, mielőtt elkezdtem elolvasni a hozzászólásokat.

Egyébként tud valaki olyan alkalmazást, ahol lényeges, hogy a 999,999 byte humán olvasható kiírása "1000.0 kB" vagy "1.0 MB" ?

Mi a legjobb asm megoldas (arm, x86..) ?

Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Szóval a srác a lájkok reményében publikált egy proof-of-concept kódot, de csak kilenc évvel később lett kijavítva. Én nem számítok többre máskor sem. Az első Ariane 5 is ilyen miatt zuhant le.

Afaik az Ariane 5-nel az volt a gond, hogy az Ariane 4 kodjabol masoltak, csak az ujabb raketa erosebb volt, es ami a 4-nel meg jo lett volna (gyorsulas, vagy valami, ami abbol szamolodik), az tulcsordult.

When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Mit csinál a kódrészlet? Stack overflow hibát dob? Azért nem tűnt fel nyilván senkinek...

robyboy

A kódrészlet bájtban kifejezett méretet alakít át bináris vagy decimális SI prefixes formátumba. És nem tűnt fel senkinek, mert nem keresték a csomót a kákán, meg amúgy is csak egy pszeudókód, koncept, nem valós, 1:1-ben felhasználható részlet, szintaktikailag is érvénytelen, emiatt nem is tesztelte senki. Úgyhogy ennél fel sem merülhetett, hogy valaki 1:1-ben próbálta volna másolni, viszont továbbra is gáz, hogy sok agyament meg tömegesen upvote-olta. Ez ilyen, ezek a kérdezz-felelek oldalak sose voltak komolyak. Ami nem is baj, de néhányan kezdték túl komolyan venni, meg túlzottan építeni rá.

Másik oldalról ez a human readable format meg mindig is problémás volt. Egyes források, gyártók, fejlesztők saját szájíz mentén implementálták, ki binárisan, ki decimálisan, a jelölés megkülönböztetése se mindig következetes, néhány szoftver vagy csak ezt vagy csak azt támogatja. Hiába van már rá szabványosított SI/IEC jelölés, fájlkezelők, shell-ben futó toolok is össze-vissza támogatják, még ha van is rá támogatás, akkor is hiányos, hogy ezt meg azt nem tudja, csak decimálisra, meg csak a főablakban, panelben, de az állapotsávban vagy összegzésnél már nem, meg csak ezres tagolás nélkül is a bájtméretet, ami nagy méreteknél nehezen olvasható, hogy pl. 9384543432423952342398473294...blaba az most 9,3 vagy 930, 93 tököm tudja mi, ötször neki kell futni hármasával leszámolva, mire kiolvasható egyáltalán a nagyságrend.

Még azt se lehet mondani, hogy ez csak most lett probléma, mert babzsákfejlesztőjék elfelejtettek ilyen alap problémákat megoldani. Ez mindig is problémás volt, annak idején már pl. a floppy adatméretei is ilyen Frankenstein-módszerrel lettek összedobva, hogy félig decimális, félig bináris keverék, pl. 1,44 × 1000 × 1024 = 1 474 560 bájt, de ez semminek nem felel meg, mert sem nem 1000-nek, sem nem 1024-nek nem tiszta hatványa (az 1,47456×1000² nem tiszta eléggé, sem az 1,40625 × 1024²). De még ez előtt is már eleve problémás volt, hogy egyes rendszerek mindenféle szektorra, egyedi blokkokra, kamu egységekre nézve adták meg a méreteket, szabad helyet, akár floppy, akár szalag. Persze, öltönyös-nyakkendős marketingesek ilyenkor nem jöttek soha zavarba, floppyra is rámondták, hogy akkor nem ennyi meg amannyi KB, MB (ami eleve ködös), hanem „high density”, ami még annyit se mond, mert hát mihez képest high?  A standard meg double densityhez képest high-abb, de az extra high-os változathoz képest nem annyira, a későbbi optikai lemezek és merevlemezek méretéhez képest meg bolhaméret. Persze, akinek volt esze, az már akkor is tudta, hogy az ilyen high fidelity, meg high, ultra, turbo, extended, advanced, extra, gamingpower, mega/delux/special edition, stb. címkék mögött mindig valami bullshit van takargatva, és a ködösítés ellenére kilóg a lóláb.

“I didn’t start using Linux so I could have friends.” (Luke Smith, 2019) 🐧

Honnan tudják, hogy ezt a kódot copyzták a legtöbben?