
Costumo usar tecnologias que considero inadequadas e, em resposta, recebo (junto com argumentos) pura raiva e dor. Às vezes físico.
Os desenvolvedores consideram a crítica de suas tecnologias favoritas muito pessoalmente por algum motivo. Esse “culto à ferramenta” é um fenômeno tão estranho que não consigo explicar logicamente. Alguns dizem que todos são propensos a isso, porque os processos de pensamento de um codificador se entrelaçam muito profundamente com sua linguagem de programação. Alguns dizem que é uma falácia de juniores - você escreve algo pela primeira vez, funciona e começa a tratar sua língua como algo divino.
Seja o que for, eu nunca entendi.
Eu sempre considerei cultistas como imbecis. Mas sempre tento entender por que imbecis se tornaram eles, por que evitei esse destino. Eu começo a pensar e bam! - acabou que eu também sou um imbecil. Eu sou um cultista que adora F #. E, claro, há uma história por trás disso.
Comecei como desenvolvedor júnior de C #. Xamarin então cru, desenvolvimento Android, toda a conversa. Meus primeiros passos no trabalho foram cheios de dor. Eu tive que escrever um aplicativo Android sozinho, com base em capturas de tela e gifs da versão iOS. Ele só compilava todas as vezes, os buga estavam por toda parte, e o único feedback que recebi foi - “por que não é como na captura de tela?”. Foi um pesadelo e eu saí rapidamente.
Passei meio ano aprendendo a codificar em casa e, em seguida, consegui um emprego em uma grande equipe. Lá era muito mais organizado - equipe, mentores, exames, padrões, revisão de código, alinhadores rígidos, altos padrões de qualidade, legibilidade e desempenho do código. Em uma palavra, tudo estava maduro. E eu pensei que era assim que deveria funcionar. Mas, como se viu, foi um pesadelo ainda maior.
Por mais de um ano, toda a nossa equipe elaborou um módulo para uma ferramenta que funcionava com ferramentas usadas para fazer outras ferramentas. Provavelmente os mesmos que usamos para fazer os módulos. Todos os dias, tínhamos que ligar para índios e americanos e relatar que Deus sabe o quê.
Em algum momento, percebi que estava fazendo cada vez menos, mas nada mudou. Eu menti entre os dentes em inglês quebrado: “Durante toda a semana passada eu procurei por insetos. Ainda sem sucesso. Continuará. "
“Ok Phil, parece ótimo” - meus parceiros transatlânticos responderam.
Em um ponto, desesperado e vergonhoso, fui à gerência e pedi para me demitir, mas, em vez disso, por algum motivo, me deram um aumento. Eu já contei essa história antes. Eu não estava feliz nem triste - parecia uma espécie de piada surreal, como se a lógica deste mundo estivesse desmoronando.
Estranhamente, por tédio e por ser ultra-ambiciosa, decidi desenvolver as coisas em casa e fazer tudo "adequadamente". Tive várias idéias de como usar projetos de software para melhorar o mundo e minha carteira. Fiz tudo de acordo com o livro: um documento de design, arquitetura, requisitos de sistema, projetos de VSTS. Tudo foi organizado e maduro, como nas empresas.
Não estava chegando a lugar nenhum.
Conclusão natural - a ideia era uma porcaria. Código antigo na lixeira, nova idéia. Mesmo resultado. Comece de novo. Isso continuou algumas vezes. Eu digo aos meus colegas de trabalho e eles estão confusos. O que estou fazendo de errado? Faço exatamente da mesma maneira que aqueles que já ficaram ricos por trás disso.
Pessoas com meu (alto) nível de auto-estima costumam estar melhor do que outras, mas às vezes precisam pagar por isso. Você precisa mentir para si mesmo para lidar com o fracasso. E eu disse a mim mesmo: qualquer desenvolvedor é capaz de qualquer coisa. É tudo sobre como é feito, e meus requisitos para "como" são muito altos. Eles não são adequados para uma startup doméstica e não são dignos de tarefas comerciais inúteis. Próximo pensamento: "Não estou pronto para abandonar meus padrões de qualidade". Mesmo que eu precise criar um aplicativo que peida quando você toca na tela, eu o tornarei o mais bonito e pensado possível.
Então, montei um culto comercial local em casa. Trazido sobre tudo - rituais, processos, padrões - mas não a carne real da coisa. Eu interpretei um desenvolvedor de negócios sem negócios, como um homem das cavernas que fez uma pista e uma torre de vigia em palha e esperava que os pássaros de aço pousassem nela.
Escrevi pilhas e pilhas de código formal e estrito que não me aproximaram mais do resultado final, mas exatamente o oposto. Se você pensar bem, minha carreira é uma história de fracasso e decepção. Eu desisti completamente e apenas assisti a programas de TV no trabalho enquanto bebia 16 xícaras de café por dia.
No fundo do poço, notei um artigo da Habr sobre F #, experimentei e pensei “Hm, nada mal!”. Meu empregador pagou alegremente por um mês estudando para mim (embora ele não saiba).
O F # não foi difícil de aprender, pois tinha o mesmo tempo de execução que o C # e eu já usava a abordagem funcional de programação no TypeScript todos os dias. Percebi que posso transferir qualquer um dos meus projetos para o F #. Vamos deixar minha habilidade técnica fora da equação por um momento, já que é tudo relativo. Nas equipes em que trabalho, sou ótimo, mas em uma equipe de, digamos, desenvolvedores de F #, eu não podia ser nada além de um zelador.
Mas eu conseguia resolver problemas em um nível básico, mesmo sabendo no fundo: não conseguia resolver nada. Vou continuar jogando conhecimento no lixo. Perdi completamente minha fé em programação.
Um dia, decidi que bastava. Eu ia desistir. Era um dia frio e escuro de inverno. Saí do escritório, entrei no carro - e ele não liga. Depois de um tempo, o motor finalmente ganhou vida. Não sei se notei a fumaça do cheiro de plástico queimado mais cedo, mas um incêndio irrompeu sob o capô. Alguns segundos depois, eu estava correndo pelo estacionamento, dizendo a todos para afastar seus carros dos meus.
Cinco minutos de pânico e caos depois, restavam apenas uma carcaça de carro em chamas e um telefone com vídeos estúpidos do YouTube. Era -30 ° C, e eu estava com um casaco leve de um homem que pretendia dirigir para casa em um carro quente. Completamente gasto e moralmente destruído. Não tenho dinheiro para um táxi e me preocupo demais com o transporte público. Voltei para casa, mais ou menos 10 km. Em casa, eu precisava ajudar minha esposa com a criança, comer, levá-los para a cama, fazer mil pequenas coisas. Mas, eventualmente, não há mais nada para me distrair e fiquei frente a frente com minha insônia e uma percepção - não sou digno de nada, nunca vou conseguir.
Nesta pior noite da minha vida, ainda fria de uma caminhada gelada para casa, dei-me uma última tentativa.

