软件随想录(local.joelonsoftware.com/wiki)-2006年04月11日 开发抽象层(改名自The Development Abstraction Layer)

2006年04月11日 开发抽象层(改名自 The Development Abstraction Layer) - The Development Abstraction Layer

 

开发抽象层

From The Joel on Software Translation Project

Jump to: navigation, search
  • 2006 年4 月 11 日

城里来了个年轻人。他外表迷人,口袋里也有些钱,女人们都乐意与他交谈。

对于自己的过去他并不多谈,但谁都看得出来他在大公司蹉跎了多年的青春。

年轻人的个性和善又外向,充满了信心却又不流于傲慢。也因此,他很快就开始在当地程序员聚会中接了些小项目来做。然而对于这些保单数据库、销售女性配件的网页、财务计算程序之类的小项目,他很快就兴趣缺缺了。

在无聊工作一年以后,他终于存到了一笔一年份的生活费。与爱犬小亚商量后,他就在自己杂货店楼上洒满阳光的租赁公寓里架了一台电脑,并安装了一些精心挑选的程序开发工具。

他一一打电话告诉他的朋友们,如果他接下来的几个月失联的话,便是正埋首于工作中,请大家不要担心。

一切就绪后,他坐下来开始打造他心目中完美的程序。

他最后创造出来的程序是多么地迷人啊。完美无瑕、充满艺术气息、优雅,而且一个臭虫都没有。由于使用者介面也完全符合人们的思考模式,他在当地程序员聚会中为同侪展示时,甚至没有人注意到有使用者介面的存在。这是一个相当出色的杰作。

受到同侪所激励,他开始设立公司并接受订单。

虽然他并不怀著不切实际的期望,但一个月后他的银行帐户依然空虚。到目前为止他只接了三份订单:一份来自母亲、一份来自当地程序员聚会的匿名赞助,还有一份是他自己测试用的订单。

第二个月过后,也没有新增的订单。

这个结果令他又惊讶又沮丧。他之前工作的大公司每次发表的新产品都没什么特别的。但即使产品不优雅也不漂亮,销售量依然大好。他参与的其中一个甚至还相当热卖。

又过了几个月,他的经济状况开始显得困窘。他的爱犬用哀伤的眼神望著主人,虽然不晓得到底发生了什么事,但也知道主人的脸愈来愈憔悴了。年轻人甚至连约朋友出去,或是出门补充生活必需品及洗澡都显得兴趣缺缺。

在某个星期二早上,楼下的杂货店开始不让他继续赊帐,城里的银行也很久不接他电话了。

他的老东家对他的离职并不怀恨在心。相反地,他们认同他的才华,也以更高薪找他回去工作。很快地,年轻人恢复了往日的光彩。他买了些新衣服,也找回失去已久的自信心。但他内心深处某些东西却已不复见,那就是从前眼神里的光芒。他原本期望能主宰自己命运的希望已幻灭了。

他为什么失败了呢?他相信他早就知道了答案,「就是『行销』!」他说。就像很多的年轻技术人员一样,他总是这样说︰「微软的产品很糟,但是他们很会行销。」

在软件开发者的口中,「行销」这个词就代表了所有做生意的事︰创造软件并且把软件卖出去,正是软件开发者所不懂的那些事。

其实,「行销」这个词汇的意思真的不是这回事。其实,微软的行销真的很糟。你能够想像,那些用恐龙人偶当主角的广告,真能让人想掏钱买微软的Office吗?

软件是一种对话 -- 软件开发者与使用者之间的对话。但是,想让这种对话发生,还需要很多软件开发以外的事。没错,它需要行销,但还需要销售、公关,还有间办公室、网络、基础设备、办公室的冷气,还有客户服务、会计,还有一大堆其他的支持性工作。

但是软件开发者在干什么呢?他们在设计程序写程序、他们编排画面、他们除错、他们整合、他们还会把程序代码给签入到源代码的控制系统中。

程序员的工作层次(比方说,Emacs)实在太过于抽象了,抽象到做不了生意。在抽象层工作的软件开发者,还需要一个实现层 -- 一个能将程序代码转换成产品的组织。桃莉巴顿(Dolly Parton)是在”唱好歌”那一个层次的,她也需要一个庞大的实现层,来帮她灌唱片、订演唱会场地、卖票、音效、宣传、收版税。

