【书摘】我编程,我快乐

只会编程是不够的,在思维上投资,学习行业是如何运转的,练习,练习,再练习。


供应和需求

Web设计师行业的历史发展证明了一个众所周知的经济规律——供求规律。提到供求,大多数人都会想到一件商品的价值是多少,应该卖多少钱。如果市场上这种商品供大于求,价格就会下降;如果供小于求,那么价格就会上涨。

不要在价格上竞争,你承受不起。You can’t compete on price. In fact, you can’t afford to compete on price.

发现市场上的不平衡。Exploit market imbalances.

从供求规律中,我们可以学到重要的一点——需求的增长会加剧价格的竞争。如果只想做稳定可靠的工作,并且跟随着工作发展,那么你就会卷入与国外开发人员的价格竞争中,因为你的技术决定了你只能进入平衡的外包市场。如果在主流技术市场中竞争,你就必须在更高层面上竞争,否则,你就要去发现市场上的不平衡,找到外包公司无能为力的工作。这两种情况,你都必须找到工作的动力,提高自身的技术和灵敏度来应对一切变化。

研究当今技术市场的需求。利用招聘广告和招聘网站找出哪些工作是高需求,哪些是低需求的。登陆外包公司的网站(如果你在这些公司工作,可以直接与员工交流),把这些公司的技术与你发现的高需求工作进行比较。记录下那些在国内市场中高需求且没有流到外包市场的技术。然后再将这些外包公司的技术与前沿科技相比较。密切关注外包公司还没有涉足的上述两类技术。思考它们需要多长时间才能为相应的市场提供服务。这个时间差就是市场不平衡的阶段。

只会编程是不够的

只思考在哪种技术上投资是不够的。毕竟,技术只是一种商品。你不可能只掌握一种编程语言,或者只能够操作某种系统,然后把生意交给老板打理。如果他们只想找个懂代码的机器人,那不如雇个外国廉价的程序员。如果你想站稳脚跟,必须要深入了解你所处的领域。事实上,软件工程师不能只会开发软件,应该要成为这个业务领域的专家

或许你只是一个程序员,但是如果你能用客户所处行业的专业语言与他们交流,那这就是一项非常重要的技能。就像如果与你工作的人都真正了解软件开发是怎么回事,你会不会觉得一切都会变得更加得心应手呢?你再也不用向他们解释为什么不能在Web应用程序中的一个页面上返回30 000条记录,或者解释为什么他们不能向开发服务器发送链接。你的客户也有同感。换位思考一下,如果你是客户,为你服务的程序员了解你的行业,不用什么都得由你来做决定,你也不用紧张担心哪个小细节会出问题,你会不会觉得工作起来更容易呢?你从事的行业也是这样。

仔细思考在哪个商业领域投入时间。Now is the time to think about business domains you invest your time in.

做团队中最差的

爵士乐的传奇人物,爵士乐吉他手Pat Metheny给年轻音乐演奏者提出了一条建议——“做乐队中最差的乐手。”

做乐队中最差的乐手。Be the worst guy in every band you’re in.

进入IT这行之前,我是一名专业爵士和蓝调布鲁斯萨克斯风演奏者。作为一名乐器演奏者,我很幸运地早早就学到了这个道理并且一直坚持这么做。做乐队中最差的乐手意味着你总是在与比你优秀的人一起演奏。

所以我认识到人们会取得很大的进步或者退步,仅仅是因为与他们合作的人不同了。与一个团队合作的时间长了,会对自身的能力产生持久的影响。

你身边的人会对你产生很大的影响,明智地选择你的圈子。The people around you affect your own performance. Choose your crowd wisely.

试图做一个团队里最差的人可以让你不再小看自己。可能你的能力应该是在甲等乐团演出,但你自己却认为自己属于乙等乐团,这都是因为你恐惧。清楚地知道自己不是最好的,就不会总担心被人发现你不是那么优秀。事实上,即使你在尝试做那个最差的,也并不意味着你就是最差的。

在思维上投资

比起那些经验单一的候选人,我们更倾向于那些具有丰富经验的候选人。我认为优秀的程序员之所以寻找变化和多样性的工作,是因为他们喜欢学习新东西,或者是因为他们很清楚要想成为更加成熟、更加全面的程序员,就必须去学习新的技术、在新的环境下工作,获取新的经验。

作为招聘经理,我认为判断你适合不适合一个职位的首要因素就是你是否对这行感兴趣。如果我知道你为了自身发展,或者更理想的是,你单纯因为兴趣而学习新的东西,我就会知道你热爱你的职业,把你的职业视为动力。当我问候选人有没有用过某种非主流的技术时,最不愿意听到的答案就是“没有人给我机会使用”。没有机会?从来也没有人主动给我提供过这种机会啊!机会是要自己争取的。

没人给过我机会……?要学会抓住机遇!I haven’t been given the opportunity…? Seize the opportunity!

不要听从父母

另外一个决定职业规划的因素是跳槽,父母也不会赞成这个观点。一个成熟的职业软件开发人员需要从各个角度了解这个行业:产品开发、IT支持、内部业务系统开发以及管理工作。作为软件开发人员,你看到的角度越多,攻克的技术难题越多,就意味着你越有足够的能力来面对艰难项目。对一个程序员来说,只在一个公司工作,加强单一业务技能,会局限职业发展。“铁饭碗”的时代已经不复存在了。以前,这种进入某个公司并为其服务终身的行为被看作是一种奉献。但现在这是一种障碍。如果你只在一个公司工作过,只看到了一种系统,那么当那些明智的经理决定是否要雇用你的时候,它就成为了一个不利因素。就我个人而言,比起那些只知道一种做事方法的人来说,我更愿意聘请在不同的环境中经历过成功与失败的人。

我曾经和一个朋友提起过想换个公司,他却说:“没准你下半辈子注定要在大公司工作。”上帝,不要啊!于是我马上找到了一份新的工作,离开了原来的公司。这也是我在软件界走向成功的标志性起点。我看到了以前从来没有见过的领域,我开始应对更难的问题,我得到的回报比以往任何时候都多。刚开始我确实有点害怕,但是当我改变了出于担心的保守职业规划后,我的事业和我的生活都变得更加美好了。

在职业道路上,需要一些有目的性的冒险。别让恐惧征服了你。如果在工作中没有感到乐趣,那你就不可能出色地工作。

做一名通才

如果你想在这个行业站稳脚跟,那我建议你要成为通才。如果你害怕你的部门裁员,那你就该知道精简团队的时候,一个只会测试或者只会编码的人肯定会被裁掉的。如果你就是单纯地想要卓越,那更好,你要动动脑筋掌握大局。

通才很少,所以很珍贵。Generalists are rare… and, therefore, precious.

首先,你可以选择成为一名团队负责人、经理、技术人员,或者一名架构师、程序员、测试员。很多人都不明白能够适应和胜任不同角色的价值所在。例如,一名强大的团队领导者应该尽力成为多面手。现在国内的编程团队十分精简,团队领导应该既能领导团队做项目,又能在外包团队偷懒的时候,卷起袖子亲自修复紧急严重的漏洞。软件架构师也一样,他要是再能写一些代码,那可能会大幅度地提高整个项目的进程。当工作要跨越职业阶梯的等级时,人们不是不愿意去做,而是没有能力去做。程序员不会领导团队,团队领导人不懂编程。能够把两样做得都很好的人,太稀有了。

