Actually, AAA Game Development *can* be a dream job. It's certainly mine.
By some measure, I am one of "them" when we talk about management decisions affecting the lives of developers in our industry. As the Director of our Core (Tech and Tools) team, in no small measure whether people's jobs are miserable or joyful is influenced by my choices as a boss.
It's a responsibility I take very seriously.
Lately there has been a lot of renewed talk about the toxic environments that sometimes occur in professional game development. I can tell you from first-hand, personal experience at previous companies, that *absolutely* those things do happen. There are places that without a doubt, make lives miserable (both in and out of the office), stifle the creativity and threaten the integrity of some of the best minds in the business. But it doesn't have to be that way. And it certainly isn't always that way.
So today, I'd like to share with you some of the things I try to work on and think about every single day so that I can do my part to ensure that we here at Insomniac have earned (and continue to earn) our title of one of the "Top Small Companies to Work For"
* Work with good people
: It all starts with having great people that can rely on each other. I believe that every single person on the team is a world-class talent, or on their way to becoming one. Everyone needs to know they can rely on each other and that no one is going to be left picking up the pieces of some slacker time after time.
* Passion for making things better
: Making a great work environment doesn't mean making a *perfect* environment. Perfection is a fool's errand anyway. But what is important is that we're always looking to figure out what is and what's not working and improve things, every day. Making things better is hard work. It's never finished. To do it right, it must be a habit.
* Fix mistakes
: When you make mistakes, you have to fix them. Things change quickly. And to compete we need to change quickly. It's too easy to stay stuck with our past choices and not re-evaluate them even in response to real evidence. There's a lot of cultural momentum, no matter where you are to keep things the same. Sometimes things that were the right choices at the time, become the wrong choices as development changes. As an example, the usability of our tools and engine was not a major priority in the past. We relied on a lot of brute force to get things done. But as things have changed, our goals have changed. These days, we have a full-time UX designer on our team and everything is usability tested constantly. We've even been experimenting with how to usability test code for programmers. Because the code is really just a (text) UI for controlling the underlying data transformations - exactly like tools GUIs. It's no small effort to make these kinds of changes, but as a team we understand the importance of making fundamental changes when we know they're needed.
* Freedom to raise the bar
: This is one of the main principles here at Insomniac. But this is where I need to give Ted and Al and Brian mad props. Because rather than just paying lip-service to the idea of raising the bar, they built a company that recognizes that to be better, you must fail. A lot. And it's exactly that freedom that allows me to experiment with what will make our team better. And it's the same freedom to push harder and try new things that I try to pass on to the individuals on the team.
* Share ideas
: None of us got where we are without learning from others. You simply can't be a great developer without a healthy exchange of ideas throughout your career. Both internal to our company and externally, sharing our ideas and experience to help make everyone better, makes us better. Along with our R&D pages, inside the studio I try to ensure that we have every opportunity to share what we've learned with each other. Whether it's through presentations or informal one-on-one conversations, creating an environment where people can learn from each other is a pillar of any great team. It's not just everyone has a voice, it's that we *expect* everyone to have a voice and find to express it.
* We participate
: As a company, we participate with our fans. Our community team is dedicated to being out there and listening to what people are saying and working with us to make sure we understand the relevance of those conversations. For example, Ryan Schneider, our Director of Brand Management, is known for giving our team presentations on the state of our community so that we can discuss how that might affect our choices. But I also think it's important for us to be out there, not only talking to our fans, but also our peers. Whether it's on Twitter or Facebook or blogs or whatever, there's a lot of conversations and information out there that will make us not only better developers, but also keep us honest about our own work. The important thing is that we're not *afraid* to participate or try to micro-manage every single thing every person in the company says. Some things are secret, obviously, but beyond those specific details we know there's a lot to be gained from getting out there and just talking to others.
* Push people outside their comfort zone
: In order to be better, you need to grow. In order to grow, you need to do something different. I try to work hard to make sure that everyone has the opportunity to try something they simply aren't good at (yet.) Even when there is someone more expert available, they wouldn't be an expert if they didn't have practice. So you have to let others practice those same skills and not just rely on the same people to solve the same problems every time. Plus, having new people experienced in those skills will also give the experts some extra flexibility to expand in to other areas as well.
: This is probably one of the most important parts of my job. I do my best to meet with twenty-something people for at least a half-hour, at least once every two weeks. For sure, that's a lot of time. But no time is better spent than this. It's an opportunity to listen. Every person is different. There is no "format" for these that works for everyone. Sometimes it's about technical advice and feedback. Sometimes it's about personal issues. Sometimes it's about the day-to-day struggles of development. But whatever it is, it's always about letting each person simply tell me what's on their mind and doing my best to help them, as best I can, grow as professionals.
* Define the problem and the constraints, not the solution
: This one is obvious, but it's deviously hard to do in practice consistently. My job is to guide and direct. To give suggestions and feedback. To review and to set limits. But what I absolutely need to do is allow each person to find the actual solution on their own. I don't want people that will just type in the solution I give them, I want people who are going to use their unique experience and expertise to create a solution *better* than the one I would have thought of on my own.
* The job is what you make it
: Ultimately, making your job your dream job is up to you. Each person needs to push the boundaries of where they can contribute. The same is as true for me as it is for everyone on the team. I don't expect people to be limited by the letter of the tasks they've been given or the job description. It's knowing that it's not really about those tasks or the job description, it's about improving. Improving ourselves. Improving our products.
* Don't wait for feedback
: It's fine to have an 'open-door policy' (which is actually difficult for me since I don't actually have a door.) But more than that it's necessary that I constantly seek feedback. I can't just wait for someone to come to me with a problem or suggestion, I need to use every tool at my disposal to figure out what's on people's minds. That's absolutely part of my responsbility. There isn't a formula for this, either. There are tools I've found helpful for sure (like Rypple.) But the most important thing has been keep trying different things - some things work for some people and not others.
* Ask good questions
: The kinds of answers you get depend a lot of the types of questions you ask. If you want the best out of people, you have to figure out how to ask the best questions. I don't pretend to know any magic answer for figuring out what those are, but I can share some of the questions I have asked with you: Review questions.
* Let people share their progress
: When people work hard to accomplish something, they should be recognized for it. Here people can send their progress to our mailing list. We also post videos and screenshots of how things are improving on our internal web page. And we have presentations (about once a month) where the team can show off the things they've done to the company. It's not just about 'credit' - it's about knowing that your hard work is appreciated by your peers and having the opportunity to get lots of feedback to make things even better.
* Everyone knows what is flexible and what isn't
: From personal experience I can tell you one of the most soul-sucking things that a developer can do to it's people is to constantly change 'the facts.' In particular, release dates. I know a lot of places that will give their developers a ship-date only to extend it by three months when it's closing in, then do it again and again. Which does nothing except piss people off and totally undermine people's faith in the company. Here at Insomniac, we know when we're going to ship well (years!) in advance and that's when we ship. Period. And let me tell you, being able to trust that is abosolutely one of the things that makes Insomniac a great place to work.
* Know the importance of family
: Family comes first. That's it. We have a relatively mature team, many of which have family and kids. I know that in order to be a great developer, you need the support of your family. And in order to have the support of your family, you really need to be there for them. If you want an adult, professional and creative team you need to treat them that way and trust them. I know that people know what they need to do, and we can virtually always figure out how to balance that with the obligations of a family (and personal) life. [Note 15 January 2011: Since a couple people have mentioned it: Yes, I originally posted this on 25 December. But I don't celebrate Christmas, so it's not really ironic. Now if I ever spend all day writing on New Year's Eve or my daughter's birthday, feel free to hit me upside the head.]
* Give honest feedback
: A lot of people have a hard time recognizing their own talents. It's important to share with them where you think they can grow and learn, and where they really shine. A lot of bosses out there have this preoccupation with 'being objective' when it comes to feedback. That's both impossible and ridiculous. Everything I say is going to be colored by my own views. I recognize that. My team knows that. But it's also important to get a wider view of each person's progress and I've found the best way to do that is simply to keep asking those who work with them most closely. For example, recently, I conducted 10 hours or so of one-on-one interviews with the team asking about their personal experiences with others. It was both enlightening to me and perhaps some comfort to others knowing that I try to always find better ways to assess the team and provide fair and honest feedback.
* Clear leadership and direction
: I imagine my view on this one might be somewhat controversial. I do believe that the best ideas come from listening to everyone. I do *not* believe the best decisions are made that way. I know a lot of folks believe in 'the wisdom of the crowds' or 'democratic development' but what I've found is that those methods quickly degenerate into 'design-by-committee' and the outliers, often the ones with the best ideas, are pushed out. Not everyone's ideas are going to make it. But I think it's important that a team knows that the ones that do are going to be consistent with the direction and will be protected (even against a strong initial resistance by the majority view.)
* It's not about the hours
: It's about the results. I'm not going to clock every minute of each person on the team. It's well-established that it's counter-productive, anyway. What we try to do is make sure everyone brings their A-game, every day. It's about having a steady, consistent pressure that's sustainable. And picking the right (demonstrable) goals *all the time* to ensure that we're progressing and not wasting a bunch of time throughout the process. It's about making the right choices about what where to place risk and where to make conservative choices. It's about failing as fast as possible. It's about getting as much feedback as you can as early as you can so that you're not spending months developing something that simply won't work or won't get used. And it's about working with each person on the team to figure out how they can do that best.
: You can't simply hope that people will learn new things. And just encouraging learning and research it isn't enough either. Making continued education of our team a priority continues to be a major focus for us. Of course, we teach each other. But we also bring in guest speakers. And formal (in-house) training on new and different topics. But the biggest challenge, and in my view the most important one, is to get people to question what they think they already know.
* Think about the future
: It's also important that see (much!) further than the immediate problems at hand. While I absolutely believe in an iterative development approach, I also believe in good planning. Those things are not opposed, contrary to what you may ocassionally hear or read. You need to know what you're iterating toward and have a good direction and principles to measure progress against. It's important to me that everyone on the team can see what our goals are one, three or even five years in advance. So that we can focus on the right things.
* Know how to say no
: I think one of the best things any director, boss, manager, etc. can do (programming or otherwise) is to say 'no' appropriately. If you say 'yes' to everything, you end up with a gigantic pile of crap that doesn't serve any job well, without any focus or real strengths. I have to say 'no' to those requests that do not fit our goals, or our guiding principles. And it's hard. There are definitely times when that upsets people. But saying 'no' is exactly what gives us the resources to say 'Yes!' to making things we are doing, much, much better. A good environment is where people know they are able to concentrate on what's important and won't be taken off on a bunch of conflicting or barely-relevant problems that will negatively affect everything.
* Reinforce the message
: Why are we here? What are we doing? What is important? What progress have we made? What have we learned? No one likes working in a vacuum. Every week we have a team meeting where I try to tie everything together and answer these questions for the whole team. Sure it takes a lot of time to prepare this every week, but again, if helps the team, it's exactly the kind of thing I should be spending my time on first.
* Core values
: It's a mistake to try to operate without a good set of core values. You need to define the 1-3 things that *everything* should be measured by. And re-inforce those values constantly, in every meeting, in every conversation. It helps people make decisions that are consistent with each other. Without them you end up with a team that's constantly frustrated by choices that conflict, making everyone's lives more difficult.
This list isn't meant to be a prescription for how to do things. Nor is it all-inclusive. It's simply some of the things I believe we do here at Insomniac that make it a great place to work. It's not perfect, we have our share of conflicts and difficulties. But the one constant is that everyone knows we consistently work hard to make things *better*. Even looking back just one year, our team, our processes and our environment are radically different. Better. I hope I can say the same a year from now as well. I haven't always done all of these things well, and I continue to struggle with many of them, but in order to create a good environment that people want to be in, I have to put the same kind of dedication toward making things better as I would into any technical problem I have as a programmer.
My advice to those people working in toxic environments? Get out. If your management isn't working at least as hard as you are to make sure that you are always at your best, that you are constantly learning and growing, and that you are respected as a professional and as a human being then you owe it to yourself to find somewhere that will. You only get so much time on this planet, don't waste it on them.
Oh, and I'll also note that we're hiring
PS: You can follow me @mike_acton
[15 January 2011] I'll leave you with this. Have a passion for what you do and do what you're passionate about. Don't let people drag you down. And it really, really doesn't have to suck.