软件工程师的前瞻性

受过多年学校教育的我们,容易产生一个误区。

我们学会了很多知识,学会了怎样解决问题,

但是却不知道这些问题是怎么来的,

以后将要如何发展。


我们要解决的问题都是静态的,

只要我们给出方案,

那它就永远是这个问题的解。


然而,现实生活中的问题,却复杂得多。


我们不仅需要考虑问题的解法,

而且更重要的还要考虑问题本身。

我们当前是否在把精力用于解决一个正确的问题,还说不定,

我们的方案是否在一段时间内仍然有效,也未可知。


这也是软件行业的主要特点。


困难的软件工程

人们常把软件工程比作建筑,我认为这极不合理。

完全忽视了软件的本质特点。


与建筑行业不同的是,软件所解决的问题都是动态的,

楼还没有盖完,我们的图纸就变了,

怎样在这种情况下把楼盖起来,才是软件工程所面临的问题。


诚然,用户的需求是不稳定的,今天说这个,明天说那个,

但这并不是一个主要方面。

短期内,需求的稳定性取决于我们的挖掘和控制。


然而,从长远来看,市场在变,业务在变,

用户使用软件的目的就会改变,

软件岂能不变?


采取什么样的方案,应对这些发展中的业务需要,

才是软件要解决的本质问题。


这是困难的。


且不谈增加新功能了,

甚至对于有缺陷的地方进行修改,也得慎重考虑。

所有依赖这个错误的特性而表现良好的程序,都是有问题的。


每改一处都可能意味着全盘重写。


编程层面的技术修炼

好的软件工程师,可以隔离变化,简化依赖关系。

他们通过抽象搭建框架,通过组装分离影响,

让每一个功能点都是可拆卸的。


为了抽象,就得理解问题背后的数学结构,

为了封装,就得理解子问题之间的逻辑关联。


好的代码,行云流水,层次分明,逻辑清晰,赏心悦目,

更重要的是,解决了当前问题,并留有余地。


到了这一步,才可以谈论软件是如何进行设计的了,

的确,编程是一门设计手法,

更多的是考虑如何描述,如何组织,如何扩展等等问题。


不但如此,一个架构师,还要考虑如何量产,

如何并行开发,如何降低抽象层次,

如何交流,如何推广。


这绝对是一门手艺。


工程师需要前瞻性

要想给出一个灵活可扩展的方案,

只是知道用动态的观点看待问题,作用是微小的。

我们还需要明白业务场景,分析它的趋势,看到它的未来。


随着业务规模扩大,软件越来越复杂,

前瞻性将是衡量一个软件工程师的首要标准了,

这也是工程与编程的重要区别。


可是,要想获得前瞻性是很难的,

我们必须先认识当前,明白现状,

必须跳出当前的生活,从更高的角度俯视它。


我们得看到,现行方案已经帮助问题解决到了什么程度,

当前的痛点在哪,客观约束条件有哪些,

只有看清这些,才能确定目的地和实现路线。


没有前瞻性的工程师是可怕的,

因为他自己都不知道要去哪,以及正在做什么,

那么他当前选择的路线就可能是盲目的,有风险的。


只有确定目标,并逐步实现,

才有达到目标的可能。


世界上,可没有那么多的巧合出现。


结语

知道自己在哪里,有计划要去哪里,

并努力付诸实践,才能达成目标。


人们在计划出行时,总是这么考虑,

然而在其他问题上却容易迷茫


其实,当不知道自己要去哪里的时候,

往往是对现在做的事情,不求甚解。


还是从认识自己开始吧,

锻炼有前瞻性的思维习惯,

才能越走越稳,看尽沿途的风光美景。