miércoles, 30 de agosto de 2017

The State of C# en Español (El estado de C#)

Traducción al español del excelente paper llamado The State of C# publicado por Progress (los dueños del producto Telerik), el 25 de agosto de 2017. Tiene algo de publicidad a su producto estrella, hay que admitirlo, pero tiene muchas cosas interesantes de C#, del mercado, de Visual Studio y de las últimas características en la versión 7.0. Escrito por originalmente por Kevin Griffin. Traducido por Hernaldo González.

Resumen

Imagina que eres un desarrollador en los años 90. Tienes una variedad de herramientas a tu disposición: C++, Java, Delphi, Visual Basic, FoxPro y otros. Sabemos que cada uno de esos lenguajes tiene cosas muy buenas, pero también sus propias fallas.

Al comienzo del año 2000, Microsoft públicamente anunció sus planes para su .NET Framework, el cual era una serie de librerías administradas. Este nuevo framework, sin embargo, necesitaba un nuevo lenguaje. Se le llamó en un inicio "Cool", C# había nacido.

C# fue originalmente diseñado para ser abierto, pero bajo estándares. Cada versión de C# es aprobada no sólo por Microsoft, sino por ECMA International y la International Organization for Standardization (ISO). ¿Qué quiere decir esto para el desarrollador? Cualquiera puede hacer un compilador de C# para sus sistemas operativos. El Mono Project, el cual es una implementación tipo código abierto del compilador C# y del .NET Framework, es el perfecto ejemplo del C# estándar en acción.

C# ha tenido 5 revisiones importantes desde su versión 1.0 en el año 2002. En este tiempo ha tenido varias mejoras importantes como: generics, métodos y tipos anónimos, propiedades automáticas, expression trees, dynamics, métodos asíncronos y compilación como servicio. No es una lista detallada, pero es para ver como C# fue creciendo a través de los años.

Ahora, si eres ingeniero informático, analista de sistemas y vas en el último año de la carrera o estás recién egresado y estás buscando el norte en la industria de la informática, la pregunta que deberías hacerte a ti mismo es: "¿Debería aprender C# para tenerlo dentro de mi portafolio de conocimientos"?

Carrera de un desarrollador C#

En la encuesta anual de StackOverflow del año 2016, situó a C# como el 5to lenguaje que deberías conocer. Además se les consultó a los usuarios que lenguaje les encantaba, cuales conocían y cuales quisieran usar. Si miras el lenguaje que más les encantaba, temían o querían trabajar (Most Loved, Dreaded, and Wanted) y cual consideraban muy tecnológico (Top Tech), C# estaba en ambos listados del top.

¿Qué hay de los otros lenguajes de la lista? Mientas muchos desarrollan en JavaScript, Android o Java, ninguno de ellos cae en la categoría que los desarrolladores les encanta trabajar con ellos. En cambio C# si.

¿Qué tal el sueldo promedio de un desarrollador C#? Un desarrollador en un trabajo horario de oficina full time, gana 95 mil dólares al año (N. Del T. que en pesos Chilenos serían 5 millones mensuales, wuau, cambio al 25 de agosto 2017). A menudo en este sueldo se incluye que también sabe JavaScript y otros cosas. La única forma de ganar más, digamos unos 105 mil dólares al año (5.6 millones mensuales Chilenos) requiere que el desarrollador sepa tecnologías basadas en la nube como Reac o Redis.

Si hablamos de un desarrollador front-end, el sueldo promedio baja a 75 mil dólares al año (3.9 millones mensuales Chilenos). Lo que si, la encuesta no indica si es un desarrollador Web o también incluye aplicaciones de escritorio.

Un desarrollador C# especializado en los datos y con conocimientos de Machine Learning (N. Del T. Librerías que simulan el pensamiento humano como aplicaciones predictivas o de reconocimiento de caras en imágenes), puede ganar hasta 85 mil dólares al año (4.5 millones mensuales Chilenos). Los mismos números aplican para un desarrollador Android cuyo lenguaje principal es C#. Incluso lo que gana un desarrollador iOS o un desarrollador Android, no se diferencia mucho de lo que gana un desarrollador C# que implemente para ambas plataformas usando Xamarin.

Herramientas

