lunes, 7 de julio de 2014

Code Smells - Métodos Largos




Todos conocemos la máxima "Si bueno y breve, dos veces bueno" verdad?
Nunca es mas cierto esto que en el desarrollo de software.


Los Metodos Largos son Malvados

Hace mucho tiempo, incluso antes del surgimiento del paradigma de la Orientación a Objetos (POO), que se sabe que las funciones, procedimientos y  subrutinas son mucho mas mantenibles, tienen menos problemas y errores y sobreviven mucho más si son cortos.

En realidad la teoría de Calidad de software habla de cohesión funcional cuando todo el código del elemento al que se referencia (modulo, método, clase o función) se ocupa de implementar una y sola una función bien específica. Es decir, realizan una sola y bien definida tarea. Y para implementar esa única y bien definida tarea no se necesitan muchas lineas de código.

La POO real esta basada en una serie de intercambios (envío y recepción) de mensajes claros y bien definidos entre objetos pequeños y con un propósito especifico (ver el Principio de Responsabilidad Unica, SRP, en este mismo blog). Y la inversa en este caso es totalmente cierta, sin un código hace varias cosas a la vez, tiene varios propósitos, genera mas de un efecto a la vez, o  hace dos o mas cosas con mas de un objetivo , entonces, por lo general eso ocupara muchas lineas de código, generando asi metodos largos.  Los Métodos largos representan uno de los Code Smells más claros respecto a marcar código... que apesta (En Inglés: APESTA!).

A riesgo de caer en la obviedad vamos a preguntarnos:

Motivos por los que los metodos largos...apestan ?

Para empezar, cuanto más largo es un método es mucho mas difícil de entender en su totalidad y  de comprender los efectos colaterales que genera. Como sabemos, esto tiene relación directa con la mantenibilidad, porque cuanto mas difícil es comprender un código mas riesgo hay de que al modificarlo se introduzcan errores.

En segundo lugar un método largo casi con seguridad no posee cohesión funcional.  Inclusive podemos apostar sin temor a equivocarnos que tendrá el peor tipo de cohesión que hay: coincidental. Es decir el código hace varias cosas, muchas no relacionadas mas que por la coincidencia, lo cual aumenta a su vez la probabilidad de tener que tocarlo durante la vida de mantenimiento del sistema (que como dijimos alguna vez...es el 80% al 90% del tiempo de vida de un sistema, siendo el 10% restante el tiempo original utilizado para su desarrollo inicial).

Pero en ningún otro lado afecta la longitud de un método tanto como en el atributo de su testeabilidad, es decir, cuan sencillo/factible es testearlo, y ahi mis amigos, es cuando los agarro sin escapatoria.

Un método largo es imposible de testear correctamente, porque simplemente, hace DEMASIADAS COSAS, y entonces hay que testear todas esas cosas y peor que peor, la diferente combinación de ellas. Esto produce rápidamente un efecto de multiplicación geométrica y entonces, los tests, cuando los hay , tambien son complejos y largos. Entonces perdemos por los dos lados, porque encima el código quedara con bajo cubrimiento de tests o ninguno, y si hay tests sera una pesadilla manternerlos.


Como Solucionarlo

Aquí van una lista simple de algunas heuristicas a aplicar, no son infalibles ni, aclaro, los absuelven, queridos chimpancés entrenados,  de utilizar el sentido común :

  1. En la mayoría de los casos alcanza con descomponer el método largo con varios métodos cortos, refactorizando utilizando el refactor "Extract Method". La forma más simple que funciona es ir recorriendo el método de arriba a abajo, encontrando 4 o 5 lineas de código que realizan una unica función claramente definida  y extraerla como un método nuevo llamado desde el método largo.
  2. Si el método tiene además largas listas de parámetros es una indicación de que sufre de 2 o más Code Smells a la vez (lo mas común), para lo cual es una buena práctica primero reemplazar los parámetros relacionados por un Objeto que los contenga (una Clase generalmente nueva que pide, "a gritos!" ser creada) y recién ahí aplicar el punto 1.
  3. Candidatos a extraer métodos son las líneas intermedias de un bloque IF y por separado, en otro método, en general, las líneas del bloque else.
  4. En Java, por ejemplo, o lenguajes con manejo de excepciones existe el típico caso de bloques (encima Java con su azúcar sintáctica (Syntactic sugar) lo hace más largo todavía!): 
     try {
           hacerA()
           hacerB()
           hacerC()
      } Catch (AgarrateException A) {
      }  Catch (AgarrateOtraException B) {
      } Catch (AgarrateTodas C) { }

