Conhecimento e boas experiências no MVP Summit 2014

No início deste mês eu estive mais uma vez em Redmond, nos Estados Unidos, participando do Microsoft MVP Global Summit (especificamente em Redmond, Bellevue e Seattle). Este é um evento apenas para convidados, onde se reúnem MVPs de toda parte do mundo (80 países) no Campus da Microsoft para encontrar com os times de produto afim de discutir o estado atual e o futuro da tecnologia de sua expertise.

Microsoft Campus

Microsoft Campus Café na Microsoft Redmond, Microsoft CampusRedmond, Microsoft Campus
Microsoft Campus

Também existem várias sessões técnicas bem específicas, apresentadas geralmente pelo Program Manager daquele produto ou tecnologia. Uma das melhores partes do MVP Summit é estar próximo do time de produto, ver a visão futura, os questionamentos lançados, os desafios atuais e também fornecer pessoalmente o feedback ao pessoal que cria o produto.

IE5A5553 IMG_6462
Technical Sessions

Outra parte muito legal do MVP Summit está no network que o evento proporciona, onde em uma mesma sessão você pode trocar experiências com um indiano, um coreano, japonês, alemão, americano etc sobre a tecnologia que você trabalha diariamente e ainda na mesma roda estar com o Program Manager desta tecnologia, que fala do futuro da mesma. Isto é extremamente motivante.

Neste evento, como em outros que fui em 2012 e 2013 gastei um pouco do tempo neste relacionamento com MVPs de fora do Brasil. É muito bacana para tomar café da manhã com novas pessoas e conversar com pessoas de outros países. Isto abre a nossa visão e quebra algumas fronteiras (dou muito valor nisto).

Yasser do Egito no bus a caminho do campus Com Tadit da India em uma das sessões técnicas com Niño Crudele e o pessoal da Itália no Welcome Party
1.Yasser do Egito no bus a caminho do campus; 2. Com Tadit da India em uma das sessões técnicas, 3.com Niño Crudele e o pessoal da Itália no Welcome Party.

Com a super Sara Silva de Portugal #boxgirl Com o time do Japão na Welcome Party Com o time da India no Welcome Party
1. Com a super Sara Silva de Portugal #boxgirl, 2. Com o time do Japão na Welcome Party, 3. Com o time da India no Welcome Party.

Com o time da Coréia Com o time do Japão #crazyguys Com outra parte dos japoneses
1. Com o time da Coréia, 2. Com o time do Japão #crazyguys, 3.Com outra parte dos japoneses

Resenha com Caio Proite e Bruno Lopes de Portugal . Com os brothers brasileiros Evilázaro, JP e Fabrício Sanchez Com o Gilbok Lee da Coréia do Sul na festa de encerramento
1. Resenha com Caio Proite e Bruno Lopes de Portugal, 2. Com os brothers brasileiros Evilázaro, JP e Fabrício Sanchez, 3. Com o Gilbok Lee da Coréia do Sul na festa de encerramento.

Além disso, a comunidade de MVP é como uma família. Conheci algumas pessoas nestes últimos anos de vários lugares deste planeta e quando nos reencontramos conversamos como se fôssemos velhos amigos. Neste ano também conheci um monte de gente nova, tanto do Brasil quanto do exterior.

Em todo o Summit, temos a festa de abertura e neste ano tivemos na abertura um top keynote do Satya Nadella (CEO da Microsoft) e ainda no final consegui fazer um “give me five” com ele na saída (vai me dar sorte…) Hehe.  Temos também um jantar com o time de produto em uma das noites e uma festa de encerramento que todo ano é uma mega produção de festa no melhor estilo americano de ser.

Com o time brasileiro no PG Dinner Com o time brasileiro no PG Dinner Com o time brasileiro na festa final.
Com o time brasileiro no PG Dinner e na festa final.

Com Suzuki san do Japão eu voando em uma das montagens do Freemont Studios
Com Suzuki san do Japão e eu voando em uma das montagens do Freemont Studios.

Bom, eu estou sob NDA não posso revelar nada do conteúdo apresentado e discutido, mas posso dizer que o desenvolvimento .NET e o desenvolvimento ASP.NET tem um futuro incrível pela frente!  De fato, assim que tivermos liberação irei compartilhar por aqui assim como os outros MVPs de certa forma farão.

So, I have left to say: thank you Microsoft for this opportunity!
I hope to attend next year.

Go ahead!

Continuous Delivery na Jornada Goiana de Software 2014

image

A Jornada Goiana em Engenharia de Software (JGES) acontece desde 2001, sendo um evento realizado pela LG lugar de gente, empresa que trabalho atualmente, em parceria com o Instituto de Informática da Universidade Federal de Goiás (INF-UFG). O tema do evento este ano foi Continuous Delivery que foi abordado por um time top que veio até Goiânia para falar e compartilhar o conhecimento com todos.

Desta vez não palestrei, fiquei na organização e apresentação do evento, ao lado dos amigos e grandes nomes no assunto em nosso país. O nível foi muito bom e a recomendo dar uma olhada nas apresentações que foram disponibilizadas pelo site do evento www.jornadadesoftware.com.br.

14JGES_0014  14JGES_003  14JGES_0012  14JGES_0013

Começando do zero! Veja quais são as principais tecnologias exigidas do desenvolvedor .NET

