2013/02/14

TDD mental en ambientes hostiles

La vida me ha llevado a ambientes extremadamente hostiles, donde no se puede instalar nada, ni sacar luego nada. El que no pueda instalar o desarrollar un framework de Unit Testing en una máquina no significa que no pueda tenerlo en la mente, desplegarlo en el momento y descartarlo al final.
El asunto a resolver en esta ocasión es tomar una lista de usuarios y detectar los potenciales repetidos. Lo normal en unix es sort | uniq –d y en mainframe un SORT … OUTPUT PROCEDURE … en COBOL.
El problemas es que pueden haber nombres distintos que corresponden a una misma persona debido a la evolución histórica del sistema, por ejemplo “Lopez, Juan” y “Lopez_Juan” son buenos candidatos a ser la misma persona.
Antes de ordenar y buscar repeticiones, necesito una función de normalización de nombres, que lleve todos los nombres a la forma “Apellido(s), Nombres(s)”.
Para nuestro primer test, empezamos como siempre por el caso positivo.






Y una implementación sencilla que debería pasar el test:







Acá podemos ver como se ejecuta con ISPF:



Y su resultado:



El siguiente paso es un caso que falle:



Volvemos a ejecutar y vemos el error en el output



Y el valor de retorno RC=1, que era RC=0 en el caso correcto.



Esta es la nueva implementación para que funcione:



Ahí me asaltó una duda, pues space() dice que “remove all superfluous white space, including white space between words. “, así que agregué un test para más espacios y puse doble nombre, en dos pasos separados, obvio.



Nos encontramos con que el if expected… end se torna monótono, llegó el momento de refactorizar el test



Ya se parece más a lo que estamos acostumbrados


Para variar, he hecho trampa, pues ya había implementado tanto el código como los test, pero en COBOL. Sin embargo no te he engañado, pues seguí unos pasos similares y para la implementación en REXX recién en este punto pasé a copiar los casos que ya había utilizado en la versión en COBOL.

Este es el test:



Este es el código a testear



Tras un rato de idas y vueltas, ya tenemos un set aceptable




Y la implementación que pasa



Como se puede apreciar comparando los test en uno y otro lenguaje, en el caso de COBOL he optado por hacer algo parecido a un data provider pero no encapsulé la comparación como con el ASSERT de REXX. No vale la pena el data provider en REXX ya que es la misma cantidad de código y un poco más de complejidad. No vale la pena el ASSERT en COBOL, pues como es un lenguaje tipeado habría que hacer una versión para cada tipo de datos y como no hay overloading, tendría que usar nombres distintos y todo ese trabajo que asociamos con hacer un framework, que no era la idea.

De más está decir que no soy System Application Programmer, acepto críticas y sugerencias, pero no reproches.

Notas para entender un poco mejor el código y los conceptos presentados


ISPF


Es un programa que entre otras cosas permite editar datasets (archivos de mainframe) y en el caso de programas REXX ejecutar con “EX”.

REXX


Lenguaje interpretado con origen en mainframe pero extendido a múltiples arquitecturas y sistemas operativos.

Hay funciones y procedimientos, las funciones se llaman por su nombre y los procedimientos con CALL

Los argumentos tienen un sabor a perl, hay que sacarlos con PARSE, que tiene un sabor a erlang, ya que puede hacer pattern matching



En este caso, pone en ID todo lo que encuentre antes de “:”, luego en EXPECTED lo que haya entre “:” y “->” y por último en GOT el resto.

COBOL


Venerable lenguaje compilado con origen en mainframe y tambien extendido a múltiples arquitecturas y sistemas operativos.

¿Qué puedo decir en pocas lineas?

TDD


En una disciplina de programación/testing en la cual se identifica primero un requerimiento o error, se hace un test que lo expresa y que por supuesto falla, ya que aun no has implementado o corregido nada que lo haga pasar. Luego se implementa o corrige y se empieza otra vez.

La diferencia fundamental con el testeo natural que uno hace al programar es que los test se guardan y se siguen aplicando de modo acumulativo, lo cual da una cierta seguridad de que cualquier cambio que uno haga que rompa algo será detectado.

