Wednesday, December 19, 2012

¿Por qué la programación es difícil?


Programar computadoras es algo realmente difícil. La realidad es que hay que explicarle a la máquina cada cosa que tiene que hacer, sin ambigüedades. Parece fácil pero muchas veces asumimos que le estamos diciendo correctamente las cosas y al probar nuestros programas, hallamos que no resuelve los problemas como esperamos y entonces pasamos al proceso de depuración, de "debugging", para así saber qué diablos está haciendo la computadora que difiere de lo que esperamos que haga.

Pero no sólo es difícil programar por eso. Yo creo que esto tiene que ver con el poder de los lenguajes de programación. De hecho, va más allá de esto. Vamos a extrapolar esto y veremos la razón de la dificultad: se dice que un mexicano promedio tiene unas 300 palabras en su vocabulario. Son muy pocas y no es raro pues expresiones como "pásame la desa, que está encima del dese", o unas más comunes aún: "güey", "pendejo", y toda esta retahíla de groserías que el mexicano cree que maneja perfectamente y que además, nos hace creer que somos muy ingeniosos con el doble sentido, el cual es bastante rupestre, pues finalmente todo se reduce a una connotación sexual.

Pero el chiste es que 300 palabras para manejar toda la cotidianidad parecen pocas palabras, y lo son. Y las palabras finalmente representan ideas. Yo soy de la opinión que quien tiene un pobre vocabulario puede expresar pocas ideas o en el mejor de los casos, le cuesta mucho trabajo elaborar nuevas ideas porque tiene pocas expresiones. Esto lo podemos ver cuando aprendemos a hablar en un idioma extranjero. Es difícil expresarnos porque nos falta vocabulario. Nos faltan expresiones. Y es frustrante en más de un sentido.

El vocabulario se adquiere de diversas maneras, en el trato cotidiano en el trabajo, en la casa, en la escuela, en los centros de entretenimiento, etcétera. Pero se puede adquirir leyendo. Quien lee se hace poco a poco de nuevas palabras, las cuales las empieza a convertir en nuevas ideas. Puede así combinar los nuevos significados que va aprendiendo y de pronto elabora nuevas ideas o bien, puede elaborar la misma idea con diferentes palabras. La lectura tiene esta alternativa.

Igualmente resolver crucigramas nos da nuevas palabras y enriquece nuestro vocabulario, sin duda. Conclusión: lea, hágase de un buen vocabulario, enriquézcalo, que a la larga le podrá permitir expresar más ideas y en el mejor de los casos nuevas ideas.

Ahora, regresando al cómputo, a la programación. Los lenguajes de computadoras tienen un conjunto de palabras reservadas, nuestro vocabulario, para decirlo coloquialmente. En un lenguaje como Pascal habrá unas 30 o 40 palabras (máximo), con las cuales se pueden describir todas las cosas que podamos decir. En esas palabras se incluyen -desde luego- la creación de las estructuras de datos, por ejemplo, como los arreglos, etcétera. Pero en esas 30 o 40 palabras tenemos que expresar todo lo que le queremos decir a la computadora que haga y por ende, a falta de un vocabulario más enriquecido, estamos obligados a buscra las expresiones que nos permitan decirle a la máquina qué hacer. Si estamos limitados en este lenguaje que tiene tan pocos términos, me es claro que expresar las ideas para que la computadora actúe como queremos, puede resultar difícil. Y lo es.

Por ello mismo muchos lenguajes incorporan elementos que nos hacen la vida más sencilla: bibliotecas de funciones que ya hacen una serie de tareas por demás rutinarias. interfaces gráficas con el usuario, etcétera, que en una sola llamada, en un sólo término, en una sola expresión, conjunta una serie de elementos y resuelven un problema en particular de programación. Pero aún así, el nivel de abstracción de los lenguajes de programación no es lo suficientemente alto y estamos condenados a luchar contra esta pobre capacidad expresiva. Por eso, pienso, la programación de computadoras es difícil.

6 comments:

Ernesto said...

Hola Manuel!

Difiero un poco contigo respecto a que lo limitado de las palabras reservadas sea la principal causa de que es difícil programar.

Pienso que el principal problema es la incapacidad de las personas para entender el problema que se quiere resolver con la computadora.

Y como trasladar este problema a intrusiones de un lenguaje de computadora, como una serie de operaciones básicas.

Otro problema es que para programar mejor, es necesario entender como funciona la computadora internamente.

Por ejemplo el coco de muchos programadores son los apuntadores y el acceso indirecto a memoria. No usar los apuntadores limita mucho nuestra capacidad de programar.

Y segundo ¿Cómo representar los datos utilizados de forma adecuada en la computadora?

Que existan pocas palabras reservadas no es un problema en sí, sino una ventaja, ya que el lenguaje es sencillo y no es fácil que se entienda algo de forma diferente, como con el leguaje cotidiano.

