Engenharia De Software Sisu
Construindo um sistema de seleção tipo SISU do zero
A maioria dos devs que chega na área de seleção universitária parte do princípio de que é só fazer um sortão e mandar os candidatos pro lugar certo. A realidade é bem mais chatinha. O SISU em si é um sistema federal brasileiro que gerencia vagas de ingresso nas universidades com base na nota do ENEM, e recriá-lo exige resolver problemas reais de concorrência, preenchimento de vagas e fairness algorítmico. O coração do sistema não é a interface. É o algoritmo de distribuição de vagas. Ele funciona assim: cada candidato tem uma lista ordenada de cursos e instituições de preferência. As vagas são preenchidas seguindo uma sequência de rodadas onde, a cada iteração, os candidatos são classificados por pontuação e alocados na primeira preferência que ainda tenha vaga disponível. Simples na teoria, mas a implementação gera dor de cabeça se você não prestar atenção em alguns detalhes. O problema que eu encontrei na prática aconteceu quando estávamos simulando o preenchimento de um edital com 47 cursos e cerca de 12 mil candidatos. O código inicial, que eu tinha escrito em Python usando laços aninhados ingênuos, levou cerca de 47 minutos para completar uma rodada de alocação. O tempo foi aceitável para testes isolados, mas quando precisei rodar 8 simulações com variações de cotas, o processo todo levaria horas. A solução foi estruturar os dados com dicionários indexados por curso-cidade e usar arrays numpy para as comparações de pontuação. O resultado caiu para 3 minutos e meio. A mudança não foi mágica, foi só parar de tratar cada candidatura como um objeto separado e começar a pensar nos dados como vetores.
Outro ponto que ninguém menciona é a questão das cotas. O sistema precisa lidar com cotistas e ampla concorrência correndo lado a lado, mas com regras diferentes de preenchimento. A armadilha é achar que dá pra tratar os dois grupos com a mesma lógica e só filtrar depois. Não dá. Se você alocar um cotista na ampla concorrência primeiro, ele pode ocupar uma vaga que seria de outro cotista que ficou de fora. A ordem de processamento importa. Sempre processe cota primeiro, depois ampla concorrência. Para quem quer construir algo do tipo, o fluxo básico é: Primeiro, defina a estrutura de dados. Cada curso tem uma capacidade, cada candidato tem uma nota e um ranking de preferências. Armazene isso de forma que você consiga consultar rapidamente quantas vagas um curso ainda tem e qual a menor nota de quem já foi aprovado. Um dicionário com chave composta (instituicao, curso, turno) mapeando vagas restantes funciona bem. Para o ranking de notas, uma lista ordenada ou um heap binário resolve.
Depois, implemente as rodadas. Cada rodada percorre os candidatos em ordem decrescente de nota. Para cada candidato, verifica-se sua primeira preferência que ainda tenha vaga e faz a alocação. Se não houver vaga em nenhuma preferência, o candidato é descartado daquela rodada. O sistema federal do Brasil costuma rodar entre 2 e 4 rodadas dependendo do edital. Existem bibliotecas que podem ajudar, mas nenhuma resolução pronta vai cobrir as particularidades do seu edital. Eu testei usar a biblioteca ortools do Google para modelar o problema como um solver de constraint. Funcionou, mas a configuração inicial levou mais tempo do que escrever o algoritmo simples. A menos que seu cenário tenha restrições complexas como equilíbrio regional ou quotas específicas por município, o algoritmo guloso com rodadas é suficiente e muito mais rápido. Se você está baixando ou procurando por um repositório de exemplo, cuidado com cópias que prometem "código pronto do SISU". Muitos desses projetos são incompletos, têm bugs nas regras de cota ou simplesmente não rodam em Python 3.10+. O que eu recomendo é começar com uma implementação mínima e adicionar complexidade gradualmente. Teste com dados reais do INEP, que são públicos, e valide contra os resultados oficiais do edital que você está tentando reproduzir.

Um detalhe técnico importante: a comparação de notas com float pode causar problemas de precision. Use decimal com precisão configurada ou trabalhe com notas multiplicadas por 1000 como inteiros. Eu perdi meio dia rastreando um bug onde um candidato com nota 985.2 era empurrado para baixo de outro com 985.199999999 por causa de rounding em double. O maior gargalo que vejo hoje é a falta de transparência nos processos seletivos. Muitos sistemas são construídos sob pressão, sem documentação, e quando o edital muda meia linha, tudo quebra. Invista em testes unitários desde o início. Cobertura de 80% nos módulos de alocação vale mais do que uma interface bonita que ninguém consegue entender como funciona por dentro.
Galeria
-
Engenharia de Software - Análise e Projeto de Sistemas | Shopee Brasil -
Engenharia de Software: um guia sobre a área, carreira, mercado e ... -
Engenharia de Software - Sérgio Guerreiro -
Introdução à Engenharia de Software - maxclass_it