Executando verificação de segurança...
46

Como a obsessão por código matou meu primeiro freela

Fugindo um pouco dos posts didáticos, vim compartilhar uma história que aconteceu no início da minha carreira. Talvez seja útil pra você que está começando, ou, pra quem já passou por isso, sofrer junto com meu eu do passado.

É uma história de como um projeto tecnicamente perfeito (funcionamento e requisitos) falhou em tudo que devia entregar, custou ao cliente alguns poucos milhares de reais, e eu acabei não ganhando nada com isso.

Contexto

Estava no meu segundo ano de faculdade, e durante o primeiro já tinha aprendido sobre estruturas de dados básicas e algoritmos. Também tinha feito alguns cursos da Rocketseat, Udemy e tudo que se pensar - a fim de fugir apenas do acadêmico e procurar conhecer como se fazem aplicações do mundo real.

Nessa época, já me sentia confortável em criar meus CRUDs simples, lidar com bancos de dados relacionais e não relacionais, e fazer um frontend dinâmico com React Class Components. Claro, nenhum conhecimento era profundo nem nada do tipo, tudo superficial, mas pro objetivo dava pro gasto.

Eu tenho dois amigos que, na época, estavam numa situação similar a mim. Um deles era mais voltado pro frontend e o outro pro backend, enquanto eu estava mais como "fullstack", me arriscando nas duas áreas.

Decidimos nos unir e fundar nossa "startup", que não tinha nada formal, era só um nome para nosso grupo de projetinhos da faculdade. No entanto, fui contactado por um conhecido da minha família sobre um projeto que podia ser interessante.

O projeto

Marcamos uma reunião presencial para entender o projeto, o que nos foi passado não parecia nada de mais. Era apenas um portal em que um único administrador poderia fazer o CRUD de alguns posts e apenas usuários pagantes poderiam ver eles.

A ideia era que as atualizações feitas pelo administrador chegassem o mais rápido possível, por que o conteúdo era sempre "urgente". Sobre os usuários pagantes, deveríamos aceitar diversos tipos de pagamento, incluindo o boleto aqui do Brasil e atualizar o status de pagante dos usuários de forma automática, oferecendo um período gratuito no início e cancelando a assinatura se um novo pagamento não fosse efetuado no prazo.

Todo o objetivo era migrar um negócio digital que estava centralizado no Telegram para uma plataforma própria, pois já tinha crescido demais e administrar o canal era muito custoso.

Era muito importante para o cliente ter uma fonte única de custo, afinal estava buscando praticidade. Não deveríamos espalhar serviços do nosso backend por aí e no final receber contas de 5 lugares diferentes.

A tecnologia

Já que queríamos centralizar o custo num só lugar, escolhemos o Firebase como opção de BaaS. Isso caiu como uma roda, já que o Firestore atualiza seu conteúdo no frontend de forma reativa, cumprindo, por tabela, o requisito de atualizações rápidas de conteúdo.

Para o frontend, o construímos em React Class Components - e logo depois o migramos para os novíssimos React Hooks. O deploy do frontend era feito num CD no GitHub, que enviava a nova versão para o Firebase Hosting, mas antes criava uma branch e deploy de staging, tudo automatizado.

A parte de autenticação do usuário também vivia no Firebase, usando Firebase Auth. Podíamos autenticar pelo Google ou somente email e senha. O email de verificação de conta também era algo muito fácil de se fazer pelo Firebase.

O fluxo inicial da aplicação era muito parecido com o seguinte:

arch1

Depois do grosso da aplicação estar pronto, surgiu um novo requisito não planejado antes: o administrador poderia adicionar outros administradores em algum momento. Isso mudou nossa estrutura simples, afinal, não podemos confiar que o frontend seja seguro o suficiente para mudar as permissões de um usuário.

A saída que encontramos foi criar uma Firebase Cloud Function, que tinha a Firebase Admin SDK - em outra palavras, não precisava de um contexto de autenticação para bater nos serviços, o próprio servidor tomava conta disso.

Dessa forma, implementamos um sistema de master admin (nosso cliente) poder permissionar outros usuários ativos - ou até mesmo convidar um email não cadastrado a ser um admin. Nosso fluxo cresceu para:

