I've been at this since the days of punching cards.
Much has changed, which is unsurprising.
What is surprising is that much hasn't.
Things like the importance of conceptual locality, chunking things into digestible bits, making things explicit, confining complexity, separating that's being worked on from how it's being moved about all remain helpful to creating comprehensible software.
There are few things more valuable than explaining what it is you're doing to someone at the other side of a connection, whether it be someone next to you (ah, the old days) or just someone virtually next to you somewhere in the aether.
Communication by pull request has the advantage of being asynchronous.
On the other hand, the cycle time is not terribly well-bounded.