《软件开发者路线图:从学徒到高手》模式总结 - zLulus/My_Note GitHub Wiki

绪论

学徒期的概念源于中世纪的手工艺模式,那时一小组从业者在一起工作,经验较少的学徒帮助学徒期满的熟练工和师傅完成工作
这是一本关于如何设计软件开发职业生涯的开端并为你在该领域成就卓越打下基础的书
随着你开始学习模式本身,要记住:你可以基于任意的方式选择、合并或调整它们来适应你的独特情形
要理解:这些模式是针对特定上下文的特定受众而写的
今后,有些模式会突然变得适合于你,而后,同样又突然间让你觉得不再合适

空杯心态

清除思想中的坏习惯,放下对技能水平的自鸣得意,敞开自己,从更有经验的同行那里学习不同的而且常常是违反直觉的新方法

白色腰带

不管你原来有多少专长,都要维持一种初学者的思想
你必须忘记已经学到的东西
必须能够放下过去的经验和先入为主,这样才能把新的知识放进来

入门语言

任何专业和行业的技术名词,都是为了让事情变得更简单才引入的
让解决问题的动力来指导自己学习,使用自己选择的入门语言来构建一个玩具应用,最好是开源项目
测试驱动开发技术能让你基于小步骤前进,并确保自己的假设被检验
深入挖掘第一门语言,第一门语言将是你学习其他语言的框架
不要让你对入门语言的精通阻碍自己对其他语言的学习和使用

释放激情

不要让任何人压抑了你对软件工艺的兴奋——它是一种宝贵的财富,它将加速你的学习

具体技能

你应该学会并持有一些具体技能
在技术能力水平达到一定高度前,在特定的工具和技术领域拥有具体的、可展示的能力还是会增大团队信任你,相信你能对他们有间接贡献的可能性

暴露无知

那种保持沉默并猜测到底发生了什么的作法是行不通的
向那些依靠你完成工作的人说明:学习过程是交付软件的一部分,让他们看到你在成长

正视无知

选出一种技能、工具或技术,积极地填补跟它有关的知识空白
采用一种对你最有效的方法来做这件事
1.阅读能接触到的所有文献和FAQ,来获得知识概览
2.直接动手构造一个“质脆玩具”
3.不要忘了问问周围的“同道中人”和指导者,看是否有人已经掌握了这项技能并且愿意分享所学

深水区域

跳进深水区域吧,“一直等待直到自己准备好”会变成一张啥也不做的处方,因此,当你被安排扮演更高姿态的角色或者解决更加困难的任务时,要用双手抓住机会,只有承担艰巨的任务并做一些让人紧张的事情,你才会成长
即使面临着极高的失败率,也要勇敢地接受它,为失败做好准备并从失败中振作将为你打开怯懦者永远看不见的大门
虽然我们提倡你去尝试自己所能承担的最具挑战性的任务,但你仍要记住:如果水位高过了头顶,你将会溺水

以退为进

暂时退回到自己的能力范围之内来获得一点镇定,花点时间构建一样你知道如何构建的东西,然后基于这种经验来认清自己已经走了多远,当前的能力有多高

漫漫长路

渴望成为软件工艺师傅的人们需要做长期的规划
你将精通于学习、解决问题,以及同客户建立牢固关系的技巧
新技术替代了旧技术,解决的基本问题却都一样

技重于艺

相对于增加个人利益,要更重视向客户交付价值
作为技师,你的首要工作是构建能满足他人需要的东西,而不是沉迷于艺术展现

持续动力

如果程序员有机会按照自己喜欢的方式来编程,那编程本身就是编程的最大动力
当你行走在通往技艺精通的“漫漫长路”上,在软件技艺上“培养激情”,并使之与生活的其他方面保持平衡是非常必要的
有时天平会倾向一边或者另一边,这是很自然的
但是,在整条“漫漫长路”上,你都应该对这种平衡动作保持清醒的意识

培养激情

