I've asked our CTO to share a few tips how to work on complex software development projects more effectively and this post is based entirely on his recommendations.
No need to deny the fact that both tech leads and software developers prefer working on small teams of up to 10 members. Advantages are obvious: frequent face-to-face discussions and on-spot brainstorming and problem solving vs virtual meetings booking in case of distributed teams, delayed feedback, etc. However, you can't complete a robust and complex project on time with a small team, so large projects are normally distributed across several locations and executed by cross-functional teams comprised on average of 25 to over 50 employees. Other distinguishing features of large projects include:
- Long build time (over 5 minutes)
- Clear role definition, each team is responsible for a particular function delivery
- Full adherence to coding standards, code review is a critical part of the process
- Task-based time tracking
- Analysis of discrepancies between estimated and actual labor costs
In this case bureaucracy is a "good evil", although it irritates a lot! But working on large projects can be interesting and easy if you acquire and get used to new habits in the workplace. But once you know the ropes, you can easily replicate such teamwork practices in smaller teams and succeed.
Use feature branching and keep your commits atomic
Although it sounds like a Captain Obvious tip, too many dev teams don't use this best practice at all, that's for sure. It's better to use atomic commits along with TDD due to the iterative nature of development. Plus you get an additional bonus: if you screw your own branch, just do git reset --hard and your current branch (typically master) will be back to point at <SOME-COMMIT>.
If a colleague needs your unfinished code in a different branch, they can cherry-pick the most critical changes without waiting for the merger and leave your stream of consciousness apart.
Use standard commit naming conventions
Assign your task ID in a tracker to the beginning of your commit name. All modern project management systems synch well with a build server and VCS. It'll facilitate history tracking in a repository.
Create git aliases for pull requests
You should always push all local commits to upstream and merge with a master/dev branch. This task is like shooting fish in a barrel, but you may get distracted and forget to do so after completing a more complex task. So you better automate this action.
Keep a check-list of your daily assignments
Here're some examples:
- Check all pull requests for rejected ones
- Change status of task containing a rejected pull request for "in progress" and assign to yourself or re-assign to a responsible team member
- Fix rejected pull requests, move task to Review, re-open pull request
- Merge development and master branches
- Fix / eliminate conflicts
- Perform smoke testing
- Move to the next task
You can fully automate this check-list if you have strong DevOps.
Make all arrangements beforehand
Literally EVERYTHING! On large teams workflows are normally standardized and regulated, and decision makers are always super busy. If you badly need to perform code review tomorrow noon, make all arrangements tonight! If you need your colleague's assistance with a complex piece of code tomorrow morning, make sure to ask them now if they can and book their time in advance! If you need to coordinate something with offshore / nearshore teams, start planning it at least a week before!
Be more apprehensive than usual
The more people are involved in your project development, the higher the cost of errors and delays. I'm sure the following situation is familiar to many of you: a developer sends a pull request, team leader is busy and doesn't review or merge the code. The next day, his teammate needs code from unmerged request. This results in declined pull request, two delayed features and lack of proper QA. Eventually, it'll cost the company an arm and a leg, therefore you should make as many efforts as possible to deliver your project milestones on time.
Check back soon for more tips to manage software teams more effectively!