心脏出血

#心碎(又名CVE-2014-0160)本周在我的推特流中飞过,我一直希望我们都能暂停几周的时间,好好反思一下这里的所有角度。

我希望有更多的时间来钻研一些事情:

OpenStack、精英政治和多元化

这些天,每当我想解释关于OpenStack技术社区及其治理的一些事情时,每当我提到“精英管理”这个词时,我都会停下来。

显然,在一些圈子里“精英政治”的概念已经严重失信,它代表了一种精英通过将规则倾斜到有利于自己的角度来延续权力的制度。

我不是一个很好的政治思想家,我对美国国内政治的理解非常有限(想想看《白宫风云》和总统大选的场面),所以我第一次真正遇到这个词是在GNOME项目的背景下。GNOME基金会章程:

GNOME是一种精英政治

公司、组织或个人不应被授予基金会席位,除非根据其贡献的优点证明其存在是正当的。金钱买不到对GNOME项目的影响:向我们展示代码(或文档、翻译、领导力或网络管理……)。

以及随后的其他项目,如ASF。发件人ASF的工作原理:

当团队认为此人“赢得了”成为开发社区一员的荣誉时,他们授予了对代码库的直接访问权,从而增加了团队,提高了团队开发程序、更有效地维护和开发程序的能力。

我们将这一基本原则称为“精英政治”:字面意思是,以德治国。

值得注意的是,这个过程在不产生摩擦的情况下进行得很好,因为与其他权力稀缺且保守的情况不同,在阿帕奇集团中,新来的人被视为志愿者,他们想帮助别人,而不是想偷取职位。

由于没有保守的资源(金钱、精力、时间)处于危险之中,该团队很高兴有新的人加入并提供帮助,他们只是筛选那些他们认为对任务有足够承诺的人,并匹配与他人合作所需的人类态度,尤其是在分歧中。

对我来说,我们这里所说的“力量”是指完成任务的能力、许可或授权,这将推动项目的进展。在一些项目中,这意味着提交访问权限,但最终这意味着建立项目其他贡献者的尊重和信任,这样您可以更容易地影响和推动项目的方向。你通过完成有用的工作(广义地定义为代码、文档、翻译、领导、营销、宣传等)来获得“权力”,它赋予你的只是完成更多有用的工作的能力。在一个健康的项目中,我们希望将这种权力赋予越来越多的人,而不是集中在一个小精英群体中。

这就是我们所说的“OpenStack是一种技术精英”。我讨厌想到那些善意的项目治理原则被用来解释美国政治中的社会不公平现象的“精英政治”所玷污。我也不想认为我们将这些原则视为某种柏拉图式的理想,不需要我们不断评估我们如何授权人们帮助推动OpenStack。

项目中的多样性水平是一个不完美的暗示。是的,我们有不同的观点和赞助组织,但我们没有令人印象深刻的性别、种族或文化地理水平。

我在GNOME时代的好朋友Daniel Veillard,向香港技术委员会提出这个问题:

我们在中国。讲台上没有亚洲人。你能做些什么来改善这种情况?

是的,我们实行精英管理,任何人都可以在项目中担任领导职务,但我们需要认识到,在许多人面前,存在着极其困难的语言和文化障碍。

这些障碍的一个例子是我们如何经常举办设计峰会。非常有规律地——尤其是当你在房间里聚集了大量较为成熟的投稿人,这些人是彼此理解的好朋友时——讨论往往会演变成一个充满玩笑的杂乱无章的声音网站。我和其他人一样应该为此受到责备,但有时我回想起来,会为“团队内”之外的人加入讨论感到不寒而栗。

我见过很多例子,一个新的非英语母语的人与一个现有的贡献者配对,领导一场关于他们工作的设计峰会。真正有效的是,现有的贡献者可以帮助吸引与会者,放慢对话速度,确保新的投稿人理解所提供的反馈……而不试图对新投稿人的工作加以赞扬。这只是我们可以用来授权新贡献者的一种技术。

总之,我认为OpenStack的“精英管理”是一种赋予贡献者权力(并庆祝他们的贡献)的善意模式,但我们都应该寻找方法,特别努力赋予那些在项目领导层中没有很好代表性的群体的贡献者权力。

Git钢筋加固(续)

正如我已经说过的,git的交互式重设基工具对于准备一系列漂亮、清晰的补丁非常有用。而且,尽管有一些人发出了可怕的警告,只要你注意警告其他人不要依赖你的树而不重新设置词根,就没有理由不使用git共享正在进行的补丁系列。

为什么补丁程序系列不完整?一个原因可能是补丁引入了回归。正如他们所说的,你经常需要打碎一些鸡蛋来做煎蛋,但如果你重视git的平分工具的威力,你会希望每个补丁都不受回归影响。

好的,假设您正在将应用程序从一个数据库框架移植到另一个数据库架构。你可能会进行一系列黑客攻击来演示这个概念,然后将结果发送给评论。只有在这一点上,你才会着手把工作进行润色,最后,把更改整理成一个漂亮的补丁系列。

