Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

November 2009 - Posts

Tales from the Scrum: el Product Owner y el Product Backlog

Quisiera hoy detenerme en uno de los roles de Scrum: el Product Owner  (podría traducirlo por “dueño del producto”, pero voy a seguir la costumbre de usar la denominación en inglés), y en particular, en una de sus actividades.

La principal actividad, que le compete completamente, es el mantenimiento de los items del Product Backlog, y sus prioridades. Recordemos que el Product Backlog es el documento que lista la funcionalidad que esperamos del producto terminado. Esta lista es evidentemente importante: mal armada, puede hacer que el producto a entregar no sea el que el cliente final necesita.

Esa lista no la decide el Equipo, y menos el Scrum Master. Lo decide el cliente, en reuniones anteriores al inicio del proceso, donde pueden intervenir distintos interesados, pero de ahí en más es el Product Owner el responsable de mantenerlo (un Product Backlog puede cambiar con el tiempo, no es un documento escrito en piedra). Este es el responsable de entender, mantener, y conocer las prioridades de esta lista, del que saldrá el producto que entregaremos al final del proceso.

Es común, si no se conoce Scrum, querer priorizar los items por su orden “lógico” de desarrollo. No: la idea es priorizar por importancia para el negocio, para lo que necesita el cliente. De ahí que las prioridades no las decide el Equipo, sino el Product Owner.

Esto implica que la persona que encarne ese rol, debe conocer del negocio del cliente. Debe tener contacto con los principales actores de la actividad del negocio, entenderlo, y debe conocer cuáles son las áreas importantes. Demos un ejemplo.

Si tenemos que desarrollar un sistema de seguros en línea, el Product Owner deberá decidir qué partes del sistema a entregar darán más valor al negocio, y por qué. Tal vez, el grueso del negocio sean los seguros de vida, o tal vez el seguro de camiones, o quizás el seguro de autos. Dependiendo de ese dato, se podrá priorizar el tener una aplicación para calcular un seguro de vida, antes que uno de autos. No se comienza por lo “más fácil”, o por “lo que nos están pidiendo ahora”, sino por lo más importante.

Si un equipo técnico tuviera que decidir sobre esos puntos, seguramente tomaría primero el tener una base de datos, o un sistema de seguridad, o cualquier otro punto. No es la idea en Scrum: la idea es entregar, al final de cada Sprint, iteración, algo que agregue valor. Por supuesto, lo entregado deberá cumplir con la calidad esperada por el cliente, pero debe estar alineado con los items del Product Backlog, armado y priorizado por el Product Owner.

Como escribía más arriba, el Product Backlog inicial no es necesariamente EL Product Backlog final. Pero los cambios, de items, de prioridades, deben ser hechos por el Product Owner. El Equipo podrá levantar la mano, sugerir cambios, pero la decisión de cualquier modificación, recae en el Product Owner. Y éste no deberá cambiar los items por cualquier causa: deberá consultar con los interesados en el proyecto, con los que conocen del negocio, y estar atento a cualquier cambio en el entorno, para poder priorizar los items que son necesarios mantener en el Product Backlog.

Vean entonces, la importancia del rol del Product Owner. De hecho, hay cursos especiales de entrenamiento de Product Owners, en el ambiente de Scrum. Muchas de las decisiones importantes pasan por él. Por supuesto, no son decisiones en solitario, consulta y recibe asesoramiento de otros interesados. Pero un Product Owner debe ser alguien que realmente se empape del negocio y del producto que queremos lograr. Puede que no sepa todo, pero debe tener el acceso a la información y al conocimiento de otras personas, y tener una mente y actitud de aprendizaje y atención al negocio.

Uno de los anti-patrones de Scrum que mencionaba en el post Anti-Patrones de Sprint era Demasiados cambios en los requerimientos, entre Sprints. Román Mussi comentaba:

Angel, sobre esto:

"Demasiados cambios en los requerimientos, entre Sprints"

Esto no estaría dependiendo del Product Owner? Y en ese caso... como puede intervenir el ScrumMaster para mitigar el problema?

Ciertamente, es un problema que puede nacer de un Product Backlog cambiante. Quisiera aclarar que los cambios pueden ser necesarios: tal vez el negocio de seguros cambión, y la plata ahora está en asegurar camiones: los seguros de vida donde poníamos nuestras fichas fueron afectados por algo, como la llegada de un competidor del extranjero, un cambio en la legislación, o lo que sea. Y esos cambios, el equipo debe enfrentarlos, sin perder impulso, sin sentir el “dolor del cambio”. Scrum, como todo lo ágil, está preparado para fomentar la aceptación del cambio, no de luchar contra él. Pero el anti-patrón aparece si los cambios no son producidos por una nueva evaluación del negocio.

Los cambios así sin sentido de negocio, pueden venir de varias causas. Por ejemplo, un Product Backlog débil inicialmente, que no estaba claro al comienzo, puede ir mejorando al ir entendiéndose mejor el producto a producir, y el negocio en el que está inserto. Igualmente, pediría tratar de evitar esta situación: antes de lanzar el proceso, debería quedar más claro el Product Backlog. No habría que escatimar esfuerzo en tener un buen Product Backlog. Insisto: puede que no sea el final, pero deberíamos haber invertido un tiempo para no desperdiciar tiempo y esfuerzo del equipo. Es claro que no esperamos un “gran diseño inicial”, no es un tema de diseño técnico: es tema de sentido común, sobre lo que queremos obtener.

Pero, por lo menos, si lo anterior tiene olor de anti-patrón inicial, por lo menos el documento evoluciona hacia algo mejor, más firme. Pero otra causa para que aparezca “mal olor” en el Product Backlog (más frecuente de lo esperado, en especial en proyectos largos), es ceder a las presiones externas: de pronto, por atender lo urgente (“tenemos que tener en línea los seguros de autos para la exposición Car2009 que comienza dentro de un mes”), o requerimientos internos de gente con poder en el cliente (“mi división necesita los seguros de camiones para ayer”), el Product Owner cede y cambia el Product Backlog. A ver, pongamos alguna aclaración y contexto: si realmente el futuro de la empresa depende del impacto que tenga en la exposición de autos que viene, entonces es válido el cambio (yo preguntaría entonces: esa exposición estaba planeada desde hace un año, por qué ese cambio de dirección no se previó antes?). Pero si solamente es un cambio promovido por urgencia, y no por importancia, estamos atacando el proceso.

De alguna forma, todo lo ágil, más allá de Scrum, nos trata de proteger del síndrome “lo urgente mata lo importante”. El Product Backlog es el documento primordial, que guía las decisiones del resto del proyecto. El tener un Product Backlog “manteca”, que cambia de forma a cada momento, o según “cómo calienta el sol”, que se modifica incluso en el medio del Sprint (los dioses de Scrum no lo permitan!!), es síntoma de estar reaccionado a lo urgente, en vez de actuando sobre lo importante. El Product Owner, ayudado por el Scrum Master, y el compromiso de la dirección, deberá encarar ese problema.

