Development of a Software Developer

Juan Gutierrez
Ordergroove Engineering
8 min readMay 1, 2018

I’ve been a software developer for over a decade now. Suffice it to say, I’m more aware now of what I don’t know than what I know compared to when I first set foot into the world of “developing software to get paid…so you can live…and survive.” One thing I had going for me, and this is something akin to a litmus test for anyone considering entering the software engineering gig — you should have a strong liking for problem solving and critical thinking. Software development is more Sherlock Holmes-ing, mental palace-ing, and twirling-your-mustache-while-staring-off-into-infinity (if you have a mustache…you can twirl an imaginary one too…no judgments) and less typing at a keyboard. The last part is the manifestation of all that mental power tossing and turning and plying and most importantly…PLAYING with a problem. One of the things I spend my time thinking about and challenging myself and others nowadays is the question of what’s the problem I’m trying to solve/is this the problem we should be focused on/is this the right problem statement? That exercise and it’s value would be worthy of it’s own article…so stay tuned!

No, this article could be considered a kind of crash course of what one should strive for, whether it’s your first steps into software development or you’re a veteran of the field. Really, it’s an enumeration of some of the things I do/have done/have been exposed to along my journey, which I believe are universal and can be appreciated and utilized by anyone, independent of skill level.

I’ve been asked enough times over my relatively still short career as to how one may get into software development, or how to prepare for software development interviews. I believe some, if not most, of what I share below is useful across the spectrum of “I’m curious about software engineering” to “ I want software engineering to be my livelihood” — because it’s not a dogma I’m sharing, nor is it another “101 ways to ace your interview” or “top 10 software development interview questions.” It’s more abstract…and more personal. This search for knowledge…this depth…this curiosity that I’ve found in myself and have seen in others helps push our potential, naturally and not forced, with a certain pleasure and joy that few things in life can produce…and it’s repeatable! So…what have I been up to? The same thing I’ve been doing since I was in grade school: the three Rs — Reading, Writing, and Arithmetic.

Reading Rainbow

These two authors/engineers are just the tip of the iceberg. The first is a great read from front to back that I recommend for anyone getting into software engineering. At first, you may be tinkering and toying with side projects on your own. You may think “no one’s ever gonna read this…” But software engineering is a social endeavor. If you do it long enough, someone else will inevitably be reading or reviewing your code. Robert Martin (aka “Uncle Bob”) has been one of the more influential guides of how to structure what I write…because it is inevitably going to have to be read by someone else. “Future self” is also included in the context of “someone else.”

Martin Fowler is another overwhelming source of well thought out ideas and approaches on how to structure code. While both provide practical lessons, “Refactoring” is definitely more of a reference guide that I keep on hand. I did take the time to read it from front to back, but it’s really more appropriately used as reference manual…I just have a tendency to sometimes be a bit excessive when I take something on.

Twitter is a remarkable source of information…and noise, if not curated. My twitter feed is extremely limited because in excess I find it overwhelming, obnoxious, and annoying. However, over time, I’ve learned that limiting who I follow and being ruthless about it, I’ll find more gems than pieces of coal by following folks whose books/presentations/talks have proven useful. To name a few: Sandi Metz, Ward Cunningham, Martin Fowler, Simon Willison, Uncle Bob Martin.

I strongly recommend following major contributors or straight up authors of languages and frameworks within your language of choice. Follow references made to folks outside of your language of choice. Check out their TED talks and conference presentations. Find people you find engaging and inspiring, dig deeper, research something they reference that you may not understand. Find your own rabbit hole to go down and let them act as your guide through it.

Languages aka Writing

Exercism.io is one of the best sites I’ve found in order to learn new languages and this is something that I feel will also be extremely useful should you have your heart set on any career prospects. You might reply with “but learning one language is hard enough!” True — however, languages are nothing more than tool in the toolkit of problem solving. They each have their pros and cons and abstractly speaking, most operate within a very specific set of rules. Some rules are meant to strengthen certain properties, with purposeful trade-offs for those strengths. Some strongly typed languages may inspire a certain sense of fear in those coders only exposed to scripting languages that are dynamically typed, but that fear, I argue is rooted in misunderstanding and ignorance — not a lack of capability: they’re simply unaware of what the gain, but they’re acutely aware of what they lose…and that can be terrifying.

