from:

http://teamkingofcsharp.spaces.live.com/blog/cns!59FC2D3DD66822AA!421.entry

赞一下Office的用户体验
今天我做API Hook,开了个Word想截获它的系统调用。结果由于我的程序写屎了,Word一开就崩。崩了大概10次以后,再启动Word的时候它给了这么一个提示:

我倒是第一次见到这个对话框,估计其他用户也很少见得到。
用户甚至根本不会想到他需要这样一个feature。比如我要是把Office玩坏了,我就自己重装一遍。即使Office没有这个feature,用户也不会感觉出什么异样,然而M$还是把这样的feature做进来了,要知道,虽然判断一下程序是否频繁崩溃并不难,但是后面的诊断和恢复可能就不那么容易做了(当然我没试过它效果如何)。花这么大功夫去做一些很多用户一辈子都用不到的功能,不得不说Office的开发人员是在很用心的做这个软件,Office不愧是M$的摇钱树啊。
 
另外一个值得思考的问题是,我们写程序,首先关注的当然是程序的正确性,我们都在极力避免程序崩掉,我们可能会忽视了灾难发生时的补救措施。我以前就有这样的心态:我对我写的程序很有信心,它肯定不会出错,所以我没必要写补救的代码以防万一。然而,经历过iHunter的开发以后,我意识到这种想法是片面和不现实的。首先,当程序写到一定规模的时候,谁都不敢拍胸脯保证它不会出错;其次,用户会进行各种各样的非法操作,甚至有删文件等不可抗拒力,写得再好的程序也可以把它搞崩。所以,不管是自己的错还是用户的错,当发生了异常一定要处理,能恢复的就恢复,不能恢复的,至少告诉用户“虽然我不知道为什么会这样,但至少我知道它发生了,建议你接下来做这些事情……”,这比弹出一个“在某某地址读写错误”的用户看不懂的系统错误对话框出来,用户体验要强多了。
 
话虽这么说,但这件事要做好可不容易。我在iHunter里写的代码,经常要跟插件进行交互。对于iHunter主程序来说,插件就是用户了。于是高翔给我的要求是:无论插件给你返回什么样的值,无论它抛什么异常出来,你都不能让主程序崩掉。我写起来才发现要做到这点真不容易。你必须在和插件的每一次交互中都小心翼翼地处理各种异常情况,必须考虑到它会怎样阴你。还有数据一致性的问题,插件一次失败的操作可能把数据给改了,怎样把数据恢复过来?我们现在还不敢夸口说我们的程序坚不可摧,免疫插件的各种耍流氓行为。但我们在尽力处理这些可能根本就不会遇到的问题。如果从应付软工课的角度来看,做这些努力根本是不必要的,因为现在我们的插件都是遵循接口要求写的,根本不会出现各种各样乱七八糟的异常;即使是将来有第三方为我们开发插件,也很难想像它会以搞崩我们的软件为目的。然而,如果是想用心做一个好软件的话,这些工作又的确是不得不做的。
 
-- 黄源河

现代软件工程系列 学生的精彩文章 (4) 为用户服务相关推荐

  1. 现代软件工程系列 学生的精彩文章 (1)

    讲了很多课, 碰到了很多学生, 他们教给我不少东西, 下面是一些我印象中的精彩文章: http://teamkingofcsharp.spaces.live.com/blog/cns!59FC2D3D ...

  2. 现代软件工程系列 学生的精彩文章 (5) 其实还是人的问题

    http://springgreen9527.spaces.live.com/blog/cns!354E19E8B3074CC7!171.entry?sa=370423590 TM 1.0发布感想   ...

  3. 现代软件工程系列 学生的精彩文章 (3) 如何在Bug 不断的情况下还能保持平常心... [zz]

    from: http://teamkingofcsharp.spaces.live.com/blog/cns!59FC2D3DD66822AA!222.entry 感想 平常心 初中的数学老师常常和我 ...

  4. 现代软件工程系列 学生的精彩文章 (6) 项目总结

    http://lunarthu.spaces.live.com/?_c11_BlogPart_pagedir=Next&_c11_BlogPart_handle=cns!48EA3793D3D ...

  5. 现代软件工程系列 学生的精彩文章 (3) 如何在Bug 不断的情况下还能保持平常心...

    from: http://teamkingofcsharp.spaces.live.com/blog/cns!59FC2D3DD66822AA!222.entry 感想 平常心 初中的数学老师常常和我 ...

  6. 现代软件工程系列 学生的精彩文章 (2) 到底是谁的 bug?

    http://teamkingofcsharp.spaces.live.com/blog/cns!59FC2D3DD66822AA!406.entry 又见M$的bug 发信人: Dora9 (Dor ...

  7. 现代软件工程系列 学生精彩文章(7) 宝贵的教训

    from http://codecanvas3706.spaces.live.com/blog/cns!5A77585898179960!205.entry [当学生的时候, 最好犯一些错误,  经历 ...

  8. 现代软件工程系列 学生读后感 梦断代码 SpringGreen

    "拿来的代码所不能做到的部分,恰是项目与众不同的创新之处". <梦断代码> 终于看完了<梦段代码>.      其实整本书就是讲图灵机的不可判定性----软 ...

  9. 现代软件工程系列 学生和老师都不容易

    老师的难处 - V2.0 的困难 有笑话说某人请客, 客人无论是坐轿或是步行前来, 主人都能奉承一番. 有客人说自己是爬着来的, 主人奉承说  - 稳妥之至! 据说有些学校的有些课还是沿用 N 年前的 ...

最新文章

  1. Linux中命令配置防火墙
  2. Hopfield 网络(下)
  3. c语言如何判断密码不同字符,C语言从文本文档读取字符串(用户名和密码验证)...
  4. ajax的url可以用变量吗6,如何使用变量设置 Ajax Url
  5. lstm原始论文_RNN及其改版(LSTM, 双向RNN, seq2seq)总结
  6. 麦库:盛大的知识管理软件
  7. 27-React Lists and Keys
  8. 图像去雾算法_HTN图像去雾开源代码
  9. android 定时唤醒蓝牙,Android保活——蓝牙唤醒(主动kill掉也可唤醒)
  10. Runtime library, CRT
  11. 电容触摸屏驱动(Linux驱动开发篇)
  12. 计算机管理中没有大容量存储,控制器没有足够的带宽可利用为USB大容量存储设备的解决方法...
  13. 一个vue的日历组件ele-calendar
  14. js小游戏-别踩白块儿
  15. 彻底搞懂原生事件流和 React 事件流
  16. 简单阅读golang的net/http包和Negroni的源码
  17. cad线性标注样式修改在哪里_CAD标注样式如何设置?
  18. Java实现Mysql数据库备份与还原(Linux 和Windows 包含单张表备份)
  19. console调linux设备,linux设备驱动之console控制台驱动
  20. 表白技巧升级,大神程序员表白代码泄露(内含彩蛋)!

热门文章

  1. 深入学习Redis(1):Redis内存模型
  2. YYT 0659 - 2008全自动凝血分析仪
  3. Sass基础知识及语法
  4. Linux部署Apache ActiveMQ 5.14.1
  5. SQL经典语句(转载)
  6. 使用wxWidgets编程——第一步
  7. 操作系统学习笔记-02-1.2-什么是操作系统
  8. QT高级编程之QT基本概览
  9. 第一章 计算机网络 6 OSI参考模型 [计算机网络笔记]
  10. php 正则匹配静态资源,Struts2 配置静态资源文件不经过Strut处理(正则匹配)