Hello world,大家好,我是 pshu. 今天码农英语课堂的第六期来和大家说一个 docker 相关的冷知识.
首先讲下"冷知识"这个词.。要一个比较地道的翻译的话,我个人觉得 trivia是一个比较好的单词.
- Trivia:
- The act of answering questions regarding information that is often useless or inapplicable
回答那些无意/无用问题的行为.
那今天的"冷知识"(trivia question)是:
* 当启动一个docker 容器时, 默认的容器名字是什么? *
- CONTAINER ID IMAGE COMMAND NAMES
- eee4de167f06 hello-world "/hello" peaceful_mcnulty
- 783ab628a474 hello-world "/hello" suspicious_jones
- 5767cd8dc7c0 hello-world "/hello" heuristic_bassi
- cc4623db38ad hello-world "/hello" elated_montalcini
- e8bb358ada71 hello-world "/hello" sleepy_kilby
- 6e67c5398a72 hello-world "/hello" boring_kowalevski
- 21ffb481d971 hello-world "/hello" angry_euler
- 8c9322287dff hello-world "/hello" keen_mayer
简单的说,默认容器名为"${形容词}_${人名}"的格式.
但是再深入的问一句,那些人名是谁呢? 一共多少个这样的组合呢?
源代码说明一切 /pkg/namesgenerator/names-generator.go#L105
https://github.com/moby/moby/blob/b5f68d7ed3a2a9db7bdbfd3bdee42d9d1a7e5423/pkg/namesgenerator/names-generator.go
源码中的 left 是 93 个形容词的数组,褒贬的都有; right 是 160 位知名科学家和黑客的名字.
- func GetRandomName(retry int) string {
- begin:
- name := fmt.Sprintf("%s_%s", left[rand.Intn(len(left))], right[rand.Intn(len(right))])
- if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
- goto begin
- }
- if retry > 0 {
- name = fmt.Sprintf("%s%d", name, rand.Intn(10))
- }
- return name
- }
那看到代码其实会有两个吐槽点.
1.关于 goto
pshu 在接受大学计算机编程教育的时候,老师就提到使用 goto是一个坏的编程习惯. 所以很多接受过类似说法的同学都是对这个 goto嗤之以鼻. 其实恰恰相反,这个 goto 其实让代码变的更加的容易理解.
那关于 goto有害的说法是怎么来的能,这里就是介绍今天的这位荷兰的大神 Edsger Wybe Dijkstra. 中文一般音译为"狄克斯特拉".
其实叫他大神我觉得有点太不严肃,应该称作是计算机行业中的先贤. 像图论中寻找两个之间最短路径的算法 Dijkstra算法就是 Dijkstra 发明的. 除了算法方面, Dijkstra 在并行计算(concurrent programming) 领域也是开拓者. critical section (临界区) 和 Dining philosophers problem (哲学家就餐问题), 都是他提出来的概念.
回到 Goto 的问题上,关于 goto "有害"的历史是怎么来的呢?
- While Dijkstra had programmed extensively in machine code in the 1950s, he came to the conclusion that in high-level languages frequent use of the GOTO statement was usually symptomatic of poor structure. In 1968 he wrote a private paper "A Case against the GO TO Statement", which was then published as a letter in CACM.[59] Editor Niklaus Wirth gave this letter the heading "Go To Statement Considered Harmful", which introduced the phrase "considered harmful" into computing.
Dijkstra 在20世纪50年代大量使用机器码编程的经历;就此经历,他提出了"在高级编程语言中频繁使用 goto 通常是程序结构不好的征兆." 1968的时候, 他写了一篇小论文 "A Case against the GO TO Statement", 标题大意,就是一个不要用 goto 的案例. 结果在 CACM 发表的时候, 编辑把标标题改成了 "Goto 语句"被认为是有害.
想不到***以讹传讹,直接给很多学编程的学生心里立下了 goto 就是烂代码的 flag.
这段代码的第二个点就是 /* Steve Wozniak is not boring */
2. the Woz
国内翻译成沃兹,提到沃兹就不得不提苹果这家伟大的公司了. 对苹果这家公司,最有名的肯定是 Steve Jobs 了; 但这个 Woz 是和 Jobs 一起称为苹果双核的人. 当年沃兹发明的 Apple I/II 这两台苹果电脑, 可以说是开拓了个人电脑的新时代. 苹果还有一个第三号创始人 Ronald Wayne,他仅在苹果工作了12天; 他是这样评价这两个人的:"乔布斯有时如同恶魔附身,而沃兹尼亚克则像个被天使控制着的孩子。" 当Apple II热销之后苹果股票大涨, 沃兹就拿出八万股票以很低的价格卖给那些他认为没有被苹果善待的老员工.
除了这些 Woz还有哪些让人觉得不一般的事迹呢?
- 6岁就做出半导体收音机, 而且是全美最年轻获得业余无线电操作证.
- 和 Jobs 制作贩卖盗打电话的设备, 并用此设备恶作剧假装是基辛格打电话给意大利教皇打电话.
- 自建了一个讲笑话的电话热线,虽然亏钱,但靠这个热线遇到了***任太太
- 带着第二人未婚妻,开飞机,坠机,所幸***无大碍.
这些经历看, Woz 绝对不是一个无趣 boring 的 人.
还有一点是 Woz 是 Sheldon 的心目中排名15的最有科技远见的人(Steve Jobs 排在第21位) ,因为版权问题,请各位同学自行搜该视频片段吧.
***小结下
当面对 "docker 容器的默认名字是什么?"这样的trivial question 和 "Goto 语句是否是有害"的复杂问题时. 如果能抑制住内心想用一个简单答案来回答的冲动,保持着一颗好奇心,慢慢探索,多多思考. ***获得的肯定会比问题本身更有价值的知识.
***祝大家 happy hacking & happy docker!