埃隆·马斯克曾说,生命中最大的挑战是——确保有一个可纠错的反馈闭环。
“确保成功”,似乎是很多人做决定的前提。但这个世界上并没有什么事情是确定的。一个可纠错的反馈闭环,几乎是“创业、投资、成长”等问题的核心答案。
反馈回路这个概念是出现在《系统思考》这本书里,所有对系统的概念或者体系有理解的人,其实对这句话都不陌生。
这几届国家领导人里面,有很多工科生,对工科生来说非常重要的思维之一就是工程思维带来的系统思维。
以下是时任上海市长的江泽民去改革开放桥头兵广东调研时的总结,满满的系统思维:
邓公在改革开放时,提出了四个现代化,因为邓公认为,没有这四个现代化,改革无从谈起,改革是个系统性的工程。
当时人均教育水平比较低,缺少系统性工程的人才,于是中国航天航空的开创者钱学森,就承担起了系统科学革新的重任。
其实软件工程、软件开发也是一个系统工程,只不过很多人没有意识到。
因为很多人习惯了写一个类搞定一些事情,算法刷题时一个函数就做了,而缺少了面对复杂的、有规模的、有质量要求系统的挑战,从而导致了工程思维没办法训练。
工程思维,第一个问题是思维尺度的问题,就是你思考的是一行代码的事情,还是一个类的事情,还是一个系统工程的事情。
工程思维是从一行代码开始的,之后站在函数角度思考,可以做什么,再之后是对象。
java带来了一个很重要的改变,一个文件就是一个对象,其实背后就有工程思想的考虑,不用再像以前一样在一个文件中放很多对象,最后找不到了。
类之上是对象,对象之上是模块。
软件工程发展背后一直追求的是复用,这样相同的代码就不需要写两遍,可以复用了。
对复用的追求过程并不是一帆风顺,出现过很多奇怪的写法,比如goto,但追求复用这条路一直没有停歇。
在互联网软件工程阶段出现了一些变化,新的编程语言是联网的。
什么意思呢?
就是你一边编程,一边编译,一边下载东西,下载一些依赖的东西,比如package包管理的东西。
最后被封装成有版本号的依赖文件包。
软件工程发展过程中还有一个进步是Ruby on Rails,,提出了约定大于配置。
Java是一个配置非常繁琐的语言,需要大量的xml配置。
突然有一天Rails说,我们很多东西其实都是缺省默认的,为啥还需要配置。
于是就出现了脚手架的概念,脚手架生成之后,文件夹、文件目录都出来了,只需要填充crud,就实现了非常好的复用。
Rails抽象出了Controller、Service、Dao的三层,基本可以满足大部分的工程开发的代码组织了,这也是Spring出现的背景。
所以从最初的一行行代码,到函数,到对象,到组件模块,再到一个工程系统,管理的粒度是越来越大了。
根本的原因是因为软件越来越复杂了,所以需要在越来越粗的粒度上管理。因为软件太复杂了,配置这件事就也变得太复杂了,需要约定大于配置,形成规范,大家都按照一定的规范进行协作。
研发同学往往瞧不起产品同学提的需求,但软件工程的发展,其实就是一个产品视角的变化。
所以从产品经理角度出发,可以更好的理解软件工程的发展,需要一种产品思维、工程思维。
软件工程的发展有三个目标:协同、管理、复用;
协同:就是说一个复杂的系统你需要和他人共享、移交、协作的,如果只是自己搞,不需要和他人协同,很多事情其实不需要做了,但软件大了之后,一个人是搞不定的,需要更多人的协同。
管理:说的是你自己写的工程后续是怎么维护、管理的,如果依赖的库升级了,你应该怎么管理。
复用:是软件代码可复用,软件工程的经验也可以复用,这样背后是需要工程思维的。
基于以上三点,就可以理解很多编程语言、IDE、技术组件为什么这么设计、为什么出现、为什么做了。
但是如果没有过真实生产环境的经验的话,这些点都很难被理解,因为他没有这方面的动机。
不管是高校老师的授课,还是学生毕业面试刷题,大家习惯了用一个类做很多事情,解决所有问题。于是大家习惯了一个类里做很多事情,就没有软件工程思维的训练机会,也就缺少了工程思维,比如面试时代码写的好好的一个应届生,在面对工程开发时,大量的面条代码随处可见。
软件工程是理论+实践的学科,工程师思维训练更多是靠实践,有质量有规模的软件工程实践,只有这样你才能理解为什么做这些事情,以及复杂的软件工程怎么演进的。