Mostrando entradas con la etiqueta Ingeniería de software. Mostrar todas las entradas
Mostrando entradas con la etiqueta Ingeniería de software. Mostrar todas las entradas

domingo, 2 de octubre de 2022

Reglas de la Ingeniería de software (índice)


Cuando comencé este blog, lo hice con la intención de facilitar el trabajo de las personas que se dedican al desarrollo de software, de forma profesional. Creo que existen muchos blogs y libros tecnológicos que hablan desde el desarrollo de software desde un punto de vista académico y teórico, pero muy pocos que lo atacan desde un punto de vista laboral (sobre todo en español).

Desde hace bastantes años, tengo ciertas labores de “tutelaje”, intentando ayudar a nuevos profesionales, a que vean el panorama completo desarrollo de software empresarial. Con base a eso, comencé a elaborar una serie de “Reglas de la Ingeniería de Software”, puntos cuya lectura nos ayudarían a hacer software de calidad en un tiempo razonable. Se analizaba todo los que nos llevaba al éxito y los que nos llevaba al fracaso (y creedme he estado en ambos tipos de proyectos), y se intentaba sintetizar en un punto fácil de recordar.


Las reglas son de diversa índole, por que abarcan el desarrollo empresarial de software en general. Así que se puede encontrar reglas que hagan referencia a aspectos técnicos de los mismos lenguajes de programación, pero también a aspectos como la gestión del tiempo, la responsabilidad, o la relación entre los integrantes de un equipo de desarrollo.

Algunas reglas pueden parece que están repetidas, esto porque hay una constante que se da en el desarrollo empresarial, que es el cambio rápido y constante en el negocio que abarcan los sistemas, los que provoca cambios en los mismos sistemas, a sus capacidades y sus necesidades, forzándonos a que sea simple y fácil de mantener. Muchas reglas girar en torno a esas ideas, aunque enfocadas cada una desde un punto de vista diferente, aunque parecido.

Por otro lado este es un proyecto vivo, en el que se agregaran, corregirán (y quitaran si es necesario), las reglas que sean necesarias, para mantenerlas coherente y útiles para la vida laboral del desarrollador de software.

