什么是好的编程隐喻?[关闭]


30

我指的是向非程序员解释什么是编程。我确保在创建此问题之前先搜索类似的问题,但是我发现的几个问题似乎回避了这个问题,我特别希望看到一些隐喻或类比。我个人发现通过使用隐喻或类比向某人解释一些技术性的内容比较容易。

我对此感兴趣的原因是,因为很多人每天都会遇到程序员的工作,但是如果您问普通人一个程序员是什么或干什么,他们并不真正知道。这会导致某些误解(例如“ [...],但我认为您的计算机性能不错!”)

我真的很想在那儿找到最好的。我希望能够轻松地向某人解释我的职业选择。当然,至少是总体思路。

我个人没有一个可靠的语言,但是我已经考虑了很久,而且我通常倾向于使用“语言”隐喻,因为我们碰巧知道计算机可以理解的一种语言,因此我们能够告诉计算机该做什么。做或“教”他们解决我们的问题。

例如:

想象一下,在另一个现实中,存在具有人工智能的类人机器人,有些人能够通过一种通用语言(英语的一种变体)与它们进行通信。这些可以与机器人通信的人可以教他们如何解决某些问题或完成某些任务,例如做家务。

好吧,尽管还没有像这样的机器人,但我们这个时代的程序员就像那些人一样,但是他们没有与机器人交流,而是与计算机交流。程序员通过使用这种“通用语言”创建的软件来“教”计算机如何执行某些任务或解决某些问题。

程序员和这种“通用语言”为我们提供了诸如电子邮件,网站,视频游戏,文字处理器,智能手机(简而言之)之类的东西,以及我们日常使用的许多其他东西。

我并不是要把编程放在王位上,这只是我能想到的最好的隐喻。

我确定有人会发现与此有关的问题,这可能是人为的,但这又是我问这个问题的原因。


我猜学习编程语言有点类似于学习外语。但是,计算机编程的行为与普通的谈话/写作行为有很大不同。计算机编程至少需要:精度,创新,专注,创造力,组织,持久性和严格的逻辑。
阿米(Ami)2010年

我想反驳著名的“但我认为您对计算机的了解很好”,就必须将这种误解纳入比喻,例如,有人可能会认为警察擅长犯罪,因为他们“对犯罪现场”之类的东西。
2010年

为什么不仅仅解释程序员的工作呢?关于道路,机器人和积木的所有谈话都是愚蠢的。如果我问一个股票经纪人,他们不想做什么,我不想听到赌博的轶事。如果我问整形外科医生,他们不想听到关于艺术风尚(或其他内容)的信息-请说明事实!
柯克·布罗德赫斯特

Answers:


43

这就像必须编写详细的分步说明来指导如何开车到某个地方。但是,您通常必须为诸如“如果发生交通拥堵该怎么办”或“如果卡车在转弯处发生故障该怎么办”之类的事情添加应急计划。

有时,您必须更深入地研究并解释道路规则,例如在哪一侧行驶或在红灯下做什么。有时您甚至需要精确解释方向盘或油门踏板的工作原理。

通常,一旦您对所有细节都进行了详细的描述,客户会说“这很完美,除了需要为驾驶气垫船的人工作之外”


哈哈,我真的很喜欢这个。
豪尔赫·以色列·佩尼亚

14
我的气垫船充满了鳗鱼!

3
或者,您也可以对其进行PROLOG:这是您在车上,这是您的目的地,这是一次事故,现在告诉我,您可以在没有事故的情况下到达目的地吗?
biziclop 2011年

不,通常更改为“ Perfect,但我们确实想要一栋房子……”。虽然喜欢您的比喻:)
jmq 2011年

3
打个比方。同样,汽车由某人驾驶,该人会完全按照您的指示去做,但没有常识或不能自行做出决定。
鲍勃·墨菲

20

我为非常非常笨拙的机器编写了非常非常详细的说明。


17

我用比喻“我们写针织食谱 ”,这对祖母很友好。

理由:

  • 编织是一个相当简单的机械过程,您基本上需要完全按照详细的说明进行操作。
  • 大多数编织说明适用于多种尺寸。这为您提供- if语句,数学和循环。
  • 当愤怒的祖母大军穿着越野车时,您会发现食谱中的错误!

我认为这是一个很好的隐喻。
保罗·内森

听起来好像编织已经完成了:)
bughi 2012年

14

打个比方不是很好,但是当人们告诉我修理机器时,我说:“我是设计汽车的人。我不是机械师!”


4
“我是音乐家,而不是街头歌手!”
EricSchaefer'3

