I was a high school student. It was a warm spring day and the quarter was about to end. Instead of following what the history teacher was saying, I was busy scribbling code on a small piece of paper. She probably thought that I was diligently making notes. Or maybe she knew that I wasn't paying attention, but didn't really care. Either way, there was nothing to distract me and I could finally finish my program for finding Mersenne primes. I read about them in one of those "math encyclopedia for kids" type of books the day before and was fascinated by them.
As the bell rang, I hastily folded the piece of paper and put it in my backpack. Oh, wait, I didn't tell you why I was coding with pen and paper. The reason was, I didn't have a PC yet. But my friend did. Like me, he was a huge nerd. I showed him the article about Mersenne primes and told him about my plans to write a program to generate those numbers. With a brute force algorithm. The plan was, I write the program, then we type it into his computer and let it run in the background. And that is how we find the largest Mersenne prime ever!
We were young and stupid. I had no idea about how hard a problem I was trying to solve. Hell, I didn't even know that there were only so many numbers one could represent with the "int" type. We had no teachers. Internet was a luxury in our struggling country. So we just wandered in the dark like this.
But after we were finally done typing the program, after we fixed the countless compile errors, and the program finally ran and produced some output, it was the best feeling ever, even though the program didn't quite work as I expected it to. Slowly, I was learning. Soon, I got my own PC and access to the Internet, and the learning process sped up significantly.
Fast forward a few years, I became a student at a university pursuing a degree in computer science. Programming labs were boring, because I already knew that stuff, but theoretical classes were more interesting. Still, I was longing to apply my knowledge of programming in the real world. That is why I started looking for a part-time job. I thought "real-world" programming would be more interesting. Eventually, I managed to get hired for a very junior position at a small web development shop. That was my introduction to the dirty underbelly of software development.
Honestly, I didn't mind the fact that I was hardly getting paid. I didn't really expect to earn any money - I was after the experience. But the experience was just... Imagine coming to work to spend hours googling, wiring together unbelievably shitty, amazingly poor documented frameworks and battling Javscript and CSS. I can't count the number of times I wished fiery death upon the authors of IE and actually meant it (if you're one of them, by the way, I'm sorry. I was an idiot). To put it simply, I wasn't really learning much. It was just underpaid mindless grunt-work that made me feel my IQ drop. Fortunately, I soon escaped that hell by getting an actual job at a better company, but that's a story for another time.
So why am I telling all this? Let me explain. I have graduated and have been in the industry for a few years and had a few different employers. During that time the idealistic world view of a geek fascinated by mersenne primes has been shattered by multiple head-on collisions with the harsh reality.
I had these thoughts brewing in my head for a few years now, but it took me writing all of the above to finally be able to put it into words: programming is really fucking terrible. I mean, programming the job, not programming the hobby. I still like programming in my spare time, but I don't think I ever caught myself writing code for my employer and thinking "hey, I really enjoy this".
In the end, it's just a job. You figure out what's needed, write it, test it, fix bugs, get input from customer. Rinse, repeat. In the end, you get praised or maybe even receive a bonus. Or something happens (like the boss suddenly deciding the company needs to go in the a new direction) and a few months' worth of work goes to waste. But hey, whatever, I still got paid for it, didn't I?
Sometimes I think about why it is this way. Maybe it's because nowadays software touches so many aspects of our lives. And life is full of mind-numbingly boring shit. And software has to handle it. So, inevitably, there has to be some poor bastard that is stuck writing it. I know I have been that bastard a lot of times.
It is now time to conclude this long-winded rant. I would like to end with a piece of advice for those who are thinking of becoming a software engineer. My advice would be - do not become a "software engineer". I know there is a lot of demand right now, but 1) the demand won't last forever; 2) most of the "software engineer" jobs are boring as shit.
If you really like programming, try to specialize. Like algorithms? You can be a computer scientist. You can become a systems programmer and develop OS internals. Try digging through Linux source code. If you're into programming languages, you can get into writing compilers. I hear LLVM is amazing. If you like graphics, dust off those math books and get good OpenGL tutorial. Whatever you do, don't just be a generic "software engineer". It sucks bad.
I wish someone gave me this advice when I was younger.