Coming back to this a
long time later, I'd like to pick up the very first post made to this thread by Schol-R-Lea, and add a completely different take -- partially because I had been involved in some novice-level teaching recently and had done some research in preparation for that. Also because the field of available languages (and the available versions of preexisting ones) has changed since 2003.
In 2003, Schol-R-Lea wrote:
If I were to suggest a specific curriculum, it would be:
- Start off learning HTML markup [...]
- Learn a language that can be run interactively [...]
- Go on to a simple compiled language [...]
- Learn some assembly language [...]
- Learn the basics of Perl scripting [...]
- Now dive into C, and learn it in depth [...]
- Go back and learn more Perl, or another scripting language like VBA [...]
- Last, tackle either C++ or Java, depending on what you mean to be doing with it. You can always go back and learn the other; you should by now have enough language experience under your belt that even a massive language like C++ should be easy to learn enough to work in.
This is a "bottom up" approach. It takes you for a
really long trip of either old or dumbed-down languages before you arrive at a point where you can
do things comfortably. I would advise
against learning old / low-level stuff first, because there are a lot of things you have to learn and do in those environments that are simply no longer necessary in today's environments. What makes learning them positively harmful is that you usually
still can do it that way in modern languages as well; you are just making things needlessly hard for yourself, and will have to
unlearn a lot of the things you had to struggle through.
My recommendation today would be:
*
Get a Bash command line environment -- Linux and MacOS come with it included, for Windows I still recommend
Cygwin (or it's GUI-packaged derivative,
MobaXTerm) over "leaner" solutions.
*
Learn to walk. Understand what a shell script is, and an executable. Understand was a return code is, and how a script can use another script's or executable's return code to decide how to proceed. Learn what a loop is, and what standard input / standard output are for.
*
Pick an editor you're comfortable with -- good ones are Notepad++, UltraEdit, or Vim (the latter being my personal choice -- steep learning curve, but oh-so-rewarding once you're "in the zone"; and literally available everywhere). The editor is
the tool of your trade. Do not skimp. Read the docs. Learn the advanced features (regular expressions and macros, especially). Practice. Do not "make do". (I will advice against IDEs further down -- editor knowledge is portable, most IDEs aren't.)
*
Pick either Java or C++, right from the beginning. My tip for those that actually get to osdev.org for their "novice advice" would be C++, because it
does allow you to go down all the way right to the metal
if you want to. Java has strengths at the other end, with large-scale web-driven applications, and is also the language of choice for mobile app development... but you can switch from C++ to Java
easily, while the other way around is fraught with problems.
*
Do not learn C first; learn the state of the art top-down. (Yes,
do watch that video, even if you only understand a fraction of it -- it gives you an idea of what to look for in study materials.)[1] Don't worry about how things work "under the hood"; instead, get some nice quick results using all the nice things the standard library gives you. Use vectors, maps, range-for's, smart pointers and lambdas. Not a bit of what you will learn there will ever go to waste. Once you are
comfortable there, start digging down at whatever pace suits you -- nobody
needs arrays, zero-terminated strings, and naked owning pointers these days -- not as a novice.
I
do second the point about "do not use an IDE", though. These things hide too many things from you for questionable gain, and bring a whole bunch of "what's
this button doing" problems that tie in your learning experience with a specific IDE instead of making you comfortable with the language
per se.
*
Write a Makefile.
*
Get things under version control. The craze today is Git, but even after all these years I still feel it is oversized and overcomplicated for anything that does not involve quite a large number of concurrent developers; I prefer and recommend
Subversion as it's easier to handle and will give you an understanding of what e.g. branches and tags
are before tossing you into deep water and adding another level of remoteness like Git does.
*
Pick something that interests you, and could conceivably give you short-to-mid-term results. Yes, I recommend
against starting an OS as your first project. That is
a hard truth. Instead of setting yourself up for failure, write a recipe manager, a vocabulary trainer, a calendar, or something along those lines. Yes, done before thousands of times, but you understand the problem domain, you can "get there" on your own, and you can actually
use the result. You also learn handling data structures where you can see and debug them with ease, instead of facing hardware registers and triple-fault reboots.
*
Get crackin'.
You will come to a point where you will want to pick up other things -- Perl, Python, XML, SQL, whatever. But you
need none of those to get from A to B, they are just making things easier -- and none of them will serve as a go-to foundation. Pick them up as and when necessary.
----
[1]: Two of the many really good lines from that vid:
"'One of the great things about C++ is that it is the language for smart people; and one of the bad things about C++ is that it is the language for smart people.' Why is there this barrier to entry that says you have to be super super smart? Believe it or not, a lot of that comes from what we put people through in the first two days of their five-day Intro to C++ course, and a lot of that isn't even C++."
-- Kate Gregory
"I am not trying to make library writers. I am trying to make library
users. It is alright, if you are going to be inducted into the tribe of library writers, for someone to pull back a curtain and show you
a lot of stuff, a lot of punctuation -- "...", says
Andrei, is where the fun begins -- that is OK for the people that are going into that tribe."
-- Kate Gregory