¿Qué desafíos técnicos aún no se han resuelto en el campo del desarrollo de software?

Código de calidad. ¿Cómo se puede monitorear una base de código en evolución para detectar cambios cualitativos para peor, a fin de alertar a las personas (preferiblemente de una manera confiable y automatizada; de lo contrario, es político) cuando la calidad del código llega a un estado demasiado malo?

El problema teórico: el razonamiento sobre el código arbitrario es, literalmente, imposible. No quiero decir que sea muy difícil o económicamente inviable; Quiero decir que para cualquier lenguaje de programación con todas las funciones (Turing-complete es el término técnico) es imposible hacer una determinación de sí / no, como “¿se detiene?”, Sobre todos los programas válidos. Hay una variedad de teoremas matemáticos en ese sentido (resultados de Turing sobre el problema de detención, el trabajo de Church sobre el cálculo lambda, el teorema de Rice).

La buena noticia: los programadores no escriben “código arbitrario” porque “la mayoría” de los programas válidos son basura, al igual que la mayoría de las cadenas de caracteres no son palabras. Por el contrario, se adhieren, como individuos, a subespacios de “todos los programas válidos” que se comportan extremadamente bien. Escriben el programa más simple en el que pueden pensar (que puede no ser muy simple o muy bueno, pero ese es otro problema) para hacer un trabajo.

Por qué eso no es lo suficientemente bueno: desafortunadamente, a medida que pasa el tiempo y más personas modifican el código sin comprender por qué funciona de la manera en que lo hace, y a medida que los errores se convierten en características dependientes, la entropía del software se establece y el código va mucho más allá / imposible razonar sobre el espacio.

Los problemas de calidad del código van a estar con nosotros durante mucho tiempo. Este no es un problema nuevo. Se le dio el nombre de “la crisis del software” a fines de la década de 1960 y los problemas no han desaparecido. Los proyectos de software a menudo se entregan tarde o no se entregan. La mayoría de los programas son de baja calidad y la mayoría del código no sobrevivirá un año. Muchas compañías de software dedican del 50 al 90 por ciento de su tiempo a trabajos de mantenimiento, es decir, a mantener el éxito; la mitad de todo el software funciona peor, lo cual es extremadamente costoso y dañino para la moral (ningún programador quiere tener personal para el mantenimiento a tiempo completo de la mierda heredada de otra persona). Hay muchos problemas que resolver aquí.

¿Más buenas noticias? Los idiomas se están volviendo más manejables, al menos en usos de mejores prácticas, con el tiempo. La única forma de razonar sobre un programa de ensamblaje dirigido por goto (y casi nadie lo escribe) es ejecutarlo, que es una forma no muy técnica de decir que no se puede razonar en absoluto. El código altamente optimizado siempre será imperativo, muy acoplado y difícil de razonar. Por otro lado, si bien el código de alto rendimiento puede ejecutarse mucho, las personas no tienden a necesitar mucho y las personas (muy gradualmente) están desarrollando un sentido estético que mejora la calidad del software para, al menos, un pequeño grado Si bien nadie va a encontrar una manera de razonar sobre todo el código para ninguna medida cuantitativa o cualitativa, mejorar las herramientas podría facilitar el acercamiento lo suficiente para la mayoría de los fines industriales.

Hacer software es un gran problema sin resolver.

Es demasiado costoso diseñar, construir, implementar, mantener, mejorar y, por lo general, no funciona correctamente.

Eso debería llenar algunas vidas. Dijkstra gastó la suya y apenas hizo mella.

Tengo un gran desafío. Es una de las preguntas teóricas de la informática. ¿Cómo puede una máquina determinar si un elemento es miembro de un conjunto con una peor complejidad temporal de [math] O (1) [/ math]. Obviamente, no puede mirar a través de cada elemento [matemática] O (n) [/ matemática]. Algunas personas han mejorado el rendimiento utilizando diversas técnicas de diseño, pero [matemática] O (1) [/ matemática] no es la peor complejidad de tiempo. Si esto pudiera resolverse, cambiaría el campo CS.

La informática cuántica es definitivamente un campo en el que no se resuelven todos los problemas. Estoy seguro de que hay mucho en ese campo.

En mi opinión, nunca habrá una solución disponible para todos los problemas informáticos. Algunos pueden estar disponibles, pero pueden no ser eficaces. Del mismo modo, nunca podremos resolver todos los problemas en el amplio tema de las matemáticas. Incluso si se encuentran soluciones, es probable que no sean completamente eficientes. Las cosas siempre se pueden mejorar.

Además, los nuevos descubrimientos se transforman al intentar mejorar ciertas cosas. Por ejemplo, escuché que el pegamento usado para las notas adhesivas estaba destinado a ser un pegamento más fuerte. Ahora, nos permite publicar recordatorios temporales a nuestro alrededor.

La línea entre nuevos descubrimientos y mejoras es a veces transparente. Las mejoras en la eficiencia no se pueden descartar. Si lo fueran, todavía estaríamos en teléfonos móviles.

¿Cómo se relaciona exactamente el proceso de desarrollo de software con el producto de software final? Sigue siendo una pregunta abierta. Sabemos cuánto material se necesita y cuánto tiempo lleva construir casas, automóviles, etc.… pero ¿qué pasa con el software? 🙂

More Interesting

¿Qué técnicas de programación utilizas para hacer que los programas C ++ estén altamente disponibles?

¿Cuál es el estado actual de la técnica con respecto al porcentaje de cobertura de código óptimo para las pruebas unitarias?

¿Qué se espera de los graduados de Ingeniería de Software?

¿Qué significa 'semánticamente significativo'?

Tengo 3 años de tiempo. Amo las computadoras y estoy obsesionada con este campo. ¿Cómo puedo dominar todo (desarrollo web, software, sistema operativo, piratería, etc.) a tiempo?

¿Hay algún buen ejemplo de especificaciones funcionales en un proyecto web para aprender?

¿Cómo se debe preparar su currículum para conseguir trabajo como ingeniero de software?

¿Qué hace para aumentar su nivel de habilidad u otras cosas para que su ingreso aumente de 120K a 200K como desarrollador de software si vive en el área de Seattle?

¿Cuál es la forma más económica de crear una aplicación móvil si no sé cómo codificar?

¿Por qué es tan barato externalizar un proyecto de software a la India?

¿Debo ingresar a la industria del juego o convertirme en desarrollador / ingeniero / programador de software? No me importa el dinero.

En mi país no hay un curso de licenciatura en ingeniería de software, solo informática o ingeniería informática. ¿Cuál es mejor para trabajar como ingeniero de software con licencia en los Estados Unidos?

¿Cómo cambiar a la escritura técnica o la documentación de la API después de ser desarrollador de Java durante 7 años? ¿Hay algún requisito previo? Es una buena idea

Cómo hacer de Windows 10 un entorno de desarrollador

¿Cómo es ser ingeniero?