terça-feira, 6 de outubro de 2020

SIGAA 2.0 — Consertando o sistema de matrículas com Prolog

Acho que pela primeira vez a minha procrastinação quanto aos textos do blog me trouxe benefícios. O assunto de hoje está muito em pauta entre meus conterrâneos de faculdade, pois é época de rematrícula. Só esperemos que isso nos renda um pouquinho mais de visibilidade, não é verdade?

No último post sobre Prolog (leia aqui), eu falei sobre os fundamentos essenciais do paradigma declarativo de programação e o básico dessa linguagem em particular. Agora, eu lhes apresento o meu projeto extracurricular. Se eu não tivesse focado em outras coisas naquela época, ele até poderia ter ido pra frente, porque eu consigo enxergar certa utilidade nele. Por esse mesmo motivo, o post de hoje terá apenas o conceito principal, a estrutura e alguns aprimoramentos que eu tinha pensado para o meu projeto. Simbora que é dia de reclamar!

Prolog(o)

Antes de tudo vocês precisam entender como nasceu esse projeto. Toda ideia parte de uma necessidade, e acreditem: eu, assim como muitas outras pessoas, temos um problema enorme nas mãos. Eis o motivo.

Eu estudo na Universidade Federal de Sergipe (UFS) e ela usa uma plataforma chamada SIGAA (Sistema Integrado de Gestão de Atividades Acadêmicas). É o portal no qual se faz tudo relacionado à instituição, desde matricular-se até enviar trabalhos e se inscrever em bolsas de estágio. O que acontece é que, a partir do segundo período, cabe ao aluno montar sua própria grade e horário do jeito que mais lhe seja conveniente. Turmas são abertas no SIGAA e as matrículas ficam disponíveis por alguns dias. "Ah, Gabriel, mas cadê o problema nisso?", vocês podem perguntar. "Parece bem simples". É, parece mesmo. Mas eu já estou indo para o quinto período — que será remoto, por sinal. Já é a quarta vez que me presto a esse trabalho, e até hoje acho o sistema de montagem de grade do SIGAA um caos enorme. Em primeiro lugar, o SIGAA nem é da UFS, é um projeto feito pela UFRN (a Federal do Rio Grande do Norte) e transposto pra outras federais, mas até aí tudo bem. O problema começa com o próprio jeito com que as matérias são categorizadas.

Cada matéria está associada a um departamento (de matemática, de computação, de estatística, etc.) e a um código (ex.: COMP0196, MAT0064, por aí vai). Ok, fácil. Obviamente, pode ter mais de um professor para a mesma matéria e também mais de um horário. Mas os horários também vêm em códigos! Está na hora da sua primeira aula de "sigaanês". Acompanhe-me nesta jornada desprovida de senso comum.

Introdução à insanidade


Você acabou seu primeiro período na UFS e, depois de umas semaninhas de descanso, chegou a hora de voltar. Primeiro, vai levar alguns minutos para achar o caminho certo até chegar na tela de matrícula. Pode ir se acostumando com isso, será um sentimento onipresente enquanto você tiver que usar essa plataforma. Então você chega lá, navega pelas matérias e vê uma que precisa pegar. Ao lado dela, temos o nome do professor, a quantidade de vagas, e o seguinte hieróglifo: "24T12". Boa sorte pra decifrar isso, Sherlock. Se você é uma pessoa precavida, antes de tomar qualquer decisão você iria procurar alguém com mais experiência ou estudaria com mais profundidade a cifra que apareceu em sua tela. Mais tarde, você descobre que 24T12 deve ser lido como (2, 4) + T + (1, 2), que quer dizer "Segunda e quarta (2, 4), no período da tarde (T), nos dois primeiros horários (1, 2), que por sinal seria das 13h às 15h (coisa que também você não teria como possivelmente saber de antemão)". Isso que eu chamo de acesso à informação. Elementar, não acha, meu caro Watson?

Como se não bastasse isso, a interface é horrivelmente fatigante e nem um pouco intuitiva. Quer um exemplo? Esta é a tela inicial para a consulta geral de turmas. Tenha em mente a palavra inicial.