@Eric:更具诗意:)
Matthieu M.

1
@Eric-更多“我是作曲家,而不是行家”。
Steve314 2011年

我本来是想着电子学的一些东西:“我可以焊接合成器,但是我不能播放音乐”,但这可能更有用:“我可以建厨房,并不意味着我可以做饭”。
naught101

12

小时候,我读了一个非常不错的编程说明:这就像告诉机器人如何去完成日常的日常任务,例如上学。因此,您可以告诉它“去上学!”,但是它不知道如何。因此,您告诉它“出去,左转,继续走,直到您到达学校,左转,走进去,然后坐下”。但是路上有路!因此,您必须告诉它“在马路中间停下来,检查是否有车辆通行,过马路,然后继续走”。那门呢?因此,您添加了“检查学校门是否打开。如果没有打开,请打开它。” 在那里。最终,您有一个程序可以告诉您的机器人如何独自上学。

这与徽标非常吻合,您可以完全以这种方式指示海龟创建复杂的形状。


10

编程就像一盒巧克力。有时您会立即找到要查找的内容,但是大多数情况下,这需要大量的反复试验。有时你会得到椰子。

交通灯。汽车正在行驶或停止。一个交通信号灯的设置很容易想象,但是如果添加另一个交通信号灯会怎样呢?三分之一呢?整个城市呢?一个运输系统由成千上万个信号灯组成,每个信号灯本身都很简单,但是从整体上看,它变成了一个复杂的系统。如果其中一个交通信号灯出现故障或关闭仅几秒钟,就会使整个系统陷入混乱。如果一切都同步,那么您就可以享受旅程了。

一个激励人心的演说找到钥匙打开的人们的动机,梦想和思想困惑。每种情况,每个人都是不同的。过去的工作现在可能不合适。有时,密钥可以重复使用,但需要根据个人情况进行调整。在其他时候,必须重新设计钥匙。最有意义的是,当该人被解锁后,您看到他们走出去征服世界。最具有破坏性的是当您感到亲近时,却无法释放潜力。

一个侦探故事,在探测慢慢寻找线索和收集证据建立他的情况。有条理,聪明和准确将赢得胜利。马虎,无知和懒惰将使案件成败。最终,这项工作将在同行评审中脱颖而出。

投币机。您将所有硬币都放进去,然后拉动杠杆。有时您赢大,有时您坐在那里几个小时,却什么也没有发生。有时,其他人只是随便走过去,拉一下操纵杆,然后赢得大奖。

音乐。一个音符很简单,但是度量更复杂。一首完整的歌曲具有许多音符,且带有许多音符。如果关闭一个音符,则可能会破坏整个演奏。如果每个音符都完美传递,则演奏会淡入背景,只有音乐存在。


牛轧糖。你得到牛轧糖。
Tim Williscroft 2011年

6

最好的隐喻就是它本身。任何不同的东西都会失去一些准确性。因此,选择最佳的隐喻取决于具体要掌握的编程内容。由于此处将提供许多有关编码隐喻的答案,因此,我将用经典隐喻来回答整个开发过程:

建筑施工

这个隐喻最常见的方面是物理架构师在某种程度上类似于软件架构师。以下是其他一些相似之处:

  • 更改越便宜,越早进行更改。也就是说,您现在可以在纸上移动一行,或者以后在水泥上移动10吨。
  • 没有适当计划的建筑物容易倒塌
  • 建设者试图实现客户想要的东西。如果客户不能准确描述他们希望建筑物的外观(或通信出现其他故障),则更改成本会很高。
  • 某些物理定律不能弯曲。就像不能在100英尺宽的第一层上构建三百英尺宽的第二层一样,没有坚固的子系统Y也无法构建特征X。

当然,像任何隐喻一样,它也有其局限性。它有一些缺陷:

  • 建筑物只能使用1次;您将其构建在某个地方,然后一直存在。您不能以零增量成本为具有一百万种不同需求的一百万个不同用户复制一百万遍。
  • 建筑物比软件更不可改变。
  • 建材成本没有明显的比喻。一行代码不花任何成本,只有花时间才能花钱。
  • 软件不可能(取决于您要求的人)的增量体系结构在构造时是不可能的,您必须先设计一次然后再构造它。

因此,就像任何类比一样,这取决于您要解释的内容。提防过度依赖任何一种隐喻,否则您的客户将开始怀疑他的新工资系统将征收什么财产税。


只有这样,如果您未将厨房门对准,则屋顶不会爆炸。房屋坚固耐用,但是相比之下,软件的坚固性就像卡片屋一样。不可避免的是,隐式和显式规则(模型)很快就会变得非常复杂。
KarlP 2010年