这种方法意味着这项工作只会在当天很晚的时候停止重设基。这就留下了一个问题——如果你的树正在变基,你怎么可能与其他人协作?您如何使用补丁来修复回归?其他人如何帮助你整理这个系列?

这里有一个建议,基于Stephen Tweedie在我们合作开发一系列补丁时提出的方法:

  1. 假设你的树枝叫做毛茸茸的小猪。你已经把它推出去并征求意见。不要再重新设置此分支的基址。
  2. 创建另一个名为fluffy-pigger-rebased的分支,最初以fluffy pigger为基础。
  3. 用例如-v1后缀标记两个分支,检查两个标记中的树是否相同:
    $>git-diff毛茸茸的小猪$>git show-s--format='%t'毛茸茸的小猪
  4. 将重设基分支和v1标记推送到您的回购中。
  5. 如果您希望重设基础并对补丁进行一些清理工作,请这样做,然后标记并将结果推送到repo中的绒毛小猪重设基础分支,如(3)和(4)所示,但使用新后缀。
  6. 如果你收到一些补丁,把它们拉到你的毛茸茸的小猪树枝上,贴上标签,然后把补丁重新定位到重新定位的树枝上。
    $>git标签绒毛小猪-v3$>git rebase——到绒毛小猪上——基于v2绒毛小猪-v2$>git标签fluffy-pigger rebasing-v3
  7. 如果您希望重新设置为最新的上游,可以首先启用git的“重用记录的分辨率”功能:
    $>git配置--全局重新启用true

    然后重新设置重设基分支:

    $>git结账-毛茸茸的小猪重新基础$>git rebase上游/主$>git标签fluffy-pigger rebasing-v4

    然后,将上游合并到非重定基分支:

    $>吉特结账毛茸茸的小猪$>git上游/主合并$>git标签绒毛小猪-v4

    如(3)所示,您应该能够验证生成的两棵树是否相同。

    如果在重设基期间需要解决任何冲突,那么启用重设基很可能意味着合并时冲突将自动解决。

  8. 最后,如果有人想帮助你完成任何系列清理工作,只需“传递指挥棒”即可。你基本上会说,“在第4版之后,不要再从我这里重新设定基址了,继续吧”,而其他人可以继续工作,直到他们准备再次传递控制权。

这当然不是一个简单的工作流,但它为您提供了:

  • 与他人合作的能力,因为人们有一个非重定基的分支要对抗
  • 能够使用rebase清理一个系列,同时仍然确信没有任何问题,因为您有一对具有相同树内容的标记
  • 允许其他人帮助清理该系列的能力

这个工作流程如此笨拙的事实也有它的优点——它鼓励你尽早清理这个系列,并停止对其进行重新设置。这不是一个你想长期使用的工作流程。

Git重新定位

对我来说,“git rebase-i”可能是git的杀手级功能。我非常喜欢小型的、自包含的提交,这既是为了便于补丁审查,也是为了以后有用的提交历史。我过去常常在CVS上使用bedde来实现这一点,但git为我带来了巨大的痛苦。

自从几年前我发现这个功能以来,我还模糊地意识到内核开发人员在rebase上给人们的建议……通常简化为OMG不。切勿重新设置。.

当被要求详细说明时,我想大多数人会说:

一旦你和别人分享了一个承诺,千万不要改变它。他们可能会把工作建立在你的承诺上,通过改变它,你把一切都搞砸了。

莱纳斯对这个问题的一个令人难忘的评论是“有一个该死的后背,能够支持你所做的!”.

从上下文来看,这一切都有道理。如果内核开发人员发送一个pull请求,然后将其合并到一棵树中,然后将rebase和rebase合并到另一棵树,然后两者都合并到Linus的树中……那么,是的,您将面临一场灾难。

然而,我认为上述规则对大多数网络新手来说过于简单。这样的新手不太可能看到他们的树被卷入内核树的漩涡中,所以没有必要害怕他们使用rebase。

我的建议是:

  1. 如果您正在学习git,请花点时间了解rebase命令,尤其是交互式选项。
  2. 如果你正在开发一系列补丁,即使还没有完成,你也可以与其他人分享这个系列。这意味着稍后对您与其他人共享的承诺进行重定基址。
  3. 如果你担心人们可能会将他们的工作建立在你计划稍后重新设置的提交上,那么你可以通过在存储库或分支名称中输入例如“v1”、“rebases”或“rebasing”来警告人们。
  4. 如果有人的工作确实基于您重新设定的承诺,那么请将他们指向从上游Rebase恢复git-resbase部分(1)这真的不是世界末日,特别是在简单的情况下。

我们奇怪的张贴约定

我已经在开源邮件列表周围呆了很长时间,以至于我倾向于忘记我们关于发送纯文本电子邮件、引用回复、线程处理等的惯例并不一定对所有人都显而易见。

对于RHEV-M的一些工作人员来说尤其如此,他们中的许多人都有Windows开发背景。我最终意识到说“做别人做的事”还不够好,我花了一些时间来记录这些小约定是什么。

