Steven
Steven5 perc olvasás

Mi is valójában egy 127 commitos kiadás

A GeekBye v1.7.0 tizenegy nap alatt 127 commit volt. Kívülről ez száz apró dolognak tűnik. Belülről két nagy funkció összefonása volt — és az egyiket rossz helyre építettük, majd menet közben kitéptük és újraépítettük. Íme egy nagy kiadás anatómiája.

Mérnöki munka
Kiadás
Architektúra
GeekBye kiadások
Mi is valójában egy 127 commitos kiadás

Van ennek a blogbejegyzésnek egy olyan verziója, amelyik csak felsorolja mindazt, ami a GeekBye v1.7.0-ban van — egy újratervezett kezdőképernyő, egy kalibrációs folyamat, egy összecsukható oldalsáv, új beállítások, és így tovább. Pontos lenne, és semmit sem tanítana neked. Mert egy 127 commitos kiadás őszinte története nem a lista. Hanem a forma.

Íme a forma. Százhuszonhét commit úgy hangzik, mint százhuszonhét apró dolog. Szinte soha nem az. A v1.7.0 két nagy funkció volt, párhuzamosan építve, hosszú életű brancheken, körülbelül tizenegy nap alatt, a végén összefonva. Egy nagy kiadás megértése azt jelenti, hogy megérted ezt a két szálat — és azt az egy helyet, ahol valamit rossz pontra építettünk, és menet közben ki kellett tépnünk.

Első szál: kalibráció

Az első szál a kalibráció volt — egy AI-alapú hangfelmérés a kommunikációs készségeidről. Elindítasz egy élő beszélgetést egy AI „karrier-coachcsal", végigmész egy strukturált fázissorozaton (bemelegítés, viselkedésalapú, technikai kommunikáció, nyomásreakció, célkitűzés), a végén pedig hat dimenzió mentén kapsz pontszámot: magabiztosság, tisztaság, konkrétság, elköteleződés, higgadtság, relevancia. A háttérben konkrét beszédmetrikákat is mér — a beszédtempódat, a töltelékszavak gyakoriságát, hogy a szüneteid stratégiainak vagy bizonytalannak hatnak-e.

A kimenet nem egy osztályzat, hanem egy kiindulópont. A kalibráció megadja az erősségeidet, a fejlődési területeidet, és — ami döntő — egy ajánlott nehézségi szintet, ahonnan érdemes elkezdened gyakorolni. Bekalibrálja, hol találkozzon veled a termék. Minden készség egy kibontható visszajelzési kártyaként tér vissza, egy összefoglalóval, egy konkrét javaslattal, és egy tényleges, idézett mondattal a saját beszélgetésedből példaként. Ez az a funkció, amelyre a gyakorlási élmény többi része épül.

Második szál: egy vadonatúj ablak

A második szál egy prémium újratervezés volt — és az újratervezés szó alábecsüli. Nem a meglévő képernyők átfestése volt; gyakorlatilag egy második alkalmazásablak volt, hat kifejezett fázisban kiépítve: egy összecsukható, Notion-stílusú oldalsáv, egy fejlécbeli legördülő menü, amely leváltotta a régi munkamenetlistát, böngészőstílusú navigáció előzményekkel és morzsamenükkel, valamint a Kezdőlap, a Profilok, a Meetingek és a Beállítások prémium újraépítése.

Két nagy funkció. Ez volt valójában a 127 commit. És a szállítás legnehezebb része nem egyikük megírása volt — hanem az összefonás. A két branch kölcsönösen függött egymástól; az egyiket beolvasztottuk a másikba, és a kalibrációs branchnek négy külön alkalommal kellett behúznia a main branchet, hogy ne sodródjon el, miközben az újratervezés alatta mozgott. A commitok száma nem egy nagy kiadás költsége. A hosszú életű branchek és az integráció sorrendje az.

A rész, amiért érdemes olvasni: rossz helyre építettük a kalibrációt

Íme a hiba, és ez egy jó hiba, mert annyira gyakori.

A GeekBye-nak van egy szilárd architekturális szabálya: minden AI-művelet a backenden lakik. A kliens egy vékony burok, amely egy szerverrel beszélget. Ezt mindenki tudta.

És a kalibrációt mégis először a kliens helyi adatbázisában építettük meg. Egy dedikált tábla, egy adatbázis-migráció, egy 254 soros repository, IPC-kezelők, és egy 515 soros felmérési kérdésbank — mind a felhasználó gépén lakva. Működött. És csendben megsértette azt a szerződést, amelyre az egész app épül.

Három nappal később egy commit 680 sort törölt nyolc fájlban, hogy az egészet áthelyezze a backendre, ahol a kalibrációs adatokból rendes szerveroldali modell lett, a kérdéslogika és a pontozás pedig szerveroldali ügy. Egy másik commit teljesen kitörölte az 515 soros kliensoldali kérdésbankot. A diff szinte vicces: egy beszúrás, hatszáznyolcvan törlés.

Senki sem indult neki azzal, hogy 680 sornyi eldobható kódot írjon. Úgy történt, ahogy ez mindig történik: a kliensoldali gyorsmegoldás ott van, gyorsabb helyben prototípust készíteni, és a „majd később áthelyezzük a backendre" ártalmatlannak tűnik. De amikor az architektúrád már megmondja, hol lakik az igazság forrása, bárhová máshová építeni nem gyorsmegoldás — hanem újramunka, amit előre beütemeztél magadnak. A tanulság, ami megmaradt: tedd oda, ahová a szerződés mondja, elsőre, még akkor is, ha a helyi verziót gyorsabb felállítani.

