Há muito tempo, escrevi um artigo sobre o tópico "Por que os computadores são ruins" (que no final recebeu os nomes "Computadores" e " O que há de errado com os computadores " [o link está quebrado no original, portanto, uma cópia do arquivo da web - nota do tradutor ] em duas outras versões, e o nome original nunca saiu). O artigo foi longo o suficiente, mas a essência se resumia à idéia de que os computadores são péssimos devido ao fato de que os programadores criam coisas complexas mais loucas que ninguém mais pode entender, e porque a complexidade se baseia em uma complexidade ainda maior, desde que todos o aspecto do programa não se tornará incontrolável.

CPAP daqui
O que eu não sabia então era por que os programadores fazem isso. Era óbvio que eles estavam fazendo isso; mas por que a indústria de software cria tanto código selvagem, complexo e ilegível? Por que isso continua mesmo depois, ao que parece, os desenvolvedores deveriam ter aprendido com a primeira experiência negativa? O que fez os programadores não apenas escreverem códigos ruins, mas continuarem fazendo isso de novo e de novo?
Bem, isso foi um mistério para mim, mas de alguma forma eu não estava particularmente preocupado com isso no começo. A própria idéia de que "programas ruins vêm de programadores ruins" é tão simples e óbvia que serviu de base para todo um estudo no campo da programação, que finalmente produziu bons resultados (que são descritos principalmente neste blog e também é assunto de livros que estão sendo escritos no momento). O problema foi identificado (programadores ruins que criam complexidade) e, à primeira vista, ela tinha uma solução (criar regras para o desenvolvimento de software que evitariam isso), e isso foi o suficiente para mim.
Mas eu ainda me perguntava que universidades, escolas técnicas e programas educacionais de renome mundial formam graduadores tão terríveis, apesar de décadas de experiência no ensino de técnicas de desenvolvimento de software. Obviamente, muitos dos princípios do design de programas nunca foram confidenciais, e muitas boas dicas estão chegando e muitas delas são muito gerais. Mesmo que as pessoas não frequentassem a escola, elas não leram esses conselhos?
Bem, a verdade estava além da minha imaginação, e levou quase cinco anos para trabalhar no Projeto Bugzilla com a participação de um grande número de desenvolvedores, de modo que um belo dia de repente percebi um fato aterrador:
A grande maioria (90% ou mais) dos programadores não tem ideia do que está fazendo.
Não que eles não tenham lido nada sobre desenvolvimento de software (embora provavelmente não). Não que as linguagens de programação fossem muito complicadas (embora seja). O fato é que a maioria dos programadores não tem idéia do que está realmente fazendo. Eles simplesmente imitam os erros de outros programadores - copiando o código e imprimindo feitiços mais ou menos significativos no computador, na esperança de que ele se comporte de maneira semelhante ao que eles esperam, sem ter um entendimento real da mecânica do computador, nem dos princípios do desenvolvimento de software, nem do valor cada palavra e símbolo individual que eles inserem no computador.
Essa é uma afirmação ousada, chocante e ofensiva, mas minha experiência confirma isso. Eu pessoalmente examinei e classifiquei o código de dezenas de programadores. Eu li o código de muitos outros. Conversei com muitos programadores sobre desenvolvimento de software e li artigos de centenas de desenvolvedores. O número de pessoas que realmente entendem o que estão fazendo é apenas cerca de 10% de todos os programadores com quem já conversei, trabalhei ou ouvi falar.
Os desenvolvedores de código aberto são os melhores dos melhores; são pessoas que desejam programar mesmo em seu tempo livre. E mesmo assim, eu diria que apenas cerca de 20% dos desenvolvedores de código aberto são realmente bons no que fazem.
Mas porque? Qual é o problema? Como pode haver tantas pessoas trabalhando neste setor que não têm ideia do que estão fazendo?
Bem, parece que eles são de alguma forma "estúpidos". Mas o que é estupidez? As pessoas não se tornam estúpidas só porque não sabem de algo . Há muita coisa que nem todo mundo sabe. Mas isso não os torna estúpidos. Isso os deixa sem noção sobre certas coisas, mas não são estúpidos. Não, estupidez, verdadeira estupidez - significa não saber que você não sabe alguma coisa . Pessoas estúpidas pensam que sabem alguma coisa, embora não saibam , ou não percebem que o campo do conhecimento é muito mais amplo do que pensam .
Essa "estupidez" é algo que pode ser encontrado em quase todos os campos, e o desenvolvimento de software não é exceção. Muitos programadores simplesmente não percebem que pode haver certas leis ou princípios gerais para o desenvolvimento de software; portanto, eles nem tentam encontrá-los. Muitas empresas de software não tentam melhorar o entendimento dos desenvolvedores das linguagens de programação que eles usam. Talvez isso ocorra porque a administração acredita que os programadores “já devem saber tudo isso, pois foram contratados para fazer isso”.
Infelizmente, essa visão é prejudicial ao desenvolver software, porque se você quer ser um bom programador, precisa saber muito . Qualquer um que acredite que sabe tudo (ou que tenha um "ponto cego", por causa do qual não vê mais o que aprender) - borra seu código ideal na ausência de conhecimento - conhecimento sobre a existência da qual não sabe. Eles sabem , e nem percebem, o próprio fato de uma falta de conhecimento .
Não importa o quanto você saiba, sempre há algo mais em qualquer campo, e a programação não é exceção. Então, pensar que você sabe que tudo está sempre errado.
Às vezes, é difícil determinar o que você precisa estudar. Há muitos dados, mas por onde começar? Para ajudar, criei algumas perguntas que preciso fazer a mim ou a outras pessoas para descobrir quais áreas precisam de mais estudos:
- Você sabe tudo o que pode sobre cada palavra e caractere em todas as páginas do seu código?
- Você leu e compreendeu completamente a documentação de cada função que usa?
- Você tem uma excelente compreensão dos princípios básicos do desenvolvimento de software - tão bons que você pode explicar aos programadores iniciantes da sua organização?
- Você entende como cada componente do computador funciona e como eles funcionam juntos?
- Você entende o histórico dos computadores e como eles se desenvolverão ainda mais para entender como o seu código será executado em computadores criados no futuro?
- Você conhece o histórico das linguagens de programação para entender como a linguagem que você usa evoluiu e por que funciona dessa maneira?
- Você entende outras linguagens de programação, outras abordagens de programação e tipos de computadores diferentes do que você usa para entender qual ferramenta é melhor para cada tarefa?
- De cima para baixo lista as coisas mais importantes para um programador entender o código que ele escreve. Se você pode responder honestamente "sim" a todas essas perguntas, então você é definitivamente um ótimo programador.
Talvez o comprimento da lista pareça deprimente. “Uau, leia a documentação para cada função? Sim, vai demorar muito tempo! " Ok, você sabe o que mais levará muito tempo? Torne-se um bom programador sem ler a documentação. E você sabe quanto? Eternidade , porque isso nunca vai acontecer.
Você nunca se tornará um bom programador simplesmente copiando o código de outra pessoa e orando para que funcione para você. Mais importante, porém, investir tempo em treinamento significa tornar-se bom [ programador - aprox. tradutor ]. O tempo gasto agora fará de você um programador muito mais rápido no futuro. Se você gastar muito tempo lendo durante os primeiros três meses de aprendizado de uma nova tecnologia, provavelmente será 10 vezes mais rápido nos próximos 10 anos do que se apenas se apressasse em usá-la sem ler nada.
Quero esclarecer imediatamente - é claro, não funcionará apenas para ler três meses e se tornar um bom programador. Primeiro, é muito chato - ninguém quer criar uma teoria por três meses sem ter nenhuma prática. Poucas pessoas podem fazer isso o tempo suficiente para se tornar um programador, sem mencionar que são boas de uma vez. Então, quero observar imediatamente que o entendimento vem da prática , e não apenas da teoria. Mas, sem estudar teoria, o entendimento pode não aparecer . Portanto, é importante encontrar um equilíbrio entre programação prática e teoria.
Não estou atacando nenhum programador com quem trabalhei pessoalmente ou qualquer programador em geral. Admiro quase todos os programadores que já conheci como pessoa e espero admirar os outros se os encontrar. Em vez disso, exorto todos os programadores a abrirem suas mentes para o novo, para que haja sempre algum conhecimento novo, que teoria e prática sejam a chave para o domínio e que não haja nada de vergonhoso em não saber algo - se você você sabe que não sabe de nada. Apenas reserve um tempo para descobrir quando necessário.
De um tradutor: tentei traduzir em estilo literário, então talvez algumas declarações ou idéias do original tenham sido distorcidas devido ao desejo de tornar a tradução mais legível. Nesse caso, por favor, não dirija com panos irritados, mas escreva em PM.