La diferencia fundamental con el testeo que se hace luego de la implementación, es que al testear al final uno se encuentra con desagradables sorpresas que pueden llevar a reestructuraciones drásticas. TDD da feedback inmediato y ayuda a comprender el problema. Además provee una suerte de documentación, ya que se muestra como se usa el código testeado.

Data Provider: cuando se hace el mismo test con distintos pares datos->expected, en lugar de hacer un test para cada dato, se hace uno solo y se lo alimenta con el conjunto de pares.

Refactorización: es una técnica que consiste en modificar la implementación sin modificar el comportamiento. Se suele usar para mejorar el código y va estrechamente ligado al testing, pues es éste quien avisa si ha cambiado el comportamiento.

2012/11/25

Retrospectiva Agile Open Seguridad BA 2012


Cifras crudas


TIEMPOSLa PreviaAOSTotal
Mails enviados (1 min c/u)127148275
Mails recibidos (1 min c/u)12072192

Difusión personal en ekoparty, cafe-in,
radio pasillo, twiter, skype
6h1h7h
Edición de páginas y confección de
mails de convocatoria
2h1h3h
Total tiempo12h6h18h



Efectividad inscripciónLa PreviaAOSTotal
Inscriptos164359
Asistentes71825



Detalles 


El haber interactuado con una institución grande como es UB trajo un cierto sufrimiento. No fué simplemente acordar una fecha y un lugar sino que encajara con los planes y agenda de eventos de la UB.

Sin embargo, a diferencia del Agile Open Rosario de hace un par de años en el marco del Polo Tecnológico, esto fue un lecho de rosas. Para hacerse una idea no he publicado esa  retrospectiva.

Para la fecha en que el evento había sido convocado originalmente ya había pasado, recién se acordó la fecha para casi tres meses despues. Esto abrió inicialmente dos caminos: tirar todo por la borda y hacer ya el evento en algún lugar pequeño o esperar con paciencia.

Soy muy amarrete para lo primero y carezco de lo último, conflicto gracias al cual surgió una tercera posibilidad, comer el pan y la torta. Esto es, hacer el evento en UB tal como se había arreglado y hacer ya el evento en un lugar pequeño, gracias a JP de SVC.

Para darle valor al primer evento, se generó tarea para utilizar las retrospectivas en el segundo, la convocatoria fue parecida a esta:



El AOS de este año será en la Universidad de Belgrano el día 24 de Noviembre, tan lejos que parece un espejismo. Tratando de sacar ventaja de este potencial temporal de cerca de dos meses, haremos algo asi como un mini agile, "La Previa". La idea es discutir un poco lo que ibamos a discutir pero haciendo eje en llevarnos alguna tarea que relacione Agile con Seguridad y viceversa, por ejemplo:

  • implementar una mínima revisión de seguridad para un proyecto nuevo
  • implementar una mínima revisión de seguridad de la arquitectura de un proyecto existente
  • implementar alguna técnica de seguridad en desarrollo u operaciones
  • analisis estatico de código
  • owasp top ten
  • definir e implementar algún procedimiento de control sobre algun asset de información
  • repositorio de codigo
  • información contractual de proyectos
  • dictar algún tipo de training interno
  • securizar la comunicación con algún cliente

Y ademas, crosscutting agile,
  • sub dividir y estimar la tarea elegida.
  • retrospectiva de la actividad

Para quienes ya tienen seguridad y carecen de agile podría ser:

  • ver de utilizar kanban en algunas tareas de operaciones
  • estimación de esfuerzo mediante planning poker
  • implementar SDM (Standup Daily Meeting) para seguimiento
  • utilizar tdd, bdd, refactoring en el desarrollo de alguna aplicación, que bien puede ser de seguridad

Si aporta, contaré mi experiencia con escolares. La "gente de educación" se la puede llevar para probar y devolver la retrospectiva en el evento principal.


Una de los objetivos es ver como darle valor a estas tareas y ayudar a identificar cual tarea puede ser la apropiada para cada asistente, que tenga costo reducido o algún retorno que compense.

Este evento será de asistencia acotada, tipo veinte personas en un lugar pequeño.

De este modo, el agile open de UB se ve enriquecido por las experiencias y retrospectivas nacientes de este eventito.

