{"id":481,"date":"2023-08-22T14:09:10","date_gmt":"2023-08-22T13:09:10","guid":{"rendered":"https:\/\/jorgeturiel.es\/?p=481"},"modified":"2023-08-22T14:14:20","modified_gmt":"2023-08-22T13:14:20","slug":"malos-lenguajes-o-malas-practicas","status":"publish","type":"post","link":"https:\/\/jorgeturiel.es\/?p=481","title":{"rendered":"\u00bfMalos lenguajes o malas pr\u00e1cticas?"},"content":{"rendered":"\n<p>Hoy en d\u00eda existen lenguajes que no tiene un tipificado fuerte. Como viejo \u201croquero\u201d este tipo de enfoque en los lenguajes no es santo de mi devoci\u00f3n. El m\u00e1s conocido o extendido, de este tipo de lenguajes, quiz\u00e1s sea Python. El cual conozco algo, pero mis viejas costumbres o h\u00e1bitos, no acaban de encajar con este lenguaje. Y lo poco que he trabajado con \u00e9l, me ha chocado su filosof\u00eda de que todo vale. Este enfoque me ha hecho pensar que no es un buen lenguaje. Aunque esta idea sobre los lenguajes de este tipo ha cambiado recientemente, tras la siguiente vivencia.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Contexto<\/h2>\n\n\n\n<p>A finales de la d\u00e9cada de los a\u00f1os 80, cuando empec\u00e9 en el mundo de la programaci\u00f3n, exist\u00eda el lenguaje \u201cBasic\u201d, en sus m\u00faltiples variantes. Era un lenguaje tipo Script, ya que no se compilaba. Pero ten\u00eda sus virtudes. Una de las que recuerdo, que era un lenguaje con un tipificado fuerte. Ten\u00edas que declarar las variables indicando que tipo de dato iba a contener, y no pod\u00eda ser alterado.<\/p>\n\n\n\n<p>Si te enganchaba este mundillo de la programaci\u00f3n, pod\u00edas dar el paso a C, Turbo Pascal, Clipper, etc. Todos estos lenguajes mucho m\u00e1s potentes, algunos muy especializados como Clipper, ten\u00eda en com\u00fan entre ellos, y su \u201chermano peque\u00f1o\u201d el lenguaje Basic, que eran lenguajes de tipificado fuerte, m\u00e1s complejos que Basic, pero todos los fundamentos y\/o h\u00e1bitos que aprend\u00edas con Basic, no solamente eran \u00fatiles, sino fundamentales para adentrarte en estos lenguajes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQue me hizo reflexionar?<\/h2>\n\n\n\n<p>Recientemente me contact\u00f3 <a href=\"https:\/\/www.linkedin.com\/in\/miguel-costas-concepci%C3%B3n-88079a155\/?originalSubdomain=es\">Miguel Costas<\/a>, comercial de <a href=\"https:\/\/www.balluff.com\/es-es\">Balluf<\/a>. Miguel y yo hace m\u00e1s de 25 a\u00f1os que nos conocemos. Empezamos juntos a trabajar en el mundo de la automatizaci\u00f3n, y aunque el tiempo nos ha llevado por diferentes empresas y puestos, otras veces nos ha vuelto a juntar en la misma empresa, hemos mantenido el contacto y la amistad.<\/p>\n\n\n\n<p>Miguel me comenta, que un cliente le ha hecho una consulta. Me dice que tiene un cliente al que le ha vendido unos sensores RFID. El cual est\u00e1 tratando de usar en un programa desde un PC, apoy\u00e1ndose en una librer\u00eda escrita en Python. C\u00f3mo soy muy t\u00e9cnico, le digo que le pregunte por el nombre de la librer\u00eda y\/o que env\u00ede el c\u00f3digo fuente que le est\u00e1 dando problemas.<\/p>\n\n\n\n<p>Tras recabar m\u00e1s informaci\u00f3n, me comenta que el problema es que un trozo de c\u00f3digo eleva una excepci\u00f3n tras leer la informaci\u00f3n del sensor. Esta excepci\u00f3n se produce cuando se lee el byte n\u00famero 32, de la trama que recibe del sensor, y se compara con el byte 31. Si son diferentes, se eleva la excepci\u00f3n y el programa se detiene.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"565\" height=\"105\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/08\/imagen.png\" alt=\"\" class=\"wp-image-483\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/08\/imagen.png 565w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/08\/imagen-300x56.png 300w\" sizes=\"auto, (max-width: 565px) 100vw, 565px\" \/><figcaption class=\"wp-element-caption\">Excepci\u00f3n sin gestionar.<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Observo el fragmento de c\u00f3digo que enviaron y es correcto. Al ser diferentes ambos bytes, se genera la excepci\u00f3n. Le comento que lo veo correcto. Y que el programa debe gestionar esa excepci\u00f3n para que no se detenga \u201cbruscamente\u201d e informar al usuario, de una manera amigable, que hubo un problema, darle opciones, etc.<\/p>\n\n\n\n<p>Tras unos d\u00edas, volvemos a hablar del tema, y me dice que el cliente insiste que tiene que a haber un problema en el sensor RFDI, ya que, seg\u00fan la documentaci\u00f3n del sensor, este env\u00eda 32 bytes y que el \u00faltimo byte y el pen\u00faltimo deben ser iguales.<\/p>\n\n\n\n<p>Echo un vistazo a la documentaci\u00f3n del sensor, y no veo nada que necesite configurarse. Vuelvo al c\u00f3digo y lo observo con detalle. Como mi conocimiento de Python es limitado me surgen preguntas. As\u00ed que me planteo como har\u00eda yo ese c\u00f3digo usando un lenguaje como Object Pascal o C.<\/p>\n\n\n\n<p>Lo primero que me viene a la cabeza, es que, para leer un buffer de un tama\u00f1o determinado tras recibirlo, debo comprobar si ha llegado la cantidad de bytes esperada. Ya que trato de leer el byte 32 y no se han recibido 32 bytes, se va a producir un error en tiempo de ejecuci\u00f3n y mi programa se detendr\u00e1, se producir\u00e1n fugas de memoria, quiz\u00e1s mi programa est\u00e9 gestionando alg\u00fan proceso autom\u00e1tico, etc.<\/p>\n\n\n\n<p>Para mi sorpresa, el c\u00f3digo escrito en Python simplemente lee el \u00faltimo y el pen\u00faltimo byte y los compara. \u00bfY sino se recibi\u00f3 la cantidad esperada? Efectivamente, ese era el problema.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"501\" height=\"65\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/08\/imagen-1.png\" alt=\"\" class=\"wp-image-484\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/08\/imagen-1.png 501w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/08\/imagen-1-300x39.png 300w\" sizes=\"auto, (max-width: 501px) 100vw, 501px\" \/><figcaption class=\"wp-element-caption\">Lectura de datos<\/figcaption><\/figure>\n<\/div>\n\n\n<p>El problema no es del lenguaje Python, el cual es flexible y pr\u00e1ctico. Cualquiera puede escribir unas l\u00edneas. Es el programador el que hace un mal uso de este. Se est\u00e1n olvidando las buenas pr\u00e1cticas, la metodolog\u00eda y los fundamentos. Aquellos conceptos, deb\u00edas tener presente hace unas d\u00e9cadas, sino no consegu\u00edas ejecutar una l\u00ednea de c\u00f3digo ni en Basic.<\/p>\n\n\n\n<p>Los lenguajes modernos han tra\u00eddo muchas mejoras y avances cara a simplificar el trabajo de los programadores. Hay mucha m\u00e1s \u201clibertad\u201d a la hora de escribir c\u00f3digo. Es m\u00e1s accesible a todo el mundo. Pero esa libertad no se puede convertir en libertinaje. Es responsabilidad del programar&nbsp; seguir haciendo uso de la buenas pr\u00e1cticas que hab\u00eda antes, y tambi\u00e9n de las que han aparecido con los nuevos lenguajes.<\/p>\n\n\n\n<p>No hay un lenguaje malo, hay programadores con malas pr\u00e1cticas.<\/p>\n\n\n\n<p>Saludos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoy en d\u00eda existen lenguajes que no tiene un tipificado fuerte. Como viejo \u201croquero\u201d este tipo de enfoque en los lenguajes no es santo de mi devoci\u00f3n. El m\u00e1s conocido o extendido, de este tipo de lenguajes, quiz\u00e1s sea Python. El cual conozco algo, pero mis viejas costumbres o h\u00e1bitos, no acaban de encajar con [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":482,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[24,52],"class_list":["post-481","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","tag-programacion","tag-python"],"_links":{"self":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/481","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=481"}],"version-history":[{"count":3,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/481\/revisions"}],"predecessor-version":[{"id":487,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/481\/revisions\/487"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/media\/482"}],"wp:attachment":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}