今年夏天,我即将取得 Computer Science 学位。回想起过去的波折,我觉得我有必要提供一份自白式的总结,方便之后的弟妹找到捷径的入口。题目取自最后的冲刺,但是我总认为再最后冲刺并不符合效用最大化的考量,顶多是给再终点线边上的观众做做样子,而不能真正的跑快跑远;加之标题也有过度滥用之嫌,因此也丧失了艺术性。最终题目改为最后的自白,讲讲自己走过的弯路,顺便指点一下捷径路口的位置。
在此之前,我没有编程的经验,除了在小学时跟着老师写代码操纵了几次小海龟外。不过因为当时英文不好,看不懂方法的意思,只是单纯傻瓜式的跟着抄一两行的代码然后跑结果。当时只觉得自己是在誊抄在做无用功,并且我没有经历过图形界面前的时代,因此甚至都不懂自己写代码行是在做什么。没了兴趣,这段编程启蒙便无疾而终。不过,我还是很喜欢用电脑用Word做海报跟玩游戏,并且因为信息壁垒觉得电脑老师无所不知。那是一个单纯的年代,Google还随便上,百度还很好用。后来智慧型手机逐渐兴起,计算机行业也越来越夯,CS专业变成了香饽饽,我也趋之若鹜,在大考后几天的闲暇时间看软件工程与C语言的书,稍微明白编程其实就是用电脑完成数学计算。数学跟电脑我都爱,因此在没有在错综复杂的专业海里花多少时间选专业,顺理成章的选了CS专业。不过因为信息来源有问题,后来发现其实并不喜欢报考的学校。
报考分数线其实可以认为有市场性,虽然每年都会爆出冷门,但是一直严格的保持供需关系。沿海城市的分数线高不是没有道理的,低分捡漏入名校好专业是不存在的;唯一可行的方式是找远离当地的学校,但是遭遇的风险也更不可控。人情社会,脱离了关系网,凡是只能听之任之。不过,如果待不住也可以考虑在大二升大三时转学出国,重新掷筊。细分专业的课程通常都很类似,开那么多专业通常是为了扩招,你很难说在本科阶段CS和SE、IoT等专业到底有什么不一样,一般差别只在几门课内,基础课程完全一样。
大一大二所学都可以笼统的归类于基础课,大三大四所学的通常称为专业课。但是其实这些课程的授业者多半都是无情读稿机,课程深度和授课水平通常完全不行,充其量只能拿来做入门用的懒人包,内容大多过时而且错误频出,如果碰到感兴趣的课程还是自己另找Coursera或黑皮书自学吧。分数权重占比考试成绩还挺高的,不过应该会按往年原题来出,面向考试型刷题至少过关是没有问题。
我在发现读稿机在教我做事之后,通常都会把精力拿去做别的事,或睡觉补眠,或看书,或提早去吃饭,或跑去外面玩(一次周五上课时我正在黄山上),因为我认为这样更有价值。我这么做除了导致我的出勤分被扣了不少外,却能让我有时间阅读、看YouTube、听Podcast与思考,有办法在下课前吃饱饭,更有机会在淡季去热门景区玩,并且每天保持好心情。
信息来源也很重要,快快逃离百度魔爪,卸载国内软件躲避数据泄漏才是上上策。学会看完整的开发文档,看看StackOverFlow,DigitalOcean,W3等与各个软件框架语言的文档,或是行文比较完整的独立博客;学会看不同视角的新闻,看看AP,Economist,Guardian,NYTimes,RFI,FT等的新闻报道;学会辩证思考,看看CDT,RFA等的文章与辩论,而不是只说会各打五十大板的车轱辘话。我自己以前整理了一个名为 llSociety 的初阶信息源表,后来知道怎么善用Google查英文资料后就没有维护了(新查的资料方向太多了也维护不来了),如果你尚不知道怎么查资料可以先去转一转,一定能帮到你很多。
如果想在这个专业有所建树,最终成为一个有实力的SDE,但只靠上课+考试的应试系统肯定是不行的。我觉得至少要熟练一门语言,并且要对一个开发方向有大致的经验。我的建议是自学Python/Java并且熟练,至少对网页全栈开发Spring/Django + React/Vue有经验,移动开发也是个可尝试的方向。如果你只想躺平,据我观察“60分万岁”的毕业生,即使毫无代码能力临阵磨枪,只要不是太好高骛远一心想进一线大厂,也都能找到金融产品开发或客户咨询之类的非开发类工作,因此大可不必过度焦虑。
我自己很早就尝试自学Python(但是学习效果不好,学语言还是靠做项目比较快),低年级的时候用Py+Tensorflow做了个数字识别的程序,发现自己对AI并无兴趣,因为过程多半是在炼丹和论文复现,自己做不出什么新东西,因此及时掉头避开;再后来选修Py的爬虫与数据分析课程;之后的多数实验不要求语言,Py突然发挥了很大作用,因为拿Py来开发比C/Java快许多,并且用Tkinter(相对Qt/JFrame)做起GUI也很容易许多,甚至之后要求用C做算法的课设里的GUI也是用Py的Tk和Ctypes粘上的;Py用Django做起后端也比Spring快,数据库也不用配直接用SQLite,课设用Django从刚开始学到写完HTML到做完不过两周。
我学装过Linux虚拟机/实体机,Ubnutu,Debian,Manjaro,Fedora,Kali都有玩过,后面租VPS来上网、搭博客、配Nginx、配防火墙、搭MySQL;做毕设的时候学了React作为前端技术栈,配上Spring与MySQL,整个网页全栈的技术栈几乎就打通了;为了写博客和README学了Markdown;为了用某个Resume模板学了LaTex;为了不手写目录学了Wiki Text;甚至为了维护仓库学了GitHub Action,现在连CI也会了;啊我好像把Git漏掉了,Git肯定是必修!
如果到这里你还没有满足,那我很抱歉以我发文的当下实力可能帮不了你。不过我可以说说我之后可能想做的事情来给你参考:
- 语言:JavaScript(2pro), CSS(2pro), Go, Kotlin, Dart, TypeScript
- 软件:Docker, CircleCI/Travis-CI
- 方向:移动开发,云计算