{"id":47,"date":"2017-10-22T15:45:49","date_gmt":"2017-10-22T20:45:49","guid":{"rendered":"http:\/\/blogs.gentoo.org\/chrisadr\/?p=47"},"modified":"2019-11-01T03:35:28","modified_gmt":"2019-11-01T08:35:28","slug":"programacion-la-psicologia-de-las-computadoras","status":"publish","type":"post","link":"https:\/\/blogs.gentoo.org\/chrisadr\/2017\/10\/22\/programacion-la-psicologia-de-las-computadoras\/","title":{"rendered":"Programaci\u00f3n: La psicolog\u00eda de las computadoras"},"content":{"rendered":"<p>Todos nos vemos\u00a0\u00edntimamente relacionados con la programaci\u00f3n, sea como usuario, como administrador, como programador propiamente, pero en definitiva es algo que va a estar m\u00e1s conectado con nuestras vidas con el pasar de los a\u00f1os.<\/p>\n<p>En este art\u00edculo (el comienzo de una peque\u00f1a serie que pienso crear) Quiero compartir con ustedes unos cuantos conceptos sobre lo que he ido descubriendo de programaci\u00f3n a lo largo de estos a\u00f1os. No pretendo ser sumamente t\u00e9cnico, ya explicar\u00e9 por qu\u00e9 m\u00e1s adelante. Pero lo que si pretendo es hacer que vean el mundo con mis ojos, y si les gusta c\u00f3mo se ve, pues que se adentren un poco en \u00e9l :)<\/p>\n<p>Primero atacar\u00e9 el punto m\u00e1s simple de todos antes de entrar en detalles.<\/p>\n<h3>\u00bfPor qu\u00e9 no voy a hacer un post t\u00e9cnico?<\/h3>\n<p>Pues para los que han le\u00eddo mi post sobre el mejor comando de Linux, sabr\u00e1n un poco la causa de este enfoque. La tecnolog\u00eda siempre est\u00e1 cambiando, y si yo el d\u00eda de hoy escribo algo, en el caso de que el post sea bien recibido, pues tendr\u00e9 que estar siempre actualizando la informaci\u00f3n. En los lenguajes m\u00e1s comunes de hoy, lo \u00fanico seguro es el cambio. Con esto me refiero (y los programadores me podr\u00e1n dar la raz\u00f3n) los frameworks siempre est\u00e1n creciendo y modificandose desde sus n\u00facleos, esto es as\u00ed porque los errores surgen, algunos pueden ser considerados simples\u00a0<em>bugs<\/em>, mientras que otros pueden llegar a ser\u00a0<em>vulnerabilidades<\/em>.\u00a0 Esta es la raz\u00f3n por la cual escribir un post sobre un lenguaje espec\u00edfico, hoy por hoy, me garantizar\u00eda tal vez unos cuantos meses de utilidad, en el mejor de los casos uno o dos a\u00f1os, pero esa no es la idea :)<\/p>\n<h3>La electricidad es importante<\/h3>\n<p>Aquellos que hayan investigado un poco sobre los lenguajes m\u00e1s bajos de programaci\u00f3n de software sabr\u00e1n que todo se remonta a la electricidad. Antiguamente la programaci\u00f3n se realizaba a nivel de hardware, esto quiere decir que aquellos antiguos relojes, calculadoras, y otros muchos dispositivos, pod\u00edan cumplir su destino mediante programaci\u00f3n por <em>hardware<\/em>.<\/p>\n<h4>El probema<\/h4>\n<p>Cambiar programaci\u00f3n de hardware es costoso, y complicado :) (al menos eso me han contado :) ). Es por esto que surgieron los procesadores, que en realidad abstraen esa capa de hardware para entregarnos unos cuantos comandos para poder realizar todo aquello que era posible mediante hardware, solo que ahora en la capa de <em>software.<\/em><\/p>\n<h3>Los procesadores<\/h3>\n<p>Los procesadores de hoy en d\u00eda, tienen un n\u00famero limitado de funciones, llamadas <em>instrucciones<\/em> en muchos libros. Estas permiten realizar las funciones m\u00e1s b\u00e1sicas que puede ejecutar el hardware, y movilizar la informaci\u00f3n a trav\u00e9s de la memoria del equipo.<\/p>\n<h4>Registers<\/h4>\n<p>Los registros son un espacio en el que el procesador almacena informaci\u00f3n para poder realizar trabajos en el n\u00facleo, dependiendo de la arquitectura pueden tener un distinto tama\u00f1o y orden, pero en forma simple, su funci\u00f3n es almacenar datos que le indican al procesador uno de los siguientes tipos de trabajo:\u00a0<em>mover data, aritm\u00e9tica y l\u00f3gica, y control de<\/em> flujo. Todo puede resumirse en estos tipos de funcionalidades.<\/p>\n<h4>Binario<\/h4>\n<p>Los procesadores trabajan a nivel binario, esto quiere decir que solo entienden de <em>0<\/em>s y <em>1<\/em>s :) . Un dato curioso aqu\u00ed :D \u00bfrecuerdan los permisos de GNU\/Linux? pues, \u00bfalguna vez se han preguntado c\u00f3mo realmente reconoce el procesador esos permisos? Simple :) binario. En el nivel m\u00e1s bajo, un procesador entender\u00e1 los permisos como una sucesi\u00f3n de 0s y 1s, y ese es el motivo por el cual el octal que formamos tiene los valores <em>1\u00a0<\/em>para ejecuci\u00f3n, <em>2<\/em> para lectura y 4 para escritura. Para los que saben leer binario, entender\u00e1n que:<\/p>\n<p><code>111100101111<\/code><\/p>\n<p>Ponen los permisos de lectura, escritura y ejecuci\u00f3n para el grupo\u00a0<em>otros<\/em> mientras que pone ejecuci\u00f3n y lectura para el grupo\u00a0<em>grupo<\/em> y solo lectura para el due\u00f1o del archivo. Para los m\u00e1s curiosos, los \u00faltimos tres 1s activan el setguid, setuid y el sticky bit. Si no saben qu\u00e9 es esto del binario, lo puedo explicar en otro post, si no conocen esto del setuid, setgid y el sticky bit, pues se los dejo de tarea ;) pero tambi\u00e9n lo puedo explicar en otro lugar si es necesario.<\/p>\n<h3>Cuando la curiosidad llama&#8230;<\/h3>\n<p>Pues si lo me han seguido hasta aqu\u00ed, entonces ya su curiosidad deber\u00eda empezar a preguntar bastantes cosas, la primera que quiero responder (y tal vez la \u00fanica que me permita este post porque ya estoy escribiendo bastante) es:\u00a0<em>\u00bfsi las llamadas son las mismas, por qu\u00e9 los programas son tan diferentes?<\/em><\/p>\n<h3>La psicolog\u00eda<\/h3>\n<p>La programaci\u00f3n es el arte de aprender a leer mentes :) Quiero empezar este apartado con una cita que le\u00ed hace un buen tiempo,\u00a0Edsger Dijkstra dijo:<\/p>\n<blockquote class=\"td_quote_box td_box_center\"><p>Si la depuraci\u00f3n es el proceso de eliminar errores, entonces la programaci\u00f3n debe ser el proceso de introducirlos<\/p><\/blockquote>\n<p>Y es que no encuentro una mejor forma de explicar todo esto :) \u00bfpor qu\u00e9 programar es el arte de introducir errores? se preguntar\u00e1 m\u00e1s de uno en este momento. La respuesta es simple, porque nuestras mentes son humanas, y los humanos cometemos errores :) est\u00e1 en nuestra naturaleza, y estar\u00e1 por todo el tiempo en el que el hombre exista en el planeta.<\/p>\n<h3>Las computadoras no se equivocan<\/h3>\n<p>Los que nos equivocamos somos nosotros, los equipos siempre se limitar\u00e1n a reproducir lo que les indicamos, no asumen nada, no interpretan nada, no objetan nada, solo leen y act\u00faan. Por eso en otro libro de C alguna vez le\u00ed algo como esto:<\/p>\n<blockquote class=\"td_quote_box td_box_center\"><p>C es un lenguaje rudo, puedes hacer mucho con \u00e9l, pero jam\u00e1s te impedir\u00e1 dispararte en el pie si eso deseas hacer, o eso le indicas.<\/p><\/blockquote>\n<p>Esto es una verdad bastante curiosa :) Puesto que al trabajar a un nivel tan bajo, es posible que muchas operaciones que se realizan puedan ser destructivas, algo que no sucede con lenguajes de nivel un poco m\u00e1s alto, puesto que las capas de prevenci\u00f3n de errores son mayores.<\/p>\n<h3>Todo es psicolog\u00eda<\/h3>\n<p>Cada lenguaje, framework, programador, respeta y sigue alg\u00fan tipo de filosof\u00eda, y si no lo hace, pues no tiene un futuro muy prometedor. Los que trabajamos en UNIX y derivados, probablemente conoceremos la antigua frase:<\/p>\n<blockquote class=\"td_pull_quote td_pull_center\"><p>Haz una cosa, y hazla muy bien.<\/p><\/blockquote>\n<p>Esta filosof\u00eda es la que siguen algunos proyectos como el kernel, funciones bastante reducidas que solamente hacen una cosa, pero la hacen lo mejor que se puede.<\/p>\n<p>Si nos vamos a otros lenguajes, cada uno tendr\u00e1 una funci\u00f3n y objetivo, algunos m\u00e1s permisivos y otros m\u00e1s restrictivos, pero todos siguiente su propia forma de pensar.<\/p>\n<h3>Aprender a leer mentes<\/h3>\n<p>Existe un dicho bastante com\u00fan entre programadores, dice que existen cientos de formas de resolver el mismo problema. Esto es cierto, pero hay algo mucho m\u00e1s profundo de este aspecto. Leer c\u00f3digo fuente te permite leer mentes :) no cualquier mente, sino la del programador (o programadores) que lo escribi\u00f3. Es una especie de diario virtual y profundo :) te permite conocer en profundidad la mente del desarrollador, y en caso de proyectos extensos, te permite ver c\u00f3mo ha crecido su pensamiento l\u00f3gico y cr\u00edtico a lo largo del tiempo. Algo extraordinario y que nutre bastante la mente de los m\u00e1s j\u00f3venes, porque puedes conocer los mejores caminos de personas que tuvieron que descubrirlos :)<\/p>\n<h3>Ser consistente<\/h3>\n<p>Muchos programadores y especialistas dicen que tenemos que salir de nuestra <em>zona de confort<\/em>, y aunque es verdad, tambi\u00e9n es m\u00e1s que necesario mantener ciertos procesos y formatos. Esto es simple de explicar, nuestras mentes son repetitivas y respetan estructuras, si todos los d\u00edas escribes c\u00f3digo de la misma manera, en poco tiempo dejar\u00e1s de pensar en la forma y te podr\u00e1s concentrar en el\u00a0<em>fondo<\/em>. Esto te permite ver la\u00a0<em>l\u00f3gica\u00a0<\/em>del programa en lugar de la\u00a0<em>syntaxis del lenguaje.<\/em> Y este es le motivo por el que considero que aprender los <em>conceptos\u00a0<\/em>siempre ser\u00e1 m\u00e1s importante que aprender\u00a0<em>las formas<\/em>. Esta es una opini\u00f3n personal, pero espero que tras leer todo esto puedan entender por qu\u00e9 lo considero as\u00ed :) adem\u00e1s que se los dice alguien que ha tenido que programar en C, Java, Javascript, Python, Ruby, PHP, y otros :) conocer los conceptos facilita escribir el c\u00f3digo.<\/p>\n<h3>En resumen<\/h3>\n<p>Bueno, este es el primer paso de una serie que espero les ayude a pensar de otra manera en el arte de la programaci\u00f3n, incluso a que los invite a adentrarse en los conceptos que permiten ejecutar el c\u00f3digo que han escrito tal vez cientos de veces, pero que no se han detenido a pensar en lo que realmente hace. Y para los que no han empezado a programar, pero les gustar\u00eda, poder priorizar un poco sobre lo realmente importante de conocer :) Saludos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Todos nos vemos\u00a0\u00edntimamente relacionados con la programaci\u00f3n, sea como usuario, como administrador, como programador propiamente, pero en definitiva es algo que va a estar m\u00e1s conectado con nuestras vidas con el pasar de los a\u00f1os. En este art\u00edculo (el comienzo de una peque\u00f1a serie que pienso crear) Quiero compartir con ustedes unos cuantos conceptos sobre &hellip; <a href=\"https:\/\/blogs.gentoo.org\/chrisadr\/2017\/10\/22\/programacion-la-psicologia-de-las-computadoras\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Programaci\u00f3n: La psicolog\u00eda de las computadoras<\/span><\/a><\/p>\n","protected":false},"author":169,"featured_media":49,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[3],"jetpack_featured_media_url":"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2017\/10\/programaci\u00f3n.png","_links":{"self":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/47"}],"collection":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/comments?post=47"}],"version-history":[{"count":1,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/47\/revisions"}],"predecessor-version":[{"id":48,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/47\/revisions\/48"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media\/49"}],"wp:attachment":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media?parent=47"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/categories?post=47"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/tags?post=47"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}