miércoles, 29 de agosto de 2012

El Algoritmo


Llegamos al meollo del problema en la lógica de programación: el algoritmo. Según López, "el algoritmo es una secuencia ordenada y cronológica de pasoso que llevan a la solución de un problema o a la ejecución de una tarea (o actividad). Los pasos del algoritmo deben tener las siguientes caracterísitcas:
  • Ser simples, claros, precisos, exactos.
  • Tener un orden lógico.
  • Tener un principio y un fin."
Vamos a ver otras cuantas definiciones.
En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo(del griego y latín, dixit algorithmus y este a su vez del matemático persa Al-Juarismi) es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son el objeto de estudio de la algoritmia.
En la vida cotidiana, se emplean algoritmos frecuentemente para resolver problemas. Algunos ejemplos son los manuales de usuario, que muestran algoritmos para usar un aparato, o las instrucciones que recibe un trabajador por parte de su patrón. Algunos ejemplos en matemática son el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para obtener el máximo común divisor de dos enteros positivos, o el método de Gauss para resolver un sistema lineal de ecuaciones.
Conjunto de instrucciones que aplicado a un número finito de datos, después de un número finito de iteraciones entrega un resultado.
En resumen vemos que son instrucciones que llevadas que al ser llevadas a cabo dan un resultado. Se espera que el resultado sea el que nosotros esperamos.

El proceso de programación


Como toda solución a un problema, el crear un programa lleva forzosamente una serie de pasos o etapas que van desde la detección y definición de un problema hasta la implementación del programa en sí mismo.
-Definición del problema. Surge cuando hay necesidad de resolver un problema con la computadora. Hay que definir y además delimitar bien el problema para que la solución sea la más adecuada. Por ahí leí que a veces el cliente no sabe el mismo qué es lo que quiere y por eso esta etapa es de crucial importancia.
-Análisis del Problema. "A continuación es necesario entender con detalle el problema en cuestión para obtener una radiografía del mismo en términos los DATOS disponibles como materia prima, y definir el PROCESO necesario para convertir los datos en la INFORMACIÓN requerida". López
-Diseño del programa.Durante este paso se procede a diseñar la lógica para la solución al problema, haciendo dos cosas:
  • Elaborar el algoritmo. Se diseña el algoritmo de la solución al problema, es decir, se estructura la secuencia lógica y cronológica de los pasos que la computadora deberá seguir.
  • Prueba de escritorio. Se simula el funcionamiento del algoritmo con datos propios respecto al problema, y se comprueban a mano los resultados con el fin de validar la correcta operación del algoritmo.
-Codificación del problema. Se procede a codificar el programa en el lenguaje de programación que vayamos a utilizar. El programa codificado debe editarse, compilarse, probarse y depurarse, es decir, se ejecuta para verificar su buen funcionamiento y se hacen las correcciones o los ajustes pertinentes hasta que quede correcto.
Siempre es posible repetir un paso o retroceder pasos con tal de que la solución que diseñemos sea la más satisfactoria.
-Implantación del programa. Una vez que el programa está correcto, se instala y se pone a funcionar, entrando en operación normalmente dentro de la situación específica para la que se desarrolló.
-Mantenimiento del programa. Un programa que está en operación, por un lado podría presentar errores, los cuales deben corregirse; por otro lado podría requerir cambios o ajustes en sus datos, procesos o información; esto implica que eventualmente necesitará mantenimiento para adecuarlo a los cambios que le impongan la dinámica cambiante de las empresas o de los problemas.

Características de un buen programa

Dice López que un buen programa debe tener ciertas características básicas que le permitan operar correctamente:

Operatividad. Lo mínimo que debe hacer un programa es funcionar; es decir, producir los resultados esperados independientemente de cualquier otra característica.

Bueno, yo diría que esta es la condición de que sea un programa o no. Si no funciona pues sencillamente no es un programa porque no ejecuta la tarea requerida. Estaríamos sólo ante la presencia de código.

Ahora bien, el autor dice que hay otras características que al programa le permitirán operar correctamente pero yo pienso que si funciona es porque opera correctamente. Las siguientes características permiten hacer algo con el programa pero no hacen que el programa sea funcional o no.

Legibilidad. Un programa puede hacerse más legible dándole cierto formato al código, utilizando el sangrado (indentación) para reflejar las estructuras de control del programa, e insertando espacios o tabuladores.

Transportabilidad. Un programa transportable es el que puede ejecutarse en otro entorno sin hacerle modificaciones importantes.

Si el programa fue requerido para poder trabajar en varios entornos y sólo funciona en algunos o en uno entonces esta característica sí se debe tomar en cuenta para medir si el programa trabaja correctamente o no. Si sólo se requiere que trabaje en ciertos entornos y lo hace no veo la razón de que sea problema y podamos utilizar prestaciones de hardware o software especiales del entorno en nuestro favor. Estoy de acuerdo sólo parcialmente con lo que dice el autor.

Claridad. Esta característica se refiere a la facilidad con la que el texto del programa comunica las ideas subyacentes.

Modularidad. Dividir el programa en un número de módulos pequeños y fáciles de comprender puede ser la contribución más importante a la calidad del mismo. Cada módulo debe realizar sólo una tarea específica y no más. Los módulos tienen la virtud de minimizar la cantidad de código que el programador debe comprender a la vez, además de que permiten la reutilización de código.

El último punto se me hace de suma importancia y no todos los programadores lo hacen a veces a propósito a veces involuntariamente. No es raro encontrar textos donde mencionan que a veces es mejor contratar a un programador para  empezar un nuevo programa de cero que contratarlo para que haga modificaciones a un programa previamente existente pues el trabajar sobre código escrito por otro no es tarea fácil. Bueno, ya lo comprobaré. Como siempre les digo, compren el libro, están tocados estos temas con mucho más profundidad.

El lenguaje de programación

