Desperation-Driven Development

date
type
Post
year
slug
status
Draft
tags
summary
If you want to get anything done by yourself, you need to make damn sure you're going about it in a smart way. This talk teaches you how to get more done through automation, modularity and by creating exactly the tools you need inside Unity. Lessons learnt from 10 years as an indie developer.
How to get stuff done (because you have to)
Lessons learnt from 10 years of working as an indie developer:
Reuse, automate, build exactly the tools you need,
How to get stuff done because you have to - lessons learnt from 10 years as an indie developer
Lessons learnt from indie dev
Automate the boring stuff
Write your own Unity Editor Tools
The things that helped me the most in 10 years of working as an indie developer and in startups

The Problem

If you're an indie developer who's working solo or in a small team, then you need to get stuff done. If you're not doing it, then it's simply won't get done at all. And if it's not getting done, there's not going to be a game. No game, no money, no food on the table.
So one thing I learnt very early on in my indie career is that I need to make damn sure that I'm going about my work in a smart way.
I call this approach Desperation-Driven Development. Working fast - out of necessity. Being smart so as to not die.
The two main factors that determine how quickly a project gets done are the scope of the project and your productivity (Time to finished product = Scope / productivity) Your main problems are scope and your own productivity.
Could I make a game like GTA by myself? Yes, I could. But it would take me 500 years.
A person of average intelligence can learn every skill necessary given enough time, so skill is never an issue if you have enough time and perseverance. But as soon as there's not enough time, it quickly becomes an issue.
So what can we do? It sounds so simple: Reduce the scope, max-out your productivity.
But how do we actually approach that? Here's the lessons I've learnt over my 14-or-so years in the games industry.
There's nothing more dangerous than a good idea. (scope)
NEW ORBIT – started out as such a simple idea. I had played around with simulating gravitation and had a little prototype app where you could let things fly around planets, you could try to get them into orbit, make them collide – it was great fun and after some serious optimization I got it to run well on the iPhone 3G. My plan was to turn this into a finished game in a month. Then I had an idea: how about I add a story? This was followed by another great idea: Let's add voice-over. In the end the game took about a year to make.
A side note: Feature creep is bad if you want to keep paying your bills but it sure can be great for your game and for personal development. (I learnt a lot about voice acting and story writing by making NEW ORBIT) If you’re working for a company you most likely won’t have this freedom You got hired for one thing and are not supposed to touch anything else ever again...)
Don't get me wrong – new features are great and often times your finished game will look nothing like your initial idea simply because you run into things that make it more fun and you shift direction. That's a good thing. We want to create the best possible experience. But how do you know when to stop? How do you know what’s going to be an improvement and what’s just going to be a waste of time?
Things I've come to understand:
  • Being good at selecting what to do
  • Creating a solid foundation to build upon
  • Middle-ware is as much a curse as it is a blessing
    • The asset store is your friend and your enemy. You buy a thing to fill one specific need, but then it does a hundred other things as well that you can’t easily remove, then you upgrade to a new version of Unity but the developer of the asset has abandoned it and now you need to wade through 5000 lines of awful code and fix the whole damn thing just to keep the one little bit you need going. So here’s my desperate call-out to all other asset store devs: don’t try and make your asset do 100 things. I’m actively avoiding “complete solutions” and assets that look like they do too much. Write simple things that do 1 thing well. That’s all I want.
  • Getting help that actually helps you
    • It’s such a simple and obvious idea. I’ll just outsource this bit, maybe even hire some random dude on fiver to do it. Except now you have to explain exactly
In the big cloud of ideas that surround your game concept, you need to pick out the ones that have the best ratio of impact vs effort. If you have an idea that doesn't add much to your game, but is a lot of work? Put it on the bottom of your list. Have something that is easy to add and adds a ton of enjoyment – do it right away.
Solid foundation: I can't overstate the importance of this. Game development is often hectic and a bit chaotic, you create a quick prototype and then you just keep adding to it without looking back. But there is not a single time I have done this that I haven't regretted it oh so very much later on. If you don't have a solid base to build upon it will make your life so much harder later on. The core loop and the basic systems must be clean, they must make sense and must be easy to understand. Take the time to do this and everything you build on top will be so much easier to do and there will be fewer issues and less bugs.
Write clean code, there's some interesting literature out there about this topic. Let me give you the jist of it:
  • Always use meaningful names (Nouns for classes, verbs for methods, etc.)
  • Every method, every class should have focus. They should do one thing and one thing only.
  • No mothed should have more than 4 lines of code. Ideally. If you need more, extract parts of it into a method and give it a meaningful name. Now you have turned multiple lines of code into a single line and it should be easier to understand what's happening
