先工程实践,还是先工程思想?—— 一位本科生从学oi到学开发的感悟
有时看到 loading1
loading2
这种变量名时,真心会希望大学的导论教一点基本的工程原则。
是先工程实践,还是先工程思想?先工程实践,就有可能写出这种日志用print
、变量名用abcd123
、密码明文传输不加盐的血压代码;先工程思想,学习过程会因为没有实践而失去色彩,学习过程中也很难坐住冷板凳,这也是我大学期间争取去参加一些企业实践活动的原因,确实收获了很多,比我硬啃CSAPP要强。“学而不思则罔,思而不学则殆”,要说,当然是实践和理论一块进行就好。
然而人的精力毕竟有限,总要有一个侧重点,总要经过一个这样一个过程:
简单认识工具
->学会使用工具
->理解工具
->举一反三,自己造轮子
以我个人从OIer转向学习开发的经历,还是实践为先。在高中起步学OIer用的C++子集时,我几乎只会激活Office、使用Windows快捷键,最多加上某辅导班的冒泡排序教学和半吊子java基础,手头称得上精品学习资源的只有一本CCF的算法竞赛入门书。因为觉得hacker很酷,凭着对编程的一丁点灵性和热爱,我和同学不停地刷洛谷,弱省省一退役,一个比较普通的结果。
进入大学的时候,我只有那两年的C++子集和数据结构算法的实践经验,甚至认为这就是计算机学科的全部————原谅我的坐井观天。大一的C语言课更是强化了我的这种错觉。此外就是Android开发。上高中那年得知Android开发,但是家里电脑跑不起来Android Studio。等到我的电脑终于能跑起来IDE的时候,我发现买的Android技术书过期了,开发一个好App就能一举成名天下知的时代也过去了。等我新生赛失利,托同学扔掉我的蓝皮算法书的时候,我才算真正开始拥抱计算机这门学科。
大一下到大二上,我听从迟先生的建议去学nand2tetris。这是一门零基础的实践性很强的课程,把计算机中最激动人心的部分提了出来,在coursera上好评如潮,你能从两位教授身上看到他们对计算机学科的热爱。我天天跟着学,从写hdl到写玩具编译器汇编器,一点也没有上课时候拳头打棉花的感觉。大二上才算正式开始学习理论,看CSAPP,读《进化:孤胆极客到高效团队》《人月神话》等等;大二下读计网入门书,看C++后端开发经验,学着做后端开发。理论学习遇到瓶颈的时候,就跑去学git
docker
这些小工具,报各种企业活动。
可以说,没有实践就没有今天的我,是做小工具、做软设推着我前进,构成我的竞争力;实践到一定程度,就会自然去学习更多的理论。去实践,去看到成果,形成正反馈,才能激发兴趣。所以二者选一,我认为还是实践为先。
然而,在开始实践之前,我也建议最好——不管是死记硬背还是什么——有一点理论基础,像义务教育的基础教育一样。这样会走的更远,不至于写出loading1
loading2
a1
a2
这样让人不明所以的变量名。我觉得大学的导论课应该打下好基础,教基本的git
docker
vercel
等工具,教电脑使用技巧和软件工程规范,比如接口倒置原则、匈牙利命名法,而不是试图浓缩计算机体系结构的课程。这一点MIT Missing Course就做的很好。
最后提一下我很喜欢的一位博主,他分享的一句格言,我觉得放在结尾很合适:
Knowledge and ability are much like compound interest – the more you do the more you can do, and the more the opportunities are open for you.
-- Richard Wesley Hamming