你的技术水平应该超越技术平台。Your skills should transcend technology platforms.

成为一名专家

很多人认为专攻某种技术就简单地意味着不知道其他技术。Too many of us seem to believe that specializing in something simply means not knowing about other things.

那么,在软件界,什么样的人才能称得上是专业人士呢?我在招聘的时候找遍了每一个角落,寻找真正深刻了解Java编程和部署环境的人。我想要寻找的人是已经处理过我们工作中可能遇到的80%的问题,并且拥有足够的知识来应付另外还未出现的20%的问题。我需要的人是不仅可以处理高水平的抽象,同时应该了解那些实现高端抽象的低端细节。我需要那些可以解决部署问题的人,或者如果他们解决不了,至少应该知道找谁来帮忙的人。

不管你使用的编程语言是不是依赖虚拟机,花点时间学习编写源文件。你敲打出来的代码是如何从可阅读的文本转变成可被计算机执行的命令的?编写你自己的编译程序又意味着什么?

当你输入或使用外部函数库时,它们是从哪里来的?输入一个外部函数库到底意味着什么?你的编译程序、操作系统或者虚拟机是如何将多个代码段连接起来,形成一个连贯系统的?

切忌孤注一掷

以特定技术厂商为中心的观点,缺乏远见。Vendor-centric views are typically myopic.

供应商的软件实施细节是秘密的,导致以特定技术厂商为中心的观点不能成立。你对某一个软件了解得再多,也会遇到专业服务障碍。

热爱它,不然就离开它

工作,因为你无法停止工作。Work because you couldn’t not work.

一门技术或者一个商业领域可能会使你感到兴奋;相反,或许是某一特定技术或者商业领域拖累了你。也许你更适合一个小团队或者大团队,而你处在不合适自己的组织里;或者是在挑选偏呆板和偏灵活的程序上出了差错。不管是什么原因,想想自己到底适合什么。短时间内你可能可以伪装,但是缺少热情总会影响你自己和你的工作。

但有一点我可以肯定,我是一个机会主义者。当某事引起了我的兴趣,让我感动兴奋,我会立刻奔向它,不惜一切努力使之成功。通常这都需要学习新的技术,开发新的潜能。有人会觉得学习新东西是缓慢费力的过程,但是我喜欢学习新事物。毕竟,新技术可以让你展开新的工作。我永远不会用自己的技术来定位自己,而是用我已经做过的和我将要做的事情来定位自己。技术只是一种做事的方法

学习钓鱼

要主动问,不要等着别人来告诉你!Don’t wait to be told.Ask!

如何与为什么?——在你读书或者工作的时候,想一想工作中你不完全懂的问题。你可以问自己这两个问题:它是如何工作的?为什么会发生这种情况?对这两个问题,你可能给不出答案,但是只要你问了,就会形成一种新的思维模式,也使你更加关注自己的工作环境。

学习行业是如何运转的

不管你在哪一个行业工作——制造业、医疗部门、公益机构或者教育系统都是一个行业。行业本身就是一门你必须要学习的知识。

我记得当我还是一个年轻的程序员时,参加一个员工会议。我呆滞地盯着一位公司的高管,他向我们展示着一组又一组的数据图表。我永远也不会直接与这位高管共事,他所展示的数据与我完全没有关系。我低声嘀咕着“我就想回到办公桌前,完成我手头上的应用程序功能。”我的团队成员们坐在一起,就像是长途旅行车上局促不安的孩子。我们没人关心会议内容,根本不知道为什么叫我们来参加这个会议。我们责怪这个无能的经理召开这个会议,浪费我们的时间。

只有了解了一个行业后,你才能创造性地有所建树。You can’t creatively help a business until you know how it works

现在回想起来,我才知道我们当时是多么无知。我们来这个公司工作,目的就是为它赚钱或者省钱,但我们根本就不懂这行是怎么赚钱的。更糟糕的是,我们根本就不认为这是我们应该知道的知识。作为程序员和系统管理员,我们认为自己正在做的工作就是我们应该做的。但是,如果连这行是怎么赚钱的都不知道,又怎么能创造性地帮助公司赚取利润呢?

  1. 通读一本基础商业教程,一本MBA教程是不错的选择。我推荐一本非常有用的书The Ten-Day MBA[Sil99]。你真的可以在10天内读完,占用不了多少时间。
  2. 找一个人带你到公司的财务部门看看,并请他们向你讲解财务状况(如果你的公司不介意与员工分享这些信息)。
  3. 听完财务状况讲解后,再向他们复述。
  4. 弄明白为什么“账本底线”要被称为“账本底线”。

寻找良师

可以依赖别人,但要确保这个人是靠得住的。It’s OK to depend on someone. Just make sure it’s the right person.

一名良师最首要也是最重要的任务就是做一个榜样。直到亲眼见识到某人突破你所熟悉的极限时,你才知道什么才是一切皆有可能。榜样的作用就是定义何为“好”。

良师还可以将你的学习过程形成体系。在上一章中,我们说过选择在哪种技术和行业领域中投资时,你会有很多的选择。有时候,太多的选择会让你不知所措。按常理说,前进总比静止不动要好得多。良师可以帮助你削减这些选择,避免你白费精力。

良师还是值得信任的朋友,他们可以观察并判断你做出的决定和取得的进步。如果你是一名程序员,你可以把你的代码拿给他们看询问他们的意见。如果你计划在公司或者本地用户组会议上做一次演示,你可以先在良师面前做一次演示,从他们那里得到回馈。良师是值得你信赖的人,你甚至可以问他们:“作为职业程序员来说,我与其他人有什么不同?”你知道他们不仅会帮你分析,还会帮助你取得进步。

指导自己——我们都希望有人主动来教我们,但事实是我们很难在自己周围找到这么个人。所以要学会自己做自己的良师。想想在你工作的领域中你最钦佩谁。大多数人在不同阶段都会有一个名单。这个人可能是工作中的同事,或者你很欣赏这个人做出的某项成果。列出这个榜样的10种特性,这些特性必须都是视他为榜样的理由。这些特性可能是某一特定的技术方面,比如技术广度或者某一特定领域的知识深度。或者是他们的某种人格魅力,比如他们是很好的团队协调者,或者他们的言辞总是具有吸引力。

做一名良师

要想真正学点东西,可以试试向别人传授这些知识。清楚知道自己是否对某一知识真正理解的最好的办法就是把你的理解讲给别人听,让他们明白。这个简单的方法是公认的帮助你理清思绪的灵丹妙药。在软件开发这行,大家都知道软件开发师经常会对着宠物或者什么无生命的物体讲述如何解决一个问题。

想要弄明白自己是不是真正懂得某一知识,那就把它讲给其他人听。To find out whether you really know something, try teaching it to someone else.

Marin Fowler曾经在班加罗尔的一次开发师讲座上说,当他想要真正学懂一些知识的时候,就把它们写出来。Marin Fowler是著名的软件开发师和作家。如果我们把他当成是一名作家,远程传授知识,那他就是这个行业中最负盛名、最有影响力的老师。

做导师不会下岗。Mentors tend not to get laid off.

不应该低估帮助别人的感觉——那感觉棒极了!如果你能随时想着别人的利益,那这就是你在用你的技术来帮助别人。当今的经济环境很不稳定,帮助别人这项工作是不会使你下岗的,而且这份工作带给你的收入是不会随着通货膨胀而贬值的

