A base para o desenvolvimento de software

Jose Otavio Quaglio
4 min readMay 20, 2021

--

Outro dia eu me deparei com esta imagem, onde são exibidas duas filas.

A fila da esquerda, que contêm apenas uma pessoa, é a fila pertencente a pessoas que estão interessadas em aprender sobre algoritmos e estrutura de dados. Já na fila da direita, ao qual, contêm centenas de pessoas, é a fila pertencente a pessoas que estão querendo aprender as últimas tecnologias do mercado.

Vendo esta imagem e olhando para trás perante minha experiência neste mercado de trabalho, parei para refletir como o mercado brasileiro sempre foi desta forma. As vagas de emprego e as entrevistas relacionadas à desenvolvimento de software sempre focam nas tecnologias. Os entrevistadores sempre querem saber se você conhece linguagem X e Y, se você sabe criar uma API, se você tem conhecimento no framework Z.

Lógico que devemos estar atualizados referentes as tecnologias e frameworks que aparecem no mercado, mas você já parou para pensar se sua base de algoritmo e estrutura de dados está bem consolidada? Você sabe o que é um hashtable, um linked list, um doubly linked list, uma stack, uma queue, entre outras estruturas e como trabalhar com elas para ter performance e alocação de memória aceitáveis?

Não adianta você conhecer várias linguagens de programação e frameworks, se você não sabe, como por exemplo, avaliar a complexidade algorítmica em relação à tempo e espaço (Big-O) de um método que você tenha feito.

Tenho certeza que você ja deve ter criado uma função que recebe um array e nesta você percorre o array duas vezes com um “for” dentro do outro. Em outras palavras, um método com complexidade de O(n²) em relação à tempo.

Tente resolver este algoritmo simples, sem fazer um “for” dentro de outro e sem usar funções pré-existentes na sua linguagem de escolha: https://leetcode.com/problems/find-all-duplicates-in-an-array/description/

Se você não conseguir, minha sugestão é que você faça um investimento em cima da fila da esquerda!

Desde quando iniciei na carreira de tecnologia, sempre me vi na fila da direita. Sempre achei que estando atualizado perante as linguagens de programação e frameworks me tornaria um excelente desenvolvedor.

Eu estava enganado! Eu tive pouco contato com estrutura de dados e algoritmos no início de minha carreira. Eu também não pensava que dependendo como eu fazia meu código, o mesmo poderia gerar uma lentidão e até um consumo de memória desnecessário. Afinal, é só colocar o código para rodar em um servidor com bastante capacidade de processamento e com bastante memória disponível, que não tem problema! Não é mesmo? 😒

Pois bem, aqui mostro um exemplo de código bem bonito que fiz em uma entrevista alguns anos atrás. (Lógico que não passei na entrevista, o código não era performático)

Eu programava desta forma. Fazia um código bonito, usando funções disponíveis no C#, sem saber exatamente o que estava acontecendo por trás. Na verdade, sempre pensei que estas funções eram super performáticas e eu não teria problemas ao utilizá-las.

O meu objetivo era resolver o problema. Não importando como eu estruturava meu código e o que eu usava nele.

Após adquirir mais conhecimento sobre estrutura de dados, algoritmos e também conhecer realmente como funciona internamente a linguagem de programação que escolhi, resolvi revisitar este meu algoritmo e otimizá-lo.

Refiz este algoritmo algumas vezes, e cheguei na seguinte solução.

Obs.: Ainda da para melhorar este código! 😉

Para comparar a performance e alocação de memória entre o código anterior e este novo, utilizei o framework BenchmarkDotNet.

Cheguei no seguinte resultado:

Como podemos perceber, através do resultado do benchmark, o primeiro código só era bonito, mas nada performático e também alocava memória desnecessariamente.

Imagine agora que o primeiro código que fiz esteja rodando em uma API que recebe milhares de chamadas concorrentes. Como que ficaria a performance desta API? Como estaria a alocação de memória? Atualmente no mundo de nuvem, você paga pelo que consome. Por isso, devemos nos preocupar com estes fatores!

Este aprendizado me ajudou a ser um desenvolvedor melhor e abrir meus olhos para um mundo desconhecido que muitos brasileiros também não se preocupam. Eu falo isto, pois recentemente tive experiências de entrevistas feitas nos EUA, e os assuntos abordados nestas entrevistas são basicamente: algoritmos, estruturas de dados, e como você consegue melhorar a performance de seu código usufruindo destes conceitos e técnicas.

Desde então eu me interesso muito pelo assunto “performance”. Agora, na maioria das vezes que desenvolvo um algoritmo eu gosto de medir sua performance e alocação de memória e sempre procuro entender o que acontece por trás de métodos que utilizo.

E você? Também se preocupa e mede a performance de seus algoritmos? Se você nunca pensou nisto, espero ter ajudado! 😉

Alguns livros e sites que me ajudaram nesta jornada de aprendizado sobre performance, algoritmos e estrutura de dados:

O projeto contendo o código apresentado neste artigo encontra-se no meu GitHub: https://github.com/joseotavioq/ISBNValidation

--

--