首页>参考读物>计算机科学与技术>软件与程序设计

如何写出好程序
作者 : [英]佩蒂塔·史蒂文斯(Perdita Stevens) 著
译者 : 王磊 周训杰 万学凡 译
丛书名 : 华章程序员书库
出版日期 : 2021-07-01
ISBN : 978-7-111-68532-6
定价 : 69.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 190
开本 : 16
原书名 : How to Write Good Programs: A Guide for Students
原出版社: Cambridge University Press
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书通过丰富的小提示、故事和关键术语的解释,清晰地传授各种编程技巧。书中包含Python、Java和Haskell的示例,无论你正在学习哪一种编程语言,都能帮助你获得可移植的编程技能。
本书主要面向学习编程课程的学生以及编程初学者和希望提升编程技艺的程序员,能帮助你在课程中取得好成绩,并有助于养成良好的软件工程习惯,从而开发出易读且高效的好程序。

图书特色

上架指导

计算机\程序设计

封底文字

不管是初学者,还是在键盘和屏幕前积累了不少开发经验的在职程序员,养成良好的编程习惯都是事半功倍的关键。测试、调试、优化,让程序清晰而简洁,这些基本功恰好是一个程序员通向职业成功道路的铺路石。可以说,这是一本值得刚上手编程的学生一读的好书。此外,对于有经验的程序员,这本书也打开了一扇用不同视角审视编程艺术的窗口。
——沈刚,华中科技大学软件学院教授
程序员不仅要学会编写程序,还要学会测试和调试程序。为了编写大型程序,跟更多的程序员合作,他们要学会写整洁的代码,学会重构,让代码具有自解释性和可维护性。这让程序员更像是一个手艺人。
除了方便自己,你的程序如何帮助更多的人呢?尤其是那些弱势群体,如何让他们生活得更好?如何让你的程序符合道德伦理,拒绝侵犯隐私,最后造福整个社会?
我想这才是好程序。
——张凯峰,InfoQ社区编辑
本书由浅入深地向读者讲述了写出好程序的思维与方法,并记录了作者丰富的编程思考与经验。无论是刚开始学习编程的“学员”,还是初入职场的编程“新人”,或者是具有一定编程经验的“老兵”,都可以从这本书中汲取到养分,收获良多。同时,这本书中的所思所得对于从事教学与培训行业的讲师与课程设计师而言,也有非常高的学习、借鉴与参考价值。
——宋俊毅,牛鹭学院联合创始人
这本书清晰流畅、行云流水,言语之间无一不阐述着那些通用的编程技艺。阅读本书,将从了解编辑器、IDE、版本控制、单元测试、测试程序、调试、重构、防御式编程、优化入手,磨炼基本功,进而培养良好的编程习惯,形成专业的风格和极致的治学态度,并在追求卓越的过程中积累习惯,将其变成编程道路甚至人生道路上的一种修养。
——张喻,腾讯科技研发工程师
本书提供了大量特别适用于编程初学者的优秀建议。本书内容与编程语言无关,结构合理,讲授方式通俗易懂。建议不妨用亲切的大号字体在本书封面写上“不用惊慌失措”。
——Jeremy Gibbons,牛津大学教授
这是一本非常独特的书,阅读时感觉就像手捧一杯咖啡、听一位经验丰富的计算机编程专家娓娓道来。书中大量实用的小提示、见解和行业故事,对任何想要学习编程的人都大有裨益。
——Tom Ward,利兹大学教授
真心希望在我上大学期间和职业生涯之初就有这样一本书!它抛开具体的编程语言来解释基本的概念,并且包含了许多实用的评论和提示,可以帮助新手程序员解决容易出现的难题。
——Jennifer Tenzer,一家全球资产管理公司的
高级开发人员

译者序

