domingo, 8 de noviembre de 2009

Desarrollo de software, más fácil que hace 30 años?

Estoy leyendo el libro Coders at Work, de Peter Seibel, que contiene entrevistas a destacados programadores de los últimos años.  Lo que me ha llamado la atención es que pese a que durante todos estos años han ido apareciendo constantemente nuevas herramientas y métodos que han prometido aumentar dramáticamente la productividad, el trabajo sigue siendo similar y el tiempo necesario para llevar a cabo un proyecto de desarrollo de software no ha disminuído.

La gran diferencia de un software de hace 30 años con uno de ahora es que hoy en día los usuarios no son todos computines: usan el computador como herramienta de trabajo, el computador no es el fin, sino que el camino.  El software de hoy en día se mide con una vara más alta:
  • Tiene una interfaz gráfica que no sólo es intuitiva y sencilla de usar, sino que además es atractiva a la vista.
  • Es sencilla de instalar, no es necesario haber estudiado informática para hacer que funcione en un computador.
  • Es (medianamente) independiente del hardware. Funciona en cualquier PC o MAC.
  • Está altamente integrada con otras aplicaciones o sistemas. 
  • Es sencilla de actualizar.
Antes todo eso no existía. Hoy los diseñadores y programadores deben asegurarse que sus aplicaciones satisfagan todos estos requerimientos, aparte de implementar todas las funciones que el usuario necesita.

Esto explica dónde se ha "perdido" el aumento de eficiencia: el software de hoy en día es mejor y todos esperan que lo sea.

jueves, 5 de noviembre de 2009

Google, Información y Transparencia

La misión de Google es recolectar información, ordenarla y ofrecerla de modo tal que quienes buscan puedan encontrar lo que necesitan. El peor enemigo de Google es el miedo de la gente de entregar sus datos a la empresa.  Un nuevo intento por aminorar ese miedo es Google Dashboard, un sistema que permite ver qué información ha almacenado Google de una persona. Interesante iniciativa.

domingo, 1 de noviembre de 2009

Reducir costos en desarrollo de software

La idea no es nueva, todos quienes trabajamos en desarrollo de software hemos estado confrontados a la pregunta de cómo reducir los costos de algún proyecto de desarrollo de software.

Existen en la práctica muchas alternativas, pero todas se reducen a una de las siguientes estrategias:

  • Aumentar la eficiencia de la producción de software.
  • Reducir el alcance del proyecto, por ejemplo, eliminando funcionalidad.
Hay muchos caminos para reducir el alcance del proyecto, pero todos los que de verdad funcionan requieren una fluida comunicación entre el fabricante de software y el cliente.

Para aumentar la eficiencia también hay variadas alternativas, de las cuales recomendaría aplicar al menos las siguientes:
  • Incorporar al cliente al proyecto, aunque sea contra su voluntad. Si el cliente ve los logros, desafíos y dificultades del proyecto, estará más dispuesto a modificar el alcance del proyecto y el producto final se acercará más a lo que él necesita.
  • Entregar toda la información posible a todo el equipo encargado de desarrollar el software. Ocultar información o introducir barreras entre las personas involucradas en el proyecto sólo aumenta la probabilidad de confusión o falta de información en el equipo.
  • Dividir el proyecto en intervalos fijos de tiempo (iteraciones) en los que se desarrollen partes del producto final, de modo que tanto el equipo como el cliente puedan monitorear el grado de avance.
  • Dejar de lado procesos, rituales y herramientas que impidan o dificulten al equipo trabajar. 
Hay muchas más cosas que se pueden hacer para aumentar la eficiencia, pero siguiendo estas reglas básicas, la efectividad del trabajo aumentará considerablemente.

¿Se me ha olvidado alguna idea importante?


Desarrollo Iterativo de Software

Antes se creía que desarrollar software era como construír una casa y consistía en los siguientes pasos:

  • Cliente contrata un arquitecto
  • Arquitecto hace esbozo
  • Cliente aprueba esbozo
  • Arquitecto hace planos
  • Constructor realiza obra
  • Cliente recibe obra
El problema es que cada proyecto de desarrollo de software es distinto. No quiero decir que todas las casas que se construyen son iguales, pero todas las casas son casas.  Los proyectos de desarrollo de software son tan diversos, que en la mayoría de los casos, tanto el cliente como los desarrolladores no tienen experiencias previas en las cuales puedan basar sus decisiones y estimaciones. Además, en el mundo informático, nuevas tecnologías y desafíos aparecen cada día. Todo ello difuculta algunas cosas:
  • Que el cliente pueda especificar en un inicio a cabalidad el producto que desea obtener.
  • Que quienes lo desarrollan puedan estimar cuánto demorarán y qué riesgos se esconden en el camino.
Es por ello que para desarrollar software con éxito es necesario implementar un proceso iterativo que no requiera especificar todo el producto en un inicio y que pueda ir adaptándose a medida que tanto el cliente como quienes lo desarrollan van ganando experiencia con el tema. Un proceso iterativo permite incorporar no sólo nuevas ideas del cliente, sino que además sirve para que el proyecto pueda ir adaptándose a cambios en el entorno, siendo la idea final producir software que sirva para satisfacer las necesidades del cliente.