A hiba, amit csak az integráció találhatott meg

Még egy bizonyíték, mert ez a nagy kiadások jellegzetes hibázási módja. Amint a kalibráció és az új navigáció összedrótozódott, és ténylegesen futott, az app elkezdett átbillenni egy sebességkorláton — HTTP 429-eken — minden nyilvánvaló ok nélkül.

Az ok tiszta integráció volt. A kalibrációs státuszt komponensszinten kérdeztük le, így minden navigáció újralekérdezte — a React strict mode-ja pedig, amely szándékosan kétszer hívja meg az effekteket fejlesztés közben, hogy felszínre hozza a hibákat, ezt megint megkétszerezte. Az eredmény négytől nyolcig terjedő azonos kalibrációs kérés volt képernyőváltásonként, elég ahhoz, hogy átbillentse a szerver sebességkorlátozóját. A javítás a lekérdezést pár, felcsatoláskori hívásra konszolidálta.

Ezt a hibát nem találhattad volna meg úgy, hogy a kalibrációt teszteled önmagában, vagy a navigációt önmagában. Csak az illesztésnél létezik — ahol két, önmagában helyes funkció találkozik. Ez az az adó, amit egy nagy kiadás kivet: az utolsó kilométer nem a funkciók megépítése, hanem annak felfedezése, ami csak akkor törik el, amikor végre ugyanabban a szobában vannak.

Három dolog, amit egy nagy kiadás megtanított

  1. Egy 127 commitos kiadás két vagy három nagy téma, nem száz apró. Találd meg a szálakat. A munka — és a kockázat — abban lakik, ahogy összefonódnak, nem a számban.
  2. Tedd az igazság forrását oda, ahová a szerződés mondja, hogy lakik, elsőre. 680 sort töröltünk, hogy a kalibrációt kliensről backendre helyezzük át. A helyi gyorsmegoldás olyan újramunka, amit előre beütemeztél; az architektúra már megmondta a választ.
  3. Az integráció olyan hibákat hoz felszínre, amit az elszigetelés nem tud. A 429-es vihar a két helyes funkció közötti illesztésnél lakott, és csak akkor jelent meg, amikor együtt futottak. Számolj be egy integrációs menetre, ne csak a funkciónkénti tesztelésre.

Ez egy v1-korszakbeli unokatestvére egy történetnek, amit sokkal nagyobb léptékben mesélnénk el újra — lásd mit igényel valójában egy második verzió: 206 commitnyi őszinte állapot (v2.0.0), ahol ugyanaz a „egy nagy szám valójában néhány nagy ötlet" igazság játszódik le a teljes v2 újraíráson át. A v1-történet előző fejezetéért lásd hogyan streamelj egy élő jelentést villódzás nélkül (v1.6.13); a teljes ívért pedig a szoftver tökéletesre szállításának anatómiája.

Kapcsolódó cikkek

A backend kivétele a feltöltési útvonalból
Steven
Steven8 perc olvasás

A backend kivétele a feltöltési útvonalból

A GeekBye rögzíti a képernyődet, és elmenti a videót a Google Drive-odba. Az első verzió minden felvételt a GeekBye saját szerverein keresztül továbbított odafelé; egy kiadással később a fájl egyenesen a gépedről ment a Drive-ba, a backendet pedig lefokozták egyetlen mutató tartására. Az érdekes rész az, hogy milyen kevés kódot tartalmaz valójában a „közvetlen, folytatható" verzió — mert a folytathatóság egy proxy törléséből jött, nem a megírásából.

Mérnöki munka
Architektúra
Desktop
Egy kódbázis, két app: hogyan white-label-ezz fork nélkül
Steven
Steven5 perc olvasás

Egy kódbázis, két app: hogyan white-label-ezz fork nélkül

A GeekBye és a Pavleur két eltérő brandű desktop alkalmazás, amelyek egyetlen repositoryból épülnek — nincs fork, nincs duplikált kódbázis. Íme a build-időben működő gépezet, amelytől egy kódbázis két termékké fordul le, és az az egysoros hiba, amitől a második appunk rossz néven mutatkozott be.

Mérnöki munka
Architektúra
Build
A csend teherhordó volt
Steven
Steven7 perc olvasás

A csend teherhordó volt

A GeekBye v1 utolsó két kiadása ugyanarról a kényelmetlen igazságról szól: a valós idejű átírás egy valódi hálózaton nem veszteségmentes, és az őszinte lépés az, hogy abbahagyod az úgy tenni, mintha az lenne. A v1.8.20 minden audio chunk másolatát a lemezen tartotta, mielőtt egy újracsatlakozás során eldobta volna, és elkezdte hangosan megjelölni a réseket az átiratban. A v1.9.0 abbahagyta a csend küldését, hogy sávszélességet spóroljon — és felfedezte, hogy a csend pontosan az a jel volt, amelyet az átíró használt annak megállapítására, hogy egy mondat véget ért. Két kiadás a dolgok eldobásának költségéről.

Mérnöki munka
Audio
Megbízhatóság