I ve velkých firmách jako Google pracují obyčejní řadoví průměrní až podprůměrní programátoři. K takovému závěru jsem došel po přečtení článku v online verzi časopisu . Shrnuto jde o to, že hudební videoklip dosáhl až k hranici 2.1 miliardy shlédnutí (231), a údajně „zničil“ youtube. Bulvární titulek nesmíme brát vážně, co se přesně stalo to v článku uvedeno není. S největší pravděpodobností se počítání zaseklo na maximální hodnotě 2.1 miliardy, možná přeteklo a začalo ukazovat záporná čísla.
Vývojáři Google údajně nečekali, že některý videoklip může kdy dosáhnout tolika přehrání. V tomhle směru bych je ještě omluvil. Ale jestli jim jakýsi blíže neurčený problém způsobila hodnota 2.1 miliard, lze z toho usuzovat, že pro uložení počtu přehrání používali SIGNED integer, s maximální hodnotou 2147483648 (plus minus 1). Do unsigned integeru by se vešlo číslo 2× větší (4294967296 plus minus). Fakt, že počet přehrání nemůže být NIKDY záporný, je snad nad slunce jasný. Pamatuju si, že jsem kdysi dávno taky ukládal čísla v databázi do defaultního typu INT (signed), to bylo ale v době, když jsem ještě neměl o datových typech ani ponětí, a moje programátorské schopnosti se daly měřit na mililitry. Použití signed integeru pro views mi od googlu připadá jako chyba programátora ze základní školy. Jak mohl někdo v Googlu udělat takovejhle kiks, mi není úplně jasné. Že by pozůstatek staré databáze původních autorů youtube, kteří web bastlili někde v garáži?
[1]: trochu mi unika, jak souvisi programovaci jazyk (java) s ulozenim poctu viws v databazi. Ze by nakonec v DB byl prece jen unsigned int, a vsechno domrvila az java na strane vystupu? To bych se pak panum programatorum musel omluvit, a vyjadrit jim uprimnou soustrast, ze jsou nuceni pracovat v tak hloupem jazyce.
[4]: Proc resit znamenkovost/neznamenkovost dat v DB, kdyz vim, ze program, ktery data zpracovava, to neumi rozlisit? Skoro mi prijde logictejsi dat do DB signed int a nemuset pak resit, co se stane, kdyz nactu 1.2*2^31 do javovskeho intu (jestli podtece nebo co). Myslim, ze Java navic neni jediny jazyk, ktery se na znamenkovost vykaslal. A trpi tim nekdo? Myslim, ze bezznamenkova cisla jsou ve vetsine pripadu zbytecna moznost navic, ktera akorat muze znamenat, ze programator udela chybu. Tak treba v C++: for (uint i=10; i>=0; i--); kolikrat tahle smycka probehne? Nekonecnekrat...
Google neni jediny. Kdysi mi Licence Manager ve Widlich NT napocital, ze mame ve firme nejakych -32000 licenci. A v Garminu maji take asi borce, protoze moje GPS ve statistikach ukazuje, ze jsem jel maximalni rychlosti asi 370 km/h, coz by s mym autem bylo mozne leda tak pri volnem padu, ale toho bych si vsiml minimalne proto, ze bych tu ted nepsal.
Tedy toto je tak marginalni problem, ze se vubec nedivim, ze to nikdo neotestoval, navic si nedovedu moc predstavit, co to mohlo na yutube zpusobit, maximalne tak divny statistiky a tot vse. A podle me ani neni 2^31 zhlednuti pravdepodobne, kolik by to bylo pri prepoctu na prenesena data? Rekneme 10MB * 2^31, to uz chce hodne tluste trubky.
OT: jedno pomerne dobre programatorske moudro rika, ze pokud ti nestaci velikost nejakeho datoveho typu signed, nemas pouzivat unsigned, ale prejit na vyssi typ (typicky s dvojnasobnym poctem bitu), pokud je to mozne.
Těžko říct co je zajímavější - zda to že někdo chce řešit přetečení znaménkového počítadla jeho náhradou za bezznaménkový, nebo to že chce někdo dávat počítadlo shlédnutí youtube videí do centralizované (dokonce SQL) databáze.
V každém případě je jasné, takové lidi v googlu rozhodně neprojdou vstupními pohovory. Na to doporučuji myslet před vynášením soudů o tom, jak tam pracují průměrní či podprůměrní programátoři.
[12] ma naprostou pravdu. Pokud cekas, ze signed int nebude stacit, unsigned int ti zas tak moc nepomuze. Pokud se nedalo predpokladat, ze nejake video bude zobrazene 2 miliardkrat a nakonec bylo, tak proc by nemohlo dosahnout 4 miliardy? A budeme tam kde jsme. Tady pomuze jenom long long.
Osobne nerad pouzivam unsigned, protoze to do programu vnasi spis komplikace, treba typu nekonecne smycky jak psal [6].
Je to podobny problem jako s rokem 2000. Koho by jeste v roce 1998 napadlo, ze nekdy prijde doba, kdy nebudou stacit 2 cifry na zaznamenani roku. Pak se na posledni chvili slavnostne zacal pocitat rok na 4 cifry a vsichni si mysli, jak to krasne vyresili. Uvidime za necelych 8000 let :-)
Ovsem poradny prusvih je uz na ceste, nastane 19. ledna 2038 ve 3:14:08. To bude totiz presne 2147483648 sekund od pulnoci 1/1/1970.
Protože je uznávaným názorem, že unsigned typy je lepší používat jen ve výjimečných případech (bitové masky a nebo pokud opravdu potřebujete mod 2^x aritmetiku).
Nějaký relevantní blogpost o (ne)používání unsigned typů: http://www.eschertech.com/articles/items/art100407.html
Myslíš reálny svet, kde dokážem zmenšiť počet serverov na polovicu a dať ti raz takú výplatu? Alebo aký reálny svet myslíš? Je veľa (dovolil by som si tvrdiť väčšina) aplikácií kde sa ukladajú len kladné čísla. To že niekto cpe unsigned na nevhodné miesta, neoveruje si či výsledok neprekročí veľkosť premennej sú len prasárny. Niekedy je dobré si pozrieť aj warningy. V reále ťa polovica výkonu naštve, nehovoriac o tom keď to celé ešte posielaš cez pol sveta a používaš o niekoľko rádov vyšší bytový typ a zbytočne.
So long
Vývojář použil na počítadlo shlédnutí 32-bit signed integer a malé děti z toho mají pozdvižení :-) Svého času takhle selhal prakticky KAŽDÝ program, když se začaly prodávat 3 GB HDD a šlo vyrobit 2+ GB soubor.
Lidé co si myslí že neznaménkový integer je zbytečný by se měli poohlédnout po jiné práci, na práci programátora nestačí.
[25] Lidé, co si myslí, že bezznaménkový integer jim pomůže, zjistí, jak moc se mýlili, až se o půl roku později pokusí vytvořit soubor větší než 4 GiB ;-) (Mimochodem funkce pro práci se soubory v libc i Win32 používají pro velikost souboru znaménkové typy, takže vám to stejně fungovat nebude.)
Bezznaménkové typy se hodí tam, kde máte zaručené, že nepřetečou a stejně velké znaménkové typy by přetekly. Třeba u velikosti dat v paměti. Ale pro případy, které jsou shora neohraničené, žádnou výhodu nepřinášejí. Spíše naopak, protože se velmi špatně detekuje, že přetekly.
[26] Jenže původně jsme chtěli tělo cyklu projít i pro nulu. Vidíte, jak se s tím blbě pracuje?
Já netvrdím, že unsigned typy jsou zbytečné. Se správnou oporou v programovacím jazyce a inteligentními programátory bych neměl problém s jejich používáním.
Jenže realita je jiná, že :-) implicitní konverze v C/C++ v kombinaci s nezkušeným programátorem právě dávají prostor k chybám, který se dá eliminovat za opravdu malou cenu.
nj, tak to dopada, kdyz nekdo zanedba research pred psanim clanku...
S bastlenim v garazi to nema nic spolecneho, je to presne podle Googlovskych guidelines:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Integer_Types
Tomáš je autorem několika více či méně známých projektů jak z oblasti operačních systémů, tak internetu. V současnosti samozvaný expert na Linux, Bash, PHP a MySQL.
Přečteno 26 211×
Přečteno 24 106×
Přečteno 19 592×
Přečteno 18 368×
Přečteno 12 967×