1,选择市场
练 习
基于当今市场,按照从左往右的顺序尽可能多地列举出处于早期、中期和晚期的技术。最左边为崭新的尚未稳定的技术,最右边为即将退出市场的技术。尽可能仔细地找到它们之间的细微关联。当你列举出所有你能想到的技术后,标记出你认为自己擅长的技术,然后换一种颜色,标记出那些你做过但是并不精通的技术。你的标记主要集中在哪个区域?它们是聚集,还是分散的?处于这张图表边缘处的技术,有没有你感兴趣的?
2. 供应和需求
练 习
研究当今技术市场的需求。利用招聘广告和招聘网站找出哪些工作是高需求,哪些是低需求的。登陆外包公司的网站(如果你在这些公司工作,可以直接与员工交流),把这些公司的技术与你发现的高需求工作进行比较。记录下那些在国内市场中高需求且没有流到外包市场的技术。然后再将这些外包公司的技术与前沿科技相比较。密切关注外包公司还没有涉足的上述两类技术。思考它们需要多长时间才能为相应的市场提供服务。这个时间差就是市场不平衡的阶段。
3,只会编程是不够的
练 习(1) 安排一次与业内人士的午餐,问问他们是如何工作的。交流中,思考如果你来做他们的工作,你会做什么改变或者你可以从他们身上学到什么。询问他们日常工作中的细节。问问他们技术是如何帮助(或者阻碍)他们工作的。从他们的角度出发,思考你的工作。定期安排此类活动。刚开始你可能会觉得有些尴尬,但没关系。我是几年前开始这么做的,这极大地帮助我理解和融入我所服务的行业。另外,在与我的客户交谈时,我也变得更加得心应手。
(2) 选择一本与你公司行业有关的杂志。你甚至都不用买,大多数公司都有些过期的行业杂志。试着阅读它们,虽然有些东西你可能不懂,但是要坚持。列出你可以向客户询问的问题。不要担心你的问题很傻,客户会大为赞赏你的这种学习态度。找一个你可以随时登录的行业网站。无论是浏览网站时,还是阅读杂志时,注意大事件和专题文章。你所处的行业正在为什么而努力?现在的热门是什么?不管是什么,把它们介绍给你的客户。请他们说说观点看法。思考这些潮流是如何影响你的公司、你的部门、你的团队,以及你自己的工作的。
4,做团队中最差的
找一个团队,让自己成为“最差”的。不需要立刻调换工作,你可以试着找一个志愿者项目,通过与这个项目中其他程序员的合作,提高自身能力。查查有哪些编程团队会议,然后去参加这些会议。程序员一般都会用业余时间做兼职,以此来练习新的技术,提高自身技能。如果在身边找不到这样的程序员组织,就利用网络。找一个你钦佩的开源项目,且他的设计者是你下一阶段发展的目标。浏览这个项目的待处理列表和官方讨论区,或者编写一个功能或者修正一个大的错误。你的代码要模仿这个项目的代码风格,但是又要让你的代码和设计与其他项目完全不同,甚至让原作的程序员都认不出来。在你觉得一切都妥当之后,把它作为一个补丁提交。如果你做得好,这个项目就会接受它。这样重复来做。如果这个项目的设计团队不同意你的观点,那就将他们的反馈加入到你的设计中再次提交,或者记录下他们做出的改变。最终,你会发现自己成为了这个项目团队中值得信赖的一员。你会惊喜地发现虽然这些高级程序员并不在你的身边,你甚至连他们的声音都没听过,但你已经从他们身上学到了很多东西。
5,在思维上投资:
学习一种新的编程语言。但不是从Java到C#或者是从C到C++。这门新的语言应该可以让你的思维方式产生变化。如果你是Java或者是C#的程序员,那就尝试学习类似Smalltalk或者Ruby这种不需要采用强类型的静态编程方式的语言。或者,如果你一直在做面向对象开发的话,可以尝试Haskell或者Scheme这样的函数式语言。你不需要成为专家,可以感到这种新的编程环境与你之前所处的环境的不同之处即可。如果你觉得并没有什么不同,那就说明你选错了语言或者你仍然将固有的思维方式运用到新的语言中。要彻底改变你的思维方式来学习新的语言。向熟悉这些语言的程序员请教,让他们检查你的代码并提出建议,使之更符合此种语言的特性。
6,不要听从父母
在职业道路上,你最担心什么?回想你最近做过的几次职业选择,不用是很大的决定(如果你是出于某种担心而做出职业的选择,那也不会是什么大决定)。你从事了什么特殊的工作,或者你申请了一份新的工作或升职。把这些选择罗列出来,逐一做出诚实的评价:这些决定受到“担心”这一因素的影响有多少?如果你没有担心,那你会做到什么程度?如果这些决定确实是受到“担心”的影响了,那你现在如何逆转它,寻找新的机会做出新的选择,当然这次不要再因为担心什么而受到约束。
7,做一名通才
列出你能将你的知识和能力融合在一起的工作内容。写下每个方面中你的专长。例如,如果你列出了平台和操作系统,那就可以在旁边写上Windows和.NET。在你专长的右边,再列出你要学习的一种或几种技术,可能是Linux和Java(或者是Ruby、Perl)。然后尽快(一周之内)找出30分钟开始研究你要学习的一门技术。不要只是单纯阅读相关的书籍资料,动手实践一下。如果它是种网络技术,那就下载一个Web服务器安装包,然后自己安装。如果是与做生意有关的话题,那就找一个你的客户,约他出来吃饭聊聊天。
8,成为一名专家
(1) 你是否使用在虚拟机上编译并执行的编程语言?如果你使用,花点时间学习虚拟机内部是如何工作的。很多书籍和网站都专门就Java,.NET和Smalltalk进行讨论。学习这些东西总比你凭空想象要简单。
不管你使用的编程语言是不是依赖虚拟机,花点时间学习编写源文件。你敲打出来的代码是如何从可阅读的文本转变成可被计算机执行的命令的?编写你自己的编译程序又意味着什么?当你输入或使用外部函数库时,它们是从哪里来的?输入一个外部函数库到底意味着什么?你的编译程序、操作系统或者虚拟机是如何将多个代码段连接起来,形成一个连贯系统的?掌握这些知识可以使你在技术选择上向“专业人士”跨近一步。
(2) 在工作中或者工作外寻找一个教课的机会。你所传授的知识是自己想要深入学习的技术。在第2章第14节我们会讲到,讲课是最好的学习方法。
9, 切忌孤注一掷
试着做一个小项目,做两次。第一次尝试使用在家里就能使用的技术;第二次,使用你最惯用的竞争性技术。
10, 热爱它,不然就离开它
(1) 找一份自己真正有激情去做的工作。(2) 下星期一开始,做个简单的日志,坚持两个星期。每个工作日起床的时候,给你的兴奋度打分,分值最高10分,最低1
分。1分代表你宁愿得病也不想去上班,10分代表一想到马上就要开始新一天的工作了,你就兴奋,不能再躺在床上1分钟了。两个星期后,检查这个日志。图表中有峰值吗?走向是怎样的?这些点都处在高点还是低点?如果这是一份考卷,那你的平均分是多少?接下来的两周,每天清晨计划如何在明天得到10分。思考你今天要做什么,以便使明天成为你迫不及待要开始工作的一天。每天记录下前一天的兴奋值。如果两周后,这个图表显示的结果还是不尽人意,那或许是时候考虑做一次大的改变了。
11,学习钓鱼
(1) 如何与为什么?——在你读书或者工作的时候,想一想工作中你不完全懂的问题。你可以问自己这两个问题:它是如何工作的?为什么会发生这种情况?对这两个问题,你可能给不出答案,但是只要你问了,就会形成一种新的思维模式,也使你更加关注自己的工作环境。IIS服务器是如何通过向ASP.NET发送请求来结束工作的?为什么我必须要为我的EJB应用程序生成这些接口和部署描述文件?我的编译程序如何处理动态和静态链接?如果店主住在蒙大纳,为什么计税的方法就不同了?当然,这些问题的答案很有可能会引发对这些问题的新一轮探索。当在这个“如何和为什么”的环节中你无法再深入了,那就证明你已经达到目的了。
(2)“提示”时间——在你的工具箱里挑选一种非常重要却经常被忽视的工具。可能是你的版本控制系统,可能是一个你广泛
使用却只知皮毛的库,也可能是你用来编程的编辑器。选定了工具后,每天花一点时间学习这项工具的新知识,帮助你提高工作效率,或者能让你更好地掌控开发环境。比如,你可以选择操作GNU Bourne Again Shell (bash)。当你的思绪游离出手头的工作时,你可以上网查询关于使用bash的提示,而不是装载Slashdot。很快,你就可以找到有用的资源来教你如何使用shell。现在,有了新的诀窍,你就可以利用一系列“如何和为什么”的问题来深入研究它的核心了。
12.学习行业是如何运转的
(1) 通读一本基础商业教程,一本MBA教程是不错的选择。我推荐一本非常有用的书The Ten-Day MBA[Sil99]。你真的可以在10天内读完,占用不了多少时间。
(2) 找一个人带你到公司的财务部门看看,并请他们向你讲解财务状况(如果你的公司不介意与员工分享这些信息)。
(3) 听完财务状况讲解后,再向他们复述。
(4) 弄明白为什么“账本底线”要被称为“账本底线”。
13,寻找良师
指导自己——我们都希望有人主动来教我们,但事实是我们很难在自己周围找到这么个人。所以要学会自己做自己的良师。想想在你工作的领域中你最钦佩谁。大多数人在不同阶段都会有一个名单。这个人可能是工作中的同事,或者你很欣赏这个人做出的某项成果。列出这个榜样的10种特性,这些特性必须都是视他为榜样的理由。这些特性可能是某一特定的技术方面,比如技术广度或者某一特定领域的知识深度。或者是他们的某种人格魅力,比如他们是很好的团队协调者,或者他们的言辞总是具有吸引力。现在,把这些特征按重要性的升序排列,1是最不重要的,10是最重要的。这样你就提炼出了一个特征列表,这些特征都是你钦佩并认为重要的。这就是赶上你选择的榜样的方法。但是,要先专注于哪一项呢?想象你的榜样在此项上会给你打多少分(10分最高),在这个名单上加一列,将分数标注在特征旁边。尽量站在你所选择的榜样的角度上,以第三者的身份来评定自己。一切准备就绪后,再在整个列表的最后再加一列以记录你的最终得分。如果你给某种特性打10分,即最重要的特性,然后对这项你自己的表现给出的分值是3分,那这项你的最终分数就是
7分。得出各项的最终分数后,按降序排列,这样你就能分出改进的先后顺序了。从这个列表中的前两三项开始,列出你要改进的具体事项。
14,做一名良师
(1) 找一个你可以帮助的人。你可以在公司找一个比自己资历浅经验少的人,比如一名实习生。你也可以去当地大学的计算机
信息技术学院去做志愿者,辅导一名大学生。
(2) 找一个网络论坛,并挑选一个主题。开始帮助别人。慢慢地,你就会因为愿意助人以及有能力帮助别人学习而在这个论坛里出名。
15.练习,练习,再练习
(1) Topcoder——Topcoder.com是一个很早就存在的编程竞技网站。你可以注册然后通过线上竞赛赢得奖励。就算你对竞争没兴趣,Topcoder还为你提供了一个练习室,里面有很多可以练习的问题。现在就去注册尝试一下吧。
(2) Code Kata——Dave Thomas是《程序员修炼之道》的作者之一,他接受编程练习这个想法,并使之实用化。他创造了一系列的很小却深具启发性的练习,被称之为Code Kata,程序员可以使用他们选择的编程语言来做这些练习。每一个Kata都针对某一特定技术或者思考过程,这样程序员的思维就可以更加灵活。这本书的印刷过程中,Dave已经创造出了21个Kata,你可以在他的博客上免费使用(http://codekata.pragprog.com/)。在这个博客上,你还可以看到通讯名单的链接,以及别人解决这个问题的方法和相关讨论。你的挑战:练习这21个Kata,并撰写使用Kata练习的日记(或者是博客)。当你完成这21个Kata后,开发你自己的Kata,并与别人分享。
16.做事的方法
选择一个软件开发方法论,并且挑选一本有关此方法论的书,登陆相关网站,加入一个讨论此问题的联络组。从批判的角
度来研究此方法论。此方法论的优势和弱点在哪里?在你的工作中,执行它的障碍是什么?研究完一个,再换一个继续研究。对比他们的优势和弱点,想一想如何能把它们结合起来。
17.站在巨人的肩膀上
(1) 选择一个项目,像读书一样研读并且做笔记。归纳出好的方面和坏的方面。发表一篇评论。至少找到一个你可以借鉴的技
巧或者模式。再找到至少一处缺点,提醒自己在开发软件的时候不要犯这类错误。
(2) 找到一些志同道合的人,每个月聚会一次。每次聚会由一个人提出一段代码——2行或者200行都可以。分解它,然后讨论这段代码背后的东西。思考做出这个程序所做的决定,权衡没有包含在这个程序中的代码。
18,在工作中,将自己自动化
(1) 挑选一个你经常重复做的工作,为它编写一个代码生成器。从简单的部分做起。不要管这个代码生成器的重复使用率,只确保这个代码生成器可以节省你的时间。想办法提高生成代码的抽象等级。
(2) 研究模型驱动架构(MDA)。尝试一些可以使用的工具。看看工作中哪里可以使用MDA概念。想想如何用你日常使用的
工具来应用MDA概念。
19,就在现在
查看你的工作日志,看看已经在这上面挂了很长时间的任务,那些已具雏形的项目,或者是某些让你头痛的工作——可能是因为官僚作风,也或者是因为分析瘫痪。在这其中找出一项你可以在日常工作的空隙时间完成的工作,比如平时你浏览网页的时间,查看邮箱的时间,或者是可以缩短你的午餐时间。把一项以前需要数月完成的工作,在一周内做完。
20,读心术
Karl Brophey 是这本书较早的评论者,他建议在你开始下一个项目或者维护下一个系统的时候,做些笔记,记录下你认为用户和经理想要让你做的事情。有点创造性,试着从他们的角度来看这个系统。当你记录下这些有可能会被提出的不太明显的功能之后,想一想如何才能最有效地执行它们。想想用户在短时间内想不到的边缘功能。然后当你接到执行工作的要求时,看看你的列表,你的命中率怎么样?你猜到的这些功能有多少是现在要做的?在做这些工作的时候,你之前思考过的方法用得上么?
21,每日成绩
留出半小时时间,拿一支铅笔和一张纸坐在一个安静无人打扰的地方。想想每天你的团队都在忍受的那些吹毛求疵的小问题。把它们写下来。哪些烦人的任务每天都要耽误整个团队好几分钟的时间去讨论,却没人有时间或精力来完成这些任务?
你现在做的项目中,哪些工作是可以自动完成,而你却在手动完成?记录下来。你来构造或者部署一个过程如何?你可以解决哪些问题?又将如何增加成功率呢?记录下这些想法。
给自己实实在在的20分钟,记录下所有的想法,不管是好的还是坏的。一定要做满20分钟。列出清单后,在另一张白纸上理出你最感兴趣的(也是最烦人的)5项任务。下星期一,瞄准这个清单上的第一项,任务做点成绩出来。周二,第二项;周三,第三项;以此类推。
22,别忘了你在为谁工作
计划一次与经理的会面,目的是了解经理对整个团队下个月、下季度及来年的目标。问问他你能做些什么。会面之后,检查自己的日常工作是否与这个团队目标一致。以这些目标来决定你工作的动向。以这些目标为基础,把你的工作排出先后顺序。
23.安分守己
Be ambitious, but don't wear it on your sleeve.
一周内不去想你的职业目标。写下你当下工作的目标。别去想下一步要做什么,想想你想从手头的工作中得到什么,你又能做出怎样出色的成绩?制定一个既有战略性又具实用性的计划。以完成当前工作为目标,用一周的时间来执行这份计划。
午餐或者休息时,在与同事的交谈中,避免涉及任何关于职业发展或者公司政策这类内容,专注于手头工作的目标。
这周的最后一天,把你的进度和你制定的工作目标作对比。就现在的工作而言,你认为需要完成的任务中,有多少还没有完成?你又是如何评价自己已经完成的工作?制定下周的工作计划,坚持下去。
24.今天我能把工作做到多好?
与你的同事展开竞赛,竞赛的内容就是这些无聊的工作任务,看看谁能把这些工作做到最好。如果不喜欢单元测试,那就看看你每天都要接触到的代码,将其中测试断言的总数打印出来,把它钉在办公桌隔断板上。再为整个团队布置一个记分板,获胜的人就能得到某种权利甚至是奖金。 在项目结束后,获胜的人可以在接下来的一周内,把乏味的工作分配给团队中其他成员去做。
25. 你的价值是多少
当公司做投资的时候,领导会想尽一切办法确保他们把钱投在了正确的地方。简单对投资回报做出估算(投入100美金,得到120美金)不足以做出明智的决定。在其他影响因素中,公司还需要考虑通货膨胀、机会成本和风险因素。对于我们这些没进过商业学校的人来说,一般不会想到货币的时间价值。这样说可能有些过于简单:今天的一美金,明年可能就变成不止一美金了,因为今天的一美金可以用来创造更多的钱。大多数公司都会设立回报率线,在这之下,就不会进行投资。进行投资必须是在确定的时间内并有确定的回报率,否则就不会进行投资。这个数字被称作“最低预期资本回报率”。找出你公司的最低预期资本回报率,用它来衡量你的工资。你是不是一项好的投资?
26,一桶水中的鹅卵石
把你编写并维护的代码,以及你做过的所有工作编成目录。把你的团队完全依赖你完成的工作记录下来。可能你是唯一懂得你们应用程序部署过程的人,或者你编写的一部分代码,其他团队成员无法搞懂它们。
把这些全部列入你的待办事项中。自动化或者分解你的代码,或者为这些代码提供说明,使其他团队成员很容易明白你编写的代码。按这样,做完所有待办事项列表中的工作。主动与你的团队成员和团队领导分享你所做的说明。确保团队成员可以很容易看到这些说明。定期重复这一练习。
27.爱上维护
评估、改进、评估——在你所维护的所有重要应用程序和代码中,把所有可以评估程序质量的元素列举出来。比如,应用程序的响应时间、数据处理过程中抛出的未被处理的异常的数量、或者是程序的正常运行或(可运行)时间。不要直接评估程序的质量。支持请求周转时间 (你应对问题的反应时间和解决速度)对你的使用者来说,是非常重要的。
从中挑选最重要的特征,开始对它进行评估。在有了一个基本的测量准线后,确定一个可实现的目标,改进这个应用程序的(或者你自己的)表现以达到这个既定目标。当完成改进工作后,再做一次评估来证实你确实完成了你想要做的改进。如果你确实完成了,那就和你的团队成员及你的客户分享。
再挑选另一个测量标准,做一遍上述工作。完成第一个标准之后,你就会发现这像做游戏一样,很有乐趣,会让你上瘾的。
28.8小时激情燃烧
作为脑力工作者,即使我们不坐在电脑前或是办公室里,也可以工作。在和你的伴侣去吃饭的路上,或者你看电影的时候,都可以工作。你和工作如影随形。
确保今晚睡个好觉。明天,吃个早饭,然后正点去上班(比平常早一些更好)。投入地工作4个小时,吃午饭,然后再投入地工作4小时,确保4个小时后你肯定没有力气再做其他的工作了。然后,回家放松。
29 学习如何失败
▪发现问题后第一时间提出,不要企图隐瞒错误。因为在软件开发和测试中,越早发现错误,造成的问题就越小。越早发现并且暴露出自己犯下的错误,造成的负面影响就会越小。 ▪接受批评。就算你可以找到一只替罪羊,也别动这个念头。即使这不完全是你的问题,你也要承当责任然后继续工作。出现问题后,我们需要的是解决问题的方法,我们的目标是在最短的时间内解决这个问题。在谁来负责这个问题上纠缠不清的后果就是拖延解决问题的时间。 ▪提供解决方法。如果你没有想到解决的办法,那就提供一份有计划性的进程。陈述要按照具体可预测的时间顺序。如果你使团队陷入了困境,告诉大家你什么时间能给出一份解决问题的方案。这一情况下,一个具体可实现的目标,即使它非常小、对问题的解决也没有实质意义,也是非常重要的。因为它不仅使状况从坏向好的方向发展,也帮助你重建自己的可信度。 ▪寻求帮助。就算是你对问题负全部责任,也不要让自尊心作祟,拒绝别人的帮助,这样只会使情况更糟糕。这个时候,如果你放下自尊,保持一种良好的心态接受团队成员的帮助,那么你工作的伙伴、经理和客户都会欣赏你的表现。很多时候,我们都会对造成的问题产生一种责任感,致使我们承担起过大的重担,结果是历尽千辛却毫无成果,直到有人强制介入。
30.说“不”
评论者Karl Brophey建议大家记录下做出的每一个承诺。
▪到期日,你要完成什么?
▪你承诺的内容是什么?
▪如果你无法完成,记录下你的想法和你要接受的内容。
做出承诺的时候,记录下来。
31.不要恐慌
做一份关于恐慌的日记。在惊慌之前克制住它的办法就是当自己的感觉和情绪爆发的时候,要有一种超强的实时意识。我很幸运,通过事后分析自己应对问题时的反应,学会了这点。我不够聪明,没办法在事情发生的时候,分析自己的想法,但是我发现在正常情况下练习分析,使我取得了一些进步,当困难出现的时候,也能更好地做出即时的分析。
更好地分析自己的反应,说和做是两回事。写日记可以给整个过程创建一个结构。每天定时(用日历或者提醒)记录下使你
惊慌的境况,即使只让你感觉到一点点小惊慌也要记录下来。每周回顾一次上一周的日记,观察每一个引起惊慌的情况造成的持续影响。这个状况值得惊慌吗?对这种境况最有帮助的反应应该是什么?电影里的英雄人物要是碰到你这种情况,他们会怎么做呢?
这样反复练习之后,你会慢慢发现当你惊慌的时候,会同时开始做这些分析了。当你能够在碰到问题的时候理智地分析引起惊慌的原因,惊慌就会黯然隐退,最终消失。
32.说出来,行动,展示
我大学时的室友Chris,他每天早上起来一定要制定一天的计划,就算上课要迟到了,也必须要先做计划。他特别注重对练习钢琴的时间做出计划(他的专业是爵士钢琴)。其实在他选择课程的时候,他的计划已经非常缜密了,但他对课间休息的15分钟也做出了计划,他选择那些可以很快完成的练习来填补这段休息时间。他大部分课程的上课地点都在一栋教学楼里,所以本来他课间休息有足够的时间社交或者喝杯饮料,但他没有这样做。我们都坐着等着下一节课开始,Chris却充分利用这点时间练习音节或者听力。他甚至把时间按三分钟至五分钟分段,这样就可以在十分钟的时间里安排几个练习了。现在Chris是我们这个城市最受尊敬的音乐家之一。当然,天赋在这其中起到了一定的作用,但是我一直认为是他一贯按计划行事成就了他今天的成绩。
失败和模仿
比起其他我所认识的程序员,我经历过的失败比他们要多。当然这就意味着我负责的大多数项目都失败了。参与的那些鬼项目不过是一次次徒劳地想做点儿有趣的事情,成功的机会其实很渺茫,就像热锅里煮着的龙虾,折腾来折腾去,终免不了死路一条。很有趣,就像托尔斯泰说的那样“幸福的家庭都是一样的,不幸的家庭各有各的不幸”。尽管大家都说,经历过失败的公司对你而言就是不错的经验。但是就编程来说,我却没怎么听说过这个观点。
(这两点都是我擅长的,在经营上我也曾失败过。)商业上的失败会产生出一种很直接的经验。你学到节约开支的重要性,或者你会变得更加坚定。但是对编程来说,从可能会失败的项目中学到的知识要更有价值。我刚开始编程的时候,大部分时间都花在失败上了:编写操作系统、文件系统、虚拟计算机、重新实现网络通信协议、解释程序和运行时编译程序的编译器。这其中的大部分都没能正确运行,就算是能运行的,工作状况也不怎么样。当然,就算忽略技术层面的可行性,大多数工作从一开始就注定了要失败。我不知道仅有1%的成功机率的新操作系统占有多大的比例,但是1%的成功率确实很小。对我来说,做这些项目的编程才是最享受的。这些问题才是软件工程中最基本的问题。这些工作都是围绕如何在空间、速度、可靠性和复杂性之间寻找折中点,无需解决软件升级过渡或修补API的漏洞问题。就像我通常做的,可能你沉浸在这些问题中,潜心钻研了几个月,却始终找不到解决方法。我发现现在学习编程的人已经不会再经历这些事情了,但我说不出确定的原因。我认为至少有部分原因是因为互联网软件的兴起。就在几天前,骇客新闻网上还有人提问说现在到底还有没有人对编写客户端软件感兴趣。这么说有点夸张,但事实也大致如此。当然,互联网软件也是很棒的。
但是从编程的角度来看,这种转变还是会带来不利的影响。除非达到很广的范围,否则Web应用中很少包含严峻的技术挑战(不过Internet Explorer 6的兼容性问题却很多)。
换句话说,现在想要失败是很困难的,你必须要首先经历成功。
所以在这种情况下,我认为主动去寻找有失败倾向的项目是很重要的。抄袭怎么样?大家都会说,要想成为更好的程序员,你应该阅读好的程序。尽管他们的意思可能不是字面上的意思(阅读程序有点太无聊了),“读”这个词好像不应该出现在这里,因为它听起来有些被动。但是我认为应该坦然地主动大范围地抄袭。
抄袭在很多事情上都适用。Hunter S. Thompson不只是阅读好书,他也曾引用海明威和菲茨杰拉德的句子。人们所知道的巴赫最早期时候的手稿也是他对风琴手作品的改编。更著名的可能是比尔·盖茨,他在哈佛大学的垃圾桶里掏出一些程序设计师的笔记和字条,然后对着这些宝贵的资料研究操作系统。
抄写的功效是很容易就能被看出来的。抄写可以建立肌肉记忆。通过抄写你可以感觉原文的微妙之处和它的结构——如果只是粗略的的浏览,是无法发现这些细节的。
对编程来说,还有一个非常重要却不明显的好处。在处理那些看起来会失败的项目时,抄写可以让你走得更远。比如说一个散列表执行程序的副本(它让我写的第一个程序解释器没有那么糟糕)或者一个受到原作启迪影响的设计(例如Linux就是由Minix发展而来的)。
这就会产生失败和抄袭的良性循环,这个循环也是你评价自身进步的一种简单的方法。在处理棘手的项目时,你被一个不可逾越的难题绊倒了,你抄袭了别人的解决方法,结果是,不管问题是什么,现在你都知道该如何处理了。
这是一场无节制的掠夺,当你全心全意地去汲取各种各样的技术时,你会找到一种方法将这些技术以一种新的方式结合在一起。毕加索曾说过“好的艺术家会抄袭,而巨匠会偷”,我不知道这句话的真实含义是什么,但是前半句话的意思就是我一贯的主张。
编程的过程总是充满古怪的念头。使用较短且较少描述性的名字可以使代码更具可读性。最强大的语言通常都包含最少的概念。要想有成功的原创,失败和抄写可能是最佳途径。
33.不要忽视感觉
影响感觉的因素因人而异。你的母亲不会在意你面向对象的程序设计技术怎么样,但你的团队伙伴会在意。在人际交往关系中,你要弄清楚哪一因素对哪一种关系圈是重要的,这样你就可以给你周围的人留下可靠的感觉。想一想办公室里与你有着不同关系的人。比如,与你做着相同工作的同事,你的上司,一个或者几个客户,还有项目经理。
把他们分组(不管你办公室的关系结构是什么),并罗列出来。在每一项旁边记录下你的哪些特质会影响他们对你的感觉。
下表为例。
组 影响其感觉的特质
团队成员 技术水平、社交能力、团队精神
经理 领导能力、客户服务意识、沟通能力、项目跟进能力、团队精神
客户 客户服务意识、沟通能力、项目跟进能力
项目经理 沟通能力、项目跟进能力、效率、技术水平
依据实际情况,更换列表中的内容。根据这个表格,在工作中你会做出哪些改变。你已经做了哪些改变,而哪些改变是你还没有做的?
34。探险向导
(1) 自我检查——你是不是一个令人生畏的编程老恶魔?你确定么?他们是不是害怕告诉你真相?检查你的邮箱,找到一些你发给不太具有编程专业知识的同事、经理和客户的邮件。尝试站在他们的立场上再次阅读这些邮件。如果距离这些邮件发出已经有一些时间了,你会发现自己可以以第三方的角度来看问题了。还有一个更好的方法,把这些邮件给你母亲看。告诉她这是你的一位同事发给客户的邮件,问问你母亲对这些邮件的看法。
(2) 跳过围墙——寻找一个自己知之甚少、需要依靠别人的境况。如果你脚步动作极其笨拙,就想象自己是一名足球队员。如果你手部动作极其笨拙,就想象自己是国家编织队的一员。这种情况下,你会希望队友如何与你沟通?
35.学会沟通,善于写作。
(1) 开始记录开发日记。每天写一点,记录你做了什么工作,解释你的设计决定,检查棘手的技术和专业决策。即使你自己是第一位读者(或者是唯一的读者——这由你自己决定),也要注意写作的质量,和能够清楚表达想法的能力。时不时地回头阅读之前的日记,评论它们。通过你对之前日记的喜好,来调整你的新记录。这样做,不仅可以提高你的写作能力,通过这些日记你还可以加强你对所做决定的理解,当需要知道如何或者为什么你之前要做某事的时候,你就可以在日记里找到答案。
(2) 学习打字。如果你不是按指法打字,那就去参加一个课程或者下载一个学习软件。在习惯了输入技巧后,在写作的时候你就会更加舒服和自然。当然,如果打字速度快,那么在写作的时候也会节省很多时间。
36.到场
(1) 下周的某一天,强迫自己不发邮件(在合理范围内)。当你想要发邮件的时候,打电话给对方或者到他的办公室面对面地与他交谈。
(2) 想想你与哪些同事、上司和顾客的交流不够,列出名单。在日历上标注出给他们打电话或者与他们联系的时间(通过电话或者面对面)。谈话要简短且有意义。与他们谈论工作或者只是单纯进行人际沟通。
37.适当的言语
商业本身关注的是结果,经营者关注的也是结果。所以,如果不使用行业语言来推销你的成就是起不到作用的。
问这名员工:“最近在做什么工作?”然后会接着问:“这项工作的意义是什么?
(1) 罗列出你近期完成的工作,并写出每项工作的商业意义。如果对某项工作的商业意义不甚了解,可以请教你的上司或者某个你能够信任的熟人。
(2) 准备好你的“电梯演讲”,并将其牢牢记在心里。
38.改变世界
记录下工作中你亲眼看到过的改变。想想哪些同事是带着任务在工作,哪些同事是最努力最有效率的。他们的任务是什么?
你能想到这些任务中哪些是不合适的吗?努力和狂热的界限是什么?你的同事中有没有人越过了这条线呢?
39. 让人们听到你的声音
▪最优秀的萨克斯风手不一定总能找到工作(这条是最重要的)。 ▪和谁一起演奏是非常重要的,至少和你的演奏水平差不多;作为演奏者,联合的力量是强大的。 ▪有时候,优秀的演奏者常常被忽略,因为人们总是觉得他们没有时间,或者是人们根本不敢去询问这些优秀的演奏者有没有时间。 ▪人际关系网络非常重要。如果你并不认识某个乐手,那你就不太可能被邀请与此人一起演奏,除非有中间人介绍。
计算机这行也是一样。专门用来评估和雇用软件工程师的系统是不存在的。当然,优秀是非常重要的,但是只是优秀是不够的。我们这个行业,和音乐界一样,都是由一个复杂且广大的人际关系网构成的。你认识的人越多,得到好工作的机会就越大。如果只把自己局限在现在工作的公司里,就会严重限制你形成新的人际关系网的机会。
接下来,开始撰写自己的网络日志。有许多免费开办日志的服务。操作起来非常简单。一开始,你可撰写(或者链接)在你的聚合器模块中有趣的故事。慢慢你就会发现,网络日志这个环境本身就是一个社交网络——你开始建立的职业网络的缩影。你的想法会出现在别人的日志链接中,他们会撰写关于你的想法的文章,然后传播你的观点。
如果你还没有网络日志,现在就创建一个。在你的电脑里创建一个新的文本文件,列出一切可能的网络日志话题,这些就是你要撰写的专题文章。
不要局限在宏大的观点上。尝试那些10到20分钟内就可以写出相关文章的小想法。当这个列表达到10项的时候,就停止(如果你的灵感停不下来,那就继续)。
保存文件,但是仍然保持打开的状态。如果你重新开机了,那就再打开这个文档。为自己设定三个星期的期限。每天,从这个列表中找一个话题来撰写文章。不要过多的思考,就是写一遍关于这个观点的文章,然后在网络日志中发表。在文章中加入其他网络日志中相关文章的链接。每天挑选话题的时候,可以任意向此列表中增加新的想法。
三周后,挑选出你最喜欢的两篇文章,提交到类似Digg和Reddit这类由用户审查文章的网站上。如果你的列表中还有未撰写成文章的想法,那就继续写。
40.创建自己的商标
用Google搜索自己——用Google搜索自己的名字。阅读前4页的搜索结果(居然真有4页?)。根据这四页的搜索结果,别人会推断你是个怎样的人呢?这些结果是否能看出你是怎样的一个人?你对这个结果满意吗?
再搜索一次,但这次请注意论坛和邮件列表中的对话。你是不是一个傻瓜?
41.发布你编写的程序
Stuart Halloway在做了一个研讨会,他称之为“Refacto-tum”。如果你有机会参与,我极力推荐,要点如下:选一个带有单元测试的开源软件。在代码覆盖分析器中进行单元测试。找到这个系统中最少被测试到的部分,并编写测试来提高代码的覆盖面。未经测试的代码往往是无法测试的。通过重构可以增强代码的可测性。将你所做的改变作为补丁提交。
这样做的好处是它起到的作用是可以衡量出来的,并且可以在短时间内完成。所以你没有理由不去尝试。
42.变成卓越的能力
但市场的目的是什么呢?目的就是在生产者和消费者中间建立起关于某种产品或服务的联系。而这一联系的起点就是对该产品的认知。传统建立某种商品认知的方法是通过宣传,包括广告、邮寄目录和教育研讨会。
最近,人们又开始关注“病毒营销”。当某个宣传概念非常出色,使商品在消费者中一传十、十传百地散播开来,这就是病毒营销。它就像病毒一样扩散,每一个被感染的消费者都有可能将病毒传播给更多的人。
病毒营销之所以受到青睐,不只是因为它避免了邮寄目录和购买电视广告所带来的高昂费用。还因为比起电视广告和邮寄目录,消费者更相信身边的朋友。他们倾向于相信同事对某种产品的介绍,而不是夹杂在报纸中的宣传小册子。
营销大师Seth Godin在Purple Cow [God03]一书中十分肯定地宣称要想让消费者对产品做出评论,最好的方法就是将你的产品做得卓越。Godin称传统的营销要素已经过时了,消费者对老套的大众营销战略,即先广撒网,然后再祈祷的模式已经麻木了。他说,要想在人群中独占鳌头,唯一的方法就是确实卓越。
现在,挑剔的读者开始鼓掌欢呼了。你试图尝试的所有迷惑人的做法都比不上真正卓越的能力。别急着说“我早就这么说过”,我们先来探讨一下卓越的定义。
出色和好的含义肯定不同。通常,卓越的产品一定是好的。但是,好的产品却很少是卓越的。卓越的意思是值得被关注。仅仅比你认识的软件开发员好,并不能使你成为卓越的软件开发师。仅在量上超过其他人,是不足以让你的声誉像病毒一样扩散开来的。如果要求某人谈谈对你的看法,或许他会说出很多你的丰功伟绩,但是卓越的意思是人们会主动地谈论你,而不是被动要求。
要想卓越,就必须和周围的人大相径庭。大部分在本章中讨论的自我营销策略都是为了配合卓越。发布成功的开源软件、写书和撰写文章以及在研讨会上演讲都可能会提高你变得卓越的能力。
从小事做起,但是要在你现在的项目或者工作中做一些卓越的事情。比如可以力争卓越的效率。项目进程往往会有一些拖沓的部分。从中找到其他人认为要一个星期才能完成的工作,你用一天的时间来做完它,如果有需要就加班。不需要把加班作为一个习惯,但现在是一个试验。用非常短的时间来完成这项工作,看看其他同事会不会对此作出评论。如果他们没有评论,那是为什么呢?如果评论了,他们又是以何种方式来评论的?调整你所做出的改变,然后再尝试一次。
43.建立关系
(1) 挑选出你最喜欢的软件,并给它的开发者写一封邮件。邮件一开始先要感谢他开发了这个软件,接着提出建议、问题或者其他可以与他建立联系的尝试。请他对你的邮件做出回复。如果这一软件是免费或者是开源的,主动提议来帮忙。
(2) 在你生活的城市里,找一位你敬仰的或者愿意向他学习的人。找一个可以碰到这个人的机会(用户小组会议或者演讲会上都有很大的可能性),主动开始与他交谈,即使这样做会让你感到不舒服。事实上,正是因为这样做会让你感到不舒服,所以你才要迈出这一步。
44.已经过时的技术
每周找出时间来研究尖端技术。每周至少找出2个小时的时间来研究新科技,学习相关技术,并动手尝试。制作简单的应用程序。将你正在以当前技术做的项目,用新技术来做出新的原型版本,来理解它们的不同之处,以及新技术能够做些什么。在你的日程安排中加入做这项工作的时间,一定要按时完成。
45. 你已经失去工作了
如果你是一名程序员,尝试以一名测试员或者项目经理的身份来做一两天你的工作。 有哪些不同的角色是你从没考虑过要尝试的。把这些角色罗列出来,并尝试每天以其中一种身份来工作,看看自己是否适合。你可能看不出工作结果有什么不同,但是你会发现你工作的方式发生了变化。
46.没有终点的道路
美国社会存在的一个严重问题就是它是一个以目的为导向的社会。大到学习、职业发展的过程,小到开车的旅途,人们关注的总是结果。我们过于关注事件的结果,却忘记了全局。
仔细思考一下,在逻辑上我们应该要花时间关注的恰恰是结果的反面。基本上,我们大把的时间都花在了做事情的过程中,而结果基本上不会占用时间。举个例子,当你开发软件的时候,你的时间花费在整个开发的过程中,而不是在开发完成的软件上。
你的职业生涯也是一样的,最重要的部分不是晋升或者加薪,而是向这些发展方向努力工作的过程。或者,更重要的是,是你抛开这一切忘我工作的过程。
如果说这才是你工作生活的核心——真正的工作——那么你已经到达目的地了。你一贯使用的以目的为导向、关注终点的思维方式只会导致从一个目标到下一个目标,永远不会结束。大多数人都没有认识到过程就是终点。
回到软件开发这个例子,人们很容易就会倾心关注自己编写的代码的发布。客户需要一个网页应用程序,你就会专注于完成这个应用程序。但是,一个使用中的系统程序永远都不会有“完成”的一天。如果过多地关注最终产品会导致我们分心,忽略真正可交付的产品—— 一个新实体的可持续发展。
不要关注结果,要关注做事情的过程。Focus on doing, noton being done.
关注结果会使人忘记应该做好过程。糟糕的过程只能创造出糟糕的产品。产品或许可以实现其最低的要求,但是其内部会是一塌糊涂。你达到了短期的最终目标——但这并不能使产品可持续发展。不仅糟糕的过程制造出糟糕的产品,糟糕的产品也会导致糟糕的过程。一旦你生产出的产品内部一塌糊涂,你的工作过程就会围绕着它不断做出调整。产品的破窗会导致整个过程的破窗,这是一个恶性循环。所以,不要总是不停地问:“我们完成了吗?完成了吗?”重要的是你穿越这条道路的过程,而不是这条路的终点。
Naht Hanh在 The Miracle of Mindfulness [Han99]一书中提出了一条建议:在下次洗碟子的时候,不要只是想着要洗完它们。试着享受整个洗碟子的过程。不要关注于洗完它们,而是要关注“洗”这个过程本身。洗碟子是一项单调的工作,没人愿意做。软件开发师每天也要经历类似单调沉闷的工作,例如时间追踪和费用报告。下次再从事类似工作的时候,不要焦急地想要赶快做完它,尝试在工作中关注任务本身。
47. 给自己做一份蓝图
做出蓝图之前,先画出你曾经所处的位置,这会对你制作新的蓝图起到鼓励和启发的作用。清楚地列出你职业发展的时间表,标注出你从哪里开始,以及在每一阶段你的技术和工作是什么。注意在哪一个阶段你在持续进步,又在哪一个阶段取得了重大进展。注意你每一次取得重大进步的平均时间是多长。当你展望职业发展的时候,把这份蓝图作为参考。清楚地了解过去取得的进步,可以帮助你制定出更加实际的目标。制作出历史蓝图之后,要不断更新。当你不断向新目标前进的时候,这种方法可以很好地反映你的进步。
48.要注意观察市场变化
明年开始尝试做技术达人,或者至少结识一位技术达人,与他建立紧密的联系。
49. 镜子里的胖子
(1) 做一次360度评估。 ▪想想哪些人是你可以信赖的,并且你可以非常自在地请他们给出对你的评价。列出人名单。这一名单内最好要包括你的同事、客户、上司和下属(如果你有下属)。 ▪再列举出你认为作为专业人士需要具备的10项重要特征作为衡量标准。 ▪将这个列表转化成一份调查问卷。在这份调查问卷上,一定要包含下面这个问题要求参与者按每项特征对你做出评分。最后再加一个问题:“我还应该问哪些问题?” ▪将调查问卷发放给你列表中的人。要求他们以批判的角度对你做出建设性的评价。你需要的是诚实的评价——不是糖衣药片。当你得到回馈之后,仔细阅读每一份调查问卷,并依此制定
出下一步行动计划。如果你向正确的人询问了正确的问题,那么你会得到一些能够付诸实践的回馈。与你的评价者共同分享这些结果——不是分享他们给出的答案,而是你根据这些答案做出的行动计划。记得要向他们致谢。定期重复这一过程。
(2) 开始记日志。可以是网络日志,就像我们在第4章第39节中所讨论的,或者写日记也行。记录你在做什么工作,在学习什么以及你对这个行业的一些观点。坚持记录一段时间之后,回顾前面的记录,现在你仍然同意当时的想法吗?那些想法现在看起来幼稚吗?你改变了多少?
50.南印度捉猴子陷阱
Pirisig讲述这个故事是为了阐述一个概念,他称之为价值僵固。当你过于坚信某事的价值时,就会无法客观地来评判它,这即是价值僵固。猴子过于看重米的价值,所以它们无法看清放弃米就能得到自由。猴子这样做看起来非常地傻,但是我们每个人都有自己的“米”。
但不是所有坚信的价值都是正确的。而且很多时候,在某种环境下是正确的事情,到另一种环境下就不一定是正确的。
1) 找到你的捉猴陷阱——你的价值僵固是什么?在你完全不知情的情况下,哪些价值观在引领着你日常的行动。制作一个表格,划分出“职业”和“技术”两栏。在每一栏中列出你认为是不容置疑的价值。举个例子,在“职业”一栏中,你一直认为什么是自己的强项或者弱项?你的职业目标是什么(“我想成为一名执行总裁!”)?实现目标的正确做法是什么?在“技术”一栏中,列出你选择投资的技术中,哪些是你最看重的。做选择的时候,你认为什么技术特性是最重要的?你是如何制作可扩充的系统的?开发软件最具生产力的环境是什么?总体上来讲,最好和最坏的平台是什么?当完成这个列表之后,进行反向思考。如果你认定的事实的相反方面是正确的呢?请你诚实地向你认定的每一项事实发起挑战。这就是你自己弱项的列表。
(2) 了解你的敌人——找出你最讨厌的技术,并用它来完成一个项目。开发员喜欢将自己划分在某个竞争阵营中。.NET开发员讨厌J2EE,J2EE开发员讨厌.NET。UNIX开发员讨厌Windows,而用Windows的开发员又不喜欢UNIX。选择一个简单的项目,尝试用你讨厌的技术制作一个出色的应用程序。如果你是Java工程师,那就让那些.NET开发员看看一个真正的开发员是如何使用他们的平台的!这样做最好的结果是,你发现一直以来你非常讨厌的技术其实也不是那么糟糕,而
且用它还能开发出不错的程序。你还能掌握(当然,不是那么熟练)一种新的技术,以后或许会成为你的优势。最坏的结果是,做这个项目让你实践了一把,你也有了更好的证据来捍卫你的观点。
51.避免瀑布型置业计划
非常重要的一点是,职业的改变不仅是有可能的,并且是非常必要的。作为软件开发人员,你绝不会想全身心地开发某种客户并不想要的软件。敏捷开发方法帮助你避免此种问题的产生。你的职业道路也是一样。树立远大的目标,但是要在实现目标的道路上,根据情况不断进行更正。从实践中学习,不断改变你的目标。最终,我们都想让客户满意(特别是当制定自己的职业规划时,我们就是自己的客户)。
52.每天都有进步
在第49节中我提到长期以来我一直努力减肥和保持身材。事实上,如果你严重超重,就很难对“恢复身材”有什么概念,更不用说做出什么具体行动。更困难的是,如果你为了改善这种情况做了些努力,当时是看不出效果的,甚至一个星期之后你还是看不出任何改变。事实上,你可能整天都在健身减肥,但是一个星期之后,看不到任何成果。
即使是一点儿小进步,你也应该感到高兴。今天比昨天多写了一个测试,这已经帮助你向“更好地做单元测试”迈进了一步。如果你是从头开始,每天多写出一个测试,并保持这个速率,当你发现你无法再超越昨天的时候,就会发现自己现在已经可以“更擅长单元测试”了,也没有必要做相同的改进了。但是,如果你在第一天就想从零开始,一口气写出50个测试,那第一天会非常地辛苦,很可能你就不会再坚持下去了。所以,要逐渐慢慢地做出改进,从小做起,但是每天都要坚持。小的改进会降低失败所要付出的代价。如果有一天你没能坚持,那么明天你会有一个新的基线。
列出你想要做的复杂困难的改善——可以是个人问题也可以是职业问题。如果你的列表很长,那也没关系。然后,思考这个列表上的每一项,想想你今天能做点什么可以使你自己或者这项问题比昨天有些改善呢。明天,再看一遍这个列表。昨天和前天相比,你有什么进步吗?怎样做能使今天比昨天更进一步呢?把这项工作安排到你的行程表中。每天早上用两分钟的时间来思考。
53.独立
独立不是件简单的事情。这把你所有的技术作为一个专业来测试。现在你可能还没有做好准备。但你也没有必要做足这一切。把它当做是个人发展项目,在业余时间去推销自己。制定目标,以某种速率与客户签订合同,然后利用晚上或者周末的时间完成项目(但是千万不要利用上班时间做!)。在保留安全感的同时,你可以学到很多东西。最坏的结果不过是有几个星期你得加班加点地超负荷工作,结果却没能成功完成这个项目,然后回到你舒服的格子间里,以一种全新的感觉对你的工作心存感激。最好的结果是,你成功了,热爱这份工作,为自己的职业满足感和荷包充盈找到了一条新的途径。
我不只对技术好奇,商业经营也同样能引起我的兴趣。这使我勇于在自己身上下赌注,成为了一名独立的咨询师,并创立了一家培训公司(Pragmatic工作室)。我对经营小公司的好奇给了我学习新本领的机会:销售、市场、客户支持等等。纵观全局也帮助我成为了一名更好的程序员。所以,有什么东西是令你真正好奇的呢?试着跟随着自己的兴趣,看看会发生什么?结果或许会让你大吃一惊!
开心每一天
Kent Beck. Extreme Programming Explained: Embrace Change. Addison-Wesley,Reading, MA, 2000.[Cou96]Douglas Coupland. Microserfs. Regan Books, New York, 1996.[DL99]Tom Demarco and Timothy Lister. Peopleware: Productive Projects and Teams.Dorset House, New York, second edition, 1999.[GHJV95]Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Design Pat-terns: Elements of Reusable ObjectOriented Software. Addison-Wesley, Reading,MA, 1995.[God03]Seth Godin. Purple Cow: Transform Your Business by Being Remarkable. Portfolio,2003.[Ham02]Gary Hamel. Leading the Revolution: How to Thrive in Turbulent Times by MakingInnovation a Way of Life. 2002.[Han99]Thich Nhat Hanh. The Miracle of Mindfulness. Beacon Press, 1999.[HT00]Andrew Hunt and David Thomas. The Pragmatic Programmer:From Journeymanto Master. Addison-Wesley, Reading, MA, 2000.[Pir00]RobertM. Pirsig. Zen and the Art of Motorcycle Maintenance:An Inquiry into Values.Perennial Classics, reprint edition edition, 2000.[Sil99]Steven A. Silbiger. The Ten-Day MBA: A Step-By-step Guide To Mastering The SkillsTaught In America's Top Business Schools. Quill, 1999.