Object creation review

When working with OO languages we use constructors to instantiate our objects. Constructors should always return a valid instance ready to use, you don’t need to perform any additional task before using the instance. In some occasions an object need some collaborators to perform its work and in that cases you will need to provide a constructor that takes this collaborators as parameters.

The syntax of constructors may vary depending on the language, in C++like languages (Java, C# and others) constructors take the same name of the class. In cases like Object Pascal (the language behind Delphi) you use the keyword constructor to declare constructors. And finally  we have Smalltalk-like cases, where you constructors are simply class methods, no special name , no keyword, just call them as you like.

One practice I like when defining constructor is to give them some semantic, this is a very common practice for those who work with Smalltalk but it is not so common for those working with C++ like languages. Many times when I work with C# or Java, I find classes that provide several constructors with different parameters, but is not so clear how this constructors work, of course al of them return a valid instance, but do they perform any additional task? is there any particular property in the create instance? Let’s see an example to illustrate it. Let’s define a person class with first name (mandatory) and last name (optional).

In C# we could have something like this:

public class Person
{
public Person (string firstName) {…}
public Person (string firstName, string lastName) {…}
}

And to use it:

Person aPerson = new Person("John");
Person anotherPerson = new Person("John", "Foo");

In Smalltalk this could be:

Object subclass Person
Person class>>withFirstName: aFirstName.
Person class>>withFirstName: aFirstName andLastName: aLastName.

And we use it this way:
aPerson := Person withFirstName: 'John'.
anotherPerson := Person withFirstName: 'John' andLastName: 'Foo'.

As I said, this practice is very common in Smalltalk, but it can be used with C++like languages, in fact it is recommended by Kent Beck in his book Implementation Patters that is focused on Java. Let’s refactor the C# person class to use this pattern.

public class Person
{
public static Person WithFirstName(string firstName) {...}
public static Person WithFirstNameAndLastName(string firstName, string lastName) {...}
}

( I know, Smalltalk’s ability of merging method name and parameters provides a great user experience that is impossible to emulate with C++ like languages. )

Las herramientas y el contexto

Como ya mencioné anteriormente, junto con DiegoF estamos dictando una materia de análisis y diseño en la UnTreF. Resulta que en la última clase me toco dar «User stories». Si bien es un tema que me animo a decir conozco con cierta profundidad, no estoy seguro de haber transmitido correctamente la idea. Resulta que la mayoría de los alumnos, por su joven promedio de edad (debe estar en 20 años),  no tiene experiencia laboral en el desarrollo de software. Al mismo tiempo antes de user stories vieron el método de análisis ambiental de Ed. Yourdon y el ya clásico modelo de casos de uso del proceso unificado. Con este contexto resulta dificil entender como es que pueden funcionar las user stories sin tener en claro la cultura agile. ¿Cómo es posible que una simple oración sirva de especificación ? Pues ahí está la cuestión, la user story no es la especificación, sino simplemente un recordatorio de hablar sobre algo impotante para el usuario. Esto implica que el usuario/cliente/product owner estará disponible para consultas y trabajo conjunto durante la construcción del producto.  Durante la clase intenté explicar ciertas cuestiones de las user stories por contraposición con algunas otras herramientas tradicionales, pero dado que los alumnos no tenian experiencia en desarrollo de software (más allá del ambiente académico), este intento resultó poco útil. Creo que en cierto modo, algo similar me paso al presentar el modelo de casos de uso. Me parace que la próxima, antes de explicar las distintas herramientas (casos de uso, user stories, etc) vamos a tener que hacer una introducción a los contextos metodologicos, en los cuales estas herramientas suelen utilizarse.

How to replace contents of several files

During the last couple of days  I had to replace some words in several text files so I decided to write a Power Shell script to perform this task. Below is the code snippet I used:

$files = get-childitem *.txt
foreach ($file in $files)
{
    $content = Get-Content -path $file
    $content | foreach {$_ -replace "oldText","newText" } | Set-Content $file
}

Enjoy it!

Recomendaciones para dictar workshop

Después de haber dictado algunos workshop y haber participado en tantos otros, hay algunas recomendaciones que quiero compartir.

En general los workshops tienen una estructura bastante estándar:

  1. Introducción: que puede contener algo de teoría y la explicación de la consigna. En caso de ser necesaria una introducción teórica se suele utilizar un slide deck para facilitar la explicación.
  2. Actividad: donde generalmente los asistentes son divididos en grupos y trabajan sobre la consigna. Puede que haya una o varias actividades.
  3. Cierre: donde se hace una puesta en común de realizado por los asistentes, se reflexiona sobre lo aprendido / ejercitado y se extraen conclusiones.

Un punto muy importante para el éxito es setear las expectativas al comienzo del workshop, por ello yo suelo poner en la segunda diapositiva (en la primera está el título del workshop) el objetivo del workshop y luego en la tercer diapositiva, la agenda del workshop listando las actividades que se realizarán con los tiempos estimativos de cada una.

image

Por otro lado muy importante manejar correctamente los tiempos, pues de lo imagecontrario puede que no se lleguen a completar las actividades. Para esto, ultimamente he utilizado un software de reloj en cuenta regresiva mostrando el tiempo restante para completar la actividad. Este reloj muestra a todos los participantes el tiempo restante mientras trabajan.

Para esto he utilizado una herramienta gratuita llamada XNote Timer.

Por último, es importante obtener feedback al final del workshop de feedbackcara a poder mejorarlo. Para esto suelo utilizar la técnica del post-it, a cada participante le pido que al finalizar dibuje una carita ( :-), :-|, 😦 ) en un post-it y si gusta escriba al dorso cualquier sugetencia que pueda tener.