En este caso ya es bastante mala la sintaxis del lenguage para que encima le agreguemos fuego al incendio. Un buen remedio, en general , es reemplazar "hacer A", "hacer B" y "hacer C" por un extract method, "metodoConEfectoABC" : try { metodoConEfectoABC() } catch (){ ...

     5. En cada paso, agregue un pequeño test de unidad que testee el nuevo metodo extraido.



Concluyendo porque los artículos largos también son malvados.

Este es en realidad uno de los code smell más común con que nos encontramos. Si hubiera que elegir un y solo un code smell para atacar para lograr mejorar lo máximo posible con un solo tiro la mantenibilidad del código, este es el que elegiría. Por supuesto que no alcanza con el para lograr tener una mantenibilidad aceptable o buena calidad, es solo un  buen comienzo  hacia el lado correcto.

Es muy común, luego de refactorizar uno de estos métodos largos en varios mas pequeños  que  varios de los nuevos metodos se parecen o realizan funciones similares a otros metodos ya existentes encontrándonos asi antes uno de los mas peligrosos code smell: Duplication is Evil.

Así que, porque se que se lo estaban preguntando, la tarea de un profesional del Código Limpio nunca termina y debe seguir la maxima de los Boys Scouts: Siempre  Listo....para mejorar la calidad del código.





martes, 29 de abril de 2014

A las metodologias agiles se las comio el sistema I




Si Señores y Señoras (para ser politicamente incorrectos) aqui estamos nuevamente despues de un nuevo impasse en escribir este blog y antes del siguiente impasse cuando dejaremos de escribir en este blog. El show debe continuar, que no se corte, asi que aquí vamos.


Hace poco en foro-agiles, el foro sobre metodologías agiles de la comunidad hispanoparlante, hubo una discusión sobre la corrupción de Agiles como concepto, originada en  sendos articulos de Uncle Bob Martin, The True Corruption of Agile, y Dave Thomas, Agile is dead.

A raiz de eso @gabrielMorrisS escribio un interesante post Corrupcion o acomodacion Agil del cual rescato la siguiente frase:

"No estoy diciendo que la corriente ágil sea la verdad absoluta, de hecho no
lo es, pero si creo que se debe ser consecuente con los principios que se
recitan a viva voz. No creo en fanatismos desbordados pero tampoco en la
acomodación relativa de las cosas por simple conveniencia."



En mi opinión, el problema de la corrupción de agiles no tiene tanto que ver con la proliferación de cursos solo focalizados en practicas soft  o los cursos que se basan solo en como gestionar proyectos agiles, o en temas humanos y de comunicación. Aunque claro,  en uno de estos cursos, como parte del mismo  hacían olerse las manos unos a otros, en otro te hacían representar películas con tus cuerpos...okay  quizás si esas practicas sean demasiado _________,  no se como nombrarlas.

Es decir, estas practicas (y principios y valores) bien dictados y por gente capaz y honesta cson interesantes y útiles y tan solo por la simple imposición de un proceso ordenado y simple (valga la redundancia) con foco en la comunicación y en las personas generan una gran mejora inicial respecto al caos anterior. 

Pero el problema es cuando es lo único que se enseña y aplica porque entonces la mejora no se sostiene a largo plazo.

Y lo que veo que pasa habitualmente es lo siguiente:

Una empresa  quiere  empezar a aplicar metodologías ágiles va y entonces contrata precisamente uno de
esos cursos. Supongamos que el curso esta bien dado, todos tienen los rudimientos de un proceso como Scrum y terminan todos muy contentos. Listo.
Respecto a la  parte técnica, bueno , claro, eso  ya vendrá mas tarde, todavía no estamos maduros, la gente tecnica ya sabe lo que tiene que hacer, solo aplicando scrum nos alcanza, etc etc , pongan aqui la excusa que quieran pero lo que sucede es que la empresa empieza a aplicar Scrum sin aprender, sin practicar, sin EXIGIR, ningun cambio en como se escribe el codigo sin intentar siquiera aplicar las mal llamadas practicas hard, las practicas mayoritariamente tecnicas como  TDD, pair programming, refactoring, clean code, continous integration, etc.

Lo cierto es que aprender la parte tecnica, las 13 practicas originales (surgidas de XP) es mucho mas difícil y trabajoso,  y conlleva mucho mas tiempo y esfuerzo que las practicas soft. Los gerentes y/o PMs no las entienden ni entienden cuan imprescindibles son, y cuando si lo hacen de cualquier manera el  tiempo apremia, los deadlines se acercan, y se corta el hilo por lo mas hard (quiero decir, lo mas delgado :P , por lo técnico). 

Entonces, la tipica implementacion de agiles que veo, una y otra vez es la siguiente:

1 - Los que eran Lideres o Project Managers antes ahora se llaman Scrum masters. Los Usuarios clave ahora son Product Owners.

2 - Hacemos Sprints de una semana o dos o tres o tres meses, da lo mismo, total, lo importante es hacer iteraciones.

3 - Se hará alguna que otra reunión a la que llamaremos planning meeting y alguna otra cada dos o tres dias que llamaremos Daily (?).

4- Hacemos reunion al final de cada sprint o proyecto, para festejar o echarnos la culpa a todos, las llaman "retrospectivas"


Y es verdad que la sensacion dentro del equipo y hasta para el usuario es la de ir mas rapido. Y el foco en las historias mas importantes hace que se vea mas valor agregado. Y al ir pasando los sprints por lo menos los usuarios se ven mas involucrados, se los consulta. Y todo esto es fantastico, estamos llendo ahora en un auto cada vez mas rapido a 150 km por hora hasta que....
Hasta que empieza a acumularse codigo mal hecho, a las apuradas ("ey, ni siquiera hay tiempo de testear demasiado, lo haremos al final"), comienzan a aparecer presiones (estas historias tienen que estar terminadas para el fin de este sprint). Y el codigo comienza a acumular deuda tecnica, rapido porque la corrupcion del codigo crece siempre de manera exponencial y antes de que nos demos cuenta.....el auto comienza a vibrar, cuesta cada vez mantenerlo en la ruta deseada y luego de un par de sprint mas  estrellamos el proyecto contra el arbol del codigo inmantenible (lo confieso, la metafora me quedo algo forzada). 

Hay un sintoma que no falla: cuando comienza a haber modulos que no tocamos por miedo, cuando un simple cambio produce regresiones importantes, ya sabemos como sigue,y  lo peor, ya sabemos como termina esa pelicula (los buenos mueren).

Asi se terminan usando *solo* las practicas soft de agiles (y en la palabra "solo" reside el problema) y entonces los miembros de los equipos, usuarios y clientes terminan pensando  que  agiles es solo eso. Y esto es tremandamente peligroso porque no solo fracasa un proyecto sino que el mismo concepto agil se ve manchado, como dice Uncle Bob, corrompido.


 Asi en lugar de una verdadera metodologia agil, tenemos una especie de Cargo Cultismo Agile ( http://en.wikipedia.org/wiki/Cargo_cult o aqui mismo), honran todas las ceremonias del culto,  tocan tambores, construyen torres de control de madera pero.... los aviones no llegan.

martes, 21 de febrero de 2012

Complejidad Innecesaria? El Infierno de Dante?





Introduccion

A ver, para que se comprenda el siguiente articulo, los que escribimos este blog, fuimos en su tiempo adherentes de correr detrás de la ultima tecnología y que a mayor complejidad, mayor placer por dominar temas complicados, por aplicar conocimientos teóricos, etc. Era además mucho más interesante plantear un sistemas de colas concurrentes usandos colas en memoria con PVM (una máquina virtual paralela que permita ejecución paralela en servidores) que resolverlo con una simple tabla en base de datos. Lo cierto es que estabamos equivocados, y nos fuimos dando cuenta a lo largo de todas las veces que complicamos soluciones de manera totalmente innecesaria y luego se nos volvió contra nosotros mismos.

Indice de Complejidad de Arquitectura

Cada tanto me gusta inventar "números Kafkianos", esto es inventar medidas de algo que no estén basados en la teoria de los grandes números, en álgebra ni en nada muy "serio" pero que provengan del sentido común y/o cierto conocimiento y que sean aplicables a temas de la vida diaria. El porque le achaco al pobre Kafka la paternidad de este tipo de números sin el menor fundamento es materia de opinión psicológica, en la que no vamos a entrar.

 Vamos a definir entonces el índice de Complejidad de la Arquitectura de una aplicación, ICA (app) como el número de componentes lógicos o de provisión de datos que necesita la aplicación para funcionar. Esto es sin contarse a ella misma, es decir al código de la aplicacion que provee la lógica princpial en si, ya que es obvio que se necesita. Asi, tenemos que una vieja aplicación Desktop (las que corrían o corren en los clientes mismos, las de antes), como, para citar un ejemplo que todavia sobrevive, una planillita excel(que no acceda a base de datos), un Paint, un Visio (versión desktop), Autocad, etc., tienen :

ICA( app desktop) = 0 (en general).

Okey, Si, es verdad que no estamos teniendo en cuenta componentes de la infraestructura de red, routers, proxys, firewalls, ni virtualización de servidores, ni siquiera componentes de los sistemas operativos. Tampoco tomamos en cuenta librerias de subcomponentes de una aplicación web como por ejemplo log4j (si tenemos log4j dependemos en cierto sentido de como este configurado, en su impacto sobre la aplicación, etc.). Pero permitanme dejarlos de lado, vamos a algo mucho más simple. Una aplicacion Cliente-servidor, que accede a una base de datos (estilo las apps basadas en Oracle forms, Java Desktop aplication, app tipicas Visual Basic version x , etc) tiene :

ICA (app client-server) ) = 1 (en general)

Además de si misma necesita una base de datos configurada "up and running", y depende de ella para proveer servicios al usuario.

Un simple y querida aplicacion web, sea en Java, .NET, PHP o Ruby on Rails, tiene:

ICA (app web) = 3 (en general)

Es decir, debe funcionar un browser o navegador en el cliente (con su correspondiente configuracion, nada trivial, de cookies, activex, etc.), una base de datos (un servidor de base de datos, más el espacio de tablas o esquemas necesarios, seguridad, etc.) y un servidor de aplicacion, de nuevo, que este funcionando y correctamente configurado. Y si, ya se que la complejidad de hacer aplicaciones varía si el lenguaje es Java, .NET o Rails.Y ni siquieta estamos considerando que la aplicacion use ajax o no. Lo se. Continuen conmigo un poco más.

Mundo HTML5 ( Appweb con Javascript en el navegador, ajax, JQuery (que simplifica enormemente el desarrollo Javascript!)), todo esto da :

ICA (app web) = 4 (IC(app) web + 1 de funcionamiento de la lógica JS en el cliente)

Llegando al mundo SOAP, la cosa se pone interesante, a ver, cuenten conmigo, para que una applicacion que accede a servicios a través de SOAP funcione tienen que funcionar a la vez y estar correctamente configurados: 1 browser (repito, la configuracion no es trivial) 1 Aplication Server ( de la app. en si) 1 Base de datos (por lo menos) 1 Enterprise Service BUS 1 Aplication Server (adonde reside el servicio) 1 registro de servicios (Service Registry)

ICA(app SOAP) = 6 !!!

y eso que estamos contando que accede a servicios residentes en un mismo aplication server, si accediera a n servicios en distintos servidores, la formula deberia ser algo asi como:

ICA(app SOAP) = 5 + n * 1, con n>=1.

Estoy viendo que bien podriamos llamarlo Indice de acoplamiento de la infraestructura de un sistema.

Al Mundo SOAP le sumo (+) BPM :

ICA (app SOAP + BPM) = 7 + n * 1 ( al ICA(SOAP) le sumamos el BPM y su base de datos)

A ver, es claro que cada aumento en la complejidad que hemos dado hasta aqui está de alguna manera justificado porque se supone que provee un beneficio, a veces más o menos tangible, para el usuario final. Una primera pregunta es: Esto, se percibe realmente así? Esto, Es realmente así? A ver, es claro que hay algunas situaciones adonde amerita aumentar la complejidad, depende siempre del contexto. No estamos diciendo que nuuunca se deban utilizar una cache distribuida, por ejemplo.

Lo que es seguro es que ese supuesto beneficio no viene sin un costo. Para que funcione una de estas aplicaciones, más alla de la complejidad inherente de su propia lógica deben funcionar correctamente TODOS y cada uno de los otros elementos a los que está acoplada, y no solo deben estar levantados y corriendo. Deben hacerlo sin errores, con buen rendimiento, deben estar correctamente configurados y sincronizados , muchas veces referenciándose entre sí de manera exacta, en un millar de archivos xml distintos, todo esto, para que el conjunto funcione.

A la vez, un error, en configuración o lógica, o un problema de escalabilidad por pequeño que sea, en cualquier eslabón de esta larga cadena hace que el todo no pueda funcionar. Se producen errores , o problemas de performance , a menudo de maneras impredecibles e indeterminadas. Esto ES asi porque la combinatoria de posibles problemas explota de manera exponencial. Y ni que hablar de tratar de encontrar problemas de concurrencia o simplemente debuggear errores.  No es de extrañar que las aplicaciones sean cada vez menos confiables.

Las aplicaciones actuales que vemos, corrijanme si me equivoco, no es raro que posean 2 o 3 datasources que acceden a diferentes fuentes de datos, servicios varios de diferentes aplicaciones, conectores con algun ERP o sistemas externos, interfaces con algún Mainframe, Caches distribuidos, y etc y etc. Traducido a dos palabras: Una Pesadilla. y no solo para la pobre gente que debe administrarlo y mantenerlo, piensen tambien en el costo extra ($$) que genera esa administración y mantenimiento.
Y no estamos hablando todavia (ahora si!) del costo y la dificultad que implica armar ambientes de tests y desarrollo que permitan soportar esta infraestructura para desarrollar nuevas aplicaciones (mocks, instancias de desarrollo, de testing, para cada uno de los componentes interdependientes, servicios, servidores varios, etc.). Todo lo cual dificulta aún más el testing de las aplicaciones, ya de por si una de las tareas más dificiles del desarrollo.

Dejamos para un siguiente articulo el siguiente "dilema", viene Cloud Computing (la computación en las Nubes) a incrementar o  disminuir la complejidad de la arquitectura de las aplicaciones? 

Ok, no soy naive y entiendo que los grandes Vendors tienen que inventar "modas" y seguir vendiendo "Enterprise Integration Aplication" servers, Parallel computing infrastructures, Aplication servers con servicios cada vez más complejos o la última moda en portales de agregacion de contenidos. También comprendo que en el afán por llegar al futuro, con ánimo de mejorar y brindar nuevos productos hay mucha gente honrada que plantea estas infraestructuras de buena fe, y con las mejores intenciones pero........

No nos estarán haciendo recorrer los 9 círculos del infierno?

viernes, 16 de diciembre de 2011

Vuelta al Blog y algunos consejos para la carrera

Cambios de Empresa, Viajes a Shanghai, a Palo Alto, en el mismísimo Silicon Valley, construcción de plataformas para Cloud Computing, uso intensivo de Git, GitHub, continuous Integration (Integracion Contínua), implementacion de Continuous Deployment (Despliegue continuo), Culturas de Start Ups, etc., son algunas de las novedades de este año que ya se termina. Son demasiadas para un solo post. Vamos a ir retomando de a poco este espacio de reflexión sobre tecnología de la información, buenas practicas de Desarrollo y todo lo que hace a las metodologias ágiles y al desarrollo de software en general.

La verdad es que tuvimos un poco abandonado (tachen "un poco") a este blog gran parte del año. Hemos estado envueltos en un proyecto altamente demandante de tiempo en una empresa Start Up. Algún día con un poco mas de perspectiva escribiremos sobre esta experiencia que ha tenido de TODO menos aburrimiento. En parte es por eso que no hemos podido escribir en este blog. Estuvimos en unos de esos periodos de aprendizaje intensivo, mezclados con no-pocos-cambios y experiencias de toda índole. Y todo suceso de este estilo conllevan un ritmo que no dan mucho margen para pararse a pensar y reflexionar demasiado sobre lo que esta sucediendo.

Hoy quiero dejarles esta reflexión.

Cuando recién empezaba en esta profesión (hace poquísimos años....bueno tampoco tantos che! unos 16 añitos...) no había la diversidad de ofertas que hay en este momento. Uno elegía entre dos o tres opciones a lo sumo e iba pasando de proyecto en proyecto mas o menos como y cuando podía. Tampoco me importaba demasiado porque en ese momento pensaba (no lo pensaba, en verdad, lo "sentia" de alguna manera porque si me paraba a pensarlo es obvio que no es asi) que tenia infinitos proyectos por delante.

Habiendo ahora tantos proyectos, tantas empresas y ofertas dando vueltas por el mundo veo a un montón de gente que se conforma con lugares mediocres, con proyectos tan interesantes como palear las arenas del Sahara en verano y se aferran a trabajos malsanos o ambientes enfermos como si estuviéramos hace 30 años atrás donde un empleado entraba a una gran empresa y sabia que se iba a retirar en ella.

Por el otro lado veo tambien a chicos muy jóvenes, con mucho empuje y ganas pero que en lugar de elegir lugares adonde aprender, repito: adonde r-e-a-l-m-e-n-t-e aprender, van saltando de trabajo en trabajo como sapo perseguido porque un trabajo le ofrece 10 pesos mas que otro, sin planificar a mediano plazo. Sin planificar en que área, en que tipo de proyectos le gustaría trabajar. La gente que trabaja en IT en USA tienen muy claro esto de planificar sus carreras a mediano plazo digamos.

Muchas veces he tenido que elegir entre proyectos. A veces entre ganar mas plata y hacer algo que me interese. Elegir entre el bolsillo o el corazón. Y créanme lo que les digo, las veces que elegí con el bolsillo... nunca salieron como esperaba.

No estamos planteando acá una postura romántica o naif o a la San-Francisco-De-Asis, "Salven al mundo!! Sigan sus corazones", "Viva la pobreza", "Si a la Revolución Arabe", no (es decir, Si a la revolución Arabe pero no a Vivir en la pobreza ). Sabemos que uno trabaja principalmente por dinero y que lo que busca en general al cambiarse de trabajo es un crecimiento...en dinero.

Pero lo cierto es que si es "solo" el dinero, si el trabajo no te motiva, es aburrido o te desmotiva a cada paso, tarde o temprano terminarás odiando lo que haces, o a tus compañeros o jefes o a todos juntos... incluyendote. Y 40 horas semanales (o mas!) es demasiado tiempo para hacer algo que uno odia, verdad?.

Asi que les dejo la GRAN VERDAD NUMERO 1 de este fin de año, a modo de reflexión.

GRAN VERDAD NUMERO 1:

Hay un numero limitado de proyectos de desarrollo en los que participaremos en nuestras vidas. Elijamos aquellos que realmente nos apasionen. Somos de los poquitos profesionales en el mundo, los de IT, que podemos darnos este lujo.

Asi que, aún cuando esten recien comenzando la carrera, y sobre todo si estan en esta situacion, empiecen por pensar que quieren, que les gusta. Que les gustaria hacer los proximos años.

  1. Si solo conocieron un lenguaje de programación, experimenten con otros.
  2. Si solo estuvieron en consultoras de sistemas, traten de estar en el depto de sistemas de una gran empresa.
  3. Si solo estuvieron en un determinado tipo de proyectos o metodología, experimenten con otros.
  4. Traten de cambiar a proyectos que sean interesantes, por la tecnología o por el tema de negocio relacionado.
  5. Traten de rodearse de personas que sepan mas que ustedes.
  6. Empiecen un blog de sus temas favoritos, participen en foros,
  7. Hagan de su CV un diamante en bruto, al cual agreguen items puliendolo asi dia a dia.

Y si hacen algún trabajo que realmente los apasiona, si son buenos y se esfuerzan cada dia por mejorar, por crecer profesionalmente, si se preocupan y toman cada nuevo comienzo como una gran oportunidad, y piden reconocimiento (noten que no dije "esperen reconocimiento"), créanme, va a suceder. Van a ganar dinero y hacer algo que les apasione.

Elijan siempre con el corazón.

viernes, 20 de mayo de 2011

El sindrome de Estocolmo II : Test para saber si te han Secuestrado

Hablabamos en el post anterior de que en la actualidad hay muchisimo trabajo y oportunidades laborales en el área de sistemas y sin embargo es frecuente encontrar a personas muy capaces e inteligentes sufrir por sus trabajos actuales, quejarse constantemente pero no encontrar una salida y quedarse en un circulo vicioso.

Las siguientes son las condiciones de contexto adonde es probable que se produzca un síndrome de Estocolmo. Agregamos algunas preguntas que tiene que ver específicamente con las situaciones que se producen al trabajar.

Si estas trabajando hace rato en un mismo trabajo, si te sentís desmotivado, aburrido, hastiado. Si te enfermas a menudo, si hay ciertas cosas que te rebelan. Si tenes miedo de expresar lo que sentis, lee las siguientes preguntas y contestalas por y para ti.

A - Debe existir la percepción de una amenaza cierta a la supervivencia o integridad física o mental del Rehén.

Los empleadores tienen el poder de decidir si lo despedirán a uno, si le darán una promoción a un cargo mayor o decidir si lo asignara a un proyecto importante o irrelevante.

La amenaza aquí, ciertamente no de vida (al menos en los casos que conozco) se produce porque el empleado ve amenazado sus ingresos, su carrera, su futuro en manos de la decisión de uno o mas de sus empleadores.

Se ha generalizado la sensación de que no se debe criticar ni se puede estar en disenso?. Hay rumores de que tal y tal personas fueron echadas por ese u otro comportamiento que la empresa desea desalentar?. Hay alguna que otra humillación privada o más o menos pública o falta de consideración total. Hay rumores de que solo acomodado o siendo amigo de alguien se consiguen ascensos? Todos tus compañeros trabajan horas y horas de más y te miran mal cuando trabajas solo 10 horas diarias?

Repetimos lo que dijimos en el post anterior: No en toda empresa simplemente por existir la posibilidad de un despido se esta en esta condición, porque entonces se cumpliría en todos lados. Estamos refiriéndonos a aquellas adonde la amenaza se cierne siempre, de manera constante, de una manera más o menos explicita o velada en conversaciones, rumores de pasillos y en la publicidad de las "ejecuciones" (cuando se despide a alguien).

B - Aislamiento del exterior y único contacto con opiniones y perspectivas de los captores.

Esta condición se cumple en general en grandes corporaciones o empresas con una cultura interna muy fuerte. Los empleados viven inmersos en ese "mundo", solo reciben la visión de sus empleadores, jefes y compañeros. Una de las características principales que se da es la creencia generalizada de que la situación en esa empresa es "especial", distinta al resto del mundo y que en ningún lugar se hacen las cosas mejor que allí. Las pequeñas bondades de la empresa se magnifican y personalizan.

La mejor y única tecnología es la que se usa en tu empresa y el resto son basuras? Casualmente los de adentro son las mejores personas y la empresa tiene los mejores resultados? No tenes idea de cuanto se paga en el mercado? Cuan buscado es tu perfil? Siquiera que tecnologías se usan en otras empresas? No te dejan ir a seminarios o cursos? Se desmerecen con comentarios despectivos reuniones de asociaciones o grupos independientes?

C - Pequeños actos de bondad y cuidado de los abusadores a las victimas.

La empresa instala Aro de Baskets y Play Station? Pone una maquina de Golosinas y gaseosas para todos? Te otorga un salario un poco por encima del promedio para el cargo? Súbitamente aparecen pequeños bonos o premios de distinta índole? Que tal ese beneficio adicional que estabas esperando? Uno siente que aun cuando el ambientes de trabajo es malo, desmotivamente, la empresa intenta ser buena con uno dándole algunas pequeñas ventajas materiales. La sensación general es "Es verdad que esto es un desastre pero...por lo menos me pagan bien".

D - La percepción de la imposibilidad de escapar del abuso.

Los empleados atrapados en estas empresas perciben "barreras de salida" alrededor de ellos que no los dejan "escaparse". En cierto sentido son excusas pero excusas bastante reales. Veamoslas.

Tu sueldo es bien alto y competitivo de manera que otras empresas en tu mismo cargo no pueden pagártelo? Los beneficios son tan intrincado de medir que no sabes realmente cuanto pedir para pasar a otra empresa? Estas desarrollando tareas no habituales para tu experiencia o encerrado en tecnologías muy puntuales que hacen que no puedas encuadrarte realmente en un perfil para salir a buscar trabajo? Vas a una y otra y otra entrevista pero siempre el aura de beneficios de tu empresa actual hacen que no termines aceptando nunca otra propuesta?

Como leer los resultados del tests?

Muy simple, si contestas que sí a algunas o varias de las preguntas en los apartados A, B, C y D podes estar viviendo un cuasi-Sindrome de Estocolmo.

Asi que ya saben, si sos programador y a pesar de ganar muy bien o tener ciertos beneficios, te sentis realmente mal en tu trabajo, si te estresas, te agarras pequeñas enfermedades frecuentemente y no te animas a buscar un nuevo trabajo (o ninguno te viene bien), recordá lo siguiente:

En el Yoga tradicional se sostiene que para que entre algo nuevo en tu vida tenes que vaciarte, tenes que eliminar todo lo viejo, sino, justamente ese aferrarse al pasado no permite que entre nada nuevo, no deja cambiar, no permite crecer.

No sera hora entonces de pulir ese CV en Linkedin ?

martes, 10 de mayo de 2011

El sindrome de Estocolmo



En estos últimos años he estado en contacto con varios colegas de área de desarrollo de software que no están bien en sus respectivos empleos pero por algún extraño motivo se resisten a abandonarlo. Se quejan del ambiente, de algún jefe, de las herramientas que utilizan, de las horas que tienen que trabajar de más, caen enfermos con frecuencia, sufren muchas contracturas, engordan, en pocas palabras, sufren, pero aun asi no atinan a cambiar de trabajo.

No se si es algo aplicable a toda latinoamérica, pero aquí en Argentina, en estas épocas de bonanza, adonde la demanda de determinados perfiles supera amplia mente a la oferta eso es un poco... ilógico.

Aclaramos, no estamos diciendo que ante el primer pequeño problema o desmotivación hay que irse del trabajo. No, no es asi. Para ser claros, no estamos de acuerdo con el típico programador que salta de empresa en empresa, quedándose 3 A 5 meses antes de escapar a otra para evitar asumir cualquier responsabilidad o ganar dos centavos más.

Contexto laboral para el surgimiento del síndrome

Las situaciones a las que me refiero son bastante más enfermizas y de cierto maltrato. Esto no significa que los esclavicen con látigos o trabajando a destajo (eso se terminó hace algunos pocos años, jeje), no. Son maltratos mucho más sutiles.

En algunos casos se comienza por instalar una atmósfera rancia de presiones por alinearse con el proyecto en particular de una o varias personas. Surge luego un ambiente ligeramente amenazador adonde nadie se anima a decir en voz alta lo que piensa y termina con la instalación de amenazas veladas sobre que no estar de acuerdo implica despidos o degradaciones / humillaciones publicas o de cargos.

En otras empresas en cambio se da por una falta total de motivación causada por peleas políticas en las altas esferas que hace que cualquier proyecto se paralice y cambie de dirección mil veces antes de ser abandonado sin terminar, lo cual causa desmotivación, falta de interés seguido de aburrimiento y terminando en hastío.

A veces son simplemente ambientes estatales faltos totalmente de desafios e incentivos y en otras se generaliza la desmotivación cuando se premia cualquier cosa menos trabajar bien.

A quienes Afecta?

Son Programadores, Analistas, Arquitectos, personas capaces y responsables, viven quejándose, desmotivados, malhumorados, con cansancio crónico pero sin embargo no se dan cuenta que pueden irse de esas empresas. O cuando lo intenta, no alcanzan nunca a encontrar el trabajo ideal, ese que están esperando para irse.

Condiciones para la aparición del síndrome

Hace cierto tiempo había leído un articulo de Chad Fowler titulado : "Dead-End Jobs: Are You Suffering From Stockholm Syndrome?", el cual me pareció ciertamente un tanto exagerado. No obstante, ahora releyéndolo encuentro algunas similitudes ciertamente inquietantes.

En psicología el termino "Síndrome de Estocolmo" es utilizado para describir un comportamiento psicológico paradójico adonde un rehén desarrolla empatía y sentimientos positivos hacia sus captores.

Pueden leer el post de Chad Fowler que describe, seguramente mejor de lo que yo lo haré, las condiciones que se cumplen para que esto suceda en "Dead-End Jobs: Are You Suffering From Stockholm Syndrome?".

Fijense entonces las condiciones y después ustedes sacarán sus propias conclusiones.

A - Debe existir la percepción de una amenaza cierta a la supervivencia o integridad física o mental del Rehén.

B - Aislamiento del exterior y único contacto con opiniones y perspectivas de los captores.

C - Pequeños actos de bondad y cuidado de los abusadores a las victimas.

D - La percepción de la imposibilidad de escapar del abuso.

El punto 3 es esencial toda vez que si la conducta de un Captor hacia su victima es de violencia y agresión permanente el Rehén desarrollara odio o terror pero nunca se encariñará. Tiene que haber pequeños actos de bondad o que sean percibidos como tales para que la victima al tratar de evitar el miedo o el pánico se refugie en esos pequeños actos para protegerse mentalmente del miedo, de la perdida de control de su vida y del ataque a su autoestima.

Existen realmente los Trabajos-Captores?

Repito que a mucha gente, yo el primero, puede parecerle una exageración hasta aquí la relación entre sentirse atrapado por un trabajo y condiciones de secuestros reales adonde lo que esta en juego es la vida de la persona secuestrada. Pero si uno mira una a una las condiciones se pueden ver algunas similitudes.

Creo que es importante aclarar un poco mas sobre las condiciones que hacen que un empleo en particular tenga este efecto.

Como nos debemos a nuestra audiencia, para la proxima, prometemos desarrollar un mini-test de preguntas para ayudarnos a analizar si ese trabajo que te está haciendo pasarla mal te ha capturado, y lo peor es que no esta pidiendo mas rescate que tu salud.

miércoles, 20 de abril de 2011

Lecciones reaprendidas

Hoy tuve unas de esas peleas con el código que te hacen reconsiderar el pasarte a Management :). No fue muy sangrienta, sólo un bloqueo de media hora, pero cometí tantos errores repetidos que cuando finalmente logré hacer lo que quería no sentí satisfacción sino bronca.

