本文读前说明:需要先有 项目经验+阅读过《编程原则》这本书。(项目经验指的是有一定规模的开源项目或者商业项目的参与经验,大学课程那种实践项目不算)
一、名词笔记
1.1 CASE工具
CASE 缩写自:Computer Aided(or Assisted)Software Engineering(计算机辅助软件工程)
计算机辅助软件工程 (CASE) 是用于设计和实现应用程序的软件工具领域。CASE工具与用于设计硬件产品的计算机辅助设计(CAD)工具类似,并在一定程度上受到其启发。CASE工具旨在帮助开发高质量、无缺陷和可维护的软件。CASE软件通常与信息系统开发方法以及可用于软件开发过程的自动化工具相关联。
—— Computer-aided software engineering
一种分类方式:
Upper CASE 工具支持业务和分析建模。它们支持传统的图表语言,如ER图、数据流图、结构图、决策树、决策表等。
Lower CASE 工具支持开发活动,例如物理设计、调试、构造、测试、组件集成、维护和逆向工程。
所有其他活动跨越整个生命周期,同样适用于 Upper CASE 和 Lower CASE。
Upper CASE 工具:Microsoft Visio(画图)、Relational Rose(数据库建模)、StarUML(数据库建模)、PowerDesign(数据库建模)、Source Insigt(源码浏览、分析)
Lower CASE 工具:Concurrent Versions System (CVS)(版本控制)
1.2 双重冗余
在 3.26 可靠性 这一章节看到了有提及 “让软件架构存在内部冗余(双重冗余等)”,以提高容错能力,从而提高可靠性。
冗余设计我是知道的,只是有点不太确定,这个“双重冗余”,指的是
-
相对于正常只需要一份的东西,现在额外准备了一份?
-
相对于正常只需要一份的东西,现在额外准备了两份?
中的哪一个?
奇怪,是表述存在”方言“还是什么问题,居然查不到很准确的资料。
未能解答我的困惑...
按照我工作中的经验来看,像是数据的话,正常有一个异地备份就足够了。服务器的话,有一个“从服务器”正常也够。倒是还真没见过哪个系统的可靠性要求达到需要”双备选“的地步(或许是我孤陋寡闻了吧...)。
1.3 HOOK
在计算机编程中,HOOK 是一种「劫持」程序原有执行流程,添加额外处理逻辑的技术。
广义上来说,Java中的注解这类AOP的手法也算是HOOK。不过通常是指修改可执行文件、运行中程序的运行逻辑。
常见HOOK类型:
-
Inline HOOK
-
IAT HOOK
-
C++ virtable HOOK
-
SEH HOOK
-
IDT HOOK
-
SSDT HOOK
-
IRP HOOK
-
TDI HOOK && NDIS HOOK
-
Windows Message HOOK
我们可以把使用Hook技术的人比作钓鱼人,而Hook技术就像他的渔具。系统中的事件就像一条条游鱼,钓鱼人通过Hook技术将他想要的目标事件钓上(Hook技术一般是有指向性的),然后就可以对事件进行修改,再让其正常运行,达到技术人员的目的。
从正面来看,我们可以用于热更新、监控系统、实现杀毒软件。
从反面(黑客)角度,可以用来窃取数据、篡改程序、软件入侵等。
1.4 面条式代码(Spaghetti code)
面条式代码,又称为意大利面条代码,是一个贬义术语,指的是源代码具有复杂而纠结的控制结构,尤其是使用许多 GOTO、异常、线程或其他“非结构化”分支结构的源代码。之所以这样命名,是因为程序流往往看起来像一碗意大利面,即扭曲和缠结。面条式代码可能由多种因素引起,包括缺乏经验的程序员和在较长的生命周期中不断修改的复杂程序。结构化编程大大降低了意大利面条式代码的发生率,并被广泛认为是编程史上最重要的进步之一。
1.5 Convay's law(康威定律)
在书中 7.2 康威定律 提及。
由于书中介绍的文字过于简练,不够丰富且足以让人清晰理解这个定律。所以建议额外阅读相关文章,比如 原文。
作者在文章发表42年后对这个定律的总结:
Any organization that designs a system (defined more broadly here than just information systems) will inevitably produce a design whose structure is a copy of the organization's communication structure.
(译文:)任何设计系统(此定义在这里更广泛,不仅仅指信息系统)的组织都必然产生一个以此组织的通信结构作为设计的结构。
按书中所言,即:
架构服从于组织结构。
所以,如果要进行敏捷开发,那么就要架设对应的敏捷的团队。
1.6 Ubiquitous Language(UL,通用语言)
Ubiquitous Language 是 Eric Evans 在《领域驱动设计》中使用的术语,用于构建一种由团队、开发人员、领域专家和其他参与者共享的语言。
团队的每一个成员都需要在文档、代码、日常交流中使用通用语言,而不是方言。
通用语言的制订,需要讨论、分析,得到所有成员的认可和知晓,然后创建写有所有术语的词汇表。新加入的成员应该尽早阅读并记住这些团队中的术语词汇。
如果项目的语言支离破碎,那么就会引起沟通成本的上升,甚至可能因为误解而引发灾难。可以参考古代的故事——巴别塔。