10 Coisas que todo desenvolvedor .NET deveria saber

Algumas pessoas sempre me perguntam o que é preciso saber para ser um desenvolvedor .NET. Confesso que não gosto de falar aquela resposta padrão: “basta ter lógica de programação”, mas também acabo não respondendo com exatidão e então resolvi criar um artigo para que toda vez que me perguntarem eu direcionar para este post.

A lista abaixo é simples e básica. Mas são perguntas que geralmente são feitas em entrevistas de emprego e que nem sempre são respondidas como devem ser.

Para alinharmos, levantei alguns tópicos que são essenciais. Assim como um jogador de futebol tem que chutar e cabecear para ser um jogador, um desenvolvedor .NET* precisa saber no mínimo os dez itens abaixo (* estou abstraindo o skill de software developer, que está contido aqui, mas é um pouco maior). Vamos lá:

#1 Conceitos de Orientação a Objetos (OOP)

Sim. Os conceitos. O desenvolvedor .NET deve pelo menos ser capaz de explicar os principais conceitos de OOP em uma maneira muito simples. Estas são habilidades básicas e se tiver alguma dificuldade é bom parar por aqui, reforçar e consolidar esta fase. No site da MSDN tem um conteúdo legal.

#2 Princípios SOLID

Os princípios do SOLID, criado pelo Robert Martin (Uncle Bob), são diretrizes que podem ser aplicadas ao codificar para evitar ou refatorar o que o Martin Fowler chama de code smell. Ou seja, algo que indica que tem um problema ou não está legal no código.

SOLID exige que você seja bem resolvido com o #1 que acabamos de falar.

O Shivprasad Koirala, MVP da Índia, escreveu o artigo SOLID architecture principles using simple C# que deixa explica bem cada letra do acrônimo SOLID utilizando C#.

#3 JavaScript, jQuery, C# e ASP.NET

Estes quatro itens estão no eixo principal do conhecimento do desenvolvedor .NET (exceto em algumas exceções (neste ponto) onde o ASP.NET não está incluso, como no desenvolvimento de aplicações Windows Client, Phone Apps, Games, Serviços entre outros)

Os desenvolvedores não podem saber apenas C# e SQL. Só isto já não mais basta. Hoje é exigido bem mais, como trivial HTML e CSS e outras linguagens e frameworks como AngularJS, RequiredJs, NodeJs, KnockoutJS, etc. E para javaScript, em questão, é preciso saber basicamente a escrever o código JS que os patterns como Module e Closure vão te ajudar demais.

#4 Garbage Collector e IDisposable

Uma das melhores características de desenvolvimento .NET é a falta de esforço e preocupação para destruir instâncias de objetos, cancelar assinatura de eventos, fechar fluxos, etc. Geralmente você deixa isto para o Garbage Collector, que “tudo fica bem”. Muitos developers não se preocupam, ou nunca analisaram o 1º,2º ou 3º ciclo de coleta do gen. Atitudes como podem gerar catastrofes no seu código como o conhecido Memory leaks. Parece que a preocupação com o controle de memória praticamente não há com desenvolvedor atual. É importante saber como funciona.

Uma maneira útil de garantir que os recursos gerenciados estão corretamente limpo em tempo hábil é implementar a interface IDisposable em seus objetos. Entenda mais e veja como controlar isto nos links abaixo:

#5 Box e UnBoxing

Ainda falando sobre memória e performance, este é um problema tratado deste o .NET 2.0 e que até hoje vários desenvolvedores não entendem box e unboxing e acabam afetando o desempenho e uso de memória do software.

#6 Tipo por referência e tipos por valor

Quando um recrutador lhe pede para explicar este problema de box/unboxing, eles também podem te pedir para explicar a diferença entre os reference types e os value types. O tipo de valor pode ser considerado como o valor real de um objeto, enquanto um tipo de referência, tipicamente, contém o endereço do valor real, ou nulo.

#7 Diferença entre MVC e WebForms

