本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更高台阶。
本书适合所有程序员阅读,也可供所有想成为具备职业素养的职场人士参考。
专业人士都需要通过专门训练提升自己的技能,无一例外。乐手练习音阶,球员练习绕桩,医生练习开刀和缝针,律师练习论辩,士兵练习执行任务。要想表现优异,专业人士就会选择练习。本章要讲的是程序员如何提升专业技能。
转变
任何事情,只要想做得快,都离不开练习。要想尽可能快地重复编码/测试过程,就必须能迅速做出决定。这需要识别各种各样的环境和问题,并懂得应付。
如果有两个习武者在搏斗,每个人都必须能够迅速识别出对方的意图,并且在百分之一秒内正确应对。在搏斗时,你不可能有充足的时间来研究架势,思考如何应对。这时候,你只能依靠身体的反应。
实际上,真正做出反应的是你的身体,大脑是在更高级的层面上思考。在每分钟进行许多次编码/测试的状态下,你身上的肌肉记忆了要敲哪个键。意识中较基础的部分识别情景,在百分之一秒的时间内做出合适的反应,大脑则可以放心思考更高层次的问题。
卡塔:
在武术里,卡塔是一套设计好的、用来模拟搏斗一方的招式。目标则是要逐步把整套招式练习到纯熟。习武者努力训练自己的身体来熟悉每一招,把它们连贯成流畅的套路。训练有素的卡塔看起来相当漂亮。
与之类似,编程卡塔也是一整套敲击键盘和鼠标的动作,用来模拟编程问题的解决过程。练习者不是在解决真正的问题,因为你已经知道了解决方案。相反,你是在练习解决这个问题所需要的动作和决策。
要学习热键和导航操作,以及测试驱动开发、持续集成之类的方法,找整套的卡塔来练习都是相当有效的。更重要的是,它特别有利于在潜意识中构筑通用的问题与解决方案间的联系,以后在实际编程中遇到这类问题,你马上就知道要如何解决。和习武者一样,程序员应该懂得多种不同的卡塔,并定期练习,确保不会淡化或遗忘。
真正的挑战是把一个卡塔练习到炉火纯青,你可以窥见其中的韵律。要做到这一点可不容易。
瓦萨:
两个人的练习。
瓦萨基本可以说是两个人的卡塔。其中的招式需要精确地记忆,反复演练。一个人负责攻,另一个人负责守。攻守双方互换时,各种动作要一而再、再而三地重复。
程序员可以用一种叫“乒乓”的游戏来进行类似的练习:两个人选择一个卡塔,或者一个简单问题,一个人写单元测试,另一个人写程序通过单元测试,然后交换角色。
写单元测试的程序员会极力控制解决问题的方式,他也有足够的空间来施加限制:如果程序员选择实现一个排序算法,写测试的人可以很容易地限制速度和内存,给同伴施压。这样整个游戏就非常考验人……也可以说是非常有趣。
自由练习:
多人练习。
很多编程练习场中都会玩一种叫“自由练习”的游戏。它很像由两个参与者解决问题的瓦萨,只是自由练习是有很多人参与的,而且规则是可以延续的。在自由练习中,屏幕被投影到墙上,一个人写测试,然后坐下来,另一个人写程序通过测试,再写下一个测试。桌子边的人一个个轮流接下去,或者有兴趣的人可以自己排队参加。无论怎么安排,都是非常有趣的。
职业程序员通常会受到一种限制,即所解决问题的种类比较单一。老板通常只强调一种语言、一种平台,以及程序员的专门领域。经验不够丰富的程序员,履历和思维中都存在某种贻害无穷的盲区。经常可以看到这样的情景:程序员发现,面对行业的周期性变化造成的新局面,自己并没有做好准备。
开源:
保持不落伍的一种方法是为开源项目贡献代码,就像律师和医生参加公益活动一样。开源项目有很多,为其他人真正关心的开源项目做一点贡献,应该可以算是提升技能的最好办法了。
关于练习的职业道德:
职业程序员用自己的时间来练习。老板的职责不包括避免你的技术落伍,也不包括为你打造一份好看的履历。医生练习手术不需要病人付钱,球员练习绕桩(通常)不需要球迷付钱,乐手练习音阶也不需要乐迷付钱。所以老板没有义务为程序员的练习来买单。既然你用自己的时间练习,就不必限制在老板规定的语言和平台。可以选择你喜欢的语言,练习你喜欢的技术。
结论:无论如何,专业人士都需要练习。他们这么做,是因为他们关心自己能做到的最好结果。更重要的是,他们用自己的时间练习,因为他们知道保持自己的技能不落伍是自己的责任,而不是雇主的责任。练习的时候你是赚不到钱的,但是练习之后,你会获得回报,而且是丰厚的回报。