lunes, 28 de diciembre de 2020

SORT vol.3: OUTFIL.

ACTUALIZADO: ejemplo de STARTREC/ENDREC

La estructura general de un SORT es la siguiente:

//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN   DD DSN=nombre.fichero.entrada1,DISP=SHR
//         DD DSN=nombre.fichero.entrada2(opcional),DISP=SHR
//SORTOUT  DD DSN=nombre.fichero.salida1,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  …
  …

PGM=SORT --> Indica el programa a utilizar, en este caso el SORT.
PARM=('DYNALLOC=(SYSALLDA,32)') --> Cantidad de memoria que se da a la ejecución del paso. Si se queda corto, aumentarla en valores de 8,12,32,64,128, 256 (como las memorias RAM)
SORTIN --> Ficheros de entrada
SORTOUT --> Ficheros de salida
SYSIN --> Indica el tipo de sort a realizar, las opciones disponibles son muchas y muy variadas, pudiendo utilizarse varias juntas en un mismo paso. Algunas de ellas son SORT, SUM, OMIT, INCLUDE, INREC, OUTREC, OUTFIL, OPTION … .

En este documento se explica en detalle algunas de estas funciones:


OUTFIL

Esta utilidad nos permite, a partir de un fichero(o varios) de entrada, filtrar en varios ficheros de salida.
Además, permite utilizar simultáneamente, todos las utilidades del SORT(OUTREC, INCLUDE, etc.) para filtrar cada fichero independientemente del otro.

NOTA: En este documento no vamos a entrar a explicar el OUTREC, INCLUDE, etc. Existen artículos en este blog que explican en detalle estas utilidades.

La definición de un OUTFIL es la siguiente:

//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN   DD DSN=nombre.fichero.entrada1,DISP=SHR
//         DD DSN=nombre.fichero.entrada2,DISP=SHR
//SALIDA1  DD DSN=nombre.fichero.salida1,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SALIDA2  DD DSN=nombre.fichero.salida2,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SALIDA3  DD DSN=nombre.fichero.salida3,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 SORT FIELDS=COPY
 OUTFIL FNAMES=SALIDA1,INCLUDE=(…),
                        OUTREC=(…) ,
                         INREC=(…) ,
                         …
 OUTFIL FNAMES=SALIDA2,INCLUDE=(…),
                        OUTREC=(…) ,
                         INREC=(…) ,
                         …
 OUTFIL FNAMES=SALIDA3,SAVE


Primero se han de definir los ficheros de salida, asignando un nombre a cada uno (SALIDA1, SALIDA2, SALIDA3, etc..)
Luego, por cada fichero de salida se introduce un OUTFIL, y en el FNAMES se asocia con el nombre asignado antes (ejemplo FNAMES=SALIDA1).
A continuación, indicar en cada fichero, el filtro que se va a utilizar mediante INCLUDE, OUTREC, etc…
Utilizando la opción SAVE, se indica que todos los registros que no cumplan ninguna de las condiciones anteriores se escribirán en el fichero indicado. En el caso del ejemplo en la SALIDA3.

Cosas a tener en cuenta:
- Cuidado al escribir el INCLUDE, OUTREC, etc. Normalmente se escribe "INCLUDE COND=", y sin embargo, en el OUTFIL se escribe "INCLUDE=". Lo mismo pasa con el "OUTREC FIELDS=", que pasa a ser "OUTREC=". Por norma general, se ha de quitar la segunda parte. El "OMIT COND=" quedaría "OMIT=", etc.

Vamos a ver un ejemplo:

Situación 1. Vamos a dividir el siguiente fichero en 2, filtrando por la Situación Laboral. En el fichero de salida 1 meteremos los Asalariados y en el fichero de salida 2 los autónomos. Además en cada fichero, vamos a sacar únicamente el Nombre y los Apellidos:


----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO
000000006ANTONIO   VILLA     SUSO     AUTONOMO  
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO  
000000001JOSE      LOPEZ     PITA     AUTONOMO  
000000004CARLOS    POLO      DEL BARROAUTONOMO  
000000003CARLOS    PEREZ     FANO     AUTONOMO  


La fórmula sería:

//OUTREC   EXEC SORTD
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=nombre.fichero.entrada1,DISP=SHR
//SALIDA1  DD DSN=nombre.fichero.asalariados,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SALIDA2  DD DSN=nombre.fichero.autónomos,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSIN    DD *
SORT FIELDS=COPY
OUTFIL FNAMES=SALIDA1,INCLUDE=(39,10,CH,EQ,C'ASALARIADO'),
                       OUTREC=(10,29)
OUTFIL FNAMES=SALIDA2,INCLUDE=(39,10,CH,EQ,C'AUTONOMO  '),
                       OUTREC=(10,29)

La salida quedará del siguiente modo:

SALIDA1 - ASALARIADOS:


----+----1----+----2----+----
JAVIER    MARTINEZ   CARRETERO


SALIDA2 - AUTONOMOS:


----+----1----+----2----+----
ANTONIO   VILLA     SUSO     
YOLANDA   LOPEZ     ALONSO   
JOSE      LOPEZ     PITA     
CARLOS    POLO      DEL BARRO
CARLOS    PEREZ     FANO     


STARTREC/ENDREC:
Con OUTFIL no están disponibles las opciones SKIPREC/STOPAFT, en su lugar utilizamos STARTREC y ENDREC con el mismo principio.

Retomando el fichero de entrada anterior:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO 
000000006ANTONIO   VILLA     SUSO     AUTONOMO   
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO   
000000001JOSE      LOPEZ     PITA     AUTONOMO   
000000004CARLOS    POLO      DEL BARROAUTONOMO   
000000003CARLOS    PEREZ     FANO     AUTONOMO   

//SYSIN    DD * 
SORT FIELDS=(10,29,CH,A) 
OUTFIL FNAMES=SALIDA1,ENDREC=1 
OUTFIL FNAMES=SALIDA2,STARTREC=2,ENDREC=4 

Primero se ordenan los registros:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000006ANTONIO   VILLA     SUSO     AUTONOMO   
000000003CARLOS    PEREZ     FANO     AUTONOMO   
000000004CARLOS    POLO      DEL BARROAUTONOMO   
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO 
000000001JOSE      LOPEZ     PITA     AUTONOMO   
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO   

Y luego genera los diferentes ficheros de salida:
SALIDA1:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000006ANTONIO   VILLA     SUSO     AUTONOMO   


SALIDA2:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000003CARLOS    PEREZ     FANO     AUTONOMO   
000000004CARLOS    POLO      DEL BARROAUTONOMO   
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO 
000000001JOSE      LOPEZ     PITA     AUTONOMO   

SORT vol.1: SORT, INCLUDE.

ACTUALIZADO: comparando zonas de un mismo registro con INCLUDE.

La estructura general de un SORT es la siguiente:

//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN   DD DSN=nombre.fichero.entrada1,DISP=SHR
//         DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT  DD DSN=nombre.fichero.salida1,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *




PGM=SORT --> Indica el programa a utilizar, en este caso el SORT
PARM=('DYNALLOC=(SYSALLDA,32)') --> Cantidad de memoria que se da a la ejecución del paso. Si se queda corto, aumentarla en valores de 8,12,32,64,128, 256 (como las memorias RAM)
SORTIN --> Ficheros de entrada
SORTOUT --> Ficheros de salida
SYSIN --> Indica el tipo de sort a realizar, las opciones disponibles son muchas y muy variadas, pudiendo utilizarse varias juntas en un mismo paso. Algunas de ellas son SORT, SUM, OMIT, INCLUDE, INREC, OUTREC, OUTFIL, OPTION … .

En este documento se explica en detalle algunas de estas funciones:

SORT

SORT FIELDS --> Ordena los registros a partir del fichero de entrada y los guarda ordenados en el fichero de salida:

//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN   DD DSN=nombre.fichero.entrada1,DISP=SHR
//         DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT  DD DSN=nombre.fichero.salida1,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 SORT FIELDS=(I,L,T,O,I,L,T,O)

I – Inicio. Posición donde empieza el campo por el que se quiere ordenar
L – Longitud máxima del campo por el que se quiere ordenar
T – Tipo de dato del campo que se quiere ordenar:
       CH --> Alfanumérico o numérico normal(sin COMP)
       BI --> Hexadecimal (campos COMP)
       PD --> Empaquetado con o sin signo(campos COMP-3)
O – Orden. A-Ascendente, D- Descendente

Ejemplo:

