NOJ——我是如何从零开始创造OJ的(一)

NOJ 是一个开源的、基于 Laravel 构建的现代化 Online Judge,开源于 GitHub,详见ZsgsDeisng/NOJ

最初设想中,我想把 NOJ 做成依结合 Virtual Judge 与 Online Judge 特点的一个平台,这将能够满足校队日常的训练。评测机部分需要很多的安全测试,难度系数较高,所以我们把前期的重心放在了 Virtual Judge 的开发上,项目直接参照了某上古项目Mohamed-Hossam/Virtual-Judge,我们准备重构这四个 OJ,初期上线 CodeForces、UVA、UVALive、SPOJ。将上古的面向过程代码翻译成现代化的依赖自动加载的面向对象编程还是非常难得的体验,不过上古代码的引入也给现在 NOJ 的整个判题机制造成了很大问题,这就是为什么现在 NOJ 要去做 Babel。

整个系统机制,简单来说,用户上传题目到 NOJ,NOJ 上传代码到目标 OJ,之后 NOJ 通过一个单独的计划任务每一段时间同步一次远程 OJ 的评测情况并反馈用户。这一过程涉及三大块,获取题目信息、提交代码和同步结果,NOJ 分别抽象化了三个类 Crawler、Submitter 和 Judger 来实现。其中最早所有代码都在这三个类中,之后为了维护的方便 Crawler 和 Submitter 先后分离出了各个 OJ 独立的派生类,唯独 Judger 没有实现派生,我们现在进行中的 Babel 就是希望一劳永逸,将所有 OJ 派生类解耦合,直接调用 Crawler 等三个抽象类的功能实现漏洞隔离和升级独立,这也让 NOJ 更容易引入新 OJ。不过目前 NOJ 还没有实现这个愿景,目前开发者们还是要辛苦的去在一个 Judger 里编写同步结果的代码。

开学前,NOJ 已经实现了多个功能,其中沉浸编辑器是一大创新,我曾设想这个编辑器可以实现代码编写的全面云端化,使用 NOJ 的用户可能都不用自己去本地开编译器,不过理想还是归理想,大多数时候调试还是本地为主。几个页面例如团队详情页面都使用了大胆的设计,这使得这些页面对于手机的支持非常不友好,直到 0.2.2 我们才开始提升移动端友好度,在此之前 NOJ 一直都是不支持手机操作系统的。

开学第一天,我找到了老板演示了最新的 NOJ 开发情况,后续老板直接说下一周投入使用,从而结束了 Virtual Judge 漫长的统治时期。事实上当时的 NOJ 我也不知道到底可不可以用,毕竟当时只有 CodeForces 一个平台(是的当时连 OJ 功能都还没有),后续我们在三周内根据校队训练要求接连上线了 Constest Hunter、POJ 等平台,现在想想效率真是可怕。那段期间我们还完成了第一次测试比赛,那是 NOJ 开发以来第一次进行比赛,这段期间系统中的公告答疑、打印(其实是空的)、题目列表、提交状态还有臭名昭著的榜单系统都逐一完成,当时的 NOJ 看上去已经可以举办大型比赛了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据