Attend all class and lab sessions. If you are unable to attend, reach out to me promptly so we can work together to keep you up to speed.

Participate in class discussions. This class will be collaborative and explorational, and that is best facilitated when everyone participates. You don't need to do a lot, but share your ideas, and ask questions when you have them.

Do the reading before each class. Do the optional reading if you can. You’ll get a lot more out of the class with the optional reading.

If you have a problem, reach out to me. I am here as a resource to you, and my number one goal is making sure you learn the material and succeed in the course. The sooner you reach out, the better we will be able to address the problem.

Some pre-course reading will include links or suggestions for further exploration into the topic at hand. These are entirely for your own personal edification, and will not be required for use in the course.

The class component will serve to enable discussion and exploration of the topics covered in reading. To do well in this class, you must do the assigned reading. Students who arrive to class without having done the reading will likely find themselves struggling.

Each class session will begin with a quiz whose questions are based on the information covered in the reading assigned after the previous class session. Each quiz will additionally have questions based on any optional reading, for extra points. See the Grading section for more information on how these quizzes are graded, and how that grade contributes to your final grade in the course.

The lab component will serve to introduce you to a variety of programming languages, to provide practical knowledge about different languages, their underlying paradigms, and how the different decisions the language designers make influence the resulting language.

The lab will consist of exercises and programming assignments designed to provide hands-on experience with the given languages and their paradigms.

Grading in the course is based on points. There are four ways to get points: quizzes, labs, the course project, and the final. There will be 18 quizzes each worth 5 points, 10 labs each worth 20 points, 1 project worth 110 points, and 1 final worth 100 points.

Each class except for the first and last will begin with a quiz covering the reading assigned at the end of the previous class. These quizzes are worth 5 points each, and with 18 quizzes total (2 classes per week for 10 weeks, minus the first and last class = 18), all the quizzes are together worth 90 points out of the 500 total points in the course.

These quizzes will be quick, and should be easy for anyone keeping up with the reading. They will also include a bonus question or two based on the optional reading assigned at the end of the previous class.

One of the goals of this course is to combat language monoculture. If you as a programmer only use one language, you are only exposed to one way of thinking. The languages we use (whether speaking or programming) shape the ideas we consider and express. Learning more than one programming language is akin to learning more than one spoken language. In doing so, you help to broaden yourself with new perspectives and ways of thinking.

It is not expected that you become a strong programmer in each of these languages. Rather, the hope is that the exposure you receive to these languages will pay dividends in improving your understanding of and facility with programming overall. If you happen to like one or more of these languages, and want to explore them further on your own time, do.

Labs in this class will consist of a series of exercises or a programming assignment in one of the four languages being used in the lab. These labs are designed to be reasonably completed within the hour and fifty minutes alloted. For students who finish with extra time and want to explore the languages in question further, additional resources or exercises will often be provided.

Lab time is a time for experimentation, discovery, and question-asking (both of yourself and of me). The best way to discover the workings of a programming language is to write in it, and so I highly recommend a sense of playfulness during lab sessions. I will be available for questions, and if more than one or two students has the same question I am happy to answer those questions for the edification of the rest of the students.

The lab is organized into four segments, each using a particular language. These languages were chosen because they best typify the core concepts of the programming paradigm they represent.

In these labs we will be using Haskell (to represent functional programming), Rust (to represent structured programming), Java (to represent object-oriented programming), and Prolog (to represent logic programming). These languages are all quite different, and there is enough nuance in each to fill multiple classes. So we will only be spending a few weeks with each.

The course will include a project to be undertaken in teams of 5 students. Each member of a team will receive the same grade, so make sure to pick team members on whom you can rely.

The overall goal for the project is to report on an existing language, and then design a concept for a new programming language. You do not need to implement the language, nor do you need to provide a complete formal specification, but you do need to trace out the concept to a degree sufficient for a technical reader to understand your language, and what sort of semantics should be expected.

In phase one, you must submit a report on an existing programming language that is not in the Top 20 of the TIOBE programming language index at the time the class starts. This means the following languages may not be used for the report:

Java

C

C++

C♯

Python

PHP

JavaScript

Visual Basic .NET

Delphi / Object Pascal

Perl

Ruby

Swift

Assembly Language

Go

R

Visual Basic

MATLAB

PL / SQL

Objective-C

Scratch

The phase 1 report is worth 40 points out of the 110 total points for the project. If a report on any of the languages listed above is turned in, it will receive 0 points.

