Como criar um mecanismo de busca com ASP.NET Core + MongoDB

Busca Acelerada
Busca Acelerada

Recentemente tive a oportunidade de palestrar no TDC São Paulo sobre como criar um mecanismo de busca com .NET Core e MongoDB. A ideia deste post é servir de apoio à palestra com mais detalhes, os fontes e os slides, para que a audiência consiga estudar em casa com mais calma.

Obviamente, serve também para quem não estava no evento e deseja saber como fazer um site de busca em ASP.NET MVC Core e usando o banco não-relacional MongoDB.

Introdução

Desde 2010, quando estava me formando na faculdade e resolvi criar o Busca Acelerada, o primeiro mecanismo de busca que desenvolvi, acabei gostando bastante desse tipo de aplicação. De lá pra cá tive a oportunidade de desenvolver buscadores de legislação, de fofocas de famosos, de informações da construção civil e muito mais.

A ideia então é eu mostrar, rapidamente, como se cria um site básico de busca que, embora simples, já será muito superior à maioria dos buscadores que os desenvolvedores fazem baseados em SQL. Sim, porque o meu site de busca não usará SQL, mas sim NoSQL, MongoDB para ser mais exato. E para a performance ficar ainda melhor, ele será feito usando .NET Core, a nova plataforma de desenvolvimento da Microsoft!

Para conseguir acompanhar este post, você já deve conhecer .NET Core. Caso não conheça, sugiro começar com este tutorial aqui. Também é altamente recomendado que tenha lido esse meu outro post, sobre como criar mecanismos de busca.

Note que não vou ensinar aqui como se criam crawlers ou qualquer outro algoritmo de coleta de informações para popular seu mecanismo, conforme citado no post sobre mecanismo de busca. Considero aqui que você já tem uma massa de dados que deseja oferecer através de um site de busca. Pode ser uma base SQL tradicional, um XML, um Excel, você que sabe.

Caso você precise realmente de um crawler, leia este post aqui.

Com tudo isso em mente, vamos começar!

Veremos nesse artigo:

  1. Configurando o Projeto
  2. Configurando o Banco
  3. Preparando os dados
  4. Configurando a Model
  5. Criando as views
  6. Programando a busca

Querendo algo mais “pesado” de MongoDB, sugiro este post aqui, focado nesta tecnologia de banco de dados.

Parte 1: Configurando o projeto

Baixe e instale o .NET Core na sua máquina.

Agora, baixe e instale o Visual Studio Community na sua máquina, é gratuito e está disponível para Mac e Windows. Se estiver no Linux, você pode usar linha de comando ou o Visual Studio Code, mas o procedimento será um pouco diferente do mostrado aqui.

Com o Visual Studio aberto, crie um novo projeto ASP.NET Core Web App.

ASP.NET Core Web Application
ASP.NET Core Web Application

 

Assim que a estrutura do projeto é criada, o VS começa a restaurar os pacotes padrões do projeto e isso pode demorar alguns instantes.

Agora clique com botão direito na pasta Dependencies/NuGet do projeto e dê um “Add Packages” para abrir o gerenciador de dependências. Busque nele por “mongodb” e instale a extensão oficial:

NuGet MongoDB
NuGet MongoDB

Se você mandar executar o projeto irá ver o site MVC de exemplo do ASP.NET Core. Os demais arquivos vamos mexer depois.

Parte 2: Configurando o banco

Aqui você tem duas opções: usar um Mongo em uma plataforma, como a mLab ou a Umbler, e outra é instalar e configurar tudo na unha. Você escolhe.

Opção 1: Solução na nuvem

Crie uma conta na Umbler e você já terá os créditos para gastar sem precisar desembolsar dinheiro neste teste e inclui hospedagem ASP.NET Core e MongoDB facilmente. A mLab tem uma versão free também que dá conta, mas só nos datacenters americanos e você teria de ter uma conta em outra empresa que possua ASP.NET Core para ter a solução completa.

Na sua conta da Umbler, basta criar um site .NET (somente no plano Cloud Sites, e depois você deve alterar a versão para .NET Core) e na seção de bancos de dados, criar um banco MongoDB. Anote o host, usuário, senha, etc pra usar depois.

MongoDB
MongoDB

Pronto, você tem o seu banco ok!

Opção 2: Solução local