Espero esto les resulte útil.

Agiles 2009, some highlights

During last week, Shaggy, MartinS and I, went to Brazil to attend this conference organized by the Latin-American Conference on Agile Development Methodologies. The three of us were speakers. Ariel presentation was “Agile PMO” (you can find more information in his post after the conference). MartinS talk about “High maturity agile practice”, a very interesting topic for those with experience in agile methods.

I was on charge of a workshop about planning and estimation and I am very pleased with the results, I wrote some more details about this workshop on my Spanish blog.

The keynote speakers were Brain Marick (signer of the agile manifesto), Daina Larsen (president of the Agile Alliance) and Roy Singham (founder and CEO of Thoughtworks). Other important speaker where Joshua Kerievsky (author of Refactoring to Patterns).

The conference were excellent and I could enjoyed it much more than the previous year.

At the end of the conference while of conference committee was doing the retrospective with Diana some friends and I have a talk with Brian Marick. I asked him what were in his opinion the skills a tester should meet to work in an agile team. He answered that there are 3 required skills:

  1. Be able to understand the business.
  2. Be able to automate tests, what in most cases requires some programming skills.
  3. Have a good capacity of doing exploratory testing. In some point this ability could be even more important the 2.

Finally the committee announced that the candidate city for the next conference (agiles 2010) is Lima, Peru.

DSC04476

Here we are (from left to rigth): me, Shaggy and MartinS.

Shaggy recorded our session, so as soon as they be available I will add a reference to them.

Agiles 2009, sesiones día 1

Apertura

La bienvenida y apertura del la realizó un panel conformado por SamuelJuanG (presidente y vice de la conferencias respectivamente) y un conjunto de personalidades locales entre los que se encontraban personalidades del gobierno, representantes de la industria local y del sector académico.

Keynote by Brain Marick

Luego de eso, el primer keynote estuvo a cargo de Brain Marick, uno de los firmantes del manifiesto ágil, que en un acto de humor y humildad comentó que su único mérito para participar en la firma del manifiesto fue ser el único tester que Martín Fowler conocia en aquel momento.

La presentación de Marick me resultó muy amena, duró alrededor de una hora. Durante la misma Marick hizo una analogía entre como se enseña medicina (veterinaria para ser más exactos, pues citaba experiencias de su esposa ensañando a hacer diagnóstico sobre vacas) y como debería enseñarse ciertos aspectos de la construcción de software. Su punto fué que para hacer un diagnóstico uno aplica ciertas reglas de forma implícita, y quien está aprendiendo simplemente va examina distintos casos (muchos casos) y va creando las reglas internamente, de manera que a partir de cierto punto (luego de haber examinado cierta cantidad importante de casos) es capaz de dar un diagnóstico aplicando esas reglas implícitamente, pero en caso de ser consultado es capaz de explicar el conjunto de conocimientos y reglas que lo llevaron a la conclusión de diagnóstico presentada. Del mismo modo programar bien es algo que se siente, que se tiene incorporado, más allá de que uno conozca todas las buenas prácticas el buen programador termina aplicándolas naturalmente sin tener que pensar en ellas explícitamente.

Is agile the new waterfall? by Frank Trinidade

En esta presentación con algunas estadísticas interesantes sobre el nivel de adopción agile. Luego Frank planteó su punto: mucha gente dice usar agile, muchos utilizan prácticas de scrum, xp y lean, pero sin entender realmente porque es que lo hacen, simplemente escucharon que servian, investigaron como usarla y empezaron a aplicarlas sin tener mayor entendimiento de los principios y valores que las sustentan. Según Frank, si la gente utiliza prácticas ágiles sin entenderlas verdaderamente, la probabilidad de proyecto fallidos será muy importante y los métodos ágiles serán señalados como culpables, tal como en los último años se ha culpado al modelo de desarrollo en cascada.

programa1

Desafios de la transformación ágil, multisitio, multicultural

