O desenvolvimento como caminho

Adriano Croco
5 min readJul 27, 2020

--

Olá, estamos aqui novamente :)

No post passado, prometi escrever sobre o que desenvolvimento, Karatê e caligrafia tinham em comum… e cá estamos. Para começar, vamos entender um pouco do contexto dessa arte marcial específica.

Para quem não está familiarizado, Karatê-Do (空手道) é uma arte marcial originada na ilha de Okinawa e tem suas raízes na influência chinesa na região. A tradução do japonês é algo como “Caminho (Do) das mãos (Te) vazias (Kara)”. Com o tempo e atuação de diversos mestres japoneses, foram criados inúmeros estilos e ramificações, até chegar em algumas divisões que existem hoje, como Shotokan (originado na ilha principal do Japão), Goju-Ryu (originário da cidade de Naha), Shorin-Ryu, Wado-Ryu e inúmeros outros.

Como toda forma de arte, requer prática deliberada para conseguir evoluir. Isso envolve repetir socos e chutes usando uma técnica especifica por centenas de milhares de vezes, literalmente. Você vai desferir socos e chutes de diversas formas, repetidas vezes… até a beira da exaustão em alguns casos.

No começo, pode parecer sem sentido e desnecessário treinar esses fundamentos tantas vezes, porém, após um tempo você descobre o conceito de Kata.

Kata é uma simulação de luta real, onde o praticante executa uma sequência de golpes e defesas pré determinada, isso de acordo com o estilo de Karatê e o nível do praticante. Conforme o praticante vai avançando em seus estudos e prática os katas vão tendo uma evolução na dificuldades dos movimentos a serem aplicados.

Vamos a um exemplo prático aqui. No começo, você começa fazendo alguns movimentos como esses. Porém, treinando muito, você consegue chegar nesse nível aqui.

Você pode olhar os dois vídeos e pensar: “ué, mas o primeiro é mais difícil que o segundo, não?”

Então, não. Apesar de parecer mais fácil, o nível de controle muscular, controle de respiração e técnica contida no Tensho é pelo menos uma ordem de magnitude de dificuldade maior do que o primeiro. Embora não pareça.

Porém, mesmo que você saiba de tudo isso, pode ser que você não perceba a diferença nas técnicas, certo?

Vamos a um segundo tópico para ilustrar melhor: vamos falar de caligrafia.

Ao começar os estudos da arte de desenhar Kanjis, você se inicia por uma técnica chamada Kaisho, que significa algo como “o jeito certo” de desenhar um determinado Kanji. Sem espaço para improvisações ou criatividade.

Após isso, você aprende o conceito de Gyôsho, no que te permite se expressar de uma forma um pouco mais flexível e improvisada.

E por fim, o conceito de Sôsho, no qual você pode literalmente escrever o kanji de forma que quiser, porém, a essência permanece intacta.

Para sair um pouco do abstrato, compare abaixo a mesma sentença escrita com as formas mencionadas até agora:

Para traduzir a mesma ideia de uma forma “cool software industry jargon”, vamos resumir em:

Learn first, break after and then…make the rules.

Você pode estar se perguntando: “tá, entendi tudo, mas o que tudo isso tem a ver com desenvolvimento? Ou os Katas? eu quero ver código!” ou algo parecido.

Na minha opinião, assim como uma arte marcial ou caligrafia, desenvolvimento é uma profissão de prática. Com isso, você só consegue evoluir com prática deliberada, ou seja, você tem que aumentar o nível de complexidade ao longo do tempo das tarefas que exerce de forma intencional, além de requerer muitas horas de esforço para conseguir fazer algo incrível.

E após um determinado nível, o que você consegue produzir é ordens de magnitude melhor que a produção de um iniciante. No Karatê, envolve a prática dos Katas. E no desenvolvimento?

Vamos ao código para ilustrar. Vamos resolver o seguinte problema:

Dado uma lista de n valores inteiros, escreva uma função que retorne se um determinado inteiro está contido dentro da lista.

Simples, não?

Vamos a implementações, talvez a forma mais fácil de resolver esse problema seja essa:

Implementação de um lookup

Learn the rules. Até mesmo quem não é familiar com C# consegue entender esse código. Kaisho, puro e simples. O começo do caminho, certo?

Após um tempo de carreira, você pode querer fazer mais e inovar um pouco na escrita dessa função, usando algumas técnicas mais sofisticadas, como LINQ, o que tornaria o código como algo assim:

Lookup usando LINQ

Sim, LINQ é enxuto assim mesmo se você está se perguntando. Aqui temos o Gyôsho, porque apesar de parecer simples, o LINQ é um syntax sugar que permite escrever um código muito simples, porém, que abstrai muitas coisas por debaixo dos panos. Essa é a armadilha do meio do caminho… saber sem saber de fato.

Na prática, o código gerado pelo LINQ é algo parecido com isso se você ficou curioso:

Por fim, após algumas muitas horas de prática deliberada, você quer fazer mais. O conhecimento que você adquiriu permite te escrever um código extremamente performático. Que pode ser algo parecido com isso:

Espera aí, é igual o segundo!” dizem as vozes na minha cabeça que simulam o leitor.

Então, parece… mas não é. Ao invés de usar uma lista ou um array, o terceiro exemplo utiliza uma estrutura de dados chamada HashSet, que permite que o lookup dessa forma seja feita em O(1) ao invés de O(n). Sem entrar em muitos detalhes do que é Big O Notation, vamos ilustrar a diferença de performance usando um benchmark.

Eu rodei as 3 implementações para uma lista de 1 milhão de valores gerados aleatoriamente. O resultado foi esse:

Benchmark em c# contendo os resultados de performance gerados pela biblioteca benchmarkdotnet

Dá uma olhada na coluna ratio. Ela leva em consideração a implementação mais rápida como base e compara em relação as outras. Isso quer dizer que a implementação em LINQ foi 26 MIL vezes mais lenta. A implementação ingênua… 17 MIL vezes.

Sabe o que permite que essa implementação seja mais Sôsho? conhecer a fundo os fundamentos e usá-los a seu favor.

Existe uma frase que eu ouvia no Dojo que pode se aplicar a tudo que você quiser fazer direito: honre a arte, que a arte te honrará de volta.

A aplicação disso na sua vida eu deixo a seu critério.

A provocação que eu quero deixar com esse post é: assim como quem não sabe desferir um soco direito pode até chegar a obter a faixa preta sem ser de fato um porque não honrou a arte no seu caminho, uma pessoa desenvolvedora Sênior pode obter o mesmo título sem de fato ter um conhecimento profundo sobre as tecnologias que usa. Se você ainda não entendeu, veja esse vídeo aqui.

Software mal feito além de quebrar empresas, pode matar.

Sério gente, ao menos tentemos ser melhores.

Você gostou do conteúdo e gostaria de fazer mentoria comigo? Clique aqui e descubra como.

--

--