This course may serve either as an introduction to computing for use in other disciplines, or as the first course in a major or minor in Computer Science. No prior knowledge of programming is assumed. The majority of time will be spent learning to program in Java. Principles to be addressed include: algorithms, design, experimental method, software development methodologies, and implications of discoveries in cognitive psychology for programming strategies.
We will address a number of general questions in computing, including: Are there problems for which it is impossible to write a program? Is there any limit to the speed of future computers? What are computing's impacts on society? Are warfare and computing inextricably intertwined? What moral obligations does programming entail? Will computers make people obsolete?
This course is more concerned with process than with content. A strictly content based course would require you to learn some set of facts (and possibly a fixed set of techniques). A terrible middle school history course might simply require you to memorize some set of names and dates; this would neither enhance your understanding of history as a process, nor illuminate the essentially arbitrary nature of the particular facts that have come to represent some portion of the past. CS141 will require you to learn a substantial body of facts (content), but, its main goal is for you to learn the process of solving problems through programming.
Upon successful completion of this course, you will have a set of programming and problem solving skills that will serve you throughout your life. Like riding a bicycle, you will never forget how to program (even though the machines and languages will change). You will interact with computers as long as you live, and understanding what is going on inside will give you a different perspective on those interactions.
Student learning objectives; aka SLOs
There will be tutors in all labs and available on TBA to assist with problems you encounter. The tutors' job is to help you understand what you need to do, *not* to do your work for you. Please don't ask them to write your programs; ask them about things you don't understand, or what you should do to figure out your bugs.
There will be two mid-terms, a final, and a number of quizzes. The final will count as much as both mid-terms together; the quizzes will comprise the remainder of the exam portion of the grade. Quizzes will be every Friday, with some exceptions; they will be brief. All exams will test the skills you have learned through accomplishing the labs. To pass the course, you must pass at least two of the three exams (to pass the exams you must understand how to program in Java; learning to program is challenging, and programming can only be learned through practicing -- it cannot be done through rote memorization).
There will be 4 or 5 Ruby and 8-10 Java programming assignments; most programming will be done in pairs. Later labs will be larger, require more work, and count for more. Some labs will be started and perhaps completed during class time. Others may be done either during lab or out of them (the labs are open 24/7, and if you wish you may work on your own machine). But, whenever you do the labs, you must demonstrate them during lab (or sometimes in class if there is time).
Any motivated student can succeed in this class. On the other hand, if you slack and fall behind it is very likely to be impossible to catch up. Learning to control a mindless automaton is complicated; there are many facts and obscure details you must master before anything will work. On the other hand, unemployed programmers are almost unheard of!