Também é um passo base. É importante saber a diferença, benefícios e contras que cada um possui mesmo que o resultado possa ser “semelhante” a princípio. O que na verdade não é!

O webforms tem uma maneira bem direta e simples no desenvolvimento, mas é bem difícil controlar a interface como é possível obter usando MVC utilizando JavaScript e o CSS. E isto é fundamental quando está desenvolvendo aplicações ricas e inteligentes.

Rolou uma discussão boa desse assunto no Programmers Stack Exchange e você pode acompanhar um pouco lá.

Vale também entender o ASP.NET SPA no meio disso tudo também.

#8 Banco de Dados SQL, Oracle e No-SQL

SQL Server e Oracle são essenciais, mas não são os “fazem tudo” de qualquer cenário. É hora de acordar e observar que vários outros cenários podem ser atendidos com bancos No-SQL.

Os bancos de dados No-SQL estão ganhando força enorme por causa de sua velocidade geral, facilidade de uso e benefícios de escalabilidade. Existem vários. Mas os mais conhecidos são:

#9 Visual Studio IDE

Atalhos, Plugins de terceiros, NuGet, etc. Conhecer as teclas de atalho faz toda diferença, pois você imageganha velocidade na execução das tarefas. Trabalhar com plugins certos como o PowerTools, TestDriven, Web Essentials, entre outros.

imageHá vários apaixonados pelo ReSharper, tanto que se desinstalar da máquina já não consegue fazer mais nada. Por isto eu recomendo instalar este plugin apenas depois que estiver bem seguro ou familiarizado com o desenvolvimento C#.

#10 Reference Source – O código fonte do .NET Framework

Bom, o reference source é o código fonte do .NET Framework disponível para consulta. Dai você pode falar: “mas pra que eu preciso do código fonte?”.

A resposta é que você pode aprender muito mais do .NET vendo como o código foi escrito, como ele funciona e como ele se comporta. Esta curiosidade de ver o código precisa ser uma constante.

Pode ser acessado pelo endereço http://referencesource.microsoft.com


O Scott Hanselman escreveu uma lista em 2005 (claro que está obsoleta), mas tem algumas coisas relevantes que não citei como por exemplo Reflection, diferença entre Orientação a Interface x Orientação a Objetos x Orientação a Aspectos. Atualizando, poderia citar muitas outras coisas como o próprio LINQ, Delegates, Generics, usar o Nuget, fazer deploy em nuvem. entre outras coisas de base.

Particularmente, eu posso dizer que se você se sentiu pouco seguro em alguns dos tópicos acima reserve um tempo na sua agenda e corra atrás para estudar, tirar dúvidas e treinar. Principalmente se você pretende trabalhar em boas empresas ou nos USA onde os processos seletivos exigem bem esta base sólida.

Para encerrarmos por aqui, deixo uma boa dica de leitura para complementar o conteúdo: The 4 Most Important Skills for a Software Developer.

Quer completar? Ficou algo de fora?
Vamos lá.. Nos ajude a completar…