Seguimos con los conceptos del libro mencionado. Esta vez veremos conceptos básicos acerca de lo que es un LENGUAJE DE PROGRAMACIÓN. Citamos a continuación el concepto:
“Un lenguaje de programación es el medio a través del cual le comunicamos a la computadora la secuencia de instrucciones que debe ejecutar para llevar a cabo actividades, tareas o solución de problemas. Todo lenguaje permite el manejo de los tres elementos que componen un programa, a saber, estructuras de datos, operaciones primitivas elementales y estructuras de control”. Leobardo López Román
Vemos que el lenguaje también, al igual que la computadora, es un medio de conseguir algo, en este caso lleva a cabo tareas o soluciona problemas.
Todo lenguaje de programación permite el manejo de los tres componentes arriba mencionados. Son la condición que nos dice si eso a lo que nos refererimos es un lenguaje de programación o no lo es. En los foros a veces veo ese tipo de discusiones, que si tal o cual cosa es un lenguaje o no, aunque he de decir que he olvidado a qué se referían en particular.
Bueno, vimos lo que un programa permite hacer pero ahora veremos los componentes que tiene, en el texto los encontramos como características, pero yo prefiero componentes:
ALFABETO O CONJUNTO DE CARACTERES. Es el conjunto de elementos estructurales del lenguaje:
a) Caracteres alfabéticos (letras minúsculas y mayúsculas).
b) Caracteres numéricos (0 al 9).
c) Caracteres especiales (&,%,#, /…).
VOCABULARIO O LÉXICO. Es el conjunto de palabras válidas o reservadas en el lenguaje (o sea palabras que no podemos usar los usuarios salvo en condiciones especiales). Por ejemplo, las palabras program, begin, end, if, then, else…
GRAMÁTICA. Es el conjunto de lineamientos que se deben seguir para construir frases, oraciones e instrucciones. Mediante la gramática o sintaxis logramos transmitirle a la computadora lo que deseamos. Por ejemplo, para leer datos debemos seguir cierto lineamiento, también para imprimir, etcétera.
Siempre quise aprender a programar y con el tiempo me di cuenta que no era tan fácil. De alguna manera siempre estuve vinculado a este mundo, comprando libros, intentando hacer cosas. Finalmente llegué a la lógica de programación y bueno, en eso estamos.
Compren el libro Programación Estructurada y Orientada a Objetos, del autor Leobardo López Román

Algunos conceptos sobre programación

Las clases en la UNAD (antes ESAD) han reiniciado y debido a eso he pensado en pisar el acelerador con respecto a la programación. En la Faculdad de Derecho ya sólo curso dos materias y ademàs son muy ligth, entonces es necesario darle más a la ingeniería.

Tengo un librito del que ya he hablado Programación estructurada y orientada a objetos. Un enfoque algoritmico, el autor es Leobardo Lòpez Morán. Sòlo le he medio empezado pero se ve bien en tèrminos generales. El autor es mexicano y me da gusto que haya mexicanos escribiendo estos temas. Voy a enlistar algunos conceptos que me parecen importantes del librito y espero terminarlo para antes del pròximo cuatrimestre en el cual ya estarè de lleno en los temas de programaciòn. Bueno, empecemos.
El primer capítulo se llama Introducción a la programación. Hay varios conceptos importantes pero antes pondrè algo que viene al final del prefacio:

"Aprender a programar no es fácil ni rápido; es un proceso que debe iniciar con el desarrollo de la lógica usando un pseudolenguaje de diseño de programas o algoritmos. Con el estudio de la metodología y fundamentos de programación que le presento en este libro, el estudiante aprenderá la lógica de programación estructurada y una introducción a la programación orientada a objetos sin estar "casado" con ningún lenguaje; y de aquí en adelante podrá aprender y comprender cualquier lenguaje estructurado u orientado a objetos como C, C++, Java, C#, UML, etcétera".   El autor

Bueno, pues me parece razonable lo que dice Leobardo López. Es natural el querer estar programando inmediatamente y más aún el querer que el poco código que hagamos sirva para cosas elaboradas y vistosas, pero nada más alejado de la realdiad, es como la música, uno debe aprender muchas cosas antes de poder ejecutar un instrumento con maestría.

Vamos a los conceptos:

Computadora: Es una herramienta que se utiliza para representar cualquier situación de la realidad en forma de datos, los cuales se procesan después para generar información.

Existe un mundo infinito de situaciones representables en la computadora, el autor menciona algunas mu pràcticas: control de inventarios, control de producción, control de compras, control de ventas, pago de sueldos (nómina).

DATOS*----------->PROCESO----------->INFORMACIÓN
* Se toman de las situaciones reales

Toda situación que pueda ser abstraída y representada enforma de datos, puede manejarse mediante la computadora. Por ejemplo, en una situación de pago de sueldos (nómina), un trabajador puede representarse mediante los datos: Nombre del empleado, número de horas trabajadas y cuota por hora. El sueldo se obtiene multiplicando el número de horas trabajadas por la cuota por hora. Y se da como salida el nombre y el sueldo. Tanto los datos como el procedimiento necesario para generar la información, se suministran a la computadora en forma de un programa constituido por instrucciones. La computadora interpreta y ejecuta las intrucciones del programa de acuerdo con ciertas reglas de sintaxis que conforman el lenguaje de programación, mediante el cual podemos comunicarle lo que debe hacer.

Me gusta que a la computadora la llame herramienta. El ejemplo que da el autor acerca del pago de sueldos a trabajadores es en sí un miniprograma. Está explicando el autor de qué se trata todo el asunto en unas cuantas líneas. Bien por esa.

Elementos básicos

Los elementos básicos que componen una computadora son la unidad central de proceso, la unidad de memoria, la unidad de entrada y la unidad de salida.

La unidad central de proceso es el "cerebro" que controla el funcionamiento de los componentes y ejecuta las operaciones aritméticas y lógicas.
La memoría se utiliza para almacenar los datos, y a éstos se les aplican las operaciones del procesador. Existen dos tipos de memoria, la principal y la auxiliar. La memoria principal le permite al procesador extraer y almacenar datos a una velocidad comparable con la propia(1). Cada operación propicia por lo menos un acceso a la memoria. Para que el procesador pueda avanzar de una operación a la siguiente sin retraso, el programa de instrucciones se almacena en esta memoria; en otras palabras, la memoria principal guarda tanto las instrucciones como los datos sobre los que actúa el procesador central(2). La memoria principal está limitada por su alto costo(3); debido a esto no es posible conservar en ella grandes cantidades de datos e instrucciones y, en consecuencia, sólo se utiliza para guardar lo que el procesador esté utilizando por el momento. Además tiene la característica de que no permite almacenar datos permanentemente, pues si se apaga la computadora se pierde lo que haya en memoria(4). Por tales razones, las computadoras están equipadas con memorias auxiliares para almacenamiento masivo y permanente de datos, tales como discos magnéticos, discos compactos... Estos dispositivos tienen más capacidad que la memoria principal pero son más lentos. Los datos pueden almacenarse en ellos de manera permanente, es decir, pueden guardarse para usos posteriores.
  • (1) Eso de las velocidades necesita mayor profundidad. 
  • (2) Me hubiera gustado una explicación más detallada y unificación de términos, 
  • (3) Supongo que se refiere a que consume muchos recursos.
  • (4) Supongo que es como cuando estás utlizando el procesador de textos en un nuevo documento y todo lo que estás escribiendo en tanto no guardes en la memoria está en al memoria principal y si por error apagas la computadora pues pierdes lo que hayas guardado. Claro que eso es lo que entiendo y puede ser un error. Me gustaría que el autor fuese más claro.
El autor puso en su libro un diagrama que describe la organización funcional de una computadora. Me gusta, es claro. Véanlo, compren el libro.

El programa

Un programa es un conjunto de instrucciones que guían a la computadora para realizar alguna actividad o resolver algún problema; en el programa se ejecutan diferentes acciones de acuerdo con los datos que se estén procesando.

Un programa se compone de estructuras de datos, operaciones primitivas elementales y estructuras de control.

Estructuras de datos. Son las formas de representación interna de la computadora. Los hechos reales, representados enforma de datos, pueden estar organizados de diferentes maneras llamadas estructuras de datos.

Operaciones primivitas elementales. Son las acciones básicas que la computadora "sabe hacer", y que se ejecutan sobre los datos para darles entrada, transformarlos y darles salida convertidos en información.

Estructuras de control. Son las formas lógica de funcionamiento de la computadora mediante las que se dirige el orden en que deben ejecutarse las instrucciones del programa. Las estructuras de control son: La secuenciación, que es la capacidad de ejecutar instrucciones secuenciales una tras otra. La selección es la capacidad de escoger o seleccionar  si algo se ejecuta o no, optar por una de dos o más alternativas, y la repetición, que es la capacidad de realizar en más de una ocasión (es decir, varias veces) una acción o conjunto de acciones.

Bueno, hasta aquí esta entrada.

Primeros Algoritmos

En la unidad 1 del libro de Leobardo López Román viene al final una lista de ejercicios propuestos para ir calentando en esto de los algoritmos. Bueno, voy a tratar de dar mis respuestas a los ejercicios.

A. Elaborar un algoritmo para hacer palomitas de maíz en una cacerola puesta al fuego, usando sal y maíz.

1. Abrir la bolsa de maíz.
2. Vaciar la bolsa en la cacerola que está al fuego.
3. Agregar sal a la cacerola.
4. Tapar la cacerola.
5. Esperar hasta que los granos de maíz hayan reventado.
6. Apagar el fuego.
7. Esperar a que se enfríe la cacerola.
8. Fin
Este algoritmo parece estar incompleto o no, pero sucede que tampoco nos da muchos datos y suponemos muchas cosas. Con la práctica supongo que haré unos más detallados pero al parecer no es objetivo del ejercicio que detalle tan a fondo.
B. Elaborar un algoritmo que permita cambiar un vidrio roto de una ventana.
Suponemos que ya tenemos el vidrio de repuesto, el pegamento y que no hay que subir a ningún lado.
1. Despegamos el vidrio roto.
2. Quitamos el vidrio roto.
3. Tomamos el vidrio de repuesto.
4. Colocamos el vidrio de repuesto.
5. Pegamos el vidrio de repuesto.
6. Fin
C. Elaborar un algoritmo para cambiar un neumático pinchado.
1. Orillarse.
2. Detener el auto.
3. Poner el freno de mano y encender las señales de peligro.
4. Apagar el auto.
3. Bajar del auto.
4. Cerrar la puerta.
5. Abrir la cajuela.
6. Sacar la llave de cruz.
7. Sacar un plástico o cartón
8. Sacar la llanta de refacción.
9. Sacar el gato hidráulico.
10. Poner el cartón o plástico cerca de la llanta ponchada para tener área limpia de trabajo.
11.  Tomar la llave de cruz.
12.  Con la llave de cruz dar dos vueltas a cada birlo en contra de las manecillas del reloj para aflojarlos.
13. Dejar la llave de cruz
14. Tomar el gato.
15. colocar el gato en detrás de la llanta delantera o enfrente de la llanta trasera
16. Gire la manija del gato en el sentido de las manecillas del reloj, hasta que la llanta ponchada esté 5 ó 6 centimetros por encima del suelo.
17. Tome de nuevo la llave de cruz.
18. Quite un birlo completamente
19. Póngalo en un lugar seguro.
20 Haga lo mismo con el resto de los birlos.
21. Deje la llave de cruz.
22. Sostenga la llanta ponchada con firmeza.
23. Jale derecho hacia afuera.
24. Ponga la llanta ponchada debajo de la carrocería o suspensión del automóvil, por si el gato se desliza todavía será soportado.
25.Tome la llanta de refacción y colóquela en el tambor.
26. Tome un birlo y colóquelo donde le corresponde.
27. Apriételo manualmente.
28. Haga lo mismo con el resto de los birlos.
29. Gire el gato de manera opuesta hasta que el auto baje al suelo.
30. Cuando el peso ya no esté en el gato, remuévalo de abajo del auto.
31. Ponga a un lado el gato.
32. Tome la llave de cruz.
33. Apriete completamente un birlo.
34. Repita la operación con el resto de los birlos.
35. Saque la llanta ponchada que está debajo del auto.
36. Guarde la llanta ponchada en la cajuela.
37. Guarde el gato en la cajuela.
37. Guarde la llave de cruz en la cajuela.
38. Guarde el plástico o cartón en la cajuela
39. Cierra la cajuela.
40. Fin
D. Elaborar un algoritmo para hacer una llamada telefónica. Supongo que ya estoy parado en frente de un teléfono público y las monedas las tengo en la mano derecha.
1. Descolgar auricular con mano izquierda
2. Llevar el auricular a la oreja izquierda.
3. Esperar a escuchar el tono de marcado.
4. Con la mano derecha introducir las monedas en la ranura del teléfono.
5. Con la mano derecha marcar el número
6. Esperar a que conteste es destinatario.
7. Dar el mensaje.
8. Colgar con mano izquierda el auricular en el lugar en donde se descolgó.
9. Fin.
E. Definir "su" robot, es decir, lo que sabe hacer tomando como referencia lo que usted hace, y elaborar un algoritmo que lo lleve desde que se despierta por la mañana hasta que llega a la escuela, trabajo o algún otro lugar.
Supongo que el robot sabe identificar rutas visualmente y además que en el cuarto de baño hay ropa para cambiarse.
El robot sabe.
a. Levantarse de la cama.
b. caminar.
c. detenerse.
d. ponerse sandalias.
e. quitarse sandalias.
f. Abrir puerta y entrar.
g. desvestirse.
h. vestirse y guardar ropa sucia.
i. abrir el refrigerador.
j. sacar alimentos del refrigerador.
h. preparar desayuno.
i. sentarse.
j. comer.
l. bajar escaleras.
m. cerrar puerta.
n. bañarse.
ñ. secarse.
o. cepillarse los dientes.
p. bajar escaleras.
q. cruzar la calle.
r. pagar importe de pasaje.
s. subir al transporte.
t. verificar si hay lugar para sentarse en transporte.
u. levantarse de asiento o silla.
v. bajar de transporte.
w. lavarse los dientes.
x. peinarse.
y. rasurarse.
z. aplicar complementos de aseo (desodorante, loción, etc.).
z1. Tomar cartera y celular.
z2. Esperar el transporte.
Algoritmo.
Para ahorrar tiempo lo haré con claves:
1. a; 2. d; 3. b hasta la puerta; 4; c; 4.1. 4.2. m; 5. b hasta la puerta del baño; 6. c frente a la puerta del baño; 6.1. f; 7. b hacia el interior del baño; 8. c; 9. e; 10. g; 11. d; 12. b hasta el área de la regadera; 13. n; 14. ñ; 15.h; 16. x, y; 17. b hasta la puerta del baño; 18. c; 19. f; 20. b hasta el refrigerador que está en el comedor; 21. c; 22. i; 23. j; 24. h; 25. i en una silla frente a la mesa del comedor; 26. j; 27. u al terminar de comer; 28. b hasta el lugar del aseo personal; 29. c. 30.  o; 31. z. 32. b hasta la sala; 33. c; 34. z1; 35. b hasta la puerta principal. 36. c; 37. f; 38. m; 39. l hasta llegar a la salida del inmueble; 40. b hasta la parada del bus; 41. c; 42. z2; 43. s; 44. r; 45. t; 46. En caso de encontrar lugar b hasta el asiento vacío; 47. en caso de 46 c sino b hasta la puerta de descenso, c  y esperar al lugar destino; 47. En caso de 46 i en asiento vació hasta llegar al destino; 48. En caso de 47 al llegar al lugar destino u, b hasta la puerta de descenso y v; 49. En caso e no 47 v en el lugar de destino; 50. b hasta puerta del trabajo; 51. c; 52. f; 53. Fin
Bueno, este es el algoritmo, la verdad es que así sin estructuras de camino alternativo, secuencia, etcétera es muy complicado. Por supuesto es erróneo en varios puntos pero como ejercicio me fue interesante. Pienso que es muy importante hacer la lista de requerimientos muy bien porque si no van a hacer como yo, ir metiendo puntos extra aunque supongo que a la hora de codificar es común pero más si no se planea ya que puede ser que se eche a perder el esfuerzo. Bueno, sigo aún en la unidad dos. Suerte.

Algoritmos 1


Sigo leyendo el libro Programación estructurada y orientada a objetos. Un enfoque algorítmico, de Leobardo López Román, me sigue pareciendo bueno o muy bueno, salvo algunos detalles de redacción y algunas ambigüedades.
A continuación les mostraré una técnica de estudio que puede servir para estudiar efectivamente libros, no sólo de programación sino en general. Continuamente se nos pide como estudiantes que leamos tal o cual libro y que además típico que sobre esa lectura tendremos que hacer examen. Bien, yo he leído muchos muchos muchos libros, de muchísimos temas. Es fácil leer cuando tienes tiempo o son temas más bien divertidos o no muy demandantes mentalmente, pero, hay otro tipo de libros, de muchos conceptos por aprender, o complicados por enunciar leyes o datos históricos y que a menos que el tema que estemos leyendo se nos haga lo más divertido del mundo pues nos acabará por cansar, no nos aprenderemos nada o muy poco y el examen que hagamos no será muy fácil de resolver por nosotros. ¿Qué hacer? Mmm supongamos que estamos en el supuesto del examen, lo primero que hago es hojear el índice (sí ya sé que parece técnica barata de libro de lectura rápida) y pues no lo leo tan al detalle pero sí me da una pequeña idea de lo que me voy a encontrar. Generalmente leo el prólogo y la introducción pues me gusta lo que piensa el autor o alguien cercano al libro acerca de este. No olvidemos que una obra literaria tiene detrás de sí el trabajo de personas, del autor, del editor, del revisor, etcétera; es una obra humana y en sí misma es interesante. Pero volvamos al examen, el siguiente pasó sería leer la primera parte de cada capítulo, en ella generalmente se exponen los puntos básicos que tocará cada capítulo. Generalmente los profesores son flojos y tampoco van a preguntar cosas muy complicadas y además si tienen un poco sentido común también preguntarán los conceptos más importantes y eso viene en la primera parte de cada capítulo. Este paso es importante porque en el caso de que vayamos a hablar en público del libro ya nos podremos defender bien, hablaremos de lo más importante del libro, además este paso tiene encerrado otro propósito muy importante, nos da un panorama acerca de hacia donde va el libro, qué pretende demostrar o mostrar. Insisto en este paso  porque es parecido a cuando vamos emprender un viaje largo; sin saber hacia donde se va hasta el viaje más corto puede resultar tedioso sobre todo cuando nos implica esfuerzo, y leer un libro es como  una caminata que puede ser divertida si sabemos qué cosas interesantes podemos ir observando en el camino, pero si no lo sabemos será sin duda más difícil. Todos nosotros (o casi todos) hemos extraviado la ruta a la hora de querer llegar a un destino y aunque sólo hayamos caminado un poco para encontrar el lugar que buscábamos, el hecho de sentirse extraviado hace que todo parezca el triple de largo, lo mismo pasa con los libros, es mejor tener un mapa de todo él antes de querer leerlo a fondo, eso nos lo dará leer la primera parte de los capítulos. Por último yo leería los primeros párrafos de cada sección, confíen en mí, los profes buscan sus preguntas ahí y lo que es más, lo más importante debe entrar antes a su mente y está en donde les digo, si ustedes hacen hasta aquí lo que les recomiendo irán el triple de rápido sobre el libro y no les parecerá tan tedioso pues ya saben el destino al qué llegar y puede ser que el libro ya no parezca tan aburrido. Ya si quieren leer todo el resto del libro pues ya será cosa se niños.
Bueno, eso hice con el libro del que  hablo al principio, en todas las primeras partes da los conceptos más importantes y ya tengo un mapa mental de qué es lo que voy a aprender y el lugar al que voy a llegar. No es fácil, para nada, pero me permite poder avanzar con mayor rapidez. Algo que también repite una y otra vez en cada primera parte de los capítulos es que si el estudiante no hace algoritmos no aprende, lo cual tiene su lógica. Así las cosas avancé hasta el capítulo 9 que más bien trata de conceptos básico y algoritmos básicos con pseudocódigo y ya terminé el primer capítulo totalmente (bueno, faltan los ejercicios que obviamente voy a realizar) y podré seguir adelante.
A realizar los algoritmos se ha dicho. Pronto más noticias.

Nuevo Libro


Sigo revisando bibliografía con relación al desarrollo de software. Ayer fui al sótano y estuve hojeando varios, de C++, de HTML5 (que extrañamente sólo encontré uno), de JAVA, etc. No compré ninguno y regresé de noche a casa. Sigo pensando en que las bases son importantes por eso busco libros y más libros; empezar bien ahorra mucho tiempo, mucho esfuerzo. Existe un libro que encontré ya en varias librerías llamado Programación estructurada y orientada a objetos. Un enfoque algorítmico, de Leobardo López Román. Me sorprendió mucho el saber que el autor es mexicano, casi todo lo que encuentro de ese tipo es norteamericano; hoy fui a casa del libro y lo compré. He leído las primeras hojas y queda reforzada mi idea de la importancia del trabajo en las bases pues lo mismo piensa el autor. Además el autor también recomienda empezar en C o C++ en lugar de JAVA o algún otro lenguaje a la hora de empezar a estudiar un lenguaje de programación, sin embargo recomienda ampliamente no meterse en lenguajes sin antes aprender a usar el pseudocódigo y aprender las estructuras básicas, la programación estructurada, aprender la lógica de programar. Pues vamos a hacerle caso, vamos a aprender lo que el hombre dice, hay que saber escuchar a los que son muy buenos y por lo poco que he leído del libro, es tipo está muy metido en su trabajo, es bueno.
Cito algo que dice el autor que me gustó, es con respecto a programar:
"Aprender a programar no es fácil ni rápido; es un proceso que debe iniciar con el desarrollo de la lógica usando un pseudolenguaje de diseño de programas o algoritmos. Con el estudio de la metodología y fundamentos de programación que le presento en este libro, el estudiante aprenderá la lógica de la programación orientada a objetos sin estar "casado" con ningún lenguaje; y de aquí en adelante podrá aprender y comprender cualquier lenguaje estructurado y orientado a objetos como C, C++, Java, C#, UML, etcétera".
Lo anterior me da confianza en el autor, sabe que aprender lleva tiempo, esfuerzo, disciplina, dedicación.
Suerte programando.

La importancia de la vocación


Ayer estuve visitando zapaterías y muy metido en eso del 14 de febrero que ya se acerca. Le regalé a mi novia un libro de Vargas Llosa como presanvalentín. Quería comprarme algo que hablara de programación pero los libros que vi no me llamaron la atención. Compré un libro de todas formas que habla de la vocación, un tema por demás difícil. Recuerdo las clases de orientación vocacional en la vocacional (así se conocen algunas escuelas de nivel preparatoria de México), eran una tomada de pelo y creo que esos profes son los más miserables de todos, perdidos en un mar de niños que no les escuchan. La vocación es un llamado, algo que se siente, un sentido de misión y de bienestar a la vez, es como un desahogo del alma. Yo sentí esto de la programación hace ya muchos años, pero ya estaba enrollado en otras cosas que también me gustaban, no quiero decir que la economía no me gustara, todo lo contrario, me gusta mucho, pero en ciertos aspectos la sufro también. Los posgrados en economía los encuentro tan inútiles y la teoría que dan en las escuelas tan fuera de verdad que sencillamente yo no puedo enseñar economía (tradicional) y tampoco puedo estar en un posgrado de economía, lo sufriría muchísimo, una enormidad, de hecho ya sufro mis clases derecho-económicas llenas de tanto sinsentido y de maestros tan torpes.
Con la ingeniería de software no me pasa eso, con el diseño web, con los lenguajes, no me pasa eso, siempre quiero aprender y lo disfruto. La carrera en la ESAD sencillamente fue la respuesta del destino a mis plegarias cuando vio que yo ya había hecho lo que podía desde el lado jurídico-económico, ya había "limpiado mi karma", no quiero decir que no vaya a hacer más cosas en esos rubros, sí que haré y mucho, pero ya estoy más comprometido con la ingeniería. No me hubiera gustado dedicarme al software desde niño, es decir, me gusta todo lo que he aprendido, me ha forjado un carácter, una identidad, un criterio propio, la economía y el derecho me hicieron pensar en cosas que nunca se me hubieran ocurrido y me enseñaron a ver con otros ojos mucho más claros. Ese conocimiento lo seguiré usando para toda la vida, sin duda, pero me enfocaré más en la ingeniería. ¿Cómo se que esa es la vocación? Es sencillo, es lo que me mantiene despierto como hoy, escribiendo a los 00:44 cuando debo despertarme a las 7:00. Soy afortunado, sé lo que quiero y debo reconocer que a ese estado nunca llegué en economía, mucho menos en derecho, de alguna manera siempre me pesaron, de alguna manera mi interior sabía que tenia que llegar hasta aquí, algún día. ¿Cómo sé que es esto mi vocación? Es fácil, puedo escribir al respecto mucho, mucho, sé que puedo aprender mucho también y rápido y bien. Espero que si alguien lee estas líneas algún día sepa de qué le hablo, lo sienta, si no lo siente con respecto al software, a la programación, a todos esos temas, es mejor cambiar de rumbo, pero ya, ¡sal de este sitio y busca tu propio destino! Tengo 33 años, no me siento viejo para ser ingeniero en software, me siento en la mejor forma mental de mi vida, siento que todo lo estoy comprendiendo, que puedo hacer muchas cosas. Estos conocimientos se parecen a cuando sabes varios idiomas ya que siempre habrá necesidad de maestros que los enseñen, siempre habrá necesidad de gente que sepa programar; esto no es como ser futbolista.
Algún día cuando ya me desempeñe a buen nivel editaré estas entradas y haré un libro descargable o mejor impreso, o ambos. Quiero que el que lo lea aprenda de lo que yo pasé, lo que tuve que luchar, que evite cometer mis errores y que compartamos nuestro gusto por estos temas. Nada me gustaría más que hubiera un libro que fuera algo así como "Ingeniería avanzada de software", estaría de fábula. Debo dormir, nos leemos pronto.

Bye

El insoportable inicio del aprendizaje de un lenguaje de programación


Hoy a pesar de que leí más sobre ingeniería de software no comentaré nada de eso al respecto. He decidido escribir sobre algo que yo creo que a todos los que somos novatos en esto de los lenguajes nos pasa. No me refiero a la famosísima frase de "¿qué lenguaje de programación es mejor para aprender a programar?" sino que me refiero a lo que sigue, es decir, ok ya te decidiste por un lenguaje pero para empezar a aprenderlo está uffff lentísimo. Por qué digo esto, bueno, alguna vez jugué poker online de manera semiprofesional y el poker pues tiene la ventaja de que aunque no sepas nada sólo te basta abrir una mesa y ya estás jugando y con suerte ya estás ganando, vas aprendiendo leyendo libros, foros, aquí y allá y va mejorando tu juego y eventualmente puedes llegar a salir even o hasta convertirte en un jugador ganador. La ventaja del poker que yo le encuentro es que juegas desde el primer minuto, ya, no hay esperas, no tienes que leer un librazo de 1000 páginas para sentir la emoción de jugar. Del lado de la programación pues no pasa igual, o sea para hacer un programa decente, ya con su grado de complejidad, pues te va a costar bastante y los libros no ayudan, te puedes encontrar muchos libros en el mercado que al abrirlos como neófito de la programación pues nos dan la idea de que no llegan a nada en concreto, páginas y páginas de código, instrucciones, sentencias, más código, y no parece que estén haciendo algo divertido. Claro que poker y programación no tienen la misma naturaleza y eventualmente el primero te puede dejar en la ruina, de hecho un jugador ganador es rarísimo de encontrar, la mayoría pierde. Le he hecho a los "hello world" en varios lenguajes, mmm, el que más me gustó fue ruby, es rapidísimo, bonito; también le hice a python pero me aburría, no sé, nunca me sentí cómodo con él. Trato de aprender C++ pues parece ser el lenguaje que usan en la ESAD y he leído que es una buena base para otros programas. Todavía no lo encuentro muy atractivo y deberé buscar un libro o dos que valgan la pena, de hecho ya los estoy checando. He encontrado (todos en inglés):

Object-Oriented Programming in C++, 4th Edition

Introduction to Design Patterns in C++ with Qt, 2nd Edition

Starting Out with C++: Early Objects, 7th Edition

Data Structures and Algorithms in C++, 2nd Edition

C++ Programming: Program Design Including Data Structures, 5th Edition

A ver por cuál me decido para ya empezar a darle una hojeada.
Nos vemos luego, bye.

Otro libro

Ya había comentado que compré dos libritos. Este del que voy a hablar lo adquirí en la casa del libro y me salió medio carito, anda en los $200.- y pues bueno, ya lo tengo y lo he estado leyendo detenidamente.
El libro se llama Construcción Lógica de Programas. Teoría y problemas resueltos y está escrito por Luis García Sánchez y otros tres autores. La editorial es ALFAOMEGA y para variar es de España.
Es de un enfoque diferente al otro. El primer libro del que hablé tenía una estructura muy a la gringa, muy parecida a la mayoría de textos que leí por ejemplo en economía o biología. Sin embargo este libro que es español tiene un estilo distinto, tal vez un poco desordenada, pero sin duda tiene cosas interesantes. En él se propone un método llamado Construcción Lógica de Programas (CPL) . Este lo voy a comentar desde la introducción. El libro pone en claro que el tipo de programas en los que se va a centrar es en los de gestión (o administración como le decimos más en México).
El método CPL a decir de los autores permitirá al que lo estudie construir programas y módulos/componentes de programas, con alta calidad. Calidad para ellos es que esté fundamentado en dos principios: buen diseño y correcta operación del programa. El buen diseño facilita que el programa se pueda actualizar y modificar, principalmente por otros programadores. La correcta operación del programa se enfoca a la realización de pruebas que verifiquen que el programa funciona y que además sirve bien para el propósito que se deseaba.
Textualmente dice al respecto del CPL:"Los fundamentos del método CPL proporcionarán las bases para que el programador comprenda y sepa aplicar los principios de la ingeniería del software, a la vez que le permita evolucionar hacia el desarrollo de actividades de análisis y diseño del sistema, delegando las actividades de codificación a herramientas generadoras de código".
Claramente se pone más acento, al igual que en el otro libro, en el planteamiento lógico del programa más que en el dominio de un lenguaje de programación, por algo será.
Luego vienen unos conceptos básicos, algunos por su importancia los citaré a continuación:
  • "Codificación: Es una transformación que representa los elementos de un conjunto mediante los de otros, de forma que a cada elemento del primero le corresponde un elemento distinto del segundo."
Está algo áspera la definición pero es la que viene en el libro. Se observa que para entenderla hay que tener nociones de teoría de conjuntos.
  • "Instrucción: Es una orden de operación o tratamiento de datos que recibe el computador".
  • "Programa: Es un conjunto ordenado de instrucciones que se dan al computador para indicarle las operaciones o tareas que se desean realice."
  • "Lenguaje de programación: Conjunto de sentencias que deben ser escritas conforme a unas reglas que constituyen la gramática del lenguaje de programación."
Es algo extraño para mí que haya conceptos en la introducción, me hubiera gustado que fueran introduciendo los conceptos a lo largo del libro o todos en un glosario.
Viene una parte que creo que es útil, y es la relativa a los tipos de software:
  • "Software de Control: Es el conjunto de programas que controlan el funcionamiento de los programas que se ejecutan y que administran los recursos hardware, haciendo que el uso del computador sea más eficiente (sistema operativo)."
  • "Software de diagnóstico y mantenimiento: Con este software se pretenden localizar de forma automática las averías de un determinado dispositivo o circuito".
  • "Software de tratamiento: Es el conjunto de programas que sirven para resolver problemas de usuarios o realizar sus aplicaciones (procesador de textos, hojas de cálculo, bases de datos, correo electrónico, gráficos). También existen paquetes para las aplicaciones citadas."
La última definición de los tipos de software me gustó. Seguiremos en otro post.
Bye

Lógica de Programación (parte 2)

"Una vez que se han introducido instrucciones en el ordenador y traducido al lenguaje máquina, un programa se puede arrancar o ejecutar." p 8.
"La tarea de un programador se puede dividir en seis pasos de programación:
1. Entender el problema.
2. Plantear la lógica.
3. Codificar el programa.
4. Traducir el programa a lenguaje máquina.
5. Probar el programa.
6. Poner el programa en producción." p. 10.
Entender el problema es importante no sólo para cuestiones de programación sino para cualquier tipo de cuestión. Entender el problema es más de la mitad del proceso para su resolución. Los programadores cobran por hacer programas que ayudan a otros a realizar ciertas tareas obteniendo ciertos resultados pero no es raro encontrarse con que el cliente del programador no sabe en sí qué quiere obtener. El programador es igual en cierto sentido que otros diseñadores, le va dando consejos al cliente así como va también tratando de entenderlo. Nosotros como futuros programadores tenemos que ser muy cuidadosos en este punto porque el cliente es el que paga. Hay qué hacer lo que el cliente pida ni más ni menos.
En lo que toca a plantear la lógica del programa es cuando se ve quién es el verdadero programador. Aquí hay que plantear los pasos que se van a seguir para la resolución del problema como el orden de ellos. Es lo que muchos llaman como "desarrollar el algoritmo" que es una secuencia de pasos necesaria para resolver un problema. Hay dos formas típicas de plantear la lógica del problema: con pseudocódigo y con diagramas de flujo.
Aquí el programador no se preocupa por la sintaxis, no se preocupa por el lenguaje de programación, sólo se preocupa por plantear la secuencia de sucesos que le llevarán a los datos de salida deseados dado unos determinados datos de entrada.
Codificar el programa se refiere a escribirlo en un lenguaje de programación. Aquí si que seremos cuidadosos en la sintaxis.
Para traducir el programa a lenguaje máquina se utiliza un traductor (como en el caso de los lenguajes JAVA o Basic, "sólo gracias a que alguien ha escrito un programa traductor (un compilador o intérprete) que cambia el lenguaje de alto nivel (similar al inglés) con el que el programador escribe a lenguaje de bajo nivel que el ordenador entiende". Un compilador no razona, vamos que no siempre sabe qué le queremos decir ni cuál sería la corrección adecuada en caso de tener un error en la sintaxis, pero sí sabe cuando esta última tiene algo erróneo.
Por último hay que probar el programa. Puede que nuestro programa esté libre de todo error de sintaxis, pero como ya dijimos, puede que aún así tenga errores lógicos y entonces nos dará algo a la salida diferente de lo que queríamos. Hay que probar el programa con muchos datos y hay que saber elegir qué datos utilizaremos para probar.
Y ya una vez probado el programa, el cliente lo podrá usar. Este proceso puede ser de un instante o tardar meses o años, cuando hay que sustituir a programas viejos en grandes organizaciones y hay que hacer todo tipo de adaptaciones, incluida la incorporación de nuevo hardware.

Lógica de Programación (parte 1)

Fui a comprar unas cosas al centro de la ciudad y aproveché el trayecto para leer el otro librito de programación que ya había mencionado. Es un poco más amplio y habla más en general de la programación. Se especializa en el establecimiento de la lógica de programación, paso antes de escribir el código. Pienso que es correcto el que me enfoque en querer dominar la lógica de la programación, es como aprender teoría musical, composición, relaciones entre sonidos, entre acordes, todo eso.

El libro del que hablo se llama Iniciación a la Programación. Lógica y Diseño y está escrito por Joyce Farrel. He leído parte del capítulo 1 que se llama Visión General de los Ordenadores y la Lógica.
Sé que puede parecer arduo aprender lógica, aunque para el caso de programación no se aprenden silogismos ni esas cosas, más bien se aprende a plantear un problema, a ver sus partes, sus interrelaciones, a plantear una solución, a probarla. Seguramente muchos de mis futuros compañeros tratarán de evitar esta parte pero pues allá ellos, lo mismo ocurre en todos los campos del conocimiento, estoy seguro, sobre todo en las ciencias sociales. Yo como estudiante de las ciencias sociales me topo muy seguido con planteamientos románticos pero absurdos en torno a la sociedad. Esos planteamientos no pasan ni las más mínimas leyes lógicas, ya esbozadas por Parménides el Grande hace más de 25 siglos. De verdad que mucho esfuerzo, mucha hambre y mucha sangre se ahorraría la humanidad si los supuestos científicos sociales se pusieran a analizar lógicamente sus teorías. Del lado de la programación no hay falla, o sea, cuando te contraten como programador o das la solución o no la das, es como saber inglés, o lo sabes o no. Puede ser que tengas un título, un certificado, una bendición, pero lo debes demostrar y una de las cosas que tiene la programación es que además de la comprobación lógica tenemos la comprobación empírica (funciona tu programa o no). Bueno pasemos al capítulo 1 del libro. Antes debo decir que si escribo lo que voy aprendiendo es fundamentalmente para que yo mismo lo vaya estudiando y mi aprendizaje sea significativo, además de que cuando me pidan los conceptos sólo haré copy/paste y pues no podrá decirme el facilitador que lo copié porque no te puedes copiar a ti mismo.
Tips interesantes del libro:

"... para poder escribir buenos programas, debes aprender primero alguna terminología básica sobre ordenadores, y luego debes construirte una base firme en la lógica de la programación" p. 5.

Ni qué decir, es como en economía, la gente común ve los libros de economía, llenos de números y planteamientos matemáticos y se imagina que es mucho muy difícil aprender los fenómenos del mercado pero nada más lejos de la realidad. Si aprendes los principios básicos de la acción humana, puedes analizar prácticamente cualquier fenómeno del mercado y llegar a conclusiones correctas. Una ley importante en economía es la "ley de la utilidad marginal decreciente". Por sí misma esta ley explica la mayoría de los fenómenos del mercado. Para una comprensión rápida chéquense la Nueva introducción a la escuela austriaca de Gabriel Zanotti.

  • "El software de ordenador consiste en odas las instrucciones que controlan la entrada de los datos, cómo se procesan y la forma en que salen o son almacenados" p. 7.
  • "Las instrucciones para la máquina se escriben en un lenguaje de programación [...] Algunos programadores trabajan exclusivamente en un lenguaje; otros conocen varios y utilizan el que parece más apropiado para la tarea en cuestión" p. 7.
Mucho tiempo me debatí en qué lenguaje de programación aprender. Mi conclusión con respecto a esto y después de haber leído cientos de foros es que depende qué quieras hacer. En la ESAD aprenderemos al principio C++ y pues mejor me voy por ahí. Es mucho más importante poder plantear la solución lógica a un problema de programación que aprender un lenguaje aunque en primera instancia parece al revés. Esto es algo así como la serie House; en ella el dr. House puede que no sea tan hábil como sus colaboradores para tareas muy específicas en la medicina, pero él es el gran generalista que tiene la visión para poder reunir los cachos de información que tiene de las enfermedades junto con las opiniones de expertos y eventualmente saber qué mal le aqueja al enfermo y en su caso determinar una cura. Algún día atraeré hacia mí un grupo de programadores y tal vez otros especialistas, entonces es mejor que aprenda muy bien las bases, mucho mejor que cualquier otro. Otra cosa que sé muy bien es que siempre siempre siempre siempre se necesita un equipo, no hay quien salga solo y espero encontrarme a gente mucho muy superior a mí en campos específicos de la programación y de redes y de contabilidad y de diseño y poder reunir todos los esfuerzos para como yo digo, sólo me den el pase de gol.

"No importa qué lenguaje de programación utiliza un programador: el lenguaje tendrá reglas que gobiernan la utilización de las palabras y la puntuación. A estas reglas se les llama sintaxis del lenguaje [...] A menos que la sintaxis sea perfecta, el ordenador no puede interpretar el lenguaje de programación en absoluto". p 7.

Las máquinas no son como los humanos, a veces decimos cosas en las que se nos patina un poco la sintaxis o escuchamos cosas donde la sintaxis falló, también donde falla la ortografía, pero no obstante sabemos qué es lo que quisimos o quiso decir alguien. El ser humano tiene una súper destreza para interpretar; nuestra mente constantemente está interpretando el medio. Estaba leyendo un libro que decía que recibimos unos 11 millones de datos por segundo. A los ordenadores hay que hablarles claro, exacto.
  • "Cada ordenador trabaja con la circutería, que consta de millones de interruptores on-off. Cada lenguaje de programación utiliza un fragmento de software para traducir el lenguaje de programación específico al lenguaje de la circutería on-off del ordenador, o lenguaje máquina. El lenguaje de traducción de software se llama compilador intérprete, e indica si ha utilizado el lenguaje de programación incorrectamente. Por esto, los errores de sintaxis son relativamente fáciles de localizar y corregir.". p7.
  • "Para que un programa funcione correctamente, usted debe proporcionar las instrucciones al ordenador en una secuencia específica, no debe olvidarse instrucciones, y no debe añadir instrucciones extrañas. A esto se le llama desarrollar la lógica del programa".
  • "Los errores lógicos son mucho más difíciles de localizar que los errores de sintaxis; es más fácil darse cuenta de si huevos está escrito incorrectamente en una receta que decir si hay demasiados huevos o se han añadido demasiado pronto". p. 7.
  • "La lógica es la misma en cualquier lenguaje" p. 8.
Esto que parece tan lleno de sentido común en muchas áreas del conocimiento se olvida. Ahí tienen al pobre Marx diciendo que hay varias lógicas y que el capitalista tiene su lógica y que el proletariado tiene otra. A esa teoría de las varias lógicas se le llama polilogismo y no es más que la salida de Marx para no ver que su sistema se colapsaba porque no pasaba ni las más mínimas reglas de la lógica, ¡qué granuja! Lo malo es que muchos le compraron ese discurso tan barato.

Seguimos en la segunda parte.