arch2

Finalmente, chegou a hora de lidar de lidar com a parte da assinatura dos usuários. Queriamos fazer a funcionalidade básica funcionando antes de criar a integração com o Gateway de pagamento em si.

Nossa ideia foi a seguinte: no documento de cada usuário temos "roles" que ditam os poderes do usuário na nossa aplicação - similar a OAuth. Só tinhamos duas roles "pagante" e "não pagante", que eram atualizadas duas vezes ao dia por um cronjob que criamos no Firebase.

O cronjob tomava conta de ouvir a coleção de pagamentos e assinatura do Firestore (banco de dados) e, com base nos últimos pagamentos, atualizava a role de autenticação do usuário.

Nessa etapa, nosso fluxo cresceu para:

arch3

O gateway de pagamentos

No início, junto ao cliente, decidimos pelo PayPal, por já ser bem conhecido. Levamos algumas boas semanas tentando integrar com o sistema do PayPal de assinaturas e webhooks. Sinceramente, até hoje acho que a documentação daquilo era extremamente ruim. Não só faltavam informações, como também o ambiente de sandbox tinha erros que impediam totalmente o teste das funcionalidades que queríamos.

Nosso cliente já havia comprado o domínio dele e aberto o CNPJ - o que estava custando bastante todo mês.

Após perder muito tempo com o PayPal e não conseguir sair do lugar, resolvemos desistir da ideia e procurar um novo gateway. Descobri o Stripe, que na época tinha uma integração com o Firebase. Basicamente, linkamos a chave do nosso projeto no Stripe com o Firebase, assim, o Stripe tomava conta de atualizar a nossa coleção de pagamentos. Perfeito! Tudo com o Stripe funcionava muito bem, e nem tínhamos que criar uma nova tela para compra, já que o Stripe também tomava conta dos redirecionamentos. Era possível criar os produtos (assinaturas) a serem vendidas diretamente no portal do Stripe, toda a administração disso também era feita por lá.

Ainda assim, nosso cliente insistiu que era necessário aceitar boletos, funcionalidade que não era suportada pelo Stripe na época - não sei se já é hoje. Como o PayPal fora de questão, resolvemos optar pelo Pagar.me.

O Pagar.me foi definitivamente mais difícil que o Stripe, mas pelo menos, diferente do PayPal, sua área de testes funcionava bem, o que possibilitou testar os webhooks de forma efetiva. No entanto, a documentação tinha diversos erros na época, além da SDK para o JS não ter JSDocs nem ser feita em Typescript, o que dificultou muito o processo.

Também demos o azar de integrar com o Pagar.me bem na época em que ele estava em transição de versões, tanto da API quanto do portal de testes, o que levou a ainda mais trabalho. Isso significava que parte das nossas requisições podiam ser feitas pela SDK, mas parte devia ser feito diretamente batendo nos endpoints, o que aumentou a complexidade.

Por fim, nosso fluxo cresceu para:

arch4

Os finalmentes

Bom, os finalmentes não foram muito fáceis. Diferente da especificação inicial, o cliente insistiu que o frontend web devia ser totalmente responsivo. Isso levou a um trabalho bem árduo do nosso coitado desenvolvedor responsável pelo front.

Além disso, insistiu que uma aplicação nativa para iOS/Android era requisito. Mesmo o nosso frontend sendo responsivo e tenho suporte para PWA - que na época não era tão suportado pelo iOS.

Finalmente, ambas as plataformas mobile e web deveríam ter localização de conteúdo, pois estava recebendo clientes de fora do país. Assim, nos aventuramos por i18n.

Foi minha primeira vez lidando com React Native, mas fiquei orgulhoso que meus conhecimentos com React foram o suficiente para conseguir criar uma aplicação relativamente bonita, funcional (apenas readonly nos dados) e que satisfez o cliente. O importante era ver o conteúdo e ser redirecionado para a página web de assinatura, o que fazia com maestria.

O nosso fluxo final foi:

arch5

Desenvolvemos tudo isso conciliando com provas da faculdade e projetos, além das aulas. Como sempre, haviam cobranças do cliente relativas a prazo, mesmo com novos requisitos surgindo sempre.

