A legutóbbi Solaris bejelentés kapcsán menetrendszerűen előjött, hogy bezzeg a Solarisban mennyire jó a stabil API, és Linuxban mennyire gáz, hogy folyamatos szívás van a változó API-k instabil implementációival.
Én azt nem tudom, hogy hogyan lehetne másképpen csinálni a Linux esetében? Mert egy alapvetően kereskedelmi rendszernél tudom a megoldást. Kell néhány tökös architekt, akik szép szóval - korbáccsal terelgetik a fejlesztőket a helyes irányba.
Linuxnál odáig könnyű eljutni, hogy "legyen jól megtervezett, stabil API". Csak utána a megvalósítási javaslatok el szoktak akadni.A probléma nagyon sokrétű:
- kultúra (cowboy-kódolás, "worksforme", "már csak tesztelni kell")
- technológia (nagyon sok architektúra, nagyon sok támogatott hardver, ... etc.)
- tesztelők kevesen vannak, és csak nagyon korlátozott konfigurációkon tesztelnek
- kevés kód review
- elégtelen fejlesztőeszközök
- nagyon sok ágon, sok irányba folyik a fejlesztés, az egyetlen minimális kohéziós erő a "mainline-ba kerülés" célja
...stb.
Ugyanakkor látszik, hogy a Linux ipar gyakorlatilag ehhez a helyzethez adaptálódott: a felhasználókat használják béta tesztelőnek
- "stabil" kernel kiadások pár havonta
- kb. félévente "stabil" Ubuntu, Fedora, OpenSuse kiadások, ahonnan a kitesztelt feature-ök bekerülnek az "enterprise" változatba)
Ha visszanézünk a kernelfejlesztés történetére:
2.0-nál azt mondtuk, várunk 2.0.5-ig, mielőtt felrakjuk.
2.2-nél talán 2.2.10 volt a mondás?
2.4-nél, ha jól emlékszem ez még tovább tolódott. Emlékszem olyanokra, hogy majd 2.4.30-nál...:)
Ez azt is jelentette, hogy egyre kevesebben használtak fejlesztői kernelt, ezért egyre kevésbé voltak kitesztelve, közben egyre nagyobb mennyiségű kódot kellett volna tesztelni.
Erre volt válasz a külön "fejlesztői fa" megszüntetése. Persze a felhasználó nem hülye, és most már elég ritkán van arra szükség, hogy maga fordítgasson kernelt, tehát ő használja a disztribútorok kerneleit. Ergo a vanilla kerneleknek megint kicsi a tesztbázisa, a disztribútorok tesztkapacitása véges, tehát megint a végfelhasználók fogják tesztelni...
Ezen csak több QA erőforrással lehetne segíteni, de:
-a QA néhány megszállott embertől eltekintve tipikusan "fizetett munka" jellegű tevékenység
-a cégek saját QA erőforrásaikat nyilván a saját érdekeiknek megfelelően vetik be, és nem a vanilla kernel feature by feature tesztelésére
-nincs túl nagy hagyománya az automatizált teszteknek a kernelfejlesztők körében, az LTP nekem édeskevésnek tűnik.
- elsőként el kéne dönteni, hogy _mit_ akarunk tesztelni, és mikor tekintjük a tesztet sikeresnek...egyik sem triviális
- ezt a tevékenységet valamilyen non-profit, de anyagilag jól támogatott szervezetnek kéne koordinálnia, pl. Linux Foundation. Egyelőre nem látni túl nagy mozgást ezen a téren.
"Jól megtervezett API-k":
API tervezésnek több módja van, lássuk hogyan működik ez Linux esetében (vigyázat, a következő rész erős iróniát tartalmaz):
1. Bizottság alapú:
- követelményeket gyűjtünk: ezeket az emaileket senki nem olvassa el, ha konferenciát szervezünk, arra kb. 5 ember jön el, akikkel egyébként is egyetértünk
- összerakjuk az API-t, kiküldjük reviewra: most kapunk 3 kommentet, amiből 2 a névkonvenciónkat vitatja, 1 pedig felhívja a figyelmet néhány nyelvtani hibára a kommentekben.
- implementáljuk: mire idáig eljutottunk, Gipsz 23 Jakab egyetemi hallgató már összehackelt egy megoldást a problémára, ami ugyan nem olyan jó mint a mienk, de már van 10 másik felhasználó, és ezerrel lobbiznak, hogy az övék kerüljön bele a kernelbe.
2. Evolúciós alapú:
- gyorsan eljutunk worksforme szintre
- ezerrel nyomjuk a marketinget (LWN cikk havonta a minimum :) )
- belobbizzuk a mainline-ba, amint már 1 architektúrán nem Oops-ol.
- ha egy másik architektúra/alrendszer/driver jön, hogy ez náluk így nem fog menni / lassú lesz / nem így kéne, akkor szétflameljük őket
- amig ők a flametől égő sebeiket nyalogatják, gyorsan összedobjuk a v2-t az API-ból, ami néhány dolgot javít a jogos észrevételek közül. Persze a lényeget nem.
- mivel már a mainline-ban vagyunk, v2 pikk-pakk bekerül (Andrew Morton morog egy kicsit, de senkit nem érdekel mit mond)
- ezzel egyidőben bejelentjük, hogy a current + 1 -es verziótól a v1-et nem támogatjuk, mindenki portoljon v2-re.
- ...
Mivel tudjuk, hogy a Linux esetében jelenleg kizárólag a 2. verzióval lehet eredményt elérni (akik az elsőt próbálták, nagyrészt még mindig out of tree patchként tengetik életüket), és fentebb illusztráltuk, hogy ez félkész kódokat / rossz API-kat eredményez, szerintem jobban járunk, ha nem próbálják a rossz API-kat bebetonozni, és 10+ éven át támogatni...
Persze, ha valaki rájön, hogy hogyan lehet gyorsan, jó és időtálló API-kat tervezni, amelyek kiscsillió architektúrán/hardver eszközzel működnek, egymásnak ellentmondó követelményeknek felelnek meg (embedded vs. enterprise), és Gipsz 23 Jakab egyetemi hallgató, valamint Xi Huan junior szoftverfejlesztő is képes őket használni, akkor szerintem nagyon sokan imába foglalják majd a nevét...
Nektek mi a véleményetek?
Üdv,
Gergely