Wiadomość została wysłana.
Przetworzymy Twoją prośbę i skontaktujemy się z Tobą tak szybko, jak to możliwe.
Formularz został pomyślnie przesłany.
Więcej informacji można znaleźć w skrzynce pocztowej.
Jak wskazują raporty z całej branży, obecnie rośnie wyspecjalizowany sektor dla inżynierów, którzy koncentrują się na poprawianiu błędów w kodzie generowanych przez AI.
Wzorzec ten stał się niezwykle spójny. Firmy zwracają się do ChatGPT, aby wygenerować skrypty migracyjne, integracje lub całe funkcje, mając nadzieję na oszczędność czasu i obniżenie kosztów. W końcu technologia wydaje się szybka i dostępna.
Wtedy systemy zawodzą.
I dzwonią do nas.
Ostatnio otrzymujemy coraz więcej takich próśb. Nie chodzi o dostarczenie nowego produktu, ale o rozwiązanie bałaganu, który pozostał po tym, jak ktoś zaufał modelowi językowemu w swoim kodzie produkcyjnym.
W tym momencie zaczyna to wyglądać jak własna niszowa branża. Naprawianie błędów generowanych przez AI jest teraz płatną usługą. W niektórych przypadkach bardzo kosztowną.
Raport GitClear 2024 potwierdza to, co zaobserwowaliśmy u klientów: Narzędzia do kodowania AI przyspieszają dostawę, ale także napędzają powielanie, ograniczają ponowne wykorzystanie i zawyżają długoterminowe koszty utrzymania.
Wyjaśnijmy jednak, że nie jesteśmy "przeciwko AI". My też go używamy. I jest pomocny we właściwym kontekście, z odpowiednimi zabezpieczeniami. Ale to, co frustruje mnie w nadmiernym poleganiu na AI i jego powszechnych implikacjach - i prawdopodobnie także ciebie - to magiczne myślenie. Pomysł, że model językowy może zastąpić prawdziwą pracę inżynierską.
Nie może. A jak mówi przysłowie, dowód tkwi w budyniu. Kiedy firmy udają, że jest inaczej, w końcu płacą komuś takiemu jak my, aby to posprzątał.
Jak więc wygląda jedna z tych prac porządkowych? Oto, czego AI-afficionados nie mówią, jeśli chodzi o stracony czas i zmarnowane pieniądze.
Wiadomość jest zazwyczaj następująca:
"Hej, możesz rzucić okiem na mikrousługę, którą zbudowaliśmy? Użyliśmy ChatGPT do wygenerowania pierwszej wersji. Przesunęliśmy ją do etapu przejściowego, a teraz nasza kolejka RabbitMQ jest całkowicie zalana".
Ale jest jedna rzecz: objawy pojawiają się znacznie później. Czasami nawet kilka dni później. A kiedy to robią, rzadko jest oczywiste, że główną przyczyną był kod wygenerowany przez AI. Po prostu wygląda na to, że... coś jest nie tak.
"Nie można zlecić myślenia architektonicznego modelowi językowemu. AI może przyspieszyć pracę, ale nadal potrzeba inżynierów, aby zbudować systemy, które nie rozpadną się pod presją".
Dyrektor ds. technicznych
Po kilkunastu takich przypadkach zaczynają pojawiać się wzorce:
I oczywiście, gdy wszystko się zawali, AI nie zostawi ci komentarza mówiącego: "Przy okazji, zgaduję tutaj".
Ta część zależy od ciebie.
Ta pochodzi od szybko rozwijającej się firmy z branży fintech.
Wprowadzali nową wersję modelu danych klientów, dzieląc jedno duże pole JSONB w Postgres na wiele znormalizowanych tabel. Dość standardowa rzecz. Ale z napiętymi terminami i niewystarczającą liczbą rąk, jeden z programistów postanowił "przyspieszyć pracę", prosząc ChatGPT o wygenerowanie skryptu migracyjnego.
Na pierwszy rzut oka wyglądało to dobrze. Skrypt przeanalizował JSON, wyodrębnił informacje kontaktowe i wstawił je do nowego pliku user_contacts
tabela.
Więc go uruchomili.
Brak pracy na sucho. Żadnej kopii zapasowej. Prosto do etapu przejściowego, który, jak się okazało, udostępniał dane produkcji za pośrednictwem repliki.
Kilka godzin później obsługa klienta zaczęła otrzymywać wiadomości e-mail. Użytkownicy nie otrzymywali powiadomień o płatnościach. Inni nie mieli numerów telefonów w swoich profilach. Wtedy do nas zadzwonili.
Wyśledziliśmy problem w skrypcie. Wykonał on podstawową ekstrakcję, ale przyjął trzy fatalne założenia:
NULL
lub brakujące klucze w strukturze JSON.ON CONFLICT DO NOTHING
, więc wszelkie nieudane wstawienia były po cichu ignorowane.Wynik: o 18% danych kontaktowych został utracony lub uszkodzony. Brak dzienników. Brak komunikatów o błędach. Po prostu cicha utrata danych.
Wyznaczyliśmy niewielki zespół, którego zadaniem było rozplątanie tego bałaganu. Oto, co zrobiliśmy:
Dwóch inżynierów, trzy dni. Koszt dla klienta: około $4,500 w opłatach za usługi.
Większym ciosem były jednak straty ponoszone przez klientów. Nieudane powiadomienia doprowadziły do braku płatności i rezygnacji. Klient powiedział nam, że wydał co najmniej $10,000 na zgłoszeniach do pomocy technicznej, rekompensatach SLA i kredytach dobrej woli za ten jeden nieudany skrypt.
Ironiczne jest to, że starszy programista mógł napisać poprawną migrację w ciągu czterech godzin. Ale obietnica szybkości AI kosztowała ich dwa tygodnie sprzątania i utratę reputacji.
Ten pochodził od startupu zajmującego się technologiami prawnymi, który tworzył platformę do zarządzania dokumentami dla firm prawniczych. Jedną z ich podstawowych funkcji była integracja z rządową usługą e-powiadomień - zewnętrznym interfejsem API REST z OAuth 2.0 i ścisłym ograniczeniem szybkości: 50 żądań na minutę, bez wyjątków.
Zamiast przydzielić integrację doświadczonemu programiście backendu, ktoś z zespołu postanowił "prototypować" ją za pomocą ChatGPT. Wrzucili specyfikację OpenAPI, poprosili o klienta Python i otrzymali czysto wyglądający skrypt z requests
, logika ponawiania próby przy użyciu tenacity
, i odświeżanie tokenów.
Na papierze wyglądał solidnie. Więc go wysłali.
Oto, co faktycznie się wydarzyło:
X-RateLimit-Remaining
lub Retry-After
nagłówków. Po prostu wysyłał żądania na ślepo.httpx.AsyncClient
, zaimplementował przepustnicę opartą na semaforach, dodał wykładniczy backoff z jitterem i poprawnie obsługiwał Retry-After
i nagłówki ograniczające szybkość.Dwóch inżynierów, rozłożone na dwa i pół dnia. Koszt dla klienta: około $3,900.
Większym problemem jest to, że ich największy klient - firma prawnicza, której zależy na czasie - przegapił dwa okna składania wniosków sądowych z powodu awarii. Klient musiał naprawić szkody i zaoferować zniżkę, aby utrzymać konto.
Wszystko dlatego, że model językowy nie rozumiał różnicy między "kodem roboczym" a "kodem gotowym do produkcji". I tak po prostu, kolejna warstwa długu technicznego AI została po cichu dodana do stosu.
Przerażające nie jest to, że te rzeczy idą źle. Chodzi o to, jak przewidywalne staje się to wszystko.
Każdy z tych incydentów przebiega według tego samego schematu. Deweloper prosi ChatGPT o fragment kodu. Zwraca coś, co działa wystarczająco dobrze, by nie wyrzucać błędów. Podłączają go do systemu, być może trochę go czyszczą i wysyłają, zakładając, że jeśli kompiluje się i działa, to musi być bezpieczny.
Jest jednak pewien haczyk: Duże modele językowe nie znają Twojego systemu.
Nie wiedzą, w jaki sposób Twoje usługi współdziałają.
Nie znają budżetu na opóźnienia, potoku wdrożeń, konfiguracji obserwowalności ani wzorców ruchu produkcyjnego.
Generują najbardziej prawdopodobny kod na podstawie wzorców w danych treningowych. To wszystko. Nie ma żadnej świadomości. Żadnych gwarancji. Brak intuicji w projektowaniu systemu.
Wyniki często to odzwierciedlają:
Co gorsza, kod wygląda poprawnie. Jest składniowo czysty. Przechodzi lintery. Może być nawet objęty podstawowym testem. Ale brakuje mu jednej rzeczy, która ma znaczenie: kontekstu.
Dlatego te błędy nie pojawiają się od razu. Czekają na wdrożenia w piątek wieczorem, na okna o dużym natężeniu ruchu, na rzadkie przypadki brzegowe. Taka jest natura długu technicznego AI - jest niewidoczny, dopóki nie zepsuje czegoś krytycznego.
Jak wspomnieliśmy wcześniej, my również używamy AI. Prawie każdy inżynier w naszym zespole ma lokalnie uruchomioną konfigurację podobną do Copilota. Jest szybki, pomocny i, szczerze mówiąc, świetny sposób na pominięcie nudnych części.
Ale oto różnica: nic nie trafia do głównej gałęzi bez przejścia przez starszego inżyniera, a w większości przypadków przez potok CI, który wie, czego szukać.
Absolwenci studiów LLM są w tym świetni:
Czym są nie dobry w projektowaniu. Lub kontekst. Lub bezpieczne ustawienia domyślne.
Właśnie dlatego stworzyliśmy nasze przepływy pracy, aby traktować dane wyjściowe LLM jak sugestie, a nie źródło prawdy. Oto jak to wygląda w praktyce:
Używany prawidłowo, oszczędza czas. Używany na ślepo jest bombą zegarową.
Nie jesteśmy tu po to, by mówić ci, byś zakazał narzędzi AI. Ten statek już odpłynął.
Ale dać modelowi językowemu dostęp do commitów? To tylko proszenie się o kłopoty.
Oto, co zalecamy zamiast tego:
Pozwól im pomóc z powtarzalnym kodem. Niech proponują rozwiązania. Ale nie ufaj im w podejmowaniu krytycznych decyzji. Każdy kod wygenerowany przez AI powinien zostać sprawdzony przez starszego inżyniera, bez wyjątków.
Niezależnie od tego, czy są to tagi commit, metadane czy komentarze w kodzie, wyjaśnić, które części pochodzą z AI. Ułatwia to późniejszy audyt, debugowanie i zrozumienie profilu ryzyka.
Zdecydujcie jako zespół, gdzie dopuszczalne jest korzystanie z LLM, a gdzie nie. Boilerplate? Jasne. Przepływy autoryzacji? Być może. Systemy transakcyjne? Absolutnie nie bez weryfikacji. Jasno określ zasady i częścią standardów inżynieryjnych.
Jeśli pozwalasz kodowi wygenerowanemu przez AI dotknąć produkcji, musisz założyć, że coś w końcu się zepsuje. Dodaj kontrole syntetyczne. Monitory ograniczające szybkość. Śledzenie zależności. Uczyń niewidzialne widzialnym, zwłaszcza gdy oryginalny autor nie jest człowiekiem.
Największe awarie spowodowane przez AI, jakie widzieliśmy, nie wynikały ze "złego" kodu. Wynikały one z cichych błędów - brakujących danych, uszkodzonych kolejek, burz ponownych prób - które pozostawały niewykryte przez wiele godzin. Zainwestuj w obserwowalność, logikę awaryjną i wycofywanie. Zwłaszcza jeśli pozwalasz ChatGPT pisać migracje.
Krótko mówiąc, AI może zaoszczędzić czas zespołu, ale nie może przejąć odpowiedzialności.
To wciąż ludzka praca.
AI może pomóc ci poruszać się szybciej. Ale nie może myśleć za ciebie.
Nie rozumie twojej architektury. Nie wie, co oznacza "zrobione" w danym kontekście. I zdecydowanie nie dba o to, czy potok danych po cichu zepsuje się w piątek wieczorem.
Dlatego jako CTO musimy skupić się na odporności systemu, a nie tylko na szybkości.
Kuszące jest, aby pozwolić AI zająć się nudnymi częściami. I czasami jest to w porządku. Ale każdy skrót wiąże się z kompromisem. Kiedy kod wygenerowany przez AI prześlizguje się bez kontroli, często staje się długiem technicznym AI. Takim, którego nie widać, dopóki zespół operacyjny nie zacznie gaszenia pożarów w produkcji.
Jeśli już napotkałeś tę ścianę, nie jesteś sam. Pomogliśmy zespołom odzyskać sprawność we wszystkim, od zepsutych migracji po katastrofy API. Nie tylko refaktoryzujemy kod. Pomagamy refaktoryzować myślenie, które za nim stoi.
Ponieważ ostatecznie to właśnie sprawia, że systemy są niezawodne.
Wiadomość została wysłana.
Przetworzymy Twoją prośbę i skontaktujemy się z Tobą tak szybko, jak to możliwe.
Rejestrując się, wyrażasz zgodę na naszą Politykę Prywatności, w tym korzystanie z plików cookie i przekazywanie Twoich danych osobowych.