Las reglas actuales son las siguientes:

  • Regla N°1: Va a cambiar

    31 de agosto de 2014


    Todo cambia muy rápido en el proceso de desarrollo de un software, el mismo software construido, genera nuevos requisitos, la satisfacción de las necesidades de un proyecto, genera a su vez nuevas necesidades.

    Explicado de otra forma la resolución de un problema, genera un entendimiento más claro de dicho problema, y en esta situación, se abren nuevas posibilidades sobre las capacidades del software y el negocio que sustenta.

  • Regla N°2: Va a fallar

    6 de septiembre de 2014


    Es imposible determinar si cierto software continuara funcionando en un futuro, porque las condiciones en las que se verá envuelto son impredecibles (actualizaciones de software con el que convive, actualizaciones de hardware… incluso la fecha y hora del ordenador).

    Hay que evitar actitudes optimistas con respecto a la posibilidad que ocurran fallos, puesto que es muy probable que estos ocurran, por otro lado considerar que el usuario del sistema hará un uso “lógico” o coherente de este, es un desatino, generalmente nos sorprenderá descubriendo errores, que nunca se nos hubieran pasado por la cabeza.

  • Regla N°3: Se va a mantener

    15 de septiembre de 2014


    El tiempo que vas a estar creando software nuevo, es incomparablemente menor al tiempo que vas a estar manteniéndolo.

    Gran parte nuestros esfuerzos de desarrollo van a estar enfocados en el mantenimiento de código que bien puede ser código ajeno o código de otras personas.

  • Regla N°4: Todo sistema tiene un propósito

    21 de septiembre de 2014


    Es común que olvidemos que lo que estamos creando no es un conjunto de variables, y líneas de código, sino que tiene que un significado y relevancia especial fuera del lenguaje de programación en el que los estamos creando. Por ejemplo, una trasferencia bancaria de un millón de dólares errónea no es una posición de memoria mal inicializada, sino que puede ser una pérdida real, o un sistema médico de monitores mal construido puede poner en juego vidas humanas. Hay que pensar en nuestros sistemas por lo que van a poner aportar en un negocio o los problemas que van a poder resolver y no como simples entes tecnológicos.

  • Regla N°5: No te repitas

    28 de septiembre de 2014


    La regla "No te repitas", hace referencia a que no se deben repetir porciones de código, con funcionalidades iguales, "casi iguales", o parecidas a los largo del código. Aunque técnicamente funcione y de el resultado correcto, aumenta el grado de "degeneración del software" (el tiempo en que se echa a perder un software, hasta que ya no es útil su funcionalidad).

  • Regla N° 6: Lo importante es el "Que hace" y no el "Como lo hace"

    16 de octubre de 2014


    En la programación orientada a objetos, se diseñan elementos, donde prima la representación de "Que es lo que hace" y "Que son", principalmente, a través de sus atributos y sus métodos. también se establece como se relacionan con otros tipos de elementos (o clases), ya sea mediante técnicas como la composición, la herencia, o el envió y recepción de mensajes.

    De esta forma centrándonos en "Que hace" obtenemos una comprensión mas clara del sistema, y de sus requisitos, además construiremos un sistemas más escalable (debido a que no nos estamos centrando en "Como lo hace"). Inclusive tendremos muchas más posibilidades de conectarnos a otros sistemas, puesto que queda mas claramente establecidos los limites y conectores de estos.

  • Regla N°7: Primero los objetos, después las base de datos

    2 de enero de 2015


    El enfoque más idóneo para comenzar un sistema, es el diseño de los objetos o las clases de los que se va a constituir nuestros sistemas. Generalmente al comienzo del diseño, tenemos una idea de cómo queremos hacer las cosas, dicha idea no tiene que estar completa, y cuanto más avancemos en ella, mas compresión tendremos sobre la misma. Podemos ir reduciendo el nivel de abstracción según los necesitemos. Igualmente podemos usar relaciones de objetos, ya sea de jerarquía (herencia) o de contención (un objeto contiene a otro, o a varios). Y lo más importante, se comprende que los datos, van de la mano de las operaciones (funcionalidad), y se diseña el sistema de dicha forma.

  • Regla N°8: El entusiasmo da el conocimiento, el conocimiento sin entusiasmo no sirve de nada

    19 de julio de 2015


    El conocimiento sin entusiasmo es, en el mejor de los casos, fortuito, y casi nunca podrá convertirse en algo útil para el negocio, en sistemas y herramientas funcionalidades que creen una diferencia significativa. En la mayoría de los casos lo único que podrá realizarse sin entusiasmo es lo que yo llamo “tareas de escuela”, programas técnicamente correctos, hechos según un enunciado claro como una receta, pero que no sirve en la práctica de absolutamente nada, que son imposibles de encajar en un ambiente laboral real. En última instancia los conocimientos, y más en esta profesión, son caducos.

  • Regla N°9: Los warnings de hoy son los errores de mañana (programa sin warning)

    8 de agosto de 2015


    Cuando me enfrento al mantenimiento de código realizado por diversos equipos de trabajo (y he de reconocer que no con menos frecuencia al creado por mi), me encuentro con que al compilar, existe un excesivo número de advertencias (excesivo son más de 200 o incluso mas). Advertencias que se han ido creando a lo largo del tiempo y que nadie se ha molestado en revisar jamás, acumulándose más y más cuanto más codificadores mueven el sistema. Generalmente nadie toca dichos warning debido al temor que entraña "mover" algo cuyo sentido desconocemos (el hecho que lo desconozcamos ya debiera hacer saltar la alarma). Bueno, si existe el warning, seguramente no tenga ningún significado oculto y simplemente es una omisión no intencional que deba ser corregida.

    Los warnings se acumulan a lo largo de los años y el número dificulta entender claramente lo que nos están indicando, cuanto más warnings haya, menos casos les haremos, hasta que uno de esos warnings realmente representen un potencial problema en producción que se nos pase completamente desapercibido, convirtiéndose en un dolor de cabeza (con suerte) o en algo más grave, porque "los warnings de ahora son los errores de mañana".

  • Regla N°10: Si no es sencillo está mal hecho

    1 de diciembre de 2015


    El desarrollo de un software tiende a complicarse… a complicarse mucho. Se complica sacar el proyecto a tiempo, se complica las relaciones con el equipo de trabajo, con los proveedores o con los recursos. Debemos mantener esa complejidad bajo control, teniendo en la mente que todo lo que hagamos cumplir la regla "Si no es sencillo, está mal hecho".

    La sencillez muchas veces se confunde. Sencillez no quiere decir fácil, es casi siempre lo contrario. Es difícil hacer las cosas sencillas. Casi siempre invertir en sencillez es un proceso costoso al principio y ventajoso al final del proyecto. El objetivo de esta regla es conseguir sistemas que estén guiados por la sencillez.

  • Regla N°11: El primer código es para entender el problema, los restantes para hacerlo bien

    5 de febrero de 2017


    Como defensor del las metodologías agiles, creo que la mejor forma de comprender un problema es descomponiéndolo en problemas más sencillos y solucionándolos uno a uno.

    Esto implica que hasta que no tengamos algo de código listo, no comprenderemos exactamente la necesidad que estamos intentando suplir. Es más, el ver la necesidad resulta, pueda cambiar los requisitos y la percepción sobre el problema real a tratar.

    Los motivos anteriores hacen que el primer código no sea el más optimo, porque su objetivo está más orientado al análisis que a la implementación. La situación en este punto es tenemos un código que nos muestra una solución, pero es una solución temporal y estática (Si hubiera un cambio en los requisitos sería muy difícil de ajustar estar código para atenderlo).

    Es por lo cual necesitamos realizar una segunda revisión del código, en estas caso ya no para resolver el problema de negocio, sino para asegurarnos que nuestro código sea de calidad, cumpliendo los siguientes requisitos:

  • Regla N°12: “Hay que prepararse para la lluvia cuando hace sol” (olvídate de “Si funciona no lo toques”)

    16 de agosto de 2017


    Si funciona no lo toques”, es un refrán bastante popular y además es horrible, promueve una filosofía de conformismo e incluso de cobardía ante el cambio. Me imagino que funcionaria en algún momento, donde tu zona de confort sea enorme. En la actualidad, y particularmente en nuestro negocio, las zonas de confort tienen a hacerse muy pequeñas muy rápidamente.

    ¿Cuándo es el momento de “tocar” algo que funciona?, si crees que es “cuando no funcione”, estas en un error, ese es el peor momento para plantearte cambios. Por la misma circunstancia que “no funciona”, el objetivo, o la prioridad ya no es crear ningún tipo de mejora, si no conseguir que el sistema siga funcionando.

  • Regla N°13: Simplifica las cosas

    10 de noviembre de 2017


    Cuanto te enfrentes a un problema grande, simplifícalo en problemas más pequeños. Si estos problemas siguen siendo demasiado grandes repite el proceso hasta que tengas un problema lo suficientemente pequeño para poderlo resolver.

    Para simplificar partimos siempre de un problema grande que es irresoluble en su tamaño actual, e identificamos las partes que lo componen. Lo dividimos en pequeños problemas que son más fáciles de resolver, repitiendo el proceso hasta que podémonos identificar dichos problemas con una solución clara y sencilla, y además que solo sirva para resolver exclusivamente una necesidad.

  • Regla N°14: Evita la ceguera voluntaria

    16 de diciembre de 2017


    La ceguera voluntaria es ignorar de forma deliberada situaciones que si bien son perjudiciales, no suponen un daño inmediato, con lo que no se hace nada para corregirlas, convirtiéndose en una posible situación catastrófica a futuro.

    Cuando aparecen problemas en mitad de un desarrollo y no son atacados y mitigados cuando son pequeños, aumentaran de forma progresiva hasta ser de tal tamaño que afecte al tiempo, calidad o costo del proyecto.

  • Regla N°15: Haz que las cosas sucedan

    11 de enero de 2018


    Una de las cosas que más afectan al éxito del desarrollo de un sistema es la pasividad y falta de proactividad. Esto es, principalmente, quedarse esperando a que las cosas pasen por si solas.

    Muchas veces existen escenarios de incertidumbre en que no queda claro que es lo tenemos que hacer en cuanto al sistema que se está construyendo, esto puede ser por muchos motivos, puede ser una falta de visibilidad del objetivo real o que no se nos ha comunicado apropiadamente.

    Pero es necesario comprender que mientras el sistema no esté finalizado (satisfaga las necesidades del cliente), hay tareas pendientes que hay que resolver y es responsabilidad de cada integrante del equipo conocer cuáles son y conseguir se lleve a cabo. Es responsabilidad de cada uno hacer que las cosas sucedan.

  • Regla N°16: Por defecto todo es privado (principio de ocultación)

    25 de enero de 2018


    He observado un problema muy común de muchos programadores noveles, escriben la palabra "public" por inercia al momento de crear una nueva funcionalidad, sin pararse realmente a pensar que están haciendo, y solo cuando lo meditan bien escriben "privado". A veces no se dan cuenta de esta circunstancia, otra veces piensan que es más sencillo, si todo es público, a veces incluso piensan que le dan cierto sentido de "libertad", cuando lo que se hace abrir puerta al desastre (la “libertad” la da en todo caso, compartir el código fuente, no habilitar métodos privados como públicos).

  • Regla N°17: Primero el camino principal luego las excepciones

    23 de diciembre de 2018


    Si es bien es cierto que uno se tiene que prepara para los fallos (para que el software falle) la ruta principal (de ejecución) debe ser un camino limpio y fácilmente trazable. Incluso desde el momento del diseño, no podemos dejarnos abrumar con todas las excepciones y giros posibles de la lógica de negocio, debemos diseñar el camino feliz, y asumir que habrá excepciones en algún momento. Esto es porque si bien el camino principal suele ser sencillo, los recovecos, bifurcaciones y excepciones suelen ser muchas, muy variadas y a veces difíciles de ver, si el cambio principal y los secundarios están entrelazados obtendremos un código sumamente difícil de comprender.

  • Regla N°18: Mejor herencia que sentencias condicionales (evita el código espagueti)

    4 de febrero de 2019


    El código Espagueti es aquel que tiene un control de flujo demasiado complicado para entenderlo claramente, además de que son prácticamente imposibles de modificar por miedo a que mientras cambiamos algo se estropee otra cosa. El código esta enredado tal como un plato de espagueti, se llega a esta situación (en la actualidad), a base de agregar sentencias if encadenas, grandes y complejas. Ya de por sí, tener dos if encadenados aumenta la complejidad del código y la dificultad de mantenerlo.

    Para evitar que nuestro programa contenga código espagueti debemos evitar usar instrucciones condicionales, cuando estas pueden evitarse usando mecanismos de herencia, "Mejor herencia que condicionales".

  • Regla N°19: Enfoque en el mantenimiento y la escalabilidad antes que en la optimización

    22 de agosto de 2020


    Primero haga que funcione, después hágalo rápido. Esto es cierto incluso si se está seguro de que una trozo de código es realmente importante y se sabe que será un cuello de botella es el sistema. No lo haga. Primero, consiga que el sistema tenga un diseño lo más simple posible. Entonces, si no es suficientemente rápido, optimícelo. Casi siempre descubrirá que «su» cuello de botella no es elproblema. Guarde su tiempo para lo verdaderamente importante. Bruce Eckel, Thinking in C++

    La mantenibilidad son las modificaciones que hacemos a un sistema para que siga funcionando con el propósito para el cual fue diseñado (para resolver la necesidad de el negocio para que fue creado). La escalabilidad es la facilidad con la que podemos agregar nueva funcionalidad a un software para que se adapte a las nuevas necesidades de un mercado y para que nuestro negocio no se quede estancando y obsoleto.

  • Regla Nº20: No depender del llamador, ni de la implementación (evitar acoplamientos)

    13 de marzo de 2021


    Una clase no debe cambiar su comportamiento según quien la consume, igualmente el consumidor de una clase no debiera saber cómo esta implementada internamente dicha clase, para poder consumirla de forma adecuada.

    Idealmente una clase solo se debiera relacionar con otras a través de la definición de los métodos, el cómo hagan esos métodos sus funciones con cosas que nos deben preocupar. Lo anterior se ve claramente cuando podemos sustituir la referencia de una clase, por la referencia a una interface, y cambiar la clase que lo implementan sin mucho (o ningún) impacto.



