从 Hello World 到软件开发 | 读者信箱

积压了一些读者留言,于是想到新开一个栏目“读者信箱”,专门用来解答一些有代表性、我又有能力答的好问题。

这次回答的问题很典型,相信很多学生都有过相似疑问——

刚开始转行写码的人在学完第一门编程语言的基础语法后都会面临这么一个瓶颈,这也是他们在软件开发生涯中面临的第一个瓶颈:基础语法是懂了,课后编程习题也能做,但还是不知道怎么才能写出 production code,也不知道一个完整的软件产品是如何设计、构架、实现出来的。

去看优秀源码,去找热门开源项目仿照——是很多人会给的建议。但实际上这类建议的可行性很令我怀疑,因为对初学者来说,他们往往不知道什么是好的代码,也难以靠自己领悟出那些代码好在哪里差在哪里;自己找开源项目练手难度也很大,因为初学者不易估计出项目需要时长以及可能涉及的广度与深度,同时也因为缺乏明确目标、步骤和同伴而很容易失去动力。

所以依我看呀,最容易的成功途径还是去“蹭”别人、公司的现成软件项目,也就是去做实习。对于小白来说,很难找到能比实习更快增长开发经验和能力的方法了。不管是在学院还是业界,搭上一辆已有人掌舵的大船速度一定会比独自一人撑一叶扁舟快。举个例子,自己吭哧吭哧学在线编程课,做课后编程习题,也能学到不少东西,但从这类 toy problem sets 中能学的知识非常有限,且往往离实际工作内容也很远;比如在现实中,软件的性能非常重要,如何平衡运行速度、存储空间和云服务花费,这是每个软件工程师每天都会遇到的问题,但若脱离了真实开发环境,没有具体应用情景和大体量数据带来的限制,你很难在做编程习题时想到、学到这些业界标准。

实习对于软件开发来说尤其重要。求职初级产品经理、内容编辑等职位,没那么充分的实习经验似乎也没太大妨碍,但对于开发这种理论与实践相差较远的工作来说,实习不仅是“长技能”,更是“见世面”——业界流行的语言、框架、开发模式,不同行业的兴衰和需求,工程师在行业、司内的地位作用等等,这些都是珍贵的实践知识,非自己参与思考是体味不到其中乐趣的。这类知识可以归为 Navel 在《How to get rich without getting lucky》里提到的 specific knowledge:

Specific knowledge is knowledge that you cannot be trained for. If society can train you, it can train someone else, and replace you. […] Building specific knowledge will feel like play to you but will look like work to others.When specific knowledge is taught, it’s through apprenticeships, not schools. Specific knowledge is often highly technical or creative. It cannot be outsourced or automated.

既然明确了实习的重要性,那一定得把学习技能当作实习最重要的目标,其他工资啊公司名气啊,有的话很好但没有也不要过度纠结。

如果你在德国读书,我强烈建议你在上学期间找一份 working student (Werkstudent) 长期实习。德国教育重视实践,从很多双轨制(半职读书半职学徒式工作)大学项目就可见一斑。Working student 是指学生每周在一家公司工作10-30小时,且可以持续几年直至毕业的制度。做 working student 是一种很好的在学生时代积累工作经验赚生活费并不费力地过渡到正式工作的方式;当你在一家公司长期实习一两年后,只要表现还行,一般公司都会在你毕业后直接录用。比如,我们公司(在柏林)就有在这儿当了三年 working student,毕业后顺理成章入职软件工程师的同事。

如果没有 working student 机会,那也要努力找全职 Praktikum (internship)。

总之,从事技术行业的人不要想得太多,做得太少。都是技术活,天资差不多的情况下,必然是练习、思考越多能力越强。