La herramienta más conocida por los desarrolladores de C# es el IDE Visual Studio. Es importante saber que que Visual Studio no está limitado solo a C#, de echo, cuando se estaba creando, Visual Studio se usaba para desarrollos de Visual Basic o C/C++.

Actualmente se puede usar para diversos lenguajes como Visual Basic, C/C++, F#, C#, Python, Ruby, HTML, JavaScript y otros.

Esta variedad de lenguajes soportados es posible gracias al sistema de plugins que tiene el editor. Permite que un desarrollador de Microsoft, o incluso de la misma comunidad, desarrolle complementos que funcionen correctamente con los subsistemas de Visual Studio.

Hay muchas características de Visual Studio que hace que los desarrolladores no se vayan. En primer lugar, está el editor de código de clase mundial. A medida que codificas, a menudo eres asistido directamente por Visual Studio a través de una función llamada Intellisense. Esta función analiza el código después de cada pulsación de tecla y, a menudo, puede proporcionar el autocompletado de variables y métodos. Esta previsión inteligente está diseñada específicamente para el lenguaje que estás desarrollando, lo que significa que Intellisense C# e Intellisense CSS son experiencias diferentes que resuelven el mismo tipo de problema. Las herramientas de depuración que tiene integradas te ayudan a reducir problemas específicos, y permiten por ejemplo, hacer un "paso a paso" de las líneas código.

¿Habrá una característica que le falte a Visual Studio que haga que mejore tu experiencia de desarrollo?
Hay un gran grupo de proveedores en la industria que desarrollan herramientas para aumentar y mejorar la experiencia de desarrollo usando Visual Studio. Por ejemplo, Telerik de la empresa Progress es el creador de JustCode, una extensión de Visual Studio que hace que la codificación sea más rápida y fácil añadiendo más inteligencia y accesos directos al editor de código de los que ya vienen por defecto en el IDE.

En versiones antiguas de Visual Studio debías incluso pagar por su uso, o podías usarlo sólo si estabas suscrito a MSDN. Desde Visual Studio 2015, Microsoft estrenó Visual Studio Community Edition, una versión gratuita de Visual Studio que a la vez permite usar cualquier plugin que desees instalar. A diferencia de los anteriores Visual Studio Express, cualquier aplicación creada por un desarrollador individual ahora puede ser usada de forma comercial.

Visual Studio es el Roll Royce de los entornos de desarrollo. El gran obstáculo que alegan algunos desarrolladores es que es una herramienta poderosa pero sólo para desarrollar aplicaciones que funcionan en Windows. El mercado actualmente está lleno de herramientas que permiten desarrollar para Linux u OSX.

En una conferencia del año 2016, Microsoft anunció el editor Visual Studio Code. Visual Studio (VS) Code puede ser usado para codificar para que funcione en un ambiente Windows, OSX o Linux.
Aunque sea una herramienta más liviana, VS Code soporta varias cosas que tiene Visual Studio. Tiene un editor con estilos de colores según el lenguaje, ¡soportando C#, C++, F#, Elixir, Docker, Python, Ruby and otros!

VS Code no ofrece un Intellisense completo que si encontrarías en Visual Studio. Sin embargo, VS Code proporciona una robusta funcionalidad de code completion para varios lenguajes.
Para los desarrolladores que trabajan con C#, Node.js y Python, hay soporte de depuración incorporado adicional.
Al combinar la ligera arquitectura que posee y el soporte multiplataforma, VS Code es una excelente herramienta para que un desarrollador comience con C#.

Por último, si ya eres fan de otro editor que no sea VS Code, asún estás con suerte. Los desarrolladores de Microsoft junto con muchos colaboradores externos, han construido un plugin increíble llamado Omnisharp. Con Omnisharp, puedes inyectar Intellisense de Visual Studio directamente en el editor de tu preferencia.
Actualmente, Omnisharp es compatible con Atom, Brackets, Emacs, Sublime Text y Vim. También es el motor que potencia las características de code completion de VS Code.

El objetivo subyacente a todas estas herramientas, independientemente de cuál de ellas elijas utilizar, es que si eres un desarrollador que trabaja con C# y .NET Framework, tu experiencia sea inigualable.

