INTRODUCTION TO COMPUTER SCIENCE
>> FALL 2019 | [ SCHEDULE ] | [ SYLLABUS (PDF) ]
Instructor: Andrew Cencini (acencini@bennington.edu)
Credits: 4
Meeting Time: Tu/F 2:10pm - 4:00pm
Location: Dickinson 235 (CATLab)
Office Hours: Tu/F 4pm-5pm, or by appointment - Dickinson 211
Course Web Site: http://cs.bennington.edu/courses/f2019/cs2124.01/

SUMMARY:
In this class, students will be exposed to the main areas and questions related to computer science, while beginning their journey towards becoming skilled practitioners in the field. A large part of this process will include learning basic programming skills in Python, computational thinking and algorithm design. In addition, students will also formulate and explore questions of their own related to computer science.

SKILLS:

  • Become a skilled user of Linux and command-line tools to solve problems and discover information. Some examples:
    • Automating repetitive tasks.
    • Searching through and/or sorting data.
    • Finding, analyzing and acting upon system information.
    • Learning more about networking, protocols, and how the Internet works.
  • Become familiar with computational thinking, in particular, coming up with algorithms, writing and designing basic programs, and exploring the creative process of programming.
  • Become familiar with the process of working together to build a "large" software project. This includes:
    • Breaking a problem down into its component pieces.
    • Understanding how those pieces interact.
    • Assign and assume responsibility for subcomponent development.
    • Become familiar with scheduling and bug tracking.
    • Work to test and integrate components throughout the development cycle.

FORMAT:

  • During the first week or two, students will first become familiar and confident with their development environment. This will take place largely through a self-paced 'scavenger hunt' designed to build and reinforce skills needed to work in a Linux environment.
  • Once comfortable with the working environment, we will begin the process of learning the practice of programming - what are the tools, processes and ideas central to programming? How do computers and computer programs work? What types of programs can I write?
  • Classes will generally include some lecture/discussion/demonstration to frame the tasks and components at hand, as well as guided activities/labs throughout.
  • From here, we will continue progressively moving through the mechanics of the Python language, framed by a set of motivating ideas and technologies (for example, building an interactive web service).
  • The remaining class time will be devoted to developing project idea(s), determining teams, design, planning, implementation, testing and deployment. Students and project teams will determine how this time is to be used, in consultation with the instructor.
  • Interspersed throughout class will also be special topics and activities related to computer science as determined by the class and instructor as appropriate.
Given the usual way things go, the format above is only a loose guideline, and may change as the class goes on.

WORKLOAD:
Learning the fundamentals of computer science is different for everybody and may even differ from topic to topic or problem to problem in terms of how much time and effort is required to master that topic or problem.

Working in a group setting on a larger problem can present a unique challenge in terms of workload - groups will be responsible for dividing work equitably among all partners and holding each other accountable to get tasks done well in a timely manner. Even the best project plans are not perfect, and as such, it should be expected that some weeks may be more intense than others. It is advised that students communicate with each other and the instructor regarding schedule, availability and workload.

TEXTBOOK:
We will rely on Python Programming: An Introduction to Computer Science (3rd Edition) by John Zelle. This book is good background and reference, and we will draw upon it at various times throughout the course.

REQUIREMENTS AND ACADEMIC INTEGRITY:

  • You will attend every class. More than two absences (excused or unexcused) will jeopardize your standing in the course.
  • You will submit all required assignments prior to the start of the class in which they are due.
  • You will be a productive and positive collaborator with your colleagues at all times.
  • You will be an attentive and positive contributor to class discussion and activities.
  • Your participation and presence in class and other activities will foster a safe and welcoming environment for all others in the class.
  • You will seek out help promptly if you are struggling or falling behind.
  • You will submit your own ideas and work. Academic dishonesty will not be tolerated, and will be passed along without exception the appropriate administrative or judicial entity.
A note on attribution, code, and the culture of programming...

The "culture" surrounding programming is one that encourages sharing and collaboration. Open-source software, online communities such as StackOverflow, GitHub/Gist, and the fast-paced nature of the technology world have all led to a vast collection of places where programmers can quickly and easily get help in solving common and not-so-common problems. This is a fantastic and vital part of being a 'programmer', and I encourage you to use and contribute to these communities.

This being said, there are a few important guidelines that MUST be followed in order to strike a balance between collaboration and academic integrity:

  • You must provide attribution for ALL ideas you have consumed from sources outside of your own scope of knowledge. This may be done in a variety of ways, but must be noted explicitly - either via code comments, a note at the time of submission, or via some other mechanism that clearly indicates:
    • What part of your work, specifically, has been influenced by an outside source, and how.
    • What the outside source was - whether another student, a web site, other code, etc.
  • Outside contributions to your work must not comprise a substantial portion of the solution to the problem or module you are working on. Your work must be your own and your Google or interpersonal skills, no matter how sophisticated, do not equate to mastery of course material!
  • If you provide assistance to others (in individual projects), or other groups (in group work), you must share this information with the instructor. Helping your fellow students learn is an essential and valuable part of the learning experience. However, providing "too much" help by providing answers or clues that substantially undermine the challenge and learning objectives of an assignment is not helpful and, in fact, a violation of academic integrity. Therefore:
    • If you assist another student in class, notify the instructor via email or some other mechanism, indicating who was helped, when, and what the nature of the help was.
    • It is also expected (per the 'attribution' paragraph above), that the student who was assisted will also indicate that they were assisted.
    • Those helping or being helped should feel secure in the knowledge that the exchange of assistance will not negatively or positively impact their grade on the assignment or work in question.