Espero que haya quedado claro la importancia del rol del Product Owner (en mi postura, el eslabón más débil en Sprint, por ser el que concentra tantas decisiones), y la salud del Product Backlog. Pienso que agregando ejemplos negativos al final, quedó mejor transmitido ese mensaje. He visto proyectos bien llevados, donde todo esto pasa desapercibido, justamente, porque es lo natural. Poner énfasis en los problemas, nos ayuda a entender por qué funciona un proyecto Scrum bien manejado.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Sat, Nov 28 2009 11:01 by lopez | 4 comment(s)

Filed under: ,

ALT.NET Hispano VAN: Mocking, Rhino Mocks, Moq con Hadi Hariri

Este sábado 28 de noviembre, la comunidad ALT.NET Hispano organiza una nueva VAN (Reunión virtual). Esta vez el horario (tomen nota) será 19:00 GMT/UTC (4 de la tarde por aquí en Buenos Aires, Argentina). El tema será el uso de Mocks, en nuestras pruebas automatizadas. La presentación del tema estará a cargo del bueno de Hadi Hariri (que pueden seguir en Twitter en @hhariri). Hadi vive en España, se presenta en su sitio:

http://hadihariri.com

de esta manera:

I'm a software developer and work as Tech Lead for iMeta Technologies. I also give talks and presentations. I love to travel and luckily get to do so when speaking at conferences. My main passions are Software Architecture, Web and TCP/IP development. I live in Málaga, with my wife Katya and my two wonderful sons, Maxim and Sasha. I run the local .NET User group for Málaga and the province. If you live in Málaga or are visiting, drop me a line.

Pueden leer sobre sus conferencias e intereses en:
http://hadihariri.com/blogengine/page/Conferences.aspx
http://hadihariri.com/blogengine/archive.aspx

El enlace a usar es http://snipr.com/virtualaltnet. La información sobre las VAN que vienen, están en la página del Calendario de ALT.NET Hispano. Ahí leo más detalles sobre esta reunión de mañana sábado:

