茱莉亚·伊万斯

所以你想成为一个巫师

今天我在SRECon开幕式主题。这个演讲是一个少技术比我正常会谈:而不是谈论工具如tcpdump(尽管tcpdump出现!),我想谈谈如何做一份你不断学习的职业,以及如何做好你的工作,不管你是不是最有经验的人。

这是视频,说得抽象,然后幻灯片和一个粗略的记录。我包括我提到每个资源的链接。

视频

来源:usenix的网站

摘要

我不总是觉得自己是个巫师。我不是最有经验的成员在我的团队,像大多数人一样我有时找工作困难,我还有很多要学。

但是沿着这条路,我已经学了一些调试棘手问题的方法,从我的同事获得我需要的信息,完成我的工作。我们来谈谈

  • 如何问愚蠢的问题实际上是一个超级大国
  • 当所有其他方法都失败时,如何将源代码读取到程序中
  • 使您感觉像向导的调试工具
  • 如何理解你_organization_ needscan让你惊奇
最后,我们将有一个更好的理解如何做很多很棒的东西即使你不是向导团队的最高水平。

所以你想成为一个巫师

(这份成绩单远非完全忠实;有相当数量的我想说/我说,一种,我想“在这里:)

您可以单击任何幻灯片来查看更大的版本。

这次演讲被称为“所以你想成为一个向导”.作为一个向导的主要问题是,当然,电脑不是魔术!它们是你能完全学会理解的逻辑机器。
所以这篇演讲实际上是关于学习难题和理解复杂系统的。
我在 条纹.(这是 工作描述)。
我的团队负责大量的东西。我经常发现我们负责的新事物。哦,我们有GPG密钥服务器吗?可以!!“)
这意味着我(像你们许多人一样!)需要了解大量不同的系统。大约有一百万件事情了解Linux &网络,AWS平台真的很复杂,有很多确切地知道它是如何工作的。

而且似乎还有无数的新技术需要学习。例如,我们正在研究Kubernetes,和操作Kubernetes集群etcd运转的需要,这意味着您需要理解一系列分布式系统概念,以确保您做得正确。
为了有效地完成我的工作,像你们中的很多人一样,我需要不断学习新东西。这个演讲是关于如何做到这一点,我为什么喜欢它。
这里有向导能力我们要讨论在这个演讲!!
在软件工程中,我认为这是非常重要的理解这两个系统,是一个小比你高级和低级别的系统。

在可靠性工程中,我们下面的生活通常是系统的东西”像操作系统和网络。上面我们之类的业务需求和计划我们试图使运行可靠。

这篇演讲主要是关于理解下层系统,但是我们也要谈一下人类和如何确保您正在构建正确的事情:)
作为快速旁白,我认为理解计算机网络非常重要,所以我写了 关于它的全部报道,你可以在演讲结束时再听一遍。
那么,为什么理解您使用的系统很重要呢?吗?
我认为主要有三个重要原因:

第一,理解力 行话真的很有用。如果有人说“嘿,这个过程被了伯父杀手”是有用的知道这意味着什么!(我们稍后将讨论什么是OOM杀手)

第二,它让你 调试更困难的问题.当我第一次设置Web服务器(Apache)时,也许8年前,我不太理解HTTP协议,也不明白我使用的许多配置选项到底意味着什么。

因此,我通常通过Google和尝试随机修复来进行调试。这在当时是一个非常可行的策略(我让Web服务器工作!),但今天当我配置网络服务器,对我来说,真正理解自己在做什么,确切地说我期望它产生什么效果是很重要的。现在我可以更容易地解决问题了。

雷切尔比海湾是调试故事的大集合,很显然,她非常深刻地理解自己使用的系统。

最后一个原因是——对您使用的系统有扎实的理解可以让您轻松工作 创新.我认为Docker就是一个很酷的例子。码头工人不首先使用名称空间(内核的特性之一 人们打电话来容器”“),但为了让人们喜欢使用一个工具,码头工人开发人员必须有一个很好的理解什么特性的Linux支持孤立别人的过程。
像Linux系统起初看起来很吓人,特别是如果你想要了解的一些内部一点。这就像400万或1000万行代码之类的东西。
因此,让我们讨论一下如何一次一个地打破知识片段,以便您可以应对挑战!!
我的第一个最喜欢的事情是 学习基本概念.

