2

ūüďö Devo me aprofundar no estudo dos fundamentos da computa√ß√£o?

#Estrutura de dados #Lógica de Programação #Boas práticas
Diogo Miranda
Diogo Miranda
Leitura aproximada de 10 - 15 minutos.


Muitas vezes um programador iniciante, ou at√© mesmo que est√° a mais tempo estudando/trabalhando com o desenvolvimento de software se v√™ em situa√ß√Ķes de tomada de decis√£o, que s√£o verdadeiros desafios.

Decidi escrever esse artigo com o intuito de direcionar e abrir o pensamento para além do código, buscando nas bibliografia e nas experiências pessoais e de colegas argumentos e ideias que te leve a se tornar um melhor desenvolvedor a partir dos fundamentos da computação.


Sou da √°rea de ci√™ncia, sou fascinado em entender como funciona "por debaixo do cap√ī". Seja entender um compilador, um algoritmo ou um hardware. Levando isso em considera√ß√£o, quando comecei a entender muitos conceitos que ficavam impl√≠citos a primeira vista, comecei a programar melhor e a desenvolver minhas solu√ß√Ķes de maneiras mais eficazes.

Escrevi esse artigo me baseando em algumas bibliografias - que eu considero como fundamentais na computação - e minha experiências pessoas quanto programador.


Para contextualizar, pense nessa situa√ß√£o hipot√©tica: Uma grande empresa de e-commerce precisa otimizar o tempo de pesquisa pelos seus produtos em seu site. O seu sistema possu√≠ v√°rios gargalos, e precisa ser refatorado. Voc√™ e sua equipe foram designados para realizar essa refatora√ß√£o. Ao analisar o sistema, percebe-se que este utiliza um SGBD - Sistema de Gerenciamento de Banco de Dados - "X". Mas dado o volume de produtos e clientes, esse SGBD pode ser o poss√≠vel causador de gargalos durante as requisi√ß√Ķes (pesquisas) pelo usu√°rio. Sendo assim, voc√™s t√™m que projetar uma solu√ß√£o sob demanda, utilizando algoritmos mais otimizados e sofisticados para essa situa√ß√£o, e voc√™ foi designado paras resolver este problema.


Pensando nessa situa√ß√£o de uma maneira bem simplista, voc√™ dever√° ter que conhecer bastante dos fundamentos da computa√ß√£o - pensando tamb√©m em uma base matem√°tica - para resolver a quest√£o de criar ou escolher um algoritmo, que atenda a este volume de dados e elimine o gargalo nas pesquisas. 


No restante do artigo, levo em conta basicamente essa situação: projetar - ou escolher - um algoritmo que atenda esse volume de dados - considere um volume "colossal" - com uma certa característica.


Primeiramente, precisamos entender o que seria esse tal "algoritmo". Segundo Cormen, informalmente, um algoritmo é qualquer procedimento computacional bem definido que toma um valor ou um conjunto de valores como entrada e produz algum valor ou conjunto de valores como saída. Ou seja, quando pensamos em um problema, ele pode ser traduzido na forma de um algoritmo, desde que tenha em vista os dados de entrada do problema (input) e como esse problema será resolvido encima desses dados (output).


Levando em considera√ß√£o que, para melhorar o tempo de resposta das requisi√ß√Ķes a este site, foi entendido que os dados precisam ser ordenados, para que uma fun√ß√£o externa possa recuperar rapidamente estes dados. Sendo assim, o seu problema foi definido em que:


Input: Uma sequência de n dados <d1, d2, d3 ... dn>

Ouput: Uma reordenação da sequência de entrada, tal que <d1 <= d2 <= ... dn>


Em outras palavras, você precisa ordenar de forma crescente de IDs dos produtos no site, por exemplo.


Qual algoritmo de ordenação nos trás a melhor eficiência?

Você pode até saber escrever um algoritmo para esse problema, mas como medir a eficiência desse algoritmo? Ele é mesmo o mais eficiente?


Nesse ponto que entra o diferencial de um programador que conhece os fundamentos da computação, mais especificamente dos algoritmos.


