In looking back on my career (no, I’m not that old, but I have been around long enough), there have been a few inflection points that have really helped me career-wise and they strike me as being generally applicable to software engineers/programmers who are interested in either getting better at their craft or in moving up to management or simply improve their breadth of knowledge. I realize some of these suggestions may not be possible for you given your current work situation, especially if you are at a large company with much more rigid definitions of who can talk to customers, so don’t worry if you can’t do them all. Also note, sometimes you may just need to ask!
Contribute to a Viable Open Source Project
Unless you live under a rock, you’ve heard about open source and you maybe even have a few small projects on Github or SourceForge. All of that is well and good, but what I mean by “viable open source” is that you should make an attempt to contribute to a project of significant size and scope that your code has to go through a vetting process and, if accepted, will see it’s way into production in a large number of systems. The things you’ll learn from doing this are numerous. For me personally, it’s meant: writing better code, communicating better, more job opportunities on favorable terms, higher pay, more recognition, more understanding of other points of view and a thicker skin. On that last point, your code will, at some point, be scrutinized and criticized. It’s not personal (assuming you picked a good project and even if it is, try to separate yourself from it) and it’s only software. Take it as a learning opportunity and make it better instead of getting offended. This isn’t always easy and I know it’s something I struggle with, but I also know when I let go of ownership, the code (and me) always gets better and that’s really what matters.
As an extra bonus, from an employer standpoint, I find it much easier to hire people when they have a public track record of real code in production. I’ll take an open source contributor over someone with comparable skills any day.
Sell Your Software
Yes, I literally mean you should go on sales calls, if possible. In other words, I think you should put the geek in you on a shelf from time to time and have to explain what you do in plain English for others, not just your peers, to understand. If you can’t explain what it is you do, why would anyone buy it?
Doing pre-sales has been invaluable to me as it required me to have to stand up in front of a real, living, breathing customer and explain to them why I think they should buy my software. The first few times I did it, I was nervous as can be (no doubt exacerbated by the fact that I was working at a startup and we were just trying to get off the ground), but I made it through, got some coaching, and got better.
Selling software you wrote will give you real perspective on what you are building and why, it will also expose you to a ton of use cases and real feedback as to what is good and what is bad. It will also humble you as well as bring you a new level of confidence. You’ll also have a lot more respect for the people who make their living off of selling the stuff you wrote. Additionally, you’ll also know first hand the pain of when things don’t go right in the code and make you wish you had written better tests! Finally, in the long run, it should help you see the “big picture”.
Support Your Software
The flip side of selling your software is supporting it. Find a way to take the first line calls to support, or at least be involved in them so that you can experience first hand the good, bad and ugly of the way people use your software. Bug reports and escalations are one thing, hearing it first hand from a customer is yet another. Besides the social skills needed, you’ll also need to be able to quickly get into a customer’s use case and their way of seeing your code and that will further illuminate where you are good and where you can be improved. It also means knowing what to say and what not to say, as it is a fine line when dealing with paying customers. As with selling, it will also give you a new found appreciation for the hard work support does to support the stuff you wrote.
Write/Train On Your Software
If you haven’t got my point yet, I’ll make it clear: I put a lot of value on engineers who can not only write the code but also communicate the how and why of that code to a variety of other people inside and outside of an organization. By writing and training on your software, you have to explain complex technical details in a clear, concise, relatable way. It will often highlight where things are broken from a user’s perspective, too. I can’t tell you the number of times where, in writing or training on code I helped on, I realized, mid-sentence that the feature or functionality wasn’t quite right and I went back and fixed it. This is especially true of API design.
Writing can also bring you more exposure and a wider audience, which feeds back into your need to take your game to the next level. There are many, many opportunities out there to write technical content for websites and publishers. Learn to pitch your idea (see, you are selling again!) and follow through on it and next thing you’ll know you’ll be a regular author and likely even get paid for it.
Make Some New Friends
Probably the single biggest game changer for me in terms of both learning and opportunities was an explicit effort to expand my personal network. It isn’t easy and it definitely involves “putting yourself out there”, but the rewards are often quite significant and, in hindsight, the risks are quite small.
If you haven’t networked much outside of your immediate circles, I recommend a few things. First and foremost, the key to networking is you have to genuinely want to meet new people and you have to genuinely expect nothing to come out of it other than a new connection. Second, make a commitment to sustain the effort for several months and beyond. It will get easier as you get more confidence and you learn from any mistakes. Third, be yourself, but put an emphasis on listening to others. Fourth, and this is still my weakest, learn and remember names. I rarely forget a face, but names often slip by if I don’t make a concerted effort to learn the person’s name. People are rather attached to their names, so let them know you think they are important by remembering their name.
Beyond these tips, there are a number of good books on the subject. One of my favorites is “Love is the Killer App”. It’s a hokey title, IMO, but the advice in the book is solid and the author does a good job of presenting it. At the end of the day, put yourself out there and learn from the feedback you get. If you find you are getting rejected a lot, ask a trusted friend to give you real feedback on what you can improve. When in doubt, get the other person talking.
Bonus: Find Mentors
Chances are, you already know people that you respect for their ability to handle complex problems and communicate effectively. Odds are also good that they would be willing to share their experiences with you and give you feedback on ways you can improve. Learn from their wins as well as their mistakes and be open to their advice. It won’t always be right, but you should at least consider what they are saying and then make a decision. Personally, I’ve had the good fortune to have a friend who is also an executive coach (we met serendipitously, proving the value of putting yourself out there) and a business owner. Throughout the years, I’ve also had a number of good bosses and colleagues who have acted as mentors over the years and to whom I’m forever indebted. To get started, ask yourself who you respect the most and then go discuss the idea with them. You may even want to consider hiring a coach if you can’t find a friend to fill that role.
Keep in mind, that all of these things are something you can do here and there periodically. They typically don’t require big time or monetary commitments, but they do require you to get out of your comfort zone.
Finally, I’d be interested to hear other things programmers/engineers have done to improve their career/life. What worked for you? What didn’t work?