E aí, curtiu fazer isso a cada seis meses?


"Mas que porra é essa que eu estou vendo?". Isso, colegas, era pra ser uma tela de busca. Cada checkbox, cada item desse quadrado central é um filtro que você pode aplicar pra refinar a sua pesquisa. Claro, existem centenas, senão milhares de turmas ofertadas pela UFS, em dezenas de horários e professores diferentes. É óbvio que você eventualmente vai querer e precisar filtrar os seus resultados. Mas por que tantos filtros logo de cara? Do jeito que está, fica parecendo que você tem que preencher isso tudo antes de clicar no botão "Buscar" — que, aliás, é minúsculo e não tem nenhum destaque ali na parte inferior da tela; aposto que você nem deve ter visto. E mais: se você tá a fim de ver todas as matérias, você precisa deixar quase tudo em branco. De que adianta ter trezentas opções disponíveis se na maioria das vezes ninguém usa 80% delas?

Olha, eu não sou nenhum expert em design e nem estudo formalmente, mas eu sou de uma área afim e gosto muito de analisar as escolhas de layout de programas famosos, assim como boas práticas e erros comuns que devem ser evitados. Eu também sei que o SIGAA não foi feito para ser referência em facilidade e inovação. Só que isso aqui é uma bagunça, sinceramente, e nem seria tão difícil pensar em soluções mais elegantes para essa tela. Sabe um jeito fácil?

Nessa tela, temos o gritante total de 15 checkboxes! 12 delas são filtros, 2 delas são de informações adicionais (a penúltima e a antepenúltima), e a última é para escolher um método de ordenação. Será que o usuário médio precisa mesmo de 12 jeitos diferentes de filtrar as matérias? Eu acho que não. Mas eu não vou apenas reclamar por reclamar. Escrever esses últimos parágrafos me deixou tão motivado a provar o meu ponto que eu abri o Adobe Illustrator e passei vinte minutos fazendo isso.


Bem melhor! As mesmíssimas opções da tela anterior, mas mostradas (ou ocultadas) de maneira inteligente. Como você pode ver, não precisa de muito esforço para melhorar o sistema do SIGAA, e isso porque só foram feitas mudanças visuais, e não estruturais. Quer dizer, se você tem quarenta opções mas todo mundo só usa cinco delas, é melhor realçá-las e esconder as demais. Só que pense comigo: se você precisa esconder as opções menos usadas, é ainda menos provável que os usuários acabem utilizando-as. Consequentemente, o que será que isso diz sobre a utilidade real dessas opções?

Enfim, toda essa introdução teve o intuito de mostrar que, embora precise de uma reformulação mais profunda, não é necessário muito esforço para tornar o SIGAA um sistema mais acessível, fácil e responsivo. Graças a essa estressante experiência, eu tive a ideia para o meu protótipo de montagem de grade.

O conceito inicial


Em poucas palavras, eu estava irritadíssimo com a burocracia de desvendar horários em idiomas egípcios e de precisar ter sempre em mente os que já peguei (para não causar conflito entre duas matérias). Tinha tantas variáveis a se considerar que era difícil pensar em todas ao mesmo tempo, naquele layout. Às vezes, queria saber as matérias que tinham em determinado horário; outras, que professores davam  uma matéria específica. Essencialmente, o que eu queria era um jeito mais legal de acessar e manipular os filtros já disponíveis no SIGAA. Então, fui pro Prolog e comecei a pensar sobre como faria isso. A primeira coisa a se fazer era, obviamente, montar a base de dados, com tudo que eu usaria.

Alguns exemplos de relações de turma.

Como vocês podem ver, uma turma consiste em uma relação contendo parâmetros para a matéria, o professor, e o código do horário. Mas é claro que eu não queria ter de lidar diretamente com esse código que não me diz nada sobre a minha turma. Ele é um recurso usado para facilitar a leitura dos dados por parte do computador, o que é ótimo, mas podemos processá-lo — isto é, fazer uma intermediação entre o que o computador lê e o que o usuário final verá. Para isso, eu acrescentei mais alguns fatos.

