Your time is limited,
so don't waste it living someone else's life.

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

图书信息:

我编程,我快乐:程序员职业规划之道/(美)福勒(Fowler, C.)著;于梦瑄译.–北京:人民邮电出版社,2010.8

ISBN:978-7-115-23352-3

一、做一名通才

有 句话是“什么都懂点,但什么都不专”,一般来说,这句话是贬义的,是说这个人没有专注于某一项领域,并深入学习,成为这方面的专家,但是当你的购物网站 “提交订单”出了故障,每个小时你都会损失上百个订单时,那这个“什么都懂点,但什么都不专”的人可能既知道这个程序代码是怎么运行的,还会做些简单的 UNIX调试,分析RDBMS规范中潜在的性能瓶颈,并能检查网络路由器配置看是否存在某些隐蔽的问题,更重要的是,找出这些问题后,这个人尅很快做出架 构和设计决定,纠正代码,部署一个新的系统。这样看来,机械化生产模式看起来就非常奇怪,而且具有很多的缺陷。

另外一个机械化生产模式无法立足的原因是:这种生产线使工作按照稳定的步伐直线进行,而软件项目通常是具有循环性的。不仅项目的流动是循环的,一个项目内部的工作也是循环的。在制定完软件的规格、架构和设计之前,程序员要么坐在椅子上等,要么在这段时间着手做其他项目。但这种同时参加多个项目的问题是,不管这个软件的开发目的是什么,当程序员要大展身手的时候,必须要依赖前后流程和经验。规格、架构和设计文档可能非常出色,但是如果程序员不懂这个系统是用来做什么的,他就不可能很好地实现这个系统。

当然,我所说的不仅适用于程序员。软件开发上的任何一个职位都是如此。由于前后流程的问题,同时参加多个项目并不可行。结果是,我们的生产系统是低效率的。在机械化生产模式中,有各种各样的方法尝试解决效率低下的问题。但是,我们还没有想出办法来优化我们的软件工厂,使它变得更有效率。

如 果你只是一名程序员、测试员、设计师或者架构师,那你很可能会坐在那里无所事事,或者当你的项目快要结束时,你却在忙忙碌碌。如果你只是一个J2EE程序 员或者是一个.NET程序员,或者是UNIX系统管理员,那当一个项目或者一个公司的关注点开始转移出你擅长的技术领域时,你就会发现你不再发挥作用了。这不是说一个项目的流程中,你的价值有多大(架构师的价值往往最大),而是说你可以在多广的范围内发挥作用。

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

成为通才就是说让你不要只专注于一种技术。在工作中,有很多方法可以让我们扮演多种角色。为了使成为通才这个概念形象化,我们可以把IT职业分解成几个独立的部分。我想到了五个,但肯定还有更多,就看你是如何划分的了:

  • 职业阶梯的各层
  • 平台和操作系统
  • 代码和数据
  • 系统和应用
  • 业务和IT

这些不同的方面可以帮助你了解如何成为一名通才。这只是审视职业的其中一种分类方法,你可以针对自己的情况,找到更好的方法。这里我们只对这个分类进行讨论。

二、成为一名专家

成千的Java程序员申请了职位,但没有一个人知道Java类装载器是如何工作的,也没人能高度概况出Java虚拟机是如何处理内存管理的。

没错,你不需要知道这些知识,在别人的监视下编写基本的代码。但是这些人是所谓的“专业人士”。很多人都认为专于某种技术就简答地意味着不知道其他的技术。要是这么说,那我就可以说我妈妈是一个Windows专家,因为她从来没使用过Linux或OS X系统。我还可以说我那些住在阿肯色州乡下的亲戚是乡村音乐的专家,因为他们从来都没听过别的类型的音乐。

假 设你左臂下方的皮肤里长了一个奇怪的肿块,你去看家庭医生。你的医生建议你去看专科医生做个切片检查。如果这个专科医生在医学院学习的时候根本没上过课, 或者他在做住院实习医生的时候没有做过你要做的这类切片检查呢?我的意思不是说他们可以从事比这个切片检查更高深的工作,要是他们只是学到了付钱的只是, 其他什么都不知道呢?你可能会问:“手术过程中,检测仪器开始哔哔作响怎么办?”这个医生的答案是:”以前没有发生过这种情况,这回也不会发生的。我也不 知道这仪器是干嘛用的,不过它从来没发出过哔哔声。“

谢天谢地,软件开发使做的不是性命攸关的工作……

遗憾的是,软件开发界有很多这样肤浅的专业人士,这些人以”专业人士“为借口,只知道一门技术。在医学界,专科医生是指对某一特定领域有深刻了解的人。医生建议他们的病人向专科医生寻求帮助,因为在某些特定情况下,相比于全科一哈说呢过,专科医生可以让病人得到更加专业的治疗。

