sobota, ledna 12, 2008

Wow!

Vida. Myslel jsem si, jak si pěkně budu hovět v laskavé náruči .NET, a místo toho jsem spadl přímo do Win32. Však víte: to je ten svět, kde ty důležité věci jsou psány velkými písmeny, každá funkce má alespoň jednu Ex (a možná i ExEx) verzi a základem je pamatovat si, že když něco chcete, musíte pěkně poprosit funkcí SendMessage.

Popravdě musím říct, že až teď jsem si uvědomil, jak jsou Windows obrovské, co všechno v nich je a jak je zatraceně těžké v nich programovat.

Win32 API je vlastně úžasný artefakt závratné historické hodnoty, který umožňuje sledovat jak se osobní počítače vyvíjely posledních dvacet let. V dobách, kdy výkonné počítače měly 2MB paměti a jejich procesor běžel s taktem 20MHz, jistě bylo rozumné snažit se nacpat co nejvíce informací do co nejméně bytů paměti, a co nejvíce věcí řešit co nejmenším množstvím kódu. V té samé době, když ještě neexistovalo C++ (současná podoba byla standardizována až v roce 1998), bylo zcela určitě novátorským přístupem implementovat ten jediný prvek uživatelského rozhraní kterým Windows disponují (ano, správně, je to okno, hned ten název -- Windows -- dává takový pěkný dvojsmysl, že?) tak, že umožňuje tzv. subclassing, tedy možnost podstrčit systému ke správě takového okna správně napsanou funkci, ve které můžete z pitomého obdélníku udělat cokoliv, od tlačítka, přes textové pole až po... no, třeba ribbon, kdybyste o to stáli. A ačkoliv si to nebudete myslet, i ty registry, nad kterými každý ohrnuje nos, jsou poměrně slušně navržené (horší je to samozřejmě s implementací -- skoro bych se vsadil, že registry vymyslel ten tým, co dělal Windows NT, a pro Windows 95, blahé paměti, vyšla jejich nedomrlá verze, která brala ohled na to, že uživatelé nechtějí věnovat 70% výkonu svého počítače robustnímu úložišti konfigurace).

Bizarní na tom je, že tenhle místy prazvláštní slepenec funkcí (z nichž některé spojují podobné vstupní parametry a podobné výstupní hodnoty) pohání všechny Windows (tedy od verze 3.1, nebo kolik), včetně těch úplně posledních.

Znamená to dvě věci. Za prvé: skoro všechno co napíšete ve Win32 pro jedny Windows, poběží i na všech ostatních. A za druhé: Microsoft ve Windows nemůže nic změnit.

Myslím to takhle: Když píšete program, a rozhodnete se, že mezi dvěma verzemi něco změníte nebo opravíte, čímž se chování vašeho programu v 1% případů mírně změní, je to pro vaše uživatele jistě nepříjemné, ale, zatraceně, je to jedno mizerné procento a opravili jste chybu, kdo by si s tím lámal hlavu? Ovšem pokud jste Microsoft, a jedno procento uživatelů je, řekněme, 10 miliónů lidí, pak už takhle uvažovat nemůžete. Říkáte si: K čertu, náklady na opravu všeho softwaru, který je na téhle chybě závislý se zhruba vyrovnají nákladům na stavbu jedné či dvou letadlových lodí, nebo na stavbu základny na Měsíci, nebo tak něco. A nikdo nezaručí, že software, na kterém je třeba to jedno procento lidí existenčně závislých, někdo opraví. Co pak budete dělat s těmi 10 miliony telefonátů na servisní linku?

Podívejte se na Visty: Microsoft se v nich pokusil opravit hodně chyb, které mu byly dlouho vyčítány. Od přístupu co není zakázáno, je povoleno (tedy: uživatelé přeci nejsou banda tupých hovad), přešel k co není povoleno je zakázáno (tedy: dobře, když se chováte jako banda tupých hovad, ztížíme vám provádění těch největších pitomostí), protože léta uživatelé fňukali nad mizernou bezpečností Windows a tak dále. Odměnou mu za to je nepřetržitý proud neinformovaného plácání o tom, jak Visty jsou jen nové UI (jistě, navíc zkopírované z počítačů Apple), jak najednou nefunguje spousta software a hardware, kolik Visty čeho žerou a čím vším pořád točí a že Windows XP jsou stejně lepší, a kdo ví co ještě.

Dobrá, při uvedení Windows XP také všichni blekotali o tom, že v nich není nic nového než kulatá okna a tak dále a tak podobně, a stejně jako při přechodu z Windows 2000 na Windows XP tahle nesnesitelná litanie nejpozději koncem tohoto roku ustane.

Je tu ale přeci rozdíl: změna mezi Vistami a XP je opravdu podstatná, a ovlivní poměrně mnoho uživatelů (třeba celá ta věc s UAC -- v okamžiku, kdy na XP máte hotovou aplikaci, musíte ve Vistách začít řešit všechny tyhle manifesty, a Windows Defendery, a blokovače Bůh ví čeho). Spousta programů, které spoléhaly na to, že to či ono, je tam či onde, najednou nefunguje, protože tady a támhle, byly zalepeny ty či ony bezpečností díry, nebo se věči, o kterých Microsoft nikdy neřekl, že budou tam kde jsou i v budoucnu, přesunuly jinam, a najednou informace, která se ve Windows 2000 nebo XP dala vyčíst jedním dobře mířeným přístupem do registrů musí dohledávat přes API (což se ostatně měla už i ve Win2000, jen to nikdo nedělal, protože to bylo moc práce, a registry jsou přeci naše, že ano!).

