计算机本科生花大量时间写编译器,操作系统是不是不务正业?
这个提问真是反应了现在计算机专业的困境
如果短期目标是学界,很残酷的现实是sys方向工作量大,工作周期非常长,弱组一篇顶会很可能是接力才能完成的。那么你的同学很可能大一开始进组玩AI在大二升大三的时候已经发了CVPR了,而你写完体系结构、操作系统、编译器以后你可能已经大三了,但是距离你能在OSDI或者ASPLOS上发表论文可能还有四五年的时间。写完这些很可能对你在考研或者保研的面试的时候没有太大帮助,因为sys方向的强组早就招满了,那些学生他们手握顶会的二作甚至一作,深入了解Linux的某些组件或者数据库内核或者LLVM,这些都不是你的玩具涉及到的内容,很可能你最终会被调剂到一个用AI水毕业的组,这时你还要从头学习AI,最后短时间内仍然没有什么产出,陷入持续的焦虑之中。
如果目标是就业,那么现实就更加残酷了,最广大的就业岗位就是包括后端在内的开发岗,后端岗位大多需要Java或者Go,而不是你在底层学习时经常使用的C/Cpp/asm/Rust,并且这些岗位还要求你熟悉框架,可以快速进入项目流程,这些又是你的薄弱环节,很可能稍微深入询问框架就会导致你连一面都过不去。在不考虑这类岗位的情况下,仍然有几种更加细分的就业方向,如果是操作系统开发等底层开发,那么应届生很难找到心仪的岗位,因为你缺乏各种意义上的经验,看过xv6那种玩具也不足以说明你能开发当前急缺的国产化操作系统或者手机OS;如果是C/Cpp/Rust相关的中间件开发,这类岗位相对减少而且竞争激烈,在大神频出的情况下你做了点公开课的大作业只是拿到了入场券,在这些岗位中比如CMU 15-445和MIT 6.828几乎是简历标配了,面试官都懒得问,企业需要的项目经历你仍然不具备,你的竞争者很可能有1K star以上的开源项目并且给多个开源仓库提交过代码;还有一类时下比较热的岗位是MLsys,很多独角兽在开发比如针对深度学习的编译器,在设计算子优化等方面,你会发现你还是要学习AI并把它结合到编译器里,而你可能甚至没看过LLVM IR只是写了个针对C语言的微小子集的编译器,至于优化,很可能连mem2reg都没研究明白。
而且还需要注意的一个关键问题是,题中所写的花大量时间写编译器等到底是怎么写?在几年前,那时候还不流行公开课,对CS专业的改革呼声还没那么强烈,自己撸一个操作系统和编译器什么的在非TOP学校里只存在于传说之中,我甚至看到过一个远古老哥写的博客,哈工大的操作系统课那一年只有他一个人自己写出来这个东西并以此代替了考试。这两年情况完全不同了,首先互联网上公开课的资源越来越多,这主要应该感谢CSDIY.wiki;其次是国内的学校积极课改,也放出了大量优秀的作品,比如清华的uCore或者rCore;最后是很多往届同学用大作业参加各种大学生竞赛而后优化了各种花样的代码(本人还有幸参加过首届,虽然也是用大作业参加的比赛)。上述三点都极大降低了自己写这些东西的难度,在有框架的情况下,这些内容都变成了代码填空,少部分恶劣情况甚至变成了面向测试样例编程。比如清华老版本的uCore,那就是一个代码填空,注释和代码行数几乎一比一,放到今天直接塞给AI都能写出来。
而某种意义上真正自己写这些的同学是怎么写出来的呢?那时候没有代码框架,没有tutorials,没有注释告诉你哪里有todo并且应该怎么实现,只能对着一两个著名的开源项目扒出来有用的部分,对着厂商给的几千页的手册和几本翻译稀烂的黑砖一点一点实现以学生的水平可以实现的功能,而且隔几天就重构一次几乎是常态。除了实现功能,自己甚至还要设计测试样例。在这样的开发锻炼下,所学到的和收获的,远不是代码填空可以相提并论的,甚至这个过程中对Git的练习都够你研究。
我真心不建议水平一般、大学以前从未接触过编程的同学花费大量时间在这些内容上。虽然学习这些较为基础的东西十分有用,学好了在未来某个时间也一定会有所回报,但是这类同学必须以一种功利主义的思维来考虑投资回报率的问题,当你花费了大量时间和精力才堪堪达到了一个坑位很少的领域的高门槛之后,你是否能够在这个领域站住脚跟并获得丰厚的回报?深造还是就业,如果优势并不明显,那么你的未来究竟何去何从?
虽然正如其他回答所说,这些才是真正的计算机科学,这些才是真正的护城河,说的都没错;但不可否认的是这些领域都趋向成熟,也就是说在花费了大量时间之后只是【了解】了这个领域三四十年前就提出来的东西。在一片红海之中,前有经验丰富、功成名就的老前辈占据最大的蛋糕还不断对年轻人指点江山,后有真正的天才不断涌现争抢为数不多的位置,天资一般、积累较少的同学的处境不光尴尬而且非常艰难。
回到开头,我说这就是当今计算机专业甚至这个行业的一个困境,对于学界,不是热点的领域发文困难甚至要靠AI续命,护城河也快要护不住了;延伸到业界,由于产业趋向饱和,厂商不再需要也不愿意培养一个可能有潜力但是没经验的萌新,更需要的是报到第一天就能干活的标准件螺丝钉。程序猿们为了工作而疲于学习各种新兴框架,再也没有时间深入底层的细节。虽然人人都知道深入底层更好,但是在一般人的身上它的回报周期太长,这恰恰是这个行业所不能容忍的,毕竟35岁就被辞退了可你25岁还不能直接干活,也就是说你这个人对于公司来说根本创造不了多少价值。
如果不是真心喜欢或者已经深度捆绑难以回头,还是选择可以短期可以看到回报的热门领域吧!
更新一个评论区的问答
很多强者其实并没有多么聪明,但是他们从初中就开始接触了,无论是拿过省一省二OIer还是用易语言写外挂入门的Hacker,他们已经有了多年的积累,也许这些人在高中写的技术博客别人到了大四都看不懂。在别的同学用一整年学习C++和数据结构的时候,人家早就开始上手项目了。底层繁琐的细节也更适合这些有积累的同学。另一部分有所成就的是智力超过常人的天才【经评论区提示删去错误例子】。也就是说,只有上面两类同学可以从容地完成“手撸一个xxx”“build my own xxx”,写这些东西对他们来说不太困难还会从debugging和reading里收获很多。其实是他们先成为了大神,才通过写这些东西学习;而不是好多人渲染的“要是早知道...”写了这些东西,才变成了大神。
普通同学的困境就在这里,如果你并不是先飞的笨鸟,也不是天才,选择计算机专业只是为了好找工作,那么如何能在这个行业里更好地混口饭吃才是最重要的事。我的回答中甚至还没有提到第一学历的巨大影响。只能说悲哀就在这里,强者如云的红海里根本没有先天(学历)后天(实力)都不足的弱者的位置,但是时间不等人,后飞的笨鸟没有机会再成长起来了。所以放弃短平快的就业导向而选择修炼所谓的“内功”绝非明智之举,应该慎之又慎。