软工案例分析之OJ

时间:2022-04-02 03:31:24
项目 内容
这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健)
这个作业的要求在哪里 案例分析作业要求
我在这个课程的目标是 和我的团队开发一个真正的软件,一起提升开发与合作的能力
这个作业在哪个具体方面帮助我实现目标 分析现有具体的软件,用软工的方法论进行表里两面的剖析

在线评测系统(英语:Online Judge,缩写OJ)是一种在算法竞赛中用来测试参赛程序的在线系统,也可以用于平时练习。近年来(2016年或更早)亦出现一些针对求职面试的在线评测系统。许多OJ网站会自发组织一些竞赛。此外,OJ网站通常会设立用户排名,以用户的提交答案通过数多少或某个题目执行时间快慢为排名依据。 (from wikipedia)

下文中,我将对曾经有所接触过的两个OJ平台: Luogu(洛谷)LeetCode(力扣)重新上手使用并进行各功能的评测,当然我也会将找出一些软件Bug作为使用过程中的目标之一,因此我先给出一个非专业的Bug分级标准如下

严重程度 备注
不明显的小缺陷,可能只是个显示问题,不影响用户后续操作
对用户有误导作用,或软件逻辑与用户预期的使用逻辑相悖
阻碍用户完成预期操作,但可以自动或通过软件其他操作恢复
用户无法完成预期的操作、获取想要的信息,并且短期内找不到解决方案
软件系统性的安全性问题、不可逆的崩溃问题

Luogu

"在洛谷,享受Coding的欢乐"

洛谷创办于2013年,其目标用户主要是参与NOI/NOIPOIers以及ACMers,洛谷的各功能围绕着两个核心功能进行开发, 一是基于大量题库的快速、便捷的在线评测功能,二是包括题解、讨论帖子、博客在内的相对完备的社区功能,这一点不仅增加了用户粘性,而且通过社区内的引导,编程新手也能获得比较好的体验。

笔者没有参与过算法竞赛,但洛谷确实是我使用最多的OJ,这是因为洛谷的题解功能实在是出色,相比于POJ/SPOJ等基本每一道题目都有相应的题解,而且审核机制保证了题解的高质量。大一程设时期我在遇到困难时经常学习题解,丰富的思路与技巧对新手很有帮助!

一、使用及体验

1.洛谷主站

首先来到洛谷的主页,先入眼的是一个偌大的几个青少年算法竞赛的countdown,其下方是一个记录做题量的图表,这个记录的粒度大概是最近一年的每个月和最近一个月的每一天,为用户统计自己的做题量是挺好的功能。主页下方是一些比赛与帖子的列表,洛谷整体的UI风格比较简洁,基本没有冗余信息,主页中左侧边栏功能划分清晰,新用户也能很快上手。

软工案例分析之OJ

接下来我们来看一下和题目直接相关的界面,首先是难度划分,可以看到难度也是针对竞赛而划分的,同时难度共7个等级,比力扣(只有简中难3种)更细,用户更能了解自己所处的“段位”,洛谷也有排名系统(下图右侧上方),这里的排名是按近期各种参与度(咕值)产生的动态排名。但是这个题目列表看起来比较混乱,每个链接只是标了题号,在这个界面并不知道是什么题,是何种类型的题,我更希望在这里看到按类型(如标签)分类的题目列表来了解自己哪方面需要加强,我不明白直接把所有题号罗列出来的意义何在。

软工案例分析之OJ

题库界面相当的专业!首先是题量方面,洛谷本体题库有6,387道题目,而算上使用Remote Judge(Vitural Judge)的四个附加题库,洛谷的总题量高达23,979;其次题目的类型(标签)基本涵盖了算法竞赛中具体的各种算法与问题,而且十分细致(比如dp还细分为了插头dp,区间dp等);同时对于源语言为外文的题目也进行了大量的翻译

软工案例分析之OJ

现在我先随手选一道题目(),可以看到题目界面也很清爽,左侧是标准的题面,右侧显示一些题目信息和此题目对应的讨论区题解区,讨论区类似贴吧的模式,可以向他人请教DEBUG,题解区类似知乎回答的模式,由于有审核机制,题解的技术力普遍较高

软工案例分析之OJ

记录界面可进行历史提交信息的检索,点开一条非AC记录可以看到各个测试点的情况,根据本人的使用经验,很多题目有10个以上的测试点信息,同时可以下载首个错误点的IO信息方便DEBUG,而不是对着一声WA不知所措,这也是洛谷对新手友好的方面之一

软工案例分析之OJ
软工案例分析之OJ

(点击图片以放大)

题解区大佬很多,而且题解对内容与排版进行了审核并支持markdown/latex,从而保证了用户的浏览体验,通过题解可以学到很多竞赛中的奇技淫巧调优自己的程序,也能学习到不少新奇的解题思路哦

软工案例分析之OJ

题单取代了“试炼场”,主要是加入了用户题单,题单好啊,可以找自己感兴趣的方向有针对性的刷题,这个功能现在的OJ大多都有实现;洛谷的论坛是帖子-回复模式,可以直接与管理员联系,给我的感觉比较亲切,简单地浏览一些帖子,可以发现洛谷OI亚文化与二次元氛围浓厚