Saludos,
Ernesto

Morsa said...

Ernesto,

Creo que la incapacidad de las personas para entender el problema es desde luego, parte de la dificultad. Más aún el cómo trasladar ese problema a instrucciones en un lenguaje de computadoras. Y ahí creo que es donde tuerce el rabo la puerca. Quizás el nivel de abstracción, la capa de abstracción en la que programamos es insuficiente. Tal vez, sólo tal vez, las estructuras de datos a nuestro alcance nos obligan a bajar de nivel en el sentido que hay que ver más en términos de operaciones básicas. Si lo piensas, el ensamblador es de más bajo nivel, y esto implica menos capas de abstracción, lo que dificulta en muchas ocasiones escribir buen software.

Evidentemente concuerdo en qe saber de apuntadores y manejo de memoria dinámicas es fundamental en este mundo moderno. Igualmente creo que tocas un punto interesante: ¿cómo representar los datos?

saludos
Manuel

Fabian Huerta said...

El lenguaje es una parte. El entendimiento también lo es. Otra parte que juega es la capacidad de abstracción que tiene el individuo para mapear su entendimiento en una solución computacional (el diseño). Hay individuos que son especialmente capaces para el entendimiento, para el análisis de la información, pero al momento de representar/diseñar su entendimiento no son muy buenos. Tenía un jefe que nos decía: recomiéndenme gente que sepa pensar sistemas (proceso lógico, espacial y de abstracción), no me importa que no sean capaces técnicamente (lenguajes), ya se los enseñaremos. La técnica (el lenguaje si es un impedimento), pero la complejidad en la construcción de programas va mucho más allá.

Marco A. Dorantes said...

Muy interesante tema. No sólo interesante para programadores y para sus gerentes, sino porque, como dice Bjarne Stroustrup, «our civilization runs on software», y eso lo hace muy relevante para el público en general pues este público es quien debe tomar mayor conciencia de que respuestas como “es que no tenemos sistema” no debe aceptarse más como excusa para no proporcionar un servicio. Es decir, el software falla y eso lo sabemos por anticipado, por lo que hoy ya no hay excusa válida para no diseñar sistemas informáticos y organizacionales resistentes a las fallas. Sobre todo considerando el conocimiento disponible a la fecha en la industria del software —que aún está en pañales pero eso tampoco es excusa.
Pienso que el alcance de los mecanismos de abstracción de un lenguaje de programación tiene muy poco que ver con la complejidad de escribir software, sobre todo porque la tecnología es parte de lo accidental en la escritura de software y no de lo esencial de la actividad —eso lo explicó muy bien desde hace décadas Frederick P. Brooks, Jr. en su magistral obra «The Mythical Man-Month». Pienso que la tecnología, por supuesto, es una dimensión que contiene factores críticos de éxito nada despreciables, pero su impacto en la complejidad de crear soluciones de negocio basadas en software no es comparable con otros factores críticos de éxito agrupados en dimensiones como personal, proceso, diseño/arquitectura. Hace tiempo comenté algo de esto en la siguiente página:

¿Qué aporta para la calidad en software?

Dado que la complejidad es inherente a la actividad entonces tan sólo podemos aspirar a administrar de cada vez mejores maneras esa complejidad, pero no desaparecerá sin importar que tengamos cada vez mejores y más expresivos lenguajes de programación.

Pero el punto es excelente: entre mayor extensión conceptual tengamos, mayor será nuestra capacidad para expresar mejores soluciones basadas en software. Esa extensión ciertamente depende del lenguaje, pero no principalmente del lenguaje de programación sino del lenguaje natural. De ahí que la lectura es crucial, pero no sólo la lectura como acto de decodificación de letras, palabras y enunciados sino como el ejercicio de las capacidades superiores de lectura. Aludí a esas capacidades en la siguiente página:

¿Es importante saber leer?

La actividad requiere avanzar hacia un profesionalismo maduro, y desde hace tiempo he estado investigando y aplicando lo que ha hecho madurar a otras disciplinas: los métodos de las ciencias. De esto comenté algo en las siguientes páginas:

Profesionalismo

Adaptive Methods for reality

HellMorganson said...

Muy cierto todo lo que uno dice es de doble sentido sexual en el lenguaje mexicano, me parece una monserga que se hable asi.

Guillermo said...

Otro factor que hace difícil la programación es el de llegar a adquirir conocimientos en diversas áreas y entender lo que se quiere programar. Si quieres hacer un programa de contabilidad, tienes que entender la contabilidad. Si quieres hacer un programa de optimizacion de ahorro de combustible en plantas termoeléctricas, tienes que saber de matemáticas avanzadas así como de sistemas eléctricos de potencia, Programación Lineal como el Método Simplex, etc. La pregunta es que seria mas facil?, que el especialista en la materia aprenda a programar o el programador aprenda lo del especialista.