May 2007 - Posts

El tipo de documentación que espero como desarrollador

En este pequeño post solo quisiera dar mi perspectiva como desarrollador sobre el tipo de documentación que yo necesito típicamente para poder hacer la implementación de una aplicación con éxito.

Es clásico en muchas empresas de desarrollo el pasar al desarrollador un documento sencillo que apenas si menciona los mismos requerimientos que el usuario ó cliente solicitó. Por ejemplo, supongamos el caso de una característica bastante interesante que tuve que implementar en una aplicación que hice hace algún tiempo. Voy a modificar por supuesto el ejemplo para que muestre un caso mucho más simple que el que me tocó implementar.

Resulta ser que en esta aplicación manejamos gráficos de columnas, como los que hace Excel. Supongamos que este gráfico muestra las ventas de un producto. En el eje X están los distintos meses del año y en el eje Y están las ventas totales para ese mes. Cada producto tiene asociado un tipo de producto. Lo que decía el nuevo requerimiento era algo así:

"Los usuarios necesitan poder mover las ventas de un producto de un mes hacia otro mes, preferiblemente haciendo Drag & Drop en el gráfico".

Y ya. ¡Ese es el requerimiento! ¿Qué se supone que haga yo con eso?

Por supuesto para el que redactó esa línea está muy claro lo que quiere o necesita, pero para mi, que soy el desarrollador y que de hecho no me interesa para nada conocer todo el negocio que está detrás de aquello, pues aquello me deja con una cantidad indefinida de preguntas que simplemente no me permiten para nada empezar mi trabajo:

  • ¿Puedo mover las ventas desde cualquier mes hacia cualquier mes?
  • ¿Puedo mover las ventas desde cualquier producto hacia cualquier producto?
  • ¿Debo validar algo al momento de hacer el Drag & Drop?
  • ¿Qué cambios debo hacer en la base de datos para soportar este tipo de funcionalidad?
  • ¿Dónde debo guardar los datos?
  • ¿En qué momento se guardan los datos?
  • ¿Puede quedar un gráfico totalmente vacío después de mútiples Drag & Drop?
  • ¿Debe quedar cada Drag & Drop registrado en algún lado? ¿O solo el resultado final?
  • ¿Qué pasos específicos lleva a cabo el usuario para hacer esta operación?
  • ¿Afecta este Drag & Drop a algún otro proceso del sistema?
  • ¿Existe algún máximo o mínimo de Drag & Drop que se deban soportar?
  • ¿Qué le digo al usuario si ocurre algún error? ¿O algún fallo en las validaciones?

Bueno, esas entre las pocas preguntas que a mi como desarrollador se me pueden ocurrir, pues no es mi deber el tratar de entender el negocio que está detrás de todo esto, sino simplemente el de implementar, es decir, plasmar en código, lo que me indique el o los documentos técnicos definidos por alguien más.

¿A qué documentos me refiero? Bueno pues, ahí viene el gran debate sobre la documentación que uno debería manejar para plasmar correctamente lo que se debe construir. Como muchos saben, existen cualquier cantidad de metodologías de desarrollo y cada una viene con su propio set de documentos que se supone deben ser llenados. En este post no voy a hablar de ninguna metodología en particular, sino que quiero más bien mencionar las cosas que, desde mi punto de vista, debería contener el documento que yo tome de base para construir una funcionalidad de la aplicación.

Este documento debería, mínimo, tener lo siguiente:

  • Descripción de los pasos que realiza el usuario para completar su tarea.
  • Un screenshot o bosquejo de la pantalla que se construirá. 
  • Descripción de cada una de las entidades y/o atributos que se mostrarán o ingresarán en la interfaz gráfica.
  • Descripción de cada uno de las entidades y/o atributos que la aplicación consultará ó modificará.
  • Una lista de todas y cada una de las reglas y restricciones que afectan a esta funcionalidad y qué debe hacer la aplicación en el caso de que alguna de ellas no se cumpla.
  • Si la secuencia de pasos que realizará el usuario es muy extensa y es importante que se siga esa secuencia específica, un dibujo o bosquejo de los pasos a realizar.
  • Una lista de las tablas y campos de la base de datos que deben ser afectados y/o consultados por esta nueva funcionalidad.
  • Una lista de las condiciones previas que deben cumplirse antes de que el usuario pueda empezar a utilizar esta funcionalidad.
  • Una lista de los requerimientos de calidad de servicio que deben cumplirse, como por ejemplo requerimientos de rendiemiento, seguridad, facilidad de uso, etc.

Solamente con esta información a mano yo puedo sentirme seguro de lo que voy a implementar y no cometeré el error de asumir la respuesta a todas mis preguntas y codificar la aplicación, para al final darme cuenta de que aquello no era lo que quería el cliente.

