2019年9月27日 姜宁 Willem Jiang

1. The Apache Software Foundation

Apache开源软件基金会是世界最大的开源基金会,目前为止社区中 committers 7036人,Podings 48人,超出一半的开发者都受雇于大公司.今天的姜老师便是受雇于华为在这样开源社区中负责管理一些事务.ASF致力于为公众提供开源 & 免费的软件,第一个项目加入Apache已经超过20年,且已经成为了世界上使用最广的服务器.Apache的License,如GPL/MIT /Apache等被广泛应用,因为是有限制的开源对商业友好,云相关的软件大都支持Apache License,和大数据相关几乎也都在Apache. 这些都是Apache的功绩与影响力,而我们能在Apache首先感受到的便是它卓越的组织管理方法,姜老师称其为:

2. Apache之道

2.1. 原则

  • 任何建设性的贡献都可以获得功绩 并且不过期
  • 功绩不给你权威,可以给你行使权力的威信
  • 企业从属关系和资历没有功绩
  • 没有独裁者,没有否决权,核心在于 建立共识
  • 小的可逆步骤
  • 粗略的步骤和可以工作的代码

2.2. 运作保障

ASF依托于Apache之道实现了:

  • 精英之治
  • 透明
  • 社区

社区/江湖胜于代码-姜宁 友善 尊重 信任 谦虚

2.3. 维护使命

  • 厂商中立
  • 多样性
  • 可信
  • 安全

3. 传统软件开发—朱郑州老师

为什么同样学习一项技术、一个专业,有人事业风生水起,有人事业波澜不惊?差别不在理论基础,不在技术水平,主要在于个人个人素养,也就是如何做人。 常听人说,做事先做人,就是这个道理。学不了做人的道理,事儿是很难做好的。 《软件工程》是一门专业课程,其实是一门人生指导课程,其中蕴含了很多做人的道理。 软件工程学科的诞生,就是解决产业需求问题,软件工程学科的发展,也是为了解决软件产业中的科学问题和工程科学问题,一代代人用自己的聪明才智,去探索实践,去的了一点一点的进步。所以,理解了这一点,就要明白:做软件工程领域的研究,一定是面向国家需求,瞄准学科前沿,选择可供研究的问题。 问题定义阶段,回答的问题是:“要解决的问题是什么?” 这就要求我们有一定的洞察力,抽象能力,表达能力。更重要的是:主动性和责任感!因为想到做问题定义的人,一定是想用信息化手段改变现状的人,这些人思想上如果没有那种不怕被抱怨的公心是很难做到的。 可行性研究阶段,要回答的问题是:“这个问题是否有行得通的解决办法” 需要人掌握技术前沿、具备做预算决算等财务分析能力,更要准确把握实施环境的优势劣势。。。这些都是基本技能要求。 从素质要求上来说,要做好可行性研究,必须有一颗公心,能够保持中立的态度,不在乎个人得失,做出客观公正的结论。 需求分析会的问题是:“目标系统必须做什么” 这个阶段的工作是整个软件的最基础的工作,可以毫不夸张地说:“需求是软件的根本!”获取用户的真实需求是很难的。为了获取用户的真实需求,很多人发明了很多需求获取方法、需求分析方法。我们上课讲的,课后用的都是这些内容。 然而掌握这些基本技能还是不够的,从思想上要做到——换位思考。真正和用户交朋友,让用户感知到“我们是为他好”,获取用户的信任,引导用户表达出自己的真实感受、真实需要(needs)。 概要设计阶段回答的问题是:“概括地说,怎样实现目标系统?” 有人把概要设计叫做高层设计、总体设计。其实就是表达了这个设计的重要地位——高层、总体。这个阶段要综合分析各个候选方案的优缺点,确定系统实现的方案,定下了系统包括哪些模块、模块间的关系如何等,我们上课讲了一些系统设计的方法和工具。然而,最重要的是思想基础是——有大局观、有全局意识、有大格局。有了这个思想基础,在遇到各种方案难以取舍的时候,你就能快速取舍,做出正确决策。 详细设计阶段回答的问题是:“怎样具体地实现目标系统?” 这个阶段是设计出程序的详细规格说明,也就是画出了这个系统的蓝图(Blueprint),这个蓝图包含了所有必要的细节,就像看着图纸施工人员就可以盖楼一样,看着这个系统详细设计的蓝图,程序员(软件开发工程师)就可以编出确定的代码。在这个阶段,有很多方法、技术和工具可以帮助我们画蓝图,我们必须掌握这些方法、技术和工具。更重要的是,我们要有严谨、认真的工作态度,要有精益求精的工作精神。同时也要为程序员(软件开发工程师)和测试工程师的方便着想。 编码实现阶段回答的问题是:“具体地说,目标系统是什么样的?” 就像很多人一想到新闻就是播音员,一想到外交就是华姐一样,外人一想到IT就是程序员,为什么?就是他们是最后的展现阶段,他们的成果最有显示度。 如果说前面阶段的成果是逐渐降低抽象层次的话,那么编码实现阶段的成果的抽象度为0!就是完全具体化了! 编码阶段,我们要学习各种程序设计语言,学习编程技巧,养成良好的编程习惯。 这一阶段的思想基础是:勤奋务实,精益求精。杨芙清老师常说“勤奋出天才,务实创大业!”在这个阶段,我们必须实事求是,千万不要搞内容上的创新,创新就坏了我们一创新,所有人就都哭了。我们要做的就是务实地按照详细设计写出高质量的程序代码。 测试阶段是所有阶段中最具“破坏性”的阶段,它的主要任务就是“挑毛病”甚至“鸡蛋里挑骨头”。 然而,这个阶段是保证软件质量的关键阶段,如果说程序员进行的单元测试是“自我批评”的话,那么测试阶段的工作就是“批评”。 批评他人的系统是在帮助他人完善系统,要做到实事求是,用事实说话,既不能打击报复,故意给人穿小鞋,也不能发现问题 隐藏不报。 同时,对于这个阶段的结果,我们要懂得感恩,把别人往好处想!感谢可爱的测试工程师帮我们找出了问题,让我们变得更加完美!曾子曰:“吾日三省吾身”我们勇于自我反思,更感谢他们帮我们发现我们自己发现不了的问题,进而持续改进,提高自己的设计、编码水平。

