Hi, I'm Joe! I'm a web developer primarily specializing in Python/Django.
I frequent /r/learnprogramming to help answer both technical and career oriented questions about programming. It's an extremely gratifying use of time.
Today I came across a thread where the OP described their frustration with their programming abilities. Their difficulties originated from their habit of constantly switching from one field to the next, worrying if they were making the right choice. They've learned about network security, kernel development, Python, C++, but they haven't even let themselves start programming yet.
One paragraph from the OP instantly stuck out to me.
I don't want to [be] a typical "code monkey". I want to go deep into low level, even to clear math when we talk about computer science, but at same time, I want to have a job in shorter period of time than let's say 3 years. I was switching so many times between Python, C++, Java and I'm nowhere. I know it's bad practise, it's worst, but I don't know, I'm just confused.
I recognized this mentality - as it has been my own for the past 3 years as a professional web developer.
Web Development is not real programming
Web development has an extremely low barrier to entry in comparison to, say, systems programming. Setting up a Wordpress blog takes significantly less knowledge and effort than building an operating system.
As a consequence, being a web developer does not carry the same prestige as being a software engineer (whatever that is). God have mercy on your soul if HN or /r/programming learns you implemented some common functionality in NodeJS for fun. (Expect the words "web scale" to show up in the comment thread somewhere).
The consensus on programming forums is that web developers are the lowest tier of software developers. Web development is easy, it's not real programming, it's just CRUD frameworks and APIs doing all the real work for you.
My initial confidence
I began programming in college. I was an accounting major at the time. My first programming language was PHP, and I enjoyed the puzzle of expressing human thoughts and idioms in terms of a programming language. Programming gave me an appreciation for the proficiency and complexity of the human mind. The simple act of sorting index cards from least to greatest took a surprising amount of effort to describe to a computer.
I switched my major to computer science the next semester.
Outside of class, I loved learning about PHP, jQuery, Ubuntu, and more. I was introduced to the command line, including this weird text editor called VIM (that I will probably never stop using). I began blogging about all the concepts I was learning, particularly the concepts I found difficult to initially grasp. I wanted to share my struggles as well as provide solutions to other programmers experiencing the same struggles. My blog started receiving 2500+ visits a day. I received numerous comments and emails from kind-hearted individuals letting me know I helped them understand concepts they could never grasp previously.
I knew there was so much left to learn, but I was confident in what I knew and what I was doing.
Life happens: Dropping out
I wasn't able to complete school. I was performing decently as a Math/CS double major, and I had to drop out at age 20 to financially provide for my mother (who was experiencing a major depressive episode and could not work) and my two younger siblings (ages 2 and 6 at the time). I had taught myself enough web development in my free time to land a full time job as a Drupal developer working on News station websites. There I was at age 20 providing for a sizable family, bringing in a salary higher than anyone in my entire family had ever seen, being a good son for my mother and being a good brother for my siblings. I was performing the role of the man my father and my siblings' fathers refused to be. I was entering the workforce as a real programmer. I was proud.
But that sense of pride didn't last very long.
My transition to inadequacy
It's true, I didn't take a compilers or operating systems course. It's true, resources for web development are so abundant I can almost always find the answer to any problems I encounter. It's true, languages like Python give me most of the data structures I'd ever need for free.
I eventually concluded that these people were right about me. I wasn't a real programmer. I had deceived myself this entire time. I was a phony - an imposter.
Those opinions about web development eventually became my own. Web development is easy, web developers are the lowest of the low, web developers don't understand just how easy they have it.
As I incorporated these ideas into my mindset, my confidence was shattered. Consequently, my next objective became overwhelmingly clear: Get out of web development so I can feel like a real programmer again.
Learning out of Fear, not Love
Armed with impulsive spending habits and a sense of urgency, I went to Amazon and purchased just about every programming book not related to web development I could find. Cryptographic protocol implementations in C, Embedded Systems development, Linux Kernel Development, etc. I wanted to learn things that real programmers knew. I wanted to learn the hard things. I bought an Arduino, started hanging out in ##c on freenode, began reading through implementations of the C standard library.
I never fully read any of those books. Most of them I never even started. I didn't do anything substantial with the arduino. I never made it passed analyzing "assert.h" in the C standard library (which I was planning on progressing through alphabetically.)
The truth was I didn't particularly care about those subjects. Cryptography is cool, but do I love it? No. Creating drivers sounds neat, but do I love the idea of it? Not really. Embedded systems are super important and require great care to implement correctly. Am I particularly interested in them? No.
But they were hard, they exemplified "real programming", so I would start these books over countless times over a period of years hoping I would one day be drawn to one of these prestigious fields of programming.
In conversations with my programmer friends, I'd often bring up how I'd like to work on medical equipment software or air traffic control software. Did I have any plan in mind to actually achieve those goals? Absolutely not, but I wanted to make it overwhelmingly clear that I was not content with being a web developer. I wanted to be known as someone using web development as a way to pay the bills until I reached my true aspiration, although that aspiration was never defined.
The consequence: stagnation, self esteem issues
When you hate what you do, you stop caring about it. When you stop caring about something, you aren't going to bother learning more about it.
For a period of nearly 3 years, I was stuck in a terribly unproductive mental state. I hated web development, but I didn't know how to do anything else. Web development was all I knew. Bills needed to be paid, so CRUD apps needed to be made.
And thus arose my main cognitive dilemma: I hated web development because it was easy, but it was never actually easy to me. Instead of concluding "maybe web development is actually hard and those people don't know what they're talking about", I concluded that I must be a terrible programmer.
Since I had spent the past few years learning everything but web development, my skills as a web developer had naturally stagnated. In fact, I would even say I lost skills I previously had. I became unable to accomplish basic tasks at work, or perhaps tasks I perceived as basic since everything in web development is basic, right? Simple features at work would either take months to implement, or I would just never finish them.
Any time I struggled creating a feature, I would have an internal crisis. "This is web dev! This is supposed to be EASY! Why am I so bad at this? Am I seriously that bad of a programmer?" As a defense mechanism, whenever I encountered difficulty with a feature I would essentially stop working on it. I felt more content calling myself "unmotivated" or "lazy" than feeling stupid.
When you have this internal dialogue multiple times a day, your self-esteem takes a huge hit. I became increasingly unreliable at work. It's hard to accomplish any work when you actively avoid it so you don't feel stupid. I looked down on web developers for how easy their jobs were, but I couldn't even do the job. How embarrassing.
A year of instability
I eventually lost my job after not accomplishing hardly any work over a period of 6 months. After that, I went through a phase of landing a contract/job, exhibiting the same behavior that led to me losing my previous job, and quitting before the company had a chance to fire me. I felt like I couldn't do anything anymore. It's like I just forgot how to program, I forgot how to think. I couldn't do a job I once believed I was above.
I could no longer financially provide for my mother and siblings, and they were forced to move into a tiny bedroom at my grandmas house in East Texas. I still have a hard time forgiving myself for that. I wish they were still in Austin with me. I miss them dearly, and I so badly want to see my little brother and sister grow up.
I no longer believe I'm above web development, and I hope I can let myself fall in love with it again. The web is scrappy, but my god is it empowering! JS is a silly language, but the interactivity it has brought to the web is pretty amazing. PHP has tons of warts, but its community empowers content creators in ways that other languages haven't managed to replicate. Python is slow, but it's fast enough for what I want it to do. Web development is a Frankenstein of moving parts that barely fit together, but it somehow works, and that to me embodies the human spirit.
Hopefully this is the beginning of the end to a negative chapter in my life.
My advice to the OP
Find something that you think is interesting and pursue it both passionately and unapologetically.
In the words of Jack White,
It's safe to sing somebody out there's got a problem
With almost anything you'll do