La comunidad ALT.NET Hispano (http://altnethispano.org) realizará un evento virtual con el tema "Mocking" (e "Inyección de Dependencias"), a cargo de Hadi Hariri. Fecha: Sábado 28 de Noviembre a las 19:00 hrs. Hora Internacional (GMT/UTC), con una duración aproximada de 2 horas.

Lugar: Para atender la reunión deben usar el enlace: http://snipr.com/virtualaltnet el cual les demandará el uso del programa Microsoft Office Live Meeting 2007 Client. En esta ocasión la desconferencia estará a cargo de Hadi Hariri, Visual C# MVP, quien es consultor y desarrollador ante todo, así como apasionado de la arquitectura de software y el desarrollo de aplicaciones web. Es ponente habitual en conferencias sobre .NET y Win32, y ha escrito numerosas publicaciones.

Descripción: En esta charla primero repasaremos la inyección de dependencias e Inversión de Control y profundizaremos en los frameworks de Mocks. Veremos cómo funcionan, éstos últimos, así como también cómo sacarle el máximo de partida a ellos para hacer tests sostenibles. Examinaremos las diferencias entre Mocks y Stubs así como diferencias entre pruebas de estado e interacción.

Algunas páginas a revisar:

Inversion of Control Containers and the Dependency Injection pattern

Mocks can be your friend, or your worst nightmare

Mocks Aren't Stubs

Rhino Mocks

Moq

TypeMock

NMock

Pueden plantear sus comentarios e inquietudes sobre el tema de la reunión en: http://groups.google.com/group/altnet-hispano/t/57766b68494fe859 Para mayor información sobre cómo atender la reunión consulten: http://tinyurl.com/van-hispano Pueden vincular el Google Calendar al suyo (http://screenr.com/nr7), o bien descargar el iCal de este evento en particular: http://altnet-hispano.pbworks.com/f/VAN20091128.ics

Si no conocen qué es una reunión VAN, pueden consultar VAN meetings. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver Descripcion-de-Reuniones-VAN. Pueden ver el historial de anteriores reuniones VAN (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo participé en VAN sobre Scrum y en otra sobre generación de código). También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad. Si no pueden asistir a ésta VAN, seguramente quedará publicada más adelante, con video incluido.

Con respecto a Mocks, y librerías de mocking, he dejado enlaces en:

http://delicious.com/ajlopez/mocks
http://delicious.com/ajlopez/rhino
http://delicious.com/ajlopez/moq

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Fri, Nov 27 2009 11:29 by lopez | 1 comment(s)

Generando código con AjGenesis usando archivos de mapeo de NHibernate

En estos días, estuve trabajando en generar código de clases C#, usando como punto de partida los archivos .hbm, que se usan en NHibernate para especificar el mapeo de clases y tablas de bases relacionales. Como es usual, cuando encaro algo de generación de código uso AjGenesis, mi proyecto open source de generación de código (practico el “dog fooding” :-).

(English version of this post Generating code with AjGenesis using NHibernate hbm files)

Pueden bajar un ejemplo de lo que estoy haciendo de mi Skydrive:

Examples > AjGenesis > NHibernateMappingExample01.zip

(el código en desarrollo está en el trunk, en este change actual, en el directorio examples\NHibernateMappinp:

pero si quieren ir directamente al ejemplo, pueden bajárselo completo desde el Skydrive que mencioné, que incluye el ejecutable de AjGenesis de la versión en desarrollo, no necesitan compilar nada).

Luego de expandir el archivo del ejemplo, tendrán este contenido:

 

Para crear clases C#, pueden probar de ejecutar los comandos:

GenerateClasses AjFirstExample
GenerateClasses AjTest

Para crear un proyecto .NET con los archivos .cs y .hbm, y una solución, ejecutar:

GenerateProject AjFirstExample
GenerateProject AjTest

Los archivos generados, en ambos casos, quedan en el directorio Build.

Hay dos proyectos ejemplo que son AjFirstExample, con dos mapeos simples, y AjTest, que tiene mapeos más interesantes, con “bags” y relaciones “many to one”.

En el ejemplo, cada proyecto se describe con un simple archivo Project.xml:

<Project Name="AjTest">
</Project>

En cuanto necesite más información, lo agregaré ahí, o en tags meta de los propios archivos de mapeo y configuración.

Este es uno de los archivos de mapeo que sirven de modelo inicial para este ejemplo de generación, en Projects\AjTest\Mappings, Department.hbm:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  assembly="AjTest.Entities"
  namespace="AjTest.Entities"
  >
  <class name="Department" table="departments">
    <id name="Id" column="Id" type="Int32">
      <generator class="native"/>
    </id>
    <property name="Description" type="String"/>
    <bag name="Employees" lazy="true" inverse="true" cascade="all">
      <key column="IdDepartment"/>
      <one-to-many class="AjTest.Entities.Employee, AjTest.Entities"/>
    </bag>  
  </class>
</hibernate-mapping>

Este es el código generado para este mapeo, Department.generated.cs:

using System;
using System.Collections.Generic;
using Iesi.Collections.Generic;
namespace AjTest.Entities 
{
  public class Department {
    public int Id { get; set; }
    public string Description { get; set; }
    public IList<Employee> Employees { get; set; }
    public Department() 
    {
      this.Employees = new List<Employee>();
    }
  }
}

Veamos el proceso de generación. Este es el contenido de GenerateProject.cmd:

@echo off
set ProjectName=%1%
if "%1%"=="" set ProjectName=AjFirstExample
Bin\AjGenesis.Console.exe Projects\%ProjectName%\Project.xml Tasks\AddMappings.ajg Tasks\BuildCSharp.ajg
xcopy Libraries\*.* Build\%ProjectName%\CSharp\Src\Libraries /Y /Q

La línea más importante es la que invoca a AjGenesis.Console.exe. El contenido de Project.xml se carga en memoria. La tarea AddMapping.ajg se carga y ejecuta (está escrita en un lenguaje dinámico, afectuosamente llamado AjBasic), y luego, se procesa la tarea BuildCSharp.ajg. Veamos el código de AddMapping.ajg:

' Add mappings from directory if not specified in Project model
Include("Utilities/Utilities.tpl")
if not Project.Mappings then
  Project.Mappings = CreateList()
  
  di = new System.IO.DirectoryInfo("Projects/${Project.Name}/Mappings")
  
  for each fi in di.GetFiles("*.hbm.xml")
    filename = fi.Name
    Project.Mappings.Add(filename.Substring(0, filename.Length - 8))
  end for
end if

Encuentra y agrega los nombres de los archivos de mapeo contenidos en el directorio de Mapping, dentro del proyecto (noten que se pueden usar clases y objetos del framework .NET). Una tarea más interesante es la GenerateCSharp.ajg. Primero, carga la dll de NHibernate, para usar más adelante su parser de archivos hbm:

include "Utilities/Utilities.tpl"
include "Utilities/FileUtilities.tpl"
include "Utilities/TypeUtilities.tpl"
Include("Utilities/NHibernateUtilities.tpl")
include "Templates/CSharp/UtilitiesCs.tpl"
include "Templates/CSharp/CSharpFunctions.tpl"
AssemblyManager.LoadFrom("Libraries/NHibernate.dll")
parser = new NHibernate.Cfg.MappingSchema.MappingDocumentParser()

Crea objetos dinámicos, donde coloca información de la solución y el proyecto a crear:

if not Project.BuildDir then
  Project.BuildDir = "Build/${Project.Name}/CSharp"
end if
message "Creating Directories..."
FileManager.CreateDirectory(Project.BuildDir)
FileManager.CreateDirectory("${Project.BuildDir}/Sql")
FileManager.CreateDirectory("${Project.BuildDir}/Src")
FileManager.CreateDirectory("${Project.BuildDir}/Src/Libraries")
message "Defining Solution and Projects..."
Project.Solution = CreateObject()
Project.Solution.Guid = "FAE04EC0-301F-11D3-BF4B-00C04F79EFBC"
Project.Solution.Projects = CreateList()
message "Defining Entities Project..."
PrjEntities = CreateObject()
PrjEntities.Includes = CreateList()
PrjEntities.Guid = CreateGuid()
PrjEntities.COMGuid = CreateGuid()
Project.Solution.Projects.Add(PrjEntities)
Project.Entities = CreateList()

Ahora, itera sobre cada archivo hbm, lo lee usando el parser del propio NHibernate, toma información sobre las clases a generar:

for each MappingName in Project.Mappings
  filename = "Projects/${Project.Name}/Mappings/${MappingName}.hbm.xml"
  mapping = parser.Parse(OpenAsStream(filename))
    
  for each hbmclass in mapping.Items where IsType(hbmclass, "HbmClass")
    Entity = CreateObject()
    
    Project.Entities.Add(Entity)
  
    Entity.ClassName = hbmclass.name
    Entity.Namespace = mapping.namespace
    
    ' Namespace as default project name for Entities Project
    if not PrjEntities.Name then
      PrjEntities.Name = mapping.namespace
      PrjEntities.Directory = "${Project.BuildDir}/Src/${PrjEntities.Name}"
      FileManager.CreateDirectory(PrjEntities.Directory)
    end if
    
    Entity.Properties = CreateList()
    
    if hbmclass.Id then
      Property = CreateObject()
      Property.Name = hbmclass.Id.name
      Property.Type = HbmTypeToCSharp(hbmclass.Id.type1, Entity.Namespace)
      Entity.Properties.Add(Property)
    end if
    
    for each item in hbmclass.Items
      if IsType(item, "HbmProperty") then
        Property = CreateObject()
        Property.Name = item.name
        Property.Type = HbmTypeToCSharp(item.type1, Entity.Namespace)
        Entity.Properties.Add(Property)
      end if
      
      if IsType(item, "HbmManyToOne") then
        Property = CreateObject()
        Property.Name = item.name
        Property.Type = HbmTypeToCSharp(item.class, Entity.Namespace)
        Entity.Properties.Add(Property)
      end if
      if IsType(item, "HbmSet") then
        Property = CreateObject()
        Property.Name = item.name
        Property.IsSet = true
        Property.Type = HbmTypeToCSharp(item.Item.class, Entity.Namespace)
        Entity.Properties.Add(Property)
      end if
      if IsType(item, "HbmBag") then
        Property = CreateObject()
        Property.Name = item.name
        Property.IsList = true
        Property.Type = HbmTypeToCSharp(item.Item.class, Entity.Namespace)
        Entity.Properties.Add(Property)
      end if
    end for    
  end for
end for

Pueden extender esta capacidades, procesando más tags (debería escribir un ejemplo usando los tags meta que puede contener el hbm; ya utilitarios de Java, como el venerable XDocLet, usaban esos tags para ayudarse en la generación de código, en Hibernate), y detectar más formas de mapeo de NHibernate. Ahora, pasa a la generación de código:

for each Entity in Project.Entities
  TransformerManager.Transform("Templates/CSharp/Entity.tpl", "${PrjEntities.Directory}/${Entity.ClassName}.generated.cs", Environment)
  PrjEntities.Includes.Add(CreateFileCs("${Entity.ClassName}.generated"))
end for

La tarea genera los archivos .cs, y también crea un archivo de solución y otro de proyecto C#, copiando y embebiendo los archivos de mapeo originales:

for each MappingName in Project.Mappings
  filename = "Projects/${Project.Name}/Mappings/${MappingName}.hbm.xml"
  targetfilename = "${PrjEntities.Directory}/${MappingName}.hbm.xml"
  System.IO.File.Copy(filename, targetfilename, true)
  PrjEntities.Includes.Add(CreateFileType(MappingName,"hbm.xml"))
end for
for each CsProject in Project.Solution.Projects where CsProject.ProjectType<>"Web"
  FileManager.CreateDirectory(CsProject.Directory)
  FileManager.CreateDirectory(CsProject.Directory & "/Properties")
  TransformerManager.Transform("Templates/CSharp/CsProject.tpl", "${CsProject.Directory}/${CsProject.Name}.csproj", Environment)
  TransformerManager.Transform("Templates/CSharp/AssemblyInfoCs.tpl", "${CsProject.Directory}/Properties/AssemblyInfo.cs", Environment)
end for
TransformerManager.Transform("Templates/Solution.tpl", "${Project.BuildDir}/Src/${Project.Name}.sln", Environment)

Esta es la solución generada:

Próximos pasos

Debería trabajar en algunos puntos:

- Generar una solución más completa, como en otros ejemplos de AjGenesis (con un proyecto de infraestructura, un proyecto de Service Layer o similar, una presentación web, etc…).

- Soportar más opciones de mapeo de NHibernate.

- Usar los tags meta.

Por ahora, pueden jugar con este ejemplo. Pueden cambiar los templates para generar más artefactos, por ejemplo, código VB.NET.

Gracias a @fabiomaulo por avisarmr de las capacidades públicas de parser de hbm dentro de NHibernate!

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Mon, Nov 23 2009 9:18 by lopez | 3 comment(s)

Lo bello de Twitter: Ejemplo 1

Soy un gran usuario de Twitter. Generalmente, uso TweetDeck como cliente, aunque a veces voy por la interfaz web. Twitter es la implementación de un idea simple (mensajes cortos, podemos seguir a quien querramos que tenga perfil público, nos pueden seguir y dejar de seguir en cualquier momento (noten los cambios de Facebook a tener perfiles públicos, veo que motivados por la facilidad que se da en Twitter)) Todo eso ha cambiado la forma en que interactuamos. En especial, en el ambiente del desarrollo del software, Twitter es un gran complemente (podría ser un reemplazo) a los lectores de feeds. Veamos un ejemplo de lo efectivo que puede ser.

Todo comenzó ayer sábado, con un mensaje de @jfroma, desarrollador de software argentino, como yo, que escribía:

Yo no había leído todos sus mensajes del viernes, así, que curioso sobre ese comentario, fuí y los leí. El mensaje original aludía al patró Model View View Model. Sé que José (@jfroma) ha estado trabajando en ejemplos de data binding en WPF usando modelos recuperados con NHibernate, así que seguí el link que apuntaba al usuario @michaellperry, para leer sus mensajes. Era mi primer contacto con Michael:

Encontré, entre sus mensajes del viernes, esta presentació:

Session Detail: Data binding without INotifyPropertyChanged

preguntando para confirmar a @jfroma:

Ahora, tenía más contexto (una frase que repito muchas veces: con contexto, uno se puede manejar más entre la información que recibe). Con todo esto, descubro los intereses de Michael en su blog (noten cómo Michael usa su estado Twitter a la izquierda):

http://adventuresinsoftware.com/blog

Descubrí la librería de código abierto de la presentación de Michael:

http://updatecontrols.net

Como siempre que encuentro algo interesante, ya sea para mí, o que pienso que puede ser interesante para alguien, comencé a tweetear sobre el tema. Al rato, veo que @jyinglee desde China, también tomó nota, haciendo RT de mi mensaje:

 

Todo comenzó con un simple mensaje. Este es el poder de Twitter, es“serendipity with help” (descubrimiento accidental con ayuda), con la ayuda de gente interesante que nos sigue y a la que seguimos.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Sun, Nov 22 2009 9:31 by lopez | with no comments

Alt.Net Hispano VAN, ASP.NET MVC 2 con estilo, de Oxite a CodeCamp

Este sábado 21 de Noviembre, tendremos VAN (reunión virtual) organizada por la comunidad ALT.NET Hispano. El tema será ASP.NET MVC, en particular, la versión 2. Como siempre, la reunión no será sólo una exposición, sino también discusión, preguntas, ejemplos, recursos, opiniones. Hasta donde sé, el horario es el de siempre 5:00pm GMT (2 de la tarde acá en Buenos Aires). Y en enlace a usar es http://snipr.com/virtualaltnet (más detalle sobre software y qué es una VAN al final de este post).

La presentación inicial estará a cargo de Cristian Prieto, Microsoft ASP.NET MVP, MCPD ASP.NET Web Development Applications 3.5, MCTS Workflow Foundation 3.5:

http://www.cprieto.com/ (me gusta el título “IDisposable Thoughts” :-)

Hi, My name is Cristian Prieto, I'm a Senior Software Developer living in Guatemala, Central America. I mainly "speak" in .Net languages (like C#, F# and _even_ VB.NET) but I really love programming in Python/Ruby/Erlang. When I'm not programming (or speaking at a .net user group) I enjoy reading and spend my life with my beautiful wife (Emy) and my three cats: Cocco, Motto and Chester

Pueden seguirlo en Twitter como @cprieto:

y en LinkedIn como http://www.linkedin.com/in/cprieto. Ahí leemos su experiencia:

- Experienced Web Developer with more than 9 years in technologies like ASP.NET, PHP, Python, JavaScript and distributed programming.
- Agile software developer proficient with patterns and best practices like Test Driven Development, Behavior Driven Development and Continuous Integration.
- Lover of agile process based development like Lean Development, Kanban and Scrum.
- Technical Community Leader, mentor of new development trends and best practices. Awarded Microsoft ASP.NET MVP 2009
- Accustomed to work with many languages and tools.
- Self-thought and early adopter

Cristian Prieto’s Specialties:

ASP.NET, SQL Server, Web Development in general
Python, Best practices, Multi tier application development, Agile development (lean, kanban, scrum)

Escribe el bueno de Cristian en la lista de ALT.NET Hispano, cuál va a ser el tema de la charla:

Como ustedes recordaran, este sábado 21 de noviembre tendremos la VAN acerca de ASP.NET MVC 2, quería comentar un poco de que esperar para esta VAN (bueno, quizás también por parte del nerviosismo de ser mi primera VAN :P)
ASP.NET MVC fue "cocinado" durante 1 año y mientras tanto nos mantubieron pegados a la silla con 5 CTP's y un par de betas... después de varios meses hemos visto aplicaciones en producción con la plataforma, 5 libros acerca del tema, muchos y muchos webcasts (hay 2 en alt.net hispano :D) y conferencias de "cómo explotarla", multiples proyectos de ejemplo.... y, obviamente, muchas preguntas luego de hacer el "hola mundo".
¿Qué pasa cuando necesitamos algo más que el típico proyecto de NerdDinner? ¿Qué pasa cuando mi aplicación realmente no es un típico ejemplo? ¿Dónde pongo la lógica? ¿Cómo divido y saco provecho de la framework? ¿Qué otras cosas podemos tener bajo la manga para hacernos la vida más sencilla?
Para aclarar estas dudas, examinaremos desde el punto de vista histórico y práctico con qué solemos comenzar y hasta dónde lo podemos llevar, mencionando cosas como MvcContrib y MvcTurbine y dónde encajan cosas como SharpArchitecture en todo esto...
¿Porqué menciono todo esto si la charla es de
ASP.NET MVC 2?, simple, porque gran parte de los "problemas" que solemos encontrarnos con ASP.NET MVC vienen o prometen venir solucionados en la "cajita" de la versión 2...
Espero verlos en la VAN, y espero que les guste lo que he preparado :)