Relações de horários, destrinchando o código do SIGAA.

Um horário, por sua vez, leva o código de antes como primeiro parâmetro e, em seguida, faz uma "decomposição", colocando-o no bom português: especifica, por extenso, os dias da semana em que a aula acontece, bem como uma versão decente e inteligível da hora em si. Note que, para que eu pudesse armazenar mais de um dia no mesmo parâmetro, eu tive que utilizar o formato de lista. Portanto, mesmo que a aula só acontecesse uma vez na semana, ainda assim deveria ser uma lista de um único elemento. (Obs.: As linhas verdes, iniciadas pelo símbolo "%", são linhas comentadas. Provavelmente eu listei a maioria dos horários possíveis e só comentei aqueles que não apareciam nas turmas cadastradas na imagem anterior).

Feito isso, o último passo seria montar uma regra que não apenas fizesse a associação de fato entre turmas e horários, mas também cujos parâmetros fossem os filtros propriamente ditos. No fim das contas, aquela regra seria usada para fazer as queries posteriormente. Essa parte é melhor explicada mostrando o exemplo do que tentando conceituar, então vejam como ficou abaixo.

Regra da grade.

Nessa regra, eu coloquei cinco filtros: nome da matéria, professor, dia(s) da semana, hora e o código em si. Eu optei por tornar o código um filtro porque pode acontecer de a pessoa querer buscar um horário muito específico, que precise tanto do dia quanto da hora. Nesse caso, só o código pode providenciar essa interseção de informações. Não é difícil de entender a sintaxe dessa regra: logicamente, ela é uma conjunção (um "e", ou "and") entre as duas relações que estabelecemos no início. Ela pega elementos de turma para a matéria, o professor e o código; e horário para o dia e a hora (perceba que a variável "Cod" está presente nos dois, fazendo, assim, a associação).

Buscando no sistema


Independentemente dos filtros que você usaria na sua query, pela sintaxe do Prolog, você teria que preencher todos os parâmetros da grade, seja com variáveis ou com dados de fato. Começando pelo mais básico, caso você quisesse ver todas as turmas no sistema, bastaria apenas digitar o comando grade(A,B,C,D,E). Não seria muito útil ao meu ver, mas ainda possível.

Indo para casos mais legais, vamos supor que você quisesse pegar álgebra linear nesse período. Para isso, você só precisaria preencher o primeiro parâmetro, assim: grade(algebra,A,B,C,D).

Filtrando por matéria.

Agora, cada variável (A, B, C e D) é associada a um parâmetro e o resultado é apresentado de maneira organizada e acessível; você sabe logo de cara quem são os professores, em quais dias eles lecionam e em quais horários. Eu pessoalmente achei bem melhor assim, mas admito que sou suspeito para falar. Cabe a você, leitor, essa decisão. (Obs.: a palavra "false" em vermelho denota o fim dos resultados da query). Observe mais alguns exemplos de queries.

Precisa preencher alguns dias da semana? Sem problema!

Filtrando por dia.

Quer saber quais horários em que aquele professor incrível dá aula? Tá na mão!

Filtrando por professor.

Que tal ver o que tem naquele último horário que falta pra fechar a grade?

Filtrando por código.

Você é livre para combinar quantos filtros quiser, mas lembre-se que, quanto mais refinada a sua busca, menos resultados aparecerão — pode ser que você não encontre o que estava procurando.

Filtragem composta.


É isso! Esse é um esboço básico e rudimentar que serve apenas para ilustrar o meu ponto. Tudo foi feito em pequeníssima escala e mais como uma prática de Prolog e um desafio a mim mesmo do que qualquer outra coisa. É um hábito meu tentar criar alternativas para esses aplicativos ou serviços que me geram muita frustração e estresse. Mesmo assim, eu sempre me divirto muito e dou risada dos absurdos que encontro em projetos como este. Além disso, na época eu tinha uma visão bem ambiciosa sobre essa pequena ideia, e vou finalizar o texto de hoje (que se estendeu beeem mais do que eu esperava) com um pouco da minha idealização.