Y por supuesto no se le debe delegar nunca la creación de esta documentación al mismo desarrollador. ¿Por qué? Pues por varias razones:

  • El desarrollador es un experto técnico, mas no funcional. Por lo tanto, él no sabe (ni le interesa saber) nada sobre el negocio que se está tratando de resolver.
  • El desarrollador necesita terminar su tarea de implementación con la más alta calidad posible en el tiempo que se le asignó. Si a más de todas las consideraciones de facilidad de uso, rendimiento, legibilidad del código, pruebas unitarias, escalabilidad, portabilidad, etc, que el desarrollador debe considerar, también se le encarga el asegurarse de entender "mágicamente" y plasmar todo lo que el cliente necesita, eso pues es una gran sobrecarga de trabajo para él, que normalmente no resulta en nada bueno.
  • El desarrollador, por su naturaleza misma, trata de resolver las cosas con la solución más simple posible, que considere las restricciones que le plantearon por supuesto. El desarrollador, por ende, no va a ponerse a filosofar durante horas sobre lo que le conviene o no al usuario. Así que, si se le encarga a él esa tarea de definición de las especificaciones, pues las mismas resultarán ser lo más simple y fácil de implementar posible.

En conclusión, el jefe de proyecto, jefe de producto o quien sea que se encarge de liderar el proyecto debe de asegurarse de que los desarrolladores reciban la documentación más detallada posible antes de iniciar la implementación de una solución. En la creación de esta documentación entrarán los analistas de negocios, los usuarios finales, tal vez alguna persona de control de calidad, el experto en bases de datos, etc, pero nunca, nunca, el desarrollador.

Mientras más tareas ajenas a la codificación de la aplicación se excluyan del trabajo del desarrollador, mejor será la calidad del producto final y menor será el tiempo requerido para la implementación.

Julio.

Midiendo la Calidad del Equipo de Desarrollo

Si hay un tema que realmente me apasiona pues es la Ingeniería de Software. Por supuesto, no soy un experto en el tema, pero sí suelo pasarme algún tiempo leyendo y curioseando cosas interesantes al respecto cuando me da el tiempo. Revisando mis viejos archivos, encontré el link a un artículo que Joel Spolsky publicó hace años ya y que me había propuesto comentar en este blog, aunque por falta de tiempo no había podido hacerlo.

Quisiera entonces comentarles acerca del Test de Joel. Este es un test sencillo de 12 preguntas que sirve para medir la calidad del equipo de desarrollo y que Joel extrajo de un texto más extenso elaborado por el Software Engineering Institute. Mi objetivo en este post no es el traducir el Test de Joel, que por cierto lo pueden encontrar completo y con toda su explicación por acá, sino más bien el hacer un énfasis y dar un jalón de orejas a la mayoría de las empresas de desarrollo y departamentos de sistemas. Por su puesto, yo no me excluyo, pues la empresa para la que trabajo tampoco podría sacarse el más alto puntaje posible (aunque estamos cerca).

El test es simple, le das 1 punto a cada pregunta contestada afirmativamente. Sacar 12 es fabuloso, 11 es aceptable, pero si sacas 10 o menos estás en serios problemas. Voy entonces a ir comentado una a una cada una de las preguntas. Puedes ir sacando tu puntaje a la vez que vas reflexionando entorno a cómo se desempeña tu empresa en cada uno de los aspectos.

1. ¿Usas control de código?

Nadie está exento de cometer errores y por ende eventualmente vas a rogar el poder volver a una versión vieja de tu aplicación, la cual funcionaba a las mil maravillas. Tu sistema de control de código te permitirá hacer esto e incluso te permitirá comparar archivos y líneas específicas de código para determinar en qué punto se produjo algún cambio que provocó el comportamiento actual de la aplicación. Más aún, cuando son dos ó más personas las que trabajan en un mismo proyecto, se vuelve esencial el tener una forma rápida, práctica y transparente de obtener los últimos cambios al código fuente que realizaron tus compañeros y sin los cuales tal vez no puedas ejecutar bien la aplicación. Trabajar sin control de código es un verdadero dolor de cabeza.

2. ¿Puedes hacer un build de un solo paso?

Hacer un build puede ser tan sencillo como crear un proyecto de instalación de Visual Studio, agregarle el exe y las dll de tu aplicación y mandarlo a generar. Sin embargo, esto solo te funcionará para los casos más simples, pues para la mayoría de aplicaciones comerciales el proceso de instalación involucra el extraer la última versión del fuente del sistema de control de código, determinar y asignar el número correcto de versión a cada componente de la aplicación, regenerar los dll y exe de toda la aplicación, correr las pruebas unitarias, preparar los archivos de configuración para el usuario final, generar el instalador, colocar el instalador en un lugar accesible a todos los miembros del equipo, entre otras cosas.

Tratar de hacer todo esto cada vez que tienes que preparar un nuevo build para tu jefe, para los de control de calidad ó para el mismo cliente, es todo un dolor de cabeza y es muy, pero muy propenso a errores. Lo digo por experiencia, este proceso tiene que ser 100% automático y no deberías de dar más de un click o un enter para que todas estas tareas de ejecuten de manera secuencial y automática. Caso contrario, tendrás constantes demoras para lograr liberar una nueva versión de tu aplicación y esto se volverá más lento justo en el momento en que necesitas más rapidez para entregar tu producto a tiempo.

3. ¿Haces builds diarios?