程序,在计算机尚未普及的年代,对我们来说是一个神秘而又高深的概念。然而,在如今的信息社会,我们每天都会与各种各样的程序打交道,我们的生活早已无法离开程序,程序已成为数字化时代的一部分。
也正是由于这个原因,越来越多的同学和我们一样,选择了程序员这份职业。无论是编程的初学者,还是具有一定经验的程序员,抑或从业多年的技术专家,编写出更清晰、更正确、更健壮的程序,都是我们追求的目标。
现在,我们可以很容易地在市面上找到编程方面的书籍,它们或者是针对某一种语言的专业书刊,或者是某些技术细分领域的行业经验分享。但很少能有这样一本书:它通过具体的案例,清晰、系统地阐述编程技巧,并不限定于某一种语言,而是更关注传授可移植的编程技能,让读者在掌握编程技巧的同时,也能理解其背后的思想。这些思想,正是设计优雅程序的精髓。
这是一本分享经验与指引我们少走弯路的经典书籍,针对如何设计优质的程序提出了实用、权威的指导。对初学者来说,它是一本不可或缺的入门指南;对从业多年的开发人员和技术专家来说,它也具有相当高的参考价值。
我们几个译者是多年的同事和好友,也都在软件行业摸爬滚打多年。回想起在接触编程的时候,从刚开始简单的Hello World起步,再慢慢地开始编写能工作的程序,到如今设计复杂的系统架构,我们都不可避免地碰到过各种问题,比如:代码缺乏良好的可读性,致使维护效率低下;工作中缺乏良好的备份习惯,导致返工的时候成本太高等。所幸我们通过各种探索和总结,最终克服了这些问题。在翻译本书的过程中,我们多次感叹:如果能在从业之初就接触这本书就好了。
本书的作者Perdita Stevens是爱丁堡大学的教授,有着多年的编程和软件工程教学经验,她将教学过程中的经验提炼、总结并分享出来,我们在翻译本书的过程中,就好像在与一位编程大师对话。在本书中,Perdita Stevens教授娓娓道出的内容,对同样是读者的我们来说也是一笔宝贵的财富。
感谢我们的家人,本书的翻译占用了我们大量的业余时间,对此他们给予了极大的理解与支持。更为可贵的是,在本书的翻译过程中他们提供了很多专业的意见和建议。没有他们的支持,我们是很难顺利完成本书的翻译工作的。
在本书的翻译及出版过程中,机械工业出版社华章分社的编辑们逐字逐句地进行检查、校对和修改,从而提高了译文的质量。谢谢他们!

王磊 周训杰 万学凡
2021年4月于武汉

推荐序

| Foreword 1 ● 推荐序一 |
在1972年的图灵奖演讲中,计算机科学家、软件工程师Edsger Dijkstra回顾了自己作为荷兰第一位程序员的一些经历和感悟。虽然在题为“谦逊的程序员”的演讲中,Dijkstra饶有趣味地讲述了自己早年从理论物理学转向计算机科学的研究与实践的故事,但是他的一些发现确实令人沮丧:社会对程序员的表现和他们的产品并不满意。在计算机技术飞速发展的现实世界里,硬件产品的性能日益提升而价格却不断下降,同时,人们对各种媒体上不惜笔墨地描述的人工智能、大数据技术、量子计算等新兴领域的广阔前景充满向往。这一切都让今天的程序员承担着不可避免的压力。如何写出好程序正是每一位程序员都在思考和尝试的事情。
虽然探讨编程技艺的同道之人众多,但是个体的经验和结论可能千差万别。以我本人为例,三十多年前初学编程的时候,我对程序员这一职业完全没有概念。那时候,每个人都为自己独特的任务来编写程序,编程只是服务于主体目标的一项边缘工作。到了21世纪,软件工程作为一门学科已经结出丰硕的果实,软件工程专业在很多高等院校也已生根开花。打开主流的招聘网站就会发现,社会上对程序员这一工作的认可度也已经达到了相当的高度。软件成为人们生活、工作、学习、旅行、娱乐不可或缺的产品与服务,软件开发也被公认为一项复杂的生产活动。但是客观地说,对于编程本身的研究好像并没有激起太大的浪花。对那些渴望得到指点的初学者来说,找到如何写出好程序的答案远不是一件轻而易举的事情。
本书是一本名副其实的学习指南。不管是初学者,还是在键盘和屏幕前积累了不少开发经验的在职程序员,养成良好的编程习惯都是事半功倍的关键。我们知道,职业运动员的日常训练内容包括大量的体能训练,以及必不可少的动作规范性练习。虽然这些训练看起来和比赛没有直接的关联,但是没有人能否认好的成绩来自严格而规范的训练。当今社会对程序员的需求量较大,而优秀程序员的供给存在巨大的缺口,这导致很多程序员并没有经过充分而合理的训练就直接投入赛场参与比赛。不能否认实战对于程序员成长的作用,正如无法否认地基对于摩天高楼的决定作用一样。测试、调试、优化,让程序清晰而简洁,这些基本功恰好是一个程序员通向职业成功道路的铺路石。一旦能够开始编写好程序,享受编程的乐趣,获得职业的成就感,得到自身的满足感,这一良性循环就充满了正反馈。
作为爱丁堡大学的教授和软件工程研究者,作者Perdita Stevens 并没有板起面孔去写一本严肃的教科书。读者在这本书中可以体会到作者就像导游一样,介绍了一段毫不枯燥的旅程。作者开启的是循序渐进的编程之旅:在旅途中,不仅用一些示例揭示希望表述的道理,还不断使用有趣的知识点和言简意赅的小提示引导读者的注意力。更有意思的是,通过多年教学得出的经验,Stevens教授了解读者会在哪里遇到困难,于是在这些地方给读者提出了有价值的针对性建议。
本书的译者有着软件行业丰富的开发和管理经验,对于编程语言、开发工具和软件工程实践的出色理解无疑为翻译本书提供了坚实的基础。整本书读起来不仅非常顺畅,对比原文还可以发现,译者非但没有偏离原书作者的表达特点,而且在一些细微之处用心地照顾到了中文读者的阅读习惯。
可以说,这是一本值得刚上手编程的学生一读的好书。此外,对于有经验的程序员,这本书也打开了一扇用不同视角审视编程艺术的窗口。

