(1) 前言
前段时间在一个linux相关的群里,谈到“四要件分析法”来看xserver的实践,一段时间过去了,感觉这个方法好像或许有参考的价值,就记录一下,并且做了一些改动和提炼,欢迎各位同仁点评交流。
这个“四要件分析法”是从法律那边借过来的。原是所谓的“犯罪构成理论”的一种,这几年由于一些原因,似乎在法律学界和“三阶层”说构成某种相互挑战的关系,而且有被认为“过时”,应该“改革”的意味。照此类推,是不是在软件工程方面也会有一个对应的“三阶层”说?我不太确定。
我们并不准备提出一个很晦涩的思想,我们喜欢简单的东西。由于“刑法上的四要件说”就在我们的社会生活中实践了许多年,我们似乎可以乐观地认为我们这里整理的客体-客观-主体-主观分析是容易理解的。
(2) 刑法上的四要件说
下列资料摘自互联网:
https://www.66law.cn/laws/117139.aspx
犯罪构成四要件有哪些
四要件说是传统的犯罪构成理论模式。从苏联学习过来的。是典型的社会主义法系的产物。但正如有学者指出的:“这一犯罪构成理论模式虽然存在陈旧、机械等不能令人满意之处,但在我国司法实践中已经产生了较为深远的影响,具有一定的生命力。
a.说明某种犯罪危害了什么样利益的要件,在刑法学中称之为犯罪客体。犯罪总是侵害了一定利益的。故意杀人罪侵害了人的生命权,故意伤害罪侵害了人的健康权,盗窃罪侵害了公私财物所有权,等等,诸如此类。犯罪所侵害的利益实质都是刑法所保护的社会关系,因此,犯罪客体就是犯罪行为所侵害的而为刑法所保护的社会关系。在刑法中,不侵害任何社会关系的犯罪是不存在的,因此,犯罪客体是任何犯罪都不可缺少的要件。
b.说明犯罪是在什么样的客观条件下,用什么样的行为,使客体受到什么样危害的要件,在刑法学中称之为犯罪的客观方面。犯罪客观方面首先是指行为人实施了危害行为,没有危害行为,就没有构成犯罪的前提。其次,是指危害行为造成或可能造成的危害结果。不管具体的犯罪行为表现形式如何复杂或具体的危害结果表现形式如何,他们都是犯罪构成的不可缺少的因素。
c.说明犯罪是由什么样的人所实施的要件,在刑法学上称之为犯罪主体。在司法实践中,各种具体犯罪的主体情况尽管千差万别,但作为自然人犯罪,其共同之处都必须是达到刑事责任年龄具有刑事责任能力的人。单位犯罪,也应具备一定的主体资格。
d.说明犯罪主体实施犯罪时主观心理状态的要件,刑法学上称之为犯罪的主观方面。犯罪主观方面包括两种形式,即故意和过失。每种犯罪都必须具有一定形式的主观要件,行为人的行为在客观上虽然造成了损害结果,但不是出于故意和过失,则不构成犯罪。
(3) “四要件分析法”的一般发想的前提:可描述性
我们仍然从构成来看,软件的构成能不能被描述?(可描述性)
实际上从哲学和数学对“描述”的双重规定来看,可描述性不是一个毋庸置疑的问题。举个例子,两个人谈恋爱,女方问男方,“你有多爱我?”,男方对女方的爱到底是不是具有可描述性?
不一定与传感器技术有关,将不具有可描述性的事物,通过具有可描写的事物来表述,有的时候是一种变不可描述为可描述的有效的方式。例如,一个回答可能如“我对你的爱比海还深,就像黄河泛滥一发不可收拾”。但是,这就能够形成男方对女方的爱的客观描述了吗?
在这个言说“物所是”(a thing is)的意义上,建模(modeling)似乎可以理解为一种“描述”的方式,描述了某物所是,但又带有特定的规范性和约束,体现了一种理解的方式。而在逻辑的意义上,描述(Descript)似乎是一个比建模更宽泛的事件。
具有可描述性有的时候是非常重要的。最直接的作用,如果一个事件、事物具有可描述性,这就意味着人机交互中他的合法身份。例如身高具有可描述性,我们就可以要求用户输入身高,反过来,如果我们要预测身高,而预测的身高也具有可描述性,就可以设计一个可以反馈预测身高的程序给用户。很容易想到的具有可描述性的东西例如长方形、圆形、点、线、面、颜色等,通过长宽高、半径、坐标、端点、形态、红黄黑等等就可以描述不同的长方形、圆形、点、线、面、颜色等等。
有的时候甚至我们使用具有可描述性的不同事物来描述另一具有可描述性的事物。例如通过两个线段来描述两个人的身高数值。
从代码来看,用C语言来说,可描述性意味着,例如语句 printf(A, B) ,其 A 和 B 具有规范性。在这最低的意义上,事物具有可描述性就可以存储、表示、利用为字符串,甚至进一步用于软件的自动化、智能化、一体化等等的过程之中。
除了数据意义上的可描述性,还有流程上的可描述性。现在许多我们的程序的合法性,实际上是通过形式化的方法来建立了可描述性,这当然是好的,严谨的。
但我们可以注意到,例如伪代码也可以用于描述算法,而伪代码的形式化程度似乎没有计算机编程语言的形式化更强;但跟自然语言的接触点似乎要更宽一些,也就容易从自然语言上面引用转换过来。
我们先铺垫可描述性的这些方面:作用,和代码的关系,数据的可描述性,算法的可描述性,形式化不等于可描述性的唯一方式。
(4) “四要件分析法”的一般发想的一般设想,需求分析的独断性,面向对象
许多软件工程实践被认为开始于需求分析。需求分析通常需要一个实际在活动者的“分析者”(可能是多人),并且需要一个“系统”之类的作为被分析的“客体”。需求分析技术已经有了许多年的实践,可以说效果丰硕,应用广泛。
但我们还可以从这样子的角度来看待需求分析:相关人的共同利益的最大总和。在这样的角度之下,传统的需求分析技术似乎就陷入了一种“独断的官僚化倾向”,否则不能完成;而所有的软件,又被要求“需求分析”出同样的东西来——“分析者”的作用和影响也就被遮蔽在历史的深处。
面向对象提供了另外一种思路:尊重事物的客观性。流行的观点似乎足以认为“面向对象不过是需求分析的一种技术”,但如果我们从人,从需求方看到客观世界的方式来看,面对对象有着和需求分析内部的悖论——面向对象超越需求分析的主观性,而将在认识的意义上那些客观的东西置于绝对和前定的地位。
两个极端:主观至上主义的需求分析技术,客观至上主义的面向对象技术。而我们现在的问题是:有没有一种方法调和他们?
我们回到事实和事件来找到一个基点,模仿“犯罪四要件”的观看方式,似乎可以构建出一种描述软件构成的逻辑系统:
① 客体 —— 软件所相关的具有现实意义、合理意义、价值取向的事实和事件。这既可能是物理的,也可能是生物的,甚至是心理的。例如软件是一个门禁系统,那么门禁系统所管理的门,包括门的大小似乎就应该认为是客体。如果门禁系统由不特定的业主、安保人员来管理,那么这些业主、安保人员似乎也是客体。如果还追求业主、安保人员的满意度,那么业主、安保人员的心理感受似乎也是客体。
② 客观 —— 软件所相关的客体的具有重要性、稳定性、确定性、过程性的方面。例如门是一个客体,那么对门的度量,例如他具体的长宽高,如果有必要,就成为了客观。门禁系统的作用在于管理门,保障业主的利益和安全。那么门是否能够对特定的人开放和不开放,似乎具有非常突出的客观性,除非主要矛盾已经转移或者他置。客观不是一成不变的,我们慢慢可以看到,随着软件的功能的演化,软件所相关的客观可能会渐渐趋向“主观”。
③ 主体 —— 使用的主体;用户。系统,软件相关的人。我们这么说的意义并不是所有的角色的权利和作用是无差别的,也不是所有人都一定是同种性质的主体。当我们说门禁系统的开发主体,这显然不会包括那些跟开发没有关系的人。我们说门禁系统的使用主体,那么一些并不是业主的开发者,可能就不被包括在内。聪明的你一定发现了,这类似于需求分析中的“角色”的概念,但强调了他们的身份特征和实际行为。
④ 主观 —— 主体的意志、目标、目的、看法、观点、心理作用,等等。我们可以感觉到,主观在软件开发的过程中似乎越来越扮演着一种重要的作用,但同时又受到客体的约束,并也可能受到客观、主体、主观内部的矛盾等等的约束。
我们简单勾勒了 客体-客观-主体-主观 这四种要件。这主要是在相对的意义来说。我们还需要标注出一些特别的方面:重要客体,重要客观,重要主体,重要主观。否则我们似乎找不到工作和工程的重点。
从需求分析技术来看,需求分析就是要把握客体-客观-主体-主观的各个需要注意的方面,并且常常在符合某种约束、要求的前提下,整理、提炼、生成适合于软件的具有工程意义的客观和主观,实现软件的设计目标和工程作用,实现软件创造了经济效益、政治效益、文化效益、社会效益、生态文明效益等等。
从面向对象技术来看,面向对象的程序设计,类的设计,其内在要求也在于准确而恰当地把握客体-客观-主体-主观的各个需要注意的方面,并突出地使用各种面向对象的工具和流程反映出来,形成为某种客观和主观,而其归旨似乎也在实现软件的设计目标和工程作用,实现软件创造了经济效益、政治效益、文化效益、社会效益、生态文明效益等等。
(5)软件的历史:使客观趋向于主观
总结高复杂度、长期运行的软件演化,我们可以得到一条深刻的教训:(a)软件在运行、维护、演化的过程中,其时而发生看似进化、看似退化的变更,这种变更,在积极的时候可能带来巨大的效益,而消极的时候又可能引发巨大的灾难,但总的趋势是其客观趋向主观而不可逆转。(b)软件的先进性不存在绝对的永恒性或必然性,而取决于其主观和客观的设置,取决于其客观对其主观的趋向。
换句话说,软件,作为客体-客观-主体-主观的总和,似乎可以分为两个层面的命题,第一个层面(a),不可逆的主观化,第二个层面(b),软件先进性是一种对主观客观的设置,不可能永恒存在。
我们说的主观客观的设置,指的是具有可行性的、合理的、符合人的需要的、具有工程实践优点的意义上的主观客观的设置,否则,显然只能是浪费资源、走向失败和悔恨。
我们这么说是不是就等于不需要试错,不需要实验和创新了呢?不是的。在实践中我们时常需要追随直觉和经验的指引,变不利为有利,在实践中从成功走向更大的成功,而试错、实验和创新等等正是形成可行性的、合理的、符合人的需要的、具有工程实践优点的主观和客观的过程。
我们这么说是不是就不需要考虑深层次的软件工程问题或其他的问题,只需要让一切随机摇动呢?也不是的。就好像有正速度的车总是趋向前进,但如果突然熄火、遭遇巨大的逆方向速度和力,这辆车可能就要走歪、走错甚至走上了相反的路,离目的地越来越远。我们说了不可逆的主观化、对主观客观的设置,而良好的软件开发团队开发组织,良好的软件工程实践和实施,正是对这种对主观客观的设置一种支持、形成的方法和方式。
值得注意,我们说的事实,不仅仅包括天然事实(natural fact),还包括拟构事实(artificial fact),即具有合理意义的,人对天然自然的改造利用而形成的规范性的、假定性的、想象的东西。
——许多人将artificial翻译为“人工的”,例如 artificial intelligent 翻译为“人工智能”,即 AI。一些场合似乎可以将artificial翻译为“拟构的”,在这个意义上所谓的“人工智能”即“拟构智能”。但 artificial intelligent 翻译为“人工智能”是通用翻译,暂不纠结了。
——马克思有“天然自然”和“人工自然”的论点,感兴趣的同学或者可以了解。
不可逆的主观化,对主观客观的设置,人在软件的建设、管理和发展的过程中,利用了事实,并创造出新的事实(不能凭空捏造),不断推动着软件和软件工程的前进,这是我们的一般的观点。正是由于软件的不可逆的主观化,对主观客观的设置的特定作用和地位,软件的主观客观的设置就显得非常重要,需求分析技术,面向对象技术,就显得很重要,而且具有特别的意义。
(6)例子:系统自更新按钮
我们来考虑一个一个简单的例子。考虑有一个系统λ运行在主机h,每次需要更新的时候,需要启动一个进程UPDATE(λ),这个进程会停止系统λ,将主机q上的新版本NEXT(λ)拉取到主机h覆盖,并重启系统,于是系统λ演进到NEXT(λ),并开始运行。同时,主机h在80端口上开启着一个web服务Γ,版本管理员访问这个Γ时候会看到系统λ运行的相关信息,并且有一个按钮为“更新到新版本”,点击这个按钮时UPDATE(λ)将会启动。
客体:
(不额外标定重要客体)
系统λ包括新版本NEXT(λ),主机h,主机q,可能也是主体
进程UPDATE(λ)可能不重要,Γ,Γ看到的信息
版本管理员 可能也是主体
“更新到新版本”的按钮
客观:
系统λ包括新版本NEXT(λ),主机h,主机q,UPDATE(λ),Γ,Γ看到的信息 规范正常可用 (不一定成立)
版本管理员 规范正常工作 (不一定成立)
重要客观:
(不一定成立)
版本管理员点击“更新到新版本”的按钮,UPDATE(λ)将会启动,完成系统λ演进到NEXT(λ)
主体:
(暂不考虑其他主体)
版本管理员
主观:
(不一定成立,不一定永远为客观)
版本管理员点击“更新到新版本”的按钮,UPDATE(λ)将会启动,完成系统λ演进到NEXT(λ)
一些人可能会想起需求分析技术和面向对象技术中的一些工具或方法,例如功能分析,模块分析,用例图,时序图,系统架构图,等等,他们可能在做这着类似的事情,并且可能会得出类似的指导和结论,欢迎更多的对比或分析。
相对而言,客体-客观-主体-主观分析突出强调软件所有的人-物-概念-活动的统一性,并且重视他们之间的互动关系和相互影响。进一步地,如果说需求分析技术和面向对象技术提出了某种将软件及其演化的系统化、规范化、形式化的方法,我们似乎更指望通过客体-客观-主体-主观分析建立对软件和系统的实证性的研究,并且基于这种实证性的研究提出改进的措施。
====================
在客体-客观-主体-主观分析的意义上,需求分析似乎可以用一句很简单的话来理解:正确地分析和设定软件的客观和主观,尤其是需要劳动力去实现、变更、完成的各个方面。
====================
--
修改:darkk FROM 1.202.155.*
FROM 1.202.155.*