La importancia de programar eficientemente. Software crítico.
No se necesita un gran arquitecto para diseñar una casita de perro, ni un gran escritor para hacer una nota que ponga “vuelvo en 5 minutos”. La cosa cambia cuando lo que queremos es diseñar un edificio, o queremos escribir una gran novela. Lo mismo ocurre cuando se trata de diseñar y escribir software.
Depende mucho del software que pretendas hacer, y del entorno en el que quieras ejecutarlo, pero no se puede pretender construir un edificio moderno y complejo, con programadores a los que se les da bien construir casitas de perro.
Existe cierta tendencia a pensar que el desarrollo de software es algo irrelevante y que lo importante no es tanto la implementación como la idea en sí misma. Bueno, pues siento mucho traerte al mundo real, pero es más bien todo lo contrario. Una idea, no llevada bien a la práctica, no sirve de nada. Un ejemplo claro lo tenemos en Apple. Sus productos no introdujeron nada nuevo salvo la forma en como implementaron la idea. Cuando sacaron el iPod ya existían numerosos reproductores de mp3, sin embargo el iPod arrasó y lo mismo ocurrió con el iPhone. Apple no suele generar nuevos conceptos si no que rediseña la implementación de conceptos ya existentes.
Una idea mal implementada, es una mala idea.
Para que no se dé nadie por aludido, no voy a nombrar casos concretos, pero durante mis años en la industria del software, he visto grandes ideas sobre el papel que al ser implementado de manera burda la idea ha fracasado. Siento volver sobre el paralelismo, pero puedes imaginar un edificio espectacular pero si al ser implementado, haces mal los planos, y contrata a albañiles malos, de nada sirve si se derrumba.
Si se te ocurre un algoritmo que consigue converger a una solución que nos va a resolver un problema pero, la implementación del algoritmo es tan burda que tardamos días en encontrar la solución, puede que ya ni siquiera tenga sentido, y por lo tanto tu idea no valga de nada.
En la Fórmula 1 se contratan a los mejores ingenieros del mundo para conseguir arrancar unos milisegundos mejorando la aerodinámica del coche, sin embargo en la construcción del software basta con contratar a programadores de perfil bajo pensando que puedan llegar a los mismos resultados. Hago hincapié en que nada de esto es aplicable a tu caso, si tú a lo que te dedicas, es a vender casitas de perro.
Por supuesto, no necesitas a grandes ingenieros de software para software poco crítico, pero si de tu software depende de forma directa o indirecta la vida de las personas, entonces deberías replantearte la calidad de tus ingenieros de software. El software que va en las centralitas de los coches, el que gestiona el funcionamiento de las redes de comunicaciones, el de los teléfonos móviles, y cualquier otro tipo de software de control industrial debería estar diseñado e implementado por ingenieros de software de perfil alto. Es mucho más costoso el desastre que se puede producir por el fallo de este tipo de software que el coste que supone la contratación de buenos profesionales. No es admisible que por un fallo de programación, 1 millón de personas se puedan quedar incomunicados al no poder acceder a la red de telefonía movil. O que un coche no funcione como se espera cuando se pise el freno. O que un ascensor no dispare sus sistemas de seguridad si se produce una situación de emergencia.
Deberíamos cambiar el reloj por la brújula cuando se trata de hacer software crítico, y enfatizar en la importancia de crear código correcto y eficiente. Los beneficios que se obtienen con un buen diseño y una buena implementación son claros. Si podemos duplicar la eficiencia de un software que se ejecute en un servidor, podríamos ofrecer al cliente la posibilidad de ahorrar costes de hardware o de hacer el doble con el mismo hardware. Tengo a un amigo que es CTO de una empresa que tiene esto muy claro. Su software corre de forma distribuida en cientos de maquinas al mismo tiempo. Un software como el que desarrollan esta empresa suele ejecutarse en 500 o 1000 cpus de forma distribuida, y es justamente la importancia que siempre han puesto en la calidad de sus desarrollos y en apostar por ingenieros de perfil alto, lo que le ha supuesto estar ahora compitiendo con empresas líderes en el sector como pueden ser Pixar o Sony Pictures.
Si conseguimos que el sistema operativo de un móvil (Android, iOS) sea eficiente, podremos conseguir que la batería nos dure el doble y por lo tanto mejoremos la experiencia de usuario y por tanto la venta de terminales con ese sistema operativo. Existe la creencia popular de que el hardware es barato y que todo se arregla añadiendo más hierro, pero esto no es así. Ni mucho menos. Y si de verdad piensas que eso es así, eres la típica persona que me gustaría tener en la competencia.
Es común ver como por fallos en el software, los smartphones se quedan sin bateria en horas, haciéndolos casi inservibles.
Este enfoque va en contra de la típica tendencia de ahorrar costes en la mano de obra de desarrollo de software pensando que en lo que hay que invertir es en hardware. Es cierto que no todo el software requiere de los mismos requisitos. Lo que tenemos que tener en cuenta es que de la misma manera que no contrataríamos a alguien “al que le mola leer sobre legislación” para defendernos en un juicio, tampoco deberiamos confiar el desarrollo de software crítico a gente “a los que les mola leer sobre lenguajes de programación” si no a profesionales con una contrastada experiencia y que pueda enseñarte proyectos en los que ha participado.
No todos los programadores son iguales.
¿Por qué debemos preocuparnos por la calidad del código?
Existe mucho “gurú” del software que no hacen otra cosa que ensamblar componentes comprados a otras empresas y cuyo trabajo consiste en aprenderse el API. Estas componentes suelen ensamblarse aplicando poca inteligencia, obteniendo software poco fiable, lento, y difícil de mantener.
¿Entonces, que necesitamos? ¿a programadores que se preocupen de aprovechar al máximo los recursos hardware que tenemos? ¿Realmente merece la pena?¿No es eso muy lento? No es mejor expresar lo que necesitamos con alguno de estos lenguajes modernos a más alto nivel, incluso usando para ellos diagramas y dibujos? Y generar código de forma casi automática?
Mi opinión es que para el desarrollo de software crítico, necesitamos a programadores con una gran experiencia que conozca el lenguaje de programación y la máquina a bajo nivel. Que sepan lo que es la memoria, como se accede, que son los dispositivos, que entiendan de alineación de palabras en memoria, que conozcan como funciona el hardware y que adapten sus desarrollos al problema concreto que nos traemos entre manos.
¿Son caros estos programadores?, pues probablemente sí, pero mucho más baratos que solventar un problema producido por un mal funcionamiento de ese mismo software. Tener a 4 personas en EEUU esperando que se arregle un bug de un software y no conseguir el contrato porque el software es lento, es mucho más caro que contratar a 3 o 4 ingenieros que hubieran podido evitar esa situación.