Llegamos a la entrega final de esta serie de posts en el que he estado comentando algunos de los lenguajes de programación más utilizados en el panorama actual. Si os habéis perdido alguna de las entregas anteriores o habéis llegado a esta página sin pasar por las anteriores, permitidme que os haga aquí un pequeño índice a cada una de ellas:
- Parte 1 – C# y C/C++
- Parte 2 – Java
- Parte 3 – Rust
- Parte 4 – Go
- Parte 5 – Python
Estos 7 lenguajes están entre los 10 primeros del índice TIOBE de Junio 2019, con el permiso de Visual Basic .NET y PHP, y a excepción de Go (posición 15 del índice) y Rust (posición 38)
Muchos de vosotros echaréis en falta otros lenguajes como JavaScript
o PHP
por ejemplo, pero me permito recordaros que si no están en este análisis bien puede ser porque sean lenguajes de «scripting» (perdón a los desarrolladores de Node.JS
y Javascript en general) o bien porque sean lenguajes con poca cuota de mercado, especialmente en el ámbito del desarrollo «full-stack«. Sea como sea, por algún lado había que empezar, y además no he recibido demasiadas peticiones de inclusión de uno u otro (salvo en el caso de Python pero este lenguaje ya estaba en el ámbito de la serie de análisis)
Ha sido interesante aprender nuevos lenguajes (como ha sido en el caso de Rust
o Go
), desempolvar otros que estaban un poco apolillados (mi amado C++
por ejemplo) y cuestionar algunos de ellos aun siendo mis lenguajes de «cabecera» desde hace años (C#
)
Vamos a destacar para cada uno de los lenguajes analizados 3 características que me han parecido interesantes y 3 que no me han entusiasmado demasiado.
C/C++
Me gusta
- Que sea un lenguaje compilado y «cercano» a la arquitectura de la computadora es definitivo cuando lo que se busca es rendimiento y potencia
- Es un lenguaje tremendamente OOP en el que se han inspirado muchos de los lenguajes OOP actuales. Si necesitáis aprender OOP es el lenguaje en el que podéis empezar en cualquier caso
- Existe un «océano» de código fuente en C/C++ en el que podéis nadar para buscar inspiración. Si algo ya está programado por alguien, seguro que lo ha hecho en este lenguaje
No me gusta
- Es un lenguaje potente, y por tanto complejo, con el que es posible hacer grandes «estropicios» (solo una palabra: !punteros¡) y es difícil llegar a dominarlo con maestría
- Su soporte «multiplataforma» es cuestionable, lo que unido a su nula gestión de dependencias o al complejo sistema de «build» (sin considerar herramientas estilo «make» o «CCMake») hacen que no sea el lenguaje idóneo si tenemos que desarrollar un sistema que ejecute en varias plataformas o arquitecturas
- La fragmentación de las diferentes implementaciones (GNU C++, VC++, etc.) así como su lenta evolución hacen que sea un lenguaje ligeramente desfasado en algunos aspectos con respecto a sus competidores más modernos
C#
Me gusta
- Lenguaje moderno y evolucionado que aúna características de los lenguajes imperativos tradicionales con algunas características de lenguajes funcionales o más modernos, como por ejemplo «query-expressions», «duck-typing», «decorators», etc.
- Puede ser un lenguaje compilado o un lenguaje interpretado; nos permite optar por el rendimiento y/o por la gestión automática de memoria y se comporta igual de bien en cualquier tipo de proyecto (salvo en el lado del «browser«, pero para eso el lider es
JavaScript
) - En los últimos años tanto el lenguaje como la plataforma
.NET
han evolucionado muchísimo y son perfectamente válidos en cualquier arquitectura o plataforma (salvo «mainframes«, pero ¿a quién le importa eso?)
No me gusta
- Lenguaje complejo y extenso que hace que sea difícil de dominar por completo
- La gestión de dependencias es a menudo compleja y dificultosa, y a veces su facilidad de uso está demasiado vinculado con herramientas fabricadas (fijaos que no digo vendidas) por Microsoft
- No puede ser considerado al 100% como un lenguaje «full-stack» puesto que en su caso no hay un lenguaje «hermano pequeño» (de scripting) que llegue hasta la capa de presentación en los clientes web por ejemplo
Java
Me gusta
- Lenguaje muy orientado a OOP con una razonable relación entre el esfuerzo de aprendizaje del lenguaje y el grado de dominio de la OOP. Nos permitirá tener un buen dominio de la programación OOP a un coste un poco menor que
C++
por ejemplo, lo que también le hace un lenguaje idóneo para aquellos que queráis manejaros con soltura por el «mundo de los objetos» - Igual que en el caso de
C++
, tiene una numerosísima comunidad de desarrolladores y una ingente base de código fuente publicado que nos puede ayudar a aprender o a buscar soluciones codificadas en Java - Un más que atractivo soporte multiplataforma, siempre que no nos atemos con «packages» de terceros que nos limitarán este aspecto. Perfectamente válido en cualquier SO, dispositivo o ambiente de ejecución (incluso en los «mainframes» en este caso)
No me gusta
- Desde su «adquisición» por Oracle/Sun el lenguaje y su plataforma estándard están de facto en manos de compañías, cuando en su momento fué el «abanderado» del Open Source. No tengo muy claro cual es el futuro que le puede deparar al lenguaje y a sus «fans»
- Sus últimas evoluciones no tienen la frescura que por ejemplo si que han ganado
C#
oC++
lo que le hace ir perdiendo atractivo versión tras versión - Mucha volatilidad en la adopción o utilización de sus «frameworks» asociados (recuerdo cuando JSF se quiso convertir en el estándar de desarrollo web en Java y ahora todo el mundo usa Spring por ejemplo) Creo que esto puede estar debido a quién realmente está respaldando el lenguaje (ya me entendéis)
Rust
Me gusta
- Bastante sencillo de asimilar si vienes de otros lenguajes como
C++
oC#
lo que hace no solo la sintaxis si no también parte de sus conceptos básicos sean muy «naturales» para mucha gente - La manera que tiene de solucionar cuestiones como el manejo automático de asignación de memoria o su OOP es muy muy interesante aunque a menudo sea un reto su entendimiento
- Compagina conceptos innovadores (como los «traits» o el «ownership«) con construcciones más tradicionales («struts«, o «generics«) que hacen que su curva de maestría tenga un punto de inflexión o de aceleración a partir del cual el programador puede despreocuparse de ciertas cuestiones que en otros lenguajes siempre estará atado a ellas
No me gusta
- Demasiado innovador en muchas cuestiones lo que a mi entender le hace poco adecuado para programadores noveles o en los primeros niveles de aprendizaje. Sobretodo porque además su compaginación con otros lenguajes es también complicada. Si has aprendido a desarrollar por primera vez con el concepto de «ownership» y las ayudas del compilador para no generar «bugs«, cuando vayas a otro lenguaje no vas a encontrar un soporte similar
- No es un lenguaje «full-stack» a día de hoy, y en su evolución creo que tampoco apunta a ello
- Es el «rookie» de los lenguajes analizados en esta serie de posts, por lo que promete bastante pero veremos al final hasta donde llega. El desarrollador que apueste por él debe saber que su esfuerzo puede que no se vea completamente recompensado en un futuro.
Go
Me gusta
- Lenguaje moderno que compagina características innovadoras (programación concurrente potente y sencilla, o los punteros sin tener que asignar memoria) con otras más tradicionales como por ejemplo su sintaxis heredada en parte del
C/C++
- Es un buen lenguaje al que ir cuando uno parte de otro anterior de características similares. Por ejemplo, puedo entender que resulte sencillo y atractivo para desarrolladores que vengan de
C#
oJava
por ejemplo - Complementado por una buena gestión de dependencias, compilador/»linter» y una «standard library» que le otorgan potencia desde la primera línea de código
No me gusta
- Es curioso que un lenguaje de «última generación» prescinda de cuestiones como los «generics» (tan actuales hoy en día) o que use punteros para resolver el paso de parámetros por referencia. Esto le dota de ciertos ángulos «absurdos» que dejan perplejos a desarrolladores que vengan de otros lenguajes
- En este caso, tampoco
Go
puede ser considerado como un lenguaje «full-stack» lo que le va restar enteros como lenguaje de «cabecera» o como primer lenguaje para desarrolladores «noveles» - Las construcciones que aporta para la programación concurrente me dejan un poco pensativo. No sé si aportan realmente algo diferencial. Aquí no quiero ser categórico porque como dije en el análisis correspondiente no tengo muy claro si esto es así o me faltan elementos de juicio
Python
Me gusta
- Lenguaje de marcado propósito general y que permite prácticamente casi cualquier tipo de proyecto. Si ambicionas ser un desarrollador «full-stack» este lenguaje podría ser un comienzo
- Algunas construcciones del lenguaje como el manejo de listas, los «generators«, la definición por comprensión y otras son interesantes y aportan mucho valor en determinados escenarios
- El lenguaje está respaldado por una potente comunidad de desarrolladores, su «standar library«, una importante base de código fuente publicado así como módulos de libre acceso lo que permiten a cualquier desarrollador y proyecto cubrir sus necesidades de manera sencilla
No me gusta
- Que en la actualidad haya 2 «major versions» de
Python
, y aunquePython2
tiene fecha de fin, nada evita que la gente siga desarrollando y haciendo cada vez más difícil la «extinción» de dicha versión. Nunca ha sido bueno tener dos especificaciones de un mismo lenguaje. Aunque el «backporting» realizado en su momento limitó mucho las diferencias entre ambas versiones y en la teoría casi todos los nuevos desarrolladores ya empiezan directamente en Python 3.x - La orientación a OOP que tiene en lenguaje es de «andar por casa». De hecho hasta la que tienen lenguajes como
PHP
incluso en versiones de hace unos años son mucho mejores y más completas. Esto hace que yo, personalmente, siga considerando aPython
como un lenguaje mas cercano al «scripting» que a un lenguaje de programación completo - Lo siento pero no puedo dejar de mencionar su sintaxis e indentación. Se me hacen muy cuesta arriba. Además de que casi todos los lenguajes actuales siguen derivando de la sintaxis «curly-bracket» y que cada vez más los IDE y los editores de código ya tienen integrados «linters» que hacen mucho más legibles los códigos fuentes si necesidad de forzar a nadie a seguir «sintaxis alternativas»
Conclusiones Finales
Como habréis visto todos los lenguajes analizados en esta serie tienen su parte atractiva y también aspectos no tan bien solucionados, es muy difícil que un único lenguaje desempeñe a muy buen nivel en todos los aspectos y tipos de proyectos que existen en la actualidad. Además, tradicionalmente, en las comunidades de desarrolladores, el tema del lenguaje de programación ha sido una cuestión tan personal y subjetiva como la elección de tu equipo de fútbol o la marca de tu móvil o tu moto.
Dejando las «pseudo-argumentaciones» de los «fan-boys» y «fan-girls» creo que un buen desarrollador debería al menos considerar dominar un par de buenos lenguajes de programación y tener conocimientos generales de casi todos ellos (al menos para poder interpretar cualquier código fuente en gran medida). Recordad que un buen desarrollador, para seguir siéndolo, tiene que «leer» código de manera habitual como cualquier persona debería de leer textos (libros, periódicos, revistas, etc.) para mantenerse informado y preparado.
En mi opinión distinguiría entre dos tipos de desarrolladores. Primero, los desarrolladores noveles o los que empiezan en el mundo del desarrollo. En este caso, los lenguajes de cabecera para mí serían C/C++
o C#
o Java
, y como segundo lenguaje de cabecera sugeriría Python
. Esto nos dotaría de una base general de conocimiento que haría nuestro perfil más atractivo desde el punto de vista laboral y nos permitiría además tener capacidad de aumentar nuestro acervo como programadores más adelante con otros lenguajes.
Si por el contrario, nuestro caso es el de alguien que ya tiene una trayectoria en el mundo de la programación, intentaría complementar el perfil con lenguajes que quizá no están tan difundidos hoy, pero que van ganando tracción día a día, como podrían ser Go
o Rust
o incluso si venimos de lenguajes más «tradicionales» complementaría con Python
.
En definitiva, todos los lenguajes analizados en esta serie son interesantes y atractivos, siendo los lenguajes «full-stack» lo que a día de hoy se llevan la palma, pero lenguajes de nuevo diseño están pegando fuerte. Es responsabilidad de los buenos desarrolladores el mantenerse actualizados para competir en un mercado laboral cada vez más exigente.
Brutal todos los análisis, pero más brutal tu conclusion.
No puedo estar más deacuerdo contigo en todo (creéme, soy una mosca cojonera y tocapelotas … es la primera vez que coincido 100% con un/varios analisis).
En resumen:
Un primer lenguaje de calidad [c#, c++ o java, si eres abuelo, go o rust, si eres joven] y python para todo lo demás.
Mi elección:
c# para cosas serias, python para scripting y go para divertirme.