Si te ha gustado el artículo, compártelo en tus redes sociales ;-)

sábado, 26 de junio de 2021

A 20 años de la creación del manifiesto ágil


En febrero del 2001, varios programadores algo ya hartos de la forma de desarrollar sistemas tradicional y queriendo mejorar por un lado calidad del software y los sistemas y por el otro (y sobretodo) reivindicar el valor de la figura de programador crearon los que se conoció como manifiesto ágil.



Las metodologías de desarrollo de software nacido de la adopción de otras metodologías, pertenecientes a industrias y mercados que llevaba vigentes muchos antes que la creación de sistemas. A pesar de eso el desarrollo del software y su alcance ha aumentado de forma más rápida que cualquier otra industria. Realmente se podría decir que las necesidades del desarrollo de software, han crecido más que la capacidad de adaptarse de los desarrolladores para hacer software.

Originalmente (o más bien en la década setenta), cuando se vio que el desarrollo del software iba a ser imprescindible en el futuro (de una forma u otra) se comenzaron a usar varias metodologías y procesos para la construcción de este. Hay que considerar, que tanto el desarrollo del software, así como el mismo hardware eran recursos muy caros, y frecuentemente de difícil acceso.

Antecedentes clásicos relacionados con la programación



  • Creación de FORTAN en 1954, con un enfoque matemático y científico practico.

  • Creación de COBOL en 1960, con un enfoque hacia los negocios y una clara intención de vender las ventajas de programación a las empresas. Fue un lenguaje usado en los bancos de forma casi exclusiva hasta principios de los 2000.

  • Creación de BASIC en 1964, creado con intención de hacer más humana y accesible los conceptos de programación. Fue extremadamente popular en los 80, donde prácticamente cada ordenador personal tenia instalo una versión de BASIC

  • Gestación de la programación estructurada, durante toda la década de los 70: Una nueva visión de la forma de programar que abogaba (entre otras cosas) por la eliminación de programación goto.

  • Creación de Pascal en 1969: El lenguaje de programación que mejor implemento la programación estructurada, y uno de los más limpios y claros existentes. Tuvo varias evoluciones y actualmente es raro verlo implementado de forma empresarial.

  • Creación de C en 1970, A fecha de hoy una de los lenguajes más importantes, y inspiración de multitud de lenguajes actuales.

  • Creación de Unix en 1970: Uno de los sistemas operativos mas importantes y igualmente fuente de inspiración para multitud de sistemas operativos.

  • Creación de C++ en 1983: Extensión del lenguaje C, con multitud de nuevas características, además del uso de programación orientada a objetos, extendiese su uso bastante en los 80 y sobre todo en los 90, se en la base de multitud de sistemas y desarrollos.

  • Creación de SQL en 1986, Estándar para realizar consultas a las bases de datos, independiente del motor de esta y de los sistemas de la consulta. Se extendió su uso masivamente en los 90. El hecho de proporcionar una abstracción entre los datos y los programas, fue un hito importante, en una nueva concepción de cómo debieran estructurarse los sistemas.


Las necesidades y lenguajes iban evolucionando en los 70, 80 y 90. También debemos entender que realizar software era complicado, muchas veces debiendo aprender sobre la marcha e intentando adaptar métodos y formas propias de otras ramas, que no tenían por qué funcionar en el desarrollo de software.

Antecedentes que ocurrieron en los años 90



  • Implantación de Windows: Si bien Windows se gesto creo en los 80, su versión Windows 95 fue una atentica revolución, tanto en nivel mediático como en la amplitud de los hogares que tuvieron este sistema instalado en sus computadoras.

  • Regreso de Steve Jobs a Apple: Después de su despido en los 80, Steve Jobs regreso en 1997 a una Apple, que había perdido completamente su brillo y empuje inicial. Después de ciertas alianzas (algunas algo muy sorpresivas como con Microsoft) y de cambiar la visión y su enfoque comercial, tuvieron (y tienen) un gran impacto en la computación domestica, celular y la industria del entretenimiento de las dos siguientes décadas.

  • Programación Extrema (XP): Creada a finales de los 90, y predecesora inmediata de las metodologías agiles. Implica (entre otras cosas) la simplificad del código, la comunicación efectiva entre los codificadores y el cliente y de la importancia de las pruebas unitarias

  • Java: Java es un lenguaje/arquitectura creada en el 1996. En los 90 era muy popular el uso de C, C++ (y ASM), para la generación de programas y sistemas embebidos, pero tenía varios problemas y es que cada sistema operativo y dispositivo tenían su propias librerías, tamaños de números (y punteros), gestores de memoria y de hardware, lo que hacía que un programa escrito en C (o C++), fuera incompatible con otro. El nacimiento de Java prometía que un programa sería compatible con multitud de dispositivos, fue creado de cero con una inspiración clara de de C++, pero quitando todo lo que hacía difícil y propenso a fallar, con la intención de simplificar el desarrollo de software. En las siguientes décadas fue un lenguaje muy importante en el desarrollo WEB, en la renovación de los sistemas empresariales (principalmente en el sector bancario), y de diversas formas en los dispositivos móviles, igualmente (y a aunque no fueron los primeros en hacerlo), en el uso de componentes desplegables e instalables fácilmente desde internet. Popularizo a que fuera un lenguaje en que siempre encuentras una herramienta (o frameworks) para resolver casi cualquier problema.

  • Visual Basic: Microsoft tiene una relación muy estrecha con BASIC, fue uno de los primeros programas que vendió y ha incluido durante años versiones de Basic en sus sistemas operativos (GWBASIC, QBASIC, QuickBASIC). Visual Basic Clásico estuvo disponible desde el 92 hasta el 98, donde fue adoptado por muchas empresas para la creación de software, como puntos positivos presento un IDE muy sencillo de manejar, una serie de componente gráficos ampliable y fáciles de implementar, y sobretodo un esquema de acceso a base de datos unificado llamado ADO, común para cualquier motor de base de datos.

  • Efecto 2000: Originalmente y al ser la memoria un recurso limitado se usaban solo dos dígitos para representar el año de las fechas, por ejemplo 80, era 1980, esta circunstancia provocaría que los sistemas asumieran que él año 2000, era erróneamente el años 1900, provocando problemas en el manejo de las fecha, los plazos y el tiempo. Así se crearon muchos sistemas y lenguajes de programación. Entre estos lenguajes estaba COBOL, que era además el más usado en los sistemas bancarios (donde las fechas son realmente muy importantes), si bien se parcharon con más o menos dificultad los sistemas (al final el tan anunciado efecto no fue para tanto), Provoco como efecto colateral que hubiera una migración hacia otras tecnologías y sistemas, además de otras visión de cómo como debiera consumirse el software y las aplicaciones siendo más móvil, mas des localizado, interconectado y sobretodo mas usando entre la población general, convirtiéndose a fecha actual, en algo imprescindible en sus vidas

  • Internet y la WWW: Aproximadamente en el 92 se crea la WWW y unos años después se crea comienza a difundir domestica internet a través de un boom de proveedores comerciales. Inicialmente el contenido era tremendamente estático, pero años después el contenido fue evolucionado hacia algo más dinámico e interactivo, conocido como la Web 2.0, en la que el usuario es el centro de la información, creándose contenido por y para él.

  • Linux y el auge del Open Source: El concepto del código abierto se creó en los 80, con la finalidad de tener acceso al código fuente y tener el derecho de modificarlo y distribuirlo libremente, el movimiento tuvo un auge real (y comercial) por la creación del Linux (que es un kernel y no un sistema operativo como tal), por Linus Torval en el 91. A finales de los 90 y a principio de los 2000, la combinación de Linux y GNU se hizo extremadamente popular para los servidores y para una nueva visión de la informática basada en la nube. En la década pasada (los 2010), empresas que clásicamente se habían opuesto al software libre, como Microsoft entraron de lleno en este modelo y visión de desarrollo.

  • Patrones de software: Los patrones de software son “formulas” conocidas, prácticas y probadas en los que un programa (un código fuente) funciona de forma exitosa. Son “recetas” que si las seguimos tendremos éxito en la solución de un problema especifico. En el 90 se publica el libro Gang of Four (GoF), y a partir de los mediados de los 2000 se populariza el uso de patrones (quizás de una forma exagerada en algunos casos).

Creación del manifiesto ágil