Čímž se oklikou dostávám k tomu, co jsem asi tak zhruba chtěl říct: ve Win32 se neprogramuje moc dobře. Ne proto, že by API bylo nějak extrémně špatně navržené. Ve skutečnosti je docela slušné a v rámci jednotlivých domén i poměrně konzistentní, když uvážíme, že se z počítačů s výkonem, který dnes má každá lepší kalkulačka dokázalo úspěšně přesunout na stroje s kdo ví kolika jádry a gigantickým (z pohledu počátku 90. let) množstvím paměti všeho druhu. (Vsuvka: Zrovna tento týden jsem poslouchal nějaký podcast, kde se řešilo, proč Windows nemohou pracovat na více než 64 procesorech. Je to proto, že maska, která určuje, na kterých procesorech -- nebo jádrech procesoru -- může program běžet, má jen 64 bitů. Dovedu si představit, jak někdo v roce 1992 uvažuje, zda takovou masku implementovat obecně, jako nějaký druh seznamu, nebo malinko špinavým trikem, jako jednu dlouho proměnnou. A je mi jasné proč, při tehdejší úrovni počítačů, zvolil malinko špinavý trik.) Problém programování ve Windows je v tom, že ve Windows je toho tolik.

Na tomto místě je obvyklé říct (a ano, i já to s oblibou říkám), že tyhle obří operační systémy jsou nesmysl, a že z nich stejně většina lidí využije jen malou část. Ovšem otázka je, kterou malou část většina lidí využije, když je jich třeba miliarda? Čeho vlastně má mít takový správný malý operační systém vestavěnou podporu? Sítě? Grafická akcelerace? Asi tak sto tisíc různých druhů nejexotičtějších periferií, bez kterých právě těch bezvýznamných 10 miliónů lidí nemůže být? Co byste z Windows vyhodili, aby to nikomu nechybělo? Nebo aby to chybělo méně než milionu lidí? Co když někdo rozhodne, a z další verze vypadne zrovna to, co potřebujete vy?

Na druhou stranu: Windows API má dneska kolem 14000 funkcí. I když dokumentace, kterou Microsoft k API poskytuje je (ve srovnání s jinými API) na dobré úrovni, je to, zatraceně, 14000 funkcí. Kdo se tohle může naučit? Kdo může mít alespoň základní přehled o tom, jak co správně udělat v kterékoliv oblasti, kterou to API pokrývá? Dobrá, dneska zadáte dotaz do Googlu, klik-klik, a o hodinu hledání dál máte zhruba dvě až tři diskusní fóra, ze kterých poskládáte jak udělat to co potřebujete udělat. Ale kdo z programátorů, po kterých šlape jejich šéf, že už to, sakra, mělo být dávno hotové, si vybere hodinu hledat, dvě hodiny studovat, a další hodinu programovat (správně), když může zmáčknout Win+R, napsat regedit, Ctrl+F, klepy-klepy-klep, hmmm, takže HKEY_LOCAL_MACHINE lomeno System lomeno... no vida, a už je to tady!? Samozřejmě kromě vás?

Proto není divu, že pro Windows vznikají -- ehm, jak to říct -- zprasené aplikace. I já sám jsem jistě spoustu věcí udělal nesprávně. A to ne proto, že bych je nechtěl udělat správně. Prostě nevím, jak to správně vypadá. Původně jsem si myslel, že by mi třeba pomohlo nějaké školení nebo knížka. Ale jak chcete udělat školení nebo knížku na 14000 funkcí? Mám Petzolda, který je jistě dobrý jako úplný základ, ale problém s aplikacemi je v tom, že mají řešit nějaký problém, a řešení takového problému se většinou skládá ze spousty ne zcela souvisejících pod-problémů. Jak se na tohle připravit? Jak máte vědět, co budete dělat příště (pokud tedy pracujete na více malých a krátkých projektech a ne na jednom velkém a dlouhém)? Myslím si, že jediné opravdu smysluplné řešení je průzkum bojem, kdy vám někdo zkušenější ukáže, co a jak. Ovšem kde pořád brát ty zkušenější lidi, to netuším.

Tenhle problém, myslím tu objemnost a horizontální rozplizlost, měl asi vyřešit .NET, a částečně se mu to i podařilo. Ovšem s každou další verzí .NET, přibývá jmenných prostorů a tříd a metod a jazykových konstrukcí .NET jazyků takovým tempem, že po pěti letech jsme se dostali skoro do stejné situace, v jaké jsme byli předtím: Vím jistě, že na tohle bude v .NET nějaká třída. Ale kde, proboha? A tak si programátoři znovu a znovu píší jednoduchá řešení složitých problémů, které už dávno někdo robustně vyřešil, jen o tom nikdo neví.

V každém případě: Windows je jeden z nejúžasnějších inženýrských projektů na světě. Ať už je to s jejich použitelností v jednotlivých verzích jak chce, tohle se jim upřít nedá. Při rozsahu, který mají, je vůbec div, že je ještě Microsoft dokáže udržovat, a občas dokonce i dál vyvíjet.

Představuji si, jak za milión let archeologové vyhrabou někde v místech, kde je dneska Seattle, server se zdrojovými kódy Windows, a vystaví je v muzeu, a děti se na to budou muset chodit dívat, a paní učitelky budou říkat Tady děti vidíte, kolik úsilí lidé dokázali vyvinout, když šlo o předměty sloužící nějakým tajemným divošským rituálům, a děti budou znuděně lepit na vitrínu žvýkačky a těšit se, až se na ty lidi půjdou podívat do zoo, a budou po nich házet kamínky a dělat na ně obličeje.

Děti už jsou prostě takové.

pátek, ledna 11, 2008

Už to začíná...

"Tati, a proč nevěříš v Boha?"