基本信息
- 原书名:Think Like a Programmer
- 原出版社: No Starch Press
编辑推荐
学会像程序员一样思考,构建创新性问题解决方案!想在Google和Facebook的面试种脱颖而出吗?本书的习题就是Google和Facebook的面试模板,众多专业网站和媒体好评如潮!
内容简介
计算机书籍
编程的真正挑战不是学习一种语言的语法,而是学习创造性地解决问题,从而构建美妙的应用。本书分析了程序员解决问题的方法,并且教授你其他图书所忽略的一种能力,即如何像程序员一样思考。
全书分为8章。第1章通对几个经典的算法问题切入,概括了问题解决的基本技巧和步骤。第2章通过实际编写C++代码来解决几个简单的问题,从而让读者进一步体会到问题解决的思路和应用。第3到7章是本书的主体部分,分别探讨了用数组、指针和动态内存、类、递归和代码复用来解决问题的途径和实际应用。最后,第8章从培养程序员思维的角度,进行了总结和概括,告诉读者如何才能像程序员一样思考。
《像程序员一样思考》选取的话题切中程序员的痛点,针对他们最容易陷入挣扎的领域展开讨论,引发思考。每章后面都给出一些编程习题,使得读者能够应用该章所讨论的概念,训练和提升问题解决的能力。
《像程序员一样思考》适合初级到中级的程序员用来提升自己的问题解决能力和应用编程技能的能力,也适合计算机相关专业的学生作为参考书阅读。
《像程序员一样思考》教会读者如何系统化地解决问题,提供了众多的技术和实例展示如何组织思路、找到解决方案以及解决某一类问题的策略。
作译者
徐波 浙江宁波人,熟悉C和C++、Java等编程语言。2002年开始从事计算机技术图书翻译。徐波技术视野广阔,翻译文笔优美。译著有《C专家编程》、《C和指针》等。
目录
第1章 解决问题的策略 1
1.1 经典难题 2
1.1.1 狐狸、鹅和玉米 3
1.1.2 瓷砖滑块问题 7
1.1.3 数独 11
1.1.4 Quarrasi锁 13
1.2 基本的问题解决技巧 16
1.2.1 总是要制订计划 16
1.2.2 重新陈述问题 17
1.2.3 划分问题 18
1.2.4 从自己所知的开始 19
1.2.5 削减问题 20
1.2.6 寻找类比 21
1.2.7 试验 21
1.2.8 避免陷入挫折感 22
1.3 习题 23
第2章 纯粹的难题 25
2.1 本章所使用的C++简述 25
2.2 输出图案 26
前言
并不是只有你才这样。我从事编程教学已经超过15年,几乎所有的学生都在某种程度上符合上面的描述。我们称之为缺乏问题解决能力。所谓问题解决能力,就是根据问题描述编写一个原创程序来解决这个问题。并不是所有的编程任务都需要深入的问题解决能力。如果只是对一个现有的程序进行微小的修改、调试或添加测试代码,这类编程在本质上是机械的,不会对我们的创造力提出多大的挑战。但是,所有的程序总会在某个时刻需要解决问题,所有优秀的程序员都需要具备解决问题的能力。
解决问题是非常困难的。但有些人确实使它变得非常轻松,因为他们天赋异禀,就像迈克尔·乔丹这样的体育天才一样。对于这帮天才,高级的思路几乎可以毫不费力地转换为源代码。用Java的一个比喻来说,他们的脑子天生就像能执行Java代码一样,而绝大多数人只能通过虚拟机来解释代码。
没有超常天赋对于成为程序员而言并不是致命的。如果真是如此,世界上也就没有多少程序员了。但是,我看到过许多值得尊重的学习者却在挫折面前挣扎太久。最坏的情况是,他们完全放弃了编程,认为自己永远成不了程序员,觉得只有天赋异禀的人才能成为优秀的程序员。
学习解决编程问题为什么这么困难呢?
部分原因是解决问题是一种与学习编程语言不同的活动,它使用了一组不同能力的“肌肉”。学习编程的语法、阅读程序、记忆应用程序编程接口的元素,这些都是分析性的“左脑”活动。使用以前所学会的工具和技巧编写一个原创程序却是创造性的“右脑”活动。
假设我们想拿走掉落在自家房顶上的其中一条雨槽内的一根树枝,但是自家的梯子却不够长,够不着那根树枝。我们会跑到自己家的车库,寻找某样东西来帮助我们拿走雨槽上的树枝。有没有办法使梯子加长呢?我们站在梯子上时能不能手持某样东西来抓住或拔掉树枝?或许我们可以从某个位置爬上屋顶拿走树枝。解决问题是一种创造性的活动。不管你是否相信,在设计自己的原创程序时,我们的智力活动过程与想方设法从雨槽中拿走树枝的过程非常相似,但与调试一个现有的for循环的过程却截然不同。
但是,绝大多数编程书籍却把重点放在语法和语义上。学习编程语言的语法和语义是极为重要的,但这只是学会用这种语言进行编程的第一个步骤。在本质上,大多数面向新手的编程书籍所讲述的是怎样阅读程序而不是怎样编写程序。把重点放在怎样编写代码上的书籍常常是有效的“烹调书”,因为它们讲述在特定情况下所使用的特定“菜谱”。这种书籍对于节省时间而言是极有价值的,但它们并不是通往学会编写原创代码的正确道路。考虑原始意义上的烹调书。尽管优秀的厨师拥有自己的烹调书,但没人依靠烹调书就能成为优秀的厨师。优秀的厨师理解配料、备菜方法和烹饪方法,并知道怎样把它们组合在一起烹制美味佳肴。优秀的厨师在烹制美味时所需要的只是工具完备的厨房。同理,优秀的程序员理解语言的语法、应用程序框架、算法和软件工程原则,并知道怎样把它们结合起来创建优秀的程序。为优秀的程序员准备一个需求规范列表,给他一个功能齐全的开发环境,他就能创造优秀的程序。
一般而言,当前的编程教育并没有在解决问题这个领域提供太多的指导。相反,如果程序员可以使用所有的编程工具并按要求编写足够的程序,最终他们将学会编写这些程序并且完成得很好。这种说法并没有错,但是“最终”可能意味着相当长的时间。从蹒跚学步到初窥门径的道路上可能充满挫折,有太多的人信心满满地开始了旅程,却倒在了半途中。
我们并不一定要饱经磨难才能获得成功,而是可以用一种系统的方式来学习怎样解决问题,这正是本书的核心所在。我们可以学习对自己的想法进行组织的技巧、解决方案的发现过程以及对某些类型的问题所实行的策略。通过研究这些方法,我们可以释放自己的创造力。不要弄错了:编程,尤其是解决问题,是一种创造性的活动。创造性是神秘的,没人能够准确地说出创造性是怎样发挥作用的。但是,如果我们能够学会怎样作曲、能够领会别人所提出的有关写作创造能力的建议或者能够学会绘画,我们也可以学会怎样有创造力地解决编程问题。本书并不是讲述具体的做法,而是帮助读者开发属于自己的问题解决天赋,明白自己应该怎么做。本书的目的是帮助读者成为自己心目中的程序员。
我的目标是让本书的读者学会怎样用系统性的方法完成每个编程任务,并坚信自己最终能够解决一个特定的问题。当读者完成本书的学习时,我希望你能够像程序员一样思考,并坚信自己已经是个程序员。
本书内容简介
在解释了本书的必要性之后,我还需要对本书将讨论的内容和不会讨论的内容进行一些说明。
预备条件
本书假设读者已经熟悉了C++的基本语法和语义,并且已经编写过一些程序。本书的大部分章节将预计读者已经了解了特定的C++基础知识。这些章节将从对这些基础知识的回顾开始讨论。如果读者还在学习语言的基础知识阶段,也不必担心。关于C++的语法有大量优秀的书籍可供参考,在学习解决问题的同时学习语法也是没有问题的。在尝试解决每章后面的习题之前,要保证自己已经学会了相关的语法。
所选择的话题
本书所覆盖的话题代表了我所看到的程序员新手最容易陷入挣扎的领域。它们还代表了初级和中级编程中许多跨领域的话题。
但是,我应该强调,这并不是一本用于解决特定问题的算法或模式的“烹调书”。尽管后面的章节讨论了怎样使用广为人知的算法或模式,但这本书并不适合作为解决特定问题的参考书,所以读者不应该只把注意力集中在直接与自己当前所面临的问题相关的章节中。反之,读者应该从头研读全书,暂时只跳过那些由于缺乏预备知识而无法直接学习的内容。
编程风格
这里简单概述一下本书所使用的编程风格:本书并不追求高性能的编程,并不苛求产生最紧凑、最高效的代码。我为源代码例子所选择的风格是把容易理解作为首要的考虑因素。在有些情况下,我会采用多个步骤完成那些实际上只用一个步骤就可以完成的任务,其原则就是为了进行清晰的说明。
媒体评论
——Ariane Coffin, Wired.com网站的GeekMom
“作者在向初学者阐述难懂的概念方面具有广博的知识和丰富的经验。本书显示了他脚踏实地、一丝不苟却又令人愉悦的写作风格。”
——Adrian Woodhead, Slashdot
“这是我阅读后收获最大的书籍之一,因为它指导我们设计一个属于自己的系统,而不是把思维固化为只能采取一种正确的方法才能达到目的。”
——Lucas Westermann, Full Circle杂志
“如果你能够认真研读本书,我保证它可以极大地拓展你的思维。”
——David Bolton, About.com C/C++/C#
“不管使用什么教材向新学生讲授编程和程序逻辑,我都建议一定要把本书作为重要的参考书。”
——Joe Saur,The ACM's Software Engineering Notes杂志
“作者所提供的建议简单、直观并且实用。本书的阅读是一个既轻松又极有价值的过程。”
——James Powell, Enterprise Systems
“对于所有想要培养创造性的解决问题能力的人以及已经学习了编程但觉得没有完全理解概念的人,我向他们强烈推荐本书。”
——Robert Perkins, Game Vortex
“如果我教其他人学习编程,这肯定是我要选择的教材。”
——Stephen Chapman, Ask Felgall