Linux内核社区极限生存经验与教训总结
其他的文章主要讲解如何通过git format-patch和git send-email来产生和发送patch等,本文则聚焦Linux内核社区的极限生存,尤其是在修改公共的调度器、内存管理等代码,在遭遇各种困难的情况下,如何让代码能够推进。本文所总结之经验和教训,为笔者一家之言,欢迎同行专家修正指点。首先Linux社区绝非爱心幼儿园,每个人都爱你,对你笑脸盈盈。它可能恰恰相反,这里鲜有鲜花和掌声,而多有质疑和拷问。在里面生存与成长,尤其想真正干点什么有用的事情,是需要一颗强大的内心的。1. 发送补丁前,是否对问题和问题的解法自己内心已经足够清晰?发送公共部分修改的时候,不能把其难度想象为修改一个局部的只会影响少量人的驱动、一个内核模块等,而是要充分考虑它对所有人的影响。回答如下问题:a. 问题是不是共性问题?如果是,我的解法是否足够抽象,概念模型是否清晰?如果不是,你的解法是否影响到了其他代码,比如你为了解决消费电子的问题,是否搞坏了服务器的代码。b. 我是否充分且清楚地描述了我的问题。切勿在changelog等东一榔头、西一棒子地抓不住重点啥都说。建议就是围绕3个东西来展开论述:1.什么问题?2.我的解法。 3.解法的收益数据。2. 发了patch长期无人理会怎么办?或者第一版被人理会了但是第二版第三版长期无人理会。首先是绝对不要放弃,接着发,每隔一段时间重新rebase发一次。另外,patch长期无人理会,往往存在一个可能性,就是它解的问题对别人来说不是问题,关心的人少,找不到有共同利益的人。所以,我们是要寻找和你有共同问题的人,无论是线下和线上。比如你发的patch可能是针对你的ARM服务器芯片的,发了长期没人理,但是你找到Intel、AMD的人,发现他们也有一样的问题,这样“把我的问题,变成大家的问题”,一旦变成了大家的问题,大家一起嚷嚷的时候,就要比自己一个人嚷嚷的效果要好很多。再一个可能性就是要在社区找到一个大佬的腿来抱,比如大佬发的patch你也经常去review一下,测试一下,点评一下,甚至发个很感兴趣的感谢信,顺便讨论几个技术问题,也可以让大佬对你的身份ID熟知,这样当你发patch的时候,他可能会特别留意你。首先要仔细分析他为什么说你错了。他说你错了,有时候其实你真的没错,而只是你想的东西或者问题的做法和他想的不一样,这个时候不要承认你错了,要继续坚定立场摆事实讲道理用数据说话。有时候maintainer其实也很忙,千万不要对maintainer迷信崇拜,他们有时候回答问题或者下结论也许也可能是比较“随意”的,也许并未经过深入思考的。如果他说你错了,举出了清晰的理由,而且你仔细分析,确实错了,那么表示感谢。并在新版本进行修正。坚持两个不要: 一不要垂头丧气,二不要骂骂咧咧。坚持两个字:淡定!如果三个字的话:再淡定。技术讨论谁也不是神仙,也许你自己想了几天的idea,自己想出来那一刻自己都觉得自己是个天才,但是一发出去,别人就直接NACK了。你肯定要么垂头丧气,要么暴跳如雷。但是我们一定要放平心态,千万不要让它影响到你的快乐生活!首先要理解这种情况没有什么奇怪的,每个人的思维都有他的局限性,我们仔细看看NACK的理由,如果理由确实非常充分,技术方面确实有缺陷,那就果断承认自己错了,寻找新的突破方向发第二版。如果NACK的原因只是理念冲突,也不要轻易放弃,寻找和你理念一致的人,继续一起尽力说服NACK你的人,但是要保持好的风度,让讨论限制在技术范畴,体现出一个专业码农的专业素养。这里比较经典的例子是eBPF调度器遭遇了强大的NACK,最后找到了理念一致的Linus Torvalds才推进进去的。在社区这样公开的场合,任何的人身攻击都是不被接受的。对他人进行人身攻击的过程,等于把自己脱光了给人看一样,将对这个人在社区的声誉造成严重的负面影响。所以在遭遇他人人身攻击的时候,你仅仅需要护卫自己,要求对方停止人身攻击,而完全无需要对对方进行人身攻击的反击。因为他已经脱光了,你还穿着衣服,你有绝对优势;如果你也把自己脱光一起对骂,就变成2个脱光的人互相骂街,这样就不太好了。简单来说,对付脱光了的人,我们仅需保持专业的素养。坚决制止,但是不对其进行人身攻击。社区的其他人会看到你的专业和素养,你的credit仍毫发无损!这种情况下,毫不犹豫的抄送code of conduct的邮箱conduct@kernel.org,要求社区对进行语言暴力、种族歧视的个人进行禁言处罚。社区非常大,林子大了,什么鸟都有。虽然我们总是对这个世界心存善意,但是也绝非天真地把其他人都想象地洁白如纸,遭遇明显的不公,则可勇敢与坚强地护卫自己的尊严。7. 如何让身份ID成长逐步建立在社区的credit?新手往往可以从发简单的cleanup patch开始,但是一旦越过了这个阶段,就要去攻克比较难的事情。真正解决难的bug,提高较难问题的性能,逐渐建立社区里面的信誉。信誉一旦有了,你的任何一个patch发出来至少人家会当回事。这个过程可以逐渐无论线上还是线下找一些大佬的腿来抱,但是千万不要一直让大佬给你输入,你也要有输出,技术上的你的见解,你的idea。他在干一个什么活,你说谁谁谁干了个类似的什么活,然后一起分析优劣等。你总是让大佬给你输入,这个关系是不对等的,再说你也没有给大佬付钱啊!如果你一段时间因为发patch心情非常不好,不要觉得不正常。笔者自己发了快20年的patch,中间有好几次都想永远地放弃在社区里面工作了,因为实在心情太糟糕,但是最后也还是一边舔伤口一边坚持了下来。所以亲爱的读者,如果有几天在社区混地不开心,真地是再正常不过的事情了!