complete_code_Chapter2 原

《代码大全》读书笔记

Chapter2 Mataphors for a Richer Understanding of Software Development

第 2 章 用隐喻来更充分地理解软件开发


2.1 The importance of Metaphors

2.1 隐喻的重要性

通过把你不太理解的东西和一些你较为理解、且十分类似的东西做比较,你可以对这些不太理解的东西产生更深刻的理解。这种使用隐喻的方法叫做“建模(modeling)”.

2.2 How to Use Software Metaphors

2.2 如何使用软件隐喻*

算法和隐喻的区别

  • 算法是一套定义明确的指令,使你能完成某个特定的任务。
  • 算法是可预测的(predictable)、确定性的(deterministic)、不易变化的(not subject to chance)。
  • 启发式方法(试探法)是一种帮助你寻求答案的技术,但它给出的答案是具有偶然性的(subject to chance),因为启发式方法仅仅告诉你该如何去找,而没有告诉你要找什么。
  • 一个告诉你如何从A点到B点的算法,不会让你绕路,不会让你额外地经过D、E、F等地方,更不会让你停下来闻闻玫瑰花或喝咖啡。
  • 启发式方法并不会告诉你该如何直接从A点到达B点,它甚至可能连A点和B点在哪里都不知道。

举个例子来说,驾驶汽车到达某人的家,写成算法是这样的: 沿167号告诉公路往南行至Puyllap;从South Hill Mall出口出来后往山上开4.5英里;在一个杂物店旁边的红绿灯路口右转,接着在第一个路口左转;从左边褐色大房子的车道进去,就是North Cedar路714号。

用启发式方法是这样的: 找出上一次我们寄给你的信,照着信上的寄出地址开车到这个镇;到了之后你问一下我们的房子在哪里。这里每个人都认识我们——肯定会有人愿意帮你的:如果你找不到人,那就找个公共电话亭给我们打电话,我们会出来接你。

那么该如何使用软件中的隐喻呢?应该用它来提高你对编程问题和编程过程的洞察力;用它来帮助你思考编程过程中的活动,想象出更好的做事情的方法。你不可能看到一行代码并说它违反了本章所描述的某个隐喻。但随着时间的流逝,人们会发现,相对于不善于运用隐喻的人来说,那些使用隐喻来照亮自己的软件开发过程的人,他对于编程的理解会更好,并且能够更快的写出更好的代码。

2.3 Common Software Metaphors

2.3 常见的软件隐喻

Software Penmanship:Writing Code

软件中的书法:写作代码

对于个人规模的工作乃至小型的项目来说,这种写信的隐喻已经足够了,然而对于其他场合而言,这个隐喻还远远不够——它没有完整的、充分刻地刻画软件开发工作。

Software Farming:Growing System

软件的耕作法:培植系统

Software Oyster Farming:System Accertion

软件的牡蛎养殖观点:系统生长

你需要学会如何一次为软件系统增加一个小部分。跟“生长”密切相关的另一些词语有:“增量的(incremental)”、“迭代的(iterative)”、“自适应的(adaptive)”、以及“严谨的(evolutionary)”。以增量的方式进行设计、编译和测试,都是目前已知的最强有力的软件开发概念。 在进行增量式开发时,我们先做出软件系统的一个尽可能简单、但能运行的版本。它不必接受真实的输入,也无须对数据进行真正的处理,更不用产生真实的输出——它仅仅需要构成一个足够强壮的骨架,支撑起未来将要开发的真实系统。对于你标志出的每一项基本功能,可能仅需要调用虚假的类(dummy class)。这个最基本的起点,就像牡蛎开始孕育珍珠的那颗细小沙粒。 在骨架形成之后,你要一点点地在其上附着肌肉和皮肤:把每个虚假的类替换为真正的类;不再假装接受输入,而是把接收真实输入的代码替换进去;不再假装产生输出,而是把产生真实输出的代码替换进去。你一次增加一小部分代码,直到得到一个完全可以工作的系统。

Software Construction:Building Software

软件构建:建造软件

建造软件的这一说法暗示了软件开发过程中存在着诸多阶段,如计划、准备及执行等,根据所建造软件的不同,这些阶段的种类和程度可能会发生变化。进一步研究这一隐喻时,你还会发现许多其他方面的相似之处。 当开发软件时,你会大量使用高级语言所提供的功能,而不会自己去编写操作系统层面的代码。你可能还要用些现成的程序库,比如说一些容器类(constainer class),科学计算函数、用户洁面组件、数据库访问组件,等到。总之,自己编写那些能买得到的现成的代码通常是没有意义的。 精心计划,并非意味着事无巨细的计划或过度的计划。你可以把房屋结构性的支撑(structural support)规划清楚,而在日后再决定是用木地板还是地毯,墙面漆成什么颜色,屋顶使用什么材料,等等。一项规划得当的项目能够提升你“在后期改变细节(设计)的能力”。你对同类软件的开发经验越丰富,(在开发新软件时)就能认准更多的细节。你只需要保证已经做了足够的计划,不会到后来因为计划上不足而引发重大问题。

