一本计算机科学的心经
与吴军老师结缘在得到专栏中,后来一直跟随着吴军老师的专栏学习,逐渐被吴军老师渊博的知识、人文情怀和学习精神影响。 从《浪潮之巅》、《数学之美》《大学之路》《见识》《态度》到《全球科技通史》和《阅读与写作讲义》一路追随,这些年陆续读完了吴军老师几乎所有的著作,从价值观到方法论都深受吴军老师的影响,这不,吴军老师的新书《计算之魂》刚上市,我就迫不及待的买来阅读。 这本书主要对象是针对有一定计算机基础的人或者是想更上一层楼的程序员,作为一名少儿机器人编程老师有幸读到了这本计算机之魂,感触也是颇深。 即使不是相关专业,作为通识教育的书籍,读了也多多益善,有了这本“心经”作为计算机行业的地图和指南,我们更容易窥斑知豹,对计算机领域内快速掌握了解其全貌。 一、计算机行业的心经---百晓生的兵器排行 吴军老师站在了巨人的肩膀上给我们带来的一种见识,作为谷歌资深研究员、腾讯副总裁他一直走在计算机科学的前沿,不仅仅是技术大牛,更是跨领域普及计算机知识的学者,用他的眼光开计算机世界,他把所有计算机工程师分为五级(这一点,有点百晓生兵器谱的味道了)第一级最高,第五级最低,级和级之间的差别不应该是一点点,而是数量级的差别。 第五级 工程师: 一名合格的五级软件工程师,首先应该是一个技术熟手,在工作中经历过了一定的历练,所以可以在不需要别人的指导下,就能独立完成安排的工作任务。 比如上级/需求方给他安排了一个功能需求,他能够充分地理解这个需求背景和目的、以及能给出实现方案,并知道找公司的哪些人提供相应的资源和支持,然后能主动的推动资源来协助自己完成这个需求,最后实现成功上线。 第四级 工程师: 四级工程师,在互联网企业里更具体而言,需要有一定的领导能力,能领导和负责一个项目。能设定目标并找出实现的道路,能正确地识别问题、并找出最合适的解决方案(不仅限于技术方案),带领团队把大问题化解为小问题,最终完成项目。 第三级 工程师: 三级工程师,就需要能够独立带领团队为公司做出一个能赚钱的产品了。很明显,这一层级,就需要有商业思维、市场判断能力、营销能力了。 我觉得国内的大多数软件工程师由于编码的固定思维,容易觉得自己技术牛就可以了,其它的事情关注度不高,所以真正能走到这一步的工程师很少了。 第二级别 工程师: 这一级就更牛了,要能带领团队做出先前没有的产品,或者别人想做但暂时还未成功的产品。能到这一级别也就真正的业内大牛了。比如阿里云的创始人王坚这类,有多难就不说了,另外还得看行业机会。对了,吴军老师对自己的评定是在2.5级。 第一级 工程师: 一级是指开创一个产业的人,这个领域估计只有安卓系统发明人安迪鲁宾 或者乔布斯才能胜任。 吴军老师的这五个工程师等级划分,可以看出来与我们在公司的职位/职级完全不相关,也并非与纯技术考量相关,它完全是从整体能力、产出贡献的角度去描述。看完他这个,再想想我们普通人平时对程序员、对架构师等的要求和评估依据明显“品味”“层次”低了很多。 二、计算之魂的理解 看到这本书的名字,我就联想到今年Scratch考级的一道考题,这道题问到底什么是Scratch作品的灵魂? A角色 B程序 C舞台 D 背景 答案显而易见是B程序,只有程序执行下去,才能让舞台上的角色动起来。去帮助我们实现我们人类所想象的功能和执行各种各样的任务。看到这本书的标题,我也在认真地去思考,到底什么是计算机的灵魂? 吴军老师的这本新书计算之魂,很好地回答了这个问题。这本书不同于一般算法教科书和科普工作,他是通过算法例题来阐述计算思维之妙的大作。 如果把这本书比喻成武功秘籍的话,那么这个就相当于计算机行业的最顶级的内功心法秘籍,相当于易筋经的这种级别。看懂这本书,就会懂得算法的精髓工程师和照着葫芦画瓢的工程师区别之大。这就是计算之魂的魅力。 如果真的要用几句话归纳计算之魂的核心,那么那就是递归编码,分类,组合,图论,分置,存储,并行状态,随机关键词。虽然没有办法穷尽所有的计算思维,但是所有的算法精髓都已经设计。大多数学习计算机的学生,可能都听说过这些名词,但是大部分人只是知其然,真正知其所以然,明白算法背后的计算机要益者寥寥无几。 作为我多年读书的习惯,读书之前首先看序言和目录,中国两大工程院院士李国杰和清华计算机教授郑纬民业内的两个大佬级的人物为书作序,这样的书更偏向了专业级教材,而事实上,这本书的确也可以看成计算机教材级含金量。 尽管吴军教授用他最通俗的语言,从计算机的发明算盘开始讲起,然而对于没有学过编程的内容的人,依然不够友好,不过没有关系,我们今天只从几个最简单的数学或者题来简单的阐述一下,为什么这本书非常好,因为它里头提到的所谓的这些思维方式,不仅仅能用在计算机科学上,甚至可以应用到我们生活的各个方向和各个方面。 先看一道例题,估计老师是如何通过一个简单的问题来阐述一个很深刻的道理。这就是我们通常所说的,由浅入深。 一个地主当一个工匠为自己雕刻玉石,是一个七天工作量的活儿,地主答应一共支付一根七两金条作为报仇,但是地主为了不想给钱,又想出一个难题,那就是要求工匠每天支付1/7的工资,只只准在这个金条上面切两刀,保证每天正好支付工匠1/7的工资。如果是你,你将如何去切这两刀呢? 这个并不是计算机难题,也并不是数学的奥数题。但是解答这个问题真的是为了寻找这个答案,而是寻找到如何去思考用计算机思维解决类似的问题。 是这样思考这道题的,也就是说让每天都得到1/7并不需要分割成七个相等金块儿。而是列出几个每天得到的数字,然后根据这些最低的需求,组合出相应的数字来。 就是说第一天是1/7,第二天是2/7,第三天是3/7,以此类推,到第七天是7/7。 一天肯定要用1/7,这是毋庸置疑的。但是第二天呢,如何凑到2/7,并不需要再加上一个1/7。可以用3/7-1/7。有正确的答案呼之欲出了,那么就是在地1/7处,切到在地3/7处切一刀。上的话,把七两黄金分成了1,2,4三部分,而1,2,4正好也可以组成。1~7的任何数字。道题看似是分割黄金的问题,其实是考察对于二进制,个位数,十位数和百位数的理解。为二进制只有零一两个数字,所以说每一个进位是零或者是一的组合,就能表示各种数字。对于计算机最底层进制编码都不能了解的话,那么要搭建计算机的高楼大厦,更无从谈起。 再看看吴军教授是如何用一个简单的抢20的游戏解释递归思维的重要性。 你和你的女朋友来做游戏,两人其中一个人先从一和二中挑选出一个数字,另一个人则在对方的基础上选择加一或者是二。然后又轮到对方说一或者是二,如果谁最后正好加到20,谁就获胜,那么用什么策略能保证一定赢呢? 很多人用的计算机思维就是如何从一开始去推到,最后推到去20。是我们所说的正向思维的地推的方式,也就是从123往后直接去数。什么是递归呢?也就是逆向的思维方式,从结论推导出我们的选择。 从逆向思维,其实这道题就变得很简单,如果谁抢到20谁就胜利,推导出那么在20前面的一个数17,谁先抢到谁就胜利。为你们每个人每次增加的只能是一或者是二。自己抢到17之后,对方无论是加二或者加一,你就可以轻松地达到20。以此类推,我们可以抢出17,前面就是14,在14前面是11,11前面是八,8前面是5,5前面是二,也就是说先抢到二谁就容易胜利,然后可以顺利占据了5,8,11,14,17,20 。 很多人在学习计算机的时候,非常不喜欢递归这种不直观的逆向思维,觉得,阶乘运算这种从小到大,一个一个的成就可以解决,为什么还要复杂的道德计算呢? 其实原因很简单。很多问题只有倒着想才能想清楚。也更能考察你对基本概念的理解。 举一个个背唐诗的例子,《静夜思》这首诗,很多小朋友在两岁时候都会背,但是大部分的学生被提问到低头思故乡,前面一句是什么的时候,很少有人能够不加思索的回答,大多数情况下还是从第一句开始去背。 再说另外一首诗独钓寒江雪的上一句是什么?仅不少人也是要从第一句千山鸟飞绝开始去记忆吧。如果你能够直接地去推导出上面一句是什么,那么相信你的大脑在运算的效率方面,就比别人快乐3~5秒钟的时间。 别小看这3~5秒钟,如果你每时每刻的思考和学习都能够快上那么多,也就是说给你的大脑安上一个更加高效的软件去运行它,那么你将节省更多的脑力和精神去做,达成你别人达不到的成就。 而吴军老师就从从计算机底层的语言逻辑和算法入手,考察你对基础知识掌握能力,从而推断你是否真正理解了计算机灵魂,从这个角度上推断,吴军老师也不担心AI能够统治地球和人类,因为他清楚的指导,计算机能够解决的是有限的可以计算的问题,而不是所有的问题。 这本书的精妙之处还有很多,我已经看了几个月还津津有味,人生难得遇到几本给你得到的好书,这本书值得成为你的镇馆之宝。