Olá a todos.
Obrigado a todos pelo feedback do meu último post. Foram mais de 3100 acessos (até o momento), muitos RTs no twitter, posts no facebook, LinkedIn e alguns e-mails. Bacana ver que foi útil. E prometo compilar todos os feedbacks e fazer um post de complemento dentre alguns dias.

Bom, continuando nosso raciocínio, já parou pra pensar o quanto você estuda e sempre aparecem coisas novas… e mais… e mais… e mais? Pois é. É bastante “letrinha”. E exige uma certa organização que já falei em outro post (vale a leitura).

Esses dias abri uma planilha e comecei a listar as tecnologias que eu já sabia, o que eu estava estudando e o que precisava saber. E ao mesmo tempo pensei “E se eu estivesse começando do zero? Seria muito legal ter a visão do que trilhar e por onde seguir.”.

Por onde começar?Um certo tempo atrás precisávamos saber “apenas” HTML, CSS, JavaScript (pouco) ASP e FTP. Agora a situação é bem diferente.

Coincidentemente vi pelo twitter o recente post do MVP de ASP.NET Ashraf Alam que tem nexo com a lista que eu tinha feito. Então com base nesta ideia, adicionei mais duas colunas ficando:

  • Coluna Tipo: Onde estou trabalhando? Em qual camada de interesse?
  • Coluna Finalidade: Em qual ocasião devo usar?
  • Coluna Tecnologia: o nome da tecnologia

tabela

Considerações:

  1. Em negrito e em fundo mais escuro as tecnologias essenciais, de escala 1 (as que você precisa dominar primeiro).
  2. Esta é uma lista para uma pessoa com perfil em desenvolvimento web utilizando .NET
  3. A lista trata-se apenas de tecnologia e ferramentas. Boas práticas, conceitos, padrões e técnicas não estão contidos aqui.
  4. Esta é uma tentativa de clarear o que cada coisa faz e que tecnologia atenderá isso.
  5. Poderia ter uma coluna de prioridade (preferi pintar o fundo de uma cor mais forte para destacar dos demais).
  6. Acabei não colocando coisa muito específica (como frameworks de testes, mocks, etc) e outra tecnologia mais avançada e não tão popular ainda (como dapper).
  7. Esta planilha está no GitHub. Alterem a vontade, republiquem, alterem…
    1. UPDATED: Já recebemos alguns pull requests e a planilha já se encontra atualizada e de fácil colaboração.
  8. Pretendo atualizar este post sempre que necessário. Irei adicionar um texto com uma data em cada update.

O Scott Hanselman fez um post sobre o “que você precisaria aprender caso fosse recomeçar denovo”, muito bom, leia. O Marcos Vinícius fez uma versão bem detalhada para Front End Developers. Vale a pena ver também.

Para developers .NET é isto.
Dá pra melhorar, acessem o repositório do GIT e ajude a manter esta lista para uso e referência de todos.

É isso.. Abraço!

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!

LINQ – Any() x Contains()

Existem dois tipos de developer: os que apenas querem fazer funcionar e os que querem entender o que estão fazendo para fazer funcionar direito (leia-se bem feito).

Se você é o segundo, provavelmente já se questionou em algum momento quando se usa Any() ou Contains() nas consultas com LINQ. É claro que a resposta é: depende! (hehe). Em grande parte dos casos o resultado será o mesmo e o comportamento semelhante.

Só para recaptular:

Contains() é um método e o seu desempenho depende muito do próprio uso. Em um List tem complexidade O(n), enquanto em um HashSet seria O(1).

Any() é um método de extensão, é mais flexível. Podemos aplicar uma lambda/delegate. Isto teria uma complexidade de O(n).

Vale lembrar que Contains() também possui um método de extensão IEnumerable<T>, que pensando bem, possui uma instância em quase todas coleções.

Se você for fazer algum benchmark, verá que em grande parte das vezes o Any() é um pouco mais lento que Contains() porque não precisa invocar um delegate para cada elemento, ele utiliza a instância Equals. (apenas e se o tipo T não implementa a interface IEquatable<T>) Mas no final das contas se você olhar para a complexidade uma a uma, esta performance será quase a mesma. Agora acho que deu pra entender o porque da resposta “depende”.  =)

Se ainda não deu pra entender, veja bem:

Any()
Determina se qualquer elemento de uma seqüência satisfaz uma condição.
IEnumerable.Any(Extension method)
colecao.Any(i => i == 1);

Contains()
Determina se um elemento está em uma coleção.
IEnumerable.Contains(Object Method)
colecao.Contains(1);

E ainda também temos o Exists(), que não falamos aqui. Ele determina se a List(T) contém elementos que atendam às condições definidas por uma condição.
List.Exists (Object method)

Mas nem tudo são flores.
Usando Contains() com Entity Framework/NHibernate a saída SQL será transcrita para a clausula “WHERE IN”. E aí que mora o perigo, pois isto afeta o desempenho da aplicação, além do problema de alguns bancos como o Oracle que tem o limite de 1000 na clausula IN (ou seja, passou disso você tem 2 problemas).

Para o Entity Framework 6 o problema de performance utilizando Contains foi melhorado, quanto à clausula IN fique atento nos testes para atender o seu cenário e caso seja preciso um Join resolve.

Já passou por algo semelhante? Está usando o EF6? Mande seu feedback. =)
Abraço.

<Post atualizado (em vermelho) com a contribuição do Rodrigo Vidal e Abner das Dores.>