什么是”上游”

上游这个词本身来自于河流,意思是理源头较近的地方,也有相对的意思,在河流的任意两点,相对理源头较近的地方就是上游,否则,称之为下游。

在非软件技术领域,如供应链等,则指的是诸如原材料等生产过程较原始的阶段或本成品。

我们这里的上游,特定指的是开源项目,如Linux Kernel、Kubernetes、Docker、Hadoop、Kafaka等,由最初的发起者或非营利性组织的社区所维护,其他人可以自由的为原始项目(上游)做贡献,诸如提交代码、撰写文档、测试、设计等,然后,按照一定的规则,接受贡献或者拒绝,继而形成更大、更完善、能够解决更多问题的软件项目或产品。

“下游”又指的是什么?

其实,开源软件的项目上、下游也是相对的概念。所谓的下游,指的是某个开发者或某个团队,fork了上游的代码,形成了自己的分支,自行维护分支的更新,即相对于原初的开发者或社区,形成了自己的产品。项目产品的bug、安全漏洞、文档等统统都由自己维护。

下游如果发展良好,可能形成自己独特的分支,如Ubuntu之于Debian,OpenShift 之于 Kubernetes。

上游优先(upstream first)是什么

直接与开源社区互动并在源头上解决问题的办法,被称为上游优先(Upstream first)。

所谓上游,是一个相对的概念,意为“靠近源头的一方”。在开源社区中,主要指的是开源社区维护的主干版本。而所谓下游,是指基于上游开源项目衍生出的项目或产品。在 Github、Gitee 等代码管理平台中对开源项目的 fork 操作,就是一种对上游代码的拓展。

那么,上游优先就很好理解了:基于开源项目的任何修改都应该提交优先提交给上游项目本身,然后再包含在自己的产品中。与之相反的处理方式是只基于自己产品进行维护,对上游不做反馈。

为什么要使用“上游优先”?

上游优先是开源社区提出的优秀的开源理念,那么它优秀在哪里呢?

举个简单的例子:

葵花派长老将葵花点穴手传授给了白展堂和祝无双,在每次施展葵花点穴手时,都需要大喊一声:“葵花点穴手!”

这一天,长老对两人说:堂堂、双双,你们修炼已经圆满,为师已经没有什么能够传授给你们的了,各自下山游历吧!说罢便闭关修炼去了。

白展堂来到了同福客栈,因为葵花点穴手需要念五个字,被郭芙蓉四个字的排山倒海打得鼻青脸肿。

正所谓人总是在被虐中成长,白展堂发现使用一种手法只需要喊“葵花点”就可以施展武功,终于打败郭芙蓉。

随后,白展堂回到葵花派,将这种手法汇报给了长老,长老飞鸽传书,告知了所有门派弟子。

葵花派从此发扬光大,双双成为了衙门的捕快,各大弟子也都成为了惩恶扬善的侠客!

那么问题来了:如果白展堂没有将这种手法告知长老,会怎么样呢?

有两种可能。

其一,白展堂此生未收徒,葵花派因“葵花点穴手”需要念五个字,逐渐式微,从此江湖再也没有葵花派的威名。

其二,白展堂广收门徒,每日传授和教导子弟,将“葵花点”手法发扬光大,但每日忙忙碌碌,不仅要教导弟子学习“葵花点”手法,还要回葵花派学习长老闭关研习出来的新武功。

说到这里,我想大家已经明白了我所要表达的意思了。

白展堂研究出“葵花点”的手法后,回门派告知长老,这种行为就是“上游优先”。

