What does "downstream/upstream design" in software development mean?
Upstream components are other parts of the system that your component depends on to do its job. If the design of an upstream component changes, the ability of your component to function may be affected. If an upstream component has a bug, this bug may be manifested in your component.
Downstream components are parts of the system that your component can affect. Changes in your component can ripple to components that are downstream from your component.
Consider an application that consists of a database tier and an application tier. The database tier would be considered to be upstream of the application tier.
Upstream = up the well (the origin of the software) Downstream = downwards to the ocean (of use cases)
Open Source developers who are "downstream" build applications and tools on the finished products. Those who are upstream actually work on the products to be released.
If you develop software: you depend on the stability of the upstream development. And those who work on your software are downstream developers.
I think this is more software engineering jargon than English, but the way I understand it "downstream design" is where the application developers take the tools that have already been developed and use them to complete their application. Using already produced software libraries where decisions about what the library capabilities would do have already been made is downstream.
With "upstream design" the application developer is consulted and involved in the development of the libraries before the application work has even really begun. If you're going to be a software company focusing on audio software, for example, you might need to develop libraries to cover the range of software you plan to develop. It would be nice to be able to have library developers sit down with the application developers so that the app devs can provide input into what they want.
Upstream is more customized, which makes it much more expensive but potentially produces a better end product.