计算机思维是全方位的,不太可能用一两句话概括。简单地讲,需要处理好这样七对关系:
1,大和小
2. 快和慢
人的进化是很慢的,每个世纪只有百分之几,总体来讲经济和社会的发展也是比较慢的,每年最多几个百分点。因此,人本身并不适应非常快速的发展变化。但是,计算机本身的发展是18个月翻一番,大约相当于10年增加100倍,在智能时代,人的思维要适应这种快速变化。
3. 多维度和单一维度
从总体上来讲,人脑是线性处理事务的,看问题常常是一个角度,也没有能力把很多角度综合起来。但是,计算机有这个能力,因此占到了多维度的便宜。
4. 网络和个体
人的思维是个体行为,作决定彼此不干扰。这有好的一面,但是也难以集中很多人的智慧,产生叠加的效果。事实上,群体智慧的简单叠加甚至不如个人的智慧。但是人工智能是建立在网络效应基础上的,它是通过很多彼此联系的计算机共同协作工作而产生的。
5. 自顶向下和自底向上
自顶向下做事这一点是计算机的精髓,而人更适合自底向上。在一个组织内,自底向上的做事方式更容易激发群体的积极性,但是容易造成资源的浪费。
6. 全局和局部
人做事情时,限于自己的认知,通常得到的是局部最佳,失去对全局的优化的可能性。由于计算机有处理大数的能力,以及是自顶向下的做事方式,更容易得到全局最佳。这一点在 AlphaGo 和人对弈时表现得淋漓尽致。
7. 成本和表现
人很多时候喜欢强调对错,喜欢追求绝对的公平,喜欢要求最好的结果。但是,从工程的角度讲,好和坏,只是在固定成本下相对的表现。计算机里面无论是软件设计,还是硬件设计,都是在平衡性能和成本的关系。
此外,掌握计算机思维,还需要理解下面三个原则:
一、等价性原则
很多时候,一个较难的问题 A 和相对容易的问题 B 是等价的。但是人类常常容易给什么问题就解决什么问题,给了 A 就解决 A,尽管它很难。而计算机则会试图解决等价,但是却更简单的问题。
二、模块化原则
我们在生活中,做一个桌子,或者一个椅子,会直接去做。而在计算机的世界里,永远是先制作几个非常简单,能够大量复制的乐高积木块,然后用很多这样简单的模块,搭出复杂的桌子和椅子。
三,算法化
标准化,流程化,可操作
1.“算法(algorithm)”这个词,早在十七世纪就有了。把整个计算给流程化,变成标准操作,而且还得能让好几个计算师一起算,这就要求这个计算方法满足三个条件 ——
第一,计算过程必须被拆解成很多步骤,每一步干什么必须是简单而明确的。
第二,所有这些步骤要能拆分开来,分给几个计算师,各自负责其中的一部分。而这就有个交流问题,各个计算师算出来的东西得汇总在一起,形成一个最终的结果。
第三,纠错机制,让计算师们能觉察到自己哪里算错了。
按今天的概念,这其实就是“分布式并行计算”。这不但是计算机方法,而且还是超级计算机的方法。
2.所以我们可不是先有了计算机之后才有的计算机思维。人们早就有了计算机思维,只不过当时没有机器可用、只能用人。
3.能提出算法,和自己会算,完全是两码事。算法最大的好处就是它是机械化的操作。算法化就是标准化和流程化。这其实就是整个机械化大生产的秘密。
4.计算机思维指导方针:把人的情感和主观判断排除在计算过程之外。
5.哲学家的思想总是领先于技术实现,而老百姓的思想则被技术所左右。每个时代的技术,都会主导这个时代的人的思维。老一辈的人爱说“压力很大”、“动力十足”、“把压力化为动力”,这其实是一种暗喻 —— 是把人给当成了蒸汽时代的机车。而今天的年轻人则善于用计算机做暗喻,会说……“我的大脑死机了”。
二、理解硬件
1.从提花织机的打孔卡提供了“严格的灵活性”,到巴贝奇的可编程通用计算机,到冯·诺依曼架构的CPU和内存,这是非常清晰的演变。现在我们看到了,图灵再厉害,“编程”这个思想不是他先提出的;冯·诺依曼再神,计算机系统不是他发明的。
2.为什么说信息行业是个创新行业呢?因为第一,这里面的想法太密集,有太多可以改进之处;第二,改进的方向相当明确。
3.从计算机思维的角度来说,核心教训是你必须考虑硬件。永远都别忘了计算机是个机器,而机器有数学算法之外的、自己的特点和脾气。
三、理解学科
计算机科学的发展可以分为三个方面 ——
1.初级,是怎么更好地实现自动化,主要解决应用问题;
汇编语言-高级汇编语言-账号管理-操作系统-系统思维-工程思维-网络思维-安全思维-编程思想-程序员思维-编程技能
2.中级,是研究“计算”这件事儿本身,上升到了类似于自然科学的层面;
计算机科学真正成熟的标志,是“计算机”这个东西,和“计算”这个行为本身,成了研究的对象。就好像动物学研究动物、植物学研究植物一样,计算机科学,研究计算机。计算机问题本质上是数学问题。现在有很多应用数学家就在专门研究这些问题。
3.高级,则是把计算思维用到其他科学领域中去,是带给人认知的升级。
人们突然意识到,“计算”是个非常基础的逻辑,到处都是计算。它还给我们提供了一个非常不一样的观察世界的眼光。
四、理解软件
1.软件工程,可以说是工程管理和综合治理手段的极限。它告诉我们如何治理最复杂的系统。
2.工程师思维和科学家思维至少有三个重大区别——
第一,科学家是寻找事物的规律,而工程师是去设计一个东西。科学家只要觉得这个规律有意思就可以发表,而工程师得负责任。
第二是对知识的态度。科学家面对知识,看懂了、能总结出规律就行。而工程师要把这个知识拿来用。
第三是对模型的使用。科学家喜欢简化的模型,能抓住实质就行。而工程师必须考虑所有的细节。
所以软件不但是个工程,而且比传统工程难得多。
3.软件工程项目的复杂性问题:
1个人干12个月的活,绝对不是12个人在1个月内能干完的。项目用的程序员越多,平均每个人出活的速度就越慢。所以你规划项目的时候不要算什么“人月”。
你这个团队做出来的软件的结构,往往和你这个团队的人员组织管理结构高度相似。所以软件工程不但要管项目,还要管人。
4.现代软件工程要求,软件产品必须达到下面这五个目标,称之为“DRUSS” ——
Dependable,可信赖,让顾客真能指望上你这个软件;
Reliable,得可靠,不能总出毛病;
Usable,软件是给人用的,得让人能够上手;
Safe,用的时候不能出安全事故;
Secure,它得不容易被黑客攻击才行。
5.软件工程的根本问题,是人的问题。主导软件开发的这个人,必须得能够理解高度复杂的东西才行。你得能驾驭复杂。
6.“好的判断来自经验,而经验来自坏的判断。”软件每天都在更新,但软件工程的背后,是一棵经年累月长出来的大树。
五、理解设计
1.发布,是尽最大努力,呈现一个最好的东西的行动。发布能刺激我们完善自我。
2.软件设计是一个激进的思维方式转换。以前的软件工程思维,是关注于功能和实现;现在的设计思维,则要求我们要考虑到用户和产品应用的环境。软件设计和一般产品的设计还不一样。一般产品让你感觉好用、好看比较容易,可能最多考虑一些人体工程学之类。而软件,跟用户是交互式的关系。用户会在软件中做出各种行为,软件是让用户活动的地方。
3.软件设计的目标,是创造一个虚拟世界。
4.软件设计,可以分为六个等级。
-1 级,是流氓软件。这种软件不但不安全而且很可能专门留了收集信息甚至攻击系统的后门,而且完成度很低,一堆bug。
0 级,是轻蔑的满意。基本上可以用,但是大家都知道其中有很多问题,也不怎么安全。
1 级,是软件能够满足基本的需求,比较可靠。
2 级,软件能跟环境和用户使用习惯达到了完美配合。你不需要学习它怎么用,凭直觉就可以直接使用。该有的功能它都有,而且非常可靠。
3 级,是软件能主动规避负面的结果。这就要求设计者不但要满足用户正常的需求,还得事先把各种怪异的用法、极端的情况都考虑到,确保软件在任何情况下都没有故障。
4 级,也就是最高级,是这个软件能给用户带来喜悦。这意味着软件超出了用户的预期,让人用上之后会迫不及待地想要把它推荐给别人。
5.软件设计是技术、数学、艺术、文化和哲学的融合创造。软件设计里面有“道”。
六、理解模拟
1.“理论”和“实验”,都是人的思想和真实世界之间互相印证。但是有了超级计算机之后,就出现了一个新的研究模式,也就是“计算”。是用计算机*模拟*一个系统的演化。
2.“计算思维”带给科学研究的认知升级:传统的因果、理论、学说,无法描述真正复杂的现象。计算不能让你得到什么一句话解释,但是计算能让你更接近真实情况。
最后,不管计算机多强大,本质它就是一台没意识的机器,要有“傲视”它的心理,以人为本的思路永远是人类在各种困境里走出来的最有效的观念,如果都以机器的力量论文明,文明会是一个没有温情的黑暗世界。