软工案例分析之OJ
软工案例分析之OJ

同时我注意到洛谷有一个团队功能(右上角头像 \(\Rightarrow\) 我的团队),支持团队内自定义题目、团队内举办比赛、团队作业等功能,这部分功能不是所有OJ都有开放的,这个功能主要还是针对开展信息学竞赛训练的学校与机构的。下面是我对团队功能的试用:团队自定义题目的题面编辑(下图左上)与数据点编辑(下图右上),团队作业监督(下图左下)与团队内举办比赛(下图右下,支持OI/ACM等多种赛制)

软工案例分析之OJ
软工案例分析之OJ
软工案例分析之OJ
软工案例分析之OJ

(插播采访)

采访环节-1

  • 采访对象: Kumo君
  • 被访者介绍: 编程小能手,有扎实的编码能力,曾三天自通数据库全栈,自主研发过qq小助手,同时荣任过大一信息类《程序设计基础》与《数据结构》的助教
  • 采访动机/需求介绍:因为我在使用上文的团队功能时觉得这个和他当助教时在校内OJ后台出题的功能很像,于是邀请他从助教的角度试用团队功能,同时他也用过luogu刷题,我也想知道他对luogu的评价
  • 实际使用栏目:洛谷-我的团队

zixfy: Hey, Kumo, 我注意到洛谷的团队功能可能可以满足作为助教进行出题的需求,同时你也曾在校内的Accoding(oj4th)上出过题目,能采访一下你体验的异同吗?

(试用题面编辑中) Kumo: 洛谷的题面编辑结构清晰,有md快捷键,只要填写背景、样例等部分就行,相比之下oj4th只有一个朴素的富文本编辑器,整个题面靠手撸

(试用测试点设置中) Kumo: 洛谷可以批量打包上传测试点,而oj4th要一个一个点设置I/O,不太人性化,但没看到洛谷提供评测对比标准的设置或Special Judge功能

zixfy: 嗯嗯,总体看来洛谷在出题人方面做的比较细腻,你觉得洛谷的团队功能能胜任程设课程的作业与比赛吗?

Kumo: 相比于校内OJ的话,洛谷给我的体验可能比较流畅吧,校内OJ有一些bug,如测试点不能删除过多次、题解功能鸡肋的问题,洛谷大家都在用的话相关功能可以得到及时的维护。但校内OJ对于课程管理而言是必需的,它的灵活性是洛谷肯定替代不了的

zixfy: 瞭解了,你觉得团队模块里有什么吸引你的功能吗?

Kumo: 其实我觉得不一定非要有什么亮眼的功能,我觉得软件用起来顺手才是重点,团队功能还可以,洛谷整体也称得上是这样“好用”的网站

zixfy: 我看到你也有luogu账号,用来刷题感觉如何呢?

Kumo: 我是在大一时注册的,当时经常刷练习赛,选择洛谷的主要原因是题量大,而且难度覆盖广,可以循序渐进地做题,而且题解功能很棒!

zixfy: 同感!那你觉得洛谷的UI做得怎么样,我认为它显然十分简明,但其界面在当代有些朴素。

Kumo: 确实,自己有写一些前端后,感觉洛谷的UI也比较好自己复现出来,其实没有特别高端的感觉

zixfy: ありがとう

软工案例分析之OJ

btw洛谷还有个相当厉害的功能Remote Judge(Vitural Judge),其核心思想是从远程题库爬取题目题面信息放到本站上 ,当用户在相应题目进行代码提交时,洛谷后台运行脚本通过公用号或用户提供的账号在远程题库提交并抓取结果

软工案例分析之OJ

稍微试用了一下UVa,速度其实还蛮快的嘛,Vitural Judge这方面做的最好最全的应该是vjudge吧,当然洛谷的也很好用,支持绑定个人用户,拓展的题量也不少

2.Bugs

