简介
学习系统完备性的概念,了解系统不应做什么,明确系统的目标,并处理系统质量保证(QA)后的问题。
你的软件功能是否完备?
你为项目付出了巨大努力。看起来所有功能都已实现,大多数还配有测试。你可以松一口气了。大功告成。但真的是这样吗?“功能完备”是否就意味着“可投入生产”?你的系统真的准备好部署了吗?它能否由运维团队独立运行,并承受真实世界用户的海量访问而无需你亲自介入?你是否曾担心过深夜被紧急电话和警报惊醒的不安感?事实是,开发远不止添加所有功能这么简单。当今的软件设计是不完整的,因为它只关注系统应该做什么,却忽略了系统不应该做什么。
好的系统
好的系统应避免以下问题:
- 程序崩溃
- 死锁卡顿
- 数据丢失
- 侵犯隐私
- 造成经济损失
项目团队往往只以通过质量保证(QA)测试为目标,而非真正面向生产环境。
换句话说,我们大部分工作集中在让系统通过测试。即使采用敏捷、务实且自动化的测试方法,也远远不足以证明软件已准备好应对真实世界的挑战。现实中的压力——不可预测的真实用户、全球范围的流量高峰、来自遥远国家的恶意攻击者——远超我们所能模拟的极限。但首先,我们必须承认:尽管计划周密,意外仍会发生。当然,尽可能预防总是好的。但若盲目假设所有可能的灾难性事件都已被预见并消除,那就非常危险了。相反,我们应该主动防范可预见的风险,同时确保整个系统具备从突发严重故障中恢复的能力。
即便经过回归测试和 QA 阶段,系统的稳定性在生产环境中依然无法保证。因此,最好在系统上线后继续尽可能多地进行测试。
设定正确的目标
大多数软件的设计目标是开发实验室或 QA 测试人员。它们被设计成能通过诸如“客户必须填写姓和名,中间名可选”这类测试用例。其目标是存活于 QA 的人工环境,而非真实的生产世界。今天的软件设计,就像上世纪90年代初的汽车设计一样,与现实脱节。那些仅在舒适实验室中设计的汽车,在模型和 CAD 系统中看起来完美无瑕,流线型车身在大型风扇前熠熠生辉。设计师们身处宁静空间,创造出优雅、精巧、富有创意的设计,但这些设计却脆弱、难以令人满意,最终寿命短暂。如今的软件架构与设计,同样发生在同样洁净而遥远的环境中。
真实用户想要的不只是聪明或好看的车;他们想要的是专为真实世界打造的车。他们希望这辆车是由了解现实的人设计的——知道机油更换总是在3000英里后才完成,轮胎在最后十六分之一英寸胎纹时仍需正常工作,以及某天一定会一手拿着蛋麦芬,一手握着手机时猛踩刹车。
当一个系统通过了 QA 测试,我们能否确信它已准备好投入生产?
仅仅通过 QA 测试,几乎无法判断系统在未来三到十年的表现。它可能是软件界的凯美瑞,连续运行数万小时无故障;也可能是雪佛兰 Vega(一辆在公司测试赛道上前部脱落的车),或是福特Pinto(一种在特定撞击下极易爆炸的车型)。仅凭几天甚至几周的测试,根本无法预知未来几年会发生什么。
面向可制造性的设计
制造业中的产品设计师早已追求“面向可制造性的设计”——即通过工程手段使产品能够以低成本、高质量的方式生产。在那个时代之前,设计师与制造方之间存在巨大隔阂。设计图纸直接交给生产线后,常出现无法触及的螺丝、容易混淆的零件,以及本可用现成部件替代的定制件。结果必然是质量低下、成本高昂。
我们今天正处在一个类似的状态。我们不断被旧项目的残次品拖累,疲于应付各种支持电话。我们对“面向可制造性”的类比,就是“面向生产的软件设计”。我们虽不把设计交给制造厂,但确实将完成的软件交付给 IT 运维团队。我们需要设计单个软件系统,以及整个相互依赖的系统生态,使其能够以低运营成本和高可靠性稳定运行。
Quiz
一个良好的系统不应________。