本系列文章主要来源为《代码大全》,并且目的仅仅是笔记。 实际设计千差万别,书中所记可为理论基础,但是一定不能照搬照抄,灵活变通才是我们“软件工程师”区别于机器的特点。
同时,这些“道理”对于没有设计经验的人来说很难记住,但是对有了一点经验的人来说,就会有一种,食之无味,弃之可惜的感觉。所以,设计中,不断思考,不断总结,不断观摩,方为进步的途径。
架构设计中的挑战
设计是一个wicked的问题
wicked,即只有通过解决或者部分解决才能被明确的问题。 拿到项目中就是,需求一直在变更,往往只有解决了一个问题才能明确设计面对的具体问题。
设计是个了无章法的过程(sloppy process)
软件设计的成果应该是组织良好,干净利落,但是过程却不是一帆风顺。
设计过程中会犯很多错误,但是在设计阶段犯错并且改正,这个代价是远低于编码阶段修改的。
同时,很难界定一个设计是“好的”还是“坏的”:设计到什么细节,哪些需要用形式化的设计符号表示,哪些可以留到编码才做,怎样才算完成?
结果往往是到没时间做为止。
设计是一个不断取舍,调整优先级的过程
衡量硬件,带宽,开发能力,成本等等条件之间的平衡度。 比如反应时间与开发速度之间的取舍(例如项目早期看重快速出结果,选择一些快速开发语言,而大了过后更倾向于系统稳定性,可维护性上)
设计受到诸多限制
设计的要点,一部分创造可能发生的事情,一部分又是在限制可能发生的事情。
换句话说,在受限的条件下做到尽可能多的事情
设计是不确定的
像前面说的,设计很难界定优劣,每个人的设计都是不同的
设计是一个启发式过程
设计过程充满了不确定性,因此设计技术也就倾向于“探索式”,不能保证能够产生预期的结果。不断试验,不断犯错,不断改进。
设计是自然而然行成的
把设计的这些特性归纳起来。我们可以说设计是自然而然形成的, 它是在不断的设计评估,非正式讨论,写试验代码,修改试验代码过程中演化和完善的。