Ordenar el siguiente fichero por Número y Nombre de cliente en orden ascendente:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO
000000006ANTONIO   VILLA     SUSO     AUTONOMO
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO
000000001JOSE      LOPEZ     PITA     AUTONOMO
000000004CARLOS    POLO      DEL BARROAUTONOMO
000000003CARLOS    PEREZ     FANO     AUTONOMO

Fórmula:

SORT FIELDS=(1,9,CH,A,10,10,CH,A)

Resultado:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000001JOSE      LOPEZ     PITA     AUTONOMO
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO
000000003CARLOS    PEREZ     FANO     AUTONOMO
000000004CARLOS    POLO      DEL BARROAUTONOMO
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO
000000006ANTONIO   VILLA     SUSO     AUTONOMO

Otra opción que tiene el SORT es la siguiente:

SORT FIELDS=COPY

Con ella no indicamos ningún tipo de orden, por lo cual, el fichero de entrada se grabará en salida con el mismo orden.


INCLUDE

Filtra los registros deseados por la condición que se indique:

//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN   DD DSN=nombre.fichero.entrada1,DISP=SHR
//         DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT  DD DSN=nombre.fichero.salida1,
//            DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 SORT FIELDS=COPY
 INCLUDE COND=(I,L,T,C,V)

I – Inicio. Posición donde empieza el campo por el que se quiere filtrar
L – Longitud máxima del campo por el que se quiere filtrar
T – Tipo de dato del campo que se quiere filtrar:
       CH - Carácter o numérico normal(sin COMP)
       BI - Hexadecimal (campos COMP)
C – Condición de la igualdad que se quiere realizar:
       EQ – Igual
       NE - Distinto
       GE – Mayor o igual
       GT - Mayor
       LE – Menor o igual
       LT - Menor
V – Valor del dato por el que se quiere filtrar
       X’001A‘ – Indica un valor hexadecimal o empaquetado
       C’AL12’ – Indica un valor alfanumérico

Ejemplos:

Ejemplo 1. Vamos a realizar un paso de SORT que realice un filtrado del fichero indicado, para quedarse con los clientes que cumplan lo siguiente: Sean AUTONOMOS y su número de teléfono sea un móvil (comience por 6):

Copy:

01 ENTRADA1.
   05 ENTRADA1-NUMCLI    PIC 9(9).
   05 ENTRADA1-NOMBRE    PIC X(10).
   05 ENTRADA1-APELLID1  PIC X(10).
   05 ENTRADA1-APELLID2  PIC X(10).
   05 ENTRADA1-TIPO      PIC X(11).
   05 ENTRADA1-CATEGORIA PIC 9(9) COMP-3.
   05 ENTRADA1-TLFNO     PIC 9(9).
   05 FILLER             PIC X(9) VALUE SPACES.

Fichero entrada:

=COLS>
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      983275586
FFFFFFFFFDCECCD4444DCDECDCE44CCDDCECDDCECDCDCCCD400001FFFFFFFFF444444444
00000000211595900004193955900319953596121319914600000C983275586000000000
------------------------------------------------------------------------
000000006ANTONIO   VILLA     SUSO     AUTONOMO        918514535
FFFFFFFFFCDEDDCD444ECDDC44444EEED44444CEEDDDDD44400003FFFFFFFFF444444444
00000000615365960005933100000242600000143656460000000C918514535000000000
------------------------------------------------------------------------
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        988453548
FFFFFFFFFEDDCDCC444DDDCE44444CDDDED444CEEDDDDD44400001FFFFFFFFF444444444
00000000586315410003675900000136526000143656460000000C988453548000000000
------------------------------------------------------------------------
000000001JOSE      LOPEZ     PITA     AUTONOMO        676757687
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001FFFFFFFFF444444444
00000000116250000003675900000793100000143656460000000C676757687000000000
------------------------------------------------------------------------
000000004CARLOS    POLO      DEL BARROAUTONOMO        666415887
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003FFFFFFFFF444444444
00000000431936200007636000000453021996143656460000000C666415887000000000
------------------------------------------------------------------------
000000003CARLOS    PEREZ     FANO     AUTONOMO        986115484
FFFFFFFFFCCDDDE4444DCDCE44444CCDD44444CEEDDDDD44400001FFFFFFFFF444444444
00000000331936200007595900000615600000143656460000000C986115484000000000
------------------------------------------------------------------------

Fórmula:

