Some people will tell you it is Aeron chairs, private offices, free soda and maybe even a foosball table. Sure, those things are nice but they have nothing to do with greatness. Firstly we need a definition for "great software engineering team" so that we are all on the same page. The things that I value most in a software engineering team are:
- Smart - handle any technical hurdles
- Autonomous - requires little oversight
- Productive - gets things done
- Plays nicely together - teamwork trumps heroics any day
How do you achieve these things?
Smart - This initially comes through hiring procedures. Make the person do the job in the interview. Yes, that means writing real code (not pseudo code on a whiteboard). Then ask lots of questions in context. You will learn how they think and if they are really smart or not. Hint: Their resume doesn't matter much.
Autonomous - This tends to be a team structure thing. Do team members have autonomy in their day to day tasks? Have you eliminated micro-management? Do they have a feedback loop to improve processes? Is the team empowered to make a difference?
Productive - What have you done to eliminate barriers to productivity? Our developers have less than 1 meeting per week on average. Developers should be designing, building and reviewing great code, not sitting in meetings. Make sure they have fast equipment and access to the best tools. We also use Pair Programming to make developers accountable to someone else which eliminates procrastination and improves focus (along with knowledge sharing, higher code quality and better team comradery).
Plays nicely together - Many companies translate this to the "no a$$holes rule" when hiring. The essence of the idea is do you tolerate someone who is very productive but upsets their coworkers. We deliberately hire for team players and have baked this into our company's core values. The result is that people collaborate, learn from each other and enjoy coming to work.
The other secret ingredient that I haven't mentioned yet is learning. Developers yearn to learn. If you can create an environment where they are really learning then you have it. The best developers want to improve every day and achieve mastery. This can be achieved through interesting projects, unusual challenges, personal career development, being mentored, mentoring others, giving presentations and more.
By the way, we are hiring - if you want to join one of the best software engineering teams on the East Coast, then check out Thycotic.