寻找学生的方法不是你声称自己是权威,而是使自己具备真才实学并且有耐心愿意与别人分享你的知识。如果你并不是某方面的绝对权威,也不要惊慌。有时候你只需要具备某方面的经验,然后去帮助那些比你经验少的人。想想看自己有没有这样的机会去帮助别人。

无需去建立一个正式的师生关系,就从帮助别人开始,好处会自然而然随之而来。

练习,练习,再练习

当你在练习的时候,演奏出来音乐或许总是难听的。如果你在练习的时候,总能演奏出悦耳的音符,那就证明你一直无法突破自己的极限。这就是练习的意义所在。运动也是一个道理。运动员在训练的时候总是将自己推到极限处,这样他们才能在比赛中突破自己的极限。他们让丑陋的东西都暴露在平时的练习中——而不是真正的比赛中。

在计算机这行,经常会有开发师突破自己取得进步。但是,很多时候都是因为他们本来就不胜任自己正在做的工作。我们这个行业习惯于在工作中练习

在极限处练习。Practice at your limits.

那对于我们软件开发师来说,这些基础练习又是什么呢?那些初级编程语言中,有没有你基本不怎么使用的?比如,你选择的编程语言支持正则表达吗?在很多的编程环境中,正则表达式非常强大但却很少被使用。大多数开发员即使可以用到它,也不去使用,因为他们的技术没达到那个水平。结果,创造出了很多不必要的字符串解析编码,并且不得不延续使用。

这条规则也同样适用于API和库。乐手们常说,对于技术,你要是没达到手到擒来的地步,那它们真能帮到你的时候你也想不起来它们。这就需要尝试深入研究,比如,在你选择的编程环境中,多线程编程是如何工作的。或者stream库、网络编程API,甚至是一切可用的处理集合和列表的工具。大部分现代编程语言都提供了丰富和强大的库,但是软件开发师们只学习了其中的一小部分子集。如果他们掌握了如何使用一整套工具,那么编程的效率就会提高很多。

作为软件开发师,视奏又是什么呢?是需求规格,还是设计?开源社区是找到用来练习的代码的绝佳场所。有没有哪个开源软件是你最喜欢的?你可以给它加个功能。挑选一个你想要用来练习的软件,浏览它的待办事项,给你自己规定时间来实现这个新的功能(或者至少决定要实现这个功能需要哪些步骤)。选择好功能之后,下载源代码然后开始开发。怎么知道要看哪里?有什么好方法在一组重要的代码中理出头绪?又要从哪里开始呢?

你可以经常进行这种练习,而且这种练习的周期不会持续很长。你并不一定要去实现这个功能,就把它当做是一个开始,练习真正的目的是以最快速度读懂你正在看的代码。但是一定要确保这个软件与你平时工作时使用的软件不同。要寻找不同风格、不同编程语言的软件进行练习。记录下是如何使整个过程增加或者降低难度。你使用了哪些方法帮助你理解这些代码?面对复杂的函数层次,你是以什么为线索,让调用栈有迹可循,带领自己穿梭其间呢?

训练思维敏捷和提高即兴编码技术的好方法是通过自我限制的方式来练习。选择一个简单的程序,试着来限制你的编程过程。

Topcoder——Topcoder.com是一个很早就存在的编程竞技网站。你可以注册然后通过线上竞赛赢得奖励。就算你对竞争没兴趣,Topcoder还为你提供了一个练习室,里面有很多可以练习的问题。现在就去注册尝试一下吧。

Code Kata——Dave Thomas是《程序员修炼之道》的作者之一,他接受编程练习这个想法,并使之实用化。他创造了一系列的很小却深具启发性的练习,被称之为Code Kata,程序员可以使用他们选择的编程语言来做这些练习。每一个Kata都针对某一特定技术或者思考过程,这样程序员的思维就可以更加灵活。