INCLUDE COND=(39,8,CH,EQ,C'AUTONOMO',AND,55,1,CH,EQ,C'6')


Fichero salida:

=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000001JOSE      LOPEZ     PITA     AUTONOMO        676757687
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001FFFFFFFFF444444444
00000000116250000003675900000793100000143656460000000C676757687000000000
-------------------------------------------------------------------------
000000004CARLOS    POLO      DEL BARROAUTONOMO        666415887
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003FFFFFFFFF444444444
00000000431936200007636000000453021996143656460000000C666415887000000000
-------------------------------------------------------------------------


Ejemplo 2. Vamos a realizar un paso de SORT similar al anterior, que realice un filtrado del fichero indicado, para quedarse con los clientes que cumplan lo siguiente: Sean AUTONOMOS y su número de teléfono sea un móvil (comience por 6). Pero en este caso el número de teléfono vendrá empaquetado(COMP-3):

Copy:

01 ENTRADA1.
   05 ENTRADA1-NUMCLI    PIC 9(9).
   05 ENTRADA1-NOMBRE    PIC X(10).
   05 ENTRADA1-APELLID1  PIC X(10).
   05 ENTRADA1-APELLID2  PIC X(10).
   05 ENTRADA1-TIPO      PIC X(11).
   05 ENTRADA1-CATEGORIA PIC 9(9) COMP-3.
   05 ENTRADA1-TLFNO     PIC 9(9) COMP-3.
   05 FILLER             PIC X(13) VALUE SPACES.

Fichero entrada:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      q Íì%
FFFFFFFFFDCECCD4444DCDECDCE44CCDDCECDDCECDCDCCCD400001937564444444444444
00000000211595900004193955900319953596121319914600000C8258C0000000000000
-----------------------------------------------------------------------
000000006ANTONIO   VILLA     SUSO     AUTONOMO        q Î %
FFFFFFFFFCDEDDCD444ECDDC44444EEED44444CEEDDDDD44400003937164444444444444
00000000615365960005933100000242600000143656460000000C8265C0000000000000
-----------------------------------------------------------------------
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        o ÍÌ 
FFFFFFFFFEDDCDCC444DDDCE44444CDDDED444CEEDDDDD44400001937724444444444444
00000000586315410003675900000136526000143656460000000C6858C0000000000000
-----------------------------------------------------------------------
000000001JOSE      LOPEZ     PITA     AUTONOMO        #jéì%
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001695564444444444444
00000000116250000003675900000793100000143656460000000C9118C0000000000000
-----------------------------------------------------------------------
000000004CARLOS    POLO      DEL BARROAUTONOMO        ÅÂÌì%
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003667564444444444444
00000000431936200007636000000453021996143656460000000C7288C0000000000000
-----------------------------------------------------------------------
000000003CARLOS    PEREZ     FANO     AUTONOMO        m nç%
FFFFFFFFFCCDDDE4444DCDCE44444CCDD44444CEEDDDDD44400001939464444444444444
00000000331936200007595900000615600000143656460000000C4558C0000000000000
-----------------------------------------------------------------------

Fórmula:

 INCLUDE COND=(39,8,CH,EQ,C'AUTONOMO',AND,
    (55,5,BI,GE,X'600000000C',AND,55,5,BI,LT,X'700000000C'))

Resultado:

----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000001JOSE      LOPEZ     PITA     AUTONOMO        #jéì%
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001695564444444444444
00000000116250000003675900000793100000143656460000000C9118C0000000000000
------------------------------------------------------------------------
000000004CARLOS    POLO      DEL BARROAUTONOMO        ÅÂÌì%
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003667564444444444444
00000000431936200007636000000453021996143656460000000C7288C0000000000000
------------------------------------------------------------------------


NOTA: a la hora de comparar con valor (EQ, NE, GT...) podemos utilizar para la comparación otra zona del fichero:

Fichero entrada:
----+----1----+----2-
XXXXX111111XXXXX
YYYYY111111XXXXX
ZZZZZ111111ZZZZZ
WWWWW111111XXXXX

Fórmula:
INCLUDE COND =(1,5,CH,EQ,12,5,CH)

Resultado:
----+----1----+----2-
XXXXX111111XXXXX
ZZZZZ111111ZZZZZ

Hemos comparado las posiciones 1 a 5 con las posiciones 12 a 16 del mismo registro.

lunes, 14 de diciembre de 2020