Baixe e instale o MongoDB (é apenas uma extração de pastas e arquivos, que sugiro que faça em C:/). Agora abra o prompt de comando, navegue até a pasta onde foi instalado o seu Mongo, geralmente em “c:\program files\mongodb\”, acesse a subpasta “server/3.2/bin” e dentro dela digite o comando (certificando-se que exista uma pasta data dentro de C:\mongodb):

Isso irá criar e deixar executando uma instância do MongoDB dentro da pasta data do mongodb. Não feche esse prompt para manter o Mongo rodando local.

Independente da opção escolhida

Agora abra outro prompt de comando (ou use alguma ferramenta de manipulação do MongoDB, como o Studio 3T) e navegue até a pasta bin do MongoDB novamente, digitando o comando “mongo” para iniciar o client do Mongo. Se o seu MongoDB é local, o comando será apenas mongo, no entanto, se for remoto, você vai se conectar da seguinte maneira:

Neste exemplo, meu servidor é tatooine.mongodb.umbler.com, a porta é 36947, meu banco se chama nomeBanco, meu usuário = usuario e minha senha = senha. Altere estas informações conforme a sua configuração!

Depois, chame o comando “use nomeBanco” para se conectar ao banco que usaremos nesse projeto (substituindo nomeBanco pelo nome do seu banco, aqui chamarei de searchengine). Deixe o prompt aberto, usaremos ele em breve para inserir alguns dados de exemplo em nosso banco do buscador.

Parte 3: Preparando os dados

Você pode ter uma base SQL com os dados consolidados do seu negócio e usar o MongoDB apenas como índice e/ou cache de busca. Ou então você pode usar apenas o MongoDB como fonte de dados. Fica à seu critério.

Caso escolha usar SQL e MongoDB, você terá de ter algum mecanismo para mandar os dados que deseja que sejam indexados pelo seu buscador para o Mongo. Este post não cobre migração de dados (mongoimport é o cara aqui), então você deve fazer por sua conta e risco usando os meios que conhecer.

Caso escolha apenas usar o Mongo, você apenas terá de alterar as suas coleções pesquisáveis para incluir um campo com o índice invertido que vamos criar na sequência, com nosso buscador de exemplo.

Em ambos os casos, a sua informação “pesquisável” deve ser armazenada de uma maneira prática de ser pesquisada, o que neste exemplo simples chamaremos de tags. Cada palavra dentro das informações pesquisáveis do seu sistema deve ser transformada em uma tag, que geralmente é um texto todo em maiúsculo (ou minúsculo) e sem acentos ou caracteres especiais.

Por exemplo, se quero tornar pesquisável os nomes dos meus clientes, que no meu SQL estão como “Luiz Júnior”, eu devo normalizá-lo para as tags “LUIZ” e “JUNIOR”, separadas. Assim, quando pesquisarem por luiz, por junior, or luiz junior e por junior luiz, este cliente será encontrado.

Assim, cada registro na sua coleção do MongoDB terá um atributo contendo as suas tags, ou informações pesquisáveis, o que facilmente fazemos com um atributo do tipo array no Mongo. Como abaixo:

Para podermos fazer a busca depois usaremos uma query com um $in ou um $all, que são operadores do Mongo para pesquisar arrays de palavras (seus termos de busca) dentro de arrays de palavras (as tags).

Então, caso esteja migrando dados de um SQL para o Mongo, certifique-se de quebrar e normalizar as informações que deseja pesquisar dentro de um campo tags, como o acima, que será o nosso índice de pesquisa.

Para fins de exemplo, usaremos a massa de dados abaixo (apenas 2 registros) para pré-popular nosso banco com clientes (customers) que já possuem tags normalizadas como mencionado acima. Note que as tags de cada customer são um misto de seus nomes e profissões, o que você pode facilmente fazer com seus dados também.

O comando acima deve ser executado no console cliente do Mongo, logo após o “use searchengine”.

Obviamente existem técnicas de modelagem de banco para mecanismos de busca muito mais elaboradas que essa. Aqui estamos tratando todas as informações textualmente sem classificação do que é cada uma, sem se importar com a ordem ou peso delas, etc. Mas a partir daqui você pode fazer as suas próprias pesquisas para melhorar nosso algoritmo.

Mais pra frente, quando fizermos as nossas pesquisas, vamos fazê-las sempre buscando no campo tags, ao invés de ir nos atributos do documento. Até porque nosso buscador terá apenas um campo de busca, assim como o Google, como veremos adiante.