Todo indica que va a ser una VAN muy interesante: el título del mensaje (y de este post) alude a un proyecto “fracaso” Oxite, con código disponibl, que fue critica por la comunidad por los “bad smell” que presentaba en la implementación, y a CodeCamp, un nuevo proyecto de código abierto, que sirve de muestra de mejores prácticas con ASP.NET MVC (Model View Controller). Cristian menciona también a proyectos como SharpArchitecture, MvcContrib y MvcTurbine.

Si no conocen qué es una reunión VAN, pueden consultar VAN meetings. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver Descripcion-de-Reuniones-VAN. Pueden ver el historial de anteriores reuniones VAN (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo participé en VAN sobre Scrum y en otra sobre generación de código). Supongo (pero confirmen) que la URL de entrada de esta VAN será http://snipr.com/virtualaltnet. Cualquier cosa, pueden consultar la lista de correo de ALT.NET Hispano. También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad. Si no pueden asistir a ésta VAN, seguramente quedará publicada más adelante, con video incluido.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Thu, Nov 19 2009 12:08 by lopez | 1 comment(s)

Curso de Scrum práctico en Buenos Aires

En general no anuncio los cursos que estoy por dar (la difusión queda a cargo de cada institución), pero este es un curso que quiero destacar, porque trata de un tema que pienso que todo grupo de desarrolladores por lo menos tendría que conocer y practicar en algún momento. Es un curso que hace unos meses que no estoy dando por Buenos Aires, y siempre he tenido buenas experiencias dándolo.