Los preámbulos anteriores nos dan a entender que en un futuro próximo la informática y los sistemas, se iban a convertir en una de las partes centrales de nuestra vida (personal y laboral), prácticamente la totalidad de los negocios y empresas a lo largo del mundo esta gestionados por un sistemas software, y ¡qué decir de la cantidad de dispositivos móviles que existen por persona!

La situación era que a finales de los 90, y con pensamientos y técnicas obsoletas de desarrollo de software era imposible llegar cumplir las necesidades presentes y futuras del mercado. Es más, la falta de compresión de la labor exacta del programador y la importancia e impacto de su trabajo (además de un exceso de profesionales técnicos que se dio debido al efecto de la burbuja .com y su futura explosión) hizo que se crearan sentimiento de desasociacion, falta de pertenencia (a la empresa y sus objetivos) por parte del informático, y un sentimiento de frustración por parte del empresario y gestor del negocio que no obtenía lo que quería.

El 12 de febrero de 2001, diecisiete programadores (algunos muy importantes a futuro), se reunieron con la intención de mejorar la visión del desarrollo de software. En cierto sentido están hartos de las metodologías pesadas, llenas de documentación, burocracia y protocolos que limitaban el tiempo y el impacto de lo que mejor sabían hacer, crear software.

Lo que crearon es conocido como el manifiesto ágil, que tiene las siguientes premisas básicas.

  • Individuos e interacciones sobre procesos y herramientas

  • Software funcionando sobre documentación extensiva

  • Colaboración con el cliente sobre negociación contractual

  • Respuesta ante el cambio sobre seguir un plan


A lo que se refiere el manifiesto es que si bien los elementos de la derecha son importantes, los elementos de la izquierda deben estar por encima.

Individuos e interacciones sobre procesos y herramientas


Si hay algo que odie mas en el desarrollo de software es la burocracia, a veces olvidamos que los proceso fueren creados para facilitar el trabajo, para ser un reflejo del las tareas y sus pasos para resolver problemas, y sin embargo parece que el trabajo fue creado para “cumplir” el proceso.

Decía Sun Tzu, en el arte de la guerra, que nadie espera una orden para apagar un fuego. Las necesidad se imponen sobre los procesos y los individuos resuelven necesidades.

A veces hasta el más mínimo cambio o mejora se ve “ahogada” entre una montaña inmensa de procesos burocráticos, correos, documentos, validaciones y “visto Buenos”, que hace que francamente sea más costosos resolverla, que dejarlo pasar.

La iniciativa individual y colectiva se ve detenida por procesos que se interponen por ser “procesos”, más que por ser necesarios.

Muchas veces el proceso crea un cerco de “responsabilidad” que nos hace indiferentes a las “responsabilidad” y necesidades de nuestros compañeros, creemos que nuestro trabajo es seguir unos procesos específicos y asignados a nosotros, y no comprendemos que nuestro trabajo solo tiene sentido al integrarse con el trabajo de nuestros compañeros.

Recuerdo un proyecto cuando ejercería de programador en que el líder de proyecto, proporcionaba los requisitos del sistema, el sistema en si debía conectarse con otro sistema que esta construyendo otro equipo (con su propio líder de proyecto) , la comunicación entre equipos era prácticamente inexistente, todo se tenía que hacer a trajes del líder del proyecto y mediante documentos formales, después de muchas horas extra, trabajar sin tener claro el objetivo y muchos cambios de definición, el resultado al momento de las pruebas, fue que nada encajaba con nada y había que rehacer mucha partes tanto desde el lado del código fuente, como desde el lado del diseño. Todo esto se podría haber evitado dan prioridad (y reconociendo) a los integrantes de cada equipo y fomentando la comunicación entre ellos en lugar de seguir a raja tabla los procesos.

Software funcionando sobre documentación extensiva


Uno de los motivos que ms me ha tocado vivir y por los que un software no sale de la forma deseada o en el tiempo requerido, es querer definirlo y documentarlo completamente antes de construirlo.

En las metodólogas pesadas el orden donde ocurren las cosas es muy claro, primero el análisis, después el diseño y posteriormente la construcción y la pruebas.

También una de las frases que más se repiten en el desarrollo de software es “No hagas nada, sin tener claro todo lo que vas a hacer”. La verdad es que casi nunca podemos tener claro al 100% lo que vamos a hacer.

Posiblemente lo anterior funcione en otro tipo de proyectos de ingeniera, pero no en desarrollo de software.

Lo cierto que es que un problema no se entiende nunca completamente hasta que está resuelto.

Por norma general un cliente siente que tiene una necesidad (una carencia que necesita ser resulta), pero es muy raro que sepa cómo resolverla, e incluso que sepa de forma precisa que necesita. El desarrollador por otro lado desconoce la naturaleza del negocio del problema que necesita resolver.

La programación ágil, apuesta por comenzar a programar cuando antes, buscando hacer entregas que puedan estar productivas cada pocas semanas, cada entrega se acerca más a la solución final, y no permitirte no tener que avanzar mucho antes de darnos cuenta que vamos en mal camino, porque créenme no hay nada peor que estar meses en un proyecto y al momento de entregarlo ver que no le sirve al cliente, y que el trabajo de un equipo fue en vano, no generando satisfacción en ninguno de los implicados.

Colaboración con el cliente sobre negociación contractual


Una vez tuve que trabajar con una empresa que se contrato para desarrollar un producto web (es decir en este caso nosotros éramos el cliente). La relación con la empresa fue complicada, porque ellos a la vez contrataron a unos programadores externos (de otra empresa) para resolver el problema, con lo que había una seria de escalones burocráticos y contractuales entre nosotros y los que realmente hacían la pagina web.

Una de las discusiones que mas me saco de quicio, fue cuando les pedí que limitara la entrada de un cuadro de texto, para que fuera acorde con el tamaño del campo relacionado en la base de la base de datos, la empresa quería cobrarnos un precio adicional por que eso no está especificado en la definición, yo alegaba que no era necesario que se lo especificamos por que era un requisito no funcional que debería haberse detectado por ellos y no por nosotros. Total al final fue más fácil pagarles, y nunca volver a trabajar con ellos.

El caso es que el trato no fue beneficios para ninguna de las partes, ni para nosotros que no obtuvimos el producto que necesitamos, ni para la empresa desarrolladora ya que no volvimos a colaborar con ellos.

La programación ágil propone un acercamiento constante con el cliente, se asume que no se comprende al cliente a través de definiciones, sino de prototipos funcionales, se colabora con el cliente para poder crear un software que sea satisfactorio.

Evidentemente en este punto surgen dudas sobre cuál es el límite de aceptación de lo que si hay que programar, y lo que no, sobre todo por motivos de recursos.

Y aquí hay tener claro que estamos resolviendo una necesidad en concreto, todo lo que nos acerque a esa resolución es positivo, lo que nos aleje es negativo. Por ejemplo se deben evitar y postergar en la medida de los posible, soluciones que parecen mágicas, para casos extraordinarios y inverosímiles que rara vez pasan, y centrarnos en los que pasa la mayoría de las veces. Esto se relación con el principio de paleto, que resumiendo es que el 80% de la funcionalidad de un sistema, es suplicada por el 20% por cierto del código de dicho sistema.

Cuando un cliente ve su software funcionando se olvida rápidamente de idea, casos de uso y caminos extraños para su sistema que no llevan a ninguna parte. Cuando está definiendo todo completamente al principio del proyecto, se pierde en callejones que no llevan a nada, y que en la práctica requieren un enorme esfuerzo de desarrollo y recursos, para el beneficio real que producen.

Respuesta ante el cambio sobre seguir un plan


El cambio esta inherentemente ligado al desarrollo del software, sobre todo al desarrollo de software empresarial. La velocidad con la cambian los mercados y los consumidores hacen que el software deba adaptarse rápidamente para por tener valor.

Pero en el desarrollo de un sistema especifico, hay que entender que cuando más se avanza en la construcción de un sistemas, mas se comprende las necesidades y eso lleva a cambios, y adecuaciones, cuando mejor sea la arquitectura de un sistemas, mas fácil es esto. Esto es siempre así, se realicen se realice en un escenario ágil o no.

