E os programadores, onde erram?

O @marionogueira provocou e eu vou responder.

Carreira de programador

Mas antes vou explicar porque eu compartilho da visão de que o trabalho de desenvolvedor guarda semelhanças com o trabalho de um artista (importante dar destaque à palavra “semelhança” para não pensar que as coisas são iguais).

Como programador você pega uma especificação abstrata que se parece com uma ‘inspiração’ e começa a trabalhar nela até obter algo ‘bruto’, aí você vai lapidando (iterando) sobre esse trabalho, simplificando, e aproximando o software daquela inspiração (especificação).

Nesse processo o programador vai deixando seu “estilo” no código. Na escolha de algorítmos, de estruturas de dados, nos textos de comentários e até mesmo no “Coding Style”. Essas características são tão notáveis que depois de um tempo é possível identificar o autor do código mesmo quando ele não está ‘assinado’.

Uma diferença importante entre o trabalho de artistas e de programadores é que raramente vemos o trabalho em equipe (times) no universo das artes e o mesmo é quase uma regra no mundo do software.

Mas daqui para frente eu vou falar sobre um tipo específico de artistas: aqueles que trabalham sob encomenda pintando retratos de reis e nobres para garantir o seu sustento. E para ilustrar o meu raciocínio vou usar uma das obras de arte mais conhecidas no mundo: a Monalisa.

A Monalisa (La Gioconda) foi uma obra encomendada por Francesco del Giocondo a Leonardo Da Vinci. Existe muitas versões, mitos e mistérios que cercam essa obra mas vamos nos ater à “história oficial”.

Francesco passou uma especificação para Da Vinci (ele queria um retrato de sua esposa Lisa Gherardini) e provavelmente especificou prazo e preço. Ou talvez tenham feito um contrato de escopo aberto? Não sei, não estudei essa história muito a fundo.

Leonardo Da Vinci, então, fez os primeiros esboços e foi apresentando esses esboços ao contratante. Talvez não tenha feito isso porque o contratante confiava plenamente na capacidade de entrega dele. Mas não teria sido vergonha se tivesse que apresentar os esboços no meio da execução do projeto.

O resultado final foi um trabalho encomendado, executado no prazo combinado, à um custo determinado e que, mesmo assim, era uma obra de arte.

Curiosamente o escritório da Triveos é vizinho de uma escola de pintura. Todo dia passo em frente à sala de aula e vejo o trabalho dos alunos. É fácil perceber que não tem nenhum Leonardo Da Vinci ali (por enquanto). Falta-lhes experiência. Prática. Com o tempo e empenho eles se transformarão em bons artistas. Talvez gênios.

O mesmo acontece com os programadores. Só com a prática, a experiência, e com o domínio da técnica um programador se tornará um ‘artista’ de verdade.

Mas voltando à questão levantada pelo @marionogueira…

O ‘mundo’ está errado no gerenciamento dos programadores quando eles mudam escopo, prazo e custo dos projetos a todo o instante e ainda exigem uma obra de arte como resultado do trabalho. Ou quando não permitem que o ‘artista’ trabalhe ao seu modo.

A Monalisa seria uma obra de arte se, durante o seu desenvolvimento, o contratante desse palpites sobre as cores e cenários deveriam ser usados na obra?

Mas os programadores também erram!

Erram quando aceitam o desafio de desenvolver uma obra de arte sem ter o domínio adequado da técnica, a prática e a experiência necessária para transformar aquela especificação em arte.

Em projetos ideais onde o escopo é claro, o prazo é razoável e custo está sob controle os programadores falham quando não compreendem que, mesmo tendo sido encomendada, a ‘obra de arte’ é dele também. Sem essa compreensão eles deixam de se comprometer com sua execução.

Mesmo tendo sido encomendada, Da Vinci não fez a Monalisa ‘nas coxas’. Ele fez o máximo possível para entregar uma obra de arte única. Isso fica claro em projetos open-source onde a obra e o nome do artista fica público.

Um artista não precisa de foco e disciplina para se inspirar. Aliás, isso pode até atrapalhar. Mas para executar a obra é necessário muito foco e muita disciplina. Principalmente se a obra foi encomendada e tem custos e prazos pré-estabelecidos.

O programador falha quando ele não tem foco e disciplina no seu trabalho. Twitter, MSN, GTalk, IRC e outros sugadores de foco, hoje, ficam mais tempo em funcionamento do que a IDEs, editor de textos e outras ferramentas de desenvolvimento. Eu sei. Eu vivo isso.

