推荐序
编程魔法的麻瓜入门手册
在看一个涉及旧房改造的电视综艺节目时,我突然意识到一件事:同样是需要大量知识和实践作为基础的专业人士,程序员似乎从来没有得到像建筑师那样来自普罗大众的认可与尊重。究其原因,我想可能部分原因是程序员的工作太缺乏可见性,以至于那些不懂技术的麻瓜们对程序员的印象要么是盲目崇拜,要么是盲目轻视,总之没有那种平等而深入的交流方式。尤其在英语极不普及的中国,天书一般的程序代码更是让麻瓜们望而却步,遑论去理解和交流。像本书译者、我的同事佟达所遭遇的“家人不知道我一天到晚在干些啥”的困扰,对于广大中国程序员而言恐怕是家常便饭。
本着帮助麻瓜进入魔法世界的崇高理想,Steven Foote写了这么一本精彩的编程入门教材。相比常见的高校编程教材,这本《一路编程》最大的好处是它的“不求甚解”——作者堂而皇之地宣称:你不知道一行程序代码背后那些魔法是怎么发生的吗?无所谓!“你不需要知道那些指令是什么,或者理解它们的工作原理,只要它们能用就行。”这么一来,读这本书入门的麻瓜们可就比它们大部分在学校里上编程课的同侪们更有希望:当那些抱着大部头教材的学生们正在被指针地址等高深的魔法细节吓破胆时,这本书的读者倒是——像已经在干着程序员这份工作的人一样——放心大胆地忽视绝大部分细节,写出一两个能运行的程序,并从中获得继续学习必不可少的成就感。
其实——出乎麻瓜们的意料——绝大部分的软件开发根本不是什么火箭科学。就像我经常跟朋友打趣说的,我们写这些程序连四则运算都用不全,主要除法不怎么用。相比科学,软件开发其实更像一种工匠手艺(craft)。使一个优秀的程序员区别于平庸程序员的,正如Neal Ford在《卓有成效的程序员》中所说,是好的习惯和趁手的工具。Foote很准确地抓住了这一点。在快速介绍Javascript编程之后,他迅速而不失全面地介绍了体面的前端程序员应该用到的全套工具箱:命令行、构建工具、数据库、正则表达式、测试工具、文档……招聘时我们常会对着候选人提交的一个光秃秃的源代码文件挠头,只有经历过这种痛苦的人才会知道,候选人提交的代码作业有Grunt构建脚本甚至有单元测试是一件多么令人愉悦的事。
处在当今这个数字化浪潮方兴未艾的时代,能让麻瓜顺利学会编程(或者至少对编程有点概念),其意义超出家庭和谐的层面。中国无比巨大的IT需求,与有限的IT人才供应之间的矛盾,近年来不仅没有缓解,倒有愈演愈烈之势。另外,众多出身、学历平平的青年人有志于投身IT这个大有前途(至少有“钱途”)的行业,却苦于迈不过入门的门槛。如果有更多的学校、企业、培训机构照着Foote这个思路,用深入浅出、符合直觉、又贴合行业最佳实践的方式来给这些青年人提供指导,不仅能创造若干就业机会,说大一点更是为“互联网+”宏观战略提供人才支撑,善莫大焉。
最后,祝各位读者阅读愉快,祝佟达及广大程序员都得到家人更多的理解与支持,祝更多麻瓜走进编程这一神秘的魔法世界。
ThoughtWorks总监咨询师 熊节
2016年11月
译者序
这是最好的时代,也是
最坏的时代
在中国,IT从业者有数百万人之多,但这其中,称得上会编程的,不会超过十分之一。
我所说的会编程,绝不仅仅是会写代码,而是包括环境搭建、版本管理、构建管理、单元测试、文档编写、团队合作,以及任务拆分在内的综合技能。很多人——包括我自己——一开始都无法理解,一个程序员除了写代码,为什么还需要懂这么多东西。
当年在学校,有幸参加一个学生团体,利用课余时间做点小项目。第一次几个人一起写代码,还有点小激动。然而激动并没有延续很久,过了两天,当大家准备把各自写的代码合到一起时,发现这是个根本无法完成的任务,每个人都有自己的想法,从代码组织方式,到代码风格,甚至连IDE都不一样。那是第一次感受到,真正的软件开发,和写C语言程序设计的作业完全不一样。
2009年年底,我到微软亚洲研究院的创新工程中心实习,当时的部门负责人是邹欣,他是《移山之道》和《构建之法》的作者。进组的第一天,我就拿到几张纸,上面写着一些基本的编码规范。分配给我的电脑上环境已经准备好,从TFS上签出项目代码,在项目文件中的编译选项已经配置好,直接运行编译,之后执行脚本就可以将服务跑起来。从新人进组到可以开始工作,不到一天时间,真是让我眼界大开。当然,这才是开始,后面从代码提交,到工作项分配,再到上线部署,每一件事都在刷新着我对软件开发的理解。不过,作为一个小小的实习生,那时的我只想安安静静地写代码,没有仔细思考这些专业工作背后的意义。
我毕业后的第一份工作就职于一家研究所,所在的部门人员能力都很强,但是因为信息相对闭塞,对于现代软件开发方法并不是很了解,所以开发团队的很多做法都比较原始,导致需要花费大量的时间和精力在管理代码版本、修复由于更新代码导致一些已有功能不能用的bug等上。我尝试将在微软亚洲研究院学到的那些知识引入到团队中,觉得只要搭建起TFS,就水到渠成了。可惜现实狠狠给我上了一课,搭建TFS其实是所有事情中最简单的,设定编码规范、规范代码提交流程、统一编程环境、编写自动化脚本等,每一件事都非常困难。这时我才意识到,如果一个团队中大部分人都不了解这些现代软件开发的知识,靠一两个人去推动,几乎不可能。
后来,我来到ThoughtWorks,发现这里每个人都能够熟练使用Git管理代码,使用Gulp、Maven、SBT等管理构建构成,还会写大量的自动化测试来保证质量。从代码修改到测试环境上线,只需要5分钟时间,整个过程不需要人参与,程序员们只要看着屏幕上的流水线走到最后亮起绿灯,就可以安心地做下一个任务。后来有人给这种工作方式起了个很直观的名字,DevOps,中文叫作“开发自运维”。 在这里,我了解到了为什么需要敏捷开发,为什么要做持续集成、持续交付,为什么要组建全功能团队。以前对于软件开发的很多疑惑,都慢慢解开了。我常常想,要是我在还没毕业的时候,就知道这些事情,会少走多少弯路啊!
最近几年,参与了几次技术咨询项目,接触到更多软件开发者。很多业界有名的公司,实际上软件开发人员的技能非常不足。完全不理解软件工程任何概念的程序员大有人在,不会使用命令行工具、不知道如何处理代码冲突、从不做单元测试、基本上全靠网上搜索一些代码片段来完成任务,这样的人真心不能算会编程。当然也不乏一些在日常工作中有思考,能够理解软件开发的痛点,但是苦于不知道如何改进的程序员。因为从来没有人告诉他们怎么做才是正确的编程方式。
现在市面上对于每一个流行的技术都有大量的书籍文档做介绍,然而,唯独缺少一类书,告诉读者如何才能做一名合格的程序员。事实上,我自己以前也一直认为,要想成为一名合格的程序员,需要读很多不同方面的书。直到我看到了本书。
当时接下这本书的翻译,初衷是想要将这本书送给我当时的女朋友,现在的妻子,因为她刚好也是会计,和本书作者在转行做程序员之前的职业一样。我的本意是通过这本书,让我的妻子也可以对编程感兴趣,能够理解我每天对着电脑到底是在干什么。然而当我翻译到第4章,介绍JavaScript构建工具那部分时,我发现这本书并不是我一开始想的那样,它不只是一本介绍如何写JavaScript代码的入门书。在只有两百多页的书中,作者对所有软件开发相关的技能都做了介绍。对于每个编程必备技能,作者仅仅介绍其在日常开发过程中最常用到的一些知识,用20%的篇幅,把80%的场景都覆盖到了。不仅如此,因为作者自己从对编程一无所知开始学习,所以在介绍一些相对难理解的概念时,能够设身处地地从初学者角度着想,用直白的语言,将一些概念解释出来。尽管可能从专业人士角度看,不算非常严谨,但对于日常开发工作来说,刚好够用。
对于程序员来说,这是最好的时代,物联网几乎改变了所有行业,甚至已经有人在提“程序员拯救世界”这种说法,作为程序员,我们应感到自豪;然而,这也是最坏的时代,软件开发对程序员的要求越来越高,20年前也许会用HTML设计网页已经非常厉害,但今天你需要会很多不同的技能才能成为一名合格的程序员。如果你希望能够在软件开发这条路上一直走下去,本书可以帮你迈出坚实的一步。
感谢本书的编辑符隆美,在翻译本书期间给我不少鼓励,让我能够坚持译完本书,没有她的帮助,本书不可能完成。
佟达
2016年11月
前言
我为什么写这本书
像大多数伟大的(会计师)故事一样,我的故事开始于一个Excel电子表格。那是2008年,我正在犹他州普若佛的杨百翰大学学习会计,同时在法学院图书馆做接待员。一天,我的老板问我知不知道如何在Excel里把一列名字随机打乱顺序。“当然,”我骗了他,然后去做了每一个说了大话的人都会做的事:谷歌一下。谷歌给我展示了至少三种能够在Excel中打乱列表顺序的不同方法。2分钟后,我就把打乱顺序的列表交给了老板。就在那时,她认定我很擅长计算机,应该去图书馆系统部工作。我不太确定是不是用谷歌检索东西的天赋就等于擅长计算机,但我很感激她这么认为。
我的编程之旅就是从法学院图书馆系统部开始的。第一天,我的老板给了我一本有着25年历史的书——《Perl编程》,并向我展示了我的桌子,坐落在一个没有窗户的房间,上面杂乱地堆放着老旧的计算机、键盘和显示器。临走之前,他告诉我,他正忙着其他事情,但是在他回来之前,这个Perl教材会让我一直有事可做。我翻开书,开始阅读,那是我从没有过的感受。
那本书写于Windows尚未出现之时,所以它假定读者在用UNIX操作系统(我从没听说过UNIX)。我忽略了这条,继续使用我的Windows XP计算机,它刚刚从图书馆计算机实验室退休(在此之前,我从没听说一台计算机对于一个图书馆计算机实验室来说太老了的这种事)。那本书说,给某个地址寄一封贴好邮票的回邮信封,就会收到一张存着Perl的软盘。我决定不邮寄而使用我的谷歌技能,找到下载和