8/4/18

Proyecto de lectura: El ordenador y el cerebro, John von Neumann

Voy a comenzar esta nueva sección de blog llamada "Proyecto de lectura", consiste en elegir un libro relacionado a la temática del blog, leerlo, anotar y reflexionar sobre aquello que me parece interesante y compartirlo en éste blog a medida que vaya lenyendo. Tengo pensado incluir libros, artíclos, papers, todo lo que se lea, pero vamos de a poco.

Nada que no haya hecho alguien por ahí en otro blog. Pero esto me va a servir para dar a conocer un poco más el mterial con el que nos manejomos día a día en informática, computación, desarrollo de software, etc. Espero que así quede más claro en que consiste lo que hacemos. Aunque es necesario que aclare que en éste caso puntual el libro no trata sobre temas actuales, su valor es, en mi opinión, más histórico que técnico.

He leído varias veces "El ordenador y el cerebro" y arranco esta sección con él en parte para tener una excusa para leerlo de nuevo, por varios motivos: está escrito por uno de mis ídolos científicos, John von Neumann, después porque es un libro muy corto (114 páginas) y me viene perfecto como elemento de prueba, y por último porque es muy llevadero. Está escrito de forma directa, simple y clara.

El ordenador y el cerebro, tiene un formato más de paper que de libro. Esto es, creo, porque originalmente es el material de una serie de conferencias que iba a dictar John von Neumann y que no pudo por problemas de salud. Este texto está escrito desde la cama en donde murió el 8 de Febrero de 1957. 


Lo que más me gusta de este libro es que me parece que captura perfectamente la forma de pensar del autor, que fué un genio del tamaño de Leonardo Da Vinci según dicen por ahí. Está lleno de auto-preguntas y respuestas.

Así que doy por iniciada esta sección, los invito a intercambiar opiniones sobre el tema a todos, pero especialmente a quienes hayan leído el libro.

7/4/18

Indefensión aprendida, algo que puede afectar nuestro aprendizaje.

Antes de empezar tengo que aclarar que no se nada sobre el tema y que puede que escriba cualquier cosa, pero cuando por casualidad me encontré con esto me puse a pensar que puede que en otra época yo haya padecido de Indefensión aprendida cuando era totalmente incapaz de aprender matemáticas, si es así, es horrible. Entonces, comparto este concepto con el fin de que tal vez algiuen se vea reflejado y pueda empezar a cambiar ese aspecto de su aprendizaje.

El tema no tiene nada que ver con la temática del blog pero me parece muy importante, así que ahí va:

Indefensión Aprendida

Básicamamente se trata de estar convencido de que no podemos entender, aprender, hacer algo. Lo que sea. Y creo que es lo que pasa con muchos estudiantes, el artículo de Wikipedia lo pueden encontrar completo en el enlace del final, es muy corto. Lo que a continuación cito es lo que yo entendí y apunté sobre el tema:

La indefensión aprendida (o bien impotencia aprendida) es un tecnicismo que se refiere a la condición de un ser humano o animal que ha "aprendido" a comportarse pasivamente, con la sensación subjetiva de no poder hacer nada y que no responde a pesar de que existen oportunidades reales de cambiar la situación aversiva, evitando las circunstancias desagradables o mediante la obtención de recompensas positivas.

A aquellos individuos que han sido ineficaces o menos sensibles para determinar las consecuencias de su comportamiento se dicen que han adquirido indefensión aprendida.

Algunos estudios universitarios han revelado que cuando a una persona se le castiga de manera continua sin importar lo que haga, desarrolla indefensión aprendida, por lo que el sujeto deja de responder e intentar. Suele ser común en personas cuyo régimen de crianza paterna ha sido autoritario.

Fue descubierta en 1967 por el psicólogo Martin Seligman.

Referencias

Indefensión aprendida - Wikipedia, la enciclopedia libre.
Martin Seligman - Wikipedia, la enciclopedia libre.


20/3/18

Algoritmos de búsqueda: Búsqueda lineal

En una entrada anterior escribí sobre El proceso de búsqueda en informática, ahora voy a empezar a detallar los algoritmos de búsqueda comenzando por el más simple, la búsqueda lineal. No voy a usar en ésta entrada ningún lenguaje de programación, la implementación en uno o más lenguajes queda para entradas posteriores, si habrá un poco de pseudocódigo.

Busqueda lineal 

Para poder realizar una búsqueda lineal es necesario que los elementos que conforman el conjunto de búsqueda esten almacenados en una estructura lineal, por ejemplo, una matriz de una dimensión o array también conocido como vector, no es eficiente usar este tipo de búsquedas en estructuras enlazadas.

El proceso de búsqueda lineal consiste en comparar el elemento buscado con cada uno de los elementos del conjunto de búsqueda, si hay una coincidencia entre el elemento buscado y uno de los elementos se concluye que se encontró el elemento buscado, en caso de que se llegue al final de la estructura y no haya coincidencias se concluye que el elemento buscado no pertenece al conjunto de búsqueda. 

