像机器一样思考(一)—— 宏观的基础

【旧文搬家】
本文的起源是因为思考一个问题,什么样的人适合做程序员。
我曾经苦恼得思考着这个问题,直到我在SICP上看到了答案。说的白话一点就是,能像机器一样思考的人就适合做程序员。
那么计算机这台机器是怎么思考的呢?这里是我的答案:

我们所有的计算机,都是下面这个模型,江湖人称“冯・诺伊曼体系”


冯・诺伊曼体系

从这个模型上我们看到了什么吗?嗯,可能太多噪音了,看的不够清楚,我给你们再抽象一层:


输入、处理、输出

现在清楚了吧,计算机在中间,两边是输出输出。所有的问题都从输入和输出的角度去思考,这就是计算机这台机器的思考方式。也就是说你能做到这样思考,你就会像机器一样思考了。

很简单吧,但是新的问题又产生了,处理自然要处理输入产生输出了。输入,输出是些什么呢?这就要在微观层面理解机器是怎么思考的,这一部分叫,机器在加工什么?

SICP中又说了,非形式的讲,我们只在处理两种东西,数据和过程,他们还不是严格区分的。
先不管不严格区分那半句,我们回看我们的模型,中间处理的部分其实就是过程,输入和输出其实就是数据。(在冯诺伊曼体系里,数据和过程被称之为数据和指令)那说到数据,我们有一门学科叫做数据结构,它很好的表达了什么是数据。我们还有面向对象,类型系统之类的知识,他们都会帮助我们很好的定义数据。

各位看官估计心里犯嘀咕了,扯了这么多,还是无法想象怎么就算像机器一样思考了啊?不急,下面我们拿几个例子来学习一下。

我们来写一个加法函数,接受两个参数作为加数和被加数,返回一个和,这个太简单了,几乎任何一个程序员都可以在几秒钟内写完。拆成机器的思维是什么样呢?

加法函数
输入: 
  a
  b
输出:
  result    

大概就长这样,输入是a和b,输出是一个结果,我们起名叫result。它到底表达了个啥样的代码呢?大概长这样:(本文所有的代码都会采用javascript描述,但是不代表本文内容只适合描述前端开发)

function add(a, b) {
    return a + b;
}

咦?result哪去了?在你调用的地方可能会有一行代码 var result = add(1,2);
这个表达方式不仅仅可以用来描述函数定义,用来描述表达式也是可以的。比如,如果我们把前面的输入输出思维描述改为加法表达式。你会发现其实这段描述“编译”成代码大概长这样:

var result = a + b;

所以不仅仅可以用来描述函数定义,还可以描述代码块。

但是到这里就结束了吗?感觉好像对数据的表述不够细致啊。确实,我们忘了加类型了。不加类型这描述简直万灵丹么,反正俩参数一个返回值的都能用,这不行,我们还得把类型加上看着才清楚点。加上类型就变成了这样:

加法函数
输入: 
  a: Number
  b: Number
输出:
  result: Number    

这看着就好多了,是不是比刚才理解上文所讲的像机器一样思考了呢?好吧,你可能会说,这玩意有啥用啊,我有分析的这个空,我代码都写完了啊。不急,我们接着往后看。

刚才那个题目有点太简单了,我们做一个稍微复杂的。比如下面这个:写一个函数,可以选出一个由数字组成的集合当中所有的偶数的最大值。

这回一步做出来可能就有点难了,没关系,我们可以成两步:

  1. 选出集合中的偶数
  2. 选出偶数中的最大值
    这两步呢,按照我们之前的格式写一下,大概是下面这个样子:
#1 选出集合中的偶数
输入: 
  inputArray 
输出:
  evenArray
 
#2 选出偶数中的最大值
输入:
  evenArray
输出:
  max:Number  

哎呀,突然发觉不知道该怎么描述集合呢。Javascript里就用数组就好了,但是还是不知道怎么描述数组啊。这个其实很简单,这不是一个由数字组成的数组吗?我们只要写成[Number]就可以了。因为我们的一个好习惯是一个集合里不要放两种类型的元素,所以就这么写就好了。那么加上去的话,大概就长这样:

#1 选出集合中的偶数
输入: 
  inputArray: [Number] 
输出:
  evenArray: [Number]
 
#2 选出偶数中的最大值
输入:
  evenArray
输出:
  max: Number  

咦,第二步的evenArray没有写类型。嗯,因为evenArray是第一步的输出,我就把它省了,相信大家也能看明白。
耐着性子看到这里,你估计已经发现了,我还是没有回答你这个思维方式有什么用这个问题。我很想忽悠着你再做一道题,不过估计你坚持不完就会转身离开了。那我们就这两道题试着讲一讲。

第一道题,我们只是展示了这个思维,第二道题,我们才开始使用到它的威力。尽管这道题也不复杂,但是思考过程还是展示了:

  1. 分解问题
  2. 找到子问题之间的关联(通过输入输出关联起来)
  3. 找到问题的边界,明确假设与结果

上述三点看着简单,却是思维清楚与否的关键。我们管这个能力叫Analytical Thinking。

思维清楚带来的收益是什么?这些步骤可以直接转化为工作的任务列表,而且可测试。这样分解出来的任务列表,完成效率是极高的。我们曾经做过实验,按这个思路分解过的人,比没有分解过的人,完成效率可以高3倍以上,而且前者只学了一周的编程。
一个完全不会写程序的人,只要学会了这个思维,就可以开始编程之旅了,而且威力非常巨大。

听起来好简单啊,有那么神吗?不是编程的人都应该会吗?然而并不是的,很多人思考编程这件事情是靠感觉的。
我前几天面了40多个外包公司外派来的人,只有5个人,可以按照输入输出来对问题进行分解。所以我觉得我还是有必要写点东西来讲讲这个。

除了对初学者有益之外,对Team Lead也是有益的。当你觉得你遇到的人没sense的时候,你可以试着让他们这么表达一下程序。一般就会发现一些问题。

题外话

题外话-1:
我们像机器一样思考,不就都变成机器了吗?嗯,其实不是的。所谓我们像机器一样思考,那机器这种思考方式又是从哪里来的呢?机器的思考模型是一个叫“图灵机”的计算模型,而图灵机则是图灵祖师爷模拟人思考而发明出来的。所以,其实不存在什么像机器一样思考,只不过是学会一种人类的思考方式而已。
考虑到图灵只能以自己和自己周围的天才科学家的作为人类的具体实例来抽象图灵机,所以我们学习的其实不是什么机器的思考方式,而是天才的思考方式,这篇文章其实应该叫《像天才一样思考》。

题外话-2:
这个不就是面向过程编程吗?如果的思考仅仅停在这里,那就是面向过程编程了。如果我们接着想下去,当数据复杂到一定程度的时候,我们会自然的引入封装,于是面向对象诞生了。回到数据与过程不严格区分那半句,当我们试图模糊数据和过程的界限,将过程像数据一样纳入输入输出的范畴,我们就走上了函数式编程之路。

题外话-3:
有人觉得练习不够吗?请留言,如果感兴趣的人多,我就加紧写更多练习的解析。

相关文章:

像机器一样思考(二)—— 数据的细节
像机器一样思考(三)—— 穷尽就是力量
像机器一样思考(四)—— 一图抵千言
像机器一样思考(五)—— 第一个应用
像机器一样思考(六) —— 脑中的重构
像机器一样思考(七) —— 跨应用思考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335