Sentei-me e escrevi um pequeno bioma digital em F #, onde as unidades de aprendizado de máquina interagem e se desenvolvem, enquanto brinco com parâmetros e observo o que acontece.
E sim, naquela noite eu provavelmente fiquei um pouco louca.
Normalmente, uso uma mistura do modelo de programação ascendente e descendente. Descrevo uma solução aproximada com pseudocódigo e começo a escrever os detalhes mais importantes como módulos separados. De pequeno a grande.
Passando do pseudocódigo ao código real, concluo um ou dois módulos grandes e verifico se alguma coisa está funcionando. Normalmente não, então começo a repetir, repetindo esse processo do início ao fim até que funcione. Mas, na maioria das vezes, desisto após a quinta ou sexta iteração.
Eu tentei a mesma abordagem com o F #. Eu tinha uma visão geral do projeto, e então a solução estava construindo, tijolo por tijolo, na minha cabeça. Você cria um caso após o outro e, em algum momento, percebe que sabe como fazê-lo funcionar. E então você começa a codificar e percebe que não, não. Pensamentos não se traduzem em linguagens de programação, mesmo que você pense frequentemente nele. Eu fazia isso acontecer o tempo todo.
Desta vez, porém, foi diferente. Criei um arquivo .txt no VSCode e escrevi o pseudocódigo para uma função que descreve o ciclo de vida do meu aplicativo. E percebi que meu pseudocódigo é válido em F #. Não há necessidade de traduzir nada, acabei de escrever a principal função do meu projeto. Ok, mudei a extensão do arquivo e a adicionei à solução limpa. Havia a minha função de ciclo de vida. Ele aceita o estado mundial atual, algo que o processa (o próprio mundo) e cospe o estado atualizado, algo que o traduz em um conjunto de parâmetros de IA e vice-versa, mais a própria IA que aceita parâmetros e cospe a solução .
Então foi simples. Você pega o estado, transforma-o em parâmetros de IA, alimenta-os com a IA, transforma o resultado de volta no estado mundial, entrega-o ao jogo e o resultado volta à função de ciclo de vida. Uma bela recursão, um algoritmo simples, código sublime, todo o GoF pronto para uso. Tudo o que restava era fazê-lo funcionar.
Mas o problema é que não preciso mais pensar na arquitetura. Escrevo o que os desenvolvedores Java e Sharp chamam de "inversão do contêiner de controle" - uma função que pega a função de ciclo de vida e passa pelas funções dos meus módulos (II, Game). O VSCode destaca-o em vermelho porque não possui funções ou módulos, mas eu tenho o que preciso - assim que os destaques em vermelho desaparecerem, eu posso construir o projeto e pronto.
Pego os módulos e os faço, um por um, trabalhando da mesma maneira. O projeto inteiro é de 5 arquivos. O arquivo AI é de 500 linhas - muito, mas a maioria se funciona muito bem. A vantagem dessa abordagem é que eu poderia escrever uma função de ciclo de vida útil - o coração do meu aplicativo - sem descrever mais nada.
A arquitetura inteira é de 10 linhas de código, escritas em alguns minutos. Sem interfaces, malhas abstratas, locs, todas essas DefaultInterfaceNameClasses e outras porcarias que tenho que fazer em C # antes mesmo de entender o que quero criar. Você escreve um núcleo burro que simplesmente resolve o problema, e é mais bonito que os sofrimentos no nível corporativo em Java ou Sharp.
E fiz tudo digitando meus pensamentos no editor, como se estivesse pensando em F #. Em vez de esboçar um plano nos comentários em C #, escrevi funções de trabalho. Em vez de descrever dezenas ou mesmo centenas de interfaces, há um pequeno arquivo com o modelo de domínio do aplicativo. Clicou em "construir". Recebeu uma solução de trabalho. Em uma noite. Com o código de qualidade, posso confiar com confiança para revisar. Tão simples como isso.

Não sei qual é o problema - se o F # é uma tecnologia impressionante, ou simplesmente se encaixa perfeitamente em mim, ou se foi criado especificamente para essas tarefas - qual é a diferença? O importante é que naquele momento eu estava afundando e precisava de um barco salva-vidas. A vida me jogou F # e eu saí disso. Agora não é apenas mais uma tecnologia sem alma para mim - é um grande acordo emocional.
Agora, quando ouço alguém repreender F # - “Um técnico natimorto! Um brinquedo nerd ... ”- Eu sempre me lembro da noite fria de inverno, do carro em chamas, do cigarro congelado na boca, da depressão e do F # que me tiraram dele. É como se alguém jogasse merda no meu melhor amigo.
Pode parecer estranho para alguém de fora, mas se você vivesse aquele dia em meu lugar, teria reagido da mesma forma. Eu acho que isso é comum em qualquer cultista de tecnologia. Eles se apaixonaram por seus idiomas, porque têm um apego emocional às circunstâncias que os fizeram descobrir. E então eu venho e cuspo direto na alma deles. Quem é o idiota agora? Eu sou Eu não vou fazer isso de novo, espero.