这是非常有用的,在网络,如果你知道什么是包,它是如何放在一起,然后它确实有助于处理其他更复杂的概念。

让我给大家讲一个关于如何学习系统调用的简短故事。
递归中心12周编程撤退在纽约,你可以去有趣的新事物了解编程。三年前我去。RC是关于学习你感兴趣的任何东西(低层次的东西?花哨的前端技巧?函数式编程?使冷却和编程艺术吗?),和我去部分更好的理解操作系统的目标。

当我到达RC,我学会了系统调用!(这里是 在我得知)。系统调用是应用程序与操作系统的谈话方式。我感到有点难过,我不知道他们之前,但重要的是我学会了!那是令人兴奋的!!
这是这篇演讲中唯一的家庭作业:)

TCP协议运行很多我们每天使用互联网。通常它”只是工作”你不需要想一下,但有时,好,我们需要考虑一下!因此,理解基础知识是有帮助的。

我开始学习TCP的方式,我写了一篇 在Python中TCP协议栈!这是非常有趣的,没花那么长时间,我学到了很多通过它和写作,我学到了什么。
我也想做 实验.
你可以故意让你的笔记本耗尽内存!我会告诉你发生了什么(还记得“OOM杀手吗?这个系统在Linux内核中开始就杀死程序在您的计算机!),但我认为这可能不是一个好的演讲的现场演示:)。

我认为这种实验很棒,因为服务器在生产中耗尽了内存,看到很酷,看起来像原因以及如何在一个安全的环境。(提示:如果你跑步)德梅格和搜索“伯父”它会显示你伯父杀手活动)
也在递归中心,我决定在Rust中编写一个小操作系统.事实证明,在不知道Rust或操作系统的情况下,在3周内编写操作系统是困难的,所以我最后写了一个键盘驱动程序。

通过这样做,我学到了很多——你可以 阅读更多关于它
这些规则我喜欢编程实验。
有时我喜欢看书!两本书我了解到在过去几年 网络系统管理员& Linux内核开发.Networking为系统管理员编写系统管理员希望能够做基本的网络任务不用问他们的网络团队。我不是一个系统管理员,和我没有网络团队,但是我学到了很多通过阅读这本书。
另一件我发现超级有用的是尝试读东西或看会谈 对我来说太难了在时间。例如,阿皮尔有一系列令人惊叹的东西 关于分布式系统故障的帖子(那些被叫的)Jepsen”)。当我开始阅读这些文章,说实话,我不太了解他们。我不明白”linearizable”的意思,我从来没有使用过分布式数据库。所以有时我读一篇文章,理解可能只有20%。

当我学会了越来越回到他的写作,我能够理解更多!我还不是分布式系统专家,但是我很高兴我尝试阅读这些帖子,即使我不太理解它们。

我提到的那本Linux内核开发书籍有点相似。它的目标是为您提供成为Linux内核开发人员所需的工具。我不是一个Linux内核开发人员(或至少没有!)。但我通过阅读这本书学到了一些有趣的事情。
另一个也许显而易见的策略是使用在你的工作。最近我需要向HTTP代理添加一些日志记录。这是一个相对平凡的任务,但我学到了更多关于HTTP代理工作完全通过它!这是酷!!

是有用的为我记住,我能学到一些东西,即使我工作有点例行公事。
这是最后一个,也许最重要的事情。我有大量的系统如何工作的模型在我的脑海里。有时,电脑上发生的事情与我的模型说的不符!!

作为一个小的例子,最近我们有一个电脑是交换,尽管它有16 gb的空闲内存。这并不符合我的心智模型(“电脑只交换内存磁盘时的记忆”)。显然我的模型出了问题。所以我调查了,我学到了一些关于交换在Linux上如何工作的新知识!!
事实上,实际上有至少4 Linux机器可能交换的原因。

1。您实际上可能没有RAM。

2。你可以主要是“RAM。“vm.swappiness”sysctl设置控制可能的机器是如何交换。这不是发生在我们身上的事,不过。

3.cgroup可能的内存,那是当时发生在我们身上的事情。 这是我写的博客).

