文末送书!看懂这本书,程序员可以自信地说“我要打十个”!

大厂面试常会有这样一道题,要求写一个算法对大量数据进行排序。

如果面试者只会写插入排序,大概率是无法通过的,说明他对基本的算法时间复杂度都没有掌握好。

选择不同的排序算法,程序的性能会存在数量级的差别。但就算通过刷题知道了差别,在工作中又要如何实际运用,写出高效的程序呢?

跟随行业大神学习,无疑是快速成长的不二法门。那么,对于程序员来说,Jon Bentley所著的《编程珠玑》,就是必读经典了。

9f224b087fd06a0c95126e2dfe8fed7a.png

▲ 点击图片,跟大神学算法

是的,读懂这本书,程序员也可以像电影中的叶问一样,自信喊出“我要打十个”了!

业界传奇

《编程珠玑》有何神奇之处,为什么我敢说这样的话?

我们了解一下作者Jon Bentley的江湖地位就知道了。简单说,他是IT“祖师爷”们的授业恩师。

别的不多说,仅举两例。上学时不少同学都曾被《算法导论》反复折磨吧?其作者之一Charles Leiserson是他徒弟;现在靠着Java吃饭的程序员不在少数吧?Java之父“高司令”——James Gosling,也是他徒弟。

Jon Bentley本人也在计算机科学的发展上做出了杰出贡献,被誉为影响计算机算法发展的十位大师之一。

1982年,Jon大神离开执教六年的卡耐基梅隆大学,进入了业界传奇——贝尔实验室。这个实验室中先后诞生了9位诺贝尔奖获得者,以及5位图灵奖获得者。可以想象,Jon大神在这里,与那些传奇人物们碰撞出了多么绚烂的思想之花。

没错,我们在《编程珠玑》中就能看到,Jon与贝尔实验室的同仁们是如何开创性地思考并解决问题的。

《编程珠玑》并不是一本高高在上的书,它非常贴近程序员的日常工作。阅读这本书,我的感觉就是在近距离观摩大神,看他如何从提出问题到写出最终的代码来。

接下来,就让我们从怎么提问开始学习吧。

提问比解答更重要

先说说我入行不久时,吃过的一记大亏吧。

当时公司有一个内部需求,采编部门想要一个自动上传处理工具,将原始文件传到服务器进行转码,然后发布。

在需求会上,我想当然地认为对方跟我认知一致,就按照自己的想法去实现功能。

可想而知,到了交付期限时对方拒绝接收,甚至指出关键流程都不对。领导跟我复盘时哭笑不得,只好领着我找到对方,重头把需求捋清楚。

人生没有后悔药,我不能说要是早点看到《编程珠玑》,是不是就不会犯这样的低级错误了。但如果是刚入行的程序员,而且还没看过这本书,那就赶紧看起,别再重蹈我的覆辙了。

Jon大神在书的开篇就说明了,问对问题,远比马上寻找答案重要得多。

曾有同事向他请教如何对磁盘文件内容排序。Jon大神第一反应是哪里需要这么麻烦,直接在内存里排不就好了吗?

但大神看出了对方的犹豫,于是展开了追问,最终明白了问题的限制条件,提出了合理而高效的解决办法。

对书中的内容进行总结,我在此抛砖引玉,提出以下三个方法帮助剖析问题。

• 换位思考:能够站在需求方的角度去看待问题,而不是技术实现角度。

• 找到核心问题:需求方可能会给出详尽的说明,但首先要从中找到最关键的痛点,避免做无用功。

• 充分挖掘细节:多问几个为什么,消除模糊地带,这是职业水准的体现。

怎么把程序写对

Jon大神在《编程珠玑》中提出过一个他观察到的事实,即90%的程序员都无法一次将二分搜索的算法写对。一个更惊人的事实是,二分搜索算法的论文在1946年就发表了,但第一个没有错误的程序直到1962年才写出来。

