|Location:||Instructional Days: 2213 Centennial Hall, UW-La Crosse
Coding days: CS Department Lab, 16 Wing Technology Center
|Office:||Wing 210 (ext. 6810)|
|Email:||mallen <AT> uwlax <DOT> edu|
|Office hours:||Monday, Wednesday, Friday, 10:00-11:00am
Tuesday and Thursday, 1:30–3:00pm
Software Design I:
An introduction to the fundamentals of software development; including software classes, objects, inheritance, polymorphism, logic, selection control, repetition control, subprograms, parameter passage, and rudimentary software engineering techniques. Students complete numerous programming projects using a modern programming language. Prerequisite: MTH 151 or MTH 175 or math placement test scores at or above MTH 151. Offered Fall, Spring.
Software engineering, like other forms of engineering, is concerned with the design and creation of useful, reliable things. When creating software, as when building bridges, it is extremely important that the designers and creators know what they are doing, not just to complete the program (or bridge) at all, but to do so in a way that leaves its users with something that is truly functional and truly reliable. Like a beautiful building, a well-designed program is an impressive technical artifact that draws on its designer's expertise and creativity. To enable that creativity to flow forth, however, requires attention to sound and strong practices of design and execution.
In this class, we will be learning how to use the Java programming language, and the object-oriented programming paradigm on which it is largely based. Java is a powerful tool for writing real-world software applications, and knowledge of Java software development is in high demand in the workforce. The object-oriented style of program design is a key concept to making Java work at its best. By learning it, students will be able to go on to create highly complex, creative, and useful software artifacts.
Topics of Discussion
We will be covering a lot of material in this course. The exact order of topics, along with relevant readings and connected assignments, will be be maintained and updated on the Schedule section of the web-page. A not-so-brief list of topics we will consider is as follows:
- Objects and classes, and how they are specified and created.
- Java methods, with and without parameters and return values.
- Java primitive data types, and how to manipulate them.
- Data abstraction and encapsulation.
- Boolean expressions and related control structures.
- Repetition and looping in programs.
- Data structures for containers like lists and arrays.
- Java events, for control of programs.
- Elementary components of text-based and graphical user interface (GUI) elements in Java.
Objectives for the Course
By the end of the semester, a successful student will be able to do all of the following things:
- Write small (500 lines or less) Java programs. This will involve the ability to:
- Manipulate basic Java syntax, involving primitive data types and their operations, to create the basic elements of a working program.
- Write complex control structures, creating programs with conditional execution and looping operations, in order to do things like search for data, sort it, and change it.
- Define variables of various sorts, and put them to use properly, understanding their various scopes and properties, to ensure that code will always work the way that it is intended to work.
- Use existing classes, and write new ones to add functionality, doing so in a way that makes proper use of things like information hiding, inheritance and overloading, so that the code produced is powerful and easy to use.
- Use basic linear data structures for the storage and manipulation of data, creating programs that can handle large amounts of complex information.
- Comment code in a meaningful and proper way, so that co-workers and other users can use what has been written in future.
- Create programs that are interactive in a console-based manner, using simple text-based input and output routines.
- Use some of Java's key features for handling user actions via events and producing interesting graphical output, allowing for software that is interactive and interesting to use.
- Create and interpret class diagrams, and read and write standard Java class specifications, making it possible to understand and design well-constructed software.
- Textbook: We will be using an online, interactive text. The class Resources page has instructions on how to purchase and access this book.
- Lecture notes: When appropriate, these will be made available on the Notes section of the course website.
Requirements & Grading
Grades will be based on the following:
- Programming assignments (10) - 40%
- Quizzes (11) - 5%
- Code exercises - 5%
- Reading exercises - 5%
- Two written midterm examinations - 30% (15% each)
- Final examination - 15%
PROGRAMMING ASSIGNMENTS: These assignments will involve writing Java code for a variety of purposes. They will start off rather simple, but will become more complicated as you learn how to do more things in code. Much of the work will involve starting with some basic code supplied by the instructor, and building on it to create something more. There will be 10 such assignments.
QUIZZES: Starting in the third week of class, these will be short, taking up about 15 mintues, and will stress techniques and ideas covered in recent classes.
CODE EXERCISES: We will meet one day a week in the CS Department Lab (16 Wing Technology Center) for hands-on work with Java. Students will be given short code exercises, and the instructor will be present answering questions and helping with bugs; some will be able to complete the work quickly, and some will not be able to complete every exercise in the time allotted. In either case, students will receive credit for attending the lab and making an effort to do the work. No credit will be received for not attending, or for not trying the exercise.
READING EXERCISES: We will be using an interactive, online textbook (see the Resources page for more details). This text contains a number of in-book coding exercises and short-answer questions that are graded automatically. It is meant as a learning tool, and as such, completion of the reading and associated exercises is required. Reading assignments and associated exercises need to be completed by the dates indicated in the class schedule for credit.
EXAMS: The exams will be in written format, done during class time in mid-semester and during the University-set times for the final. (See below for dates and times.) Example exams, to show the format and type of question, will be distributed and discussed in the class before the exam occurs.
LETTER GRADES: I use the following breakdown of letter grades and percentages:
|94-100% A||83-88% B||70-78% C|
|89-93% A/B||79-82% B/C||60-69% D|
Grades below 60% are non-passing grades. In addition, to get a passing grade, you must be sure to complete all three exams in the course.
Important Dates and Times
While the Schedule section of the web-page will contain detailed information about weekly readings, assignments, and lecture materials, the following key dates are worth noting at the outset:
- Monday, 26 February 2018: In-class Midterm Exam #1.
- Monday, 09 April 2018: In-class Midterm Exam #2.
- Tuesday, 08 May 2018, 12:15 PM: Final Exam (held during the CS Mass Exam session, 3213 Centennial Hall).
More information can be found on the class examination resources page.
Homework & Policy on Collaboration
Programming assignments will be submitted electronically, by email or via other means. (Details will be supplied well before the first assignment is due.) They will consist of the fully-functional code as required.
LATE POLICY: For late assignments, handed in within 24 hours after the time at which it was due, a reduction of 10% will occur; if handed in within 48 hours of that time, a reduction of 20% will occur; within 72 hours, the reduction will be 40%. No credit is given for assignments submitted after that point, unless you have a documented reason.
Please note: I encourage you to work together on the material. This is a great way to learn, and to share ideas. However, in order to actually learn something, it is important that you complete the real work of programming on your own. It is perfectly fine for you to discuss the general approach to a problem with one another, and to help one another with things like getting the software we will use to work properly on your computer. If you run into difficulty with getting your code to function properly, you can also help one another figure out things like where there are syntax errors in the code, or do de-bugging to isolate a problem spot. However, it is not okay to write code together, or to copy code from anyone inside or outside of the class. While you can use online references to explain how Java works, and to learn programming techniques, you must not simply copy code you find online. This is the only way to actually learn the material. Any improper behavior with respect to these guidelines will be dealt with as academic misconduct, according to University policy.
Attendance in lectures will not be taken formally. Attendance will be taken on coding exercise days, in order that you can receive the credit for participation you deserve. In any case, I hope you will attend all class sessions. Class time will not be taken to review things missed due to lack of attendance. If you do have to miss a class, speak to your classmates about what you missed, and try to get notes and other materials from them.
How to Do Well in the Course
You want to do well in this course. I want you to do well in this course. Some simple ways to help make that happen are as follows:
- Do the reading before you come to class. To get the most out of the class, you want to read ahead of time; that way, you won't be seeing things in class for the first time, and you can come with questions that you already want answered, to make class time more productive. If you wait until it is time to do a programming assignment to look at the material, it may be too late to help you.
- Take notes during lectures. To get the most out of the material, you should participate actively in learning it, by taking notes. Although I do post lecture materials on the website, you will still find that you retain things more fully if you make your own notes to supplement the slide materials given to you.
- Ask and answer questions in class. I have found that if I sit back and simply listen to others talk about a subject, I can often convince myself I understand something. Then, when I open my mouth and try to talk about it, I realize that I really don't know what's going on at all. By participating in class, asking questions whenever I don't understand things, and trying to answer them, I find out what I do and don't know, and can do something about it.
- Come to office hours. I like to speak with students outside of class. As odd as it may seem, I actually like to talk about things like the proper way to write a Java class. You can take advantage of my odd proclivities by coming to speak with me about things you don't understand, either in class materials or in homework. This will help you.
- Work with others to study and solve problems. When you write up your homework to hand in, you will be doing it on your own, making sure you really understand what you are doing (this is especially helpful come exam time). Before you write your own code, however, you will find things work much better if you work together with others. Form study groups, meet up to discuss how to design a program, bounce ideas off one another over lunch. It's amazing what the wisdom of crowds can produce.
You can find out more about services available to students with disabilities at The ACCESS Center website: http://www.uwlax.edu/access-center.
Other information about the legal obligations UW-La Crosse has to its students can be found at: https://www.uwlax.edu/info/syllabus/