Gracias a la gente del Microsoft User Group de Argentina, daré un curso de Scrum con una explicación inicial, y luego todo práctica, el miércoles 2 de diciembre de 2009. Pueden ver más datos, costos, y forma de inscribirse en:

Jornada de Scrum, teoría y práctica

El contenido (lo copio de ahí):

- El Equipo de trabajo. Los Roles: ScrumMaster. Product Owner. Daily Scrum. Chickens y Pigs. ScrumMaster vs Project Manager.
- Objetivos: Control empírico del proceso de desarrollo. Dar visibilidad de lo que se está haciendo. Generar una relación de confianza y comunicación constante entre el cliente y el equipo.
- Los Conceptos: Iteraciones. Autoorganización. Descripción del método.
- La Documentación: Qué es, cómo se arman y cómo se utilizan el Product Backlog, el Sprint Backlog y Burndown Chart.
- La Práctica: Se formarán equipos de trabajo, que resolverán un caso práctico. Se asignarán los roles y se discutirá cada caso en particular, buscando arribar a la solución al final de la jornada.

Lo importante es el trabajo práctico. Iremos descubriendo juntos algunas características, prácticas, y el por qué de cada cosa, en el marco de trabajo Scrum.

Para los que no puedan asistir, recuerden que siempre escribo por acá sobre el tema en posts sobre Scrum. Ahí encontraran un varios posts, con enlaces, referencias, presentaciones, sobre el tema Scrum y ágil en general. Los posts primeros a revisar, con material relacionado, incluso un video de una charla y discusión sobre el tema, en:

Resultado de la VAN en ALT.NET Hispano sobre Scrum
Scrum Práctico
Scrum Práctico en Santa Fe
Explicando Scrum

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Tue, Nov 17 2009 13:39 by lopez | with no comments

Tales from the Scrum: La esencia de Scrum

En esta serie de post, aún falta que escriba describiendo de principio a fin lo que es Scrum. Para llegar a ese punto, primero quiero compartir con Uds. esta traducción de un post de Tobias Mayer, quien fue mi instructor de Scrum Mastering en 2006. El post original, en inglés, lo encuentran en:

Essence of Scrum

Acá va mi traducción:

Scrum comenzó su vida como uno de las nuevas formas Agiles para construir software. En estos días, se lo considera una forma que puede ser usada para mejorar el mundo del trabajo, en un sentido más general, y así, cambiar la forma en que los individuos piensan e interactúan con otros en situaciones de trabajo. El potencial completo de Scrum está por explorar.

En resumen, Scrum es una manera simple de manejar problemas complejos, proveyendo un marco de trabajo para soportar la innovación y permitir que equipos auto-organizados entreguen resultados de alta calidad en tiempos cortos. Scrum es un estado de la mente; en una manera de pensar que libera el espíritu creativo mientras se mantiene firmemente apoyado en principio sólidos y largamente respetados, incluyendo el empirismo, la emergencia y la auto-organización.

Empirismo se refiere al proceso continuo de inspeccionar/adaptar que permite que tanto trabajadores como gerentes tomen decisiones en tiempo real, basado en datos actuales, y como resultado, puedan responder rápidamente a  condiciones siempre cambiantes que se presentan en el ambiente, como por ejemplo, el mercado donde el software a construir es vendido o distribuido.

La Emergencia surge de una aproximación empírica. Implica que todas las soluciones a todos los problemas se volverán claros a medida que trabajamos. No se volverán claros si simplemente hablamos de ellos. El “Big Up Front Design” (gran diseño de antemano) sólo producirá un “Big Wrong Design” (gran diseño erróneo) o a lo sumo un “Big Working But Totally Inflexible Design” (gran diseño que funciona pero totalmente inflexible). Cuando permitimos que las soluciones emerjan es siempre la solución más simple y apropiada, para el contexto actual, la que sube a la superficie. La emergencia junto con el empirismos nos guiaran a la solución más apropiada y flexible (es decir, que podemos cambiar).

Auto-organización se refiere a la estructura de los equipos que crean el producto. Se les da poder a pequeños equipos multidisciplinarios para que puedan tomar decisiones importantes, necesarias para 1) crear un producto de alta calidad, y 2) manejar su propio proceso. Acá la idea es que aquellos que hacen el trabajo conocen mejor que nadie cómo hacer el trabajo. Estos equipos trabajan de una manera altamente interactiva y generativa, donde el producto emerge del diálogo continuo, de la exploración e iteración. La auto-organización funciona cuando hay objetivos y límites claros.

Además de estos principios, Scrum se apoya en dos mecanismos principales: priorización y “timeboxing” (poner límites de tiempo a una tarea).

Priorización simplemente significa que hay cosas que son más importantes que otras. Esto es tan obvio que se olvida muchas veces cuando pensamos “necesitamos esto AHORA”. Scrum nos ayuda a poner el foco de vuelta en seleccionar cuáles son las cosas más importantes a hacer primero, y entonces, a hacerlas! Tomándose el tiempo para priorizar, y siendo rigurosos sobre eso, es esencial para el éxito de Scrum.

Timeboxing es un mecanismo simple para manejar la complejidad. No podemos imaginar el slistema completo de una vez, todo junto, entonces, tomamos un pequeño problema y en un corto espacio de tiempo, digamos una semana o un mes, trabajamos en solucionar ese problema. Los resultados de esa acción nos guiaran entonces a una solución para el próximo problema, más grande, y nos dará más conocimiento sobre las necesidades del sistema en conjunto.

Cambio organizacional

Con Scrum, las jerarquías de gerencia de las organizaciones tienden a ser niveladas y los equipos de desarrollo tienen más contacto directo e inmediato con los clientes. El ambiente de trabajo se vuelve menos “comandar-y-controlar” hacia un estilo más colaborativo. Se promueve el diálogo regular y abierto sobre la documentación extensiva, y el acuerdo negociado es preferido a los contratos de trabajo formales e impersonales.

Las cualidades de apertura, honestidad y coraje son fomentadas en todos los niveles, y la ganancia individual se vuelve secundaria ante el avance colectivo. Un ambiente Scrum es uno que soporta a la gente, donde las personas de todos los niveles muestran respeto y confianza entre ellos. Las decisiones se toman por consenso, más que por imposición de alguien de más arriba, y todo el conocimiento es compartido, de una manera transparente y sin recelos.