Q:你工作在一个不好的环境中,它扼杀你对软件工艺的激情
采取措施来保护并培养自己对软件技艺的激情
1.做点自己喜欢的事情
2.找一些“同道中人”,开一个博客,阅读一些你感兴趣的博客,参加在线论坛等
3.钻研名著
当你的激情陷入危险处境时,可以让自己沉浸在软件开发领域的杰出作品中
4.“自定路线”
有时你的需要、目标和抱负会跟老板提供给你的职业道路相抵触,可以考虑换到一个新的、能提供适合自己的职业道路的组织,这样可以保护你的激情 5.项目死亡行军是最具破坏性的恶劣条件
行走在“漫漫长路”上的人们并不是短短几年冲刺然后燃尽自己的英雄——他们是在几十年的时间里保持可持续的节奏,并不断前进的人们
要培养自己的激情,需要设置一个清晰的界限,基于这个界限来定义你愿意身处其中的工作环境

自定路线

为自己的职业生涯确定一个合理但又须付出努力的下一步
要明白这并不需要你的老板、你的职业顾问或者你的教授帮你定好
到达自己的下一步,然后继续制定整个过程直到抵达理想的目标,这都是你自己的责任
确定下一步职业目标之后,你要做的就是把中间的步骤具体化,也就是把自己前进所需采用的小步骤具体化
不要仅仅写下上层的目标,尽量制定细小的、可达成的步骤
这些小步骤会提供一些反馈,你可以利用它们来修改自己的路线,这些小步骤还能使你能更容易地从“同道中人”那里获得帮助,从而达成自己的目标 如果你发现自己设定的愿景跟老板为你设定的愿景不一致,而且看起来找不到协同二者差别的方法,那就考查一下其他机会,看看有没有与你期望的方向一致的机会
根据周围环境和自身价值的调整,你应该不断重新评估自己的路线
有时你的路线会跟周围的人一致,有时你的路线需要你自己在荒野中找出属于自己的路

使用头衔

不要让头衔影响了你,它只是一种娱乐,你应该在意识中将它边缘化
让人印象深刻的头衔和责任并不表明你的学徒期已经结束
另一种情况是:虽然你的技能水平已经超出了自己的同事,但你的头衔依然平淡无奇
来自不得赏识的挫败感应该让你想到:我们的行业是有问题的
你应该通过这种情形来度量你的组织以及它跟你之间的切合度,而不应该让这种挫败感拖慢了自己前进的步伐

坚守阵地

一个人一旦停止了实践,他对技艺的精通就马上开始消退
每一个不写程序的日子,你都是在不断远离熟练工的目标

另辟蹊径

你已经在“漫漫长路”上走了一些时候了,但因为“自定路线”,你现在认识到这条路不再是适合你的选择
你找到了另外一条路,其回报与你现在的价值更合拍:更多时间与家人呆在一起,更多的薪水,或者一条新的职业引起了你的注意
不管是什么,都意味着跟你的技艺和“漫漫长路”说再见,可能是永远,也可能不是
即使永远地离开原来的道路,在这一路上你所形成的价值和原则也将一直陪伴着你
传统的软件组织不一定会如此欢迎,他们常常把这些弯路看作职业生涯中的缺口
尽管有这样的风险,你仍然不必害怕在自己的一生中做点不同的事情
如果你离开了软件开发,你会发现不管自己去哪里,像严谨的思考以及将涉及大批量数据的任务自动化这样的习惯仍将对你有用

准确的自我评估

快速学习的人们面对的主要风险之一就是变成小池里的大鱼
有必要让大鱼知道在全球的池塘网络中还有其他的池塘
大鱼还要知道巨型鱼的存在
你必须愿意放下自己已经感知到的能力,意识到自己在“漫漫长路”上只走了一小段
你的目标并不是变得优于“平均水平的开发者”
你的目标是度量自己的能力,并找到比昨天的自己做得更好的方法

只求最差

Q:你的学习速率曲线已经变平
让周围多些水平比你更高的开发者,找一个更强的团队,在那里让自己成为最弱的成员并拥有成长的空间
对那些准备成为熟练工的更有经验的开发者来说,应该尝试去指导新手,把别人曾经给你的机会再给予别人

找人指导

被一位潜在的指导者拒绝或者认为你奇怪的概率并不高,而潜在的回报却是巨大的
即使那人没兴趣收你为全职学徒,邀请他出来共进午餐也会是很有价值的时间和金钱投资
如果你对精通技艺是严肃的,那就勇往直前地找人指导吧
寻找指导者是一方面,另一方面你也必须向那些需要你指导的人提供帮助,将自己从指导者那里学到的东西传递下去,要完成到熟练工的状态转变,这是你可以依赖的方法之一

