domingo, 24 de septiembre de 2017

Roles principales en el desarrollo de software, una comparación tradicional-ágil.


Un “rol”, es una figura que adquiere una persona y que conlleva ciertas responsabilidades o comportamientos asociados. En el desarrollo de software, los integrantes de un equipo adquieren rol o roles según la función que desempeñen. El rol es independiente del puesto (o por lo menos no hay ningún motivo para que dependa de él) y una misma persona puede desempeñar varios roles al mismo tiempo.

En el desarrollo de software tradicional hay una serie de roles bien marcados. los analizaremos uno a uno y compararemos su función en metodologías tradicionales con el desarrollo de software ágil. Los roles a considerar son: Cliente, Líder de proyecto, Analista, Arquitecto, Diseñador, Programador y Tester.




Cliente


Es la entidad (o persona representante) que tiene la necesidad de un sistema o software nuevo (o de la modificación de uno ya existente). Una parte importante relativa al cliente es el usuario operador, que es la persona concreta que va a utilizar el sistema. Puede, y es además bastante probable, que el cliente o dueño final del sistema a construir no sea la misma persona que el usuario.

Líder de proyecto


Es el responsable (directo) de llevar a buen término el proyecto, por lo menos de parte de la empresa constructora del software. Debe coordinar al resto del equipo para que trabajen en armonía y eficientemente, también es el responsable de concretar las fechas de entregar de cada fase y garantizar que son cumplidas. El resto de personas del equipo trabajan bajo su dirección

Analista


Es rol encargado de analizar las necesidades del cliente en cuanto a su futuro sistema. Debe tener la capacidad de concretar todo lo expuesto por dicho cliente en una colección de requisitos a construir, además debe entender el negocio del cliente (que seguramente le es ajeno) y poder hablar su mismo "idioma". Una de las partes mas complicadas del rol de analista, es poder asumir que el mismo cliente no comprende completamente sus necesidades, ni las múltiples soluciones software a este. El cliente generalmente solo va a querer automatizar el trabajo que ha estado haciendo hasta ahora y va a mostrar una gran resistencia al cambio y a su forma de trabajar. Pero el problema es que cambio es realmente necesario, sino no necesitaría un nuevo sistema software. Si el analista no es capaz de comprender esto, el desarrollo se alargara mucho más tiempo del calculado, y creara una sensación de insatisfacción tanto del cliente, como del equipo constructor, que sentirá esta andando en círculos y sin sentido durante todo el proyecto.

Arquitecto


El rol de arquitecto es uno de los mas confusos que existen (asumiendo a veces roles de programador o diseñador), pero en esencia debe encargarse del sistema a un nivel "macro". Debe asegurar que el sistema encaja perfectamente en el resto de sistema de la empresa, que se esta construyen con las patrones, metodólogas y herramientas adecuadas, garantizando que el sistema presenta una continuidad de negocio con el escenario actual de la empresa y que está preparado para adaptarse a los futuros , y posiblemente desconocidos, cambios venideros. Además debe detectar los componentes reutilizables de un sistema (que son mas de los que a priori se cree) y asegurase que son creados, utilizados y conocidos, por el resto del equipo.

Diseñador


Es el responsable de convertir los requisitos obtenidos por el analista, en "algo" que se pueda traducir en software, mediante las guías e indicaciones de la arquitectura de software. Se encarga de definir el sistema en un nivel detallado y concreto. El diseñador indicara que componentes y de qué forma se relacionan dentro del sistema y en la lógica de negocio.

Programador


Es el constructor efectivo del sistema, resolviendo los requisitos mediante código fuente, que a su vez es convertirlo en dicho sistema. Debe ser experto en las tecnologías es las que está trabajando, aunque es frecuente que a veces se auto capacite según las necesidades del sistema, con éxito disparejo. Debe tener capacidad de participar en un escenario colaborativo con el resto de los codificadores

Tester