为什么要使用“上游优先”?相信从这则小故事不难看出:

  • 利于上游合并:随着时间的推移,下游的修改越晚反馈给上游,上游变越难合并下游的修改。

    • 假如白展堂在临死前再将“葵花点”手法告知门派,门派的葵花点穴手早就出到 9527 版了,手法可能很难和 9527 版葵花点穴手融合。
  • 减轻维护负担:下游自己维护的成本太高,提高给上游维护,会降低下游维护成本。
    • 葵花派除了长老授课以外,要求白展堂单独授课讲解“葵花点”手法,白展堂打王者荣耀的时间都没有了,更别说研习新武功。白展堂整理出手法秘籍交给长老,由长老统一传授,白展堂又可以快意江湖了。
  • 便于合作共赢:通过和上游合作,可以更为顺畅地与上游达成一致,得到上游的认可,也更容易将上游的修改合并进来。
    • 白展堂因贡献了“葵花点”手法被尊称为首席大弟子,长老在“葵花点”的基础上研习出提高葵花点穴手定身时长的法门,白展堂第一时间得到秘籍修炼,如鱼得水。
    • 反之,白展堂没有贡献“葵花点”手法自己自行修炼,长老研习出提高葵花点穴手定身时长的法门,白展堂发现和“葵花点”手法运功路线不一致,难以习得新版葵花点穴手,无法提升威力。

使用“上游优先”需要做什么?

首先,需要与上游达成合作。达成合作是反馈给上游的捷径,越密切的合作者提出的想法,越容易被上游所接受。

其次,需要保持与上游的沟通。达成合作不是一蹴而就的事情,需要与上游加强沟通,及时了解上游动态,否则,无法确保你的想法与上游的想法是否一致。

最后,需要将修改及时反馈给上游。上游的修改需要成本,及时的反馈可以节省成本,这也是上游收费接收下游修改的一个重要标准。及时的反馈,能够让合作变得更加通畅。

哪些开源组织或公司使用“上游优先”?

在开源世界中,开源项目对“上游优先”的宣传并不多,但实际上大部分开源项目对“上游优先”都是非常认可的。

“上游优先”的理念更加像是一种约定俗成,除了一些知名开源项目可能有提到或宣讲过该理念以外,更多的是默默践行这一理念。有很多开源项目没有对“上游优先”做过多的解释,但在开源过程中对开源项目的必要修改都会反馈到上游。

下面列举一些明确采用“上游优先”的部分开源组织或公司:

  • RedHat:红帽组织对“上游优先”可谓是彻底贯彻,网站上能够搜到的关于“上游优先”的文章和演讲,红帽可谓是不遗余力。
  • OpenEuler:OpenEuler 是华为的一个开源项目,用 OpenEuler 自己的话来说:OpenEuler 来自于社区,回馈到社区。
  • Google Chromium:Google Chromium 官方的 Design Documents 中,将 Upstream First 放在了 General 一栏中。
  • The Linux Foundation:LF 官网在“Best Practices to Contribute Code Upstream”中,可以找到 Upstream First 的介绍。
  • ……(更多案例,欢迎补充)

参考

https://my.oschina.net/lihuimingxs/blog/4977991

https://www.redhat.com/zh/blog/what-open-source-upstream