同道中人

Q:鼓励软件技能的组织文化非常罕见,你发现自己无人指导,束手无策,而且周围的气氛看起来与你的志向并不一致
为保持前进的势头,特别是当找不到全职指导者的时候,你需要找到那些所走的道路与你相似的人,跟他们保持频繁联系

密切交往

Q:你的生产率进入了稳定状态,你的学习停滞了,你感觉有更高级的技术和方法而自己却抓不住
“结对编程”这一实践就是该模式的一个例子,学徒们应该寻找机会,到一个使用该种技法的团队工作
这一模式的应用不只限于结对编程,我们的目标是接触到那些技能更加娴熟的人,学习他们的日常工作习惯,观察他们靠什么方法将那些习惯逐渐磨练成高超的技能
这些习惯不只限于编码,也可以延伸到软件开发的方方面面
跟他们共享一块白板,你就能迫使自己暂时按照他的思路来思考
即使你最终拒绝了他的观点,也会获得一种新的看待问题的方法

打扫地面

主动去完成简单无趣却又必须完成的任务,这是一种可以尽早为团队的成功付出努力的方法
因为它表明你能完成高质量的工作,即使这种工作看起来无关紧要

恒久学习

软件开发有两种主要行为构成:学习和交流
成功学徒的显著特点就是能证明自己的学习能力
师傅们的特点之一就是:他们愿意放下辛苦得来的特定领域的专长,以便学习新东西
对那些为精通技能而长途跋涉的人们,学习是一种恒久的行动

提高带宽

对学徒来说,提高获取新知识的能力是关键一步
你必须开发一些必要的方法和技巧来高效地获取、理解、维持并应用新知识
比如:
1.注册成为博客聚合器的用户并开始订阅软件开发方面的博客
2.从Twiiter上follow一些软件大师,留意他们在做什么
3.订阅流量较高的在线邮件列表,重现别人遇到的问题并尝试回答他们的提问
4.加入一个新成立的对某种新技术比较兴奋的本地用户组
5.参加技术大会,或者从网站上阅读幻灯片,并下载演讲的音频和视频
6.在读完一本书之后,写封简短的邮件与作者联系一下,表达一下谢意,问一点问题
7.不要忘了网上有成百上千的在线教程、播客和视频,可以从ITunes和YouTube免费下载

不断实践

Q:你的日常编程活动不会给你通过犯错来学习的机会
在一个可以很轻松犯错误的环境中,花点时间不受干扰地实践你的技艺
实践过程需要结合较短的反馈回路

质脆玩具

设计并构建一套玩具系统,此系统从使用的工具集上(而不是功能范围上)与你在工作中构建的系统类似,通过这种方式为失败做出预算

使用源码

Q:如果没有好的实践范本拿来研究并效仿,“不断实践”模式就只会保护那些你都不知道自己已经养成的坏习惯
找别人的的代码来读一读,从你日常使用的应用和工具开始
找找周围有没有人有兴趣阅读你写的源码,若能拥抱他们的反馈,并从中滤除纯个人的偏好,你将成为更好的程序员
加入一个实施“代码复查”(code review)或者“结对编程”(pair programming)实践的团队或者项目中
最终你将获得一个工具盒,里面都是从其他人的代码中收集来的各种奇技,这会磨炼你更迅速、更快捷地解决小问题的能力
你将能处理别人认为不可能解决的问题,因为他们接触不到你的工具盒
那些能直接从源码中快速汲取知识的人很快就能成为更好的程序员,因为他们的老师就是世界上的每一位程序员写下的一行行代码

且行且思

使用“个人实践图”
有意识地写下自己所做的事情以及这些事情之间的联系
拥有一张看得见摸得着的实践图表,能使你更深入地思考自己所使用技术的每一次变化
这种观察,反思并改变的过程并不只限于你自己的行为,你还可以悄悄地观察团队中的熟练工和师傅,思考他们使用的实践、过程和技术,看看这些东西是否能够跟自己经验中的其他部分关联起来
在我们行业的某些领域,有时很容易将同样的时间经历重复10次却没有取得能力上的实质进步
事实上,这有时会变成“反经验”,即这样一种现象:每一次新的时间经历仅仅强化了你所养成的坏习惯