Como vemos todos los puntos están relacionados entre sí, el disminuir el análisis inicial y generar entregas continuas que generen valor, no solo nos ayuda a resolver más rápido el problema y a comprenderlo menor, sino además a descartar las ideas iniciales que pudiera tener el cliente, y que realmente no solucionarían su problema. Aunque parezca una contracción las entregas incrementales y un acercamiento al problema por partes minimiza los cambios que hay que realizar en el proyecto. En una metodología pesada los cambios serian solicitados al final, cuando la fecha de entrega esta sobre nosotros, y las modificaciones a realizar pueden tener mayor impacto.

Perspectiva a 20 años del manifiesto



Es estas dos décadas, la tecnología no ha dejado de evolucionar y de ser adoptada masivamente, tenemos la implementación casi total de internet, la web 2.0, las redes sociales, la conexión las 24 horas y la demanda en línea de servicios, entre otras cosas.

Las metodólogas agiles han sido ideales para conseguir esta unión entre tecnología y sociedad.

Han surgido nuevos enfoques de desarrollo de software, y herramientas maravillosas, que nos permiten comunicarnos más fácilmente, y de diversas formas.

Pero también existieron puntos negativos, si bien el manifiesto apareció como una reivindicación de la figura del programador y su importancia dentro del desarrollo de software, poco a poco se uso la palabra ágil para definir tareas de gestión y administración de diversa índole (y en muchos conceptos), quedando la palabra “hueca” en sus significado, casi convirtiéndose en una idea genérica, abstracta y vende humos, más que en una cosa real y practica.

Hay considerar siempre al programador, su experiencia, y su potencial, como le elemento central y principal del desarrollo de software ágil, y la clave del éxito para crear software de calidad.




Si te ha gustado la entrada, ¡Compártela! ;-)

sábado, 28 de noviembre de 2020

Modelos de trabajo para un desarrollador de software

Este articulo trata sobre las distintas formas y modelos de trabajo que como desarrolladores de software podemos desempeñar. Está escrito desde un punto de vista personal, repasando y exponiendo modelos de trabajo en los que de una forma u otra me he visto involucrado. Hay que considerar que dependiendo de cada país estos modelos pudieran cambiar e incluso ser más laxos o rígidos que otros en el cumplimiento de normas y leyes.


Existen formas explicar que es el trabajo, podemos considerar que es la labor y tareas que realizamos con la intención de recibir una remuneración económica.

Existe la falsa creencia que debemos ganar de forma proporcional por los conocimientos que tenemos, así que si nos hemos esforzado mucho y hemos estudiado deberíamos ganar mucho dinero, y si bien eso suena lógico y hasta justo, no es cómo funciona el mercado laboral. Los conocimientos y los estudios que tengamos, son solo una herramienta que vamos a usar en nuestra profesión, pero lo cierto es que en el mercado se nos pagara por lo que “hagamos”, no porque lo “sabemos”. Se cumplirían varias reglas:

  • Si existe mucha gente que sepa hacer lo mismo que nosotros (independientemente si para saber hacer eso mismo hemos “estudiado” mucho), cobraremos poco.

  • Si existe poca gente que sepa pueda lo mismo que nosotros, cobraremos mucho.

  • Si existe poco gente que pueda hacer lo mismo que nosotros, y lo que podemos hacer no es de interés para otras personas, puede que tengamos un hobby interesante.

Lo anterior es una simplificación de la ley de la oferta y de la demanda, aplicada a nuestra profesión.

Pero al margen de esa regla tenemos varios problemas adicionales que influyen con respecto a los sueldos que cobramos en nuestra profesión:

  • Nuestro trabajo llevaba décadas en alza, es decir la demanda de informáticos siempre ha crecido, particularmente esta creció de forma más rápida en los 90 y a principio de los 2000, donde además hubo una crisis llamada burbuja puntocom (además de otras crisis inmobiliarias debido a especuladores que puso varias veces en jaque a la economía mundial). Todo esto hizo que en la actualidad haya muchos informáticos y desarrolladores de software.

  • A pensar del anterior, los sistemas que desarrollamos no son siempre valorados como se debiera, debido a varios motivos; uno de ellos es que parece que hay una reticencia a que un usuario comprenda exactamente qué es lo que hacemos. Muchas profesiones con las que interactuamos como adultos se comprende “intuitivamente” (aun de forma superficial), comprendemos que hace que hacer un contable, un médico o un abogado, pero a frecuentemente (para una persona que no se dedica a los sistemas informativos) comprender que hacemos realmente los desarrolladores de software. Por otro lado la creación de sistemas generalmente crea un valor indirecto, es decir se crea un sistema para que sostenga un negocio, el cual es que el genera el valor directo (el dinero en sí). Por eso es difícil relacionar el costo de un sistema, con los beneficios económicos que produce.

  • Por otro lado la programadores somos personas realmente muy entusiastas con nuestra profesiones. Disfrutamos programar, lo cual es bueno en un sentido, pero malo en otro, ya que no alcanzan a valorar por si mismos el costo de su trabajo, ya que este suele ser gratificante.

  • Por último, y de forma más trágica, parece que nuestra profesión es la única en la que experiencia y madurez no significan mayores posibilidades de conseguir un trabajo. Nuestro trabajo, esta asociado con el cambio, la evolución, y de cierta forma con la juventud. Muchas empresas descartan contratar a gente a partir de cierta edad. Esto puede ser por varios motivos, pero el exceso de informativo graduados, la renovación tecnología constantes, y que en general es más barato contratar a una persona sin experiencia excesiva, hacen que las contrataciones sean muy desfavorables para la gente madura, con ya amplia trayectoria en el mercado laboral.

Hay que tener en cuenta los dos escenarios (la ley de la oferta y la demanda y las particularidades de nuestra profesión), para conseguir un salario digno y justo, y que podamos garantizarnos un ingreso fijo y constante en nuestro futuro.

Consultorías de software


Las consultorías son empresas expertas en el desarrollo de software que ofrecen su accesoria a otras empresas (de otros rublos), para la implementación adecuada de sistemas en sus negocios.

Esa “asesoría” puede tener muchas facetas, desde lo que es realmente una “asesoría”, incluyendo la venta y personalización de sistemas “prefabricados”, que se adapten a las necesidades del cliente hasta la creación de sistemas a medidas.

También es posible que el modelo de consultaría se acabe pareciendo mas a un modelo de “outsourcing”.

Los empleados trabajan para la consultaría y no para el cliente, toman los requisitos, los analizan y se presenta una proyecto que acaba implementando.

Una de las ventajas de la consultoría, es que son proyectos (en principio limitados), con un principio y un fin, y generalmente tiene cierta independencia en cuanto al desarrollo de este (siempre que cumpla con lo estipulado en plazos y recursos). Se puede decir que los codificadores cambiar de proyecto y el trabajo no se vuelve rutinario, hace que estén siempre estén “despiertos”, y buscando formas interesantes de resolver los problemas.

Otra de las ventajas es que al ser la consultoría un negocio dedicado a la creación de sistemas, los jefes y empleados, hablan un lenguaje semejante y que ambos entienden, lo que suele ser un alivio en muchas formas.

En cuanto al sueldo y el tipo de contrato, no suele hacer restricciones en este aspecto, es decir podría darse de cualquier forma, desde empleados fijos a empleados temporales (por proyecto), pero si suele haber un límite en lo que respecta al sueldo de los programadores (para que los productos que vendan suelan ser rentables).

Outsourcing o subcontratación de recursos humanos



La subcontratación, es el proceso en él que una empresa delega la resolución de un problema o una necesidad a una segunda empresa. Digamos que le “comprar” el trabajo.

La subcontratación tiene muchas facetas, y suele cambiar según la legislación del país, llegando a ser en algunos casos muy controversial.

Una empresa requiere un software, o alguna otra necesidad relacionada con el desarrollo de software, pero no quiere contratar nuevos recursos (con recursos nos referimos a específicamente a codificadores), porque eso requiere adquirir una seria de responsabilidades hacia ellos, como realizar un contrato temporal (para dar paso según la legislación a uno definitivo), a pagar vacaciones, enfermedades, impuestos y prestación social de diversa forma.

Lo anterior hace que no resulte atractivo a la empresa contratar recursos, ahí es donde entra el outsourcing, que contrata a la gente, y la pone a trabajar para la empresa, pero absorbiendo todas las responsabilidades con respeto al empleado (que formalmente pertenece al outsourcing).

