lunes, 6 de agosto de 2018

Aprender C#, Java ó C++

Recientemente me volvieron a realizar la clásica pregunta de aquellos que quieren aprender a programar: ¿Qué lenguaje debo aprender?

  

Mi respuesta

Voy a dar una respuesta breve y después comentaré las razones de ello y las circunstancias en que doy esa respuesta: aprende C#

Como ya te podrás imaginar, no hay una sola respuesta para ello ya que intervienen muchísimos factores, tales como: si es por hobby o porque te quieres dedicar a ello profesionalmente, si quieres programar sistemas empresariales o videojuegos, aplicaciones de escritorio, aplicaciones web o aplicaciones móviles y un largo etcétera.

Conocer un lenguaje te facilita aprender otro.


Para aquellos que recién comienzan a programar puede parecer que aprender un lenguaje de programación es complicado y que es mejor aprender "el bueno" desde el principio, sin embargo, los que ya somos veteranos en esto podemos decir que lo de menos es aprender la sintaxis lenguaje nuevo.

Actualmente resulta incluso más sencillo que hace unos años puesto que ahora contamos con autocompletado de código, reportes detallados de errores de compilación, un montón de tutoriales en Youtube, portales como StackOverflow y redes sociales donde podemos poner una pregunta y aclarar nuestras dudas.

Hace tiempo, para una conferencia que impartí en la Universidad Autónoma de Nayarit (en 2008 o algo así, ya ha llovido bastante desde entonces) creé el gráfico que ves a la izquierda de este párrafo, supongo que debería actualizarlo y ampliarlo. Lo que trato de expresar con él, es que los lenguajes de programación están muy interconectados, si conoces uno de los "grandes" o "clásicos" entonces ya conoces algo, o mucho, de los que derivaron de él.

Por ejemplo:

  • si conoces C entonces ya conoces algo de C++ y por ello algo de Java y C#.
  • Visual Basic 6 (ahora obsoleto) nos llevó a Visual Basic.NET
  • Pascal te facilita Delphi y sus derivados como Kilyx y Delphi.NET

¿En qué se parecen C++, C# y Java?


Dicen que "para muestra basta un botón", veamos la instrucción "for" en cada uno de los tres lenguajes.

C#
Java

C++



El ciclo "for" se declara de la misma manera en los tres lenguajes. Es cierto que para imprimir algo en la consola C# utiliza "Console.Writeline", Java utiliza "System.out.println" mientras que C++ "cout", si utilizaran exactamente las mismas instrucciones serían exactamente el mismo lenguaje, sin embargo esas similitudes en la sintaxis se repiten con las instrucciones "if", "switch" y en parte, en la declaración de funciones así que aunque tengan sus diferencias, por lo menos sus similitudes te permitirán aprender el segundo lenguaje en menor tiempo que lo que te tomó el primero.

¿En qué se diferencian C++, C# y Java?


Al igual que sucede con todos los lenguajes que comparten una parte de su sintaxis, la primera diferencia que tienen es la otra parte de la sintaxis.

Por ejemplo, el operador para las expresiones Lambda (no es importante que aprendas este concepto en este momento, el ejemplo es solo ilustrativo), en C# se escribe "=>" mientras que en Java es "->", como concepto son lo mismo y de hecho ambos representan una flecha, pero se escriben diferente. Esto es porque surgieron en diferente tiempo en cada lenguaje o simplemente porque dada la filosofía con la que está diseñado el lenguaje hacía más sentido ponerlas de diferente manera.

En C++ el uso de expresiones lambda es posible desde la versión 11, que surgió como estándar en 2011 (ref 1, ref 2). Mientras que en C# están disponibles por lo menos desde C# 3 el cual estuvo disponible en 2007.

Otra diferencia muy importante es: las librerías, funciones o módulos que componen el framework del lenguaje en cuestión. Cada lenguaje va a implementar sus librerías en diferentes clases o jerarquías de objetos aunque al final puedan servir para lo mismo, como el caso de los Buffered Streams en Java y los Stream Readers en C#.

Entonces, ¿porqué C#?


Básicamente me parece que en este momento y para un principiante C# es la mejor opción debido a la flexibilidad que da el poder "moverse" a otros lenguajes. Es cierto que casi casi da lo mismo aprender primero C++ o C# o Java y ya desde ese punto de vista no conviene quebrarse la cabeza.

Supongamos que quieres crear aplicaciones más "cercanas" al procesador, entonces recomendaría C++, pero la verdad es que no me veo programando aplicaciones empresariales (páginas web, reportería o aplicaciones de escritorio) en C++, eso resulta más sencillo en C# ó Java. De igual forma, si solo vas a programar aplicaciones para Android entonces probablemente lo mejor sería aprender Java (y aún eso tiene sus condicionantes), o si serán videojuegos de gama alta, por ejemplo con el motor Unreal Engine o diseñando tus herramientas desde cero, entonces ve agarrando un libro de C++. En cambio te interesan videojuegos multiplataforma (que puedan correr en Android, iPhone, Windows, XBox) lo más lógico sería C#.

Dicho todo lo anterior, hay que recalcar que en esto de la programación una herramienta no es mágica, no sirve para todo, cada una tiene su ámbito, pero creo que actualmente C# te permitiría "moverte" más fácilmente a C++ y Java en caso de ser necesario y además el uso que le han dado herramientas como Unity para creación de videojuegos ó Xamarin para aplicaciones móviles le dan una mayor versatilidad.

¿Y que hay de Visual Basic .NET?, si ya conoces VB.NET entonces te puede resultar muy sencillo moverte a C# debido a que los objetos del framework se encuentran en las mismas clases y librerías, la diferencia es la sintaxis propia del lenguaje pero aún así, conociendo VB.NET diría que conoces por lo menos 50% de la programación con C# (no del lenguaje C# sino de los elementos que intervienen en un programa) y te podría suceder como a mí que realicé "el salto" de VB.NET a C# en una semana, pero claro, ya conocía C++ aunque lo tenía algo oxidado.

¿Eres nuevo, te interesa programar y no sabes por donde empezar?, aprender C#

¿Estás de acuerdo conmigo?, bien, me gustaría conocer tu experiencia, déjame un comentario.

¿Estás en desacuerdo?, excelente, cuéntame tu punto de vista.

Saludos!