bug A
  • 测试环境:

    OS: Win10 18363.1440(家庭版);Browser: Google Chrome x64(v89.0.4389.114),全文都是此环境,下文不再赘述

  • bug复现: (必然发生)

    洛谷主页 \(\Rightarrow\) 右上角头像 \(\Rightarrow\) "个人设置" \(\Rightarrow\)"选择图片" \(\Rightarrow\) 选择一张比列不为1 : 1的图片上传

  • 具体描述:

    洛谷头像的比例是1 : 1,但上传一张比列不为1 : 1的图片图片后没有出现预期中的裁剪选项,导致我上传的二次元头像被挤压型变以适应比例

    软工案例分析之OJ

  • bug分析:

    • 严重性:, 完全不影响使用,毕竟只是个头像(,但可能用户确实想正常上传头像就需要自行裁剪,有些麻烦
    • 成因: 没做这个功能,小细节对于整个OJ而言不重要
bug B
  • bug复现:(偶尔发生, 20次尝试中复现了5、6次)

    1. 通过主页右上头像 \(\Rightarrow\) “我的题库” \(\Rightarrow\) 选择一道创建的题目或主页右上头像 \(\Rightarrow\) “我的团队” \(\Rightarrow\) "题目" \(\Rightarrow\) 选择一道创建的题目
    2. "编辑题目" \(\Rightarrow\) “数据点配置” \(\Rightarrow\) “上传数据” \(\Rightarrow\) 选择非.zip格式的文件上传
  • 具体描述:

    洛谷测试点文件只能为ZIP压缩包,上传错误格式后上传按钮被禁用,并显示"等待系统校验"字样,这个系统校验不是指因为格式不对而要校验,因为我观察到上传ZIP后也有此字样,随后成功上传,所以此时上传卡在了校验阶段,但按钮被禁用无法重传

    软工案例分析之OJ

  • bug分析:

    • 严重性:,遇到这个Bug只能刷新页面重置按钮
    • 可能成因: 可能是前端或者前后交互上的锅,没有及时更新UI,同时可能是软件测试不足,没有充分测试这种异常情况下的输入
    • 改进建议: 当后端解析到错误格式时不进行测试点文件的覆盖,回传给前端错误信息,前端及时更新UI,将按钮设置为重新上传,醒目地给用户警告
bug C
  • bug复现:(必然发生)

    洛谷主页 \(\Rightarrow\) 切换到"记录"模块 \(\Rightarrow\) 切换记录状态为Unaccepted \(\Rightarrow\) 点击蓝色的"清除所有筛选条件"

  • 具体描述:

    切到"记录"模块时我能看到自己所有的提交记录,下图中的"用户名或ID"默认是我自己的,在复现第三步后可以看到所有失败的提交,我在第四步时期望的是筛选选项重置,我又可以看到所有提交。但此时报错了,可以观察到清除条件时用户ID的文本框也被清除了,导致无法重新检索。事实上,无论筛选选项是什么状态,只要点击“清除”都会引发这个问题。

    软工案例分析之OJ

  • bug分析

    • 严重性:,这是一个永远触发异常的按钮,无法通过其他操作修正
    • 可能成因:前端逻辑有问题,没注意清除ID后已无法正常检索,却还是自动重新进行了一次检索
    • 改进建议:1.清除时前端不重置ID对应的文本框 2.或者后端增加特殊判断,当传入的用户名/ID为空时重定向为请求用户的ID

3.总评

总体而言,洛谷既具备一个竞赛OJ的硬核性,也有良好的社区功能完善用户体验,因此我认为是e) 非常推荐

采用邹欣老师给出的表格,我具体的量化评价如下:

