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.
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.
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.
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.
É possível criar e manipular livremente grafos de várias categorias, como grafos com peso nas arestas, arestas direcionadas, e etc.
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.
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.
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.
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.
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.
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.
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.
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.