《675134 代码之外的功夫:程序员精进之路.pdf》由会员分享,可在线阅读,更多相关《675134 代码之外的功夫:程序员精进之路.pdf(130页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 图灵社区的电子书没有采用专有客 户端,您可以在任意设备上,用自 己喜欢的浏览器和PDF阅读器进行 阅读。 但您购买的电子书仅供您个人使用, 未经授权,不得进行传播。 我们愿意相信读者具有这样的良知 和觉悟,与我们共同保护知识产权。 如果购买者有侵权行为,我们可能 对该用户实施包括但不限于关闭该 帐号等维权措施,并可能追究法律 责任。 ? 图 灵 程 序 设 计 丛 书 人 民 邮 电 出 版 社 北 京 Programming Beyond Practices: Be More Than Just a Code Monkey 美Gregory T. Brown 著 李志 译 Beijing
2、Boston Farnham Sebastopol Tokyo OReilly Media, Inc.授权人民邮电出版社出版 代码之外的功夫: 程序员精进之路 内 容 提 要 本书虽然面向程序员,却不包含代码。在作者看来,90% 的程序设计工作都不需要写代码; 程序员不只是编程专家,其核心竞争力是利用代码这一工具解决人类社会的常见问题。以此作为出 发点,作者精心构思了8 个故事,以情景代入的方式邀请读者思考代码之外的关键问题: 软件开 发工作如何从以技术为中心转为以人为本? 透过故事主人公的视角,读者能比较自己与书中角色的 差异,发现决策过程的瑕疵,提升解决问题的综合能力。 书中的故事涵盖程序
3、员的整个软件开发生涯, 但经过了浓缩, 可供所有软件开发人员快速阅读。 定价:49.00元 读者服务热线:(010)51095186转600 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京东工商广登字 20170147 号 著 美 Gregory T. Brown 译 李 志 责任编辑 谢婷婷 执行编辑 回 春 责任印制 周昇亮 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315 网址 北京 印刷 开本:8001000 1/16 印张:7.75 字数:183千字 2018年 3 月第 1 版 印数:1
4、3 500册 2018年 3 月北京第 1 次印刷 著作权合同登记号 图字:01-2017-6481号 iii 版权声明 2017 by Gregory T. Brown. Simplified Chinese Edition, jointly published by OReilly Media, Inc. and Posts & Telecom Press, 2018. Authorized translation of the English edition, 2018 OReilly Media, Inc., the owner of all rights to publish and
5、 sell the same. All rights reserved including the rights of reproduction in whole or in part in any form. 英文原版由 OReilly Media, Inc. 出版,2017。 简体中文版由人民邮电出版社出版,2018。英文原版的翻译得到 OReilly Media, Inc. 的 授权。此简体中文版的出版和销售得到出版权和销售权的所有者OReilly Media, Inc. 的许可。 版权所有,未得书面许可,本书的任何部分和全部不得以任何形式重制。 OReilly Media 通过图书、杂
6、志、在线服务、调查研究和会议等方式传播创新知识。 自 1978 年开始,OReilly 一直都是前沿发展的见证者和推动者。超级极客们正在开创 着未来,而我们关注真正重要的技术趋势通过放大那些“细微的信号”来刺激社 会对新科技的应用。作为技术社区中活跃的参与者,OReilly 的发展充满了对创新的 倡导、创造和发扬光大。 OReilly 为软件开发人员带来革命性的“动物书” ;创建第一个商业网站(GNN) ; 组织了影响深远的开放源代码峰会,以至于开源软件运动以此命名;创立了 Make 杂 志,从而成为 DIY 革命的主要先锋;公司一如既往地通过多种形式缔结信息与人的纽 带。OReilly 的会
7、议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出 开创新产业的革命性思想。作为技术人士获取信息的选择,OReilly 现在还将先锋专 家的知识传递给普通的计算机用户。无论是通过书籍出版、在线服务或者面授课程, OReilly 的每一项产品都反映了公司不可动摇的理念信息是激发创新的力量。 业界评论 “OReilly Radar 博客有口皆碑。 ” Wired “OReilly 凭借一系列非凡想法(真希望当初我也想到了)建立了数百万美元的业务。 ” Business 2.0 “OReilly Conference 是聚集关键思想领袖的绝对典范。 ” CRN “一本 OReilly 的书就
8、代表一个有用、有前途、需要学习的主题。 ” Irish Times “Tim 是位特立独行的商人,他不光放眼于最长远、最广阔的视野并且切实地按照 Yogi Berra 的建议去做了: 如果你在路上遇到岔路口,走小路(岔路) 。 回顾过去, Tim 似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。 ” Linux Journal OReilly Media, Inc.介绍 v 目录 前言 .vii 第 1 章 善用设计原型,探索项目创意 .1 1.1 从理解项目背后的需求入手 .2 1.2 利用线框图表达功能需求 .3 1.3 编程之初立即搭建测试系统 .4 1.4 全面探
9、讨不足,改善追求实效 .6 1.5 早问多问,验证设想 .8 1.6 力求缩小自己的工作范围 .8 1.7 谨记原型并非生产系统 .12 1.8 巧妙设计特性,轻松收集反馈 .13 第 2 章 观察增量变更,发掘隐藏依赖 .19 2.1 不存在所谓的“独立特性” .19 2.2 两特性同屏必相互依赖 .21 2.3 避免不必要的实时数据同步 .23 2.4 复用旧代码,寻找新问题 .25 第 3 章 准确识别痛点,高效集成服务 .29 3.1 面对小众需求,切记未雨绸缪 .30 3.2 谨记外部服务并不可靠 .31 3.3 服务一旦有变,查找过期的模拟对象 .34 3.4 遭遇烂代码,维护必头
10、疼 .35 3.5 不存在纯粹的内部问题 .37 图灵社区会员 ChenyangGao(2339083510) 专享 尊重版权 vi 目录 第 4 章 设计严密方案,逐步解决问题 .39 4.1 收集事实,清晰描述 .40 4.2 写代码之前手动解决部分问题 .42 4.3 核实输入数据,随后进行处理 .44 4.4 善用演绎推理,检验工作质量 .46 4.5 欲解复杂问题,先知简单情况 .47 第 5 章 谨记自底向上,优化软件设计 .55 5.1 找出关键词,认清问题 .56 5.2 从实现最小化功能入手 .57 5.3 避免对象间不必要的时间耦合 .60 5.4 逐步提取可复用的组件与协
11、议 .63 5.5 进行大量实验,发掘隐藏抽象 .66 5.6 了解自底向上方法的局限 .67 第 6 章 认清现实瑕疵,改善数据建模 .71 6.1 分清概念建模和物理建模 .71 6.2 明确设计模型,追踪数据变化 .74 6.3 理解康威定律,实践数据管理 .78 6.4 谨记工作流设计与数据建模密不可分 .81 第 7 章 逐渐改善流程,合理安排时间 .85 7.1 敏捷、安全地应对意外故障 .86 7.2 识别并分析操作瓶颈 .88 7.3 注意权衡工作的经济效益 .89 7.4 限制积压工作,力求减少浪费 .92 7.5 力求整体大于部分之和 .95 第 8 章 认清行业未来,再议
12、软件开发 .101 作者介绍 .110 封面介绍 .110 前言 关于本书 本书不是教材,而是一本“故事集” 。书中收录的各个小故事可以指导你正确地对待软件 项目,并且更好地完成项目中的工作。 翻开本书,你不会找到任何教科书式的建议。相反,本书将为你呈现一系列案例。你将看 到一线开发人员在实践中真正遇到的问题,以及寻找解决方案的过程。 为了增强代入感并鼓励你在阅读时发挥创造力,本书将你作为每个故事的主角。如果你感 到有点怪怪的,这很正常。其实,我在写这篇介绍时也感觉挺怪的! 我希望这种情景代入方式可以让你学到更多,而不是觉得“这本书又是哪个编程专家口若 悬河的说教” 。我更希望你能提出这样的问
13、题: “如果我置身于此情此景,真的会像书中那 样做吗?如果不会,那是为什么呢?” 我建议你在阅读本书的过程中深入问题内部,从更深的层次反省自己的行为、习惯和看待 问题的方式。最好在读书时手边能有本笔记,一有想法就赶紧记下来,以便日后与朋友和 同事分享。本书中的概念需要经过思考和讨论,不能不求甚解地一带而过。 在每个故事里,你都会有不同的身份。每个情景都经过仔细的设计,能教给你有用的知 识。但最重要的是,你要注意比较真实的自己和我为你设定的角色,寻找其中的共同点和 值得深究的不同点。 没错,这样说好像有点急功近利了。但读书或写书的最终目的,不就是充实自己,让自 己变得更好吗?我们都在朝着这个方向
14、努力。有了你的配合和帮助,我觉得我们能够做 得不错。 好了朋友,系好安全带,我们要出发了。 vii viii 前言 本书概览 本书的故事覆盖整个软件开发生涯,但经过了浓缩,可供所有一线开发人员快速阅读。 在第 1 章中,你是能力很强的程序员,并且正在发挥技术特长,运用速成原型法帮助人们 探索新的产品创意。 在第 2 章中,工作变得复杂起来。你需要逐步扩展现有系统,同时需要为很多活跃客户提 供支持。你发现理想丰满而现实骨感:一方面,你想按照自认为正确的想法进行工作;另 一方面,客户不断给你施压,要求你尽快交付新的特性。 在第 3 章中,你对草率决策的代价,尤其是在整合外部代码的过程中仓促决策所带
15、来的损 失,有了更深的理解。你从过去的错误中学到很多,并开始关注业务、客户服务及技术工 作三者之间的复杂关系。 在第 4 章中,你已经成为了经验相当丰富的开发人员,并且有能力教别人如何看待编程和 解决问题。你现在已经开始指导新入行的朋友了。 在第 5 章中,你已经成为良师。你的开发经验已经非常丰富,足以单打独斗。即使是现场 演示,你也能从容应对。你运用这些技能给学生上课,教他们怎样填补理论与实践之间的 空白,将二者结合起来。 在第 6 章中,你在通往大师的道路上继续前行。你可以指出公司遗留系统的弱点,并设计 合适的组件进行替换,既使商业效果得到优化,又使工作流程更加友好。 在第 7 章中,你对
16、整个软件行业都已经足够熟悉。无论组织的哪个层级出现问题,你都能 发现并修复。你的核心竞争力仍然是软件开发,但足够丰富的经验使你能很好地与各个层 级的人员进行交流。 在第 8 章中,你开始思考整个计算机行业的发展问题。此刻,你可以自由选择自己未来的 职业发展道路,所以现阶段最重要的问题变为:自己将如何发展,以及为何作此抉择? 由于软件开发人员的职业发展路线更像是螺旋线而非直线,因此无论你现在处于哪个阶 段,我都建议你通读所有章节。 我写下的这些故事适用于不同水平的读者,本书也并不会给“初级”和“高级”划分界 限。每一章都是独立的,所以也可以不按顺序阅读但想要获得最好的效果,还是逐页 阅读为好。
17、前言 ix Safari Books Online Safari Books Online()是应运而 生的数字图书馆。它同时以图书和视频的形式出版世界顶级技术 和商务作家的专业作品。技术专家、软件开发人员、Web 设计师、 商务人士和创意专家等,在开展调研、解决问题、学习和认证培训时,都将 Safari Books Online 视作获取资料的首选渠道。 对于组织团体、政府机构和个人,Safari Books Online 提供各种产品组合和灵活的定 价策略。用户可通过一个功能完备的数据库检索系统访问 OReilly Media、Prentice Hall Professional、Addi
18、son-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、 Jones & Bartlett、Course Technology 以及其他几百家出版社的上千种图书、培训视频和正 式出版之前的书稿。要了解 Safari Books Onlin
19、e 的更多信息,我们网上见。 联系我们 请把对本书的评价和问题发给出版社。 美国: OReilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 中国: 北京市西城区西直门南大街 2 号成铭大厦 C 座 807 室(100035) 奥莱利技术咨询(北京)有限公司 OReilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示 例代码以及其他信息。本书的网站地址是: 对于本书的评论和技术性问题,请发送电子邮件到:bookquestions 要了解更多 OReilly 图书、培训课程、会议和新
20、闻的信息,请访问以下网站: 我们在 Facebook 的地址如下: x 前言 请关注我们的 Twitter 动态: 我们的 YouTube 视频地址如下: 致谢 一本书就像一条辛苦织就的毯子,而作者只编织了其中的一部分。由于其自身的特殊性, 本书尤其依赖他人的帮助和贡献,单靠我自己完全不可能完成这项工作。 首先,我要感谢你。本书的宗旨是为你服务,但依然要靠你自己挑起大梁。你花在本书上 的时间和精力是我无法奢求的,我非常感谢这一点。 这部作品的完成需要感谢多位优秀的策划编辑:Jeff Bleiel、Brian MacDonald,以及 Mike Loukides。Mike 说服我编写本书,并自始
21、至终都提供支持与反馈。Brian 帮助我度过了写 作本书的早期阶段。Jeff 不知疲倦地和我一起工作,帮助我度过了写作项目最艰难的阶段: 将潦草的手稿变为值得阅读的篇章。 我也非常幸运地拥有一支极其优秀的技术审校团队,其成员包括 Michael Feathers、Nell Shamrell、Saron Yitbarek 以及许多提供了有益反馈的“无名英雄” 。针对作品的早期草稿, Ward Cunningham 也大致提供了一些富有见地的想法。 本书的文字编辑是 Stephanie Morillo,她将一堆杂乱的词句整理和润色成优美的语言,以飨 读者。这本奇特的小书需要一个极其优秀的人来担当文
22、字编辑,Stephanie 做得非常完美。 Kristen Brown 做事一丝不苟,并用细心和耐心主导了本书的出版过程。图书制作是我开始 写本书时最担心的问题,但我们一开始合作,我的担忧就烟消云散了。 虽然本书很薄,但它是我和世界各地数百位慷慨的优秀人士之间千千万万次对话和共享经 历的结晶。下面列出了其中的几十位,但这只是为本书提供过帮助的人中很小的一部分。 Ben Berkowitz、Sarah Bray、Florian Breisch、Melle Boersma、Ben Callaway、Christian Carter、Joseph Caudle、Mel Conway、Kenn Cos
23、tales、Liam Dawson、Donovan Dikaio、 Brad Ediger、Martin Fowler、Gregory Gibson、Melissa Gibson、Eric Gjersten、James Gifford、James Edward Gray II、David Haslem、Brian Hughes、Ron Jeffries、Alex Kashko、 Kam Lasater、Tristan Lescut、Alexander Mankuta、Joseph McCormick、Steve Merrick、Alan Moore、Matthew Nelson、Carol N
24、ichols、Calinoiu Alexandru Nicolae、Stephen Orr、Bruce Park、Srdjan Pejic、Vanja Radovanovic、Donald Reinertsen、Pito Salas、Clive Seebregts、 Evan Sharp、Kathy Sierra、Derek Sivers、Danya Smith、Hunter Stevens、Jacob Tjrnholm、 Gary Vaynerchuk、Jim Weirich、Solomon White、Jia Wu、Jan k 前言 xi 其中几个人是以他们的工作成果间接地启发了我,但绝大
25、部分人贡献出了他们宝贵的时间 和我交流想法、讨论项目,启发了我在过去一年里研究和写作这个话题。 最后要强调的是,我要感谢 OReilly Media 所有为本书付出过劳动的员工,还要感谢 Tim OReilly,是他创建了这一如此优秀的出版公司。这本小书的出版过程奇特而又艰难,是 所有人的竭力相助,才使本书最终得以问世。 电子书 扫描如下二维码,即可购买本书电子版。 1 第1 章 善用设计原型,探索项目创意 假设你在一家代理机构工作,负责指导客户做早期产品设计和项目规划。 不论做什么产品或项目,首要任务都是尽快发掘和实现客户头脑中的需求。在项目刚刚起 步时,对话和绘制线框图是很有用的方法;但紧
26、接着就应该进入探索式编程阶段,因为仅 凭对话或画图能带给你的启发非常有限。 尽早生成可工作的软件,可以令产品设计变成交互式协作过程。高效的反馈环有利于快 速识别潜在的不良设计,并对此提出解决方案,以免日后在更关键的阶段浪费大量时间 和精力。 再简单的软件系统也是由很多活动的组件构成的,所以在设计的早期阶段就让它运转起 来,看看组件之间的相互作用,是很有好处的。虽然所做的项目千差万别,但在这一层面 上,所有项目都是相通的。 这一周,你将会和你的同伴 Samara 一起给一个音乐视频推荐系统开发功能原型。最初的 特性集不需要打磨得多么完美,只要能实现基本功能,并从对产品感兴趣的人那里收集反 馈即可
27、。 本章主要内容 你将学到如何运用探索式编程技术,在开发过程开始后的几小时之内为产品 创意构思出有意义的概念验证方案。 2 第 1 章 1.1 从理解项目背后的需求入手 对这个崭新的音乐视频推荐系统,你闻所未闻,所以不知道应该对它有何期待。于是,你 约见了你的客户 Ross,想和他简单聊聊,以便了解从何处入手。 你:Ross,你好!感谢你的接待。我的开发伙伴 Samara 也在听咱们的谈话。如 果你方便的话,咱们随时可以开始。 Ross:好的,我已经准备好了。第一步要做什么? 你:是这样,我想先听一下你的想法。你为什么会对音乐视频推荐感兴趣呢?了 解这一点可以帮助我们确定在原型设计过程中应该重
28、点关注哪些问题。 Ross:可以,没问题。我们开了一个博客,在里面发布一些精选音乐视频列表。 这个博客到现在已经开了有好几年了。我们有专业的合作方,专攻各个种类的音 乐列表制作。不过,人们如果想要查看某个列表,需要手动搜索。 几年来,我们在博客上分享了 4000 多个视频,已经形成一个相当大的音乐库, 但现在唯一的检索方式仍然是查找博客文章。 我们现在开始考虑怎么能更便捷地检索音乐库。考虑了几种方案之后,我们认为 构建一个推荐系统之类的东西也许行得通。 最初的版本可以比较简单,但最好能尽快做出点东西来。我们想先将它呈现给几 十个最活跃的社区用户和博客内容贡献者。 你:这个项目听起来很不错!那咱
29、们开始干活吧! 了解了基本主题之后,你和 Ross 又聊了几分钟,大致探讨了概念验证方案。这类项目 经常需要面对的一个问题是,新系统是要作为独立项目,还是要和现有的某些系统整 合在一起。 Ross 自己也不是很明确自己的需求。你提出细节问题都可以暂时搁置,现在应该集中精力 探讨这个想法究竟是否可行,他表示同意。 你们深入讨论了如何设计软件原型,以便让音乐视频博客的读者更容易上手。最终, 你提出了一个简单易行的解决方案:用博客搜索视频,并将搜索结果作为原型中的样 本。通过这种方法,新推荐系统中的内容对于 Ross 和博客读者来说都是熟悉的,而且 新的应用和原来的网站之间会有很清晰的联系,即使二者
30、在技术层面上是用完全不同 的两套代码实现的。 善用设计原型,探索项目创意 3 1.2 利用线框图表达功能需求 弄清楚几个整体性问题之后,你把注意力转回到方法论上来:如何开始项目的第一轮开 发。通常在这一阶段,绘制线框图非常有帮助。你可以通过线框图向大家解释待开发应用 的基本结构,同时让大家都了解需要完成什么工作,以免因过度关注技术细节而迷失了大 方向。 你建议不要花费过长时间去讨论推荐系统的实现方式,而应该先集中精力寻找“最简单可 行的方法” 。1 你:刚开始设计用户界面时,我们可以从居中前置的视频播放器这个页面入手。 在播放器下面可以放几个推荐视频的缩略图,这几个推荐视频是根据正在播放的 视
31、频选出来的。你觉得这个设计怎么样? Ross:不错,这样说好像挺有道理的。但我可能得见了实际效果才能知道具体 情况。 你:趁着我们聊天,Samara 一直在忙着画线框图。这张图应该能为我们的工作 开个好头。稍等,我把图上传一下 注 1:这一观点( Ward Cunningham 提出,目的在于提醒人们注意工作的最根 本目标,不要因为过多地考虑收益损失而迷失方向。 4 第 1 章 你:你觉得如何?我们把问题尽量简化了,这样工作会比较好上手。 Ross:看起来还不错,跟我在别的网站上看到的视频播放器差不多。这对我们 的用户来说应该挺容易理解的。 你:太好了!在我们继续讨论之前,我和 Samara
32、想根据这张图做一个真实的网 页。所有的图片都将用占位图模拟,所以做这个网页不会花太长时间。我们要用 这个模拟网页测试一些基本想法,好让余下的工作顺利进行。 Ross:没问题,如果你们觉得有帮助,就去做吧。 此刻你已经鼓足干劲,但是 Samara 好像有点茫然。你问她怎么回事,她解释说,就在你拿 着她的线框图向 Ross 询问反馈的那一瞬间,她脑中灵光一闪,想到了一个更好的界面设计。 Samara 提出用一种新的播放器来代替原有的推荐方式。她表示可以在播放一个视频时引入 “赞”和“踩”的按钮,这样观众可以表明自己的偏好;再加一个大大的“下一个视频” 按钮,点击一下就能立即播放一个新推荐的视频。这
33、有点像看电视时的换台操作,但智能 系统可以预测出接下来观众可能想看的内容。 这个新想法非常不错,但是实现起来可能不太容易。在你们稍微权衡利弊之后,Samara 同 意先实现前一个简单的想法,毕竟这样能更快将真实的网页交到真人手上测试使用。 1.3 编程之初立即搭建测试系统 速成原型法的意义是拉近项目中每个参与者之间的距离:不仅是开发人员和客户之间,也 包括客户和用户之间。 要达到这些目标,搭建一个人人都能使用的交互系统很有必要。这样做不仅可以鼓励大家 亲自操作和试验,而非纸上谈兵,还能让大家更方便地了解你的进度。有了这种想法,你 便开始进入编写和发布 Web 应用的日常流程。 由于你使用了一个正规的应用托管平台,因此这种流程无非就是用你最喜欢的框架新建一 个 Hello World 页面,然后把代码推送到一个支持你所用的工具链的 Git 仓库。从这一步开 始,平台就可以自行安装所需依赖项,并自动启动 Web 服务器。 尽管这个