4。还有一个4原因之后我学到了:如果你没有交换,并且您的vm.overcommit_ration被设置为50%(这是默认值),您可能最终处于只能使用一半RAM的情况。那不是很好!! 这是一篇关于过量使用Linux
因此,理解交换实际上并不那么简单。事实上,有一本很酷的200页的书 理解Linux虚拟内存管理器.它还有一堆带注释的内核代码处理内存管理,太棒了。

我很高兴我挖了一点,因为现在我理解这部分Linux是如何工作的更好!!
因此,甚至理解一些看起来比较基本的东西,比如电脑什么时候开始交换吗?“能需要一段时间!有很多知道,完全可以不马上知道。
一个小故事在我的Linux的旅程:

在2003年,当我15岁时,我妈妈给我买了一台闪闪发光的新电脑。我对Linux非常兴奋,所以我安装了大量的不同的Linux发行版。(另外,谢谢妈妈!!我超级幸运有一台电脑,我可以反复博克和做大量的实验时间和空间)

2009年左右,在大学,我是7台Linux和Windows计算机的小实验室的系统管理员之一。老系统管理员说嘿,要帮忙吗?“,给我根密码,我们混乱的方式通过让计算机工作一堆数学本科生。

2013年,我学会了什么是系统调用操作系统和一些基本的事情!这真是太棒了。(这是我学到的一切 在递归中心
<现在我仍然继续学习。
接下来,我将要讨论的向导技巧是提出很棒的问题!!
我最终遇到的一个很好的情况是,我有一个同事,他知道一些我想知道的事情,他们想帮助我,我只需要找出正确的问题来得到我想要的答案!!

问好问题真的很重要,因为人们通常不能魔术般地猜测我想要他们告诉我什么。
是我最喜欢的一个技巧 状态我所知道的,以此来阐述我的问题。
说我所知道的是可怕的,因为它能帮助我整理我的想法,揭示误解(我)我知道X”,他们:“这不是完全正确!“),和帮助我避免回答,是太简单了(是的是的是的,我知道!)和高级(没有请先备份30步骤)。
提问时,很自然地想问最有经验的人在你的问题。他们可能会知道答案,这很好!但我不认为这是最好的策略。

相反,相反,我尽量记住问一个经验较少的人,我认为谁还会知道答案。
这太棒了,因为它减少了有经验的人的负担。但是还有更多的理由证明这是伟大的!我不是最有经验的团队成员。我爱它当人们问我的问题,因为,如果我不知道答案的问题,这样我就能发现,和我可以增长自己的知识。

因此,不问最有经验的人实际上是一种向经验较少的团队成员表示信任的酷方法,减少公共要素,和传播知识。
做研究是伟大的!它让我提出更复杂和有趣的问题!!
我真的很喜欢问比较容易回答的问题。是的/没有问题是一个很好的方法来做到这一点!通常一个有趣的是/否的问题会导致一个伟大的讨论。
在调试或修复东西时,通常你可以在情况超经验的人知道如何做一件事时,和团队中的其他人不知道。

而且他们常常难以记住所有的细节来记录它们!所以我喜欢(某人做某事)后要求他们解释他们所做的,或者问我可以看到当他们这样做。
的最后一件事我不得不说关于询问的问题,尤其是高级工程师/经理/领导者在公共场合,请提问。我发现它更容易为高级人承认他们不知道的东西(因为大家都知道你能干了!),这样做真的创造空间给大家提问。
好吧,我们来谈谈读代码吧!!
有时错误消息并不特别有用。如果你去读错误消息的代码有印刷,有时你可以得到更好的线索,关于发生了什么!!
更重要的是令人兴奋的我,虽然,是读代码当软件记录不良(这发生,尤其是当它经常变化或者没有被很多人使用的时候)
我想强调的是,阅读代码不仅仅是为了您熟悉的小项目,不过。

在我的第一份工作中,我正在写插件,用Drupal制作网站,PHP内容管理系统。我记得我曾有过一个很具体的问题一些Drupal的事情是如何运作的。没有记录,并没有在谷歌当我看到结果。

当时我问老板他是否知道,他告诉我茱莉亚,你只需要去阅读代码,了解它是如何工作的!“.我有点不确定如何处理它(“代码太多了),但他指出我到Drupal相关部分的代码库,而且,果然,我可以看到我的问题的答案!!

