Course Description

Please spend some time reading this document, as it contains vital information about the texts, course policies and grading.

This is a project-based course to enhance individual, technical engineering knowledge and skills as preparation for upper-division team-based coursework. Topics include adapting to new languages, tools and technologies; developing and analyzing models as a prelude to implementation; software construction concepts (proper documentation, implementing to standards, etc.); unit and integration testing; component-level estimation; and software engineering professionalism.

Course Topics

This course covers individual software construction skills: planning, detailed design, programming, debugging and unit testing.  Software construction is the central activity guaranteed to happen on every project. As such, the quality of the construction substantially affects the quality of the software, and knowledge of construction principles is essential whether you are engaged in construction or are responsible for another phase of the project (architecture, requirements elicitation, quality assurance, maintenance, etc.).

Part of being a software engineer is knowledge of multiple programming languages; without such knowledge it is impossible to make intelligent technology decisions. What is more, the language landscape evolves rapidly over time, so the ability to learn and apply new languages is an essential skill. The language we will use is C; while you will not be an expert in either of these by the end of the term, you will have gained experience with the core concepts in each.

Why C? Well, C was one of the earliest high level languages to support efficient use of computer resources. Before C, most systems programs (operating systems, compilers, etc.) were developed in assembly language. With the advent of C and Unix, the days of large assembly language systems were numbered. In addition, C is the progenitor of a whole host of C like languages, of which Java is the most popular current example. This means we can focus on the unique aspects of C, particularly memory management and pointers, without having to spend much time on concrete syntax for loops, conditionals, expressions, etc. Finally, C is the immediate ancestor of C++, the current language of choice when efficiency and direct access to hardware is critical. Those who eventually take the real-time and embedded systems courses will find C and C++ are pervasive in those domains.

Course Objectives

At the completion of this course students will be able to

  • Construct and test a software component in accordance with contemporary practice.
  • Plan, estimate, track and analyze the effort required to construct and test a software component.
  • Apply fundamental software construction techniques in using new languages and tools.
  • Achieve growth in professional software development including technical writing / documentation and review of contemporary literature.
Method of Instruction

During the course you will be introduced to a number of software construction techniques using a variety of technologies and tools, many that will be completely new to you. Much like in the workplace of a professional software engineer, these skills are not so much taught  as they are learned. As you will know from your experiences in the introductory CS programming sequence, it requires much repeated practice and some amount of trial and error to achieve a desired level of proficiency in programming. You cannot learn to play the piano or golf by listening to piano music or watching golf videos. You must take the initiative to be responsible for your own learning - that is perhaps the most important learning objective to achieve during the semester. Listed below are the types of learning activities we will use throughout the course:

Mandatory Target Platform

There are many different operating systems, compilers, and development platforms that support C language software development. There are often significant differences between these systems. Yes, you are allowed to use the platform of your choosing for development. However, before submitting your final work you must test on the hamilton system.

All Activities, Projects, and Practica must compile, link, and execute properly on the hamilton system.

Classroom Activities

During class time you will be working in small groups or paired with other students. The classroom activities are designed to help you learn and practice the construction skill currently being discussed. This may be learning a new programming language, development environment, experimenting with an open source tool, participating in a code walkthrough or testing exercise. It is critical that you are present and fully participate in these activities as they will be the individual skills that are needed to complete the projects and to perform well on the lab practica.

Projects

There will be three individual construction projects assigned during the semester. Details on the content of the project, expected deliverables and assessment will be provided with the description of each project. Help and assistance will be available during the projects, but it is required that each student work independently on their own implementation.

Practica

A practicum, or lab practical, is a supervised demonstration of your competence on a software construction task. There will be three practica overall: two during the semester and one during finals week. During each practica which you must complete a construction task on your own. Practica are open book, open notes, open web - the only thing you cannot do is consult with another person.

Note: It is common to be asked to complete a short programming assignment of a similar nature during most job interviews.

Homework/ Reading

Homework and readings will be assigned periodically; consult the schedule frequently, as the readings and homework may change. Readings are due by the start of the week they are associated with. For homework the due date will be given when it is assigned. These assignments will supplement and reinforce project and classroom activities.

Textbooks

Highly Recommended Books  (primary references for C content of the course)

  • The Pragmatic Programmer: From Journeyman to Master by David Thomas and Andy Hunt, Addison-Wesley.
  • C Programming Language (2nd Edition), Brian W. Kernighan & Dennis M. Ritchie
  • Clean Code, Robert C. Martin

Recommended Books

These are not required or even directly appropriate for this course. Still, they are valuable additions to any software engineer's library.

  • Code Complete (2nd Edition) by Steve McConnell, Microsoft Press.
  • Professional Software Development, Steve McConnell
  • The Art of Unix Programming, Eric Raymond
  • Writing Solid Code, Steve Maguire
  • The Practice of Programming, Brian W. Kernighan & Rob Pike
Grading Breakdown

The final course grade is a combination of your grades on exams, quizzes, class activities and projects.

Component Percentage of Final Grade (100%)
C Project1 Part 110%
C Project1 Part 210%
Practicum #1 (C)15%
Practicum #2 (C)15%
Project 2 [Part 1 and 2]15%
Final Exam15%
Class Assignments20%
Submission Policy
  1. All submission of course work (activities, practicums, projects, etc.) is done via Git using your individual "pushbox" repository. The use of Git is covered during the first two weeks of class.
  2. Each required submission will explicitly identify the name of directory and the file(s) to submit. It is important that you follow the naming conventions exactly   as defined in the instructions. Failure to follow naming conventions may lower your grade.
  3. It is your responsibility to maintain your Git repository so that your instructor has access for grading. Notify your instructor immediately if you are having issues with your repository. 
Attendance Policy - PLEASE READ CAREFULLY!

You are expected to be present for all class sessions as we are often working collaboratively on in-class activities.

  • You are permitted three unexcused absences before incurring a grading penalty. In the working world these are known as "Personal Days".You do not need to let me know why you could not make class for whatever reason - alarm did not go off, not feeling well, car would not start, forgot to take the attendance quiz, etc.
  • Unexcused absences beyond three will incur an overall grade penalty of 4% per additional absence.
  • If you miss a class you are responsible for any material covered or assignments made that day. Use the course website to see what happened in class. I am happy to clarify assignments or answer specific questions. Please avoid sending emails that ask  "What did we do in class today?", or worse -"Did we do anything important in class today?"  :-)
  • Grading Policy
    1. Grading of assignments is performed by your instructor and courses assistant(s). Much is done via automated scripts, so be sure to follow submission instructions.
    2. Grades will be posted to  myCourses->Gradebook.
    3. If you have a question about a grade, please email me (even if you have verbally spoken to me) so that there is a record of your request.
    4. There are NO make-ups for practicums. See me in advance of a scheduled practicum if you have extraordinary circumstances (see excused absence definition above).

    Plus/Minus Grades

    All SE courses use the +/- system. The numeric range of grades may vary from instructor to instructor, but multi section courses will use the same numeric ranges. The following chart will be used to determine your letter grade at the conclusion of the term.

    Letter Grade Numeric Grade GPA Points
    A93-1004.000
    A-90-923.667
    B+87-893.333
    B83-863.000
    B-80-822.667
    C+77-792.333
    C73-762.000
    C-70-721.667
    D60-691.000
    FBelow 600.000

    When assigning final grades, each instructor reserves the right to alter these division points as he or she deems necessary based on the overall evaluation of individual or class performance and effort.

    Plagiarism

    Please do not post your solutions in a public forum (e.g. GitHub). We consider such an action to be a violation of RIT's academic integrity policy.