记录所学

在日志、个人wiki或者博客中为自己的行程做个记录,将自己学到的经验按时间顺序记录
定期读一读以前写的东西
试着在每次重读这些资料时都能找到新的关联,这种创造性的复读过程能让你基于新的数据重新评估旧的决策,或者坚定正在摇摆的信念

分享所学

要在学徒期的早期就养成定期分享所学经验的习惯
教别人是一种非常强大的学习方法——相对于学的人,这一点对于教的人来说或许更明显

建立馈路

Q:自我评估只能相对于你过去拥有的能力,而且永远缺乏客观性,你的团队很容易歪曲你对自身能力的判断,即使使用“且行且思”模式,它也只能帮你分析过去,不会告诉你现在的情况
建立一些机制,定期收集关于自身绩效的相对客观的外部数据
通过尽早、经常而且高效地寻求反馈,至少你可以提高知道自己不行的概率
1.使用像测试驱动开发和带有交互式解释器的动态类型语言这类技术,它们能使你的程序快速失败
2.通过代码复审和结对编程来获得反馈
3.考试和认证

学会失败

设法确定你常常会在哪些情况下失败并试着解决那些需要改正的方面
真正的目标是让你对导致失败的模式、条件、习惯和行为有所自知
知道了那些使你失败的事情,你就可以在修正这些问题和减少损失之间做选择
要承认有些东西是你不擅长的,或者需要不成比例的时间和精力投入才能取得很少的进展

安排你的课程

阅读列表

维护一张“阅读列表”,用它来跟踪你打算阅读的书,并记下已经读过的书
这一模式不只讨论如何管理自己想读的书,也是一种反映你以往阅读习惯的机制
基于多年的数据,你可以在自己选择的学习资料中逐渐发现一些模式、趋势和缺口
这可以帮你更好的决定下一步读什么
如果把这种信息公开,其他人也会为你以后的阅读提供建议,这会使你发现隐蔽的联系和表面暗淡的珍宝
你才应该是那个对自己下一步学什么做出决策的人
在合适的时间阅读合适的书籍也很重要,比起乱读一通自己还没有相关经验的书,或者乱读一通自己尚不具备相关预备知识的书,在合适的时间读合适的书有更好的效果

坚持阅读

在你构建“阅读列表”的过程中,要更加重视书籍,而不是博客
任何时候都应该随身携带一本薄书,利用每天当中的那一点点空余时间(比如在列车上,或者排队等待的时候)来学习

钻牙名著

成功的学徒常常关注“经久不衰的书”,然后通过上网和实验来学习这些知识如何演化
关注于经典作品也有风险:你对它们投入过多的精力,而完全不顾那些能提高日常技能的,更加注重实效的知识和信息
在你的阅读列表中,要确保经典名著和现代的、更注重实效的图书和文章混合出现

深入挖掘

Q:你没有花时间去理解问题就做出了决策,并复制了工具中附带的玩具示例,你可以靠它们做任何东西,你获得了迅速投入到新技术中并很快拿出解决方案的能力,你只学到了足以让你那一部分系统运行起来的那一部分技术,然后依赖团队中的其他成员去学习其他部分
学会深入挖掘一些工具、技术和技艺
对知识达到“知其所以然”的程度
深度意味着要理解导致一种设计的推动力
深入挖掘技术的另一好处是:对自己构建的系统,你可以真正解释其内部机制
对这一模式的运用会将那些胡乱堆砌碎石的人跟那些建造大教堂的人区分出来
阅读教程的时候,不要去寻找可以复制的代码,而应该寻找可用于放置新知识的思想结构
你的目标应该是理解某个概念的历史上下文以及它是否是另一种思想的特例
问自己,在你学习的知识背后,是否隐含着更基本的计算机科学概念
如果只拥有表面知识,另一种可能的后果是:你会永远意识不到自己正尝试解决的问题要么已经有了众所周知的解决方案,要么根本是不可能的

常用工具

放弃熟悉而又好用的工具是一种让人痛苦的过程,但也是一种需要学会的技能
你在学徒期使用的工具到你变成熟练工时肯定会变得过时
最终,你所钟爱的所有工具都将变成垃圾
你必须学会从容地获取或放弃一些熟练工具