Produto final e melhorias futuras

Este projeto nunca teve a intenção de ser um substituto ao SIGAA. Nem de longe. Eu nunca vou querer fazer algo tão complicado como aquilo sem a ajuda de muita gente e sem bastante dinheiro no meu bolso. O que eu pensei inicialmente seria só um programa para facilitar a vida de quem tivesse que montar a grade do período. O programa teria as matérias ofertadas pela UFS (o que poderia ser um eventual empecilho, caso tivesse que extrair a relação de turmas de lá) e serviria apenas para oferecer uma montagem mais intuitiva; você teria depois de ir ao próprio SIGAA para cadastrar as suas turmas. A interface não seria igual a esse protótipo que mostrei, teria um belo design drag-and-drop no qual você poderia interagir de maneira mais significativa com as matérias. Sempre à sua vista, teria a sua grade, que seria atualizada em tempo real, conforme você a alterasse. Sei que no papel tudo é mais bonito do que na prática, mas acho que isso melhoraria muito a experiência do usuário.

A longo prazo, eu pensei que seria interessante fazer uma integração com o sistema da UFS em si. Desse jeito, essa área do SIGAA se tornaria obsoleta, e todo o processo de matrícula seria feito pelo programa. Acho que se pode chamar de uma "terceirização". Ao clicar para fazer a seleção de turmas, o aluno seria redirecionado para esse serviço. Lá, uma vez que ele confirmasse as suas escolhas e o período de inscrição acabasse, as solicitações seriam enviadas de volta para o SIGAA para futuramente serem processadas. Não somente seria bom para os estudantes, que teriam menos dificuldade para fazer uma atividade tão corriqueira e tão repetida como esse, mas também para o portal em si, que teria o seu tráfego reduzido drasticamente em tais épocas (coisa de que sofre todo semestre, e teve seu ápice de falhas agora na matrícula para o período remoto).

Por fim, outra melhoria em que vejo bastante potencial seria tornar a busca por vagas em turmas menos competitivas ou, no mínimo, tirar um pouco da sensação de "tiro no escuro". Essa seria bem mais complexa de se implementar, mas creio que seja possível e que traria uma mudança enorme na vida dos universitários. Cada turma tem um número limitado de vagas e, uma vez que o número de pessoas que querem entrar nela ultrapassa esse limite, existe um sistema de prioridade que decide quem é aceito e quem não. Para isso, uma série de critérios é levada em consideração, como alguns dados do aluno e outros da própria turma.

A minha ideia seria que cada turma tivesse o que eu chamei de "medidor de deferimento": um índice que calculasse essa prioridade com base nas pessoas naquela turma e informasse a probabilidade de o usuário ser aceito naquela turma. Cada turma teria uma cor que representaria esse índice de forma mais visual: verde seria "muito provável" e vermelho, "pouco provável", e outras cores entre os dois comporiam um gradiente. O impacto dessa função seria principalmente na reformulação de matrícula. Por estarem às cegas quanto a sua posição nessa prioridade, muitas pessoas acabam tendo suas turmas rejeitadas (indeferidas) e precisam procurar outras turmas para uma segunda chance de entrar nas matérias em questão. Caso essa mudança entrasse em vigor, ela traria mais transparência aos alunos e talvez pudesse reduzir significativamente a quantidade de pessoas na reformulação.

Enfim, estas são as minhas ideias para consertar uma parte desse site que, a meu ver, é inaceitavelmente mal projetado e implementado. Encontrei erros que nunca vi na vida passeando pelo SIGAA, e não tenho desejo algum de voltar a vê-los. Só espero que ele melhore no futuro. Se não para mim, para futuras gerações que evitarão doses fatais de estresse e confusão mental.

Se você leu até aqui, o meu muitíssimo obrigado!

Nenhum comentário:

Postar um comentário