Coursera.org I use relatively frequently as well. I recently finished a Stanford University Cryptography course there and most importantly: it was free. Not everything there is free, but if you want to get started learning Erlang, Go, Python, R, etc, I’ve seen a lot of starter courses which are free that should be able to get you going.

Brilliant.org has a free and a paid tier. The free tier lets you get your feet wet and is fairly comprehensive. However, if you want to really go deep on a topic, you’ll want to upgrade — they provide extensive material to strengthen the concepts they lay out. They also have a strong and welcoming community — so you needn’t hesitate to ask for help!

If you can learn different languages, show you have the drive to do so, that these things are nothing more than a tool to use in the problem solving toolkit, then you won’t be painted into a corner. You’ll embody a kind of fearlessness in learning. These are strong qualities that people will pick up on, particularly in hiring conversations. They’ll want to know more about the types of experiences you’ve had, what you learned, what you found useful. People will recognize you’re willing learn on your own.

Algorithms aka Arithmetic

So this section could be considered a bit of an overlap with Languages but, bear with me. In the Languages section, all the resources mentioned require critical thinking. They tend to lay out a concept and then follow up with some problems to solve relevant to the idea trying to be drilled in on. By contrast, these two sites provide an array of problems that increase in difficulty as you progress. Another deviation from the Languages resources: they will require you at times to pay special attention to what you’re doing. The naive solution make take hours to complete, while the elegant, more nuanced solution may be able to compute solutions in a matter of seconds. These are two sites that I repeatedly go back to when I have some spare time and/or when I’m feeling inspired to challenge myself. The USACO site has been something I’ve been using since high school. It’s a great way to keep your problem solving skills sharp.

There’s lots of different ways to solve the same problem. Sometimes, like Languages themselves, you’ll need to consider strengths and trade offs and those will depend on what you’re trying to solve. These two resources help sharpen those skills…and the USACO site actively frames its problems in a fun way, many incorporating “Farmer John” and his cows, for example:

“Cow Pedigrees” screenshot from USACO training site

I’m a big fan of the USACO site because you can submit problems and it automatically runs a number of test inputs ranging from the simple inputs to the memory/time intensive edge cases. There are also BB style forums available as well for when you get stuck (and you will get stuck…) that you can browse and engage others for tips and tricks that may not be apparent. They also have contests! Which makes sense, all of this is meant to train people for the Computing Olympiad — some of you maybe competitive software developers and you didn’t even know it!

USACO also provides references for other similar sites, some with contests, some without, but all in the interest of sharpening how you go about sculpting the solution to a problem: how do you develop your algorithms?

Social Engineering

  • Meetups
  • Hackathons
  • Conferences

Counter to the stereotype that engineers are socially inept, embarking in software development with a group of peers can quite possibly be the fastest way to learn. For the most part, going in to any one of the aforementioned events with a humble attitude nets finding others with humble attitudes: those coming to freely exchange ideas with a genuine excitement to learn from others. That’s not to say you’ll never find a brilliant jerk in the crowd, but those aren’t the leaders you want to learn from. Though they may be leaders in their own right, they’re not where you’ll maximize your value. I’ve never encountered such a case in any of the groups I’ve engaged in, but like my Twitter feed, ruthlessly curating who I choose to surround myself with has been invaluable. You’ll be able to tell who is willing to teach and is there for the group — listen and engage them.

So in conclusion…

If you’re getting into software for yourself — have at it! Hopefully you find something new in what I’ve gone over. If you’re entering or already have entered into software as a profession, as someone who has interviewed many candidates, even engaging in some of these things will inherently show your passion. This will naturally drive rich and organic conversations in interview processes or general discussions. This will be especially true with people who share your passion and thus, will more likely be someone from whom you can learn from, and they from you. Really…that’s what it’s all about.

This may seem overwhelming and daunting…it is. But don’t feel like you have to do everything all at once. The journey of software engineering is one that is ongoing and will (most likely) never end. I wanted to provide a number of different options so that you could see what suits you…what drives you…what inspires you. Because once you find that nobody will be able to stop you. Because it will be yours and no one else’s. At that point, no one can take it away.

Are you a software engineer? What tools/resources/approaches did you find helpful? Harmful?

--

--