Niveles Básicos:
Veamos las cosas en el nivel más simple y básico.
Para las matemáticas, tenemos:
2 + 3 = 5
Aprendí sobre eso cuando era muy, muy joven. Puedo ver los elementos más básicos: dos objetos y tres objetos. Excelente.
Para la programación de computadoras, la mayoría de las personas tienden a usar un lenguaje de alto nivel. Algunos lenguajes de alto nivel pueden incluso "compilarse" en uno de los lenguajes de alto nivel inferiores, como C. C puede traducirse al lenguaje ensamblador. El lenguaje ensamblador luego se convierte en código de máquina. Mucha gente piensa que la complejidad termina allí, pero no es así: las CPU modernas toman el código de la máquina como instrucciones, pero luego ejecutan "microcódigo" para ejecutar esas instrucciones.
Esto significa que, en el nivel más básico (que trata con las estructuras más simples), ahora estamos lidiando con un microcódigo, que está incrustado en el hardware y que la mayoría de los programadores ni siquiera usan directamente, ni actualizan. De hecho, no solo la mayoría de los programadores no tocan el microcódigo (0 niveles más altos que el microcódigo), la mayoría de los programadores no tocan el código de la máquina (1 nivel más alto que el microcódigo), ni siquiera el ensamblaje (2 niveles más altos que el microcódigo) ( excepto, tal vez, por un poco de entrenamiento formal durante la universidad). La mayoría de los programadores pasarán tiempo solo 3 o más niveles más altos.
Además, si nos fijamos en la Asamblea (que es el nivel más bajo que normalmente obtienen las personas), cada paso individual generalmente es comprensible para las personas que han recibido capacitación y tienen los recursos para interpretar ese paso. En este sentido, el ensamblaje es mucho más simple que un lenguaje de nivel superior. Sin embargo, el ensamblaje es tan simple que realizar tareas complejas, o incluso tareas mediocres, es muy tedioso. Los idiomas de nivel superior nos liberan de eso.
En una ley sobre "ingeniería inversa", un juez declaró que incluso si el código puede manejarse teóricamente un byte a la vez, los programas modernos involucran millones de bytes, por lo que algunos tipos de registros (como copias de código) deben hacerse solo para tal un esfuerzo por ser factible (Por lo tanto, el desarrollo interno no se consideró una violación de la regla generalizada de "no hacer copias" de la ley de derechos de autor). (Probablemente estoy pensando en hacer cartuchos Sega Genesis no autorizados, pero puedo estar pensando en algo que se dijo durante el caso de Game Genie. )
Modernización:
¿Ejecutas código destinado a 286s? ¿O ejecutas código de 64 bits?
Las matemáticas usan fundamentos que se extienden por milenios. Con las computadoras, las personas generalmente consideran que la inversión en algo que tiene dos décadas es un desperdicio inútil de recursos. Eso significa que las matemáticas pueden probarse mucho más a fondo.
Estándares de herramientas usadas:
Un amigo que tenía una capacitación en programación de computadoras más formal que yo me enseñó que no existe un compilador de C sin errores que cumpla con las especificaciones de C. Esto se debe a que el lenguaje C básicamente asume la posibilidad de usar memoria infinita con el propósito de una pila. Obviamente, un requisito tan imposible tuvo que ser desviado cuando la gente trató de hacer compiladores utilizables que funcionaran con máquinas reales que son un poco más finitas por naturaleza.
En la práctica, he descubierto que con JScript en Windows Script Host, he podido lograr mucho bien usando objetos. (Me gusta el entorno porque el conjunto de herramientas necesario para probar el nuevo código está integrado en las versiones modernas de Microsoft Windows). Al usar este entorno, descubrí que a veces no hay documentación fácil de encontrar sobre cómo funciona el objeto. Sin embargo, usar el objeto es tan beneficioso que lo hago de todos modos. Entonces, lo que haría es escribir código, que puede tener errores como un nido de avispas, y hacerlo en un entorno bien protegido donde pueda ver los efectos y aprender sobre los comportamientos del objeto mientras interactúo con él.
En otros casos, a veces solo después de haber descubierto cómo se comporta un objeto, descubrí que el objeto (incluido con el sistema operativo) tiene errores y que es un problema conocido que Microsoft ha decidido intencionalmente que no se solucionará .
En tales escenarios, ¿confío en OpenBSD, creado por programadores expertos que crean nuevos lanzamientos a tiempo, de manera regular (dos veces al año), con un famoso registro de seguridad de "solo dos agujeros remotos" en más de 10 años? (Incluso tienen parches de erratas para problemas menos graves). No, de ninguna manera. No confío en un producto con una calidad tan alta, porque estoy trabajando para una empresa que brinda soporte a empresas que suministran a las personas máquinas que usan Microsoft Windows, así que eso es en lo que mi código necesita trabajar.
La practicidad / usabilidad requiere que trabaje en las plataformas que la gente encuentra útiles, y esa es una plataforma que es famosa por su seguridad (a pesar de que se han realizado enormes mejoras desde los primeros días del milenio en que los productos de la misma compañía eran mucho peores) .
Resumen
Existen numerosas razones por las cuales la programación de computadoras es más propensa a errores, y eso es aceptado por la comunidad de usuarios de computadoras. De hecho, la mayoría del código está escrito en entornos que no tolerarán esfuerzos sin errores. (Algunas excepciones, como el desarrollo de protocolos de seguridad, pueden recibir un poco más de esfuerzo en este sentido). Además de las razones comúnmente pensadas de las empresas que no quieren invertir más dinero y pierden plazos artificiales para hacer felices a los clientes, existe el impacto de La marcha de la tecnología que simplemente establece que si pasa demasiado tiempo, estará trabajando en una plataforma obsoleta porque las cosas cambian significativamente dentro de una década.
De golpe, puedo recordar que me sorprendió lo cortas que eran algunas funciones muy útiles y populares, cuando vi un código fuente para strlen y strcpy. Por ejemplo, strlen puede haber sido algo así como "int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}"
Sin embargo, los programas informáticos típicos son mucho más largos que eso. Además, una gran cantidad de programación moderna utilizará otro código que puede probarse menos a fondo, o incluso se sabe que tiene errores. Los sistemas de hoy son mucho más elaborados de lo que se puede pensar fácilmente, excepto al descartar muchas de las minucias como "detalles manejados por niveles inferiores".
Esta complejidad obligatoria, y la certeza de trabajar con sistemas complejos e incluso incorrectos, hacen que la programación de computadoras sea mucho más verificable que muchas matemáticas donde las cosas tienden a reducirse a niveles mucho más simples.
Cuando desglosas las cosas en matemáticas, llegas a piezas individuales que los niños pueden entender. La mayoría de la gente confía en las matemáticas; al menos aritmética básica (o, al menos, contando).
Cuando realmente desglosas la programación de la computadora para ver lo que sucede debajo del capó, terminas con implementaciones rotas de estándares y códigos rotos que finalmente se ejecutan electrónicamente, y esa implementación física está solo un paso por debajo del microcódigo que la mayoría de los informáticos capacitados en universidades no usan No se atreva a tocar (si es que lo saben).
He hablado con algunos programadores que están en la universidad o recién graduados que se oponen directamente a la idea de que se puede escribir un código libre de errores. Han descartado la posibilidad, y aunque reconocen que algunos ejemplos impresionantes (que he podido mostrar) son algunos argumentos convincentes, consideran que tales muestras son trematodos raros no representativos, y aún descartan la posibilidad de poder contar en tener tales estándares más altos. (Una actitud muy, muy diferente a la base mucho más confiable que vemos en matemáticas).