我已经发布了一些指导原则到rhevm-api维基。我错过了什么?

错误处理

今天我遇到了一个相当典型的错误处理错误,我想和大家分享一下。

代码大致如下:

类工厂{静态Foo getFoo(){尝试{//加载.properties文件,从中读取密钥...return new Foo(propValue);}catch(异常ex){log.error(“在属性文件中找不到键:”+ex.toString());返回null;}}}

打电话的人做了例如。

Factory.getFoo().doSomething();

这里需要注意的是,调用者假设getFoo()方法从不返回无效的.

这可能是来电者的一个很好的假设。除非存在程序员错误(例如,键不存在于.属性文件)或系统错误(例如,访问文件时发生I/O错误)。这两种情况都不应该让调用方优雅地处理。这就是例外!

如果出现错误,我们将获得空指针异常并将错误打印到日志文件。例如,如果您正在调试器中运行此代码,您将看到空指针异常不知道是什么导致了异常。

这个故事的寓意是要清楚地思考什么时候应该优雅地处理错误,什么时候应该让异常返回堆栈。

最后,我添加了一个新的异常类型:

类FactoryException扩展了RuntimeException{private static final String ERROR_MSG=“在文件{1}中查找密钥{0}失败”;private字符串propsFile;私有字符串propsKey;FactoryException(字符串属性文件、字符串键、可引发原因){super(MessageFormat.format(ERROR_MSG,propsFile,key),原因);this.propsFile=属性文件;this.propsKey=propsKey;}字符串getPropsFile(){return propsFile;}字符串getPropsKey(){return props键;}}

然后重新计算原始代码:

类工厂{静态Foo getFoo(){尝试{//加载.properties文件,从中读取密钥...return new Foo(propValue);}catch(异常ex){抛出新的FactoryException(propsFile,propsKey,ex);}}}

所以现在如果有错误,而不是得到一个相当无用的空指针异常您将获得:

FactoryException:在文件bar.properties中查找密钥foo失败...原因:java.io.FileNotFoundException:。。。

如果知识就是力量…

如果知识就是力量然后分享你的知识给别人带来力量。

“照明”

照明通过斯金纳先生

在开源世界中,我们每个人都努力加强我们所贡献的社区。加强社区的最好方法莫过于用你的知识授权你的其他贡献者。

在开源世界里,没有理由不分享你的知识。我们的工具和流程旨在实现这一点。

在邮件列表上进行讨论可以让其他参与者从讨论中共享的信息中受益。它还确保为未来的贡献者归档信息。

详细的提交消息确保当前和未来的开发人员能够完全理解您对给定更改的推理。即使你没有时间,把你正在进行的工作推到公共部门也可以让其他人接手并完成它。

用bugzilla大声思考意味着即使你的工作还没有完成,其他人也可以使用你的初始想法或分析。

使用公共维基做笔记,让其他人可以访问你混乱的想法、想法、提示和技巧,这是一个让你的大脑向世界开放的好方法。

所有这一切的一个好的副作用是,如果你的知识是公开共享和存档的,你不需要有这么好的记忆力!🙂

崛起并分享

崛起与分享通过冬虫夏草

在其他情况下,嫉妒地保护自己的知识可能是一种良好的做法。如果你是每个人都要找的人,因为你是唯一知道如何做事的人,那对你的工作安全有好处,对吗?当然,如果你自由分享你的知识,那意味着任何人都可以做你的工作?

这与你为社区做出贡献时应该激励你的东西恰恰相反。你绝对想让别人来踢你的屁股。如果有人不知从哪里冒出来,开始把你的工作做得比你本来可以做的更好,那么这绝对是一个很棒的结果!

RHEV-M的REST API

今天,伊奥甘·格林和我宣布了第一个里程碑版本Red Hat Enterprise Virtualization Manager的REST API.

RHEV-M当前唯一的API是一个Windows Powershell插件,它为Windows上的RHEV-M提供了一个完美的脚本接口,但远程调用或与其他应用程序集成并不容易。通过添加REST API,我们添加了一个集成接口,希望每个人都能方便地使用。

如果您安装了2.2版本的RHEV-M,那么下载我们的发行版、将WAR部署到Java EE应用服务器(例如JBoss EAP或AS)并使用我们的阿帕奇·菲利克斯·卡拉夫基于shell。您也可以阅读API参考指南跳上我们的邮件列表给我们反馈。

RHEV-M还不是一个开源项目,因此我们必须付出大量努力,才能在开放环境中开发这个REST API。我们将最初的工作集中在API设计和在2.2中的Powershell接口之上构建API的原型实现上。然而,在RHEV-M的下一个版本发布之前,我们的计划是将API的兼容实现直接添加到RHEV-M后端。届时,API将成为产品的一个完全受支持的部分。

如果您关心与RHEV-M集成,那么现在是时候参与API项目了。虽然API已经定义得很好,但仍有大量的设计更改和添加新功能的空间。最重要的是,我们需要您的帮助!