软件方案的能力范围

软件工程师们每天都会遇到各种各样的问题,

我们中的绝大多数人,日常的工作内容就是把这些问题解决掉。

不论是修复一个代码缺陷,还是开发个新的功能,又或者是启动一个新的项目。


回顾多年的学校教育,无形中让我们养成了以下这样的思维习惯,

那就是,针对一个给定的问题,快速的找到答案,

这使得我们容易在考试中获得高分,以致于让我们有机会接受更好的教育。


适应环境,从而沉淀出一套最有效的思维模式,

这确实可以算是优秀人士的一种衡量标准。


然而,这种思维模式一旦被不小心用到了其他环境中,

那么带来的恶果将是惨重的,

甚至还是难以觉察的。


1. 发现问题

急着去解决问题,而不去分析问题本身,是一个最常见的思维惯性,

因为在校期间,我们遇到的问题都是严格定义的,

不太会出现问题本身出现差错的情况。


但是现实中,却远不是这样,

现实中的问题,更多是不确定的


例如,一个想要实现工作流引擎的团队,

他们的业务场景可能并不需要让工作流可配置。


那么它们到底为什么要解决这个问题呢?


这就是典型的问题本身不明确的一个情形。

在这时候,我们就需要给“问题”下个合理的定义了,

到底什么是“问题”?


斋藤嘉则在《发现问题的思考术》中提到,

所谓“问题”,就是“应有的景象”与“现状”之间的“落差”。

1
问题 = 应有的景象 - 现状


而解决方案是否有效,完全取决于问题的定义方式。


如果团队仅仅是为了应付经常变动的业务流程,

那么首先应该考虑的是,为什么业务流程会经常变动,

而不是考虑如何用技术手段使得它可以任意变动。


此外,换一个角度,如果团队的目标根本就不是为了解决业务流程问题,

而是为了做出一个技术产品,来提高团队的影响力,

那么开发工作流引擎,也未尝不是一个可行的办法。


所以,对问题本身,我们应该有更多的考虑,

究竟是谁的预期,和现状之间产生了怎样的落差?


2. 让方案自动化

软件才出现了不到100年,但是人类社会却繁衍生息了上万年,甚至上十万年,

从这个角度来看,软件形式的解决方案可能只算是历史上的一瞬间了。


软件系统也从人类社会现存的解决方案中学到了很多,

Smalltalk的设计者之一Alan Kay

在答复Meaning of "Object-Oriented Programming"的邮件中提到了,

I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages.


可以看出,Smalltalk中“对象”的概念,其设计动机最初来源于生物学,

这得益于Alan Kay同时具有生物学和数学的知识背景。


我这样写是为了阐述一种现状,

人们总是寄希望于用软件解决所有的未解难题,这是一个常见的思维陷阱。

因为某些问题的症结点,可能并不在软件层面,

即使该问题是人们在从事软件开发活动中暴露出来的。


例如,想要提高代码的交付质量,而编写一个自动化的测试系统,

这显然就并没有分析清楚问题的症结所在,

尤其是应用于那些难以进行自动化测试的领域中。


因为,如果将代码质量归结为测试的不够充分,

那么首先提高人工测试的投入量,才是验证“增加测试是否是有效”这一假设的最好办法,

这也是投入产出比最高的方案。


等到人工测试投入到工作中之后,

等到那些具有重复的,可被自动化执行的部分出现时,

再将这部分用软件系统来解决,

我想这才是一个软件系统被考虑用于解决问题的正规途径吧。


而不是反之,

当可重复性的工作,可被自动化操作的工作,被识别出来之前,

就先尝试开发一个软件系统,以期望它可以奇迹般的解决问题,

这样经常会得不偿失。


计算机程序的构造与解释》中写到,

计算过程是存在于计算机里的一类抽象事物,在其演化进程中,这些过程会去操作一些被称为数据的抽象事物。

我们用于指挥这种过程的程序就像是巫师的咒语,它们是用一些诡秘而深奥的程序设计语言,通过符号表达式的形式精心编排而成,它们描述了我们希望相应的计算过程去完成的工作。


从程序语言的角度来看,

是先有计算过程,再有了这些计算过程的描述(程序)。


当我们对现实问题还没有想要一个有效的“过程”解决它时,

就冒然从事编码(程序)活动,

这显然是低效的,甚至是无意义的。


3. 信息管理

软件开发行业的从业者们,可能会抱有这样的幻想

是我们现在这个团队,现在这个项目有问题,

必定存在一个足够优秀的团队,在那里进行开发,是顺畅的高效的,

没有各种令人分神的事情。


其实,这种幻想可能根本就无法实现。

因为每个团队每个项目都不可避免的存在自己的问题,

有其难以克服或正在想办法克服的瓶颈。


快速进行软件开发是一个不稳定的理想状况,

有任何一项不论是需求因素,工期因素,人员因素等等条件,不能符合理想标准,

都会导致开发活动慢下来。


虽然软件开发是有关编程技术的,但它的参与者终究还是人,

有人就会有目标不统一,或者沟通合作等方面的社会学和心理学问题。


关键是当其他人在兜售一个软件工程方面的解决方案时,

如果不强调它会让现状变得像童话般美妙,就没有人愿意去尝试它。

这就给我们带来了理想情况确实可以达到的错觉。


这应该是不可能的,因为在软件工程方面“没有银弹”。

软件开发的真正困难不在于如何表示一个抽象概念,

而在于如何将这个抽象概念传递给其他人。


因此,在《人月神话》提到了Brooks's law

Adding human resources to a late software project makes it later.

即,向进度落后的项目中增加人手,只会使项目更加落后。


因为,新增加的人手会加剧组织沟通不畅的状况,

而沟通问题或许是造成项目延期的主要原因。


在软件开发过程中,如果出现了问题,

先从沟通和信息不对称的角度进行反思,

比直接寻求用一个辅助软件系统旁敲侧击,将会更加有效。


结语

既然从事了软件开发这个行当,对软件系统的威力和价值,当然是有足够的自信,

但这并不能让我们更加专业化。


所谓专业化,我认为并不仅仅是从专业领域(软件)给出任何可行的方案,

更重要一点是,从问题领域出发,指出客户方案中的不合理之处。

这样才能让方案总是直指问题的核心,确实有助于解决问题。


然而,很多情况下,都不是我们可以控制的,

在对解决方案提出质疑的时候,

他人的任何不悦,最终才会让我们意识到什么是别人想去解决的问题。


事实上,最难达成一致的是对问题本身的认知和大家的目标。


从“问题 = 应有的景象 - 现状”公式中我们也可以看到,

在大家都能理性正视现状的基础上,不同的人因为拥有对“应有景象”的不同预期,

最终会导致人们在心目中实际想要解决不同的问题。


我们想达到的预期,在别人眼里真的是个问题么?