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.

manin, muito bom mas quando tentei cadastrar deu erro de cors

Sinto muito, não achei que a publicação alcançaria mais pessoas e como eu não queria que a plataforma onde eu hospedei a API gerasse custos eu desativei

Gostei muito de ler e ver o seu processo e todas as explicações, tenho 17 anos e já estudo programação tem 2 anos, eu gostaria de conhecer mais sobre algoritmos, padrões de arquitetura, sinto que esse é o próximo passo para eu me tornar um profissional melhor, se alguém puder me indicar um meio de treinar e estudar isso da maneira correta, agradeceria muito. E parabéns pelo trabalho.

Muito obrigado, fico feliz que tenha gostado! :) Sobre recomendações, eu sempre recomendo fazer uma boa faculdade. Já que você é jovem e começou bem cedo a programar, seria interessante estar vivenciando um meio com pessoas que compartilham o mesmo interesse. Na minha experiência pessoal, a faculdade me ajudou muito nisso e também abriu muitas portas
É a minha meta ;)

Muito boa sua explicação! Eu tenho mais de 7 anos de experiência mas sempre tive dúvidas em como funciona uma rede social. Aparentemente vc fez bem rápido todo o algoritmo e tudo mais. Parabéns!

Muito obrigado :)

Cara muito interessante de verdade, só não consegui me registrar também :/

Sinto muito, não achei que a publicação alcançaria mais pessoas e como eu não queria que a plataforma onde eu hospedei a API gerasse custos eu desativei

Ocorre um erro de CORS quando tento criar uma conta. Mas achei bem interessante o projeto e me senti inspirado a testar meus conhecimentos criando também uma rede social, que é um desejo que sempre tive desde que comecei a estudar programação.

que massa! parabéns pelo projeto

Estou querendo aprende Go tbm, por onde vc estudou?

Muito obrigado :D Eu estudei pela documentação e alguns vídeos. Gostei bastante dos vídeos do HunCoding sobre Go