This week marks my six-year anniversary with Heuristic Solutions. My longest stint prior to this was 3 years, so this feels pretty notable to me.

Sadly, no one brought me any cake today and I haven't received a gold watch yet. I'll attribute the lack of cake to the fact that I work from home and cake doesn't travel well in a USPS AirMail envelope, but last I checked watches won't spoil if left in the sun.... Anyways, I guess I'll have to mark the occasion myself by reflecting on my experiences here and turning them into some career advice tidbits. If you're looking to find a great place to settle down and grow, here's my advice:

Work for people you trust

It's a scary thing to not trust the people you work for, or to not know the content of their character or the direction of their moral compass. By contrast, it's incredibly liberating when you DO trust those people; it frees you up to take risks, to let your guard down, to align your interests for the betterment of both parties.

Seek purpose, mastery and autonomy

Immediately leave any job where you don't have a sense of purpose, you're not encouraged to seek mastery in your craft, and you have no sense of autonomy in your work or environment. A programmer with all 3 of those is truly livin' the dream. A programmer without purpose, without growth or learning, and with no freedom of thought or expression is miserable.

Favor "career collaboration" over "employment negotiation"

Three times over the past six years I've considered leaving, and all three times I decided not to. Each of those decisions was made following an open, honest and transparent conversation with my boss about my concerns. And I'm not talking about the "give notice and then take the counter offer" game, I'm talking about a collaborative discussion about goals, wants, desires, frustrations and intentions.

It's hard to express why this is so significant, but it makes me feel less like a "resource" and more like a valued employee. And feeling valued is one of the reasons I continue to stick around.

It's not about the tech

By and large the reason that software projects succeed or fail is People and Process. I think you'd be hard pressed to find a project with great people and good processes that failed just because someone used the wrong data binding library, or used inheritance over composition, or put their braces in the wrong place. It's important to stay abreast of new technologies, and it's important to maintain a wide breadth of experience, but New and Shiny != Success. Find a team with the right principles and you'll be successful with pretty much any tech stack*.

* Unless that tech stack is VB.Net, which was built with sin and unicorn tears to maximize Eye Bleedage and WTFs Per Hour. Nothing but darkness awaits you there.

If you never fail, you're not trying hard enough...

The great thing about working for people you trust is that you can take risks. You can try out a new role, roll the dice on an ambitious architecture choice, or push your team in a new direction.

I've stayed in the same company for six years only because my role has changed significantly over time, and my role has changed because I wasn't afraid to try new things. If you're too busy covering your butt to try new things, you're in the wrong place.

... but if you fail often, you're not managing expectations

One of the most important skills I've developed over my career is "managing expectations". I can think of a number of projects where we missed some financial or calendar target but the client was still happy because we'd proactively managed surprises and given them options for managing change. Likewise, there were times that we hit the budget and deadline but the client wasn't happy because reality differed from their expectations. Success and failure have more to do with communication than they do with burning the midnight oil to release on time.

Manage expectations by putting yourself in someone else's shoes, looking at the situation from their vantage point, and then doing whatever you can do to make them feel informed and empowered. This skill is crucial for building trust and credibility with a client or an employer.

No job is perfect, but you can always make it better

No one is going to call you up out of the blue and offer you your dream job. Ain't gonna happen; every job you get offered will have parts that are awesome and parts that suck.

But that doesn't mean you can't make it better; I've been successful in my career, and at Heuristics particularly, by actively working to improve the things I didn't like. My team wasn't writing enough tests so I started writing helpers to make it easier; the tests weren't getting executed so I set up continuous integration; we weren't having frequent enough "lunch and learns" so I started scheduling them.

If there's some aspect of your job that you don't like, change it! Worst case scenario is that you're unsuccessful, in which case you're no worse off than you are now. But far more likely your efforts result in a real and positive impact and you inch that much closer to creating your dream job.

Remember: you can change the place you work, or you can change the place you work!

In conclusion

I feel blessed to have found a place so welcoming to me. I don't know what the next 6 years will bring, but I'm excited to find out.