Páginas

segunda-feira, 27 de dezembro de 2010

Lógica de programação

Hoje vou falar um pouco sobre a base de tudo, a parte fundamental da programação: lógica. Então, se você for um iniciante em programação, este pode ser um bom começo. Não espero que saia daqui com sólidos conceitos, mas ao menos possa compreender como funciona um programa e aventurar-se em alguma linguagem.




  • O que é lógica de programação?

Por: RabiD Son.

É verdade que esse tipo de raciocínio baseia-se na lógica tradicional, mas gira prioritariamente em torno de algoritmos, os quais detalharei a seguir. Enfim, sendo a lógica parte da matemática, é comum que as pessoas pensem que programadores são também excepcionais matemáticos, com habilidades naturalmente superiores. Pessoas escolhidas, basicamente.

Não poderiam estar mais errados.

Vamos a um exemplo prático para entender melhor. Suponha que você tenha uma namorada, Maria, extremamente ciumenta, mas consegue livrar-se dela temporariamente para conversar com Lúcia, uma amiga. Durante a conversa, Lúcia perde o equilíbrio e acaba apoiando-se em você, quando por puro infortúnio Maria aparece bem na hora e os pega "no flagra". E como toda boa ciumenta, Maria vai logo tirar satisfação, sem querer saber dos detalhes.

O que lógica tem a ver com isso? Tudo. Se Maria tivesse observado a cena por mais tempo, é muito provável que teria percebido seu engano e te deixado em paz, mas ela não usou a lógica e foi dominada pela emoção do momento. O que Maria teria feito se fosse uma boa programadora? Nesse caso, ela usaria um algoritmo simples para determinar se você a estaria traindo ou não, ou seja, esperar que você e Lúcia efetivamente se beijassem ou algo do tipo.

Em outras palavras, a diferença entre um programador e uma "pessoa normal" não é nenhum dom ou habilidade mágica, mas sim a capacidade de lidar com abstrações e elaborar algoritmos eficientes de acordo com o contexto. Nesse sentido, quando dizemos que alguém é ilógico, como Maria, estamos nos referindo à sua incapacidade de planejar suas ações adequadas. E isso pode ser aprimorado.



  • O que são algoritmos e como representá-los?
Agora precisamos definir esses tais algoritmos que mencionei anteriormente. Vamos à explicação técnica, oferecida gentilmente pela Wikipédia: Um algoritmo é uma sequência finita de instruções bem definidas e não ambíguas, conceito suficiente por enquanto. Por analogia, podemos considerar receitas de bolo como bons exemplos de algoritmo.

Como sabem, receitas possuem instruções claras do modo de preparo, que devem ser seguidas na ordem exposta, sequencialmente. Mas algoritmos não precisam ser só texto, pois há diversos modos de representar algoritmos de programação, dando destaque a pseudocódigo e fluxograma. Ambos são instruções bem detalhadas sobre os detalhes de um programa, respectivamente em texto e diagrama.

À esquerda um fluxograma e sua implementação em BASIC à direita (por: steveluscher).

Você poderá conferir mais sobre ambas as representações nos links ao final do post, mas por hora não é minha intenção ir muito a fundo no assunto. O pseudocódigo parece chato, mas trata-se de uma notação muito útil aos iniciantes, pois tem bem definidos o início, o meio e o fim. O início são as variáveis, como se fossem os ingredientes da receita, e o meio descreve o que fazer com elas. Já o fluxograma representa o fluxo do programa (program counter), servindo como modo de visualização do funcionamento do software.

Mas vale ressaltar, como disse em meu post sobre alguns algoritmos, que nem sempre é proveitoso entrar em detalhes quanto ao funcionamento de um programa. Um exemplo é o tal crivo de Eratóstenes. Mesmo com o algoritmo em mente, os programas em C# e Java ficaram bem maiores, e distintos até entre si, do que o feito em Python. Apesar disso, como descrevi a solução de forma genérica, eu poderia implementar em qualquer outra linguagem, bastando realizar uma abordagem diferente.



  • O que é POO?
Com o tempo, esse modelo simples de programação (paradigma), estruturado, foi encontrando dificuldades no mercado. Tornou-se necessário programar pensando no mundo real, no cliente, acima do computador e outros programadores. E foi aí que surgiu a programação orientada a objetos, geralmente referida como POO.

Objetos?

Sim, são elementos que representam estruturas mais complexas e permitem modos de pensar até então pouco explorados ou desconhecidos. Por exemplo, como você representaria um funcionário de uma empresa? Tradicionalmente, se quiséssemos um modelo mais realístico, talvez seria necessário uma sub-rotina ou mesmo um programa a parte.