这本书的印刷过程中,Dave已经创造出了21个Kata,你可以在他的博客上免费使用(http://codekata.pragprog.com/)。在这个博客上,你还可以看到通讯名单的链接,以及别人解决这个问题的方法和相关讨论。你的挑战:练习这21个Kata,并撰写使用Kata练习的日记(或者是博客)。当你完成这21个Kata后,开发你自己的Kata,并与别人分享。

做事的方法

想要拥有自己的步骤,那就执行它。If you want to feel you own a process, help implement it.

你工作的环境中,步骤也有可能是由上级传达下来的。当这个文件到达开发团队,可能已经变了味,或者被重新解释成了新的模样。像中国的一个游戏“耳边传话”,要传递

选择一个软件开发方法论,并且挑选一本有关此方法论的书,登陆相关网站,加入一个讨论此问题的联络组。从批判的角度来研究此方法论。此方法论的优势和弱点在哪里?在你的工作中,执行它的障碍是什么?研究完一个,再换一个继续研究。对比他们的优势和弱点,想一想如何能把它们结合起来。

站在巨人的肩膀上

作为爵士乐手,我会花大量的时间听音乐。我听音乐,不只是在阅读或者开车的时候把它当做背景音乐,而是真正在聆听。如果爵士即兴创作就是演奏你听到的琴弦拨动出的乐曲,那么认真听音乐是一种非常重要的灵感源泉,也可以帮助你判断什么是可行的,什么是不可行的;什么是出色的,什么是一般的。

从现有程序中得到领悟。Mine existing code for insights.

爵士唱片的丰富历史是一套惊人的知识

这方面讲,软件设计和编程与音乐是相同的。我们可以从大量的现有程序中寻找模式和技巧。设计模式运动(见Design Patterns[GHJV95])关注可重复使用解决软件开发问题的方法。设计模式使现存程序的研究正式化,使大量专业软件工程师得以进行这项工作。但设计模式也只是我们读程序编码的时候可供使用的知识中的一个小子集。

用现有程序来反思自己的程序。Use existing code to reflect on your own capabilities.

阅读这些程序的另一个作用就是能让你知道哪些方法是已经存在的。当你碰到一个待解决的问题时,你可能会记起曾经在处理这样或者那样的项目时,看到一个执行MIME类型的库。如果这个方法是正确的,那你就会因为使用已经存在的方法而节省了很多时间,同时也为你的公司节省了开支。当你意识到在软件这个行业中,正因为我们一遍又一遍地重复发明轮子(发明这个词用在这里太笼统了)而浪费了多少金钱时,你会大吃一惊。

选择一个项目,像读书一样研读并且做笔记。归纳出好的方面和坏的方面。发表一篇评论。至少找到一个你可以借鉴的技巧或者模式。再找到至少一处缺点,提醒自己在开发软件的时候不要犯这类错误。

在工作中,将自己自动化

挑选一个你经常重复做的工作,为它编写一个代码生成器。从简单的部分做起。不要管这个代码生成器的重复使用率,只确保这个代码生成器可以节省你的时间。想办法提高生成代码的抽象等级。

研究模型驱动架构(MDA)。尝试一些可以使用的工具。看看工作中哪里可以使用MDA概念。想想如何用你日常使用的工具来应用MDA概念。

就是现在

就现在,我们能做些什么?What can we do? Right Now?

读心术

但Rao真正的出色之处在于他做的准备工作。他有一种神秘的能力能预测出你要让他做什么,而这些事情甚至连你自己都没想到呢,他就像变魔术一样。我甚至指责过他跟我耍过什么花样,但是这不太可能。比如我说:“Rao,我一直在考虑改变在应用程序框架中封装控制器的方式。如果我们做一点改变,它就能被应用程序使用而不是被网络应用程序使用。你觉得呢?”

他会回答:“我已经做完了。你看,已经在版本控制中检测过了。”

这种事经常在他身上发生,如果说这是巧合,那只能说Rao认真对待我们这个团队所维护的每一个软件,正在做所有可以想到的、与之相关工作。

读心术用得好,人们就会信任你。The mind-reading trick, if done well, leads to people depending on you.

每日成绩

每天都有可汇报的成绩。Have an accomplishment to report every day.

制定目标(每日、每周或者无论什么你能做到的)并且记录下可以彻底改变你工作中表现的工作内容(如图3-1所示)。当你开始追寻骄人的业绩时,你自然而然地就会根据你工作领域的商业价值,对你的行为做出评价,将工作划分优先顺序。

经常记录工作成绩可以确保你不会停滞不前:如果你规定自己每天都要做出一点成绩,那你肯定不能花两个星期的时间精心策划某个“完美”任务。这种思维方法和工作会成为一种习惯。就像一个对单元测试包里绿色横棒(表示测试通过)上瘾的开发人员一样,如果你没能完成今天的成绩,你就会浑身不自在。

留出半小时时间,拿一支铅笔和一张纸坐在一个安静无人打扰的地方。想想每天你的团队都在忍受的那些吹毛求疵的小问题。把它们写下来。哪些烦人的任务每天都要耽误整个团队好几分钟的时间去讨论,却没人有时间或精力来完成这些任务?

你现在做的项目中,哪些工作是可以自动完成,而你却在手动完成?记录下来。你来构造或者部署一个过程如何?你可以解决哪些问题?又将如何增加成功率呢?记录下这些想法。

别忘了你在为谁工作

经理的成功,就是你们的成功。Your managers’ successes are your successes.

如果说经理的工作是了解和设定工作的优先顺序,而不是亲自去做所有的工作,那么你的工作内容就是去做这些具体工作。你并不是在帮经理做他的工作,而是做自己份内的事情。

你可能担心经理会把你的功劳据为己有,但别忘了你的职业发展前景把握在你经理的手中(至少,在你现在工作的公司中)。在大部分公司中,直接总管负责绩效考核、工资、奖金和升职。所以,你的功劳最终还是在你的经理那里折现了。

计划一次与经理的会面,目的是了解经理对整个团队下个月、下季度及来年的目标。问问他你能做些什么。会面之后,检查自己的日常工作是否与这个团队目标一致。以这些目标来决定你工作的动向。以这些目标为基础,把你的工作排出先后顺序。

安分守己

作为经理,我可以告诉你最棘手的事情就是有个总是想要往上爬的雇员。每次和他一起吃午饭,都会听他说又有谁升职了。这种人总会在办公室里散播点小道消息,死死盯着企业政治,就像对肥皂剧对白一样沉迷。他愤愤不平地完成每天的任务,无休止地抱怨领导部门的无能,总觉得要是自己来做领导工作,肯定能做得更好。还会认为领导们没有发现的他的潜质,是因为他们都太无能了。

这种人认为许多任务根本就不配他来出手做。遇到这些工作的时候,他能躲就躲;实在躲不了的时候也是极不情愿(而且很慢)地去做。他对工作精挑细选,有时候会下意识地挑选那些自认为配得上自己的水平,并且能帮助他实现晋升目标的工作。

要有雄心,但不必路人皆知。Be ambitious, but don’t wear it on your sleeve.

当然不可能。他工作平平,态度还不端正。就算他真的有很大的潜质,又能怎么样?当下,他并没有展现他可能拥有的资质。公司不是靠可能性来挣钱的。如果不能符合股东们的潜在设想,他们是不会继续投资。而且,就因为他这种不端正的工作态度,他的经理也不会再想培养他。

专注于现在的工作,你就会享受日常工作中的每一个小成功:你工作干得很出色,当出现难题的时候,你就会被人当做专家一样请来解决这个问题。在一个具有凝聚力的团队中,你会成为不可或缺的一员。这种感觉都会让你感到喜悦。但如果你总是头脑不清醒,做白日梦,那就会错失这些成功的喜悦。你会一直在等待那个巨大的成功,却无视每天工作中的那些小成功,但其实正是这些小成功赋予你工作的价值。

专注于现在的工作,不仅会让你更加快乐,也会让你身边的人更加快乐。你的同事、上司和客户都能感觉到。你的工作成绩会反映出你的态度。客观地来讲,放弃你想要成功的期望可以提高你的能力,让你走向成功。

今天我能把工作做到多好?

你能为工作增添多少乐趣?How much more fun could you make your job?

你能把一份无聊的工作变得有趣吗?如果你倒过来看这个问题,答案就会是显而易见的。你为什么会觉得这份工作无聊?为什么不能从一开始就觉得它是有趣的呢?你喜欢的工作和憎恶的工作之间有什么不同?

那么,在每天的工作中我们又如何挑战自己,发挥创造力来应对这些平凡的工作呢(我们80%的时间都是在做这些工作)?试试把这些无聊的工作做到100分,感觉怎么样?比如,你讨厌做单元测试热爱编程,但不得不去写自动化测试代码,这让你感到十分厌烦。那你可以努力让你的测试做到完美。这样的目标,会让你在工作中有怎样的改变?对于单元测试这个环节来说,怎样才称得上是完美?这和测试覆盖率有关。完美的测试覆盖率是指所有实码的功能都能测到。完美的单元测试同时也是无暇的、可维护的,并且,对于那些无法在另一台计算机上复制的外界因素,它也不会过多地依赖。只要在一台新机器上通过版本控制系统签出后,这些测试应该能直接运行。当然,所有这些测试都应该100%的通过。

明天就试试看,问问你自己,“我今天能把工作做到多好?”你发现你会更喜欢自己的工作,你的工作也会喜欢上你。

与你的同事展开竞赛,竞赛的内容就是这些无聊的工作任务,看看谁能把这些工作做到最好。如果不喜欢单元测试,那就看看你每天都要接触到的代码,将其中测试断言的总数打印出来,把它钉在办公桌隔断板上。再为整个团队布置一个记分板,获胜的人就能得到某种权利甚至是奖金。在项目结束后,获胜的人可以在接下来的一周内,把乏味的工作分配给团队中其他成员去做。

你的价值是多少

问自己“今天实现自己的价值了么?”Ask, “Was I worth it today?”

一桶水中的鹅卵石

对公司来说,你就像一桶水里的一块鹅卵石。当然,因为有这块鹅卵石在,水平面线会上升一点儿。你完成工作,做好本分。但是,如果你把这块鹅卵石从水中拿起来,然后再观察这桶水有什么变化——你基本上是看不到变化的。

我从这名信息主管那却得到了这样一条建议——永远不要高枕无忧,他一遍又一遍地重复这句话。他说自己每天早上起来都会提醒自己要清楚地知道说不定哪天自己就被公司解雇了。他会说,可能就是今天。

小心!别让成功冲昏了头脑。Beware of being blinded by your own success.

这是他的观点。谦逊不仅仅是我们需要发扬的一种美德。谦逊能让你更加清楚地审视自己的行为。这名信息主

越是成功,就越有可能犯下重大错误。当你得到很多肯定的时候,你就会很少质疑自己的决定。你使用的方法屡试不爽时,你可能就会忽视可能会有更好的方法。你开始变得傲慢。人一旦傲慢,就会产生盲点。越认为自己无可取代,就越有可能被别人取代(你在公司存在的意义也就越小)。

感觉自己无可替代是一个不好的征兆,特别是对软件开发人员来说。如果你是不可取代的,这或许只是意味着你做工作的方式和别人不一样。尽管我们都希望自己有某种特殊的天赋,但是基本上没有一名软件开发师是无与伦比、盖世无双、无可替代的。

这样说来,想要让自己不可替代,就要建立一种友好的工作关系。我们每个人都不是不可替代的。清楚知道这一点,并努力工作,恰恰会让自己与众不同,并且无意间为自己创造了更多的机会。而且如果你是可以被取代的,那么就没有什么可以阻挡你迈向下一个更好的工作了。

爱上维护

维护也可以成为自由和创造的沃土。Maintenance can be a place of freedom and creativity.

最讽刺的是,项目工作其实就是维护。只要项目团队写下来第一行编码,每个新增加的功能都是被嫁接在现有的代码基础之上。当然,比起维护工作,编写代码涉及的改动相对少,但是基本内容都是一样的,都是在已有代码的基础上增加新功能、修复错误。如果是一名已经完全掌握维护工作、并且致力于把维护工作做得更好的工程师,谁又能比他把这项工作完成得又快又好呢?

评估、改进、评估——在你所维护的所有重要应用程序和代码中,把所有可以评估程序质量的元素列举出来。比如,应用程序的响应时间、数据处理过程中抛出的未被处理的异常的数量、或者是程序的正常运行或(可运行)时间。不要直接评估程序的质量。支持请求周转时间 (你应对问题的反应时间和解决速度)对你的使用者来说,是非常重要的。

8小时激情燃烧

在工作上,更少的工作时间可以有更高的效率。首要原因是根据极限编程理论,当我们疲惫的时候,思维就会变得没有效率。当我们彻底耗尽能量时,创造力和工作质量就会明显降低。在这种情况下,我们就会开始犯下愚蠢的错误,结果是既浪费时间又浪费金钱。

做项目像是马拉松,而不是全速短跑。Projects are marathons, not sprints.

作为脑力工作者,即使我们不坐在电脑前或是办公室里,也可以工作。在和你的伴侣去吃饭的路上,或者你看电影的时候,都可以工作。你和工作如影随形。在没有努力工作的时候,工作就会成为一种折磨。我可能没完成某个具体工作,或者让工作堆积起来了。这时候工作就会跟着我回家,在我想放松的时候纠缠着我。如果你每天都投入地工作,就会发现工作不再跟着你回家了。不仅是你故意在下班之后不再工作,而且你的大脑思维也允许你休息。好好规划你的工作时间。减少工作时间,你的收获会更多。当你离开工作一段时间后,才会更喜欢工作。

学习如何失败

我们遇到的小故障也让我们知道我们会遇到什么样的失败状况。如果你从来没闯过布雷区,就永远不会知道不能踏上什么地方或者哪个方向不能走。如果你做的软件没有定期向你抱怨,你就不知道危险的故障隐藏在哪里。

此外,带着防御性措施进行编程是很重要的。出现问题的时候,才是考验软件质量的时候。没有建立应急案的程序,不可避免地会发生一些问题。如果程序员没有很好地对没能预见的故障做好防御工作,那么产品的编码中就有可能出现段错误或者蓝屏。

每个错误的音调离正确的音调不过一步之遥。Every wrong note is but one step away from a right one.

因为我们每个人都犯错误,所以知道其他人也会犯错误,就不会对彼此犯下的错误品头论足。不过我们评论的是如何解决那些无法避免的错误。

发现问题后第一时间提出,不要企图隐瞒错误。因为在软件开发和测试中,越早发现错误,造成的问题就越小。越早发现并且暴露出自己犯下的错误,造成的负面影响就会越小。

接受批评。就算你可以找到一只替罪羊,也别动这个念头。即使这不完全是你的问题,你也要承当责任然后继续工作。出现问题后,我们需要的是解决问题的方法,我们的目标是在最短的时间内解决这个问题。在谁来负责这个问题上纠缠不清的后果就是拖延解决问题的时间。

提供解决方法。如果你没有想到解决的办法,那就提供一份有计划性的进程。陈述要按照具体可预测的时间顺序。如果你使团队陷入了困境,告诉大家你什么时间能给出一份解决问题的方案。这一情况下,一个具体可实现的目标,即使它非常小、对问题的解决也没有实质意义,也是非常重要的。因为它不仅使状况从坏向好的方向发展,也帮助你重建自己的可信度。

寻求帮助。就算是你对问题负全部责任,也不要让自尊心作祟,拒绝别人的帮助,这样只会使情况更糟糕。这个时候,如果你放下自尊,保持一种良好的心态接受团队成员的帮助,那么你工作的伙伴、经理和客户都会欣赏你的表现。很多时候,我们都会对造成的问题产生一种责任感,致使我们承担起过大的重担,结果是历尽千辛却毫无成果,直到有人强制介入

充满压力的时候是赢得忠诚的最好时机。Stressful times offer the best opportunities to build loyalty.

公司对错误处理方式的不同,会产生不同的结果。问题处理得好,会使客户对其产品更加忠诚,甚至比碰到问题之前,更加信任这家公司。要是处理得不好,那就摧毁了客户的信任。工作中犯错误的时候,要时刻谨记客户的这一心理。

说“不”

为了避免失望而说“是”,就是在说谎。Saying “yes” to avoid disappointment is just lying.

说“是”是个上瘾却具有毁灭性的习惯。

经常说“是”的人,要么就是天才,要么就是在说谎。后者通常占多数。

做决定的时候,也需要同样的勇气。经理宣布某一技术决定的时候,他的团队成员却静静地坐在椅子上,盯着自己的鞋,等待逃出会议室的那一刻,这样他们就可以相互发牢骚了,这样的情景是不是很常见?经理经常会成为《皇帝的新衣》里的主角。每个人都知道这是个错误的决定,却没有一个人敢说出来。我也是个经理,常常要做决定或提出有分量的建议。但是,我不希望自己的雇员都是机器人。那个敢于说出问题所在并提出更好建议的人,才是我最信任的伙伴。

不要恐慌

英雄从不恐慌。Heroes never panic.

想想其他的比赛,特别是在运动竞技中,

在最艰难的时候,我会恐慌。我把自己锁在屋子里,尽最大能力思考。我对这些问题分开独立思考,却没有想到应该要考虑全局。

我们惊慌是因为丧失了判断力。出现问题的时候,要想不完全关注问题本身是很难的。某种程度上来说,关注问题本身是解决问题的好方法。但是,这通常会制造问题,不管你碰到的问题多小,看上去都会比它本身更严重。随着问题不断膨胀,压力就会越来越大,我们的大脑就不再运转了。

说出来、行动、展示

从不做出承诺最容易导致一事无成。没有截止期限,你也就没有压力或者说是动力来完成某项工作,特别是当任务不是十分有趣的时候。

计划不至于是特别难喝的药,必须要屏住呼吸强迫自己喝下去。计划也可以让你有释放感。当一天有很多事情要做的时候,有了计划就可以让你从混乱中理清思绪,攻克所有工作。

计划也不一定非得是大计划,也不需要有很长的延续性。在文档中做个列表或者一封邮件就足够了。计划也不需要有很长的时间跨度。在一天开始的时候问自己“今天要做什么?”就是很好的开端。我知道很多人都回答不出这个问题,所以他们每天都过得非常疯狂。今天下午找个时间,把明天要完成的事情做个列表,并将它们按先后顺序排列出来,这就是一个很好的开端。人们总会认为自己可以做很多的事情,但请尽量实际一些。

状态报告可以帮助你推销自己。Status reports can help you market yourself.

做计划时要时刻谨记的是,出现在计划上的每一项工作必须要与后续工作相关,要么被完成、推迟、去除、或者被代替。如果计划上的某一项工作后来根本就无人问津,别人就会开始对你的计划持怀疑态度,计划也就失去了它的功效。就算最后的结果是不好的,你也应该同其他人交流。每个人都会犯错,但你应该坦诚地承认自己的错误,请求别人帮助来解决问题。坚持按照计划工作会给人留下一个积极的印象——在混乱中,不会遗漏任何一件重要的工作。

坚持这么做,有一天你的上司会发现你是可以掌握全局的。制定计划并按计划行事证明你不只是一个会编程的机器人,你是一个领导。裁员的时候,这样的人才不会被解雇,他们才是公司需要的人才。

与大家交流你的计划还有一个好处就是你做出的承诺会更具可信度。如果你不仅说出想要做什么,并且付诸实践完成了这项工作,你就会得到实干者的美名。有了信任就有了影响。如果你想要向某个机构介绍一种新的程序,比如是敏捷开发实践,或者你想引进一项新的技术,有了信守诺言的信誉,尝试新事物的时候你就会被赋予更高的自主性。

你的上司希望你具有独立性和归属感。制作计划、执行计划以及与上司就计划进行沟通都会帮助你找到工作的独立性和归属感。

不要忽视感觉

扮演理想主义者的角色非常自在,你可以假装不在乎别人怎么看你,但,那是在游戏中,而你绝不能信以为真。你应该在乎别人的看法,别人对你的认识就是现实。好好解决它。

你可能听说过这个古老的心理学问题:“如果森林里的一棵大树倒下了,却没有人听到它倒下的声音,那么它倒下的时候到底有没有发出声响呢?”这个问题的正确答案是:“谁会在意这个?”

根本就没有绝对意义上的好与坏,至少在判断谁更具创造力,谁更有知识的时候,没有绝对的好与坏。怎样界定什么样的音乐是好音乐?什么样的图画又是好的图画?你可能会有自己的判断标准,但这都是你的主观判断。

绩效考核永远都不会是客观的。Performance appraisals are never objective.

探险向导

客户害怕你。Your customers are afraid of you.

(1) 自我检查——你是不是一个令人生畏的编程老恶魔?你确定么?他们是不是害怕告诉你真相?检查你的邮箱,找到一些你发给不太具有编程专业知识的同事、经理和客户的邮件。尝试站在他们的立场上再次阅读这些邮件。如果距离这些邮件发出已经有一些时间了,你会发现自己可以以第三方的角度来看问题了。还有一个更好的方法,把这些邮件给你母亲看。告诉她这是你的一位同事发给客户的邮件,问问你母亲对这些邮件的看法。

(2) 跳过围墙——寻找一个自己知之甚少、需要依靠别人的境况。如果你脚步动作极其笨拙,就想象自己是一名足球队员。如果你手部动作极其笨拙,就想象自己是国家编织队的一员。这种情况下,你会希望队友如何与你沟通?

学会沟通,善于写作

文字表达能力是非常重要的。可是,在所有你为了保住职位而需要锻炼的技能中,这一条听起来有些做作、傻,或者微不足道。你可能会觉得有点像回到了高中的英语课上,但这次你必须要专心致志。

人们会通过你的写作能力对你做出初步评价,也可以依此深刻理解你的思维活动。如果你无法用母语清楚地表达自己的想法,让别人明白,又怎么可能用编程语言来清楚地表达出来呢?组织观点,带领读者思考并最终做出合乎逻辑的推断,这种能力与创作出清晰的设计和系统实施,并让功能维护者理解的能力是一样的。写作能力不仅仅是判断的依据。如果你的团队成员和你处在不同的时区内,那么写作可能就是你汇报工作进度的唯一方法,比如你是如何设计某种东西,或者你的团队成员需要做的工作是什么

你自己就是你要解释的内容。You are what you can explain.

沟通,特别是以文字方式进行沟通,是你所有绝妙的想法必须要通过的瓶颈。你自己就是你要解释的内容。 开始记录开发日记。每天写一点,记录你做了什么工作,解释你的设计决定,检查棘手的技术和专业决策。即使你自己是第一位读者(或者是唯一的读者——这由你自己决定),也要注意写作的质量,和能够清楚表达想法的能力。时不时地回头阅读之前的日记,评论它们。通过你对之前日记的喜好,来调整你的新记录。这样做,不仅可以提高你的写作能力,通过这些日记你还可以加强你对所做决定的理解,当需要知道如何或者为什么你之前要做某事的时候,你就可以在日记里找到答案。

到场

能够与上司和客户面对面地沟通是你的优势,不要浪费这个机会。

回想最近一次不懂电脑的亲戚朋友向你请教计算机问题时的情景。你试图通过电话帮助他们解决问题,但是如果他们听不明白,你的情绪就会越来越激动。你会想我要是能向他们展示怎么做就好了。相比之下,面对面地交流就会非常地有效率。你可以更加清楚地掌握对方的问题,通过手势和画图这些视觉方法来解决问题。你还会不自觉地使用面部表情来表达要说的内容。

了解你的同事。Learn about your colleagues.

在当今的工作环境中,尽管你和工作伙伴在同一个国家工作,却不一定在同一个城市或者同一个州。这种情况下,如果有可能,那么就应该定期出差与他们见面。不过最好的办法还是打电话。打电话给你的老板和同事的时候,要拿起听筒,而不是使用扬声器。也不要依赖定期会议。你需要去模仿那种在喝咖啡的休息时间进行的自然交谈,就像你和他们在同一个地方工作的时候一样,所以给即兴对话留出时间。时不时地,营造出私人对话的感觉。以“今天过得怎么样?”开头,接着问“你周末通常都做什么?”尝试去了解你的同事。这样做,不仅可以牢固你在公司的地位,也会让生活变得更加丰富多彩。

下周的某一天,强迫自己不发邮件(在合理范围内)。当你想要发邮件的时候,打电话给对方或者到他的办公室面对面地与他交谈。

适当的言语

请用行业术语推销你的成就。Market your accomplishments in the language of your business.

商业本身关注的是结果,经营者关注的也是结果。所以,如果不使用行业语言来推销你的成就是起不到作用的。你不会用德语向美国观众推销产品。饮料公司不会以饮料中色素的测定量作为卖点。众所周知,推销产品时,要使用消费者明白并且与他们相关的语言。

改变世界

带着任务去上班,并确保别人知道你的任务。Have a mission. Make sure people know it.

如果你不知道要做的改变是什么,那你就没有在做任何改变。如果你没有主动让自己获得承认,那你就还没有获得承认。

让人们听到你的声音

最优秀的萨克斯风手不一定总能找到工作(这条是最重要的)。和谁一起演奏是非常重要的,至少和你的演奏水平差不多;作为演奏者,联合的力量是强大的。

有时候,优秀的演奏者常常被忽略,因为人们总是觉得他们没有时间,或者是人们根本不敢去询问这些优秀的演奏者有没有时间。人际关系网络非常重要。如果你并不认识某个乐手,那你就不太可能被邀请与此人一起演奏,除非有中间人介绍。

计算机这行也是一样。专门用来评估和雇用软件工程师的系统是不存在的。当然,优秀是非常重要的,但是只是优秀是不够的。我们这个行业,和音乐界一样,都是由一个复杂且广大的人际关系网构成的。你认识的人越多,得到好工作的机会就越大。如果只把自己局限在现在工作的公司里,就会严重限制你形成新的人际关系网的机会。

如何才能从一名程序员到出版作品再到公众演讲呢?从互联网开始。

第一步就是阅读网络日志。如果你不知道读什么日志,那就挑选出几位你最喜欢的技术类书籍作者,然后通过网络搜素,通常他们都会有自己的网络日志。订阅这些日志的,以及这个网页上链接的其他人的日志链接。慢慢地,随着你阅读和寻找其他人的网络日志链接,你的日志链接列表就会不断增加。

接下来,开始撰写自己的网络日志。有许多免费开办日志的服务。操作起来非常简单。一开始,你可撰写(或者链接)在你的聚合器模块中有趣的故事。慢慢你就会发现,网络日志这个环境本身就是一个社交网络——你开始建立的职业网络的缩影。你的想法会出现在别人的日志链接中,他们会撰写关于你的想法的文章,然后传播你的观点。

创建自己的商标

创建商标分为两部分:认知和尊重。创立自己的商标,让人们认识它,然后确保与之关联的都是积极的特征。

你既想得到认知,又想得到尊重。你的名字就是你的商标。

你的名字就是你的商标。Your name is your brand.

不要小视你所代表的内容。小心挑选你名字出现的地方。不要去做糟糕的项目,广泛地发送糟糕的邮件(或者撰写糟糕的网络日志)。别做傻瓜。没人喜欢傻瓜,尽管有时候他们自己就像个傻瓜。

Google永远不会忘记。Google never forgets.

有一天你可能会忘记自己做过什么,但是Google却记得一清二楚。竭尽所能捍卫你的商标。别让自己的行为毁了它的名誉。你的商标就是你的一切。

发布你编写的程序

人人都能使用Rails,但很少有人能开发出Rails。Anyone can use Rails. Few can say Rails contributor.

先不说你可以为自己树立名号,对开源软件有所建树也展现了你对这个行业的热情。即使某个公司没有使用过或者听说过你开发的软件,但这个软件由你创作并已经发表的事实本身,就是雇用时候的一个优势因素。这样想,如果你想要雇用一名软件开发员,候选者中其中一名开发员每天朝九晚五地工作,下班回家就看电视;另一名开发员非常热爱软件开发,他自觉地加班工作,周末也还在开发软件。这两名开发员,你会更青睐于哪一名?对开源软件有所建树是一种技术的展示。比起在简历上空谈你知道某种技术来说,如果你正在编写真正的代码,并效力于某一真实的项目,那你就会更有竞争力。任何人都可以在简历上的技能一栏列出Rails或者Nant。但极少人有资格写出他们也是Rails开发者或者Nant提交者。

如果你创作的产品非常实用,那你就很可能会成功。或许在一个小的技术圈子成名——可能是在使用Rails的开发员中。如果你足够幸运,圈外的人或许也会听到你的大名,比如Linus Torvalds或者Linus。就算你没有一举成名,发布你编写的程序也会让更多的人知道你。开源社区是全球性的人际关系网络,这些人搜索程序的时候,可能刚好就搜到了你的软件,然后安装了它,并开始使用。这样,他们就会知道你的存在,随着越来越多的人使用你开发的软件,你的名字和名声也会随之传播开来。这就是市场化。这就是你所期待的。

变为卓越的能力

出色和好的含义肯定不同。通常,卓越的产品一定是好的。但是,好的产品却很少是卓越的。卓越的意思是值得被关注。仅仅比你认识的软件开发员好,并不能使你成为卓越的软件开发师。仅在量上超过其他人,是不足以让你的声誉像病毒一样扩散开来的。如果要求某人谈谈对你的看法,或许他会说出很多你的丰功伟绩,但是卓越的意思是人们会主动地谈论你,而不是被动要求。

展示或者让它死亡!Demo or die!

怎样做才能使你自己和你的工作成绩变得像那头紫色的奶牛一样引人注意呢?对一门科目而言,不要仅仅是掌握它——可以撰写一本关于此科目的书籍。可以编写一个代码生成器,使以往需要一个星期才能完成的工作缩短为5分钟。不仅要得到同事的尊重,还要通过研讨小组或者专题讨论会使自己成为城市中公认的某一种技术的专家。把以前从未有过的想法放到下一个项目中。仅仅做人群中最好的是不够的。要成为人们谈论的焦点。

从小事做起,但是要在你现在的项目或者工作中做一些卓越的事情。比如可以力争卓越的效率。项目进程往往会有一些拖沓的部分。从中找到其他人认为要一个星期才能完成的工作,你用一天的时间来做完它,如果有需要就加班。不需要把加班作为一个习惯,但现在是一个试验。用非常短的时间来完成这项工作,看看其他同事会不会对此作出评论。如果他们没有评论,那是为什么呢?如果评论了,他们又是以何种方式来评论的?调整你所做出的改变,然后再尝试一次。

建立关系

恐惧感使我们无法接近专业人士。Fear gets between us and the pros.

非常出色的人是不会介意有人想要认识他们的。人们喜欢被别人欣赏的感觉,而且他们也愿意谈论他们所热衷的话题。没错,他们是专业人士、大师、领军人物或者是著名的作者,但是他们首先是人,人是社会动物,喜欢与人交流。

根据我的个人经验,我认为我们这些凡人和那些我们所仰慕的人之间最大的障碍就是我们自己的恐惧。与那些聪明、人际关系好、能教你东西或可以帮助你找到工作的人结识,是取得进步的最好的方法,但是我们却没有胆量尝试与他们结识。音乐家、美术家和其他艺术家通过结成联系紧密的团体,才能够保持出色,他们的艺术作品才得以流传。在社会和职业关系网中,权威就是“超节点”。创建这个关系脉络所需要的就是要少一些谦卑。

(1) 挑选出你最喜欢的软件,并给它的开发者写一封邮件。邮件一开始先要感谢他开发了这个软件,接着提出建议、问题或者其他可以与他建立联系的尝试。请他对你的邮件做出回复。如果这一软件是免费或者是开源的,主动提议来帮忙。

(2) 在你生活的城市里,找一位你敬仰的或者愿意向他学习的人。找一个可以碰到这个人的机会(用户小组会议或者演讲会上都有很大的可能性),主动开始与他交谈,即使这样做会让你感到不舒服。事实上,正是因为这样做会让你感到不舒服,所以你才要迈出这一步。

已经过时的技术

你引以为傲的新技术已经过时了。Your shiny new skills are already obsolete.

每周找出时间来研究尖端技术。每周至少找出2个小时的时间来研究新科技,学习相关技术,并动手尝试。制作简单的应用程序。将你正在以当前技术做的项目,用新技术来做出新的原型版本,来理解它们的不同之处,以及新技术能够做些什么。在你的日程安排中加入做这项工作的时间,一定要按时完成。

你已经失去工作了

你不是你的工作。You are not your job.

没有终点的道路

美国社会存在的一个严重问题就是它是一个以目的为导向的社会。大到学习、职业发展的过程,小到开车的旅途,人们关注的总是结果。我们过于关注事件的结果,却忘记了全局。

仔细思考一下,在逻辑上我们应该要花时间关注的恰恰是结果的反面。基本上,我们大把的时间都花在了做事情的过程中,而结果基本上不会占用时间。举个例子,当你开发软件的时候,你的时间花费在整个开发的过程中,而不是在开发完成的软件上。

不要关注结果,要关注做事情的过程。Focus on doing, not on being done.

关注结果会使人忘记应该做好过程。糟糕的过程只能创造出糟糕的产品。产品或许可以实现其最低的要求,但是其内部会是一塌糊涂。你达到了短期的最终目标——但这并不能使产品可持续发展。

不仅糟糕的过程制造出糟糕的产品,糟糕的产品也会导致糟糕的过程。一旦你生产出的产品内部一塌糊涂,你的工作过程就会围绕着它不断做出调整。产品的破窗会导致整个过程的破窗,这是一个恶性循环。

洗碟子是一项单调的工作,没人愿意做。软件开发师每天也要经历类似单调沉闷的工作,例如时间追踪和费用报告。下次再从事类似工作的时候,不要焦急地想要赶快做完它,尝试在工作中关注任务本身。

给自己做一份蓝图

作为软件开发师,从你做系统的工作经验来看,你知道,当做维护工作的时候,人们很容易就会墨守成规,原地踏步。当你在维护一个其他开发师使用的应用程序或者一个库的时候,除非你有一份功能路线图,否则工作就会在漏洞修复模式停滞不前。可能因为用户的要求或者你自己的需要,你会偶然做一下提升,但是代码通常会停滞在一个稳定的状态,改变的速度非常慢,因为你认为这个系统已经完成了。

个人的产品路线蓝图是用来判断你是否在不断向前发展的依据。每天,你出入相同的办公室,从事大量相同的工作,周围的环境没有任何变化。所以,你需要在合理的范围内做出一些标记,当你达到这些标准的时候,你就知道你不是停滞不前的。产品的“功能”就是这些标记。

要注意观察市场变化

留意那些技术达人。Watch the alpha geeks.

镜子里的胖子

我不知道自己长胖了还是变瘦了,是因为我天天都能看到自己。如果你每天都看着相同的事情,也同样很难看出它的变化,除非是突然间的改变。就像你坐在那盯着一朵花蕾,是看不出什么变化的。但是,如果你离开两天,然后再回来看,你就会看到非常明显的变化。

职业也是一样。事实上你根本就不去观察注意。这就是问题所在了。每天你都看着相同的自己,一点变化也看不出来。你看起来和以前一样适应那个环境;你看起来和以前一样具有竞争力;你的技术看起来和以前一样处在时代尖端。

找到一个可信赖的第三方,是衡量进步的简单方法。一名良师或者一位关系好的同事不是你肚子里的蛔虫,所以可以比较客观地对你做出评价。你可以和他们谈论你作为一名软件开发师、项目领导、沟通者、团队成员等任何与你相关的能力。在通用公司,有一项被称作360度评估的方法,这种方法可以鼓励员工从同事、上司和客户那里得到回馈意见。

作为雇员,这种方法可以很好地帮助你从不同的角度来审视自己。

开发员们,要自我反省。Developer, review thyself.

南印度捉猴陷阱

南印度人多年来一直受到猴子的困扰,他们发明了一种巧妙的方法来捉猴子。他们在地上挖掘一个又长又窄的洞,然后用一个同样长窄的物体来扩宽这个洞的底部。他们把米倒入这个拓宽了一些的洞底。

猴子很贪吃,这也是猴子惹人厌的重要原因。他们会跳上车子或者不顾危险追着一大群人,就从你的手里抢走食物。南印度人一直为此困扰,时刻警惕着这些猴子。(相信我,当你安静地站在公园里,突然间一只猕猴“嗖”地过来抢走你身上的某些东西,这种感觉让人非常忐忑不安,没有安全感。)所以,Pirsig说,猴群会发现这些米,将胳膊深深地伸进洞里,手会到达底部。他们会贪婪地抓米,直到手里装不下了为止,这个过程中手会攥成拳头。洞底较大的部分可以容下他们的拳头,但是其他较窄的地方就太窄了,猴子的拳头就卡住了。

当然,猴子们可以放弃食物,获得自由。但是,猴子非常看重食物,看重到根本无法强迫自己放弃食物。他们会一直抓着那些米直到把米拉出来,丧失生命也不会放弃。基本上它们都会为了食物失去生命。

不是所有坚信的价值都是正确的。而且很多时候,在某种环境下是正确的事情,到另一种环境下就不一定是正确的。

价值僵固使你脆弱。Rigid values make you fragile

每天你都能够看到自己,所以看不出自己的体重发生了变化。价值僵固也是同样的。每天我们都在工作中度过,在做职业选择的时候很容易就会产生价值僵固。我们知道什么奏效,并一直坚持着。或者,可能你一直想被提升到管理岗位,所以你一直向那个目标努力,却忽略了自己是多么热爱编程。

每天都有进步

正是因为问题的复杂性,在重大的问题面前,我们很容易就失去了动力,转而去关注那些容易衡量和解决的问题。这就是为什么我们经常延误了问题的解决时间,而这种拖延又导致了我们的内疚,这让我们感觉糟透了,结果就是再继续拖延。

每一个改变之后,你可能无法看到整体发生明显的不同。当你努力得到你同事的尊重,或者努力变得健康的时候,每天取得的进步不会直接导致有形的结果。就像我们之前所说的,这是因为远大的目标会使人丧失动力。所以,对于努力实现那些远大又有难度的目标,非常重要的一点就是不要总想着每天都要离最终目标近一些,而是应该想每天要比前一天做得更好。举个例子,我不能保证我今天比昨天更加苗条了,但是我可以控制今天是不是比昨天付出了更多的努力去减重。如果我付出了更多的努力,那我就有权力为我所做出的努力而自豪。通过这种持续可见的进步,我不再感到内疚也不再拖延时间。而内疚和拖延时间正是我们战胜重大困难的因素。

独立

独立不是件简单的事情。这把你所有的技术作为一个专业来测试。现在你可能还没有做好准备。但你也没有必要做足这一切。把它当做是个人发展项目,在业余时间去推销自己。制定目标,以某种速率与客户签订合同,然后利用晚上或者周末的时间完成项目(但是千万不要利用上班时间做!)。在保留安全感的同时,你可以学到很多东西。最坏的结果不过是有几个星期你得加班加点地超负荷工作,结果却没能成功完成这个项目,然后回到你舒服的格子间里,以一种全新的感觉对你的工作心存感激。最好的结果是,你成功了,热爱这份工作,为自己的职业满足感和荷包充盈找到了一条新的途径。