类别 描述 评价 评分([-3, 10])
核心功能 分析三个核心功能,功能设计和质量 题库充实,评测快,社区硬核 10
细节 有什么为用户考虑的细节? 有一些没有为用户考虑的细节,见Bugs 7
用户体验 当用户完成功能时,不干扰用户 。 基本没有弹窗,信息简明 10
辅助功能 一些辅助功能如皮肤等 博客、图床以及在线IDE、洛谷日报、网课和信息学竞赛真题 9
差异化功能 这个软件独特的功能. 它对用户的吸引力? Remote Judge,完整的团队功能 9
软件的效能 占用内存, 启动速度, 内存泄漏情况 拥有专利“一种高并发的在线程序评测系统(申请中)”,可以应对每5分钟1200个评测量(据官方 10
软件的适应性 在联网/断网, 大小屏幕, 没有鼠标的情况下都可以顺畅操作,跨平台 一般 7
成长性 记住用户的选择, 适应用户的特点,越用越方便 有题目推荐系统,但有时会推荐已做过的题目 9
用户有控制权 系统状态有反馈,等待时间合适。关键操作有确认提示,有明确的错误信息。 用户数据非实时,按一定的周期更新一次 8
总计 87.78%

二、评估分析

1.使用此服务的所有功能,估计这个软件/网站/服务做到这个程度大约需要多少时间(团队人数6人左右,计算机大学毕业生,并有专业UI支持)

需要实现的功能:评测机、题面界面及题库数据库、用户系统与博客、比赛、讨论区等很多功能,预估耗时为3.5个月,半个月搭建各种语言的评测机,设计题库的数据库,同时前端写好题面的界面;半个月完善题库数据库,加入题目检索、题目标签的功能;一个半月全力进行用户系统、提交记录的开发,同时在系统整合时展开大规模测试;半个月前端进行讨论、题解界面的开发,后端开发比赛等功能;最后半个月模块整合,并针对评测机进行性能优化。

当然如果使用开源的OJ系统或许会更轻松?

2.分析这个软件目前的优劣(和类似软件相比),这个产品的质量在同类产品中估计名列第几?

优势:基于大量(Remote Judge)题库的快速、便捷的在线评测功能,以及包括题解、讨论帖子、博客在内的相对完备的社区功能 劣势:网站做的比较粗,有许多细节没有完善;与其他面向竞赛的OJ相比,洛谷应该有前三吧,洛谷持续增加的题库与例赛以及社区为这个网站维系着生命力,其他一些老牌的OJ有些因为缺乏管理倒闭或者很少有人记得了

3.从各方面的问题,推理出这个软件团队在软件工程方面可以提高的一个重要方面
  1. 界面好好捯饬一下,可以做得更美观,洛谷的前端虽说是vue写的,但感觉静态的页面还是比较多吧
  2. 作为PM考虑扩大目标用户,网站给我的感觉还是主要为OIer服务,可以考虑把网站规模进一步做大,吸纳ICPC/PAT/lanqiao等参赛者

三、建议与规划

1.市场概况

市场面向参与各类信息学竞赛的青少年,据洛谷官方,在2019年已有30万注册用户,累计3000万次评测。当然对算法或ACM感兴趣的人群和想要入门OI的人群也可看作洛谷庞大的潜在用户

2.市场现状

目前市场上的竞赛OJ: Vjudge, CodeForces , 牛客, ZOJ, POJ, HDOJ, LibreOJ与各大高校校内的OJ,上述产品定位均为IO/ACM题库,这些OJ也很好用,但社交性相对较弱,不像洛谷这般吸引新用户,因此远没有洛谷这样火,图源:百度指数

软工案例分析之OJ

OJ中由高校开设的非盈利OJ居多,而牛客竞赛的定位最接近洛谷,后者面向CSP-J/CSP-S/NOI/ACM竞赛的参与者提供题库与培训,可以看作洛谷的商业化竞品。

3.产品生态

这个产品的核心用户群是正在参与信息学竞赛的高中生,包括其在内可能有以下几种典型用户:

条目 用户A 用户B 用户C
名字 宁友千 张甫剑 赵子飞
基本信息 高中在读,17岁 35岁,校内负责组织OI训练的老师 24岁,是学生
使用背景 为了备战信息学竞赛而进行编程刷题 为了给同学们找编程题目作为作业/考核 对算法感兴趣,同时想提升编程能力
偏好 可以有各种类型的题目做 题目难度适中,能体现知识点 遇到困难可以学习题解
基本需求 使用题库系统进行做题训练 通过筛选功能快速找题 在学习某一算法知识后在洛谷上找一些相关题目
潜在需求 参与洛谷比赛锻炼实力,购买洛谷相关网课 购买洛谷的高级团队功能,自主命题并对学生进行监督 因为要参与蓝桥杯等大学生程设竞赛,开始寻找相关题单针对性训练

其中用户B在使用洛谷后如果觉得还不错,很可能驱动其教学班中的用户A也加入洛谷,反之亦然。某用户C在使用洛谷后也有可能将其安利给友人,因为洛谷社区系统还蛮不错的,大家可以互关,一齐刷一个题单进行讨论

洛谷除了主站之外还有洛谷网校和洛谷有题这两个子站点,前者提供了洛谷主站一些比赛的讲解(这是一个新的产品生态点)与集训营课程以供购买,后者是一些NOIP/NOI的非编程题题库,整体上三个站点内容比较相互独立

4.产品规划

我想开发两个简单的新功能,一个是完善洛谷的"在线IDE",从洛谷的官方引导贴可见在线IDE也是官方推荐的编码方式之一

软工案例分析之OJ

但这个IDE用起来比较吃力,没有任何形式的补全,部分语言如Python连高亮也没有(牛客竞赛这方面就做的比较成熟),另一个要做的功能是类似OI Wiki的算法知识库。这两个功能是为了进一步降低洛谷使用的门槛,让洛谷成为更好用的工具,让更多没有硬件条件或是缺乏指导的想参与OI的人群也能加入洛谷,同时算法知识库可以只提供基础算法,用户体验感觉良好则可以付费解锁高级内容或引流到洛谷网校

人员分配方面,我将6人按Backend/Frontend/Test分为2-2-2

时间 规划
week 1-2 修复现有bug,在洛谷社区就新功能发表意见征集帖
week 3 wiki,IDE界面设计,生成新功能整体的设计文档
week 4 在线IDE完善各种语言的高亮,后端开始实现c/c++的关键字/库函数的联想
week 5 在线IDE添加c/c++关键字补全,后端模仿实现JB系IDE的特殊符号({}()""'')补全机制
week 6 对部分关键字如for/foreach添加自动生成模板的功能,前端整合现阶段所有功能,展开集成测试
week 7 发布0.1(\(\alpha\))阶段的IDE,展开站内用户测试,收集反馈意见,决定是否开发其他语言的补全(洛谷主要是c/c++)
week 8 为IDE加入代码风格与主题设置
week 9 为IDE加入"当前题目"的功能,后端协同数据库使得能在IDE界面拉取题目信息,像力扣一样单页面内就可以方便查看题面。网站在用户修改代码后及时保存到数据库,方便用户下次继续编写,集成测试
week 10 发布IDE体验版(\(\beta\)),收集反馈,并发布wiki意见征集帖,优先做呼声最高的内容
week 11 完成wiki的文章界面,后端开始wiki数据库搭建,测试继续测试发布中的IDE
week 12 前端完成搜索、文章列表、面包屑导航的UI,后端完成文章的增删查改逻辑
week 13 前后端整合,集成测试,周末开启\(\alpha\)阶段的用户测试
week 14 收集反馈,在原题目界面的题目标签增加一个"查看相关知识点"的链接,wiki加入知识图谱,人员调整为2-1-3,对现有所有新功能再次测试
week 15 wiki文章加入相关例题列表,加入主站的评论功能,考虑开启用户编辑以尽快完善wiki内容
week 16 正式上线新功能,进行站内站外的推广

LeetCode

"见证每 1 bit 成长"

力扣2011年起源于美利坚,2018.2推出中国版,力扣"是一个专注于程序员技术成长和企业技术人才服务的品牌, 致力于解决程序员技术评估、培训、职业匹配的痛点,逐步引领互联网技术求职和招聘迈向专业化"。可以看出力扣志在提高用户的程序员职业技能水平,基于此开发了几大核心功能:OJLeetBook(教程)、社区和模拟面试

用过LeetCode后才发现它和竞赛OJ有很大不同,首先力扣不使用算法竞赛题,而是1000+的原创题目与大厂面试题(据官方),其次力扣并不像洛谷一样紧紧围绕题目评测展开功能,而是注重从多方面提高用户水平

一、使用及体验

1. LeetCode-cn

我先进入中国力扣的首页看一下,好家伙,首页条目这么多就离谱,我该先看哪个..可以看到主页是大量推荐的讨论以及名企面试题,右方侧栏也是大量推荐的题解与帖子..但力扣的新版UI很不错哦,不同模块间保持了一致的扁平简色风格,过渡效果也做得很平滑

软工案例分析之OJ

这里是力扣的个人界面,可以清晰看到个人的做题进度和动态,其中还有一个git风格的每日提交统计。这个每月勋章嘛,实际上是需要每天完成"每日一题"当月全勤才能拿到的,可以看作力扣为用户提供的自我驱动的一个指标吧

软工案例分析之OJ

力扣的的题库是从美国版翻译来的,总题量为2,035,客观上题目难度肯定没有竞赛题高,大部分题目面向面试,对竞赛中的高级算法涉及较少

软工案例分析之OJ

点开一道,可以看到力扣题目界面相当独特,页面分为两栏,左侧是题面,右侧则是一个在线的代码编辑器,当然可以*调整二者的比例或仅显示一栏。代码编辑器支持样式设置与线上代码保存,而且可以使用"执行代码"快速地测试程序,对于想要长期想在网页中编程的用户还是相当贴心的。同时可以注意到力扣代码提交的格式不同,在洛谷等算法OJ中用户要自己处理程序的I/O,而在力扣大多数用户以填写函数(方法)的方式完成核心算法,而输入输出的处理与数据结构的定义由评测脚本负责,这是力扣的便捷性所在,用户只要关注题目相关算法。力扣为2k+题目,每道题10+的语言都定义好了接口,这样也比较接近面试题的情景。

软工案例分析之OJ

力扣的题目界面就是一个很完备的单页面应用,刷题时通过"题目列表"可以快速切题,而且题解/评论都是内嵌在网页中的,相比于洛谷,网页整体是响应式的,不需要来回切换不同的页面。每道题评论/题解都很多,大部分有官方题解,题解支持latex和力扣扩展的md语法,但题解没有审核,所以质量良莠不齐,(而且我这里是在用c写代码欸,为什么不自动帮我过滤出所有c编写的题解呢?我看其他语言的作用大吗)。我认为力扣注重的是用户通过做题学会相关算法应对面试,因此为了照顾广大用户群体不过分追求题解的硬核性,而是培养一个*交流的庞大学习社区,这一点无可厚非。提交记录方面,对于非AC提交,可以直接在线看到一条相应的测试用例,因为力扣的测试用例格式并不复杂。

软工案例分析之OJ

力扣还有两个核心模块:学习(下左)与讨论(下右),其中学习模块是一系列介绍算法的电子书,其中内嵌了一些代码题目,粗略试读了一部分后感觉此模块面向的是零基础入门的编程或语言新手,文章质量不见得比知乎上的好。讨论区大多是面经内推和组赛信息,这里我没有深入使用

软工案例分析之OJ
软工案例分析之OJ

2. Bugs

bug D
  • bug复现: (必然发生)

    力扣-我的题解 \(\Rightarrow\) 选择一篇写好的题解,点击"编辑"字样 \(\Rightarrow\) 题解详情页面点击"编辑" \(\Rightarrow\) 点击“删除”按钮 \(\Rightarrow\) 回到题解列表

  • 具体描述:

    题解仍在题解列表中,但再次点击"编辑"字样无法找到题解,会回到题目主界面。而且这里还有个交互逻辑的问题,1.我在题解列表不能进行删除 2.我在题解列表点击"编辑",在跳转的页面中没有进入编辑,需要再在题解详情页面点击"编辑"

    软工案例分析之OJ

  • bug分析:

    • 严重性:, 虽然说不影响使用,但无法找回题解的情况下列表里再留着题解记录也没有意义吧
    • 可能成因: 可能就是没有删除用户历史题解列表里的记录,或者本意就是保存所有题解记录
    • 改进建议: 已删除题解标注出来,同时不能跳转到详情
bug E
  • bug复现: (必然发生)

    点开上文的这道 \(\Rightarrow\) 点击"题解"选项卡点 \(\Rightarrow\) 击右上角个人头像 \(\Rightarrow\) "切换到旧版本"

  • 具体描述:

    题解都消失了

    软工案例分析之OJ

  • bug分析:

    • 严重性:, 原本确实是有题解的,切换到新版本界面可恢复
    • 可能成因: 我注意到在旧版本点击讨论/题解会直接重定向到新版本的界面中,同时复现过程中如果切换的是"讨论"选项卡,则会跳转到旧界面的题目描述界面,因此虽然无法使用旧版本的讨论/题解,但我认为力扣已经移除了旧界面中的这两个模块。可能原因是相应的界面重构了,旧界面无法再加载新的题解。
    • 改进建议: 在这种情况下,禁止切换到旧界面或者切换到旧界面的题目描述区域
bug F(真·bug)
  • bug复现: (必然发生)

    1. 提交一次Prob#135分发糖果

    2. 随便点开一道 \(\Rightarrow\) 点击"题目列表" \(\Rightarrow\) 切换至" LeetCode 热题 HOT 100" \(\Rightarrow\) 关闭当前页面

    3. 右上角头像 \(\Rightarrow\) "做题分析" \(\Rightarrow\) 跳转到Prob#135分发糖果的提交详情 \(\Rightarrow\) 点击最下侧的“返回题目”

    软工案例分析之OJ

  • 具体描述:

    (人类早期驯服野生小bug的珍贵录像)

    可以看到题单编号成了错误图标,且不能切换题目了,打开题目列表,题目列表也没了

    软工案例分析之OJ

    软工案例分析之OJ

  • bug分析:

    • 严重性:, 用户暂时使用不了题单,但切换题单或者刷新当前页面可恢复
    • 可能成因: 这是因为分发糖果这道题并不是我们当前题单内的题,但力扣仍然试图在提单内寻找这道题目导致异常情况,具体原因可能是提交记录回到题目的入口比较隐蔽,没有充分测试
    • 改进建议: 明确跳转题目不在当前题单时的行为逻辑,可以将跳转的题目加入到当前题单中,或将当前题单切换成包含所有题目的总题单,而不是不作异常处理破坏用户体验

同时力扣的讨论区有"意见反馈"专区,我按照官方建议的格式给出了bug F的反馈,但仍未得到及时回复:

软工案例分析之OJ

3. LeetCode On VSC

同时我注意到LeetCode还有IDEA以及Visual Studio Code的相关插件,下面我是我对vsc版力扣插件的试用流程:

插件的安装比较简单,首先配置好10.0版本以上的Node.js(npm),并把Node加入PATH变量,因为这个插件的核心代码是JavaScript写的,通过js抓取远端网站的题解、题目进行本地刷题。同时通过npm install -g skygragon/leetcode-cli安装力扣命令行,随后在vsc的插件市场安装LeetCode 0.17.0,可以发现vsc的侧边栏多了一个力扣的选项卡,第一次切换进去后需要首先进行登录,此插件大部分交互使用vsc的全局命令行(Ctrl + shift + P)进行

登录后可以查看题目列表,点击题名便抓取到了题面,题面以Markdown Preview的形式展示(可能要安装md相关插件),设置好力扣工作区后就可以开始刷题了!

可以看到自动生成的源码文件自动增加了提交与测试的按钮,同时右键也有快捷键,但这个Show Top Voted Solution获取的是美版的题解..题面中的Discussion|Solution实际也只是超链接,需要在浏览器中打开,还要吐槽的是偶尔发生的连接失败问题,就不展开了

软工案例分析之OJ

总体来说,插件版力扣体验还是比网页版好的,不用管那么多满天飞的其他信息,可以专注于题目本身。更重要的是可以使用自己熟悉的IDE并且使用代码补全功能了!网页版里代码版权好像是付费功能,好耶

试用题目测试,反馈结果也是md,很简洁

软工案例分析之OJ

提交同理

软工案例分析之OJ

采访环节-2

  • 采访对象: C9H13O3N

  • 被访者介绍: 化竞人,CSGO高手,工程小专家,曾经接触使用过各种语言、框架,玩过opencv/gl,在服务器上搭过mybatis,也做过微信小程序和APP

  • 采访动机/需求介绍:因为我知道他一直在坚持在力扣上刷题呀,起码每日一题一直有在keep,也算力扣资深用户了

  • 实际使用栏目:力扣-每日一题,vsc版力扣

zixfy: Hola, C9H13O3N,请问你使用力扣时最常用的功能是什么呢?

C9H13O3N: 其他的没怎么用过,主要就是题库,具体而言就是每日一题吧

zixfy: 你是为了什么开始刷题呢?

C9H13O3N: 主要还是提升自己的算法能力,力扣有不少基础算法题,可以起到比较好的复习作用

zixfy: 那你为何会选择力扣呢,有使用过其他OJ吗?

C9H13O3N: 其他OJ的话主要就是校内OJ吧,选择力扣还是主要因为他的名气大吧,我的老师也有安利我多在上面刷些题目

zixfy: 我注意到力扣的一大特点是对在线编码的支持,你是在网页编码还是在本地编码的呢?

C9H13O3N: 简单题的话就直接在浏览器里写了,复杂一点的就用自己的IDE写,因为没有开会员时是无法使用力扣的代码补全与DEBUGGER的,写起来比较折磨

zixfy: 那这样你觉得一年氪三百大洋买力扣会员值得吗,会员还有名企题库诶

C9H13O3N: 力扣会员还是比较鸡肋吧,现在我现在也不是不能写,而且题库也充足啊,等到以后需要专门刷企业面试题再考虑吧

zixfy: 我注意到有一个vsc版的力扣插件,使用这个插件可以本地刷题,还能有vsc的代码补全,要不要康康?

C9H13O3N: 彳亍(试用中)

C9H13O3N: 原来可以直接爬取题目啊,不错。哦哦,本地文件也有补全了,不过你这个vsc的代码补全完全比不上JB系的IDE啊(...)。哦,文件内可以直接提交与测试,还有题单和搜索功能,确实比网页版体验好一些

zixfy: ..对,它可以让你在刷题时开启专注模式

zixfy: 那么你会给力扣整体打多少分呢(10分制)

C9H13O3N: 8分吧?扣分点是是总是有些内购推广,而且有些题和功能只能付费后解锁

软工案例分析之OJ

4.总评

总体而言,力扣体量大,发展潜力大,但仍然需要进一步扩充题库(数据库/shell方面题较少),同时把"学习"模块做好做大,因此我认为是d+/e-) 好,非常不错

