There are really a lot of pros and cons when we consider the detailing of components, services, deployable blocks, etc.
In the traditional world of the unix command line, we manipulated data as text files, each line was a record, and possibly with fields separated by commas or tabs or spaces. Then it would be possible to develop many small utilities, and we had a lot of fun with βcutβ, βjoinβ, βtrβ, βgrepβ, βsedβ, βheadβ, etc. Personally, I still make sure that I have these tools in my Windows environments.
Why does it work so well? Fundamental file format: rows and columns. We can add new utilities and know that they will integrate. You never need to change the old utility, because we added a new one. There is also no graphical interface, we expect to work on the command line. We just run task pipelines to get the job done.
Now, what do you do when things get complicated? When you want to offer graphical interfaces. A simple approach: a bullet bit releases one application. New feature, new version of the application. It may not be so bad, you are changing some aspect of the user interface, you need to change some file formats or APIs, so other parts are changing too. It is much easier to release a single, consistent (possibly even) tested whole.
However, as the volume of user interfaces grows, it is pretty destructive to free up everything. Consequently, the emergence of component models, such as OSGi, are used by Eclipse, so that a single user interface can be assembled from many separately developed and evolving parts.