职业规划,从大学开始,很少考虑这个事情,大四那会儿还学过相关的一门课,当时也只是抱着学分修修到的心态。最近一年里开始思考这个问题,近期阅读了这本《我编程,我快乐:程序员职业规划之道》,开始学习着规划自己的职业。这本书不仅适合程序员,也适合其他职业。
准备按照章节摘抄出一些觉得有用的、引人思考的片段和一些有趣的练习题,再附加自己的感想。
在《程序员修炼之道》一书中,Dave Thomas和Andy
Hunt谈到了编程中的偶然性:当你开始做一个程序的时候,或许手头上有一个从网上复制的示例程序,看上去这个程序可以使用。为了满足你的需求,你会对这个程序稍加改动——添加一些代码,再加一点。你根本不知道自己在做什么,只是不断地做一些小的修改,直到这个程序完全满足你的需求。但问题是,这样做就像是用纸牌搭建房子,每添加一张纸牌,就增加了一份纸房子坍塌的危险。你根本不知道这个程序如何工作的,所以你每做一点儿改动,都有可能导致你的程序完全失败。
在前台开发的时候经常遇到这种情况,会加各种js效果的功能,有些不是很懂,虽然能照常使用,但是做不到完全了解的话,出了问题解决起来比较费劲。所以使用别人的东西尽量做到知其然也要知其所以然。
如果你把自己的职业当成是一门生意(实际上它就是一门生意),那么你的“产品”就是由你提供的服务构成的。这些服务是什么?你又会把它们出售给谁?接下来的一年,对此种商品的需求是会增加还是减少呢?在这些选择上你愿意投下多少堵住?
把职业当成是生意,是个有趣的比喻。大道至简,万流归宗,真正分析起来,我们不管做什么,都是有迹可循有所参考的。我想我所拥有的服务就是出售自己的技术技能,出售给公司、朋友、客户等等。软件行业人才的需求量肯定还是比较大的,但是想成为一个人才必须经过一定的磨练才可以。接下来的一年,两年,五年十年,我觉得出售技术的服务是会增加的,所以我愿意投下的赌注将是我的青春。
练习
基于当今市场,按照从左到右的顺序尽可能多地列举出处于早期、中期和晚期的技术。最左边为崭新的尚未稳定的技术,最右边为即将退出市场的技术。尽可能仔细地找到它们之间的细微关联。
当你列举出所有你能想到的技术后,标记出你认为自己擅长的技术,然后换一种颜色,标记出那些你做过但是并不精通的技术。你的标记主要集中在哪个区域?它们是聚集,还是分散的?处于这张图表边缘的技术,有没有你感兴趣的?
按照我自己的印象分类:
发现市场上的不平衡
从供求规律中,我们可以学到重要的一点——需求的增长会加剧价格的竞争。如果只想做稳定可靠的工作,并且跟随着工作发展,那么你就会卷入与国外开发人员的价格竞争中,因为你的技术决定了你只能进入平衡的外包市场。如果在主流技术市场中竞争,你就必须在更高层面上竞争,否则,你就要去发现市场上的不平衡,找到外包公司无能为力的工作。这两种情况,你都必须找到工作的动力,提高自身技术和灵敏度来应对一切变化。练习
研究当今技术市场的需求。利用招聘广告和招聘网站找出哪些工作是高需求,哪些是低需求的。登陆外包公司的网站(如果你在这些公司工作,可以直接与员工交流),把这些公司的技术与你发现的高需求工作进行比较。记录下那些在国内市场中高需求且没有流到外包市场的技术。然后再将这些外包公司的技术与前沿科技相比较。密切关注外包公司还没有涉足的上述两类技术。思考它们需要多长时间才能为相应的市场提供服务。这个时间差就是市场不平衡的阶段。
事实上,软件工程师不能只会开发软件,应该要成为这个业务领域的专家。换位思考一下,如果你是客户,为你服务的程序员了解你的行业,不用什么都得由你来做决定,你也不用紧张担心哪个小细节会出问题,你会不会觉得工作起来更容易呢?你从事的行业也是这样。
练习
1、安排一次与业内人士的午餐,问问他们是如何工作的。交流中,思考如果你来做他们的工作,你会做什么改变或者你可以从他们身上学到什么。咨询他们日常工作中的细节。问问他们技术是如何帮助(或者阻碍)他们工作的。从他们的角度出发,思考你的工作。
2、选择一本与你公司行业有关的杂志。 试着阅读它们,虽然有些东西你可能不懂,但是要坚持。列出你可以向客户咨询的问题。不要担心你问的问题很傻,客户会大为赞赏你的这种学习态度。
找一个你可以随时登陆的行业网站。无论是浏览网站时,还是阅读杂志时,注意大事件和专题文章。你所处的行业正在为什么而努力?现在的热门是什么?不管是什么,把它们介绍给你的客户。请他们说说观点看法。思考这些潮流是如何影响你的公司、你的部门、你的团队,以及你自己的工作的。
你身边的人会对你产生很大的影响,明智地选择你的圈子
寻找最棒的IT人士,并与他们一起工作,你会发现自己变得出奇地睿智。你写的东西,和你的谈吐都会变得越来越有智慧。你编写的程序和设计会越来越高雅优美。你会越来越有创造力,难题也迎刃而解。
找一个团队,让自己成为“最差”的。不需要立即调换工作,你可以试着找一个志愿者项目,通过与这个项目中其他程序员的合作,提高自身能力。查查有哪些编程团队会议,然后去参加这些会议。程序员一般都会用业余时间做兼职,以此来练习新的技术,提高自身技能。
如果在身边找不到这样的程序员组织,就利用网络。找一个你钦佩的开源项目,且他的设计者是你下一阶段发展的目标。浏览这个项目的待处理列表和官方讨论区,或者编写一个功能或者修正一个大的错误。你的代码要模仿这个项目的代码风格,但是又要让你的代码和设计与其他项目完全不同,甚至让原作的程序员都认不出来。在你觉得一切都妥当之后,把它作为一个补丁提交。如果你做的好,这个项目就会接受它。这样重复来做。如果这个项目的设计团队不同意你的观点,那就将他们的反馈加入到你的设计中再次提交,或者记录下他们做出的改变。最终,你会发现自己成为了这个项目团队中值得信赖的一员。你会惊喜地发现虽然这些高级程序员并不在你身边,你甚至连他们的声音都没听过,但你已经从他们身上学到了很多东西。
关于应聘
优秀的程序员有资格提出条件。他们之所以寻找变化和多样性的工作,是因为他们喜欢学习新东西,或者是因为他们很清楚要想成为更加成熟、更加全面的程序员,就必须去学习新的技术、在新的环境下工作,获取新的经验。练习
学习一种新的编程语言。这门新的语言应该可以让你的思维方式产生变化。如果你是java或者是C#的程序员,那就尝试学习类似Smalltalk或者Ruby这种不需要采用强类型的静态编程方式的语言。或者,如果你一直在做面向对象开发的话,可以尝试Haskell或者Scheme这样的函数式语言。你不需要成为专家,可以感到这种新的编程环境与你之前所处的环境的不同之处即可。
尝试一下Ruby
一个决定职业规划的因素是跳槽,父母也不会赞成这个观点。一个成熟的职业软件开发人员需要从各个角度了解这个行业:产品开发、IT支持、内部业务系统开发以及管理工作。作为软件开发人员,你看到的角度越多,攻克的技术难题越多,就意味着你越有足够的能力来面对艰难项目。对一个程序员来说,只在一个公司工作,加强单一业务技能,会局限职业发展。
父母的态度是跳槽不可取,待一个公司了,就勤勤恳恳工作。假如说服不了父母,那就自己做主吧。程序员的人生是“Hello World”——拥有全世界。
通才很少,所以很珍贵
成为通才就是说让你不要只专注于一种技术。在工作中,有很多方法可以让我们扮演多种角色。为了使成为通才这个概念形象化,我们可以把IT职业分解成几个独立的部分。我想到了五个,但肯定还有更多,就看你是如何划分了:
- 职业阶梯的各层
- 平台和操作系统
- 代码和数据
- 系统和应用
- 业务和IT练习
列出你能将你的知识和能力融合在一起的工作内容。写下每个方面中你的专长。例如,如果你列出了平台和操作系统,那就可以在旁边写上Windows和.NET。在你专长的右边,再列出你要学习的一种或者几种技术,可能是Linux和Java(或者是Ruby、Perl)。
然后尽快(一周之内)找出30分钟开始研究你要学习的一门技术。不要只是单纯阅读相关的书籍资料,动手实践一下。如果它是种网络技术,那就下载一个Web服务器安装包,然后自己安装。如果是与做生意有关的话题,那就找一个你的客户,约他出来吃饭聊聊天。
需要学习的点一直都会有,安排,消化。
成为一名专家
在软件界,什么样的人才能称得上是专业人士呢?我在招聘的时候找遍了每一个角落,寻找真正深刻了解Java编程和部署环境的人。我想要寻找的人是已经处理过我们工作中可能遇到的80%的问题,并且拥有足够的知识来应付另外还未出现的20%的问题。我需要的人是不仅可以处理高水平的抽象,同时应该了解那些实现高端抽象的低端细节。我需要那些可以解决部署问题的人,或者如果他们解决不了,至少应该知道找谁来帮忙的人。
计算机界变化迅速,只有这样的专业人士才能生存下来。你是.NET专业人士,但这绝不能成为你除.NET之外对一切一无所知的借口,而是说,你是.NET的权威,但当IIS服务器需要重启时,对你来说是小菜一碟。有人问你怎么用Visual Studio .NET进行源控制集成时,你的答案是:“我做给你看。”由于不满意应用性能,客户提出要退出项目,这时候,你只需要三十分钟就能把问题解决。练习
1、你是否使用在虚拟机上编译并执行的编程语言?如果你使用,花点时间学习虚拟机内部是如何工作的。很多书籍和网站都专门就Java,.NET和SmallTalk进行讨论。学习这些东西总比你凭空想象要简单。
不管你使用的编程语言是不是依赖虚拟机,花点时间学习编写源文件。你敲打出来的代码是如何从可阅读的文本转变成可被计算机执行的命令的?编写你自己的编译程序又意味着什么?
当你输入或使用外部函数库时,它们是从哪里来的?输入一个外部函数库到底意味着什么?你的编译程序、操作系统或者虚拟机是如何将多个代码段连接起来,形成一个连贯系统的?
掌握这些知识可以使你在技术选择上向“专业人士”跨近一步。
2、在工作中或者工作外寻找一个教课的机会。你所传授的知识是自己想要深入学习的技术。因此,尽管一心一意地投资在一项特定技术上不是明智的选择,但是如果你必须这么做,那么别选择商业性质的,考虑一下开源的。即使你不想或者不能在工作中利用开源方法,那就把开源作为一个平台,使自己可以对一项技术进行深入学习。例如,你想成为了解J2EE应用程序服务器是如何工作的专家,那你要做的不是去致力于研究如何配置和部署一个商业应用程序服务器的细节(毕竟,任何人都会在config文件中调整设置,对吗?),你应该去下载一个开源JBoss或者Geronimo服务器,留出时间来学习这些服务器内部是如何运作的,而不是只学习如何操作。练习
试着做一个小项目,做两次。第一次尝试使用在家里就能使用的技术;第二次,使用你最惯用的竞争性技术。
深入了解tomcat,尝试Nginx。
学会钓鱼
要主动问,不要等着别人来告诉你练习
1、如何与为什么?——在你读书或者工作的时候,想一想工作中你不完全懂得问题。你可以问自己两个问题:它是如何工作的?为什么会发生这种情况?
对这两个问题,你可能给不出答案,但是只要你问了,就会形成一种新的思维模式,也使你更加关注自己的工作环境。IIS服务器是如何通过向ASP.NET发送请求来结束工作的?为什么我必须要为我的EJB应用程序生成这些接口和部署描述文件?我的编译程序如何处理动态和静态链接?如果店主住在蒙大纳,为什么计税的方法就不同了?
当然,这些问题的答案很有可能会引发对这些问题的新一轮探索。当在这个”如何和为什么“的环节中你无法再深入了,那就证明你已经达到目的了。
2、”提示“时间——在你的工具箱里挑选一种非常重要却经常被忽视的工具。可能是你的版本控制系统,可能是你一个广泛使用却只知皮毛的库,也可能是你用来编程的编辑器。
选定了工具后,每天花一点时间学习这项工具的新知识,帮助你提高工作效率,或者能让你更好地掌握开发环境。比如,你可以选择操作GNU Bourne Again Shell(bash)。当你的思绪游离出手头的工作时,你可以上网查询关于使用bash的提示,而不是装载Slashdot。很快,你就可以找到有用的资源来教你如何使用shell。现在,有了新的诀窍,你就可以利用一系列”如何和为什么“的问题来深入研究它的和新了。
有什么不懂的知识点,在网上基本都能找到答案,但正式因为信息爆炸,信息量大到让人无所适从,不知道如何下手,使用”如何和为什么“方法可以更有针对性地利用网络资源,提升自己。
学习行业是如何运转的
只有了解了一个行业后,你才能创造性地有所建树
有创造性地增加价值需要全面地了解你所工作的行业环境。在商业世界,我们经常听到”账本底线“这个词。但到底有多少人真正理解”账本底线“是什么,以及什么能对它产生作用?更重要的是,又有多少人知道自己怎么做才能对这个”账本底线“起到有利的作用呢?你的组织是赔本还是盈利(你是为其创造了利润还是给它造成了损失)?
了解你公司的财务运作可以让你做出有意义的转变,而不是茫然无知的专注于某一事情,却主观地认为这样就是对的。练习
1、通读一本基础商业教程,一本MBA教程是不错的选择。我推荐一本非常有用的书The Ten-Day MBA。你真的可以在10天内读完,占用不了多少时间。
2、找一个人带你到公司的财务部门看看,并请他们向你讲解财务状况。
3、听完财务状况讲解后,再向他们复述。
4、弄明白为什么”账本底线“要被称为”账本底线“。
一直在强调业务比技术重要,为什么业务重要?工作了几年之后会发现,了解了业务才能深入了解需求,只有需求正确,做出来的东西才不会偏离。需求是基于实际业务的,只有摸透了业务,才有可能在此基础上加以创新。
财务状况、账本底线,商业相关的知识完全没了解过,是时候做出改变了。
寻找良师
接触更优秀的人,才能变得优秀。最简单的方式,就是拜读优秀程序员的经典著作,从书籍中汲取思想。
做一名良师
想弄明白自己是不是真正懂得某一知识,那就把它讲给其他人听
想起刚开始工作那会儿给客户做培训,效果很差。现在想起来,是自己对业务不熟悉,导致培训时连自己都不自信,又谈何获得良好的培训效果?其实在一次一次的教导中,自己也可以获得更多,也就是exp up。
练习练习再练习
1、Topcoder——Topcoder.com是一个很早就存在的编程竞技网站。你可以注册然后通过线上竞赛赢得奖励。就算你对竞争没兴趣,Topcoder还为你提供了一个练习室,里面有很多可以练习的问题。现在就去注册尝试一下吧。
2、Code Kata——Dave Thomas是《程序员修炼之道》的作者之一,他接受编程练习这个想法,并使之实用化。他创造了一系列的很小却深具启发性的练习,被称之为Code Kata,程序员可以使用他们选择的编程语言来做这些练习。每一个Kata都针对某一特定技术或者思考过程,这样程序员的思维就可以更加灵活。
这本书的印刷过程中,Dave已经创造出了21个Kata,你可以在他的博客上免费使用。在这个博客上,你还可以看到通讯名单的链接,以及别人解决这个问题的方法和相关讨论。
你的挑战:练习这21个Kata,并撰写使用Kata练习的日记(或者是博客)。当你完成这21个Kata后,开发你自己的Kata,并与别人分享。
站在巨人的肩膀上
用现有程序来反思自己的程序练习
1、选择一个项目,像读书一样研读并且做笔记。归纳出好的方面和坏的方面。发表一篇评论。至少找到一个你可以借鉴的技巧或者模式。再找到至少一处缺点,提醒自己在开发软件的时候不要犯这类错误。
2、找到一些志同道合的人,每个月聚会一次。每次聚会有一个人提出一段代码——2行或者200行都可以。分解它,然后讨论这段代码背后的东西。思考做出这个程序所做出的决定,权衡没有包含在这个程序中的代码。
雇主付给我们报酬是要我们创造价值,我们必须要把书本上的东西付诸实践。在成功的道路上,你的能力在没有得到实践之前不能带你走太远。冲过终点的才是最终的胜者——即那些完成工作的人。
工作是很现实的东西,理想抱负也是。钱是基础。技术可以创造价值,从而体现我们自身的价值。
就是现在
如果你把自己做的项目当作是一个竞赛,那你就可以更快地完成工作。开始行动,不要总是安于现状,要做推动者。记得随时问问自己:“现在我们能做些什么?”
现在流行拖延症&如何治疗拖延症,我觉得只是思想上未解放而已XD
每日成绩
计划和跟踪工作成绩,对我们每个人都有益。大家都知道如果我们的工作成果超出了经理的预期,那我们就会成为最优秀的员工。但令人惊讶的是,如果把超出经理预期作为一个有价值的目标,很少人有办法能察觉出如何以及什么时候我们超出了老板的预期。练习
留出半小时时间,拿一支铅笔和一张纸坐在一个安静无人打扰的地方。想想每天你的团队都在忍受的那些吹毛求疵的小问题。把它们写下来。哪些烦人的任务每天都要耽误整个团队好几分钟的时间去讨论,却没人有时间或精力来完成这些任务?
你现在做的项目中,哪些工作是可以自动完成的,而你却在手动完成?记录下来。你来构造或者部署一个过程如何?你可以解决哪些问题?又将如何增加成功率呢?记录下这些想法。
给自己实实在在的20分钟,记录下所有的想法,不管是好的还是坏的。一定要做满20分钟。列出清单后,在另一张白纸上理出你最感兴趣的(也是最烦人的)5项任务。下周一,瞄准这个清单上的第一项,任务做点成绩出来。周二,第二项;周三,第三项;以此类推。
有计划地做可以减少一些不必要的麻烦,当然,执行力很重要。
别忘了你是在为谁工作
经理的成功,就是你们的成功
如果说经理的工作是了解和设定工作的优先顺序,而不是亲自去做所有的工作,那么你的工作内容就是去做这些具体的工作。你并不是在帮经理做他的工作,而是做自己份内的事情。
你可能担心经理会把你的功劳据为己有,但是别忘了你的职业发展前景把握在你经理的手中(至少在你现在的公司中)。在大部分公司中,直接总管负责绩效考核、工资、奖金和升职。所以,你的功劳最终还是在你的经理那里折现了。
问自己“今天实现自己的价值了么?“
你可以把这个问题变得更具体一些,就是问自己你又增加了多少价值?可以问问你的上司,如何最好地把它量化。有想把它量化的想法就是好的。你怎么做才能帮助公司节省开支?如何提高整个团队的工作效率?考虑一下使用你们软件的最终客户。一旦你开始考虑这些问题,你会非常惊讶地发现你可以找到很多的机会。现在,就开始行动吧。
水桶中的鹅卵石,拿掉一颗并不会影响一桶水太多
谦逊不仅仅是我们需要发扬的一种美德。谦逊能让你更加清楚地审视自己的行为。你越是成功,就越有可能犯下重大错误。当你得到很多肯定的时候,你就会很少质疑自己的决定。你使用的方法屡试不爽时,你可能就会忽视可能会有更好的方法。你开始变的傲慢。人一旦傲慢,就会产生盲点。越认为自己无可取代,就越可能被别人取代(你在公司存在的意义也就越小)。
勇敢说“不“
清楚知道自己无法做到却还依然做的承诺最不容易实现。没错,这听起来再显而易见不过了,但是我们每天都在这么做。我们被逼上了这个位置,又不想让领导失望,所以我们对不可能完成的任务点头了。
说“是“是个上瘾却具有毁灭性的习惯。这是个坏习惯,却伪装成好习惯。“能够胜任“的态度和歪曲某人的能力有很大的不同。后者不仅给自己造成麻烦。也会给你所承诺的对象制造麻烦。假设我是你的经理,问你有没有可能在这个月底修改公司订单履行系统中查询配送的方式,我问此问题的目的很可能就是强调在这个月底前有没有可能。可能是别人问我这个工作在月底前能不能完成。也可能是我们要依靠这个系统做一次大的商业转变。所以,因为你的承诺说可以在月底前完成,我就对客户做出了承诺。
当然也不要过分地说“不“。“能够完成“的态度还是值得欣赏的,有延伸目标也是好的。如果你不能确定是否能做某事,但是你想要尝试一下,那就说出来。“这是一次挑战,但我想要试一试。“这样的答案非常好。当然,有时候,答案就是“是“。
要勇于诚实。
状态报告可以帮助你推销自己
你应该于你的上司讨论你的计划。当你至少完成一轮计划之后,再开始讨论。重点是,在你的领导要求和你讨论计划之前,主动与他们交流。每周收到一封员工上周工作结果汇报和下周工作计划的邮件,不会引起经理的反感。经理们正希望员工能够主动发给他们这样的邮件。养成记录周报、月报等的习惯。
简而言之,就算你的产品非常优秀,史无前例,但是如果你不宣传它,那就没人会去购买。众所周知——尤其是在软件这个行业里——最好的产品不一定就能在竞争中取得胜利。市场宣传更为重要。在职场中,也不要忘记这一金科玉律。
不要忽视感觉
你可能听说过这个古老的心理学问题:“如果森林里的一棵大树倒下了,却没有人听到它倒下的声音,那么它倒下的时候到底有没有发出声响呢?“
这个问题的正确答案是:“谁会在意这个?“
树倒下的时候可能制造出了声响,但是在抽象层面上,这不是一个振奋人心的答案。如果没人听到它倒下去的声音,那么树倒下去制造声响的这一事实其实是无关紧要的。
你的工作也是同样的道理。如果你非常出色,但并没有人之道,那你真的优秀吗?谁会在意?没有人会在意。让别人听到你的声音
第一步就是阅读网络日志。如果你不知道读什么日志,那就挑选出几位你最喜欢的技术类书籍作者,然后通过网络搜索,通常他们都会有自己的网络日志。订阅这些日志的,以及这个网页上链接的其他人的日志链接。慢慢地,随着你阅读和寻找其他人的网络日志链接,你的日志链接列表就会不断增加。
接下来,开始撰写自己的网络日志。一开始,你可撰写(或者链接)在你的聚合器模块中有趣的故事。慢慢你就会发现,网络日志这个环境本身就是一个社交网络——你开始建立的职业网络的缩影。你的想法会出现在别人的日志链接中,他们会撰写关于你的想法的文章,然后传播你的观点。发布你编写的程序——参与开源
Stuart Halloway做了一个研讨会,他称之为“Refactotum“。如果你有机会参与,我极力推荐,要点如下:选一个带有单元测试的开源软件。在代码覆盖分析器中进行单元测试。找到这个系统中最少被测试到的部分,并编写测试来提高代码的覆盖面。未经测试的代码往往是无法测试的。通过重构可以增强代码的可测性。将你所做的改变作为补丁提交。
这样做的好处是它起到的作用是可以衡量出来的,并且可以在短时间内完成。所以你没有理由不去尝试。
每周找出时间来研究尖端技术。每周至少找出2个小时的时间来研究新技术,学习相关技术,并动手尝试。制作简单的应用程序。将你正在以当前技术做的项目,用新技术来做出新的原型版本,来理解它们的不同之处,以及新技术能够做些什么。在你的日程安排中加入做这项工作的时间,一定要按时完成。
你不是你的工作
有一件事是可以确定的,那就是任何事情都是处于变化之中的。经济形态也在不断转型中。工作机会涌向国外又转回我们这里。企业家们正在设法去适应这些变化。我们这个行业仍未稳定,就像是一个处于青春期的孩子——有些尴尬、难看,一年一个样——每天都会有新的变化。
所以,如果你的工作是编程,别把自己当成一名程序员。继续工作,但是不要满足于你的工作。永远不要把自己的身份定位于程序员,或者设计师,或者测试员。练习
如果你是一名程序员,尝试以一名测试员或者项目经理的身份来做一两天你的工作。有哪些不同的角色是你从来没考虑过要尝试的。把这些角色罗列出来,并尝试每天以其中一种身份来工作,看看自己是否适合。你可能看不出工作结果有什么不同,但是你会发现你工作的方式发生了变化。
没有终点的道路
你的职业生涯,最重要的部分不是晋升或者加薪,而是向这些发展方向努力工作的过程。或者,更重要的是,是你抛开这一切忘我工作的过程。
如果说这才是你工作生活的核心——真正的工作——那么你已经到达目的地了。你一贯使用的以目的为导向、关注终点的思维方式只会导致从一个目标到下一个目标,永远不会结束。大多数人都没有认识到过程就是终点。练习
Naht Hanh在The Miracle of Mindfulness一书中提出了一条建议:在下次洗碟子的时候,不要只是想着要洗完它们。试着享受整个洗碟子的过程。不要关注于洗完它们,而是要关注“洗”这个过程本身。
洗碟子是一项单调的工作,没人愿意做。软件开发师每天也要经历类似单调沉闷的工作,例如时间追踪和费用报告。下次再从事类似工作的时候,不要焦急地想要赶快做完它,尝试在工作中关注任务本身。
给自己做一份蓝图
作为软件开发师,从你做系统的工作经验来看,你知道,当做维护工作的时候,人们很容易就会墨守成规,原地踏步。当你在维护一个其他开发师使用的应用程序或者一个库的时候,除非你有一份功能路线图,否则工作就会再漏洞修复模式停滞不前。可能因为用户的要求或者你自己的需求,你会偶然做一下提升,但是代码通常会停滞在一个稳定的状态,改变的速度非常慢,因为你认为这个系统已经完成了。
但是一个使用中的程序是永远没有完成的一天的,除非它要退休了。你和你的职业也是一样的。除非你不想在这个行业干了,否则你就需要一份蓝图。如果微软认为Windows3.1已经完成了,那么现在我们所有人都只能使用Macintosh。Apache的开发师们要是认为他们的网络服务器达到1.0时就已经完成了,那么他们现在就不会引领这个市场了。
个人的产品路线蓝图是用来判断你是否在不断向前发展的依据。每天,你出入相同的办公室,从事大量相同的工作,周围的环境没有任何变化。所以,你需要在合理的范围内做出一些标记,当你达到这些标准的时候,你就知道你不是停滞不前的。产品的“功能”就是这些标记。练习
做出蓝图之前,先画出你曾经所处的位置,这会对你制作心得蓝图起到鼓励和启发的作用。清楚地列出你职业发展的时间表,标注出你从哪里开始,以及在每一阶段你的技术和工作是什么。注意在哪一个阶段你在持续进步,又在哪一个阶段取得了重大进展。注意你每一次取得重大进步的平均时间是多长。当你展望职业发展的时候,把这份蓝图作为参考。清楚地了解过去取得的进步,可以帮助你制定出更加实际的目标。制作出历史蓝图之后,要不断更新。当你不断向新目标前进的时候,这种方法可以很好地反映你的进步。
要注意观察市场变化
你必须要时刻细心留意。注意技术方面的新闻——不管是商业方面的还是纯技术方面的。O’Reilly and Associates公司的Tim O’Reilly曾说,要留意那些技术达人。技术达人是指那些总是站在技术最前端的人,至少在他们感兴趣的领域中他们总是走在尖端。通过我的观察,Tim的意思是说如果你能找到这类人,观察他们热衷于什么,那你就能够大致了解到三门技术将会成为热门,或者预测出两年后的热门是什么。这招非常灵。
南印度捉猴陷阱
在Zen and the Art of Motorcycle Maintenance一书中,作者Robert Pirsig讲述了一个南印度人如何捉猴子的故事:
南印度人多年来一直受到猴子的困扰,他们发明了一种巧妙的方法来捉猴子。他们在地上挖掘一个又长又窄的洞,然后用一个同样长窄的物体来扩宽这个洞的底部。他们把米倒入这个拓宽了一些的洞底。
猴子很贪吃,这也是猴子惹人厌的重要原因。他们会跳上车子或者不顾危险追着一大群人,就从你的手里抢走食物。南印度人一直为此困扰,时刻警惕着这些猴子。
当猴群发现这些米,将胳膊深深地伸进洞里,手就会到达底部。他们会贪婪地抓米,直到手里装不下了为止,这个过程中手会攥成拳头。洞底较大的部分可以容下他们的拳头,但是其他较窄的地方就太窄了,猴子的拳头就卡住了。
当然,猴子们可以放弃食物,获得自由。
但是,猴子非常看重失误,看重到根本无法强迫自己放弃食物。他们会一直抓着那些米直到把米拉出来,丧失性命也不会放弃。基本上它们都会为了食物失去生命。
Pirisig讲述这个故事是为了阐述一个概念,他称之为价值僵固。当你过于坚信某事的价值时,就会无法客观地来评判它,这即是价值僵固。猴子过于看重米的价值,所以它们无法看清放弃米酒能得到自由。猴子这样做看起来非常地傻,但是我们每个人都有自己的“米“。
如果有人问你帮助发展中国家资助饥饿的孩子是不是正确的做法,你很可能连想都不会想酒回答“是的“。但是如果有人质疑这个观点,你可能会觉得他们简直是疯了。这就是价值僵固的例子。你过于坚信你的看法是正确的,所以无法想象有人居然会持不同的观点。显然,我们对某事的坚持不一定都是不好的。对大多数人来说,宗教信仰(或是没有宗教信仰)是个人信仰和价值观的一部分,不容质疑。
但不是所有坚信的价值都是正确的。而且很多时候,在某种环境下是正确的事情,到另一种环境下酒不一定是正确的。
每天你都能够看到自己,所以看不出自己的体重发生了变化。价值僵固也是同样的。每天我们都在工作中度过,在做职业选择的时候很容易就会产生价值僵固。我们知道什么奏效,并一直坚持着。或者,可能你一直想被提升到管理岗位,所以你一直向那个目标努力,却忽略了自己是多么热爱编程。
无论是你职业的发展方向还是你拥护并投资的技术,都要小心那个“捉猴陷阱“。之前认真做出的选择可能就是你职业走向没落之前你抓到的那最后一捧米。练习
1、找到你的捉猴陷阱——你的价值僵固是什么?在你完全不知情的情况下,哪些价值观在引领着你日常的行动。
制作一个表格,划分出“职业“和“技术“两栏,你一直认为什么是自己的强项或者弱项?你的职业目标是什么(“我想成为一名执行总裁!“)?实现目标的正确做法是什么?
在“技术“一栏中,列出你选择投资的技术中,哪些是你最看重的。做选择的时候,你认为什么技术特性是最重要的?你是如何制作可扩充的系统的?开发软件最具生产力的环境是什么?总体上来讲,最好和最坏的平台是什么?
当完成这个列表之后,进行反向思考。如果你认定的事实的相反方面是正确的呢?请你诚实地向你认定的每一项事实发起挑战。
这就是你自己弱项的列表
2、了解你的敌人——找出你最讨厌的技术,并用它来完成一个项目。开发员喜欢将自己划分在某个竞争阵营中。.NET开发员讨厌J2EE,J2EE开发员讨厌.NET。UNIX开发员讨厌Windows,而用Windows的开发员又不喜欢UNIX。
选择一个简单的项目,尝试用你讨厌的技术制作一个出色的应用程序。如果你是Java工程师,那就让那些.NET开发员看看一个真正的开发员是如何使用他们的平台的!这样做最好的结果是,你发现一直以来你非常讨厌的技术也不是那么糟糕,而且用它还能开发出不错的程序。你还能掌握(当然,不是那么熟练)一种新的技术,以后或许会成为你的优势。最坏的结果是,做这个项目让你实践了一把,你也有了更好的证据来捍卫你的观点。
避免瀑布型职业计划
非常重要的一点是,职业的改变不仅是有可能的,而且是非常必要的。作为软件开发人员,你绝不会想全身心地开发某种客户并不想要的软件。敏捷开发方法帮助你避免此种问题的产生。你的职业道路也是一样。树立远大的目标,但是要在实现目标的道路上,根据情况不断进行更正。从实践中学习,不断改变你的目标。最终,我们都想让客户满意(特别是当制定自己的职业规划时,我们就是自己的客户)。
每天都有进步
每一个改变之后,你可能无法看到整体发生明显的不同。当你努力得到你同事的尊重,或者努力变得健康的时候,每天取得的进步不回直接导致有形的结果。就像我们之前所说的,这是因为远大的目标会使人丧失动力。所以,对于努力实现那些远大又有难度的目标,非常重要的一点就是不要总想着每天都要离最终目标近一些,而是应该想每天要比前一天做得更好。举个例子,我不能保证我今天比昨天更加苗条了,但是我可以控制今天是不是比昨天付出了更多的努力去减重。如果我付出了更多的努力,那我就有权利为我所做出的努力而自豪。通过这种持续可见的进步,我不再感到内疚也不再拖延时间。而内疚和拖延时间正是我们战胜重大困难的因素。
即使是一点儿小进步,你也应该感到高兴。今天比昨天多写了一个测试,这已经帮助你向“更好地做单元测试“迈进了一步。如果你是从头开始,每天多写出一个测试,并保持这个速率,当你发现你无法再超越昨天的时候,就会发现自己现在已经可以“更擅长单元测试“了,也没有必要做相同的改进了。但是,若果你在第一天就想从零开始,一口气写出50个测试,那第一天会非常地辛苦,很可能你就不会再坚持下去了。所以,要逐渐慢慢地做出改进,从小做起,但是每天都要坚持。小的改进会降低失败所要付出的代价。如果有一天你没能坚持,那么明天你会有一个新的基线。
最棒的是,这条简单的箴言可以应用于非常具体的目标,比如完成一个项目或者更改软件。它也可以应用于非常高水平的目标。在改善职业发展的道路上,你今天是如何比昨天做得更好的呢?多交了一个朋友,又向一个开源项目提交了一个补丁包,撰写了一篇有深度的博文并将它发布在了你的网络日志上。今天于昨天相比,你又在技术论坛上多为一个人解决了问题。如果在改善自己的道路上,每一天都比昨天多做出一点改变,你就会发现——拥有卓越的职业生涯——这个目标变得越来越容易达成,而不再像汪洋大海一样没有边际。练习
列出你想要做的复杂困难的改善——可以是个人问题也可以是职业问题。如果你的列表很长,那也没关系。然后,思考这个列表上的每一项,想想你今天能做点什么可以使你自己或者这项问题比昨天有些改善呢。明天,再看一遍这个列表。昨天和前天相比,你有什么进步吗?怎样做能使今天比昨天更进一步呢?把这项工作安排到你的行程表中。每天早上用两分钟的时间来思考。
每天进步一点,这个观点适合每一个正在奋斗的人。积少成多,聚沙成塔。目前为止,我已经练习《囚徒健身》三个4周,接下来是第四个四周,每周给自己一组目标,并且纪录下来,完成一个四周以后做一个总结,几个字,几句话都可以。完成了目标,你会为自己感到自豪;没完成,也不必要气馁。失败的时候,请原谅自己,过于苛求自己并不见得就好,自我同情比自我打击有效很多。健身效果是以年份来体现的,对于职业作出的努力也是一样,相信自己!
写在最后:书中的很多观点和练习都需要长时间的坚持,实践一段时间后,再来补充。