Scrum va en contra de lo que hacen muchas compañías de la industria del software, donde una forma en fases acoplada con un alto grado de micro-gerenciamiento, y una insistencia en procesos definidos y documentación extensiva, se han hecho la norma por treinta años. Muchas compañías se basan en el miedo y el dinero como motivaciones claves para sus trabajadores. Esta forma de trabajo ha mostrado éxitos a corto plazo, pero más y más compañías están comenzando a entender que no es una buena estrategia para el largo palzo. Sin embargo, el concepto de cambiar a algo tan radical como Scrum aterroriza a muchos corazones de ejecutivos y gerentes de nivel medio.

Scrum está aún en la etapa de los “early-adopter” (los que abrazan tempranamente las nuevas ideas). Tomará muchos años para que la mayoría de las compañías reconozcan los beneficios de crear más lugares de trabajo, llenos de confianza. Sin ese cambio, muchas compañías de software se irán hundiendo bajo el peso de sus procesos pesados, y fuerzas de trabajo sobrecargadas. Otros, aquellos que abracen el método liviano, ágil, de Scrum, tendrán la gran oportunidad de sobrevivir y prosperar. Para aquellos que pasen a Scrum, y lo abracen completamente, la vuelta atrás a a los viejos días de trabajo será impensable. Un cambio de paradigma está ocurriendo en el lugar de trabajo, y Scrum es una parte importante de ese cambio.

Nota: el término Scrum proviene de un “paper” titulado The New New Product Development game de Hirotaka Takeuchi y Ikujiro Nonaka. En rugby, un scrum es una forma de recomenzar el juego, luego de una infracción accidental o después que la pelota salió de juego. La práctica de Scrum en el mundo del software incluye reuniones regulares diarias y cortas donde los miembros del equipo se juntan para comunicar su progreso. Debido a la similitud entre la pausa del juego (trabajo), y habiendo los jugadores (miembros del equipo) armado la reunión, ésta se conoce comúnmente como el Daily Scrum. Jeff Sutherland, John Scumniotales y Jeff McKenna son los responsables de haber introducido el término Scrum en el mundo del desarrollo del software en 1993, mientras trabajaban en la Easel Corporation, una compañía de herrmientas de software de Massachusetts. Ken Schwaber escribió el “paper” original sobre Scrum, SCRUM Development Process, que fue presentado en la conferencia OOPSLA en 1995.

Otras referencias:
Scrum: its place in the world
Scrum for Software Development

Gracias a Tobias por tan buena descripción de Scrum.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Mon, Nov 16 2009 9:14 by lopez | 2 comment(s)

Smalltalks 2009 en Buenos Aires: Una conferencia pensada para vos

Ya había publicado el anuncio de este evento en:

Smalltalks 2009 en Buenos Aires

Puede ver más detalle en el sitio del evento:

Smalltalks 2009

Y en mi post, encontrarán enlaces y detalles de algunos de los participantes de esta tercera edición de estas conferencias y reuniones, armadas por la comunidad smalltalkera de Argentina.

Me pareció interesante publicar este email que recibí en una lista, donde la gente organizadora explica más en detalle los eventos, y el interés que tienen para los desarrolladores de software, sean o no del ambiente Smalltalk:

¿Querés conocer cómo se gestó la programación orientada a Objetos? ¿Te gustaría conocer en persona a uno de aquellos locos que revolucionaron la computación en la década del 70 en Xerox Parc junto al Turing Award Alan Kay?, entonces tenés que venir a Smalltalks 2009 a ver la charla de Dan Ingalls sobre "40 Years of Fun with Computers" y la sesión de preguntas y respuestas denominada "A fireside chat with Dan Ingalls"

¿Querés conocer qué es lo último que se está haciendo de investigación en objetos, realmente distinto y novedoso?, entonces tenés que venir a Smalltalks 2009 y ver la presentación de Stephane Ducasse "I have a dream... let's make it came true" y la presentación de Alex Warth  "Implementing programming languages for fun and profit with OMeta"

¿Estas interesado en entender un poco más que es la meta-programación y para que sirve? ¿Querés entender qué significa que un ambiente sea Meta-Circular? ¿No te cierra la herencia múltiple, te parece que las interfaces de Java o .Net se quedan cortas, tenés dudas sobre los mix-ins y sentís que debe haber una mejor manera para compartir código?, entonces tenés que venir a  Smalltalks 2009 y ver las charlas de "Glamour"  y "Helvetia" de Jorge Ressia, "Mejorando las herramientas de desarrollo de Smalltalk" de Diego Geffner y "Traits at Work" de Stephane Ducasse.

¿Alguna vez te preguntaste cómo funciona una base de objetos, qué diferencias tienen con una base de datos relacional, son más rápidas, son más lentas?... no quiero sonar repetitivo pero no puedo evitarlo, ¡¡¡tenés que venir a Smalltalks 2009!!! hay una charla dada por James Foster denominada "Introduction to GemStone" y un tutorial de un día enteramente dedicado a este tópico, ¡no te lo podés perder!

¿Alguna vez te preguntaste si es posible manejar hardware en tiempo real con objetos y con un lenguaje dinámico? ... hmmm... entonces no te queda otra que venir a Smalltalks 2009 y ver la charla de Gonzalo Zabala sobre "Physical EToys" y la de Andrés Otaduy sobre "Sistema Rul@"

¿Tenés dudas sobre si es posible diseñar y escribir con objetos buenos algoritmos genéticos o modelos matemáticos?, si lo tuyo va por ese lado, entonces tenés que venir a Smalltalks 2009 y ver la chala de Maximiliano Tabacman sobre "Genetic Algorithm Framework" y la de Leandro Caniglia sobre "Homological Algebra in Smalltalks"

¿Estás interesado en conocer los detalles de implementación de una Virtual Machine de objetos o saber qué tan seguras o inseguras son? jeje, ¡¡también tenemos dos charlas para vos!!. "Virtual Machine, Invisible Machine" de Andrés Valloud (programador de la VM más rápida de Smalltalk) y "Security on JIT VMs" de Gerardo Richarte (un experto en seguridad... ¿o inseguridad?)

¿Lo tuyo va por asegurar la calidad de los sistemas? ¿Te pega todo lo ágil, TDD, etc?... no quiero sonar repetitivo pero me es imposible... ¡tenés que venir a Smalltalks 2009! y ver las charlas de Tim Mackinnon sobre "Agile Planning" y "Expressive Testing" y la de Nicolas Chillo y Gabriel Burnstein sobre "Mutation Testing".

¿Estás cansado de tener que subir y bajar el server cada vez que modificas tu aplicación web, pensás que deben haber maneras más sencillas de hacerlo? ¿Estás cansado de recompilar tu aplicación Java u ObjectiveC para poder ver un pequeño cambio que hiciste en tu aplicación de iPhone?, no queda otra que vengas a Smalltalks 2009 y veas las charlas de Germán Arduino sobre "SWT", la de Santiago Robles y Lautaro Fernandez sobre "Meteorid: Un MVC real para la Web" y la de Esteban Lorenzano sobre "Smalltalk in the pocket: Building applications for the iPhone"

