您是否曾经想过-如何向从未接触过的人解释编程? 这可能是个问题,只要有一个新手不会理解您。
因此,让我们想象-您有一个朋友,他不受计算机科学的束缚,从未尝试过自动化某件事,从未玩过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甚至还很聪明!
-丹尼斯:嗨,比尔,你要糖果吗?
-比尔:你知道的!
-丹尼斯:这是一个地址。 您会在那找到想要的糖果。
这是一个指针 。
但是,比尔到达那个地址时,他只发现了一个秘密军事物体。 从那以后没有人见过他。

几个月后,在逃离监狱后,他试图重蹈覆辙,但仍然无法达到“目标”。 这次是什么让他停在了远处-看不见的,坚不可摧的边界检查墙。
但是有一天……甚至说实话-晚上-Cyberdemon来到Bill的房子里大喊:
-Cyberdemon:您想要糖果吗?
-比尔:是的! 在白天,然后星星闪亮! 总是!
因此,比尔又得到了糖果。 但这是一个可悲的故事,只要他忘记检查有效载荷的类型或执行任何其他数据验证即可 。 ️

之后,比尔在一片空白中醒来,听到:
-宇宙:比尔! 你要糖果吗?
-比尔:是的!
-宇宙:比尔! 你要糖果吗?
-比尔:是的!
-宇宙:比尔! 你要糖果吗?
-比尔:是的!
这就是ping的工作方式。
在具有非零延迟的受干扰系统中,这看起来可能是这样的:
-宇宙:比尔! 你要糖果吗?
-宇宙:比尔! 你要糖果吗?
-宇宙:比尔! 你要糖果吗?
-比尔:是的!
-比尔:是的!
-比尔:是的!
但是这种情况仅对TCP / UDP有效。 对于TCP / IP ,可能是
-宇宙:比尔! 你要糖果吗? 比尔! 你要糖果吗?
-宇宙:比尔! 你要糖果吗?
-比尔:是的! 是的 是的
只要同级数据包通过时间或大小因子(也称为MTU )加入。

结束
我有很多不为人知的故事,例如比尔和四人帮 或非跨浏览器的糖果 。
但是,让我告诉最后一个关于“不可分割的糖果”的问题:
比尔吃了上百遍 ,但它突然变回他的手, 松软甚至甜美!
因此,不可分割的糖果可能是单例或内存泄漏 ,因为长时间的垃圾收集器无法消化它。
那么, 您能以糖果的方式描述IT方面的一些事情吗? 到 喂 教比尔,并让他学习IT。

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