Abraço!

  • Olá Kono! Excelente artigo, como sempre. Eu só gostaria de adicionar alguns pontos.

    Na parte técnica:
    – Conceitos de teste de software, principalmente Unit Testing (e, se possível, Test Driven Development). Essencial para projetos de todos os tipos e tamanhos, não só com .NET mas qualquer outro framework / linguagem;
    – Conceitos de Controle de Versão. Basicamente qualquer empresa, por mais pequena que seja, acaba tendo algum controle de versão (pelo menos é o que se espera!!). O desenvolvedor precisa saber, no mínimo, conceitos básicos sobre check-in, check-out, builds automatizadas e, se possível, branching. Qualquer projeto, até mesmo os de médio porte com vários desenvolvedores trabalhando ao mesmo tempo, fará uso de algum controle de versão. Portanto, para o desenvolvedor .NET, conhecer (pelo menos por cima) o funcionamento do Team Foundation Server é essencial;
    – Quanto ao ponto “3”, caso o desenvolvedor não for focar em web, mas sim desenvolvimento para a plataforma Windows, ele precisa saber conceitos de XAML e padrões normalmente utilizados em conjunto (como MVVM);

    Na parte comportamental / desenvolvimento da carreira:
    – Documente o progresso do seu aprendizado de alguma forma e contribua com a comunidade. Crie um blog, poste suas conquistas e coisas que você aprendeu no dia-a-dia do seu trabalho. É incrível o salto que a sua carreira acaba dando ao compartilhar conhecimento com a comunidade (pelo menos é o que aconteceu comigo desde que comecei a contribuir com a comunidade em 2006 e acredito que o mesmo que aconteceu com você também).

    É isso. Grande abraço!

    André Lima

  • Fala Kono! Bacana os pontos kra… Eu, ainda adicionaria:

    – Entender o porque está se escolhendo o .NET como plataforma. Digo, de maneira macro mesmo, das necessidades do projeto, suas características de design e arquitetura, comunidade, documentação, suporte, adoção pelo mercado, compatibilidade, ferramentas, tendências… Enfim, algo que guie de fato a escolha e o aprendizado, pra que no futuro são seja pego de surpresa quando seu projeto estiver (bem) maior…

    – E, buscar entender, minimamente, Itens fundamentais como os papeis das peças comuns das abordagens, como a DLL, o IIS, o GAC (mesmo cotado para sair de cena, nas próximas versões) e por ai vai…

  • Salve Luis! Boas sugestões.
    Sobre o “design de arquitetura” se tratando de conhecimento base eu não acho que é cobrado nesse momento, mas para isto é exigido os conceitos de SOLID que já é um bom pontapé.

    Sobre o GAC eu esqueci de deixar esse ponto acima, que até o momento ainda é importante (e vai continuar por um bom tempo). Este entra no “Pacote base .NET”. hehehe…

    Vlw!

  • Poxa André muito bem colocado!
    Os comentários sempre acabam completando bastante o conteúdo.
    Testes e controle de versão também fazem parte do pacotão base do desenvolvedor .NET!

    Para developer Windows Client também não vejo esse cara sem o dedo no XAML. Não sei se entraria no conhecimento base. Mas entra de fato no conhecimento que esse cara precisa ter.. Inclusive no MVVM (bem lembrado tb).

    Essa última dica de carreira é uma grande dica.
    Show André! Valeu…

  • Thiago Tácito

    Bom dia Kono!

    Excelente artigo que vai me ajudar muito em nortear meus estudos!
    Eu adicionaria também o estudo de frameworks de persistência, como NHibernate e mesmo o Entity Framework. Atualmente estou trabalhando com o Entity e depois que você aprofunda nele, sabe o quanto é empolgante de trabalhar com este framework.

    Acredito que esse negócio de escrever sql na unha somente em uma última análise mesmo pra não falar que isso não deve ser usado mais.

  • Muito legal a ideia desse artigo, para seguir como referência.
    Poderia criar uma segunda parte “dicas dos comentários” claro filtrando o que acha relevante e atualizar o post. Por exemplo essa parte de controle de versão isso é básico, e poderia entrar ai na sua lista.

  • Oi Tácito.
    Obrigado por completar a visão do artigo. São pontos também importantes. Mas se tratando de conhecimento base, antes de ir para o NH ou EF é bom entender como o ORM funciona. Sou a favor de saber como as coisas funcionam ao invés de simplesmente fazer. =)
    Vlw!

  • Bacana. Acho que vale um Repost com as sugestões dos comments.
    Dá pra ajudar muita gente mesmo.
    Vamos ver o que outras pessoas dizem.

    Valeu Cleyton!

  • Thiago Tácito

    Com certeza! Também sou a favor de saber como as coisas funcionam. A ideia dos frameworks de persistência sugeri pensando em algo como o que se tem pedido hoje em dia!

    Abração!

  • É verdade. De fato já se pede isto. Estamos sendo “bonzinhos” de tirar isto da competência base. hehehe

  • Parabéns Kono, excelente artigo.
    Há meses tento passar essa ideia ao time da minha empresa.
    O problema é sempre a acomodação, trazendo a ideia do que se está funcionando (independente de questões como performance, experiência do usuário, etc.) não se mexe. (XGH 🙁 )
    Abs

  • Junior Cardoso

    Tanto coisa que só ouço falar, mas nunca usei. Preciso reservar um tempo para ter uma base mais sólida.

  • Oi Fabiano.
    Obrigado… A resistência existe mesmo, mas para os novos projetos sim, tem que ser levado em consideração. No meu ponto de vista os novos projetos exigem e forçam esta evolução ou demanda profissional (que precisa ter o conhecimento base, já citados aqui).
    Evoluir é preciso. Leva isto adiante.
    Força!

    Vlw.. Abraço..

  • Bacana Júnior. Planeje-se e coloque em prática.
    Dica: Use o trello.com para deixar no seu “backlog” de pendências técnicas.
    Estamos ai!
    Obrigado.. abs!

  • Wennder Santos

    Excelente artigo, parabéns!

  • Lista com itens muito importantes, ficou show, parabéns 🙂

  • Grande Fadino.. Obrigado, se achar que ainda tem outros conhecimentos para esta base nos fale. =)

  • Luís Gabriel Nascimento Simas

    “Na parte comportamental / desenvolvimento da carreira:

    – Documente o progresso do seu aprendizado de alguma forma e contribua com a comunidade. Crie um blog, poste suas conquistas e coisas que você aprendeu no dia-a-dia do seu trabalho. É incrível o salto que a sua carreira acaba dando ao compartilhar conhecimento com a comunidade (pelo menos é o que aconteceu comigo desde que comecei a contribuir com a comunidade em 2006 e acredito que o mesmo que aconteceu com você também).”

    Assinar em baixo é pouco… vou lá no Cartório e Reconhecer firma em cima disto… concordo plenamente!!!!!!

  • Luís Gabriel Nascimento Simas

    Boa dica Rodrigo sobre o trello… valeu!

  • Luís Gabriel Nascimento Simas

    Xará, se o GAC sair de cena, como poderemos centralizar os assemblies? existe algum lugar onde eu possa pesquisar sobre isso?

  • Luís Gabriel Nascimento Simas

    Olá Rodrigo. Obrigado por compartilhar o seu conhecimento. Já coloquei algumas coisas aqui no meu Kanban de aprendizado… valeu mesmo 🙂

    Forte Abraço e qualquer coisa estamos aí 🙂

  • Obrigado pelo feedback Luís.
    Espero que este artigos ajude outras pessoas. E vamos melhorando este repositório de infos.. =)

  • Faltou VSVim. 🙂

  • Rodrigo Kono

    Grande Giggio san, o VSVim não é common nem para os high users. Como dizer que ele estaria no pacotão base?! Argumentos =)

  • Luís Gabriel Nascimento Simas

    Ah, ok… Obrigado Rodrigo… vai me ajudar muito. É, migrar para a nuvem é uma realidade há algum tempo, mas sabe como é né… se a MS não forçar certas coisas eliminando alguns serviços… ia ficar na mesma e ninguém ia se interessar… embora o investimento na divulgação do Azure tenha sido bem agressiva e massiva. Forte Abraço

  • Pingback: Começando do zero! Quais tecnologias preciso aprender hoje e porque? - Rodrigo KonoRodrigo Kono()

  • Otavio Costa

    Excelente dica do trello! Tinha conta la ha um tempo e tinha esquecido. Otimo pra priorizar o aprendizado

  • Pingback: C# por onde começar – Blog do Legolas()

  • David Pereira

    Rodrigo, teria um template de estudos que você utiliza no trello para disponibilizar?
    Obrigado e abraços.

  • Oi Devid. Não tem não. É chegar lá e colocar suas pendências técnicas.
    O que recomendo é também criar um mind map que ajuda bastante.