Enterate cual es el mejor lenguaje de programacion para aprender en tu caso particular. Que lenguaje de programacion debería aprender primero? es una pregunta que se hacen muchos que quieren aprender a programar. En este artículo veremos elementos y criterios para encaminar esa selección.
PHP, Java, Javascript, Python, Swift, Objective C, Kotlin, C++, Ruby, Scala, R, Pig, Hive, SQL. No son simplemente diferentes formas de expresar lo mismo. El lenguaje de programaciçon es la parte de la programación que menos infuirá en tu vida si te dedicas a programar. Por eso la clave no está en la selección del lenguaje sino en lo que quieres lograr al programar. Eso te abrirá un abanico de posibilidades, que serán más acotadas de acuerdo a las actiidades, equipo de trabajo, tipo de empresas, tipo de aplicaciones, entornos que elijas.
Naturaleza de la actividad de programación
Programar es como ser actor. Nadie puede trabajar de actor mencionando solo la profesión de actor. Cuando actuamos , representamo un papel: un rey , un ladrón , (un rey ladrón), un policía, un deprimido, un enamorado. Pero tenemos que actuar de algo. Con el software sucede lo mismo. No programamos simplemente. Cuando programamos generalmente construimos una aplicación que sirve para algo. Para hacer ejercicio, para llevar la contabilidad, para comunicarnos, para dibujar.
Diferentes lenguajes para diferentes dominios de solución
Entonces, relacionado con un dominio especifico, lo que muchas veces denominan la «industria» habrá un conjunto de variantes, posibilidades, acciones relacionadas en las que se pueden hacer aplicaciones. Y esas aplicaciones serán expresadas al menos en un lenguaje de programación si tiene un solo componente, o muy posibilemente en varios si la solución involucra varias partes.
Cuando preguntan, quiero programar ¿Qué lenguaje de programación estudiar primero? me resulta a una pregunta similar a : Quiero hacer deporte, con qué deporte me conviene empezar: Running, Natación, Esgrima , Lanzamiento de Bala, Rugby, Baisbol, Futbol…..
Suena raro, no? Vemos que podemos tener preferencias más allá de que nos guste el deporte. Lo mismo pasa con los lenguajes de programación. Si bien hay cosas que se pueden realizar en más de un lenguaje, cada lenguaje nos enfrenta con un contexto, con un entorno, y con cierto tipo de aplicaciones, hasta con un grupo social.
Los lenguajes tambien surgen como una forma de expresar la solucion de un problema o al menos parte de esa solución. Esta forma de expresión en la mayoría de los casos no es simplemente descriptiva, sino que cuando una computadora ejecuta lo expresado en el lenguaje facilita esa solución o directamente resuelvan el problema. Entonces es común que los lenguajes tengan la orientacion del tipo de problema que resuelven.
Entonces ya vimos que nos podemos preguntar… qué tipo de aplicaciones queremos hacer? Aplicaciones de música, de deporte, comerciales, para empresas chicas, para empresas multinacionales, relacionadas con IOT, relacionadas con Big Data, para análisis de datos? Si elegimos primero el tipo de aplicaciones vamos a ver un subconjunto de lenguajes mas pequeño que apunten al área que estamos eligiendo.
Una forma de poder entrenar nuestra intuición es el sitio https://sourceforge.net El sitio cuenta con muchas aplicaciones de las cuales se puede ver el código fuente. Tiene un conjunto de categorías. Podemos navegar las categorías y ver cuantas aplicaciones hay hechas en cada lenguaje. Si la distribución no es pareja, y encontramos para un área muchas aplicaciones de un lenguaje y pocas de otro, puede ser un indicativo de que ese lenguaje sea más adecuado para esa área.
Diferentes lenguajes para diferentes dispositivos (o tipos de aplicación)
Otra cosa que podemos evaluar es acerca del tipo de aplicacion, Y en este caso la variedad de lenguajes es más estrecha Cuando digo tipo de aplicación me refiero a «aplicación web», «aplicación mobile», «aplicación desktop», aplicación empresarial. aplicación de Big Data, aplicación de IOT
Fuera de estas, si queremos programar un dispositivo específico como una impresora, un teclado musical, o un aplicacones tipo Arduino, en cada caso la opción generalmente será una sola, y es el lenguaje que viene con ese equipo.
Ahora veamos las más generales.
Aplicación Web
¿Qué es una aplicación Web?. En términos generales es una aplicación disponible en internet, que generalmente utilizamos a través de un Browser como Chrome, Firefox, Opera.
La particularidad que tienen las aplicaciones Web es que el browser genera la parte visual que nosotros usamos. En general la aplicación web se ejecuta en un servidor (por ejemplo Facebook, Google, Instagram o el Banco Online) y ante nuestros pedidos envia a nuestro browser un conjunto de caracteres que el browser interpreta a partir del cual nos muestra algo (la página web). Ese conjunto de caracteres que el browser interpreta normalmente está escrito en un lenguaje : HTML
Entonces el HTML es un lenguaje, y si queremos hacer aplicaciones web tal vez sea el primer lenguaje que debamos aprender.
La particularidad del HTML es que representa elementos «estáticos» que el browser muestra. Por ejemplo puede tener elementos como
<title>El titulo del Articulo</titulo><p>El primer párrafo</p>
Y el browser sabe de qué manera mostrar cada cosa. Podés ver el html de una página en tu browser presionando con click derecho del mouse y elegiendo «Ver código fuente»
En general el HTML tiene que ver con contenido. Si bien también se pudiera expresar formato (como texto rojo, o letra más grande) en general se usa otro lenguaje más especializado en combinación con el HTML para expresar esos estilos, y es CSS.
Entonces CSS es el otro lenguaje, tal vez el segundo a estudiar (no hace falta tan a pleno, simplemente entender las bases, si no te dedicas al diseño)
Tanto el HTML como el CSS son estátcos. Esto quiere decir que normalmente no reaccionan en sí mimo a lo que ocurre, como la intervención del usuario (salvo unas pocas operaciones)
Así como el HTML se combina con el CSS para los estilos y diseño. El HTML se combina con el JavaScript (no Java) para las acciones. Entonces si a la página web le queremos agregar comportamiento… como cuando al llenar un formulario nos olvidamos de cargar un dato obligatorio, y ese dato se transforma en «rojo» para indicarlo. Esa operación seguramente fue hecha con Javascript.
Entonces para las aplicaciones web HTML + CSS + Javascript son una parte fundamental. Estos son los lenguajes que interpreta el browser.
Pero aca no termina todo.
Aplicaciones Web del lado del Servidor
Vimos que esta información le llega al browser porque alguien la genera (Facebook, Instagram, Google o El banco que tiene el sitio Web) Es a esa parte lo que llamamos «Servidor» .
Entonces del lado del Servidor hay una aplicación escrita en uno o más lenguajes que frente a un pedido, envía el HTML+CSS+Javascript al browser.
Qué lenguajes hay del lado del servidor?
Puede haber varios. Pero sin tratar de ser riguroso, puedo mencionar que el más común y que tiene una curva de aprendizaje menor, y que tiene menos elementos sintácticos (menos complejidad) es PHP. Creo que del lado del servidor es lo más simple.
El PHP no genera elementos gráficos sobre una pantalla. Dado que fue hecho para dar soluciones web, permite tomar un pedido ( a través de la red.. no por pantalla)… y frente a ese pedido permite «hacer cosas» y luego de esas cosas emitir una respuesta…. que va a ser un conjunto de caracteres.
¿Cómo se puede hacer una aplicación con eso? Claramente, el pedido, será un pedido de red al que estará atento, y la respuesta normalmente será código HTML, CSS + Javascript + otros archivos que enviará a un browser que mostrará algo al usuario.
Alternativas en Aplicaciones Web
Para aplicaciones web hay varias alternativas, como
- PHP : En principio el más simple de todos para el lado del servidor. Además está en todos los servidores (hosting) económicos. Para aplicaciones web y para personas ansiosas que quieren resultados rápidos es la mejor opción.
- Java (más componentes, más empresarial, estructura con más formalidades que PHP, y con expresiones sintácticas más potentes..)
- Python (tan potente como java en cuanto a lo que puede expresar, pero más eficiente… usa varios paradigmas como solución) (Además está disponible en casi todos los servicios de hosting económicos)
- NodeJs: Es muy interesante dado que NodeJs es Javascript del lado del servidor. Resulta interesante porque si ya aprendiste Javascript para el lado del browser, tenés medio camino hecho y podrías resolver la solución web completa evitando aprender otro lenguaje. La contra de esta opción es que no está disponible en los servidores económicos. (Generalmente está PHP y Python en el plan básico)
Variaciones Web del lado del cliente
Variaciones sobre aplicaciones web
Como vimos en la aplicación web del lado del browser lo natural es trabajar con
- HTML + CSS : Contenido estático
- Javascript: Contenido dinámico, acciónes, comportamiento
Pero el Javascript cuando hace algo, lo hace sobre el HTML. Para que luego de validar el formulario, el dato vacío aparezca en «rojo» es porque el Javascript modificó el HTML en ese campo y le cambió el valor a «rojo»
Por eso, en el browser, tenemos 2 opciones
1.- Ver código fuente: En esa opción vemos el código HTML que el browser recibió del servidor
2.- Inspeccionar: Si vamos a la parte de «Elementos» veremos también HTML. Peo estará mostrando el HTML tal cual está ahora.
Cuál es la diferencia? Si el Javascript hizo un cambio, en el primero veremos que el elemeto fue mandado en negro (color original)
Y en el inspect veremos que el elemento ahora está «rojo» (HTML modificado después que el javascript lo cambió frente a nuestro intento de enviar el formulario con ese campo vacío)
Entonces el javascript manipula el HTML original de manera que nosotros vemos cambios en nuestra pantalla del browser.
Single Page Application
Dado que el Javascript puede manipular el HTML, algunos en vez de mandar un HTML y dejar que el Javascript solo modifique algunas partecitas frente a algunas acciones…. optan por enviar al browser un Javascript que tiene instrucciones para generar el HTML dese 0.
Es decir que el Javascript arma el HTML completo que el browser muestra. Aun si aprendemos esta forma de hacer aplicaciones no nos quita la responsabilidad de saber HTML
Aun estas aplicaciones hechas con Javascript generalmente están asociadas a otras tecnologías que nos facilitan o estructuran esa solución como puede ser React / Angular o Vue. Pero definitivamente habría que dar los primeros pasos con JavaScript
Variaciones de aplicaciones Web del lado del Servidor
Para el caso del servidor mencioné Java / PHP / Python / NodeJs
Puede haber otros, pero vimos que la función principa sería
- escuchar un llamado de red
- procesar algo
- enviar una respuesta (HTML + Javascript + CSS) o simplemente Javascript que arme el HTML
Libraries y Frameworks
Aún estos lenguajes tienen alternativas para estructurar mejor nuestra aplicación cuando crezca. Entre las alternativas existen Frameworks y Libraries.
Libraries son bibliotecas de funciones que no están en la base del lenguaje pero que podemos adquirir para operaciones específicas.
Por ejemplo Python tiene libraries para cálculo matemático complejo o para scrap (navegar sitios y obtener información de ellos) . Tanto PHP como Java como NodeJs también tienen innumerables libraries. (Bibliotecas…. no librerías)
Frameworks son soluciones que nos proveen un esqueleto o estructura principal para solucionar algo y nosotros en vez de programar toda la aplicación desde cero, simplemente llenamos los huecos que hacen que esa estructura general funcione.
Por ejemplo, para casi todas las aplicaciones hay operaciones comunes como login, registrar usuario, menu, mensajes de error, comunicaciones, que son independientes de la industria en la que trabajemos.
Hay muchos frameworks que proveen esa funcionalidad general y muchos otros frameworks que proveen funcionalidad específica como permitir que nuestra aplicación reciba pagos con tarjeta de crédito.
Entre estos podemos mencionar:
- PHP: Laravel
- Python: Django
- Java: Spring y Java EE
Java EE es especial dado que es el Standard de Java para aplicaciones empresariales.
Hay que considerar que una vez que apredimos el lenguaje, el framework no nos quita la responsabilidad de aprender lo que hay detrás del framework. Si bien al crear las aplicaciones (y seguir los tutorials) lo hacemos mucho más rápido que creandolo nosotros, y en pocos pasos tenemos una aplicación andando, cuando tenemos un error o que encontrar un problema o en que parte el sistema no hace lo que queremos, si no conocemos el framework … esa tarea se torna muy dificultosa.
Realmente es muy provechoso usar los frameworks pero no hay que conformarse con solo hacer el primer tutorial y tener todo andando. Hay que saber al menos donde buscar en la referencia el dia que tengamos un problema.
Aqui termino la seccion de aplicaciones Web.
Entonces para empezar con Web recomiendo:
HTML + un poco de CSS + Javascript (Cliente) + PHP (Servidor)
Para los ansiosos, ciertamente PHP
Hay muchas otras razones para elegir entre Javascript / Java o Python.
Uso de Frameworks
Algo más con respecto al uso de frameworks es que para aplicaciones de magnitud será difícil trabajar sin ellos. La razón más certera es que al involucrar muchas personas en un equipo, el actuar directamente con los lenguajes «al natural» hace que cada uno elija sus propias soluciones y formas. Al trabajar en un framework, uno se puede salir de los standares pero hace que las cosas sean mucho más difíciles (no se aprovecha el framework). Entonces al trabajar con framework, más allá de la aplicación se logran estructuras de programas más previsibles y mas comunes aún cuando cambiamos de entorno.
Aplicaciones Mobile
Para las aplicaciones Mobile las opciones en principio parecieran ser mas acotadas.
Para aplicaciones Nativas los lenguajes disponibles son
- Android: Java o Kotlin
- iPhone: Swift (nuevo) / Objective C (versiones anteriores)
Estos son los lenguajes «nativos» , es decir el lenguaje para el cual vino preparado el sistema operativo de fàbrica. Usando estos lenguajes el teléfono o la tablet se comportará como las aplicaciones para las cuales fue fabricado.
Pero de nuevo hay alternativas.
Si no leiste la parte Web, repasala.
Aplicaciones Mobile Híbridas
En un teléfono mobile podemos correr muchas aplicaciones, entre ellas un browser. Entonces si en el celular podemos ejecutar un browser como chrome, o el que venga con el teléfono, entonces podemos correr una aplicación que un browser entienda.
Si, podriamos hacer una aplicación con HTML + CSS + Javascript que corra en el celular. En este caso necesitariamos alguna ayuda.
Hay tecnologias que lo que hacen es tomar nuestra aplicación hecha con HTML + CSS + Javascript, y con eso arman una aplicacion ya sea para Android o para iPhone y esa aplicacion se puede instalar en el teléfono y parece nativa.
Entre las más conocidas están PhoneGap / ReactNative y IONIC.
Entonces sabiendo solo Javascript + HTML + CSS podriamos hacer aplicaciones utiles para celulares.
El resultado final no es exactamente igual que una aplicacion nativa, pero es bastante aceptable según el tipo de aplicación.
Si lo que queremos programar son juegos, tal vez tenemos que pensar en otras tecnologías como Unity.
En el caso de ReactNative, el resultado final aprovecha bastante mejor las posibilidades de cada telefono, y además de Javascript hay que conocer React (que es un framework de visualizacion de Javascript)
Aplicaciones Desktop
Para aplicaciones Desktop tenemos tanto Java como Python.y seguramente C++ o C#. Definitivamente PHP no es para Desktop si bien hubo algunos intentos de hacer libraries de PHP para mostrar cosas en pantalla.
WordPress
Algo interesante para empezar a programar puede ser WordPress. para entornos web. WordPress nos provee una aplicación que al momento que la instalamos (dando Next next next next) tenemos armado un blog funcionando.
Y si agregamos Woocommerce (un plugin)… dando next next next … tenemos funcionando una tienda virtual.
Lo interesante es que lo que instalamos es una aplicación PHP que genera HTML + CSS + Javascript.
Tenemos una consola para interactuar como usuarios o como administradores.
Y tenemos todo el código fuente de cómo fue armada. Es decir que podriamos modificarlo y jugar con nuestros primeros pasos de programación dentro de wordpress.
De nuevo, al ser wordpress como un framework tiene la desventaja de que debemos conocer toda su estructura para modificar cosas de manera certera. Y tenemos un conjunto de conocimientos que va mas alla del lenguaje. Pero me parece una alternativa valida para los muy muy muy ansiosos que quieren tener algo funcionando YA.
SQL
No quiero dejar de mencionar otro lenguaje que es SQL. Este lenguaje tiene otro propósito. Y es comunicarse con un tipo de base de datos, que se llaman datos estructurados.
Es interesante que el lenguaje tiene básicamente 3 instrucciones fundamenales
- INSERT
- SELECT
- UPDATE
Es obvio para que es cada uno. Una es para crear nuevo datos, otra para modificarlos y otra para obtener datos que cumplan con una condicion.
En general cuando nuestra aplicacion tiene que persistir datos en el tiempo, como recordar a un usuario que se registro, tendra que interactuar con una base de datos, dandole este tipo de instrucciones o similares.
Es posible que tambien te tengas que enfrentar con este lenguaje si tus aplicaciones guardan datos en el tiempo.
Qué hay de C++?
Noté en varios lugares donde publiqué este artículo que en ciertos ámbitos muchos sostienen comenzar con C++.
De nuevo quiero hacer la aclaración que si esa es tu preferencia, ese es el lenguaje. En realidad los lenguajes no son fáciles o difíciles. Simplemente la forma del lenguaje coincide en mayor o menor medida con el modelo mental que cada uno tiene para resolver y expresar la resolución de problemas. Por lo tanto la selección del lenguaje tiene que ser liderada por tus preferencias. Te tiene que gustar lo suficiente para que no te duela el tiempo que gastes o dejes de hacer otras cosas para aprenderlo.
Pero por qué aducen que debería ser C++ y por qué yo creo que estàn equivocados?
Es una cuestión de principios, escala de valores, y relación con objetivos.
Entiendo que el desarrollo de software, diferente a muchas otras actividades tiene una naturaleza incremental. Por eso ya tuvimos más de 20 versiones del tan útil Excel. Una vez que tenemos el software nos invita cambiarlo y a querer otras cosas. A veces más (con más herramientas o características) y a veces menos (como el Skype… con una pantalla simplificada). El punto es que a medida que usamos el software nos damos cuenta que pudiera ser mejor.
Frente a esta naturaleze incremental del software me parece arcaica toda solución que se postule como perfecta y la piedra fundamental de algo.
Esto también tiene que ver con algo que mencioné que es que los lenguajes tienen un tipo de expresiones relacionados con la solución que plantean. Hay cosas que son muy difíciles de expresar en un lenguaje no preparado para esa solución.
Un ejemplo de esto son las coordenadas polares y las coordenadas cartesianas. Expresar una recta en un sistema de coordenadas cartesianas es muy simple ( y = 5x por ejemplo) .. Ahora , expresar un círculo, reviste otra complejidad (r al cuadrado = x al cuadrado + y al cuadrado). Ahora dibujar un círculo en coordenadas polares es muy simple (y =5) y un espiral tambén (y =5x) … pero se necesitaría tener conocimientos avanzados para dibujar una recta en un sistema de coordenadas polares.
Lo mismo sucede con los lenguajes de programación. Entonces creer que existe un lenguaje que tiene las características de todos los otros … es una visión muy limitada de la realidad. Por otra parte contratar a alguien que tiene esa visión , evidentemente genera el riesgo de que frente a una nueva tecnología trate de aplicarlo de la manera como lo resuelve el sistema que ya conoce…. lo que hace que las soluciones después sean complicadas de entender (que si bien les alimenta el ego… no es redituable para las empresas, cuyo principal logro es generar las mejores soluciones con el menor seniority)
En lenguajes de programación un ejemplo es Map Reduce. En Map Reduce arribás a una solución mediante una serie de pasos que se aplican sobre la totalidad de los datos generando un conjunto de datos más cercano a la solución. Cada paso vuelve a generar un conjunto total de los datos que no tiene la solución completa (salvo el último paso). Esta forma de resolución es totalmente ineficiente frente a sistemas procedurales donde directamente se le dice a las computadoras el siguiente paso que tienen que dar. Sin embargo, el Map Reduce pasa a ser la solución natural para sistemas distribuidos con gran cantidad de datos donde en paralelo servidores independientes resuelven fragmentos de la solución, permitiendo gran parte de las tecnologías recientes de Big Data. Y si bien algunas instrucciones pueden forzarse para parecer similares, la organización y la estructura de los programas serán diferentes en esencia.
Y otro punto con la escala de valores, es otro punto que mencioné. A NADIE LE INTERSA QUE PROGRAMEMOS. Programamos para crear un software o una solución. Entonces encuentro en muchos que programan una desconexión entre sus tareas y el objetivo final . Si el objetivo es conocer, alimentar el ego resolviendo cosas que otros no pueden resolver, y excluirlos porque además al no saber explicar a los demás les parece difícil lo que resolvemos, estudiar y conocer un lenguaje «difícil» cubre todas nuestras expectativas.
Ahora, si lo que hacemos es responder a alguien que nos viene a preguntar «¿Qué lenguaje de programación debería aprender primero?»…. Tenemos que darnos cuenta de algo… que la persona que pregunta NO CONOCE NINGUN LENGUAJE. Muy probablemente tampoco haya intentado con ninguno… porque si no, no hubiese preguntado. Hubiese encontrado cualquier tutorial en internet y empezaba solo a conocerlo. Es decir que es alguien que todavía no sabe si le va a gustar programar o no.
Entonces contestarle: Aprendé C++ porque con ese te va a ser fácil aprender TODOS LOS LENGUAJES…. Cómo sabemos que va a querer aprender otro lenguaje? La solución de : Dale una mirada al HTML y mirá un poco de Javascript hasta que logres algo y veas que podés generar una acción en una computadora. Y si te gustó y querés profundizar un poco más, con unas pocas istrucciones de PHP generás un entorno que involucra 2 computadoras y una red, estás pudiendo en un tiempo limitado disfrutar de crear una solución, simple, pero una solución tuya.
El decir, aprendé primero el más difícil, es lo mismo que si alguien nos pregunta como entrenarse para escalar, contestarle …. para empezar escalá el Himalaya. Si lográs escalar ese, después vas a poder escalar cualquier otro cerro o montaña.
Y esto tiene que ver con la falta de docencica que tienen muchos programadores por lo que excluyen a los nuevos o les hacen parecer que son difíciles cosas que simplemente son fáciles si las tomás por partes, si tu modelo mental coincide con ese tipo de solución y si te gusta lo suficiente como para gastar tiempo en eso.
Conclusion
Los lenguajes son como los deportes. Cada lenguaje te enfrentará a soluciones, entornos, problemáticas diferentes. Antes de pensar qué lenguaje querés aprender pensá en qué querés hacer, con qué clase de equipos te gustaría trabajar, o en qué entornos querés trabajar. En base a eso podrás elegir aprender con entusiasmo el lenguaje que más combine con vos.
Una forma de aprender que recomiendo además de seguir algún tutorial o guía de referencia es bajar una aplicación de https://sourceforge.net/ o https://github.com/
Chequear que la aplicación esté en el lenguaje que estés aprendiendo, y que puedas instalar el entorno para ejecutarla localmente en tu máquina. Deberías tener un conocimiento básico del lenguaje antes de hacer esto. También es muy importante que la aplicación esté extensamente distribuida. Que sea una aplicación que realmente se esté usando.
Cambiar partes pequeñas de grandes aplicaciones es la mejor manera de aprender una vez que diste los primeros pasos. Eso te enfrentará a tecnologías relacionadas y a un entorno real de trabajo.