• 简中
    • 繁中
  • 注册
  • 查看作者
  • 点解软件行业规模化咁难?

    神译局是转载旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外嘅新技术、新观点、新风向。

    转载:规模化生产可以降低成本,呢应该系一个好简单嘅经济理论常识。规模化生产喺工业领域是以标准化为前提嘅,例如汽车实现量产,企业因为实现标准化而受益。 软件行业确实完全相反,尤其系管理软件行业,更为突出。如果软件行业都系通过简单标准化实现规模,噉样软件企业也就太好做嘎啦,因为软件嘅拷贝是无成本嘅。但其实,软件嘅规模化是非常非常复杂嘅,以至于而家世界上没有任何一家公司好好嘅解决‌呢个问题,本文作者分析‌呢一现象背后嘅原因。原文标题Everyone Is Still Terrible At Creating Software At Scale,作者Mikio L. Braun

    点解软件行业规模化咁难?

    我有一种感觉,当人睇到软件嘅经济潜力后,就会开始寻找 “扩大规模 ”嘅方法,唔止唔休。

    软件有一啲奇特嘅地方,使佢同第啲事物唔同。好耐以前,我读过弗雷德里克·布鲁克斯(Frederick Brooks)嘅《神话人月》,书中提到‌一个概念交“意外嘅复杂性”(accidental complexity)。点解我哋已经揾到‌好多创造性学科组织工作嘅方法,但写软件仍然好难?

    我说软件好难是乜嘢意思?自己写软件也许需要花几天时间去做,工作度,变成‌企业跨越几个月或几年嘅项目,呢还只是创业公司,可能只有50个软件工程师。大企业中仲有更糟糕嘅情况。

    某公司一位好资深嘅管理者曾对我说,所有嘅大公司都系“咁样”运作嘅,大公司 “能成功”。我说嘅 “咁样”是指中央项目管理,迁移项目需要几个月才能完成,而对客户嘅影响却唔明显。好似是拿破仑喺一啲山上排兵布阵。他需要将骑兵放喺前面,但首先他要将这支部队调到河对岸,但喺这之前,仲系要要将另外三支部队调来调去等等。当然,呢可以做到(好似Twitter臭名昭著嘅放弃Ruby on Rails,改用 Java一样),但呢啲并唔好玩,也没有好好地利用大家嘅时间和金钱。

    有趣嘅系,我突然就联想到军队,呢可能就是大脑嘅工作方式吧,仲有好多第啲比喻 “规模化 “地编写软件嘅意向:比如瀑布,一种自上而下嘅方法,佢嘅灵感来自于工程项目。布鲁克斯提出嘅系外科医生嘅团队作为更好嘅隐喻。敏捷软件开发没有明确嘅隐喻,除咗本质上系一群人之外(”人高于流程!“)。以及,唔好问我SAFe(大规模敏捷开发)像乜嘢!

    我发现自己又想到‌电影行业,因为这也系一项既具有高度创造性,又有好多专业性嘅活动(有谁真嘅知道 “best boy grip”(第一灯光助理)是干乜嘢嘅?佢哋也花‌几十年嘅时间来摸索,所以可能哩个就是软件开发所缺少嘅。

    那么,软件开发有乜嘢特别之处呢?佢似乎系一种喺一心一意嘅情况下受益匪浅嘅活动。但係,你面前嘅代码只是冰山一角,似乎就算做嘅好好,你有时也需要将佢全部换掉,重写一遍(当然,如果你必须咁样做,至少要快)。

    一旦涉及到唔止一个人,你可以尝试让佢哋都喺度同一个心理表征上工作,好似喺结对编程(pair programming,两个程序员一齐配合)中一样,或者你需要引入一啲责任区域,让每个人都可以管好自己嘅事,或者至少更独立地工作。

    我好耐以前读过嘅另一本书叫《形式嘅合成笔记》( Notes on the Synthesis of Form),作者是Christopher Alexander,如果我没记错嘅话,其中一个主要嘅观点是,每当你需要针对好多约束条件设计一个系统时,如果你一次解决一个单个嘅问题,事就会成倍地变得简单(当然我是咁解读嘅)。所以这是个好主意,对吧?

    问题是,将问题分解成几个部分,就严重限制认识决问题嘅空间。如果你做错嘎啦,正确嘅解决方案取决于两个唔同嘅部分,如果孤立地睇,可能稳唔到解决方案。

    对于某啲类型嘅程序(如webservices),我哋揾到‌点样架构佢们以使工作更容易嘅方法,但往往当你喺编写那一个会系你嘅创业提供动力,并使你进入十角兽(创业唔到10年但市值超过百亿美元嘅科技公司)领域嘅软件系统时,你可能只喺半途才弄清楚乜嘢是最好嘅方法,如果你没有勇气去清理呢啲嘢,你最终会得到一个没有监督就无办法工作嘅分工,呢意味住需要软件架构师、项目经历和频繁嘅检查。

    呢种工作分离嘅情况,喺你决定谁喺一个团队中从事乜嘢工作嘅时候,每次都会发生。一旦你喺公司中定义‌团队,也会发生呢种情况。这将对你所写嘅软件产生非常真实嘅影响,也就是所谓嘅康威定律( 大致意思是设计系统嘅企业,佢们生产嘅设计等同于企业内嘅沟通结构)。Skelton和Pais写嘅《团队拓扑结构》(Team Topologies)一书就采用‌呢种见解,并应用‌ “反向康威手法”,按照你希望系统嘅样来设计团队。但你还是需要知道你嘅系统应该系点样嘅。

    敏捷软件开发提出‌一个强有力嘅策略,噉就是写最简单嘅能用嘅嘢,然后唔断重构(就是提纯嘅意思)你嘅代码库。有一啲书(好耐以前读过嘅一本Martin Fowler写嘅 “Refactoring”)谈到‌重构,但呢啲大多系一啲较小嘅改动,比如将类中嘅字段移到佢们所属嘅地方(此处为简化说法!)。

    喺呢一点上,已经非常清楚,“规模化地编写软件”唔系一个努力或意志嘅问题。单纯嘅 “快速行动,打破局面”是无办法帮助你实现呢个目标嘅(是嘅,我知道佢哋将佢改成‌ “用稳定嘅基础设施快速行动”)。我哋架构软件和团队嘅方式是非常现实嘅,会制约任何一个工程师或团队能做乜嘢、要投入几多工作。

    我发现自己又回到‌城市嘅比喻,我第一次读到呢个比喻系喺格雷和范德沃尔嘅《连系公司》(Connected Company)一书中。城市之所以引人注目,是因为城市往往相当古老,几乎睇起来是唔朽嘅,就算佢喺数百年或数十年间被重建和改造,并唔断变化。

    城市是人类活动嘅平台。佢们提供‌基本嘅基础设施,如道路、电力、建筑、你可以租用嘅商店空间,而家仲有互联网。其中一啲基础设施嘅变化非常缓慢(如道路),而另一啲基础设施嘅变化则要灵活得多,如公寓或商店嘅用途。

    如果也用同样嘅方式构建软件呢?如果我哋企业嘅核心部分像街道一样,新嘅嘢都系我哋可以喺上面搭建、实验,唔行就拆掉嘅嘢呢?我从内部睇‌几家电商公司,虽然佢哋嘅系统是能够每秒处理上千笔交易嘅技术奇迹,但感觉并唔系咁样,而是像App和网站咁样嘅嘢和第啲嘅嘢纠缠得好深。就算你想,你也无办法创建一个100%全新嘅应用或网站。

    反过嚟讲,如果我哋用建造软件嘅方式来建造城市,你可能就需要从专门嘅车库进入店铺,从屋顶出来走一条电线,先能到另一个用废旧集装箱定制嘅建筑去结账。而有啲窗户是涂上去嘅,因佢哋是MVP(最小可行性产品)。

    我哋正试图通过平台团队来实现,好似城市里嘅电力公司一样,提供商品服务,呢样就唔需要每个人都喺度地下室里运行自己嘅柴油发电机,呢系一个好好嘅第一步。但往往平台团队要迎合太多唔相干嘅 “客户”(比如后端服务和数据科学家都要部署基础设施),我哋通过强制使用平台团队来消除激励,使其为客户做好服务。

    城市也好‌唔起,因为只有有限嘅中央控制。如果有市场,商店就会开张,如果没有足够嘅生意,商店就会关闭。相比之下,大多数公司嘅经营方式更多嘅系自上而下,导致做出错误或唔正确嘅决定。

    至少,喺公司内部建立一个新嘅项目,应该比从零开始更容易,但我嘅直觉是,好多公司都无通过呢个测试。

    你而家可能已经意识到嘎啦,我只有指针,没有答案。我哋仍然没有做到呢一点。也许喺50年后,我哋已经揾到‌正确嘅角色,正确嘅团队结构方式,以及正确嘅方法来架构软件 “城市”,呢啲城市是有趣嘅。

    喺此之前,我嘅建议是审视一下结构,问问自己,喺你嘅 “系统”度,任何一个 “单元”完成事有多难,一切跨责任区嘅事都会增加复杂性。《团队拓扑学》(Team Topologies )一书建议,要偏向于端到端嘅团队,完全负责一个要解决嘅问题,由平台团队管理一个非常复杂嘅技术嘅团队来进行支持。

    对于嗰啲需要以流水线方式进行协作嘅团队嚟讲,无论点样都要从成个系统中找出瓶颈,并集中精力加以改进。噉就是Eliyahu Goldratt嘅 “约束理论”嘅核心思想。你需要限制正喺度进行嘅工作,使其同你嘅瓶颈相匹配,第啲嘅都系瞎忙活。

    也许仲有另一种方法,研究点样让人更有效地合作。我喺上面简单地提到‌结对编程,我唔得唔承认,我历来认为这是做唔到嘅,或者说只有少数非常认识对方嘅人才行,并且已经想出‌一种方法,可以互相启发。

    具有讽刺意味嘅系,根据我嘅经验,剩只是互相交换想法并唔系种好方法。你可能最终嘅结果是,人将自己嘅想法扔进圈里,只是为‌让人哋发现其中嘅错误。喺最坏嘅情况下,呢可能会变成一场比谁最懂、谁最聪明嘅比赛。

    除非你注意每个人对问题嘅理解唔同,没有注重信息收集和建设性嘅创意。我最近开始阅读更多嘅设计思维方法,比如说,利用头脑风暴既收集信息又产生新嘅想法。我发现呢啲嘢对共同解决问题有惊人嘅效果。无论点样,我哋肯定仲未有搞清楚点样规模化地编写软件嘅方法。

    译者:蒂克伟

    cantonese.live 足跡 粵字翻譯

    2021-04-21 18:35:08

  • 0
  • 0
  • 0
  • 169
  • 请登录之后再进行评论

    登录
  • 任务
  • 发布
  • 偏好设置
  • 单栏布局 侧栏位置: