代码是怎么打出来的,代码怎么输入进去

首页 > 经验 > 作者:YD1662024-04-01 02:27:44

道理上讲,环形队列入队 tail ,出队 head ,先有入队,才会有出队,所以 tail 一定比 head 大。那为什么上面代码里,除了判断 tail - head == 0 以外,还一定要加上当 tail < head 时也认为空呢,这根本不可能发生啊?

实际的原因是,由于该环形队列是无锁的, tail 和 head 之间不保证任何同步,那么就可能由于调度因素,导致不同线程读到不同时刻的值,结果 tail < head 就真的产生了。

想要搞清楚这种场景,最好的办法就是真正执行几百万次测试,通过条件断点让代码在发生 tail < head 时停住,再观察内存中的值来解释。

4. 写篇文章讲讲整个设计

代码看个七七八八,差不多就对设计和实现都有一定的认识了。这时候心里多少会有点冲动想要把获得的知识讲出来。那么最好就是写篇文章,写文章可以对知识进行梳理,在写的过程中也会不断加深印象。随着文章的撰写,作者的设计意图亦会越来越清晰,对软件的理解也会越来越深刻。

整理大纲

写文章,目录最关键。一篇文章是不是有逻辑性,结构是不是清晰,全都在大纲的设计上。

既然我们的内容是讲软件的设计与实现,那么文章的大纲就可以按 Why - What - How 来展开:先告诉读者为什么要设计该软件,它解决了哪些问题。之后讲述软件的架构模型、关键模块以及主线流程。最后详细地讲解具体实现。

在写文章之初,我们的知识还不够深入和整体,可以先写 what 和 how 的部分,加深理解之后,就能明白设计的 why 了。

以我写的一篇介绍 Go 语言 Runtime 计算模型设计的文章目录为例:

代码是怎么打出来的,代码怎么输入进去(9)

可见大致就是按照 “设计意图和目标 -> 核心概念解释 -> 具体实现 -> 总结拓展” 这样的顺序来设计的整体文章结构。这种结构清晰、简单明了的目录结构很适合用在技术文章上。

描述设计原理,通过画图帮助分析设计意图

在介绍原理和实现的时候,相比于贴代码,更好的方式是通过画图来表达。代码的确能体现全部的设计细节,但代码更重要的任务是作为知识和硬件指令之间的桥梁。相反,如果我们用图表的形式表达设计意图,就会对人类更友好,更容易阅读、理解和学习。画图本身也是一种加深理解,去粗取精的过程。

下图是我读了 leveldb 之后画的 leveldb 存储架构图:

代码是怎么打出来的,代码怎么输入进去(10)

作为存储引擎,LSM Tree 的实现是 leveldb 的核心,leveldb 本身源码已经很清晰、简洁,但如果通过上面这样一张图来讲述其 LSM Tree 的具体设计,一定会比贴代码要易懂得多。

想一想,为什么要这么设计,好处在哪里?

当我们能用图表和文字来表达出软件的完整设计后,我们对代码的理解已经比较透彻,甚至,让我们自己来照着写一个新的也不是不可能了。

这个时候,就应该进一步的思考,如果是我自己来解决问题,我会怎么做?我能比原作者做得更好吗(通常不能)?

在思考为什么这么设计的时候,如果相关领域知识不充足,就会驱使我们去查找很多参考资料,了解和借鉴别人看问题的角度。找资料的过程总有惊喜,如果能读到一些非常深入浅出的文章,而后就会怀着敬佩之情,收藏、关注作者的博客,想想如果不是因为读了某段代码,还真无缘遇到这些精彩的文章和优秀的作者。

我在读 Go 语言内存管理代码的时候,一开始搞懂了 tcmalloc 的原理和实现,但对其所谓线程缓存、无锁分配等等卖点理解不深刻。直到回过头去读了 CSAPP 动态内存分配的章节,又结合 ptmalloc、jemalloc 的设计,相互对比理解,这才更清晰的认识了 tcmalloc 的设计决策。

经过这一阶段的思考并结合其他人的理解之后,我们就能清楚地意识到,软件所面临问题的限制条件是什么,作者这样设计的好处有哪些。把这部分写完,添加到文章的最开始,就比较完美了。

这一节讲了一点关于写文章的内容,对于技术写作,推荐 Thoughtworks 洞见团队出品的 《技术写作手册》。

5. 讲个 session,收获 Extra Bonus

如果还有精力和兴致,那不如把文章的内容提取出来做个 Session 讲给大家,额外的付出能收获额外的奖赏。

有过做讲师经历的同学肯定会知道,给别人讲东西,收获最大的不是听众,而是讲师本人。想要输出一小时的 Session,所花费的准备时间可能要十个小时。我们需要花费数倍于讲解的时间来完善素材,理清思路,准备问题,甚至还包括思考可能会涉及到的拓展内容。做这些工作在提升我们 session 质量的同时,无形中也不断地强化了我们对相关知识的认知。

梳理要点,逻辑自洽

一个 Session 成功的基础在于能不能逻辑自洽。而逻辑自洽的前提就是关键要点必须清晰,并且前后可以呼应。

上一节提到的文章,正好就是 Session 材料的源泉,因此我会反复遍历整篇文章,期望从中抽取所需的内容。这个过程往往伴随着不断地发现文章的内容缺失、逻辑不通之处,这时文章就得到了进一步的改善。所以经常发现,当整个 Slide 完整的顺下来后,不仅成就感爆棚,文章也丰满了,理解还更深刻了。

去粗取精,锻炼表达

相比写文章,讲 Session 要我们进一步的去除细节,只保留最核心的思想,这本身是对抽象能力的一种锻炼。

另外,自己了解清楚,和能给别人讲清楚是完全不同的两种概念。如何能把核心知识讲给听众,并且能让听众更容易的听懂,需要仔细地思考语言的表达。每一次成功的 Session 都是对自己表达能力的一次提升。

表达上最常见的问题就是照着文字念。我个人喜欢通过减少 Slide 中文字的数量,来倒逼自己提升表达的逻辑性与连贯性。可以尝试思考,如果内容只是一张图,那么要怎么讲清楚这张图,用这种办法训练表达能力。

揣摩听众感兴趣的方向

考虑听众的感受也很重要,如果讲的内容大家不感兴趣,不爱听,或是晦涩难懂,跟不上节奏,就容易导致整个 Session 反响寥寥,大家会觉得来听你的 Session 浪费了自己的时间。

所以不仅要能讲清楚,还要揣摩听众感兴趣的方向。合理的设置内容,去除枯燥乏味而非关键性的东西,并且调整讲解的顺序,把易懂的、精彩的部分穿插放置,这样就可以不断地激发听众的兴趣。

最后,线下组织的效果要比线上视频讲解好得多。在线下听众的注意力更集中,互动效果好,演讲者也更容易通过听众的表情、神态来判断是否需要调整内容和速度。如果因为条件限制一定要做视频 Session,那么可能需要经常停顿下来问些问题,或是主动的寻求反馈。

6. 结语

本文是我日常读代码的一点经验,总结下来,就是要

最后祝愿所有读者都能从代码中获得最大的乐趣。


文/Thoughtworks 张旭海

更多精彩洞见,请关注公众号Thoughtworks洞见

上一页123末页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.