Plataformas

¿Qué hemos visto hasta ahora? C# es un lenguaje basado en estándares donde sus características han crecido exponencialmente en los últimos 15 años. Combina eso con un conjunto de herramientas de desarrollo de clase mundial y te estarás preparando para una gran carrera de desarrollo centrado únicamente en Windows, ¿correcto?

¡De ningún modo! Con toda esa inversión de tiempo y energía en C#, no hay límite para el número de plataformas que podrás desarrollar. A continuación, cubriremos algunos de los entornos más comunes que los desarrolladores de C# pueden implementar.

Escritorio

La creación de aplicaciones para Windows siempre ha sido un elemento básico para el desarrollador de C#. Al principio, nuestras aplicaciones se escribieron utilizando Windows Forms (WinForms). WinForms, combinado con las potentes herramientas de diseño dentro de Visual Studio, permite a un desarrollador rápidamente previsualizar la apariencia de una aplicación. La lógica de negocio para las interacciones de los controles se hizo simplemente mediante el uso de eventos.

WinForms también podía ampliarse aún más mediante el uso de suites de terceros, como Telerik WinForms. Estas suites de control ofrecen una amplia variedad de características que faltan en los controles de base proporcionados por defecto. Los controles tales como grids, gráficos y más, podrían fácilmente demorar meses de desarrollo a un equipo de desarrolladores si lo hicieran desde cero, e incluso así, estos controles no serían tan ricos en funciones como lo que se obtiene con la UI de Telerik para WinForms.

Un efecto secundario de tener un flujo de trabajo que se inicia con la etapa de diseño como es en WinForms, es que las aplicaciones comenzaron a crearse con ese mismo look & feel. El término "gris acorazado" fue muy conocido en toda la industria porque reflejaba cómo se veían todas las aplicaciones de WinForms. Desviarse de la norma era difícil, incluso con la ayuda de herramientas de terceros.

Con el lanzamiento de C# 3.0, Microsoft anunció el Windows Presentation Foundation, o WPF. Esto hizo repensar el proceso de construcción de aplicaciones centradas en Windows. En lugar de un enfoque centrado en el diseño, los desarrolladores podrían construir las interfaces de usuario con un nuevo lenguaje llamado XAML.

Las aplicaciones construidas con WPF seguían usando C# tras la cortina. Sin embargo, los desarrolladores ahora tenían la capacidad de construir interfaces más robustas tan fácilmente como si fuera HTML.

Aquellos que querían una experiencia de diseño similar a WinForms podría utilizar Blend, una herramienta de diseño similar a Photoshop, pero especializada en la generación de XAML. Al igual que con WinForms, un desarrollador que no quería reinventar la rueda podía utilizar una de las asombrosas suites de control de terceros disponibles, como la UI de WPF.

La liberación de Windows 10 abrió un nuevo mundo de oportunidades para los desarrolladores de Windows. Windows ya no es sólo un sistema operativo de escritorio. Se puede ejecutar en escritorios virtuales, pero también sobre dispositivos Windows Mobile, Xbox One y Hololens.

Con la llegada de Universal Windows Platform (UWP) se creó un entorno en el que un desarrollador podía crear una única aplicación que podía ejecutarse de forma nativa en Windows 10, pero también con unos pocos ajustes, realizar implementaciones para Windows 10 Mobile y Xbox One. Debajo de la alfombra, hay un potente subsistema accesible a través de C#, C++, Visual Basic y JavaScript. Las tecnologías de WPF y XAML se combinan fácilmente.

Web



Ahora, volvamos nuestra atención al módulo Web, más conocimo como ASP.NET. En los últimos años, ha habido tres revoluciones por el lado de ASP.NET.

En los primeros días de .NET y WinForms, Internet estaba todavía en su infancia. El concepto de constriur una aplicación comercial basada en la web era relativamente nuevo, y las herramientas no estaban diseñadas para manejar aplicaciones en esta escala.

¿Cómo una compañía enfocada en desarrolladores como Microsoft toma millones de programadores con conocimiento de WinForms y patrones de diseño similares y los convierte en desarrolladores web? La respuesta está en el nacimiento y la liberación inicial de ASP.NET WebForms.

