这几天,我看完了美国人Chad Fowler写的《我编程,我快乐:程序员职业规划之道》(The Passionate Programmer (2nd edition): Creating a Remarkable Career in Software Development)。

Chad Fowler目前是一家Ruby咨询公司的CTO,但之前他是名萨克斯乐手,从乐手转到程序员并成为CTO他积累了很多的职业生涯的经验,他也乐于分享出来,所以就有了本书的出现。在书中,他在技术选择、团队选择、技术学习、提升等方面有很多经验介绍,特别适合程序员同学们阅读,特别是对自己职业生涯还比较迷茫时……

下面就是我整理的一些摘录。

  • 经常有人问我为什么很多优秀的乐手同时又是很棒的软件开发工程师。这绝对不是因为这两种工作调动的大脑功能一样,也不是因为它们都是追求细节和创造力的工作,而是因为一个渴望成功的人肯定要比那些只是单纯完成工作的人更有可能成功。即使我们不能成为Martin Fowler、Linus Torvalds那样的人,但确定高目标至少可以让我们不再平凡。
  • 把你的职业想象成你正在制作的产品的生命周期,你的技术成就了这个产品。
  • 基于当今市场,按照从左往右的顺序尽可能多地列举出处于早期、中期和晚期的技术。最左边为崭新的尚未稳定的技术,最右边为即将退出市场的技术。尽可能仔细地找到它们之间的细微关联。
  • 从供求规律中,我们可以学到重要的一点——需求的增长会加剧价格的竞争。如果只想做稳定可靠的工作,并且跟随着工作发展,那么你就会卷入与国外开发人员的价格竞争中,因为你的技术决定了你只能进入平衡的外包市场。如果在主流技术市场中竞争,你就必须在更高层面上竞争,否则,你就要去发现市场上的不平衡,找到外包公司无能为力的工作。
  • 只思考在哪种技术上投资是不够的。毕竟,技术只是一种商品。你不可能只掌握一种编程语言,或者只能够操作某种系统,然后把生意交给老板打理。如果他们只想找个懂代码的机器人,那不如雇个外国廉价的程序员。如果你想站稳脚跟,必须要深入了解你所处的领域。
  • 下意识地去寻找最棒的IT人士,并与他们一起工作。做编程团队里最差的程序员和做乐队里最差的乐手产生的效果是一样的。
  • 比起那些经验单一的候选人,我们更倾向于那些具有丰富经验的候选人。我认为优秀的程序员之所以寻找变化和多样性的工作,是因为他们喜欢学习新东西,或者是因为他们很清楚要想成为更加成熟、更加全面的程序员,就必须去学习新的技术、在新的环境下工作,获取新的经验。
  • 在职业道路上,需要一些有目的性的冒险。别让恐惧征服了你。如果在工作中没有感到乐趣,那你就不可能出色地工作。
  • 在微软30万美金的诱惑前,我却选择了GitHub ——Tom Preston-Werner,GitHub的创始人之一
  • 在变化如此迅速的环境下,灵活才能制胜。聪明的生意人在碰到难题时,会向身边的专业软件师寻求帮助。那么,你怎么才能成为这些生意人遇到困难时首先想到的“英雄”呢?答案就是——能够解决一切可能出现的难题。
  • 热爱它,不然就离开它
  • 要主动问,不要等着别人来告诉你!
  • 学习行业是如何运转的
  • 指导自己——我们都希望有人主动来教我们,但事实是我们很难在自己周围找到这么个人。所以要学会自己做自己的良师。
  • 软件开发师经常会对着宠物或者什么无生命的物体讲述如何解决一个问题。
  • 对于技术,你要是没达到手到擒来的地步,那它们真能帮到你的时候你也想不起来它们。这就需要尝试深入研究,练习真正的目的是以最快速度读懂你正在看的代码。
  • 训练思维敏捷和提高即兴编码技术的好方法是通过自我限制的方式来练习。
  • 当你以一种批判的视角去看这些程序的时候,你就会开始培养自己的品味,就像你对音乐、艺术和文学的品味一样。不同的风格和技巧可能会使你觉得好笑、惊讶、气愤,或者像我所希望的,让你觉得有挑战。
  • 找到一些志同道合的人,每个月聚会一次。每次聚会由一个人提出一段代码——2行或者200行都可以。分解它,然后讨论这段代码背后的东西。思考做出这个程序所做的决定,权衡没有包含在这个程序中的代码。
  • 挑选一个你经常重复做的工作,为它编写一个代码生成器。从简单的部分做起。不要管这个代码生成器的重复使用率,只确保这个代码生成器可以节省你的时间。想办法提高生成代码的抽象等级。
  • 研究模型驱动架构(MDA)。
  • 不管一种技术看上去多么出色,只有当它能够解决真正紧急的难题并且让他们真正受益时,它才算得上出色。久而久之,这一观点使我从以技术为中心的思维方式向以解决方案为中心
  • 如果你把自己做的项目当做是一个竞赛,那你就可以更快地完成工作。开始行动,不要总是安于现状,要做推动者。
  • 做些笔记,记录下你认为用户和经理想要让你做的事情。有点创造性,试着从他们的角度来看这个系统。当你记录下这些有可能会被提出的不太明显的功能之后,想一想如何才能最有效地执行它们。想想用户在短时间内想不到的边缘功能。
  • 对于大部分值得去做的工作而言,做那些细致和有目的性的工作的员工更容易变得出众。他的目标是,每天都要有一些出色的工作报告给经理,这包括他关于如何改善这个部门的一些想法和已经做过的工作。如果你规定自己每天都要做出一点成绩,那你肯定不能花两个星期的时间精心策划某个“完美”任务。
  • 留出半小时时间,拿一支铅笔和一张纸坐在一个安静无人打扰的地方。想想每天你的团队都在忍受的那些吹毛求疵的小问题。把它们写下来。哪些烦人的任务每天都要耽误整个团队好几分钟的时间去讨论,却没人有时间或精力来完成这些任务?
  • 你现在做的项目中,哪些工作是可以自动完成,而你却在手动完成?记录下来。你来构造或者部署一个过程如何?你可以解决哪些问题?又将如何增加成功率呢?记录下这些想法。
  • 在结构良好的环境中,经理的目标,就是整个团队的目标。
  • 在大部分公司中,直接总管负责绩效考核、工资、奖金和升职。所以,你的功劳最终还是在你的经理那里折现了。
  • 公司不是靠可能性来挣钱的。如果不能符合股东们的潜在设想,他们是不会继续投资。
  • 专注于现在的工作,你就会享受日常工作中的每一个小成功:你工作干得很出色,当出现难题的时候,你就会被人当做专家一样请来解决这个问题。
  • 对大多数软件工程师来说,工作无聊主要出于两个原因。我们热爱的工作是可以让我们充分发挥创造才能的工作。软件开发是具有创造性的,大多数人也正是出于这一点才从事这份工作。而那些我们厌烦的工作往往是我们认为没什么创造力的工作。想一想,下星期你工作日程中有哪些工作。你不想做的工作很可能就是没什么机会让你发挥想象力的工作,你会觉得这种工作找其他人来做就足够了。
  • 第二个原因是令人厌烦的工作很无聊,并且没有挑战性。我们都愿意去探索、解决别人解决不了的难题。这就像人们不惜冒着生命危险去攀登高峰、蹦极,原因就是我们热爱那些可以证明我们能力的事情。那些无聊的工作通常都不是什么脑力活,难度和倒垃圾差不多。
  • 你怎么做才能帮助公司节省开支?如何提高整个团队的工作效率?考虑一下使用你们软件的终端客户。
  • 事实上,一个员工的离开很难对公司造成很大的影响,即便是这个员工处于非常重要的职位,造成的影响也会非常小。
  • 永远不要高枕无忧,他一遍又一遍地重复这句话。
  • 感觉自己无可替代是一个不好的征兆,特别是对软件开发人员来说。
  • 自动化或者分解你的代码,或者为这些代码提供说明,使其他团队成员很容易明白你编写的代码。
  • 做项目像是马拉松,而不是全速短跑。
  • 我认为有限的资源更加珍贵,我们会更加高效地利用有限的资源。
  • 发现问题后第一时间提出,不要企图隐瞒错误。接受批评。提供解决方法。寻求帮助。充满压力的时候是赢得忠诚的最好时机。
  • 经常说“是”的人,要么就是天才,要么就是在说谎。后者通常占多数
  • 你的上司希望你具有独立性和归属感。制作计划、执行计划以及与上司就计划进行沟通都会帮助你找到工作的独立性和归属感。
  • 这就会产生失败和抄袭的良性循环,这个循环也是你评价自身进步的一种简单的方法。在处理棘手的项目时,你被一个不可逾越的难题绊倒了,你抄袭了别人的解决方法,结果是,不管问题是什么,现在你都知道该如何处理了。
  • 很多软件开发人员,特别是那些自以为是的开发人员,都认为自己的能力在同行和上司眼中是不证自明的。他们可以自然地将这个谎言掩藏于虚构的道德逻辑中:不显示自己的能力,是因为自己过于谦虚,炫耀自己的能力会像是阿谀奉承。有自尊心的程序员是不会在老板面前讨好卖乖的。
  • 隐藏你的能力都是非常愚蠢的。
  • 如果一个人完成了一件非常漂亮的工作,却没有人知道,那在这个经理的眼中,这事情就等同于从未发生过。这听起来可能有些残酷,但是站在公司的角度上,这是有道理的。
  • 市场宣传更为重要。在职场中,也不要忘记这一金科玉律。
  • 目标有两个:让别人知道你的存在,以及让他们知道,当他们碰到难题时,你是那个可以解决解决问题的人。
  • 你的工作也是同样的道理。如果你非常出色,但并没有人知道,那你真的优秀吗?谁会在意?没有人会在意。
  • 绩效考核永远都不会不会是客观的。
  • 对知识型工作者的能力以及他们的工作质量进行客观的评价是根本不可能的。
  • 在人际交往关系中,你要弄清楚哪一因素对哪一种关系圈是重要的,这样你就可以给你周围的人留下可靠的感觉。想一想办公室里与你有着不同关系的人。
  • 开始记录开发日记。每天写一点,记录你做了什么工作,解释你的设计决定,检查棘手的技术和专业决策。即使你自己是第一位读者(或者是唯一的读者——这由你自己决定),也要注意写作的质量,和能够清楚表达想法的能力。时不时地回头阅读之前的日记,评论它们。通过你对之前日记的喜好,来调整你的新记录
  • 要与人打交道。你必须要记住人类的天性是喜欢与人一起工作——不是和语音信息、邮件和即时消息一起工作。
  • 打电话给你的老板和同事的时候,要拿起听筒,而不是使用扬声器。也不要依赖定期会议。你需要去模仿那种在喝咖啡的休息时间进行的自然交谈,就像你和他们在同一个地方工作的时候一样,所以给即兴对话留出时间。时不时时不时地,营造出私人对话的感觉。以“今天过得怎么样?”开头,接着问“你周末通常都做什么?”尝试去了解你的同事。这样做,不仅可以牢固你在公司的地位,也会让生活变得更加丰富多彩。
  • 商业本身关注的是结果,经营者关注的也是结果。所以,如果不使用行业语言来推销你的成就是起不到作用的。
  • 罗列出你近期完成的工作,并写出每项工作的商业意义。
  • 记录下工作中你亲眼看到过的改变。想想哪些同事是带着任务在工作,哪些同事是最努力最有效率的。他们的任务是什么?你能想到这些任务中哪些哪些是不合适的吗?努力和狂热的界限是什么?你的同事中有没有人越过了这条线呢?
  • 每天,从这个列表中找一个话题来撰写文章。不要过多的思考,就是写一遍关于这个观点的文章,然后在网络日志中发表。在文章中加入其他网络日志中相关文章的链接。每天挑选话题的时候,可以任意向此列表中增加新的想法。
  • 三周后,挑选出你最喜欢的两篇文章,提交到类似Digg和Reddit这类由用户审查文章的网站上。如果你的列表中还有未撰写成文章的想法,那就继续写。
  • 开源社区是全球性的人际关系网络,这些人搜索程序的时候,可能刚好就搜到了你的软件,然后安装了它,并开始使用。这样,他们就会知道你的存在,随着越来越多的人使用你开发的软件,你的名字和名声也会随之传播开来。这就是市场化。这就是你所期待的。
  • 发布成功的开源软件、写书和撰写文章以及在研讨会上演讲都可能会提高你变得卓越的能力。
  • 可以撰写一本关于此科目的书籍。可以编写一个代码生成器,使以往需要一个星期才能完成的工作缩短为5分钟。不仅不仅要得到同事的尊重,还要通过研讨小组或者专题讨论会使自己成为城市中公认的某一种技术的专家。把以前从未有过的想法放到下一个项目中。
  • 仅仅做人群中最好的是不够的。要成为人们谈论的焦点。
  • 挑选出你最喜欢的软件,并给它的开发者写一封邮件。邮件一开始先要感谢他开发了这个软件,接着提出建议、问题或者其他可以与他建立联系的尝试。请他对你的邮件做出回复。如果这一软件是免费或者是开源的,主动提议来帮忙。
  • 在你生活的城市里,找一位你敬仰的或者愿意向他学习的人。找一个可以碰到这个人的机会(用户小组会议或者演讲会上都有很大的可能性),主动开始与他交谈,即使这样做会让你感到不舒服。事实上,正是因为这样做会让你感到不舒服,所以你才要迈出这一步。
  • 有一个令人沮丧的现实——我们辛辛苦苦学到的技术知识比一辆新的雪佛兰轿车贬值得速度还要快。今天热门的技术到明天就有可能成为过时的垃圾了。
  • 将你正在以当前技术做的项目,用新技术来做出新的原型版本,来理解它们的不同之处,以及新技术能够做些什么。
  • 有哪些不同的角色是你从没考虑过要尝试的。把这些角色罗列出来,并尝试每天以其中一种身份来工作,看看自己是否适合。你可能看不出工作结果有什么不同,但是你会发现你工作的方式发生了变化。
  • 不要关注结果,要关注做事情的过程。
  • 做出蓝图之前,先画出你曾经所处的位置,这会对你制作新的蓝图起到鼓励和启发的作用。清楚地列出你职业发展的时间表,标注出你从哪里开始,以及在每一阶段你的技术和工作是什么。注意在哪一个阶段你在持续进步,又在哪一个阶段取得了重大进展。注意你每一次取得重大进步的平均时间是多长。当你展望职业发展的时候,把这份蓝图作为参考。清楚地了解过去取得的进步,可以帮助你制定出更加实际的目标。制作出历史蓝图之后,要不断更新。当你不断向新目标前进的时候,这种方法可以很好地反映你的进步。
  • 技术达人是指那些总是站在技术最前端的人,至少在他们感兴趣的领域中他们总是走在尖端。通过我的观察,Tim的意思是说如果你能找到这类人,观察他们热衷于什么,那你就能够大致了解到什么技术将会成为热门,或者预测出两年后的热门是什么。这招非常灵。
  • 做一次360度评估。想想哪些人是你可以信赖的,并且你可以非常自在地请他们给出对你的评价。列出人名单。这一名单内最好要包括你的同事、客户、上司和下属(如果你有下属)。再列举出你认为作为专业人士需要具备的10项重要特征作为衡量标准。将这个列表转化成一份调查问卷。在这份调查问卷上,一定要包含下面这个问题要求参与者按每项特征对你做出评分。最后再加一个问题:“我还应该问哪些问题?”将调查问卷发放给你列表中的人。要求他们以批判的角度对你做出建设性的评价。你需要的是诚实的评价——不是糖衣药片。当你得到回馈之后,仔细阅读每一份调查问卷,并依此制定出下一步行动计划。如果你向正确的人询问了正确的问题,那么你会得到一些能够付诸实践的回馈。与你的评价者共同分享这些结果——不是分享他们给出的答案,而是你根据这些答案做出的行动计划。记得要向他们致谢。定期重复这一过程。
  • 开始记日志。可以是网络日志,就像我们在第4章第39节中所讨论的,或者写日记也行。记录你在做什么工作,在学习什么以及你对这个行业的一些观点。
  • 坚持记录一段时间之后,回顾前面的记录,现在你仍然同意当时的想法吗?那些想法现在看起来幼稚吗?你改变了多少?
  • 当你过于坚信某事的价值时,就会无法客观地来评判它,这即是价值僵固。
  • 如果你认定的事实的相反方面是正确的呢?请你诚实地向你认定的每一项事实发起挑战。这就是你自己弱项的列表。
  • 了解你的敌人——找出你最讨厌的技术,并用它来完成一个项目。最坏的结果是,做这个项目让你实践了一把,你也有了更好的证据来捍卫你的观点。
  • 每当我遇到复杂的问题时,以一种容许反复改变的方式来解决问题会减轻压力,使我的工作更具效率。
  • 树立远大的目标,但是要在实现目标的道路上,根据情况不断进行更正。从实践中学习,不断改变你的目标。最终,我们都想让客户满意(特别是当制定自己的职业规划时,我们就是自己的客户)。
  • 秘密就在于无论你要改进的是什么,注意今天与昨天相比,是不是取得了进步。就是这样。这很容易。
  • 如果在改善自己的道路上,每一天都比昨天多做出一点改变,你就会发现——拥有卓越的职业生涯——这个目标变得越来越容易达成,而不再像汪洋大海一样没有边际。
  • 公司的层层组织架构降低了运营风险,却也因此降低了工作效率。如果你可以隐藏在平庸的盾牌之后,就会丧失变得卓越的动力。即使是像我们这样的人,也无法抵挡YouTube或者我们最爱的网络漫画①的诱惑力。
  • 如果你筋疲力尽,大公司是个不错的选择。但是如果你在为了成就卓越的自我而奋斗(你正是在这么做!),那么大公司可不是个正确的选择,就像如果你正在努力甩掉腰间的赘肉,那绝对不能去蛋糕店工作。解决方法是什么?学着独立!
  • 成为一名独立的承包商还会迫使你学习如何推销自己,同时在你专注的领域和技术中检验你的选择。在大公司里工作的时候,都是别人分配工作给你。但是当你独立承担工作的时候,就不能等着客户主动来找你。你必须要走出去,主动去找客户。一旦你找到了客户,你还必须要说服他们,让他们相信你的价值。
  • 在刚成立的小公司工作,可以一箭双雕:一份全职带薪工作和直接对工作失败负责的挑战。
  • 所以,有什么东西是令你真正好奇的呢?试着跟随着自己的兴趣,看看会发生什么?结果或许会让你大吃一惊!
  • 你可能已经选择过很多职业发展道路,但是软件开发这条路非常令人振奋。它富有创造力;它需要深刻地思考。作为回馈,它让你觉得你能做到的事情是别人想都没想过的。我们可能会担心如何向更高的阶段进步,如何制造影响或者得到同行的尊重,但是如果你抛开这一切,会发现我们已经做得非常出色了。
  • 最后,就我自己的软件开发职业道路来看,最重要的一点不是你以什么为生或者你得到了什么,重要的是你如何接受这一切。这是一种心理活动。满足,就像我们的职业选择,是应该去追寻并且认真选择决定的。