Many people of which I have dealt with, even if not saying it, are profoundly convinced that some of the applications which they use, maybe on daily basis, cannot be made by them. How many of the readers right now convinced that they can make, say, a web server, a SQL server, an OS, or a C++ compiler ? How many are convinced they can make a web browser!
I know some readers might think I encourage reinventing the wheel, they should know that this is not true. I mean that if a person knows and believes that he can make a wheel, he can then trust his own ability and imagination to start thinking beyond that and make a whole car, and maybe a space shuttle even. I am convinced that people who cannot trust their ability to make such -system- software are tied and will be forever dependent on other companies to make that software for them.
Under such circumstances it becomes natural why people limit their mind to predefined software categories, which have standard development procedures (i.e. web sites, database applications, etc..). In order to innovate you do not only need a vision, but also you need to trust your ability to achieve that vision. Often people disregard good ideas only because -deep inside- they know they can't do it. To hide that from themselves and from others, they tend to belittle the idea or call it foolish or inapplicable etc.
Thinking outside the box is also one feature of innovation. But to be able to do you need to know what's inside the box, and you also must have the liberated(1) thinking to do so. Because we are not surrounded by a lot of liberated minds, innovative minds might be afraid to go outside the box because they will be made fun of and belittled by those unliberalized minds.
(1): by "liberated" I mean those people who trust their selves and their thinking and are not tied by limited thinking of the surrounding environment.
I want to implant a certain concept in the minds of those people of IT in our country. Which is, nothing is impossible, and nothing is so hard that it can't be done. For example, you might think application X is hard to make. This is only built on the fact that you don't know yet how to make or how to approach it. But actually once you know the drill, it is almost like any other application you did (remember your first program, and your last program, and compare if you would have thought that this last one was possible when you did your first).
For example, from what I discovered, that the drill to approach an OS kernel is to make a simple Hardware abstraction layer (HAL) and to base other stuff (memory management, etc.) above it (like a simulation), and to approach the HAL you need to start by reading the Intel System Developer guide -for Intel systems-. The remaining is just regular work, read and apply, no thinking. (notice I said the drill to 'approach' not to 'make').
Also I found the way to start in an RDBMS is to start by making the Table class, and one-by-one add functionality to it (select, project, save, getSchema etc.). Once you've found a start point, the remaining, as I said, is just regular work, like any other program.
I know some people which was saying to me that making an OS and RDBMS is just reinventing the wheel and a waste of time. Well, I just wanted to know the drill, and know how they are done, so I can liberate my thinking and achieve the freedom of thinking and not to be limited by stuff I don't know. How are we going to innovate in such fields without that ?
I am not saying that the reader should go and -reinvent the wheel?- and make his/her own RDBMS or OS, but I am saying that if this what it would take to liberate your mind, then do it. Or take whatever necessary to liberate your mind. If just reading about them is enough for you, then be it. About myself, I had to do them myself, I just don't believe all I read, and I didn't think that the authors are better than me in a way that makes them able to do it while I can't.
All I want to reach in this article, is that don't think in terms of what's there, but think in terms what you can do. For example, don't think "This program doesn't do X :( I'll have to wait for the next release", but think "This program doesn't do X, so I'll make my own X!" or "I want a program that does X, there isn't ? I'll make my own :)" or better yet, "I wish I don't find a program that does X so I can do it!". And if you find such a program, you might take a look at the source to know how it was done.
One by one, you will reach a phase where you don't know the word 'impossible'. For example, imagine a program that you can ask to explain quantum physics for you, and the program scans the internet for it, and -built on your background, which he knows, cuz he chats with you a lot- he builds a tutorial with the style he knows that you prefer, and start explaining in a conversation with you, in which you can interrupt and ask, all in voice, not text. The program also can detect your face and knows when you look like you don't understand. I'll ask you: is that possible ?