Anúncios recentes feitos pela Microsoft começam a moldar o horizonte de longo prazo para a plataforma .NET:

  1. O time do ASP.NET Core anunciou que a versão 3 do framework web só vai rodar sobre .NET Core.
  2. No anúncio do lançamento do .NET Standard 2.1 foi anunciado também que o .NET Framework não vai implementar o padrão a partir desta versão.
  3. Uns dias antes o time de .NET deixou clara a diferença de estratégia entre .NET Core e .NET Framework, onde o .NET Framework focaria em estabilidade e compatibilidade com versões anteriores e se moveria de forma lenta, enquanto o .NET Core andaria mais rápido será onde a inovação vai acontecer.

Vou desenhar o que devemos esperar enquanto indústria com base nesses anúncios e o que espero que aconteça daqui para diante.

Evolução do C#

No terceiro post linkado acima a Microsoft diz que algumas novidades de linguagens e APIs vão acontecer somente no .NET Core. Liguemos isso ao fato de que, pela primeira vez em mais de uma década, está na pauta fazer uma evolução no runtime do .NET que vai quebrar compatibilidade com versões anteriores (a última sendo na versão 2 do .NET Framework com a introdução de generics). Um dos motivos seria a funcionalidade de métodos em interfaces no C# 8, mas há outras possibilidades em discussão, como primitivas na IL para lidar melhor com código assíncrono. Isso quer dizer que provavelmente esse tipo de funcionalidade não vai ficar disponível para aplicações feitas com .NET Framework. Extrapolando um pouco, imagino que todo o C# 8 deve ficar restrito ao .NET Core, uma vez que acredito ser difícil que o compilador do C# 8 detecte o framework para o qual está compilando e gere erros de compilação somente em alguns casos, já que esse tipo de trabalho é caro para implementar, e investir em uma plataforma legada para isso não faz sentido.

Isso significa que o C# também vai poder evoluir mais rápido. Acredito que o passo atual com versões minor da linguagem sendo anunciadas vai continuar acontecendo. Não ficaria surpreso se tivermos uma nova major version do C# por ano, ou a cada ano e meio.

Pacotes Nuget

Inicialmente os pacotes vão suportar o .NET Standard 2.0, evitando o 2.1, por causa da falta de suporte no .NET Framework. Conforme o uso do .NET Framework começa a diminuir de tamanho os componentes vão migrar para o 2.1+. Os principais pacotes vão seguir suportando mais de uma versão do Standard, ou até mesmo o .NET Framework diretamente.

Pacotes com demandas muito grandes de desempenho vão migrar primeiro, por causa do suporte a Span<T> (e irmãos) que o 2.1 está trazendo.

Mono

Update: Conforme comentário do Mahmoud Ali abaixo, o Mono será atualizado pro .NET Standard 2.1. Isso está detalhado no post sobre o .NET Standard 2.1.

Outro ponto importante é a quebra com o Mono. Como sabemos o Mono é o irmão do .NET Framework que compila para mil e umas plataformas, muitas das quais não são atendidas pelo .NET Core ou .NET Framework, como Playstation, Tizen, Android, iOS etc (o verdadeiro write once run everywhere). Dado que o .NET Framework não implementará suporte ao .NET Standard 2.1 isso significaria que o Mono também não implementaria? E será que o Mono vai implementar as novidades do runtime para ficar compatível com o C# 8?

Eu acho muito difícil que o Mono fique para trás desta forma. No mínimo as evoluções de runtime devem acontecer. Imagino que, com elas, venha também o suporte ao .NET Standard 2.1, ainda que não seja necessário para suportar o ASP.NET Core, já que o suporte ao Linux e Mac é bem entregue pelo próprio .NET Core, mas principalmente porque toda nova biblioteca vai ser feita sobre .NET Standard, e não implementar o Standard significa não suportar as bibliotecas que vão surgir daqui para diante, assumindo que muitas delas vão nascer suportando o 2.1 em diante. Isso seria matar o desenvolvimento para Mobile com Xamarin, algo que não acredito que a Microsoft vai deixar acontecer.

Não só isso deve acontecer como acredito que Mono e .NET Core vão seguir trocando código entre si. Não vejo o Mono sumindo ou sendo absorvido pelo .NET Core, mas sim eles compartilhando muito código, como já acontece nos compiladores e JIT. Isso vai seguir aprofundando.

Futuro do .NET Framework

O .NET Framework está de fato se tornando legado. Com a suporte ao Windows Forms, WPF e EF6 no .NET Core 3.0 não haverá muitos motivos para iniciar um novo projeto de .NET usando .NET Framework.

Hoje .NET Framework roda em bilhões de máquinas e não morre tão cedo, se é que morre um dia. Não será recomendável iniciar novos projetos com ele a partir do ano que vem. Eu já venho recomendando o uso de .NET Core e ASP.NET Core para início de todo projeto web há mais de um ano (veja aqui, aqui, e a na tag de .NET Core me geral). O .NET Framework cumpriu seu papel, foi o primeiro passo do .NET. Os próximos serão exclusivamente com .NET Core. .NET Framework está morto? Não, está “pronto”, como a Microsoft gosta de chamar produtos onde ela fará investimentos de sustentação. Lembram do Silverlight? Microsoft nunca disse que ele estava morto.

Nem preciso falar que o WebForms vai junto, né? Já tem praticamente dez anos que eu contei para vocês neste mesmo blog que o WebForms iria ficar para trás.

O .NET Framework não está morto, no sentido que seguirá suportado pela Microsoft, continuará rodando nas grandes nuvens e tendo suporte no Visual Studio, Rider etc. Mas, enquanto plataforma moderna, como local de inovação, e para início de novos projetos, está morto.

Não espere ver um .NET Framework 5.0.

.NET Framework is dead, long live .NET (and .NET Core)!

Escolhendo qual .NET usar

Para novos projetos, hoje:

  • Web: use ASP.NET Core e .NET Core
  • Desktop: use WPF com .NET Framework

Por que não Windows Forms? Escrevi sobre isso quase uma década atrás.

Para novos projetos começando a partir do primeiro beta do .NET Core 3.0:

  • Web: use ASP.NET Core e .NET Core
  • Desktop: use WPF com .NET Core

E inicie imediatamente a migração de projetos críticos que rodam com ASP.NET MVC. O caminho é simples:

  1. Migre para ASP.NET Core com .NET Framework
  2. Migre para .NET Core

Se o projeto usa Entity Framework 6, espere a migração para depois do lançamento da versão final do .NET Core 3.0. Dependendo do tamanho do projeto você pode iniciar já no momento do Release Candidate do .NET Core 3, já que um projeto de bom tamanho pode levar mais de um mês para migrar.

Não inicie o uso de Entity Framework 6 em nenhum cenário. Adote NHibernate ou Entity Framework Core (eu prefiro NHibernate). E avalie tecnologias NoSql.

Conclusão

Nunca foi um momento tão bom pra trabalhar com .NET. Linguagens incríveis como C# e F#, uma dev stack leve e poderosa, a melhor IDE do mercado (Visual Studio), e o runtime comercial mais rápido do mundo (os 2 que estão na frente não tem nem de perto a mesma adoção ou apelo comercial).

Foque sua carreira em .NET Core, e direcione os investimentos da empresa que você trabalha para ele.

O futuro é bom, divertido e poderoso!