complete_code_Chapter2
时间: 2018-08-03来源:OSCHINA
前景提要
「深度学习福利」大神带你进阶工程师,立即查看>>>
《代码大全》读书笔记
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). 隐喻把软件开发过程中其他你熟悉的活动联系在一起,帮助你更好地理解。 有些隐喻比其他一些隐喻更贴切。 通过把软件的构建过程比做是房屋的建设过程,我们可以发现,仔细地准备是必要的,而大型项目和小型项目之间也是有差异的。 通过把软件开发过程中的实践比做是智慧工具箱中的工具,我们又发现,每位程序员都有许多工具,但并不存在任何一个能适用于所有工作的工具,因地制宜地选择正确工具是成为能有效编程的程序员的关键。 不同的隐喻彼此并不排斥,应当使用对你最有益处的某种隐喻组合。

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行