Manuel Bellido , Sudo Viernes, 21 agosto 2015

El Ingeniero de Software y la Industria peruana de software

Manuel Bellido

Software Engineer Tuirer: @manubellido ¿sudo?: http://xkcd.com/149/

Articulo publicado en Revista de Ciencia de la Computación (Universidad La Salle). Adaptado para este blog.

Actualización: El Presidente de APESOFT me hizo saber que no fue un comunicado y no fue con el ministerio, además de que el término usado fue «Picadores de Código» y no «Picadores de Hielo». Hechos que fueron corregidos y subrayados en el presente artículo.

Hace unos meses tuve la oportunidad de leer un comentario del presidente de la Asociación Peruana de Productores de Software (APESOFT) que hablaba sobre la necesidad de formar más «Picadores de Código«, refiriéndose a los programadores.

Estaba hablando de una propuesta planteada en Consejo Nacional de la Competitividad para formar programadores en institutos, en corto plazo. Todo esto bajo el supuesto de que ya había suficientes ingenieros (egresados de universidad), pero lo que hacía falta eran los obreros, justificando de esta forma lo pequeña que es la industria peruana de software en Perú. El presidente de APESOFT estaba usando una analogía muy difundida al hablar de desarrollo de software proveniente de la ingeniería civil: ingenieros y obreros.

Ingenieros vs obreros

bob-the-builder-2400x3394

Por muchos años, tal vez desde la creación de carreras de Computación (Informática/Sistemas) en Perú, se han formado profesionales bajo este modelo. La premisa es que el profesional (ingeniero, egresado de universidad) es el jefe, el que decide, el que toma decisiones, el que diseña o maneja un proyecto, por lo cual se le forma con bastantes cursos de manejo de proyectos y gestión en general. Al egresar son bombardeados con diferentes capacitaciones y certificaciones relacionados, una vez más, a gestión. Por otro lado, bajo este modelo, los programadores (obreros) son los que llevan la tarea «sencilla» de programar o escribir código por lo cuál reciben una formación rápida de tecnologías que requiere el mercado; que termina siendo superficial. Los obreros se forman en institutos o en algunas universidades, pero al egresar son vistos como «simples técnicos».

Bajo este concepto Perú ha intentado por años levantar una industria de software y no ha tenido mucho éxito. Existen varias empresas de software muy pequeñas, comparadas con otros países de la región, y ni que decir de otros países líderes en software. Un resultado bien pobre considerando que existen más de cien carreras de Informática/Sistemas en todo el Perú y cientos de institutos de informática/sistemas que enseñan sintáxis de algunos lenguajes de programación  y una que otra tecnología usada en el medio. Si bien decenas de miles de personas han sido formadas bajo este modelo y la producción de software a nivel país es varias veces más pequeña que la producción de países de la región que tienen una población menor de profesionales.

¿Cómo es posible que nuestra industria sea tan pequeña con tantos profesionales?

Cabecera_Twiter_Asociacion

Nuestra implementación de la analogía ingeniero/obrero nos dicta que los ingenieros son los que diseñan y los obreros son los que construyen de acuerdo al diseño. Los ingenieros usan lenguajes de modelamiento y levantamiento de requerimientos, tratando de ser lo menos ambiguo posible, para luego pasar sendos requerimientos y diseños a lo largo de la cadena de producción. Los obreros tienen la labor de traducir estos requerimientos y diseños en código fuente. Quienes han diseñado software y escrito código saben que hay un camino muy largo entre los requerimientos y diseño y el código fuente que es el último y más relevante entregable. El nivel de detalle que exige el escribir código es tal que el éxito de un proyecto de software depende de que lo que esté expresado en el código fuente tenga sentido, independientemente de lo bueno haya sido el levantamiento de requerimientos o el proceso de diseño. Por más detallado que esté el diseño de un software, nunca tendrá el nivel de detalle que tiene el código fuente. Es aquí cuando nuestra implementación comienza a complicar las cosas, pues para validar el diseño entregado a los programadores se tienen que usar recursos en procesos de validación y verificación. Los recursos necesarios para validar y verificar son casi imposibles de predecir por la separación, una vez más, entre el diseño y el código fuente.

facebook-hack-lenguaje-de-programacion

