以生活为师
哲学思辨无法代替客观世界,哲学离开生活就变得空洞。软件工程产出的成果需要服务大众生活,软件的需求也来源于生活。罗翔老师讲过一个故事,他使用同样的司法案例在学校的课堂上和校外的普法活动中讲,发现普法活动的人民群众反而比课堂上的学生更能理解案例背后的法律原则,因为人民群众的生活经验比大学生多得多,而法律也来源于生活。
软件开发也可以从生活学习。在设计软件模型时,很多模型模棱两可,我们既不知道如何起名字也不知道如何设计。实际上,大部分业务软件的模型都可以在生活中找到影子。对软件架构理解深刻的架构师,往往对生活的理解也深刻。
例如,几乎所有的系统都需要登录,而登录过程中会话的概念对初级开发者不是很好理解,对于架构师来说也不是很好建模。这种情况,我们一般建议在生活中去寻找一些启示,通过比喻来提高认知。对会话的理解可以想象为开车上收费的高速公路,进入收费入口时,工作人员会给驾驶员发一张卡片,这张卡片就是这辆车行驶在这条高速公路的凭证。
还有一个例子,有一个需求是"当群组没有成员时,这个群组不出现在群组列表中。"如果按照编程的惯性思维,会很容易写出性能低下的代码:群组列表的每一次展示都需要过滤没有成员的群组。
回到生活,这个例子可以理解为最后一个离开办公室的人需要关灯,群组就像办公室,列表中元素的可见性类似于办公室的灯光。作为上帝,让每一个观察办公楼的人自动忽略无人的办公室太强人所难,而制定一个规则让最后一个离开办公室的人关灯则非常好理解。通过生活中的例子,有时候非常容易理解技术方案。
不以生活为师,很多需求就是伪需求,很多架构设计也是伪架构。软件产品设计的很多交互和环节是现实生活中确实存在的,如果产品经理 "创新"的发明一些特色的流程,用户可能反而不买单。
比如,现在的智能电视需要搭配机顶盒一起使用,机顶盒和智能电视系统中有非常多的功能还彼此重叠,但是很少人使用这些功能。智能电视不仅不智能,还变得极其复杂,让家里的老人打开电视都非常困难。从软件工程上来说,它是失败的。
但是反过来看,从商业上来说它却算非常成功,这些功能即使消费者不去使用也必须对它付费。所以,不能仅仅使用软件工程中的思维来理解,应该使用更高的认知尝试理解它。
黑格尔在《法哲学原理》[6]中有一句名言,"凡是存在的就是合理的",不过这句话容易被误解成"存在的就是正确的"。这句话合理的理解为,"凡是存在的东西,都是现实的"。我们不能理解一些事物说明还有一些隐藏的规则没有被发现或认识到,当这些隐藏的规则不存在后,这句话就变成"灭亡也是合理的"了。
在认识事物时,需要认识到事物的反面,然后认识到反面中值得肯定的东西。在哲学上,我们把这种认知方式叫做"否定之否定",在生活中充满了无数的"否定之否定"。