Mas e a performance disso?

Para resolver este problema vamos criar um índice nesse campo no MongoDB. Mas não é qualquer índice, mas sim um índice multi-valorado pois o campo tags é um array de elementos. O Mongo organiza campos multi-valorados em índices invertidos, que são exatamente um dos melhores tipos de índices básicos que podemos querer em um mecanismo de busca simples como o nosso. Eu já mencionei sobre índices invertidos no post sobre Como criar um mecanismo de busca.

O comando acima deve ser executado no console cliente do Mongo, logo após o “use searchengine”. Todos os customers inseridos a partir de então respeitarão essa regra do índice no campo tags.

Para verificar se funcionou o nosso índice, teste no console cliente do Mongo consultas como essa que traz todos os clientes que possuam a tag LUIZ (isso funciona para lógica OR também, pois recebe um array de possibilidades):

Ou esse que traz todos com as tags LUIZ e JUNIOR (aqui temos lógica AND):

Parte 4: Configurando a Model

Adicione uma pasta Models no seu projeto se ela ainda não existir.

Dentro dela, adicione uma classe Customer.cs com o seguinte conteúdo dentro:

Essa classe é um espelho de um documento Customer que será armazenado na coleção homônima do MongoDB. Existem diversos attributes que podemos colocar sobre as propriedades desta classe para ajudar a mapear o MongoDB corretamente, sendo que aqui usei apenas o [BsonId] que diz que aquela propriedade é o “_id” do documento, campo obrigatório de existir. Outros attributes possíveis seriam o BsonElement para dizer o nome daquela propriedade na coleção (aqui estamos usando o mesmo nome em ambos), BsonRequired para dizer que uma propriedade é obrigatória e muito mais.

Para fazer a conexão e manipulação do banco, vamos criar uma classe que vai funcionar de maneira semelhante a um DAO ou Repository Pattern. Adicione a classe DataAccess.cs na pasta Models do seu projeto, inicialmente com o seguinte conteúdo:

Aqui temos um construtor que faz a conexão com o servidor do Mongo. Nesta conexão, você deverá informar os seus dados de conexão, que caso seja servidor local, deve funcionar do jeito que coloquei no exemplo. Caso seja um banco remoto, você deverá ter uma connection string parecida com essa:

Já o outro método da DataAccess.cs, CountCustomers() é um método que vai na coleção Customer do MongoDB e contabiliza quantos documentos estão salvos lá (passei um filtro vazio por parâmetro), retornando este número. Usaremos este método mais tarde, para testar se nossa conexão está funcionando.

Pronto, a configuração mínima da model já está ok!

Parte 5: Criando as views

Agora vamos criar a view que vamos utilizar como pesquisa e listagem de resultados (chamada de SERP pelos especialistas: Search Engine Results Page). Vamos fazer as duas em uma, por pura preguiça deste que vos escreve. 😉

Dentro da pasta Views/Shared do seu projeto, abra _Layout.cshtml e adicione um novo item no menu superior apontando para uma página /Search, deixando-o assim (mudou apenas o segundo link):

Quando este link for clicado (e você pode testar isso mandando executar o projeto), ele enviará o usuário para o endereço /Home/Search, indicando que na sua pasta Controllers deve existir um HomeController.cs com um método Search dentro. Não temos ainda este método, então vamos criá-lo no referido arquivo:

Esse método Search é chamado de Action no ASP.NET MVC e ele será disparado automaticamente quando a URL /Home/Search for acessada no navegador (Home=Controller, Search=Action). Nele estamos instanciando o DataAccess, contando quantos customers existem no banco e salvando essa informação na ViewData, que poderá ser acessada mais tarde na view Search.cshtml, que vamos criar agora dentro da pasta Views:

Aqui eu criei um formulário de pesquisa bem tosco, apenas para mostrar o conceito funcionando para você. Temos um formulário HTML que faz um GET em /Home/Search submetendo uma variável ‘q’ na querystring (com o conteúdo da pesquisa) quando o botão Pesquisar for clicado.

Logo abaixo do botão eu incluí um código Razor que imprime a quantidade de documentos que tem na base, apenas para testarmos se o ASP.NET Core está conseguindo de fato conectar e consultar o MongoDB. Mande executar e se tudo der certo, você deve ver algo semelhante à imagem abaixo:

Tela de Pesquisa
Tela de Pesquisa

Se você pesquisar alguma coisa, como a palavra ‘autor’, verá que não vai funcionar, mas vai aparecer na URL um ‘?q=autor’. Na sequência devemos programar o funcionamento da busca para usar essa query string aí.

Parte 6: Programando a busca

Abra novamente o seu Views/Search.cshtml e inclua o seguinte código Razor na primeira linha do arquivo, antes de tudo:

Esse código diz que o modelo de dados desta página é a classe Customer, que criamos lá atrás, lembra?

Agora ainda nesta mesma Search.cshtml, adicione o seguinte código Razor no final dela, depois de tudo:

Esse código verifica se nosso Model tem algum resultado (!= null) o que significa que foi realizada uma pesquisa com sucesso. Se esse for o caso, ele faz um foreach entre todos os itens do Model imprimindo o nome de cada item em uma lista de elementos HTML.

Obviamente isso ainda não funciona pois nossa Action Search em HomeController.cs ainda não faz pesquisas, apenas conta os customers para fins de teste. Mas antes de voltar a mexer no HomeController.cs, vamos adicionar um novo método no DataAccess.cs para fazer a pesquisa no banco:

Nesse novo método eu espero uma String que passa por uma normalização bem simples que consiste em usar apenas caixa-alta e quebrar a pesquisa por tags separadas por espaço em branco. Com essa lista de tags eu criei um Filter.All no campo Tags existente no Customer, ou seja, eu vou filtrar no banco todos os clientes que possuem TODAS (ALL) as tags informadas nesse filtro, mas não precisa ser na ordem, desde que tenha todas.

Com esse filtro pronto, é só fazer um Find na coleção Customer passando o mesmo e teremos como retorno uma lista de Customers que atendem o filtro.

Agora, para continuar, devemos voltar ao HomeController.cs e substituir o antigo método Search por esse novo, que espera um ‘q’ da query string com a possível busca. Digo possível porque caso seja o primeiro acesso à página /home/search, o ‘q’ estará vazio.

Nesta nova versão (que substitui a anterior), se vier a variável ‘q’ na query string (o mapeamento é automático) ele pesquisa os clientes que combinam com a pesquisa e retorna eles na View como sendo o Model dela (lembra do @model que adicionamos anteriormente na view Search.cshtml?). Caso contrário, se não vier o ‘q’ na URL, apenas exibe a view normalmente.

Agora se você mandar executar e fazer uma pesquisa por palavras que existam nas tags dos customers, você verá eles listados como abaixo:

Resultados da Pesquisa
Resultados da Pesquisa

Claro que você pode fazer muitas modificações nos seus resultados de pesquisa. Você pode querer jogá-los em uma página separada, com um layout mais profissional. Pode querer colocar links neles que levarão o usuário para páginas com detalhes sobre os clientes. Pode querer implementar algum tipo de autocomplete na caixa de busca, usando o Typeahead do Bootstrap. Pode implementar algum mecanismo para sinônimos, plurais, etc para tornar sua busca mais inteligente.

Há milhares de coisas que você pode fazer e eu poderia escrever um ebook sobre isso. Se tivesse tempo no momento. 😀

De qualquer maneira, acho que já consegui dar uma luz à quem nunca criou um buscador antes. Ou quem criou apenas usando LIKE % do SQL tradicional. :/

Depois que colocar ele em produção (sugestão: na Umbler), visando obter muitas visitas vindas do Google, sugiro ler esse meu artigo aqui sobre SEO para mecanismos de busca.

Eu ministrei recentemente uma palestra sobre este assunto, cujos slides estão abaixo (o código pode estar ligeiramente diferente):

Um abraço, e até a próxima!

13 dicas e truques da linguagem C#

Junta uma dica daqui, outra dali, e voilá, seguem 12 dicas para aumentar sua produtividade enquanto programa usando a linguagem C#. Nada milagroso, mas apenas práticas muitas vezes pouco conhecidas para aumento de produtividade, redução de código e por aí vai. Muitas só funcionam a partir do Framework 3.5, mas acredito que nesta altura do campeonato ninguém deveria estar programando em 2.0 ou frameworks inferiores…

