# 为什么我选择不再打任何比赛——一名不走寻常路的“坏学生”的战斗檄文

2020年6月初,我终于下定决心再也不参加任何比赛了。在此还是想对我的队友说一声“对不起”,我真的不是一名合格的队友。

那为什么一向热衷于打比赛的我会做出这样的决定呢?大概还是因为我对“为创新而创新”的行为十分反感吧。

# 大多数比赛所倡导的“为创新而创新”令我反感。

我个人非常反感“为创新而创新”的行为,但是绝大多数的比赛恰恰倡导的就是“为创新而创新”——你必须做出一个“从没出现过”的东西才能获得好成绩,而改善现有的东西就会被认为是“low”。

举个例子:假如你开发出了一个可以承受四万学生同时流畅选课、界面清爽漂亮、功能丰富到秒杀所有学生开发的第三方客户端、对移动端有着良好适配的教务管理系统并且拿它来参加诸如C4、发现杯之类的比赛,你拿大腿想想都知道你一定不会有好成绩。原因为何?因为评委会觉得你这东西不是个全新的东西,没有让人“眼前一亮”的感觉,是个已经被人做烂了的“传统的项目”,所以当然也就不会给你一个好成绩。

但是,如果你们学校的教务管理系统是这样一个系统,你会不会觉得用起来很舒服、解决了生活中一个巨大的痛点呢?据我所知,绝大多数高校的教务管理系统,包括我们学校使用的教务管理系统在多人同时选课时都会卡顿、崩溃,导致学生选课时的体验很差。另外,对移动端有着良好适配的教务管理系统就更少了,这就导致学生不得不拿出更多时间来开发第三方客户端来解决教务管理系统移动端适配不佳的问题,而学校往往是不愿看到这类第三方客户端存在的。

其实不会卡的教务管理系统我确实实现过——用电商系统中的秒杀技术实现了2500请求/秒的吞吐量、0错误率、最长返回时间5秒这样一个对选课来说完全够用的性能,并拿它参加了学校里举办的Java程序设计大赛。虽然最后有幸拿到了第一名,但是一位同学的建议却引发了我的思考:

“这个系统不适合拿来参加比赛”

确实,这个系统拿来参加其他有更多强劲对手的比赛会死得很惨,就像我上面提到的那样。但是我设计这个系统的目的是为了改善教务系统的使用体验、学习高并发与秒杀相关的解决方案,而不是“为创新而创新”。你能说这系统是完全没有存在价值的吗?很显然不能。它是不适合拿来参加“为创新而创新”的比赛,但是适合上线使用啊。

创新是一个经久不衰的话题,我并不否认创新的作用——相反,我们作为开发者更应该有创新精神。但是很少有人想过:过度追求创新而不重视对现有系统的改造是不是正确的选择呢?

这样说起来可能有些抽象,但是我们不妨这样想想:Windows系统虽然在软件的丰富程度、开放性、文件管理器、窗口管理这些方面优于macOS,但却在界面、交互、终端、性能、动画、安全、对高分屏的适配等方面要差很多(还有那烦人的强制更新)。如果你是微软的高管,决定权在你手上,你是会选择改善现有的Windows系统使其在交互、界面、终端等方面有更好的表现,还是放弃现有的Windows系统,转而开发一个全新的“Windows”系统来规避这些问题呢?

相信绝大多数的人都会选择前者,微软的高管当然选择的也是前者,要不然就不会出现Windows Terminal、WSL、浅色模式、Windows Defender、UWP之类的东西了。但是现在那些比赛要我们做的显然是“开发一个新的Windows系统”,并且还对“改善现有的Windows系统”这样的想法和作品嗤之以鼻。虽然用大腿想想都知道这“为创新而创新”的观念一点也不合理,但是“我大清自有国情在此”,他们就是只喜欢从没出现过的东西,你又能怎么办呢?

# 我不想写出永远无法运行的Dead Code。

“Dead Code”一词最早出现在Eclipse的提示中,意为“没有用的、永远运行不到的代码”。

我们仔细想一想,参加比赛所写的代码不就是“Dead Code”吗?你拿它去参加比赛了,再把它开源出来的可能性就不大了,也就意味着这段代码可能再也不会被评委和你们自己之外的任何人看到,也不会产生什么实际的价值。虽然比赛结束后你可能会开源它们,或者把这个项目变成一个真正可以用的项目,但是绝大多数人参加比赛所写的代码实际上都是“Dead Code”,既不会作为开源项目被其他人参考,也不会上线运行发挥价值。

比起写这些“Dead Code”,我认为做项目——也就是写真正可以为人所用、上线运行的代码对我来说更有实际意义。当然,写技术文章和Demo级的项目也很好,因为虽然Demo也类似于“Dead Code”可能再也不会被运行,但是技术文章和Demo项目既可以帮助自己复习以前学过的东西,又可以帮助后来者避坑,这比参加比赛写些完全没用的东西有意义多了。比起参加比赛拿那些无关痛痒的奖项、浪费自己的时间,还是把心思放在提升客户使用我开发出来的系统的用户体验、如何写出更简洁易懂的技术文章上要更实际一些。

# 我并不想成为所谓的“好学生”,反而要做“不走寻常路的坏学生”。