您可以复制蓝图!您可以随时扩展建筑物,例如为新的按摩浴缸增加25m ^ 2!
Zolomon

类比的缺陷实际上不是材料/位置的1x使用和真实/虚拟性质(每个构建都是唯一的)。建筑物类比的真正缺陷是建筑物作为障碍物的动态行为。提供一个活动可以避开外部空间和活动的空间。软件“事项”的动态行为是处理数据。
Huperniketes 2010年

在此博客文章开头的好例子:orestis.gr/blog/2010/11/06/why-i-bill-hourly我要写自己的“隐喻”问题,但后来我找到了这个问题并找到了答案最像我会给的那种。
托德·威廉姆森

6

我喜欢克里斯·麦克马洪(Chris McMahon)的软件开发类比,就像音乐创作,尤其是爵士音乐创作一样。

这是艾拉·菲茨杰拉德(Ella Fitzgerald)和伯茜伯爵(Count Basie)演唱的《一点钟跳》。这首歌是十二小节的布鲁斯,相当于带有UI的数据库应用程序的爵士乐。我的意思是:正如每个程序员都使用UI构建数据库应用程序一样,每个美国音乐家都演奏了十二格蓝调。从Count Basie到Jimi Hendrix到Ramones,这是一个悬挂许多歌曲的框架。

这个特定的视频是敏捷实践的一个很好的例子。听听声音和钢琴如何相互影响。这很像结对编程,也很像TDD。钢琴回应;钢琴做点什么;声音回应。并注意目光接触。这些人非常了解即时到即时的情况。他们没有乐谱(BDUF)。就像良好的软件开发一样,他们参与的活动需要集中精力和技巧。他们还清楚地意识到有受众,就像良好的软件开发应该意识到付账人的需求一样。

这是他讨论博客文章的链接:http : //chrismcmahonsblog.blogspot.com/2007/05/example-of-analogy-monks-vs-music.html


1
正准备发布一个音乐隐喻(我拥有作曲硕士学位),但克里斯的故事比我能更好地报道它
艾伦(Alan)2010年

5

有时我指的是控制无脑僵尸的编程。总结一下我的博客文章

  • 像僵尸一样,我们使用的计算机非常笨。除非详细说明,否则很难指导他们做任何事情
  • 僵尸具有攻击性,如果我们错过了指导中的微小细节,则不理the该生物,它可能会压扁自己周围的一切。与计算机相同:指令中缺少详细信息可能会使程序崩溃并破坏数据。
  • 如果您想控制僵尸,则必须了解魔术。与编程相同。
  • 大脑聚集的人越多,他们可能拥有的计算机就越多。大脑似乎吸引了计算机-就像它们吸引了僵尸一样。

我担心睡觉时那些小的LED看着我……
Xeoncross 2011年

5

编程就像用Lego构建事物:

  • 您正在将许多小块粘合在一起以制造更大的东西
  • 小块的形状和大小有限
  • 小事情只能以某些方式融合在一起
  • 玩这个东西可能会很有趣

5

为计算机编程就像抚养孩子一样...

  • 每个人都不同意正确的做法
  • 它可以让你彻夜难眠
  • 它永远不会做你所说的
  • 无论您阅读了多少本有关该主题的书,当您去做时,都感觉自己不知道自己在做什么
  • 过了一会儿你会变得懒惰
  • 您希望它将来会带来巨大的回报,但是最终您必须维护它直到使用寿命终止
  • 它从未像您想要的那样干净,聪明或安全
  • 以后再看时,您会想知道您在想什么
  • 尽管它给您造成了所有压力,但您还是喜欢它。

主要区别在于,如果有人窃取了我们的源代码,我们会感到不高兴,但我们经常很高兴有人将我们的孩子从我们手中拿走。


4

编程就像建造工厂或装配线。

自动化生产线

将软件视为计算机内部存在的机器或装配线。一些原材料和组件被送入机器,并按照一系列程序将它们加工成某种最终产品。设置程序以特定顺序对某些原材料或组件执行特定操作,以达到一组特定的参数(例如,时间,温度,距离等)。如果要执行的操作细节不正确,或者机器的传感器未正确校准,或者某些原材料或组件不在预期的质量标准之内,则可能会改变操作的结果,并且产品不会合格如预期的那样。