Você poderia utilizar um algoritmo chamado "Selection Sort", que como o próprio nome já diz, ele realiza a ordenação por seleção dos elementos. Seu funcionamento pode ser descrito como:


- Procure o menor elemento no conjunto de dados.

- Troque a posição do menor elemento com o primeiro

- Volte ao primeiro passo e considere o conjunto a partir do próximo elemento.


Mas o ponto chave onde quero chegar, é o custo desse algoritmo. Quando estuda-se análise de algoritmos, entende-se um conceito chave na computação que é a complexidade do algoritmo - você pode ver um pouco mais sobre esse conceito nas bibliografias indicadas nesse artigo. Levando a consideração do pior caso desse algoritmo, o seu custo em uma notação matemática é O(n²), basicamente o dizemos que seu custo tem em base uma função quadrática.


Agora para comparar, vamos utilizar outro algoritmo, que tem a mesma função (ordenar um conjunto de elementos em memória principal) mas ele é implementado de outra maneira, com outros fundamentos. Esse algoritmo é chamado de "Quicksort", e funciona da seguinte maneira:


*Considere que os dados estão armazenados em uma estrutura de dados similar a um array, em que cada dado possuí um índice dentro do array.


- Escolha um piv√ī arbitrariamente;

- Percorra o array da esquerda para direita, enquanto array[i] < piv√ī;

- Percorra da direita para a esquerda, equanto array[j] > piv√ī;

- Se i <= j ent√£o troque array[i] com array[j]

- Continue equanto i <= j


Sendo assim, a complexidade desse algoritmo, em uma notação matemática é O(n lg(n))


Interpretando o gr√°fico dessa fun√ß√Ķes, podemos ver que a medida que o n√ļmero de dados (n) aumenta, fica mais "caro" utilizar este algoritmo em dado volume de dados, em termos da sua fun√ß√£o de complexidade.


Suponha que o n√ļmero de dados cadastrados naquela empresa de e-commerce que precisam ser ordenados s√£o de 2.000.000. Os custos, considerando a complexidade de cada algoritmo seriam:


Selection Sort: 4 √ó 10¬Ļ¬≤ 

Quicksort: 3,2 √ó 10‚Ā∑ 


Ou seja, o algoritmo de Quicksort mostra-se muito superior ao de Selection Sort. Se formos pensar no quesito de tempo, o gargalo pode ter sido causado pelo SGBD utilizar o algoritmo de Selection Sort, e isso poderia ser resolvido de uma forma muito otimizada trocando este algoritmo.


Mas onde quero chegar com essa conversa? 


Queria inspirar voc√™ a tentar entender um pouco mais dos fundamentos dos algoritmos e da computa√ß√£o em si. Mesmo voc√™ j√° sabendo programar bem e desenvolver suas solu√ß√Ķes, √© importante saber pensar em um c√≥digo que seja adequado para aquele tipo de problema. Ou seja, queria que a partir de agora voc√™ come√ßasse a se perguntar se uma solu√ß√£o al√©m de funcionar, ela √© a mais adequada dado certa circunst√Ęncia. Queria passar uma vis√£o de que a computa√ß√£o tem uma s√≥lida base matem√°tica e l√≥gica, e essa deve ser explorada ao m√°ximo para elevar as suas chances de sucesso.


Você pode expandir esse pensamento para além de algoritmos, e começar pensar em estrutura de dados mais adequadas, ou novos paradigmas para certos problemas.

Devemos ir al√©m de documenta√ß√Ķes e linguagens de programa√ß√£o, os fundamentos que constroem os pilares da computa√ß√£o s√£o fundamentais para o sucesso de um projeto. 


Referências:


  • Algorithms Theory and Practice - Cormen
  • Projeto de Algoritmos com Implementacao em Java e C - N√≠vio Ziviani
1
46

Coment√°rios (1)

2
Luiz Maranhao

Luiz Maranhao

24/03/2021 20:19

Caracas esse artigo expandiu minha mente. A situa√ß√£o hipot√©tica apresentada, demonstrou a import√Ęncia de entender toda a mec√Ęnica.


Muito bom esse artigo, me trouxe um conhecimento a mais, para meu desenvolvimento profissional!

Estudante de Ciência da Computação

Brasil