以前那么热衷于打比赛,说白了还是被学校带偏了,认为一个技术强的“好学生”就应该打比赛,应该拿奖拿到手软……但问题在于我本来就不是一个“好学生”,也不会愿意成为一名“好学生”。那是自毁前途的做法。

先不说打比赛,纵观我国高校的计算机学科教育,不难发现除了必要的课程之外,有些完全没用用处的课程我们也是必须要浪费时间来学的——近代史、思修、大学物理、与计算机无关的“电路与电子技术”……并且,作为一名已经牢牢掌握Java语言、做过几个项目的“准程序员”,居然还要被迫去学习《Java程序设计实验》、《Web应用开发》、《数据库应用软件》(哦对了,据说这门课讲的是SQL Server,真是服了)等对我来说完全没有必要上的课程,而我最需要的《企业级应用架构》、《软件工程》等课程却并没有开设——虽说这些东西自学能学的比学校教的好很多。你用大腿想想也能想出来这非常不合理。

但是这就是我国教育等现状:不管你是什么样的人、以后做什么,都得给我学这些东西,至于有用没用那是自己的事。

再来看另一个问题:为什么计算机专业毕业的同学很多都没有好工作?在我看来,这件事情的成因是这样的:

  • 要进大厂必须要有过硬的技术实力,因为大厂只看你技术如何、能不能干活,而不在意你是不是学生会主席、有没有做过社会实践、分数是不是优秀等。然而那些技术性的东西学校是不会教的,因为在计算机系的有些(可能是绝大多数?)老师看来:“做开发” == “没出息”、“实践能力” == “没必要”、“大学教技术” == “职业学院”。
  • 大多数人,尤其是大多数“好学生”,在大学期间根本看不到这种严峻的现状,被学校牵着鼻子走,最后毕业了啥也不会,自然毕业即失业。
  • 少部分觉悟过来的学生选择与学校“对着干”,自学技术、自己找项目做、不在没用的专业课上浪费时间,然而这部分人中大部分都不会学够大厂要求的技术,因为他们很多都被强制点名、繁重而无意义的作业和必须要过的考试淹死了,没有时间来学看家本领了。
  • 就这样,大家的技术都达不到大厂的标准,就都没有好工作了。

所以这事情就非常显而易见了:你又要做好学生又要好工作,那就必须有常人双倍甚至三倍的精力去同时兼顾学习和技术,就像集训队里那些每次出征ACM都能拿奖回来、最后本科毕业就去了阿里的大佬一样。然而那种人真的非常少,毕竟绝大多数人都没有那样的觉悟、自律性和精力(别跟我说你有,仔细想想看你能做到一天所有的课都好好上、作业认真完成的同时还能写几百行代码吗?绝大多数人都不能吧,我也不能),更多的人只能二选一——是做一名成绩优秀、获奖众多但是毕业即失业的“好学生”,还是做一名在某些课上几乎没出现过、某些作业几乎完全不交但是有过硬的技术实力和辉煌的项目经验的“坏学生”呢?当然,虽然我选择了后者,但我也不会看不起那些认真学习的同学——因为这是他们的选择,我无权干涉。

但是每当遇到问我“以后确定要做开发,大学四年该怎么过”的学弟学妹们时,我给他们的建议都是:选好方向、了解好你想从事的这个方向的现状后,与这个方向无关的专业课直接放弃,不要花时间在没用的东西上。

吴军曾在他的文章中说过:“今天很多大学毕业生,读完四年大学,学了很多课,其实并没有掌握任何一项得以安身立命的技能。……大部分学校的毕业生,都没有掌握最基本的工作技能”、“教育对有些人来说是锦上添花,对有些人是雪中送炭。对于一个快饿死的人,要提供给他的不是山珍海味,而是一碗小米粥”。问题在于,以我的母校为代表的某些学校计算机系的教师不仅不给我们这样一碗小米粥,反而通过不断地描述山珍海味有多么好吃来挤占我们学习做小米粥的时间,更有甚者还会在课上公然向学生传播“小米粥很low的,我们都要吃山珍海味”这样的思想。对于这种“老师”我只想说:请您务实一点吧——人都快饿死了,你那山珍海味还有存在的必要吗?还是来碗小米粥更实际一些呀,毕竟咱们得先吃饱、后吃好,对不对?

反过来看打比赛这件事,学院给我们灌输“多打比赛才好”的观念无疑也是一种过度宣扬“山珍海味”的行为。比赛对于那些学有余力的同学来说自然是提升自我的一个很好的途径,但是结合前面谈到的“为创新而创新”来想一想,这是不是也是在变相把学生往“为创新而创新”、“写东西就要写炫酷的,管它有没有用呢”的歪路子上带呢?将比赛作为综合测评的一项重要参考项这点我自然可以理解,但是对于那些不打比赛、不做没用的东西、不为创新而创新反而做出了真正上线投入使用的系统的同学,是不是有失公平?但这也是一个“我大清自有国情在此”的事情,老师就是认为做项目太low,打比赛才高大上,我们又能怎么办呢?即使我们做出的商业项目带来的实际意义、产生的价值要远远大于一个变为“Dead Code”的比赛项目,他们大概也会选择视而不见吧。

最后我想问作为读者的你一个问题:一个在Java程序设计大赛中以绝对优势斩获第一,但是无论是成绩还是综合测评都垫底的学生,他到底是一个好学生,还是一个坏学生呢?读完本文后不妨花些时间好好地思考一下吧。