这个事实表明,在理解问题与编程实现之间,存在着巨大的鸿沟。魔鬼总在细节中,这也是为什么道理都懂了,却过不好这一生。生活是具体的,编程也是。

幸好,Jon大神提供了一些方法和工具,帮助程序员们把程序写对。

首先,写程序之前也要打草稿。估计这一点就挺出人意料的,程序员的草稿就是伪代码,这需要提起笔,在纸上一字一句写下来。

做这件事情的好处是显而易见的,就是将自己的大脑设置为计算机的工作模式,检验设计思路的可行性。在这一步发现问题,调整设计方案是比较从容的,这比写成代码之后再调整,代价要小得多。

其次,要构建完整的自动测试工具集。人的脑容量是有限的,无法记住所有代码的细节。这就要靠自动化的测试工具,来保证程序每一步的结果都是正确的。

最后,注重benchmark的测量。结果符合预期并不是工作的结束,还要测量运行时benchmark的数值。优化系统,解决性能瓶颈,往往需要对系统内的关键细节有足够的了解。

找到问题最优的解

很多程序员通过刷题,敲开了公司的大门,但在实际工作中,却认为只要能用就行。这个认知,会对程序员的职业生涯造成非常不利的影响。

程序员问对了问题,接下来就要把事情做对。

当然,面试题考察的场景总是简单的,实际工作中业务逻辑更加复杂,能实现功能说不定就费了很大脑筋,但这不能成为程序员不思进取的理由。能“一打十”的程序员总是会向前多走一步,即写出不仅能用,而且好用的程序来。

一项关键能力,是要能够分析程序的性能,并找到问题的最优解。具备这项能力的前提,是程序员自己打好扎实的计算机科学理论基础。这包括数学功底、计算机系统组成结构、计算思维等。

结合书中的内容,我再次抛砖引玉,提出下面四点找最优解的方法:

• 透彻理解典型算法的思路,知道它们能解决哪些类型的现实问题,以及掌握其时空复杂度;

• 清楚计算机系统的结构,对设备I/O与存储的技术性能有准确把握;

• 掌握粗略估算法,根据常识以及公开的数据,推算出系统大致的边界,这对于指导方向特别重要;

• 要有良好的全局观,现象是表面的,造成问题的原因可能隐藏在别处,这需要从系统整体来考虑。

结语

如果说一个程序员能“以一打十”,大家还觉得有些抽象,或者觉得自己也行。那么换个说法,当行业发生变化时,我们能否无惧于动荡,自信在任何时候都有自己的位子,而且在职业上不断进步呢?

如果你是这样的程序员,那么请接受我的敬意,并且请和我交个朋友;如果不是,那也没关系,让我们一起跟着Jon大神学习起来吧。只要走在了正确的路上,任何时候出发都不会晚。

最后想和大家说,《编程珠玑》每一章的“深入阅读”部分,Jon大神都列举了诸多经典好书,这绝对是一处宝藏。我摘取一部分书目列举在下面,更多的宝贝就等你自己去挖掘吧。

• 《计算机程序设计的艺术》,Donald Ervin Knuth

• 《C程序设计语言》,Brian W. Kernighan、Dennis M. Ritchie

• 《人月神话》,Frederick Phillips Brooks,Jr.

• 《代码大全》,Steve McConnell

• 《软件项目生存指南》,Steve McConnell

• ……

95528188a7bc4d6763180d1bde0b26ed.png

▲ 跟大神学算法

c96917bfd5d3a5e41b76069b0452e178.png

▲ 经典续写

敲黑板!本次民工哥技术之路公众号联合机械工业异步图书为大家带来赠书福利,拼手气的时候到了,看看谁才是锦鲤?

点击下方名片回复关键字  编程珠玑 参与抽奖

规则:
1、民工哥公众号读者专属(同一用户近期多次中奖无效,发现作弊行为永久拉黑!请把机会留给其他人)。
2、中奖需于 8 小时内主动联系小编发送收货信息,逾期则视为自动放弃。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值