Každý problém v programování můžeme vyřešit přidáním další vrstvy abstrakce
Každá netriviální abstrakce do určité míry prosakuje.
Zákon prosakujících abstrakcí (Joel Spolsky)
Prosakující (děravá, leaky) abstrakce je termín, který zpopularizoval Joel Spolsky ve svém článku „Zákon prosakujících abstrakcí“. O co jde? V programování a obecně v informatice si potrpíme na abstrakce. Uvedu příklad ze světa Javy. Používáme ORM nástroje jako je Hibernate. Ty nám krásně odabstrahují všechny ty složitosti za tím. Nemusíme vědět nic o JDBC, SQL, Oraclu nebo Solarisu, stačí nám znát JPA a o zbytek je ukryt za stěnou abstrakcí. Prostě si jenom žijeme v krásném objektovém světe a od hrůz vrstev které jsou pod námi jsme odstíněni. To je ovšem pravda jen dokud nedojde k problémům. Jakmile něco přestane fungovat, začnou k nám prosakovat vrstvy od kterých jsme byli původně odstíněni. Takže musíme vzít kladivo a prosekat se na místo kde problémy vznikly. Takže se najednou musíme začít zabývat nastavením JDBC nebo efektivitou generovaných SQL příkazů. Když je problém hodně exotický, tak si musíme nastudovat jak fungují transakce v Oraclu, indexy nebo dokonce souborový systém v Solarisu. Ocituji Joela:
Všechno tohle paradoxně znamená, že ačkoliv máme programovací nástroje stále vyšší a vyšší úrovně s vyšší a vyšší úrovní abstrakce, je stále těžší a těžší stát se dobrým programátorem.
Kdysi programátorovi stačilo umět JDBC a SQL. Pak přišli ORM nástroje a od JDBC ho odstínili. No jo jenže chudák programátor potřebuje řešit problémy. Takže mu nestačí znát jen ORM, musí se orientovat i ve vrstvách pod ním. Dnešní programátor tak toho musí umět víc než kdysi.
No a proč to vlastně píšu. Narazil jsem na úplně úžasný příklad prosakujících abstrakcí. Mám notebook s Ubuntu. Když jdu ve Firefoxu na stránky grails.org, celý systém na pár sekund úplně zatuhne. Když se podívám co se v děje, tak vidím, že X Windows žerou 100% procesoru. Ostatní stránky ale fungují normálně. Evidentně je tedy chyba na stránce grails.org. No ale v ostatních prohlížečích stránka funguje skvěle. Takže by to bylo Firefoxem? Ale na Windows to ve Firefoxu funguje dobře. Tak že by za to mohlo Ubuntu? Jiné prohlížeče nemají s danou stránkou na Ubuntu problém. Tak čím to může být? Záhada. Naštěstí máme Google. Ten nám prozradí, že se to děje v pouze v kombinaci nVidia grafická karta, nVidia proprietární ovladač, Linux a grails.org nebo pár dalších stránek. Vypadá to, že grails.org mají v kaskádovém stylu (CSS) zadanou nějakou nesmyslně velkou hodnotu, kterou daný ovladač špatně vyhodnotí a začne počítat na CPU místo na grafické kartě. Nebo tak něco.
V tomto případě nám prosákly detaily práce grafické karty až do CSS. Zkrátka průsak skrz celý notebook. Teď si představte, že by se vám stalo něco podobného při vývoji interní aplikace. Google by vám v tom případě nepomohl. Měli byste jen chybové hlášení od pár uživatelů a vůbec byste mu nevěřili. Vždyť to všem ostatním funguje. Vždyť je to webová stránka, ta je přeci nezávislá i na operačním systému, natož pak na hardware. A ono ne. Ovladač grafické karty, operační systém i prohlížeč jsou jen vrstvy abstrakce. A jelikož jsou netriviální tak občas prosakují.
pekny clanek
Dve mouchy jednou ranou. S Grails.org mam stejny problem a dlouho dobu jsem si myslel, ze je chyba na moji strane ;-). Navic ta teorie prosakujici abstrakce je skoro bych rekl dokonala. Nastesti mame Google a pouzivame proverene abstrakce, takze to prosaknuti se docela minimalizuje nemyslis?
I prověřené abstrakce prosakují. Když se vrátím k tomu Hibernatu, tak stejně z důvodu výkjonu potřebuju tu a tam ladit SQL. Tzn. SQL mi prosakuje skrz ORM abstrakci.
Hibernate daleko hur prosakuje do hornich vrstev – pokud nepouzivam DTO tak ve vrstvach nahore musim resit veci jako napr. jak spravne mazat z collection, abych to pak mohl ulozit.
Pekny clanek 🙂
Skvelý príspevok. K tomu citátu Joela mám chuť napísať “konečne to niekto pochopil”.
Velmi zajimavy a poucny prispevek. Chlapi, vykaslete se na Hibernate a pouzivejte iBATIS 😉
Tak mě napadají tři věci: Dependency Injection, Dependency Injection a na závěr Dependency Injection. Díky tomu si uvědomím obalené vrstvy a pokud jim nerozumím, můžu to předat někomu zkušenému.
Koukám rok a půl starý článek (narazil jsem na něj z Dagiho posledního tweetu), ale stále aktuální. Ještě bych jako krásný příklad prosakující abstrakce uvedl LaTeX jako pokus o odstínění TeXu.
Jojo, teď zrovna dělám v LaTeXu a občas na něco trošku narážím…