读我编程,我快乐:程序员职业规划之道

职业规划,从大学开始,很少考虑这个事情,大四那会儿还学过相关的一门课,当时也只是抱着学分修修到的心态。最近一年里开始思考这个问题,近期阅读了这本《我编程,我快乐:程序员职业规划之道》,开始学习着规划自己的职业。这本书不仅适合程序员,也适合其他职业。
准备按照章节摘抄出一些觉得有用的、引人思考的片段和一些有趣的练习题,再附加自己的感想。

第一章 选择市场

在《程序员修炼之道》一书中,Dave Thomas和Andy
Hunt谈到了编程中的偶然性:当你开始做一个程序的时候,或许手头上有一个从网上复制的示例程序,看上去这个程序可以使用。为了满足你的需求,你会对这个程序稍加改动——添加一些代码,再加一点。你根本不知道自己在做什么,只是不断地做一些小的修改,直到这个程序完全满足你的需求。但问题是,这样做就像是用纸牌搭建房子,每添加一张纸牌,就增加了一份纸房子坍塌的危险。你根本不知道这个程序如何工作的,所以你每做一点儿改动,都有可能导致你的程序完全失败。

在前台开发的时候经常遇到这种情况,会加各种js效果的功能,有些不是很懂,虽然能照常使用,但是做不到完全了解的话,出了问题解决起来比较费劲。所以使用别人的东西尽量做到知其然也要知其所以然。

如果你把自己的职业当成是一门生意(实际上它就是一门生意),那么你的“产品”就是由你提供的服务构成的。这些服务是什么?你又会把它们出售给谁?接下来的一年,对此种商品的需求是会增加还是减少呢?在这些选择上你愿意投下多少堵住?

把职业当成是生意,是个有趣的比喻。大道至简,万流归宗,真正分析起来,我们不管做什么,都是有迹可循有所参考的。我想我所拥有的服务就是出售自己的技术技能,出售给公司、朋友、客户等等。软件行业人才的需求量肯定还是比较大的,但是想成为一个人才必须经过一定的磨练才可以。接下来的一年,两年,五年十年,我觉得出售技术的服务是会增加的,所以我愿意投下的赌注将是我的青春。

练习
基于当今市场,按照从左到右的顺序尽可能多地列举出处于早期、中期和晚期的技术。最左边为崭新的尚未稳定的技术,最右边为即将退出市场的技术。尽可能仔细地找到它们之间的细微关联。
当你列举出所有你能想到的技术后,标记出你认为自己擅长的技术,然后换一种颜色,标记出那些你做过但是并不精通的技术。你的标记主要集中在哪个区域?它们是聚集,还是分散的?处于这张图表边缘的技术,有没有你感兴趣的?
按照我自己的印象分类:

  • MangodbGolang、Spark、nodejs、swift、R、AngularJS、Redis
  • javaC++、C#、PHP、tomcat、Jboss、Nginx、CSS3htmlhtml5、object-c、python、ruby、MysqlOracle、Sql-server、javascript、jQuery
  • CDelphiVB
    标红的蓝的是用的稍微多一些的技术,其他很多技术都没接触过,没有自己去玩一下,理解也没那么深刻。对于新技术,还是有一定的好奇心的,需要一点点接触。

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

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

事实上,软件工程师不能只会开发软件,应该要成为这个业务领域的专家。换位思考一下,如果你是客户,为你服务的程序员了解你的行业,不用什么都得由你来做决定,你也不用紧张担心哪个小细节会出问题,你会不会觉得工作起来更容易呢?你从事的行业也是这样。

练习
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“。如果你有机会参与,我极力推荐,要点如下:选一个带有单元测试的开源软件。在代码覆盖分析器中进行单元测试。找到这个系统中最少被测试到的部分,并编写测试来提高代码的覆盖面。未经测试的代码往往是无法测试的。通过重构可以增强代码的可测性。将你所做的改变作为补丁提交。
这样做的好处是它起到的作用是可以衡量出来的,并且可以在短时间内完成。所以你没有理由不去尝试。

你可能感兴趣的:(程序员,职业规划,市场)