任何成功的软件公司都会包括薄薄一层的开发者,这些开发者分布在巨大管理组织抽象层之上建立软件。

这个抽象层存在的目的,只是为了建立一种假象,让大家觉得一个程序员的日常活动(程序代码的设计及撰写,程序代码的签入、除错等等),就是建立软件产品并将之引入市场的一切。这一点让我得出本文最关键的重点:

身为软件团队经理,你的第一要务是建立开发抽象层。

大多数软件经理新人都未察觉这个重点。他们只会一直想由好莱坞电影学到的传统命令式管理模式。

在命令式的作法中,经理/团队领队会找出公司的目标,然后对副官下达适当命令把公司往让方向移动。副官接下来会细分工作再命令下属执行。这个过程会沿著组织图往下重复进行,直到最后某个在最底层的人实际做事为止。在这种模式之下,程序员就是机器中的一根齿轮牙:一个执行管理阶层命令中某一部份的打字员。

某些企业实际上就是用这种方式运作。当你遇到这种公司一定都能分辨,因为和你说话的人都会做某些没大脑且惹人生气的事情,他们自己知道问题可能甚至还会介意,不过却无法可施。就是这种航空公司,会在客户想更改不可退费机票赶回家处理急事时拒绝,结果失去一个时常坐飞机的重量级顾客。就是这种网际网络供应商断线时间超过正常营运的时间,而且在你停用后还一直跟你收钱收钱收钱;而当你打电话去抱怨时,却得打付费电话花一个小时等候转接,结果还是拒绝退费,直接你开始写网志骂他们有多烂才作罢。就是这种底特律的汽车公司,长久以来早已忘记要如何设计出大家想买的车子,只会一直改变行销策略,好像我们不买他们的烂车只是因为折扣打得不够。

够了。

把它忘了吧。命令式的阶层管理系统已经被试过了,在1920年代与推著车的小贩竞争时,这种作法有一阵子似乎行得通,不过对21世纪来说并不够好。软件公司需要使用不同的模式。

对一家软件公司而言,管理的第一要务就是替程序员建立那样的抽象层。

如果某个程序员正为椅子坏掉而操心,或是因为等Dell送新电脑来闲置,表示这个抽象层已经有了裂缝。

把你的开发抽象层想像成一艘具备超级马力的美丽大游艇。游艇的维护无懈可击。美食准时送上。包厢每天有两次整理服务。导航地图随时更新。全球定位系统和雷达从不出问题,就算坏了舱内也有备份。而在舰桥上则是只需要考虑速度方向以及午餐吃鲔鱼还是鲑鱼的程序员。同时有一大队身著浆硬白制服的专业人员在甲板下悄悄活动,维持所有事情的运作、填满油槽、刮除藤壸、熨平午餐餐巾。这个支持团队知道要做什么,不过全都听从臭屁老领队(salty old fart)的指示。后者只要往某个方向轻轻点头,整队人就会完全协调演出,让程序员能把游艇的细节全部抽象掉,只要管速度和方向,以及午餐要吃些什么。

最需要为建立程序员的抽象层负责的就是软件公司的管理阶层。我们建造游艇,我们服务游艇,我们就是游艇本身,不过我们不驾驶游艇。我们做的每件事都是要为程序员提供一个无缝隙的抽象层,让他们能创造出伟大的程序,再让那些程序抵达能因而获益的客户手中。

程序员需要Subversion储存库。建立一个Subversion储存库意味著你需要一个网络和一台服务器,必须去采购、安装、备份,还要配置不断电系统;服务器会产生很多热,表示你得准备一个有额外空调的房间去放;而空调得连接到大楼外,表示大楼外墙外面要装一个80磅的风扇;安装这东西会让屋主紧张,所以他们得带自己的工程师来,协调要在哪里安置空调设备(决策结果:要装在往上到18楼的外墙上,可能是最不方便的位置),而屋主也会拉律师进来,因为我们得付出许多才获淮进行;然后当空调安装人员出现了,还带著有如芭比玩具组的吊索机具,让我们的建筑工头紧张起来,不肯让他们穿著半英寸粉红塑胶制的美泰儿(Mattel,译注:著名玩具商)系具爬出18楼窗外,于是有人得再把包商找来,搞清楚他们为什么在施工12周后,会突然发现得为这该死空调再次修改合约,而且这东西早在圣诞节前就知道要装但是刚刚才弄清楚。而这件事即使只让你的程序员花一分钟去想都嫌太多。