En el medio, armamos una lista de google/yahoo o usamos un tag [seguridad] en la lista de agiles para ayudarnos.

La Previa

El fin de semana largo, la convocatoria más abierta a último momento y la evidente falta de interés en el tema conspiraron contra la asistencia. Contra mis expectativas se respetó la regla de que sólo asiste la mitad de los inscriptos, había pensado que al ser la convocatoria más personalizada la asistencia iba a ser mayor. Tratándose de un número tan bajo, el que tres de los cuatro organizadores por parte Agiles no hayan ido, quizás explica la situación. Hubiésemos llegado a casi dos tercios.

Como facilitador cometí un grave error metodológico durante el evento, que fué no respetar las reglas del Open Space. Como consecuencia, aunque interesante e instructiva, fue una larga conversación medio amorfa.

Uno de los organizadores pudo haber "asistido virtualmente" ya que faltó por estar enfermo y quizás hubiese detectado y corregido la situación, pero aunque él me lo sugirió, se me escapó.

Al final quedamos en hacer algunas tareas,

  1. Robo cuenta hotmail. La idea es abrir dos cuentas con distintos niveles de seguridad y contratar el hackeo.
  2. Revisar el proceso de certificación y/o recuperación de twitter.
  3. Usar w3af contra una conocida institución, tomando los recaudos necesarios.
  4. Confidencialidad en proyectos/empresas

con estos resultados.

  1. Se creó una cuenta pero no se avanzó.
  2. JP hizo un excelente trabajo, que será presentado en el Agile Open por un emisario.
  3. Nada, la semana previa intenté iniciar de modo anónimo la exploración pero no pude, ya que estaba caido el sitio.
  4. Nada


AOS

Otras vez los astros conspiraron en contra. Hubieron problemas logísticos en UB que nos dejaron al borde de postergar otra vez. Afortunadamente Paula A., que no sólo es leal con UB y asumió toda la responsabilidad de las fallas, si no que tambien es una persona de palabra, hizo un sacrificio de último momento y logró que lo hagamos en fecha.

Por el lado de Agiles, los organizadores se esfumaron por distintos motivos personales. Sólo les cuestiono que yo haya tenido que preguntarles, en lugar de ellos avisar proactivamente. De este modo perdimos apoyo institucional y difusión de SADIO e IEEE. Afortunadamente otra vez, Juan G. se hizo un lugarcito y aportó una primera sesión explicando que es agile y open space, además de darle el encendido al evento.

Luego hubieron dos sesiones paralelas de "seguridad vs usabilidad" y "usando git y github" y por último "experiencia de privacidad en internet para escolares".

Los resultados de La Previa, dado que sólo una persona había estado en ambos eventos y respetando la regla "estamos los que estamos", ni fueron mencionados.

Fue un poco más caótico que un Open Space promedio, pero funcionó.

Si alguno de los concurrentes ha elaborado alguna apreciación, que por favor agregue el link en los comentarios.

Resultados


Lo interesante es que había más gente de seguridad que de agile. Quizas no muy sorpresivo, dada la falta de interés general en el tema en las listas de agiles.

Por un impulso impulsivo de último momento y en aparente contravención con mi recomendación en agiles a las "agile girls" de usar un tag para marcarse en lugar de hacer otra lista, propuse cuando ya estabamos en la puerta hacer una lista propia. Lo que pasa es que esa falta de interés puede provocar que las personas de seguridad que lleguen a las listas se disuelvan antes de provocar alguna reacción. Es una suerte de zona protegida, comunicada con las listas, ya que hemos invitado a unirse a las listas, pero donde podemos discutir algunas cosas más específicas. Igual es un tema en marcha, veremos que pasa, si funciona como lista aparte, desaparece o nos mudamos a agiles.

Aprendizajes

Hay que respetar las reglas de Open Space.

No creo que valga la pena repetir La Previa. En relación al Agile Open no veo que haya aportado. Falta ver que ocurre con los participantes y la lista.

Aunque el lugar es muy importante, hay que tener un buen plan B. El evento se atrasó cerca de cuatro meses de su fecha prevista inicial, no tengo manera de saber como eso afectó a la concurrencia, pero sí sé que carga produjo sobre el organizador, que se prometía como cada vez "es la última vez que hago esto".