O por el contrario, ¿no te gustan la charlas, te aburre esto de escuchar hablar gente todo el día, lo tuyo va por la acción, por construir cosas en serio que aporten a la comunidad, por codear, y no me refiero a pegar codazos :-)? o por ahí siempre escuchaste de Smalltalk pero nunca tuviste el tiempo o la ayuda para meter las manos en la masa? hmm, que se yo, podés darte una vuelta el sábado por Smalltalks 2009 y participar del Pharo Sprint!, una sesión de programación de todo un día que sirve para mejorar y ampliar Pharo, un Smalltalk open-source.

¿Siempre escuchaste o creíste que los lenguajes dinámicos no sirven para desarrollar aplicaciones grandes, o que Smalltalk sólo se usa en la universidad para enseñar? Entonces te conviene venir a Smalltalks 2009 y ver "XTrade - Risk and Yield Analisis" de Maximiliano Tabacman, "Expecco" de Felix Madrir e "iBizLog" de Jose Bretti.

¿Tu especialidad es el User Interface, gráficos 3D, etc.?... también tenemos algo para vos como "Un ambiente visual para desarrollar software" de Adian Soma, "Cuis and Morphic 3" de Juan Vuletich, "Desarrollo de un engine 3D: Experiencias de un neófito" de Andrés Fortier y "#{Open.Source.Graphics} bindTo: {Cincom.Smalltalk}" de Travis Griggs

¿Te hace falta un iPod? ¿Querés regalarle una cámara digital a tu novia/o, o a tu vieja?... es fácil, anotate en el concurso de programación de Smalltalks, te vas a divertir haciéndolo... y si no lograste ganar nada, no llegaste a hacerlo, podés escuchar a Carlos Ferro, creador del concurso explicando cómo fue desarrollado el mismo en la charla de "Smalltalks 2009 Coding Contest"

Y si sos profesor de programación orientada a objetos y querés obtener información, material de enseñanza y compartir tu dudas y experiencias con otros profesores, tenés que venir a Smalltalks 2009 y ver la charla "Enseñanza de programación orientada a objetos con Smalltalk y prácticas ágiles" de Nicolás Paez o pasar unos minutos con Stephane Ducasse quién compartirá con nosotros todo el material que usan en Suiza y Francia para enseñar objetos.

¿Te cansaste de leer este mail tan largo? ¿te divertiste leyéndolo? ¿querés formar parte de un congreso hecho por programadores para programadores que ya lleva más de 300 inscriptos, divirtiéndote y aprendiendo en el camino? jeje, ¡¡tenés que venir a Smalltalks 2009!!

No dejes de anotarte gratis en www.fast.org.ar

Es del jueves 19 al sábado 21 de Noviembre de este año. Podes ver el detalle de las charlas en la sección "Charlas" o "Talks" de la página web, seguro la vas a pasar bien.

Comite Organizador de Smalltalks 2009

Cualquier duda manda un mail a info@fast.org.ar

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Thu, Nov 12 2009 11:02 by lopez | with no comments

NHibernate en SQL Azure

El viernes pasado, estuve hablando con Fabio Maulo (@fabiomaulo) de varios temas: de desarrollo de software, enseñanza de la programación, y por supuesto, sobre NHibernate. Ambos vivimos en Buenos Aires, Argentina, y fue un placer hablar con él, como siempre. Yo sigo a Fabio en Twitter, y soy un subscripto a  su blog. Fabio ha estado colaborando con el proyecto NHibernate desde hace años, y es un reconocido desarrollador en la comunidad .NET.

Me contó detalles de un sitio que construyó con un equipo, usando NHibernate. Lo interesate es que corre sobre SQL Azure. Pueden verlo en línea (es un sitio mexicano):

http://salondetokio.autocosmos.com.mx/

Fabio y su equipo trabajaron duro para armar este sitio, en menos de mes (estoy esperando que el equipo de Fabio comente más detalles en posts, por ahora, puedo hablar sobre lo que se conoce públicamente).

Curiosamente, el sitio está ejecutando sobre WebForms, pero sin usar ViewState, y sin tener un tag de Form en varios de los tags Body de las páginas que he examinado. Espero que Maulo y su equipo escriban explicando los detalles de implementación. El código está basado en el patrón Model View Presenter, ha sido escrito con tests automáticos, mocks, stubs, comenzando desde cerca de la presentación, hasta llegar a la persistencia. ¡Vamos Fabio! ¡Estamos esperando detalles sobre el proceso seguido y las decisiones de arquitectura! :-)

Más información sobre NHiberante y SQL Azure:

NHibernate on the cloud: SQL Azure Tests de NHibernate sobre SQL Azure, según Ayende

Quick news NHibernate with SQL Azure Los primeros pasos de Fabio en el tema: “All work… even the SchemaExport.” !!

NHibernate dialect for SQL Azure Ajustes para el SchemaExport

Estoy coleccionando enlaces sobre NHibernate y Azure en:

http://delicious.com/ajlopez/nhibernate+azure

Hay una excelente serie de posts de Brad Adams, explicando Azure en general, SQL Azure, NHibernate, Silverlight, RIA .NET Services, y más:

Index for Business Apps example for Silverligth 3 RTM and .NET RIA Services July Update

Relacionado a NHibernate y Azure, en esa serie:

Part 20: NHibernate
Part 23: Azure

¿Conocen otro proyecto que use NHibernate en “el cloud”?

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Tue, Nov 3 2009 16:12 by lopez | 2 comment(s)

Aventuras de Programación Extrema en C#

El viernes pasado estuve visitando las oficinas del Microsoft User Group de Argentina, acá en Buenos Aires. Tenía que dictar un curso de .NET, pero hubo un corte de luz (al parecer frecuente en estos días de alta temperatura; Buenos Aires está sufriendo cortes de luz, mucha carga en los aires acondicionados creo). Ni lerdo ni perezoso, me entretuve unas horas aprovechándome de la biblioteca del MUG, sobre la que tendría que postear más. Los socios del MUG tienen acceso a los volúmenes de la biblioteca, y hay libros de temas como Windows Server, programación .NET, Test Driven Development, programación en general, desarrollo web y más.

Así que, no teniendo más deberes de los que ocuparme ni más preocupaciones en el alma (como Descartes ante la estufa… :-), me dediqué a la lectura. Estuve leyendo un libro de ASP.NET 3.5 (no tengo el autor acá), estuve hojeando el clásico “Práctica de la Programación” de Kernighan y  y estaba por encarar el Sistemas Operativos de Tanenbaum (al que sigo desde las primeros avisos en la Dr.Dobbs, al principio de los ochenta, sobre compiladores multilenguajes). Pero un libro me llamó la atención, había sido devuelto a la biblioteca el jueves, por el bueno de @lmpetek: el Extreme Programming Adventures in C#

Excelente libro, escrito por Ron Jeffries, acreditado XPer, uno de los tres “fundadores” de XP (Extreme Programming), junto con Ken Beck y Ward Cunningham. Pueden seguirlo en Twitter por @RonJeffries. Leo en la página del libro en Microsoft Press:

