漫谈技术选型

原创 2016年05月31日 15:18:52

  最近读了《恰如其分的软件架构》一书,尽管书本身没有帮我打开新世界的大门,但还是给了我不少的启发,在平时的软件开发中可以使用里面的很多核心思想,帮助我梳理清楚到底该想什么,该做什么。
  无论是最近的工作中,还是业余时间写开源项目的过程中,都会面临技术选型的问题。对于日常玩票性质的项目,技术选型从来不是一个非常要紧的事情。由于业余项目的目的更多是学习,因此可以使用更新的、自己没有使用过的技术。但是工作中的技术选型就没有那么随意了,最近在工作中也有涉及技术选型的经历,这篇文章用以梳理一下最近做技术选型的思路,里面使用的一些方法论有借鉴《恰如其分的软件架构》一书,所以说这本书给了我不少的启发。

从需求与风险出发

  软件工程从来不是一件天马行空的事情,每一个软件工程师都是在一定的问题域里面设计软件、开发代码的。功能需求是我们最先接触的问题域,也是最显而易见的问题域。几乎每一个软件工程师都知道我们的系统必须满足特定的功能,所以我们选择使用的技术也是立足于我们准备实现的功能需求的。
  满足功能需求是每一个工程师的共识了,所以不做过多论述了,我想把注意力集中到风险中。这里的风险主要特指软件的非功能性风险。由于功能性的风险需要由产品经理或系统分析师把控,所以往往是开发人员无法控制的。另一方面,产品经理或系统分析师可能不会把注意力放在系统的非功能性需求上,因此开发人员就必须把注意力集中到非功能性需求了。
  这里用了“风险”一词,而不是用非功能性需求,除了受《恰如其分的软件架构》中提出的“风险驱动设计”启发以外,更想说明对于不同的系统,所面临风险的重要程度是不一样的,甚至不同的系统对非功能性需求的取舍也是不一样的。重要的、必须实现的非功能性需求才能称之为风险。更重要的是,“风险”一词可以提醒开发人员,甚至是所有系统的利益关系人(客户、产品经理、测试人员等)功能性风险如果处理不好,影响面可能是局部的,而且问题很容易被暴露;但非功能性风险处理不好,影响面可能是整个系统,而且问题可能等系统上线后才可能发现。
  在开始考虑技术选型问题之前,识别系统可能面临的风险也是非常重要的一步。对于处理敏感数据的系统,安全性是首要考虑的风险;对于包含复杂业务逻辑的系统,可扩展性和可修改型是首要考虑的风险。开发人员,甚至是所有的系统干系人,都应该都系统可能面临的风险有一个共识,包括系统的非功能性风险有哪些,这些风险的重要程度又是怎么样的。
  风险为我们技术选型提供了更多的线索和方向,不至于在茫茫的技术海洋中迷失。仅仅根据需求进行技术选型,往往是提供不了足够的理由让我们下定决心使用某个技术的。细想一下,在我们遇到的90%的功能里面,有多少是python能实现而java实现不了的?开发java web程序的时候,struts和spring mvc的功能都没有非常本质的区别,那么该如何选择呢?同样的功能可以有多种多样的实现方式,但每一个实现方式的关注点都不一样。有关注性能的、有关注扩展性的、有关注安全性的,不一而足,只有带着风险去考虑和筛选,才能在茫茫技术海洋中捕捉到我们所需要的。

剖析候选技术

  带着问题,我们可以在茫茫的技术社区中寻找我们需要的技术了。这里指的技术是一个很广泛的概念,比如架构模式、框架、组件、类库等等。只要我们不打算自己造轮子,那么总有机会需要面临选择的问题。因为解决同样的问题,无论是开源社区还是COTS,都有各种各样不同的解决方案。这些形形色色的解决方案,初看都是可以解决我们手头上的问题的,但是细细地分析,他们又有可能各不相同。
  比如现在在前端领域非常流行的MVVM框架,社区里有着各色各样的框架。有名门出身的reactjs、angularjs等;也有由牛人主导的民间框架,比如backbonejs、vue.js等。但框架的设计重点却各有不同。angularjs以controller和model为核心,强化了数据双向绑定的功能,因此有复杂交互或者复杂表单的情景,angularjs有天生的优势。但由于angularjs的性能一般,在性能敏感的系统中需要谨慎使用。另外angularjs的模版语法是嵌入到页面的HTML里的,这对于跟后台MVC框架的模版引擎集成,或更换前端框架都带来的极大的不方便。
  与angularjs同样是MVVM框架的reactjs则是走另外一种的设计思路。reactjs主要以View为核心,无论是组件化还是自创的JSX都是为方便模块化view层而设计的。如果系统需要有复杂的界面展现,reactjs能实现更为方便维护的前端代码。同时reactjs的模版引擎代码不会嵌入到页面的HTML中,对于与后台模版引擎集成和更换前端模版引擎都有莫大的好处。由于reactjs没有专门的controller层控制逻辑,对应业务逻辑代码的组织没有angularjs清晰,而且没有数据的双向绑定,view的状态需要开发人员自己维护和出发变更,但这也带来了一个好处:reactjs的性能比angularjs的性能好。
  从上面我们对比两个不同的MVVM框架可以看到,在分析技术之前,首先要对技术有一个宏观的了解,比如MVVM框架包含了View、Model、Controller等模块。然后就可以开始通过不用维度分析目标技术了,比如性能、扩展性、与其他技术集成、升级的难易程度、bug fix的及时程度等等。我们未必需要360度无死角的分析一个技术的每一个特性,只要我们之前已经分析过了系统的需求和风险,有针对性地重点分析我们关系的维度,就可以了。