沈刚
华中科技大学软件学院教授




| Foreword 2 ● 推荐序二 |
如果说现在是机器的时代,或者程序的时代,恐怕不会有人反对。事实上,程序已经多到我们通常会忽略它们的存在了。游戏、手机、远程教学软件,或者路边绚丽多彩的广告牌,背后都有程序在运行。
每日与程序为伴,促使我们去学习如何编写程序。
程序可以帮助我们解决复杂的问题,或者解决简单但烦琐的问题。不仅如此,学习编写程序还可以帮助我们理解它,理解机器,进而理解这个世界运转的规则。现在来看,如果存在两个世界,一个是我们身处的物理世界,另一个是数字或者虚拟世界,那么程序就是连接这两个世界的东西。我们借由程序,可以在这两个世界之间自由穿行。
程序员可能会有不同的想法。在他们受到的训练里,写程序是一件庄重又日常的事情。曾经有一本著名的书《七周七语言》,讲的是程序员如何在短时间内掌握尽可能多的编程语言。是的,这对他们有莫大的吸引力。而且,一旦进入程序的世界,你会发现那里跟色彩绚丽的广告牌一样丰富多彩。
程序员不仅要学会编写程序,还要学会测试和调试程序。为了编写大型程序,跟更多的程序员合作,他们要学会写整洁的代码,学会重构,让代码具有自解释性和可维护性。这让程序员更像是一个手艺人。
但这并不意味着你必须要成为一名程序员。
除了理解机器和这个世界,编写程序其实可以是一件很好玩的事情,尤其是当你看到计算机会听你的话,按照你的程序执行,得到你想要的结果的时候。慢慢地,你会发现你在用程序去表达你的想法,而且计算机可以理解它们,也就是理解你。
也许你会想到更多:除了方便自己,你的程序如何帮助更多的人呢?尤其是那些弱势群体,如何让他们生活得更好?如何让你的程序符合道德伦理,拒绝侵犯隐私,最后造福整个社会?
我想这才是好程序。

张凯峰
InfoQ社区编辑


