开发抽象层

  • 2006 年4 月11 日

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SCal2.PNG

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

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

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

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

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

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

SCal3.PNG

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

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

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

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

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

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

SCal1.PNG

够了。

把它忘了吧。命令式的阶层管理系统已经被试过了,在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教了我一些事:如果在你的人员中程式员只占两成,而把程式工作外包到印度可以节省五成的薪水,那么省下的一成支出究竟可以带来多少的竞争优势呢?)

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

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

SCal4.PNG

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