Fora isso eles podem errar em outras questões que envolvem relacionamento interpessoal, trabalho em equipe, ética, etc. Mas nessas questões todos podem errar.

  • Pingback: uberVU - social comments()

  • johnathan cardoso

    excelente texto. parabéns.

  • johnathan cardoso

    excelente texto. parabéns.

  • Erick Müller

    Programadores falham também quando criam programas que fazem algo que estes programadores não entendem. Quando pensam que a resolução do problema é apenas técnica, sem prestar atenção às regras (internas e externas) do negócio e da aplicação e como a aplicação se integra no ambiente do usuário (não só o ambiente tecnológico, mas no dia-a-dia).

    Esse é o erro que eu mais encontro, pra mim o mais grave, o de se tentar fazer algo que não entende. Tem a ver também com a qualidade do que vai entregar. E eu não consigo entender como alguém consegue entregar um bom trabalho, em qualquer área, sem entender o contexto do trabalho que vai executar.

  • Erick Müller

    Programadores falham também quando criam programas que fazem algo que estes programadores não entendem. Quando pensam que a resolução do problema é apenas técnica, sem prestar atenção às regras (internas e externas) do negócio e da aplicação e como a aplicação se integra no ambiente do usuário (não só o ambiente tecnológico, mas no dia-a-dia).

    Esse é o erro que eu mais encontro, pra mim o mais grave, o de se tentar fazer algo que não entende. Tem a ver também com a qualidade do que vai entregar. E eu não consigo entender como alguém consegue entregar um bom trabalho, em qualquer área, sem entender o contexto do trabalho que vai executar.

  • rodrigo fernandes

    Boa tarde!

    Achei muito interessante e construtiva a sua postagem.
    Estou no terceiro período de análise e como todo universitário, tenho algumas dúvidas. Principalmente no que diz respeito a programação. Estou encontrando dificuldades nas matérias: Algoritmo e estrutura de dados e Programação OO.
    Na minha opinião, os professores deveriam explorar mais a prática do que a teoria.
    Existe algum projeto on line para os aprendizes começarem a desenvolver algo?
    Você poderia me dar algumas dicas?

    Grato.

  • rodrigo fernandes

    Boa tarde!

    Achei muito interessante e construtiva a sua postagem.
    Estou no terceiro período de análise e como todo universitário, tenho algumas dúvidas. Principalmente no que diz respeito a programação. Estou encontrando dificuldades nas matérias: Algoritmo e estrutura de dados e Programação OO.
    Na minha opinião, os professores deveriam explorar mais a prática do que a teoria.
    Existe algum projeto on line para os aprendizes começarem a desenvolver algo?
    Você poderia me dar algumas dicas?

    Grato.

  • http://emailpublico.tumblr.com/ Osvaldo Santana Neto

    Oi Rodrigo,

    Olha… Realmente a prática pode te ajudar com esses dois tópicos.

    Existem duas maneiras diferentes para se estudar Algoritmos e Estrutura de Dados na prática: uma é usando uma linguagem de programação estruturada mais próxima da máquina (C, por exemplo). Outra é usando uma linguagem de nível mais alto (Python, Java, etc).

    No caso da linguagem C você não tem nenhuma das estruturas de dados na biblioteca padrão da linguagem e você precisa criá-las “na mão”. Isso é ótimo para aprender. Mas você precisa lidar com questões paralelas que podem tirar um pouco do teu foco do essencial. Uma dessas questões é a de lidar com alocação dinâmica de memória. Por um lado isso é bom e importante saber mas por outro é uma coisa a mais para lidar durante o aprendizado.

    Linguagens de nível mais alto gerenciam a questão da memória pra você mas, geralmente, elas já disponibilizam as estruturas de dados e algoritmos em suas bibliotecas padrão deixando 'fácil' que a gente 'roube' um pouquinho durante o aprendizado.

    Se você procurar por algoritmos e estruturas de dados em C na Internet você encontrará muita coisa legal. Eu recomendo pegar a descrição de uma estrutura de dados (ex. Lista Ligada) e implementá-la em C “por conta própria”.

    Quando terminar de implementar essa lista ligada, desenvolva uma função para ordenar os dados dessa lista (também por conta própria e sem olhar algoritmos existentes na internet). É bem provável que você acabe por implementar um BubbleSort que, eu acho, é o algoritmo de ordenação mais fácil e intuitivo. Mas ele é absurdamente ineficiente. Aí sim… pesquise na internet sobre outros algoritmos de ordenação e vá implementando eles um a um.

    Terminado esses exercícios, passe para outras estrutura de dados que “puxarão” outros algoritmos e assim por diante. Mas implemente eles, veja dar errado, corrija, veja funcionar, perceba como tem algoritmos e estruturas de dados que são melhores em determinadas situações, etc. Não tem muito atalho não. É prática mesmo.

    No fim dessas atividades você estará “fera” em programação estruturada. Aí você pode partir para o desenvolvimento OO…

    Tente reimplementar as suas estruturas de dados + os algoritmos em objetos de uma linguagem OO (aí eu já recomendo Python ;P). Depois comece a se desafiar…

    Tente implementar o joguinho dos animais (http://www.animalgame.com/play/) sem usar nenhuma cláusula condicional (if)… e assim por diante…

    Tem muito livro e site na internet com ótimos tutoriais sobre OO…

    Mas o conselho é: pratique com consciência.

  • Sérgio

    É, e a equipe/programador ainda pode errar, na questão do ‘fazejamento’ pulando do verbo pensar pro verbo digitar, para favorecer prazos totalmente irreais que são fixados para agradar o cliente no primeiro momento (e as vezes esse vai ser o último momento que o cliente vai ficar feliz).

  • Sérgio

    É, e a equipe/programador ainda pode errar, na questão do ‘fazejamento’ pulando do verbo pensar pro verbo digitar, para favorecer prazos totalmente irreais que são fixados para agradar o cliente no primeiro momento (e as vezes esse vai ser o último momento que o cliente vai ficar feliz).

  • Sérgio

    Bom, eu estou no 7° período de Ciência da computação, como livro eu poderia te sugerir Estruturas de Dados utilizando C
    http://www.americanas.com.br/AcomProd/1472/57166