Eu só quero fazer uma aula sobre [x] , mas pesquisar no catálogo on -line é tão lento e meus resultados são amplamente irrelevantes. Wtf?
Harvard tem muitos sites de pesquisa de cursos, mas nenhum deles é bom. Este projeto é uma tentativa de levar o problema mais a sério: escreva software de alto desempenho e defina ótimos padrões para que as pessoas possam melhorar, sugestões mais úteis, 100x mais rapidamente.
Classes.wtf é um mecanismo de pesquisa distribuído e personalizado, escrito em Go que se concentra na velocidade e na qualidade dos resultados. Ele é construído em um banco de dados Redis na memória que é executado como um subprocesso do aplicativo. Esse índice suporta pesquisa difusa e prefixo de texto completo em todos os campos, juntamente com uma sintaxe de consulta rica.
O front -end é um site estático construído com esbelto e processa consultas de pesquisa imediatamente após cada pressionamento de teclas. O objetivo é para todo o {Solicitação, Computação, Resposta e Renderizar} Pipeline para levar menos de 30 milissegundos.
"Agora espere apenas um segundo", eu ouço você dizendo. A velocidade da luz não é rápida o suficiente para que os dados viajem pelo mundo nessa latência! Mas não se preocupe, tudo bem. Executamos várias réplicas em locais distribuídos geograficamente usando as solicitações de Fly.io e rota para o mais próximo. Cada réplica executa seu próprio mecanismo de consulta de texto completo, por isso é completamente independente.
(A réplica do servidor mais próxima para Cambridge, MA vive em Secaucus, NJ, a apenas 200 milhas de distância.)
Por que você fez isso? Fiquei frustrado com o quão irritante era procurar aulas. E eu sou um engenheiro de software de sistemas, que praticamente torna meu mandato tornar as coisas mais rapidamente.
Por que está escrito em Go? Porque eu escrevi isso em um fim de semana e precisava de uma linguagem de sistemas muito rápida para iterar, além de ter baixa latência. A simplicidade e os tempos de compilação de Go ajudaram nisso. Eu posso reescrevê -lo em ferrugem se decidir passar mais algumas semanas com isso.
Por que você está usando Redis? É muito rápido, ele armazena dados na memória, a API é simples e robusta e possui o melhor módulo de pesquisa de texto completo. Para esse tamanho de conjunto de dados, a incorporação Redis oferece desempenho incomparável com uma fração do custo e esforço de alternativas.
Você pode fazer isso para minha escola? O código é todo de código aberto e você pode dar uma olhada ou portar! Se você estiver fazendo isso, considere entrar em contato com o Twitter @ekzhang1 ou por e -mail, já que eu adoraria ouvir sobre o seu trabalho.
Onde os dados são adquiridos? O catálogo do curso foi indexado a partir de títulos e descrições de cursos disponíveis ao público online. Consulte o código na datasource/ pasta.
Você precisa ir 1.20 e Docker para trabalhar no back -end e node.js v18 para o front -end.
Isso carrega dados do currículo para termos acadêmicos antes da primavera de 2022 (AY 2022) e do meu.Harvard a partir do outono de 2022 (AY 2023). Você pode personalizar o script de carregamento de dados se quiser indexar um conjunto diferente de cursos.
go run . download -year 2019 # -> data/courses-2019.json
go run . download -year 2020 # -> data/courses-2020.json
# ... and so on
go run . download -year 2025 # -> data/courses-2025.jsonInfelizmente, o My.Harvard não permite que você visualize os cursos de anos acadêmicos anteriores; portanto, os anos entre 2023 e o atual provavelmente não retornarão nenhum dados. Para isso, você pode baixar os conjuntos de dados pré -carregados apropriados do nosso balde público S3.
Notas históricas sobre dados pré -carregados:
Depois de receber os dados do curso ano a ano, você pode combiná-los para formar um único arquivo courses.json com todos os cursos, que podem ser pesquisados pelo WebApp.
go run . combine Isso procura todos os arquivos denominados data/courses-{year}.json e os mescla.
Você também pode fazer o inverso, dividindo um único data/courses.json em vários data/courses-{year}.json .
go run . splitO servidor ouve solicitações da Web na porta 7500 (também gera uma instância do Redis, usando o Docker, na porta 7501.)
go run . server -local -data data/courses.json Você também pode executá -lo com outros arquivos de dados. Por exemplo, se você passar por data/courses-2021.json , você obterá apenas os resultados da pesquisa para o ano acadêmico do outono de 2020 a primavera de 2021.
Agora você pode desenvolver no frontend, que proxies automaticamente as solicitações da API para a porta do servidor.
npm install
npm run dev
Visite localhost:5173 para ver o site.
docker build -t classes.wtf .
docker run -it --rm -p 7500:7500 classes.wtfaws s3 cp data/courses- $YEAR .json s3://classes.wtf
aws s3 cp data/courses.json s3://classes.wtffly deployVeja a página dos colaboradores. Os mantenedores atuais podem ser contatados por e -mail em [email protected]. Licenciado sob a licença do MIT.
Graças a vários estudantes que ajudaram a anunciar o site nas comunidades universitárias.