Níveis básicos:
Vejamos as coisas no nível mais simples e mais básico.
Para matemática, temos:
2 + 3 = 5
Eu aprendi sobre isso quando eu era muito, muito jovem. Eu posso olhar para os elementos mais básicos: dois objetos e três objetos. Ótimo.
Para programação de computadores, a maioria das pessoas costuma usar uma linguagem de alto nível. Alguns idiomas de alto nível podem até "compilar" em um dos idiomas de baixo nível, como C. C, que pode ser traduzido para o idioma Assembly. A linguagem assembly é então convertida em código de máquina. Muitas pessoas pensam que a complexidade termina aí, mas isso não acontece: as CPUs modernas tomam o código da máquina como instruções, mas depois executam o "microcódigo" para realmente executar essas instruções.
Isso significa que, no nível mais básico (lidando com as estruturas mais simples), agora estamos lidando com o microcódigo, embutido no hardware e que a maioria dos programadores nem usa diretamente, nem atualiza. De fato, não apenas a maioria dos programadores não toca no microcódigo (0 níveis acima do microcódigo), como também não toca no código da máquina (1 nível acima do microcódigo), nem no Assembly (2 níveis acima do microcódigo) ( exceto, talvez, por um pouco de treinamento formal durante a faculdade). A maioria dos programadores gastará tempo apenas 3 ou mais níveis acima.
Além disso, se olharmos para a Assembléia (que é o nível mais baixo que as pessoas normalmente obtêm), cada etapa individual é tipicamente compreensível por pessoas que foram treinadas e têm os recursos para interpretar essa etapa. Nesse sentido, o Assembly é muito mais simples que uma linguagem de nível superior. No entanto, o Assembly é tão simples que executar tarefas complexas, ou mesmo medíocres, é muito entediante. Os idiomas de nível superior nos libertam disso.
Em uma lei sobre "engenharia reversa", um juiz declarou que, mesmo que o código possa ser teoricamente manipulado um byte de cada vez, os programas modernos envolvem milhões de bytes; portanto, alguns tipos de registros (como cópias de código) devem ser feitos apenas para tais um esforço para ser viável. (Portanto, o desenvolvimento interno não foi considerado uma violação da regra generalizada de "não fazer cópias" da lei de direitos autorais.) (Provavelmente estou pensando em fabricar cartuchos não autorizados da Sega Genesis, mas talvez esteja pensando em algo dito durante o caso Game Genie. )
Modernização:
Você executa código destinado a 286s? Ou você executa o código de 64 bits?
A matemática usa fundamentos que remontam a milênios. Com computadores, as pessoas normalmente consideram o investimento em algo de duas décadas um desperdício inútil de recursos. Isso significa que a matemática pode ser muito mais completamente testada.
Padrões de ferramentas usadas:
Foi-me ensinado (por um amigo que tinha um treinamento mais formal em programação de computadores do que eu) que não existe um compilador C sem erros que atenda às especificações C. Isso ocorre porque a linguagem C basicamente assume a possibilidade de usar memória infinita para o propósito de uma pilha. Obviamente, um requisito tão impossível teve que ser desviado de quando as pessoas tentavam criar compiladores utilizáveis que funcionavam com máquinas reais, que são um pouco mais finitas por natureza.
Na prática, descobri que, com o JScript no Windows Script Host, consegui realizar muitas coisas boas usando objetos. (Gosto do ambiente porque o conjunto de ferramentas necessário para experimentar o novo código está incorporado nas versões modernas do Microsoft Windows.) Ao usar esse ambiente, descobri que às vezes não há documentação facilmente localizável sobre como o objeto funciona. No entanto, usar o objeto é tão benéfico, que eu faço assim mesmo. Então, o que eu faria é escrever um código, que pode ser buggy como um ninho de vespas, e fazê-lo em um ambiente agradável em área restrita onde eu possa ver os efeitos e aprender sobre os comportamentos do objeto enquanto interage com ele.
Em outros casos, às vezes somente depois de descobrir como o objeto se comporta, descobri que o objeto (fornecido com o sistema operacional) é defeituoso e que é um problema conhecido que a Microsoft decidiu intencionalmente não será corrigido .
Em tais cenários, eu confio no OpenBSD, criado por programadores talentosos que criam novos lançamentos dentro do cronograma, regularmente (duas vezes por ano), com um famoso registro de segurança de "apenas dois buracos remotos" em mais de 10 anos? (Até eles têm patches de errata para problemas menos graves.) Não, de maneira alguma. Não confio em um produto com qualidade tão alta, porque estou trabalhando para uma empresa que oferece suporte a empresas que fornecem às pessoas máquinas que usam o Microsoft Windows, e é nisso que meu código precisa trabalhar.
A praticidade / usabilidade exige que eu trabalhe nas plataformas que as pessoas acham úteis, e essa é uma plataforma que é notoriamente ruim para a segurança (mesmo que enormes melhorias tenham sido feitas desde os primeiros dias do milênio em que os produtos da mesma empresa eram muito piores) .
Sumário
Existem inúmeras razões pelas quais a programação de computadores é mais suscetível a erros, e isso é aceito pela comunidade de usuários de computadores. De fato, a maioria dos códigos é escrita em ambientes que não toleram esforços sem erros. (Algumas exceções, como o desenvolvimento de protocolos de segurança, podem receber um pouco mais de esforço nesse sentido.) Além do pensamento comum de que as empresas não desejam investir mais dinheiro e perdem prazos artificiais para agradar os clientes, há o impacto de a marcha da tecnologia que simplesmente afirma que, se você gastar muito tempo, estará trabalhando em uma plataforma obsoleta, porque as coisas mudam significativamente em uma década.
Imediatamente, lembro-me de me surpreender com o quão curtas eram algumas funções muito úteis e populares, quando vi algum código fonte para strlen e strcpy. Por exemplo, strlen pode ter sido algo como "int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}"
No entanto, programas de computador típicos são muito mais longos que isso. Além disso, muita programação moderna usará outro código que pode ser testado menos detalhadamente, ou mesmo conhecido por ser buggy. Os sistemas atuais são muito mais elaborados do que aquilo que pode ser facilmente pensado, exceto afastando manualmente muitas das minúcias como "detalhes manipulados por níveis mais baixos".
Essa complexidade obrigatória e a certeza de trabalhar com sistemas complexos e até errados tornam a programação de computadores muito mais verificável do que muita matemática, onde as coisas tendem a se resumir a níveis muito mais simples.
Quando você divide as coisas em matemática, você começa a aprender peças individuais que as crianças podem entender. A maioria das pessoas confia na matemática; pelo menos aritmética básica (ou, pelo menos, contando).
Quando você realmente divide a programação de computadores para ver o que está acontecendo, acaba implementando padrões e códigos quebrados que são executados eletronicamente, e essa implementação física é apenas um passo abaixo do microcódigo que a maioria dos cientistas da computação ouse tocar (se eles estão cientes disso).
Conversei com alguns programadores que estão na faculdade ou recém-formados que objetam totalmente a noção de que código sem erros pode ser escrito. Eles descartaram a possibilidade e, embora reconheçam que alguns exemplos impressionantes (que pude mostrar) são alguns argumentos convincentes, eles consideram essas amostras raros casos não representativos e ainda descartam a possibilidade de poder contar. em ter padrões tão altos. (Uma atitude muito, muito diferente da fundamentação muito mais confiável que vemos na matemática.)