O Programador Pragmático

Figura 1: O Programador Pragmático

O livro "O Programador Pragmático" deveria ser um dos livros de cabeceira de todo programador que se preze, e ser leitura obrigatória em todos os cursos ligados a computação (Ciências da Computação, Análise de Sistema, Processamento de Dados e Engenharia da Computação). O “hype” em torno desse livro é justificável, pois o maior mérito dele é encurtar a distância entre um programador que se julga inexperiente e um profissional produtivo e qualificado. Veremos nesse artigo alguns conceitos desse livro.

A Carreira de Programador

Podemos resumir a carreira de um programador, mais ou menos, no seguinte cenário:

  • Aprendizado de lógica de programação e arquitetura de computadores.
  • Aprendizado de linguagens e técnicas de programação.
  • Atuação como desenvolvedor/analista/consultor Júnior
  • Atuação como desenvolvedor/analista/consultor Pleno
  • Atuação como desenvolvedor/analista/consultor Sênior
  • Tornar-se Arquiteto, Líder de Equipe, Coordenador, Gerente, Empreendedor, etc.

Listagem 1: A carreira de Programador


    Programador programador = new Programador();
    programador.aprender(“Logica de Programação”);
    programador.aprender(“Noções de Arquitetura de Computador”);
    programador.aprender(“linguagem X”);

    while(programador.estaRespirando() && programador.estaLucido()) {

	Projeto projeto = new Projeto(“Sistema|Correção|Melhoria|Funcionalidade”);
	// Desenvolvendo
	while(!projeto.estaPronto()) {
		if(projeto.estiverAtrasado()) {
			programador.utilizarPOG(projeto);
		} else {
		          programador.desenvolver(projeto);
		}
		programador.tomarCafe();
	}
          
	// Manutencao
	programador.corrigirBugs(projeto);
	programador.atenderChamados();
	programador.corrigirNovosBugs(projeto);
	programador.xingarProgramadorQueFezOSistema();

	// Evolução
	if(programador.tiverTempo()) {
		programador.aprender(“linguagem X”);
		programador.aprender(“API Y”);
		programador.aprender(“técnica Z”);
	}

	// sortearNumero() = método randômico que retorna um número entre 1 e 100.000.000
          if(chefe.sortearNumero() == 0) {
	   chefe.promover(programador);
	}
    }

O Básico

O pré-requisito básico de todo desenvolvedor é ter uma boa lógica de programação, ter pelo menos uma noção de como o computador funciona e também saber um pouco sobre a Teoria da Computação. Portanto, se você quer se tornar um bom profissional, desenvolva muito bem esses itens, principalmente a lógica.

Isso é tão básico que sequer deveria ser citado, porém, infelizmente, há muitos programadores que sequer focam nesse aspecto fundamental (lógica), pois se afobam em querer aprender rapidamente a lidar com linguagem X, IDE Y, ao invés de fortalecer o pilar que irá sustentá-los por toda a carreira. A dica número 1 é:

  • Se estiver começando na área, não se prenda a IDE´s, faça programação no vim, notepad ou qualquer editor de texto simples.
  • Resolva vários problemas de lógica, estrutura de dados, algoritmos, etc. Existem muitos livros bons abordando apenas esses assuntos, e em alguns casos, usando até português estruturado como linguagem para resolvê-los.

Quem têm uma ótima base de lógica de programação é capaz de aprender qualquer linguagem, API ou framework com certa facilidade, assim como um bom motorista têm facilidade de aprender a guiar qualquer tipo de carro.

E mesmo para programadores experientes, há muito a se explorar no campo da lógica e dos algoritmos, como:

  • Análise de Complexidade (notação O);
  • Invariantes;
  • Grafos;
  • Linguagens formais e autômatos finitos;
  • Inteligência Artificial;
  • etc;

O Lugar Comum

O próximo passo é aprender uma ou mais linguagens de programação, API´s, metodologias, etc. É o estágio onde a maioria de nós, programadores, está.

De fato, o processo de aprendizado contínuo é uma das marcas da nossa área e deve ser seguido o quanto for possível. Devemos nos tornar especialistas em todas as tecnologias que lidamos, seja no trabalho ou em casa. Devido à velocidade com que as tecnologias evoluem e são descartadas, temos que estar sempre antenados com as novidades do mercado, acompanhando sites especializados, revistas, blogs, etc para ver os rumos e tendências da nossa área.

O conceito de open-source não é só aplicável ao software, mas também ao conhecimento. Temos o privilégio de trabalhar numa época onde diversas informações sobre as mais variadas tecnologias estão disponíveis na internet, de forma gratuita.

Mesmo com o aprendizado contínuo, especialização, etc, muitos ainda sentem um “vácuo” entre o seu nível de maturidade de desenvolvimento e os dos melhores profissionais do mercado. Qual o segredo desses profissionais para serem tão produtivos?

Pragmatismo em Ação

Afinal, o que é ser um Profissional Pragmático? Dentre todas as características que o livro destaca, acredito que o bom senso se sobressai. Mas afinal, como aplicar o bom senso na nossa prática de programação? Para isso, tentaremos entender como pensa esse tipo de profissional.

Antes de mais nada, um programador pragmático é um preguiçoso por natureza e faz de tudo para manter-se assim. Vejamos as principais características desse tipo de profissional:

Mestre Budista

Quando o programador pragmático repete várias vezes a mesma tarefa, ele para e pensa: “será que não há um jeito de automatizá-la?”. Ele então aprende linguagens de script (sed, awk, shell, etc) ou linguagens dinâmicas para automatizar tarefas repetitivas, livrando-se delas. Agora reflita: quantas tarefas repetitivas, sejam ligadas a programação ou não, você tem em sua rotina diária, e como fazer para automatizá-las?

  • Você analisa arquivos de log do sistema? Crie um script ou programa que faça isso para você.
  • Tem que enviar relatórios semanais? Crie um programa que processe isso.