……

如果做不到以上这些,那以后请不要再顶着专业人士这个头衔。

三、热爱它,不然就离开它

这些人不知道自己为什么在IT这行工作。他们偶然进了这行,是因为他们认为做编程收入不错,是因为他们的父母鼓励他们,或者是因为他们上大学时想不到什么更好的专业。不幸的是,他们的工作表现将这一切都揭露得一清二楚。

想想你读过的任务专辑或者看过的那些关于伟人的纪录片,虽然这些人都身处不同的领域,但是他们都有一个共同点——痴迷,热情。据报道,伟大的爵士萨克斯风手John Coltrane练习非常刻苦,甚至练习到连嘴唇都破皮流血了。

当然,在工作能力上,天赋站了很大的比例。不是每个人都能成为莫扎特或者Coltrane。但是,我们大可以通过找到自己热爱的工作来摆脱平庸

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

短时间内你可能可以伪装,但是缺少热情总会影响你自己和你的工作。

……

做一名机会主义者。

四、学习钓鱼

谁会希望自己总是任人摆布?如果你想要雇佣某人来为你工作,你会希望这个人总是要受那些专家的支配吗?我不愿意。我想要的是一个能够自立的员工。

很明显,你的出发点应该是学习如何使用你所处行业的工具。以源代码管理为例,它是一个非常强大的工具,它的功能中很重要的一点就是使开发人员的工作更具效率。你不应该把它视为你放置代码的地点。它是你整个开发过程中的重要组成部分。”工作权威资料库“很重要,但别让它来束缚你。一 个独立的开发人员如果检测过一个项目,那么在存储器中同事存在最后和最好的两个版本的时候,他很容易就能辨别出这两个版本之间的区别。或者你需要对最终发 行的代码进行漏洞修复。深夜里你突然发现一个致命的系统漏洞,你总不会想打电话向别人求助,找到正确的版本然后再开始解决问题吧。这种问题存在于IDE、 操作系统,以及任何一个基础环节中。

五、学习行业是如何运转的

不能小看业务领域的知识,它可以决定雇用方是否会选中你,而且也会让你在工作中赢来阵阵掌声。开始学习某一行业的细则之前,应该确定所做的选择是适合自己并且适合市场现状的。

但是,有一种知识既不属于技术范畴也不是特定于某一行业的,而且也不会很快就过时,它就是财务基本知识。不管你在哪一个行业工作——制造业、医疗部门、公益机构或者教育系统都是一个行业。行业本省就是一门你必须要学习的知识。

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

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

上一段中有一个词——创造性地——是关键所在。没错,我们是IT专家,这也是公司付钱雇我们的原因。有了合适的项目和领导班子,我们就应该努力做这个业务,根本不需要了解这行是怎么运作的就能为它提供价值。这些想法看似有道理。

但是,有创造性地增加价值需要全面地了解你所工作的行业知识。在商业世界,我们常常听到”账本底线“这个词。但到底有多少人真正理解”账本底线“是什么,以及什么能对它产生作用?更重要的是,又有多少人知道自己怎么做才能对这个”账本底线“起到有利的作用呢?你的组织是赔本还是盈利(你是为其创造了利润还是给它造成了损失)?

了解你公司的财务运作可以让你做出有意义的转变,而不是茫然无知地专注于某一事情,却主观地认为这样就是对的。

……

通读一本基础商业教程,一本MBA教程是不错的选择。我推荐一本非常有用的书The Ten-Day MBA [Si199]。

六、寻找良师

通常,经验丰富的成功人士都会受到一些重要人物的尊重。这个良师就成了你与这个人际关系网之间的桥梁。这种桥梁作用是不能被小看的。毕竟,有句老话是“有本事不如认对人。”

这种师徒关系的形式不重要。不需要特别清楚地要求某人成为自己的老师(当然你要这么做也不是坏事)。事实上,你的导师可能并不知道他在扮演着这个角色。重要的是你要有可以信赖钦佩的人,他可以帮助你做出职业导向,帮助你磨练技术。

七、做一名良师

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

……

我们通过传授知识学习。这听起来有些有悖常理,因为我们希望老师对他要传授的知识了解得一清二楚。当然,我不是说我们通过向别人讲授的同时就能学到新的真理——要是这样的话,那这些真理是从哪里来的?但是,知道真理并不意味着同样知晓它们的前因后果。这种深层次的理解才是可以通过教授学到的。当要阐明复杂问题的时候,我们会用简单一些的事例打比方。我们会弄明白为什么一个类比看起来似乎是可行的,但其实是行不通的,而另一个类比看起来不行,却是行得通的。当你向别人讲授的时候,你就必须回答这些你可能从未想过的问题。通过讲授,我们的那些知识死角就会暴露出来。