Nunca falta uno. Son las 5:30pm, ya te estás preparando para ir a casa. Mientras, tu colega de al lado ha terminado su tarea de hoy un tanto al apuro porque tiene que irse de urgencia a atender otras ocupaciones y le da check-in a su código del día si siquiera compilarlo. Con el check-in, el código está ahora a tu disposición, y en un último check-out del día, en el que te traes todo el código (ó una parte del código) de tus colegas, viene ese código que no fue compilado y, ohh sorpresa, ahora tu propio código ya no compila. Qué puedes hacer? Pues nada, tu amigo ya se fue y no volverá hasta el otro día.

Para prevenir esto se usan los builds diarios, lo cual consiste en hacer un build todos los días que incluya el último código que ingresaron todos los desarrolladores. Puede ser al medio día ó durante la noche, como proceso automático. La idea es que, una vez que se detecta que hay un error de compilación, quien lo dañó (o quienes lo dañaron) pues lo arregla de inmediato. Así, todo mundo sabe que, una vez que el build diario compila, todos pueden hacer un check-out de la última versión del código sin temor alguno.

4. ¿Tienes una base de datos de bugs?

Una vez más, todos nos equivocamos. No hay desarrollador que pueda escribir un código perfecto en una sola tanda, sin un solo error. Tu código va a tener bugs y eso es definitivo. Lo que debes preguntarte es cómo vas a hacer para llevar un control coherente de todos esos bugs que vayan saliendo. Lo ideal es tener una base de datos donde pongas todos los bugs ó un sistema que se encargue de esto. Pero, lo mínimo que debes tener por cada bug, es pues los pasos para reproducirlo, el comportamiento esperado, el comportamiento observado, a quién está asignado y su estado actual (activo, resuelto, cerrado, etc).

Esta base de bugs tiene un valor increíble en el proceso de desarrollo, pues por un lado es una medida bastante clara de qué tan estable está el sistema en un momento dado, mientras más detallados sean más fácilmente lo puede corregir el desarrollador, se puede determinar si los bugs aparecen por errores en las especificaciones ó por errores constantes de algún desarrollador, etc. La base de bugs es sumamente últil y es un componente fundamental en el aseguramiento de la calidad del software.

5. ¿Corriges los bugs antes de escribir nuevo código?

¿Qué haces cuando te reportan que hay un error en la aplicación? ¿Lo corriges inmediatamente o lo dejas nomás en la lista para corregirlo luego, pues tienes nuevas funcionalidades que implementar aún? En lo personal, yo he seguido el segundo enfoque hasta ahora. ¿Por qué? Pues porque tengo un cronograma que tengo que cumplir y muchas veces no me da el tiempo para ir corrigiendo cada cosa que aparezca.

¿Por qué está mal esto? Simple: Mientras más tiempo dejes pasar desde que apareció el bug, más difícil se te va a hacer el corregirlo. A menos que tengas una super memoria, es muy probable que si tratas de corregir un bug de hace 1 mes se te haga bastante difícl corregir, simplemente porque ya no recuerdas bien esa porción de código en la que se produjo el bug. En cambio, si el bug ocurrió hace solo unas horas, es probable que el código esté fresco en tu mente y podrás corregir el bug sin problema.

Me apunto un cero en esta pregunta, pues apenas si estoy aprendiendo la importancia de atender los bugs a tiempo.

6. ¿Estás al día con tu cronograma?

Soy desarrollador y ¡detesto los cronogramas! Sin embargo, son necesarios. Aunque a uno como desarrollador le gustaría tener todo el tiempo del mundo para implementar un código perfecto, la gente de negocios necesita desesperadamente el tener un cronograma al día y bien definido para ellos poder hacer también su planificación de actividades, como las demos, presupuestos, etc. Más aún, el cronograma te ayuda a definir cuáles características de la aplicación entrarán en la versión actual y cuáles otras, de menor importancia, se pueden relegar para una futura versión. Sin un buen cronograma, probablemente te matarás tratando de cumplir todos los requerimientos del usuario para "ayer" y nunca lograrás terminar ninguno bien hecho.

En este punto insisto, el jefe de proyecto juega un rol importantísimo aquí, pues es él quien debe llevar control del avance del cronograma y de su buen cumplimiento. Por supuesto, cada desarrollador debe ser responsable y cumplir sus tareas a tiempo, pero solamente el jefe del proyecto es quien sabe en qué punto el proyecto se empieza a salir de control y es quien tiene la autoridad y el conocimiento para dividir algún requerimiento ó postergarlo para otra versión ó tal vez para asignar más recursos a una parte del proyecto que se está quedando relegada. Si el jefe del proyecto se descuida, eventualmente el cronograma correrá grave riesgo y aún cuando todos los desarrolladores estén luchando por cumplir sus tareas, puede ya ser muy tarde para volver al ritmo correcto.

7. ¿Tienes especificaciones claras?

Una vez más, soy desarrollador y ¡detesto escribir especificaciones funcionales! Afortunadamente, no tengo por qué hacer esto, justamente porque soy desarrollador, no jefe de proyecto ni analista de negocios. Es esencial que alguien del equipo se enfoque meramente en la redacción de especificaciones funcionales claras y bien detalladas. La redacción debería ser tal que, cualquier desarrollador que coja ese documento debería lograr entenderlo de una vez y tener una buena idea de cómo empezar a diseñar la solución.

