There are excellent tools to allow collaboration from small to big teams, what tools you choose depend on the size of the team, size of the project, ...
One goal is to have constant communication with your team. For that I recommend:
Stay connected, use IRC (and log it)! Use skype/video/gmail or whatever for 1 to 1 communication, but for teams IRC allows a kind of communication that others somehow don't fulfill. You should be on IRC anyways if you are developer, and you can integrate other tools to send notification to your channel (commits, tests)
Use a bugtracking system, plenty of which to choose from.
Use any kind of project management system, tools like redmine, agilezen.com, or an excel sheet. take your pick.
Another goal is for all the developers to have the exact same development environment and kind of data, in a reproducible and automated way. For this you can you a combination of tools:
- vagrant + provisioner (provy,chef,puppet) + fabric
- use fixtures, mock data apps, random fixture generators for your data, and mock 3rd party services in way that you can reproduce and depend on.
The use of virtualmachines provisioned programatically also allows you to develop very closely to your deployment environment, without having all your team members having to install and configure them locally, without losing the flexibility and without the headaches that sharing resources can bring (specially if the team is geographically apart).
Another goal is that team members don't step on each other's toes. Not only not breaking your colleagues code, but also includes avoiding duplicate efforts. Some things you can use:
use a DVCS with a centralized server (i.e. bitbucket) with a coherent commit workflow that also includes deployment. "i.e. git-flow like workflows or always deploy trunk workflows"
setup a Continuos Integration server (jenkins or teamcity i.e.) and write tests like crazy. Track your code coverage and commit to keeping your code with the highest coverage you can. Use unittests, but also use browser testing, i.e. selenium (i like using selenium for more general storylike tests, and unittests for more low level operations, and selenium allows you to test the interactions of the backend and frontend code)
commit contract: Have your team use branches for development, and commit code to the main branch when all the tests pass.
automate your deployment, setup a staging server (that can/should be provisioned with the same scripts as your vagrant box) and hook up your CI server to deploy to it at least once a day when all tests are green from the main branch. After automated deployment, run tests against the server, including load tests, (i.e. with funkload, or selenium, etc..) and graph it using graphite!
Use a bugtracking system. Its a waste of time if two on your team are tracking down the same bug and trying to fix it at the same time without knowing.
You don't have to setup everything from the start, and you might not need to use all the tools. Just keep on eye on those moments where you start to need them.