Aquí es donde reside uno de los problemas principales en el outsourcing, y es que tiene que compensar para ambas partes, es decir la empresa subcontrata los recursos, porque el coste que le supone es menor que la contratación directa, el outsourcing ofrece sus servicio y asume la responsabilidad con los empleados, porque también le compensa económicamente, ¿Cómo es posible que compense a los dos, cuando en ambos lados, hay un costo económico?, impactando en el salario del programador. El outsourcing cobra a la empresa un costo que es atractivo para ambas partes, y de ese costo debe sacar su ganancia y pagar al codificador.

El outsourcing suele ser atractivo para recién egresados, o personas que están buscando su primer trabajo, ya que las empresas de esta índole suelen siempre buscar recursos para ofrecer a las empresas (y no son muy exigentes en cuanto a los requisitos o la experiencia) y los nuevos ingenieros buscan una oportunidad para obtener experiencia en el mercado laboral y comenzar una carrera.

Antes aceptar un trabajo en una empresa outsourcing revisa bien si te conviene a corto, mediano y largo plazo, y haz una estrategia que sea atractiva a tus intereses.

Se puede ubicar el tema de outsourcing en dos ramas principalmente.

Outsourcing para proyectos concretos


La empresa tiene la necesidad de desarrollar un proyecto de software muy concreto, con lo que contacta una empresa de outsourcing (que en este escenario trabaja más como una consultoría), y pone a disposición de su cliente los recursos necesarios para poder realizar su sistema.

El cliente puede intervenir en el desarrollo en menor o mayor medida. El outsourcing puede usar empleados fijos para que gestionen el proyecto (normalmente son los mas veteranos), y contratar otros exclusivamente para el proyecto.

En estos momentos y debido a que es un proyecto cerrado, generalmente tiene un cotos fijo, y en base de ese costo puede permitirse pagar más a las personas que contrata temporalmente pero es posible que su contrato finalice con la finalización del proyecto.

Outsourcing de recursos humanos


Aquí es cuando la empresa no necesita un desarrollo de software en particular, ni la asesoría en cuanto a tecnologías y sistemas. Lo que necesita la empresa son programadores que saque el trabajo según su control y especificaciones.

Básicamente son empleados mas, que trabajaba con la empresa, generalmente in situ, para sacar sus requerimos en la forma que esta lo necesite, pero siendo su empleador el outsourcing, la cual como comentamos tiene todas las obligaciones.

En este caso el sueldo del programador tienen que a ser menor, debido a que hay un intermediario entre el que pone el dinero (la empresa) y la que lo gestiona (el outsourcing).

El empleo puede ser temporal debido a que la empresa podría no requerir a los recursos en cualquier tiempo, aunque la verdad es que no suele ser así. Las necesidades de sistemas de las empresas no van a disminuir, sino mas bien a aumentar, con lo que el trabajo se acaba convirtiendo en una suerte de fijo, en el que el programador esta asignado a la empresa sin fecha de finalización. Es fijo en la práctica, pero no de forma contractual, con lo hay que considerar las posibilidades que esto lleva, una de ella es que la empresa decida cambiar de proveedor de outsourcing (porque le convenga mas, o sea más barata), en dicho caso el puesto sigue existiendo, pero es puede que se reemplace al programador por otro de la nueva empresa.

Otros de los problemas es la faltan de identificación, y la sensación de no pertenencia del programador con respecto a la empresa y viceversa. En muchos casos la empresa de outsourcing se dedica a encontrar recursos para otras empresas, y una vez que los tiene localizados, los manda a trabajar directamente en sus asignaciones con el cliente, aquí se da un problema en el que el programador no siente pertenecer a la empresa del cliente (donde realmente trabaja), ni a la empresa de outsourcing donde apenas pasa tiempo (y muchas veces no es conocido).

Empleado de una empresa cuyo giro no sean los sistemas



Hay que considerar que todas las empresas tienen necesidades en cuanto a software, pueden comprar software o paquetes pre construidos, pero llegara un momento en el que si empresa quiere impactar en el mercado, necesitara software personalizado a sus necesidades específicas.

Generalmente cuando la empresa llega a la conclusión que necesita un equipo de desarrollo in situ, ha pasado ya por varias fases:
  • Comprar software establecido en el mercado, que se acerque a las necesidades de su negocio.

  • De alguna manera contratar o pagar a un tercero para que gestione o personalice el software anterior, para que se ajuste a sus necesidades reales.

  • Darse cuenta que requieren un sistema más personalizado. Necesitamos que el sistema se adapte a su negocio, y no que el negocio se adapte a los que pueda hacer el sistema.

  • Contratar a alguna consultoría para que cree software específico para su negocio (cuyo propietario real es la empresa).

Cuando la empresa se da cuenta que requiere algo más cercano a sus necesidades y que le preste atención en el momento que lo necesitan, se plantea tener un equipo propio de desarrollo.

En proceso de tener un equipo propio de desarrollo también pasa por varias fases:

  • Creación de un equipo de soporte de infraestructura (tal como redes, impresoras, etc.).

  • El equipo de infraestructura da soporte al software y sistemas adquiridos

  • Se crea un subequipo de desarrollo de software, pero la mismas personas que dan soporte a la infraestructura, es la genera el software, es decir los roles están “mezclados” y son intercambiables.

  • Se crea una división real entre el equipo de soporte y el de desarrollo de software.

  • El equipo de desarrollo de software se organiza en una estructura que contenga los roles clásicos tales como líderes de proyecto, codificadores, analistas, testers…

Hay que ser consciente que no todas las empresas llevan a la última fase (o alguna de las anteriores), los dueños de la empresa no quieren obtener un equipo de desarrollo maduro, lo que quieren es vender su producto. También es cierto que los responsables del negocio no son expertos en sistemas, con lo que a veces es difícil convencerlos de las ventajas de tener un nivel de madurez en el equipo de desarrollo.

Debido a que la mejora en procesos, metodologías y tecnologías no tiene una ganancia directa en la empresa, los propietarios del negocio, no suele querer hacer cambios y mejoras (que serian evidentes para una empresa tecnológica), y podemos caer en una obsolescencia tecnología que estanque el negocio.

Es necesario saber “vender”, la ganancia de la evolución tecnológica continua en la empresa, y tener estrategias para hacer que la empresa (que insisto no está interesada en cambios tecnológicos), los pueda adquirir de la mejor manera y de la forma más sana, de no ser así, las tensiones entre los equipos de desarrollo (que conocen las necesidades de los sistemas) y las de los dueños o trabajadores (que conocen las necesidades de negocio), irán en aumento, haciendo difícil que ambas partes puedan cumplir con sus responsabilidades.

Otro problema es que el propietario de la empresa paga sueldos (nominas), y no paga directamente por software, por que se corre el riesgo que no valore correctamente lo que cuesta hacer software, y se subestime su precio real.

Freelance o autónomo


Es el trabajador que se establece por su cuenta, el vende su trabajo directamente a un cliente, y recibe su cobro.

Las ventajas de esta forma de trabajo son evidentes, libertad en cuento sus decisiones y gestión de su tiempo y recursos, con el añadido de que cualquier esfuerzo adicional que se haga para tu trabajo, es realmente para él.

  • Las desventajas son muy variadas:

  • El autónomo tiene que localizar a su cliente, a la vez que resuelve las necesidades de los clientes actuales.

  • El autónomo tiene que enfrentarse a circunstancias que no tienen que ver directamente con su trabajo, como son responsabilidades financieras y legales, que podrían no ser su fuerte, y a veces no tener tiempo para atenderlas.

  • La más evidente, su ingreso económico depende de su trabajo, si se enferma, o no consigue clientes, no recibirá ingresos, lo cual puede colocarle en una situación dedicada.

Es posible (y muy probable) que el autónomo compagine su trabajo como independiente, con otro trabajo como empleado de algún tipo, de forma que tenga un ingreso fijo, mientras que intenta emprender proyectos propios. Esta es la forma más segura de poder comenzar pero requiere muchas disciplinas, es difícil “quedar bien” con dos jefes (aunque uno de ellos seas tú mismo).

