archivo

Archivos Mensuales: julio 2010

Haciendo una revisión de algunos incumplimientos de reglas detectados por Sonar, nos llamó mucho la atención a un proveedor y a mi un incumplimiento que se repetía en distintas partes del código de una aplicación Java basado en una regla de CheckStyle denominada “Parameter Assignment”, ya que ninguno de los dos entendíamos por qué.

¿Cuándo se produce el incumplimiento de esta regla? Cuando dentro del cuerpo de un método se asigna un valor a un parámetro de entrada.

Para intentar entender los motivos acudí a Internet y al libro “Refactoring: improving the design of existing code” de Martin Fowler y Kent Beck y básicamente es el siguiente:

Mejorar la comprensibilidad de los métodos por la confusión que existe en muchos casos con el paso de parámetros a los métodos en Java. En Java siempre se realiza un paso de parámetros por valor, es decir, el método trabaja con una copia del parámetro enviado por el método llamante por lo que cualquier posible cambio en dicho parámetro dentro del mismo no afecta hacia fuera de él, no obstante la confusión la tenemos cuando el parámetro que se envía es un objeto en lugar de un tipo primitivo, en ese caso también existe un paso por valor, pero la copia en esta caso es una referencia a memoria por lo que los cambios en este caso si pueden tener su reflejo en el método llamante. Como pese a que el paso del parámetro es siempre por valor, pero el comportamiento varía en función de si lo que se pasa es un objeto o un tipo primitivo una forma de darle un tratamiento homogéneo es tratar el parámetro de entrada como una “constante” y que si hay que hacer operaciones se haga con variables u objetos temporales.

Además de tratarse de una regla de estilo (claridad, comprensión y homogeneización), en mi opinión (y es solo mi opinión) también es una forma de prevenir cambios no deseados en el valor de un objeto mediante al acceso a su contenido en los métodos donde se pasa el valor de su referencia en memoria.

Este es el cuarto artículo que publico con la evolución en el uso de navegadores y sistemas operativos en dos sitios web españoles dirigidos al público general, que tienen un importante número de visitas como para que los resultados obtenidos con las métricas de Google Analytics sean lo suficientemente representativos.

El primer artículo fue publicado el 12 de enero de 2009 y contiene los datos entre el 30/06/2008 y el 31/12/2008. El segundo artículo fue publicado el 22 de julio de 2009 y contiene los datos entre el 01/01/2009 y el 30/06/2009. El tercer artículo fue publicado el 26 de enero de 2010 y contiene los datos entre el 30/06/2009 y el 31/12/2009.

En este artículo, se muestran los resultados recogidos entre el 01/01/2010 y el 30/06/2010 y se comparan con los resultados informados en los tres artículos anteriores (aparecen entre paréntesis, en orden cronológico de más reciente a menos reciente).

Como conclusiones más significativas, señalar las siguientes:

1) La trayectoria descendente en el uso de Internet Explorer es continua y se situa entre los cuatro y siete puntos al semestre (si hacemos media de los resultados obtenidos a lo largo de estas mediciones, la caída se situa en los cuatro puntos al semestre o lo que es lo mismo 8 puntos al año). Todavía domina por mayoría absoluta, pero de continuar la caída tal y como ahora y de seguir el auge de los otros navegadores (nada hace presagiar que se inviertan los términos) será cuestión de año y medio o dos años que pierda la mayoría absoluta. No obstante, se requerirá mucho más tiempo para que otro navegador le quite el trono.
2) La pérdida de cuota de Internet Explorer se la han repartido principalmente Firefox y Chrome (este último ya ha dejado de ser una anécdota). También es importante señalar que sigue el estancamiento de Opera, con un uso prácticamente testimonial y que la subida de Safari es coherente con el incremento de uso de los dispositivos de la familia Mac.
3) En cuanto a los sistemas operativos, el dominio de los sistemas operativos de la familia Windows sigue resultando abrumador. Es cierto que cada semestre pierde algo de cuota (aproximadamente un punto), pero es muy poco en relación a la que ya tienen. Casi todo lo que pierde Windows, en esta ocasión se lo han repartido a partes casi iguales Mac y Linux.

Sitio web 1:

Navegadores.

– Internet Explorer: 69’38% (73’83%) (77′27%) (81′81%)
– Firefox: 23’04% (21’06%) (19′40%) (16′16%)
– Chrome: 5’13% (2’93%) (1′50%) (0′48%)
– Safari: 1’79% (1,45%) (1′13%) (0′87%)
– Opera: 0’35% (0’44%) (0′44%) (0′41%)

Sistema Operativo.

– Windows: 95’84% (96’57%) (96′94%) (97′52%)
– Macintosh: 2’12% (1’83%) (1′65%) (1′37%)
– Linux: 1’65% (1’29%) (1′22%) (1′02%)
– iPhone: 0’19%
– SymbianOS: 0’06%
– Android: 0’03%