选择最合适的,而不是最“好”的

  这个论述几乎已经是老生常谈了,每一个有经验的工程师都会强调这个。但很多出入职场的工程师,包括一年前的我,都会压抑不住自己的满腔热情,看到有新的技术,并且刚好可以满足项目的需求,便跃跃欲试。可是坑往往是在上文提到的风险中。新的技术往往可能有bug;也由于新的技术不成熟,后续版本很可能会推翻旧版本的很多设计,导致向下兼容很不友好,导致已有系统的升级困难重重。但是可以不升级吗?新的bug只在新版本中修复,官方不维护旧版本怎么办?
  当然,旧版本就一定好吗?新项目还用java 1.4的话,我还是觉得这样太作了。冷静地分析项目的需求和风险,冷静地分析技术的优点和缺点,冷静地把项目的特点和技术的特定匹配起来,这需要经验的辅助,方法论只能提供一个寻找道路的方法,但至于找到的路如何就真的看各人修为了。
  但是保持对新技术的热情是每个工程师必需的。因此我非常建议每个开发人员都在github上发布自己的代码。在这里我们可以尽情使用自己喜欢的技术,尽情学习各种各样的新技术,尽情开展各种各样的实验,发泄自己对技术的热情,也只有这里可以不需要考虑各种风险,哪怕代码错漏百出也不会有人干涉。

版权声明:本文为博主原创文章,未经博主允许不得转载。

区块链技术体系选型评估

目前世界上有影响力的六大分布式账本技术体系:比特币(Bitcoin)、瑞波币(Ripple)、比特股(Bitshares)、以太坊(Ethereum)、超级账本(HyperLedger)和(Corda...
  • u010043538
  • u010043538
  • 2016年11月01日 18:43
  • 1941

开发技术选型参考

转自:https://my.oschina.net/66das/blog/825950 摘要: 监控平台,RPC框架,分布式统一框架,数据库访问层中间件,软负载,分布式存储,分布式缓存,性能分析工具...
  • he90227
  • he90227
  • 2017年04月14日 15:05
  • 1550

【无中生有】---1---技术选型

在构建一个系统时,需要考虑的根本性因素就是所使用的技术的成本。而相关的成本因素都可以通过一定设定条件转换为金钱成本,包括时间、人力等几个主要成本因素。          不同的开发主体或者系统应用主体...
  • xqj198404
  • xqj198404
  • 2015年04月02日 06:06
  • 615

安卓项目架构与技术选型

技术选型: 技术选型:主要考虑网络层的的框架选型和图片加载库的选型。 技术选型要充分了解每种技术的优缺点,最终由项目需求来决定。要了解每个框架的底层实现原理,这些原理决定了框架的优缺点。 APP的框架...
  • chenrushui
  • chenrushui
  • 2016年08月19日 11:24
  • 812

服务端技术选型

转自 xielong.me 谢龙的博客  服务框架 MVC Framework:Rose 框架简单易用,并且我米内部服务和工具都优先支持 Rose 项目,默认使用 Rose 框...
  • cluzax
  • cluzax
  • 2015年05月16日 22:12
  • 553

大数据平台架构技术选型与场景运用

导读:本文将大数据的工作角色分为三种类型,包括业务相关、数据科学相关和数据工程。大数据平台偏向于工程方面,大数据平台一般包括数据源、数据采集、数据存储、数据分析等方面。 讲师从数据来源、数据源结构、...
  • leishenop
  • leishenop
  • 2017年06月21日 10:21
  • 658

滴滴出行技术总监:关于技术选型的那些事儿

杜欢,滴滴出行技术总监,负责滴滴小巴业务的技术管理工作。在互联网领域已经有十年工作经验,曾就职于微软、百度,也曾自主创业两次,来到滴滴之后也经历过很多项目和业务的变化,是一个“什么都懂”工程师,对前端...
  • hanjun0612
  • hanjun0612
  • 2017年03月02日 09:52
  • 1374

《.NET 4.0面向对象编程漫谈》读者请进

《.NET 4.0面向对象编程漫谈》门户网页 汇总相关资源
  • bitfan
  • bitfan
  • 2010年11月06日 14:38
  • 20976

关于Web大型系统的技术选型

声明下,这个我用了网上别人的图。 大型系统很多人都在说,但是针对大型系统从技术角度应该考虑哪些因素: 一. 高并发 高并发是大型系统遇到最麻烦的一个事情。一般来讲如果是业务性质的系统,这样的问题...
  • jacky4955
  • jacky4955
  • 2015年04月10日 14:43
  • 7640
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:漫谈技术选型
举报原因:
原因补充:

(最多只允许输入30个字)