Programadores que pierden la base

7

Este mundo de las TI últimamente va muy rápido. En este nuevo entorno de transformación digital, los desarrolladores tienen múltiples herramientas a su alrededor. Ahora la forma de programar es muy diferente de cuando yo empecé. Es verdad que las prioridades son diferentes y ahora el time to market es más importante que el rendimiento, y muchas veces se prima más un código fácil de entender, con menos probabilidad de errores y fácil de mantener, que uno ultra eficiente.

Esto nos ha llevado a una abstracción y automatización en el desarrollo como nunca antes habíamos visto. Los frameworks RAD están comenzando a dominar. Eliminemos el boiler-plate, y vamos directamente a la lógica de negocio y lo que realmente aporta valor. Ya es suficientemente caro hacer código de calidad como para encima invertir en reinventar la rueda.

Pero me la da la impresión de que muchos programadores han perdido el contacto con el suelo. Crean un objeto, pero no saben realmente como se gestiona eso a bajo nivel. En los últimos años veo como muchos de ellos están perdiendo las bases. Lo veo constantemente a mi alrededor en cosas que yo considero básicas. Por ejemplo, ¿Cual es la diferencia entre pasar un parámetro por valor o por referencia? Muchos sabrán contestarte pero no muchos sabrán decirle lo que implica y cuando es mejor una forma o la otra. Muchos realmente ni se plantean este dilema.

Por ejemplo, ¿Para guardar un valor de moneda, qué tipo de dato es mejor usar? ¿por qué? Qué más les da. A algunos les dices que usar un float para una moneda no es lo adecuado, y entonces descubres que no saben como funciona un float por dentro. ¿Cómo es posible que haya programadores con años de experiencia que sigan sin saber que 0,1 + 0,2 == 0,3 nos dará falso si usamos floats? Yo he llegado a oír cosas como, “es que los cálculos en coma flotante son aproximados y a veces dan más o menos”  pero ni idea de por qué.

Hace dos días le pregunté a un programador al que considero muy bueno como se representaba un -1 en coma fija en binario y no me lo supo decir. Cuando le dije que era todo 1’s me miró raro, como si me colase, y cuando saqué el concepto de complemento a 2 me dijo que algo le sonaba. Si él que es de los mejores programadores que conozco no lo tenía claro en ese momento, ¿Qué pasaría con el resto? así que empecé a preguntar y la sorpresa es que muy pocos me decían como se representaba -1. Había muchos más que me decían que era el 10…01.

¿Cómo funciona el BigDecimal de Java o el Decimal de .NET? ¿Es coma fija o flotante? Y si es coma flotante, ¿En qué se diferencia de un float?

¿Cuál es la precisión de un float en tu lenguaje y plataforma? ¿Cual es la diferencia entre un double y un float?

Estamos hablando de las bases de la programación. Estamos hablando de saber qué pasa realmente dentro de los procesadores. Y esa base parece que está desapareciendo y cada vez son menos los que la dominan.

A lo mejor no es tan necesario como yo lo veo. A lo mejor, que tantos programadores desconozcan esto y que hagan el buen trabajo que hacen no hace más que demostrar que realmente no es necesario. Pero para alguien como yo, que cuando aprendió a programar en C y lo que era un compilador, comenzó a mirar como era el código compilado, cómo funcionaba la pila, cuál era la diferencia entre poner el optimizador del compilador o no (más allá de que el ejecutable ocupaba menos), pues es normal que le chirríe un poco que no se tenga esa base.

A lo mejor soy como los carcas que dicen que no se puede entender nuestra lengua si no nos enseñan latín. Pero, ¿qué queréis que os diga? Pues que soy uno de esos carcas.

Sobre el autor

Jose M. Huerta

