工程师忽略的隐形成本

标签: 工程师 隐形 成本 | 发表时间:2015-01-05 20:59 | 作者:
出处:http://kb.cnblogs.com/

  英文原文: The Hidden Costs That Engineers Ignore

  有时候我们说,“实现这个功能,我只花了几个小时”。但是完成之后,我们发现每隔几周,我们要么在修复该功能的 bug、向另一个工程师解释,要么做客服回答问题、解释其工作原理。维护该功能总的投入时间要远远超过最初开发的几个小时。

  软件工程特有的最严酷的教训之一就是额外复杂度所带来的隐形成本。有时候,复杂度在问题领域只是固有的。为了匹配乘客和司机,通过调整价格来平衡供求是一个复杂和痛苦的问题。因此,在扩大一个社区和维护社区质量的时候,把问题和答案疏通到喜欢回答和看问题的人们那里,也是如此。或者像是开发一个兼容所有设备的富文档编辑器以支持实时协作。这是固有的复杂度,我们需要根据产品做出调整以取得成功。

  但是其它时候,和我们较劲的恰恰是我们自己产生的复杂度。我们用新编程语言写代码,很少人了解它,现在我们不得不维护它。或者我们增加了额外的基础架构,因为我们尝试从 Hacker News 看到的热门新技术,但是它失败了,这是我们当初没有想到的。或者我们引入了一个很少人使用的功能,但是修复和 bug 报告就花掉了极不对称的大把时间。

  额外的复杂度暴露了很多隐形成本。在开发软件时,我们所做的决定不只是决定了我们当前的开发速度,它们还要反映出我们花在维护上的时间和努力程度。

   复杂度的隐形成本

  太多复杂度增加了认知负荷,并产生了做完事情的额外阻力。它以很多不同的方式渗入到团队里——大部分是直接渗入到代码、系统和产品复杂度里,但是间接地渗入到了组织的复杂度里。我们逐个看看这几种不同类型复杂度的隐形成本。

   代码复杂度

  代码复杂度不只是随着代码行数的线性函数而增长——它组合式地增长。在复杂的代码库里,每行代码可能与其它很多行代码交互和影响。我们对于组合式增长难以有足够的认识,这就是为什么我们倾向于严重低估完成大型软件项目所需要的时间,这也是 重写项目有时候会大幅延期的主要原因。

  当代码过于复杂的时候,它将变得难以扩展、难以理清其中缘由、难以修复 bug,很难理清追踪错误来源的依赖和数据流向。工程师或许会积极地避免代码库最复杂的部分,即使它是可以做某种修改的、最有逻辑的地方,也要选择绕弯来解决。他们或许避免把那些地方都组合起来,即使这项工作有着很大的影响。

   系统复杂度

  工程师喜欢摆弄新玩具,要么因为好奇,要么因为他们认为新技术可能为解决他们的紧迫问题提供了银弹。当 Pinterest 在 2011 年刚开始扩容网站以应对快速增长时,他们只有 3 个工程师的后端小组却使用了 6 种不同的存储技术(MySQL、Cassandra、Membase、Memcache、Redis 和 MongoDB)。他们实验每项新技术的诺言都是解决现有系统的某些限制。但是,每种新解决方案都以其自身特定方式失败了,为了管理和维护而投入了更多时间和努力。最终,团队明白了,增加更多机器而不是更多技术,更能简化扩容,因此他们消除了 Cassandra 和 MongoDB 之类的系统,强化了架构的已有组件。

  把基础架构切分为太多系统,会带来很多隐形成本,注意力被分散到了多个系统。对于每个系统来说,更难以整合资源以开发可复用的资源库,更难以为日常工作招聘新人,更难以理解具体的失败模式和每个系统的性能特点。每个系统的抽象最终变得更弱,因为没有太多的可投入时间。当工具和抽象太复杂、或太多的时候,让团队去理解和探索将变得困难。

   产品复杂度

  产品复杂度可以导致一个不明确的版本、或引发缺乏产品聚焦的无节制野心。它希望在很多地方是优秀的,而不只是在一个核心领域,这种欲望使其不能向新用户明确地解释产品的意图。产品复杂度引发了更多的代码和系统复杂度——团队增加更多代码、更多基础架构以支持新功能。当产品外围宽泛时,增加一个新功能或修改现有功能,将需要放大很多的努力来理解和适应旧的功能。

  过于复杂的产品意味着有更多的代码分支,更多要考虑的问题、更多的需要团队解决的 bug 反馈。工程师和数据科学家需要分析更多的变量、做更多的一次性的报表,而不是集中于核心用户行为的理解上。工程师需要投入更多时间来提供功能空间和提高效率。每个人最终在更多的项目中进行切换。投入在维护所有这些功能上的时间,并不是重新投入代码、 偿还技术债务、加固抽象的时间。

   组织的复杂度

  代码、系统和产品复杂度,依次产生了组织的复杂度。团队需要雇佣更多人来处理和维护已开发的所有东西。越大的团队意味着越多的沟通成本、越多的协调和和越低的总体效率。招聘过程本身,涉及的所有面试和汇报,消耗了团队很大比例的时间。当然,所有新员工不得不被培训才能上岗。

  雇佣更多人的替代方法,就是将工程师组成划分成更小的团队——或许甚至创建了一人小组——来承担较多代码、系统和产品外围的工作。这降低了沟通成本,但是 一人小组有他们自己的成本。一旦遇到难题,就完全拖延了项目中的唯一人手,因为有更少的人来分享这些低谷期,这种体验对于士气是有害的。与其他人合作的机会少了,会伤害到工作场所的快乐和员工的留任。除非每个人比较自觉,而且主动询问反馈,否则个人收到的工作反馈将更少,因为分享相同项目上下文的人更少了。减少的反馈能够降低代码质量、或因疏忽导致的复杂度引入到代码库或基础架构里。

   如何应付复杂度

  Tony Hoare 在 1980 年图灵奖的演讲中建议,“构造软件设计有两种方法:一种是简单,明显地没有缺陷;另一种方法是使其复杂,却没有明显的缺陷。”提到了由于复杂度而导致的非明显的缺陷是如何伤害我们的,以及我们该如何应对这些成本?

  下面是你能够用到的一些策略:

  • 为简单而优化。抵制增加更多复杂的主张。深思维护成本。要自问,为了解决 20% 的问题而引入的复杂是否值得,或者 80% 的解决方案已经足够了。
  • 为你的团队或产品定义一种任务说明以统一思想。在 Team Geek,Brian W. Fitzpatric 和 Ben Collins-Sussman 解释了他们是如何辅导 Google Web Toolkit(GWT)团队、并鼓励他们写下任务说明的。接下来发生的、对于任务说明的内容和形式的争论,表明了首席工程师并不真正认同产品方向!他们被迫面对、协调不同、并最终达成了,“GWT 的任务是为用户彻底提升 web 体验,让开发者使用现有的 Java 工具在任意现代浏览器里构建高性能的 AJAX。”如果他们不能尽早找出这些区别,随之而来的努力上的分散又有多少呢?
  • 用较小的构建块组成大型系统。Google 就是个例子,致力于构建健壮的核心抽象,然后被非常宽泛的应用程序广为使用。他们有基础的构建块,像 Protocol Buffers、Google File System 和远程程序调用的 Stubby 服务器。基于这些构建块之上,他们还建立了其它抽象,比如 MapReduce 和 BigTable。在此之上,包括大型 web 索引、Google Analytics 站点追踪、Google News 聚合、Google Earth 数据处理、Google Zeitgeist 数据分析在内的数以千计的应用程序,还有很多程序都是这样构建的。
  • 清晰地定义模块和服务之间的接口。模块和服务的退耦,将减少能够产生一堆代码的组合复杂度。在 Amazon,Jeff Bezos 于 2002 年宣称,公司将转向面向服务的架构,所有团队只能通过服务层级的接口彼此交流。虽然这个转变造成了本身巨大的开发成本,但是它强制分离了代码和服务背后的逻辑,为现在极度成功的 Amazon Web Services 的建立提供了便利。
  • 优先偿还技术债务。我们总是在信息不完全的条件下开发软件。做为条件变化的响应,代码库在增大,熵也在增大。增加的复杂度成为了未来开发的代价。在开发日常上预算时间可以减少这项成本。很多工程师和团队在项目之间预算这项时间,不过召开一次性的会议会有帮助。我过去在 Quora 组织过一次 Code Purge Day(代码消除日)活动,工程师在这一天全部关注删除无用代码的工作。我们在积分牌上追踪代码消除的进度,这使得删除你自己的代码更有趣味。
  • 使用数据修剪没用的功能。在 Yammer,当工程师或产品经理发现在代码重构时,强化或保留一个功能将花费不菲的时间时,他们将查看使用数据,以确定这项功能是否真正被使用了。如果没有,他们将和团队一起决定,他们是否应该只是砍掉这个功能以降低总体工作量。与简化的代码是怎样减少技术债务一样,这个策略也减少了技术债务。
  • 基于主题对进行中的项目分组。使同事彼此分享同样的环境,更容易地参与到设计讨论、代码评审或构建可复用的资源库。所有这些活动有助于提供检查和平衡掉单个人或其他人所引发的问题。

  当我们为学校课程开发软件时,我们有着世界的过于简单的视角——维护任意复杂度的成本随着下课而消失了。但是在我们的职业生涯中,糟糕的软件决定将产生数年负担的影响。

  不要使事情复杂化。

  — END —

   译文: 《 工程师忽略的隐形成本 》  腊八粥