| Foreword 3 ● 推荐序三 |
两年前,我结束自己已从事十年的一线工作转职成为一名程序员培训师。在近两年的时间里,我在教学之余一直在思考与探索如何培养一名优秀的程序员,并不断总结与记录教学经验和对人员培养的理解。对于如何培养一名符合企业要求的、具备工程能力的程序员,最主要的其实只有两个方面:教会学员一门编程语言;帮助学员建立编程思维与解决问题的能力。
教会学员一门编程语言,这在整个教学活动过程中是一件非常简单的事情。通常在教学实践中会从第一个Hello World开始,帮助学员理解程序的本质,同时验证学员所安装的开发环境与开发工具的可用性。随后便可以按部就班地从变量到数据类型这样一路教下去,帮助学员弄懂每一个语法与函数的含义,通过在教学过程中使用大量的练习帮助其巩固技能,最终通过一个综合性项目使其所学的技能得到综合应用。以上便是学习一门编程语言的路径,也是许多程序员(包括我自己)学习一门编程语言的过程。
在教学实践中帮助学员培养良好的编程思维与解决问题的能力,则是一件艰难而复杂的事情,也是决定教学水平高低的重要指标。如果将学员从不会编程到学会编程形容为从0到1的过程,那从学会编程到可以编写出更好的程序就是从1到100的过程,而这个过程也是决定该学员对于企业而言是属于60分合格、80分优秀还是100分卓越的关键。在这个过程中,学员的进步无法通过掌握语法与类库的累加来实现,而是必须在原有的、通过模仿套用现有案例完成代码堆叠的基础能力上,增加代码结构设计能力、工程代码管理能力以及代码问题分析、定位、调试与解决能力才能实现。总体而言,这个过程就是由掌握一门语言到可以独立承担一项工程研发任务的过程,其中最核心的任务便是帮助学员培养良好的编程思维与解决问题的能力。
上述两个方面在程序员的培养与成长过程中都非常重要,缺一不可。目前,市场上针对前者的课程、书籍与资料已经称得上汗牛充栋,但针对后者的学习资料却很少,即便找到寥寥数本,要么内容过于深奥复杂,仅仅书籍的厚度就让人“望而生畏”,要么太过零散简洁,犹如武林高手秘传的内功心法一般,令新人无从下手。本书的出现刚好填补了这一空白,其由浅入深地向读者讲述了写出好程序的思维与方法,并记录了作者丰富的编程思考与经验。
本书的译者是国内经验极为丰富的工程实践的优秀推广者,在其过往的工作中带领并培养出了在业内堪称具有优秀编程实践的研发队伍,对于研发人员的培养有深层次的体系化思考与实践。
我相信,无论是刚开始学习编程的“学员”,还是初入职场的编程“新人”,或者是具有一定编程经验的“老兵”,都可以从这本书中汲取到养分,收获良多。同时,这本书中的所思所得对于从事教学与培训行业的讲师与课程设计师而言,也有非常高的学习、借鉴与参考价值。

宋俊毅
牛鹭学院联合创始人


| Foreword 4 ● 推荐序四 |
在编程的世界里,我是一名逐梦者,一名造梦者,亦是一名售梦者。
懵懵懂懂、跌跌撞撞、迷迷茫茫之间,撞入了程序的领域,是慌张,是欣喜,是困难,也是收获。或许和大部分人类似,初次接触编程,并没有激发我对编程的热情,我只是在用背诵代码的方式应付“考试”。直到我发现,助力我成功获得第一份工作的,并不是我背诵的那些少得可怜的语法,而是不知道什么时候刻入我骨子里的clean code、思维方式和编程习惯。而伴随着由之而来的良性循环,我成了一名逐梦者。
编程是一种方式,是让计算机做你想让它做的事情,让程序去解决现实中的问题。同时编程也是一门技艺,编写优雅的程序需要高超的技巧和相当的审美观,就像是谱一首乐曲,音调应该是和谐的。在编程界,造梦者既在倾听,又在献策,既是赶工,又行美好,你需要捕获难以捉摸的需求,并找到一种表达它们的方式,以便机器能够轻松地理解。在项目时钟的滴答声中,赶工完成一项项工作的同时,你每天都在一点点地创造奇迹。
结构化思维在一定程度上指引着我们。先形成骨架,再去填充细节,去丰满内容,思维就会有迹可循,布局就会颇有章法,解决问题就会更有效率。那么,在学习编程的初期,抑或在有颇多编程经验之后再次回头梳理时,编程习惯的养成、抽象概念的提取,对于编程这条路来说,就像是提高了前进的加速度。这本书清晰流畅、行云流水,言语之间无一不阐述着那些通用的编程技艺。阅读本书,将从了解编辑器、IDE、版本控制、单元测试、测试程序、调试、重构、防御式编程、优化入手,磨炼基本功,进而培养良好的编程习惯,形成专业的风格和极致的治学态度,并在追求卓越的过程中积累习惯,将其变成编程道路甚至人生道路上的一种修养,这也许是作者、译者和我这名平凡的“程序媛”的售梦方式。
你、我,我们都已在编程的路上前行着,带着修行者的信念,坚定地前行着。我相信,若是归途,星海共读。