EVALUATION:

  • Class participation and attendance (40%).
  • Assignments and exercises (35%).
  • Final project (25%).
I strongly advise all students anxious about grades to take this class Pass/Fail. While you will "get out what you put in" to the class, programming can be difficult under time and grade pressure - in essence, exponentially increasing that feeling of pressure. Taking this class pass/fail will allow you to feel relaxed and confident as you work through concepts and problems. Taking this class pass/fail is not mandatory, but certainly has worked well for past students in terms of lowering stress level while enhancing pure interest in the material.

GETTING HELP:
If you are struggling in class, or would like to investigate a topic in greater depth, come see me. My office hours are listed on the top of this syllabus. I truly enjoy and look forward to meeting with you - some general guidance on making sure we are able to meet:

  • I strongly prefer email (acencini@bennington.edu). I am on it way too much, so you'll likely get a reply within 24 hours unless I am extremely busy.
  • If you would like to meet with me, please consult my schedule (located at my page) and propose a date and time that is not generally booked.
  • If you plan to drop by during my office hours, it doesn't hurt to email in advance - I like to know if you are planning to show up, and can also let you know if there might be a wait.
  • If you need to meet me outside of my office hours, making an appointment a day or more ahead of time is strongly suggested.
Additionally, I have a large selection of hardware, software and print materials that may be of interest for coursework or independent projects. Feel free to stop by and inquire about what is available and what may be borrowed or used!

Alternately, you are also encouraged to meet with our class tutor, Sophia Marx (sophiamarx@bennington.edu) who will share a regular meeting time with you, and can also meet by appointment. Additional tutors this term are Matt Collyer and Katrina Sliter, who will also post office hours.

SCHEDULE:
Subject to change. Readings and assignments will be disseminated in class.

Week	Date		Topic
Week 0	9/3/2018	Lab orientation! Linux scavenger hunt I. [Clue 0] [Linux Cheat Sheet]
	9/6/2018	Linux scavenger hunt II. [Part II] [Read JZ Chapter 1]
Week 1	9/10/2018	Programming languages and practice.  Your first Python program. [hi.py] [Read JZ Chapter 2]
	9/13/2018	Class canceled - Andrew sick :(
Week 2	9/17/2018	Lab 1: Variables, assignment and output.  Data types. [Lab 1 (on Populi)]
	9/20/2018	Lab 1 Continued - [Read JZ Ch 3 for Tuesday, finish Lab 1]
Week 3	9/24/2018	Lab 1 Review; Conditionals, While Loops and Binary [Lab 2] [Read JZ Ch 5 for Friday]
			Lab 1 Solutions: [task0.py] [task1.py] [task2.py] [task3.py] [task4.py] [task5.py] [task6.py]
	9/27/2018	Lab 2 Continued.  Conditionals, While Loops and Binary. 
Week 4	10/1/2018	NO CLASS - FACULTY MEETING
	10/4/2018	Lab 2 Review.  Strings and encoding.
			Lab 2 Solutions: [task0.py] [task1.py] [task2.py] [task3.py] [task4.py]
Week 5	10/8/2018	Lab 3: Functions, parameters and return values.
	10/11/2018	Functions, parameters, random numbers [randnum.py] [fnproj.py] [Lab 4]
Week 6	10/15/2018	File operations, functions, parameters, multi-module projects [Homework 1] [fileops.py] [list_maker.py] [mad_libber.py]
	10/18/2018	LONG WEEKEND NO CLASS
Week 7	10/22/2018	File operations, functions, parameters, multi-module projects (with tutors)
	10/25/2018	Lab 4 / HW1 Check in, mid-term feedback sent out.
Week 8	10/29/2018	Graphics [graphics.py - External link], dictionaries, beginning object-orientation [Lab 4 due]
			[graphics_example.py]
	11/1/2018	Lab 5: Graphics, object-orientation continued. [HW1 due]
Week 9	11/5/2018	Lab 5: Graphics, object-orientation
	11/8/2018	Lab 5: Graphics, object orientation
			[silly string example]
Week 10	11/12/2018	PLAN DAY NO CLASS
	11/15/2018	HW2 Discussion, graphics, object-orientation [Lab 5 Due]
Week 11	11/19/2018	Lab 6: Flask web services and dictionaries Part I
			[Final Project Prompt / Discussion]
			[hw2_example.py]
	11/22/2018	Lab 6: Flask web services and dictionaries Part I [Lab 6 due] / Lab 7: Flask II
Week 12	11/26/2018	Lab 7: Flask Part II [Project Proposals Due]
	11/29/2018	THANKSGIVING NO CLASS
Week 13	12/3/2018	Project work session / Lab 7: Flask II
	12/6/2018	Project work session. [Lab 7 Due] [Sign-up for Presentation Slot] [SEPC]
Week 14	12/10/2018	Project Presentations I
	12/13/2018	Presentations II. Wrap-up and tearful goodbye.