4. Apache孵化器

4.1. 吸引项目加入

  • 社会责任感
  • 高质量的代码
  • 合作与竞争
  • “免费”的培训: 代码贡献;Pr交互
  • 法律保护

4.2. Apache Licenses

起源建立许可 & 商标不冲突 & 赋予软件许可 & 遵循贡献者协议 与西方交流的基石

4.3. 协议

不同的种类: A B X,代表着不同的使用风险

4.4. 发布版本

在法律上,基金会行为 PMC授权

  • 需要投票
  • 需要电子签名
  • 镜像分发

4.5. 毕业

自己已经可以自我管理并发布,合乎规范,可以成长

4.6. Apache基础设施

这是参与项目一起开发的基础

  • 邮件列表 — “不在档案列表讨论的事件是不会发⽣的。”

  • 问题跟踪 --- 使⽤JIRA或者Github issue来追踪与开发相关的问题。

  • 源代码管理 — 浏览系统中向公众开放的所有部分。只有代码提交者可以通过PMC指定的流程做出改变。

  • 编译/测试 — 现在⼤多数项⽬都包含持续集成构建和测试流程。

  • 建⽴⽹站 — 每个项⽬都有⾃⼰独⽴的⽹址

5. 开源的征途

5.1. 企业/个人为什么开源?

企业成立的核心在于盈利,企业拥抱开源的核心同样在于对于利益的考量.Git的前身BitKeeper没能坚持开源,等到2016年它再开源的时候已为时已晚,因为2005年Git以GPL授权的形式已经开源,BitKeeper已经完全没有机会占领市场了.事实上,尽管微软曾经强烈抵制Linux,但时至今日微软不仅声称自己是开源社区的拥抱者,还在windows中加入了Linux.开源当然是不赚钱的,但是企业开放源码依然可以获得很大的好处,包括但不限于:

  • 众目睽睽之下消除bug
  • 快速占领并拓展市场
  • 分布式开发,降低企业开发沟通成本以及人员流动大的缺点
  • 自底向上构建,通过原型快速迭代验证

在互联网时代,商业模式层出不穷,事实上关于开源软件已经有着不少论文和书籍在讨论,比如《开源软件之道》《开源的成功之路》.企业开放源代码后也可以直接获得收益,如文档收费、服务收费、在线云服务收费等。当网站访问量大的时候,广告和捐赠也都可以是有效的维持运营的手段。 对于个人为什么开源,其实都不需要太多理由,Just for Fun! 对于真正的程序员来说,业余时间也是coding, 可以享受智力挑战的感觉,可以感觉到自己被社会需要,感觉自己From Nobody to Somebody.在这种心态和感受下,可以说是Coding一时爽,一直Coding一直爽.

Programming is a life-long experience.-Peter Norvig

此外,对于世界的进步而言,开源之于闭源所带来的个性/开放/共享而创造的价值时是超出简单的商业盈利之外的,比如ASF基础设施保障关键支持服务247365全天候运行平均每个项目每年花费不到5千美元,这就是一个很大的进步,而其对开发者的培养所带来的价值更是无法估量的.

5.2. 我们为什么选择开源?

因为拥抱开源社区与开源软件除了Fun,更可以带来自身实际的能力提高与漂亮的履历与人脉.

A community usually refers to a group of people who interact and share certain things as a group.

个人成事能力与组织资源与众多伙伴一股绳完成一件事的领导力是在由code连接的这个社区中完成的.总的而言,至少可以:解决问题/学习成长/更多同知/更好工作

Influence is vital.

在一个社区当中,个人的角色不断发生变换:*用户贡献者代码提交者PMC会员决策者,*这也就是小白成长大佬的过程,而这个过程即使到头了,项目依旧可以不断发展,或者不断找到新的有趣的项目.

开源项目可以一直做下去,我的这个已经做了12年-姜宁

5.3. 如何选择开源项目

问几个问题:

  1. 自己的方向是什么?
  2. 现在选的这个继续发展状况如何吗?
  • bug report记录
  • contributor数量与commiter数量
  • 提交次数/频率与时间

注意star和fork的数量是可以刷的 3. 他们是按什么规范来的?

issue规范:

  • Describe the bug
  • To Reproduce
  • Log File
  • xx Version:
  • Additional context

5.4. 现在如何加入

我们在社区中角色的变化对应着我们做的贡献以及我们相应能力的提高,我们可以提交BUG报告,完善开源软件文档,参与邮件列表讨论,最后成为开发者贡献代码或者通过Github提交PR. 然而正如课后同学问的问题,几乎完全小白的我们如何从最细节的地方入手呢? 又是一个办法是利用自己的优势翻译对应的文档---一件看似没有什么意义但是方便了别人自己也必然认真读了文档,以及对于大量的代码从beta单元测试开始阅读,可以贡献测试用例,好好理解一个函数的接口如何调用,它的输入输出是什么,它又是如何调用其他功能的函数以及层层调用.当中如果遇到不懂的可以直接Google看方法.

6. 未来如何安排工作

  • 放羊式管理,可以remote呀!
  • 完成商业服务支持
  • 自由选择工作内容
  • 基于邮件的开发方式