Mój pierwszy startup zakończył się porażką, podobnie jak kilka sąsiednich startupów. Mieliśmy: 100 tys. dolarów w kredytach GCP, założyciela-inżyniera, który budował systemy w przedsiębiorstwach, oraz strategię wejścia na rynek. I ponieśliśmy porażkę nie dlatego, że zbudowaliśmy to źle, ale dlatego, że zbudowaliśmy to dobrze. To był problem.
Podczas gdy spędzaliśmy czas na zmaganiu się z tym, co wydawało się "nieoptymalnym" stosem technologicznym, straciliśmy najważniejszą rzecz: czas, impet i strategiczną szansę.
Ta historia nie jest o ludziach bez zdrowego rozsądku. Miałem zdrowy rozsądek i wiedzieliśmy, że powinniśmy utrzymywać rzeczy prostymi. Ale kiedy twój model mentalny nie pasuje do sytuacji, cały twój zdrowy rozsądek zostaje zmieciony. Podejmujesz "poprawne" decyzje, które cię zabijają.
To również nie jest historia o złej inżynierii. To o tym, jak dobra inżynieria zabija startupy. Jak doświadczenie, które czyni cię seniorem, staje się twoim największym obciążeniem. Jak "robienie tego dobrze" lub nawet "robienie tego prosto" często oznacza robienie tego źle.
Ten artykuł przedstawia modele mentalne, które pomogą ci podejmować właściwe decyzje i unikać tych błędnych, które ja popełniłem.
:::tip Dla kogo to jest: starsi inżynierowie rozpoczynający lub dołączający do startupów na wczesnym etapie. Jeśli spędziłeś 5+ lat w przedsiębiorstwie lub Big Tech, to jest twoje ostrzeżenie.
:::
\
100 tys. dolarów w kredytach GCP wydaje się prezentem, ale to pułapka. Popycha cię w kierunku nadmiernej inżynierii, bo "jest już opłacona". Otrzymujesz instancje obliczeniowe, load balancery, rejestry kontenerów i narzędzia korporacyjne, które wymagają korporacyjnej konfiguracji. Czego potrzebujesz? Przycisku "push to deploy".
Oczywiście, możesz zbudować przepływy pracy "deploy from GitHub to VM" na GCP/AWS/Azure. Niektóre produkty są bliskie. Ale wymaga to dodatkowych kroków: konfigurowania Cloud Build, ustawiania ról IAM, pisania skryptów wdrożeniowych, zarządzania sekretami i konfigurowania kontroli stanu. Tracisz czas na budowanie infrastruktury wdrożeniowej przed wdrożeniem faktycznych produktów.
Tymczasem platformy takie jak Railway lub Fly.io dają ci to, czego startupy naprawdę potrzebują: trwałą maszynę wirtualną z wdrażaniem start-and-go z GitHuba. Tak łatwo, jak to możliwe: wypychasz swój kod i jest wdrażany. Gotowa do użycia maszyna wirtualna ze zmiennymi środowiskowymi, SSL, load balancerami, logami itp. Nie jest "darmowa", ale jest gotowa.
Darmowe kredyty popychają cię w kierunku nadmiernej inżynierii, bo "są już opłacone". Przekonujesz siebie, że oszczędzasz pieniądze, wydając swój najcenniejszy zasób: czas.
\
Tradycyjna zasada KISS mówi nam, aby utrzymywać nasze oprogramowanie prostym. Ale w startupach to zły cel. Nie powinieneś utrzymywać OPROGRAMOWANIA prostym; powinieneś utrzymywać ROZWIĄZANIA prostymi.
Prawdziwa prostota powinna być mierzona całkowitym wysiłkiem, a nie złożonością kodu:
Całkowity wysiłek = Początkowa budowa + Utrzymanie + Debugowanie + Dodawanie funkcji + Aktualizacje bezpieczeństwa + Zmiany skalowania
Kiedy budujesz od podstaw, jesteś właścicielem wszystkich tych elementów na zawsze. Kiedy korzystasz z usługi, większość z nich staje się zerowa. "Rozdęta" usługa zewnętrzna jest w rzeczywistości prostym rozwiązaniem, ponieważ minimalizuje całkowity wysiłek.
Nasz założyciel-inżynier zdecydował się zbudować OAuth od podstaw zamiast używać "nieznanej biblioteki". Tydzień później złożył PR: czystą implementację OAuth z tokenami JWT, rotacją tokenów odświeżania, zarządzaniem sesjami i kontrolą dostępu opartą na rolach. Bez zależności, bez vendor lock-in, tylko kod, który kontrolowaliśmy.
Nie odrzuciłem PR. I to był błąd. Odrzucenie tygodnia pracy zmiażdżyłoby morale. Ale tworzy to złożoność kodu i stawia go na złych torach. Plus, nieomówienie podejścia wcześniej było naszym prawdziwym błędem. Pozwoliliśmy, aby duma inżynierska podjęła strategiczną decyzję.
Następnie klient potrzebował Microsoft OAuth i Google OAuth. Niestandardowa implementacja oznaczała dni refaktoryzacji, rotacji tokenów odświeżania, przypadków brzegowych, RBA i innych rzeczy. Każde "proste" dodanie wymagało głębokiego zrozumienia naszej niestandardowej autoryzacji. Każda aktualizacja bezpieczeństwa była nasza do wdrożenia. Każde nowe wymaganie było nasze do zakodowania.
Klasyczny błąd starszego inżyniera: optymalizacja dla kontroli zamiast dla wyników. W startupach rzeczywistość wymaga całkowitego odwrócenia sposobu myślenia starszych inżynierów:
\
\
Wybraliśmy Angular, ponieważ nasz założyciel-inżynier znał go dogłębnie. Mądra decyzja, prawda? Wykorzystaj swoje mocne strony, dostarczaj jakościowy kod. Framework był w porządku, ALE problemem był jego ekosystem.
Angular jest doskonały i nasz inżynier mógł zbudować z nim wszystko.
Ale "wszystko" zajmowało czas, aby w ogóle zacząć. Konfiguracja wdrażania, uwierzytelniania i podstawowych komponentów UI oznaczała niekończącą się konfigurację przed napisaniem pojedynczej funkcji. Podczas gdy debugowaliśmy motywy Angular Material, konkurenci mogą (i będą) używać Next.js + Vercel i już onboardowali użytkowników.
Porównaj to ze ścieżką Next.js + Vercel: wdrożenie szkieletowej aplikacji za pomocą npx create-next-app pierwszego dnia, dodanie uwierzytelniania Clerk i komponentów shadcn/ui, dostarczenie rzeczywistych funkcji pierwszego dnia. Ten sam cel, zupełnie inna podróż.
Różnica nie leży w jakości frameworka, ale w optymalizacji ekosystemu. Next.js/React jest otoczony przez startupy wspierane przez venture capital, budujące narzędzia dla innych startupów:
Ekosystem Angulara służy przedsiębiorstwom: potężny, elastyczny, nieskończenie konfigurowalny. Idealny(?) dla zespołów 50-osobowych i trucizna dla zespołów 3-osobowych.
\
Ale nawet z odpowiednimi narzędziami istnieje jedna ostateczna pułapka: przymus budowania rzeczy, ponieważ możesz, a nie dlatego, że powinieneś. Ta pułapka zabija technicznie silne zespoły i więcej startupów, niż możemy sobie wyobrazić: budowanie rzeczy, o które nikt nie prosił, ponieważ możesz, a nie dlatego, że powinieneś.
Spędziliśmy co najmniej miesiąc łącznie na funkcjach, których nikt nie potrzebował. Niestandardowy OAuth, gdy istniał Auth0. Kolejka zadań oparta na Postgres, gdy istniał Redis + Celery. Terraform od pierwszego dnia, gdy konsola działała dobrze. Każda decyzja wydawała się produktywna, ale każda była autosabotażem w obliczu prawdziwych wyzwań, takich jak rozmowy z klientami lub inne działania związane z rozwojem klienta.
Wzorzec jest prosty: jeśli klienci nie wybiorą cię z tego powodu, nie buduj tego.
Jeśli SaaS kosztuje mniej niż 50 dolarów miesięcznie, nie możesz sobie pozwolić na jego budowę. Twój czas jest zbyt drogi.
Budowanie niestandardowego OAuth zajmuje 1-2 tygodnie łącznie na utrzymanie i dodawanie różnych dostawców OAuth. Przy tempie spalania startupów to 5000-15000 dolarów w czasie inżynieryjnym lub w czasie utraconej szansy. Auth0 jest darmowy dla maksymalnie 25 000 aktywnych użytkowników, a następnie 35 dolarów miesięcznie. Mógłbyś płacić za Auth0 przez 35 lat za to, co kosztuje jego jednorazowa budowa.
Więc nie chodzi o pieniądze, ale o priorytety i koszt alternatywny.
Moim zdaniem buduj tylko wtedy, gdy nie możesz dowiedzieć się o użytkownikach bez tego. Prosty przykład to sytuacja, gdy musisz przetestować, czy użytkownicy zapłacą za raporty generowane przez AI. Zbuduj najprostszą wersję, która udowadnia popyt. A wszystko inne próbuje się wymknąć. Tak, pomiń infrastrukturę, pomiń "robienie tego dobrze", pomiń najlepsze praktyki, które nie dostarczają funkcji, pomiń testy. Ponownie, bądź tak leniwy, jak to możliwe w pisaniu kodu.
To nie są rekomendacje, ale moje własne wybory zoptymalizowane pod kątem szybkości. Przypuszczam, że twój stos będzie się różnić, ale ta zasada nie.
\
\
LLM-y utowarowiły budowanie. Każdy junior z Claude może stworzyć ten niestandardowy system uwierzytelniania, z którego jesteś tak dumny. Twoja wartość nie leży już w tym, co możesz zbudować, ALE w wiedzy, czego nie budować.
Przywództwo to umiejętność oddzielania sygnałów od szumu. Prawdziwe starszeństwo oznacza posiadanie dyscypliny, aby zignorować 90% tego, co wiesz, i dostarczyć dzisiejsze rozwiązanie, a nie jutrzejszą architekturę.