采用邹欣老师给出的表格,我具体的量化评价如下:

类别 描述 评价 评分([-3, 10])
核心功能 分析三个核心功能,功能设计和质量 OJ/学习/讨论,后两者缺乏突出特点 8
细节 有什么为用户考虑的细节? 题单、笔记本、做题分析,方便用户制定学习计划 9
用户体验 当用户完成功能时,不干扰用户 。 信息泛滥,顶部工具栏晃眼,刷题时常见内购广告和比赛推广 7
辅助功能 一些辅助功能如皮肤等 模拟面试、代码补全、企业题库,但需要付费获得体验 8
差异化功能 这个软件独特的功能. 它对用户的吸引力? 原创面试题库,在线编写代码的解决方案 10
软件的效能 占用内存, 启动速度, 内存泄漏情况 代码提交/测试耗时为秒级,且拒绝频繁提交 8
软件的适应性 在联网/断网, 大小屏幕, 没有鼠标的情况下都可以顺畅操作,跨平台 支持相关IDE本地插件,有相关APP 9
成长性 记住用户的选择, 适应用户的特点,越用越方便 在线代码编辑器支持长期使用 7
用户有控制权 系统状态有反馈,等待时间合适。关键操作有确认提示,有明确的错误信息。 系统整体完备,但不一定有明确的错误信息 9
总计 82.22%

