Resan
Min professionella resa på Fokvs (enda arbetslivserfarenheten) med ombyggnad, migrationer, intäkter och teamprocesser.
När jag gick med som CTO i maj 2023 ärvde jag en komplex infrastruktur som inte matchade skalan eller behoven i verksamheten:
- 7 mikrotjänster i Python som kör på AWS Lambda
- En separat API i Java
- 3 olika databaser: Neo4j, MySQL och DynamoDB
- Flutter-app och React webbplattform
- R$600/månad AWS-kostnader för en handfull användare utan monetisering
Det fanns inget logiskt resonemang bakom dessa val—det byggdes inkrementellt baserat på vad som var känt vid tiden, utan att överväga skalbarhet eller kostnadseffektivitet.
Mitt första stora beslut som CTO var att förenkla infrastrukturen. Utan monetisering och låg användning var den komplexa uppsättningen inte motiverad. Jag föreslog och genomförde:
- Enhetlig API i NestJS, byggd från grunden
- PostgreSQL som enda sanningskälla
- Omskrev webbplattformen i Next.js för bättre SEO
- Helt hostad på Fly.io för hanterad, prisvärd infrastruktur
Jag skrev all kod för den nya API:n och hanterade migrationen. Denna grund möjliggjorde snabb produktiteration och förberedde oss för tillväxt.
När produkten skalades och användningen växte behövde vi mer kontroll och skalbarhet än den hanterade plattformen kunde ge. Jag orkestrerade en komplett migration tillbaka till AWS:
- ECS Fargate-distribution: Dockeriserade containrar med autoskalningskapacitet för att hantera trafiktoppar
- Produktionsklass infrastruktur: RDS Postgres, ElastiCache Redis, CloudFront CDN, privata subnät med bastion-värdar
- 100% Infrastructure as Code: Hela infrastrukturen hanterad med Terraform för reproducerbarhet och versionskontroll
- Noll driftstopp-migration: Noggrant planerad och genomförd migration utan serviceavbrott, behöll 100% driftstid under övergången
- Skalbarhet och kontroll: Infrastruktur designad för att stödja 100K+ användare med full kontroll över skalning, övervakning och kostnadshantering
Denna migration gav grunden som behövdes för att skala effektivt samtidigt som kostnadskontroll och operativ excellens bibehölls.
Att hitta hållbar monetisering var utmanande. De flesta materialen var gamla tentor, vilket skapade upphovsrättsbekymmer. Vi provade flera tillvägagångssätt:
- B2B-partnerskap: Bannerannonser och jobbtavla-integrationer. Intäkter växte från R$200 till R$650/månad, men krävde manuell, arbetsintensiv distribution genom universitetsgrupper.
- B2C-kreditförsäljning: Användare kunde köpa krediter för att komma åt material. Några försäljningar, men inte skalbar.
- Första prenumerationsmodellen: Obegränsad åtkomstprenumeration. Bara 3 prenumeranter—skalade inte.
- AI Question Scan + ny prenumeration: Detta var genombrottet. Lanserad tillsammans med den nya prenumerationsmodellen, drev det konsekvent prenumeranttillväxt.
Genom användarinteraktioner upptäckte vi att huvudincitamentet för att dela material var den rena instinkten att hjälpa klasskamrater—nästan som en statussymbol. Ambassadörsprogrammet utnyttjade detta naturliga beteende:
- Personlig onboarding: Inledningsvis gjorde vi samtal med varje sökande för att bättre förstå vår målgrupp
- Kompensationsmodell: Belönad med pengar för materialuppladdningar (milstolpar) och visningar. Ambassadörer hade en dashboard med saldo som kunde tas ut när minimigränsen nåddes
- Nationell expansion: När videor blev virala kom ambassadörer från hela Brasilien. Vi växte i topp federala universitet, exakt vårt mål. För närvarande: 600 aktiva ambassadörer, 4K väntelista
- Teknisk utmaning: Byggde händelsedrivet system med transaktionellt redovisningssystem. Senare refaktorerade för att stödja två samtidiga programversioner under migration, migrerade långsamt användare mellan versioner
När produkten växte tog jag på mig ansvaret att skala produktteamet och etablera tydliga processer:
- Rekrytering och onboarding: Rekryterade och onboardade nya produktteammedlemmar, skapade omfattande onboardingsmaterial och processer
- Utvecklingsprocessdokumentation: Etablerade tydliga utvecklingsarbetsflöden, från planering till distribution, med praktiska exempel och checklistor
- Intern handbok: Skapade ett levande dokumentationssystem som täcker processer, PRD-mallar, kvalitetsprinciper och verktygsanvändningsriktlinjer
- Kvalitetsstandarder: Definierade kodningsstandarder, testkrav och granskningsprocesser för att säkerställa konsistens i hela teamet
- Mentorering och kunskapsdelning: Genomförde regelbundna kunskapsöverföringssessioner och mentorade teammedlemmar om tekniska bästa praxis och arkitekturbeslut
Dessa processer möjliggjorde för teamet att skala effektivt samtidigt som höga kvalitetsstandarder och inriktning på teknisk riktning bibehölls.
Vi skapade kassasystemet specifikt för att möjliggöra en direktförsäljningsmodell för prenumerationer. Detta tillvägagångssätt förändrade fundamentalt hur vi förvärvade och konverterade användare:
- Meta-annonskampanjer: Flera kampanjer som driver trafik till olika landningssidor på olika plattformar
- Distribuerade landningssidor: Landningssidor spridda över Framer och Lovable, var och en omdirigerar till det enhetliga kassasystemet
- Komplett attribueringsspårning: Alla varianter spårade från slut till slut, möjliggör exakt mätning av kampanjprestanda och konverteringsfrekvenser
- Förenklad försäljningstratt: Användare köper innan de använder, gör attribuering trivial och intäktskalning förutsägbar
- Förutsägbar intäktskalning: Den förenklade tratten och tydlig attribuering möjliggjorde datadriven optimering och pålitlig intäktsväxt
Denna direktförsäljningsmodell transformerade vår förvärvsstrategi, gjorde det enklare att mäta ROI, optimera kampanjer och skala intäkter förutsägbart.
Tidiga Tekniska Beslut
- PDF-miniatyrer: Inledningsvis lagrade binära miniatyrer i Postgres-kolumner med GraphicsMagick. Funkade bra inledningsvis, men när materialen växte migrerade till S3 med URL-fält. Behöll API-kompatibilitet genom att omdirigera till S3-URL:er
- Reaktionssystem: Började med enkelt like/dislike i en reaktionstabell med COUNT-frågor. Som Instagram hade blev detta långsamt. Denormaliserade med like_count-fält uppdaterade via triggers. Senare utvecklades till 1-5 stjärnbetygssystem
Arkitekturskuld & Förbättringar
- Växande komplexitet: När funktioner expanderade blev tjänsterna stora, tätt kopplade. Affärslogik var blandad med infrastruktur. KnexJS-frågor blev massiva, gjorde affärslogiktestning nästan omöjlig
- Förbättringar av utvecklarupplevelse: Förbättrade ombyggnadstider, hot reload, miljöreproducerbarhet. Skapade seed-system från anonymiserade produktionsdata, laddade ner provstatiska material och växlade mellan dem i Minio för att spara utrymme—ingen S3-beroende för dev
- Framtida refaktorisering: Backend behöver fortfarande stor refaktorisering. Idealet skulle vara närmare DDD-arkitektur för att ordentligt separera bekymmer