Cualquier desarrollador que tuviera experiencia con WinForms podría traducir rápidamente esas habilidades a la web. Después de todo, era similar a WinForms, una aplicación WebForms se iniciaba con un diseño y el control se hacia mediante el uso de eventos (event handlers).

Su núcleo fue, una vez más, C#.

La web ha madurado mucho desde el inicio de WebForms. En 2007, ASP. NET se convirtió en la versión inicial de ASP.NET MVC, una implementación del patrón Model View Controller construido en la capa superior de ASP.NET. Los desarrolladores que querían un entorno más puro para crear aplicaciones web podrían usar ASP.NET MVC, así podían crear aplicaciones que no tuvieran esa sobrecarga de ASP.NET WebForms.

Hubo una falla fundamental en la creación de aplicaciones ASP.NET: su estrategia de deploy se centró únicamente en el uso de Internet Information Services (IIS) sobre un servidor Windows. El hosting basado en Windows es a menudo más costoso de configurar y mantener frente a Linux o sistemas operativos similares. El ecosistema de ASP.NET era principalmente para la empresa, que podía pagar los costos de licencias, o para sitios de bajo tráfico que podrían funcionar eficientemente dentro de ambientes compartidos.

A finales de 2015, ASP.NET pasó por otro "renacimiento" con la introducción de ASP.NET Core (y .NET Core framework).

A diferencia de su predecesor, ASP.NET Core es opensource, una plataforma abierta que rearma el cómo funciona ASP.NET. Todavía estamos en los primeros días de esta plataforma, pero imagina ser capaz de construir una aplicación web completa en ASP.NET que se puede implementar rápida y fácilmente a Windows, Linux o incluso OSX sin ningún cambio de código.

Actualmente, los únicos idiomas soportados en ASP. NET Core son C# y F#, mientras que Visual Basic ya lo es desde el inicio.

Mobile



Sabemos que C# es bueno para aplicaciones web y de escritorio, pero todos sabemos que para móviles no es buena ¿cierto?

Como dijimos anteriormente, con Universal Windows Platform, puedes generar aplicaciones para Windows 10 Mobile con unos simples cambios en la configuración. Ahora si miramos el mercado estadounidense vemos las ventas del año 2016 para Windows Phone y estás apenas alcanzan el 3% del total. La mayoría de las ventas las tiene iOS y Android.

Una falla en la industria es que si quieres desarrollar aplicaciones iOS, necesitas aprender Objective-C o Swift. Si deseas desarrollar aplicaciones para Android, necesitas saber Java.

En febrero de 2016, Microsoft compró Xamarin, un framework para la construcción de aplicaciones iOS y Android sobre la capa superior de la Plataforma Mono.

El truco de Xamarin es que puedes construir para Android nativo, iOS nativo e incluso aplicaciones nativas de Windows usando la misma base hecha en C#. Ninguna otra plataforma puede presumir de dichas características. No siquiera las soluciones móviles multiplataforma como PhoneGap o WebView, donde la experiencia es un simple shell a la cual las aplicaciones son inyectadas. Xamarin ofrece a los desarrolladores acceso a la misma apariencia y la sensación que los usuarios de iOS y Android esperan ver.

Entonces, recapitulemos todas las plataformas que un desarrollador de C# podría encontrarse en el mercado. En primer lugar, para el tipo escritorio, puede trabajar en aplicaciones Windows Forms, Windows Presentation Foundation y la nueva Universal Windows Platform. La siguiente es la web, donde una aplicación podría ser construida con ASP.NET WebForms o ASP.NET MVC. Los desarrolladores más astutos ahora pueden incluso usar ASP.NET Core, lo que les permite trabajar no sólo en Windows, sino en Linux u OSX. Por último, el mercado móvil se alcanza mediante el uso de Xamarin para crear aplicaciones móviles multiplataforma que comparten una base de código común escrita en C#.

Quince años de innovación y de nuevas características

Hasta ahora, hemos hablado mucho del estado actual del ecosistema de C#. Hay fácilmente 15 años de plataformas y sistemas construidos sobre C#. Sin embargo, aún no ha alcanzado su límite. Más bien, toda esta innovación es posible porque C# continúa madurando y creciendo como un lenguaje.

