{"id":1093,"date":"2014-04-09T09:47:41","date_gmt":"2014-04-09T08:47:41","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=1093"},"modified":"2014-04-09T16:24:58","modified_gmt":"2014-04-09T15:24:58","slug":"auditoria-aplicacion-legacy-c-microsoft-word-1-1a-1","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/auditoria-aplicacion-legacy-c-microsoft-word-1-1a-1\/","title":{"rendered":"Auditor\u00eda de una aplicaci\u00f3n Legacy en C &#8211; Microsoft Word 1.1a (I)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1738\" alt=\"C_Analysis_Word0\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_Analysis_Word0.jpg\" width=\"239\" height=\"360\" \/><\/a>Microsoft ha publicado esta semana lel c\u00f3digo fuente de Word 1.1a (1990) mediante el Computer History Museum: <a href=\"http:\/\/www.computerhistory.org\/atchm\/microsoft-word-for-windows-1-1a-source-code\/\" target=\"_blank\">http:\/\/www.computerhistory.org\/atchm\/microsoft-word-for-windows-1-1a-source-code\/.<\/a><\/p>\n<p>Es una de las primeras versiones de Word para Windows, de enero 1991:<br \/>\n<a href=\"http:\/\/blogs.technet.com\/b\/microsoft_blog\/archive\/2014\/03\/25\/microsoft-makes-source-code-for-ms-dos-and-word-for-windows-available-to-public.aspx\" target=\"_blank\">http:\/\/blogs.technet.com\/b\/microsoft_blog\/archive\/2014\/03\/25\/microsoft-makes-source-code-for-ms-dos-and-word-for-windows-available-to-public.aspx<\/a>.<\/p>\n<p>Tuve la idea de analizar este c\u00f3digo fuente. Ten\u00eda curiosidad por ver los resultados, tanto desde el punto de vista cuantitativo &#8211; n\u00famero de l\u00edneas de c\u00f3digo, la complejidad, etc &#8211; como cualitativo: violaciones de buenas pr\u00e1cticas de programaci\u00f3n, defectos tipo Blockers, Criticals, etc. <!--more--><\/p>\n<p>Adem\u00e1s, \u00bfcual ser\u00eda la deuda t\u00e9cnica para este software y c\u00f3mo usarla en tal contexto? No es todos los d\u00edas que se encuentra una aplicaci\u00f3n C Legacy como esta. \u00bfCu\u00e1les son los casos de uso interesantes en este contexto y la forma en que el an\u00e1lisis de la deuda t\u00e9cnica nos puede ayudar?<\/p>\n<p>Veremos este \u00faltimo punto al final. Todav\u00eda no s\u00e9 cu\u00e1ntos posts voy a dedicar a estos temas. En este primer art\u00edculo, voy a presentar brevemente la configuraci\u00f3n de an\u00e1lisis y los primeros resultados.<\/p>\n<h2>An\u00e1lisis<\/h2>\n<p>No voy a dar demasiados detalles, ya que el c\u00f3digo fuente no est\u00e1 publicado bajo una licencia libre y est\u00e1 prohibido su uso con fines comerciales. Entiendes que no tengo ning\u00fan deseo de meterme en problemas con Microsoft por exponer en este post una empresa o sus productos. As\u00ed que me limitar\u00e9 simplemente a decir que hice mi an\u00e1lisis con SonarQube versi\u00f3n 4.2 y su Plugin C\/C++ versi\u00f3n 2.1.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CodeStructure.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1744\" alt=\"Word_CodeStructure\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CodeStructure.jpg\" width=\"167\" height=\"210\" \/><\/a>Si descargas el .zip correspondiente del c\u00f3digo Word 1.1a, encontrar\u00e1s 3 carpetas con diferentes versiones, con m\u00e1s o menos documentaci\u00f3n e utilitarios. He utilizado la versi\u00f3n m\u00e1s simple, &#8216;Opus&#8217;, que se centra en el c\u00f3digo fuente.<\/p>\n<p>Hay varios tipos de archivos que no pueden ser analizados: ejecutables .exe por ejemplo o c\u00f3digo Assembler. He trabajado con los ficheros .c y .h. Los directorios &#8216;lib&#8217; y &#8216;resource&#8217; s\u00f3lo contienen .h. Otras carpetas, como la principal &#8216;Opus&#8217; contienen ficheros .c y h.<\/p>\n<p>No he probado a declarar macros. Esto requiere un conocimiento preciso de la aplicaci\u00f3n, y sin un arquitecto o un miembro del equipo del proyecto, puede tomar un largo tiempo para entender c\u00f3mo se estructura todo el c\u00f3digo. Ser\u00eda esencial para identificar potenciales bugs, pero no estoy buscando tal precisi\u00f3n en los resultados sino una evaluaci\u00f3n global de la calidad.<\/p>\n<p>Encontr\u00e9 algunos errores de an\u00e1lisis (parsing), principalmente por las declaraciones de un tipo de datos, creo para una compilaci\u00f3n para un OS Apple (Mac). He intentado varios tipos de sintaxis de C (C89, C99 o C11), sin resultado a este nivel. Se trata esencialmente de estructuras de datos que pus\u00e9 luego en comentarios, sin ning\u00fan impacto en los resultados de an\u00e1lisis, a excepci\u00f3n de que voy a perder unas pocas l\u00edneas de c\u00f3digo en el c\u00e1lculo final .<\/p>\n<p>Tambi\u00e9n hay archivos que no analizar, como un archivo que comienza con &#8216;THIS FILE IS OBSOLETE\u2019 incluso sin que esta l\u00ednea sea en comentarios, por lo que es normal que se genera un error en el analizador.<\/p>\n<p>Por \u00faltimo, he utilizado el perfil de calidad por defecto de SonarQube, sin normas adicionales, tales como las de Cppcheck. Una vez m\u00e1s, nuestro objetivo no es depurar Word, pero realizar un an\u00e1lisis global de la calidad del c\u00f3digo, evaluar la deuda t\u00e9cnica para este software y tratar de extraer algunas lecciones. Todo en el contexto de la \u00e9poca.<\/p>\n<h2>M\u00e9tricas cuantitativas<\/h2>\n<p>Llamo m\u00e9tricas cuantitativas todos los datos que nos dan una idea del tama\u00f1o y la complejidad del c\u00f3digo, el nivel de comentarios, etc. En resumen, todo lo que no se refiere a las buenas pr\u00e1cticas de programaci\u00f3n.<\/p>\n<h3>Tama\u00f1o<\/h3>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_SizeMetrics.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1745\" alt=\"Word_SizeMetrics\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_SizeMetrics.jpg\" width=\"313\" height=\"126\" \/><\/a>Encontramos 326.500 l\u00edneas en 349 ficheros, de los cuales 165 mil son l\u00edneas de c\u00f3digo (KLocs ). Yo esperaba encontrar muchas m\u00e1s l\u00edneas de c\u00f3digo, pero lo que es sorprendente para m\u00ed es el peque\u00f1o n\u00famero de archivos. En promedio , cada archivo tiene cerca de 1 000 l\u00edneas, la mitad de c\u00f3digo. Esto no favorece la lectura y la comprensi\u00f3n, sobre todo cuando se trata de un lenguaje tan complejo que el lenguaje C.<\/p>\n<p>Por otra parte, si nos fijamos en la distribuci\u00f3n de los archivos de c\u00f3digo utilizando el gr\u00e1fico Project File Bubble Chart, se puede ver a algunos bonitos monstruos, como este archivo &#8216;fltexp.c&#8217;, con 2 600 l\u00edneas de c\u00f3digo y 506 &#8216;Issues&#8217;. Sin embargo, su deuda t\u00e9cnica queda limitada con s\u00f3lo 23 d\u00edas de refactorizaci\u00f3n estimados para corregir los defectos detectados.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1746\" alt=\"C_WordBubbleChart\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart.jpg\" width=\"802\" height=\"308\" \/><\/a><\/p>\n<h3>Documentaci\u00f3n<\/h3>\n<p>El nivel de comentarios es correcto sin ser excepcional, yo dir\u00eda que en el rango inferior de lo que generalmente se puede esperar de una aplicaci\u00f3n hoy en d\u00eda, aunque de nuevo, no estamos en presencia de una aplicaci\u00f3n de gesti\u00f3n, pero de un software. <a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CustomMetrics.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1750\" alt=\"Word_CustomMetrics\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_CustomMetrics.jpg\" width=\"582\" height=\"121\" \/><\/a><\/p>\n<p>Adem\u00e1s, el nivel de documentaci\u00f3n es importante cuando se sabe que una aplicaci\u00f3n puede ser subcontratada a un outsourcer, y que otros que sus autores tendr\u00e1n que entender lo que hace el c\u00f3digo, Pero no es el caso para un c\u00f3digo mantenido por un equipo de I+D. Por \u00faltimo, 20% de comentarios era probablemente correcto 30 a\u00f1os antes, aunque parece m\u00e1s bien bajo en la actualidad.<\/p>\n<h3>Duplicaciones<\/h3>\n<p>Me llam\u00f3 la atenci\u00f3n el nivel m\u00ednimo de duplicaci\u00f3n. Y a comprobar en el c\u00f3digo, se trata esencialmente de estructuras de datos.<\/p>\n<p>Recordemos que no estamos tratando aqu\u00ed con un lenguaje orientado a objetos, por lo que no es posible crear clases espec\u00edficas a un componente funcional. A\u00fan as\u00ed, el nivel extremadamente bajo de duplicaci\u00f3n muestra una reutilizaci\u00f3n \u00f3ptima del c\u00f3digo existente. Probablemente esencial para una I+D que debe desarrollar y mantener softwares, pero ciertamente no es tan com\u00fan en nuestros d\u00edas.<\/p>\n<h3>Complejidad<\/h3>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1751\" alt=\"Word_Complexity\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg\" width=\"348\" height=\"160\" \/><\/a>El nivel global de Complejidad Ciclom\u00e1tica (CC) es bastante alto, con 43.846 puntos de complejidad. Recordemos que por encima de 20.000 puntos, una aplicaci\u00f3n requiere una fase espec\u00edfica de QA , con cuadernos de pruebas formalizadas. Con 60.000 puntos, es muy recomendable una herramienta de automatizaci\u00f3n de pruebas. No exist\u00edan tales herramientas a principios de 1990, as\u00ed que estoy curioso por saber m\u00e1s acerca de las pr\u00e1cticas de Microsoft en acuel momento.<\/p>\n<p>La gran mayor\u00eda de las funciones no son muy complejas, pero sin embargo varios cientos de ellas superan los 12 puntos de CC, y un gran n\u00famero son por encima de 30 puntos de CC, lo que significa que son objetos complejos o muy complejos, con un alto coste de mantenimiento y un alto riesgo de introducir un defecto en caso de modificaci\u00f3n. Por lo tanto, la fase de control de calidad debe ser a\u00fan m\u00e1s exigente.<\/p>\n<p>Afortunadamente , hemos visto que el nivel de reutilizaci\u00f3n era muy bueno. Entonces, se pueden centrar las pruebas de regresi\u00f3n en los objetos m\u00e1s complejos que han sido modificado.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_ComplexityFiles.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1752\" alt=\"Word_ComplexityFiles\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_ComplexityFiles.jpg\" width=\"349\" height=\"161\" \/><\/a>Este alto nivel de complejidad en las funciones se confirma en los archivos, con cerca de la mitad de ellos por encima de 90 puntos de CC.<\/p>\n<p>He configurado el gr\u00e1fico Bubble Chart para cruzar el n\u00famero de l\u00edneas de c\u00f3digo con la complejidad:<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1754\" alt=\"C_WordBubbleChart2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/C_WordBubbleChart2.jpg\" width=\"810\" height=\"322\" \/><\/a><\/p>\n<p>Una vez m\u00e1s, nos encontramos con el archivo &#8216;fltexp.c&#8217; con 2 600 l\u00edneas de c\u00f3digo y un nivel de CC de 740. Cuando yo digo que \u00a1este es un monstruo!<\/p>\n<h3>Evaluaci\u00f3n<\/h3>\n<p>\u00bfQu\u00e9 podemos decir por ahora, en este momento de nuestra evaluaci\u00f3n?<\/p>\n<p>El muy bajo nivel de c\u00f3digo duplicado me hace pensar que la elecci\u00f3n del equipo de proyecto ha sido centrar la arquitectura de desarrollo en la m\u00e1xima reutilizaci\u00f3n de funciones, y por lo tanto ser capaz de dedicar cada archivo para una funci\u00f3n espec\u00edfica, con todos los objetos necesarios para la gesti\u00f3n de ella. Esto explica por qu\u00e9 algunos archivos son muy largos y gordos, tanto en tama\u00f1o como en complejidad.<\/p>\n<p>Debemos recordar que la memoria era limitada en esta epoca, y el tama\u00f1o de memoria necesitado por un software era un criterio importante del rendimiento y por lo tanto de su \u00e9xito o su fracaso. Pues, prioridad en la eficiencia en este dominio, lo que significa evitar la duplicaci\u00f3n de estructuras de datos en diferentes archivos, incluso si esto significa m\u00e1s archivos m\u00e1s pesados y m\u00e1s complejos.<\/p>\n<p>Esto probablemente afectar\u00e1 la legibilidad, la comprensi\u00f3n y la capacidad de mantenimiento del c\u00f3digo.<br \/>\nVamos a prestar atenci\u00f3n a estos factores en nuestro pr\u00f3ximo post sobre los resultados cualitativos y el cumplimiento de las buenas pr\u00e1cticas de programaci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Microsoft ha publicado esta semana lel c\u00f3digo fuente de Word 1.1a (1990) mediante el Computer History Museum: http:\/\/www.computerhistory.org\/atchm\/microsoft-word-for-windows-1-1a-source-code\/. Es una de las primeras versiones de Word para Windows, de enero 1991: http:\/\/blogs.technet.com\/b\/microsoft_blog\/archive\/2014\/03\/25\/microsoft-makes-source-code-for-ms-dos-and-word-for-windows-available-to-public.aspx. Tuve la idea de analizar este c\u00f3digo fuente. Ten\u00eda curiosidad por ver los resultados, tanto desde el punto de vista cuantitativo &#8211; n\u00famero [&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-1093","post","type-post","status-publish","format-standard","hentry","category-calidad-de-aplicaciones"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1093"}],"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=1093"}],"version-history":[{"count":25,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1093\/revisions"}],"predecessor-version":[{"id":1095,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1093\/revisions\/1095"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=1093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=1093"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=1093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}