说实话,以前我也会说打牢基础很重要,大黑书很重要,学校的项目没啥用blabla
但是随着工作年限的增加,其实我越来越不确定了。
可以确定的是,如果能耐心地读完大黑书,(特别是)做对应的习题和项目,那对技术水平应该是有不少提高的。但是如果以成为优秀的软件工程师为目标,我并不十分确定这样是不是非常高效的办法。
a)你能坚持下来吗?
b)光啃书用处不大,你能很好地实践吗?
Peter Norvig(google AI的Director,人工智能专家)写过一篇很有名的文章:https://norvig.com/21-days.html
总的来讲,他的建议还是编程实践最最重要:
If you want, put in four years at a college (or more at a graduate school). This will give you access to some jobs that require credentials, and it will give you a deeper understanding of the field, but if you don't enjoy school, you can (with some dedication) get similar experience on your own or on the job. In any case, book learning alone won't be enough. "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter" says Eric Raymond, author of The New Hacker's Dictionary. One of the best programmers I ever hired had only a High School degree; he's produced a lot of great software, has his own news group, and made enough in stock options to buy his own nightclub.
就编程实践而言,我觉得加入google这样的公司(或者实习),看看真实世界的软件工程是怎样的,真实的工业代码是怎么写的,怎么通过code review,unit test,monitoring etc保证软件质量,是非常有帮助的。但是这就有点何不食肉糜了。。。
而如果加入学校的项目团队的话,不得不说很多时候项目团队水平还是不太高,应该多少会有帮助(毕竟多写代码肯定比不写好),但是帮助多大也是令人存疑的。
如果想寻找优秀的项目,我有两个建议(不确定是否完全可行,因为我自己没有实践过):
a)参与网上高质量的公开课,特别是操作系统,编译原理,数据库,计算机网络,这类有编程大作业的课程。一般来说这种大作业的代码量都相当大。
b)考虑加入一些质量较高的开源项目,读一读别人的代码,看别人怎么做的,并且尝试做一些贡献?
至于读书,当然是有用的,但是还是那句话,一切都要落实到编程实践上,学习CSAPP是为了让你写出更高效正确的代码,学习SICP是让你更好地做抽象(从而做出更好的软件),学习计算理论是为了让你知道什么问题可以不能解决,什么问题很难解决,使得你在编程的时候不会陷入死胡同。