When it comes being great at what you do in life, there’s no real formula. Some people have that natural talent for something, and others just love it enough to dedicate the time to get better at it.
Regardless of how you ended up where you are, there is always room for improvement. I’m going to talk about some of the things that have helped me along the way become better at what I do: write kickass software. Realistically, you can substitute “Software Engineer” with your field and most things should still apply.
Disclaimer: In the big scheme of things, you probably wouldn’t call me a success (yet), but I feel I’m well on my way. I’ve only been programming for 7 years, and been out of school for about 2, but I can hold my own. These things are what helped me get to where I am, and are helping me move up and forward in my career.
Now, in no particular order…
Just because your schooling stops, it doesn’t mean you stop learning. You should be constantly learning. New technologies come out, new ways of thinking take hold, and new problems need to be solved. You can’t stagnate and keep solving new problems with old ways of thinking. Sometimes it works, and sometimes it does end up being the best way to do it. Many times you have to explore new spaces and examine the problem from a different point of view to find a truly excellent solution.
Learning happens a number of different ways:
Blogs, magazines, professional publications and journals, books, code, schematics, experiments, studies, whatever. Read as much as you reasonably can. Don’t limit yourself to one or two formats either. Don’t just read blogs. Grab a subscription to an ACM publication (Transactions on Software Engineering maybe), or whatever your field has for professional publications. Read actual books too. There is a lot of fiction being read these days, and with the explosion of blogs and online reading, physical non-fiction books aren’t as popular.1 Find the good ones in your field, and buy actual books (or Kindle ebooks) and read those too.
Go to conferences if you can. It’s sometimes a big deal and can cost a good chunk of money to fly places and get hotel rooms, but it’s worth it. I haven’t even been to a software related conference yet, but I can already tell it’s worth it judging from the tweets, slides, videos, and simply all the people that attend. I always learn things checking out slideshare and vimeo after the fact, so it makes sense you’d learn even more (and have more fun) actually attending.
Professional development seminars
These are designed to help make you better at your job, and improve your career. In my world, they are usually a day or two, but can be multi-week things that cost lots of money. Check if your employer can help you out, because in the end, it benefits them too.
Learn from others
I sort of break this into a couple main parts:
Listen to criticism and feedback
If somebody rips on your code, design, solution, whatever, it is in your best interest to listen to them. It doesn’t mean you have to do what they say, but you at least listen to and analyze what they are saying. Their concerns might be completely legitimate, since they are looking at the problem and your solution through a different lens. They have their own view and are thinking about different things, and might see problems you didn’t.
Examine solutions to similar problems
Let’s say you decide you’re going to write a new source control system. You probably already have a lot of good reasons if you are doing this, but you’d be stupid if you didn’t examine how existing software solved the problem. Go read about git, mercurial and svn. See how they deal with merge conflicts, serving repositories, and keeping things fast. You can learn a lot by examining existing solutions.
I can’t find the quote, but it’s something relating to how you don’t truly understand something until you can teach it to somebody else. So teach!
If you love something, help other people learn about it. Convey what knowledge you have so that others can help solve problems and apply new technology to new problems. Teaching can take the form of giving talks at user groups, meetups and conferences, running formal classes at a site like codelesson, doing corporate training (like what Github offers), or even just walking a coworker through a piece of code you wrote.
Whatever format you choose, get out there and teach.
Love your job and work on stuff you care about
These two work in tandem. If you hate tax software, don’t work at Intuit. Pretty straight forward. You might say “but there’s no good software companies in my area!”
If you don’t like your job, don’t rule out relocating to get a job you will enjoy. If you can’t go to work and enjoy what you do, you might not have the motivation to work on your own stuff, since your day will be so depressing.
Think about it: if you hated MIPS assembly programming, and would never do it at home, why would it be acceptable to go to work every day and do it there?
Do what you love, and love what you do. No excuses!
I think consistency in how you carry and present yourself, online and off, is a big thing. It can encompass a bunch of things, from your dress (Steve Jobs is the ultimate in clothing consistency) to your coding and writing style.
As an example, I ensure that my avatar and bio is the same everywhere. Pretty much any site I’m on, you’ll be able to see my cartoonified self and that I’m (at the time of writing) a “Software engineer (EIT) in Edmonton, Alberta, Canada.” I might leave the location out if there is another place to put location, but it’s there somewhere.
Writing style, dress, bio, attitude, and contact information are all things to keep in mind when it comes to being consistent. If you start giving out an email to be contacted at, keep using that email. If you are consistently a nice person on the net, don’t randomly jump out and be a dick somewhere.
Be consistent. It helps people remember who you are.
Living in a box sucks. If you want to move up in your career (this doesn’t mean climbing the corporate ladder), you are going to want to communicate with people in your field. Have an email and maybe a phone number on your business card. Use Skype for web calls. Use a contact form from Wufoo if you don’t want your email out in the open. But why not? Use Gmail and benefit from their spam filtering!
By being contactable, you’re making yourself available for teaching (“hey, how did you do this?”), job opportunities, and criticism, which as we talked about are all good things.2
Participate in the community
This is Why the Lucky Stiff. 3 4 He’s awesome. He did so much for the ruby community that when he dropped off the internet, people stopped what they were doing to pick up where he left off, and take over maintenance of the the things he was involved in.
If he just sat at home and kept his stuff to himself, he wouldn’t be nearly as awesome.
If you’ve got cool code, show it to people. If you did something cool in your field of work, show it off and teach others how you made it.
Participate in forums, user groups, IRC channels, webinars, and Twitter discussions. Get out there and start talking to people, on and off the web. Go to conferences and get in on hack nights, and find people to go to lunch with.
Crazy and interesting things can come out during lunch.
Practice your trade (code) for fun
If you’re not coding at home, for fun, you’re doing it wrong. Don’t give me crap about I-don’t-have-time. You do, you’re just not managing it properly. Scott Hanselman has two kids and he still programs the crap out of things. If all the programming you do is at work, and you legitimately don’t want to program when you get home, see the section “Love your job and work on stuff you care about”?5
This goes past programming too. If you’re an electrical engineer and a guitar player, make a guitar amp. If you’re a carpenter, make a badass swingset for your kids.
Just work on something that you want to do at home. If what you want to work on is what you’re doing at work, then make like The Eagles and take it easy.
Get shit done
This is from Joel Spolsky. If you’ve ever seen a job posting for Fog Creek Software you’ll see they really only care about two things: smart and gets things done. If you are those two things, it doesn’t really matter if you are a python/django guy or gal, and they need somebody to work on their Wasabi based application; you’ll pick it up pretty quick. It’s sort of like going to work for a different carpentry shop and they say “hey, I know you’re used to red hammers with leather grips, but here’s a blue hammer with a badminton style grip.” The language is basically just a tool, and if you’re a smart cookie that doesn’t screw around, the tool doesn’t really matter.
Use a todo list or go farther and subscribe to the GTD philosophy. I tried the GTD thing, and I still sort of use parts of it, but I cram things into Remember The Milk to keep track of things I need to do, or want to do at some point. This gets things out of your head, and into something where you don’t have to think about them all the time. I also use bug trackers to keep track of specific things on specific software projects I’m working on.
Cut your losses
I know you might want to push through on something, but some things just aren’t worth doing or finishing. I had wanted to do a Gravatar clone using Rails 3 as an example application for when it first came out. It wasn’t set in stone, just something I thought would be cool. But then Rails 3 was out, and I got sidetracked doing other things, and now it’s taken a bit more hold. Me spending time on that application would kind of be a waste, considering Rails 3 has been out for a while, and my blog is also Rails 3 already. If an item has been in your todo list for a long time (maybe it was just a random thought), consider whether or not it still needs to be in there instead of just doing it. This also applies to things you’ve started, but have fizzled out. If it’s not exciting or relevant anymore, scrap it and work on something fresh and awesome.
This one is weird, but I wanted to talk about it anyway.
Actually use todo lists and RSS feeds. Like email, these are asynchronous systems. You send an email, subscribe to a feed, or write down a todo item, and you don’t worry about it too much anymore. Sure, you check your email the next day or read your feeds before bed, but you don’t have to keep checking a website for new content or be sitting staring at the “John is typing…” text on Skype. You can dedicate time to dealing with things, write them down when you think of them, and deal with them in the time you’ve set aside. The more you can get out of your brain into some other system the better. This allows you to focus on the task at hand. Later, when the time comes to deal with email, or read feeds, you can focus on that.
These are some things that apply more to computer related fields , but I list them because they’ve really helped me out.
Get a Kindle
Seriously. This thing is awesome. It’s beautiful to read, you can send other documents to it and have them converted (professional journal style papers in PDF form convert very nicely) for easy reading. The battery lasts forever, and Amazon’s book selection is great. If you do a lot of reading, you need a Kindle. It’s only $139!
Use Google Docs
All the little PDF whitepapers, ebooks, PDF manuals, everything I find on the net (reading or reference wise), goes into Google Docs. It’s a great office suite of tools that works the same on all systems, so you don’t have to deal with “oh I saved it on my Mac and now I’m on Windows” crap. It just works. Files are safe on Google’s servers (I feel great about that, but you might have other opinions about keeping things in Google’s system), and it’s completely searchable. It’s not only limited to the office suite things either. I store PDFs, important archives, or really anything that I want to be safe and accessible.
It might not be the most useful thing in the world for you initially, but definitely check it out.
That’s it. Those are all the secrets. Well they’re not really secrets, but I think they’re going to help me do great things in the software world. Maybe they can help you too.
1 I’m assuming. I’ve not looked at any statistics, but it’s definitely the vibe I get.
2 I’ve helped a few people and had a few job offers through my contact form.
4 Kind of weird I’m using Why as an example for this section, but oh well.
5 The caveat to this is maybe the stuff you’re working on at work is so awesome you feel satisfied in that area, and don’t feel the need to work on stuff at home. This is probably fine, but probably rare, so think real hard about it.