技术方案评审

标签: 技术管理 | 发表时间:2012-02-16 01:35 | 作者:Tim
出处:http://timyang.net

新年开始,大部分公司都在启动大量新功能的规划及设计、技术人员同时在设计对应实现方案、架构师或者技术主管则需要一天内穿梭在多个技术讨论中,评审并达成成熟稳定的设计方案。从架构师的角度来考虑,如何衡量一个技术方案的优劣呢?

一、评审点

从总体上讲,技术方案是衡量一个团队的开发成熟度重要一方面。技术设计是否围绕核心需求key features?模块依赖关系、兼容性是否得到充分清晰的描述及共识;设计上不同的方案是否得到了充分考虑比较?是否有正反的激烈的碰撞还是行政上的领导说了算?另外代码实现是否正确执行设计,还是代码实现边走边看,与设计方案基本脱节?

从细节上来看,在软件企业内经常有不同形式的方案review,架构师在做review时候需要要考察哪些环节?从互联网系统设计的角度,总结到以下几点。

简洁及可维护性
从工程角度来看,避免难懂的方案。技术方案尽量象PPT那样,越傻瓜的方案越有生命力。当然简洁的同时也要满足后续条件。

性能、健壮性及可扩展性
互联网项目唯快不破,性能是立根之本。我们需要为健壮及性能留有一定扩展余地。

避免过度设计
Donald Knuth说过“过早优化是万恶之源(premature optimization is the root of all evil)”,不少架构师也牢记于心。但是在实际操作上,这一点和上一点所说扩展性直接冲突,比如
保守派:质疑在一些环节增加可扩展性,需要多花很多精力(比如30%),但增加的扩展能力未必能用上。
激进派:质疑如果不增加一定扩展能力,当需求稍微发生变化,方案需要全盘推翻。
可扩展性及过度设计的矛盾是否如 薛定谔的猫那样,需要打开盒子那一刻才知道结果?还是架构师可以根据经验及环境去取舍,从我的观点来看,“make appropriate design tradeoff”是衡量架构师能力的首要指标。

Case Study
拿年前比较热门的12306系统来举例,如需做一个方案实现其中的余票查询模块,假设设计如下

12306查询模块设计方案

需求
1、能够承载峰值查询为10万次/秒的请求
2、余票信息能容忍一定程度和实际系统不一致,但是滞后不能超过5秒
附加需求:为了此虚拟项目更具有可比性及易于理解,设计方案必须全采用开源技术实现,不修改相关服务器源码,并采用普通廉价服务器部署。

技术难点
1、峰值处理能力,需要用最小的成本解决
2、数据需要5秒内动态更新的问题,需要采用合适的方案

技术选型
采用nginx, MySQL, varnish, memcached来实现
假设nginx+远程cache处理能力是2万次/秒;varnish在大部分本地cache命中情况下处理能力是3万次/秒;

方案一
采用cache直接查询的方式

方案二
采用七层反向代理增加cache的方式

数据更新的方案设计
需要将订票系统中的实时变化反映到查询系统中
方案一:PULL

方案二:PUSH

使用上面的方案评审方法来看,方案有什么问题呢?

二、方案文档

另外再说下技术方案的文档要求。一个团队如果没有形成技术方案的规范,交付的方案通常是五花八门的,有word、visio、邮件,mm图、ppt、PDF、纯文本…… 怎样才算一份好的设计文档?

核心需求及技术难点
很多技术方案第一段就直奔主题,比如展示模块图或者存储结构,这会让阅读者一头雾水,先告诉阅读对象“我们究竟要解决什么技术问题”。


一张A4纸上密密麻麻写满同一字号文字的方案令人生畏,“一图胜千言”,用txt、一封邮件、或者纯文字的word通常情况下较难得到理解

文字、关键字
方便本地或者文档服务器全文检索,文档支持版本管理。
一个团队运作一年以上之后,文档数可能成百上千,需要通过关键字来快速查询,需要支持版本管理的文档服务器及仓库。而仅靠设计方发一封邮件来提供给大家技术方案很难形成技术积累。

便于修改
技术方案及设计文档需要方便团队每一个成员更新,技术方案在代码实现时会有设计的改进及微调,这些需要能随时方便的更新到设计文档上,大部分团队存在设计文档与代码实现脱节的情况。而用一个图片或者pdf的来提供技术方案的更是让执行人员更新方案无处下手。

三、扩展作业

在文章结束之前,顺便再出一个今天随便想到的facebook中的like功能作为扩展训练题

需求

  • 可以对一个对象(一条feed、文章、或者url)进行like操作
  • 需要看到一个对象的like总数
  • 可以看到一个对象的like用户列表,优先显示我的好友列表(social list)。
  • 数据量:每天新增的like对象数为1千万,每秒like计数器查询量及social user list均为30万次/秒。

假设现有系统的存储结构(MySQL)为
friends表, from_uid + to_uid 为联合主键
(from_uid bigint,
to_uid bigint,
ctime timestamp)
feed表, feed_id + like_uid 为联合主键
(feed_id bigint,
like_uid bigint,
ctime timestamp);

