3 ms·
The 15 week expectation is aggressive, perhaps too aggressive, but not entirely absurd. The problem is the follow-up to the introduction, not the introduction
by Goladus 15y ago
The 15 week expectation is aggressive, perhaps too aggressive, but not entirely absurd. The problem is the follow-up to the introduction, not the introduction itself.
CS 2 should not be dealing with inheritance, polymorphism, or object-oriented design. These subjects are advanced not because they are difficult, but because they are useful abstractions that help solve large-scale organizational problems that students have never faced. They are important aspects of programming discipline but are useless if you don't understand the underlying tools to begin with.
Instead of trying to teach design and high-level abstractions in CS 2, the focus should be on how systems actually work. You should be removing layers of abstraction rather than adding them. Programmers make computers work using compilers(and interpreters), operating systems, and networks. So begin teaching students the fundamental knowledge needed to use those tools effectively.
Students need to understand syntax. Teach regular expressions and context-free grammars. There is no need to go as deep as theory of computation or languages or compiler design, but students should be able to recognize how a language's specification matches their own code, so they can correct errors from principle rather than by trial-and-error.)
Students need to understand how to use libraries. They should understand how they can obtain and use new ones in their own code.
Students need to understand how to use the interpreters and compilers that translate their programs into machine code. They should know how to build and configure several different development environments given a standard windows, linux, or mac box.
Students should know the basics of memory and IO. There doesn't need to be a dogmatic focus on optimizing for performance (there will be plenty of that later I am sure), but the constraints need to be as clear as possible.
Consider teaching OSI layers or the HTTP protocol rather than inheritance.
Data structures and basic functional abstractions are important fundamentals, too. If they aren't covered in CS 1, it makes sense to prioritize them in CS 2.
A programmer who doesn't know object-oriented design and polymorphism might write ugly code. A programmer who doesn't understand his target environment is going to write broken code. A programmer who doesn't know how to use his compiler isn't going to write any code. If the goal is preparing a student to be an effective computer scientist, the first step is imparting fundamental tools of the trade.
- scott_s 15y agoI agree with your point that making inheritance, polymorphism and OO design the focus of the second course is not a good idea. But I think you're still trying to put too many disparate concepts into it. My first programming course took us from assignment 0 where we copy-and-pasted code to make sure we could use the compiler to a 450 line program that required us to answer queries on a simple data-set that was a directory of people. My second course was focused around an extension of the previous semester's project. The data-set became more complicated, we added a GUI, and we had to be able to write intermediate results out to a file, and read them back in. We were introduced to pointers and dynamic memory, and we got our first taste of data structures by implementing a linked list and having to sort it. The final program was 4,000 lines. Near the end, we were introduced to the basics of OO design - no inheritance or polymorphism, but we were supposed to take our data structures and associated functions and organize them into classes. In that way, we were able to see that some OO programming was just a more organized way of doing what we were already doing. The emphasis of the second course was introducing us to data structures, basic algorithmic analysis, and making us program a lot. Not just in time, but also having a large program. Full OO came in the third course.
- Goladus 15y agoI agree with your point that making inheritance, polymorphism and OO design the focus of the second course is not a good idea. But I think you're still trying to put too many disparate concepts into it. That's very probable. I'm in the middle of organizing my thoughts on this, based on my memories of introductory CS 14 years ago and what I've learned since then. By far the biggest difficulty I had with my CS program was that they left it up to me to learn any "real" language on my own. The only language covered during the first two semesters was Pascal. C was never covered, except as an optional one credit class (which was combined with Unix and shell scripting). Assembly was covered, and if you took theory of languages you learned lisp. That was it. All the painful idiosyncrasies of C and Java, rather than bogging me down in my first year, bogged me down when I was supposed to be writing operating systems and learning algorithms. Despite having a solid understanding of all the concepts: loops, recursion, lists, queues, functions, etc, having been using them since high school, I had a ton of trouble just getting them to work in C or Java (This was Java as it was in 1999 or so). I remember submitting assignments in Java that used one single gigantic method in a single class because I got sick of spending time trying to figure out why the abstractions I was trying to create weren't working like I expected. I knew the object oriented concepts and aced all the tests, but had trouble when it came to actually writing code in anything but Pascal or BASIC. (or Matlab, actually, but that wasn't part of CSci)