Foundation (Freshman) Courses CSCI 235. Programming I: Problem-Solving. This course is our basic first course in programming. While we emphasize that computer science is a whole lot more than programming, programming is certainly a prerequisite skill to do anything interesting. The main goal of this course is the improve the problem-solving skills of the students. Second, students learn to express solutions to problems in a programming language (in our case, Java). We also begin learning the fundamentals of object-oriented programming: encapsulating data and functionality together into classes, writing classes that implement the same interface, and making use of subtype polymorphism in program design. CSCI 243. Discrete Mathematics and Functional Programming. This course's slogan is "Computer science majors should learn to write proofs and math majors should learn to write programs together." It intertwines two otherwise distinct streams of topics: On the one hand, it covers the discrete mathematics needed in CS courses later in the curriculum: logic, proof, sets, relations, functions, and graphs. On the other, it teaches programming in a language called ML that differs from conventional languages in that it views a program as a collection of interacting functions rather than a sequence of instructions. The goal of this course is to teach logical, categorical, and recursive reasoning (perfect for any liberal arts major); the vehicle for this is a set of topics on the boundary of mathematics and computer science. CSCI 245. Programming II: Object-Oriented Design. This course, a continuation of CSCI 235, is pivotal in the curriculum. Although a rogramming course, it teaches programming in a way that points ahead to future courses. It has four purposes: a "postrequisite" for CSCI 235, finishing the basic object-oriented programming features with subclassing, inheritance, and class hierarchies; a prerequisite for CSCI 345, introducing data abstraction, basic data structures, and algorithm analysis; a prerequisite for CSCI 335, teaching software development practices and design patterns; and a prerequisite for CSCI 351, exposing students to computer organization, data representation, and programming in the C language. Core (Sophomore/Junior) Courses CSCI 335. Software Development. This course explores the practical and professional issues of developing large software systems. This includes honing programming skills, but also learning good teamwork and communication. This course also gives exposure to various topics not otherwise covered in the core courses; these may include databases, GUI and event-driven programming, programming language concepts, formal languages and regular expressions, distributed computing, web programming, and scripting languages. CSCI 345. Data Structures and Algorithms. Consider the college library with its wealth of information. Now suppose you removed all card catalogs--physical or electronic--and had an all-school party that arranged the books in the shelves based on the number of pages in the book. The value of the library information in terms of its intrinsic information is not changed by this rearrangement; however, the accessibility of the information has changed significantly. Doing research on the Civil War or any other subject would be practically impossible. The value of the college library would have decreased because the accessibility component had decreased. The study of data structures and algorithms is focused on how information can be organized in a computer system and how various algorithms compare in reading or writing this information. This course involves studying data structures, implementing data structures, and analyzing algorithms which manipulate data structures. CSCI 351. Introduction to Computer Systems. An introduction to low-level systems issues from the perspective of the programmer. Representation of both data and program as produced by a compiler; hardware support for memory, input/output, and parallelism; fundamental ideas in operating systems and networking. Elective (Junior/Senior) Courses CSCI 361. Computer Graphics. Computer Graphics and interactive Graphics are a now primary way computers are used communicate information to people. In olden times information was communicated with printed numbers, punched cards, paper tape and even blinking lights. A picture is worth a thousand words (or bytes). In this course we we take a walk through some classic approaches to graphics - character graphics and line graphics and move into more modern approaches including OpenGL. Finally we cover some high level 3d rendering systems like electro or ogre. CSCI 365. Programming Language Concepts. This course studies programming languages in two ways. The first is formal: What semantic models can we formulate which capture the meaning of a programming language and prove properties of programs? The second is practical: How can we implement compilers and other language systems to analyze, translate, and interpret programs? Thus this course is both a theory course and a systems course. In it we both prove theorems and build language systems. CSCI 371. Database Management Systems. The amount of information in our world is growing at an exponential rate. The vast majority of this information is electronic in nature, but without systems to manage this information it not possible to realize the potential value of this information. Database management systems provide ways to manage and extract useful information from these data sets. This course covers: How database systems are organized (Foundations) How one can interface with database systems as a programmer (Application) Algorithms and data structures to implement database systems (Systems) Future directions of database systems (Advanced) Also covered are modern tools for interfacing web applications to database systems such as Ruby on Rails. CSCI 445. Analysis of Algorithms. After reviewing techniques for proving an algorithm's correctness and analyzing its efficiency, this course explores a catalog of advanced algorithms and algorithmic techniques, data structures, and analysis methods. At the end of the course, we consider the formal issues of computability and tractability of problems, particularly the concept of NP-completeness. CSCI 455. Operating Systems. Dynamic process activation, system structure, abstract machine, kernels, performance evaluation, memory management, processor management, time management, recovery procedures, file systems, security, scheduling, device management, networks. Service Courses CSCI 215. Web Design and Programming. An introduction to the design and preparation of pages and sites for the World Wide Web. Topics include principles of design, markup and formatting of pages, tools for developing web content, and use of embedded scripting on client and/or server. No prior programming experience is required. CSCI 231. Introduction to Computer Science Concepts. A survey of the fundamental ideas and methods in the science underlying computation. Classroom activities and hands-on laboratory investigations emphasize working with both data and process at different levels of abstraction, from logic and circuits to algorithms and formal machines. History of computing and its relation to other disciplines. Societal and ethical issues raised by computing technologies. CSCI 233. Introduction to Scientific Computing. Introduction to programming and computer analysis of data for scientific applications. Scripting and treatment of numerical issues are integrated into the content stream.