¿Cuáles son algunas de las principales características que ha tenido en 15 años de innovación? Si ya eres un desarrollador de C#, las sabrás de memoria.

Algo tan simple como Generics, Partial Types y Nullable types no existían hasta la versión C# 2.0. En la versión C# 3.0 se introdujeron Extension Methods, Expression trees, Lambda expression y otras cosas. Estas características permitieron que existiera LINQ (Language Integrated Query), una característica que cambió bastante la forma en que los desarrolladores de C# trabajaban la data.

C# 4.0 cambió radicalmente la forma en que los desarrolladores usaban los tipos, introduciendo dynamic types a un lenguaje de tipo estático. Métodos asíncronos se agregaron en C# 5.0, lo que proporcionó a los desarrolladores una forma de construcción de aplicaciones más eficientes, permitiendo que las tareas largas de ejecución fueran asíncronas.

Por último, en C# 6.0, vimos el compilador Roslyn (Compilador como servicio), que proporciona un compilador C# a los desarrolladores para que se utilizara en tiempo de ejecución. También proporciona herramientas de análisis de código y potencia muchas de las características del desarrollador integradas en Visual Studio.

Esta lista no es la más completa, pero proporciona un amplio panorama de cómo C# ha madurado a lo largo de los años. Si eres nuevo en C#, tómate el tiempo para revisar en detalle esta lista de características.


¿Qué hay de nuevo en C# 7.0?

Ahora, cambiemos el enfoque y hablamos de lo que viene a nivel de código. Respondamos la pregunta: "¿Qué hay de nuevo en C# 7.0?"

Es importante tener en cuenta que los siguientes ejemplos y conceptos están todavía en revisión. Su contexto y sintaxis aún se está desarrollando, y no hay garantía de que estas características no se cambien o eliminen en el futuro.

Out Variables (Variables de salida)

La palabra out no es nueva en C#. Si declaras una variable dentro de un método que tenga un parámetro con un out, estás indicando al compilador que estás esperando que el método setee ese valor en tiempo de ejecución.
public void TestMethod()
{
  string fullName;
  GetPersonName(“Kevin”, “Griffin”, out fullName);
}
Comúnmente, el problema es que tienes que declarar la variable antes de hacer la llamada al método con out. En C# 7.0, está el concepto de variables out, lo que te ahorrará un par de pulsaciones de teclas ya que declarará la variable en línea.

El ejemplo anterior puede ser refactorizado en este:
public void TestMethod()
{
  GetPersonName(“Kevin”, “Griffin”, **out string fullName**);
}
En paralelo, si no sabes el tipo del parámetro, puedes cambiar el tipo del parámetro por var.

Pattern Matching (Coincidencia de patrones)

En C# 7.0 se da un fuerte énfasis en la característica de Pattern Matching. Básicamente consiste en que C# permite buscar algún patrón o ámbito para realizar cierta operación. Como verás más adelante también permite extraer un valor si coincide con el patrón definido.

El siguiente ejemplo muestra claramente como funciona Pattern Matching con la instrucción Switch:
switch(person)
{
  case CEO ceo:
    CallCeo(ceo);
    break;
  case Manager salesManager when (salesManager.Department == “Sales”):
    CallSalesManager(salesManager);
    break;
  case Manager other
    CallManager(other);
    break;
  default:
    WriteLine(“Standard employee”);
    break;
  case null:
    throw new ArgumentNullException(nameof(person));
}
Recorramos la instrucción Switch paso a paso. El objeto "Persona" se validará con la instrucción Switch y vamos a evaluar dicho objeto de forma distinta dependiendo del tipo y datos que contenga el mismo.

En el primer case, si Persona coincide con el objeto CEO, hará el match y retornará el handler respectivo. En una instrucción evaluaremos si es manager pero a la vez tiene un departamento "sales", entonces llamaremos a una función. Cuando se usa when se evalúa contra el objeto salesManager recién generado. En la siguiente condición queremos evaluar si el objeto es sólo un manager.

Aquí hay dos escenarios. El caso más común es usar el case default, donde tenemos un objeto que no coincide con ninguno de los patrones anteriores. Al final, también hay un caso null que asegurará que el objeto pasado tenga un valor, y lanzará una excepción ArgumentNull cuando esto suceda.

