Programación: La psicología de las computadoras

Todos nos vemos íntimamente relacionados con la programación, sea como usuario, como administrador, como programador propiamente, pero en definitiva es algo que va a estar más conectado con nuestras vidas con el pasar de los años.

En este artículo (el comienzo de una pequeña serie que pienso crear) Quiero compartir con ustedes unos cuantos conceptos sobre lo que he ido descubriendo de programación a lo largo de estos años. No pretendo ser sumamente técnico, ya explicaré por qué más adelante. Pero lo que si pretendo es hacer que vean el mundo con mis ojos, y si les gusta cómo se ve, pues que se adentren un poco en él :)

Primero atacaré el punto más simple de todos antes de entrar en detalles.

¿Por qué no voy a hacer un post técnico?

Pues para los que han leído mi post sobre el mejor comando de Linux, sabrán un poco la causa de este enfoque. La tecnología siempre está cambiando, y si yo el día de hoy escribo algo, en el caso de que el post sea bien recibido, pues tendré que estar siempre actualizando la información. En los lenguajes más comunes de hoy, lo único seguro es el cambio. Con esto me refiero (y los programadores me podrán dar la razón) los frameworks siempre están creciendo y modificandose desde sus núcleos, esto es así porque los errores surgen, algunos pueden ser considerados simples bugs, mientras que otros pueden llegar a ser vulnerabilidades.  Esta es la razón por la cual escribir un post sobre un lenguaje específico, hoy por hoy, me garantizaría tal vez unos cuantos meses de utilidad, en el mejor de los casos uno o dos años, pero esa no es la idea :)

La electricidad es importante

Aquellos que hayan investigado un poco sobre los lenguajes más bajos de programación de software sabrán que todo se remonta a la electricidad. Antiguamente la programación se realizaba a nivel de hardware, esto quiere decir que aquellos antiguos relojes, calculadoras, y otros muchos dispositivos, podían cumplir su destino mediante programación por hardware.

El probema

Cambiar programación 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 software.

Los procesadores

Los procesadores de hoy en día, tienen un número limitado de funciones, llamadas instrucciones en muchos libros. Estas permiten realizar las funciones más básicas que puede ejecutar el hardware, y movilizar la información a través de la memoria del equipo.

Registers

Los registros son un espacio en el que el procesador almacena información para poder realizar trabajos en el núcleo, dependiendo de la arquitectura pueden tener un distinto tamaño y orden, pero en forma simple, su función es almacenar datos que le indican al procesador uno de los siguientes tipos de trabajo: mover data, aritmética y lógica, y control de flujo. Todo puede resumirse en estos tipos de funcionalidades.

Binario

Los procesadores trabajan a nivel binario, esto quiere decir que solo entienden de 0s y 1s :) . Un dato curioso aquí :D ¿recuerdan los permisos de GNU/Linux? pues, ¿alguna vez se han preguntado cómo realmente reconoce el procesador esos permisos? Simple :) binario. En el nivel más bajo, un procesador entenderá los permisos como una sucesión de 0s y 1s, y ese es el motivo por el cual el octal que formamos tiene los valores para ejecución, 2 para lectura y 4 para escritura. Para los que saben leer binario, entenderán que:

111100101111

Ponen los permisos de lectura, escritura y ejecución para el grupo otros mientras que pone ejecución y lectura para el grupo grupo y solo lectura para el dueño del archivo. Para los más curiosos, los últimos tres 1s activan el setguid, setuid y el sticky bit. Si no saben qué 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én lo puedo explicar en otro lugar si es necesario.

Cuando la curiosidad llama…

Pues si lo me han seguido hasta aquí, entonces ya su curiosidad debería empezar a preguntar bastantes cosas, la primera que quiero responder (y tal vez la única que me permita este post porque ya estoy escribiendo bastante) es: ¿si las llamadas son las mismas, por qué los programas son tan diferentes?

La psicología

La programación es el arte de aprender a leer mentes :) Quiero empezar este apartado con una cita que leí hace un buen tiempo, Edsger Dijkstra dijo:

Si la depuración es el proceso de eliminar errores, entonces la programación debe ser el proceso de introducirlos

Y es que no encuentro una mejor forma de explicar todo esto :) ¿por qué programar es el arte de introducir errores? se preguntará más de uno en este momento. La respuesta es simple, porque nuestras mentes son humanas, y los humanos cometemos errores :) está en nuestra naturaleza, y estará por todo el tiempo en el que el hombre exista en el planeta.

Las computadoras no se equivocan

Los que nos equivocamos somos nosotros, los equipos siempre se limitarán a reproducir lo que les indicamos, no asumen nada, no interpretan nada, no objetan nada, solo leen y actúan. Por eso en otro libro de C alguna vez leí algo como esto:

C es un lenguaje rudo, puedes hacer mucho con él, pero jamás te impedirá dispararte en el pie si eso deseas hacer, o eso le indicas.

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ás alto, puesto que las capas de prevención de errores son mayores.

Todo es psicología

Cada lenguaje, framework, programador, respeta y sigue algún tipo de filosofía, y si no lo hace, pues no tiene un futuro muy prometedor. Los que trabajamos en UNIX y derivados, probablemente conoceremos la antigua frase:

Haz una cosa, y hazla muy bien.

Esta filosofía 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.

Si nos vamos a otros lenguajes, cada uno tendrá una función y objetivo, algunos más permisivos y otros más restrictivos, pero todos siguiente su propia forma de pensar.

Aprender a leer mentes

Existe un dicho bastante común entre programadores, dice que existen cientos de formas de resolver el mismo problema. Esto es cierto, pero hay algo mucho más profundo de este aspecto. Leer código fuente te permite leer mentes :) no cualquier mente, sino la del programador (o programadores) que lo escribió. 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ómo ha crecido su pensamiento lógico y crítico a lo largo del tiempo. Algo extraordinario y que nutre bastante la mente de los más jóvenes, porque puedes conocer los mejores caminos de personas que tuvieron que descubrirlos :)

Ser consistente

Muchos programadores y especialistas dicen que tenemos que salir de nuestra zona de confort, y aunque es verdad, también es más que necesario mantener ciertos procesos y formatos. Esto es simple de explicar, nuestras mentes son repetitivas y respetan estructuras, si todos los días escribes código de la misma manera, en poco tiempo dejarás de pensar en la forma y te podrás concentrar en el fondo. Esto te permite ver la lógica del programa en lugar de la syntaxis del lenguaje. Y este es le motivo por el que considero que aprender los conceptos siempre será más importante que aprender las formas. Esta es una opinión personal, pero espero que tras leer todo esto puedan entender por qué lo considero así :) además 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ódigo.

En resumen

Bueno, este es el primer paso de una serie que espero les ayude a pensar de otra manera en el arte de la programación, incluso a que los invite a adentrarse en los conceptos que permiten ejecutar el código 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ía, poder priorizar un poco sobre lo realmente importante de conocer :) Saludos

Published by

ChrisADR

I'm a young developer who loves open source and free software technologies, I'm the founder of CodeLabora, an open source community which aims to help young developers from Latin America to get involved with open source and free software projects and communities around the world. I like to learn and my favorite subjects are security and Linux. I've recently finished an internship as security analyst and contribute to the security project from my Linux community, Gentoo Linux, as Gentoo Linux Security Advise (GLSA) Coordinator

Leave a Reply

Your email address will not be published. Required fields are marked *