什么是软件开发?
有人问我:“什么是软件开发?”。回答这个问题前,我们需要先理解什么是软件。
一、软件定义
关于软件,已经有人给出了简单的定义,举例:
软件是计算机系统的一部分,它适配各种不同用途的机器。例如,通过同一台计算机但不同的软件,我们可以玩游戏、计算缴税、写信或者写书,以及获得约会邀请的答复。
—— 杰拉尔德·温伯格
有了上述定义,什么是软件开发也就显而易见。
软件开发研究如何让运行在计算机里的不同系统解决人们在现实中遇到的问题。
我们经常见到这种句式,试图一句话,就把事情讲得面面俱到。
不妨简化一下。
软件开发研究如何让计算机解决问题。
看起来不错,我们得到了一个相对普适的观点。
倘若你相信“一切问题都是人的问题”,那我们就可以接着简化。
软件开发解决人的问题。
不得不说,这个定义充满了敷衍的味道。如果你敢向你的女友这么解释,她大抵会问到“你是不爱我了!”。
不过,它总结了软件开发的基本动机,把所有的细节归纳为“人的问题”,至少不会有多大偏差。
你可能会刨根问底,提问“什么是人的问题?”。于此,我们无法给出更加一般的解释,但通过下面的例子,也许可以窥探到一些奥秘:早在 1995 年,有人就觉得软件开发要解决的问题陷入了困境。
我们遇到了前所未有的困难,不知道在做出电子表格(Excel)后,计算机还可以用来做什么。
—— 查尔斯·西蒙尼
从今天来看,这个观点有失谦逊,软件行业从来没有止步于表格处理程序。
当然,我们不是要做浅显的批判,通过考察它,我们可以发现软件开发所解决的问题的三点特性。
“人的问题”不可预料。
世界在改变,人的需求也是一直变化的,我们不知道下一步会发生什么。
“人的问题”具有延续性。
在 1977 年,人们开始用电子表格处理数据。在今天的办公自动化领域,电子表格仍具有着不可替代的作用。这是值得庆幸的,总有些问题和解决方案会持续很长一段时间。
“人的问题”具有复杂性。
尽管软件技术在当今的 IT 领域开花结果,人们探索出了各种各样的成型解决方案,但开发者和开发团队依旧面对着复杂的开发环境。
复杂性足够我们花费一整节的内容来阐述它。
二、软件复杂性
当我们来把自然无限繁多的现象同我们理解力的局限性及我们器官的粗糙相比时,除了看到我们工作进展的缓慢,在长久的工作中不时中断,天才的难得,连接重要事物的链条中断,我们还能看到什么呢?
—— 《哲学思想录》[法] 狄德罗
随手翻开一本介绍软件工程的书,你都会看到它会提及复杂性。软件复杂性的本质是,现实世界是无比复杂的。至于现实为什么是复杂的,不在本文讨论的范畴。本文更关心的问题是:
是什么让软件变复杂的?
我们在上文提到“软件是运行在计算机里的系统”,这里直接给出系统的一般定义:
系统是对世界的一种观点。(一般系统论)
换种说法,系统是对世界的一种抽象,不同的抽象就会产生不同的系统。
观点可以简单也可以相当复杂。
一个软件从无到有,越来越复杂,根本原因就在于特性不断增加和改变,不同角度会产生不同的观点。
举个食品行业的例子。
一家公司以独家配方生产一种食品,每个季度的销售额上涨 10%。
管理层希望业绩进一步提高,具体到研究部门,目标是调制出更好吃的配方。
研究团队计划每个月只改动一点点,一年过去了,不断地有顾客投诉食品不再是原来的味道了。
公司董事决定开会。
“我们生产的食品更好吃了吗?”
“当然,我们的销售额增长达到了 30%。”销售经理自信地回答。
“但是我们的顾客不这样说。”
“他们只是不愿意改变!”
看起来顾客反馈和销售经理的答复是矛盾的,这就是复杂性的一面。
有一种缓解复杂性的方法是始终保持简单,即我们倾向于不做任何优化,它有个经典表述:
不要过早的考虑优化。
回到上面的故事,销售额的增长不一定完全归因于研发团队的努力,也许那家公司什么也不做,销售额同样会上涨。
你可能会质疑“说的轻巧,我们总不能什么都不做?”
回答它,涉及到人们做决定时绕不开的一个问题。
你愿意付出什么样的代价?
付出什么,就要准备好得到什么。你愿意付出多少薪资雇佣员工,你愿意增加多少特性,你愿意采用什么样的解决方案,你愿意为这个 Bug 留出多少工作量。
拿出什么样的筹码,承担什么样的风险,调和什么样的矛盾,是真实摆在软件团队面前的问题。
四、什么是软件开发
现在,我们可以再次回到这个问题了。
首先,“预料”对方真正的目的是什么?
1. 对方只是随口一问。
2. 对方想打探你的薪资,然后向你介绍相亲对象。
3. 对方对软件行业这个话题感兴趣,并想深入了解更多。
4. 其他可能性。
这里只分析第三种情况,先给他来个含辞模糊的定义,比如
软件开发通过设计、编码、测试以及持续地维护解决人的需求。
一般地,对方发现自己听得云里雾里后,就会识趣的停止这个话题。
他们对软件行业的唯一认知且经常一再重复的问题就是:
你们是不是整天坐在电脑前?
但也有可能,尤其是碰到其他领域的工程师时,会引出更为具体的问题。
不幸的是,有时候问题根本就不存在,它会让你准备好的所有说辞付之流水。
“工作忙吗?”
“还行。”
“每天都干啥?”
“主要是写代码。”
“不懂,听说挺累的。”
“有时候是累,工作不都这样么。”
“嘿,说的也是。”