Es el encargado de validar que el software cumpla con los criterios de calidad establecidos, es decir que el software funcione. Se puede considerar que un software sea de “calidad”, en diversos aspectos incluyendo el aspecto el grafico (interacción con el usuario), el funcional (que cumpla lo requerido), o el operativo (que siga funcionando en determinadas circunstancias como carga excesivas o situaciones de uso “anormales”).

Roles en metodologías de desarrollo de software tradicionales


En las metodologías de software tradiciones, se sigue una secuencia de fases más o menos estricta (que puede repetirse en varias vueltas o ciclos). Cada fase tiene una entrada y una salida, en las primeras fases (análisis y diseño), se convierte las requisitos de usuarios, en documentación, en las fases de construcción, se “convierte” la documentación en software.

Cliente


Curiosamente el cliente no tiene gran relevancia en las metodologías tradicionales, interviene al principio de la fase de desarrollo (en la que es entrevistado), y al final al recibir el sistema construido. Pocas veces se le considera como parte del flujo de desarrollo de software, salvo por reuniones puntuales que no tienen más objetivo que garantizar que el software se sigue construyendo.

Líder de proyecto


Uno de los roles más importantes. De su capacidad de organización y gestión dependerá el éxito del proyecto. Debe coordinar al equipo para llevar a cabo el objetivo, que es la generación del sistemas en tiempo y forma.

Analista


Debido a que es el iniciador del proceso y es el que extraerá los requisitos directamente del cliente, su importancia es alta. Una mala interpretación del analista puede ocasionara una desviación importante en el proyecto. El análisis es una fase que suele alargarse bastante puesto que el cliente no suele estar presente en otras fases del desarrollo.

Arquitecto de software


En las metodologías pesadas el papel del arquitecto de software no es tan relevante, no porque la arquitectura no lo sea sino porque generalmente el sistema está pensando más como un elemento único y no se tiene un enfoque parecido a una fábrica de software. En este escenario el diseñador toma parte de las responsabilidades del arquitecto.

Diseñador


El diseñador es el puente entre el analista y los programadores, traducirá los "requisitos", en definiciones y diagramas, para que posteriormente sean convertidos en código fuente. La coherencia de sus diseños, se trasladara al sistema final, si sus diseños no son coherentes, se acara teniendo un motón de código fuente que tiene sentido como piezas individuales, pero no como un sistema integral.

Programador


Como mencionamos el programador convertirá la documentación obtenida hasta este punto en código fuente, aquí tomara decisiones relativas a la optimización, la estructuración, o a la resolución de problemas concretos relacionados con el lenguaje o la tecnologías seleccionadas.

Tester


Es parte de las secuencias de fases del desarrollo. una vez construido el sistema se pasa a pruebas y se devuelve si no son satisfechas.

Roles en metodologías de desarrollo de software agiles


Para la resolución de metodologías agiles hay varios enfoques, pero todos alzan el valor del software productivo (ya construido), y las iteraciones humanas, frente a los procesos y la documentación.

Cliente


El cliente es el elemento más importante y se considera como parte del equipo del trabajo. Hay que tener en cuenta que todo el significado y motivo de creación del sistema, es la resolución de una necesidad el cliente. El cliente interactúa de diversas formas y frecuentemente en todas las fases del proyecto

Líder de proyecto


Las responsabilidades dentro de un modelo ágil están distribuidas en un modelo mas "plano", dividiendo dichas responsabilidades entre todos los participantes del proyecto. Si bien es necesario alguien que se encargue de llevar el seguimiento y control, no suele tener un puesto diferente al del resto de sus compañeros.

Arquitecto de software


Es el que define las políticas técnicas en cuento a la creación de software, aunque más que políticas son una caja de “herramientas” de soluciones que funcionaron en determinadas circunstancias y son reusables en el futuro, para otros proyectos. Aquí se incluye el uso de patrones de software, librerías y framework. El arquitecto debe vigilas que se apliquen las políticas adecuadas en cada momento, pero con la flexibilidad necesaria para adaptar, crear o derogar políticas según sea necesario.