Es esencial que todas las compañías de desarrollo designen a alguna persona del equipo para que asuma este rol, pues cuando se lo suelen dar a los desarrolladores (típico en empresas pequeñas) éstos difícilmente podrán producir especificaciones que realmente satisfagan lo que necesita el cliente, sino que más bien tratarán de escribir lo más sencillo y conciso para terminar el documento rápido y/o para no tirarse ellos mismos un requerimiento lleno de reglas de negocio difíciles de implementar.

8. ¿Tienen los desarrolladores condiciones de trabajo silenciosas?

¡¡¡Silencio, silencio!!! Las clásicas conversaciones sobre las últimas noticias en las primeras horas de la mañana, la camaradería antes y después de salir al almuerzo, la ronda de chistes y burlas a media tarde y los comentarios de cierre de día antes de la hora de salida, son clásicos en todo lugar donde he trabajado incluso hasta el día de hoy. Más aún, las clásicas preguntas de tus colegas sobre "¿cómo hago esto?" ó "¿tienes un código para hacer esto de acá?" ó "¿te ha pasado esto?", nunca faltan. Y qué decir de la ronda de MP3 a todo volumen del DJ del equipo? ¡Y el teléfono que no deja de sonar!

Todo este tipo de cosas son mortales para la productividad de un desarrollador. Está comprobado que, normalmente, al desarrollador promedio le toma hasta 15 min el entrar en productividad, es decir, concentrarse y enfocarse en su tarea. Pero si encima de ello ocurren interrupciones como las que acabo de describir, es posible que el desarrollador se tome hasta media hora en volver a su concentración.

Algo clave a este respecto es el no sentar a los desarrolladores uno al lado del otro. Si pones a dos personas a trabajar muy cerca sin ningún tipo de separación, al menos una de ellas eventualmente iniciará una conversación, que no necesariamente será por cuestiones del trabajo o proyecto actual. Sin embargo, si se les coloca en oficinas separadas, de seguro que será más la pereza de levantarse del asiento para ir a la otra oficina que las ganas de conversar el último chisme al compañero ó de preguntarle algo que, buscándolo en Internet, no tomaría ni 15 segundos resolver.

9. ¿Usas las mejores herramientas que se puede comprar?

Jefe de Desarrollo: "Esa nueva Dell con 2GB en RAM e Intel Core 2 Duo de 2Ghz sería una maravilla para los desarrolladores"; Gerente: "Estás loco? Compra nomás un clon de 512Mb y Pentium 4, más que suficiente y más barato". Este tipo de decisiones se toman a diario, buscando precautelar el gasto por encima de todo. Sin embargo, todos sabemos que una máquina que no compile rápido el código ó que esté sufriendo constantemente fallos porque la memoria "salió mala" es una pérdida de tiempo considerable y que, al ser constante (8 horas x 5 días a la semana) representa una demora increíble en el tiempo que le toma al desarrollador el terminar sus tareas. Lo mismo pasa cuando necesitamos hacer una pantalla con un grid que haga mil maravillas y sabemos que el grid de Infragistics es perfecto para la tarea y nos ahorraría varios días y semanas de programación, pero como no hay "presupuesto" para comprarlo, pues simplemente nos mandan a usar el grid incluido en la herramienta de desarrollo, el cual probablemente carezca de docenas de características avanzadas.

Siempre que sea posible hay que optar por darle al desarrollador el mejor hardware y el mejor software que exista para que realice sus tareas. Sin buenas herramientas, el desarrollador se demora; si se demora, se desmotiva; y si se desmotiva, se vuelve improductivo. Y créanme, no hay nada más perjudicial en un equipo de desarrollo que un desarrollador improductivo. Eso sí que causa un gravísimo daño al avance del proyecto.

10. ¿Tienes testers?

Aunque parezca increíble, la gran mayoría de empresas de desarrollo aún piensan que contratar gente exclusivamente para que haga las pruebas (los testers) es más un lujo que una necesidad, un asunto de baja prioridad. No hay nada más lejos de la verdad. Señores gerentes y jefes de proyecto: ni el más excelente de sus desarrolladores podrá producir un código de 100% de calidad, aún si ellos lo intentaran con todas las ganas del mundo. Ya el hecho de implementar el código más eficiente posible, hacerlo mantenible, asegurarse de poner todas las reglas de negocio, hacer todas las validaciones, documentar el código, hacer el correcto diseño de clases, refactorizar, etc, es suficiente trabajo como para que encima les soliciten que no se olviden de todas las otras 500 reglas de negocios y procesos que son afectados por los nuevos requerimientos que les pasaron.

El desarrollador es técnico y su preocupación es la de cumplir los requerimientos en el tiempo dado y con la menor cantidad de errores posible. El tester es en cambio el gran conocedor de la forma como debería operar la aplicación, en términos ya no técnicos, sino funcionales. Él sabe qué es lo que le agrega valor a la aplicación, qué es lo que definitivamente no debe fallar y qué cosas adicionales pueden realmente agradarle al cliente. Más aún, el tester es un experto en el arte de encontrar errores de todo tipo en la aplicación, pues existen docenas, sino centenares de técnicas a su disposición para atrapar hasta al bug más esquivo.

