蛋糕是骗人的

您是否曾经想过-如何向从未接触过的人解释编程? 这可能是个问题,只要有一个新手不会理解您。


因此,让我们想象-您有一个朋友,他不受计算机科学的束缚,从未尝试过自动化某件事,从未玩过factorio,从未编写过一行代码。


因此,让我们想象一个正常的人。


我们称他为Bill 。 他的数学不是很好,只是“不好”,但他喜欢糖果



您的任务是教比尔您每天都在做的一些基本(或魔术)IT事情。 最简单的。
那你首先要做什么? 基本上-FEED HIM!


喂他!


长话短说,但是一天安德烈·亚历山大(Andrey Alexandrescu)问比尔:


-嗨,比尔,你想要糖果吗?
-是的,是的!

然后,比尔拿到糖果,从糖果包装纸上拆开,吃掉了食物。
简单吗 而且我们使用了两个魔术词!




几天后,沃思问比尔:


嗨,比尔,你要糖果吗?
-比尔:是的! 当然可以!
-沃思:嘿,我还有另一个,你也想要吗?
-比尔:是的! 当然可以!

这是一个条件控制的循环周期


-沃思:嘿,我还有另一个,你也想要吗?
-比尔:是的! 当然可以!

但是没有糖果,比尔有一个常见的空指针异常




当心-如果Alexandrescu突然返回并继续给Bill喂糖果,将发生缓冲区溢出 。 只要比尔将始终接受新的糖果。


缓冲区溢出




第二天,沃思就准备好了。 他有一大袋糖果。


-Wirth:好的,让我检查一下我的袋子...。
-沃思:我还有糖。 比尔,你要糖果吗?
-比尔:是的! 当然可以!

在这种情况下,沃思只有在有糖果的情况下才会提供糖果。
在这里,我们得到了一个带有前提条件循环




但是有一天,比尔来到沃思的房子,住:


-比尔:给我糖果!
-Wirth:永无止境! 你已经吃光了!
-Bill:但是我会在任何情况下都接受!!!
-比尔:你有糖果吗?

这是一个带有后置条件循环 。 悲伤的故事。 感谢上帝,警察在附近。 下次要小心,不要喂野鸟(和比尔)。





数十年后,丹·阿布拉莫夫(Dan Abramov)来到比尔(Bill),并将他所有的糖果放在桌上:


丹:无语的凝视比尔。
-比尔:无语的凝视着第一个糖果
-丹:比尔,你要这些糖果一个吗?
-比尔:是的,当然。
丹:你来了。

这是一个集合控制的循环




紧随其后,丹又拿出另一个袋子,将所有糖果放在桌子上,数数,然后放回袋子。


-丹:比尔,看来我还有糖果。 你要糖果吗?
-比尔:是的,当然。
丹:你来了。

这是一个计数控制的循环





迟早,但Bjarne Stroustrup来喂比尔。


-Bjarne:Bill,你要糖果吗?
-是的,是的。
-Bjarne:在这里。
-Bjarne:Bill,你要糖果吗?
-比尔:---

比尔在嚼糖果。 他很忙,没有什么可以打扰他。 他举起了一个互斥锁 ,线程被锁定,时间停止了……


螺纹锁


Bjarne是一个非常聪明的人,他找到了解决方案:


-Bjarne:Bill,你要糖果吗?
-比尔:---
-Bjarne:好吧,我等到完全咀嚼...

在这里,我们进行了线程同步




好的,这次我们将致电Peter_Norton。


-彼得:比尔,你要糖果吗?
-比尔:是的! 好啊
-彼得:我将提供一整包。 自己嚼一下。
接下来的比尔将从袋子里一个个地拿糖果,然后一个个地吃。

操作序列称为LIFO-先进先出 。 只要最后吃完包装底部的糖果。
同时,比尔的消化是先进先出的FIFO 。 您以前必须知道。


先进先出




Donald_Knuth也加入了喂养团队。 但是有一天,他厌倦了为比尔购买新的糖果,并要求一家餐饮公司来做。


-唐纳德​​:嘿,我的朋友,您能在最近的商店里买最好的糖果,然后交给比尔吗? 这是比尔的地址和钱...
从那时起,比尔一直都有唐纳德(Donald)的新糖果。
在这种情况下,餐饮公司是一个职能部门 ,地址和金钱是参数 。 糖果是回报价值
如果Bill在同一地址和相同金额上总是得到相同的糖果-这将被称为纯函数
但是只有在公司仅将糖果从A点转移到B点的情况下,并且商店永远是不纯功能的,只要它通过出售糖果并赚钱就失去了糖果! 因此它改变了内部状态


但是Dennis_Ritchie甚至还很聪明!


-丹尼斯:嗨,比尔,你要糖果吗?
-比尔:你知道的!
-丹尼斯:这是一个地址。 您会在那找到想要的糖果。

这是一个指针


但是,比尔到达那个地址时,他只发现了一个秘密军事物体。 从那以后没有人见过他。


几个月后,在逃离监狱后,他试图重蹈覆辙,但仍然无法达到“目标”。 这次是什么让他停在了远处-看不见的,坚不可摧的边界检查墙。




但是有一天……甚至说实话-晚上-Cyber​​demon来到Bill的房子里大喊:


-Cyber​​demon:您想要糖果吗?
-比尔:是的! 在白天,然后星星闪亮! 总是!

因此,比尔又得到了糖果。 但这是一个可悲的故事,只要他忘记检查有效载荷的类型或执行任何其他数据验证即可 。 ️





之后,比尔在一片空白中醒来,听到:


-宇宙:比尔! 你要糖果吗?
-比尔:是的!
-宇宙:比尔! 你要糖果吗?
-比尔:是的!
-宇宙:比尔! 你要糖果吗?
-比尔:是的!

这就是ping的工作方式。




在具有非零延迟的受干扰系统中,这看起来可能是这样的:


-宇宙:比尔! 你要糖果吗?
-宇宙:比尔! 你要糖果吗?
-宇宙:比尔! 你要糖果吗?
-比尔:是的!
-比尔:是的!
-比尔:是的!

但是这种情况仅对TCP / UDP有效。 对于TCP / IP ,可能是


-宇宙:比尔! 你要糖果吗? 比尔! 你要糖果吗?
-宇宙:比尔! 你要糖果吗?
-比尔:是的! 是的 是的

只要同级数据包通过时间或大小因子(也称为MTU )加入。



结束


我有很多不为人知的故事,例如比尔和四人帮 或非跨浏览器的糖果
但是,让我告诉最后一个关于“不可分割的糖果”的问题:


比尔吃了上百遍 ,但它突然变回他的手, 松软甚至甜美!
因此,不可分割的糖果可能是单例内存泄漏 ,因为长时间的垃圾收集器无法消化它。

那么, 您能以糖果的方式描述IT方面的一些事情吗? 到 教比尔,并让他学习IT。


比尔


比尔仍然非常饥饿,他正在挨饿。 你要喂他 在这里 在评论中。


PS:这是10年文章的翻译。 原始文章“ The Val`s Candies”发布于8年前,从那时起,它有了许多新的示例作为用户注释-递归,委派,接口,堆栈溢出,过程与函数,类,B树和以此类推。 但是...在另一个方面。

Source: https://habr.com/ru/post/zh-CN436752/


All Articles