Reduzcamos el alcance de la respuesta a la complejidad esencial y accidental en el dominio de la ingeniería de software, porque eso es lo que implica la etiqueta “Computer Science”.
¿Qué es la complejidad de una pieza de software?
Incluso si el término complejidad se puede interpretar de manera muy amplia en general, en el contexto de la ingeniería / programación de software, se denomina principalmente una combinación de las dos propiedades siguientes:
- ¿Cuáles son algunos libros que las personas interesadas en PNL deben leer?
- ¿Cuántos terabytes se necesitarían para describir a un humano con el mayor detalle posible?
- ¿En qué punto se considera una máquina un robot?
- ¿Qué se enseña en B.Tech CCE en MIT, Manipal?
- ¿Cuáles son todos los tipos de aprendizaje automático y todos utilizan los mismos principios?
- Capacidad para comprender y mantener una pieza de código o una parte del sistema de software después de que se haya creado.
- Complejidad del algoritmo Big-O [1]: esta es la capacidad de un algoritmo para escalar mientras el tamaño de entrada está creciendo. Se aplica principalmente al tiempo de procesamiento, pero también se utiliza para el espacio utilizado (por ejemplo, en la memoria o en el disco) por un algoritmo.
Expectativa de complejidad
Muy a menudo, al echar un vistazo rápido al complejo código, un profesional experimentado puede decir si la complejidad que está observando es esencial o accidental. En palabras simples sin conocer los detalles exactos de implementación, puede estimar si el mismo problema puede resolverse con un código menos complejo o no.
Causas típicas:
- Cuando un desarrollador no está familiarizado con la gama completa de capacidades del marco o la tecnología utilizada, a menudo tiende a elegir una técnica y reutilizarla para todos los fines, incluso si hay mejores alternativas (síndrome de martillo y clavo [2]). Probablemente lo más problemático es la ignorancia de algoritmos y estructuras de datos bien conocidos. Por ejemplo, muchos desarrolladores de Java / c # usan en exceso la estructura de datos de la Lista, incluso si un iterador, Stack o Array podría ser suficiente. Un ingeniero experimentado notará rápidamente que no hay operaciones de eliminación, por lo que el uso de la lista obviamente es demasiado grande.
- Un desarrollador tiende a generalizar en exceso una tarea . Un amigo mío le pidió a un programador que escribiera un programa para imprimir nombres de los 10 clientes más rentables. Al programador se le ocurrió una aplicación con una interfaz de usuario compleja que ofrece infinitas posibilidades de consultar los datos del cliente. Los programadores a menudo nos olvidamos de hacer lo mínimo necesario, tratando de predecir posibles requisitos futuros.
- Una vez escrito y funcionando, un fragmento de código puede optimizarse y simplificarse para reducir la complejidad. Sin embargo, muchos programadores tienden a no tocar un sistema en ejecución debido a la falta de tiempo y pruebas . La situación empeora aún más cuando los errores se corrigen bajo presión de tiempo y sin tener pruebas en su lugar. Los desarrolladores intentan hacer cambios con el mínimo impacto posible, sin revisar y optimizar todo el código. Como resultado, la complejidad crece innecesariamente con el tiempo.
Notas al pie
[1] Una guía para principiantes sobre la notación Big O
[2] Ley del instrumento – Wikipedia