No final, conseguimos entregar toda a aplicação com CD pronto para todas as Firebase Cloud Functions e Hosting no GitHub em torno de 9 meses.

A ruína do projeto

Tudo parecia extremamente bom, tudo funcionava sem nenhum problema. Nossa versão mobile já estava em análise pela Apple Store e Play Store, e o site funcionava muito bem com a versão de playground do Stripe e Pagar.me.

Chegou a hora de criar o projeto de produção de ambos os gateways de pagamento. Isso envolvia um trâmite legal com o CNPJ do nosso cliente, o que levou um tempo.

Após mais ou menos um mês, chegou a resposta - NEGADO.

Obviamente estavamos incrédulos, afinal, a empresa estava registrada e funcionando. Entramos em contato com o suporte para saber o que aconteceu:

A empresa oferece serviços que podem ser entendidos como incentivo à aposta, isso é contra nossos termos de serviço.

Esquecemos totalmente de verificar a parte legal dos gateways. Nossa plataforma tinha como objetivo o cliente postar dicas de apostas para jogos esportivos, e, na nossa cabeça inocente, nunca passou que talvez os gateways não aceitassem isso.

Nossa implementação estava muito acoplada ao Stripe e Pagar.me, na época, apenas alternativas completamente duvidosas estavam disponíveis, acho que Pix nem era uma opção ainda.

Comunicamos isso ao cliente, que obviamente não ficou feliz. O pagamento não foi realizado à nossa "startup", e, assim, ele teve prejuízo tendo que abrir e manter o CNPJ e domínio, além de falhar na promessa para os assinantes no Telegram dele.

Naquela época, aposta esportiva não era nem de perto algo tão comum como é hoje. Me pergunto o que teria acontecido caso o projeto tivesse dado certo, poderia ter gerado muito dinheiro.

Lições

Aqui vão algumas lições que tirei com o projeto:

  1. Tecnologia não é tudo, veja como esquecer os requisitos legais matou o projeto no final
  2. Seja diplomático nas negociações, adendos aos requisitos devem ser MUITO bem especificados, precificados e adicionados ao prazo do projeto
  3. Aprenda a dizer não

Assim, nossa plataforma web/mobile funcional pelos menos serviu para nosso aprendizado. Até hoje fico um pouco triste de não podermos ver algo que demorou tanto tempo para ser feito rodar fora do ambiente de staging.

Carregando publicação patrocinada...
7

Eu adicionaria mais alguns tópicos de aprendizado:

  1. MVP: o objetivo da aplicação me parece simples o bastante para ter um entrega de valor num prazo bem mais curto. Dispensando por exemplo as versões mobile do mvp, aceitando apenas uma forma de pagamento, entre outras coisas que daria para enxugar para um MVP. Com isso vocês poderiam fazer um entrega de valor em 2/3 meses já e já receber uma parcela do valor total do projeto nessa entrega. Não iriam passar 9 meses trabalhando de graça e já iriam identificar esse problema com pagamentos cedo.
  2. Malícia: essa aqui involve um pouco o que vc acha certo ou errado. Mas talvez dessa para contornar esse bloqueio dos gateways apenas por descrever o produto de outra forma: ao invés de "Nossa plataforma tinha como objetivo o cliente postar dicas de apostas para jogos esportivos", poderia ser "Nossa plataforma tem como objetivo o cliente se comunicar com o seu público alvo pagante através de texto". Talvez o cliente envie texto quem contém dicas de aposta esportiva, assim como pode conter qualquer conteúdo que ele desejar enviar.
2

Concordo completamente sobre o MVP! Eramos muito inexperientes na época e não tinhamos qualquer experiência com negócios. A dica que deu é muito boa, sempre entregar e cobrar incrementalmente.

3

Para entregar aplicações à clientes, a tecnologia em si, é o menos importante.

Acredito que todo freela iniciante passa por algo semelhante, as faculdades de tecnologia não nos preparam para e o único jeito de aprender é apanhando mesmo, pelo menos a surra não foi grande.

1
2