Is-Expressions (Expresiones IS)

Basándonos en la explicación anterior acerca de variables out, podemos usar variables de patrón para crear variables a demanda dentro de un bloque de código.
public void LoadPerson(object age)
{
  if (age is int ageInt || (age is string ageString &&
  int.TryParse(ageAsString, out ageInt)))
  {
    // ageInt contains a value.
  }
}
Mirando el código, tenemos un caso donde la "edad" de una persona puede entrar en nuestra aplicación como un string o integer. Si la edad es integer, inmediatamente caerá en esta condición. Pero, si edad es un string, tendremos que realizar una conversión utilizando el método int.TryParse.

Como sabemos, el mayor problema con TryParse es que se debe definir la variable antes de la llamada al método TryParse. En C# 7.0, esto ya no es necesario. Puede crear la variable a demanda si el método TryParse retorna True.

Tuples (Tuplas)

En C# 3.0 se agregó el tipo de referencia Tuple<>. ¿Qué es una Tupla? En pocas palabras, una Tuple es una colección de valores.

Imagina el ejemplo anterior donde cargamos la información de una persona. Hay varias formas en que podemos devolver los datos de un método:
public Person LoadPerson(){}

public Tuple LoadPerson(){}
El primer ejemplo devuelve un fully qualified type (N. del T. el objeto completo) y dependiendo del caso, esto es perfectamente aceptable.
Sin embargo, ¿qué pasa si el tipo Persona es descartable? Vas va a recuperar datos, utilizarlo y tirarlo. Crear el tipo Persona para un solo método es un poco engorroso.

El segundo ejemplo utiliza el tipo genérico Tuple<> para recuperar la misma información. ¿Cómo sería la llamada a LoadPerson?
public void Foo()
{
  var person = LoadPerson();
  var fullName = $"{person.Item1} {person.Item2}";
}
Para un sencillo Tuple de dos valores, estamos empezando a desviarnos del camino de la legibilidad. ¿Qué se supone refleja el elemento 1 o el artículo 2? ¿Es su nombre y apellido respectivamente? ¿Podría ser el nombre y la dirección? ¿Ciudad o país?
No hay mucho que intuir porque Item1 y Item2 son tan explicativos como "a" o "b".

Con C# 7.0 vamos a tener acceso a Tuplas reales de una manera más cercana a lenguajes funcionales como F#. La firma de método LoadPerson() se refactorizaría así:
public (string firstName, string lastName) LoadPerson(){};
Observa la nueva sintaxis del tipo de retorno. El tipo de retorno Tuple actúa de forma similar al patrón utilizado para declarar los parámetros de una función. Por último, si deseas crear una Tuple en línea, se puede hacer mediante el uso de la nueva palabra clave.
return new (string firstName, string lastName) {firstName = "Kevin", lastName = "Griffin"};
Separador de dígitos

Archiva de esta característica como "útil pero algo loco". ¿Cuántas veces has creado un literal numérico y tuvo que contar el número de dígitos para asegurarse de que introdujo el número correcto?

Por ejemplo:
long Gigabyte = 1048576;
El número se ve aparentemente inofensivo, pero si se te olvida poner un dígito estarías en problemas. Normalmente, si alguien escribiera este número a mano, sería representado como 1,048,576. Las comas ayudarían a dictar la posición de los dígitos.

Los nuevos "separadores de dígitos" de C #7.0 te permiten hacer lo mismo, excepto que, en lugar de usar una coma, puedes usar el underscore.
long Gigabyte = 1_048_576;
El compilador ignorará los underscore en tiempo de construcción.

Throw Exceptions

Escribir código defensivo a menudo significa generar un montón de excepciones. En C# 7.0, hay algunos nuevos ajustes en donde puedes lanzar una excepción.

Por ejemplo, considera este método existente:
Public string GetName (persona persona)
{
  if (person.Name == null)
    throw new Exception("Name not found");
  return person.Name;
}
Con los nuevos cambios que dijimos, ese método puede ser rápidamente refactorizado en:
public string GetName(Person person)
{
  return person.Name ?? throw new Exception("Name not found.");
}
Non-Nullable Reference Types (Tipos no nulos)

