💥 #explainlikeimfive 精选
开发人员角色
联网
编程
方法论
框架
DevOps
如果你不能简单地解释它,那么你就没有足够理解它。——
阿尔伯特·爱因斯坦
像我五岁一样解释我,这是 DEV.to 上最好的标签,你绝对应该关注它
# explainlikeimfive
我在这个网站上为你整理了一些极具教育意义的答案。我特意挑选了一些既有启发性又简洁明了的答案,并且只用文字解释,没有用代码。
这里有很多精彩的内容,所以🔖如果您想在有更多时间时阅读,请将文章加入书签。
不用多说,以下是选择:
- DNS
- TCP
- WebSockets
- GraphQL
- 什么是编程?
- 什么是编程语言?
- GitHub
- 递归
- 依赖注入
- 可选
- 承诺
- 异步等待
- 开源
- 冒烟测试
- Vue
- 反应
- Redux
- 什么是 DevOps?
- 持续集成/持续交付
- 容器
- Docker 和 Kubernetes
开发人员角色
联网
DNS
如果你熟悉带有“通讯录”或“电话簿”的现代智能手机,不妨问问自己,上一次你回忆起电话号码的具体数字是什么时候,是朋友/家人的电话号码。几乎没发生过?如果有的话?
互联网由 IP(互联网协议)地址(互联网的电话号码)组成——地址仅仅是代表实体和/或资源的位置。与记住朋友的名字或某个网站的 URL(例如 Dev.to,我所在位置的 IP 解析为 )相比,它很难记住151.101.130.217
。每次我想访问这个网站时,都很难记住。
DNS 又名域名服务,以分散、半联合的方式将 URL(顶级域名)转换为 IP 地址,本质上提供了一种映射,将我们能记住的内容转换为我们无法记住的内容(实际的 IP 地址)。
TCP
你和朋友需要分享一个玩具:
-
你问朋友是否可以玩这个玩具。
-
你的朋友问你是否真的向他要玩具。
-
你告诉你的朋友你想要那个玩具。
-
他把玩具给你。
UDP:
- 你的朋友向你扔了一个玩具然后走开了。
WebSockets
你和你最好的朋友有一个约定,当你遇到数学难题时,她会帮助你完成数学作业。
当你有问题的时候,你就给她打电话,等她回答,然后问你的问题,听她回答。然后她挂断电话,你继续做作业。
大多数晚上,你会在一个小时左右的时间里给她打几次电话。有时她太忙没时间接,你就挂断电话,无所事事,过几分钟再打。
但有些晚上,作业太难了,你几乎每五分钟就要给她打一次电话。虽然她不介意帮你,但你们俩都不喜欢不停地给她打电话,等她接听,然后挂断,几分钟后又重复同样的过程。
最终,你想出了一个明智的办法。你给她打电话,并保持通话畅通。你独自学习的时候,电话那头很安静,但当你有问题时,你只要开口说话,她就能听到。作业做完后,你就可以挂断电话,结束一天的工作了。
您的朋友是服务器,您是浏览器应用程序,呼叫是网络连接,呼叫后保持线路畅通是 websocket 连接。
GraphQL
现在是学校的午餐时间,他们正在供应你最喜欢的饭菜:肉饼和土豆泥。
你最喜欢肉饼和土豆泥,但你是个好孩子,所以你知道豌豆和胡萝卜也该吃。你对玉米和肉汁很感兴趣。
但你肯定不想盘子里堆满蔬菜,真讨厌!所以你得具体说明你点的菜。你需要两勺土豆泥、一大块肉饼、半个玉米棒,还有一把豌豆和胡萝卜。但要把这些都告诉食堂厨师可就麻烦了。
这就是为什么你要使用以下其中一种:
这是一个 GraphQL 托盘。它会向厨师准确显示您需要的份量,您只需将托盘递给他即可。然后,厨师会从装有肉、土豆和其他食材的大 Mongo 桶中舀出这些份量。有些厨师会使用 Postgres 桶。Maria 和 Cassandra 品牌的桶在某些学区也很受欢迎。但这些对您来说都不重要。如果您需要给厨师具体的指示,这可能很重要,但他的工作就是弄清楚如何舀出土豆泥并将其放入托盘的形状中。
有些自助餐厅不允许您使用托盘来取食物,您必须每次回来取您想要的东西。
有一段时间,食堂员工们对这个比其他 SOAPy 系统更简单的系统感到安心,而且至今仍对许多食堂非常有用。但这个学区觉得这有点混乱,所以他们开始允许孩子们带着托盘来取他们需要的所有食物,这样就不用跑很多趟,也不用向厨师解释每种食物的具体用量。
孩子们似乎对新系统很满意。
编程
什么是编程?
我让二年级学生设计和制作花生酱和果冻三明治,以此来教授编程的概念。
要求:面包、花生酱、果冻、刀、盘子等(把它们放在手边,但要藏起来,然后让班级列出需要的东西)
程序:让一个小组列出构建它的步骤
测试:让另一个小组逐字逐句地遵循“程序”
所以,就我的情况来说,程序的第一步是把花生酱涂在面包上。我们立刻就发现了第一个 bug。面包还在袋子里——必须打开袋子取出再放进盘子里。花生酱也没开封,等等。我们反复修改程序,直到把步骤做对为止。
它让他们充分感受到程序需要多么详细,并且计算机只会遵循您给出的指令。
什么是编程语言?
我一直认为编程是一种语言。
理论上,我们的工作和大使一样,用当地语言表达诉求,解决特定文化的争端等等。
只不过我们是在与计算机交谈,而不是与人交谈,在这种情况下,文化可能是模式、框架应用程序、系统等。
顺便说一句,我相信这也是为什么编程变得越来越口头化的原因。
GitHub
噢,当我第一次学习 github/git 时,有人教了我一个很棒的类比 - 所以我不能为此承担责任(不幸的是)!
Git 就像保存了多份写好的论文草稿。
Github 是一个社交媒体中心,其他人可以在此查看、处理和协作多篇论文草稿!
递归
你知道俄罗斯套娃吗?
当你打开一个娃娃时,你会发现里面还有另一个娃娃;当你打开那个娃娃时,里面又有另一个。这种行为称为递归。让我们来写代码来实现它。
function openDoll(doll) {
if(doll.isEmpty()) {
return doll;
}
openDoll(doll.open());
}
递归是对一组值进行运算的一种方式,其中每个值都与前一个值相关,无需迭代或使用循环。
</div>
依赖注入
当你自己去冰箱里拿东西的时候,可能会惹麻烦。你可能会忘了关冰箱门,拿一些爸爸妈妈不想让你吃的东西。你甚至可能在找一些我们根本没有或者已经过期的东西。
你应该做的是说出你的需求,“我需要一些午餐时喝的”,这样我们就能确保你坐下来吃饭的时候有东西喝。
可选
假设你有一个贴有标签的盒子,里面可以装任何你喜欢的东西。你在标签上写明盒子可能是空的,也可能不是空的,以及你会在盒子里放什么东西(比如咖啡杯)。
然后你可以把这个盒子送给其他人,他们知道这个盒子很可能是空的,也可能装着一个咖啡杯。因此,他们需要为盒子装满的情况和空的情况做好准备。
人们可以随时检查盒子是否是空的,从盒子里拿出咖啡杯,对盒子里的咖啡杯做些什么但将其放在盒子里,等等。
- Box:(在 Scala 等其他语言中
Optional<T>
也如此称呼)Option
- 咖啡杯:包含在
Optional
类型中的对象T
- 盒子标签:类型签名
- 将盒子交给其他人:返回类型对象
Optional<T>
- 检查框是否为空:
Optional::isPresent
- 从盒子里取出咖啡杯:
Optional::get
- 对盒子里的咖啡杯做一些事情:
Optional::map
可选项是一种方便的、明确的方式来表示可能存在或不存在的值(基本上它是为了替换返回 null)
承诺
就像你五岁的时候?好吧……
你问妈妈你待会儿能不能吃点糖果。她要么答应给你糖果(是的,你可以吃),要么拒绝你的请求(不许你吃糖果。你太淘气了)。
等到待会儿,如果她答应了(也就是说她说你可以吃),那你就可以吃。否则,你就得把因为不能吃糖果而流下的眼泪接住。很简单,不是吗?
一个 Promise 包含一个 resolve 和一个 rejection。当它被实际调用(函数被调用)时,如果 resolve 了,则使用 THEN ,否则使用 CATCH 。
异步等待
我得在这里维护一下我的声誉:stackoverflow.com/a/1638961/31899所以让我试试吧。咳咳!:)
我是你忠实的狗狗JS。我全心全意地爱你,不过通常你去上学的时候,我就会去做别的事情。我会去找React猫,冲它叫。这很有趣,因为它真的老了。我会小睡一会儿。我会吃东西。我会把那个可怕的“邮递员”从我们家赶走。然后,等你回家,我们一起玩!万岁!
但今天你说:“等我,我把骨头给你。” 所以我没动。我是一只好狗。我是一只非常好的狗。我会待在这里,什么也不做,直到你回来,然后我去拿骨头,我们一起玩!
这就是针对五岁小孩的 Async/Await。
方法论
开源
瀑布:你被雇来建一栋房子。客户告诉你他需要多少个房间,多少扇窗户等等。然后你建了一栋房子。然后客户告诉你,他需要用客厅作为飞机库,卧室应该漆成紫色
Scrum:你被雇来盖房子。客户每周都会来告诉你他喜欢什么,不喜欢什么,这样你就可以在为时已晚之前做出改变。有时客户会在周中过来告诉你,他明天要带朋友去看房子,如果客厅里有个壁炉就好了。而且大多数情况下,客户对技术细节不感兴趣,所以花一周时间做支撑二楼的柱子并不是个好主意,因为你什么也做不了。
冒烟测试
好问题!这个问题真的让我思考了很久,就说到这里吧。
为了即将到来的生日,你让父母给你买一辆乐高1989蝙蝠车。
生日那天终于到了,他们送了你一个包装好的礼物,但他们却没有告诉你里面是什么。这真是个惊喜。
你兴奋不已,但还没等你抱有希望,你就检查了包装。
从包装的形状和大小来看,它和乐高1989蝙蝠车的3306块积木盒大小相符。第一阶段烟雾测试通过了。
你把礼物拿在手里,感受着它的重量。不重不轻,刚好适合一盒乐高积木。烟雾测试2,通过了。
你决定在打电话之前再做最后一次测试。你摇晃盒子,听到里面传来熟悉的乐高积木撞击声。第三次烟雾测试,通过!
现在您相当确信礼物是某种乐高积木,但您不能确定它是否是蝙蝠车,因此您从用户验收测试开始,打开礼物并验证盒子里的内容。
如果任何一项烟雾测试失败,您就会立即知道目前的情况不符合您的要求,而无需花时间进行详细测试。
框架
Vue
Vue 就像变色龙,无论环境如何,它都能适应。森林、高山、平原沙漠等等……它会相应地演进和扩展。你可以用一个简单的脚本将其添加到静态网站中,并创建一个 Vue 组件,例如仅为登录按钮(向服务器发送登录名/密码,接收令牌,并将其存储在本地存储中)。或者创建一个完整的 Vue 应用程序,其中包含路由器(VueRouter)、更复杂的数据交换系统(VueX),以及像 React 一样可复用的组件。由于 Vue 集成极其简单,你可以用它完成整个应用程序的 15% 甚至 50%。它使用 Web 开发人员熟知的概念,没有编写虚拟 DOM 的新语法:它只是巧妙地将 HTML 转换为 JavaScript。感觉就像用一些 JavaScript 和 CSS 编写了另一个 HTML 页面。但这毕竟是一个 Vue 组件!哈哈,你被恶作剧了……
反应
React 组件本质上只是一个返回 HTML 的函数。它可以根据需要以 props 的形式接受参数,并使用这些参数来确定渲染的内容。
虽然从技术上讲组件可以是一个类,但将其视为一个函数仍然更有意义,而且随着 Hooks 的出现,现在可能没有必要将任何一个组件构建为一个类。
Redux
想象一下,你站在一家商店的橱窗前。由于没有任何布置,橱窗里空空如也。经理希望每天早上都能有漂亮的陈列,于是你在橱窗后面摆放了几个看起来很漂亮的空架子。后来,经理突然想到,在新产品上架时展示它们。所以,对于每种类型的产品,你都需要决定如何以及在货架上摆放它们的位置,以及当商品过多、某种类型的商品缺货时该如何处理等等。我们把这称为“摆放”。你每天上班后都会进行这样的摆放,这样你就可以在一天开始时看到货架,并进行第一次更新。
经理又有事要问你。现在,你可以在白天获取商店产品和新商品的变更信息,这样你不用只收到一次所有变更的列表,而是可以在你值班期间,每个类型和每个产品都会收到变更信息。确保你可以联系经理,或者他们可以将任何类型的更新推送给你,以便你按照之前创建的设置进行操作。
橱窗就是商店,拥有精美的货架是初始状态,从管理器获取更新是一种动作,设置是减速器,获取更新的过程是订阅。
DevOps
什么是 DevOps?
这是冬天,一个寒冷的夜晚,一位仙女拜访了你。
仙女说:“你有三个愿望。”
你说:“我想要一台扔雪球的机器。”
噗,机器就出现了。然后仙女就消失了。
你邀请朋友西蒙过来,告诉她发生了什么事。
“哇,”西蒙说道。“这机器怎么用?”
“我不知道。它上面有大概1000个按钮。
太复杂了。”
“我的天哪,”西蒙说道。“真可惜。”
那天晚上,你坐在房间里哭泣。
突然,仙女又出现了。
“怎么了?你为什么哭?”
“嗯,你给了我那台很棒的机器,但我不会用。
西蒙娜也不会用。它太复杂了。”
“嗯,你并没有说它必须简单。不过记住,
你还有两个愿望。”
“好的。我和我的朋友西蒙娜,我们想知道要按哪个按钮。这样机器才能堆雪球,然后扔出去。”
“你的愿望就是我的命令,”仙女说完就消失了。
你邀请西蒙妮过来。但现在,又有一个问题:
你知道要按哪个按钮才能让机器堆雪球。但仅此而已。你有点像雪球的开发者。
你的朋友西蒙妮知道按哪个按钮可以让机器扔雪球。但也仅此而已。她有点像机器的操作员。
如果西蒙娜和你一起合作,你们可以让机器堆雪球并扔出去。但你们俩都不知道整个过程。你们俩都无法独自使用这台机器。你们总是需要西蒙娜在身边。虽然你们堆的雪球看起来很漂亮,但西蒙娜经常抱怨它们太重,飞得不够远。
但你们是朋友。你们互相观察,经常谈论这台机器。因为它是你们所知的最迷人的东西。随着时间的推移,你们学会了按哪些按钮来操作这台机器。西蒙娜也学会了用这台机器堆雪球。
你曾经是一名开发人员,学会了操作机器。Simone
曾经是一名操作员,学会了如何开发雪球。
所以现在你们俩都是开发人员,同时也是操作员。你们就是 DevOps。
一个冬夜,你去拜访西蒙娜。
突然,仙女又出现了。
“你还剩一个愿望,”仙女说。
“轮到你了,”你对西蒙娜说。
西蒙娜默默地在椅子上坐了一会儿。
突然,她跳了起来。
她笑着说:
“我想要一个机器上的按钮,可以堆雪球和扔雪球。
我和我的朋友都可以用。
别再坑我们了。毕竟我们是 DevOps 的。”
持续集成/持续交付
容器
五岁?好吧。
容器是一个盒子,里面装着制作单个玩具所需的所有零件。你可以用多个容器来组合你的玩具,创造出更多更好的玩具。有些盒子里只有零件,你需要多个盒子才能制作单个玩具。
虚拟机就像一个装有玩具零件的盒子,但每次使用玩具时,您都需要先吃蔬菜。
Docker 是一个可以装玩具的盒子的名字。它是最常用的,看起来像一条鲸鱼。
Azure 容器服务以及 AWS 和 GCP 的类似选项可以作为粘合剂,将 Docker 盒组合在一起,打造更好的玩具
Docker 和 Kubernetes
Docker 镜像:将它们视为蓝图,例如创建一头牛的蓝图。
Docker 守护进程:可以将其想象成让牛自由奔跑的畜栏。
Docker swarm(和 Kubernetes):可以将其视为管理奶牛的牧场主。
假设您使用相同的蓝图(docker 镜像)创建了许多奶牛(docker 容器),并让奶牛在畜栏(docker 守护进程)中做它们的事情。
你把所有的奶牛都放在一个地方,但是那里变得非常拥挤,它们会吃掉周围的所有东西(资源),你需要将它们重新分配到其他地方,否则它们就会死亡。
你雇佣了一位名叫 Kubernetes 的牧场主,并告诉他所有其他牛栏(节点)。牧场主会检查每个牛栏的容量(资源)是否足够。当牛栏食物不足时,牧场主会负责将牛转移到食物更丰富的区域;如果牛因任何原因死亡,牧场主也会负责为你创建新的牛。
牧场主负责尽可能高效地优化您的牧场,并使其规模化,前提是您告知他所有允许将奶牛迁移到的地点。您还可以告诉他牧场的规模只能扩大到一定程度,或者根据人口的乳制品消费需求动态扩大规模以生产更多牛奶(自动扩展)。
我遗漏了什么吗?
如果您发现其他具有启发性和简洁性的解释,并且仅使用类比、文字和图像,没有使用代码,请在评论中添加它们:)
好了,感谢阅读!如果你想向读者提问,可以在我的“提问”页面https://jmfayard.dev/上提问。
想象一下一家餐厅。您有迎宾员(CDN)和服务员(反向代理)来引导顾客(用户)到他们的座位。
当他们到达那里时,服务员(前端开发人员)会为顾客提供愉快的体验(UX)并为他们提供食物(数据)。
在后台,有厨师(BackEnd Devs)做准备工作,有洗碗工(SRE)确保一切干净、准备就绪,还有厨房经理(DevOps)确保后台的一切都设置得顺利运行。
SPA 的运作方式类似于自助餐,它将更多的工作留给客户自己去做,并将更多的重点放在前端。
全栈开发人员适合做什么?他们是餐厅经理。他们可以适应任何职位,并且能够快速成长,因为他们可能在某个阶段从事过各种职位。
要成为一名优秀的全栈开发者需要付出很多努力。以至于有些其他类型的开发者甚至否认他们的存在。
事实是,成为一名合法的全栈开发人员最困难的部分是反抗你的雇主,这样他们就不会把你限制在一个非常狭窄的角色中。
许多开发者很乐意在狭隘的岗位上获得高薪。追求全栈是一条艰难的道路,为此牺牲的时间/精力可能并不值得。
就像每家餐厅都希望拥有像戈登·拉姆齐 (Gordon Ramsey) 这样出色的餐厅经理一样,公司也非常希望自己的团队中拥有出色的全栈开发人员。
但是!很少有公司会投入时间和资源来把开发人员提升到那个水平。
如果工作条件恶劣,并且很难更换且更换成本高昂,那么 FullStack 开发人员可以更自由地迁移到其他地方。
全栈开发人员有能力提升每个人。但公司并不想让开发人员达到全栈级别。