Agile management: soy una moderna (agilecobol)

Ser manager tiene sus ventajas. Algunos pensarían en algo orientado a jerarquías. autoridad, mando... yo lo veo como la oportunidad de conocer diferentes equipos y probar cosas nuevas.

Mi jefe que es un grande (y sabe más de agile de lo que admite) dice que mi estilo de management es más moderno (más moderno que el de los otros managers imagino xd). Lo cierto es que me hizo mucha gracia cuando me lo dijo.

Y fijaos "las modernidades" que hago:
- Comparto la información con el equipo.
- Organizo talleres: hagamos equipo, palancas de motivación...
- Hago retrospectivas para detectar puntos de mejora.
- Pido su opinión y busco consenso.

Y no, no somos agile. Más bien lo contrario, con unos silos que podrías montar una fábrica de harinas. Pero yo creo en la colaboración, en compartir objetivos, en experimentar... Y mientras el triángulo de hierro nos lo permita, seguiremos haciéndolo.


Y después de tanto preámbulo, aquí van algunas prácticas ágiles que pienso se pueden aplicar en cualquier tipo de proyecto, por muy llave en mano que sea:

1. Daily meeting. 
Esto es un must. El daily meeting (bien hecho) para mí es la reunión que más aporta. 

- Todas las tareas en curso se ponen en visibilidad (las mías también),
- compartimos con los compañeros lo que estamos haciendo (puedo tener un problema con algo que otra persona ya tuvo que resolver), 
- conocemos todo lo que se cuece en el proyecto (eliminamos mini-silos), 
- detectamos tareas "top" sobre las que podemos hacer swarming (y repito, no somos agile), 
- en estos tiempos de trabajo en full-remote sirve de punto de encuentro para el equipo (te aseguras de que al menos una vez al día "estén" todos juntos)

Como dice uno de mis colegas franceses: "communication, communication, communication".

2. Retrospectivas. 
Cuando detectes que hay algo sobre lo que reflexionar... retro. Incluso puedes hacerla periódica. 

Durante el confinamiento empezamos a hacerlas una vez al mes. El rol de facilitador fue rotando poniendo también a las personas en una posición que no suelen ocupar (ya os lo dije, no somos ágiles, no tenemos scrum master xd).

Haz retros temáticas. Y no me refiero a "hoy de StarWars, mañana de El señor de los anillos" xd. Sino más bien a "hoy de testing, mañana de formación técnica, pasado de comunicación en remoto". Sobre un tema en concreto, para reflexionar sobre una sola cosa y sacar experimentos relacionados con un solo tema.

3. Haz equipo. 
Porque varias personas trabajando en un mismo proyecto no son un equipo. Ayúdales a llegar a serlo. 

Por ejemplo compartiendo mapas personales. 
Yo lo organicé presentando el mío como ejemplo, y montando parejas para que cada una tomase notas para presentar el mapa personal de la otra persona. Luego los presentamos a todo el equipo pero, según me han contado, ese momento entre dos les gustó mucho. Descubrir cosas de una compañera que de otra forma igual nunca habrías sabido, algunas de las cuales no figuraron en el mapa ;-) Fue muy chulo. 

Y conocer la historia de la gente suele ayudar a poner en contexto a esa persona, por qué es como es, por qué hace lo que hace, por qué sabe lo que sabe... Del mismo modo que es más fácil entender por qué hay que hacer un programa cobol si te dan un contexto funcional.

4. Hazte un panel Kanban. 
Yo era muy feliz en la oficina porque tenía una whiteboard enorme y me había comprado una caja de rotuladores con un montón de colores. Podía pintar cualquier cosa! Estaba junto a la puerta así que todo el mundo la miraba aunque no quisiera. Echo de menos mi pizarra :-(

Obviamente no será un panel al uso. Pero poner las tareas de forma visual (aunque solo tengas el TO DO, DOING, DONE) hace que se vea más fácilmente el volumen de trabajo que hay. O cuantas cosas hemos entregado últimamente, o el WIP! El triángulo de hierro está ahí, pero a veces podemos calentarlo un poco y estirar alguno de los lados xd Cuando la gente tiene 20 cosas en curso, suele volverse loca, o no hacer bien ninguna, o le es imposible establecer prioridades.

Y para terminar:
Aprende aprende aprende aprende. Y experimenta con tu equipo. Ventajas de ser manager ;-)