假设以上存储是单表结构,请问如何设计like技术方案?如何评判你的like方案的优劣?

广告:新年开始,新浪微博技术团队也正在招兵买马,对以上内容感兴趣的技术人才欢迎投递简历,层次不限,从架构师到有一定基础的Java及PHP工程师都可,联系方式见blog右方。

Similar Posts:

相关 [技术] 推荐:

前端技术

- - CSDN博客综合推荐文章
随着互联网产业的爆炸式增长,与之伴生的Web前端技术也在历经洗礼和蜕变. 尤其是近几年随着移动终端的发展,越来越多的人开始投身或转行至新领域,这更为当今的IT产业注入了新的活力. 尽管Web前端技术诞生至今时日并不长,但随着Web技术的逐渐深入,今后将会在以下几方面发力. JavaScript的兄弟们.

SSI技术

- - 开源软件 - ITeye博客
1.       SSI,通常称为“服务器端包含”技术. 使用了SSI技术的文件默认的后缀名为.shtml,SSI技术通过在html文件中加入SSI指令让web服务器在输出标准HTML代码之前先解释SSI指令,并把解释完后的输出结果和HTML代码一起返回给客户端. 2.       SSI技术的优点:SSI技术是通用技术,它不受限于运行环境,在java、dotnet、CGI、ASP、PHP下都可以使用SSI技术;解释SSI的效率比解释JSP的效率快很多,因为JSP规范提供了太多的功能,这些功能都需要servlet引擎一一进行解释,所以效率比较低.

技术选型

- - 企业架构 - ITeye博客
MVC Framwork: SpringMVC3.0 Restful的风格终于回归了MVC框架的简单本质,对比之下Struts2概念太复杂更新又太懒了. Template:JSP2.0且尽量使用JSP EL而不是taglib,万一要写taglib也用纯JSP来编写,一向是SpringSide的推荐,Freemarker们始终有点小众, 而Thymeleaf与美工配合度非常高,可惜也是太少用户了.

技术的异化:读《技术垄断》

- Dynamic - It Talks--上海魏武挥的博客
事实上,我认为国内对马克思或神圣化或妖魔化,都是要不得的. 我们应该还马克思一个伟大的社会学(当然还有哲学、经济学之类)学者的本来面目,而不是把他的话当成教义. 异化就是一个相当精到的学术词语,它所描述的是人们创造发明某物本来为了让人们自己更好地工作生活,结果该物却成了人的主宰. 在很多领域,都有异化的影子,比如宗教,比如官僚体系,当然,也包括技术.

HBase技术介绍

- 三十不归 - 搜索技术博客-淘宝
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. 上图描述了Hadoop EcoSystem中的各层系统,其中HBase位于结构化存储层,Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制.

Web技术整理

- Gabriel - 博客园-首页原创精华区
  Web技术或许是将来最为热门的技术之一. 这里略作一些总结,以及对各种Web技术作一些概要性介绍. (以下内容建立在我的粗略理解之上,欢迎指正).   推荐个学习Web技术比较好的网站,介绍的比较全面.   页面的展示使用超文本标记语言(HTML)来表示. 这是一种标签语言,本身不具有执行能力,只是结构化页面内容.

Hadoop相关技术

- - CSDN博客云计算推荐文章
Apache的Hadoop是什么. Apache的Hadoop项目™®开发出可靠的,可扩展的,分布式计算的开源软件. Apache的Hadoop的软件库是一个框架,允许大型数据集通过计算机集群使用简单的编程模型,进行分布式处理. 它的设计规模从单一服务器到数千台计算机,每个提供本地计算和存储. 软件库是用来检测和处理应用层失败的,而不是依靠硬件提供高的有效度,因此在计算机集群上提供高度可用性服务,其中每个都有可能会有失败.

MySQL分区技术

- - 数据库 - ITeye博客
mysql分区技术是mysql5.1以后出现的新技术,能替代分库分表技术,它的优势在于只在物理层面来降低数据库压力. 常用的MySQL分区类型:. 1.RANGE分区:基于属于一个给定的连续区间的列值,把多行分配给分区(基于列). 2.LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合的某个值来进行选择(基于列值是固定值的).

zookeeper技术浅析

- - CSDN博客云计算推荐文章
 Zookeeper是hadoop的一个子项目,虽然源自hadoop,但是我发现zookeeper脱离hadoop的范畴开发分布式框架的运用越来越多. 今天我想谈谈zookeeper,本文不谈如何使用zookeeper,而是zookeeper到底有哪些实际的运用,哪些类型的应用能发挥zookeeper的优势,最后谈谈zookeeper对分布式网站架构能产生怎样的作用.

Golang测试技术

- - Tony Bai
本篇文章内容来源于 Golang核心开发组成员 Andrew Gerrand在Google I/O 2014的一次主题分享“ Testing Techniques”,即介绍使用Golang开发 时会使用到的测试技术(主要针对. 单元测试),包括基本技术、高级技术(并发测试、 mock/fake、竞争条件测试、并发测试、内/外部测 试、vet工具等)等,感觉总结的很全面,这里整理记录下来,希望能给大家带来帮助.