Los testers SON INDISPENSABLES y tienen exactamente el mismo nivel de importancia y peso en la construcción de la aplicación que los desarrolladores ó los jefes de proyecto. Si quieres calidad, siempre ten un tester a tu lado. Al principio es un poco molestoso, pero a la larga será tu mejor amigo, pues ayudará a que tu software realmente se luzca cuando llegue a manos del cliente.

11. ¿Los nuevos candidatos escriben código durante su entrevista?

Este error es tanto o más común que el tema de los testers. Es muy típico, aún hoy en día, que las compañías de desarrollo contraten a su nuevo personal basándose en una simple entrevista en la que se discuten sus estudios, habilidades, trabajos previos y expectativas diversas. Mientras más impresione el candidato con su diálogo, más probabilidad tiene de ser contratado.

Esto es un grave error, pues lo mínimo que se le debe aplicar a todo desarrollador es una prueba en la que se le ponga a escribir código, puesto que es la única forma de saber qué tan capaz será de escribir buen código, con la mejor calidad posible, en el menor tiempo posible y estando bajo presión. No tiene que ser nada del otro mundo, un simple problema como "implementa la función Factorial" ó "encuentra cuántas veces se repite esta cadena en el siguiente párrafo" es más que suficiente para darte una buena idea de la calidad de código que puede escribir el candidato. Preguntas enigmáticas como "dime cuántas sobrecargas tiene el método Compare y en qué orden va cada parámetro" están totalmente fuera de lugar y no aportan nada al proceso.

Importante en este punto es también el asegurarse que TODOS los miembros actuales del equipo de desarrollo aprueben y acepten al nuevo candidato. Si el candidato no convence a por lo menos uno de los miembros actuales del equipo de desarrollo (por razones justificadas claro está), el candidato no puede entrar. La opinión negativa y justificada de cualquier miembro del equipo acerca del candidato debe ser suficiente para dar a entender que aquel no es la mejor opción para el cargo.

12. ¿Haces pruebas de usabilidad?

Esta es una buena práctica que consiste en llamar a la primera persona que atraviese el pasillo y pedirle que pruebe el sistema que acabas de hacer. Está comprobado que si haces esto con al menos cinco personas, descubrirás rápidamente los mayores problemas que el usuario común tiene con la aplicación.

Conclusión

Como lo dije al inicio, sacar 10 ó menos en este test, denota un grave problema en tu compañía de desarrollo. Lo bueno de este test es que te ayuda al menos a identificar problemas que tú ni pensabas que existían. Es momento entonces de tomar la iniciativa y buscar formas de mejorar las áreas en las que hay falencias. Aún si eres desarrollador, de aseguro tus jefes agradecerán les hagas conocer los resultados de este test y las medidas correctivas que se pueden tomar. Mejorar el desenvolvimiento del equipo de desarrollo es crucial para lograr producir software de mucho mejor calidad y en mucho menor tiempo.

¿Cómo puedo enterarme de las últimas actualizaciones a msguayaquil.com?

Una preocupación frecuente entre los visitantes y miembros de MSGuayaquil, el sitio web del cual soy webmaster, es el cómo mantenerse actualizado con las diversas noticias, recursos, artículos y demás información que publicamos allí a diario. Aprovecho este post entonces para mencionar los distintos métodos que todo miembro y/o visitante puede utilizar para mantenerse actualizado:

Unirse la Comunidad. Esta es la forma ideal de recibir los últimos anuncios que realiza MSGuayaquil, pues al unirte (registrarte) entras a formar parte de la base de datos del sitio y te estaremos enviando un email tan pronto hagamos cualquier anuncio sobre nuevos eventos, concursos, etc. Para unirte simplemente dirígete a la Página de Registro, ingresa tu nombre de inicio de sesión, contraseña e email y listo, ya eres parte de MSGuayaquil.

Suscribirse a los Feeds RSS. RSS (Really Simple Syndication) es una tecnología que te permite recibir notificaciones instantáneas en un lector de feeds (feed reader) cuando se publica un contenido nuevo en el sitio. Para utilizar nuestros Feeds RSS, simplemente haz lo siguiente:

1. Descarga e instala el lector de RSS que más te agrade. Por acá hay una lista de los mejores lectores para Windows: http://email.about.com/cs/rssfeedreaders/tp/top_rss_windows.htm.

2. Navega por msguayaquil.com y encuentra el ícono de RSS (, ) relacionado al contenido del cual te interese mantenerte actualizado. Todas las secciones del sitio tienen feeds RSS asociados.

3. Dale click derecho al ícono de RSS y selecciona "Copiar Acceso Directo" ó "Copy Shortcut".

4. Abre tu lector RSS y busca el botón o menú para suscribirte a un nuevo feed.

5. Ingresa allí el link que copiaste.

6. Empezarás a recibir las últimas actualizaciones al sitio inmediatamente y el programa te notificará cuando hayan nuevas actualizaciones.