就你的团队中的软件开发者而言,这一切都必须被抽象化成只要在命令列键入svn commit。

这就是要有管理阶层的原因。

管理阶层就是为了那些没有公司能避免的事,不过如果让你的程序员为此而操心,那么管理阶层就算失败了。这就像如果百万富翁船主得下去引擎室建造引擎,这台一百英呎长的游艇也算失败了。

有些典型的软件公司是由前软件业务开始,在这种公司里销量就是一切,所有人都是为了增加销售量而存在的。市场上的这种公司可以辨别得出来,由于他们会制作软件的1.0版(不知怎么出来的),然后就完全没兴趣开发新软件了。他们的开发团队不是已经被饿死就是根本不存在,由于没有人想到要去制造2.0版...管理阶层懂的事就只有增加销量

在另一个极端是由前程序员所建立的典型软件公司。这些公司比较难以发现,由于在大部份情况下他们都会安静地坚持,在某个无人能发现的阁楼上磨亮他们的程序代码,于是他们就在「大Ruby重写风潮」(Great Ruby Rewrite)后静静地被人遗忘,而他们足以改变世界,能重整程序代码的程序结果也无法被世人欣赏。(译注:作者指Ruby太流行,一堆人用Ruby重写程序而不重整程序,所以能重整程序代码的重要工具就被人忽略了)

当一家公司是由程序员驱动,在组织上让程序员坐上驾驶座,同时却有优异的抽象层能在甲板下完成所有把程序代码转成产品的苦工。前面这两种公司都会轻易地被这样的公司消灭。

要让一位程序员发挥最大的生产力,必须搭配一间安静的个人办公室、一台强大的电脑、无限制的饮料,华氏68到72度的室温、屏幕上没有反光、一张极舒适而不会感觉到的椅子、一位替他们带来信件和订购的书籍手册的管理者,一位让网际网络让氧气般随时可用的系统管理者、一位能找出他们自己看不到的臭虫的测试人员、一位让他们的画面美丽悦目的绘图设计师、一组让大众想要他们产品的行销团队、一组确保大众能拿到这些产品的业务团体、几位协助客户使用产品,并让程序员了解导致客服电话的问题,极具耐心的技术支持圣人、以及其他十几位支持及行政人员,而这些在一家典型的公司里总共会占用八成的薪资支出。罗马军队中每位士兵配置四名仆人的比例并非巧合。这并不是堕落。现代军队的比例可能高达7:1。(今天Pradeep Singh教了我一些事:如果在你的人员中程序员只占两成,而把程序工作外包到印度可以节省五成的薪水,那么省下的一成支出究竟可以带来多少的竞争优势呢?)

管理阶层的首要任务,就是创造出软件公司能靠撰写程序代码运转的假象,由于这就是程序员所做的事。虽然拥有同时擅长销售、绘图设计、系统管理以及烹饪的程序员是很棒没错,但是并不切实际。就像教一只猪唱歌一样,既浪费你的时间又会惹恼猪。

微软在建立这种抽象层上做得非常好,以致于微软离职员工开创公司时非常辛苦。他们就是无法相信有多少事在甲板下进行,也不知道要如何去重现。

没有人期望桃莉巴顿知道如何接上麦克风。她背后有一个无法想像,由经理人、音乐家、录音技师、唱片公司、巡回演出经纪人、美发师、宣传人员组成的基础结构,这全部的一切只是要在她唱歌时建立那种抽象性,好像数百万人会聆听只是因为是她在唱歌。这所有让桃莉巴顿得以实现的支持人员和管理阶层所能做的最佳工作,就是提供最完美的抽象:那种桃莉巴顿为我们而唱的完美假象。这就是她的歌。当你用你的iPod聆听她的歌,其实是有个巨大的基础结构让这件事实现,不过这个基础结构所能完成最棒的事就是完全消失。只剩下桃莉巴顿独自对我们唱歌这个完美的抽象意念。

你可能感兴趣的:(软件随想录(local.joelonsoftware.com/wiki)-2006年04月11日 开发抽象层(改名自The Development Abstraction Layer))