Applying Software Techniques:The Intellectual Toolbox

应用软件技术:智慧工具箱

技术并不是规矩(rule),它只是分析工具(analytical tools).好的工匠知道完成某项工作要用哪样工具,也知道该怎样正确地使用。程序员也该这样。编程方面的知识学的越多,你脑中的工具箱中就会有更多的分析工具,也会知道该在何时用这些工具,以及怎样正确地使用它们。 在软件领域里,专业的咨询人员有时会让你用某种软件开发方法而远离其他方法。这样并不妥当,因为当你百分之百地依赖于某一方法论时,你就只会用一种方法去看世界了。某些情况下,对于你所面临的问题还有其他更好的方法,你可能错失良机。这种“工具箱隐喻”能够帮助你把所有的方法、技术以及技巧留在脑海中——合适的时候即可拿来就用。

Key Points

要点

  • 隐喻是启示而不是算法。因此它们往往有一点随意(sloppy).
  • 隐喻把软件开发过程中其他你熟悉的活动联系在一起,帮助你更好地理解。
  • 有些隐喻比其他一些隐喻更贴切。
  • 通过把软件的构建过程比做是房屋的建设过程,我们可以发现,仔细地准备是必要的,而大型项目和小型项目之间也是有差异的。
  • 通过把软件开发过程中的实践比做是智慧工具箱中的工具,我们又发现,每位程序员都有许多工具,但并不存在任何一个能适用于所有工作的工具,因地制宜地选择正确工具是成为能有效编程的程序员的关键。
  • 不同的隐喻彼此并不排斥,应当使用对你最有益处的某种隐喻组合。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏知晓程序

这个由设计师亲手开发的小程序,就是这么简洁好看 | 晓组织 #16

我热爱生活,是个理想主义者,也是个射手座。我热爱文学,却学了设计,我热爱设计,却学了开发。我想,我所做的一切,只是想更准确地表达自己。

981
来自专栏吾真本

架构操练Kata:干货大会

http://nealford.com/katas/list.html;译者:伍斌、王瑞鹏

1144
来自专栏Python专栏

头条 Python 工程师面经分享:一年经验也能进大公司!

文章链接:https://www.rapospectre.com/blog/2017-backend-interview-share

3712
来自专栏微信公众号:Java团长

很认真的聊一聊程序员的自我修养

大公司有厉害的程序员,优秀的架构师,但大量的小公司也有很多普通的程序员。在我这些年的工作经历中,也越来越深刻的感受到普通程序员的影响和力量。对于高阶程序员,所谓...

1032
来自专栏大数据挖掘DT机器学习

Python、 R 语言、SAS、SPSS 的优缺点比较

(致各位挚爱的数粉,因近期小编忙于处理其他急事,未能及时回复给大家资料链接,且微信公众号目前已经限制必须在48小时内回复,否则公众号后台消息发不出去,导致现在仍...

5429
来自专栏大数据钻研

为什么编程那么难?是我脑子不行吗?

 “现在,导航到那个你希望程序在终端中打开的小文件夹。好的,下面需要在PATH文件夹中创建符号链接,但是,在我们创建之前,先使用nano ~/.bash_pro...

2923
来自专栏SDNLAB

关于DCI中传输网络的一些探讨

前言 关于DCI技术的探索,最近很是热门,尤其是在SDN-WAN被大家重视起来后,关于DCI技术的介绍文章层出不穷。本文着重对DCI网络中传输网络部分的技术和现...

4017
来自专栏老九学堂

与程序打交道的九年里,我的爱恨情仇...

一次做规划局的项目,规划局的职员很是钦佩地说:“你们真了不起,在电脑上敲敲键盘就能做出软件来。”

840
来自专栏大数据挖掘DT机器学习

如何处理 Python 入门难以进步的现象?

问题: 如何处理 Python 入门难以进步的现象? 看视频看呀看呀看, 看完了,基础的都懂了 然后就想写点东西 可是无从下手呀,我以为基础不扎实,又去看视...

3784
来自专栏北京马哥教育

头条 Python 工程师面经分享:一年经验也能进大公司!

博主本人 2015 年毕业于郫县某 985 大学通信工程系,因为大学期间一直自己创业所以错过了大四秋招春招,毕业后又在北京继续创业一年,但在创业公司一直无法沉淀...

1533

扫码关注云+社区

领取腾讯云代金券