See how eXtreme Programming (XP) works—and learn Microsoft .NET and C# programming in the process!
See eXtreme Programming (XP) in action at the hands of an XP master—and learn Microsoft .NET and C# programming in the process! In this fast-paced, hands-on exposition, Ron Jeffries—one of the leading voices and practitioners in the XP community—demonstrates that you can write well-designed, resilient code incrementally and safely, while minimizing your investment in speculative up-front design. As Jeffries builds his sample application, you get firsthand insights into what successful XP development looks like, complete with real-world challenges such as the eleventh-hour change order. For further practice and study, you can download all the author’s code—including the missteps—so you can see XP and agile concepts in action and assess how they fit into your own work.Pair program with an XP master, discovering how to:

  • Streamline and simplify the software development process
  • Work more effectively as part of an XP development team
  • Reduce missteps by designing, testing, and refining code in increments
  • Receive clearer specifications and feedback from customers
  • Write cleaner, more expressive code—and weed out more bugs
  • Conserve resources by planning and reassessing progress as you go
  • Maintain a sustainable work pace—and avoid burnout
  • Step up delivery dates, shipping the most crucial features first
  • Improve customer satisfaction!

    Jeffries va explicando, cómo un equipo de dos personas (uno es él mismo) van aprendiendo sobre C#, .NET, mientras desarrollan el software XMLNotepad. Es muy interesante de leer, porque explica paso a paso lo que van haciendo: cómo hacen spikes, pequeñas exploraciones, luego vuelven a tests, avanzan poco a poco, escriben y se ponen de acuerdo con los tests de aceptación, las historias de usuario, cómo generan un modelo testeable, mockean parte de la interfaz de usuario, etc. Si Uds. tienen dudas sobre cómo es el desarrollo con Programación Extrema, si quiere conocer los detalles de un caso concreto, éste es el libro. Pueden aprovecharlo, sepan o no C#: la parte técnica no es la más importante, es la explicación detallada la que hace de este libro, un excelente recurso.

    Hmm… ya va siendo hora de tener un sistema de biblioteca para el MUG, no? Podríamos armarlo usando XP… :-)

    Nos leemos!

    Angel “Java” Lopez
    http://www.ajlopez.com
    http://twitter.com/ajlopez

  • Posted Mon, Nov 2 2009 9:06 by lopez | with no comments

    Smalltalks 2009 en Buenos Aires

    La comunidad Smalltalk de Argentina ha vuelto a tener actividad en estos últimos años. Ejemplo reciente fue su activa participación en el ESUG: 2009 International Smalltalk Conference. Y como prueba están las dos ediciones de las conferencias Smalltalks. Se viene la tercera edición:

    Smalltalks 2009

    Se realizará del jueves 19 al sábado 21 de Noviembre, en la Facultad de Ciencias Exactas y Naturales de la Universidad de Buenos Aires. Tienen que visitar el enlace e inscribirse. Hay invitados especiales, a destacar (copiado “sin vergüenza” :-) desde esa página):

    Dan Ingalls

    Is a pioneer of object-oriented computer programming and the principal architect, designer and implementor of five generations of Smalltalk environments. He designed the bytecoded virtual machine that made Smalltalk practical in 1976. He also invented Bit blit, the general-purpose graphical operation that underlies most bitmap graphics systems today, and pop-up menus. He designed the generalizations of BitBlt to arbitrary color depth, with built-in scaling, rotation, and anti-aliasing. His major contributions to the Squeak system include the original concept of a Smalltalk written in itself and made portable and efficient by a Smalltalk-to-C translator.  Read more

    ¿Qué podría agregar a Dan Ingalls? Vean su trabajo de investigación reciente en Sun, por ejemplo, el Web Browser as an Application Platform: The Lively Kernel Experience. Pueden seguirlo en Twitter como @daningalls pero no escribe mucho. Aunque no relacionado tanto con Smalltalks, no puedo dejar pasar el video sobre Lively Kernel:

    Stephane Ducasse

    Since September 2007, He is research director at INRIA Lille leading the RMoD Team. He was the leader of the RECAST Project. He was co-responsible of the version 3.9 of Squeak the open-source Smalltalk developed by the team of A. Kay (Turing award 2003). He is the president of ESUG. He is developing Moose an open-source reengineering platform. He is co-responsible of Pharo an open-source Smalltalk.

    Read more

     

    Alex Warth

    Alessandro Warth is a computer scientist at the Viewpoints Research Institute, where he is working on the "Steps Toward the Reinvention of Programming" project. His current research interests include tools for rapid language prototyping, and improving the modularity of dynamic languages.

    Pueden visitar la página del bueno de Alessandro y seguirlo en Twitter como @alexwarth.

    Tim Mackinnon

    Tim has been programming with objects for 15 years, however it was when he heard Kent Beck describe Extreme Programming at OOPSLA 98 and again at OT99 that he found a process that balances quality, delivery and happiness. Tim was a member of the team that created UML Modeler for VisualAge Smalltalk, he has also worked at Dashboards Software where he pioneered their use of Extreme Programming. He then built up the XP team at Connextra and was responsible for techniques such as Mock Objects and Heartbeat retrospectives. He is now a senior developer at ThoughtWorks where he is mentoring teams on XP and Retrospectives.

    No escribe mucho, pero puede leer su blog Pintside Thoughts.

    James Foster

    As a junior-high student in 1971, James discovered the local university's computer lab and learned Basic, Fortran, and assembly. After trying other careers (commercial aviation and law), he returned to computer programming and was introduced to OOP on the Macintosh in the 1980s. Since then James has worked on large systems (primarily in healthcare) and introduced agile practices to the teams he has lead. James Foster is on the Smalltalk Engineering Team at GemStone Systems, Inc. and is an evangelist for the Seaside web framework.

    Pueden seguir su blog Programming Gems (on Gem Stone) James’s comments on programming GemStone/S, Seaside and Smalltalk.

    Y por supuesto, gran parte de los smalltalkers de Argentina (algunos esparcidos por el mundo, otros trabajando en empresas locales, otros en emprendimientos personales) asistirán al evento. Hace dos años escribí sobre la actividad de desarrollo y empresas: Creando con Smalltalk en Argentina.

    Más información sobre el evento en Smalltalks 2009 Squeak News

    Para los interesados en la actividad Smalltalk en español, y en especial en Argentina, ver:

    Fundación Argentina de Smalltalk (Sitio soportado por plataforma GLASS (Gemstone/Linux/Apache/Squeak/Seaside)).
    Club Smalltalk (vean ahí la participación argentina en la ESUG 2009)

    y participen de la lista:

    http://groups.google.com/group/clubsmalltalk

    Mi colección de enlaces:

    http://delicious.com/ajlopez/smalltalk
    http://delicious.com/ajlopez/squeak
    http://delicious.com/ajlopez/seaside

    Me hubiera gustado participar (por ejemplo, presentando lo que estoy haciendo como máquina virtual en .NET, o revivir algo de lo que hice tratando de emular a Piumarta), pero en estos días estoy bastante concentrado, en muchos cursos, poca programación, luchando con el “Efecto Coto” (si ni siquiera tendré Semana Sabática este semestre… snif… :-).

    (Nota adicional: el por qué de tantos enlaces en cada post mío ;-)

    Nos leemos!

    Angel “Java” Lopez
    http://www.ajlopez.com
    http://twitter.com/ajlopez

    Posted Sun, Nov 1 2009 14:41 by lopez | 3 comment(s)