The report should detail the language's syntax, semantics, paradigm, design philosophy, and major interesting features.

In phase two, you must submit a report on an original programming language concept developed by the group. This report is a draft report, and will not be graded, but failure to submit a report in phase two will result in the group receiving no points for any submission in phase three.

Like in phase one, the report should detail the language's syntax, semantics, paradigm, design philosophy, and major interesting features.

The final exam will be administered on Thursday, June 15th from 4:00pm to 5:50pm, and will cover the entirety of the material covered in class, and will be worth 100 points, out of 500 total for the class. The final exam will be open notes, and I highly recommend putting in some time to review the material prior to the exam.

The quizzes taken at the start of each lecture should be a good resource to study in preparation for the exam. You can additionally look over the material in the study guide.

Plagiarism and cheating are violations of the Student Conduct Code and may be dealt with by both the instructor and the Judicial Affairs Officer. Definition and procedures for addressing cheating and plagiarism are found below. Questions about academic dishonesty and the policy should be addressed to the Office of the Vice President, Student Services. Plagiarism is the act of presenting the ideas and writings of another as one’s own. Cheating is the act of obtaining or attempting to obtain credit for academic work through the use of any dishonest, deceptive, or fraudulent means. Cheating includes but is not limited to:

Copying, in part or in whole, from another’s test, software, or other evaluation instrument.

Submitting work previously graded in another course unless this has been approved by the course instructor or by departmental policy.

Submitting work simultaneously presented in two courses, unless this has been approved by both course instructors or by the department policies of both departments.

Using or consulting during an examination sources or materials not authorized by the instructor.

Altering or interfering with grading or grading instructions.

Sitting for an examination by a surrogate, or as a surrogate.

Any other act committed by a student in the course of his or her academic work, which defrauds or misrepresents, including aiding or abetting in any of the actions defined above.

Plagiarism is academically dishonest and makes the offending student liable to penalties up to and including expulsion. Students must make appropriate acknowledgements of the original source where material written or compiled by another is used. Procedure. Allegations of academic dishonesty may be handled directly by the instructor or may be referred by the instructor to the Judicial Affairs Officer. If handled by the instructor, the instructor has the following responsibilities:

To preserve the evidence in support of the allegation;

To notify the student of the allegation and of the evidence on which it is based;

To provide the student a reasonable opportunity to challenge or rebut the allegation;

To notify the student of the action being taken.

The instructor may employ any of the following sanctions:

Verbal or written reprimand;

Assignment or appropriate task or examination;

Change of grade, including assigning a punitive grade to work involving dishonesty, or for the course, project, thesis, or any other summary evaluation of the student’s academic work.

If the student does not wish to accept the sanction proposed by the instructor, the student may request and require that the allegation be referred to the Judicial Affairs Officer. In that event, the procedures specified under Executive Order 970 (Student Disciplinary Procedures of the California State University) shall be observed. The instructor shall not impose any sanction other than the sanction(s) imposed through the disciplinary procedure.

The following are learning outcomes for the Computer Science program, accredited by ABET This course supports these outcomes.

An ability to apply knowledge of computing and mathematics appropriate to the discipline.

An ability to analyze a problem, and identify and define the computing requirements appropriate to its solution.

An ability to design, implement, and evaluate a computer-based system, process, component, or program to meet desired needs.

An ability to function effectively on teams to accomplish a common goal.

An understanding of professional, ethical, legal, security and social issues and responsibilities.

An ability to communicate effectively with a range of audiences.

An ability to analyze the local and global impact of computing on individuals, organizations, and society.

Recognition of the need to and an ability to engage in continuing professional development.

An ability to use current techniques, skills, and tools necessary for computing practice.

An ability to apply mathematical foundations, algorithmic principles, and computer science theory in the modeling and design of computer-based systems in a way that demonstrates comprehension of the tradeoffs involved in design choices.

An ability to apply design and development principles in the construction of software systems of varying complexity.

It is highly recommended that you become a member of the CSUSB Computer Science and Engineering Club. The club provides a number of support and enrichment activities, including peer tutoring and talks on current topics in computing. Joining the CSE Club is an excellent way to expand your skills and opportunities as a computer scientist or engineer.

You may contact me via email at andrew.brinker@csusb.edu with questions and comments related to the class. Make sure to preface all email subjects with “[CSE 320]”, to ensure that I will see and respond to your email message.