Analista


El contacto con el cliente es, con diferencia, mucho más frecuente en las metodologías Ágil, lo cual hace que el rol de analista sea menos crítico. A diferencia de las metodologías pesadas, se asumen una incapacidad inicial de comprender la necesidad del cliente, dicha capacidad es suplida con entregas realizadas en corto tiempo, que aportan cada vez más funcionalidad a la solución fácil, hasta que tanto cliente como desarrolladores están conformes con el resultado.

Diseñador


La formalización del diseño (en documentación) no es tan importante, debido a que si hay una buena colección de estándares, guías y arquitecturas, debiera quedar implícitamente la forma de resolver un problema. En las metodologías agiles se asumen que los requisitos van a cambiar con lo que cualquier propuesta de software debe asumir ese cambio y estar preparado. Es decir en lugar de crear un software que solucione un problema, hay que enfocarse en un software cuyo cambio no tengan un impacto excesivo en el sistema.

Programador


Los programadores son la parte más relevante en las metodologías agiles, en la que frecuentemente suele complementar su roles de programador, con los de analista y diseñador. Esto es debido a que como no hay una excesiva documentación, la necesidades de comunicación son más directas e inmediatas. Es esencial la comunicación oral y el trabajo en equipo. De igual forma se necesita que los desarrolladores tenga experiencia, sean respetuoso de los estándares y que conozcan todo las herramientas reutilizables que tienen a su disposición .

Tester


Las pruebas en las metodologías agiles de hacen de forma más frecuente y continuada, no es necesario que esté terminado el sistema para comenzar pruebas. El software está diseñado de forma que se pueda probar unitariamente e incluso podría usarse un desarrollo orientado a pruebas, esto es crear primero las pruebas y dar por satisfecha la construcción del sistema cuando todas las pruebas tengan existo. Como vemos las pruebas pueden comenzar desde muy temprano en un desarrollo ágil.

¿Cual usar?


Frecuente se dice que si tu proyecto es grande uses una metodología pesada, y si es pequeño una ágil. En lo personal no estoy de acuerdo con este razonamiento, porque parece más un temor a una metodología nueva que otra cosa, al considerar que si el proyecto es pequeño se podría corregir cualquier desviación. Yo creo que lo que define cual metodología usar, es la madurez y la capacidad de comunicación y colaboración del equipo, cuanto mayor sea mayor es la posibilidad de éxito con una metodología ágil, cuanto menor sea es mejor el uso de una metodología tradicional que garantiza que cada paso está siendo perfectamente guiado y documentado.

sábado, 9 de septiembre de 2017

Carta abierta sobre el desarrollo de software en la vida empresarial

Hace un par de años, mientras estudiaba mi maestría en Investigación en Desarrollo de Software, tuve la oportunidad de participar en un foro sobre Especificación de Sistemas Software con estudiantes que no había trabajado nunca en el desarrollo de sistemas dentro de un ambiente empresarial (o de forma profesional, es decir siempre habían sido estudiantes) y preguntaban cuanto de lo que veían en su carrera universitaria se aplicaría en el “mundo real”.

El siguiente extracto, el cual acabo de recuperar, es parte de mi participación en dicho foro, trata sobre todo de la formalización de un sistema mediante documentación previa a la construcción, aunque puede pecar de subjetivo, espero que sirva como orientación para estudiantes de Ingeniera en Software o carreras afines.

Tengo en “activo” en el mundo del desarrollo de software desde finales de los 90. He pasando por todos los puestos imaginables, desde "chico de los cafés", hasta mi puesto actual como encargado de la arquitectura de software. Te diré que yo amo esta profesión, pero en todo este tiempo he pasado por diferentes fases anímicas en cuento a las gratificaciones que me ha ofrecido.


