Programar não é sobre a linguagem X, é sobre resolução de problemas
A Ciência da Computação e a resolução de problemas
Podemos definir a Ciência da Computação como a arte de resolver problemas.
Antes de iniciar a pensar em uma solução, ou criar um algoritmo, é necessário pensar em como representar os dados de entrada e saída. O que o meu programa vai receber e como ele vai devolver?
Um computador consegue entender apenas dados que estejam em formato binário, ou bit.
O bit é a menor unidade de informação, podendo representar 0 ou 1. Formalmente, o digito 0 representa desligado ou falso, enquanto 1 é interpretado como ligado ou verdadeiro.
Trabalhar com 2 ou 3 bits limita a quantidade de valores que podemos representar. Por isso, padronizou-se o agrupamento de 8 bits, formando a unidade de 1 byte.
Mesmo que o computador consiga interpretar apenas binário, o significado da sequência desses valores será definida pelo programa ou contexto.
A mesma sequência de bytes pode representar letras, números, emojis, imagens etc.
Você pode observar esse comportamento por meio dos emojis. Um mesmo emoji pode possuir imagens diferentes no Android, iOS e Telegram, embora o padrão utilizado seja o mesmo independente do sistema operacional ou software utilizado.
E o que seria um algoritmo?
Nesse contexto, podemos definir algoritmo como a sequência finita de passos executados para chegar a um resultado.
Imagine o seguinte problema: usar uma lista telefônica para encontrar o número de alguém em específico, como o José.
Uma possível solução começar do primeiro contato e verificar cada contato, um por um, até encontrar o José.
Outra possibilidade seria procurar de dois em dois contatos, tomando cuidado para não pular nenhum elemento da lista. Nesse caso, ao verificar o segundo contato e ver que não é nosso alvo, seria necessário verificar o primeiro contato do par para evitar um comportamento inesperado.
Existe ainda outra possibilidade entre muitas outras: a Busca Binária.
Primeiro, vamos partir a lista ao meio e em seguida verificar se o valor, o José, procurado está a direita ou a esquerda.
Se o elemento não estiver no meio da lista, descarta a metade onde ele não pode estar e repetimos o processo até encontrar o nosso alvo.
As três soluções funcionam, mas uma pode ser mais eficiente que a outra. E isso é parte do processo de resolver problemas: identificar um objetivo e propor uma maneira eficiente de alcançá-lo, sempre levando em consideração o contexto.
Programar é uma tarefa além do código
Durante essa revisão, o que mais clicou em minha cabeça foi perceber que programar não é digitar código. Código é apenas uma implementação da solução.
Antes dele existe o problema que precisa ser compreendido e uma solução que precisa ser planejada.
Um boa solução vai economizar hardware, pessoas, dinheiro ou qualquer outro recurso limitado.
Antes de pensar em linguagem, framework, banco de dados, primeiro é pensar no problema que precisa ser resolvido.
Decompor problemas
Boas soluções podem ser propostas fragmentando o problema em partes, e resolvendo-os um de cada vez em uma sequência lógica.
Durante a aula, o Professor David Malan exemplifica com o desenvolvimento de um jogo completo do zero. O problema pode ser dividido em:
- Alterar o cenário e aparência do personagem;
- Animar o personagem;
- Fazer a animação começar quando o cursor estiver sobre o personagem;
- Criar o algoritmo responsável por fazer o lixo cair do topo da tela;
- Adicionar o placar;
- Sincronizar a música com os objetos que caem do topo da tela.
Há como dividir em mais ou menos passos, mas a ideia é a mesma.
Do problema ao código
Partindo dessa ideia, podemos pensar em um processo para resolver problemas:
- Decomposição:" identificar o problema geral e quebrá-lo em partes menores;
- Descrição da solução: criar um algoritmo, planejando uma sequência lógica de instruções passo a passo para resolver cada parte.
- Pseudocódigo: escrever a solução usando linguagem humana de forma precisa e estruturada:
- Funções e ações que precisam ser executadas
- Condicionais e expressões booleanas
- Laços de repetição
- Casos limite
- Implementação: traduzir o que foi feito no passo anterior para linguagem de programação.
O que foi entendido com esse estudo
Estou reforçando durante meus estudos que programação não é apenas a escrita de código. Existe um processo anterior:
Problema -> decomposição -> algoritmo -> pseudocódigo -> implementação
Antes de escrever a solução am Java ou qualquer outra tecnologia que seja, devemos ser capazes de pensar sobre o problema, dividi-lo em partes menores e definir uma sequência lógica para chegar ao resultado.
Estou compartilhando essas notas também como forma de continuar aprendendo. Se você encontrar algum erro, tiver uma abordagem diferente ou quiser acrescentar algo no assunto ficarei feliz em aprender com seu comentário.