Finally, the courseware section of the site is open for business!
The first course is undergraduate data structures. I taught this course twice at Tufts University. Topics include the most important elements of the old ACM 2001 “CS2” curriculum along with a basic introduction to software engineering. The course is compatible with the “new” ACM 2013 curriculum which distributes computer science topics across one or more courses. Most of the hours are devoted to data structures with software engineering and algorithms/complexity playing secondary roles.
The main web page provides a rationale for the course design. It lays out the syllabus for a one semester course (15 to 16 weeks). The syllabus links to a full set of lecture notes. These notes should be a gold-mine for any instructor — high school or college — who needs to develop and deliver a course on data structures. I tried to meld and blend the best information I could find on each topic, usually from multiple textbooks. Of course, if you are a student, please dive in and browse, too!
The main course page also has links to the projects. I drew inspiration from my background as a system programmer, so the projects are not your usual “search tree this, search tree that.” The projects include lexical analysis, expression evaluation and discrete event simulation among other subjects. For the more advanced projects, I provided a source code framework/infrastructure to the students to help get them started. They were required to design to an interface specification and then integrate their implementation into the framework. This approach allowed my students to attack larger problems with more substance and purpose.
The course uses C++. Quite often, however, the code examples were translated from Java. So, it shouldn’t be too hard to translate back to Java. The examples do not use STL, Boost or templates that would hinder translation to Java or reuse.
Please take a look! For your convenience, here are links to a sampling of topics: stacks,
linked lists, trees, debugging, algebraic datatypes (ADT) and testing.
I will be rolling out additional courses during the month of August. These courses will be hardware-oriented: computer design, VLSI systems and computer architecture. If you ever prep’ed a course, you know how time consuming it can be to simply organize course material. Blog posts will be a little less frequent until I complete the courseware section.
And shout that word like Thomas Dolby!
I’m in the process of transitioning the site to its new domain name, sandsoftwaresound.net. So, here’s just a few philosophical thoughts in the meantime.
I’ve been reading “Weird Life” by David Toomey. His book is very well written — one of the best bits of science writing that I’ve read. He teaches nonfiction writing at UMass and deserves a tip o’ the hat for bringing this aspect of biology to a mass audience.
In one paragraph, he summarizes the essential elements of an experimental science. A science is a body of theory which is testable and verifiable through experimentation. Robust theory allows us to make predictions and to design new experiments. BTW, if the theory is valid, then experiments should be reproducible, too.
I like program profiling and performance analysis as a field because it is one of the few areas in computer science that exemplify experimental science. Performance events and counters give us the means to observe and measure the behavior of our programs in interesting ways.
I especially love it when I can predict an outcome such as the number of operations performed by a program. On the flip side, I especially hate it when I cannot make predictions. This is the main reason that I dislike performance events with ill-defined behavior or hardware that doesn’t provide a stable time reference. This situation is like giving an astronomer a rusty telescope with a crummy warped lens. How can an experimental scientist make observations and take measurements with a broken instrument?
These limitations aside, I would still encourage teachers and students to study performance measurement and analysis. These activities are a fun and different way to think about programs and the underlying computational engines. If enough of us band together, we even may be able to convince computer manufacturers about the need for well-defined, reliable performance monitoring and measurement!
If you’re looking for another good read, please consider Lance Fortnow’s “The Golden Ticket.” It’s an introduction to the P-NP problem and is also geared toward a broad audience. If a high school student (or anyone else!) thinks that computer science is “just programming,” please point them toward this book.