The last year seems to have zoomed by. It only just occurred to me a few days ago that it is going to be 6 years since I started M Cubed. That makes it a quarter of my life. So what exactly did I do with myself the past year and what do I plan to do with M Cubed's 6th year?
The past few months I've constantly had doubts about M Cubed and myself as a software developer. I've been feeling like I've achieved nothing the past few years since I went full time with M Cubed. Sales that were initially heading in a positive direction have somewhat stagnated. They're enough for me to live off, but only because I moved back with my parents after university.
I've felt like progress has been slow. This year has been dominated by Lighthouse Keeper 2. It has taken 9 months to create, but probably should have been more like 6 or 7. I wanted to be so much further along with various applications and be getting releases out more frequently. But that hasn't happened.
And on top of all that has been the crisis of confidence in myself as a software developer. I've been programming for 8 years now, but recently I've had many moments where I feel like I know absolutely nothing about anything to do with software development. I've felt like I don't know how to design software, to write good code, to even solve trivial problems. I've also felt like I work incredibly slowly, at least compared to the speed of some other developers I know.
Given all this context, when I looked back at last year's post I chucked when I saw what I said I'd like to achieve. I wanted to get Code Collector Pro 1.5, Storyboards 1.1 and Lighthouse Keeper 1.2 out. "What a ridiculous and naive goal," I thought, "I haven't done any of that". After a bit more thought though, it dawned on me that I did actually do all of that (well, almost). Code Collector Pro 1.5 and Storyboards 1.1 were both released this year. Lighthouse Keeper 1.2 ended up morphing into 2.0 and will hopefully be released in early december.
Whenever I've looked back at the past 2 years I've focused so much on what I haven't done and where I'm not. It was only the past few days, when I've been wondering what to write for this year's post, that I've thought about what I have actually achieved.
First and foremost, I'm writing software full time and am able to make some sort of living off that. Now granted it's a somewhat cheap living, without my own place or any exotic holidays, but I can afford the occasional game or gadget to keep me happy. But the thing is, many people never even get to this stage, so I have a lot to be thankful for. I may have technically been doing this 6 years, but 4 of those were part time, as more of a hobby than anything. In reality I'm still getting started.
Lighthouse Keeper 2 is also a great example of how much I've improved the past 12-18 months. It is by no means perfect (is any software?) but it is by far the best piece of software I've written to date. It is powerful, it is well designed, it looks great. On top of this the code is pretty good too. I spent a lot of time figuring out how things should work early on, which led to slow progress. But in the latter stages of development I was constantly surprising myself with how easy I was finding it to add features. I'd add something and it would just work with everything else. I'm incredibly proud of myself for that.
I've also learned a LOT this past year. I've gone much deeper into how my tools work. I've pushed myself to learn more and more about Xcode, which has not only helped me develop software more easily, but also let me write my reviews whenever each new version comes out. I know more about how to effectively debug my software which has helped find bugs much faster.
Testing has always been a thorn in my side. I've always done it manually. There have been a few bits of code I've automated the testing for, but those tests were rarely run. I've always put off automating it all, partly due to laziness, partly due to "more urgent" matters, partly due to Xcode 3 being rather crap in this regard. Mostly though it was because I found it such a pain.
So the past few years I've been finding ways to reduce the pain to a point where I write more tests. Improving the quality of my code has helped a lot, but I've also learned the value of pragmatism. I found a lot of stuff I needed for testing I didn't need for shipping code and so it was just make my code messier and harder to read. So I found ways to allow a class to be easily testable while maintaining clean, elegant code for shipping (while also having the benefit of points of extensibility down the line if I ever need it). And while its benefits may be questionable, tracking my test coverage has helped spur me on by giving me some measurable sign of progress.
I've also finally set up a continuous integration system. I've dabbled with it before but given my aforementioned aversion to writing automated tests I didn't see the use. Now granted the majority of errors the CI system has caught so far have been build issues that only affected itself, but the few times it has caught a failed test has helped. And being tied into my source control system means that it always runs.
Another area I've looked to improve is documentation. I've always been fairly reasonable about commenting my code, but I'm trying to take this a step further, but extensively commenting everything, while also writing higher level documentation to help me see how the various components fit together.
And I've become much more proficient at scripting, letting me automate various other parts of my system or extend my tools with additional functionality.
So what will the future bring? Well the immediate future is to get Lighthouse Keeper 2 out. I'll also be spending all of December on those jobs I've kept putting off. The M Cubed website needs a complete re-write, which is also a good opportunity to finally sit down and properly learn Rails. I've got a HUGE amount of code I'd like to finally open source, including many internal frameworks and utility apps I use. I also started work on improving the Appledoc documentation generator, as well as writing a UI testing system for Mac apps, so I'd like to get those finished. I've always felt guilty working on such projects instead of apps, even though I know they'll help me long term, so I'm glad to just dedicate a month to them.
For 2012 I want to get major new versions of Syllabus, Storyboards and CCP out. These will, like Lighthouse Keeper 2, allow me to prepare for the future. They will finally allow me to reach the fabled land of "smaller, more frequent releases" that I talked about last year by cleaning up the source based and structuring it in a way that lets me add features and fix bugs faster. Hopefully I'll also be able to get some of these smaller releases out as well, but I suspect that a lot of my time will be taken up by these 3 big releases.
I also want to continue with my learning. I'd like to explore further into Instruments, which is seen as a mystical land by many, as well as give JetBrains' AppCode a try for a month (and write a review for it like my Xcode reviews). I've also reached the point where I'm confident in doing a lot of design work by myself, but I don't have enough knowledge of the theory behind it, so I'll be spending time doing research there.
A friend has convinced me that I should try to adopt agile development practices. So in 2012 I'm planning to take a proper stab at learning them and see what can apply to my situation. One of my big problems at the moment is a lack of structure in how I develop software, so hopefully a bit more structure will help me get releases out quicker, while also making sure I don't forget many of the ancillary things.
And finally, I'm going to commit to doing some contracting over the next year. I'm hoping to dedicate 10-15 hours a week to it, so it is a significant part of my week without taking it over. Part of the reason for this is simply to get some more money coming in so I can invest it in improving my apps further. But I've also had little experience with working with others the past 2 years. I haven't worked in a team, nor written software where the requirements weren't set by myself since I left university. I've been getting very rusty in this regard and it has been impacting my apps somewhat.
That's a rather long and detailed description of my goals for the next year compared to what I've written in previous years. But the thing I've realised most the past few days is that I can't just measure myself by how well I'm doing financially or how many software releases I have. There are other areas such as what I learn, that are just as important and where I've made a lot of progress. Whether I achieve all I've set out to do, we'll see in 12 months time. All I know is that for most of 2011 I've been in a slump, with little confidence in myself and no idea what the future will hold. Writing this post though, has given me new life and a similar eagerness to what I felt when I first started in this industry. Here's to year 7 of M Cubed Software!
A poor indie developer with an impostor syndrome. Is there any other kind? haha I wonder if Mike Ash feels like he knows nothing after reading some kind of Friday Q&A or it´s just the rest of us.
Anyway, working to create quality products is a big difference for your career. You could spend ten years doing mind numbing work in a corporation and not come out any smarter or happier. I hope this post helps you to internalize your success and keep going.
And to think, Deep Thought started in what, 2004? And it sort of led to M Cubed in the first place.
I’ve been at it since 96.
Here is what i’ve collected so far:
Self doubt is the ingredient of great quality! - just don’t let it overrun you to the point where nothing get’s done.
Acknowledging that there are smarter people than you should only give you the motivation to learn more and excel.
You have the fire, let it burn! - don’t let it burn you.
Make mistakes, it’s the only way we learn and evolve.
Regards!
Keep up the good work!