Neste artigo você vai ver:

  1. Operador ternário
  2. Operador Null-coalesce
  3. Inicializadores de objetos
  4. A diretiva using
  5. Apelidos para nomes de classe e namespaces muito grandes
  6. Tipos nullables
  7. Propriedades automáticas
  8. Inferência de tipos
  9. Expressões Lambda
  10. string.IsNullOrEmpty()
  11. Use os atalhos do Visual Studio
  12. Use os snippets de código
  13. Estude essa lista do StackOverflow

1. Operador Ternário ‘?’

Use-o com moderação ou ele prejudicará a legibilidade de seu código. Basicamente o operador ternário substitui um bloco if tradicional em uma única linha de código. Novidade? NOT! Operadores ternários existem na linguagem C desde a década de 70. Na prática funciona assim, imagine o seguinte bloco de código:

Você pode substituí-lo usando o operador ternário que funciona da seguinte forma (Questão) ? (Ação Positiva) : (Ação Negativa). Vamos ver o exemplo anterior usando operador ternário:

2. Operador Null-coalesce ‘??’

Quantas vezes você tem de testar se objetos são nulos em seu código? O operador null-coalesce pode vir a ser útil a você então. Considere o seguinte código:

Obviamente poderíamos reescrever usando o operador ternário:

Porém, usando o operador null-coalesce, conseguimos encurtar ainda mais o código (se o objeto do lado esquerdo é null, então ele retornará o valor do lado direito):

3. Inicializadores de Objetos

Cansado de perder várias linhas de código para ficar setando valores de propriedades? Ou então cansado de ficar escrevendo dezenas de sobrecargas de construtores? Os construtores auto-implementados que surgiram na versão 3.0 do C# resolvem seu problema e de quebra ainda melhoram a legibilidade de seu código. Primeiro vamos ver o jeito tradicional de inicializar um objeto:

E agora usando os inicializadores de objeto:

4. A diretiva ‘using’

Uma vez que você precisa alocar um objeto em memória um pouco mais pesado que o normal, como streams e arquivos de mídia, é importante que seja feito um controle mais rigoroso na hora de liberar a memória novamente, evitando problemas futuros. Ou seja, sempre temos de fazer três etapas: criamos o objeto, usamos ele e o descartamos. Isso pode ser ilustrado com o trecho de código abaixo:

A diretiva using permite comprimir o código anterior em:

A diretiva using somente pode ser utilizada em objetos que implementem a interface IDisposable.

5. Apelidos para nomes de classes e namespaces muito grandes

Nomes em C# podem se tornar muito longos. Se você está desenvolvendo algo para Microsoft Office, pode estar querendo abrir um processo do Word para criar um documento, o que cria objetos com namespaces enormes. O código abaixo, usando a diretiva using para criar um apelido de namespace ilustra outro uso deste canivete suíço da programação C#:

6. Tipos Nullables

Algumas vezes é necessário que suas variáveis possam conter valores nulos, mesmo quando é um simples inteiro. Isto ocorre com mais frequência quanto trabalhos com mapeamento objeto-relacional, pois na maioria dos bancos de dados sempre teremos tabelas com colunas que podem conter valores nulos. Para tornar um variável comum em uma variável que aceita null, basta adicionar um ‘?’ ao final do tipo e pronto!

Os nullable-types surgiram na versão 2.0 do framework e podem ser invocados das duas formas exibidas anteriormente.

7. Propriedades Automáticas

No C# 3.0 ganhamos as propriedades automáticas. Geralmente a maioria das propriedades das classes são apenas exposições de atributos privados ao restante do sistema. Dificilmente elas possuem alguma lógica ou verificação que realmente exija a criação de um atributo privado e de uma propriedade pública. Desta forma, para que ficar repetindo gets e sets sempre iguais, retornando o valor de um atributo privado?

Sendo assim, as propriedades automáticas vieram para agilizar a tarefa de criação de propriedades que nada mais fazem do que retornar ou receber valores. Vale salientar que em tempo de compilação vão ser gerados atributos privados para onde os valores dessas propriedades ficarão armazenados. Ou seja, não muda nada para o sistema, apenas para o programador.

O bloco de código anterior mostra o jeito antigo de fazer as coisas. O bloco seguinte mostra as propriedades automáticas:

Para quem acha que criar propriedades automáticas públicas é a mesma coisa que criar atributos públicos, está redondamente enganado. O método DataBind presente na maioria dos controles de exibição de dados somente efetua o Bind sobre propriedades públicas e nunca sobre atributos de classe. Desta forma, se pretende que sua classe possa ser exibida em controles deste tipo, é bom usar as propriedades corretamente.

8. Inferência de Tipos

Esta é outra dica que deve ser usada com cuidado. Eu particularmente uso apenas quando estou trabalhando com namespaces desconhecidos ou com LINQ e Lambda Expressions. Sendo o C# uma linguagem fortemente tipada, é natural que aja toda uma preocupação com escolher o melhor tipo para as variáveis e objetos que serão utilizadas. Da mesma forma, é importante conhecer os diversos tipos existentes quando se está manipulando métodos de terceiros. A inferência de tipos permite que você deixe de escrever o tradicional código:

Desta forma:

Peraí, igual no Javascript? NOT!

Mesmo com a inferência de tipos C# ainda é uma linguagem fortemente tipada e uma vez que a inferência esteja concluída (i.e. a variável recebeu um valor) o tipo de seu conteúdo jamais poderá ser alterado. Novamente, isto é apenas a nível de programação. Quando o compilador entra em ação, ele atribui os tipos corretos conforme a necessidade, nos poupando do trabalho de decorar os mais variados tipos e retornos de chamadas de métodos. O objeto do tipo inferido pode perfeitamente ser utilizado como um objeto normal, como o código a seguir nos mostra:

Mas então, qual o tipo de elencoSenior?

Bizarro não? Já imaginou ter de trabalhar com este tipo maluco? Muito mais fácil com inferência de tipos.

9. Expressões Lambda

Expressões Lambda são expressões de consulta feitas sobre coleções de dados de forma extremamente otimizada e simples, criando um poderosa ferramenta de produtividade. Por exemplo, se tivéssemos uma lista de 30 funcionários e quiséssemos saber todos os funcionários que possuem mais de 35 anos?

Tradicionalmente teríamos de fazer um laço para percorrer todos os elementos da lista comparando a idade de cada elemento e adicionando-os em uma outra fila à medida em que forem encontrados os funcionários mais velhos. Com Lambda, tal tarefa se restringe somente a:

10. string.IsNullOrEmpty()

Não necessariamente uma feature da linguagem, mas um método estático muito útil da classe string. Me impressiono como existem pessoas que não conhecem esta poderosa ferramenta para testar se strings estão nulas (null) ou vazias (“”). Segue exemplo de código;

11. Use os atalhos do Visual Studio

Sim, nada é mais produtivo do que saber usar sua IDE ao máximo e atalhos são uma boa parte disso. Seguem os que mais utilizo:

  • Ctrl + K + D: identa todo o seu código automaticamente;
  • Ctrl + K + C: comenta um bloco de linhas;
  • Ctrl + K + U: descomenta um bloco de linhas;
  • Ctrl + Shift + Arrow Up: durante a programação, volta um método que você estava navegando;
  • Ctrl + Shift + Arrow Down: durante a programação, avança um método que você estava navegando;
  • Ctrl + .: implementa o método/classe inexistente que você acabou de escrever;
  • Ctrl + M + O: esconde todas as regions da classe atual;
  • Ctrl + Shift + B: compila todos os projetos;
  • F5: manda depurar um projeto;
  • Ctrl + F5: manda executar um projeto;
  • F10: durante a depuração, avança uma linha;
  • F11: durante a depuração, avança uma linha entrando nos detalhes da mesma;

12. Use os snippets de código

Snippets são palavras encurtadas que quando usamos no Visual Studio (e outras IDEs), seguidas de um TAB, elas se transformam em estruturas de código completas. Experimente digitar os seguintes snippets seguido de TAB:

  • for: monta um laço for padrão;
  • if: monta uma estrutura if padrão;
  • ctor: monta um construtor vazio para a classe atual;
  • cw: chama um Console.WriteLine();
  • do: cria um bloco do/while;
  • equals: sobrescreve o método equals de Object;
  • foreach: monta um laço foreach padrão;
  • try: cria um bloco try/catch padrão;
  • while: cria um bloco while padrão;

13. Estude essa lista do StackOverflow

Sinceramente, uma hora que eu estiver com mais paciência eu dou um resumida nos principais pontos que tem lá no StackOverflow para aumentar sua produtividade com C#. Por enquanto dá uma olhada nesta lista completíssima que o pessoal reuniu por lá, tem muita coisa boa: http://stackoverflow.com/questions/9033/hidden-features-of-c