O programador pragmático é como um mestre budista, pois está sempre no aqui e agora, no momento presente, reparando no que faz e pensando em formas de evitar a repetição (afinal ele odeia perder tempo). Portanto, ele busca todo o tipo de ferramenta que favoreça a automatização de tarefas.

Lema de Newton

O célebre físico Isaac Newton uma vez disse: “se eu vi mais longe que os demais, é porque estava sobre os ombros de gigantes”. Esse lema é adotado fervorosamente pelos programadores pragmáticos.

Programador pragmático não reinventa a roda, ele sempre irá se apoiar em tecnologias testadas e aprovadas pela comunidade de software. Existem milhares de API´s e frameworks para as mais diversas finalidades. O programador pragmático sabe disso e não vai perder tempo fazendo algo que já existe. Por isso está sempre atualizado sobre as tecnologias existentes, através da leitura e do aprendizado contínuo.

E dentre as soluções que existem, irá sempre adotar, quando possível, aquelas que economizam digitação, favorecem a simplicidade e expressividade.

Ele também sabe que, quando se deparar com um problema de programação, pensará que provavelmente mais pessoas já tiveram o mesmo problema, e dentre essas pessoas, alguém postou a solução na internet. Portanto, ele é frequentador assíduo de sites especializados, blogs, fóruns e outras fontes de dados que possam solucionar o seu problema de forma rápida.

Reflexão: E você, o quanto está antenado com as tecnologias da sua área? Por exemplo, o projeto Apache contém dezenas de frameworks para a resolução de diversos problemas do dia a dia, como a Commons Lang, log4j, CLI, HttpClient, MINA Framework, etc. Já ouviu falar desses projetos? Manter-se informado é estar sempre um passo a frente.

Memória curta

O programador pragmático sabe que, com o tempo, irá esquecer como efetuar os testes rotineiros de determinado módulo que desenvolveu. E para não ter que rever o código fonte, relembrar decisões de design e nem ficar procurando planos de teste em arquivos Excel, pois é preguiçoso e não gosta de gastar energia em coisas repetitivas, cria testes unitários para todas suas classes. Também sabe que os clientes irão pedir várias alterações de regras de negócio e novas funcionalidades no seu módulo, e para não ter que fazer testes de regressão manualmente, implementa e automatiza testes unitários, funcionais e de integração.

O programador pragmático abraça a prática da integração contínua, pois ela o ajuda a automatizar boa parte do processo de desenvolvimento, como gerenciar os builds do sistema, execução de testes, monitoramento da complexidade do sistema, nível de qualidade de código, nível de documentação, deploy etc.

Reflexão: O quanto você sabe sobre Integração Contínua? Já ouviu falar de Maven, Sonar, Cobertura, Checkstyle, PMD, Hudson/Jenkins, Nexus, Artifactory, Mantis, Redmine, JIRA, Junit, JMock, Selenium?

Inconformado

O programador pragmático é um inconformado por natureza, pois está sempre se questionando se existe um jeito melhor de fazer as coisas.

Ele adota a prática do Refactoring e passos incrementais, pois sabe que nunca irá produzir software perfeito de primeira (e provavelmente nunca o fará ). Conhece o ditado que diz que o ótimo é inimigo do bom. Mas para fazer melhoria contínua, tem consciência da importância do apoio da integração contínua e do TDD para mitigar os riscos.

Além do mais, ele tenta ter uma visão panorâmica do todo, estudando a forma como as diversas linguagens e ferramentas lidam com o mesmo problema. Ao ver o problema de vários ângulos diferentes, consegue ter uma visão melhor de como resolvê-lo.

Mais do que inconformado, o programador pragmático é esperto, pois não quer ser acionado no final de semana porque o sistema falhou, nem ter que escutar chefes nervosos o questionando sobre a demora na entrega ou falhas de projeto. Ele não se foca apenas na leitura “técnica” (por ter boa lógica e experiência, sabe que irá assimilar novas tecnologias ao se dedicar), mas estuda também tudo que é relacionado aos princípios de boas práticas de desenvolvimento de software, para produzir aplicações modulares e coesas. Conhece as melhores técnicas e se apoia no ombro de gigantes para guiar suas decisões arquiteturais.

Reflexão: Quanto tempo você dedica para ler livros sobre qualidade de software, arquitetura/engenharia, padrões, boas práticas, etc?

Conclusão

O programador pragmático não entra no “piloto automático”, está sempre pensando em novas formas de fazer melhor o seu trabalho, através da adoção de conceitos como automação, integração contínua, TDD, Refactoring, modularização, padrões, etc. Ele, antes de tudo, é um ser pensante, crítico e responsável, que encara o tempo como algo valiosíssimo, e portanto, evita o desperdício. Ao adotar esse processo de evolução gradual, de melhoria contínua sobre seu próprio método de trabalho, com o tempo se torna um profissional extremamente produtivo e eficaz.

Isso foi apenas uma resenha, pois o livro está repleto de bons conselhos sobre como se tornar um programador melhor. E curiosamente, há pouca presença de código nesse livro, é mais como um livro de filosofia, boas práticas e ideias, como:

  • Ortogonalidade;
  • DRY – Don´t Repeat Yourself;
  • Lei de Deméter;
  • Refatoração;
  • DSL;
  • Testes;
  • etc.

Nem vou dizer que recomendo a leitura desse livro. Obrigado e até a próxima!

Referências