views:

373

answers:

12

I have started a new question (see here), because I think the topic is of importance in a more general form.

The question is now: If you were a professor at a Computer Science Dept. in some university, what would make it into your course? This is a programming course, second term, first year computer science/computer engineering. Remember you have a limited amount of time, and students are of different levels of competence, and some may be scientists, but some will also go on to be programmers in companies of different kinds. You have to cater to all.

Bonus: What language? (Although see this question for my current thoughts about this...)

Maybe you want to attach a course outline from some university?

See here for an even more general question about this.

Answer: I can't really summarize this post... I guess it was too subjective. However, it looks like we have to cover the history of computing up to a certain extent, computer architecture (memory, registers, whatever), C, and finally some basic algos and data structures in a problem solving fashion. This will be the bare bones of the course. Thanks all. I will accept the most voted up answer to close the thread, as it should be done.

A: 

I suggest you have a look at the "programmer ignorance" question. I'm not saying that all of those should be answered in a "fundamentals" course, but at least some of them should.

Jon Skeet
You can't teach them how not to program when they don't even know what does it mean to program. Teach them everything first, and *then* teach them how not to program.
hasen j
I wasn't suggesting teaching them how not to program. That question isn't about how not to program - it's about what developers often *don't* know but *should*. For example, when learning C# you should know about pass-by-ref vs pass-by-value, understanding what passing a reference by value means.
Jon Skeet
+5  A: 

I'll take an odd approach and spill way over a single term.

The history of technology

The physics of microcomputer devices

The C Programming Language (straight out of K&R)

and finally

The Basics of Problem Solving

The second year would be devoted to data structures, networking and threads, all in C. Third year the tough stuff, discrete mathematics, algorithms, and advanced logic.

John Fricker
Phew. That is intense.
Dervin Thunk
BobbyShaftoe
Are you intending to produce programmers? Or *great* programmers? :)
John Fricker
I took the physics class (400 level) in my junior year and really wish I had had first. But then ASM was my first language so I really like to go deep.
John Fricker
I like this list, but I wouldn't spend more than one or two class periods on the first 2 items. That's nice background info, but if this is a programming class you need to get to the programming petty quickly. A later class should get into digital logic and machine architecture in detail.
Clayton
One thing that really made me a good programmer was understanding what was really going on - atoms and electrons on up.The history of technology would be impossible to cover in a couple periods. Where does it even begin? With Gordon Moore? Or with the abacus? Or clay tablets? Seriously :)
John Fricker
A: 

Good practices. It is imperative that people first learning to program know about what is easily read by other programmers, and what makes good code.

Strozykowski
+2  A: 

What language?

Definitely more than one language. You need at least some exposure to an OO-language, a functional language, and assembly.

Also, universities tend to not use "real-world" languages like Java or C#, but more "acadamic" languages like Eiffel, Haskell or obscure languages developed in-house. I kind of like that approach, since it should be more about understanding the principles than learning a particular syntax. After that you should be able to pick up the workplace language quickly by yourself.

Thilo
No, that's wrong about the Eiffel stuff. What university curriculums are you talking about? Many people complain that Universities use too much Java, which is not quite true either. The undergrad courses are not the same as the more advanced courses and graduate research.
BobbyShaftoe
A: 

In a blatant attempt to get kudos from Joel I'd have to say 'C' should be covered off as a language, it truly does force the programmer to focus on the fundamentals and gain awareness of memory management etc.

Also Excel VBScript. ;-)

I would also encourage developing awareness of the full SDLC. When handing out assignments get Func Specs, Tech Specs, encourage the use of Version Control software and awareness of build & deploy issues. Its one of the big learning cureves for developers coming into a corporate environment that simply "writing code" and "developing software" are two different things.

MadMurf
I would go lower... machine architecture courses heavy in assembler will teach you the fundamentals. Learning C is easy after that.
Cybis
A: 

I found at most univerisities that the first year, first semester course tends to lump in all majors and is often very watered down as a result. If that is the case at your hypothetical univeristy then this is really the first real CS course the CS/CompE majors have taken.

I think a first real CS course should focus on basic data structures and algorithms. This is the heart of computer science so you should get at it from the start.

I think it's best to start out with a very simple and hard to break language for starters. Let the students focus on the basic algorithms before you introduce them to the horrors of resource and memory management. A functional language would be best here. I know a lot of Universities are on the Scheme / Lisp band wagon. Seems like a good fit.

JaredPar
A: 

See http://homepage.mac.com/s_lott/books/python/htmlchunks/index.html

Generally, the approach is a series of exercises starting with simple expressions and output, and moving through the core language features.

Then the various built-in data structures.

Then -- after you've worked with a wide variety off classes -- class design.

Then a few modules in the library.

S.Lott
+2  A: 

Actually, I think this problem has been solved by SICP and similar curricula.

BobbyShaftoe
I actually don't think so. MIT dropped SICP (on the authors suggestion). SICP is a great book, but not a book for beginners.
Dervin Thunk
Well, I think you're wrong for two reasons. Note, I said "similar curricula" and the question isn't necessarily for total beginners. The discussion is about a course on "fundamentals of programming" not "Write Java 101." Thanks though.
BobbyShaftoe
+2  A: 

I agree that C should be the first language, assuming the student is on track for a CS major. Someone who is only going to take a few programming classes as part of another major could safely go with less technically demanding languages like VB. Learning C doesn't seem to make much sense unless you're going to have things like OS or Network Programming and Compilers later.

Even starting with C, a first programming course should concentrate on the basics like data types, functions, parameter passing, flow-control structures, and possibly arrays and structs.

Pointers used for anything besides a way to do "pass by reference" should wait for a 2nd class, as should algorithms more complicated than array searching/sorting. That way students can concentrate on designing good code and esp. learning their way around editors and debuggers.

OO languages etc. can come later too. There's no sense diving into that stuff right away.

I guess part of this will depend on the talent level of the students though. First year students at MIT or Stanford are typically going to be able to handle a lot more than those at 2nd tier state colleges.

Clayton
A: 

I would add two non-development areas.

Some basics on LAN/WAN/ISP stuff - Microsoft used to have a great course called Network Essentials and Cisco recently broke their CCNA curriculum into two courses - Interconnecting Network Devices - the basics of TCPIP, subnetting, how TCP or UDP traffic works, how DNS works, FQDN vs. NetBios, basics of a firewall, etc.

I would also strongly encourage basic system theory stuff - the four core components of any hardware - CPU, Memory, Disk (throughput, capacity speeds) and Network, layer in some basics on directory services (LDAP, Active Directory), email server basics (SMTP) and sprinkle on some virtualization basics - hypervisor, system partitioning, etc.

It's not important given the shortness of the course and that its introductory but I think the programming takes on different contexts/scale if its a program written for corporate use vs. a internet based application or if its a standalone package.

Rob Bergin
Not for a class on the fundamentals of programming. In CS, there are a lot of classes one should take and ideas to know but this is too much to put in such a course. This is all handled in a typical Data Communications course.
BobbyShaftoe
A: 

I'd get them developing straight away on something very easy and high level. Only after they have tangible base to work from would I begin with the theory.

IMO people learn best from actually doing things and making their own mistakes. I think it's best to treat programming as a craft; a mix of methodology and exploration.

A: 

First year:

Design patterns, best practices, unit testing

Second year:

Functional programming, functional programming and functional programmind

Third year:

How to turn on the PC (I'm serious here), object oriented programming, design patterns and best practices

Fourth year:

First console application

stormianrootsolver
lol thanks for the minus - vote. :-D
stormianrootsolver