Computer Science I by Robert Lowe Introduction to the Gopher Course ================================= Welcome to Computer Science I! This is the first in what I hope to be a series of complete computer science courses in gopherspace. Here, you will find a self-contained and complete course of study complete with lectures and assignments. This course is the first course in Computer Science, and as such, I assume no prior knowledge of computers or computer programming. This should provide anyone who wishes to learn with a firm foundation for studying computing. I am presenting this course with the same content and curriculum as I do when I teach this course to my students at several different colleges. Even though the material is the same, this course is not supported by any institution. I am doing this simply to provide a resource to both serious students and those with a casual interest in computer science. Required Materials ================== In order to get the most of the course, you will need a few things. First, you will need a computer running some variant of UNIX. (UNIX, Linux, Mac OS X, or even msys or cygwin will work just fine). You will also need a few freely available pieces of software. These are g++, make, gdb, and some text editor. All of these resources are available on sdf.org, which is where this course is being hosted. You will need an arpa level membership to run all of these tools. For more information on how to acquire a membership, please visit http://sdf.org. You may also wish to acquire a textbook for reference and reading purposes. My hope is that this material will be self-contained enough to be usable without a book, but more material never hurts. There are many C++ texts out there. Bjarrne Stroustrup's book "The C++ Programming Language" is a good reference. I've also had luck using Walter Savitch's "Problem Solving with C++". The First Programming Language ============================== In this section, I will share with you my thoughts on a first programming language. This is primarily for those of you that have some programming experience, and may become upset because of my choices. Even if you have no programming experience, you may enjoy this section, but please do not be discouraged if you don't understand some of these points. You will in time! The programming language used in this course is C++. Many people, myself included, have expressed strong emotions about using C++ as an introductory programming language. Many people favor it, and many people oppose it. I used to fall into the group of people who opposed its use and I lamented the fact that it had supplanted C as the language that is taught in the beginning. However, when I looked at my reasons for this, I discovered that they were not good. Rather, my reasoning was that I prefer to program in C, therefore I should prefer to teach in C. This line of reasoning opened me up to the idea that maybe C++ is a good first language. I thought long and hard about the best starting language, and I decided that I would likely choose C, C++, or LISP. As I started to explore these options, I made a list of strong points for each language. A summary of these are: - C: The language is nice and small, so its syntax is easy to learn. Also, it is a good model of how modern computers work, and it is the most popular programming language in the world. - C++: The language has a C-like syntax, and has high level functionality such as object oriented programming. In spite of its high-level functions, it still performs low level operations like C. It is one the most common languages taught in modern universities. - LISP: A LISP program is a thing of beauty! The syntax and organization of LISP is similar to lambda calculus, and so this is very close to theoretical computer science. Theory of computation would be easily understood by a LISP programmer. So all the languages have strong points to recommend them. Next, I looked I looked at their drawbacks: - C: Practically mandates that a programmer work with low level constructs such as memory pointers. This is great if you know what you are doing, but is downright scary for the novice. Abstraction is harder to achieve for the novice. - C++: For every rule it creates, it creates ways around them. Also, syntax can be misleading. It allows many details to be abstracted which can be good, but can also allow students to ignore low level details. - LISP: Does not reflect the inner structure of most machines. There is no real access to low-level operations. The paradigm is also not as common. The skills gained in lisp may not transfer well to other languages. So there you have it; all programming languages are bad for novices! Seriously though, thinking it through, I decided that I wanted to choose a language which allowed for as much exploration as possible. C++ is a multi-paradigm language, and can do both high level and low level work. Thus, C++ let's us explore the whole of computing. Also, C++ experience is readily transferable into low-level languages like C and also high level languages such as Java. The problems in C++ (the ability to ignore details) can be handled by careful presentation, and that is what I have tried to do with this course. Present C++ in a way that forces you to face up to what is really going on, and not get mired in its very large syntax! Schedule of Postings ==================== I am treating this gopherspace as though it were my classroom. I will be releasing materials here during the Fall 2013 semester with roughly the same schedule that I am presenting them in the classroom. Of course, after this semester is over, the text files will remain. If you find this course after December 2013, all the material will be here. If it's before then, check back every Monday for the current week's material. If you have questions, suggestions, or you just want to chat with an ultra cool computer scientist, you are welcome to contact me. My email is pngwen@sdf.org. I also hang out on sdf.org in com, and on the bboard. I will post to bboard every time I add a new lesson, and we can chat there. Of course, you don't have to be an sdf user to make use of these courses, but that is sort of my home base. I hope you enjoy reading the lectures and working through the labs. See you on the server! Copyright (C) 2013 Robert Lowe This work is distributed under a Creative Commons Attribution-ShareAlike 3.0 Unported License (CC BY-SA 3.0) For more information, see http://creativecommons.org