También puedes utilizar Internet Explorer 7 y/o Windows Vista como lector de feeds. En lo personal, yo utilizo Omea Reader.

Suscribirse a los Foros de Interés. Tal vez no sea muy obvio, pero es realmente fácil el recibir notificaciones por email cuando se publique un nuevo tema en los Foros de MSGuayaquil. Para hacer esto, luego de iniciar sesión, simplemente dirígete a la página de Foros y haz click en Personalizar (arriba a la izquierda).

La página se refrescará y ahora verás una columna adicional llamada "Mostrado". Inicialmente verás la palabra "No" para cada uno de los foros. Entonces, para suscribirte a tu foro de interés, solo dale click a "No" y el link cambiará a "Sí". Una vez hecho eso, empezarás a recibir emails cada vez que se publique un nuevo tópico en ese foro.

Activar las notificaciones por e-mail. Si lo que deseas es recibir un email cuando alguien responda un tópico publicado por tu persona en un foro, lo que debes hacer es dirigirte a tu perfil y activar las notificaciones por email. Así:

1. Inicia sesión en MSGuayaquil.

2. Haz click en el link "Editar Perfil", el cual aparece en la parte superior de todas las páginas.

3. Haz clilck en el tab E-Mail.

4. En "Opciones de Correo" selecciona "Sí" tanto para "Recibir Emails" como para "Activar notificaciones por e-mail de los foros/hilos y respuetas a mis mensajes".

5. Dale click a "Guardar".

6. Cualquier respuesta a un post tuyo en Foros te llegará automáticamente por email.

Notificaciones por e-mail para Noticias, Empleos y Blogs. Tanto en las secciones de Noticias, Empleos y en cada uno de los Blogs que aloja MSGuayaquil, existe la posibilidad de suscribirse por e-mail para recibir notificaciones cuando se publique algo nuevo. Por ejemplo, para recibir un e-mail cada vez que se publique un nuevo empleo en MSGuayaquil:

1. Dirígete a la página de Empleos.

2. Ingresa tu email en el lado derecho, en la sección "Sindicación".

3. Haz click en "Suscribirse"

4. Lo mismo aplica para Noticias y para cada blog de MSGuayaquil.

 

Como pueden ver, hay varias formas de mantenerse actualizado con el nuevo sitio de MSGuayaquil, todo esto claro gracias al nuevo sistema de administración de contenido que usamos ahora, Community Server 2007, el cual es realmente flexible y fácil de personalizar.

¡Hasta la próxima!

Recursos para Aprender Visual Basic 2005 Desde Cero

Hace unos días publiqué una lista de varios recursos para aprender ASP.NET desde cero, pero recientemente me he percatado de que otro tema en el que muchos necesitan también iniciarse es el lenguaje Visual Basic 2005. Es por ello que he decidido preparar esta segunda lista, esta vez con los mejores recursos que conozco para aprender Visual Basic 2005 desde cero:

En Español:

En Inglés:

Desde luego que no son todos los recursos disponibles en el Web. Será que tú conoces algún recurso mejor? Por favor, agrega tu comentario con el o los recursos que conoces y ayúdame así a armar una lista mucho más extensa, en beneficio de todos quienes visitan este blog.
 
Julio.
Webcasts de Silverlight
Silverlight Logo

Silverlight es el nuevo plug-in multi plataforma de Microsoft para crear nuevos tipos de aplicaciones interactivas enriquecidas y medios que pueden verse desde múltiples navegadores de internet. Esta nueva tecnología trae muchas novedades y oportunidades para los desarrolladores y diseñadores.

Es hora entonces de empezar a conocer las características de Silverlight y aprender cómo podemos usarlo en nuestras tareas del trabajo diario. Para ello, Roberto Hernández, MVP en Visual Studio .NET Security, estará brindando una serie de webcasts muy interesantes:

 

Introducción a Silverlight
URL de Registro: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032340686&Culture=es-AR
Fecha: 15/5/2007
Descripción: Conozca lo ultimo en tecnología de desarrollo de aplicaciones web ricas en contenido de Microsoft.  Además, conozca como implementar animaciones básicas dentro de sus aplicaciones. Presentado por: Roberto Hernández-Pou, MCSD.NET MCT MCSE MCDBA, MVP VisualStudio.NET Security
 
Animaciónes, Scripting y Multimedia con Silverlight
URL de Registro: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032340692&Culture=es-AR
Fecha: 17/5/2007
Descripción: Conozca cómo crear animaciones personalizadas, responder a la interacción del usuario y como implementar sonido y video en sus animaciones. Presentado por: Roberto Hernández-Pou, MCSD.NET MCT MCSE MCDBA, MVP VisualStudio.NET Security
 
Codigo Manejado y Silverlight 1.1
URL de Registro: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032340694&Culture=es-AR
Fecha: 22/5/2007
Descripción: Conozca el futuro de Silverlight, aprendiendo como utilizar código manejado para personalizar el comportamiento de sus animaciones y aplicaciones en el browser. Presentado por: Roberto Hernández-Pou, MCSD.NET MCT MCSE MCDBA MVP VisualStudio.NET Security

Excelente oportunidad para dar los primeros pasos con esta nueva tecnología.