这样的机器在操作和输入可接受方面非常严格。机器既不会质疑设计人员的智能,也不会质疑其当前的操作环境。只要有针对性,它将继续遵循程序。即使原材料或组件的变化可能对以后的操作产生重大影响,机器仍会执行其程序。需要对过程进行审查,以查看对程序进行哪些更改才能补偿并产生所需的结果。更改产品的设计或配置可能还需要对执行的操作或其顺序进行重大更改。尽管负责生产的人员很快了解到尽可能多地隔离操作以减少操作之间的不良影响的重要性,条件组件在进行处理时会做出很多假设;直到最终产品在某些不同的操作环境中由用户掌握之前,可能无法检测到的假设。


3

帮助快速的白痴通过需要书面论文的数学课。


2

计算机编程就像下棋一样,随着比赛的进行,棋盘的大小,棋子的数量以及控制棋子的规则的大小和复杂性都会增加。



1

实际上,CS /编程课程的新学生就像非编程用户一样。机器人的例子很好。

上世纪80年代,使用Logo,Karel(或类似的编程环境),用户在这里学习编程,像机器人一样观看计算机,而不是用打字机在电视机上学习,这很有帮助。那些在初中和高中常用的工具。

实用的程序设计帮助学生掌握了解决问题的能力,即使他们与计算机无关!

或者,即使学生没有成为程序员。

一些大学和学院也在第一年的课程中使用了这些工具。

我想知道为什么许多高中放弃了Logo和Karel的教学...


1

我喜欢《神话人月》中的弗雷德·布鲁克斯(Fred Brooks)的类比,即编程就像表演魔术。

(the)程序构造不同于诗人的话,它在移动和起作用的意义上是真实的,产生与构造本身不同的可见输出。它可以打印结果,绘制图片,产生声音,移动手臂。神话和传说的魔力在我们时代已经实现。一种方法是在键盘上键入正确的咒语,然后显示屏幕栩栩如生,显示出从未有过的事物。...

(一个)必须正确执行。在这方面,计算机也类似于神话和传说的魔力。如果一个字,一个咒语的停顿,严格来说不是正确的形式,那么魔术就不起作用了。人类不习惯完美,人类活动的很少领域要求做到这一点。我认为,适应完美的要求是学习编程的最困难的部分。


1

“ [...]但是我认为您在计算机方面表现​​不错!”

这通常是一种尝试,目的是欺骗极客以修复计算机(您觉得有必要证明自己是错误的吗?)。我的标准答案:
我是一名程序员。就像汽车工程师一样-他可能不会知道如何修理'72 Trabant的刹车,如果他知道,他当然也不会这样做。机械师会做到的!



0

编程就像挥舞着巨大的力量。您可以使计算机做您想做的任何事情。您仅受您的想象力和愿意投资的时间限制。

程序员就像房子的创造者。我们可以告诉您有关我们建造的房屋的所有信息。但是,如果您问我们问一个随机的房子,而我们恰好在路上经过,则可能我们对此一无所知。但是,如果您需要在那栋房子上添加或更改某些东西,只要业主允许我们可以实现。


0

在克里斯·克劳福德(Chris Crawford)的一本关于编程旧文章中,他将复杂的程序比喻为官僚机构,有多个机构通过来回传递备忘录进行沟通。我发现这在解释软件开发时是一个非常有用的隐喻。


0

我通常将编程等同于拼图游戏。

对于创建一个新项目-您有很多作品,其中一些不属于该图像,并且您没有预览拼图完成后的外观。但是您确实知道大小和一般颜色,因此可以估算,但不一定准确。

为了修改一个已经存在的项目,一只猫走了过来,敲掉了一部分拼图。这将需要一些时间,但是框架已经存在,因此它应该不会太糟(取决于需要更改的数量)。

它还有助于描述进度。我最近的一个项目中,有一次我想知道如何描述它,以使非技术人员会理解为什么我不知道还要多长时间,于是我想到了:想想一个拼图游戏,其中所有边框已完成,如果是内部,则超过一半。剩下的都是彼此分开的,我现在要做的是填补空白。


-1

令人遗憾的是,编程是一项只有通过学习如何进行才能理解的工作。

编程具有几种不同的感知水平,并且具有不同的方面。

从低层次上讲,它是“为非常非常笨的机器编写非常非常详细的说明”

在下一级别,它正在处理复杂性。建立新的隐喻以简化工作。像高等数学。

从不同方面看,它使用了辅助技术,例如版本控制,自文档代码,项目构建和测试。

从另一方面来看,其构建的“用户”界面(从字面上讲,我的意思是API也是UI),预测可能的错误(由用户,数据甚至是本身完成)并纠正错误。

最后。

编程的隐喻是文学。首先需要学习字母。但是写一本小说甚至还没有开始。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.