Desenvolvimento - Java
Como ser um bom programador
Durante todos esses anos programando e estudando, eu acabei descobrindo algumas qualidades e alguns esforços que fazem a diferença entre um bom programador e um programador mediano. Mostrarei aqui essas qualidades e esforços que julgo mais importantes.
por Rodrigo StraussIntrodução
Eu programo computadores desde os 12 anos de idade (já fazem 12 anos). Durante todos esses anos programando e estudando, eu acabei descobrindo algumas qualidades e alguns esforços que fazem a diferença entre um bom programador e um programador mediano. Mostrarei aqui essas qualidades e esforços que julgo mais importantes.
Quando digo "programador", você pode entender "programador OU Analista Programador OU Engenheiro de Sistemas OU Arquiteto de Sistemas OU Escovador de Bits". Programador é a pessoa que programa computadores, não necessariamente quem ganha a vida fazendo isso. Até meus 17 anos eu achava que programação era só um divertimento, eu não pensava em levar isso como uma profissão.
(Sim, eu não pensava em programação como uma profissão. Tanto que, com 18 anos, eu entrei no curso de Relações Internacionais. O grande problema era que eu ia para a faculdade com um livro de C++ embaixo no braço. E, apesar de adorar as aulas de Economia, Ciências Políticas e Ciências Sociais, eu abandonei a faculdade depois do 1º ano)
Se você ainda não é um programador mas tem interesse em ser um, talvez seja melhor você ler antes o artigo Como ser um programador.
O que é ser um bom programador
Resposta curta: quanto mais você sabe o que está acontecendo quando você chama uma função (qualquer uma), melhor programador você é.
Resposta longa: Quando eu tinha 15 anos, eu fui pescar (fui obrigado, odeio pescar) com um tio, e por um motivo qualquer, veio à tona o assunto "hacker". Naquele tempo, eu achava que hacker era uma pessoa que invadia sistemas. Até que ele me disse que "hacker é a pessoa que sabe realmente o que acontece quando você aperta um botão no teclado".
(Eu espero que você saiba o que é um hacker. Um garoto idiota que usa programinhas prontos para invadir o computador dos outros não passa de um garoto idiota. A definição de hacker, em tradução livre, é "uma pessoa que gosta de explorar os detalhes de sistemas programáveis e testar suas potencialidades, ao contrário da maioria dos usuários, que preferem aprender somente o mínimo necessário". Se você quer saber o que é um hacker, leia o Jargon)
Um hacker e um bom programador são quase a mesma coisa, e apertar um botão no teclado envolve vários chamados de função. Um usuário sabe que quando ele pressiona a tecla "A", aparece a letra "A" na tela. Um bom programador vai além, e sabe que resumidamente, ao pressionar a tecla "A", o teclado vai disparar um sinal elétrico que quando chegar no computador, vai disparar uma interrupção de processador, que será tratada por um driver que colocará isso em uma fila, que será lida pelos programas. Nem sempre você precisará saber todos os detalhes. O fato é que o bom programador teve curiosidade suficiente para descobrir como isso funciona.
Um programador mediano sabe que quando você chama a função MessageBox (ou MsgBox ou MessageBox.Show) aparece uma janela com uma mensagem na tela. Um bom programador sabe que isso faz uma chamada para GDI, que depois vai para kernel mode (muda para Ring0), que chama o driver de vídeo que chama o monitor. Quanto mais detalhes você sabe sobre todos esses passos, melhor para você. Você pode ser um bom programador sem saber os detalhes de tudo, mesmo porque, isso é impossível. O que importa é ir além de um usuário ou programador mediano, é ter a curiosidade de saber como as coisas funcionam. Mesmo que você ache desnecessário saber como funciona o gerenciamento de filas do driver de teclado, isso pode ajudar um dia. Informação nunca é demais.
Conhecer bem um computador e seu funcionamento é uma das coisas que define um bom programador. Poder de abstração, capacidade para resolução de problemas e raciocínio lógico são outras qualidades que leva alguém a ser um bom programador. Mas a qualidade essencial é a curiosidade. Um bom programador quer saber tudo que acontece, mesmo que aparentemente ele não precise. Um programador mediano se satisfaz somente com um resultado esperado.
Qualidades ou esforços necessários
Vou enumerar aqui algumas qualidades em um programador que podem ser a chave para o sucesso. Como sucesso, eu defino a satisfação em fazer o que gosta e fazer bem. Se você trabalha com Cobol e é o mestre nisso, mas gostaria mesmo é de estar fazendo um sistema operacional para Nintendo 8 bits, talvez você não tenha sucesso (apesar do que a sua conta bancária diz).
Vamos à elas:
- Gostar de problemas lógicos
- Saber inglês
- Gostar de aprender e estudar constantemente
- Gostar de ler (e estudar constantemente)
- Saber buscar as informações (para estudar constantemente)
Existem diversas outras qualidades que ajudam, como um bom relacionamento inter-pessoal e facilidade de negociação, mas aqui eu falarei especificamente sobre o que tange a área técnica. Eu não entendo nada de RH, psicologia, inteligência emocional, inteligência extraespacial ou qualquer dessa coisas. Esse artigo é para quem pretende ser um bom escovador de bits, não para quem pretende passar em todas as entrevistas de emprego ou conseguir uma namorada pelo MSN Messenger. :-)
Gostar de resolver problemas
Acho que essa é meio óbvia, já que computação é uma ciência exata. Mas não é tão simples assim. Existem algumas características dos profissionais da área de humanas que caem como uma luva para um programador.
Eu costumo dizer que programação é mais uma arte do que uma ciência. E quando eu explico isso para profissionais da área de humanas, eles entendem e começam a ter a mesma opinião. Quando você projeta um sistema, você quer resolver um problema específico. Mas esse problema pode ser resolvido de milhares de maneiras. Como você chega a solução desse problema também é outro problema, às vezes bem maior.
Digamos que você vai fazer um programa para uma fábrica de roupas. Enquanto você não entender muito bem o processo produtivo da fábrica, você não consegue fazer o sistema. Agora além de saber programar, você sabe como funciona uma fábrica de roupas. Isso é uma das coisas que me fascina na área de sistemas. Além de controlar a máquina, você tem a oportunidade de aprender muitas coisas fora da área de informática (como o funcionamento de uma fábrica).
Atualmente estou trabalhando com softwares para o mercado financeiro e bolsas de valores. Além de refinar minha habilidade em C++, Win32 API, multithread, sockets e coisas técnicas, também estou aprendendo diversas coisas sobre o mercado de ações e de mercadorias e futuros. E esses conhecimentos "paralelos" me ajudam bastante quando me sobra algum dinheiro para investir. :-)
Os problemas em programação podem ser mais ou menos técnicos, dependendo da sua área de atuação. Se você vai fazer um firewall (como eu estou fazendo), você tem que saber TCP/IP, programação de drivers, etc. Se você faz sistemas para a área bancária, apesar das linguagens e técnicas de programação utilizadas serem comparativamente mais simples do que as necessárias para fazer um firewall, você também terá que entender como funciona um banco (ou uma parte dele). A área de desenvolvimento de sistemas é multidiciplinar, porque geralmente envolve conhecimentos diversos para a resolução de um problema.
Saber inglês
A afirmação "é necessário saber inglês para ser um bom programador" é um pouco polêmica, mas é minha opinião. A sintaxe das linguagens de programação é feita de palavras em inglês. A documentação das linguagens e ferramentas está em inglês.
Você pode fazer programas somente com noções básicas de inglês, sem problemas. Mas se você quer ser um programador cada vez melhor, você terá que estudar bastante. E como as documentações que você terá que estudar estão todas em inglês, você não terá outra alternativa.
Outro fato relevante é que a maioria das traduções de livros para português são péssimas. Você sabe o que é MBID (Mapa de Bits Independente de Dispositivo), gabarito ou linha? São, respectivamente, BITMAP (sim, o tradutor teve a incapacidade mental de traduzir a sigla), template e thread. Algumas coisas podem ser traduzidas, outras não. Tudo bem falar em lista ligada, mas gabarito é de matar. Mas existem algumas exceções, já vi alguns livros com traduções muito boas.
Quanto aos livros em português escritos por autores nacionais, também é bom ter cuidado. Me parece que algumas editoras nacionais não têm um corpo técnico capacitado o suficiente para avaliar a qualidade de um livro, e existe muita porcaria publicada, com pouco conteúdo e um screenshot por página. Mas é claro que existem exceções, é só pesquisar um pouco mais sobre o livro antes de comprar.
"Desenvolvendo em C#", escrito por Fábio Galuppo, Wallace Santos e Vanclei Matheus, que não fica devendo nada em relação aos americanos. -->Gostar de ler e de aprender
Você gosta de ler? Não? Sinto muito, então eu acho melhor você arrumar outra profissão. É impossível ser um bom programador sem ler bastante. Programação de computadores é uma área muito vasta e, em muitas de suas vertentes, muito complexa. E ainda não existe melhor forma de aprender do que ler.
Compre livros. Não caia nesse papo de que tudo que você precisa está na Internet, isso não é verdade. Talvez a maioria das informações que você precisa estejam realmente na Internet, mas dificilmente você encontrará tudo tão bem organizado como você encontra em um livro. O tempo que você gastará procurando e organizando essas informações vai custar mais caro do que gastar US$ 50,00 na Amazon. Um livro é uma coisa que dificilmente você se arrepende em comprar. É informação de fácil acesso, organizada e disponível sempre que você precisa, mesmo que você não tenha um computador por perto.
Um bom livro é essencial para dar os primeiros passos em alguma área específica. Vou usar como exemplo prático programação Win32 (C/C++ para Windows). Você pode muito bem economizar R$ 150,00 e passar semanas estudando os tutorial do CodeProject e em outros sites. Mas é muito mais prático e inteligente comprar logo o Programmming Windows do Petzold e o Advanced Windows do Jeffrey Richter, lê-los, e depois procurar na Internet tutoriais e detalhes específicos para as suas dúvidas. Os bons livros têm tudo que você precisa em um lugar só.
Quando você está iniciando em um determinado tópico, você simplesmente não sabe por onde começar nem o que procurar. Vamos usar o exemplo do .NET. Para ser um bom programador .NET, além de saber C# ou VB.NET, você precisa saber como funciona a runtime, saber que existe um garbage collector, um compilador JIT, como funciona a segurança da runtime, etc. Como você vai procurar saber o que é um compilador JIT se você nem sabe que ele existe? É aí que entram os livros. Um bom livro mostra tudo que você precisa saber. Depois que você conhece o assunto, você pode procurar mais informações (em outros livros ou na Internet) sobre algum tópico específico.
Saber buscar as informações
Para resolver um problema, você precisa de informações sobre o problema. Quanto mais informações você tiver, mais fácil será de resolver. Quanto melhor você souber procurar, mais informações você terá. Preciso dizer mais?
A Internet é uma fonte de informações inestimável e inesgotável. Ainda mais hoje em dia que temos o Google, que nos permite buscar o que queremos no meio dessa quantidade praticamente infinita de informação. Mas uma das coisas que precisamos saber é que o Google não é a única ferramenta disponível, e que a busca na Web não é a única ferramenta que o Google disponibiliza.
Acho que sobre procura no Google é desnecessário falar. Muitas das perguntas que me fazem seriam respondidas pelo primeiro link encontrado pelo Google. Use o Google SEMPRE. Repita comigo:
Vou procurar no Google antes de fazer perguntas.
Vou procurar no Google antes de fazer perguntas.
Vou procurar no Google antes de fazer perguntas.
Vou procurar no Google antes de fazer perguntas.
Onde posso encontrar tutoriais sobre Java? http://www.google.com/search?q=java%20tutorial
Onde posso encontrar um controle para desenhar gráficos de barras em ASP.NET? http://www.google.com/search?q=asp.net+bar+chart+control
Outro recurso muito valioso do Google é a procura em grupos de discussão, o Google Groups. Eu acho esse recurso mais valioso do que a busca na web quando se tem dúvidas sobre programação. Com ele você procura especificamente perguntas e respostas relativas às suas dúvidas, e não todas as informações que existem na Internet. Muito provavelmente, alguém já teve a mesma dúvida que você e já fez essa pergunta. Isso torna o Google Groups uma ferramenta muito útil. Faça um teste: procure "how to change desktop background Win32" no Google e no Google Groups.
Outro lugar muito útil para encontrar informações é em listas de discussão. Você poderá trocar informações com pessoas que estão interessadas no mesmo assunto, e isso tem um valor inestimável. Mas é preciso também saber como usar essa fonte de informação. Como regra geral, só faça uma pergunta em uma lista caso você não ache a resposta usando o Google ou o Google Groups, e depois de procurar no histórico da lista que você participa. Na grande maioria das vezes você acha a resposta antes e economiza o tempo que você teria que esperar até que alguém responda sua pergunta.
Além disso, perguntas do tipo "Eu quero fazer um programa que faça XXX, alguém pode me ajudar?" são na maioria das vezes ignoradas. As pessoas que participam de listas de discussão geralmente não estão dispostas a fazer um programa para você. Mas elas com certeza te ajudarão em problemas específicos, como "Meu serviço chama MessageBox mas nada aparece. O que pode ser?". ah, e caso você saiba razoavelmente bem sobre um assunto ajude as pessoas também.
Considerações finais
Um bom programador pode aparecer em qualquer área ou linguagem. Não importa se você programa em VB, C#, C++, Objective C, Perl ou Ruby. Se a sua linguagem for limitada, você automaticamente procurará outra quando for a hora, cada linguagem e ferramenta tem seu própósito. O que importa é ir mais além. Não é necessário entender sobre o kernel do sistema operacional nem sobre hardware, mas quanto mais você souber sobre isso, melhor programador você é.
O programador mediano sabe uma coisa porque ele precisa saber. O bom programador sabe alguma coisa porque ele tem vontade de saber.
Assim é um bom programador. Mesmo que você não tenha experiência, se você tem essa curiosidade e essa "ânsia" por saber tudo e aprender tudo, vá em frente, você está no caminho certo. Capacidade técnica é algo que se adquire com o tempo, mas essa vontade de aprender é algo para poucos. Tudo que alguém com esse perfil precisa aprender está nos livros e na experiência do dia-a-dia. Se você não trabalha com programação, compre uns livros, leia-os, passe algumas madrugadas na frente do computador e depois procure um emprego para entrar na área. E depois eu espero que você tenha o mesmo prazer que eu tenho ao levantar segunda-feira para mais um dia de trabalho.
E estude muito. Isso ajudará bastante na hora em que você se deparar com um problema. Não se esqueça, nenhum conhecimento é inútil. Você aprenderá mais rápido se você souber focar os seus estudos, mas se você não souber, você aprenderá mais coisas em mais tempo. O que importa é aprender.