¡Bienvenido Silverlight!

Usando TransactionScope con Enterprise Library 3.0

TransactionScope es una de las nuevas clases que aparecieron en .NET Framework 2.0 y que, entre otras cosas, logró simplificar enormemente la forma como programamos las transacciones en aplicaciones .NET. Por otro lado, Enterprise Library es un conjunto de librerías reutilizables que brindan diversas funcionalidades que el desarrollador utiliza a diario, como por ejemplo las tareas de acceso a datos. En este post me gustaría describir brevemente la forma como Enterprise Library 3.0 aprovecha el poder del TransactionScope para realizar transacciones implícitas de una manera sencilla.

El cómo configurar el Data Access Application Block queda fuera del alcance de este post. Dirígete a este link para obtener más detalles al respecto.

Para empezar, veamos un ejemplo de cómo podríamos realizar una sencilla operación de transferencia bancaria utilizando un par de métodos, Debitar y Acreditar, programados en una clase llamada Banco. Por supuesto, utilizaremos el Data Access Application Block para simplificar las líneas de código:

    public class Banco
    {
        public static int Acreditar(int monto, int idCuenta, DbTransaction transaccion)
        {
            Database db = DatabaseFactory.CreateDatabase();

            DbCommand cmd = db.GetStoredProcCommand("Acreditar");

            db.AddInParameter(cmd, "IdCuenta", DbType.Int32, idCuenta);
            db.AddInParameter(cmd, "Monto", DbType.Int32, monto);

            int regsAfectados = db.ExecuteNonQuery(cmd, transaccion);
            return regsAfectados;
        }

        public static int Debitar(int monto, int idCuenta, DbTransaction transaccion)
        {
            Database db = DatabaseFactory.CreateDatabase();

            DbCommand cmd = db.GetStoredProcCommand("Debitar");

            db.AddInParameter(cmd, "IdCuenta", DbType.Int32, idCuenta);
            db.AddInParameter(cmd, "Monto", DbType.Int32, monto);

            int regsAfectados = db.ExecuteNonQuery(cmd, transaccion);
            return regsAfectados;
        }
    }
 

Teniendo esta clase lista, la transferencia en sí podríamos realizarla de esta forma:

    class Program
    {
        static void Main(string[] args)
        {
            int monto = 500;
            int idCuentaOrigen = 1200;
            int idCuentaDestino = 2235;

            Console.WriteLine("Iniciando transferencia...");

            Database db = DatabaseFactory.CreateDatabase();
            using (DbConnection conexion = db.CreateConnection())
            {
                conexion.Open();
                DbTransaction transaccion = conexion.BeginTransaction();

                try
                {
                    // Hacer el crédito
                    Banco.Acreditar(monto, idCuentaDestino, transaccion);
                    // Hacer el débito
                    Banco.Debitar(monto, idCuentaOrigen, transaccion);

                    // Completar la transacción
                    transaccion.Commit();
                }
                catch (Exception)
                {
                    // Hacer Rollback
                    transaccion.Rollback();
                    Console.WriteLine("No se pudo realizar la transferencia.");
                    throw;
                }
                conexion.Close();
            }

            Console.WriteLine("Transferencia realizada con exito.");
        }
    }
 

De este ejemplo podemos observar claramente cómo cada método de la clase Banco que necesite participar en la transacción requiere pues justamente recibir como parámetro el objeto DBTransaction. Esto ocasiona varios problemas:

  • Se fuerza a los métodos Acreditar y Debitar a tener conciencia de que existe una transacción en la cual deben participar, cuando en realidad, para la clase Banco debería ser transparente el hecho de participar en dicha transacción.
  • Se fuerza a la clase Caller (Program en este caso) a que entre a detalles que no le corresponden, como el hecho de tener que crear y abrir una conexión a la BD. Obviamente, esto debería ser de exclusivo conocimiento de la capa de negocio ó capa de datos (si existiera).
  • Qué pasaría si uno de los dos métodos, Acreditar ó Debitar, estuviera programado en un componente del cual yo no tengo control (un componente de terceros por ejemplo) y dicho método no estuviera recibiendo actualmente ningún objeto DbTransaction? En el peor de los casos, yo no tengo acceso al fuente y, por ende, no puedo modificar al componente. Pero aún si pudiera pedir que lo modifiquen, el cambiar la firma de alguno de los métodos ocasionaría tremendo problema para todas las clases que hagan uso de dicho método.

No diré que estos son todos los problemas que se presentan, pero son realmente importantes cuando nuestras clases empiezan a multiplicarse y el mantenimiento del sistema se vuelve un gran desafío.

Ok, cómo lo arreglamos? Ahí es donde entra TransactionScope. TransactionScope es un objeto que, desde el momento en que es instanciado, rastrea todas las conexiones que se abran a la BD y las enlista en una sola transacción, sin que nosotros debamos hacer ningún tipo de manipulación con dicha transacción.