软件开发中的上游upstream相关推荐

  1. 软件开发中的上游和下游

    听了腾讯犀牛鸟王佳对开源的讲解中,对其中的专业术语上游(upstream)和下游(downstream)不理解,看了这篇blog理解了特此转载记录. 看了以下blog后个人理解:自然界上水是高处往低处 ...

  2. 彼之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践

    作者:sherrywasp https://www.cnblogs.com/sherrywasp/p/9436623.html "描述一个事物,唯有一个名词定义它的概念,唯有一个动词揭露它的 ...

  3. 视频互动直播软件开发中的连麦问题分析

    直播行业发展至今,我们经常会听到很多朋友谈论"互动直播".那么何谓互动直播呢?其实互动直播的核心在于通过连麦技术,让视频直播有一个超过文字的更深层次的互动交流. 在视频互动直播软件 ...

  4. 统治软件开发中的著名定律

    文| https://www.timsommer.be/famous-laws-of-software-development/ 翻译| 码农翻身 和其他领域一样,在软件开发的世界中也有一些有趣而著名 ...

  5. 阿里研究员:缩短软件开发中的反馈弧

    简介:开发者写好了某个功能的代码,想知道这个功能是不是实现了,代码还需不需要再改,这就是一种反馈.在软件开发中,尤其是联调时,缩短反馈弧有助于及时发现问题.采取对策,提高开发效率.那么什么样的反馈弧才 ...

  6. 软件开发重要性_在软件开发中考虑时间的重要性

    软件开发重要性 by Crunch Tech 通过Crunch Tech 在软件开发中考虑时间的重要性 (The importance of time to think in Software Dev ...

  7. 测试自动化金字塔在软件开发中是如何使用的?

    测试自动化金字塔,是一个指南,指导您进行什么类型的测试以及每种测试的数量.测试自动化金字塔有助于创建更高效的测试,并导致向客户发布更可靠的软件. 测试自动化金字塔的好处 测试自动化的大部分好处显而易见 ...

  8. 论软件开发中的可信赖的工作

    中大型软件开发,免不了团队开发,团队开发就少不了分工合作.在团队开发中,当然每个人的能力都很重要,但是我认为可信赖的工作是团队开发的首要条件,也是团队开发存在的基本保证.没有可信赖的工作,就没有团队分 ...

  9. 软件开发中的完整测试所包括的环节UT、IT、ST、UAT

    软件开发中的完成测试环境所包括的环节包括:UT.IT.ST.UAT UT = Unit Test 单元测试 IT = System Integration Test 集成测试ST = System T ...

最新文章

  1. 新装oracle如何启动服务,Oracle数据库新装之后出现的监听程序无法正常启动和运行(Oracle-12514)问题...
  2. python中变量怎么定义_python中的变量的使用定义以及使用规则
  3. 用PHP做一道单选选择题的页面,【大神看过来】根据一个用PHP做的单选投票,改成多选,且可显示...
  4. qt界面嵌入web_使用Qt WebAssembly而不是JavaScript创建Web用户界面
  5. 【语言模型系列】原理篇二:从ELMo到ALBERT
  6. ubuntu12.04安装翻译软件stardict及卸载
  7. Java_泛型练习题
  8. HitPaw Screen Recorder(电脑屏幕录制软件)官方中文版V2.0.1.6 | 含直播和微课制作功能 | 电脑屏幕录制软件哪个好用?
  9. 7450清零_联想M7450F打印机加粉清零方法
  10. 充值150日赚1000多,一篇AI打扑克的论文竟登上科学杂志
  11. PMP课程笔记:第6章 项目进度管理
  12. 亲测可用[转]官方17ce老毛子Padavan华硕固件router插件安装方法|集成不占空间k1斐讯k2...
  13. 10bit视频是什么?
  14. 2023跨境出海指南:韩国网红营销白皮书
  15. dotnet OpenXML 读取 PPT 主序列进入退出强调动画
  16. 2022-2028年中国踏步机行业市场运营态势及投资战略规划报告
  17. OSF Jonathan Bryce:Open Infrastructure开启开放协作新时代
  18. MySQL数据库企业级开发技术
  19. 深入理解计算机系统(4.1)---X86的孪生兄弟,Y86指令体系结构
  20. meanShift算法介绍

热门文章

  1. 解决thinkpad笔记本启动虚拟机出现“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态。“
  2. jenkins添加附件
  3. 第三代宝马6系GT概念合成图
  4. 如何写出低碳环保的Android代码
  5. 当前的最好的伪原创工具技术
  6. 如何快速掌握涂鸦技能并让涂鸦把工作变得更有趣
  7. 网曝南方电网搞末位淘汰和裁员,给各下属单位强制规定辞退率和降岗降级率!...
  8. 安卓最新系统_三星S9+升级最新系统ONE UI体验,安卓9.0带来哪些惊喜?
  9. oracle卸载文档,oracle完整卸载步骤
  10. 【究极详细版】Ubuntu安装配置MySQL