Combinación Navegador + Sistema Operativo.

– Internet Explorer + Windows: 69’38% (73’83%) (77′27%) (81′80%)
– Firefox + Windows: 20’87% (19’19%) (17′61%) (14′69%)
– Chrome + Windows: 4’99% (2’91%) (1′50%)
– Firefox + Linux: 1’40% (1’12%) (1′06%) (0′84%)
– Safari + Macintosh: 1’27% (1’07%) (0′92%) (0′72%)

Sitio web 2:

Navegadores.

– Internet Explorer: 62’19% (69’06%) (72′08%) (74′71%)
– Firefox: 27’69% (24’27%) (23′7%) (22′47%)
– Chrome: 6’15% (3’43%) (1′69%) (0′71%)
– Safari: 2’85% (2’22%) (1′73%) (1′45%)
– Opera: 0’69% (0’67%) (0′54%) (0′43%)

Sistema Operativo.

– Windows: 93’57% (94’93%) (95′58%) (96′3%)
– Macintosh: 3’34% (2’91%) (2′46%) (2′19%)
– Linux: 2’50% (1’68%) (1′66%) (1′34%)
– iPhone: 0’28%
– SymbianOS: 0’11%
– Android: 0’05%

Combinación Navegador + Sistema Operativo.

– Internet Explorer + Windows: 62’19% (69’06%) (72′07%) (74′7%)
– Firefox + Windows: 24’39% (21’62%) (21′12%) (20′24%)
– Chrome + Windows: 5’93% (3’4%) (1′69%)
– Firefox + Linux: 2’14% (1’47%) (1′55%) (1′23%)
– Safari + Macintosh: 2’05% (1’73%) (1′43%) (1′22%)

Alcanzar los objetivos cuando uno pierde contacto con la realidad es prácticamente una quimera.

Para alcanzar lo que uno quiere hay que ser conscientes de dónde estamos, cuáles son los obstáculos que hay que superar, cuáles son nuestras limitaciones y que se requiere su tiempo. No tener en cuenta esas variables retrasará o impedirá la consecución de los objetivos.

Hay que soñar siempre y tener siempre objetivos por los que luchar, no importa que sean complicados o que estén muy muy altos, siempre podemos llegar a ellos siempre que volemos con los pies en el suelo.

Descubrir que uno no es más que un nisu más es una liberación, ya que supone habernos dado cuenta de que en realidad no somos mejor que nadie, de igual manera que nadie es mejor que nosotros.

A partir de que descubrimos que somos un nisu el camino para la mejora y la evolución personal es mucho más ancho porque:

– Alguien puede ser mejor que tú en una disciplina, pero seguro que tú lo eres mejor en otras. Esto refuerza la autoestima, tal vez tu habilidad no te permita ganar tanto dinero como las habilidades que tiene otro, pero eso solo tiene importancia si lo que realmente te mueve es el dinero o si el dinero fuera la solución a todo (que a todos nos gustaría tener más pasta es evidente, pero dudo que en la balanza de mucha gente pese más el dinero que la felicidad).

– El límite somos nosotros mismos, no lo ponen otras personas.

– Lo que marca la diferencia realmente es las ganas de superarse, ya que absolutamente nadie es perfecto y aunque sea mejor que tú en disciplinas donde tenga algunas habilidades innatas o se haya preparado más, habrá otras donde tú seas mejor por tu propia naturaleza o te hayas preparado más.

Si las cosas no marchan y llevan un tiempo sin marchar no es cuestión de casualidades o coyunturas, sino de que hay problemas, tal vez repartidos en diferentes áreas, que si no se analizan, encuentran y solucionan, provocarán que la situación no solo no mejore sino que cada vez funcione peor y en consecuencia se obtengan peores resultados. Una organización no puede soportar malos resultados mucho tiempo y quienes sufrirán sus consecuencias serán sus propios empleados.

Para cambiar, lo primero que hay que hacer es detectar qué está fallando, probablemente estén fallando bastantes cosas, no hay que engañarse con esto, cuando algo va mal, es porque hay más cosas que van mal que cosas que van bien. Pensar que el problema es por algún elemento aislado es un error. Esto implica que hay que hacer un análisis en profundidad con una visión de autocrítica y dejando al lado los sentimientos (después los puedes recuperar a la hora de tomar las decisiones, pero el análisis requiere ser frío si se quieren obtener resultados objetivos).

Es importante que el análisis se base en lo posible en métricas objetivas, ya que el análisis sobre lo que se ha podido medir tendrá más fundamento que el realizado sobre lo que no se ha podido medir. Las mediciones puede ser matizables, pero son datos cuantitativos. Lo cualitativo siempre depende de la percepción del que cualifica y las fronteras entre las partes discretas en que se divida son siempre difusas.

