I would say a little bit of both. Since modern networked programming is much more complex than before (having to care about security, distributed storage, systems, worldwide connectivity over vast range of devices etc.) it has more moving parts and thus more combinations of various systems possible. Naturally complexity grows exponentially.
There can be interactions among more than 2 components as well that cannot be explained just by the pairwise interactions. The number of all subsets grows exponentially.