易用性
  易用性是指用户使用软件的容易程度。现代人的生活节奏快,干什么事都可能想图个方便,所以把易用性作为重要的质量属性无可非议。
  导致软件易用性差的根本原因是开发人员犯了“错位”的毛病:他以为只要自己用起来方便,用户也一定会满意。俗话说“王婆卖瓜,自卖自夸”。当开发人员向用户展示软件时,常会得意地讲:“这个软件非常好用,我操作给你看,……是很好用吧!”
  软件的易用性要让用户来评价。如果用户觉得软件很难用,开发人员不要有逆反心理:哪里找来的笨蛋!
  其实不是用户笨,是自己开发的软件太笨了。当用户真的感到软件很好用时,一股温暖的感觉会油然而生,于是会用“界面友好”、“方便易用”等词来夸奖软件的易用性。
  清晰性
  清晰意味着工作成果易读、易理解,这个质量属性表达了人们的一种质朴的愿望:让我花钱买它或者用它,总得让我看明白它是什么东西。我小时候的一个伙伴在读中学时因搞不明白电荷为什么还要分“正”和“负”,觉得很烦恼,便早早地辍学当了工人。
  开发人员只有在自己思路清晰的时候才可能写出让别人易读、易理解的程序和文档。可理解的东西通常是简洁的。一个原始问题可能很复杂,但高水平的人能够把软件系统设计得很简洁。如果软件系统臃肿不堪,它迟早会出问题。所以简洁是人们对工作“精益求精”的结果,而不是潦草应付的结果。
  在生活中,与简洁对立的是“?唆”。废话大师有句名言:“如果我令你过于轻松地明白了,那你一定是误解了我的意思。”中国小说中“婆婆妈妈”的男人是唐僧。有一项民意调查:如果世上只有唐僧、孙悟空、猪八戒和沙僧这四类男人,你要嫁给哪一类?请列出优先级。调查结果表明,现代女性毫不例外地把唐僧摆在后。
  很多人在读研究生时有一种奇怪的体会:如果把文章写得很简洁,让人很容易理解,投稿往往中不了,只有加上一些玄乎的东西,把本来简单的东西弄成复杂的,才会增加投稿的命中率。虽然靠这种做法可能有效,可千万不要把此“经验”应用到产品的开发中!
  安全性
  这里的安全性是指信息安全,英文是Security而不是Safety。安全性是指防止系统被非法入侵的能力,既属于技术问题又属于管理问题。信息安全是一门比较深奥的学问,其发展是建立在正义与邪恶的斗争之上的。这世界似乎不存在安全的系统,连美国军方的系统都频频遭黑客入侵。如今全球黑客泛滥,真是“道高一尺,魔高一丈”啊!
  对于大多数软件产品而言,杜绝非法入侵既不可能也没有必要。因为开发商和客户愿意为提高安全性而投入的资金是有限的,他们要考虑值不值得。究竟什么样的安全性是令人满意的呢?
  一般地,如果黑客为非法入侵花费的代价(考虑时间、费用、风险等多种因素)高于得到的好处,那么这样的系统可以认为是安全的。
  可扩展性
  可扩展性反映了软件适应“变化”的能力。在软件开发过程中,“变化”是司空见惯的事情,如需求、设计的变化,算法的改进、程序的变化等。
  由于软件是“软”的,是否它天生容易修改以适应“变化”?
  关键要看软件的规模和复杂性。
  如果软件规模很小,问题很简单,那么修改起来的确比较容易,这时无所谓“可扩展性”了。要是软件的代码只有100行,那么“软件工程”也用不着了。
  如果软件规模很大,问题很复杂,倘若软件的可扩展性不好,那么该软件像用卡片造成的房子,抽出或者塞进去一张卡片都有可能使房子倒塌。可扩展性是系统设计阶段重点考虑的质量属性。
  兼容性
  兼容性是指两个或两个以上的软件相互交换信息的能力。由于软件不是在“真空”里应用的,它需要具备与其他软件交互的能力。例如,两个字处理软件的文件格式兼容,那么它们都可以操作对方的文件,这种能力对用户很有好处。国内金山公司开发的字处理软件WPS可以操作Word文件。
  兼容性的商业规则是:弱者设法与强者兼容,否则无容身之地;强者应当避免被兼容,否则市场将被瓜分。如果你经常看香港拍的“黑帮”影片,你很容易明白这个道理。所以WPS一定要与Word兼容,否则活不下去。但是Word不会与WPS兼容,除非WPS在中国称老大。
  可移植性
  软件的可移植性指的是软件不经修改或稍加修改可以运行于不同软硬件环境(CPU、OS和编译器)的能力,主要体现为代码的可移植性。编程语言越低级,用它编写的程序越难移植,反之则越容易。这是因为,不同的硬件体系结构(如Intel CPU和SPARC CPU)使用不同的指令集和字长,而OS和编译器可以屏蔽这种差异,所以高级语言的可移植性更好。
  C++/C是一种中级语言,因为它具有灵活的“位操作”能力(因此具有硬件操作能力),而且可以直接嵌入汇编代码。但是C++/C并不依赖于特定的硬件,因此比汇编语言可移植性好。
  Java是一种高级语言,Java程序号称“一次编译,到处运行”,具有的可移植性。为了提高Java程序的性能,新的Java标准允许人们使用一些与平台相关的优化技术,这样优化后的Java程序虽然不能“一次编译,到处运行”,仍然能够 “一次编程,到处编译”。
  一般地,软件设计时应该将“设备相关程序”与“设备无关程序”分开,将“功能模块”与“用户界面”分开,这样可以提高可移植性。