Computer Science Department
McGregory Hall, 3rd Floor
13 Oak Drive
Hamilton, NY 13346
Staff: Alexander Nakhimovsky (adnakhimovsky@-xyznospamcolgate.edu)
Applications of computers and software are everywhere. Inside your mobile phone, your car, and quite possibly your toaster software programs enable and mediate instant communication, global financial networks, a smoothly running engine, an interactive graphical display, and a perfectly browned slice of sourdough. Writing software to instruct computers to do even simple tasks can be challenging, fun, and creative. In COSC 101/101L students are introduced to program design, algorithms, and problem solving using the programming language Python. Through lecture, discussion, in-class activities, and programming assignments basic programming concepts and constructs (variables and types, control flow, conditionals, iteration), elementary data structures, input and output, graphics, objects and classes, recursion, and testing and debugging will be covered. A weekly two-hour laboratory provides the opportunity to develop practical programming and design skills. The required credit-bearing laboratory COSC 101L must be taken concurrently with COSC 101. This course, or its equivalent, is a prerequisite to the computer science concentration. The course has no prerequisites and is recommended for students in other disciplines desiring an introduction to programming, algorithms, and problem solving.
Staff: Valerie Cucura (vcucura@-xyznospamcolgate.edu), Elodie Fourquet (efourquet@-xyznospamcolgate.edu), Michael Hay (mhay@-xyznospamcolgate.edu), Matt Lyboult (mlyboult@-xyznospamcolgate.edu), Joel Sommers (jsommers@-xyznospamcolgate.edu), John Stratton (jstratton@-xyznospamcolgate.edu)
This course is a continuation of COSC 101 and is the first course in the concentration. It develops advanced programming topics such as abstract datatypes, algorithms and their analysis, recursion, inheritance, and polymorphism. Abstract data structures introduced include stacks, queues, lists, and binary trees; algorithms include search and sort procedures. The concepts of information hiding, data abstraction, and modular design are emphasized. Object-oriented programming is used throughout the course. Laboratories include the design and implementation of programs that illustrate the topics of the course. Three lectures and a two-hour laboratory each week. The required credit-bearing laboratory COSC 102L must be taken concurrently with COSC 102.
Computer graphics and animations are all around us: on television, in commercials, in movies, in video games. How are these done? This course introduces the fundamentals of computer graphics and animation and the programming concepts needed to develop them. The course includes hands-on work with a graphics and animation system. No programming experience is needed. Not open to students who have taken COSC 102. The course does not count toward the concentration.
Staff: Chris Nevison (chris@-xyznospamcs.colgate.edu)
Computing, broadly interpreted, has radically altered our academic, political, social, artistic, environmental and religious institutions. This course provides an introduction to contemporary concepts, models, and issues in computer science. Topics will be chosen from the nature of computation, algorithms and their applications, data centers and cloud computing, software engineering, logic and system design, programming languages, security, big data and data mining, mobile computing and others. These topics will relate to contemporary experience by examining issues such as privacy, software reliability, information access, politics and social networks, e-commerce, electronic piracy, globalization, hacking, ownership of bits, copyright and patent infringement. Class format includes lecture, class discussion, contributions to a class blog, student projects and presentations. The course does not count toward the major. This course is crosslisted as CORE 142S.
Staff: Philip Mulry (pmulry@-xyznospamcolgate.edu)
This course is a study of the fundamental concepts of computer architecture. Topics include the representation of information; components of the computer and how they interact; microarchitecture and microprogramming; conventional machine and assembly language; and advanced architectures. Several types of computer design are reviewed; a RISC architecture is the subject of detailed study. The laboratory is used to examine how different components of a computer's architecture can affect its performance. Three lectures and a two-hour laboratory each week. The required credit-bearing laboratory COSC 201L must be taken concurrently with COSC 201.
This course teaches symbolic computation in a functional programming environment, while providing a general introduction to programming languages and computer science. The emphasis is on alternative modes of algorithmic expression, program design, data abstraction, and skillful use of recursion. Topics include recursive and higher-order procedures; functional programming in contrast with imperative programming; performance analysis of algorithms; data abstraction and abstract data types (including infinite data types); data-directed and object-oriented programming; constraint propagation; and logic programming. Laboratory assignments build simple versions of well-known AI and simulation programs. Three lectures and a two-hour lab each week. The required credit-bearing laboratory COSC 202L must be taken concurrently with COSC 202.
This course introduces discrete computational structures, methods and concepts utilized throughout computer science. Topics include sets, relations, functions, equivalence and congruence relations, induction and recursion, order relations, partially ordered sets, lattices, Boolean algebras, logic, semi-groups, monoids, morphisms, languages, graphs, trees, and finite state machines. Concrete and abstract data types, circuits, syntactic and semantic program structures provide standard motivating examples and applications. In the required credit-bearing weekly two-hour laboratory, students acquire concrete experience experimenting with and implementing the concepts and structures introduced in the lecture.
A brief historical review of computer operating systems serves as an introduction to a detailed consideration of the machine and language features required to support a complex time-sharing operating system. The ideas and techniques of interrupts, concurrent processing - including deadlock, paging, scheduling, reentrant procedures, and various memory management and protection schemes are studied. In the weekly two-hour laboratory, students will analyze some of the methods discussed in class and acquire experience in systems programming.
The prerequisite course (COSC 201: Computer Organization) is recommended but not required for registration. However, students are strongly encouraged to take COSC 201 before or concurrently with COSC 301.
This course provides a conceptual framework within which both theoretical and concrete analyses of computer algorithms may be developed. Topics to be covered include: number-theoretic algorithms; graph algorithms; problem-solving techniques including divide-and-conquer, greedy algorithms, and dynamic programming; linear programming; and intractability. The required credit-bearing laboratory COSC 302L must be taken concurrently with the lecture.
COSC 290: Discrete Structures is recommended but not required for registration. However, students are strongly encouraged to take COSC 290 before or concurrently with COSC 302.
This course is an introduction to the modern theory of computing. The course introduces students to different models of computation and focuses on the relative strength of each model, and the relationship of one model to another. Concepts introduced include sets and relations, data types, finite automata, regular expressions and languages, context-free grammars, push-down automata, Turing machines and Turing machine schema, diagonalization arguments, Church's Thesis, the Halting Problem, and computational complexity. In the required credit-bearing weekly two-hour laboratory, students acquire concrete experience experimenting with and implementing the concepts and computational strategies introduced in the lecture.
This course surveys the salient features of diverse programming languages and examines the foundations and principles of language design. Topics include formal description of language syntax, ambiguity, storage allocation, parameter linkage, and current issues in language design. The required credit-bearing laboratory COSC 420L must be taken concurrently with COSC 420.
Prerequisites: COSC304 (Theory of Computing)
An exploration of the principles by which high-level programs and their data structures are analyzed and mapped into corresponding low-level implementations and representations. Topics include regular expressions and symbol tables for lexical analysis; attribute grammars and tree manipulations for syntactic/semantic analysis; continuations; unification-based inference of data types; and graph-theoretic algorithms for program optimization. The required credit-bearing laboratory COSC 425L must be taken concurrently with COSC 425.
Prerequisites: COSC304 (Theory of Computing)
This seminar investigates how computers can be made to behave "intelligently." Particular topics include the programming language LISP, natural language processing, computer vision, search techniques, AI databases, story comprehension, medical diagnosis, and problem-solving. The emphasis is on writing small versions of classic AI programs. The required credit-bearing laboratory COSC 430L must be taken concurrently with COSC 430.
Note: For Spring 2014, there is a topics version of this course being offered by Prof. Hay, COSC 480.
This seminar is an introduction to the concepts and techniques of interactive computer graphics. A broad spectrum of subjects including computational geometry, picture generation and display, illumination models, ray tracing, and the design of user interfaces are discussed. A special independent project based on individual study and normally involving a substantial working program is expected of each student. The required credit-bearing laboratory COSC 435L must be taken concurrently with COSC 435.
Prerequisites: COSC302 (Analysis of Algorithms)
This course surveys the tools and techniques for the design and implementation of large systems on computers, both local and distributed. The organizational and communications problems associated with large system design are discussed, as well as methods for overcoming these problems. This course includes a laboratory component in which students work in teams to design part or all of a large system. The required credit-bearing laboratory COSC 440L must be taken concurrently with COSC 440.
Note: Only one of the prerequisite courses is required, i.e., students should have had at least one 300-level course before enrolling in COSC 440.
This course surveys the field of parallel and distributed computing, covering hardware design and architecture, interconnection networks, and parallel algorithms. In addition to the broad survey, students concentrate on the implementation of message-passing parallel computers and algorithms. This aspect of the course includes laboratory work using the parallel computer laboratory. The required credit-bearing laboratory COSC 445L must be taken concurrently with COSC 445.
Prerequisites: COSC301 (Operating Systems)
The COSC 450 course is a seminar that introduces in depth some topic in computer science theory. Past seminars have focused on a wide variety of topics in the theory of computation and the semantics of programming languages. Past topics have included: denotational semantics, type theory, category theory, operational semantics, and advanced functional programming. Throughout the second half of the semester students work in teams on various projects related to the seminar topic, and present their findings at the end of the term. In the required credit-bearing weekly two-hour laboratory, students acquire experience experimenting with and implementing the concepts introduced in the lecture.
This course addresses theoretical, methodological, and practical aspects of creating distributed web applications. It introduces students to meta-languages, such as XML and related technologies, and in the process builds on their theoretical background in formal languages and grammars, parsing, and interpretation. The emphasis is on distributed systems consisting of components interacting over standard interfaces, frequently using XML as a standard format for data interchange and presentation. The course includes a group project. The required credit-bearing laboratory COSC 455L must be taken concurrently with COSC 455.
Prerequisites: COSC302 (Analysis of Algorithms)
This course introduces the fundamental concepts in computer networks. Topics include layered network architecture, error detection and correction, medium access control, routing, congestion control, and internetworking. If time permits, the following advanced topics may also be included: network security, multimedia, multicast, and wireless networking. Students complete weekly laboratory assignments in which they build network applications and implement increasingly complex network protocols in order to gain a deeper understanding of topics covered in class. The required credit-bearing laboratory COSC 465L must be taken concurrently with COSC 465.
Topics vary depending upon needs of students and interests of the instructor. Students interested in this course should consult the instructor. The required credit-bearing laboratory COSC 480L must be taken . The seminar is counted toward completion of the concentration requirement.
Prerequisites: consent of the instructor
This seminar-style topics course examines the application of game theory to the design of algorithms for rational agents, i.e., participants who are neither honest and obedient nor arbitrarily malicious, but instead are driven by self-interest. The course begins with an introduction to game theory and techniques to model rational agents. Students will learn about recent results in a variety of fields, selected from the following list, mostly containing optimization problems in some type of distributed setting: auction design, network formation and network routing, cost sharing, recommendation and peer-to-peer systems, cryptographic game theory, and sponsored search. Specific topics will be chosen based on student background and interest, and background material from relevant areas of computer science, mathematics, and economics will be covered as necessary.
This course studies the theoretical foundations of security and their use in analyzing both individual cryptographic operations and protocols that (claim to) provide security for communication over insecure networks. One part of this course will cover the mathematical underpinnings and properties of the cryptographic building blocks---such as algorithms for encryption (both symmetric and asymmetric/public-key) and digital signatures---that are used in security protocols. Another part of this course will cover the formal analysis of communication protocols built from such operations; this includes the formalization of protocol properties such as secrecy and authentication, the study of attacks on communication protocols, and proofs that certain protocols do provide the properties they claim to. Among other activities, the laboratory component of this course will make use of automated tools (such as ProVerif) to formalize protocols and analyze their security.
This course introduces the principles underlying modern database
systems. These principles guide how information is represented as
structured data, how computations on the data are expressed in query
languages, and how systems are designed to enable efficient
computation on large data sets. Topics include database design, data
models, query languages, query processing and optimization, data
storage and access, and transaction management. If time permits, the
course will move to advanced topics such as data mining and the NoSQL
This course introduces students to Agile software development in the context of
building a software-as-a-service (SaaS) application to deploy in the cloud (the
Internet). We will examine challenges, opportunities, and open problems of SaaS
applications as compared with "shrink-wrapped software". An integral part of
the course will be for students to take a SaaS project from conception through
planning, development, testing, and deployment. The project will be developed
using the Ruby on Rails framework, which is a Ruby programming language-based
platform for developing SaaS applications and websites (for example, Twitter
and Hulu are developed using Ruby on Rails, as are many other high-traffic
sites). Through the course and project, students will use Agile development
methodologies and tools, including user stories, behavior- and test- driven
development, version control for team-based development, and cloud-based
environments for deployment. Moreover, students will learn and apply
fundamental programming constructs and techniques including design patterns for
software architecture, higher-order functions, metaprogramming, and reflection,
to improve the maintainability, modularity and reusability of their code.
An independent study of a theoretical or experimental nature chosen from the computer science or applications area. Open to concentrators by invitation of the department.
Prerequisites: consent of the instructor
“Technology and Disruption” is a half-semester course to be initially held in the second part of the Spring 2013 semester. The course will focus on how current technological developments (e.g., social media, digital content, big data) have disrupted and will continue to affect our society and the structure of the economy. Among the issues to be examined are who benefits (and suffers) from disruption, the prospects for “brick-and-mortar” institutions (including universities), and possible future patterns of disruption. Some evidence will be drawn from previous examples of technological disruption (e.g., railroads).
Students who participate in the course are expected to spend the summer in Palo Alto, CA working in a paid internship that Colgate will arrange and attending occasional lectures.
Because the course will study patterns of technological disruption in various areas of society and the economy, it provides a broad foundation for understanding the types of changes induced by digital-era entrepreneurship. However, the internship provides a unique opportunity for students to experience the process of disruption in real time. By working in Silicon Valley, students will be immersed in a culture of entrepreneurship, able to take part in creative and strategic development of technology. During the internship, students will be able to recognize relevant technologies and patterns of disruption studied in the course. Thus, the course and internship go hand-in-hand. Students will work with Career Services to obtain an appropriate placement for the summer, tailored to individual interests as much as possible.
consent of the instructor
Staff: Vijay Ramachandran (vramachandran@-xyznospamcolgate.edu)
A total of nine courses is required, and a minimum average GPA of 2.0 in the courses chosen to to satisfy the major. A prerequisite for any course in the major is COSC 101, and a cognate course of MATH 111 (Calculus I) is required. The required courses for the major are:
A total of five courses is required, and a minimum average GPA of 2.0 in the courses chosen to satisfy the minor. A prerequisite for courses in the minor is COSC 101. The required courses for the minor are:
Preparation for this major consists of MATH 111 and 112 and COSC 101 and 102. The following courses are required for the major:
A typical CS major course schedule is:
A number of our students don't "discover" computer science until their sophomore year. Also, many students choose to study abroad for one semester. In those cases, an alternate schedule can be crafted with the help of a faculty adviser. Just talk to one of our faculty: we can help you sort things out!
We frequently offer courses in the CORE curriculum, and there are great introductory-level courses that can fulfill "Areas of Inquiry" requirements. Specifically with regard to the latter category, the following courses are ideal for non-majors who are interested in taking a COSC course: COSC 100, COSC 101, COSC 122, and COSC 150.
Those students who may be interested in taking further courses in CS (for either a minor or major, or just out of interest) should consider taking COSC 101, which is a prerequisite for taking any courses in the major.