动态评估取舍

——高效程序员的45个习惯之习惯27

“性能、生产力、优雅、成本以及上市时间,在软件开发过程中都是至关重要的因素。每一项都必须达到最理想状态。”

可能曾经身处这样的团队:管理层和客户 将很大一部分注意力都放在应用的界面展示上。也有这样的团队,其客户认为性能表现非常重要。在团队中,你可能会发现,有这样一个开发主管或者架构师,他会 强调遵守“正确”的范式比其他任何事情都重要。对任何单个因素如此独断地强调,而不考虑它是否是项目成功的必要因素,必然导致灾难的发生。

强调性能的重要性情有可原,因为恶劣的 性能表现会让一个应用在市场上铩羽而归。然而,如果应用的性能已经足够好了,还有必要继续投入精力让其运行得更快一点吗?大概不用了吧。一个应用还有很多 其他方面的因素同样重要。与其花费时间去提升千分之一的性能表现,也许减少开发投入,降低成本,并尽快让应用程序上市销售更有价值。

举例来说,考虑一个必须要与远程 Windows 服务器进行通讯的 .NET Windows 应用程序。可以选择使用 .NET Remoting 技术或 Web Services 来实现这个功能。现在,针对使用 Web Services 的提议,有些开发者会说:“我们要在 Windows 之间进行通信,通常此类情况下,推荐使用 .NET Remoting 。而且, Web Services 很慢,我们会遇到性能问题。”嗯,一般来说确实是这样。

然而,在这个例子中,使用 Web Services 很容易开发。对 Web Services 的性能测试表明 XML 文档很小,并且相对应用程序自己的响应时间来讲,花在创建和解析 XML 上的时间几乎可以忽略不计。使用 Web Services 不但可以在短期内节省开发时间,且在此后团队被迫使用第三方提供的服务时, Web Services 也是个明智的选择。

Andy 说。。。
过犹不及
我曾经遇到这样一个客户,他们坚信可配置性的重要性,致使他们的应用有大概10 000个可配置变量。新增代码变得异常艰难,因为要花费大量时间来维护配置应用程序和数据库。但是他们坚信需要这种程度的灵活性,因为每个客户都有不同的需求,需要不同的设置。
可实际上,他们只有19个客户,而且预计将来也不会超过50个。他们并没有很好地去权衡。

考虑这样一个应用,从数据库中读取数据,并以表格方式显示。你可以使用一种优雅的、面向对象的方式,从数据库中取数据,创建对象,再将它们返回给 UI 层。在 UI 层中,你再从对象中拆分出数据,并组织为表格方式显示。除了看起来优雅之外,这样做还有什么好处吗?

也许你只需要让数据层返回一个 dataset 或数据集合,然后用表格显示这些数据即可。这样还可以避免对象创建和销毁所耗费的资源。如果需要的只是数据展示,为什么要创建对象去自找麻烦呢?不按书上说的 OO 方式来做,可以减少投入,同时获得性能上的提升。当然,这种方式有很多缺点,但问题的关键是要 多长个心眼儿 ,而不是总按照习惯的思路去解决问题。

总而言之,要想让应用成功,降低开发成本与缩短上市时间,二者的影响同样重要。由于计算机硬件价格日益便宜,处理速度日益加快,所以可在硬件上多投入以换取性能的提升,并将节省下来的时间放在应用的其他方面。

当然,这也不完全对。如果硬件需求非常庞大,需要一个巨大的计算机网格以及众多的支持人员才能维持其正常运转(比如类似 Google 那样的需求),那么考虑就要向天平的另一端倾斜了。

但是谁来最终判定性能表现已经足够好,或是应用的展现已经足够“炫”了呢?客户或是利益相关者必须进行评估,并做出相关决定(见第 45 页中 习惯 10 )。如果团队认为性能上还有提升的空间,或者觉得可以让某些界面看起来更吸引人,那么就去咨询一下利益相关者,让他们决定应将重点放在哪里。

没有适宜所有状况的最佳解决方案。你必须对手上的问题进行评估,并选出最合适的解决方案。每个设计都是针对特定问题的 —— 只有明确地进行评估和权衡,才能得出更好的解决方案。

没有最佳解决方案 (No best solution)

动态评估权衡
考虑性能、便利性、生产力、成本和上市时间。如果性能表现足够了,就将注意力放在其他因素上。不要为了感觉上的性能提升或者设计的优雅,而将设计复杂化。

切身感受

即使不能面面俱到,你也应该觉得已经得到了最重要的东西 —— 客户认为有价值的特性。

平衡的艺术

  • 如果现在投入额外的资源和精力,是为了将来可能得到的好处,要确认投入一定要得到回报(大部分情况下,是不会有回报的)。真正的高性能系统,从一开始设计时就在向这个方向努力。
  • 过早的优化是万恶之源。
  • 过去用过的解决方案对当前的问题可能适用,也可能不适用。不要事先预设结论,先看看现在是什么状况。

