views:

400

answers:

9

I will be teaching a course on the fundamentals of programming next Fall, first year computer science course. What are the pros and cons of teaching pointers in such a course? (My position: they should be taught).

Edit: My problem with the "cater your audience" argument is that in the first couple of years in University, we (profs) do not know if students would like to be scientists or not... we wish we knew, but we have to strike a balance between those who will remain in school (4 years does not a scientist make), and those who will be engineers.

Final decision: At least references, but possibly pointers without pointer arithmetic.

+12  A: 

At the very least you should teach references or some equivalent concept. I think you should probably take it easy on things like pointer arithmetic, c arrays and strings, but indirection is a very important concept in computer science, and students should be introduced to it.

Brad
Yes, I think this is the key-- focus on "references" rather than "pointers" strictly speaking. By the way, allow longer than you'd think to explain the concept of references!
Neil Coffey
+1 For teaching indirection early. This is a very important concept to grasp and I know that it took me at least one and a half courses in C before I reached "pointer nirvana."
Andrew Keeton
+1  A: 

I think that a "fundamentals of programming" course should at least touch on basic processor architecture and assembly language, and if it does, you can't really make a case for not discussing pointers. If you only teach higher-level (byte-code) languages, then I guess pointers would confuse the audience.

cdonner
+6  A: 

Yes.

Pointers underpin a huge number of concepts in other, higher level languages, and I'm firmly of the opinion that you need to teach a certain amount of the lower-level stuff to facilitate a good understanding of why we bother with anything higher level at all.

Once you understand a bit about how memory is allocated, and how it's addressed and manipulated with pointers, explaining a lot of other constructs gets easier. For example, explaining a NullPointerException in Java, or even the concept of references in such languages is child's play if you've got someone who understands pointers in C (and better still, if they also grok references in C++).

Rob
+2  A: 

Absolutely teach them. Understanding indirection is essential for programming, whether it's with pointers, references, dynamic binding, or any number of other things. Now obviously don't start off with them, but understanding indirection is at least as important as understanding control flow ideas.

The con of course is that some people just won't get it and will do poorly or drop out. If this is a course for people who want to be CS majors then don't sweat it because you're just giving them incentive to switch majors earlier rather than later. If it's more or a general ed course for people who are kind of interested in programming, then they should probably still be introduced, but not graded harshly or heavily.

Tyler McHenry
+1 purely for the comment about drop-outs alone. Too many institutions (at least over here in the UK) seem to be so worried about the "poor students" not being able to understand this stuff that they dilute CS into something horrible and unrecognisable.
Rob
When I TA'ed intro CS I felt sorry for the students who tried so hard and came to office hours every week and still never really got it. But I never went easy on evaluating them because finding out that you're not ever really going to get CS is worse when you've already put in two or three years.
Tyler McHenry
+2  A: 

During my first year as a CS student, I took a Java course in fall which was the general intro. The professor didn't teach pointers directly, but he did teach the concept of references, and why you can modify objects and not when primitives when either is passed in an argument.

During my 2nd semester, I took the next course in the series, which was about C, and this class heavily relied on pointers.

For an intro to programming class, I'd say just mention references, but not pointers directly.

samoz
A: 

I think you shouldn't teach it first. But later, once basic concepts of programming are acquired.

A good example is the last Stroustrup book : Programming -- Principles and Practice Using C++ where he teach how to make a parser, I/O (streams) usage and GUI usage before even talking about pointers!

I think it will be a good reference for teaching because it is more natural to understand the way we build ideas instead of how much constraints (memory management for example) we have to handle at the same time to make a software work. I really recommand you this book to have a fresh perspective about teaching fundamentals of programming.

Klaim
+1  A: 

Pros: solid understanding of the way that memory is used by the machine, the difference between (and pitfalls of) pointers to data on the heap vs. pointers to data on the stack, passing methods by address, etc.

Cons: complex for an audience who is not yet knowledgeable (or has not had enough time to assimilate the concepts) of computer architecture, including what is stack, what are registers, calling conventions, etc.

So, to summarize, it depends a lot on your audience and on the language(s) you'll tackle (pointers will be meaningless in the context of LISP or Java), as well as on how deep you are willing to go in the direction of what is heap, what is stack, how scope is translated into stack (i.e. why never to return a pointer to a local variable), etc.

When I taught pointers to an engineering class I ultimately fired up a debugger on a simple "hello world" program, and showed the students the actual machine code, register values and corresponding memory dumps, with the stack manipulation and parameter passing, etc., but they were ready for it. Would your audience be receptive to such a drill-down expedition, to ensure solid understanding of what's going on behind the scenes, and would you be willing to go to such lengths? :)

Cheers, V.

vladr
+1 - students should study basic architecture before being introduced to pointers. If they haven't had that, then indirection/references is about as far down as I'd go.
Sarah Mei
A: 

It really depends on the goal of your course - teaching programming and teaching computer science are two separate goals, and though they are not mutually exclusive, introductory classes generally do not teach both equally well. Here's an example of the difference: say we want to learn how to sort a list. A programming course in C++ would teach you to use the syntax of a std::sort function template, and homework might be writing several comparison functors. A computer science course would explain to you what a merge sort is, what the algorithm looks like in pseudo-code, and its performance/space characteristics, and homework would be writing the sort function itself.

So if you are teaching introductory programming, then yes, you should teach your students about pointers.

If you are teaching computer science, then no, there is no need to understand pointers at an introductory level.

Not Sure
A: 

Anybody who calls themselves a good programmer must know how pointers work; being a good programmer implies that they do not know only a single programming language, but that they know how programming languages work in general, allowing them to adapt to programming languages they haven't seen before.

This doesn't mean that a fundamentals of programming course should be teaching pointers, however.

  • If your goal is to give these people a complete, well rounded familiarity with programming languages in general, then yes pointers shall be part of that.
  • If your way of introducing them to programming is to use one programming language at first, with the intention of covering other languages in subsequent courses, and pointers are not relevant to that language, then there's no need to talk about pointers yet.

I think there's a lot to be said by starting people out in one language only, rather than trying to cover every style of language at once.

My first introductory programming course used Haskell. It wasn't until a subsequent course using C that pointers were introduced (I was already a good C and C++ programmer when I took the course; those subjects were mandatory).

thomasrutter