Mas e se considerarmos um funcionário como objeto? Afinal, a nível teórico, humanos e animais não são tão diferentes de objetos inanimados: todos possuem suas características (atributos) e ações (métodos). É verdade que uma pedra não faz nada sozinha, mas poderíamos criar um método jogarPedra para representar quando o programa ou outro objeto quiser jogar uma pedra.

Aí vem a parte interessante que mostra por que objetos são tão úteis, então acompanhe o raciocínio. O que são atributos? Cor, material, idade, altura... cada um podendo ser representado por um valor. Uia, não é justamente o conceito de variável? E o método, sendo um conjunto de instruções, pode ser entendido como uma sub-rotina. Portanto: objeto é a junção entre dados e algoritmo.

Antigamente, a estratégia para se trabalhar com dados era bem primitivo, como se o algoritmo e o dado estivessem em dimensões diferentes. Com a chegada desse novo paradigma, tornou-se viável manipular dados da mesma maneira que quaisquer outras estruturas já conhecidas em algoritmos.

Representação de uma classe em UML (por: Esa Pulkkinen).

Ah, quase ia me esquecendo de nosso amiguinho UML. UML significa Unified Modeling Language, sendo um modo universal de representar partes do projeto por diagramas. Sugiro que, por enquanto, foquem-se nos diagramas de classe, como o exposto acima.



  • Como posso ser um bom programador?
Resposta curta e grossa: programando. Aprenda a base, resolva problemas, procure e/ou conceba propostas de programas... Não tem jeito, você deve amar o que faz se quiser ser um programador bom mesmo.



  • Beleza, mas por onde começo?
Em primeiro lugar, fuja de conselhos como "A melhor linguagem do mundo é X" ou "Você só precisa aprender Y, o resto é resto". Linguagens são apenas consequência da Ciência da Computação, que se baseia no estudo dos algoritmos, e essa é a base de tudo. Se você compreende a lógica, nenhuma linguagem é algo excepcional, um bicho de sete cabeças. Menos Assembly.

Acho desnecessário dizer que a lógica vem antes de tudo, certo? Afinal, em última instância, programar envolve dar instruções a uma máquina limitada, o que exige uma adequação do seu modo de pensar. Recomendo os seguintes links, nesta ordem:







- Apostila de UML

Exercícios de orientação a objetos - o foco é Java, mas pode-se fazer tranquilamente em UML.


Busquei os links que fossem mais acessíveis, mas a gama de informação em inglês força todo profissional — ou não — da área a ter um conhecimento mínimo de inglês. Não precisa nem saber falar, tudo o que basicamente precisamos está em texto.



  • Qual é a melhor linguagem para iniciantes?

Xi... bem polêmica essa questão, já que cada um tem sua visão diferente. Mas a que deve prevalecer é a sua, então defina seus objetivos desde agora. O que você quer fazer em programação? Se quiser programar robôs, Assembly é ótimo. Mas se o interesse for programação de jogos, pesquise as ferramentas mais usadas e decida a partir disso qual é a linguagem mais relevante aos seus interesses (C++ é uma boa garantia).

Portanto, não há uma linguagem universalmente melhor, como já disse anteriormente. Mas pode acontecer de você não ter um interesse específico, apenas desejar aprender por aprender mesmo. Nesse caso, posso sugerir 3 grupos de linguagens:

1 - Python, Ruby, Small Basic e Smalltalk
2 - C, C++ e Assembly
3 - Scheme e Haskell

O grupo 1 consiste em linguagens de alto nível, isso é, mais próximas dos humanos. Essa característica as torna muito fáceis de se aprender e entender um código escrito nelas, além de — com a exceção de Small Basic — serem orientadas a objeto. Adicionalmente, Python está ganhando muito espaço no mercado.

Small Basic é um dialeto de BASIC, clássica no ensino de programação (por: striatic).

No grupo 2 estão linguagens de médio e baixo nível, mais próximas da máquina. Portanto, se quiser compreender conceitos mais brutos como alocação de memória, dê uma chance a algum deles, principalmente C e Assembly. A única orientada a objetos é C++, uma versão de C com suporte a esse paradigma. Outra vantagem de escolher C/C++ é que são linguagens muito populares e encontram diversas aplicações práticas.

O último grupo é de linguagens funcionais, não tão populares quanto imperativas no mercado. Entretanto, seu extenso uso no meio acadêmico acarreta em ótimos recursos para o aprendizado, proporcionando uma forte base em computação. Se as linguagens do grupo 2 garantem conhecimentos de hardware, as do grupo 3 oferecem um saber mais teórico do software.

Nenhum comentário:

Postar um comentário