从那时起,我查看了一些用于回答问题的大型开源问题的代码(nginx!Linux!),即使我不是一个超级好的C程序员,有时我能想出问题的答案。
现在我们要谈论我最喜欢的事情之一!调试!!
让我们讲一个故事吧!有一天,我们有一个客户机正在发出HTTP请求,它没有得到40毫秒的响应。这是很长一段时间!!
为什么很长时间吗?客户端和服务器在同一台计算机上。我预计要快的服务器,所以没有理由40毫秒延迟。
说句题外话,每秒40毫秒同步是25个请求,这真的不是很多。很容易看到这种延迟可能会迅速成为一个问题。
我用Wireshark捕获了一些数据包,以找出应该归咎于谁——客户机还是服务器!!

我们发现,客户端将发送HTTP头,等待40ms,然后发送请求的其余部分。所以服务器不是问题!但是为什么客户这么做?它是用Ruby写的,最初我或许认为我们应该责怪红宝石,但这并不是一个很好的理由(40女士是一个很长的时间,甚至在Ruby中)。
结果发生了什么是坏两个TCP优化——延迟ack之间的相互作用,纳格尔的算法。当客户机发送第一个包时,服务器等待发送ACK(是因为延迟ACK算法),客户端正在等待该ACK(因为Nagle的算法)。

因此,他们陷入了这种被动-积极-等待的境地。

我写了一篇博客文章 为什么您应该(稍微)了解TCP如果你想知道更多。
当我们设置TCP_NODELAY套接字选项,它阻止客户机等待,然后一切就快!!
前一段时间我才意识到我觉得我更好地调试了很多是我的第一份工作,我想出了一些原因,我认为它更容易了!!
有时当我点击错误,特别是不确定性和难以复制错误,人们很容易认为“哦,你知道,事情发生,谁知道呢”.但事实上是所有在电脑上发生的一个合乎逻辑的理由(无论电脑否则可能会试图说服你)。提醒自己,帮助我修复bug。也称为“朱莉娅,造成这种情况的真正原因不是不公平吗?““
接下来,信心!!
不久前,我在Hadoop的工作中处理了一个性能问题,它花了我两周的时间来修复(参见 一毫秒的时间并不快)。如果我没能修好,我就会感觉很糟糕,就像浪费2周。

但是我们处理相对较小数量的记录,它正在15小时,这是不合理的,我知道工作太慢了。我明白了,现在快,每个人都快乐。
从那,我知道浮点求幂很慢,那1000张唱片/秒并不多。
的工作是处理1000条记录/秒。不过,我发现这在当时很难去思考——那是否太多了?不是很多吗?我应该知道怎么样?吗?

所以我决定我要花一些时间来训练我的直觉应该速度不同的计算机操作。
我把这个游戏叫做 计算机是快速和我的伙伴卡马尔。你可以在线播放,我们要玩现在一点!!
假设您有一个索引数据库表,有1000万行。需要多长时间选择一个表的行吗?你能做多少次每秒?吗?

我们的目标不是确切地知道,但我觉得,达到一个数量级是有用的。所以你能在第二个做100次吗?10日,000?1000万次?吗?
原来答案在我的笔记本电脑是55,000次!(或者,大约需要20微秒,在Python中)
对于我来说,拥有更好的工具来回答有关你的程序的问题也是非常有帮助的!!

当我开始,我没有很好的工具!但是现在我知道了各种剖析器了!我知道斯特拉斯,tcpdump、还有更多的工具可以弄清楚发生了什么。这有很大的不同。
我写了一个整体锌调试工具,帮助我回答问题。你可以在这里读到: Linux调试工具你会喜欢
但是也许最重要的是我学会了喜欢调试!我过去遇到虫子时总是脾气暴躁。我觉得他们刚刚在路上!!

但这些天来,当我遇到一个神秘的错误,我认为这是一种乐趣!我得以提高我对与我一起工作的系统的理解,太棒了!!
现在我们要缩小一下讨论网络和微秒的距离,并讨论如何设计工程项目。这件事真的对我帮助很大!!
有很多话对设计文档,但它们基本上都是一样的想法——你在做工作之前写下你要做的工作。
当我开始写Stripe的时候,我觉得写东西有点傻。为什么我就不能开始做这个项目呢?吗?

