Történetek Korábbi munka, 2026
Feltétel nélkül
Feature flagek interfészként és osztályként, hogy a hívás helyén látszódjon, mit csinál a kód, a többit pedig a fordító ellenőrizze
Írta: Fejér Attila Megjelent:
A feature flagek általában szétszórt if-else blokkokban vannak a kódban, olyan szöveges kulcsokkal, amelyeket senki sem ellenőriz. A FlagZen projektet azért készítettem, hogy ezeket eltüntessem szem elől: a flag egy interfész lesz, minden variánsa egy osztály, a megfelelőt pedig generált kód választja ki. A flaget használó kód egyetlen metódust hív meg, a feltételek pedig rejtve maradnak. Amit lehet, azt a fordító ellenőrzi. Nyílt forráskódú, az 1.1.0-s verzió elérhető Maven Centralon. Nem tudok róla, hogy élesben bárki használná.
- Az ötlet
- a flag egy interfész, minden variánsa egy osztály
- Fordításkor ellenőrizve
- a variánsok értéke, típusa és az ismétlődő értékek
- Állapot
- nyílt forráskódú, 1.1.0, még nincs éles felhasználója
Előzmények
A feature flageket szinte mindenhol ugyanúgy használják. Valahol a kódban egy if lekérdezi a flag providertől egy szöveges kulcs értékét, a két ágban pedig a régi és az új viselkedés van. Egy fontos flag sok helyen felbukkan, mindenhol a saját if-jével. Ha a flaget kivezetik, mindegyiket meg kell keresni. Ha valaki elgépeli a kulcsot, semmi sem jelzi a hibát, amíg le nem fut a rossz ág.
A feltételek ráadásul elrejtik a kód szándékát, és engem ez zavart a leginkább. Ahhoz, hogy megértsük, mit csinál egy kódrészlet, előbb ki kell bogozni, melyik ág fut le, az üzleti logika pedig elbújik a flag-ellenőrzések között. Senki sem kérte, hogy ezt megoldjam, a feature flagek enélkül is működnek. De írtam már arról, hogyan lehet a feltételes szerkezeteket polimorfizmussal kiváltani egy switch-case-ről szóló cikksorozatban, és feltettem magamnak a kérdést: miért lennének kivételek a feature flagek?
A megoldás
A FlagZen egy dispatch réteg a csapat által már használt flag provider fölött, amilyen például a LaunchDarkly, az OpenFeature vagy a Togglz. Nem kezel flageket, targetálást vagy A/B tesztelést, ez továbbra is a provider dolga. A projekttel együtt érkező, környezeti változókra épülő és hasonló providerek csak kényelmi megoldások, nem teljes értékű flag providerek.
A flag egy feature-ként megjelölt Java-interfész, minden variánsa pedig egy osztály, amely megvalósítja. Fordításkor egy annotation processor legenerálja azt a kódot, amely lekérdezi a providertől az aktuális értéket, és meghívja a hozzá tartozó osztályt. A flaget használó kód kap egy példányt, és meghívja rajta a metódust. Nincs if, amit ki kellene bogozni, és ha a flag értéke megváltozik, már a következő hívás az új variánst éri el, újraindítás nélkül.
Mivel a flagek és a variánsaik típusok, a fordító ellenőrizni tudja őket. Ha egy variáns értéke vagy típusa nem illik a feature-höz, a build sikertelen. Ugyanez történik két azonos értékű variánsnál is. Egy nem használt variánsra figyelmeztetést kapunk. Egy flag kivezetése az interfészének törlését jelenti, és a fordító megmutat minden helyet, amely még használja.
Eredmények
A FlagZen nyílt forráskódú, Apache 2.0 licenccel. Az 1.1.0-s verzió elérhető a Maven Centralon, Spring Boot-, OpenFeature-, LaunchDarkly- és Togglz-adapterrel. Tudomásom szerint élesben még senki sem használja, és a fejlesztés folytatódik. Ez kutatás és törekvés a feature flagek olyan írásmódjára, amelyet a saját kódbázisaimban is szívesen látnék, és amelyet bárki kipróbálhat.
A tanulság
Amit a fordító ellenőrizni tud, azt érdemes vele ellenőriztetni. Egy fordításkor elkapott hibát sokkal olcsóbb kijavítani, mint egy olyat, amely eljut a felhasználóig, és neki is gondot okoz. Ezért is részesítem előnyben az erősen típusos nyelveket.
És ne féljünk megkérdőjelezni, amit mindig is egy adott módon csináltunk. Ha soha nem kérdőjelezzük meg a szokásainkat, még a működőket sem, nem születik semmi új.
További történetek
Minden korábbi munka Minden történet
Továbbiak fejlesztőcsapatoknak
Esettanulmány 2024–2026
XP coaching 300+ Fortune 100-es csapatnál
Két év, nagyjából 1 000 coacholt ember, és körülbelül 10%-kal jobb átfutási idő (lead time) és hibás változtatások aránya (change failure rate)
Hogyan vitte el egy Fortune 100-as pénzügyi cég a csapatait az extreme programming felé: mit változtatott két hét tanteremben és hat hét a csapatok mellett, és mely szokások élték túl a coachok távozását.
ElolvasomKorábbi munka 2020–2022
Kerékcsere menet közben
Egy több tíz terabájtot archiváló monolit migrálása microservice architektúrára, miközben a rendszer zavartalanul üzemelt
Hogyan került át egy több tíz terabájtnyi érzékeny adatot archiváló és kereső rendszer egy monolitból és egy asztali kliensből microservice-ekre, az egész rendszer egy lépésben való újraírása nélkül: a sorrend, a számok, és hogy mikor csinálnám újra így.
ElolvasomKorábbi munka 2017–2019
Oszd meg és cache-elj
Egy kezdőoldal, amely 300 felhasználónál 10 másodperc alatt töltődött be, majd egy lekérdezés négyre bontása után 2000 felhasználónál 20 ms alatt
Közvetlenül egy közszféra-platform első élesítése előtt a kezdőoldal nem bírta a terhelést. Hogyan találtuk meg a profilozással az okot, miért nem segített az indexelés, és mi lett a megoldás.
ElolvasomHol rejtik el a feltételek a szándékot a kódjukban?
Egy rövid beszélgetés arról, hol nehezíti meg a kódjuk felépítése a változtatásokat. Javaslattal távoznak arról, hol érdemes kezdeni.