Veamos, primero ya no necesitaremos recibir ningún objeto DBTransaction en nuestras clases de negocio:

    public class Banco
    {
        public static int Acreditar(int monto, int idCuenta)
        {
            Database db = DatabaseFactory.CreateDatabase();

            DbCommand cmd = db.GetStoredProcCommand("Acreditar");

            db.AddInParameter(cmd, "IdCuenta", DbType.Int32, idCuenta);
            db.AddInParameter(cmd, "Monto", DbType.Int32, monto);

            int regsAfectados = db.ExecuteNonQuery(cmd);
            return regsAfectados;
        }     

        public static int Debitar(int monto, int idCuenta)
        {
            Database db = DatabaseFactory.CreateDatabase();

            DbCommand cmd = db.GetStoredProcCommand("Debitar");

            db.AddInParameter(cmd, "IdCuenta", DbType.Int32, idCuenta);
            db.AddInParameter(cmd, "Monto", DbType.Int32, monto);

            int regsAfectados = db.ExecuteNonQuery(cmd);
            return regsAfectados;
        }
    }
 

Y ahora, entra TransactionScope, al cual lo instanciaremos en la clase Caller:

    class Program
    {
        static void Main(string[] args)
        {
            int monto = 500;
            int idCuentaOrigen = 1200;
            int idCuentaDestino = 2235;

            Console.WriteLine("Iniciando transferencia...");

            using (TransactionScope ambito = new TransactionScope())
            {
                // Hacer el crédito
                Banco.Acreditar(monto, idCuentaDestino);
                // Hacer el débito
                Banco.Debitar(monto, idCuentaOrigen);

                // Completar la transacción
                ambito.Complete();
            }

            Console.WriteLine("Transferencia realizada con exito.");
        }
    }
 

Se nota claramente cómo luego de instanciar a TransactionScope nos olvidamos por completo de la transacción y simplemente nos dedicamos a invocar a cada método que hará sus operaciones de base de datos. Una vez que todos los métodos han hecho su trabajo, simplemente invocamos al método Complete y listo, TransactionScope hará Commit de todas las transacciones pendientes.

Creo que es obvio la forma como este enfoque ayuda enormemente a resolver los problemas antes mencionados. Claro está que si alguno de los componentes participantes no ha sido programado para enlistarse en transacciones, pues el mismo simplemente no participará de la misma, pero el implementarle esa funcionalidad adicional no implicará el añadirle parámetros adicionales a los métodos, lo cual es un gran alivio.

Ustedes dirán: Ok, pero no podía hacer ya todo esto con Enterprise Library 2.0? La respuesta es sí, pero el costo era mayor. Enterprise Library 2.0 normalmente abre y cierra una conexión cada vez que se invocaba algún método para interactuar con la BD (ExecuteNonQuery, ExecuteReader, LoadDataset, etc). Esto no es compatible con la forma como opera TransactionScope, puesto que, al haber más de una conexión, él considerará que esta es una transacción distribuida (MSDTC) y ese tipo de transacciones tienen un costo en rendimiento realmente significativo, comparado con una simple transacción local.

La genialidad del nuevo Enterprise Library 3.0 está en que ahora los métodos de la clase Database reconocen la existencia de un TransactionScope (de haber alguno) y automáticamente enlista las llamadas a la BD en dicha transacción. Con ello, la clase Database sabrá que debe usar una misma conexión a la BD, lo cual evita la subida hacia transacciones distribuidas y mantiene las transacciones locales.

Esta es solo una pequeña parte de las grandes ventajas que ofrece el trabajar con la Enterprise Library. Para más detalles, revisa este link. Así mismo, más detalles sobre el uso del TransactionScope, por acá.

Julio.

Recursos para Aprender ASP.NET desde cero

ASP.NET es una de las tecnologías web que más interés despierta entre los desarrolladores hoy en día, y de allí la amplia necesidad de excelentes recursos para aprender desde cero. Es así que quisiera aprovechar este post para listar algunos de los mejores recursos existentes para aprender esta fascinante tecnología:

En Español:

  • Aprender ASP.NET. Sitio creado por Microsoft exclusivamente para enseñar ASP.NET tanto a quienes no tienen experiencia previa con dicha tecnología, como a quienes vienen de otros ambientes similares, como PHP y JSP.
  • Curso de Desarrollo Web con Visual Studio 2005. Excelente curso dictado por José Alarcón Aguín, MVP en ASP.NET. Cubre lo fundamental que todo desarrollador debe conocer sobre la plataforma.
  • Tutorial de ASP.NET. El tutorial fundamental que siempre hay que tener a la mano para conocer cómo realizar las tareas comunes con ASP.NET.
  • Desarrollador 5 Estrellas. Programa de capacitación online gratuito que ayuda al estudiante a escalar poco a poco en sus conocimientos sobre la plataforma .NET.
  • Centro de Desarrollo de Microsoft de ASP.NET. El gran concentrador de artículos, videos, cursos, webcasts, presentaciones, descargas y demás recursos que brindan todo lo necesario para aprender ASP.NET, tanto a nivel básico, medio y avanzado.
  • Sitio oficial de ASP.NET. Contiene varios artículos, videos y demás recursos que son de gran utilidad para iniciarse y/o profundizar en la plataforma.

En Inglés:

Son solo algunos de los centenares de recursos que hay dispersos por la Web. Espero les sean de utilidad.

Julio.

Más envíos