Últimamente no hago más que hacer "coaching" así que me he apuntado a un curso de coaching. Y como estoy obsesionada con la excelencia técnica (soy el consultorio cobol, no lo olvidemos xd) centro mi obsesión en las prácticas de eXtreme Programming. Con eso ya tengo para varios artículos!

#thisistheway

miércoles, 9 de diciembre de 2020

Productividad y felicidad (agilecobol)

Durante el puente de la constitución mi compañero de vida empezó a jugar al "Life is Feudal: Forest Village".

Total, que es el típico juego "city builder" en el que tienes que construir un poblado, aumentar la población, conseguir los recursos básicos, etc.

Y diréis, ¿y esto qué tiene que ver? Pues veréis. Resulta que uno de los parámetros del juego es la felicidad de los ciudadanos. Si el nivel de felicidad está alto, el ciudadano es más productivo y recolecta más leña, o pesca más, o cultiva más rápido. Y a los que seáis gamers esto seguro que os sonará de otros juegos del estilo.

Mientras hablábamos del juego salió este tema de la felicidad y la productividad y dije algo como "es curioso que los desarrolladores de juegos tenga claro que la felicidad y la productividad van de la mano y algunas empresas todavía no hayan caído en la cuenta".

Si bien es cierto que en estos juegos la felicidad del ciudadano puede conseguirse con cerveza (que no está mal pensado xd), en el mundo laboral no suele ser suficiente :-P

Hablar de felicidad puede sonar muy genérico, pero si lo cambiamos por motivación seguro que se ve más fácil. Una persona motivada va a trabajar mejor (va a ser más productiva, más creativa, más resolutiva, más proactiva) que una persona desmotivada.

¿Alguna vez os han preguntado qué os motiva? ¿Se lo habéis preguntado vosotros a la gente de vuestro equipo? Podéis llevaros unas cuentas sorpresas, pues muchas veces creemos saber lo que motiva a los demás y al preguntar descubrimos que estábamos totalmente equivocados.

Pero esa felicidad también está relacionada con la seguridad. Y no me refiero a la prevención de riesgos laborales sino a la seguridad psicológica. Cuando nos sentimos seguros en el entorno laboral, cuando no tenemos miedo de decir lo que pensamos, también somos más creativos, tenemos más iniciativa y también nos ayuda a estar motivados.

Hay mucho escrito sobre estos temas. No dejéis de investigar sobre palancas de motivación, motivación intrínseca y extrínseca, la pirámide de necesidades, los "moving motivators" de magament 3.0, la seguridad psicológica...

Un buen ambiente laboral es posible, y yo diría que muy necesario :-)

#thisistheway

martes, 8 de diciembre de 2020

Cobol y agilidad: mi nuevo mundo.

Hola amigas y amigos del consultorio cobol.

Hace ya tiempo que no os cuento cosas nuevas y es que hace ya años que mi vida de desarrolladora se paró un poco, o un mucho. Empezaron a interesarme otras cosas y también empecé a tomar otro tipo de roles.

Pero como todo sigue girando en torno al software he pensado que podría ser interesante seguir compartiendo esos nuevos conocimientos por aquí.

Y cómo no, uno de los cambios que viví en estos últimos años fue la famosa "transformación ágil".

La primera vez que me topé con el término "agilidad" debió de ser en algún momento de 2011. Estaba intentando dar visibilidad al blog creando cuentas en las diferentes redes sociales, y en twitter topé con la cuenta de Javier Garzas donde compartía una publicación de su blog.

En aquel momento el artículo entero me sonó a chino. Supuse que eso de agilidad se refería a, literalmente, ser más ágiles, en el sentido de ir más rápido y perder menos tiempo. Pero hablaba de un mundo del software que yo no conocía (yo sólo conocía la consultoría y el entorno bancario) y no me dijo mucho más.

No fue hasta 2016 (creo) que "vi la luz". Me tocó vivir una transformación ágil, hacia scrum+kanban y, con ayuda, lo conseguimos. La vida fue mucho más feliz desde entonces (sólo hubo que esperar 9 años...) y supe que este era el camino, que diría Mando.

Y aquí lo dejo, como presentación de lo que vendrá después. Para resumir los marcaré como "agilecobol".

Espero que esta serie de artículos os gusten pero, sobre todo, que os sean útiles :-)