二、评估分析

1.使用此服务的所有功能,估计这个软件/网站/服务做到这个程度大约需要多少时间(团队人数6人左右,计算机大学毕业生,并有专业UI支持)

力扣功能还蛮多,不考虑力扣APP与相关插件的话,对于力扣主站的开发我认为需要6个月以上(非996)。一个半月完成评测机、题库系统与在线代码编辑器,一个半月完成用户系统,包括收藏夹、笔记本、进度管理、提交记录、做题分析、题解等等等(那就两个月吧),剩下三个月逐个完成比赛、讨论、学习模块并进行集成测试,这样大概还是只能完成力扣的基本功能

2.分析这个软件目前的优劣(和类似软件相比),这个产品的质量在同类产品中估计名列第几?

优势:每道题10+的语言都定义好了接口,方便用户专注于核心算法,用户基数大,已经形成了比较大型的学习交流社区,提供相关的入门教程,界面流畅好看; 劣势:就面向面试而言,缺乏非编程题目,非完全免费可能会劝退部分用户。但是事实上力扣已经可以称之为国内最大的IT技术职业化提升与学习平台,在线面试、企业题库我也感觉比较惊艳,因此这个产品的质量在同类产品中估计名列第一

3.从各方面的问题,推理出这个软件团队在软件工程方面可以提高的一个重要方面