Una de las excepciones más comunes lanzadas en las aplicaciones .NET es la Null Reference. ¿Cuál es el problema? Los tipos de referencia en C# son nullables por defecto. Esta condición previa causa que los desarrolladores aseguren su código a prueba de balas para evitar que se esté tratando de acceder a una variable que potencialmente podría ser null en tiempo de ejecución.

Para tipos de valores, como int o DateTime, no es posible que el valor sea nulo a menos que las definas como un tipo Nullable.
  int? intCouldBeNull;
  DateTime? nullableDateTime;
¿Qué pasa si los diseñadores de C# simplemente cambian los valores predeterminados? Todos los tipos de referencia ya no serían null por defecto, entonces tendrías que setear explícitamente una variable que pueda ser null.
Ok...pero romperías 15 años de código C#.

Como alternativa, ¿qué pasaría si pudiéramos declarar explícitamente que un tipo de valor sea "no null?" En C# 7.0, el operador "!" se usará para indicar que una variable no puede ser null.
string! nonNullableString;

Person! nonNullablePerson;
Utilizando el operador "!", le estamos diciendo a C# que nonNullableString y nonNullablePerson, por lo tanto, NUNCA deben ser null. En el caso de que se pase un valor null, esto debería causar un error o una advertencia del compilador.

Fundación estable, carrera estable

Si eres nuevo en la industria o un profesional experimentado, tienes la gran oportunidad de decidirte por alinearte con diferentes tecnologías que vayan contigo. C# ha mostrado a través del tiempo para ser no sólo una plataforma estable, sino un lenguaje que ha madurado y crecido a lo largo de los años para adaptarse a las cambiantes necesidades de los desarrolladores.
La última versión, C# 7.0, se encuentra en revisión. Se jacta de un conjunto de nuevas características diseñadas para hacer el código más fácil de leer y escribir.

StackOverflow, el recurso más confiable para desarrolladores de Internet en la actualidad, nos dice que C# es una de las cinco plataformas tecnológicas más importantes del mundo. Además, si miramos la encuesta de las tecnologías que los desarrolladores les encanta usar, sólo C# está en ambas listas. Ni siquiera con Java, que también se le considera uno de los mejores lenguajes de la industria, se puede decir que les encanta a los desarrolladores. Finalmente como guinda de la torta, un desarrollador que se especializa en C# puede, en promedio, ganar entre 85 a 95 mil dólares al año.

C# es una triple amenaza: es amado, es demandado y se paga bien.
Tampoco un desarrollador C# se limita a una vida construyendo las famosas ventanas grises de Windows. Como hemos comentado anteriormente, C# te permite crear aplicaciones de Windows en la nueva Universal Windows Platform, o puede usarse para construir aplicaciones más antiguas con Windows Forms. Los desarrolladores web pueden ahora crear sitios completamente funcionales que se ejecutan en Windows Server, Linux u OSX. Xamarin es un framework para que los desarrolladores C# construyan código de forma compartida y que está orientado a la creación de aplicaciones móviles nativas.

Las aplicaciones de clase mundial necesitan entornos de desarrollo de clase mundial. Durante más de 15 años, Visual Studio ha sido el Cadillac de los IDE. Con características como Intellisense, un sorprendente depurador y un rico ecosistema de add-ons, Visual Studio continúa impulsando el concepto de lo que un IDE debería ser.

Los desarrolladores que no necesitan todo el poder de Visual Studio, o quieren una experiencia similar en OSX o Linux, pueden usar Visual Studio Code. Es de código abierto y multiplataforma. Te ofrece una increíble experiencia de codificación en un pequeño paquete. Si ya tienes un editor y no te convence cambiarte, entonces puedes usar el complemento Omnisharp que te permite usar la experiencia Intellisense de C# en casi cualquier otro editor.

¿Es una buena decisión usar C#? La evidencia anterior habla maravillas sobre la viabilidad a largo plazo del lenguaje, el gran ecosistema de herramientas de desarrollo y los diversos nichos donde pueden aplicarse tus conocimientos. No importa si estas orientado a desarrollo de escritorio, web, móvil, C# es una apuesta segura para los próximos años.