Este algoritmo es adecuado para situaciones en donde el conjunto de búsqueda no está ordenado y los elementos del conjunto son relativamente pocos, en caso de que haya muchos elementos tal vez se justifique ordenarlos primero e implementar otro tipo de búsqueda más eficiente, por ejemplo, búsqueda binaria.


Eficiencia

Este algoritmo requiere una comparación en el mejor de los casos (el elemento buscado está en la primera posición del array), n comparaciones en el peor de los casos (el elemento buscado está en la última posición, o no está) y el coso esperado es encontrar el elemento en la mitad del conjunto, entonces, en promedio se requieren n/2 comparaciones.

La complejidad del algoritmo es de O(n) porque los elementos se comparan de uno en uno, la complejidad es lineal en proporsión directa a la cantida de elementos que haya que comparar.

Algoritmo

Ahora voy a plantear un posible algoritmo para implementar el método de búsqueda lineal. Lo voy a presentar de forma escrita como una primera y bastante pobre aproximación.

- Inicio.
- Crear un array (conjunto de búsqueda).
- Leer el elemento buscado.
- Mientras haya elementos, recorrer el array.
- Comparar el elemento buscado con cada elemento del array.
- Si hay coincidencia devolver un valor true. Terminar la ejecución.
- Si no hay coincidencia devolver un valor false. Comparar el siguiente elemento.
- Si la comparación del elemento buscado con el último elemento devuelve false terminar la ejecuión.
- Fin.

Pseudocódigo según Wikipedia

Datos de entrada:
vec: vector en el que se desea buscar el dato.
tam: tamaño del vector. Los subíndices válidos van desde 0 hasta tam-1 inclusive. Puede representarse así: vec[0...tam) o vec[0...tam].
dato: elemento que se quiere buscar.

Variables: 
pos: posición actual en el vector.

pos = 0
while pos < tam
    if vec[pos] == dato:
        Retorne verdadero y/o pos.
    else:
        pos = pos + 1
Fin(While)
Retorne false, 

Conclusión

Es un algoritmo eficiente para pequeñas busquedas en un conjunto de búsqueda desordenado. Para busquedas en conjuntos de un tamaño considerable en adelante es totalmente ineficiente y conviene ordenar el conjunto y recurrir a un algoritmo más eficiente.

En lo que se refiere a su implementación es el método más simple de implementar. Las características del lenguaje necesarias para implementar este algoritmo son de las más comunes por lo que es posible implementar este algoritmo en casi todos los lenguajes.

Si bien es ineficiente no es inútil ya que cumple con su objetivo, en algunos casos se puede justificar su implementación, el uso o no de éste algoritmo queda a criterio del programador.

Referencias

Sobre el nombre del blog: El trabajador del conocimiento

El nombre del blog está tomado del concepto de «Trabajador del conocimiento», entonces, voy a explicar el concepto que explica la razón de existencia de este blog y otros proyectos que están por venir.

Trabajador del conocimiento

Se denomina trabajador del conocimiento a aquellos trabajadores cuyo principal capital es el conocimiento. Algunos ejemplos incluyen ingenieros de software, arquitectos, ingenieros, científicos, porque ellos "piensan para ganarse la vida".

Lo que diferencia al trabajo en el ámbito del conocimiento de otras formas de trabajo es que su tarea principal es la resolución de problemas “no rutinarios”.

Conclusión

Actualmente la expresión trabajador del conocimiento tiene un significado amplio, pero en el sentido en el que lo uso en este blog coincide con el apartado anterior.Entonces, ¿a qué me dedico?. Pienso para resolver problemas no rutinarios y así ganarme la vida.
Este blog existe como medio de comunicación entre mis actividades y quienes esten interesados en ellas.

                         ---

Fuente:

Trabajador del conocimiento - Wikipedia, la enciclopedia libre.

16/3/18

Virtudes del programador según Larry Wall

Larry Wall es el creador del lenguaje Perl y es el actual Benevolent Dictator for Life del proyecto Perl.

En la segunda edición del libro Programming Perl indicó las tres virtudes del programador:

1 - Pereza: Es la cualidad que te hace realizar un gran esfuerzo para reducir el total del gasto energético. Te hace escribir programas que ahorren trabajo y que otras personas encuentren útil, y documentar lo que escribes para no tener que responder muchas preguntas sobre él.
2 - Impaciencia: La ira que se siente cuando el ordenador se está volviendo perezoso. Esto te hace escribir programas que no solo reaccionan a tus necesidades, sino que se anticipen a ellas. O al menos lo pretendan.
3 - Hibris: Orgullo excesivo, la suerte de cosas que Zeus te arrebata. También la cualidad que te hace escribir (y mantener) programas de los cuales otras personas no puedan decir cosas malas.

Esas son las tres virtudes del programador a criterio de Larry Wall. 

En mi opinión, Perl está especialmente creado para estas tres virtudes del programador.