El análisis permitirá poner sobre la mesa una serie de aspectos que funcionan regular, mal y muy mal (no se garantiza que todo lo que no vaya bien se encuentre y tampoco que haya cosas que no van tan mal que parezca que lo están, pero la imposibilidad de un análisis perfecto no merma su utilidad, ya que cuantas más situaciones que no vayan bien se detecten y arreglen más fácil será que los resultados cambien su signo y en consecuencia la maquinaria en su conjunto vaya mejor).

Una vez puestos sobre la mesa hay que tomar decisiones (ahí sí pueden entrar los sentimientos y valoraciones subjetivas, pero hay que tener en cuenta que si el sentimiento predomina sobre lo racional, las decisiones serán menos efectivas o incluso inútiles, también hay que tener en cuenta que si todo se basa en lo racional y no hay ningún sentimiento, la organización pierde algo de su espíritu y se convierte en una máquina más, en una corporación más. Desde mi punto de vista debe predominar siempre y con amplio margen lo racional y analizar algunas circunstancias desde el sentimiento (solo algunas).

La toma de decisiones sin analizar los problemas de fondo es ir a ciegas, puede que se acierte alguna decisión, pero difícilmente se conseguirá resolver algo que no se sabe que es. Toda solución es resultado de la existencia de un problema previo, si no conoces el enunciado difícilmente podrás dar la solución que requiere el problema.

Se tendrán que tomar decisiones dolorosas, se tendrán que reorganizar algunas áreas de la organización, se deberán replantear estrategias, todo a favor del interés general de la organización, que también será el bien general de los empleados. Lo que no funciona hay que arreglarlo y no se arregla solo, necesita de la toma de decisiones. Esta toma de decisiones difíciles (y valientes) están en el sueldo de quienes tienen que tomarlas, si no están dispuestos a tomarlas es que no están capacitados para ocupar el puesto que ocupan y por tanto son un problema más de los tantos que hay que arreglar.

Dejar que las cosas se arreglen por pura inercia es dejar que se arreglen en manos de la casualidad y creo realmente que ese no es el camino, en un mundo competitivo, dinámico y variable como en el que vivimos ganan quienes mejor se adapten a él, a sus cambios y los de los que conviven en él. Si una organización te saca ventaja, va a intentar doblarla, nunca se va a relajar esperando a que te pongas a su altura. Es cuestión de supervivencia.

Que otros sean los que tomen las decisiones por nosotros puede ser lo más cómodo, ya que se está delegando en ellos la responsabilidad de que las cosas salgan bien o salgan mal.

A veces tendremos que acatar las decisiones que otros tomen, ya sea porque se realizan sobre una materia o sobre un tema del que no somos competentes o bien directamente porque es su responsabilidad tomar esa decisión.

El problema está cuando la decisión es cosa nuestra y no la queremos tomar, nos da miedo de equivocarnos, nos da miedo la responsabilidad. Y es un problema porque sin tomar decisiones no hay crecimiento posible, ya que estamos al pairo de los demás y planos en cuanto a iniciativa, y al final eso es peor que tomar una mala decisión, ya que por lo menos de estas se puede aprender. Otro problema de no tomar decisiones cuando realmente nos corresponde a nosotros es dejar que otros sean los que lleven el timón de lo que va a pasar más adelante, cuando lo mismo quien ha tomado la decisión por tí no se juega nada en el asunto y si sale mal quien va a pagar los platos rotos eres tú.

Para tomar decisiones no hace falta ser director general de tu empresa, cualquiera dentro de su ámbito de actuación puede tomarlas dentro de su parcela de actuación, ¿qué te puedes equivocar? no importa, lo que sí importa es que ese miedo te impida crecer y te convierta en un robot que sólo recibe instrucciones y las procesa.

Cuando la deuda técnica de una aplicación es lo suficientemente grande lo mejor es, si se disponen los medios adecuados, aceptar que ha habido un error importante y volver a hacer la aplicación, teniendo ahora todas las precauciones posibles para que bajo ningún concepto se vuelva a producir el mismo problema.

Seguir huyendo hacia adelante es tirar el dinero, ya que el coste de los mantenimientos se multiplica y hacer cualquier cambio se convierte en un suplicio ya que el software se seguirá deteriorando y en consecuencia la posibilidad de que surjan efectos colaterales se incrementa todavía más (si cabe) y la deuda técnica seguirá creciendo (más líneas de código = más complejidad ciclomática y además dado que probablemente existirán problemas de acoplamiento, al no atacarse directamente en lugar de disminuir, seguirán creciendo).

Habrá veces donde la imposibilidad presupuestaria impida empezar de nuevo, en este caso no queda otra que seguir remendando, con el peligro de que la bola se haga cada vez mayor y tengamos un sistema por tanto cada vez más grande y en consecuencia más caro de hacer desde el principio, lo que incrementará las posibilidades de que se siga sin disponer de dinero para afrontar el proyecto, y así sucesivamente.