Delete it! đ¶ đ¶ đ¶
Det fÞles bra Ä slette gammel kode. Men hvordan gjÞr man det egentlig? Hvordan identifisere linjene som trygt kan slettes? Vi har arvet legacy programvare skrevet for lenge siden av folk som nÄ jobber helt andre steder. Vi skal ikke bare kaste hele systemet og insistere pÄ at her mÄ man begynne pÄ nytt? Neida.
Vi har lÊrt noen triks som gjÞr rydde-jobben til en dans pÄ rÞde deletions⊠Vi har brukt OpenTelemetry for Ä finne ut hvilke API-er som faktisk er i bruk. Deretter statisk kodeanalyse for Ä fÄ hjelp til Ä finne hvilke bestanddeler av applikasjonen som nÄ kan fjernes.
Men fÞrst. Hvorfor er det vits Ä gjÞre jobben med Ä slette gammel kode? Det er forstÄelig om man opplever kode som noe verdifullt. Linje for linje med finurligheter, programmert av navngitte utviklere fÞr oss. Det var jo vanskelig Ä utvikle dette! Da er det ogsÄ vanskelig Ä lese koden og forstÄ programvaren mange Är seinere. Tryggest Ä ikke rÞre koden for mye. Kan det ikke bare bli liggende? Men vi skal jo opp et fjell, og da er det nyttig Ä undersÞke hva som egentlig fins oppi denne tunge ryggsekken vi skal bÊre med oss. Kode som ikke har blitt undersÞkt pÄ en stund kan skjule bÄde gull og grÄstein.
Siden november har team rubrikk slettet skikkelig mye kode i den mest sentrale applikasjonen vi eier. Skulle nesten tro vi er et team som motarbeider virksomheten?! đ
Hvorfor er det nyttig Ă„ slette kode?
Vi tror de viktigste gevinstene handler om Ă„âŠ
- minske kognitiv last ved debugging, vedlikehold og fremtidig videreutvikling
- fjerne sikkerhetshull i svak kode (var det noen som sa SQL injections?!)
- ta vekk avhengigheter og gjĂžre oppgraderinger enklere fremover
- slette data som prosjektet ikke lenger trenger
Kode er en kostnad đž
Det er mange som har beskrevet gjennom Ă„rene hvordan kode er en kostnad, at det er dyrt med for mye kode. Vi leste nylig Cory Doctorow sin underholdende rant om hvordan Code is a liability (not an asset) der han spesielt forklarer hvordan AI produserer «10,000 times more liabilities» og en detaljert gjennomgang av hvordan det blir et problemâŠ
Writing code that works, without consideration of how it will fail, is a recipe for catastrophe. It is a way to create tech debt at scale. It is shoveling asbestos into the walls of our technological society.
Hvis vi ser inn i krystallkula og prĂžver Ă„ forutsi hvilke ferdigheter fremtidens utviklere trenger -- kanskje det er Ă„ slette kode?
SÄnn kan vi finne ut hvilke APIer som er i bruk
Det er én ting Ä si at det er smart Ä slette kode som ikke er i bruk; noe helt annet Ä fÄ 10-15 git repositories i fanget og faktisk gÄ i gang. Applikasjonene til vÄrt team har kjÞrt pÄ sparebluss i mange Är, og derfor er det ikke sÄ mange mennesker vi kan spÞrre til rÄds for Ä finne ut av hvilke APIer vi kan kvitte oss med. Heldigvis finnes det grep vi kan ta som gjÞr det ganske enkelt Ä sjekke bruksmÞnster for slikt!
De viktigste backend-applikasjonene i vÄrt team er webapplikasjoner som kjÞrer pÄ Java, og da er det veldig lett Ä legge pÄ opentelemetry java agent for Ä hente inn metrikker vi kan bruke for Ä telle API-trafikk.
I Amedia er det lett Ä samle inn metrikker fra prometheus-kompatible endepunkter i applikasjonene vÄre, og det kan opentelemetry-agenten hjelpe oss med ganske enkelt. Her er et eksempel fra en Dockerfile som viser hvordan:
CMD ["java", "-javaagent:/app/opentelemetry-javaagent.jar", \
"-Dotel.service.name=frontier", \
"-Dotel.metrics.exporter=prometheus", \
"-Dotel.exporter.prometheus.port=9464", \
"-Dotel.logs.exporter=none", \
"-jar", "/app/frontier.jar"]
Da kommer det metrikker pÄ http://localhost:9464/metrics i podden. Den meste interessante for vÄr del er http_server_request_duration_count som automatisk kan samles inn av agenten, for mange forskjellige webrammeverk for Java. Da kan vi hente ut trafikk per http-endepunkt med en enkel spÞrring mot prometheus slik:
sum by(http_route) (http_server_request_duration_seconds_count{application="frontier"})
Opentelemetry-agenten er smart nok til Ă„ vaske bort IDer og den slags fra URLer, slik at dette blir en overkommelig mengde data Ă„ se pĂ„. I tilfellet denne applikasjonen oppdaget vi ganske fort at bare rundt en tredjedel av API-overflaten var i bruk. Da er det bare Ă„ vente til man fĂžler seg trygg pĂ„ at man har nok data, og sĂ„ begynne ryddejobben. đ„ł
SÄnn kan vi sjekke hvor trafikken kommer fra - kanskje vi kan skru av klienten og slette APIet likevel?
Et nyttig tillegg nÄr vi allerede er i gang med OpenTelemetry er Ä sette opp spor, eller traces for Ä kunne se trafikk flyte gjennom flere systemer. Da kan vi noen ganger avdekke mÞnstre som vi kan bruke til Ä slette enda mer kode.
Vi har for eksempel sett tilfeller av at det starter jobber i én applikasjon, hvor den applikasjonen egentlig ikke gjÞr noe mye mer enn Ä starte ting i en annen applikasjon via HTTP API. Noen gangen kan vi fÄ mye bedre oversikt ved Ä flytte koden til en slik jobb inn i applikasjonen som utfÞrer arbeidet uansett, og da kan vi ogsÄ bli kvitt bÄde API og klientkode.
NÄr vi har slettet et API sÄ kan vi kvitte oss med koden ganske automatisk
NÄr man sletter et API-endepunkt ender man typisk sett opp med ganske mye dÞd kode. Det er lett Ä gi seg her, og tenke at den dÞde koden ikke skader noen. Det kan hende det er sant, men den hjelper neppe noen heller! Tvert i mot sÄ kan folk som sÞker i kode bli lurt til Ä tro ting om hvordan verden virker, som slett ikke stemmer. Dette gjelder spesielt nÄr man sÞker pÄ tvers av flere repositories, for eksempel med sÞket til github eller verktÞy som grep eller ripgrep. Derfor er det verdifullt Ä kvitte seg med den koden som ble dÞd kode ogsÄ, og slett ikke sÄ vanskelig som man kanskje kunne tro!
I vÄrt tilfelle har vi brukt IDEA til dette, men denne typen funksjonalitet finnes nok ogsÄ i mange alternative produkter. IntelliJ har tooltips som kan vise oss at en kodesnutt vi ser pÄ er ubrukt, typisk ved at metode, variabel- eller klassenavnet fÄr en svakere farge. Det som ikke er Äpenbart er at du kan fÄ IntelliJ til Ä lage en rapport over all ubrukt kode i prosjektet ditt for deg!
Da kan vi velge Run inspection by name fra code-menyen, og taste inn unused declaration. Merk at det er viktig at vi velger riktig programmeringssprÄk her.
NÄr vi kjÞrer unused declarations kan det vÊre en fordel Ä fÄ IDEA til Ä varsle ogsÄ om private felter som ikke er i bruk - ofte er det slik vi klarer Ä slette den siste gjenstÄende referansen til en klasse, slik at vi kan slette hele klassen.
Til slutt sÄ fÄr vi en liste av ubrukte kode, hvor IDEA gjÞr det veldig lett Ä velge "Safe Delete" for Ä kvitte seg med kode man ikke trenger.
Psst, den Þverste figuren om code frequency representerer ikke nÞyaktig Ärstall og heller ikke presise mengder hverken additions eller deletions. Det er muligens en illustrasjon laget for dramatisk effekt, men her er et helt ekte og originalt skjermbilde fra GitHub som vi synes er stas: