我们眼中的自己

当看到标题的时候,首先想到的是以下这些名词,

循环,递归,反馈,自我意识。


作为软件从业者,我们是如何看待自己的呢?

如何看待我们的工作?

我们会经常反思,置身事外吗?


从形式系统到科学方法

物理学家研究物质及其运动规律,

而计算机科学家研究计算。


他们的研究方法有相似之处,

首先把研究对象形式化,

然后借助数学工具寻找规律。


在逻辑学中,形式系统由两部分组成,

一个形式语言加上一套推理规则。

形式系统既可以被抽象的制定出来,只是为了研究其自身,

还可以用来研究真实现象或客观事实。


所谓形式语言,指的是用精确的数学,或机器可处理的公式,定义的语言。

而推理规则定义了语言中合法句子之间的联系。

即使相同的语言,配备不同的推理规则集,也构成了不同的形式系统。


有了形式系统之后,就可以把它当做工具来研究真实世界了。

然而,值得一提的是科学方法。


科学方法指的是一套方法论,

它是一个观察现象,提出理论假设,对预测进行检验,从而修正理论的过程。

不幸的是,人们永远无法证明某个理论为真,

而证明为假,却只需要一个反例即可。


正是这种大胆假设小心求证的精神,

不断修正自身,让科学越来越严谨。


回到形式系统上来,形式系统就是人们提出的一种理论假设,

它不是真实世界,而只是真实世界的一种写照。

不注意区分的话,经常会引起混淆,

正如大多数人们总是相信物理定律就是客观世界一样。


从重构到测试

热力学第二定律指出,一个孤立系统的熵永不减少。

随着软件系统的演进,内部结构会变得越来越杂乱,开发和维护成本也会越来越高。

为了调整结构,使熵减少,就得打破系统的孤立性,让它与外界产生联系。


因此,在软件行业中,人们经常提及『重构』,

它指的是,在不改变软件系统外部行为的前提下,

改善它的内部结构。


然而,保证软件系统外部行为不变,是一件很困难的事情,

判断两段程序是否等价,这个问题是不可判定的。

即,没有一个通用的算法来判断任意两段程序是否等价。


因此,寄希望于完全自动化的设想破灭了,有些事情是不能自动化的,

自动化测试只能起到辅助作用。


事情并没有到此为止,不幸的是,

任何相容的形式系统,只要蕴涵皮亚诺算术公理,它就不能用于证明它本身的相容性。


因此,一个软件系统,在其内部无法验证自身的相容性,

检查一个软件系统是否符合设计要求,所使用的方法就是对它进行测试,

在这个软件系统之外进行证明。


证明论方法也是有局限性的,

类型系统也只能起到辅助作用。


从TDD到DSL

测试驱动开发(TDD),是一种软件开发过程中的应用方法,

倡导先写测试程序,然后再编码实现其功能。


事实上,TDD也可以看做是一种目标管理方法,

讨论不可衡量的目标,就相当与议论不可证伪的命题一样,

TDD与科学方法不谋而合。


TDD也是重构的基础,没有测试用例对程序行为进行约束,

我们就很难确定重构的影响范围,

没有任何保障的重写,很可能意外破坏系统其他方面的性质。


TDD坚持的是自顶向下的设计思想,

我们先想象问题被解决时应该是什么样子的,

在考虑问题实际被解决的方案。


这样做有助于我们尽早看清问题本身,

避免解决问题过程中的方向性错误。


说起自顶向下的设计,DSL也可以看做是一种实践方案。

DSL是一种自定义的形式语言,用来描述领域问题的算法。

我们必须先建立描述,然后再对描述进行解释。


语言是对思维的编码,是交流的媒介。

DSL隔离了问题的描述方式和对描述的不同解释实现。


从编程语言到解决方案

编程语言也是一种DSL,

虽然应用广泛,但也有其适用范围,没有银弹,

强行使用不切题的方案去解决问题,会让简单的问题变的复杂起来。


在软件行业中,大部分的工作内容,

就是在识别原始的问题是什么,是否解决方案将它复杂化了。

考虑问题本身的属性,是一件很难的事情。


数不胜数的编程语言,层出不穷的类库框架,

这些实际上都是别人的解决方案,

都是为了特定问题而被创造出来的。


好的方案,如果不宣传,别人就不会知道它,

但如果过于宣传,就容易使人盲目的迷信它。


还记得我们所说,形式系统并不是真实的世界吗?

DSL也只是问题实际计算过程的简化描述。

因此,首先要有真实的操作步骤,才能借助DSL简化它。


例如,使用了线上协作平台的用户,

并不能改变线下缺失协作的客观现实。

实际上我们应该先考虑不使用软件的方法,

再通过软件替换掉可以自动化的部分。


只有这样,我们才能抵御软件公司的市场宣传,

才能着眼于非软件因素的问题本质,

不要忘了,软件是由人来创造的,也是为了解决人的问题。


从技术到业务

总有人问起,到底是要用技术推动业务发展,

还是要用业务促进技术进步。


实际上,这需要我们考虑业务是什么。

维基百科上,对『业务』是这样解释的,

企业运用科学方法和生产工艺,生产出可交付用户使用的产品与服务,

并以此为企业带来利益的行为。


因此,追求业务发展,首先是一个商业问题,

企业如果不获利,就不可能活下来,

它是企业正常运转的前提。


看来,因为业务有发展需要,才有可能技术进步。

业务决定技术。


其实不然,尤其是对于某些高科技公司来说,

企业的产品就是技术,通过销售技术方案而收益。

对他们来说,技术进步是业务发展的唯一办法。


因此,当人们向我们矫正,一定要用业务带动技术发展时,

这实际上就是承认了技术革新并不是企业收益的源泉,

这并没有什么错,每个公司都有自己的战略计划。


从个人到团队

和企业一样,个人的选择也是趋利避害的,

这也是个体能够活下来的前提。


人们一生会遇到各种选择,究其本质,

总是在选择对自己来说最有益的那个决定。

如果事先知道个体收益的话,就能预判出随后的行为。

要健康把控团队的方向,这是不得不知道的事情。


不好的管理方式,通过限制人们的行为来产生影响,

而好的管理方式,通过改变成员的收益结构,从而影响个体的选择。


当我们与别人进行合作时,

对于我们自身有益的决定,通常并不会被认可,

因为这种决定很有可能对别人来说不是最优的。


这时就要想办法促进合作方交换信息,

把两个系统看做一个系统,找出对这个大系统来说最优的决策。

只有合作方收益了,自己才有可能收益。


结语

待解决的问题总是处于变化中,是软件的一个典型特征。

我们既要坚持科学方法,还要能认识到方法的局限性,

既要找到解决方案,还要避免将问题复杂化,

我们既要有能力将重复劳动自动化,还要认可非技术因素的比重,

既要认识到企业的商业本质,还要能尊重技术的价值,

我们既要照顾到个人的发展需要,还要能对团队的方向负责。


参考

形式系统

科学方法

哥德尔不完备定理

测试驱动开发

没有银弹

偶然复杂度

业务

纳什均衡点