{"id":32848,"date":"2019-10-31T21:49:16","date_gmt":"2019-10-31T18:49:16","guid":{"rendered":"https:\/\/prohoster.info\/blog\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\/"},"modified":"2019-10-31T21:49:16","modified_gmt":"2019-10-31T18:49:16","slug":"vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","title":{"rendered":"Incorpora el an\u00e1lisis est\u00e1tico en el proceso, en lugar de buscar errores con \u00e9l.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Lo que me inspir\u00f3 a escribir este art\u00edculo fue la gran cantidad de materiales sobre an\u00e1lisis est\u00e1tico que cada vez m\u00e1s a menudo caen en mis manos. En primer lugar, esta es <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/\">el blog de PVS-studio<\/a><\/noindex>, que se promociona activamente en Habr mediante rese\u00f1as de errores que su herramienta ha encontrado en proyectos de c\u00f3digo abierto. Recientemente, PVS-studio implement\u00f3 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/436496\/\">soporte para Java<\/a><\/noindex>, y, por supuesto, los desarrolladores de IntelliJ IDEA, cuyo analizador integrado es, hoy en d\u00eda, probablemente el m\u00e1s avanzado para Java, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/JetBrains\/blog\/436278\/\">no podr\u00edan quedarse al margen.<\/a><\/noindex>. <\/p>\n<p>Al leer tales rese\u00f1as, se tiene la sensaci\u00f3n de que se habla de un elixir m\u00e1gico: presiona un bot\u00f3n y ah\u00ed est\u00e1, una lista de defectos ante tus ojos. Parece que a medida que los analizadores mejoran, se encontrar\u00e1n cada vez m\u00e1s errores autom\u00e1ticamente, y los productos escaneados por estos robots se volver\u00e1n cada vez mejores, sin ning\u00fan esfuerzo de nuestra parte.<\/p>\n<p>Pero no existen elixires m\u00e1gicos. Me gustar\u00eda hablar sobre lo que normalmente no se menciona en publicaciones como \"esto es lo que puede encontrar nuestro robot\": lo que los analizadores nunca podr\u00e1n hacer, cu\u00e1l es su verdadero papel y lugar en el proceso de entrega de software, y c\u00f3mo implementarlos correctamente.<\/p>\n<p><img decoding=\"async\" alt=\"Incorpora el an\u00e1lisis est\u00e1tico en el proceso, en lugar de buscar errores con \u00e9l.\" src=\"\/wp-content\/uploads\/2019\/05\/2a0339f10edcaed3310676ab6e2f975a.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Rattrapante (fuente: <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A5%D1%80%D0%B0%D0%BF%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC#\/media\/File:Sperrklinke_Schema.svg\">wikipedia<\/a><\/noindex>).<\/i><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>)<\/h2>\n<p>\nLo que los analizadores est\u00e1ticos nunca podr\u00e1n hacer<\/p>\n<p>\u00bfQu\u00e9 es, desde un punto de vista pr\u00e1ctico, el an\u00e1lisis de c\u00f3digo fuente? Proporcionamos ciertos fuentes como entrada, y en poco tiempo (mucho m\u00e1s corto que ejecutar pruebas) obtenemos cierta informaci\u00f3n sobre nuestro sistema. La limitaci\u00f3n fundamental y matem\u00e1ticamente insuperable es que solo podemos obtener, de esta manera, una clase bastante restringida de informaci\u00f3n. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Halting_problem\">El ejemplo m\u00e1s famoso de un problema que no puede resolverse mediante an\u00e1lisis est\u00e1tico es<\/a><\/noindex>el problema de la parada <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rice%27s_theorem\">: esta es una teorema que demuestra que es imposible desarrollar un algoritmo general que, dada el c\u00f3digo fuente de un programa, determine si se quedar\u00e1 en un bucle o terminar\u00e1 en un tiempo finito. Una extensi\u00f3n de este teorema es la del teorema de Rice.<\/a><\/noindex>, que establece que para cualquier propiedad no trivial de funciones computables, la determinaci\u00f3n de si un programa arbitrario calcula una funci\u00f3n con dicha propiedad es una tarea algor\u00edtmicamente irreducible. Por ejemplo, es imposible escribir un analizador que, dado cualquier c\u00f3digo fuente, determine si el programa analizado es una implementaci\u00f3n de un algoritmo que, digamos, calcula el cuadrado de un n\u00famero entero.<\/p>\n<p>Por lo tanto, la funcionalidad de los analizadores est\u00e1ticos tiene limitaciones insuperables. Un analizador est\u00e1tico nunca podr\u00e1 en todos los casos determinar cosas como, por ejemplo, la aparici\u00f3n de un \"null pointer exception\" en lenguajes que permiten el valor null, o en todos los casos determinar la aparici\u00f3n de \"attribute not found\" en lenguajes con tipado din\u00e1mico. Todo lo que puede hacer el analizador est\u00e1tico m\u00e1s avanzado es se\u00f1alar casos particulares, cuyo n\u00famero entre todos los posibles problemas con su c\u00f3digo fuente es, sin exagerar, una gota en el oc\u00e9ano.<\/p>\n<h2>El an\u00e1lisis est\u00e1tico no es la b\u00fasqueda de errores.<\/h2>\n<p>\nDe lo anterior se deduce la conclusi\u00f3n: el an\u00e1lisis est\u00e1tico no es un medio para reducir la cantidad de defectos en el programa. Me atrever\u00eda a afirmar que, al aplicarlo por primera vez a su proyecto, encontrar\u00e1 en el c\u00f3digo lugares 'interesantes', pero, lo m\u00e1s probable, no encontrar\u00e1 defectos que afecten la calidad de funcionamiento de su programa.<\/p>\n<p>Los ejemplos de defectos encontrados autom\u00e1ticamente por analistas son impresionantes, pero no hay que olvidar que estos ejemplos se encuentran mediante el escaneo de un gran conjunto de bases de c\u00f3digo grandes. De la misma manera, los hackers que tienen la capacidad de probar varias contrase\u00f1as sencillas en numerosas cuentas, eventualmente encontrar\u00e1n las cuentas que tienen una contrase\u00f1a sencilla.<\/p>\n<p>\u00bfSignifica esto que el an\u00e1lisis est\u00e1tico no debe aplicarse? \u00a1Por supuesto que no! Y exactamente por la misma raz\u00f3n por la cual se debe verificar cada nueva contrase\u00f1a para ver si se encuentra en la lista de 'contrase\u00f1as sencillas'.<\/p>\n<h2>El an\u00e1lisis est\u00e1tico es m\u00e1s que la b\u00fasqueda de errores.<\/h2>\n<p>\nDe hecho, las tareas que se pueden resolver pr\u00e1cticamente mediante el an\u00e1lisis son mucho m\u00e1s amplias. En general, el an\u00e1lisis est\u00e1tico consiste en cualquier verificaci\u00f3n del c\u00f3digo fuente que se realice antes de su ejecuci\u00f3n. Aqu\u00ed hay algunas cosas que se pueden hacer:<\/p>\n<ul>\n<li> La verificaci\u00f3n del estilo de codificaci\u00f3n en un sentido amplio. Esto incluye tanto la verificaci\u00f3n del formato como la b\u00fasqueda del uso de par\u00e9ntesis vac\u00edos\/redundantes, la configuraci\u00f3n de umbrales para m\u00e9tricas como el n\u00famero de l\u00edneas\/ complejidad ciclom\u00e1tica del m\u00e9todo, etc.: todo lo que podr\u00eda dificultar la legibilidad y mantenibilidad del c\u00f3digo. En Java, una herramienta de este tipo es Checkstyle; en Python, es flake8. Programas de este tipo suelen denominarse \u00ablinters\u00bb.<\/li>\n<li>No solo se puede analizar el c\u00f3digo ejecutable. Los archivos de recursos, como JSON, YAML, XML y .properties, pueden (\u00a1y deben!) ser verificados autom\u00e1ticamente por su validez. \u00bfNo es mejor detectar que, debido a comillas desiguales, se ha alterado la estructura de JSON en una etapa temprana de verificaci\u00f3n autom\u00e1tica de Pull Request que durante la ejecuci\u00f3n de pruebas o en tiempo de ejecuci\u00f3n? Existen herramientas adecuadas: por ejemplo, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/adrienverge\/yamllint\">YAMLlint<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/zaach\/jsonlint\">JSONLint<\/a><\/noindex>.<\/li>\n<li> La compilaci\u00f3n (o el an\u00e1lisis sint\u00e1ctico para lenguajes de programaci\u00f3n din\u00e1micos) tambi\u00e9n es una forma de an\u00e1lisis est\u00e1tico. Generalmente, los compiladores son capaces de emitir advertencias que indican problemas con la calidad del c\u00f3digo fuente y no deben ser ignoradas.<\/li>\n<li>A veces, la compilaci\u00f3n no se limita solo a compilar c\u00f3digo ejecutable. Por ejemplo, si usted tiene documentaci\u00f3n en formato <noindex><a rel=\"nofollow\" href=\"https:\/\/asciidoctor.org\/\">AsciiDoctor<\/a><\/noindex>, al convertirla a HTML\/PDF, el procesador AsciiDoctor (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/asciidoctor\/asciidoctor-maven-plugin\">Maven plugin<\/a><\/noindex>) puede emitir advertencias, por ejemplo, sobre enlaces internos rotos. Y esta es una raz\u00f3n v\u00e1lida para no aceptar un Pull Request con cambios en la documentaci\u00f3n.<\/li>\n<li>La verificaci\u00f3n de la ortograf\u00eda tambi\u00e9n es una forma de an\u00e1lisis est\u00e1tico. La utilidad <noindex><a rel=\"nofollow\" href=\"http:\/\/aspell.net\/\">aspell<\/a><\/noindex> puede verificar la ortograf\u00eda no solo en la documentaci\u00f3n, sino tambi\u00e9n en el c\u00f3digo fuente de programas (comentarios y literales) en diferentes lenguajes de programaci\u00f3n, incluidos C\/C++, Java y Python. \u00a1Un error de ortograf\u00eda en la interfaz de usuario o en la documentaci\u00f3n tambi\u00e9n es un defecto!<\/li>\n<li>Las pruebas de configuraci\u00f3n (para m\u00e1s informaci\u00f3n, consulte <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=KaeEjsAjV6A&amp;index=30&amp;list=PLsVTVVvrKX9tuYyCtL8mASB6IOaa-kRCA&amp;t=0s\">este<\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=Tk_nmV-mWOA\">este<\/a><\/noindex> las presentaciones), aunque se llevan a cabo en un entorno de ejecuci\u00f3n de pruebas unitarias como pytest, de hecho tambi\u00e9n son una forma de an\u00e1lisis est\u00e1tico, ya que no ejecutan el c\u00f3digo fuente durante su ejecuci\u00f3n.<\/li>\n<\/ul>\n<p>\nComo podemos ver, la b\u00fasqueda de errores en esta lista ocupa un lugar menos importante, mientras que todo lo dem\u00e1s est\u00e1 disponible mediante el uso de herramientas open source gratuitas.<\/p>\n<p>\u00bfCu\u00e1les de estos tipos de an\u00e1lisis est\u00e1tico deber\u00edan aplicarse en su proyecto? Por supuesto, todos, \u00a1cuanto m\u00e1s, mejor! Lo principal es implementarlos correctamente, de lo que hablaremos a continuaci\u00f3n.<\/p>\n<h2>El canal de suministro como un filtro de m\u00faltiples etapas y el an\u00e1lisis est\u00e1tico como su primera cascada.<\/h2>\n<p>\nLa met\u00e1fora cl\u00e1sica de la integraci\u00f3n continua es el pipeline, por el cual fluyen los cambios: desde la modificaci\u00f3n del c\u00f3digo fuente hasta la entrega en producci\u00f3n. La secuencia est\u00e1ndar de etapas de este canal se ve as\u00ed:<\/p>\n<ol>\n<li>an\u00e1lisis est\u00e1tico<\/li>\n<li>compilaci\u00f3n<\/li>\n<li>pruebas unitarias<\/li>\n<li>pruebas de integraci\u00f3n<\/li>\n<li>pruebas de UI<\/li>\n<li>revisi\u00f3n manual<\/li>\n<\/ol>\n<p>\nLos cambios rechazados en la etapa N del canal no se transfieren a la etapa N+1.<\/p>\n<p>\u00bfPor qu\u00e9 as\u00ed y no de otra manera? En la parte del canal que se ocupa de las pruebas, los evaluadores aprenden sobre la bien conocida pir\u00e1mide de pruebas.<\/p>\n<p><img decoding=\"async\" alt=\"Incorpora el an\u00e1lisis est\u00e1tico en el proceso, en lugar de buscar errores con \u00e9l.\" src=\"\/wp-content\/uploads\/2019\/05\/f155307fd4c1663800843c394098ea6f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Pir\u00e1mide de pruebas. Fuente: <noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/TestPyramid.html\">Windows<\/a><\/noindex> Martin Fowler.<\/i><\/p>\n<p>En la parte inferior de esta pir\u00e1mide se encuentran las pruebas que son m\u00e1s f\u00e1ciles de escribir, que se ejecutan m\u00e1s r\u00e1pido y tienen menos probabilidad de falsos positivos. Por ello, deber\u00edan ser m\u00e1s numerosas, cubrir m\u00e1s c\u00f3digo y ejecutarse primero. En la parte superior de la pir\u00e1mide, la situaci\u00f3n es la opuesta, por lo que el n\u00famero de pruebas de integraci\u00f3n y de UI debe reducirse al m\u00ednimo necesario. La persona en esta cadena es el recurso m\u00e1s caro, lento e ineficaz, por lo que se encuentra al final y desempe\u00f1a su trabajo solo si las etapas anteriores no detectaron defectos. Sin embargo, el canal tambi\u00e9n se construye seg\u00fan los mismos principios en las partes no directamente relacionadas con las pruebas.<\/p>\n<p>Quisiera proponer una analog\u00eda en forma de un sistema de filtraci\u00f3n de agua de m\u00faltiples etapas. En la entrada se introduce agua sucia (cambios con defectos), mientras que en la salida debemos obtener agua limpia, de la cual se han eliminado todas las impurezas indeseadas.<\/p>\n<p><img decoding=\"async\" alt=\"Incorpora el an\u00e1lisis est\u00e1tico en el proceso, en lugar de buscar errores con \u00e9l.\" src=\"\/wp-content\/uploads\/2019\/05\/76b5be8f13d55c16970d67e09767a045.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Filtro de m\u00faltiples etapas. Fuente: <noindex><a rel=\"nofollow\" href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Milli-Q_Water_filtration_station.JPG\">Wikimedia Commons<\/a><\/noindex><\/i><\/p>\n<p>Como es conocido, los filtros de limpieza se dise\u00f1an de tal manera que cada cascada sucesiva puede filtrar fracciones de contaminantes cada vez m\u00e1s peque\u00f1as. Al mismo tiempo, las cascadas de limpieza m\u00e1s gruesa tienen mayor capacidad de paso y menor costo. En nuestra analog\u00eda, esto significa que las puertas de calidad de entrada tienen un mayor rendimiento, requieren menos esfuerzo para activarse y son m\u00e1s f\u00e1ciles de manejar en s\u00ed mismas, y es en ese orden que est\u00e1n dispuestas. El papel del an\u00e1lisis est\u00e1tico, que, como ahora entendemos, solo puede detectar los defectos m\u00e1s groseros, es comparable al de una rejilla<\/p>\n<p>El an\u00e1lisis est\u00e1tico en s\u00ed mismo no mejora la calidad del producto final, como la rejilla no convierte el agua en potable. Sin embargo, en conjunto con otros elementos de la l\u00ednea de producci\u00f3n, su importancia es evidente. Aunque en un filtro de m\u00faltiples cascadas las cascadas de salida potencialmente pueden captar lo mismo que las de entrada, es claro a qu\u00e9 consecuencias conducir\u00e1 el intentar depender \u00fanicamente de las cascadas de filtrado fino, sin los cascadas de entrada.<\/p>\n<p>El objetivo de la rejilla es liberar las cascadas posteriores de la carga de capturar defectos muy groseros. Por ejemplo, al menos, la persona que realiza la revisi\u00f3n del c\u00f3digo no deber\u00eda distraerse con el c\u00f3digo mal formateado o infringir las normas de codificaci\u00f3n establecidas (como par\u00e9ntesis extras o niveles de anidamiento excesivos). Los errores como NPE deben ser detectados por pruebas modulares, pero si antes de la prueba el analizador nos se\u00f1ala que el error debe ocurrir inevitablemente, esto acelerar\u00e1 significativamente su correcci\u00f3n.<\/p>\n<p>Supongo que ahora est\u00e1 claro por qu\u00e9 el an\u00e1lisis est\u00e1tico no mejora la calidad del producto si se aplica de manera epis\u00f3dica, y debe aplicarse de forma continua para filtrar cambios con defectos groseros. La cuesti\u00f3n de si el uso de un analizador est\u00e1tico mejorar\u00e1 la calidad de su producto es aproximadamente equivalente a preguntar '\u00bfmejorar\u00e1 la potabilidad del agua tomada de una fuente sucia si se pasa por un colador?'<\/p>\n<h2>Implementaci\u00f3n en un proyecto legado<\/h2>\n<p>\nPregunta pr\u00e1ctica importante: \u00bfc\u00f3mo implementar el an\u00e1lisis est\u00e1tico en el proceso de integraci\u00f3n continua como \"quality gate\"? En el caso de las pruebas autom\u00e1ticas, todo es obvio: hay un conjunto de pruebas, y la falla de cualquiera de ellas es suficiente para considerar que la compilaci\u00f3n no ha pasado el quality gate. Intentar establecer un gate de la misma manera basado en los resultados del an\u00e1lisis est\u00e1tico falla: en el c\u00f3digo legado hay demasiadas advertencias de an\u00e1lisis, no se quiere ignorarlas por completo, pero tampoco se puede detener la entrega del producto solo porque hay advertencias del analizador.<\/p>\n<p>Cuando se aplica por primera vez, en cualquier proyecto el analizador emite una gran cantidad de advertencias, la gran mayor\u00eda de las cuales no est\u00e1n relacionadas con el funcionamiento correcto del producto. No es posible corregir todas estas observaciones de inmediato, y muchas de ellas no son necesarias. Al fin y al cabo, \u00a1sabemos que nuestro producto en general funciona, incluso antes de implementar el an\u00e1lisis est\u00e1tico!<\/p>\n<p>Como resultado, muchos se limitan a usar el an\u00e1lisis est\u00e1tico de forma espor\u00e1dica, o lo utilizan solo en modo informativo, cuando simplemente se presenta un informe del analizador al compilar. Esto es equivalente a no hacer ning\u00fan an\u00e1lisis, porque si ya tenemos m\u00faltiples advertencias, la aparici\u00f3n de otra (sin importar cu\u00e1n grave sea) al cambiar el c\u00f3digo pasa desapercibida.<\/p>\n<p>Se conocen las siguientes maneras de introducir quality gates:<\/p>\n<ul>\n<li>Establecer un l\u00edmite en la cantidad total de advertencias o en la cantidad de advertencias divididas por el n\u00famero de l\u00edneas de c\u00f3digo. Esto funciona mal, ya que tal gate permite libremente cambios con nuevos defectos hasta que se supere su l\u00edmite.<\/li>\n<li>La fijaci\u00f3n, en un momento determinado, de todas las viejas advertencias en el c\u00f3digo como ignoradas, y la negativa a compilar al surgir nuevas advertencias. Esta funcionalidad la proporciona PVS-studio y algunos recursos en l\u00ednea, como Codacy. No he trabajado con PVS-studio, pero en cuanto a mi experiencia con Codacy, su principal problema es que definir qu\u00e9 es un error \"viejo\" y cu\u00e1l es un \"nuevo\" es un algoritmo bastante complicado y que no siempre funciona correctamente, especialmente si los archivos se cambian o renombrados radicalmente. Recuerdo que Codacy pod\u00eda omitir nuevas advertencias en un pull request y, al mismo tiempo, no permitir el merge de ese pull request debido a advertencias que no estaban relacionadas con los cambios en el c\u00f3digo de dicho PR.<\/li>\n<li>En mi opini\u00f3n, la soluci\u00f3n m\u00e1s eficaz es la descrita en el libro <noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">Entrega Continua<\/a><\/noindex> \u00abm\u00e9todo de palanca\u00bb (\u00abratcheting\u00bb). La idea principal es que la propiedad de cada lanzamiento es el n\u00famero de advertencias de an\u00e1lisis est\u00e1tico, y solo se permiten cambios que no aumenten el n\u00famero total de advertencias.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Palanca<\/h2>\n<p>\nFunciona de la siguiente manera:<\/p>\n<ol>\n<li>En la etapa inicial se registra en los metadatos del lanzamiento el n\u00famero de advertencias en el c\u00f3digo encontradas por los analizadores. As\u00ed, al compilar la rama principal, se registra en su gestor de repositorios no solo \"lanzamiento 7.0.2\", sino \"lanzamiento 7.0.2, que contiene 100500 advertencias de Checkstyle\". Si utiliza un gestor de repositorios avanzado (como Artifactory), es f\u00e1cil conservar tales metadatos sobre su lanzamiento.<\/li>\n<li>Ahora cada pull request al compilar compara el n\u00famero de advertencias que se generan con el n\u00famero que existe en el lanzamiento actual. Si el PR aumenta este n\u00famero, el c\u00f3digo no pasa la puerta de calidad del an\u00e1lisis est\u00e1tico. Si el n\u00famero de advertencias disminuye o no cambia, entonces pasa.<\/li>\n<li>En el siguiente lanzamiento, el n\u00famero recalculado de advertencias se registrar\u00e1 nuevamente en los metadatos del lanzamiento.<\/li>\n<\/ol>\n<p>\nAs\u00ed, poco a poco, pero de forma constante (como en el funcionamiento de un ratchet), el n\u00famero de advertencias tender\u00e1 a cero. Por supuesto, el sistema puede ser enga\u00f1ado al ingresar una nueva advertencia, pero corrigiendo la de otro. Esto es normal, ya que a largo plazo da resultado: las advertencias se corrigen, por lo general, no de una en una, sino en grupo de un tipo determinado, y todas las advertencias f\u00e1cilmente corregibles se eliminan bastante r\u00e1pido.<\/p>\n<p>En este gr\u00e1fico se muestra el n\u00famero total de advertencias de Checkstyle durante seis meses de funcionamiento de tal \"ratchet\" en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\">uno de nuestros proyectos de OpenSource<\/a><\/noindex>. El n\u00famero de advertencias se ha reducido en un orden de magnitud, y esto ha ocurrido de forma natural, paralelamente al desarrollo del producto.<\/p>\n<p><img decoding=\"async\" alt=\"Incorpora el an\u00e1lisis est\u00e1tico en el proceso, en lugar de buscar errores con \u00e9l.\" src=\"\/wp-content\/uploads\/2019\/05\/9529bb2fb32187057088e8d2c4203333.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAplico una versi\u00f3n modificada de este m\u00e9todo, contabilizando por separado las advertencias desglosadas por m\u00f3dulos del proyecto y herramientas de an\u00e1lisis; el archivo YAML con metadatos de la compilaci\u00f3n que se genera tiene un aspecto aproximadamente como el siguiente:<\/p>\n<pre><code class=\"plaintext\">celesta-sql:\n  checkstyle: 434\n  spotbugs: 45\ncelesta-core:\n  checkstyle: 206\n  spotbugs: 13\ncelesta-maven-plugin:\n  checkstyle: 19\n  spotbugs: 0\ncelesta-unit:\n  checkstyle: 0\n  spotbugs: 0\n<\/code><\/pre>\n<p>\nEn cualquier sistema CI avanzado, un \"ratchet\" se puede implementar para cualquier herramienta de an\u00e1lisis est\u00e1tico, sin depender de complementos y herramientas externas. Cada uno de los analizadores genera su informe en un formato de texto simple o XML, que es f\u00e1cil de analizar. Solo queda escribir la l\u00f3gica necesaria en el script CI. Puedes ver c\u00f3mo se implementa esto en nuestros proyectos de c\u00f3digo abierto basados en Jenkins y Artifactory. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/2bass\/blob\/dev\/Jenkinsfile\">aqu\u00ed<\/a><\/noindex> o <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/dev\/Jenkinsfile\">aqu\u00ed<\/a><\/noindex>. Ambos ejemplos dependen de la biblioteca <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/inponomarev\/ratchetlib\">ratchetlib<\/a><\/noindex>: el m\u00e9todo <code>countWarnings()<\/code> cuenta normalmente las etiquetas xml en los archivos generados por Checkstyle y Spotbugs, y <code>compareWarningMaps()<\/code> implementa el ratchet mismo, lanzando un error en caso de que el n\u00famero de advertencias en alguna de las categor\u00edas aumente.<\/p>\n<p>Una interesante implementaci\u00f3n de un \u00abratchet\u00bb es posible para el an\u00e1lisis de la ortograf\u00eda de comentarios, literales de texto y documentaci\u00f3n utilizando aspell. Como se sabe, al verificar la ortograf\u00eda, no todas las palabras desconocidas para el diccionario est\u00e1ndar son incorrectas, pueden ser a\u00f1adidas al diccionario personalizado. Si se hace del diccionario personalizado parte del c\u00f3digo fuente del proyecto, entonces se puede formular un quality gate de ortograf\u00eda de la siguiente manera: ejecutar aspell con el diccionario est\u00e1ndar y el personalizado. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CourseOrchestra\/celesta\/blob\/271dcfc8dc3ad65ac2d1dcaa39b7fd3ea8fb5891\/Jenkinsfile#L36\">no debe<\/a><\/noindex> encontrar ning\u00fan error de ortograf\u00eda.<\/p>\n<h2>Sobre la importancia de fijar la versi\u00f3n del analizador<\/h2>\n<p>\nEn conclusi\u00f3n, es necesario se\u00f1alar lo siguiente: independientemente de c\u00f3mo implementes el an\u00e1lisis en tu canal de entrega, la versi\u00f3n del analizador debe ser fijada. Si se permite que el analizador se actualice autom\u00e1ticamente, al ensamblar el pr\u00f3ximo pull request pueden \u00abemergir\u00bb nuevos defectos, que no est\u00e1n relacionados con el cambio de c\u00f3digo, sino que se vinculan al hecho de que el nuevo analizador simplemente puede encontrar m\u00e1s defectos, lo que interrumpir\u00e1 tu proceso de aceptaci\u00f3n de pull requests. El upgrade del analizador debe ser una acci\u00f3n consciente. Sin embargo, la fijaci\u00f3n rigurosa de la versi\u00f3n de cada componente de la construcci\u00f3n es, en general, un requisito necesario y un tema para una conversaci\u00f3n separada.<\/p>\n<h2>Conclusiones<\/h2>\n<p><\/p>\n<ul>\n<li>El an\u00e1lisis est\u00e1tico no encontrar\u00e1 bugs ni mejorar\u00e1 la calidad de tu producto como resultado de una sola aplicaci\u00f3n. El efecto positivo en la calidad solo se obtiene mediante su uso constante en el proceso de entrega.<\/li>\n<li>La b\u00fasqueda de bugs no es en absoluto la tarea principal del an\u00e1lisis; la abrumadora mayor\u00eda de las funciones \u00fatiles est\u00e1n disponibles en herramientas opensource.<\/li>\n<li>Implementa quality gates basados en los resultados del an\u00e1lisis est\u00e1tico en la primera etapa del canal de entrega, utilizando un \u00abratchet\u00bb para el c\u00f3digo legado.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Enlaces<\/h2>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Continuous-Delivery-Deployment-Automation-Addison-Wesley\/dp\/0321601912\">Entrega Continua<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=8Cx3LHNjI24\">A. Kudryavtsev: An\u00e1lisis de programas: c\u00f3mo saber si eres un buen programador<\/a><\/noindex> presentaci\u00f3n sobre diferentes m\u00e9todos de an\u00e1lisis de c\u00f3digo (\u00a1no solo est\u00e1tico!)<\/li>\n<\/ol>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/436868\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u0431\u043b\u043e\u0433 PVS-studio, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u0437\u043e\u0440\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0434\u0430\u0432\u043d\u043e PVS-studio \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Java, \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IntelliJ IDEA, \u0447\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24622,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32848","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0412\u043d\u0435\u0434\u0440\u044f\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043d\u0435 \u0438\u0449\u0438\u0442\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0430\u0433\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:49:16+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:49:16+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Implementa el an\u00e1lisis est\u00e1tico en el proceso, no busques bugs con su ayuda | ProHoster","description":"Escribir este art\u00edculo fue motivado por la gran cantidad de materiales sobre an\u00e1lisis est\u00e1tico que cada vez aparecen m\u00e1s a la vista.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0412\u043d\u0435\u0434\u0440\u044f\u0439\u0442\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0430 \u043d\u0435 \u0438\u0449\u0438\u0442\u0435 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0430\u0433\u0438 | ProHoster","og:description":"\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u0435\u043d\u044f \u0441\u043f\u043e\u0434\u0432\u0438\u0433\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u0433\u043b\u0430\u0437\u0430.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/vnedryajte-staticheskij-analiz-v-protsess-a-ne-ishhite-s-ego-pomoshhyu-bagi","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:49:16+00:00","article:modified_time":"2019-10-31T18:49:16+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32848","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 12:50:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:51:27","updated":"2026-01-21 12:50:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/32848","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=32848"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/32848\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/24622"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=32848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=32848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=32848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}