Mi objetivo era hacer una subclase de una clase básica del entorno, para agregarle cierta funcionalidad. Estaba apurado porque tenía poco tiempo y quería terminar esta tarea hoy. Intenté el camino obvio: crear la subclase y utilizarla en lugar de la clase del sistema. Esto no me funcionó y como estoy en un entorno bastante nuevo (Objective-J/Cappuccino), decidí que la herencia no debía estar funcionando bien (??). Entonces me puse a buscar maneras de lograr mi objetivo de otra manera: intenté con un wrapper de la clase que quería modificar, con modificar el comportamiento de la clase que llamaba a la nueva clase y con unas cuantas maneras más, sin resultado. Busqué un rato en Google, pero no encontré ninguna referencia a mi problema. Estaba atascado. Ya perdido, volví a intentar el camino inicial, y funcionó!!. Revisé lo que había hecho en mi primer intento y por supuesto, encontré un problema en mi implementación inicial.

Los errores que cometí fueron los siguientes:

1. Asumir que la herencia no funcionaba. El compilador nunca está roto!!! Bueno, si, a veces está roto, pero en 20 años de programar sólo he descubierto 2 o 3 de esos errores y me he equivocado muchas veces. Es siempre mucho más probable que el error este entre el teclado y la silla.

2. Trabajar apurado. Quería terminar hoy y dejé que el apuro dominara mi forma de trabajar. Al final me llevó más tiempo que si lo hubiera hecho tranquilo.

3. No hacer un experimento. Si sospechaba que la herencia estaba andando mal, tendría que haber armado una clase sencilla y probar las cosas ahí. Si no lograba reproducir el problema, probablemente hubiera sospechado la verdad...

4. Insistir en arreglar el código que había hecho. Cuando uno no encuentra un error que obviamente tiene que estar ahí, lo más sencillo es borrar las modificaciones y empezar de nuevo. Tengo la costumbre de hacer commits muy frecuentes, así que volver atrás mis cambios no hubiera sido costoso. Además, estoy usando git, asi que también hubiera podido volver atrás temporariamente con un git stash.

5. Trabajar sólo. Este fue exactamente el tipo de problema que haciendo Pair Programming no me hubiera pasado.

Bueno, ahora que lo escribí se me pasó un poco la bronca... la próxima vez que sospeche del compilador espero acordarme...