软件入门之软件思维

Posted by rillhu's blog on February 26, 2020

软件入门之《软件思维》

ICT专业的学生对大牛阮一峰应该都不陌生,这位财经专业的博士在软件方面的造诣亦是令人难以望其项背,阮一峰曾经在播客里写道:大学里的所有专业,大致可以分为两类:技术类专业和思想类专业。

技术类专业不仅包括工程技术,还包括外语、会计、经济法之类的应用类专业;思想类专业则是几个纯文科的专业,比如文史哲、理论经济学和法哲学等。两者最大的区别是,技术类专业的知识可以直接用于生产活动,而思想类专业的知识,除了改造人的思想以外,没有其他直接作用。

我觉得,年轻人选择专业的时候,应该尽可能选择技术类专业,回避思想类专业。原因很简单,思想类专业的学生找工作很难,人生会相对比较艰苦。毕竟世界上大多数工作都是技术类岗位;需要有点思想才能完成的工作,真是寥寥无几。另一方面,技术类专业往往培训几个月就可以见效,而思想类专业需要长期积累和勤奋思考,才有可能成材。在中国,这个问题尤其严重。如果在美国,思想类专业的学生毕业后可以去搞新闻、出版、法律和政治,在这些领域,思想就是最大的武器。但是在中国,这些路都走不通。

所以在这里,首先恭喜我们信息工程学院的学生,你选择了ICT相关专业,学起来可能并不容易,但其实你选择了一条未来更容易成功的路。但是,回到当前,你其实还需要做好充足的准备才能应对不断变化的未来,那么怎么才能为未来做好更充足的准备呢,那就是不断的提升自己的实力,我们的专业都是需要很好的软件编程能力的,同学们也都学过软件编程知识,不过很多同学可能还是感觉到无法写出软件,究其根本,就是因为软件思维没有建立起来。那么,今天我们就一个新的维度开始,谈谈一如何建立自己的软件思维

程序员这个职业和大部分其他职业是很不一样的,我们很多行业的杰出工作者,往往具备勤劳,谦逊,耐心之类的美德。

01

而程序员的三大美德是这样的:懒惰、不耐烦和自负——语出Larry Wall (Perl语言的作者)。他解释说懒惰让你花大力气去避免消耗过多的精力,所以你会写出节省体力的程序,同时让别人也能利用他们。为了少回答别人的问题,你也会写出完善的文档。不耐烦是当你发现计算机在偷懒时的愤怒,他让你写的代码不但能解决当前的需求,还富有预见性,或者至少尝试有预见性。自负让你有信心编写或者维护出没有缺点的程序。

02

这些话得到了广泛的传播,原因可能在于他有一半是开玩笑的,而另一半却又过于真实。

软件行业之所以特殊是因为它既不是和真正的人类做生意,也不适合完全没有智能的物品打交道,机器不需要吃饭也不需要休息,更不需要人权,只要接上电他们就会7x24小时的工作,同时机器又是有一定智能的,他们可以按照我们制定的规则,高效的进行重复劳动。我经常开玩笑的说,程序员主要从事的是机器人养殖业,每当发现一种需求我们就生产一种机器人,然后让机器人去干活,我们自己就又可以休息了。人类的本质是复读机,而机器能更好的进行重复,所以他们其实是更好的产业工人。以前他们藏在电脑里工作,在人工智能和物联网起来以后,他们会慢慢的走到现实世界,这一点也会表现得更明显。

03

所以你看软件思维的第一点就是程序员本身并不直接工作,他们只生产和维护机器人,让机器人代替自己工作。但是懒是无止境的,需求多起来,程序员们就觉得这个生产机器人也是挺累的,然后他们发现要生产的机器人都有某种程度的类似,于是他们生产的一堆机器人配件,这样要做新机器人的时候就不用从头开始做,只需要拼接几下就好了,这就是软件思维的第二点,要尽可能重用,避免重复自己,也就是DRY(don’t repeat yourself)原则,所以软件思维的核心就是一个从重复到重用的过程。

04

注意这是一个过程,而不是一个结果。他是从具体慢慢的走向抽象的。还有很多同学既知道重复也知道重用的,但是就是没法从复杂一点的需求中抽象出规则和算法来,这是因为他们想跳过前者,直接得到后者,这对于入门不久的同学来说还是有难度的。

我们来看一个具体例子,如下图。小李同学每隔十分钟就会问一次一加一的问题,这就是重复,而小胡老师从这个重复的过程中发现了规律,于是他在小李第三次问之前就给出了答案。如果小李同学的智商和记忆力如此稳定,那么小胡老师就可以开始让程序,也就是机器人出场了。这个机器人每隔十分钟就会给小李同学发送二这个消息,这就是重复。重复是很脆弱的,它建立在需求从不变动的情况下。在现实世界中需求总是会变动的,而且在业界,还有一个岗位专门负责修改需求,这个岗位叫做产品经理(笑)。

05

于是当小李同学有了成长,开始问二加二等于几时,我们之前的机器人就不够用了,我们需要做一个专门发送四的机器人,随着小李同学的问题越来越多,我们要做的机器人也越来越多,最后我们终于忍不住了,为了偷懒我们做了一个加法机器人的,只要小李同学问的是加法问题,这个机器人都能处理,他会自己从问题中抽取加数和被加速,然后发送结果他也不再定时发送,而是实时响应问题,这就是重用。

06

但是重用是没有尽头的,因为明天小李同学可能还会问乘法问题,四则运算问题甚至物理问题,我们也需要根据需求的不断升级,不同的抽象出更高阶的规则,做好了这些每个程序员都能沉淀下来一些基础库,一些工具链用来处理之前没有抽象到的新需求。但是,再重复一遍,好的程序员是很懒惰的,所以他们把自己的代码,也就是前面我们说的机器人放到网络上分享给其他人,还发起了声势浩大又影响深远的开源运动,我们几乎找不到第二个行业能如此开放,如此毫无保留和如此大规模的共享行业知识和成果。正是得益于前辈们栽下的参天大树,今天的我们有了大量可以使用的成熟的开源基础库,让我们可以在其基础上更快地构建出更强大的应用程序。这才是真。祖师爷赏饭,所以并不是你拿着键盘开始写代码时才产生的软件思维,当你觉得自己工作太多想要分出去的时候,你的软件思维已经萌芽。

07

那些把工作分给别人的人成为了企业家,把工作分给机器的人成为了程序员,把工作分给其他程序员的人成为了世界首富。但不管你想成为哪种人,不停地进行从重复到重用的思维练习都会让你收益匪浅。

好了,让我们开始练习软件思维吧。。。

08

内容编辑自:

  1. http://www.ruanyifeng.com/

  2. https://weibo.com/easy

预告:学习了软件思维的建立,下一期我们将向大家介绍适合新手的编程指南,敬请期待:软件入门之《新手编程指南》