Programación para redes y concurrencia (I)

Este es el inicio de una serie de artículos introductorios sobre programación para redes (usando sockets) y programación concurrente. El objetivo es presentar una serie de conceptos que iremos explorando progresivamente:

  • Programación cliente/servidor usando sockets: Cómo desarrollar programas que se comuniquen a través de la red para realizar distintas tareas.
  • Protocolos de comunicación: Explorar los principios básicos de los protocolos de aplicación (alto nivel) utilizados para intercambiar información.
  • Concurrencia: Cómo construir programas que se ejecuten paralelamente y resolver algunos de los problemas que nos plantea la concurrencia.

Nota del 19/11/2006: Ahora puede descargar el tutorial completo.

Sigue leyendo «Programación para redes y concurrencia (I)»

Programación orientada a objetos

Cuando comencé a explorar la programación orientada a objetos (POO u OOP, en inglés), allá por el año 1994, me ocurrió lo que a muchos. Luego de casi 10 años de programar proceduralmente (en Basic, Pascal y Cobol) me encontraba con una nueva visión. Si bien creía entender los conceptos de clase, objeto, herencia y polimorfismo, no lograba ver claramente la diferencia de enfoque a la hora de diseñar un programa. No podía apreciar realmente cuáles eran las diferencias y las similitudes entre el enfoque procedural y el orientado a objetos.

A través de mi experiencia docente varias veces me vi frente a la tarea de introducir los conceptos básicos de la POO, encontrándome con la misma situación, pero desde un lugar diferente: ¿Cómo explicar el nuevo enfoque a personas acostumbradas a programar de forma procedural? ¿Cómo resaltar las similitudes y las diferencias? Fue gracias a un ejemplo del libro «C++ Annotations» que encontré una forma simple de presentar la idea básica detrás de la programación orientada a objetos.

Sigue leyendo «Programación orientada a objetos»

Aplicaciones web con plantillas

Comencé a desarrollar aplicaciones web hace más de 6 años. Inicialmente utilicé Perl y luego también PHP, Rails, entre otros.

Al poco tiempo de escribir mi primera aplicación interesante noté algo que no me parecía apropiado. Partes de mi programa se ocupaban de obtener los datos enviados por el usuario (entrada), otras se encargaban de realizar los cómputos en función de dichos datos (proceso), en tanto que otras se encargaban de producir el código HTML que se enviaba al usuario (salida), mostrando los resultados del proceso y permitiendo la posterior interacción con el sistema (menúes, enlaces, etc.). Lo que me perturbó es que una parte demasiado significativa del programa se ocupaba de esta última función y, peor aún, no podía separarla adecuadamente del resto del sistema.

Sigue leyendo «Aplicaciones web con plantillas»

La complejidad de los algoritmos

Hace unos años presencié una discusión entre dos programadores sobre la «eficiencia de los programas«. Ellos discutían sobre la manera de especificar el problema en la herramienta CASE que utilizaban, para que el programa generado fuera más «eficiente«. La discusión era acalorada y tenían visiones muy diferentes del asunto (yo, al no conocer ni de cerca la herramienta en cuestión, no entendía ni media palabra de sus argumentos).

Hasta que en un momento no pude contenerme y decidí meter el dedo en el ventilador: A ver, una pregunta, ¿cuándo un programa es más eficiente que otro? – les dije. Para mi asombro (aunque debería haberlo intuído), ambos me respondieron al unísono: ¡Cuando es mas corto!.

Sigue leyendo «La complejidad de los algoritmos»

Por qué deberíamos contar desde cero

Este es un breve documento de Edsger Dijkstra que traduje hace un tiempo y tenía cubierto de polvo en algún directorio de mi disco duro.

A simple vista parece una trivialidad: ¿Qué más da si comenzamos a contar desde 0, desde 1 o desde cualquier número natural? Pero luego, cualquier persona que haya programado sin tener en cuenta estas cuestiones y que haya renegado depurando sus programas teniendo que sumar o restar 1 por aquí y por allá para considerar «casos especiales» en el tratamiento de secuencias o arreglos, sabrá valorar este pequeño artículo.

Sigue leyendo «Por qué deberíamos contar desde cero»

Qué es la computación

Sin lugar a dudas Edsger Dijkstra fue uno de los grandes maestros de la computación. Durante su larga y productiva carrera nos brindó avances científicos, técnicos, educativos y también filosóficos.

En su artículo «Sobre la crueldad de verdaderamente enseñar Ciencias de la Computación» nos muestra claramente la naturaleza de la programación, explicando el por qué de los males que la aquejan.

Si usted es informático y alguna vez se preguntó por qué el desarrollo de software difiere tanto de otras áreas del conocimiento y de la técnica (como la arquitectura, las distintas ingenierías, etc.), o por qué ya entrados en el siglo XXI todavía no podemos garantizar ciertas propiedades de los sistemas informáticos, sin duda debería leer este artículo.

Sigue leyendo «Qué es la computación»