Criei uma rede social apenas com conhecimentos de Algoritmos e Estruturas de Dados
Hoje terminei mais um semestre na faculdade, e talvez o semestre mais caótico que já tive. Foram várias noites acordado programando para trabalhos que não sabia se conseguiria entregar no final, mas por sorte deu tudo certo.
No meio de toda essa bagunça, eis que surge um trabalho da cadeira Linguagens de Programação. A cadeira se propõe não a ensinar necessariamente várias linguagens de programação a fundo, mas sim conceitos por trás de qualquer linguagem e diferentes paradgimas, de forma que o processo de aprender uma nova linguagem de programação não seja uma tarefa tão trabalhosa.
Sobre o trabalho
O trabalho final da cadeira consistia em criar um software em alguma linguagem de programação que não tivemos contato antes. Pode parecer legal poder fazer qualquer coisa, mas tanta liberdade tem um preço: indecisão!
Pensamos em muitas possibilidades, e a princípio decidimos que faríamos um jogo, mas aí surge outra discussão: qual jogo será? Pra encurtar a história, de alguma forma faltando sete dias para a entrega do trabalho conseguimos finalmente entrar em consenso e decidimos fazer uma rede social.
O resultado
Para quem não se interessa tanto pelo processo de criação, disponibilizarei desde já o link para acessar o front-end web que consome todos os recursos da API. Lá você poderá criar uma conta, e publicar no seu próprio mural ou de outras pessoas. Também poderá alterar a própria bio e seguir diferentes usuários. É uma rede social bem simples, mas ficaria feliz de ver algumas publicações no meu mural :D
Links
Clique aqui para acessar a rede social
Clique aqui para acessar o repositório do back-end
Divisão de tarefas
Dividimos as tarefas entre front-end web com React, mobile com Flutter, mas falarei sobre a parte pela qual fiquei responsável: construir uma rede social em Golang e disponibilizá-la em forma de API para que tanto o front-end web e mobile possam utilizar seus recursos.
Desenvolvimento
Com apenas uma semana e 0 noção sobre Golang, a primeira coisa que fiz foi ler a documentação para saber o básico da sintaxe e qual é a estrutura básica de um projeto nessa linguagem. Isso me tomou um dia, após isso não me preocupei tanto com as melhores práticas (já que o prazo era apertado) e comecei a aplicar os tão mencionados conhecimentos de base.
Grafos
Grafo é uma estrutura de dados que possui vértices e arestas. O vértices possuem informações e as arestas interligam diferentes vértices uns com os outros. Essa foi a estrutura de dados que melhor se encaixa no nosso problema, afinal, cada vértice poderia representar um usuário da rede social, e cada aresta uma relação entre eles (como seguir ou ser seguido por exemplo).
O grafo foi implementado da forma mais genérica possível para que qualquer pessoa pudesse aproveitá-lo independente da aplicação. Não pretendo adentrar muito no tema de grafos aqui, mas vou mencionar alguns métodos de uma implementação de grafos para que a próxima etapa do desenvolvimento faça mais sentido.
Criar vértice
- Este método é responsável por criar um vértice e guardá-lo dentro do grafo para futuras consultas e manipulações.
Criar relação entre vértices
- Este método é responsável por criar uma relação entre dois vértices
Busca em largura
- Este método é responsável por fazer uma busca entre os vértices do grafo partindo de um vértice inicial. Este método percorrer os grafos sempre passando primeiro por aqueles vértices que estão conectados ao vértice atual e assim por diante
Rede Social
Agora parece que ficou simples, com o grafo implementado, só preciso dar sentido aos seus métodos. Nesta etapa eu criei a classe Rede Social herdando a classe grafo. Isso significa que a partir de agora tenho acesso a todos os métodos e atributos de um grafo dentro da minha classe Rede Social, podendo adicionar novo métodos que façam sentido apenas para o contexto do meu problema.
Agora para adicionar um usuário na rede social, basta criar um método "AddUser" que cria um vértice dentro de um grafo. O que eu guardarei dentro do vértice? Um objeto do tipo Usuário, é claro. Depois falarei mais sobre ele.
Seguindo o raciocínio, podemos relacionar a busca de um usuário da rede social com a busca em largura. Quando buscamos por algum usuário da rede social, percorremos nossos amigos, depois amigos de amigos e assim por diante. Desta forma, primeiro são retornados os resultados mais próximos a mim, cuja possibilidade de ser quem me interessa um pouco maior.
Métodos Rede Social | Métodos correspondentes Grafo |
---|---|
Criar usuário | Criar vértice |
Seguir usuário | Criar relação entre vértices |
Pesquisar usuário | Busca em largura |
Usuário
Não há muito o que falar aqui, mas para resumir, foi criada uma classe Usuário para guardar informações pertinentes a cada usuário, como o username, nome, senha, bio, mural...
Quando uma conta é criada na rede social, a classe Rede Social cria uma instância de um Usuário. Após isso, é criado um vértice no grafo cujo valor é dentro dele é a instância do Usuário. A partir deste momento aquele usuário pode interagir com a rede social e com outros usuários.
API
Aqui foram definidos alguns endpoints para que o front-end web e mobile possam consumir os recursos do back-end. Aqui as coisas ficaram bem simples, já que todos os métodos necessários estava implementados na classe Rede Social, que por sua vez consumia métodos já implementados na classe Grafo. A responsabilidade da API se resumiu apenas a chamar diferentes métodos da rede social e responder ao cliente de acordo.
Considerações finais
Com certeza ainda há muito o que melhorar aqui, um projeto de sete dias nunca está livre de bugs, e com um conhecimento limitado em Go tenho certeza que fiz coisas consideradas fora do padrão para a linguagem.
Apesar de tudo isso, acredito que foi um grande aprendizado. Pretendo continuar estudando Go e aprimorando aos poucos este projeto :)
Espero que o texto não tenha ficado muito grande e cansativo, e que de alguma forma eu possa ter despertado o interesse de alguém em aprender mais sobre algoritmos e estruturas de dados.