Cestou do práce jsem tuhle poslouchal díl Hanselminutes, který se věnuje provařeným “anti-patternům” jako Copy Paste Programming, Iceberg Class, Copy Folder Versioning atd. – v podstatě je celý díl komentářem k tomuto motivačnímu kalendáři.
Jedním z probíraných antipatternů je i Reinventing the Wheel, který úzce souvisí se syndromem NIH, Not Invented Here. Ten je zhruba o tom, že některé týmy a priori odmítají cizí software s tím, že “nebyl vynalezen zde” a přinesl by víc potíží než užitku. Takové uvažování je zvlášť v agilní komunitě považováno za špatné, za “anti-pattern” a nálepka NIH má náležitě pejorativní nádech. Ale víte co? Čím jsem starší, tím víc NIH chápu.
Software se totiž dělí do dvou skupin – ten z první skupiny funguje dobře a ten z druhé ne. Hranice mezi těmito skupinami je bohužel tenká a často subjektivní a problémem cizího software je, že málokdy lze dopředu odhadnout, do které vlastně patří. Už se mi tak mnohokrát stalo, že jsem si řekl “nebudu programovat nic vlastního, prostě použiju nějaké stávající řešení”, a pak následovalo zhruba tohle:
- Vygooglil jsem si několik řešení pro můj problém
- Zkontroloval licence
- Strávil čas hledáním ohlasů na jednotlivá řešení, abych vyloučil outsidery nebo naopak objevil “hvězdy”
- Zkontroloval další metriky, které mě obvykle zajímají, např. jaká je komunita okolo projektu, jestli je aktivně vyvíjen, jestli se fixují bugy apod.
Nakonec jsem nějaké řešení vybral, nasadil a… a byl zklamán, protože software aplikován na můj konkrétní případ s mými konkrétními požadavky měl nějaký problém. Takže znovu – zkusit dalšího kandidáta, strávit s ním další čas, zjistit, jestli vyhovuje atd. Někdy navíc ani není možné během krátké zkušební doby zjistit, jestli software 100% vyhovuje, což pak může vést ke scénáři, který bych nikomu nepřál, ale který jste patrně všichni někdy zažili. Ke scénáři zvanému noční můra.
Noční můra je, když se ze začátku cizí software tváří schopně, a až časem, velmi postupně, zjišťujete, že řešení vlastně moc nevyhovuje. Ne, nevyhovuje je slabé slovo, po čase zjistíte, že původní řešení z duše nenávidíte. Stalo se mi to u několika zásadních věcí, jako je třeba zvolené CMS pro web, zvolený mikro-framework pro zákaznickou aplikaci, jeden interní systém apod. Ve všech těchto případech nastalo řekněme po roce používání nepříjemné dilema – trpět dál s cizím systémem, zkoušet ho upravit, pokud to vůbec jde, nebo s relativně vysokými náklady migrovat někam jinam? Ale kam? Na “NIH” nebo “IH” řešení?
Čím víc podobných zkušeností jsem udělal, tím víc NIH chápu. Ano, jsou věci, kde NIH považuji za jasný syndrom, např. bych v .NETu rozhodně nezvažoval psát vlastní unit testing framework, ale ani u těchto věcí nikdy neříkej nikdy – třeba Jakub Vrána teď napsal “yet another” minifikátor JavaScriptu, a přesto k tomu měl dobré důvody:
- JSMin měl problematickou licenci
- Dal si tu práci, vyzkoušel několik stávajících řešení, a řada z nich kupodivu obsahovala chyby (viz článek a komentáře)
Ostatně, zkušenost s cizím SW popisuje Jakub takto:
Přiznám se, že cizí knihovny nepoužívám moc ochotně. Nejdřív strávím spoustu času hledáním té, která by mi vyhovovala. Pak často zjistím, že mi stejně něčím nevyhovuje. Když to opravím, pošlu změnu autorovi a on ji přijme, tak čekám na vydání nové verze. Když vyjde, tak musím otestovat, jestli se neporouchalo něco jiného. Cizí knihovny taky často mají závislosti (např. na Javě), které já vyžadovat nechci.
Takže asi tak. Osobně se stále snažím hledat existující software, který by můj problém řešil, a často je to pragmatické – přeci jen třeba naprogramovat celé CMS je tak velká práce, že je výhodnější se občas zavztekat nad WordPressem. Přesto jsem během posledních let svůj vztah k NIH přehodnotil – docela tento syndrom chápu. Software is hard.
Vidím to stejně. Využívat cizí řešení jen proto, že existují, je snad ještě horší než NIH ;)
Ještě veselejší je, pokud vám na stole přistane projekt, který je časově navržený podle myšlenky “všechno už bylo vymyšleno, tak to stačí vyguglit, poslepovat, testy nejsou potřeba a máme hotovo” a pro jistotu se zákazníkovi na beton slíbí, že to zvládneme i za polovinu navrženého času :-))
Pro mě v tomhle existuje hranice: je-li ta aplikace “jádrem podnikání”, nedeleguji ji na suboptimální službu a napíšuji ji sám. Pokud je aplikace jen doplněk podnikání, použiju 3rd party soft i za cenu velkých kompromisů.
Jádro podnikání pro mě je: co musím odebrat, aby firma X přestala být (řeznictvím | e-shopem | půjčovnou kol). Pokud potřebuju doplňkovou knihovničku, zase jsem ochotnější přepisovat po svém něco do programu, jež je jádrem podnikání, než do nějaké podpůrné appky.
JK: Řekněme, že je DevBlog “podnikání” – prostě nějaký dlouhodobý projekt, který má své cíle, náklady i očekávané “výnosy”. “Jádrem” tohoto “podnikání” je pak nepochybně blog sám a službami okolo by se dala nazvat třeba propagace na sociálních sítích, sbírání nápadů na články ve OneNote, evidování věcí, co je potřeba udělat, v nějakém úkolovníku apod. Tyhle věci okolo lze jasně dělat v nějaké 3rd party aplikaci, ale říkáš, že by sis CMS pro DevBlog psal sám, protože je tím jádrem?
Já nevím, toto rozdělení na core business a věci okolo jsem slyšel už několikrát, ale nejsem si jistý, jestli mi to tak úplně dává smysl. Koneckonců, každá aplikace stojí na nějaké platformě nebo technologii a ta je téměř vždy 3rd party. Cizím řešením se tedy nelze vyhnout a rozdělení na core vs. věci okolo je sice hezké, ale v praxi je potřeba řídit se jinými věcmi než touto hezkou, ale IMO příliš zkratkovitou poučkou.
Jádrem DevBlogu není CMS, ale samotné texty. Takže jádra by ses zbavil tak, že místo psaní vlastních textů (a případně i dalších autorů) bys přetiskoval to, co píšou jinde.
Pingback: Tisíc pohledů na TDD | DevBlog
možno by bolo riešenie zabaliť 3rd party library do interface, ktorý nám vyhovuje a ten implementovať tou konkrétnou knižnicou. možno nenájdeme inú 3rd party, ktorou by sa to dalo nahradiť, ale vždy môžeme potom urobiť našu implementáciu a tú podhodiť cez IoC alebo nejak inak. či kecám? :)
Dušan: Někdy to jde, někdy ne nebo by to bylo příliš pracné.
Pingback: NIH v praxi – syntax highlighter pro WordPress | DevBlog
Ale představte si malou SW firmu, která si mimo jiné interní systémy vyvíjí i vlastní účetnictví a považuje to za výhodu, přestože “konkurenční” produkty nesledují již řadu let ani z dálky. Bomba je, že v CZ minimálně jedna taková opravdu stále existuje.
Před rokem ’89 bylo běžné aby si podnik vyvíjel kompletně vlastní informační systém.
To jsou pravé odstrašující příklady NIH a proto je tento syndrom třeba přednášet na každé škole, která se zabývá softwarem byť i víceméně okrajově.
Naštěstí takovéto věci jsou již extémem. Vyvinout si vlastní věc, když ty v oboru existující znám, a vím kolik mě to bude stát je ok.