但从那时起,我学会了发现它们真的很有用!( 学习喜欢的设计文档)
我担心如果我写一份文件,我得到了太多的反馈,或完全沉默。

我学到的一件事是,刚开始只是和几个人一起分享一个设计是很有用的。像我展示给其他几个人在我的团队,看他们是怎么想的,然后做出改变!这并不总是必要问每一个人可能有一个意见。
我也学会了喜欢设计小项目。最近我在一个小项目,只花了一个星期。我的组长问我是否能很快写出我们要做什么。

我花了大概45分钟写了计划(超级快!),我给经理另一个团队,他有几个不同的他让我做的事情,他很高兴我写一个计划,让他明白发生了什么。令人惊叹的!!

小项目非常顺利,我真的哈佩首先我写了一个东西。
你怎么知道在设计文档中写什么?我真的很喜欢先写电子邮件、公告我们刚刚完成这个项目。

这是伟大的,因为它迫使我说清楚为什么项目是很重要的(我们为什么要花费那么多的时间在它),它将如何影响组织中的其他团队和别人需要知道,以及我们如何知道我们实际上达到了项目的目标

最后一件事真的很重要——比我想承认的更多,我到了一个项目的结尾,意识到我不太确定我们如何判断这个项目是否真的会改善一些东西。开始规划,有助于确保我们把正确的度量!!
谈论风险也是有用的!其实我还没做到这一些,但一个很酷的主意我听说最近找出风险做一个“临终前”为你的项目。这是电子邮件公告的反面——相反,你想象,项目失败的6个月,确保你理解为什么它失败了。
当我开始写的设计,我过去常常担心我的设计会出错,因为事情会改变。事实证明,这完全是真的——设计很少接触真实的世界生存。优先顺序改变,你没想到遇到的技术挑战,各种各样的事情可能出错。

但这并不意味着它根本不值得设计!我喜欢明确地写下我的假设,因为当事情发生变化时,我可以回过头来看看我们之前的假设不再是真的,并确保我们更新所有需要更新的内容。有一个记录的变化是有用的!!
我们已经到达最后一个向导技巧!!
有时我工作有点无聊,我想知道……我为什么要这样做?吗?

我通常发现它可能保持动力如果我能记住”好吧,我花了几个小时在配置nginx,这很无聊,但就在这个很酷的目标服务。““

但是,如果我*不记得目标(或者我正在做的实际上没有意义),它糟透了。
我现在正致力于解决这个问题的解决方案是,以您可能带给一个普通bug的那种兴奋和好奇心来处理项目计划!!

我试着更好地说"好吧!!!这个项目!它有一些缓慢而困难的部分,那它为什么这么重要呢?为什么我们会感觉很棒的时候做了什么?哪些部分最重要?““
我有很多的自主权在约我去上班,所以,当有人问我做某一件事,我想确定自己明白为什么它很重要。通常如果我不明白,正确的做法就是找出为什么它很重要(通常是真的!))。

但有时候我接受的任务可能只有80%的人想过,当我去理解做这件事的确切原因时,事实证明,我们不需要去做!(或者也许我们应该做一些完全不同的!)
和理解大局帮助我做更好的技术决策。!
像很多人一样,我想了很多关于我的工作的影响,我真的在这里做什么。凯尔茜·海托尔有一系列令人惊奇的作品。 今天的微博.这里有几句话。

>我还没有找到一份完美的工作或工作呢,但是我已经找到了一种在科技领域过更有意义的生活的方法。

我现在把人放在第一位。不管涉及的技术我喜欢帮助别人。

>的人提供一个比电脑更好的反馈回路或企业的抽象概念。

我工作的每一件事情都有一个特定的人或一群人的想法;这就是我的工作意义;解决问题是不够的。
在这次会议期间,我希望你问一大堆问题与这个“理解发生了什么都是“更好的东西。有很多了不起的人学习!!
我分发有趣的网络杂志在这个演讲的结束。如果你想阅读电子杂志,它在这里: 网络!ACK !!

交换,内存限制,和并且 写下我的事业