Learning by doing 可以翻译为做中学,但是它还有个更好的翻译,叫做“知行合一”。也就是孔子经常说的“学而时习之”的那个“学”和“习”。
大二暑假的课程设计中,我故意选了个带安卓的东西(日程管理)。那次是我头一回上手安卓应用,而且还是第二次用java来做东西(之前第一次是写web书店)。我没有任何时间停下项目的进度去专门学习它的类库,最后只用了两个星期就做出来了,通过了90%的交叉测试用例。虽然没加样式表美化,没经过上线流程,但起码我得到了一个prototype。以后如果我再做安卓的东西,我有可借鉴的东西。虽然我知道github里那种东西一大堆,但还是自己做出来的比较顺手。
不仅仅是技术层面,理论性的东西也一样。ics最后一个lab,mini proxy ,大概是让我们用c语言写一个代理服务器。从这次lab我了解到了一些unix网络编程,和一些计算机网络的知识。之后,我也经常的接触有关网络的东西,比如node.js最开始要监听某个端口发来的请求,而且它五行就能写一个server的代码,我这个lab用c代码写要写100行。别人看这五行代码,就是五行代码,我却仿佛能通过它看到它后面调用的socket接口。
技术和知识都需要实践来巩固。我并不是忽视理论的学习,而是实践太重要了。它就像“一图胜千言”一样,有着事半功倍的效果。你若是问我计算机的文件系统或者boot是怎么回事,可能我把所有设计细节给你说出来甚至写在纸上,你都读不懂;但是你如果做一个yfs或者jos的lab,会马上秒懂。也难怪,os本来就是用一行一行代码写成的,你让我把代码翻译成自然语言给你说一遍,不是白费劲吗,而且还会出现二义性之类的偏差。
由于有着如此多的实践,读计算机的一大感觉就是累,铺天盖地的代码量,以及各种大作业(proj)小作业(hw)和lab的轮番轰炸。不过我觉得还是相当值得,除了写出来的项目足够在简历上充场子以外,还加深巩固了对知识的理解,总比上课听天书要好。
最近总是看到一些人说想做app但是这个不会那个不会。我想插一句,并不用挤出大段时间专门学习,边做边学即可。