En lo que a mí respecta, existe una brecha entre el mundo académico y el mundo empresarial. Muchas veces es muy difícil aplicar los conocimientos obtenidos en tus estudios directamente, y en “crudo”, en tu trabajo. Muchas de estos conocimientos, por otro lado, no cumplen las necesidades reales de los clientes, que son principalmente:

  •  Tener un software útil.
  •  Que su software se cree rápido, y sea fácil de modificar.
  •  Que su software no tenga errores.

Si no cumples estas expectativas, no importa que metodología, diagramas, UML y demás uses. Si no cumples estas fuera del mercado. El cliente te va a cambiar por otro que si cumpla su necesidad.

¿Qué es lo que tienes que hacer? buscar herramientas que te ayuden a cumplir con los requisitos mencionados, y además, lo más importante, que tu equipo (o el equipo donde estas) hablen el mismo idioma.

Lo mejor es estar siempre en un equipo donde exista una comunicación verbal y clara entre sus integrantes, donde se haga ruido, se discuta y se hable. Si trabajan cada uno en su lugar, con los cascos puestos, cada integrante se concentrara en la tarea que tienen asignada y no entenderá el concepto global del sistema, alargándose el desarrollo muchos más meses de lo previsto.

En cuanto al valor que le va a dar tu cliente a toda la documentación que hagas sobre su futuro sistema, es básicamente nula. El cliente quiere un software, no un documento, un UML, u otro tipo diagrama. El en cualquier caso necesita (antes de la construcción del proyecto) dos cosas:

  • El tiempo
  • El costo.

Tú (como analista) eres el que necesita documentos que garanticen que has comprendido lo que el cliente necesita, y allí es donde se convierten, dichos documentos, en una necesidad contractual, más que en una necesidad técnica.

Pero, ¿Sabes qué? El cliente no entiende que quiere hasta que lo ve. Es parecido a comprar un coche, hasta que no estás arriba, no sabes que quieres. Hasta que usuario no vea el sistema funcionando no va saber que quiere. El producto define la necesidad. Steve Jobs, por ejemplo, no hacia estudios de mercado precisamente por eso (a Ford, igualmente se le atribuye la frase “Si les hubiera preguntado a mis clientes que quieren me hubiera dicho que caballos más rápidos”).

Entonces el tema de la documentación se convierte mas en una necesidad “hacia dentro”, y no “hacia fuera”. Y allí depende más del estilo de empresa y del equipo que tengas, la necesidad de la documentación requerida.

Generalmente yo huyo de la documentación excesiva al crear un sistema, porque muchas veces es redundante, burocrática, y tiende en exceso a ser obsoleta. ¿Por qué?, porque muchas veces cambia tanto un sistema que la documentación inicial y el producto final, no se parecen en nada. Y si se parecen no será lo que el cliente quiere (por que al ver el producto se dará cuenta que quiere otra cosa).

Si quieres documentación, tienes que buscar herramientas y lenguajes que permitan llevar a la par la construcción y dicha documentación, que desde la documentación se pueda generar el código fuente y viceversa, que desde el código fuente se puede generar la documentación.

Las metodólogas agiles, de las que he hecho muy afín últimamente, dan más importancia a los productos que a la documentación. Solo hay que tener cuidado, porque a veces algún líder de proyecto, considera solo el punto de “poco documentación” de las metodologías Agiles, y se olvida de todo los demás, a lo que dan importancia dichas metodologías, y eso también lleva a un futuro desastre.

Me gustaría igual señalarte un problema que tienen los recién egresado, su trabajo acaba siendo los que llamamos “tareas de escuela”, soluciones técnicamente correctas que no tienen aplicación en el mundo real, ¿Por qué?, porque no vieron su trabajo en el contexto de un sistema real. Su meta fue programar un sistema, y esa, nunca es la meta, la meta es resolver una necesidad al cliente. En su enfoque nunca hubo un usuario manejando el sistema.