Seu código é um vaso de plástico
https://www.linkedin.com/pulse/seu-código-fonte-é-como-um-vaso-feito-de-plástico-leonardo-k-shikida
Ele já escreveu algo sobre código legado que também vale a leitura.
Eu queria falar um pouco aqui sobre a computação como
linguagem, mas não como linguagem de programação, mas como linguagem de
intenções e interpretações. O código fala, então parto do artigo do Kiko
sobre código legado (a melhor definição que eu conheço de código legado é o
código que está em produção. Entrou em produção, tornou-se legado, igual ao
carro zero que virou carro usado ao pisar na estrada).
Ao contrário de muita gente de hoje em dia, eu aprendi
Orientação por Objeto primeiro e uma linguagem orientada por objeto depois. Eu
sou das antigas, aprendi C e Pascal e depois foi aquele parto para aprender
Java. Acho que a experiência mais assustadora de Java é seu Hello World verboso
e a primeira coisa que me veio à cabeça foi "por que? por que tanta
coisa para dizer tão pouco?".
Diga-me então você, desenvolvedor. Por que?
Foi um semestre de orientação por objeto ministrado
pelo legendário professor Bigonha (uma das estrelas do departamento da ciência
da computação da UFMG, uma combinação de conhecimento e didática incomuns)
apoiado num livro clássico do Bertrand
Meyer, uma das cabeças por trás de Eiffel, e por conseguinte, de
Java. Nenhum livro me influenciou mais na vida computeira que este livro. Se eu
pudesse escolher um livro somente, seria este.
A computação se tornou social quando o primeiro
programa de computador foi escrito a quatro mãos.
A gente aprende rápido sobre a importância da segunda opinião na primeira
sessão de debug em que você pede ajuda ao seu colega para achar o bug que seu
olhar viciado não vê, e aprende a odiar o próximo quando recebe o código de
outra pessoa para dar manutenção (o famoso "código bom é código meu").
Dizem que código deveria ser escrito como se um
psicopata que sabe onde você mora fosse dar manutenção nele. E também dizem que
a documentação do código é o código em si. Provavelmente a verdade está perto
destas duas coisas.
Para permitir código feito por muitas pessoas ao mesmo
tempo, criamos o aspecto social do código que é a sua organização, para
podermos lidar com sua complexidade. Não criamos apenas padrões de codificação
(que carregam consigo parte da cultura daquela linguagem), mas também criamos
um processo de evolução da própria linguagem, que torna a linguagem de
programação não apenas uma ferramenta, mas uma instituição, que decide sobre
sua evolução, sobre a entrada de novos recursos (features), sobre a manutenção
do código legado ou sobre a difícil escolha de abrir mão dessa compatibilidade
em nome de mudanças estruturais no código (veja Perl).
Tudo numa linguagem de programação tem uma intenção.
Tudo o que foi feito teve uma razão de ser. Tanto no seu programa quanto na sua
linguagem.
Não porque ele ganhava em reutilizar código
(reutilizar código exige aprender algo novo e isso nem sempre é mais rápido que
codificar a sua solução), mas porque usar Collections naquele caso era
programar para o outro, programar dentro da cultura da linguagem Java.
Programar usando algo que o outro já sabe, que ele está familiarizado.
Eu faço questão de deixar claro os sentimentos porque
não estamos falando do código e dos design patterns. Estou falando deste animal
vivente que é o computeiro, provavelmente você, que está lendo.
Noutra ocasião, também discuti com outro colega de
trabalho (que admiro até hoje) sobre o fail early. Não lembro exatamente sobre
o que eu estava fazendo de errado, acho que eu estava tentando tratar as
exceções enquanto isso impedia o sistema de expor suas falhas. Ele ganhou a
discussão e eu aprendi algo novo.
As tais metodologias ágeis são baseadas nesta
concepção da computação como um fenômeno social, de equipe. No fundo, o que ela prega é que a equipe resolva seus conflitos,
internamente e com o cliente. Ela cria pequenos artefatos e rituais que,
emboram pareçam o pão fatiado para computeiros, provavelmente já foram
estudados à exaustão por alguém da sociologia, depois de visitarem muitas
tribos indígenas. Computeiros deviam ler sobre sociologia. Já tivemos um
presidente sociólogo mas nunca um presidente computeiro.
Agora entra a programação defensiva. Programar de
forma defensiva é programar para os outros. Para o outro. É largar a sua
pornografia para adotar a pornografia do processo :-). É ser social. É deixar
claro para o outro o que você queria com aquele código.
Uma vez, eu peguei um sistema para desenvolver que era
uma bomba. Não havia forma fácil de fazê-lo, mas a fábrica só podia contar com
pouca gente boa e muita gente júnior então o código não podia ser difícil a
ponto de impedir sua manutenção. Quando eu me sentia frustrado, eu escrevia
código difícil, como forma de liberar a frustração. Agressividade passiva,
dizem.
Um belo dia, um colega de trabalho bom de serviço veio
me perguntar o que significava 1 linha do código, que usava uma operação de
XOR. Pense na última vez que você usou um XOR para montar uma interface
gráfica. Aliás, pense o que faz um XOR ou como se escreve isso em Java. Lá
estava eu, sendo um exibido egoísta babaca numa sociedade computeira que devia
ser harmoniosa e altruísta. Lá estava eu, compondo BeBop e pensando "só
um músico de jazz foda é capaz de tocar essa passagem". Era isto que
se passava na minha cabeça.
A documentação é o código porque não há tempo hábil
para manter código documentado. Não há. Java nem sequer checa se seu
javadoc condiz com a assinatura do método, até onde eu saiba. Mas se seu método
é público, isso diz muita coisa. E o livro do Meyer vai te explicar isso do
ponto de vista teórico.
Outra coisa poderosa de Java e da orientação por
objeto. A faca de dois legumes do aspecto dinâmico da linguagem. Você primeiro
instancia e depois usa. É uma forma de compartimentar o erro. Um bug pode
existir no seu código por uma eternidade, até que ocorra a condição que cause o
bug. Alguns bugs vivem anos e anos no seu código.
A cada nova versão, bugs antigos somem e outros
surgem. O bug vem da nossa atividade humana de programar. Sempre estaremos
lutando contra eles e eles sempre estarão surgindo. Poder compartimentar código
e seus erros é o que permite um sistema ser desenvolvido por muita gente. É o
que nos aproxima daquela engenharia que constrói represas, foguetes, aviões. A
programação é social porque os projetos ficaram grandes demais. E as
ferramentas se tornaram um problema por si só, porque as ferramentas também são
software. E assim lidamos com a complexidade.
Java é verboso. É verboso porque é feito para
computeiros serem sociais. Para poder fazer sistemas grandes, Para poder
lidar com rotatividade de mão de obra. Para que eu possa tirar férias e
o projeto não parar. Código fonte é apenas uma forma de expressar
conhecimento sobre algo. Uma linguagem verbosa exige que vc se expresse, talvez
mais do que vc gostaria. Nem todo mundo escreve bem ou resolve bem um
problema, mas entender o que você faz é importante. Entender sua intenção.
Lidar com a complexidade. Quebrar o problema e compartimentar seus erros.
Eu digo que Java é o Karatê das linguagens de
programação. Sou faixa branca de tudo. Algumas artes marciais são práticas,
como o Krav Magá, ensinam você a lidar com situações. Outras, trazem consigo
uma história e uma filosofia por trás, como o Kung Fu. Outras, são modernas,
como o Aikidô. Outras, foram feitas para as massas como o Karatê.
Java é uma das linguagens da commoditização da nossa
profissão. A Microsoft não fez C# à toa. Eles sabem da importância de se ter
uma grande comunidade de desenvolvedores à disposição no mercado. Estar no
mercado é ruim porque os salários tendem a achatar, e é bom porque da mesma
forma, dificilmente você ficará sem emprego. A mediocridade (que significa
estar no meio e não estar embaixo) pode ser visto tanto do ponto de vista de
ser dispensável quanto de ser empregável.
Muitas vezes, do ponto de vista da empresa, é muito
mais vantajoso você ter gente que sabe java em suas fileiras porque você quer
ter elasticidade para contratar e demitir rápido do que começar um projeto numa
linguagem obscura como Ruby por exemplo, por mais features incríveis que a
linguagem te traga.
Acho que já falei demais, deixa eu tentar concluir
isso aqui.
Em computação, tudo tem uma intenção. Existe o interesse de quem bolou a linguagem, da empresa que banca sua
insituição (no caso de Java, a Oracle, e antes, a Sun). Existe a intenção do
contratante. Existe a sua intenção como desenvolvedor. Existe a intenção dos
outros da sua equipe.
E existe a do cliente, que
raramente quer ver seu código, que é como um
vaso de plástico.
Ninguém se pergunta como aquele vaso de plástico foi feito desde que você possa plantar algo nele e ele dure pelo menos alguns anos.
Nenhum comentário:
Postar um comentário