This is not a tutorial but an opinion article.
A lot of days it seems like a chore, being in the modern world of Software Engineering. Being in the startup community. Being in the programming community.
It's taxing being a software worker
The work of a software worker is mentally taxing and the results of the work, while often grand in the scope of the bigger picture, can be dull and tedious when broken down into tasks, sub-tasks, sub-sub-task, sub-sub-sub-tasks.
I say software worker, and not developer, programmer, software engineer, ninja, consultant, freelance engineer, iOS engineer, frontend engineer, backend engineer, full-stack engineer, senior software engineer, lead software engineer, principal software engineer, software architect, junior systems administrator, data scientist, machine learning engineer or devops. I've had all those roles and they all suffer from similar issues. Every time.
Sure - at the end of the month it'll be amazing and everyone will be excited to see this feature come out. But today it's just me trying to solve a Flowtype error that no one else knows or cares about. Figure out whether or not Memcached or DynamoDB will be a better fit for this problem. Today it's just me spending days of my life trying to increase the speed of a page-load by half a second. Increase conversion by 0.01%.
It's also taxing to be a part of the startup space.
Am I proud of the fact that I am in the same community as the company that spent millions developing a useless-to-everybody, $500 juicer? Am I proud of the fact that no matter where in the industry I go - big company, small company, startup, consulting, freelance, non-profit - my day-to-day, my life, will ultimately be decided by the people with wealth, often to the detriment of the people with none? Am I proud of the fact that I'm solving the problem of SEO and fast page load while there are people starving on the streets of my neighborhood in the otherwise beautiful city of Seattle?
Every morning I try to make peace with all of this. I try to do the best I can to create something positive. To look at things from the perspective of the movement of the entire world as opposed to my place in it. Technology might be used for a lot of useless and harmful things. But overall, when looking as a broad movement, it might help raise the bottom line for humanity's standard of living. Right?
I might die accomplishing little of value in terms of the overwhelming scope of the entire world and everyone in it. But I just made my coworker's lives a little better by adding static typing to the codebase. The users of the tool will get the benefit of faster feature development.
That's something, isn't it? Made someone's life a little better at least?
It's taxing being a part of the programming community.
I've seen a lot of people excited to join the world of software engineering.
Why shouldn't they be? They're about to take control of one of the most powerful forces in the modern world. They're about to learn how to solve puzzles that can challenge their mind to an amazing degree and make them think about things in a way they never have before. Heck, they're going to do this while getting a larger paycheck that may one day help them to support a family. It's freaking awesome, isn't it?
I've watched as, one after another, these people become disenchanted and drop away. Regretting the time they spent. Often feeling inferior, like they've failed some great test. Or loathing those who actively tried to make them feel inferior to prop themselves up.
This thing that should be freaking awesome, kind of sucks.
We're the problem. All of us. Myself included.
People are made to feel inferior because they're people of color.
People are made to feel inferior because they're women.
People are made to feel inferior because they're in a different country.
People are made to feel inferior because they grew up in a rural area.
People are made to feel inferior because they're from a different field than CS.
People are made to feel inferior because they don't have a degree.
People are made to feel inferior because they are bad at math.
People are made to feel inferior because they don't know best practices for one of the million niches out there that you can find yourself in on any given day.
People are made to feel inferior because they work at a small company.
People are made to feel inferior because they work at a large company.
People are made to feel inferior because they use jQuery.
People are made to feel inferior because they use Bootstrap.
People are made to feel inferior because they work on Web Applications.
People are made to feel inferior because they develop video games.
People are made to feel inferior because they develop iOS/Android Apps.
People are made to feel inferior because they use Rails.
People are made to feel inferior because they don't use Haskell.
People are made to feel inferior because they don't use Scala.
People are made to feel inferior because they use too many libraries.
People are made to feel inferior because they didn't use a library that they could have.
None of that matters.
We're all in a game of "who's the best programmer". A game where everything's made up and the points don't matter.
I've spent most of my career adding my own fuel to the fire. I've tried to let people build this persona of me where they believe that I'm some sort of coding master. Where I jump into a problem and it's just solved. Where I do the work of however many other programmers combined. I'm a rockstar, after all. LinkedIn confirms it.
The reality of the situation is that I've been doing this for 15 years, professionally for 13 years, and I'm just as lost as everyone else in the world.
I can't tell you the objectively best way to code this or that in any given situation. I can't tell you whether the library you're using is the absolute best for the task at hand. If I COULD tell you that for one language, I'd be lacking in my knowledge of every other language out there. If I worked to learn the best algorithm for a given task, I'd probably lack knowledge of algorithms for other tasks.
What I can often do is give a solution that'll solve the problem for the forseeble future. Enough to be useful to people. Enough to keep us focused on the problem at hand and not a theoretical problem we haven't encountered yet.
That wasn't easy to learn. It was a grueling path filled with imposter syndrome, self-loathing and awful days of crashed servers and broken applications.
In letting people build this persona of me, I've definitely advanced my career faster than I would have otherwise. Companies want rockstars, after all.
But I've helped to advance a culture where people believe that there are gifted folks and non-gifted folks. They believe there are dedicated folks and then there's everybody else. I've helped to contribute to a culture where people believe there are programmers who work overtime with no extra pay and then there are the lazy folks who should be in another industry.
This can also happen in much more subtle forms. I can't count the number of times I've seen a new programmer ask for help on a simple task and be told that they're doing it completely wrong and should really use these several methodologies.
There's something to that.
It might be extremely helpful for that person to learn those several methodologies within the course of their career. It might help them reach new heights as a software engineer. They might create an application that is more efficient or more easily extendable than they otherwise would have created.
There's also a reason that sucks.
It sucks because it's taken the goal of the new programmer - to create something cool or useful or fun - and shifted it to focus entirely on the part of the problem that is not useful or cool or fun.
Let's say someone is making a grocery shopping list application - to track groceries purchased throughout the week.
They run into a problem with how to communicate with an API and save the shopping list to a database.
They find a tutorial online that teaches them how to make an API in Rails. They find another tutorial talking about the benefits of MongoDB.
They post a question of "How can I save data from a Rails App to MongoDB".
They're then assaulted by hundreds of people telling them that MongoDB isn't fit for production use because X, Y or Z. How they should really think about using Golang instead of Rails. Posters ask about what the programmer is doing, are told, and then those posters go into detail about how Swift should be used instead of React Native because React Native is so new and JS sucks. In the corner someone babbles about microservices and Docker.
The new programmer just wanted to make a cool grocery list. They just wanted to create something useful and cool.
But now they feel overwhelmed and like the world is going to fall apart based on their decisions and they know so little and why did they think they could do this and what's even so useful about a grocery list anyways and why even bother?
We're taking the only thing good about programming - the creation of cool and useful things - and we're choking the life out of it.
We're throwing out the end goal - the creation of things - and we're surrendering to the little, often (contextually) useless details. We're trying to prove our mastery of our skill to other people and to ourselves at the expense of others. At the expense of joy for the skill. At the expense of newcomers and the creative people that fill the world and want to create.
It all sucks and needs to be better.
Anywho - I don't have any answers to any of this. I'm just trying to make a living and rekindle joy I found 15 years ago. I'm just trying to figure out how to help others. I'm trying to figure out how to bring others joy. Trying to figure out how to be happy.
Have a nice day!