La idea de desarrollar software de manera iterativa no es nueva, pero en la práctica hay muchas empresas que han sido y son reticentes en aplicar un modelo de este tipo, pues la forma de trabajo se aleja de técnicas tradicionales de producción y pareciera ser menos transparente por la "falta" de planificación inicial.  En realidad, el desarrollar software de manera iterativa ofrece muchísimas ventajas.  Aquí algunas de las más importantes:
  • Permite postergar decisiones. ¿Para qué decidir todo al inicio, siendo que aún no se tiene suficiente información/experiencia? La curva de aprendizaje de todos los participantes no sirve sólo para ver al final todo lo que se hizo mal, sino que para mejorar la dirección durante el transcurso del proyecto.
  • Da transparencia real del avance. En cualquier buen proceso de desarrollo de software iterativo, la meta es producir software funcional (working software) al final de cada iteración.  Esto permite a todos los participantes del proyecto saber exactamente y con gran frecuencia qué ha sido desarrollado y qué problemas han aparecido en el camino, permitiéndo tomar mejores decisiones para el resto del desarrollo.
Si tienes experiencia con desarrollo de software iterativo, escribe un comentario contándonos lo que has hecho y cómo han sido los resultados.  Si no la tienes, cuéntanos por qué no has probado un proceso iterativo hasta ahora.


Team Foundation Server: Todo en Uno

Es fantástico lo que están haciendo los ingenieros de Microsoft en el ámbito del desarrollo de software.  El Team Foundation Server (TFS) es sin duda una genial herramienta que se ha colocado al centro de miles de empresas que desarrollan software alrededor del mundo.

La idea es tan genial como sencilla: los proyectos de software exitosos se basan en buena comunicación entre las partes involucradas, información y transparencia. La mayoría de los proyectos de desarrollo de software fallan debido a problemas de comunicación, tanto en el equipo como con el cliente. TFS es la respuesta de Microsoft a ese problema: ofrece herramientas para sincronizar el trabajo y ofrecer transparencia hacia el cliente.

Pero la herramienta es sólo tan buena como el uso que se le da. Un mal proceso de desarrollo de software seguirá siendo malo aún si se usa una herramienta tan poderosa como TFS. Es por ello que el TFS ofrece ayuda para implementar diversos procesos ágiles de desarrollo de software, que están enfocados a mejorar la comunicación e interacción de todos los participantes de un proyecto.

A cualquiera que participe o lidere un proyecto de desarrollo de software le recomiendo no sólo utilizar un proceso ágil (como por ejemplo scrum o test driven development), sino que además evaluar utilizar una herramienta como TFS.

Con gusto puedo escribir a futuro algunas líneas acerca de mi experiencia con el uso de TFS en proyectos de desarrollo de software si es que hay interés. ¡También me encantaría escuchar vuestras experiencias!

Virtualización: ¿La panacea?

Antes separábamos distintos servicios en distintos servidores, para disminuir el riesgo de una falla total de los sistemas informáticos.  Hoy la premisa es consolidar todos los servidores (convertidos en máquinas virtuales) en un gran sistema (por ejemplo: ESX farm).  Antes nos distanciábamos de conceptos como mainframes y terminales tontos (dumb terminals) pretendiendo descentralizar los sistemas informáticos de una empresa: hoy volvemos a traerlos al servidor, enseguecidos por tecnologías de TI reinantes. ¿Tiene todo esto sentido? No, no lo tiene.

Virtualizar: ¿Todo o nada?

Virtualizar sistemas y aplicaciones abre nuevos horizontes para solucionar múltiples problemas. Las tecnologías de virtualización no son nuevas, pero el desarrollo en los últimos años ha permitido que pueden ser aplicadas en una gran variedad de situaciones. El hecho que esta tecnología ofrezca tantas aplicaciones no significa que sea conveniente usarla para cualquier clase de problema. En esto no se diferencia de otras herramientas: su efectividad depende del uso que se le de.

Hay empresas que se han tomado muy en serio el "hype" de la virtualización y han decidido virtualizarlo todo: partiendo por los servidores, siguiendo por las aplicaciones y terminando en las estaciones de trabajo. ¿Es esto una práctica a seguir? No, no lo es.

La virtualización tiene sus ventajas y desventajas y hay que analizar cuidadosamente qué se gana y qué se pierde antes de utilizarla. Una política taxativa que ordene utilizar o no utilizar herramientas de virtualización es una mala política: la solución no será blanca ni negra, sino más bien una mezcla de distintas tecnologías.

En un próximo artículo describiré ventajas y desventajas de virtualización en algunos escenarios frecuentemente discutidos y utilizados.

Primer Post: Motivación

Hacer software es sencillo. Se necesita sólo un computador (herramienta), una idea y algo de habilidad en el manejo de la herramienta.

Este espacio pretende abrir puertas al mundo hispanoparlante para intercambiar información acerca de tecnologías y tendencias en el desarrollo de software. Les invito a participar entregando sus opiniones y enviandome sugerencias acerca de temas a tratar.

Bienvenidos a este nuevo espacio!