Sobre o Projeto

Ferramenta de manipulação de grafos e exploração de algoritmos.

A ferramenta permite a exploração e manipulação de grafos e facilita o aprendizado do funcionamento de diversos algoritmos que atuam sobre eles.

Tudo começou como um desafio de férias e um bom motivo para aprender tecnologias diferentes, e se tornou uma ferramenta útil para o aprendizado de outros estudantes.

Autores

Foto do Thiago Lamenza

Thiago Lamenza

Ciência da Computação na PUC-Rio

Sempre tive muita afinidade por computadores e vontade de entender como eles funcionavam então a escolha de computação foi natural para mim.

Diversas áreas da computação me atraem, as principais são: Desenvolvimento web, inteligência artificial e ciência de dados.

A faculdade me deu o insumo necessário para aprender sobre computação e a oportunidade para colocar meus conhecimentos em prática.

Foto do Victor Martins

Victor Martins

Ciência da Computação na PUC-Rio

Sou apaixonado por computação desde que eu era bem novo. Mesmo entendendo pouco do que eu procurava, a vontade de entender estava lá.

Tenho interesse em muitas áreas distintas, algumas delas são: linguagens de programação, desenvolvimento de aplicativos móveis, privacidade e acessibilidade.

Desde que entrei na faculdade, recebi um suporte incrível dos meus professores e das minhas professoras e tenho certeza que é isso o que eu amo estudar.

História

Enquanto dois estudantes de computação passavam por disciplinas que exploravam o conceito de grafos, eles sentiram a falta de uma ferramenta didática para entender melhor o que estava sendo ensinado, e então resolveram criar uma do zero.

Durante as férias o projeto começou a ser discutido e implementado. Conversamos sobre o foco principal e os recursos essenciais, e discutimos sobre os primeiros passos da implementação.

Com o passar das semanas fomos continuamente adicionando e aprimorando a ferramenta de acordo com o que fomos conversando ao longo do tempo.

Ainda que seja um projeto no qual temos total liberdade para tomar decisões, inclusive com relação ao tempo que dedicamos a ele, escolhemos como uma meta ideal termos os recursos essenciais funcionando antes da volta às aulas (já que nosso tempo livre diminui bastante). Conseguimos fazer isso, e continuamos aprimorando a ferramenta e desenvolvendo novos recursos no tempo livre que temos.

Fundamentos

O que são grafos?

Grafos são estruturas matemáticas definidas por um conjunto de objetos e pelas relações entre eles. Os objetos são usualmente chamados de nós, e as relações chamadas de arestas.

Para que servem os grafos na prática?

Essas estruturas podem representar diversas situações reais, dessa forma algoritmos que atuam sobre grafos podem resultar em soluções para problemas reais.
Representar um mapa por meio um grafo permite o encontro do melhor caminho entre dois pontos do mapa, permite o encontro de um trajeto que passa por todas as ruas da forma mais eficiente.
Representar disciplinas e salas por meio de um grafo, permite que aulas sejam alocadas nas salas ideais considerando o número de alunos, o tamanho de cada sala e outros diversos fatores.

Recursos

Manipular Grafos

É possível criar e manipular livremente grafos de várias categorias, como grafos com peso nas arestas, arestas direcionadas, e etc.

  • Tipos de Grafos
    • Direcionados e não-direcionados
    • Nós coloridos e não-coloridos
    • Arestas com valor associado (peso, custo, etc.) e sem valor associado
  • Ações em Nós
    • Criar
    • Mover
    • Selecionar
    • Apagar
  • Ações em Arestas
    • Criar
    • Selecionar
    • Apagar
  • Ferramentas Auxiliares
    • Alinhar nós
    • Conectar desconectar nós
    • Desfazer e refazer ações

Executar Algoritmos

Além disso os usuários podem executar uma série de algoritmos nos próprios grafos e acompanhar o passo a passo com explicações no processo.

Compartilhar

O compartilhamento de grafos pode ser feito de diversas maneiras, como por meio de uma imagem ou mesmo por meio de um link ou arquivo que pode ser enviado a outra pessoa, possibilitando que ela então consiga manipular o grafo. Isso permite que colegas de turma discutam com facilidade uma execução em algoritmos criados por eles próprios.

  • Exportação
    • Arquivo
    • Texto
    • Link
    • Imagem
  • Importação
    • Arquivo
    • Texto
    • Link
  • Favoritos (armazenamento local)

Desafios e Aprendizados

Trabalho em Equipe

O projeto serviu como um exercício para nossa comunicação e organização. A divisão das tarefas foi ocorrendo de forma natural, seguindo nossa empolgação e a dedicação necessária para cada recurso. Conversávamos frequentemente para alinhar os próximos passos e pensar em como resolver problemas complexos ou que um de nós acreditava ter uma solução mais elegante.

Linguagem e Desenvolvimento

Decidimos desenvolver tudo a partir do zero e usando apenas JavaScript puro. Do desenho dos nós e das arestas, ao tratamento de eventos do mouse, ao passo a passo dos algoritmos e todo o resto, tudo foi feito manualmente e cuidadosamente por nós dois, sem dependências externas. Fizemos uso de alguns recursos mais avançados da linguagem como regular expressions e promises nos momentos apropriados.
Durante o desenvolvimento nós buscamos boas práticas, exemplos de implementação de algoritmos e soluções para problemas encontrados. Partes (pequenas) dos resultados eventualmente foram usadas no projeto. Nenhuma porção significativa de código foi feita por alguém além de nós dois.
Para a publicação nós utilizamos dependências externas afim de estender a compatibilidade do nosso código. Além disso, para a interface utilizamos ícones do Bootstrap Icons.

Organização

O código-fonte do projeto é bastante modularizado. Documentamos diversas partes do código, principalmente as mais relevantes de cada um dos módulos. Além disso, procuramos usar design patterns que melhor se adequam às necessidades, como herança que aprendemos em aula, e mixin e delegate, que aprendemos por conta própria.

Versionamento

Nós já conhecíamos e sabíamos usar o Git, mas aprofundamos nosso conhecimento durante o desenvolvimento. Isso se deu nos momentos em que recursos como branches e stashes se encaixavam bem com as nossas necessidades, e também nos momentos em que algo inesperado acontecia e tínhamos a liberdade cometer erros ao tentar consertar, afinal aprender mais sobre desenvolvimento era um dos principais objetivos do projeto.

Direitos Autorais e Código Fonte

Código Fonte

Todo o código fonte da ferramenta está disponível no repositório público e qualquer um pode explorá-lo.
Nossa proposta é que os alunos que usam a ferramenta possam ver como ela foi feita. Isso vai desde a leitura do código até a exploração do histórico de alterações, possibilitando que vejam na prática como o projeto foi sendo construído aos poucos e como é natural que partes do código sejam reescritas (refatoradas) durante o desenvolvimento.

Licença

O GraphTeacher utiliza a licença MIT, ela está presente no cabeçalho dos arquivos do projeto.

MIT License

Copyright (c) 2021 Thiago Lamenza e Victor Martins

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.