我认为力扣最大的问题是没有体现出成长性,我在使用过程中没有注意到力扣有题目推荐的功能,以及缺乏对专业技能的评估系统,历史题目只就用来查看下进度,如果力扣结合用户所有做过的题,分析出用户易错点或短板,也许可以能给用户比较有意义的引导,也更契合力扣"助力程序员终身成长"的价值观。其次可以充实一下可怜的shell/database题库,提高核心功能的质量

三、建议与规划

1.市场概况

市场面向所有想要提高专业水平的待业或在职的程序员,力扣的用户主要来自北上广等程序员扎堆的地域(百度指数),力扣具体注册用户难以考证,官方表明已经累积了约1亿次代码提交,故可估计力扣的用户规模达到了百万级别,远超于洛谷。力扣的潜在用户是跨专业,或想要快速入门企业面试题或一门编程语言的人群

2.市场现状

目前市场上面向Offer的广义OJ还有: nowcoder(牛客网), LintCode, hihocoder, hackerrank, codewars等。其中LintCode整体网站功能设计与力扣雷同;hihocoder是一个专注于高水平的程序设计比赛与题目的网站,hackerrank定位比较清晰,网站题库基于业界实用的各种前后端的语言,并为用户提供专业的评估与高频的比赛;codewars支持数十种语言,同样更加接近实际开发所用的技术栈,牛客网产品定位和力扣相近,但牛客网的功能更多更杂(适用于大学生学习、备考、求职,涉及领域也不止IT),社区也相对花哨一点