E aí, tem alguma dica que eu não cobri aqui no post?

Como aprender C# e entrar no mercado de desenvolvimento

csh

Hoje eu não tenho nenhum tutorial para passar ao leitor. Hoje eu tenho algumas dicas para compartilhar de como se tornar um desenvolvedor  (dá uma olhada nesse post do link também) C# e ingressar no mercado de trabalho rapidamente.

Entenda rapidamente como estudando cerca de oito horas por semana durante um a três meses. Tenha em mente que levo em consideração que o leitor já esteja cursando no mínimo o segundo semestre de um curso técnico ou graduação e já conheça pelo menos uma linguagem de programação.

Se tem uma coisa que aprendi durante os cinco anos que cursei Ciência da Computação foi que não podemos esperar apenas pelos nossos professores. Temos de correr atrás de conhecimento e as dicas abaixo só funcionarão com pessoas que possuem esta disciplina e aptidão para o auto-didatismo.

Todos os semestres se formam dezenas de novos técnicos em informática, bacharéis em Ciência da Computação e analistas de sistemas. Porque mesmo assim ainda existem milhares de vagas disponíveis no mercado de trabalho?

A resposta é simples: os estudantes esperam que o diploma lhe traga os empregos, quando na verdade é o conhecimento que o trará.

Neste post você vai ver:

O Mercado de Trabalho Atual

Segundo diversas pesquisas internacionais (que eu perdi as fontes), existe uma demanda muito maior no mercado de software do que no de hardware. Isso não sou eu quem estou falando, são especialistas pelo mundo inteiro. Desta forma, já vemos que o mercado é mais favorável aos programadores no que tange ao número de vagas disponíveis.

Dentre os desenvolvedores, existem diversas pesquisas (também) que enumeram as linguagens de programação mais utilizadas no mundo em diversos segmentos, e se tem duas que aparecem independente da plataforma escolhida (web, desktop, mobile, etc) são Java e C#. Não obstante, Java e C# são as linguagens que possuem as melhores médias salariais do mercado de trabalho (olhe no Glassdoor). Mas já que é muito difícil e demorado ficar bom nas duas, você terá que optar por uma se quiser ingressar no mercado o mais rápido possível e começar a disputar vagas de verdade e largar a vida de micreiro ou “fazedor de sites”.

Desta forma, com um rápido e lógico raciocínio, porque não voltar seu tempo livre ao estudo de uma dessas linguagens que possuem o maior número de vagas e maiores salários?

Já programei as duas linguagens e embora cada uma tenha seus pontos fortes optei pela linguagem C#, que me deu um retorno financeiro mais rápido e hoje possuo uma segurança enquanto profissional de saber que com meus conhecimentos nesta linguagem só fico desempregado se eu quiser (como quando decidi largar tudo para empreender). Mas como aprender C# para ingressar no mercado de desenvolvimento de software?

O que vou precisar?

Não, este post não vai te ensinar a programar em C#.

Isso porque a Microsoft já se encarrega de te fornecer tudo que você precisa para aprender, como os softwares, os treinamentos e a base de conhecimento. Basta ter a disciplina e vontade de aprender. C# é uma linguagem de programação com uma curva de aprendizagem baixa. O C# básico é claro. Mas vamos ao que interessa: o que eu preciso para programar em C# além de disciplina e vontade?

Primeiro de tudo: você precisa de um Ambiente Integrado de Desenvolvimento (IDE). A recomendação é que utilize o Microsoft Visual Studio mais recente que você encontrar no site da Microsoft. Uma vez que você esteja aprendendo, existem duas formas de obter esta ferramenta gratuitamente sem apelar para a pirataria. A primeira e mais fácil, é baixar a versão Community do Visual Studio, disponível no link: Visual Studio 2017

A versão Community possui tudo que um iniciante precisa. Se for muito pesada para a sua máquina, de repente o Visual Studio Code é mais indicado pra você.

A outra opção, é a de obter uma licença de estudante através do Microsoft Dream Spark. O Dream Spark é um programa da Microsoft onde estudantes de todo o mundo, devidamente matriculados, podem baixar a versão full de seus softwares de desenvolvimento e infraestrutura gratuitamente. Basta se cadastrar no site e comprovar sua situação de estudante (de alguma faculdade conveniada) para fazer download. Segue o link do Dream Spark: https://www.dreamspark.com