……

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

……

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

八、练习,练习,再练习

视奏:对一名专业录音乐手来说,首要能力就是能够在第一时间完美地视奏。我曾经为Blockbuster公司(音像租售公司)的圣诞乐曲专辑中吹奏萨克斯风。在一曲大型乐队演奏的快节奏的乐曲中,我演奏了序曲和第二段高音部分。当磁带开始滚动的时候,我才第一次看见乐谱。我演奏了一遍序曲,又演奏了一遍第二部分。任何失误都会使整个乐团重新在演奏一遍,这样就会浪费时间,并且增加工作室的租金。

作为软件开发师,视奏又是什么呢?是需求规格,还是设计?开源社区是找到用来练习的代码的绝佳场所。有没有哪个开源软件是你最喜欢的?你可以给它加个功能。挑选一个你想要用来练习的软件,浏览它的待办事项,给你自己规定时间来实现这个新的功能(或者至少决定要实现这个功能需要哪些步骤)。

选择好功能之后,下载源代码然后开始开发。怎么知道要看哪里?有什么好办法在一组重要的代码中理出头绪?又要从哪里开始呢?

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

即兴创作:即兴创作就是在某种结构或者限制的基础上创造新的东西。作为程序员,我发现自己往往在压力之下可以即兴创作。“哦,不!无线网络应用服务器出问题了,我们收不到命令了!”这情景常常发生在最具创造力、最即兴的编程过程中,比如通过无线网络从二进制日志文件中手动重发数据包来修复丢失的数据。没有人特意来为你做这些工作,特别是在这么紧急的关头。这种优秀并且迅速的编程能力在正确的关头发挥作用是非常重要的。

训练思维敏捷和提高即兴编码技术的好方法是通过自我限制的方式来练习。选择一个简单的程序,试着来限制你的编程过程。我最喜欢做的就是编写一个程序来显示那首老掉牙的歌曲“99 Bottles of Beer on the Wall”的歌词。如何能编出一个程序而不做任何变量赋值?或者在保证正确显示歌词的前提下,这个程序最小能做到多小?再加一个限制,你最快能用多久编出这个程序?可以使用定时器,练习编写一个难却小的程序。

这只是一种极限视角的练习方法。你可以从任何学科找到练习的对象,从视觉艺术到僧侣信仰。最重要的是找到你所需要的来进行练习,并且确保你不是在工作中练习。你必须要找出时间来练习,这是你的责任。

九、做事的方法

你工作的环境中,步骤也有可能是由上级传达下来的。当这个文件到达开发团队,可能已经变了味,或者被重新解释成了新的模样。像中国的一个游戏“耳边传话”,要传递的话从第一个人传到最后一个人那里时,可能会完全走了模样。那这就是一个开始行动的机会。研究这个方法,试着向你的团队和管理部门说明它最初的意思。你无法反对这个上级下达的步骤,那不妨通过正确的阐述使之运作起来。

方法论听起来像某种时髦的名词,很空洞。但是,这对软件开发步骤的研究会有所帮助——即使是研究你并不需要去做的事情。如果你很擅长软件开发过程,那你就拥有了一个更有力的论证来证明你的团队如何才能更好地工作。

即使有很多角度的方法论可供选择,一个公司也不可能完全照搬某个方法 。没关系,一个能使你的团队工作更有效率,帮助你们产生出更好的产品的步骤就是最好的选择。

唯一找到项目管理与软件管理混合方法的办法是研究可用的选择,挑选出适用于你和你团队的方法,从真正的实践中不断提炼总结。

如果你不能沿着这个程序走,那你就很难生产出产品。比起找到一个做软件开发的人来说,想要找到一个能够设计出软件开发步骤的人要难得多。所以,学习软件开发步骤的知识可以助你一臂之力。

十、其他

根据帕金森定律:“工作会自动膨胀到占满所有可用的时间”。

说“是”是个上瘾却具有毁灭性的习惯。这个是个坏习惯,却伪装成好习惯。

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

不要恐慌。

从不做出承诺最容易导致一事无成。

如果让我来选择两种能使我们取得进步的方法,我会选择失败和模仿。

幸福的家庭都是一样的,不幸的家庭各有各的不幸。

要想有成功的原创,失败和抄写可能是最佳途径。

在印度,我的团队成员都认为这种绩效考核系统可以正确地评定他们的工作表现。但这是因为这些员工从没使用过这类系统。事实上,对知识型工作和的能力以及他们的工作质量进行客观的评价是根本不可能的。

有些上司喜欢有上进心的雇员,也有的上司就希望员工表现得像个下级,上司说什么,就是什么。

 

赞(0) 打赏(金额可任意指定)
未经允许不得转载:峰间的云 » 我编程,我快乐:程序员职业规划之道

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