Já foi possível aprender C# em poucas horas. Esse tempo passou! A especificação da linguagem tem ficado cada vez maior e novas features continuam sendo adicionadas rotineiramente. Se, por um lado, a linguagem está cada vez mais relevante, de outro, atingimos um ponto em que são raros os programadores que conhecem C# plenamente e, mesmo estes, tem dificuldades de utilizar eficientemente todo seu potencial. Este aspecto não pode ser ignorado, sobretudo em ambiente corporativo.
O sucesso de C# faz com que ela seja adotada no desenvolvimento de soluções para cenários muito distintos. Embora a linguagem seja, ainda, majoritariamente utilizada para o desenvolvimento de aplicações empresariais (LoB), ela também vem sendo adotada para o desenvolvimento de soluções em nível mais baixo – como no desenvolvimento de compiladores, jogos, engines de bancos de dados, proxys reversos – e de nível mais alto, como linguagem de scripts.
Desde sua criação, a linguagem já foi ampliada para suportar melhor o desenvolvimento de aplicações com execução paralela ou concorrente (por exemplo, com async e await), permitir gestão mais eficiente de memória (por exemplo, com tuplas e ref structs) e, recentemente, para ajudar programadores a tornar seus códigos mais expressivos impedindo que um erro extremamente comum e, consequentemente, custo continuasse sendo cometido (nullable reference types).
C# também está superando barreiras quanto a ambientes de execução. Hoje, ela é usada para escrever código que roda em servidores poderosos – on-premises e na nuvem, desktops, dispositivos móveis, browser e dispositivos leves. Cada um desses ambientes oferecendo desafios inéditos e inspirando, ainda, o surgimento de mais features na linguagem.
Já é bem comum que programadores utilizem a linguagem diariamente conhecendo um subset bem reduzido da especificação. A consequência dessa ignorância é que categorias inteiras de problemas poderiam estar superados e não estão – ao contrário, causam prejuízos crescentes. Nessa mesma linha, os custos para formação de bons programadores na linguagem estão crescendo.
Sempre houve certa interdependência entre a linguagem, seu compilador e o framework. Entretanto, nos últimos tempos, essa interdependência está ficando, naturalmente, maior. A implicação disso é que programadores precisam entender essas interdependências para poder determinar o que pode e o que não pode ser utilizado.
Dependendo do subset de features da linguagem que um programador conhece e utiliza, seu código se torna mais ou menos compreensível para outros programadores no time. Se, por exemplo, ele utilizar intensamente features destinados a fazer melhor uso da memória, beneficiando a performance, utilizará recursos que não são conhecidos pela maioria dos programadores.
A popularidade, longevidade e o poder crescente de C# está fazendo com que ela comece a sentir “dores” parecidas com C++. Esse é um problema em potencial que não podemos ignorar.
Em ambiente corporativo, é importante que consideremos como desenvolver os profissionais, garantindo que as features que fazem diferença sejam conhecidas e utilizadas por todos. Algumas features novas tornam as outras, antigas, irrelevantes, embora compatíveis. Por isso, é importante que o código “mantenha o frescor”. Finalmente, é necessário vigiar para que não se produza código “inteligente demais” – complexo em demasia sem benefício percebido.
E este poder tende a aumentar muito nos próximos anos. Cabe aos desenvolvedores se manterem atualizados na linguagem e proporcionarem discussões com as equipes para executarem refactor em pontos onde as novas features se aplicam a fim de utilizarem os melhores recursos e manter a linguagem sempre viva.
Excelente post!