{"id":1379,"date":"2014-10-07T10:54:01","date_gmt":"2014-10-07T09:54:01","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=1379"},"modified":"2014-10-17T11:58:03","modified_gmt":"2014-10-17T10:58:03","slug":"aplicacion-legacy-refactoring-plugin-sqale-1","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactoring-plugin-sqale-1\/","title":{"rendered":"Aplicaci\u00f3n Legacy &#8211; Refactoring con el plugin SQALE (I)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-2095\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRefactoring.jpg\" alt=\"Application Legacy - Refactoring Technical Debt with the plugin SQALE SonarQube\" width=\"288\" height=\"360\" \/><\/a>Para hacer una estimaci\u00f3n del coste de refactorizaci\u00f3n de nuestra aplicaci\u00f3n Legacy, voy a utilizar el plugin SQALE de SonarQube, utilizado m\u00e1s a menudo con el fin de medir la deuda t\u00e9cnica.<\/p>\n<p>Ya <a title=\"An\u00e1lisis PL\/SQL con SonarQube \u2013 Evaluar la calidad (3\/3)\" href=\"http:\/\/qualilogy.com\/es\/analisis-plsql-con-sonarqube-evaluar-la-calidad-3\/\" target=\"_blank\">hemos presentado este plugin<\/a> con una aplicaci\u00f3n Legacy PL\/SQL. As\u00ed que recordaremos solamente que el plugin SQALE se basa en <a href=\"http:\/\/www.sqale.org\/details\" target=\"_blank\">el modelo de calidad SQALE<\/a>, y tambi\u00e9n en un m\u00e9todo para adaptar este modelo seg\u00fan diversos objetivos de negocio, la tecnolog\u00eda utilizada o el contexto de la aplicaci\u00f3n. <!--more--><\/p>\n<h2>Aplicaciones SQALE y Legacy<\/h2>\n<p>Hoy en d\u00eda, cualquier aplicaci\u00f3n de m\u00e1s de 3 a\u00f1os se considera &#8216;Legacy&#8217;, sobre todo si no tiene una cobertura de pruebas unitarias. En este caso, <a title=\"Aplicaci\u00f3n Legacy \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (IV)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-4\/\" target=\"_blank\">&#8216;Edit and Pray&#8217;<\/a> o &#8216;Modificar y Rezar&#8217; (para que sigue funcionando), explica Michael Feathers en su libro \u00ab Working Effectively with Legacy Code \u00bb.<\/p>\n<p>Ahora, no vamos a utilizar el modelo SQALE de la misma forma para una aplicaci\u00f3n J2EE con tres a\u00f1os de vida, para nuestra aplicaci\u00f3n en C Word 1.1a de\u00a0 20 a\u00f1os, o para una aplicaci\u00f3n Cobol a\u00fan m\u00e1s antigua que ha pasado por las manos de varios equipos diferentes, posiblemente en offshore.<\/p>\n<p>Tambi\u00e9n hay que considerar el tipo de aplicaci\u00f3n: aqu\u00ed tenemos un software de una suite de oficina vendido por un editor de software, no es en absoluto lo mismo que una aplicaci\u00f3n J2EE desarrollada internamente para satisfacer necesidades empresariales o con un paquete de software como SAP. Por ejemplo, nuestra aplicaci\u00f3n est\u00e1 escrita en C y no utiliza base de datos: pues los factores de &#8216;rendimiento&#8217; y de &#8216;seguridad&#8217; no tendr\u00e1n el mismo peso que para una tradicional aplicaci\u00f3n de gesti\u00f3n.<\/p>\n<h2>SQALE y el seguimiento de la deuda t\u00e9cnica<\/h2>\n<p>Otro factor a tener en cuenta: como explica Freddy Mallet de SonarQube en <a href=\"https:\/\/www.youtube.com\/watch?v=d3XYhUikeIA\" target=\"_blank\">este vid\u00e9o<\/a> (en franc\u00e9s): \u00ab\u00a0La deuda t\u00e9cnica, es evitar despertarse despu\u00e9s de 5 a\u00f1os con un c\u00f3digo con el que ya no puedes hacer nada sin que te cuesta un brazo y un ojo de la cara \u00bb.<\/p>\n<p>Un uso com\u00fan del plugin SQALE es para monitorear y controlar la deuda t\u00e9cnica en las diferentes versiones, a lo largo del tiempo, con el fin de evitar que llega a un umbral m\u00e1s all\u00e1 del cual empieza a ser un peso insoportable y demasiado caro. O, como se explica en <a href=\"http:\/\/www.sonarqube.org\/using-differentials-to-move-the-team-in-the-right-direction\/\" target=\"_blank\">este articulo<\/a> : \u00ab\u00a0No sirve empezar a limpiar el suelo si no has reparado primero la fuga de agua \u00bb.<\/p>\n<p>En nuestro caso, s\u00f3lo tenemos una \u00fanica versi\u00f3n, as\u00ed que de nuevo voy a indicar que nuestro uso del plugin SQALE es \u00fanicamente para evaluar un esfuerzo de refactorizaci\u00f3n, y sin modelo personalizado pero procediendo directamente los resultados &#8216;out of the box&#8217;.<\/p>\n<p>En el contexto de este art\u00edculo, presento estos resultados simplemente para ilustrar el enfoque de evaluaci\u00f3n del coste de la refactorizaci\u00f3n de una aplicaci\u00f3n Legacy. Estimaci\u00f3n &#8216;a priori&#8217;, incluso antes de consultar al equipo de proyecto o el management.<\/p>\n<h2>SQALE en el dashboard SonarQube<\/h2>\n<p>Tengo mi propio dashboard en SonarQube, customizado con un widget para mostrar los siguientes datos del plugin SQALE:<\/p>\n<p style=\"text-align: center\"><strong><em>Figura 1 \u2013 Datos SQALE de la Deuda T\u00e9cnica en nuestra aplicaci\u00f3n Legacy<\/em><\/strong><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSyntesis.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2105\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtSyntesis.jpg\" alt=\"Donn\u00e9es SQALE sur la Dette Technique de notre application Legacy\" width=\"349\" height=\"168\" \/><\/a><\/p>\n<p>1 238.7 d\u00edas para absorber la deuda t\u00e9cnica. Con una tasa <a title=\"Aplicaci\u00f3n Legacy \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (VII)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-7\/\" target=\"_blank\">18.5 d\u00edas de trabajo al mes<\/a>, esto representa 69.4 meses o, para un equipo de 5 personas, 13.9 meses\/hombre.<\/p>\n<p>As\u00ed que se necesita casi 14 meses para superar esta deuda t\u00e9cnica. No hace falta imaginar que esto no es aceptable para los managers: significa detener cualquier desarrollo, cualquier nueva versi\u00f3n durante m\u00e1s de un a\u00f1o. Ning\u00fan cliente, ning\u00fan usuario estar\u00eda de acuerdo con tal decisi\u00f3n.<\/p>\n<p>Ahora, nuestro objetivo no es eliminar el 100% de esa deuda, pero hacer un esfuerzo para reducirla de manera que la carga de la deuda sea aceptable, y que la correspondiente reducci\u00f3n en los costes de mantenimiento sea mayor que el coste de refactorizaci\u00f3n. De hecho, la decisi\u00f3n de hacer una refactorizaci\u00f3n se basa por lo general en el ROI (retorno de inversi\u00f3n), o la esperanza de ahorrar costes de mantenimiento.<\/p>\n<p>\u00bfSe puede considerar un esfuerzo razonable, con acciones limitadas pero concretas de refactorizaci\u00f3n, con un retorno de inversi\u00f3n? Esto es lo que voy a mirar con otros datos configurados en mi dashboard.<\/p>\n<p>En primer lugar, veo que el &#8216;SQALE Rating&#8217; es igual a &#8216;B&#8217;. Esto demuestra el peso de la deuda t\u00e9cnica en relaci\u00f3n con toda la aplicaci\u00f3n. Otro widget del portal SQALE de SonarQube me da la distribuci\u00f3n de la deuda t\u00e9cnica en diferentes archivos.<\/p>\n<p style=\"text-align: center\"><strong><em>Figura 2 &#8211; Distribuci\u00f3n del SQALE Rating por archivo<\/em><\/strong><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRating.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2106\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtRating.jpg\" alt=\"Distribution du SQALE Rating par fichier\" width=\"458\" height=\"112\" \/><\/a><\/p>\n<p>Tenemos 12 archivos con una deuda t\u00e9cnica muy alta, y si enumero estos archivos, voy a encontrar algunos programas <a title=\"Aplicaci\u00f3n Legacy C \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (II)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-2\/\" target=\"_blank\">ya identificados previamente<\/a> como los m\u00e1s complejos, con el mayor n\u00famero de l\u00edneas de c\u00f3digo (LOC) y\/o con funciones complejas y de gran tama\u00f1o.<\/p>\n<p style=\"text-align: center\"><strong><em>Figura 3 &#8211; Programas con mayor coste de remediaci\u00f3n SQALE<\/em><\/strong><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFiles.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2107\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtFiles.jpg\" alt=\"Highest SQALE remediation costs\" width=\"350\" height=\"323\" \/><\/a><\/p>\n<p>Otra forma de comprobar la distribuci\u00f3n de la deuda t\u00e9cnica en todos los archivos de la aplicaci\u00f3n: el Bubble Chart (me encanta este gr\u00e1fico). Puedo elegir las m\u00e9tricas que quiero cruzar:<\/p>\n<ul>\n<li>los d\u00edas de deuda t\u00e9cnica en el eje Y;<\/li>\n<li>el n\u00famero de l\u00edneas de c\u00f3digo en el eje X;<\/li>\n<li>la Complejidad Ciclom\u00e1tica como tama\u00f1o de la burbuja.<\/li>\n<\/ul>\n<p style=\"text-align: center\"><strong><em>Figura 4 \u2013 Technical Debt x Cyclomatic Complexity x Lines of Code<\/em><\/strong><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2109\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles.jpg\" alt=\"Technical Debt x Cyclomatic Complexity x Lines of Code\" width=\"815\" height=\"517\" \/><\/a><\/p>\n<p>Se puede observar en esta figura, el archivo &#8216;fltexp.c&#8217; con la deuda t\u00e9cnica m\u00e1xima para un programa \u2013 23 d\u00edas de refactorizaci\u00f3n \u2013 dentro de las 2 600 l\u00edneas de c\u00f3digo y los 740 puntos de Complejidad Ciclom\u00e1tica.<\/p>\n<p>Claro que algunos van a decirme de nuevo que el n\u00famero de l\u00edneas de c\u00f3digo (LOC) no es una medida fiable del tama\u00f1o de una aplicaci\u00f3n, pero despu\u00e9s de jugar con diferentes combinaciones de m\u00e9tricas, el n\u00famero sigue siendo la m\u00e9trica con m\u00e1s correlacion con la deuda t\u00e9cnica, y por lo tanto, un factor a tener en cuenta.<\/p>\n<p>Por ejemplo, en el\u00a0Bubble Chart a continuaci\u00f3n, eleg\u00ed la complejidad ciclom\u00e1tica (CC) por funci\u00f3n como medida del tama\u00f1o de la burbuja.<\/p>\n<p style=\"text-align: center\"><strong><em>Figura 5 \u2013 Technical Debt x Cyclomatic Complexity\/Function x Lines of Code<\/em><\/strong> <a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles3.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2111\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/10\/LegacyTechDebtBubbles3.jpg\" alt=\"Technical Debt x Cyclomatic Complexity\/Function x Lines of Code\" width=\"833\" height=\"518\" \/><\/a><\/p>\n<p>El <a title=\"Aplicaci\u00f3n Legacy \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (V)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-5\/\" target=\"_blank\">archivo &#8216;RTFOUT.C&#8217;<\/a> tiene la funci\u00f3n m\u00e1s compleja con 355 puntos de CC, pero tambi\u00e9n tiene otra funci\u00f3n con s\u00f3lo 2 puntos de CC. La complejidad media de este archivo ser\u00e1 de (355 + 2) \/ 2 = 178.5 puntos CC, como se muestra en el gr\u00e1fico.<\/p>\n<p>Tambi\u00e9n he puesto en esta figura las medidas para el archivo &#8216;fltexp.c&#8217; que hemos visto anteriormente (Figura 3 anterior) que tiene la deuda t\u00e9cnica m\u00e1s alta y 740 puntos de CC, pero con un mayor n\u00famero de funciones, ya que el promedio de CC por funci\u00f3n es por cerca de 16 puntos.<\/p>\n<p>Si bien es interesante este gr\u00e1fico, creo que todavia es menos \u00fatil que el anterior, m\u00e1s significativo y relevante para visualizar el esfuerzo de refactorizaci\u00f3n para cada programa y toda la aplicaci\u00f3n. Pero podemos ver que tenemos en SonarQube diferentes herramientas y widgets para imaginar e investigar diferentes cursos de acci\u00f3n.<\/p>\n<p>Con estos widgets del portal SonarQube, ahora conozco:<\/p>\n<ul>\n<li>Los archivos que tienen la deuda t\u00e9cnica m\u00e1s alta: sin ninguna sorpresa, los archivos m\u00e1s gordos y m\u00e1s complejos de nuestra aplicaci\u00f3n, que ya hab\u00edamos identificado en los posts anteriores.<\/li>\n<li>El esfuerzo de refactorizaci\u00f3n para eliminar la deuda t\u00e9cnica para cada uno de estos archivos.<\/li>\n<\/ul>\n<p>Pero de nuevo, este esfuerzo es demasiado importante para ser considerado como tal, y no se necesita porque no buscamos la eliminaci\u00f3n total de la deuda t\u00e9cnica, si no unas acciones de refactorizaci\u00f3n con un coste de reducci\u00f3n de la deuda lo m\u00e1s bajo posible con los m\u00e1ximos beneficios.<\/p>\n<ul>\n<ul>Nuestro pr\u00f3ximo post ser\u00e1 dedicado a la presentaci\u00f3n de estas acciones. Hasta pronto.<\/ul>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Para hacer una estimaci\u00f3n del coste de refactorizaci\u00f3n de nuestra aplicaci\u00f3n Legacy, voy a utilizar el plugin SQALE de SonarQube, utilizado m\u00e1s a menudo con el fin de medir la deuda t\u00e9cnica. Ya hemos presentado este plugin con una aplicaci\u00f3n Legacy PL\/SQL. As\u00ed que recordaremos solamente que el plugin SQALE se basa en el modelo [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1379","post","type-post","status-publish","format-standard","hentry","category-calidad-de-aplicaciones"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1379"}],"collection":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/comments?post=1379"}],"version-history":[{"count":18,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1379\/revisions"}],"predecessor-version":[{"id":1399,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1379\/revisions\/1399"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=1379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=1379"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=1379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}