Debido a las complejidades anteriores, varios autónomos se suelen asociar para poder llevar acabo todas las tareas de forma más sencilla, puede que uno se encargue de los asuntos del negocio y otro de los asuntos tecnológico, o dividirse el trabajo entre todos. Esta quizás es la mejor forma, que permite equilibrar las funciones y responsabilidades de cada uno y demás tener el apoyo de un compañero. Por otro lado hay que tener en cuenta que las circunstancia pueden volverse tensas, y generar conflictos facialmente en este tipo de equipos, por eso hay que buscar hacer proyectos con compañeros profesionales y responsable y comportarse así al mismo tiempo. Sin duda habrá contratiempos, pero hay que saber lidiar con ellos, y poder sacar los proyectos adelante.

Empresa propia



Es cuando el desarrollador de software tiene una estructura formal de negocio, con un nombre comercial y empleados que depende de él.

El empresario adquiere unas responsabilidades superiores a las que ha tenido hasta ahora, por que no solo tiene compromisos con sus clientes, sino que además tiene compromisos con sus empleados.

Los productos que pueden vender a un cliente son varios, desde un paquete software prefabricado, a la personalización de alguno, software a la media, o entrar en un esquema de outsourcing donde rente recursos.

Hay que considerar que se puede ser responsable legalmente de los incumplimientos que tengas, ya no solo a nivel personal, si no a nivel empresa. Por ejemplo debemos pagar nominas, y cumplir con los requisitos de ley, aunque nuestro ingreso pueda ser variable.

El ingreso puede, y seguramente, sea variable, esto es por que dependemos del número de contratos que téngannos con otras empresas, así como los proyectos que tengamos en marca. También muchas empresas pueden posponer el pago, ya sea por políticas propia de la empresa, por contrato o por conveniencia. Así que es necesario que se aprendan y se usen herramientas de crédito (lo cual puede llegar a ser otro problema en el futuro).




Si te ha gustado la entrada, ¡Compártela! ;-)

domingo, 15 de diciembre de 2019

Reglas de la Ingeniería de software (índice)


Cuando comencé este blog, lo hice con la intención de facilitar el trabajo de las personas que se dedican al desarrollo de software, de forma profesional. Creo que existen muchos blogs y libros tecnológicos que hablan desde el desarrollo de software desde un punto de vista académico y teórico, pero muy pocos que lo atacan desde un punto de vista laboral (sobre todo en español).

Desde hace bastantes años, tengo ciertas labores de “tutelaje”, intentando ayudar a nuevos profesionales, a que vean el panorama completo desarrollo de software empresarial. Con base a eso, comencé a elaborar una serie de “Reglas de la Ingeniería de Software”, puntos cuya lectura nos ayudarían a hacer software de calidad en un tiempo razonable. Se analizaba todo los que nos llevaba al éxito y los que nos llevaba al fracaso (y creedme he estado en ambos tipos de proyectos), y se intentaba sintetizar en un punto fácil de recordar.


Las reglas son de diversa índole, por que abarcan el desarrollo empresarial de software en general. Así que se puede encontrar reglas que hagan referencia a aspectos técnicos de los mismos lenguajes de programación, pero también a aspectos como la gestión del tiempo, la responsabilidad, o la relación entre los integrantes de un equipo de desarrollo.

Algunas reglas pueden parece que están repetidas, esto porque hay una constante que se da en el desarrollo empresarial, que es el cambio rápido y constante en el negocio que abarcan los sistemas, los que provoca cambios en los mismos sistemas, a sus capacidades y sus necesidades, forzándonos a que sea simple y fácil de mantener. Muchas reglas girar en torno a esas ideas, aunque enfocadas cada una desde un punto de vista diferente, aunque parecido.

Por otro lado este es un proyecto vivo, en el que se agregaran, corregirán (y quitaran si es necesario), las reglas que sean necesarias, para mantenerlas coherente y útiles para la vida laboral del desarrollador de software.

