A la mayoría de los estudiantes universitarios, “por lo general”, se les enseña un solo lenguaje de programación en detalle, con “comprensible” profundidad y con prácticas que siempre tienen sabor a poco. Esto lo limita cuando se expone a la sintaxis de lenguajes diferentes y este suceso también se percibe en el enfoque que posee, respecto a la solución de problemas diversos, en su desempeño como profesional al terminar los estudios. Dicho en otras palabras, cualquiera sea el problema a resolver, la disponibilidad de recursos siempre será limitada al aprendizaje capitalizado. Cuando la enseñanza intenta abarcar varios lenguajes de manera superficial, la confusión generalizada termina siendo una constante obligada. Por lo tanto para ti, ¿cuántos lenguajes de programación necesita dominar en profundidad un profesional?
Cada lenguaje de programación fue diseñado, originalmente, para un propósito específico. Por este motivo, tiende a promover una forma de “atacar” los problemas de manera muy propia, muy particular y del mismo modo, esa “manera muy propia” es llevada adelante en la solución de un problema. La comprensión de un sólo lenguaje, promueve soluciones que sólo se acercan a un problema desde una sola perspectiva. Saber varios, te permitirá mirar el problema desde una variedad de perspectivas, donde podrás comparar entre múltiples opciones de desarrollo y la solución para el problema podrá ser seleccionada como la más natural, sencilla y eficiente.
Imagínate, por ejemplo, que todo lo que tienes en tus manos es un martillo. En este caso, tanto los clavos como los tornillos se insertarán siempre bien con ese martillo. Porque aprenderás a hacer eso: a utilizar ese martillo para resolverlo todo. Sin embargo, si también tienes un destornillador, entonces tendrás una solución alternativa para la inserción de los tornillos. De este modo entonces, podrás seleccionar la mejor herramienta para cada tarea en particular. De mismo modo, los lenguajes de programación están diseñados para resolver cualquier clase de problemas mediante una metodología específica, cada uno alentando a los estudiantes (como tú) a mirar el problema desde una perspectiva particular. FORTRAN, por ejemplo, fue diseñado para ayudar a resolver problemas matemáticos. Puede ser un lenguaje ideal a utilizar para la solución de un problema puramente matemático. COBOL fue diseñado para ayudar en la forma de almacenamiento de los datos requeridos por cualquier tipo de negocio y su manipulación.
El lenguaje C (originalmente) fue creado para ayudar en la implementación de sistemas operativos (UNIX) y, además de permitir construir aplicaciones específicas, tiene características particulares que le permiten tener acceso o manipulación del hardware que posee el sistema de proceso donde es utilizado. C + +, por su parte, fue diseñado para resolver problemas específicos dentro del lenguaje C, con el agregado de permitir el soporte programación orientada a objetos. Es decir, posee una mezcla de capacidades que permiten resolver problemas además de brindar un apropiado apoyo metodológico. El lenguaje de programación Ada tiene como objetivo proporcionar un funcionamiento fiable, con particular énfasis en las áreas de seguridad, donde se pueda tener una rápida escalabilidad y facilidad de mantenimiento. El lenguaje Java fue desarrollado para proporcionar (también) apoyo metodológico orientado a objetos y a una sencilla portabilidad. Los lenguajes de Script están, en general, diseñados para permitir soluciones muy rápidas a problemas pequeños. De este modo, la lista de lenguajes de programación, y sus características propias, se podría expandir hasta ocupar toneladas de caracteres. Sin embargo, lo que el artículo intenta reflejar es que aprender en forma eficiente una variedad de lenguajes de programación, te permitirá a ti y a cualquier estudiante, analizar las ventajas y/o desventajas de cada uno, a la hora de resolver un problema específico.
Un ejemplo muy sencillo de expresar este pensamiento, habla de las listas de elementos dentro de un programa (por ejemplo, un listado con todos los microcontroladores que posees). En el universo posible de soluciones a un problema, podríamos considerar a todas las listas como un conjunto de objetos estáticos que debe tener un número fijo de elementos, o bien como objetos dinámicos que no tienen límites de cantidad. Cualquiera de estas elecciones podría ser (o no) una solución natural para el problema. Por ejemplo, las listas estáticas requieren que el número máximo de elementos se conozca de antemano. Si el número de elementos es un valor fijo durante toda la ejecución del programa, la cantidad de almacenamiento necesaria y utilizada, para manipular esta información, será invariable y estará disponible de forma fiable, ya que tendremos un conocimiento previo de su dimensión. Sin embargo, si el número de artículos (o elementos de la lista) no se conoce de forma previa, o sufre variaciones durante la ejecución del programa, el programador tendrá que seleccionar un tamaño máximo que quizás sea mucho más alto que el número probable de artículos. Así, el espacio de almacenamiento puede ser inútilmente gastado en la asignación de una variable demasiado grande, sólo por prevención de errores.
Vale decir entonces que, las listas dinámicas “se crean en tiempo de ejecución”. Si el número total de elementos que se almacenan no se conoce de forma previa, quizás ésa sea la manera ideal de resolver y trabajar el problema. Sin embargo, por su propia naturaleza, las listas dinámicas pueden crecer en tiempo de ejecución y por lo tanto, los recursos que necesitan siempre son desconocidos y quizás se produzca una condición de error, si la memoria disponible se agota durante la ejecución del programa. Este inconveniente, en ocasiones, puede ser imposible de demostrar antes de la ejecución del programa, especialmente para los sistemas integrados con capacidad de memoria limitada, como puede ser un microcontrolador. De este modo, podemos ver que una simple lista de componentes puede originar problemas si los lenguajes que creemos dominar en forma sólida, no tienen la posibilidad de ofrecernos las herramientas elementales para realizar el trabajo.
Los lenguajes de programación, por lo tanto, deben considerarse en forma análoga a una caja de herramientas. Cada lenguaje es una herramienta que ayudará a resolver un tipo de problema. Al comparar la solución que ofrece cada herramienta, un estudiante puede seleccionar entre estas soluciones y decidir cuál es el mejor método, para resolver el problema en cuestión. Como mencionamos al comienzo, el martillo se utilizará para el clavo y el destornillador para el tornillo. Este ideal de selección de la mejor solución para cada problema, sólo estará disponible si un estudiante ha estado expuesto a múltiples formas de ver el problema, teniendo la posibilidad de optar por múltiples herramientas de programación. Los estudiantes deben tener la comprensión de una amplia variedad de lenguajes. De este modo, encontrarán soluciones a problemas de diferentes áreas contando con una amplia variedad de herramientas que necesitarán para triunfar en la vida, después de la universidad. Según tu opinión personal, ¿cuántos lenguajes de programación necesita dominar en profundidad un profesional antes de salir al mundo laboral? ¿Existen lenguajes esenciales? Esta realidad, ¿como ha sido en tu caso?. Cuéntanos