张喻
腾讯科技研发工程师

图书目录

推荐序一
推荐序二
推荐序三
推荐序四
译者序
第1章 介绍 1
1.1 本书适合谁 3
1.2 关于方框 4
1.3 本书的结构 6
1.4 致谢 6
第2章 什么是好程序 8
第3章 如何开始 11
3.1 究竟什么是程序 11
3.2 你需要什么 12
3.2.1 使用交互式提示 13
3.2.2 使用文本编辑器 14
3.3 了解待办任务 16
3.4 编写程序 18
3.4.1 设置任务 19
3.4.2 朝着完全正确的代码迈进 24
3.5 感到困惑时怎么办 25
第4章 如何理解编程语言 29
4.1 编译与解释 30
4.2 类型 33
4.3 结构 36
4.4 历史、社区与动机 38
4.5 范式 39
第5章 如何使用最佳工具 42
5.1 使用最基本的工具 43
5.2 什么是IDE 44
5.3 展望 47
第6章 如何确保程序不会丢失 48
6.1 立即恢复:撤销 49
6.2 基本灾难恢复:文件 49
6.3 避免灾难:保存版本 51
6.4 流程自动化:使用版本控制系统 52
6.5 管理未使用的代码 54
6.6 备份和云 56
第7章 如何测试程序 59
7.1 手动测试 60
7.2 基本的自动化测试 62
7.3 正确的自动化测试 65
7.4 你应该进行哪些测试 66
7.5 应该在何时编写测试 68
7.6 基于属性的测试 69
第8章 如何让程序清晰 72
8.1 编写清晰的代码对你有何帮助 72
8.2 注释 74
8.3 名字 77
8.4 布局和留白 80
8.5 结构和习惯用法 83
第9章 如何调试程序 87
9.1 当程序还无法运行时 89
9.2 当程序执行错误时 94
9.3 纸板调试法 103
9.4 如果这些都失败了 103
9.5 修复bug 104
9.6 修复bug后 106
9.6.1 查找类似的bug 106
9.6.2 避免重复出现相同的bug 108
9.6.3 防御式编程 112
第10章 如何优化程序 114
10.1 可维护性 115
10.1.1 消除重复 116
10.1.2 选择抽象 120
10.2 效率 122
10.3 重构 126
10.4 提升技能 129
第11章 如何获得帮助 132
11.1 解决一般问题 133
11.2 解决具体问题 135
11.2.1 从错误信息中获得帮助 136
11.2.2 查找说明和有用的代码 137
11.2.3 解决复杂的程序问题 138
11.2.4 寻求帮助 140
11.2.5 入门帮助 141
11.3 当老师让你困惑时怎么办 142
第12章 如何在课程作业中取得好成绩 144
12.1 七条黄金法则 144
12.2 上机实验 146
12.3 课程设计 147
12.4 团队合作 148
12.5 演示 149
12.6 反思写作 150
第13章 如何在编程考试中取得好成绩 152
13.1 准备考试 153
13.1.1 了解考核内容 153
13.1.2 用以前的试卷练手 154
13.1.3 考试规划 155
13.2 考试中 155
13.3 书面考试的具体要点 156
13.4 上机考试的具体要点 156
13.5 选择题考试 157
第14章 如何选择编程语言 159
14.1 需要考虑的问题 159
14.2 你可能遇到的几种语言 162
14.3 语言环境的变化 164
第15章 如何超越本书 166
15.1 编写更多程序 166
15.2 特定的编程语言 167
15.3 一般编程 167
15.4 软件工程 168
15.5 编程语言理论 170
参考文献 172

教学资源推荐
作者: 王立柱 编著
作者: (美)Barry Wilkinson, Michael Allen
作者: 郝玉洁
作者: [美]雷蒙德?盖拉多( Raymond Gallardo) 斯科特?霍梅尔(Scott Hommel) 索亚?坎南(Sowmya Kannan) 琼尼•戈登(Joni Gordon) 沙伦?比奥卡?扎卡沃(Sharon Biocca Zakhour) 著
参考读物推荐
作者: 王国辉 等编著
作者: (美)Mark Graves
作者: 张昆 戴艳 编著