相关 [工程师 隐形 成本] 推荐:

工程师忽略的隐形成本

- - 博客园_知识库
  英文原文: The Hidden Costs That Engineers Ignore.   有时候我们说,“实现这个功能,我只花了几个小时”. 但是完成之后,我们发现每隔几周,我们要么在修复该功能的 bug、向另一个工程师解释,要么做客服回答问题、解释其工作原理. 维护该功能总的投入时间要远远超过最初开发的几个小时.

隐形艺术

- Zoe - 玩意儿
国内艺术家刘勃麟以自己充当画布,将自己画成与身后场景一摸一样,变成一个隐形人,很神奇的作品,也是他的成名作,上图是他在北京某超市与饮料融合,点击这里查看他的更多作品. 本文原始链接:http://www.cngadget.cn/camouflage-art.html.

遭遇工程师

- Chrisoul - 槽边往事
谢谢大家的关心,几个小时前Google Plus恢复了我的帐号,看来暂时我还不用离开. 因为前一篇Blog的缘故,有些网友猜测是因为博文而使得我获释. 虚荣心让我想立即承认这一点,但是对不起,真的不是这样的,我的Blog并没有那么大影响力,尤其是在英文世界里. 而且,因为我上次张贴了一张人类进化谱系的漫画,我在国外驻京记者圈里成功赢得了“种族主义者”这一臭名昭著的称号,大概没有什么人愿意帮助一个黄种人中的“种族主义者”.

