{"id":1496,"date":"2014-11-17T06:19:20","date_gmt":"2014-11-17T05:19:20","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=1496"},"modified":"2014-11-18T17:01:56","modified_gmt":"2014-11-18T16:01:56","slug":"aplicacion-legacy-reingenieria-con-sonarqube","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/aplicacion-legacy-reingenieria-con-sonarqube\/","title":{"rendered":"Aplicaci\u00f3n Legacy \u2013 Reingenier\u00eda con SonarQube"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2223\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_ReengineeringWithSQ2.jpg\" alt=\"Application Legacy - R\u00e9ingenierie avec SonarQube\" width=\"239\" height=\"360\" \/><\/a>Hemos definido nuestro proyecto de reingenier\u00eda como la reescritura de nuestra aplicaci\u00f3n Legacy con un nuevo lenguaje o su migraci\u00f3n a una nueva tecnolog\u00eda, a diferencia de una refactorizaci\u00f3n que implica la reorganizaci\u00f3n del c\u00f3digo y la correcci\u00f3n de ciertos defectos con el fin de hacerlo m\u00e1s mantenible y reducir la deuda t\u00e9cnica.<\/p>\n<p>Tambi\u00e9n vimos, con <a title=\"Aplicaci\u00f3n Legacy \u2013 Refactoring con el plugin SQALE (II)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactoring-plugin-sqale-2\/\" target=\"_blank\">SonarQube y el plugin SQALE<\/a> diferentes planes de refactorizaci\u00f3n m\u00e1s o menos ambiciosos, desde la resoluci\u00f3n de los defectos m\u00e1s cr\u00edticos hasta reducir la deuda t\u00e9cnica para llevarla a\u00a0un nivel (rating SQALE) &#8216;A&#8217;.<\/p>\n<p>Sin embargo, \u00bfqu\u00e9 es lo m\u00e1s interesante y productivo entre un proyecto de reingenier\u00eda y una refactorizaci\u00f3n? <!--more--><\/p>\n<p>Normalmente, la inversi\u00f3n ser\u00e1 mayor para una reingenier\u00eda, ya que rara vez es posible modular el proyecto excepto en el caso de una reingenier\u00eda parcial, de la interfaz gr\u00e1fica por ejemplo, cuando una refactorizaci\u00f3n se puede realizar a lo largo del tiempo.<\/p>\n<p>Pero podemos suponer que los beneficios de la reingenier\u00eda ser\u00e1n mucho m\u00e1s altos que los de una refactorizaci\u00f3n puesto que la deuda t\u00e9cnica, si no desaparece por completo \u2013 siempre habr\u00e1 objetos complejos o errores por falta de atenci\u00f3n \u2013 pero al menos se reduce muy fuertemente. Esto si el proyecto de reingenier\u00eda es un \u00e9xito.<\/p>\n<p>Porque los riesgos de fracaso son importantes:<\/p>\n<ul>\n<li>No se conoce bien la nueva plataforma, la nueva tecnolog\u00eda o el nuevo lenguage, o falta experiencia en esta \u00e1rea. La nueva aplicaci\u00f3n tiene problemas de tiempo de respuesta.<\/li>\n<li>Se calcul\u00f3 mal el esfuerzo de reingenier\u00eda, se desarrolla r\u00e1pidamente y se olvida las pruebas unitarias para cumplir con los plazos del proyecto. La nueva aplicaci\u00f3n est\u00e1 repleta de bugs.<\/li>\n<li>Algunos de los procedimientos o procesos de negocio se han cambiado, con el pretexto de simplificarlos, pero de hecho, era para disminuir la carga del proyecto. La nueva aplicaci\u00f3n no cumple con los requerimientos de negocio y es m\u00e1s compleja de usar.<\/li>\n<li>No se ha identificado con precisi\u00f3n los objetivos, los usuarios no est\u00e1n incluidos en el proyecto. Se enfrentar\u00e1 a muchas peticiones de cambio y se estalla el presupuesto.<\/li>\n<\/ul>\n<p>Rendimiento desastroso, mal funcionamiento, usuarios descontentos: vamos a ver ahra unos puntos a tener en cuenta con el fin de mitigar estos riesgos y c\u00f3mo SonarQube nos puede ayudar.<\/p>\n<h2>Divide y vencer\u00e1s<\/h2>\n<p>Hemos visto que SonarQube permite <a title=\"Auditor\u00eda de una aplicaci\u00f3n Legacy en C \u2013 Microsoft Word 1.1a (I)\" href=\"http:\/\/qualilogy.com\/es\/auditoria-aplicacion-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">una visi\u00f3n general de la aplicaci\u00f3n<\/a>, sobre todo en t\u00e9rminos de indicadores cuantitativos, como el n\u00famero de l\u00edneas de c\u00f3digo (LOC), la Complejidad Ciclom\u00e1tica (CC), el nivel de los comentarios en el c\u00f3digo, etc.<\/p>\n<p>A continuaci\u00f3n, hicimos un <a title=\"Aplicaci\u00f3n Legacy \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (V)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-5\/\" target=\"_blank\">zoom sobre los componentes<\/a> para identificar las funciones y los programas m\u00e1s complejos y los defectos que se encuentran en su c\u00f3digo.<\/p>\n<p>Tambi\u00e9n hemos jugado con algunos widgets, incluyendo el <a title=\"Aplicaci\u00f3n Legacy \u2013 Refactoring con el plugin SQALE (I)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactoring-plugin-sqale-1\/\" target=\"_blank\">Bubble Chart<\/a> para cruzar algunos de estos indicadores entre s\u00ed o con la deuda t\u00e9cnica, y identificar los programas monstruosos que son el objetivo principal de nuestra reingenier\u00eda.<\/p>\n<p style=\"text-align: center\"><strong><em>Figura 1 \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 style=\"text-align: left\">En la figura anterior, podemos notar inmediatamente el archivo\u00a0 &#8216;RTFOUT.C&#8217; por el tama\u00f1o de su burbuja que representa la Ciclom\u00e1tica Complejidad (CC) promedio de las funciones de este programa. Pero el archivo &#8216;fltexp.c&#8217; en la parte superior tiene la deuda t\u00e9cnica m\u00e1s alta, con un promedio de CC por funci\u00f3n menos importante, simplemente porque tiene m\u00e1s funciones.<\/p>\n<p style=\"text-align: left\">Un tal gr\u00e1fico nos permite visualizar rapidamente los programas con un alto tama\u00f1o en l\u00edneas de c\u00f3digo, con funciones complejas y una deuda t\u00e9cnica importante. Entonces podemos examinar c\u00f3mo separarlos en varios componentes de menor granularidad para reducir la complejidad, mejorar su legibilidad y facilidar el futuro mantenimiento.<\/p>\n<p style=\"text-align: left\">Vimos, por ejemplo, <a title=\"Aplicaci\u00f3n Legacy \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (V)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-5\/\" target=\"_blank\">la funci\u00f3n monstruosa del archivo &#8216;RTFOUT.C&#8217;<\/a> que se dedica a gestionar el formato de texto Rich Text Format de Microsoft. Los diferentes bloques de c\u00f3digo se encargan de gestionar diferentes parmetros de fuentes, las propiedades del documento (autor, n\u00famero de palabras o l\u00edneas, etc.) &#8230; Es muy f\u00e1cil de especializar este c\u00f3digo en diferentes funciones o clases.<\/p>\n<p style=\"text-align: left\">Dos puntos importantes para esta redistribuci\u00f3n funcional:<\/p>\n<ul>\n<li style=\"text-align: left\">Las pruebas unitarias: si ya tenemos, es probable que se necesitar\u00e1n cambiar esos tests para adaptarlos a nuestro nuevo dise\u00f1o. Si no tenemos, o si no son compatibles con el nuevo lenguaje, deben (re-)escribirse en el nuevo idioma.<\/li>\n<li style=\"text-align: left\">No es necesario reducir por completo la Complejidad Ciclom\u00e1tica (CC): se puede permitir tener algunos componentes complejos o muy complejos, pero no demasiado. Por ejemplo, una clase \u00fanica para manejar todas las variables t\u00e9cnicas de la aplicaci\u00f3n, con todos sus m\u00e9todos (de hecho, muchos setters\/getters sencillos) tendr\u00e1 una CC proporcional a la cantidad de datos y m\u00e9todos, pero en realidad ser\u00e1 muy legible y f\u00e1cil de mantener.<\/li>\n<\/ul>\n<p>En este tema, nuestra reingenier\u00eda es en realidad un reverse-engineering que consiste en entender el dise\u00f1o actual para repensarlo de manera diferente. A menudo es \u00fatil tener la ayuda de una herramienta de an\u00e1lisis de impacto para dibujar un mapa de los distintos m\u00f3dulos o paquetes y las relaciones entre ellos, identificar los v\u00ednculos entre las diferentes capas de aplicaci\u00f3n (presentaci\u00f3n, l\u00f3gica, datos), visualizar los objetos m\u00e1s complejos, etc.<\/p>\n<p>Una herramienta de an\u00e1lisis de impacto tambi\u00e9n ser\u00e1 \u00fatil para identificar c\u00f3digo muerto, es decir, los objetos (clase, m\u00e9todo, tabla de base de datos, etc.) que no se utilizan, que no son llamados por cualquier otro componente. No hace falta volver a escribir componentes que ya no se utilizan.<br \/>\nPero ten cuidado: estas herramientas con frecuencia producen falsos positivos y requieren buenas habilidades para su uso \u00f3ptimo.<\/p>\n<h2>C\u00f3digo duplicado<\/h2>\n<p>Mientras SonarQube me ense\u00f1a el c\u00f3digo de funciones muy complejas, puedo tomar nota de los bloques de c\u00f3digo duplicado. En la siguiente figura:<\/p>\n<p style=\"text-align: center\"><em><strong>Figura 2 \u2013 Bloques de c\u00f3digo duplicado en SonarQube<\/strong><\/em><\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_DuplicatedCode.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2232\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_DuplicatedCode.jpg\" alt=\"Application Legacy - Lignes de code dupliqu\u00e9 dans SonarQube\" width=\"494\" height=\"242\" \/><\/a><\/p>\n<p>nos encontramos con dos bloques de 33 l\u00edneas copiadas\/pegadas en las\u00a0l\u00edneas 1188 y 1255 del mismo programa. En otros casos, estas duplicaciones se producir\u00e1n entre diferentes archivos.<\/p>\n<p>Es importante identificar el cod\u00edgo duplicado temprano porque:<\/p>\n<ul>\n<li>A menudo son sin\u00f3nimo de un dise\u00f1o poco optimizado.<\/li>\n<li>Puedo evitar escribir el mismo bloque de c\u00f3digo varias veces en el nuevo lenguaje.<\/li>\n<li>Reduzco el mantenimiento y los riesgos para la aplicaci\u00f3n: cualquier cambio en el c\u00f3digo duplicado se debe trasladar en cada una de las copias, lo que cuesta m\u00e1s en mantenimiento y aumenta el riesgo de defectos en caso de que se olvide una copia.<\/li>\n<\/ul>\n<h2>interfaz de usuario<\/h2>\n<p>Hemos visto que la interfaz de usuario podr\u00eda ser en s\u00ed misma un <a title=\"Aplicaci\u00f3n Legacy \u2013 Objetivos de una reingenier\u00eda\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-objetivos-reingenieria\/\" target=\"_blank\">objetivo de reingenier\u00eda<\/a>. En este caso, es importante tenerlo en cuenta tan pronto como sea posible porque el cambio de pantallas puede tener un doble impacto:<\/p>\n<ul>\n<li>Modificaci\u00f3n de los datos: en cuyo caso, tendremos que empezar con este paso y luego ver el impacto en t\u00e9rminos de clases o programas o funciones.<\/li>\n<li>Modificaci\u00f3n de los procesos de negocio: en este caso, trabajemos tan pronto como sea posible con los usuarios para validar estos cambios. Ni siquiera intentas comenzar la reingenier\u00eda antes de esta validaci\u00f3n. Y sobre todo, no programar las pantallas de forma id\u00e9ntica.<\/li>\n<\/ul>\n<p>Cuidado de comprobar las operaciones que no son necesariamente programadas en la interfaz gr\u00e1fica. Por ejemplo, todos los usuarios hacen Copiar\/Pegar, y por lo general sin que se haya programado un bot\u00f3n o un men\u00fa para esto. Y el usuario rara vez evocar\u00e1 esto porque para \u00e9l, es natural y obvio. Aseg\u00farate de identificar estos procesos impl\u00edcitos y hacer pruebas de que son reproducibles en la nueva versi\u00f3n de la aplicaci\u00f3n, despu\u00e9s de la reingenier\u00eda.<\/p>\n<p>Compruebes la coherencia de los mensajes de usuarios: normalizaci\u00f3n o en torno a una frase con un verbo como \u00abLa cantidad no es correcta\u00bb o en torno a una expresi\u00f3n sin verbo: \u00aberror de entrada de la cantidad\u00bb.<\/p>\n<p>Echas un vistazo a las inconsistencias en las representaciones de datos, a veces con decimales, a veces sin, por ejemplo.<\/p>\n<p>Seguiremos en el pr\u00f3ximo post: veremos c\u00f3mo estudiar la reestructuraci\u00f3n de los tratamientos con SonarQube.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hemos definido nuestro proyecto de reingenier\u00eda como la reescritura de nuestra aplicaci\u00f3n Legacy con un nuevo lenguaje o su migraci\u00f3n a una nueva tecnolog\u00eda, a diferencia de una refactorizaci\u00f3n que implica la reorganizaci\u00f3n del c\u00f3digo y la correcci\u00f3n de ciertos defectos con el fin de hacerlo m\u00e1s mantenible y reducir la deuda t\u00e9cnica. Tambi\u00e9n vimos, [&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-1496","post","type-post","status-publish","format-standard","hentry","category-calidad-de-aplicaciones"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1496"}],"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=1496"}],"version-history":[{"count":14,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1496\/revisions"}],"predecessor-version":[{"id":1511,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1496\/revisions\/1511"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=1496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=1496"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=1496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}