The work involved in planning, designing, building, and managing enterprise and internet-scale software systems is as complex as any other human endeavor throughout history.
Okay, well… Maybe not the most difficult or the riskiest, but I think it can easily be the most complex in terms of variables and interdependence.
The lifelong learning and the speed at which we must keep up with the latest and the greatest are the perfect examples of this and easily two of the biggest challenges we often face as developers.
I, for one, like and enjoy the challenging aspects of the job, but there are plenty of developers out there who find these to be some of the most overwhelming and intimidating things they ever have to deal with.
To those people, here is some advice I feel can help:
If you’re constantly finding yourself at the mercy of complexity and having to adapt as fast as possible because rapid change is the only constant here – there are two things you can do about it: Embrace the situation and make the best of it.
That can be easier said than done, but in this field, every successful developer or team must find a way. My 30+ years of industry experience (counting from the moment that my dad taught me vi on his WICAT 150 until now that I am a system architect and consultant) have taught me a few important lessons, some of which might seem obvious and some not so much.
These lessons are what I consider my go-to fundamentals for getting better at the things I care about. I hope they help you just like they help me every day to keep up with this complexity and the rapid change in technology.
1. The learning is the work and being a student is sort of your part-time job
If you think about it, no matter your level of experience, a huge part of being a software developer is being a dedicated and agile student.
In essence, our job is to figure out either what is happening or what is the best way to make something happen without screwing up anything else. And since nobody nor any available authoritative source has the right answer, and sometimes there are either too few or too many non-authoritative references – we’re left with the task to sift through those and evaluate them.
In other words, we’re constantly having to learn as we solve problems. Or problem solving on steroids if we want to get satirical.
Anyway, my point here is that only by truly understanding this perspective and going out of your way to become not only a great developer, but a student as well is how you’ll positively impact your work and long-term success.
2. Everything (almost) here is about teamwork
While people tend to glorify the contributions of individual "geniuses," the truth is that developers can rarely make much impact on their own.
Unless you are Linus Torvalds or Jamie Zawinski, but even they would probably argue that.
The reality is that the concept of team is, simply put, the most effective approach to solving complex problems that require systems and software solutions.
And this is commonly known if we’re talking about the way modern companies should work. But for you, the concept of team or being part of a team also applies if you want to build a successful career in this industry.
There is nothing more empowering than surrounding yourself with like-minded people who are trying to get better themselves.
We are also social animals, after all – so this approach makes a lot of sense.
So, find and participate in a community of people with similar goals – and build each other up through fun, encouragement, and challenge.
You will make far faster gains and yield far greater returns when you actively cultivate positive relationships with those who have similar interests.
This can be your immediate team at work, a community of practice at your company, or any of myriad professional learning groups.
3. Be as honest as possible with yourself, even during failure
There is a bunch of things I could say about failure.
And while it’s perfectly clear that at some point in our lives we will all get to fail to a certain degree – It’s of the utmost importance to our goals and aspirations that we’re brutally honest to ourselves 100% of the time.
Unfortunately, this isn’t always the case, and Peter Senge addressed this situation in his seminal book as “creative tension.”
Senge's insight is that people and groups will tend to resolve such tension, the one between their current reality and their goals, by either lying to themselves about the truth of the current situation or by reducing their aspirations to be something less difficult to achieve.
And yeah, either tactic may help people feel better about the apparent discrepancies – but they will also diminish their potential impact.
Successful people and teams maintain lofty and even audacious goals without deceiving themselves about reality.
Three things that have helped me in the long run here:
· If you screw up, own it, apologize, and make it right.
· Schedule time regularly (at least monthly) to assess your progress against your goals and identify and commit to any adjustments you need to make.
· Be kind to yourself: You deserve a break. Nobody is perfect.
Remember that you are responsible for the only thing you can ever do about anything: changing your own behavior.
It is up to us and only us to do that, but we can't do it effectively if we don't regularly challenge ourselves about what needs to change in order to reach our goals.
4. Forget the extra stuff and focus on impact
In our line of work, it’s easy to get distracted by the zillions of potential issues, details, challenges, setbacks, and uncertainty that we often face.
The breadth of aspects to a particular project will often lure you into focusing your attention on certain areas at the expense of other more important ones, creating what we know as the rabbit hole situation.
This phenomenon wouldn’t be so bad if time wasn’t constantly at the essence here, but unfortunately – we’re are in an industry where we need to spend our precious time doing and learning only the things that really matter and will generate the most impact.
To do this – you need two things: clarity on what your target looks like and a stay-on-target mentality.
As simple as they sound, those are the strongest and safest fundamentals that will basically shield you from spending your time and energy on the extra stuff.
Organizational habits to encourage these fundamentals are also key here. Regular check-in meetings with your stakeholders (and ourselves), for example, are great ways to make sure you are focusing on the most important elements of the work that’s in front of you.
Fortunately for us, modern Agile methods in software development do this well, often by prescribing regular meetings with our stakeholders and including comprehensive agendas that take all of this into account.
5. Cultivating good relationships matters a lot in this space
My entire life changed when I learned that the relationships we build with others are actually the entire point of it all. And I learned that from Stephen Covey.
Virtually, everything we do, including programming, is ultimately about building more and better relationships with real people. It is within this universe of relationships where our effectiveness as software developers will happen.
No matter how good our code is, if we fail to cultivate the relationships we want and need – we got nothing.
And this is even more true in a socio-technical industry like software development, where software is simply a by-product of a bunch of human elements, activities, and skills.
In fact, as you grow in your career, you will learn how some of the most important things about developing software have almost nothing to do with code and more to do with the people.
Now, all these thoughts I mentioned here make me wonder…
If this profession didn’t have all the challenging and complex aspects it has, would we really be happier doing it?
Without generalizing, I think that a big portion of what makes people content with their work is having that feeling of being good at something that’s simply hard and makes them unique and useful.
And please don’t get me wrong, I am not trying to confuse struggling or the pursuit of bettering yourself with regret and ranting. I am just saying that sometimes we let adversity get the best of us, and we forget that the most difficult things can also be the most enjoyable ones. Even when they make you sweat, tear up, or cry.
Anyway, as complex and difficult as software development is – I really hope these lessons help you get by and embrace it all a bit more. They for sure have helped me tons, and it’s by meaningfully adopting these as my daily philosophies that I feel more effective and ultimately happier with my work.