Эффективней всего: решать конкретные рабочие задачи.
Те же VCS выбираются под проект. Бывают ситуации, когда svn - вполне оправдан, по сравнению с git.
CI - зависит от того, что вы требуете от CI)) Это может быть Jenkins, TeamCity, Bamboo, мне лично нравится связка gitlab+gitlab-ci.
Выбор тестового движка тоже зависит от профита, который он может дать именно на вашем проекте.
Принцип разделения вашего проекта на составляющие (вплоть до под проектов) зависит характера вашего проекта.
И много-много других штук.
Веду к тому, что нужна практика, практика и еще раз практика