Creo que es difícil lograr los tres. Dos, creo que pueden ser factibles. Por ejemplo, creo que es posible lograr eficiencia y legibilidad en algunos casos, pero la mantenibilidad puede ser difícil con el código microajustado. El código más eficiente en el planeta generalmente carecen tanto de mantenimiento y facilidad de lectura que es probablemente obvio para la mayoría, a menos que usted es el tipo que puede comprender la parte vectorizada en SOA, multihilo código SIMD que Intel escribe con el montaje inline, o la más avanzada algoritmos de bordes utilizados en la industria con documentos matemáticos de 40 páginas publicados hace solo 2 meses y 12 bibliotecas de código para una estructura de datos increíblemente compleja.
Microeficiencia
Una cosa que sugeriría que podría ser contraria a la opinión popular es que el código algorítmico más inteligente es a menudo más difícil de mantener que el algoritmo directo más microajustado. Esta idea de que las mejoras de escalabilidad producen más por el dinero sobre el código microajustado (por ejemplo: patrones de acceso amigables para caché, subprocesos múltiples, SIMD, etc.) es algo que desafiaría, al menos haber trabajado en una industria llena de extremadamente complejo estructuras de datos y algoritmos (la industria visual FX), especialmente en áreas como el procesamiento de mallas, porque la explosión puede ser grande pero el dinero es extremadamente costoso cuando se introducen nuevos algoritmos y estructuras de datos de los que nadie ha oído hablar antes desde que son marcas nuevo. Además, yo '
Entonces, esta idea de que las optimizaciones algorítmicas siempre triunfan, por ejemplo, las optimizaciones relacionadas con los patrones de acceso a la memoria, siempre es algo con lo que no estoy de acuerdo. Por supuesto, si está utilizando un tipo de burbuja, ninguna cantidad de micro-optimización puede ayudarlo allí ... pero dentro de lo razonable, no creo que siempre sea tan claro. Y podría decirse que las optimizaciones algorítmicas son más difíciles de mantener que las microoptimizaciones. Me resultaría mucho más fácil mantener, por ejemplo, el Embree de Intel, que toma un algoritmo BVH clásico y directo y simplemente le saca el micro que el código OpenVDB de Dreamwork para formas innovadoras de acelerar la simulación de fluidos algorítmicamente. Entonces, al menos en mi industria, me gustaría ver a más personas familiarizadas con la arquitectura de la computadora micro-optimizando más, como lo hizo Intel cuando entraron en la escena, en lugar de crear miles y miles de nuevos algoritmos y estructuras de datos. Con micro optimizaciones efectivas, las personas podrían encontrar cada vez menos razones para inventar nuevos algoritmos.
Trabajé en una base de código heredada antes donde casi todas las operaciones de usuario tenían su propia estructura de datos y algoritmo únicos (sumando cientos de estructuras de datos exóticas). Y la mayoría de ellos tenían características de rendimiento muy sesgadas, siendo muy estrictamente aplicables. Hubiera sido mucho más fácil si el sistema pudiera girar en torno a un par de docenas de estructuras de datos más ampliamente aplicables, y creo que podría haber sido el caso si se hubieran micro optimizado mucho mejor. Menciono este caso porque la microoptimización puede mejorar enormemente la capacidad de mantenimiento en tal caso si significa la diferencia entre cientos de estructuras de datos micropesimizados que ni siquiera pueden usarse de manera segura para fines estrictos de solo lectura que implican fallas de caché restantes y derecho vs.
Lenguajes Funcionales
Mientras tanto, algunos de los códigos más fáciles de mantener que he encontrado fueron razonablemente eficientes pero extremadamente difíciles de leer, ya que fueron escritos en lenguajes funcionales. En general, la legibilidad y la mantenibilidad súper son ideas conflictivas en mi opinión.
Es realmente difícil hacer que el código sea legible, mantenible y eficiente a la vez. Por lo general, debe comprometerse un poco en uno de esos tres, si no dos, como comprometer la legibilidad para la mantenibilidad o comprometer la mantenibilidad para la eficiencia. Por lo general, la mantenibilidad es la que sufre cuando busca muchos de los otros dos.
Legibilidad versus mantenibilidad
Ahora como se dijo, creo que la legibilidad y la mantenibilidad no son conceptos armoniosos. Después de todo, el código más legible para la mayoría de nosotros los mortales se mapea muy intuitivamente a los patrones de pensamiento humano, y los patrones de pensamiento humano son inherentemente propensos a errores: " Si esto sucede, haga esto. Si eso sucede, haga eso. De lo contrario, haga esto. Oops. , Olvidé algo! Si estos sistemas interactúan entre sí, esto debería suceder para que este sistema pueda hacer esto ... oh, espera, ¿qué pasa con ese sistema cuando se dispara este evento?"Olvidé la cita exacta, pero alguien dijo una vez que si Roma se construía como un software, solo tomaría un pájaro aterrizar en una pared para derribarlo. Tal es el caso con la mayoría del software. Es más frágil de lo que a menudo nos importa. Piense. Algunas líneas de código aparentemente inocuo aquí y allá podrían detenerlo hasta el punto de hacernos reconsiderar todo el diseño, y los lenguajes de alto nivel que pretenden ser lo más legibles posible no son excepciones a tales errores de diseño humano. .
Los lenguajes funcionales puros son casi tan invulnerables a esto como uno puede llegar a ser factible (ni siquiera cerca de invulnerable, pero relativamente mucho más cerca que la mayoría). Y eso se debe en parte a que no se asignan intuitivamente al pensamiento humano. No son legibles. Nos imponen patrones de pensamiento que nos obligan a resolver problemas con el menor número posible de casos especiales utilizando la mínima cantidad de conocimiento posible y sin causar efectos secundarios. Son extremadamente ortogonales, permiten que el código a menudo se cambie y se cambie sin sorpresas tan épicas que tenemos que repensar el diseño en un tablero de dibujo, incluso hasta el punto de cambiar de opinión sobre el diseño general, sin tener que volver a escribir todo. No parece que sea más fácil de mantener que eso ... pero el código sigue siendo muy difícil de leer,