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