来源:其识
作者:万学凡 等
导读:学习编程并不仅仅是学习编程语言的细节:要想成为一名优秀的程序员,就必须成为调试代码、测试代码、编写清晰代码的专家,并且能解决遇到的任何疑难问题。
程序员如何在数字世界中少走弯路、一“码”当先?被誉为“宝藏级编程说明书”的《如何写出好程序(How to Write Good Programs)》或能成为程序员们的职场宝典。
今天为大家推荐一本新书《如何写出好程序》,本书由爱丁堡大学教授 佩蒂塔·史蒂文斯(Perdita Stevens)撰写,王磊、周训杰、万学凡翻译,得到沈刚、张凯峰、宋俊毅、张喻等众多KOL鼎力推荐!
那么这本书究竟有什么魔力,得到了众多行业专家的联袂推荐?先来看看他们都是怎么说的:
本书译者之一:
万学凡,现任凯捷咨询(中国)有限公首席咨询顾问
推荐序一
沈刚 华中科技大学软件学院教授
在1972年的图灵奖演讲中,计算机科学家、软件工程师Edsger Dijkstra回顾了自己作为荷兰全国第一位程序员的一些经历和感悟。虽然在题为《谦逊的程序员》这篇演讲词中,Dijkstra饶有趣味地讲述自己早年从理论物理学转向计算机科学的研究与实践的故事,但是他的一些发现确实令人沮丧:社会对程序员的表现和他们的产品并不满意。在计算机技术飞速发展的现实世界里,硬件产品性能日益提升而价格却不断下降;同时,人们对各种媒体上不惜笔墨所描述的人工智能、大数据技术、量子计算等新兴领域的广阔前景充满向往。这一切都让今天的程序员们承担着不可避免的压力。如何写出好的程序正是每一位程序员都在思考和尝试的事情。
虽然探讨编程技艺的同道之人众多,但是个体的经验和结论可能会千差万别。以我本人为例,三十多年前初学编程的时候,我对程序员这一职业完全没有概念。那时候,每个人都为自己独特的任务来编写程序,编程只是服务于主体目标的一项边缘工作。到了二十一世纪,软件工程作为一门学科已经结出丰硕的果实,软件工程专业在很多高等院校也已生根开花。打开主流的招聘网站就会发现,社会上对于程序员这一工作的认可度也已经达到了相当的高度。软件成为人们生活、工作、学习、旅行、娱乐不可或缺的产品与服务,软件开发也被公认为一项复杂的生产活动。但是客观地说,对于编程本身的研究好像并没有激起太大的浪花。对那些渴求得到指点的初学者来说,找到如何写好程序的答案远不是一件轻而易举的事情。
本书是一本名副其实的学习指南。不管是初学者,还是在键盘和屏幕前积累了不少开发经验的在职程序员,养成良好的编程习惯都是事半功倍的关键。我们知道,职业运动员的日常训练内容包括了大量的体能训练,以及必不可少的动作规范性练习。虽然这些训练看起来和比赛没有直接的关联,但是没有人能否认好的成绩来自于严格而规范的训练。当今社会对程序员的需求量较大,而优秀程序员的供给存在巨大的缺口,这导致很多程序员并没有经过充分而合理的训练就直接投入赛场参与比赛。不能否认实战对于程序员成长的作用,正如无法否认地基对于摩天高楼的决定作用一样。测试、调试、优化,让程序清晰而简洁,这些基本功的养成恰好是一个程序员通向职业成功道路的铺路石。一旦能够开始编写好的程序,享受编程的乐趣,获得职业的成就感,得到自身的满足感,这一良性循环就充满了正反馈。
作为爱丁堡大学的教授和软件工程研究者,作者Perdita Stevens 并没有板起面孔去写一本严肃的教科书。读者在这本书中可以体会到作者就像导游一样,介绍了一段毫不枯燥的旅程。作者开启的是循序渐进的编程之旅:在旅途中,不仅用一些示例揭示希望表述的道理,还不断使用有趣的知识点和言简意赅的小提示引导读者的注意力。更有意思的是,通过多年教学得出的经验,Stevens教授了解读者会在哪里遇到困难,于是在这些地方给读者提出了有价值的针对性建议。
本书的译者有着软件行业丰富的开发和管理经验,对于编程语言、开发工具和软件工程实践的出色理解无疑为翻译本书提供了坚实的基础。整本书读起来不仅非常顺畅,对比原文还可以发现,译者非但没有偏离原书作者的表达特点,而且在一些细微之处用心地照顾到了中文读者的阅读习惯。
可以说,这是一本值得刚上手编程的学生一读的好书。此外,对于有经验的程序员,这本书也打开一扇用不同视角审视编程艺术的窗口。
InfoQ社区编辑 张凯峰
如果说现在是机器的时代,或者程序的时代,恐怕不会有人反对。事实上,程序已经多到我们基本会忽略它们的存在了。游戏、手机、远程教学软件,或者路边绚丽多彩的广告牌,背后都有程序在运行。
每日与程序为伴,促使我们去学习如何编写程序。
程序可以帮助我们解决复杂的问题,或者解决简单但烦琐的问题。不仅如此,学习编写程序还可以帮助我们理解它,理解机器,进而理解这个世界运转的规则。现在来看,如果存在两个世界,一个是我们身处的物理世界,一个是数字或者虚拟世界,那么程序就是在连接这两个世界的东西。我们借由程序,可以在这两个世界之间自由穿行。
程序员可能会有不同的想法。在他们受到的训练里,写程序是一件庄重又日常的事情。曾经有一本著名的书《七周七语言》,讲的是程序员如何在短时间内掌握尽可能多的编程语言。是的,这对他们有莫大的吸引力。而且,一旦进入到程序的世界,你会发现那里跟色彩绚丽的广告牌一样丰富多彩。
程序员不仅要学会编写程序,还要会测试和调试程序。为了编写大型程序,跟更多的程序员合作,他们要学写整洁的代码,学会重构,让代码具有自解释性和可维护性。这让程序员更像是一个手艺人。
但这并不意味着你必须要成为一名程序员。
除了理解机器和这个世界,编写程序其实可以是一件很好玩的事情。尤其当你看到电脑会听你的话,按照你的程序执行,得到你想要的结果的时候。慢慢地,你发现你在用程序去表达你的想法,而且计算机可以理解它们,也就是理解你。
也许你会想到更多,除了方便自己,你的程序如何帮助到更多的人呢?尤其是那些弱势群体,如何让他们生活得更好?如何让你的程序符合道德伦理,拒绝侵犯隐私,最后造福整个社会?
我想这才是好的程序。
宋俊毅 牛鹭学院联合创始人
两年前,我结束了自己刚好从事十年的一线工作转职成为一名程序员培训师。在近两年的时间里,我在教学之余一直思考与探索着如何培养一名优秀的程序员,并一直不断总结与记录教学的经验和对人员培养的理解。对于如何培养一名符合企业要求的、具备工程能力的程序员,最主要的其实只有两个方面:教会学员一门编程语言;帮助学员建立编程思维与解决问题的能力。
教会学员一门编程语言,在整个教学活动过程中是一件非常简单的事情。通常在教学实践中会从第一个Hello World开始,帮助学员理解程序的本质,同时验证学员所安装的开发环境与开发工具的可用性。随后便可以按部就班地从变量到数据类型这样一路教下去,帮助学员弄懂每一个语法与函数的含义,通过在教学过程中使用大量的练习帮助其巩固技能,最终通过一个综合性项目使其所学的技能得到综合应用。以上便是学习一门编程语言的路径,也是许多程序员(包括我自己)学习一门编程语言的过程。
在教学实践中帮助学员培养良好的编程思维与解决问题的能力,则是一件艰难而复杂的事情,也是决定教学水平高低的重要指标。如果将学员从不会编程到学会编程形容为从0到1的过程,那从学会编程到可以编写出更好的程序就是从1到100的过程,而这个过程也是决定该学员对于企业而言是属于60分合格、80分优秀还是100分卓越的关键。在这个过程中,学员的进步无法通过掌握语法与类库的累加来实现,而是必须在原有的、通过模仿套用现有案例完成代码堆叠的基础能力上,增加代码结构设计能力、工程代码管理能力以及代码问题分析、定位、调试与解决能力才能实现。总体而言,就是由掌握一门语言到可以独立承担一项工程研发任务的过程。其中最核心的任务便是帮助学员培养良好的编程思维与解决问题的能力。
上述两个方面在程序员的培养与成长过程中都非常重要,缺一不可。目前,市场上针对前者的课程、书籍与资料已经称得上汗牛充栋,但针对后者的学习资料却很少,即便找到寥寥数本,要么内容过于深奥复杂,仅仅书籍的厚度就让人“望而生畏”,要么太过零散简洁,犹如武林高手秘传的内功心法一般,令新人无从下手。本书的出现刚好填补了这一空白,其由浅入深地向读者讲述了写出好程序的思维与方法,并记录了作者丰富的编程思考与经验。
本书的译者是国内经验极为丰富的工程实践的优秀推广者,在其过往的工作中带领并培养出了在业内堪称具有优秀编程实践的研发队伍,对于研发人员的培养有深层次的体系化思考与实践。
我相信,无论是刚开始学习编程的“学员”,还是初入职场的编程“新人”,或者是具有一定编程经验的“老兵”,都可以从这本书中汲取到养分,收获良多。同时,这本书中的所思所得对于从事教学与培训行业的讲师与课程设计师而言,也有非常高的学习、借鉴与参考价值。
张喻 腾讯科技研发工程师
在编程的世界里,我是一枚逐梦者、是一名造梦者、亦是一位售梦者。
懵懵懂懂、跌跌撞撞、迷迷茫茫之间,撞入了程序的领域,是慌张,是欣喜,是困难,也是收获。或许和大部分的人类似,初次接触编程的时候,并没有激发我对编程的热情,只是用背诵代码的方式应付”考试“。直到我发现,助力我成功获得第一份工作的,并不是我背诵的那些少得可怜的语法,而是不知道什么时候刻入我骨子的clean code、思维方式和编程习惯。而伴随着由之而来的良性循环,从此让我成为了一枚逐梦者。
编程是一种方式,是让计算机做你想让它做的事情,让程序去解决现实中的问题。同时编程也是一门技艺,编写优美的程序需要高超的技巧和相当的审美观,就像是谱一首乐曲,音调应该是一致的。在编程界,造梦者既在倾听,又在献策,既是赶工,又行美好,你需要捕获难以捉摸的需求,并找到一种表达它们的方式,以便机器能够轻松的理解。在项目时钟的滴答声中,赶工完成一项项工作的同时,你每天都在一点点地创造奇迹。
结构化思维在一定程度上指引着我们,先形成骨架,再去填充细节,去丰满内容,思维就会有迹可循,布局就会颇有章法,解决问题就会更有效率。那么,在学习编程的初期,抑或是在有颇多编程经验之后再次回头梳理之时,编程习惯的养成,抽象概念的提取,对于编程这条路来说,就像是提高了前进的加速度。这本书清晰流畅、行云流水,言语之间无一不阐述着那些通用的编程技艺。阅读本书,将会从了解编辑器、IDE、版本控制、单元测试、测试程序、调试、重构、防御式编程、优化入手,磨炼基本功,进而培养良好的编程习惯,形成专业的风格和极致的治学态度,并在追求卓越的过程中积累习惯,将其变成编程道路甚至是人生道路上的一种修养,这也许是作者、译者、还有我这枚平凡的“程序媛”的售梦方式。
你,我,我们都已在编程的路上前行着,带着修行者的信念,坚定地行驶着。我相信,若是归途,星海共读。
程序,在计算机尚未普及的年代,对我们来说是一个神秘而又颇感高深的概念。然而,在如今的信息社会,我们每天都会与各种各样的程序打交道,我们的生活,早已无法离开程序,程序已成为数字化时代的一部分。
也正是这个原因,越来越多的同学和我们一样,选择了程序员这份职业。无论是编程的初学者,还是具有一定经验的程序员,抑或是从业多年的技术专家,编写出更清晰、更正确、更健壮的程序,都是我们追求的目标。
现在,我们可以很容易在市面上找到编程方面的书籍,它们或者是针对某一种语言的专业书刊,或者是某些技术细分领域的行业经验分享。但很少能有这样一本书:它通过具体的案例,清晰、系统地阐述编程技巧,并不限定于某一种语言,而是更关注传授可移植的编程技能。让读者能在掌握编程技巧的同时,也能理解其背后的思想。这些思想,正是设计优雅程序的精髓。
这是一本分享经验与指引我们少走弯路的经典书籍,针对如何设计优良的程序提出了实用、权威的指导。对初学者,它是一本不可或缺的入门指南;对从业多年的开发人员和技术专家,也具有相当高的参考价值。
我们几个译者是多年的同事和好友,也都在软件行业摸爬滚打多年。回想起在刚接触编程的时候,从刚开始谨小慎微的Hello World起步,再慢慢地开始编写能工作的程序,到如今设计复杂的系统架构。我们都不可避免地碰到过各种问题。比如:代码缺乏良好的可读性,致使维护效率低下;工作中缺乏良好的备份习惯,导致返工的时候成本太高等。所幸我们通过各种探索和总结,最终克服了这些问题。在翻译的过程中,我们多次感叹:如果能在从业之初就接触这本书就好了。
本书的作者Perdita Stevens是爱丁堡大学的教授,有着多年的编程和软件工程教学经验,她将教学过程中的经验提炼、总结并分享出来,我们在翻译本书的过程中,就好像在与一位编程大师对话。在本书中,Perdita Stevens教授娓娓道出的内容,对同样是读者的我们来说也是一笔宝贵的财富。
感谢我们的家人,本书的翻译占用了我们大量的业余时间,对此她们给予了极大的理解与支持。更为可贵的是,在本书的翻译过程中她们提供了很多专业的意见和建议。没有她们的支持,我们是很难顺利完成本书的翻译工作的。
在本书的翻译及出版过程中,机械工业出版社华章公司的编辑们逐字逐句地进行检查、校对和修改,从而提高了译文的质量。谢谢他们!
王磊、周训杰、万学凡 2021年于武汉
《如何写出好程序》通过丰富的小提示、故事和关键术语的解释,清晰地传授各种编程技巧。书中包含Python、Java和Haskell的示例,无论你正在学习哪一种编程语言,都能帮助你获得可移植的编程技能。
本书特色
主要内容
第1~3章,让我们开启编程学习之旅。
第4章将帮助你把正在学习的语言置于所有编程语言的视野中。
第5~11章是本书的核心,你很可能会频繁地翻阅这几章。
第12章和第13章专门讲述如何在编程课程中取得好成绩,如果你正在自学编程,完全可以跳过这些内容。
第14章和第15章是本书内容的扩展,希望能对你未来的编程生涯有所帮助。
为何要读这本书
适合谁读
如果你正在学习编程,那么本书再合适不过了。
如果你正在帮助其他人学习编程,本书也适合你。
如果你是一名专业的程序员,这本书不是为你准备的—但无论如何,欢迎你阅读它。也许你愿意把它推荐给别人。我热切期盼你的意见与建议。
最后,助你早日开发出易读、高效的好程序!
直播预告
扫码关注【华章计算机】视频号
每天来听华章哥讲书
更多精彩回顾
书讯 | 8月书讯(上)| 这些新书不可错过
书讯 | 8月书讯(下)| 这些新书不可错过
资讯 | Rust跨界前端全攻略
书单 | 2021半年盘点,不想你错过的重磅新书
干货 | Rust跨界前端全攻略
收藏 | 快收藏!!整理了100个Python小技巧!!
上新 | 【新书速递】深入浅出Pandas,用好Python必备