I'm a beginner in programming and I've been reading books, studying, reading articles, and whatnot. I'm getting great results since I've started learning programming, and when I was a beginner I used to think I knew everything about programming, but as I learned more I realized how difficult this field is (In fact all fields are difficult, but that's not the point).

Nowadays, I've written functional software and I've learned the BASICS of 3 languages and I'm intermediate in just one language. When I look at advanced things like MYSQL, or OpenGL programming, or even visual studio C++ code it gives me headaches, and even when visualising HTML source code of many websites (Most source codes on websites, seen by google chrome seem very messy and unorganized) it makes me confused to the very limit of my brain. It all seems simple at first, yet when looking at these advanced things it just makes me wonder how can one learn so much.

The question, in a nutshell, is if these things become clearer to a programmer as he advances in his career. Do complicated topics as the ones listed above (OpenGL, MySQL, advanced html sites) become easier to read, write and understand as you learn more, or does it just get more complicated as you go by? How can you combat this feeling that you're an ant in the programming world and this stuff is the foot about to squash you?

Short answer: no.

Long answer:

Reading code of other people becomes easier, yes. But only reading. As you gain experience and skills, your personal requirements as a developer grow.


You don't want to just write code. You want to write beautiful code.
You don't assume your code runs in ideal conditions. You start to think about all bad things which may happen when running your code, handle exceptions, think about hardware problems, network latency, and the problem grows as your skills grow.
You don't read and write code in the only language you know. As a skillful developer, you know that to solve this specific problem you have right now, functional programming is a much better alternative, so you must now read and write code in functional programming language.
You don't limit yourself to a small set of libraries you know. If you code in C#, you want to know and use the full power of many libraries of .NET Framework.
You don't use notepad any longer. You need your powerful IDE, and you want to know how to unit test code, what are code metrics about, and what is the meaning of hundreds of options and windows your IDE can show to you.
You don't want to modestly limit yourself to a basic set of tools the language gives you. In C#, you want to use generics, code contracts, reflection, event-driven development, functional aspects with LINQ, Reactive extensions, and a ton of other stuff you learned, all in a single project, if those things help you to write better code.
You don't start writing code. You spend 80 to 90% of your time gathering requirements, creating the architecture of your application, writing unit tests, writing documentation, etc., and only 10 to 20% of your time writing actual code.
You care about security. You know the legal issues which may arise with the data manipulated by your applications. You know what is ITIL. You know some ISO standards and you apply them daily in your work.


Yes, you gain experience and skills, and it becomes easier to solve a given problem with all the knowledge and intellectual abilities you gained. But problems you must solve grow too, and you're just not excited at solving the problems of the level of those I've solved when you started programming.

While gaining skills, you also gain an insight on the complexity of the software development, learn the aspects you couldn't even imagine when started to learn programming, and you want and need to apply all the stuff you learn daily.

In short:


The first day you start to learn to program, the task of listing all numbers from 1 to 100 divisible by two is very complex: you just learned how to make loops and display numbers on the screen, but you have no idea how to find if the number is divisible by two.
Ten years later, the same exercise appears to be extremely simple. But also, ten years later, you're writing applications which must use transactions, are hosted on several servers and must handle session state properly between servers, and is storing bank account details of your customers, with all the resulting security and legal aspects.
... And you are wondering yourself "How could I possibly do that?" in the exact same way you did ten years ago when you had to display numbers to a screen with a loop.


When everything becomes easy to you in a domain, it means that either you achieved perfection in this domain, or you just don't care any longer.

Achieving perfection in a domain as vast as software development is impossible, no matter how smart you are.