Mais tarde você irá precisar de um servidor de banco de dados também. Ok, você não precisa baixar e instalar isso agora, mas já deixo a dica para utilizar o fantástico Microsoft SQL Server Express, que é gratuito. Segue o link para download do dito-cujo: https://www.microsoft.com/pt-br/sql-server/sql-server-editions-express

Aprendendo C#

Agora que você já tem as ferramentas necessárias para desenvolver C#, faltam bons instrutores.

A menos que você more na região metropolitana de Porto Alegre/RS e queira fazer algum curso comigo em Gravataí/RS, você terá de encontrar outra forma de aprender C#. Se existir um Centro de Inovação Microsoft próximo da sua casa, consulte a disponibilidade de cursos deles, como o excelente Students to Business.

Grandes escolas profissionalizantes dão cursos de C# a custos exorbitantes, quando com um pouco de disciplina e dedicação você aprende sozinho e em casa, bastando as ferramentas que citei anteriormente e uma conexão com a Internet.

Por que Internet? Porque a Microsoft disponibiliza online excelentes treinamentos para formar desenvolvedores auto-didatas, tudo gratuito.

O Microsoft Virtual Academy é o melhor deles atualmente, embora seja bem iniciante e com poucos materiais em Português. Através do site, o aluno vê video-tutoriais sobre vários tópicos envolvendo desenvolvimento de software sobre a plataforma .NET. O aluno deve assistir aos vídeos recriando em sua máquina os passos que o instrutor demonstra e em alguns dias ele já sai programando sozinho. O mais legal do MVA são as certificações que ele disponibiliza ao fim de cada módulo, para o aluno validar seus conhecimentos.

O Channel 9 é o canal de desenvolvimento da comunidade Microsoft, com muito, mas muito material em diversos idiomas, mas principalmente em Inglês. A vantagem é que como ele possui legendas para os vídeos, fica mais fácil de acompanhar mesmo para quem não é fluente no idioma.

E por fim, tem o MSDN Magazine, revista digital (e impressa) de desenvolvimento sobre plataforma Microsoft. Infelizmente tanto ela quanto o Channel 9 não possuem uma estrutura de cursos que nem o Microsoft Virtual Academy, por isso que sugeri ele primeiro. A vantagem é que o Channel 9 é muito mais atualizado em termos de novas tecnologias, incluindo o novíssimo .Net Core.

Antigamente eu sugerir também o programa MSDN Experience, que não existe mais. No entanto, guardei alguns vídeos deles no meu canal do Youtube. São vídeos velhos, usando Visual Studio 2005, mas de repente podem te ajudar.

Mais Informações

Ok, os treinamentos acima não cobrem 100% das dúvidas de um iniciante em C#. Mas não se desespere, além de poder me mandar e-mails com dúvidas através da página de Contato, você ainda conta como excelentes fontes de conhecimento na web, a saber:

  • Google: sim, todo bom programador sabe usar o Google no seu dia-a-dia. Não esqueça de incluir a palavra C# sempre em suas buscas para filtrar melhor os resultados e de preferência, pesquise em Inglês.
  • MSDN: a Microsoft Developer Network possui toda a documentação oficial de todas as classes, métodos, propriedades e etc da plataforma .NET. Acho que pecam apenas pela falta de exemplos, mas em termos de documentação são muito bons. O fórum deles soluciona muitas dúvidas também, vale a pena se registrar.
  • CodeProject: o CodeProject é simplesmente muito bom. Lá tem muitos artigos e fontes para download de praticamente tudo que alguém pode querer desenvolver nos estágios iniciais de sua carreira como desenvolver. Guarde nos seus favoritos.
  • CodePlex: este site é o repositório open-source da Microsoft para projetos na plataforma .NET. Altamente recomendado, embora eles estejam migrando para o Git atualmente.
  • StackOverflow: muitas e muitas dúvidas de ASP.NET e C# solucionada pelos membros do site. Recomendadíssimo.
  • Egg Head Cafe: apesar do nome estranho, um ótimo lugar para tirar dúvidas e encontrar soluções.
  • .NET Perls: um site bem legal também.

Se eu lembrar de mais algum, eu posto depois.