Dług technologiczny co to takiego?
Całkiem niedawno poruszałem na blogu temat związany z zarządzaniem projektami IT gdzie pisałem o przyczynach upadania projektów programistycznych. Artykuł ten cieszył się sporą popularnością, a w komentarzach padło pytanie o dług technologiczny więc właśnie temu zagadnieniu postanowiłem poświęcić dzisiejszy wpis. Wszystkich zainteresowanych zapraszam do dalszej lektury…
Na temat długu technologicznego w zasadzie wiele się nie mówi, a wbrew pozorom jest to zjawisko, z którym zetknął się chyba każdy programista. Na rynku jest z pewnością sporo firm, które dość boleśnie przekonały się co to tak naprawdę oznacza, niekiedy rezygnując z dochodowych projektów co znowu być może skutkowało sporymi problemami finansowymi, a wystarczyło by przecież nie popełniać kilku kluczowych błędów. Warto więc sobie odpowiedzieć skąd taki dług technologiczny się bierze i co tak naprawdę oznacza to pojęcie?
Termin ten został po raz pierwszy wprowadzony przez Warda Cunninghama, który nie był zadowolony z jakości kodu aplikacji nad którymi pracował. Stwierdził on wtedy, że takie praktyki generują właśnie dług technologiczny, który będzie potem skutkował utrudnionym i spowolnionym rozwojem danego projektu programistycznego. Z czasem pojęcie to ewoluowało przybierając bardziej ogólne znaczenia. Obecnie rozumie się pod nim pewną część systemu informatycznego stworzoną bez dbania o jakość kodu co powoduje, że z dnia na dzień dług technologiczny coraz bardziej się powiększa i wpływa na bieżącą pracę developerów.
Co powoduje dług technologiczny?
Oczywiście nieprzemyślane decyzje, chęć zrobienia czegoś szybciej, taniej, mniej dokładniej. To klasyczne błędy, które potem mszczą się ze zdwojoną siłą. Załóżmy, że pracujemy nad jakimś super popularnym produktem, na przykład rozwijamy jakiegoś CMS’a. Nasza aplikacja staje się coraz bardziej popularna, a my musimy dostarczać swoim klientom coraz więcej opcji i dodatkowo realizować ich różne pomysły. Przez chęć szybkiego wzrostu zapominamy jednak o rozwoju dokumentacji, a kod piszemy bez większego zastanowienia tworząc go coraz bardziej niechlujnym. W ten sposób właśnie generujemy dług technologiczny, który w późniejszej fazie projektu zemści się na nas w podwójny sposób. Po pierwsze nikt nie będzie chciał pracować przy takiej aplikacji, po drugie koszty jej utrzymania będą wzrastały kwadratowo w stosunku do czasu jego trwania co w pewnym momencie przekroczy zyski i utrzymywanie takiej aplikacji przestanie być opłacalne. Stąd jest już prosta droga do upadku projektu.
Może oczywiście też być inna sytuacja, wasz zespół dba o wszystkie detale związane z czystym kodem, dokumentacją itd. kończycie swój projekt i przejmujecie po kimś innym nową rzecz do rozwoju. Przychodzicie pełni podekscytowania do pracy, w końcu przecież szef dał wam nowy projekt, a tutaj niespodzianka. Klonujecie repo, a tam bajzel w kodzie jakiego mało kto widział, na dodatek niekompletna dokumentacja, kompilator wali tysiącami bugów, a programistów którzy to wszystko pisali nie ma już w firmie. W ten oto właśnie sposób odziedziczyliście dług technologiczny po swoich poprzednikach. Teraz jeżeli firma jest w stanie zapewnić wam odpowiednio długi czas na ogarnięcie wszystkiego i wdrożenie to pół biedy, ale jeśli nie jest bo na przykład klient będzie wymagał za parę tygodni jakieś poprawki itd. to właśnie szykujcie się na bezsensowną syzyfową pracę, której można było by uniknąć gdyby ktoś o to wcześniej zadbał.
Jak sobie radzić z długiem technologicznym?
No oczywiście najlepiej go nie tworzyć. Ale co jeśli już dopuściliśmy do takiej sytuacji? Tutaj są dwie drogi. Serce mówi oczywiście pracujmy dalej, a rozum hola hola, trzeba to wszystko poprawić!
Kiedy jednak zorientujemy się, że dotknął nas problem długu technologicznego musimy mieć świadomość tego, że dalsze rozwijanie produktu nad którym pracujemy jest zupełnie bez sensu. Coś takiego tylko powiększy problem, z którym i tak przyjdzie nam się zmierzyć w niedalekiej przeszłości. Jedyne co nam pozostaje to zacząć poprawiać wszystkie dotychczasowe niedoróbki zarówno w kodzie jak i dokumentacji, musimy jak najszybciej zrobić tutaj porządek z kodem źródłowym nawet kosztem nowych funkcjonalności. To oczywiście wiąże się z nakładami finansowymi za które nikt nam nie zapłaci. Klienci przecież nie płacą za poprawianie źle wykonanej przez programistów pracy. Jeżeli firma jest w stanie zapewnić nam odpowiednie środki ekonomiczne, a Product Owner potrzebny czas, to znaczy, że zorientowaliśmy się na tyle wcześnie iż jest jeszcze szansa na uratowanie projektu. W przeciwnym wypadku menagerowie będą musieli podjąć pewnie trudną decyzję o zawieszeniu prac, nie ma tutaj innej drogi.
Można oczywiście próbować bagatelizować problem, co w skrajnych przypadkach może się udać. Nie mniej jednak należy z takiego stanu rzeczy wyciągnąć poważne wnioski, wiele osób już się na tym wózku mocno przejechało, nie warto popełniać tych samych błędów.
Czy dotknął mnie problem długo technologicznego?
Powiedzieliśmy sobie co rozumiemy przez pojęcie długu technologicznego oraz jakie konsekwencje niesie on ze sobą. Jak w takim razie rozpoznać, że dotknął nas taki problem?
Przede wszystkim czerwona lampka powinna nam się zapalić kiedy zorientujemy się, że projekt nad którym pracujemy rozwija się w coraz wolniejszym tempie. Czym się to objawia? Na przykład dodanie prostej funkcjonalności zajmuje nam zdecydowanie więcej czasu niż powinno, zmiany w kodzie są znacznie utrudnione bo na przykład godzinę zastanawiamy się za co odpowiada dana zmienna bądź klasa, a w dokumentacji nie ma opisanych ważnych rzeczy, albo są w niej luki. To są pierwsze symptomy, bardziej poważnymi są problemy z płynnym działaniem systemu, nierozwiązane błędy sygnalizowane przez testy automatyczne, wolne działanie aplikacji. Jeżeli również sami widzimy po sobie, że nie chce nam się pracować przy tym kodzie i marzymy tylko o tym, żeby zmienić pracodawcę bądź przenieść się do innego zespołu to znaczy, że jest naprawdę źle. Oczywiście z projektem.
Jak dług technologiczny wpływa na rozwój ekonomiczny firmy?
Tak samo jak zwykły dług. Wszyscy wiemy, że zaciąganie długów jest po prostu nie opłacalne i z każdym dniem tak naprawdę musimy oddać więcej pieniędzy niż pożyczyliśmy. Do tego dochodzą jeszcze inne wydatki itd. W skrócie z punktu widzenia ekonomicznego najlepiej będzie aby w ogóle nie dopuszczać do takiej sytuacji, a jeśli już dopuściliśmy to warto to jak najszybciej spłacić. Przed tym zobowiązaniem na pewno nie uciekniemy, a jeśli będziemy próbować to zemści się ono na nas ze zdwojoną siłą.
Dług technologiczny nie jest „wadą” projektu, jest jego cechą. Są sytuacje, w których korzystnie jest zaciągnąć dług technologiczny :) Opisałem je w tym wpisie: https://wojciszko.com/2015/10/12/kiedy-warto-zaciagnac-dlug-technologiczny/
Dług technologiczny jak sama nazwa wskazuje jest wadą, nigdy nie ma sytuacji kiedy zaciągnięcie długu technologicznego jest korzystne bo gdy tak zrobimy skazujemy się na to, że projekt nad którym pracujemy nie jest skalowany czyli w przyszłości (gdyby był rozbudowywany, a nigdy nic nie wiadomo) będziemy musieli „spłacić” całe zadłużenie.
Nie możemy projektu traktować tylko pod względem technologicznym. Jest również strona biznesowa projektu, która jest równie ważna (a w wielu przypadkach ważniejsza). W przypadku startupów powinno się realizować funkcjonalności jak najszybciej (nie zważając na dług technologiczny) żeby potwierdzić założenia biznesowe i znaleźć model biznesowy.
Jeśli pracuje się nad projektem, który nie wiadomo czy będzie rentowny – trzeba udowodnić jego zasadność jak najniższym kosztem. Jeśli okaże się, że jest zasadny biznesowo wtedy będzie budżet na „spłatę długu”. Może się okazać również, że nie ma zasadności biznesowej – wtedy projekt upada i nie trzeba spłacać długu.
Więc nie zgodzę się z tym, że w ZAWSZE trzeba spłacać dług technologiczny oraz z tym, że jest wadą – on powinien być świadomym wyborem.
Zauważ kilka kwestii, po pierwsze budowa projektu nie zważając na dług technologiczny jest na krótką metę może i opłacalna ale na dłuższą już kompletnie nie, a przecież biznes nie planuje się na 2-3 miesiące (tygodnie?) tylko na lata! Spłata długu z każdym dniem wymaga coraz większych nakładów, aż w końcu może się okazać, że fajny pomysł upadł bo się okazało, że naprawienie błędów przy starcie przerosło możliwości inwestorów.