Está presentacióna cargo de Emilio Gutter y Alejandra Alfonso, trató sobre un caso de que enfrentaron los oradores trabajando como coach en una empresa multinacional, con equipos distribuidos en múltiples paises de europa.

Supporting distributed teams using Version One

En esta presentación Katia, nos mostró las características y beneficios del producto de VersionOne. Yo ya había estado utilizando la versión gratuita (team edition) y me habían quedado algunas dudas sobre funcionalidades que no vi presentes en la dicha versión. El producto está en verdad muy bueno para trabajar con métodos ágiles, pero hay una cuestión qye Katia dejó muy en claro, es una herramienta de gestión, no es la intención de ellos que la herramienta sea utilizada como bug tracker, controlador de versiones, etc; sino que la idea que enfocarse en la gestión del proyecto y proveer capacidades de integración con otras herramientas de uso comuín como las mencionadas.

Keynote by Roy Singham

Sin duda esta fue la presentación más polémica de la jornada. Con un enfoque muy progresista (no estoy seguro si esta es la palabra indicada) el CEO y fundador de ThoughtWorks habló sobre Larry Ellison convirtiendose en Lord Vader al comprar Sun y amezando la prosperidad del open source. También hizo una importante mención a la gran oportunidad de sudamérica, consecuencia de tres factores principales: la situación mundial, los valores de la cultura latinoamericana y la conjunción del movimiento ágil y el movimiento opensournce en la misma región. Durante la presentación que duró más de una hora, Roy dijo muchas cosas más, entre historias personales y anécdotas de su empresa, contó como fue que Martin Fowler se unió a ThoughtWorks.

Finalmente la presentación terminó con el anuncio de que ThougthWorks abrirá una oficina en Porto Alegre el año próximo, lo cual fue recibido con una aclamación de todo el público presente (y sobre todo de los brasileros).

Próximamente el resumen del día 2.

Workshop de planificación en Agiles 2009

Acabo de terminar mi workshop de técnicas de estimación y planificación en Agiles 2009. En verdad estoy muy conforme con el resultado. La gente quedó muy contenta. Al final del workshop pedí a cada asistente que dibujara en un post-it una carita para expresar su opinion  🙂 , 😐 , 😦  y resulta que casi todas fueron caritas felices (19 felices y 1 neutral).

Casi todos los asistentes (todos a excepción de uno) eran de habla portuguesa, pero por suerte eso no fue un impedimento. Si bien intenté ser más estricto con el tiempo, mis explicaciones fueron un poco más largas de lo que había planificado pues quería asegurarme que todos me entendieran. Y si bien me parece que salió mucho mejor que el ensayo de la semana pasada, otra vez volví a excederme con el tiempo, creo que fueron unos 15 minutos, lo cual no es tan grave.

Para los interesados, el slide deck utilizado está disponible aquí y la hoja de cálculos está aquí.

Agiles 2009, ya casi estamos

El evento ya arrancó, durante hoy y mañana se estarán dictando cursos y durante jueves y viernes será conferencia donde estaré dictando un workshop sobre planificación y estimación ágil. A modo de ensayo dicté el workshop el viernes pasado para algunos amigos que se ofrecieron como conejillos de indias. La experiencia me resultó muy útil pues obtuve mucho feedback que me permitió ajustar varias cuestiones, sobre todo los tiempos de cada una de las actividades. Quiero agradecer a los osados voluntarios: Guille Rugilo, DiegoF, MarianoS, ArielS, Fede Jack, Charly Paez y Leandro Romero.

También a modo de ensayo grabé un screencast con lo que será parte de la introducción que daré al comienzo del workshop y aunque ya cambié algunas cosas desde que lo grabé, el contenido sigue siendo válido. Este el link para acceder al screencast, durá solo 10 minutos, lo cual lo hace bastante consumible.

Si todo va bien mi próximo post será ya desde Brasil.

Developing Cmdlets for Power Shell

During the last week I have been working with Iaco in a project about this topic. I found it quite interesting I had some experience in shell scripts but on Linux platform but Power Shell (in honor to its name) seems to be more powerful.

First of all I must say that there are some difference between PS2 and the previous versions, of course that there is backward compatibility, but you must know that PS2 comes with some features that could make your life as a developer much more easy. One of that features is the Windows Power Shell Integrated Scripting Environment, a tool that among other things allow to debug you scripts. Here are some useful resources that helped me:

  • If you don’t know anything about Power Shell you can start with this Getting Started Guide.
  • Then you can follow with this post by David Aiken were you will find info enough to create your first Cmdlets and also a Visual Studio Project Template to do it.
  • Here you will find info about cmdlets concepts like development guidelines, verbs and parameters.
  • But before developing your customs cmdlet review this community project to see if what you need already exists.
  • Finally an interesting resource to look at is the Power Shell Team Blog

I hope this help you.