【连载】优秀程序员的 45 个习惯之习惯27相关推荐

  1. 【连载】优秀程序员的45个习惯之39——架构师必须写代码

    架构师必须写代码 --   高效程序员的 45 个习惯之习惯39 "我们的专家级架构师Fred会提供设计好的架构,供你编写代码.他经验丰富,拿的薪水很高,所以不要用一些愚蠢的问题或者实现上的 ...

  2. 【连载】优秀程序员的45个习惯之45——及时通报进展与问题

    好消息: 本书今天互动网有货,当当网.卓越网也会陆续有货. 及时通报进展与问题 -- 高效程序员的 45 个习惯之习惯45 "管理层.项目团队以及业务所有方,都仰仗你来完成任务.如果他们想知 ...

  3. 【连载】优秀程序员的45个习惯之42——允许大家自己想办法

    允许大家自己想办法 -- 高效程序员的 45 个习惯之习惯42 "你这么聪明,直接把干净利落的解决方案告诉团队其他人就好了.不用浪费时间告诉他们为什么这样做." "授人以 ...

  4. 【连载】优秀程序员的45个习惯之37——提供有用的错误信息

    提供有用的错误信息 --  高效程序员的 45 个习惯之习惯37 "不要吓着用户,吓程序员也不行.要提供给他们干净整洁的错误信息.要使用类似'用户错误.替换,然后继续.'这样让人舒服的词句. ...

  5. 【连载】优秀程序员的 45 个习惯之习惯35

    对问题各个击破 --  高效程序员的 45 个习惯之习惯35 "逐行检查代码库中的代码确实很令人恐惧.但是要调试一个明显的错误,只有去查看整个系统的代码,而且要全部过一遍.毕竟你不知道问题可 ...

  6. 【连载】优秀程序员的 45 个习惯之习惯33

    记录问题解决日志 -- 高效程序员的 45 个习惯之习惯33 "在开发过程中是不是经常遇到似曾相识的问题?这没关系.以前解决过的问题,现在还是可以解决掉的." 面对问题(并解决它们 ...

  7. 【连载】优秀程序员的 45 个习惯之习惯25

    代码要清晰地表达意图 -- 高效程序员的 45 个习惯之 习惯25 "可以工作而且易于理解的代码挺好,但是让人觉得聪明更加重要.别人给你钱是因为你脑子好使,让我们看看你到底有多聪明.&quo ...

  8. 优秀程序员的45个习惯

    优秀来自好的习惯.怎样成为优秀的开发人员?图灵公司最近热销的<高效程序员的45个习惯>一书给出了很好的解答,非常值得一读. 这本书的英文原版荣获了有软件奥斯卡之称的Jolt生产效率大奖,在 ...

  9. 转:优秀程序员的45个习惯

    今天看到这篇文章,觉得有我们要学习的地方,不过有几条不大符合中国的国情!!! 拿过来给大家看看. 优秀来自好的习惯.怎样成为优秀的开发人员?图灵公司最近热销的<高效程序员的45个习惯>一书 ...

最新文章

  1. 重构第28 天 重命名bool方法(Rename boolean method)
  2. 【IBM Tivoli Identity Manager 学习文档】11 TIM设计思路介绍
  3. 【集训心得】在真哥强迫下不得不写的总结
  4. 记一次中台数据传输同步Elasticsearch失败的车祸现场
  5. SignalR的使用
  6. 三星手机连接公司内网时需要设置EAP 方式: PEAP
  7. (二)nodejs循序渐进-nodejs基本类型和循环条件语法篇(基础篇)
  8. 我想自学编程技术,但是每天下班回来都很累了,没力气,怎么办?
  9. erlang的cpu调优
  10. “中国式”盗版该何去何从?
  11. 闲谈REST API
  12. nyoj 122 Triangular Sums
  13. java 元胞自动机_元胞自动机 Java实现
  14. mysql索引失效口诀
  15. Affinity Propagation
  16. flvplayer.swfnbsp;flv视频播放器…
  17. 可路由计算引擎实现前置数据库
  18. fiddler抓取手机app数据(手机开热点)
  19. 本草中国-----境界
  20. PDF的页面设置工具在哪里?如何使用并调整PDF页面?

热门文章

  1. navcat设置oracle表主键自增_初识 Oracle 表空间设置与管理
  2. jquery java json转字符串_用jQuery以及JSON包将表单数据转为JSON字符串
  3. 编辑数学公式_LaTeXiT for mac(数学公式编辑器)
  4. mysql windows 管道连接,科技常识:Windows Server 2016 MySQL数据库安装配置详细安装教程...
  5. 【c语言】蓝桥杯算法提高 3-3求圆面积表面积体积
  6. win10 安装MySQL过程和遇到的坑
  7. 混合云存储跨云灾备方案之跨云容灾
  8. Android Zxing 加入闪光灯功能
  9. Mongodb的范式化和反范式化
  10. errors'MessageBoxA' : function does not take 1 parameter