Las reglas actuales son las siguientes:

  • Regla N°1: Va a cambiar

    31 de agosto de 2014


    Todo cambia muy rápido en el proceso de desarrollo de un software, el mismo software construido, genera nuevos requisitos, la satisfacción de las necesidades de un proyecto, genera a su vez nuevas necesidades.

    Explicado de otra forma la resolución de un problema, genera un entendimiento más claro de dicho problema, y en esta situación, se abren nuevas posibilidades sobre las capacidades del software y el negocio que sustenta.

  • Regla N°2: Va a fallar

    6 de septiembre de 2014


    Es imposible determinar si cierto software continuara funcionando en un futuro, porque las condiciones en las que se verá envuelto son impredecibles (actualizaciones de software con el que convive, actualizaciones de hardware… incluso la fecha y hora del ordenador).

    Hay que evitar actitudes optimistas con respecto a la posibilidad que ocurran fallos, puesto que es muy probable que estos ocurran, por otro lado considerar que el usuario del sistema hará un uso “lógico” o coherente de este, es un desatino, generalmente nos sorprenderá descubriendo errores, que nunca se nos hubieran pasado por la cabeza.

  • Regla N°3: Se va a mantener

    15 de septiembre de 2014


    El tiempo que vas a estar creando software nuevo, es incomparablemente menor al tiempo que vas a estar manteniéndolo.

    Gran parte nuestros esfuerzos de desarrollo van a estar enfocados en el mantenimiento de código que bien puede ser código ajeno o código de otras personas.

  • Regla N°4: Todo sistema tiene un propósito

    21 de septiembre de 2014


    Es común que olvidemos que lo que estamos creando no es un conjunto de variables, y líneas de código, sino que tiene que un significado y relevancia especial fuera del lenguaje de programación en el que los estamos creando. Por ejemplo, una trasferencia bancaria de un millón de dólares errónea no es una posición de memoria mal inicializada, sino que puede ser una pérdida real, o un sistema médico de monitores mal construido puede poner en juego vidas humanas. Hay que pensar en nuestros sistemas por lo que van a poner aportar en un negocio o los problemas que van a poder resolver y no como simples entes tecnológicos.

  • Regla N°5: No te repitas

    28 de septiembre de 2014


    La regla "No te repitas", hace referencia a que no se deben repetir porciones de código, con funcionalidades iguales, "casi iguales", o parecidas a los largo del código. Aunque técnicamente funcione y de el resultado correcto, aumenta el grado de "degeneración del software" (el tiempo en que se echa a perder un software, hasta que ya no es útil su funcionalidad).

  • Regla N° 6: Lo importante es el "Que hace" y no el "Como lo hace"

    16 de octubre de 2014


    En la programación orientada a objetos, se diseñan elementos, donde prima la representación de "Que es lo que hace" y "Que son", principalmente, a través de sus atributos y sus métodos. también se establece como se relacionan con otros tipos de elementos (o clases), ya sea mediante técnicas como la composición, la herencia, o el envió y recepción de mensajes.

    De esta forma centrándonos en "Que hace" obtenemos una comprensión mas clara del sistema, y de sus requisitos, además construiremos un sistemas más escalable (debido a que no nos estamos centrando en "Como lo hace"). Inclusive tendremos muchas más posibilidades de conectarnos a otros sistemas, puesto que queda mas claramente establecidos los limites y conectores de estos.

  • Regla N°7: Primero los objetos, después las base de datos

    2 de enero de 2015


    El enfoque más idóneo para comenzar un sistema, es el diseño de los objetos o las clases de los que se va a constituir nuestros sistemas. Generalmente al comienzo del diseño, tenemos una idea de cómo queremos hacer las cosas, dicha idea no tiene que estar completa, y cuanto más avancemos en ella, mas compresión tendremos sobre la misma. Podemos ir reduciendo el nivel de abstracción según los necesitemos. Igualmente podemos usar relaciones de objetos, ya sea de jerarquía (herencia) o de contención (un objeto contiene a otro, o a varios). Y lo más importante, se comprende que los datos, van de la mano de las operaciones (funcionalidad), y se diseña el sistema de dicha forma.

  • Regla N°8: El entusiasmo da el conocimiento, el conocimiento sin entusiasmo no sirve de nada

    19 de julio de 2015


    El conocimiento sin entusiasmo es, en el mejor de los casos, fortuito, y casi nunca podrá convertirse en algo útil para el negocio, en sistemas y herramientas funcionalidades que creen una diferencia significativa. En la mayoría de los casos lo único que podrá realizarse sin entusiasmo es lo que yo llamo “tareas de escuela”, programas técnicamente correctos, hechos según un enunciado claro como una receta, pero que no sirve en la práctica de absolutamente nada, que son imposibles de encajar en un ambiente laboral real. En última instancia los conocimientos, y más en esta profesión, son caducos.

  • Regla N°9: Los warnings de hoy son los errores de mañana (programa sin warning)

    8 de agosto de 2015


    Cuando me enfrento al mantenimiento de código realizado por diversos equipos de trabajo (y he de reconocer que no con menos frecuencia al creado por mi), me encuentro con que al compilar, existe un excesivo número de advertencias (excesivo son más de 200 o incluso mas). Advertencias que se han ido creando a lo largo del tiempo y que nadie se ha molestado en revisar jamás, acumulándose más y más cuanto más codificadores mueven el sistema. Generalmente nadie toca dichos warning debido al temor que entraña "mover" algo cuyo sentido desconocemos (el hecho que lo desconozcamos ya debiera hacer saltar la alarma). Bueno, si existe el warning, seguramente no tenga ningún significado oculto y simplemente es una omisión no intencional que deba ser corregida.

    Los warnings se acumulan a lo largo de los años y el número dificulta entender claramente lo que nos están indicando, cuanto más warnings haya, menos casos les haremos, hasta que uno de esos warnings realmente representen un potencial problema en producción que se nos pase completamente desapercibido, convirtiéndose en un dolor de cabeza (con suerte) o en algo más grave, porque "los warnings de ahora son los errores de mañana".

  • Regla N°10: Si no es sencillo está mal hecho

    1 de diciembre de 2015


    El desarrollo de un software tiende a complicarse… a complicarse mucho. Se complica sacar el proyecto a tiempo, se complica las relaciones con el equipo de trabajo, con los proveedores o con los recursos. Debemos mantener esa complejidad bajo control, teniendo en la mente que todo lo que hagamos cumplir la regla "Si no es sencillo, está mal hecho".

    La sencillez muchas veces se confunde. Sencillez no quiere decir fácil, es casi siempre lo contrario. Es difícil hacer las cosas sencillas. Casi siempre invertir en sencillez es un proceso costoso al principio y ventajoso al final del proyecto. El objetivo de esta regla es conseguir sistemas que estén guiados por la sencillez.

  • Regla N°11: El primer código es para entender el problema, los restantes para hacerlo bien

    5 de febrero de 2017


    Como defensor del las metodologías agiles, creo que la mejor forma de comprender un problema es descomponiéndolo en problemas más sencillos y solucionándolos uno a uno.

    Esto implica que hasta que no tengamos algo de código listo, no comprenderemos exactamente la necesidad que estamos intentando suplir. Es más, el ver la necesidad resulta, pueda cambiar los requisitos y la percepción sobre el problema real a tratar.

    Los motivos anteriores hacen que el primer código no sea el más optimo, porque su objetivo está más orientado al análisis que a la implementación. La situación en este punto es tenemos un código que nos muestra una solución, pero es una solución temporal y estática (Si hubiera un cambio en los requisitos sería muy difícil de ajustar estar código para atenderlo).

    Es por lo cual necesitamos realizar una segunda revisión del código, en estas caso ya no para resolver el problema de negocio, sino para asegurarnos que nuestro código sea de calidad, cumpliendo los siguientes requisitos:

  • Regla N°12: “Hay que prepararse para la lluvia cuando hace sol” (olvídate de “Si funciona no lo toques”)

    16 de agosto de 2017


    Si funciona no lo toques”, es un refrán bastante popular y además es horrible, promueve una filosofía de conformismo e incluso de cobardía ante el cambio. Me imagino que funcionaria en algún momento, donde tu zona de confort sea enorme. En la actualidad, y particularmente en nuestro negocio, las zonas de confort tienen a hacerse muy pequeñas muy rápidamente.

    ¿Cuándo es el momento de “tocar” algo que funciona?, si crees que es “cuando no funcione”, estas en un error, ese es el peor momento para plantearte cambios. Por la misma circunstancia que “no funciona”, el objetivo, o la prioridad ya no es crear ningún tipo de mejora, si no conseguir que el sistema siga funcionando.

  • Regla N°13: Simplifica las cosas

    10 de noviembre de 2017


    Cuanto te enfrentes a un problema grande, simplifícalo en problemas más pequeños. Si estos problemas siguen siendo demasiado grandes repite el proceso hasta que tengas un problema lo suficientemente pequeño para poderlo resolver.

    Para simplificar partimos siempre de un problema grande que es irresoluble en su tamaño actual, e identificamos las partes que lo componen. Lo dividimos en pequeños problemas que son más fáciles de resolver, repitiendo el proceso hasta que podémonos identificar dichos problemas con una solución clara y sencilla, y además que solo sirva para resolver exclusivamente una necesidad.

  • Regla N°14: Evita la ceguera voluntaria

    16 de diciembre de 2017


    La ceguera voluntaria es ignorar de forma deliberada situaciones que si bien son perjudiciales, no suponen un daño inmediato, con lo que no se hace nada para corregirlas, convirtiéndose en una posible situación catastrófica a futuro.

    Cuando aparecen problemas en mitad de un desarrollo y no son atacados y mitigados cuando son pequeños, aumentaran de forma progresiva hasta ser de tal tamaño que afecte al tiempo, calidad o costo del proyecto.

  • Regla N°15: Haz que las cosas sucedan

    11 de enero de 2018


    Una de las cosas que más afectan al éxito del desarrollo de un sistema es la pasividad y falta de proactividad. Esto es, principalmente, quedarse esperando a que las cosas pasen por si solas.

    Muchas veces existen escenarios de incertidumbre en que no queda claro que es lo tenemos que hacer en cuanto al sistema que se está construyendo, esto puede ser por muchos motivos, puede ser una falta de visibilidad del objetivo real o que no se nos ha comunicado apropiadamente.

    Pero es necesario comprender que mientras el sistema no esté finalizado (satisfaga las necesidades del cliente), hay tareas pendientes que hay que resolver y es responsabilidad de cada integrante del equipo conocer cuáles son y conseguir se lleve a cabo. Es responsabilidad de cada uno hacer que las cosas sucedan.

  • Regla N°16: Por defecto todo es privado (principio de ocultación)

    25 de enero de 2018


    He observado un problema muy común de muchos programadores noveles, escriben la palabra "public" por inercia al momento de crear una nueva funcionalidad, sin pararse realmente a pensar que están haciendo, y solo cuando lo meditan bien escriben "privado". A veces no se dan cuenta de esta circunstancia, otra veces piensan que es más sencillo, si todo es público, a veces incluso piensan que le dan cierto sentido de "libertad", cuando lo que se hace abrir puerta al desastre (la “libertad” la da en todo caso, compartir el código fuente, no habilitar métodos privados como públicos).

  • Regla N°17: Primero el camino principal luego las excepciones

    23 de diciembre de 2018


    Si es bien es cierto que uno se tiene que prepara para los fallos (para que el software falle) la ruta principal (de ejecución) debe ser un camino limpio y fácilmente trazable. Incluso desde el momento del diseño, no podemos dejarnos abrumar con todas las excepciones y giros posibles de la lógica de negocio, debemos diseñar el camino feliz, y asumir que habrá excepciones en algún momento. Esto es porque si bien el camino principal suele ser sencillo, los recovecos, bifurcaciones y excepciones suelen ser muchas, muy variadas y a veces difíciles de ver, si el cambio principal y los secundarios están entrelazados obtendremos un código sumamente difícil de comprender.

  • Regla N°18: Mejor herencia que sentencias condicionales (evita el código espagueti)

    4 de febrero de 2019


    El código Espagueti es aquel que tiene un control de flujo demasiado complicado para entenderlo claramente, además de que son prácticamente imposibles de modificar por miedo a que mientras cambiamos algo se estropee otra cosa. El código esta enredado tal como un plato de espagueti, se llega a esta situación (en la actualidad), a base de agregar sentencias if encadenas, grandes y complejas. Ya de por sí, tener dos if encadenados aumenta la complejidad del código y la dificultad de mantenerlo.

    Para evitar que nuestro programa contenga código espagueti debemos evitar usar instrucciones condicionales, cuando estas pueden evitarse usando mecanismos de herencia, "Mejor herencia que condicionales".




Si te ha gustado la entrada, ¡Compártela! ;-)