Jose es Gestor de Proyectos y Gestor de Servicios en Mallorca. Es Ingeniero de Telecomunicaciones y obtuvo el Master of Advanced Studies durante su etapa como investigador. Pero no tardó en abandonar ese mundo y meterse de cabeza en el mundo de las Tecnologías de la Información. Está certificado como ITIL Expert. Tiene amplia experiencia en gestión de servicios, clásica e integrada con desarrollo, gestión de proyectos, usando metodologías clásicas y ágiles, gestión de programas y portfolios, gestión de grandes grupos de personas, localizadas y off-shore, sin dejar de perder de vista el lado técnico y freak del sector. Ha trabajado en varias empresas del sector con distintos roles en áreas tanto de gestión de servicios de soporte como de equipos de desarrollo. Actualmente trabaja en Sunhotels, como responsable del equipo de operaciones TI.

7 comments

  1. Julio 3 julio, 2018 at 12:41 Responder

    Imagino que te sorprende porque para ti fueron problemas a los que tuviste que enfrentarte cara a cara.
    Hoy, afotunadamente, tenemos capas de abstracción que nos evitan tener que conocer el detalle de bajo nivel. Es como si hubiera que conocer el goto para saber usar los bucles modernos. Ya no es necesario y basta con saber la lección práctica: no hagas cálculos con floats, usa las clases XDecimal de cada plataforma.
    Pero entiendo tu mensaje, yo lo veo más cercano en el protocolo HTTP. Hoy es omnipresente en todos los desarrollos pero pocos conocen sus bases. Si quieres haz una nueva ronda de preguntas sobre él y te sorprenderás; Diferencias entre http redirect y forward? Listado de métodos? Longitud máxima de una URL? Cómo se puede implementar un scope sesión? Paso de parámetros entre páginas? etc, etc.

    • Jose M. Huerta 4 julio, 2018 at 18:49 Responder

      No lo digo ya por los problemas que yo me enfrenté. No pretendo que sepan ensamblador, al que yo me he tenido que enfrentar en el pasado. Pero sí que sepan con qué tamaño de entero trabajan y las implicaciones que esto implica en memoria por citar un ejemplo. Si vamos a nano-servicios por ejemplo, que la aplicación baje de 200 MB consumidos a 150 MB simplemente porque ves que determinado tipo de datos te basta con enteros de 16 bits, en vez de 32 bits que te vienen por defecto, puede suponer un ahorro de coste considerable, dependiendo del lugar en el que estés. O cambiar UTF16 a ANSI al tratar strings, porque sabes que con ANSI básico te basta.. Hablamos de reducir el espacio en memoria, el uso del bus a memoria y de ciclos de procesado a la mitad. Y eso aplica hoy en día.
      E incluso aplica aunque no tengas problemas de rendimiento. Porque luego la aplicación hace algo “raro” y “de vez en cuando”, porque no sabes qué está haciendo por debajo.
      Y qué curioso que los más cracks, sí que pilotan estos temas. Aquellos curiosos por aprender lo más avanzado suelen ser los que tienen estos conceptos claros. Será por algo.
      Pero tu opinión es la de mucha otra gente. Así que probablemente tendrás razón y será mi experiencia pasada la que me hace pensar que esto es más necesario de lo que realmente es.

  2. Julio 30 julio, 2018 at 12:56 Responder

    En realidad pensamos muy parecido. La diferencia está en los ejemplos. Pero supongo que es porque trabajamos en entornos bastante diferentes. Imagino que tú estás rodeado de servicios a los que exprimir el rendimiento hasta los niveles que comentas. En mi entorno, el cuello de botella suele estar en bdd más que en el código, salvo cuando alguno monta un bucle On3 jeje

    • Jose M. Huerta 31 julio, 2018 at 07:30 Responder

      Con BBDD lo mismo aplica. La mayoría de cuellos de botella con BBDD vienen de programarlo mal. De por ejemplo usar un ORM sin fijarse en el SQL que genera. Ves como que para obtener un registro se descarga toda la tabla y luego busca el registro en memoria, sólo por usar mal la llamada al ORM.

Post a new comment