La analogía de ingeniero/obrero no es equivocada, tan solo nuestra implementación. La industria de software a nivel mundial ha progresado bastante en este sentido y aplica la analogía de esta forma: El ingeniero sigue siendo aquel que diseña software, puede empezar usando lenguajes de modelamiento (e.g. UML) para especificar los requerimientos del cliente o problema a resolver. Pero este proceso de diseño ejecutado por el ingeniero no acaba en documentos que listan las especificaciones o en un documento de diseño de las partes del software. El ingeniero tiene la gran responsabilidad de escribir el diseño final e indiscutible: el código fuente. La documentación siempre se desactualiza, en cambio el código fuente siempre está actualizado.

¿Y los obreros? En esta implementación de la analogía, los obreros son nada más y nada menos que los compiladores o traductores, que transforman el diseño detallado proveniente del código fuente en código ejecutable, los servidores o computadoras donde se ejecuta el software, las bases de datos que almacenan la información o cualquier otra herramienta o medio que permita a nuestro diseño en código fuente cobrar vida.

De esta forma, la analogía se aplica perfectamente, y muestra la necesidad de que los ingenieros tengan la imprescindible habilidad de escribir código fuente como resultado final de su análisis y diseño (Tech Talk altamente recomendada que explica a detalle la analogía: Real Software Engineering)

A la actividad que hacen los ingenieros en la industria de software se le llama programar. Lo curioso es que nuestra profesión es única en cuanto a que tenemos la oportunidad de crear a nuestros propios obreros o herramientas para que hagan las tareas pesadas y tediosas en el desarrollo de software. Pero mientras más grandes sean las tareas o más complejos sean los problemas, se vuelve imprescindible entender a profundidad cómo es que funcionan nuestras herramientas. Es por esto último que para diseñar, crear y usar eficientemente software son necesarios los conocimientos de Ciencia de la Computación, desde lenguajes de programación o algoritmos hasta el funcionamiento de compiladores y sistemas operativos.

Descripción gráfica de la separación entre diseño y código fuente. Original: https://xkcd.com/724/

 

El Ingeniero de Software

El rol de ingeniero en la industria se software recibe el nombre de Ingeniero de Software. Por ejemplo, en la industria de software de Estados Unidos, el ingeniero de software es la pieza fundamental a la que se suman otros roles similares. Pero es necesario hacer la aclaración que Ingeniero de Software se refiere al rol o puesto de trabajo, mas no al nombre de la carrera que se haya estudiado. Se espera que un ingeniero de software tenga conocimientos de Ciencia de la Computación, y que mejor aún haber estudiado Ciencia de la Computación . Como referencia, entre los ingenieros de software la mayoría son egresados de Ciencia de la Computación, pero también hay egresados de matemáticas y otras ingenierías.

El puesto de trabajo de ingeniero de software toma diferentes nombres dependiendo del rol y niveles internos de cada empresa, pero lo que nunca cambia es la capacidad de poder diseñar y modelar a alto y bajo nivel (código fuente). Los puestos de jefes y líderes de equipos, no son la excepción y son tomados por personas con amplia experiencia y habilidades técnicas como Ingeniero de Software (programar). Siendo esto último muy diferente a cómo estamos acostumbrados en Perú.

Ciencia de la Computación no es suficiente

Pero los conocimientos de Ciencia de la Computación no son suficientes. La industria de software require de algunas habilidades que usualmente no se enseñan en carreras de computación. Los estudiantes de carreras de Ciencia de la Computación en países con una industria de software sólida complementan sus habilidades durante los famosos internships.

Por el contrario, ahora en Perú tenemos carreras de Ciencia de la Computación pero todavía no tenemos una industria que esté acostumbrada a complementar la formación de ingenieros de software.

Este es el reto de las universidades peruanas y de los propios estudiantes a complementar su formación. Por ejemplo, entre algunas de las habilidades y conocimientos que un ingeniero de software debe tener en la actualidad, a parte de conocimientos de Ciencia de la Computación y saber programar, tenemos:

  • escalabilidad;
  • mantenimiento de software, ya que cada línea de código nueva puede introducir errores;
  • pruebas (de unidad, de integración y sistema);
  • programación a nivel profesional, lidiar con código pre-existente;
  • entender que la solución más eficiente no siempre es la mejor, a menudo hay que hacer sacrificios por diversos factores o trabajar en equipo, todo el tiempo.

La industria de software despegará cuando cambiemos nuestro modelo de formación y nos enfoquemos en formar profesionales con los conocimientos y habilidades que son necesarios. No hay necesidad de inventar la rueda cuando se puede replicar lo que funciona en otras industrias de software más grandes. Hoy por hoy, eso significa que todo profesional que quiera ser considerado Ingeniero de Software debe saber programar.

Manuel Bellido

Software Engineer Tuirer: @manubellido ¿sudo?: http://xkcd.com/149/