工程师效率

- - 后端技术 by Tim Yang
很好奇程序员这个群体这些年效率是变低了还高了,在社交媒体中,各个阶层的兴趣圈都有自己的段子手及内容帐号,段子手发的内容会让你笑cry,内容帐号发的内容可让你享受阅读的快感,这些快感会比写代码见效快. 写完一个模块的代码通常要一整天或者几天时间,代码调通运行没有问题才会体验到愉悦,而社交媒体只需要一些碎片时间就可以达到高潮.

知乎招募工程师

- oxygen - 知乎的博客
Python工程师  有两年以上软件开发经验. 至少一年 Python 开发经验. 对开源技术有强烈的兴趣和爱好,参与或向开发者提交过bug和patch. 热爱探索和钻研,熟悉文本挖掘、自然语言处理相关知识能使用C/C++独立实现复杂的算法结构熟悉开源搜索项目(Lucene,Sphinx等)极强的逻辑分析能力对开源技术有强烈的兴趣和爱好,参与或向开发者提交过bug和patch认为自己是技术geek有极强的责任感.

隐形摩天轮:High Wheel

- caihexi - 爱…稀奇~{新鲜:科技:...
如果说普通的摩天轮尚不能满足你对刺激的全部需求,那么试试这个吧,隐形摩天轮(High Wheel):. 来自西班牙艺术家Maider López的创意,这摩天轮就好像是漂浮在空中,人们悬在那里摇摇欲坠……好吧,虽然只是图片,我已经吓得屁滚尿流了……而且在屁滚尿流之余,我还诞生了一个更邪恶的想法,为啥不把摩天轮的吊斗也做成透明的呢.

浅谈技术工程师的进步

- belltoy - caoz的和谐blog
本来发微博的,越说越多,算了,发篇博客把,说点工程师如何取得进步的问题,. 1:描述和记录问题要精确,数字化,“负载很高,连接很多,速度很卡”这种描述都是不对的,负载uptime值多少,连接数具体有多少,平时正常多少,高峰多少,访问延迟有多大,全部要数字化,而且要有问题状况下和平时的对比,养成这样的习惯,技术分析能力才会有进步.

工程师与会计 [幽默笑话]

- Liqun - 经典网文_来福岛爆笑娱乐网
  有三个工程师和三个会计一起去外地开会,上火车时三个会计买了三张车票,而三个工程师却只买了一张票,会计很不解,工程师说:“上了车你们就知道了”.   火车刚一开动三个工程师就挤进了一个厕所,列车员开始检票最后走到了厕所外边,她敲了一下门说:“检票”. 然后门开了一个小缝,从里面递出一张车票.   在外地开完会后在返回的时候会计们觉得工程师们的方法很不错于是也只买了一张车票,而这次工程师一张票也没有买,会计们又很不解,工程师还是说:“上了车你们就明白了”.

[北京]python工程师 - 创新工场

- Ken - python.cn.jobs
创新工场旗下旅游SNS网站团队招聘python工程师. 职位要求:1、两年以上软件开发经验.                     2、一年以上python开发经验.                     3、有强烈的责任感,对开源技术有强烈的兴趣和爱好,有创业兴趣.                     4、算法强大,有大规模数据处理经验优先.

SOPA、PIPA——工程师应该担心吗?

- - InfoQ cn
1月18日,与其他大约10,000家网站一起,wikipedia.org停止了他们的服务,以抗议美国立法机构对SOPA和PIPA的背书. 尽管投票最近被延迟,互联网社区仍需担心. 软件工程师可能认为:他们不会被这次立法所影响,特别是如果他们处于美国之外的话. 但是考虑到Big Data、云计算以及其他趋势,这么想可能很傻很天真.