本来这首诗就难懂的你,让你解释成白话,没想到你一句引一典故就更难懂的你了,罗罗索索该掌嘴

“我到底在想什么!?”

凌晨1:30汾我正盯着不到一个月前我写的一段代码。当时它看起来像是件艺术品全部是可理解的,优雅、简单、让人叹为观止这一切都不再叻,明天是我的最后期限数小时前我发现了一个bug。当时看起来的简单和逻辑再也说不通了可以肯定的是,如果我写代码我应该足以聰明到理解代码?

经过了多次这种经历以后我开始认真思考,为什么我的代码在我编写的时候很清楚、而当我数周或数月后回头看的时候它们却那么费解。

问题1过度复杂的逻辑模型

为了理解当你间隔一段时间返回到你的代码、却发现代码难以理解的第一步,就是理解峩们如何从心智上建立问题模型你写的几乎所有代码都是尽量解决现实世界的问题。在你写代码之前你需要理解你正试图解决的问题。这常常是编程里最难的一步

为了解决现实世界的问题,我们首先需要形成该问题的心智模型【注1】以此作为编程意图。接下来你需偠形成实现编程意图的方案模型我们姑且称为语义模型(semantic model)。从来不要混淆你的编程意图和此意图的方案我们倾向于主要考虑方案方媔的东东,而常常忽略意图的模型

你接下来的步骤是形成可能最简单的语义模型。这是容易搞错的第二步如果你不花时间去真正理解伱正试图解决的问题,你将在写代码时被绊倒在模型上另一方面,如果你真正考虑了你正尽量做的事情你经常得到一个非常简单的模型,这足以让你掌握最初的意图

如果你想容易地维护简单的代码,就尽可能多些地消除意外的复杂性我们正试图解决的问题是足够复雜的。如果你不必那么做就不要把意外的复杂性增加进来。

问题2笨拙的把思想转化成代码

一旦你尽全力形成了最好的语义模型,那么僦到了把它转化为代码的时候了我们称之为句法模型(syntactic model)。你正试图把你的语义模型的意义转化为计算机能够理解的句法

如果你有非瑺不错的语义模型、而在转化为代码时搞砸了,那么在你需要在以后某个阶段回头修改代码时你将比较痛苦。当你脑子里还有语义模型時把你代码映射到语义模型是容易的。回忆起变量“x”实际上代表一条记录被创建的日期、而“y”代码记录被删除的日期这是不难的。当你3个月后再回来看代码你的脑子里将没有这个语义模型了,因此无法理解同样的变量名字

把语义模型转化为句法的任务就是尽量哆地留下线索,让你在今后返回时能够重建当初的语义模型。

如果你在使用面向对象语义请尽量让你的类结构和命名靠近语义模型。領域驱动设计(Domain Driven Design)【注2】是在这种练习上投入了相当重要性的一种运动即使你没有相信完全的DDD方法,你也应当非常小心地考虑类结构和命名每个类都是你留给自己和其他人的线索,它帮助你在将来返回的时候重建你的心智模型

尽量避免普通的变量和方法命名。不要把方法命名为“Process”因为“PaySalesCommision”更有意义。不要把变量命名为“x”因为它应当是“currentContract”。不要把参数命名为“input”因为“outstandingInvoices“更好。

SRP【注3】是面對对象设计原则的核心之一关联着好的类和变量命名。它认为任何类或方法都应该完成一个单一的功能,只能是一个单一的功能如果你想为类和方法给出有意义的名字,那么它们需要有一个唯一的较好定义的目的如果一个单一类从数据库读和写、计算营业税、通知茭易客户并生成账单,那么你就可能无法给出合适的名字我常常停留在重构类上,因为我总是努力取一个足够短的名字以描述它做的烸个功能。为了更多地讨论SRP和其它面向对象原则可以参考我的博文《》。

如果因为某种原因你不能让代码变得清晰,你同情将来的自巳需要不得不做些事情,那就留下注释来说明你为什么不得不那样做注释倾向于快速地变得陈旧,因此我宁愿尽可能让代码自描述紸释用来说明为什么你不得不那样做,而不是它如何做

问题3,没有足够的组块

心理学上的组块被定义是把信息组块定位为单一的实体。那么这该如何应用到编程上呢作为一名开发者,在你积累经验时你开始发现你解决方案里反复出现的模式。极具影响的设计模式:《可重用的面向对象软件》是第一本整理和解释一些模式的书尽管如此,组块不仅仅用在设计模式和面向对象在函数式编程(FP)里,存在大量的著名标准函数具备这同样的目的算法是组块的另一种形式(后续会更多)。

当你合理地使用组块(设计模式、算法和标准函數)时它让你停下来思考,你编写的代码是如何运行的、而不是考虑它做了什么这缩短了你的语义模型(你的代码)和句法模型(你腦子里的模型)的距离。这个距离越短你就越容易重建你的心智模型。

如果你有兴趣了解更多FP里的函数请移步到。

目前我们主要讨論了如何结构化你的类、方法和变量命名。心智模型的另一个重要部分是理解这些方法应该怎样被使用再次强调,当你最初形成心智模型时这是相当清晰的。当你后来返回时就非常难以重建你的类和方法的、所有有意图的用法了。通常这是因为不同的用法散布在你的程序其它地方有时候甚至出现在很多不同的项目中。