Muito legal o compartilhamento dessa experiência, mesmo o projeto final não tendo dado certo, esse tipo de situação de lidar com a parte de soft skills e hard skills já deve ter ajudado muito na sua evolução como profissional.

Na minha opinião projetos devem passar um bom tempo de planejamento, coleta de requisitos e um bom entendimento de todos os fluxos da regra de negócio, sem contar se for usar ferramentas e aplicações externas analisar se ela atende melhor pro seu contexto e se ficar na dúvida, se tiver alguem com experiência com isso perguntar como foi, mesmo que isso atrase o início para colocar a mão na massa, mas garante a change de ocorrer menos problemas mais pra frente, e na questão de negociar prazos e requisitos realmente deixe isso bem claro ao cliente e não tenha medo de barrar novos requisitos no meio do projeto mas mostrando o impacto que isso pode causar no prazo.

No final das contas o que é preciso é gerar valor para cliente final e sempre que puder negociar os requisitos e ferramentas que ele pede mostrando o prós e contras e mostrando soluções alternativas pra ajudar tanto o lado dele quanto o seu.

Muito legal o post, parabéns.

2

Valeu! Cara, concordo com todos os pontos trazidos por você. No início é difícil ter essa noção, e isso acaba se traduzindo em situações complicadas.

Ter um negócio em programação e lidar com os clientes exige um skillset totalmente diferente - e tão valioso quanto.

3

Temos que passar por essas situações complicadas para saber o que fazer e também o que não fazer nas próximas vezes, e na parte de negociação com o cliente tem que ter, como posso dizer, muita "politicagem" pra contornar diversas situações, são habilidades que estão mais pro lado de soft skills e é complicado mesmo porque existem vários tipos de clientes.

2

Obrigado por compartilhar a experiência. É bem comum esse aumento das especificações por parte do cliente quando se lida com pessoas não técnicas, pois elas pressupõem que uma alteração é como corrigir um parágrafo em um texto, quando na verdade é como trocar o motor de um carro.

Para projetos que começam do zero, é muito importante fazer um fluxo funcional o mais rápido possível, do tipo "cliente pode postar algo no site", "cliente pode fazer um pagamento usando um único meio de pagamento", ao invés de esperar ter todas as funcionalidades para o cliente validar ou entregar a ele. É até importante o próprio cliente validar a solução com o público dele, pois o projeto pode tomar um outro rumo, dependendo do retorno dos usuários dele, e isso é algo completamente esperado.

Esses primeiros problemas poderiam ter sido descobertos em um estágio inicial e vocês poderiam já pedir o pagamento de uma parte do total.

1

Concordo plenamente com você. A entrega contínua é uma coisa muito importante, e podia ter completamente mudado o rumo do projeto na época.

1

Que texto incrível! Muito obrigado por compartilhar essa jornada e seus ensinamentos. Normalmente estamos acostumados a ver as clássicas histórias de sucesso, mas acredito que o maior valor em termos de conhecimento resida nas histórias de projetos que acabaram não tendo tanto sucesso quanto pretendido

1

Interessante cara. Eu fui convidado a aventurar no mundo das apostas esportivas quando tudo era mato também, lá por volta do ano 2015. Mas diferente de você, eu não cheguei nem a implementar, por motivos de imaturidade técnica (achava que não daria certo).

1

Obrigado por compartilhar sua experiência.
Geralmente quem trabalha com freelancer comete o erro de acertar tudo de boca (Sem contrato nem especificações).
Eu não movo uma palha sem contrato também não falo nada como algo é estruturado ou como algo vai funcionar já tomei vários prejuízos ao falar como faria algo e no fim o cliente procura outro ou ele já está com o projeto em andamento com outra pessoa e está empacado e vc acaba respondendo a dúvida de outros.
Eu faço o seguinte contrato por escrito com 30% de entrada e os demais pagamentos já amarrados com o cronograma de entrega deixo bem claro o que deve ser entregue e qualquer alteração cobro e isso já está claro no contrato. Quando vc faz isso a conversa com o cliente muda totalmente eles pensam 10 vezes antes de pedir alguma mudança porque isso vai refletir no financeiro e no cronograma deles.

0