Afișați HN: Rev-dep – build alternativă knip.dev de 20 ori mai rapidă în Go
Comentarii
Mewayz Team
Editorial Team
Taxa ascunsă pentru fiecare echipă de software în creștere
Orice proiect software care supraviețuiește suficient de mult se confruntă în cele din urmă cu aceeași criză liniștită: baza de cod începe să crească mai repede decât poate înțelege echipa. Funcții pe care nimeni nu le apelează, exporturi care au fost create pentru o caracteristică care a fost livrată în 2022 și a fost depreciată în liniște, componente care trăiesc pe disc, dar nu ajung niciodată la un browser. Aceasta nu este neglijență - este fizică. Echipele se mișcă rapid, cerințele se schimbă, iar entropia este necruțătoare. Întrebarea nu este dacă baza de cod are cod mort. Întrebarea este cât te costă acum.
Conform cercetării echipei de inginerie de productivitate a Google, dezvoltatorii petrec în medie 42% din timpul lor de codare citind și înțelegend codul existent, mai degrabă decât scriind noi funcționalități. Atunci când acel cod existent include mii de linii care nu mai servesc niciunui scop, procentul respectiv se înclină și mai mult. Pentru o echipă de zece ingineri, înseamnă efectiv patru angajați cu normă întreagă care nu fac nimic productiv – nu pentru că sunt leneși, ci pentru că instrumentele lor nu țin pasul cu viteza cu care software-ul îmbătrânește.
De aceea, un nou val de instrumente pentru dezvoltatori, construite pe limbaje de sistem precum Go și Rust, generează entuziasm real în cercurile de inginerie. Instrumente precum Rev-dep – un analizor invers de dependență care pretinde că rulează de 20 de ori mai rapid decât popularul knip.dev bazat pe JavaScript – reprezintă mai mult decât o simplă îmbunătățire incrementală. Ele semnalează o regândire fundamentală a modului în care instrumentăm procesul de dezvoltare în sine.
Ce face de fapt analiza inversă a dependenței
Înainte de a înțelege de ce viteza contează atât de mult, vă ajută să înțelegeți ce fac instrumentele de analiză a dependenței. Într-un proiect JavaScript sau TypeScript, fiecare fișier se importă din alte fișiere. Fiecare funcție, clasă sau constantă care este exportată dintr-un modul creează o dependență potențială - ceva pe care s-ar putea baza alte părți ale bazei de cod. Analiza dependenței „inversă” inversează această perspectivă: în loc să întrebe „de ce depinde acest modul”, ea întreabă „ce depinde de acest modul?”
Dacă răspunsul la a doua întrebare este „nimic”, ați găsit un cod mort. Un export pe care nimic nu îl importă este deșeuri. O funcție pe care nimic nu o numește este datoria tehnică cu o dobândă lunară. Instrumentele de dependență inversă parcurg în mod sistematic întregul grafic al proiectului, mapează fiecare relație dintre module și evidențiază nodurile care nu au conexiuni de intrare. Rezultatul este un audit precis al tuturor elementelor din baza de cod care ar putea fi eliminate în siguranță.
Knip.dev face acest lucru bine pentru proiectele JavaScript și TypeScript și este larg respectat în comunitate. Dar este scris în JavaScript, ceea ce înseamnă că rulează pe Node.js, ceea ce înseamnă că moștenește toate constrângerile de performanță cu un singur thread ale Node atunci când efectuează traversarea la scară largă a sistemului de fișiere și analiza simbolurilor. Pentru un proiect cu 500 de fișiere, este bine. Pentru un proiect cu 50.000 de fișiere — genul de monorepo care alimentează produsele SaaS reale pentru întreprinderi — analiza poate dura câteva minute. Iar minutele, la cadența la care funcționează conductele moderne CI/CD, este un dealbreaker.
De ce Go modifică calculul
Go a fost proiectat de la zero pentru exact tipul de sarcină de lucru pe care o cere analiza dependenței: I/O rapidă pentru fișiere, primitive excelente de concurență și supraîncărcare minimă de rulare. Acolo unde Node.js procesează o sarcină la un moment dat pe un singur fir și se bazează pe apeluri inverse și promite să falsească paralelismul, Go poate genera mii de rutine care se execută cu adevărat în paralel pe toate nucleele CPU disponibile. Pentru o sarcină care implică citirea a sute de fișiere, analizarea AST-urilor acestora și construirea unui grafic al relațiilor dintre simboluri, această diferență arhitecturală se traduce direct în performanța ceasului de perete.
Accelerarea de 20 ori revendicată de Rev-dep nu este magică - este ceea ce se întâmplă atunci când potriviți limba potrivită cu problema potrivită. Natura compilată a lui Go înseamnă, de asemenea, nicio penalizare de încălzire JIT. De la pornirea la rece până la analiza completă, un binar Go funcționează la performanță aproape de vârf. Implicația practică este că analiza care a durat 90 de secunde într-un instrument bazat pe Node se poate finaliza în mai puțin de 5 secunde într-un echivalent Go bine implementat. Aceasta este diferența dintre o verificare pe care dezvoltatorii o omite pentru că „durează o veșnicie” și una care rulează la fiecare commit fără ca nimeni să observe costul general.
„Cel mai bun instrument pentru dezvoltatori este cel care iese din cale. Dacă suita dvs. de analiză adaugă trei minute la fiecare conductă CI, dezvoltatorii vor găsi modalități de a-l omite. Viteza nu este deloc plăcută – este condiția prealabilă pentru adoptare.”
Cazul de afaceri pentru Codebase Hygiene
Codul mort nu este doar o problemă de estetică a dezvoltatorului, ci are consecințe concrete de afaceri care se agravează în timp. Luați în considerare cât costă de fapt bazele de coduri umflate pentru organizații:
- Timp de construcție mai lungi care încetinesc conductele de implementare și reduc numărul de versiuni pe care o echipă le poate livra în siguranță pe săptămână
- Încărcare cognitivă mai mare pentru inginerii de la bord, care trebuie să petreacă săptămâni pentru a distinge modelele active de cele abandonate
- Dimensiuni mari ale pachetelor care afectează performanța aplicațiilor, în special în aplicațiile web în care fiecare kilooctet afectează timpii de încărcare și ratele de conversie
- Extinderea suprafeței de securitate — codul mort care conține încă dependențe este încă un vector pentru vulnerabilități în acele pachete
- Suite de teste umflate unde testele pentru funcționalitatea eliminată continuă să ruleze, consumă minute CI și, uneori, eșuează în moduri confuze
- Semnale false de complexitate care îngreunează deciziile arhitecturale, deoarece nu este clar ce este portant și ce este vestigial
Un studiu din 2023 al grupului DevOps Research and Assessment (DORA) a constatat că echipele cu practici puternice de calitate a codului, inclusiv eliminarea obișnuită a codurilor nefuncționale, au livrat de 2,4 ori mai frecvent și au avut rate de eșec a modificării de 7 ori mai mici decât echipele care au lăsat să se acumuleze datoria tehnică. Corelația nu este întâmplătoare. Bazele de cod curate sunt mai ușor de raționat, mai ușor de testat și mai ușor de schimbat în siguranță.
Pentru companiile care se bazează pe platforme precum Mewayz – care alimentează 138.000 de utilizatori în 207 module de afaceri distincte, de la CRM și salarizare până la instrumente de gestionare a flotei și link-in-bio – sănătatea codului de bază a înmulțit mizele. Când platforma dvs. se întinde pe atâtea domenii funcționale, suprafața de integrare între module este enormă. Exporturile neutilizate într-un modul de bază pot crea așteptări false pentru modulele dependente, pot declanșa redări inutile în stratul UI și pot complica graficul dependenței în moduri care fac schimbările viitoare riscante.
Integrarea analizei dependenței în fluxurile de lucru moderne de dezvoltare
Puterea reală a instrumentelor rapide precum Rev-dep nu este curățarea unică pe care o permite, ci este capacitatea de a efectua analize continue ca parte a ciclului tău normal de dezvoltare. Când o scanare a unui cod mort durează 4 secunde în loc de 4 minute, îl puteți adăuga la cârligele de pre-commit. Când durează 4 secunde în loc de 4 minute, conducta CI poate eșua o solicitare de extragere care introduce noi exporturi neutilizate, în loc să le permită să se acumuleze în tăcere.
💡 DID YOU KNOW?
Mewayz replaces 8+ business tools in one platform
CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.
Start Free →Această trecere de la „eveniment de curățare trimestrial” la „poartă de calitate continuă” este analogă cu ceea ce s-a întâmplat atunci când linter-urile au devenit suficient de rapide pentru a rula la fiecare apăsare de tastă dintr-un IDE. Înainte ca ESLint să ruleze în timp real, stilul codului era impus prin revizuiri periodice ale codului. După aceea, a devenit ambient - o parte din bucla de feedback pe care dezvoltatorii au experimentat-o în timpul scrierii codului, nu după. Analiza rapidă a dependenței poate crea aceeași presiune asupra calității mediului în jurul codului mort.
Configurarea acestui flux de lucru implică de obicei trei componente:
- Analiză de bază: rulați instrumentul pe baza de cod actuală pentru a înțelege amploarea codului inactiv existent. Nu încercați să remediați totul dintr-o dată — triați după modul și prioritizați în funcție de risc.
- Implementarea CI: adăugați analiza în conductă cu un prag - eșuați pentru orice exporturi neutilizate recent introduse, dar nu eșuați pe cele existente până când nu le-ați curățat.
- Sprinturi de curățare programate: utilizați rezultatul instrumentului pentru a ghida activitatea obișnuită de curățare, urmărind numărul codurilor nefuncționale ca o valoare a stării de echipă în timp.
Ce sunt semnalele de renaștere a instrumentelor Go Tooling pentru constructorii SaaS
Rev-dep face parte dintr-un model mai larg în instrumentele pentru dezvoltatori: alternative de înaltă performanță la instrumentele JavaScript consacrate, construite în Go sau Rust, apar în fiecare categorie. Biome a înlocuit ESLint și Prettier pentru multe echipe. Turbopack și Rspack mănâncă prânzul lui Webpack. Bun provoacă însuși Node.js. Firma comună este că aceste instrumente nu oferă doar îmbunătățiri progresive, ci oferă îmbunătățiri în funcție de trepte care schimbă ceea ce este practic.
Pentru companiile SaaS care construiesc produse complexe, cu mai multe module, această renaștere a sculelor are implicații directe asupra vitezei de inginerie. Arhitectura de 207 module Mewayz – care acoperă totul, de la HR și salarizare până la sisteme de rezervare și tablouri de bord de analiză – reprezintă exact genul de bază de cod mare, interconectată, în care analiza dependenței rapidă și precisă devine critică din punct de vedere operațional. Atunci când o modificare a unui modul de utilitate partajat s-ar putea răspândi, teoretic, prin zeci de module de caracteristici, a avea o vizibilitate aproape instantanee asupra graficului real de dependență nu este doar convenabilă, ci este genul de infrastructură care previne incidentele costisitoare de producție.
Capacitatea de a răspunde „ce folosește de fapt această funcție” în mai puțin de cinci secunde în loc de cinci minute schimbă modul în care inginerii iau decizii. Scade costul investigației, ceea ce înseamnă că inginerii investighează mai des, ceea ce înseamnă că iau decizii mai bune. Acesta este randamentul cumulat al investiției în instrumente rapide, care adesea este trecut cu vederea atunci când organizațiile se gândesc la cheltuielile pentru productivitatea dezvoltatorilor.
Faceți eliminarea codului mort parte a culturii dvs. de inginerie
Numai tehnologia nu construiește baze de cod curate – cultura face. Instrumente precum Rev-dep oferă capacitatea, dar transformarea acestei capacități în practică consecventă necesită angajament organizațional. Cele mai eficiente echipe tratează valorile codurilor nefuncționale în același mod în care tratează acoperirea testelor: ca un indicator vizibil și urmărit al stării de sănătate a bazei de cod, care este revizuit în întâlnirile de inginerie și luat în considerare în planificarea sprintului.
Unele practici culturale specifice care funcționează bine includ desemnarea „zilelor de ștergere a codului” – evenimente periodice în care scopul explicit este eliminarea codului, mai degrabă decât adăugarea acestuia. Netlify a jucat acest lucru, rulând clasamente, urmărind liniile de net șterse. Stripe a scris public despre practica lor de a trata ștergerea codului ca pe o contribuție inginerească de primă clasă, egală ca valoare cu lucrările cu caracteristici. Schimbarea de mentalitate necesară este recunoașterea faptului că cel mai bun cod este codul care nu există: fiecare linie pe care nu o scrieți este o linie pe care nu trebuie niciodată să o întrețineți, să testați, să depanați sau să o explicați unui nou angajat.
Pentru companiile de produse care gestionează operațiuni de afaceri complexe, paralela din afara ingineriei este la fel de instructivă. Aceeași disciplină care face bazele de cod mai sănătoase - audituri regulate, proprietate clară, eliminarea lucrurilor pe care nimeni nu le folosește - face și procesele de afaceri mai sănătoase. Platforme precum Mewayz sunt construite tocmai pentru a oferi companiilor acest tip de claritate operațională: o vedere unificată a instrumentelor utilizate, fluxurilor de lucru care generează valoare și unde se acumulează greutatea necorespunzătoare a organizației. Indiferent dacă auditați exporturi de software neutilizate sau procese de afaceri neutilizate, disciplina de bază este identică.
Instrumentele devin mai rapide, buclele de feedback devin din ce în ce mai strânse, iar echipele care investesc astăzi în infrastructura de igienă de bază de cod își construiesc un avantaj cumulativ care va plăti dividende ani de zile. Rev-dep și cohorta sa de instrumente pentru dezvoltatori Go-powered nu sunt doar repere interesante, ci sunt stratul de infrastructură care face posibilă viteza durabilă a software-ului. Și într-o lume în care viteza de iterare este avantajul competitiv principal pentru companiile de software, aceasta nu este o preocupare periferică. Este tot jocul.
Întrebări frecvente
Ce face ca Rev-dep să fie mai rapid decât knip.dev?
Rev-dep este construit în Go, un limbaj de sistem compilat optimizat pentru concurență și viteza de execuție brută, în timp ce knip.dev rulează pe Node.js. Această diferență arhitecturală permite Rev-dep să analizeze graficele de dependență și să detecteze codul mort de până la 20 de ori mai rapid. Pentru monorepo mari sau baze de cod complexe – cum ar fi arhitectura cu 207 module care alimentează sistemul de operare de afaceri Mewayz la app.mewayz.com – acest decalaj de performanță se traduce în timp real economisit la fiecare rulare CI.
Cât cod mort acumulează un proiect tipic în creștere?
Studiile și rapoartele anecdotice ale echipelor de inginerie sugerează că bazele de cod mature pot conține între 10% și 35% cod neutilizat sau inaccesibil. Problema se agravează pe măsură ce echipele se extind – funcțiile sunt depreciate, API-urile se modifică și modulele sunt abandonate fără curățare. Platforme precum Mewayz, care consolidează peste 207 module de afaceri într-un singur sistem de operare de 19 USD/lună, se bazează în mare măsură pe detectarea sistematică a codului mort pentru a menține baza de cod slabă și întreținută.
Este Rev-dep potrivit pentru echipele care nu folosesc JavaScript sau TypeScript?
Rev-dep se concentrează în prezent pe ecosistemele JavaScript și TypeScript, ceea ce îl face o alternativă directă la knip.dev pentru acele medii. Suportul pentru limbi suplimentare se poate extinde pe măsură ce proiectul se maturizează. Dacă echipa dvs. creează produse bazate pe web sau instrumente SaaS - similar cu modul în care Mewayz oferă sistemul de operare complet pentru afaceri la app.mewayz.com - și stiva dvs. este bogată în JS/TS, Rev-dep merită evaluat ca parte a lanțului dvs. de instrumente pentru dezvoltatori astăzi.
Pot să integrez Rev-dep în pipeline-ul meu CI/CD existent?
Da. Rev-dep este proiectat ca un instrument CLI, făcându-l ușor de introdus în orice conductă CI/CD alături de pașii existenți de testare și testare. Avantajul său de viteză este deosebit de valoros în conductele automate, unde buclele de feedback mai rapide reduc timpul de așteptare al dezvoltatorului. Indiferent dacă conduceți un startup slab sau gestionați o platformă cu funcții complete, cum ar fi sistemul de operare de afaceri Mewayz de 19 USD/lună, integrarea analizei codurilor nefuncționale în pipeline vă ajută să impuneți igiena bazei de cod la fiecare fuziune.
We use cookies to improve your experience and analyze site traffic. Cookie Policy