怎么理解软件中的上下游关系?

前言:
河流的上下游关系我们都没异议,下游依赖上游的。
问题:
那么软件中的上下游关系是怎么定义的呢?
比如系统A提供基础能力,系统B,C依赖系统A,那么A是上游还是下游?
答案分析:
回答上游的肯定是根据河流命名方式定义的。
那回答下游的是什么原理? 请各位程序猿们详细讲解下

如果A是提供工具包之类的 个人认为A是下游
如果A提供数据,B\C从A获取数据 那A就是上游数据来源