[Create good example!]
The concept of "good enough"
Perfectionism is your enemy. There's this saying that "Art is never finished, only abandoned". If you work on a 3D model you could keep going forever, there's always one more little detail that could be better, there's always one more thing you could add. So here too we have to be economical and make sure we do the things that matter the most first. Start rough, then polish the most important parts. I spent my first half year in game development building quest objects for Age of Conan, basically taking one object from start to finish per day. Research, modeling, texturing. Many of those would only ever show up in the inventory
Things that make a difference: animations, effects, polish.
Productivity -
It pains me to have to say this and sound like a personal optimization webinar – But: Your physical body is your most important tool. Try to keep it in top condition: Eat healthy, try to get enough sleep, do sports, read books, give yourself time to think. I know – I've grown up with Nirvana and Nine Inch Nails, I spent my entire youth playing in bands and writing depressive songs and it was never my plan to live past 27 - so I can totally see how depression and misery can lead to great artistic work, but generally speaking (for game development) you're better off if you keep your body and mind in a usable state. I guess.
But let's focus on what we can do:
It takes an instant to have a great idea, but then it takes x years to manifest it into a finished game.
This is one of my main missions in life: I want to minimize this mismatch, I want to bring our tools forward so that the time it takes to implement a feature comes as close as possible to the amount of time it takes to invent that feature. I still have a long way to go.
The danger of AI: I tell it what I want and it will do it. But then it’s only a very small step for it to also come up with a better idea and I’m entirely not needed anymore.
Reuse and Automate
Create exactly the tools you need
There can be positive side effects to this: If you write something that could be useful for someone else as well, sell it!
You can start with simple things:
If there are 100 things that need to be assigned, don't do it by hand. Write a script that does it for you. Might take longer than doing it by hand, but in my experience, there's always something that changes or breaks and you'll end up having to do it again. And again. And then you'll wish you had just written a script in the first place. It's always like this, trust me.
And it's not just that, there's also the psychological effect of repetitive/boring tasks. Us humans, we don't like boring and repetitive. So we'll check our emails first and go do this and that before we come back 5 hours to finally force ourselves to just do it.
Examples: AI for Age of Curling? Ship assembly, Ship Wipers, New Orbit planet landing spots, Synthspace Auto-assembly
After a few times of writing scripts for this kind of thing, I tried to take it to the next level and created BatchProcessor – a little tool that gives me all sorts of options to quickly find and filter objects and then do something with the result. I love this thing and it's a great help, but it has it's limitations and I have a plan to take it to yet another level by using a node-based approach.
One more tool that's become very useful over the years is a visual StateMachine.
When you're done with a project you should not just be left with experience, you should have expanded your arsenal of tools that will make it faster and easier to build your next project
It's so easy in Unity.
Create Custom Editor script
Create tools that help you create exactly the tools you need
Polish the tools and sell them – a way to finance development
The AssetStore is your friend. Also not. Buy stuff, sell stuff.
How to create tools/reusable assets in a way that they are easily reusable?
Good coding practices and documentation are important.
If you write something and it works now that's great. But if you come back in 5 years you should still be able to understand and reuse it.
I knew I had to create reusable tools if I was ever going to get anything done. And then I realized I could make tools that would help me create those tools. The difficult part then is to stop. Now I'm working at Magic Leap, creating tools. It's a cautionary tale, really.
If you want to get anything done by yourself or in a small team, then you need to make damn sure that you're going about it in a smart way.
But then stop before you've turned into a tools developer.
I think personally I've gone too far. I go so far as to work on individual modules in separate projects. When a module is done I slot it into 3 different game projects and hook it up. It's great, but it also means that at this point I have what feels like 100 half-finished prototypes lying around and in 10 years time finally everything will come together and I can release all of them at the same time?
What's the goal? You work for a year to build all the tools and then you press a button and your game self-assembles? I have what feels like 100 prototypes lying around that are all missing a few key pieces – but once they're in place it will be smooth sailing. In 10 years everything will come together and they'll all get released at the same time.
Once you're done with the first 80% you only have the other 80% left to do...
Modularity – view vs controller, MVC, etc.
If you write a menu system, don't bake the UI into it. If the same system can be used with a totally different UI, then you're saving yourself a lot of work on the next game.
Working with others
Only the things that are written in the contract matter. No "it's written like this, but we're actually doing it like that" - I promise you that every single one of those things will come back to bite you.
Material for a whole different talk: starting a company with someone you've never met...
Middle-ware is a blessing and a curse
Unity is great, but you don't have the source code for most of it. So if you run into an issue that you can't fix and that they don't deem important enough to fix right way, then you're out of luck. This shouldn't happen much these days if you're moving on well-trodden paths, but if you use new features or lesser-used features (like multi-monitor support, the newest VR/XR devices) then this can become a problem.
The Asset store is your friend. And your enemy.
There are some great things to be found on the Asset Store. There's a few things I can wholeheartedly recommend and then there's a gigantic amount of absolute trash I wouldn't even want to touch with a stick.
Outsourcing
Clear and concise instructions + exact test case. Clearly state that they will only be paid if the result passes the test case.
Define a clear timeline and demand that they stick to it. Payments per Milestone
If it takes you longer to describe what you need and to manage the contractor than it would have taken to do it yourself, then you're doing it wrong.
Freelancer.com and PeoplePerHour are interesting options but it's a bit of a lottery. I've given a task to a guy who barely spoke any english and was basically never heard from again after the initial payment, and I've had had people who did excellent work and delivered on time.
The long tail - update your back catalog
Keep your back catalog updated and well-documented!
Marketing
If no one finds out about your game, no one buys it. Simple as that. Getting some reviews written by gaming websites makes basically no difference at all. Not enough people read them and after a day or two your on page 4 where no one ever goes. I've never seen a significant spike in sales from a review.
So what can you do? I don't have a clue.
The real problem
Is our system
Why do I have to keep my scope small and my productivity high to survive? Because I need money to survive. And having a family ups the ante quite significantly. Suddenly you need earn a multiple of what you used to get by on.
The way it is now you can only vote with your money. If you spend your money on this game, then these people get to make more games. But is this the best game for you at this point? There may be 50 others out there that you might enjoy more, why did you pick this one? Maybe they simply had a bigger marketing budget, a better distribution plan, did they simply advertise in the right place or know someone at this exact publication that you read?
Look at the app store – the only way to survive on there at this point is to either fall in favor with apple or to spend a ton of money on marketing. If you just make a nice game and launch it – no one will ever know. It needs to be truly special to make a dent.
This encourages people to make clones and do app-flipping. If someone's making a simple runner game and then re-skinning it in 10 times to look similar to all the latest disney movies, then you can be sure that they're not trying to make a meaningful contribution to our cultural heritage, but that they're solely motivated by money.
And this is exactly why having to work for money is bad for us all.
It pains me to think about how many great novels go unwritten, how many great games don't get made simply because some very talented people weren't born rich.
In addition: If we're all just trying to maximize the financial potential of our projects, then we're tempted to dumb our content down until it appeals to the biggest target audience. How much more meaningful could a work of art be for a small group of people if it were allowed to be just for them and not trying to appeal to as large a group of people as possible.
All contributions are valuable, even if there's no target audience at all. There's enough works of art that no one cared about until 200 years later.
Money should not be the deciding factor. We should all be free to do what we want.
Universal basic income:
Why is not everyone in the world working on this? Automate all the boring shit, so everyone's basic needs could be met for free. Then everyone could be doing what the want! Maybe the single mum working at the grocery store would be an awesome science fiction writer if she didn't have to struggle to keep her kids fed. Maybe she'd be a shitty science fiction writer – doesn't matter. But she'd contribute to our collective cultural pool of works of art rather than having to ...

Leave a comment