% $Header: course-spec.tex,v 1.2 91/08/21 13:45:29 leavens Exp $
\documentstyle[11pt]{article}
\nofiles
\input{use-full-page}

\begin{document}
\noindent
CS/CE 218 --- Unix and C Programming
\hfill \today \\

\begin{center}
{\huge Course Specification}
\end{center}
\section{Prerequisites}

The formal prerequisite in the Iowa State catalog
is successful completion of CS 212 or equivalent programming experience.
Please see the professor if you have not taken CS 212.

CS 212 is an introduction to data structures and algorithm analysis.
The skills taught in CS 212 relevant to CS 218 include the ability to:
\begin{itemize}
\item
write small programs without detailed directions,

\item
budget time and effort for programming assignments,

\item
design a program before coding,

\item
write Pascal code with good style and documentation,

\item
implement dynamic data structures using pointers,

\item
test and debug small programs.
\end{itemize}

In addition, the following general skills will help you
get an excellent grade in CS/CE 218:
\begin{itemize}
\item
think critically and express reasoned arguments in English,
and

\item
assimilate detail without getting lost in it,
by understanding the motivation and logic behind the detail.
\end{itemize}
However, the course will also try to develop and extend these skills.
(Do not let the first general skill discourage you if you are not a native
speaker of English or have gotten a poor grade in an English class.
I have observed little, if any, correlation between such factors and grades
in my classes.)

\section{Brief Description}

The catalog description of the course is as follows:
\begin{quotation}
Introduction to the C programming language and the UNIX operating system[,]
and their effective use for problem solving.
Topics in UNIX include the establishment of user environments,
creation and management of files and directories,
common UNIX commands, programming in [the] UNIX shell language,
and electronic mail.
Topics in C include basic programming constructs,
use of standard program libraries,
multiple and parallel process control, and interprocess communication.
(3 credits).
\end{quotation}

The focus in the course will be on
``effective use'' of Unix and C ``for problem solving.''
Problems are best solved by working at an appropriately high level;
that is by abstracting away the details of the solution
so that the big picture becomes clear.
This kind of {\em abstraction\/} will be the theme of the course.
Unix illustrates this theme by providing a programming environment
where one can build tools (e.g., in C)
and combine them to solve large problems abstractly.

As indicated by the catalog description, along the way
you will learn about various parts and details of Unix (System V) and (ANSI) C.
But if you try to learn the details without the big picture,
you will be hopelessly lost by the end of the semester.

\section{Objectives}

% Performance

At the end of this course you will be able to:
\begin{itemize}
\item
effectively use Unix and C to write, test, debug, and maintain modest-sized
programs,

\item
apply the concept of abstraction by combining several smaller programs
into a larger program,

\item
design, build, and use software tools that fit well into Unix,
writing such tools both in the Bourne Shell and in C,
using Unix arguments and standard input and output facilities,

\item
design modest-sized program using independent modules (abstract data types),
that offer some potential for reuse,

\item
clearly explain the principles behind Unix concepts such as
the file system structure,
pipelines, file permissions, and environments,

\item
clearly explain the principles behind C programming concepts such as
structures, static vs. automatic declarations, arrays, macros,
and include files,

\item
use standard C libraries
(including the standard C library, stdio, and ctype)
and their associated header files effectively in writing programs.
\end{itemize}
% Conditions
In all cases, you will be able to use reference material and notes
about specific details of Unix and C including the course texts and your notes.
You will {\em not\/} be expected to implement an operating system,
to write truly large programs,
to analyze the space/time efficiency of the Unix operating system,
to understand details of the Unix kernel's implementation,
to formally specify programs, or to formally verify programs.

% Justification
You must learn to {\em use\/} Unix and to {\em program\/} in C
primarily by experience; trying to learn to use Unix and program in C
by just reading about them is like trying to learn how to play piano
by just reading a book.
So the main objective for the course is not, primarily, to teach the
details of Unix and C: it is to show you one way that these tools
can be used to achieve worthy goals;
hence the first objective.
The way that both Unix and C (as well as most programming languages)
are used most effectively is by building larger programs from smaller
pieces; hence the next two objectives.

The reason for learning to program with abstract data types is that
it is a very fruitful way to organize programs;
use of abstract data types makes programs clearer, and easier to maintain.

The reason for learning the principles that underly the details
of the course is mentioned above.

\end{document}



