GuOJ Dev log.1

Intro
经过多年的拖延、重构、再拖延、再重构,GuOJ这个项目在长期停滞之后重新开始活跃。使用最新的技术栈,我们希望能尽快将这个被我们寄予厚望改变算法竞赛乃至计算机学习生态的平台变为现实,让这只长期咕咕咕的鸽子插上自己的翅膀展翅飞翔。
Briefing
GuOJ,正如其名,是一个在线评测系统(Online Judge)。在此之前,从最早的Uva Online Judge,到国内出现的 Universal Online Judge、LibreOJ,再到目前被普遍认可和使用的CodeForces,在非竞赛领域被广泛使用的LeetCode,在线评测系统经过了多年的迭代已经成为了任何对计算机科学抱有兴趣的人或是相关从业者不可忽视的学习工具,同时也成为了部分计算机爱好者社区的中心。然而,多年来在线评测系统与其相关社区的潜力却远远未被完全发掘。这个项目的目的便是研发并实际建设下一代在线计算机科学社区。而针对这一目的,我们希望提升这些方面的体验:
- UI/UX设计
- 评测系统可配置性
- 评测服务可伸缩性
- 社区交互性
- 开源模式可持续性
本次的Dev log,我们将讨论项目的开源模式与评测系统问题。
Open Source + Community
怀揣着成为下一代评测系统+社区的目标,为了使更多人能够加入进这个项目并促进这个项目的健康发展,我们决定以AGPL-v3协议发布这个项目的所有源代码,欢迎任何人加入这个项目的开发。这是一个并不容易的决定。开源项目意味着商业公司可以容易地挪用、借鉴甚至抄袭这个项目的核心特性,并且也面临着社区管理去中心化等等诸多问题。但我们认为通过我们项目的核心理念,开源终将成为我们的优势。项目本身将可以成为对于这一方面开发有兴趣的人的学习资源,开放的理念可以为我们吸引怀揣有同样理想的人们,本身去中心化与可伸缩性的服务也能为我们创造服务的不可替代性和将来竞争者需要考虑的成本因素。我们希望通过为任何人托管开放或私有的题库、托管他们的评测队列服务并协助他们管理他们自己的评测机阵列、为社区托管完全开放自由的题库与比赛来创造我们自己的独特性与不可替代性,并通过类似ppy/osu等社区项目的运营模式,通过服务本身以外周边的订阅、售卖为项目本身创造支持其进行下去的收入。我们相信这是一条能够避免商业化来保持学习计算机科学这件事本身及其乐趣的纯净的路,于是我们选择了这条路,正如我们的前辈们一样。但不同的是,我们立志以高质量的代码、精心设计的用户体验、前所未有的社区功能提供全新的体验。
Next-gen Judge System
在已有的草案中,我们决心为这个项目的评测系统部分打造一个全新的可配置的可伸缩的评测系统。我们计划基于Rust开发一个通用的评测终端,旨在能够作为任何下一代评测系统的基底。我们将制定一种类似CI/CD系统的评测配置文件标准,并提供可复用的配置模板确保配置友好性与向下兼容性(例如支持传统的逐行比较或是较新的testlib评测方式)。我们希望借此满足目前计算机科学领域大部分可以通过评测方式解决的代码实践检验能力。同时,我们将基于此开发一个本地评测管理工具,提供沙盒管理服务与评测任务处理机制,能够自动管理评测数据与评测任务,并生成评测沙盒环境完成评测任务。我们希望这个终端软件同样是渐进式的,它可以充当小型本地评测系统(类似Cena、Lemon的软件)的任务处理与安全管理工具,也可以成为我们评测客户端的任务执行工具。在此之后,我们希望实现一个微服务(类似fold@home的思想)能够从我们站点的评测队列拉取评测任务与评测任务相关的题目数据文件,并且让任何人都能部署自己的评测微服务终端,可加入我们站点的公共评测机池为全站评测提供服务或是加入自己的私有评测机池为自己在本站托管的私有题库提供评测服务。
What's Next
GuOJ还处于早期开发阶段,目前我们已经确定了第一个迭代的技术栈并将其发布在GitHub。目前我们使用PostgreSQL作为项目的数据库,使用Bun+ElysiaJS开发后端服务来确保功能的快速迭代,使用Nuxt3开发前端服务并确保SEO服务。同时,我们正在尝试新的技术来提高我们的用户体验与内容展现能力。我们正在基于unified与remark开发一套全新的开箱即用扩展markdown语法标准与渲染解决方案fremark,并正在探索在其中同时实现typst和LaTeX作为公式渲染器的实现方式。我们同时也参与了一个WYSIWYG(What you see is what you get, 所见即所得)markdown编辑器milkdown的开发工作,并计划未来将二者应用在我们的项目中。