I did some thinking about what I thought would be an ideal track for someone looking at getting started with programming and who is interested in becoming a software engineer/developer eventually.
Keep in mind, this is just opinion, and it is based on my bachelors degree work in CS as well as my personal experience before that and after, as well as in a work environment.
First, an introduction to what programming is and how computers process information. C (or alternatively C++) is a good language to start in. I started years and years ago in Pascal, but any basic language that supports procedural programming is best. It is good, I think, at the beginning to understand the concept of functions moreso than objects. This is where most people learn all the pitfalls of passing data back and forth between one place or another in a program, which is an important concept.
Second, I think OO-programming concepts should be introduced, and worked with at a basic level to develop familiarity. I do not think that new programmers should be advised to use OO type structures heavily early on. Experience with good OO design is neccesary to prevent slow, sloppy code, and OO is simply not neccesary or useful for most small-scale projects. I think it should be introduced for familiarity at this point only.
Next, I think that basic universal algorithms for computing should be introduced. Programmers need to learn to sort, they need to learn to search, and they need to learn other useful basic algorithms. This should naturally lead to teaching all the basic data structures. I don't care if you will eventually use VB and never touch a linked list, all programmers should be familiar with the use of linked lists, binary trees, and other types of basic data structures at a minimum. It would be advised to become familiar with more advanced topics at this point, including red-black trees, balanced tree algorithms, multi-leaf (3/4-way trees), doubly linked lists, and other types of data structures that come up.
Around this point, algorithm analysis is important to learn and understand. Students should have a firm grip on higher level math, including a thorough understanding of calculus, which does come into play a lot. Summations and integrals are commonplace in many types of computing and analysis, and a firm understanding of them is neccesary. Furthermore, these topics teach thinking skills. Big-O, litte-O, theta, etc. analysis should be covered here. Common algorithms should be analysed and students should be encouraged to look for ways to complete problems in the smallest "big O" possible, within reason. Here it can be useful to teach other strategies that help with efficiency, including divide-and-conquer strategies which rely heavily on this type of analysis.
At this point, development of larger systems should be emphasized, which lends itself to C++ or Java. A deeper understanding of classes becomes neccesary here, and that should be emphasized. Simultaneously, I believe every potential software designer should be introduced to basic computer architecture. The Von-Neumann architecture should be studied, as well as an introduction to assembly language. Assembler design should be studied to understand how high-level languages can and are optimized. Basics of microprocessor design are also important. I also think that operating system design is important at this stage. An intimate knowledge of the interrupt system, semaphores, resource conflict arbitration, memory paging schemes, process scheduling, and context switching should be sought.
I think beyond this, the theory of computability and discrete mathematics becomes useful. Proof-of-correctness for algorithms, as well as an understanding of what problems are in general undecidable by a computer, which implies an understanding of NP-completeness, etc. Basic number theory should be studied, as well as a solid knowledge of formal grammars and all different types of theoretical automata including turing machines.
A study in programming language design should be required of all programmers, so that they can see the broad variety of what is available out there. From functional (Lisp, Prolog) to imperative (C,C++,Java,C#,Fortran) to historical stuff (COBOL, ALGOL, etc) it is good to see how they are designed and what is good and bad about each of them.
Finally, study of software engineering concepts, use-case modelling, waterfall, iterative, etc. model of development, yada yada is important to learn if one is to work in a corporate environment. Emphasis on exhaustive documentation and standardization is key here.
Beyond this, it depends on what you want to do. I think that all developers should be versed in database theory and design. SQL is probably a good thing to play around with and develop.
These are just some of the ideas I have... but I really think programming is so much more than just picking a language and using it. A good programmer is intimately aware of how the system works at the lowest levels all the way up to the highest. This produces people who are resource conscious, as well as geared towards efficiency. Anybody who has studied computer architecture and seen the difference in assembly codes generated from very similar high-level code segments realizes the importance of this stuff.
I think that if one were to actually study the things above, the choice of programming languages is irrelevant. You should be able to go from COBOL, to FORTRAN, to C, to C#, to Java, to ADA, to almost anything, and pick it up in a day. Learn the theory behind real computing and software design, and it'll always stay with you. Many people who have been in the industry for years will tell you that the only things they studied in university classes that is still relevant to computers is the basic theory stuff.