而且就热度而言,国内这样的OJ比较有名的也只有力扣和牛客网

软工案例分析之OJ

牛客网提供笔试题、面试编程题、高校期末考试题,甚至还可以在里面做一套961?就刷算法题而言,牛客网的体验没有力扣好,做的比较粗糙。牛客同时还有简历投递、技术栈学习等一堆杂乱的功能,可以看出牛客和力扣存在一定的竞争关系,但牛客面向信息类技能(包括通用技能)的方方面面,而力扣的用户还是以刷题为直接目的的为主,二者也可以共生,比如某程序员在成长阶段可能用力扣更多,但在四处投简历时会到牛客网寻求更详细的求职信息

软工案例分析之OJ

3.产品生态

力扣的核心用户群是正在准备互联网企业校招以及社招的各阶段人群,包括其在内可能有以下几种典型用户:

条目 用户A 用户B 用户C
名字 刘啾九 王马龙 许可多
基本信息 25岁,在比特跳动公司上班 23岁,应届生,准备校招中 24岁,学数学的,想转行做数据分析师
使用背景 做了好久的测试,想跳槽成后端数据库开发 投递的比特跳动公司对算法要求高 想在短时间内掌握python/c++
偏好 学习工作可用的编程技巧 喜欢更贴近真实面试的场景 有及时的帮助与反馈
基本需求 针对mysql等数据库题目练习 按知识点展开刷题计划 通过学习模块快速夯实基础知识
潜在需求 深入参与社区,发掘最适合自己的企业 开通力扣会员享受比特跳动的企业题库 不会配IDE,开通会员享受力扣的在线IDE

力扣致力全程服务程序员的成长,那么最好情况下就是用户在角色C \(\Rightarrow\) B \(\Rightarrow\) A \(\Leftrightarrow\) A的转变过程中都能作为力扣的忠实用户,当然这需要力扣进一步自然地将刷题/学习/求职三个功能衔接起来。C类用户可能对算法、编程完全不熟悉,TA可能往往是被有经验的A/B类用户安利过来的

力扣有对应的APP,基本上除了代码提交其他功能都搬过去了,但其实没必要,移动端的力扣可以专注于学习与社区这两个内容,着力优化移动端用户的浏览体验,并且在用户有做题需求时引导其使用网页版力扣

软工案例分析之OJ

4.产品规划

其实力扣定位相当清晰了,刷题找工作方面很完善,再添加新功能反而有些冗余。不过我注意到力扣介绍称"为用户提供了多种多样的开发工具,适用于真实的日常技术开发和学习场景,其中,Playground (*另一个比较完整的在线IDE)无需设置环境...",但实际上力扣对业界技术栈与所用框架涉及甚少,Playground 仅有一个React前端开发框架(只有这个比较接近开发环境)的环境,可以进一步开发。

软工案例分析之OJ

以添加数据库框架MyBatis(当然也可以是其他前后端库或者机器学习框架)为例:

N(Need,需求):部分求职者想做后端工程师,而投递的公司使用MyBatis,TA想熟悉相关基础,做个小DEMO啥的方便工作中使用

A(Approach,做法):在学习模块加入相关技术栈教程,Playground 新开发MyBatis的在线编程环境,同时题库可以新增一类综合编程题,让用户在Playground 上使用框架完成一个小项目,当然对于前端这种不好进行量化评测的我还没想好怎么做

B(Benefit,好处):同时提高用户的算法能力和工程能力,从容面对面试

C(Competitors,竞争):上文提到的竞品缺乏这种功能,可以考虑重点发展成为差异化功能

D(Delivery,推广):在站内与相应具体技术的社区进行推广

人力方面, 按Backend/Frontend/Test分为2-2-2

(胡言警告)

日期 描述
week 1 在讨论区就新功能发表意见征集帖,PM作需求调整
week 2-4 开始学习模块的文章编辑,生成新Playground 与综合编程题的设计文档
week 5-8 后端搭建MyBatis/Java/JDBC的开发环境,同时前端复用已有的Playground UI,开始编写新Playground 的多文件IDE界面
week 9 前后端对接,进行大量集成测试
week 10 发布\(\alpha\)阶段的Playground DEMO,视反馈意见作出调整
week 11-12 增加新的题库区,前端进行综合编程题样题界面的开发,用户会在综合编程题收到一份详尽的指导书(), 后端在开发环境中建立题目所需的数据库,部署评测脚本,验证用户用MyBatis写的数据库应用程序是否能正确操作数据库
week 13-14 考虑到用户是多文件开发,同时为了更加贴近开发环境,在力扣部署一个git服务器,给用户使用git提交的选项,使用CI功能进行评测
week 15 整合新功能,开展一轮回归测试与集成测试
week 16 完成\(\beta\)版本的发布,开启用户内测,增加更多的综合编程题