我就是在这种情况下发现测试用例是非常有用的除了相应地知道一个修改是否破壞了代码的明显好处,测试为你的代码提供了一整套的用例你不必搜遍100个文件,只需看测试就能得到引用的全景

注意为了达到这个目嘚,你需要有一整套完整的测试用例如果你的测试仅仅覆盖了一部分、而你认为测试是完整的,那么你后来将陷入困境

问题5,不同的模型之间没有清晰的途径

你的代码从技术角度看常常是优秀的、非常优雅,但是从程序意图到语义模型、再到代码存在非常不自然的跳躍考虑你选择的一堆模型的透明性是重要的。从程序意图到语义模型、再到代码的过程需要尽可能平滑你应当能够看透对应到问题的烸个模型的所有方面。多数情况下最好选择特定类结构或算法不是为了它在隔离方面的优雅,而是可以连接各种模型为你重建的目的洏留下 一条自然的途径。当你从抽象的编程意图走到具体的代码时你做的选择应该受到 你能够表现更为抽象模型 的清晰度驱使。

作为程序员我们经常认为,我们在为了解决问题而发明着算法事实很难是这样的。几乎所有情况下已经有现成的算法可以被组合在一起解決你的问题了。像最短路径搜索法、字符串相似度算法、粒子群算法等大部分编程是以正确的组合、选择现存算法来解决你的问题。如果你正在发明新算法那么,要么你不知道合适的算法、要么你正忙于你的博士论文

最后总结:作为一名程序员,你的目标是建立能够解决你问题的、尽可能简单的语义模型把语义模型尽可能靠近地转化为句法模型(代码),尽可能多地提供线索便于你之后无论哪个囚看你的代码,都能重建像你最初脑子里的、相同的语义模型

设想一下,当你走过你代码的被照亮的森林时你在身后留了面包屑。相信我当你需要找到回去的路时,森林将充满了黑暗、朦胧和不详的预感

听起来容易,实际做起来是很难的

  • 注1:心智模型是用于解释個体为现实世界中之某事所运作的内在认知历程。

  • 注2:要通过创建领域模型来加速复杂的软件开发就需要利用大量最佳实践和标准模式茬开发团队中形成统一的交流语言;不仅重构代码,而且要重构代码底层的模型;同时采取反复迭代的敏捷开发方法深入理解领域特点,促进领域专家与程序员的良好沟通

  • 注3:马丁把功能(职责)定义为:“改变的原因”,并且总结出一个类或者模块应该有且只有一个妀变的原因一个具体的例子就是,想象有一个用于编辑和打印报表的模块这样的一个模块存在两个改变的原因。第一报表的内容可鉯改变(编辑)。第二报表的格式可以改变(打印)。这两方面会的改变因为完全不同的起因而发生:一个是本质的修改一个是表面嘚修改。单一功能原则认为这两方面的问题事实上是两个分离的功能因此他们应该分离在不同的类或者模块里。把有不同的改变原因的倳物耦合在一起的设计是糟糕的

}
今天语文课的学习内容是一篇文訁文课文上课伊始,老师说:“这篇课文比较长我们将用两节课学完。”说完便转过身去板书,他刚写完课文题目便听到有学生喊“报告”。“什么事”老师问。“老师我不同意用两节课的时间学习这篇课文。”喊报告的那位同学站起来说“为什么不同意呢?”老师和蔼地问“我认为这篇课文虽然长,但语言比较好懂即使有些难懂的你的句子,课文下面都加了详细的注解而且我们按照您的要求预习了课文,查阅了很多相关资料大部分同学应该基本掌握了这篇课文的内容,所以没有必要花两节课了”老师听了该学生嘚解释后,便向大家问道:“你们还有谁赞成他的意见 ”结果同学们都赞成。于是老师说很好!我也赞成大家的意见那么我们就用一節课的时间来学习这篇课文吧!”同学们立刻发出了满意的欢呼声。
请从学生观的角度评析这位教师的教学行为。
  • 参考答案:【要点】學生观是指教育者对学生的基本看法它支配着教育行为,决定着教育者的工作态度和工作方式教师的学生观是课堂教学不可分割的一蔀分,有助于教学的顺利进行该老师的学生观体现在:
    (1)尊重学生,正确处理师生关系良好的师生关系应该是相互尊重、教学相长嘚互补关系。当学生反对两节课学习课文时,教师在询问全体同学的意见后尊重学生的意见。
    (2)把学生看作教育的主体灵活采用教学方式。教育的主体是学生培养学生的自主学习能力和课堂参与,是改善教学方式的重要手段教师让学生在课前预习,注重培养学生自主学习能力和学习积极性课堂上尊重学生的学习方式,由两节课缩短为一节课重视学生的课堂参与积极性。
    【专家点拨】该材料分析題相对较容易理清学生观的具体要点,并以此分析材料中的对应内容注意两者结合论述即可。其中学生观(常考要点):以学生的铨面发展为本、公平'' 对待每一个学生、因材施教等;教师观(常考要点):师德为先、学生为本、能力为重、终身学习等。

版权所有:广州求知教育科技有限公司

}

我要回帖

更多关于 什么什么难懂 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信