生产流程中的上下游

让我们以一个简单的生产流程开始,尽管它跟软件开发没有关系,这样我们能以此为基础定义软件开发中的上下游。

上面的例子有三个步骤:收集部件、组装部件、喷漆。
一个生产流程跟一条河流很相似,所以我们很容易理解:随着流程一步步往下进行,我们在往下游移动。

我们可以推出以下原则:
依赖原则:从自身的角度看,每个环节都依赖其上游的环节
价值原则:往下游移动,每一环节都在产品上增加了价值
现在让我们将这些原则运用到不同的软件开发场景中。

软件依赖的上下游

很多软件模块会依赖其他的模块。那么什么是上游依赖和下游依赖呢?
考虑下面关系: 模块 C 依赖模块 B,模块 B 依赖模块 A。
运用依赖原则,我们可以有把握地说模块 A 是模块 B 的上游,模块 B 和模块 C 的上游(尽管箭头是相反的方向)

这里运用价值原则会有点抽象,但是我们可以认为模块 C 拥有最多的价值,因为它导入了模块 B 和 A 的所有功能,并且附加了自己独有的价值。所以模块 C 是下游模块。

开源项目中的上下游

另一个“上游”和“下游”被广泛使用的场景是开源软件开发。它跟上面讨论的模块依赖很像。
有两个项目 A 和 B,A 是原始项目,B 是从 A fork 出来的:

这在开源项目中是很常见的开发模式:我们 fork 一个项目,在新项目中修复 bug 或者添加功能之后,提交一个 patch 到原来的项目。
在这个场景下,运用依赖原则:项目 A 是上游项目,因为没有项目 B 它也可以很好地存在,但是项目 B 无法存在如果没有项目 A。
运用价值原则同样可以运用:因为项目 B 增加了一些功能或者 bugfix,跟项目 A 比它增加了价值。

所以每次我们往开源项目贡献一个 patch,我们可以说我们往上游发了一个 patch。

(微)服务中的上下游

在由微服务(或者只是过时的分布式服务)构成的系统中,同样有上下游服务的讨论。意料之中,依赖原则和价值原则都可以运用到这个场景。服务 B 是上游服务因为服务 A 依赖它。服务 A 是下游服务因为它在服务 B 的基础上增加了价值。

请注意这里讨论的什么是上游什么是下游中的“游”不是通过服务 A 进入系统的数据流,而是从系统核心部分到面向用户服务的数据流。

离用户(或者其他终端客户)越近的服务,它就越下游。

结论

我们可以在任何有“上游”和“下游”的场景中,运用这两条简单的原则来判断哪个是上游哪个是下游。
如果一个事物在另一个事物上增加了价值,或者以任何方式依赖另一个事物,那么它一定是下游。

参考链接:
https://reflectoring.io/upstream-downstream/

软件开发设计中的上游与下游相关推荐

  1. 什么是软件设计中的上游和下游?

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

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

  3. 在Android软件开发教学过程中应当注意的事项总结

    近些年来,为了提升学生就业率和收入水平,某些高校或培训机构将Android软件开发当做一门专业学科.Android学科的主要目标是培养学生快速掌握Android开发基本知识和技能,以便于学生利用掌握的 ...

  4. 浅析软件开发项目中的需求分析

    [摘要]在软件开发项目中,需求分析是关乎软件项目开发成败的重要因素.现在的软件项目中返工开销占了总开销很大比例,而导致返工的主要原因是需求分析不明确.针对这一情况,文章阐述了软件开发中需求分析任务.需 ...

  5. 软件开发团队中的特殊角色

    软件开发团队中的特殊角色 转载请注明出处http://blog.csdn.net/uxyheaven/article/details/50544809 软件开发团队中有各式各样角色, 如产品, 设计, ...

  6. 项目管理进阶--软件开发项目中的团队组成

    #项目管理进阶–软件开发项目中的团队组成 ##项目经理 项目经理负责分配资源,确定优先级,协调与客户和用户之间的交往.总而言之,就是尽量使项目团队一直集中于正确的目标.项目经理还要建立一套工作方法,以 ...

  7. MBTI在软件开发团队中的应用

    人绝不是一种资源.一方面我们不可能因人设岗,另一方面也不能忽略人性的差异.面对问题时,不要总是单纯地从人的态度或品德上查找问题,而是要反思人事安排和流程建设上的不足.奢望一个人改掉他的缺点,还不足充分 ...

  8. 计算机辅助设计技术的应用研究,计算机辅助设计软件在室内设计中的应用研究...

    摘要:本文以计算机辅助设计软件的基本认识为切入点,分析计算机辅助软件所具有的作用,重点研究和讨论计算机辅助设计软件在室内设计中的应用. 关键词:计算机辅助设计软件:室内设计:应用研究 随着科学技术的不 ...

  9. 写好一份软件开发设计文档

    如何写好一份软件开发设计文档 转载: 设计文档 - 也被称作技术规范和实现手册,描述了你如何去解决一个问题,是确保正确完成工作最有用的工具,其目的是迫使你对设计展开缜密的思考,并收集他人的反馈,进而完 ...

最新文章

  1. 杭电2682--Tree(Prim)
  2. Markdown的基本语法
  3. 如何生成动态库 .dll 的符号 .lib 文件?
  4. html表格选择一行,vue + element table表格如何默认选中第一行
  5. LeetCode Algorithm 507. 完美数
  6. Reindex SQL Server DB table
  7. pom.xml 如果使用 mvn exec:exec 命令运行项目
  8. kubeadm源码分析(kubernetes离线安装包,三步安装)
  9. 浅析总结 Java 内部类的一些使用与梳理
  10. c++取模运算/求余运算
  11. 单位元转换万元怎么转_excel教程:将单位为元的excel数值转换成单位为万元的数值...
  12. 手Q真的输给微信了吗?
  13. 任务并行库(Task Parellel Library)parallel.for parallel.foreach、List、ConcurrentBag 并行集合、线程安全结合
  14. wechat-0052,微信公众号,第三方登录—扫码登录
  15. 这样软件开发人才级别的划分你同意吗
  16. python—生产者消费者模型
  17. 如何将GPU中list类型的数据转移到CPU
  18. 微软杀毒软件OneCare号称全能 现存五大悬疑(转)
  19. 启动nginx报错问题(nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socke
  20. 用云服务器windows环境下来搭建一个Minecraft服务器教程以及客户端使用教程java版

热门文章

  1. *交流电220V转24V12V9V5V1A芯片*
  2. 【Revit闪退小技巧】Revit打开启动时候闪退完美解决
  3. 面向对象程序设计第四单元总结(UML系列)
  4. 实验1 Java语言基础作业2022
  5. 品优购04——商家入驻审核
  6. 详解 epoll 原理【Redis,Netty,Nginx实现高性能IO的核心原理】
  7. 多线程(二)线程控制(创建 退出 等待)
  8. Linux:Makeifile入门笔记
  9. 一个很重要但很多人不理解的技术,P2P丨网络穿透与NAT原理分析
  10. 计算机数控机床工作原理,数控机床电气控制系统工作原理