This is an archive of a course I taught Spring 2017, preserved here as a resource for future students.

ECE 458: Engineering Software for Maintainability

Sections 01 and 02, Spring 2017


Fig. 1: If your IDE looks like this,
you're doing it wrong.

Section 2 party
----
DaysHrsMinsSecs
Course survival checklist
  • Prepared with notes for next discussion?
    (especially if leading it!)
  • On target for evolution deliverables?
  • Next evolution presentation/report ready?
  • Next out-of-class eval scheduled?

Overview

Lecture section 01: Hudson 115A, TTh, 10:05AM - 11:20AM
Lecture section 02: Hudson 222, TTh, 1:25PM - 2:40PM

Instructor: Dr. Tyler Bletsch
Email: Tyler.Bletsch AT duke.edu
Office Hours: Thursdays 12:10pm-1:10pm in Hudson 106, or by appointment

Teaching Assistants: Tian Liao and Tananun Songdechakraiwut
TA Office Hours: By appointment

Links

Schedule

Thu 1/12. Introduction

Tue 1/17. Programming Languages and Frameworks

Thu 1/19. Project management

  • Evidence-Based Scheduling by Joel Spolsky
  • In my experience, bad planning and logistics is just as likely to sink your project as design issues. Let's fix that.
  • Each team must identify and report on a tool and/or technique to address each of the following issues:
    • Project dependencies, timeline, and opportunities for parallel effort (e.g. Gantt chart?)
    • Bug/task tracking and assignment
    • Source code control and governance (branching, merging, code review, deployment, etc.)
    You don't necessarily need a heavyweight tool for each thing; just be able to describe how you'll address them.
  • Let's discuss some of the planning issues you may encounter.
    • What are ALL the steps that will go into a release (evolution) of your softare?
    • Is it worth anything to know you're behind schedule? What can you do with that information?
    • How could a project's execution be "inefficient"? How can this inefficiency be detected and corrected?
    • The above practices are mostly about improving efficiency, but how might they also improve the quality of the final product?

Tue 1/24. Workday

  • Stand-up status meeting (quick!)

Thu 1/26. Good Design: What is it?

  • Basics of the Unix Philosophy from The Art of Unix Programming by Eric S. Raymond
  • Sections 5.1 and 5.2 of Chapter 5 of Code Complete by Steve McConnell
  • The primary goal of this course is to get you thinking about how to design software better. Accordingly, our second class discussion will focus on what we consider to be "Good" design. Here are some concrete discussion points to consider:
    • What are the hallmarks of a Good design?
    • What are the hallmarks of a Bad design?
    • How do these considerations tie into the language features you found desirable?
    • How do you plan to ensure good design?
    • How can you evaluate the Goodness of your design...
      • ...in the planning stages?
      • ...in the implementation stages?
      • ...when maintaining it?
    • If you made bad design decisions, how do you decide between sticking with it and redoing it?
  • When we design programs, we actually have two very different tasks: Programming in the Large (PitL) and Programming in the Small (PitS). In the former, we consider large scale design considerations: modules, their interfaces, etc. In the latter, we consider design considerations on a much smaller scale: implementation of a module, class, or function.
    • Which of your good design/bad design features contribute to PitL, and which to PitS?
    • Which of the important language features that you identified earlier are important for PitL vs PitS?
    • How do the two tasks relate? Are they mutually exclusive? Serially dependent? Iterative refinements of each other?
    • Which is more important: PitL or PitS? Put a different way, if you had to work on a piece of software which did one excellently and one badly, would you prefer good PitL design coupled with poor PitS design or poor PitL and good PitS?
    • Which scale of design aspects is easier to modify when requirements change? How does the answer to this question inform our design decisions?

Tue 1/31. Workday

  • Stand-up status meeting (quick!)

Thu 2/02. Effective professional presentations

  • Guest panelist: David Klem, Principal Architect for FlexPod, NetApp.
  • The Listener's Bill of Rights by Beryl Pittman
  • You're going to present your first evolution soon. Some questions to ponder:
    • You've certainly born witness to bad presentations...what made them bad?
    • What defines "professionalism" in a presentation?
    • What are some techniques and tricks to help give a smooth presentation?
    • In what ways might a speaker lose credibility?
    • If you show up to do a presentation and you can't connect to the projector, do you look like a giant fool? (HINT: yes.) What can be done to prevent this?
    • Public demos tend to fail with almost magical regularity. What can you do to mitigate this risk?

Tue 2/07. Evolution 1

  • Oral presentations
  • Due today by 8am:
    • Code for this evolution should be submitted
    • This same code should be kept deployed on a production machine
    • Your demo meeting should be scheduled

Thu 2/09. Evolution 1 Reflection

  • Each team should come prepared to discuss:
    • What parts of your design do you think will set you up well for the future? Why?
    • What parts of your system are you most worried about going forward? Why?
    • How is your project/software management methodology working? Have you had to evolve it?
  • After hearing everyone present, we will discuss tradeoffs between different teams' approaches.

Tue 2/14. Workday

  • Stand-up status meeting (quick!)
  • Due today by 8am:
    • Project report for evolution 1

Thu 2/16. Testing and Debugging: two separate things

  • Guest panelist: Ryan Mortimer, Zcloud Developer, Scrum Master, and CSM. IBM.
  • Software Testing by Sarah Heckman — a primer on the fundamentals
  • The case of the disabled logins — an interesting diagnosis of a malfunctioning Linux-based kiosk
  • Testing: Systematic testing is an important part of the software creation process. In a healthy development environment, testing is generally automated and regular, including nightly regression testing and a robust, end-to-end QA effort conducted before release. Today, we talk about how it fits into the design process.
    • Where do tests come from? How does testing differ from debugging?
    • How do you automate testing? When should automatic testing occur?
    • How can your design decisions simplify (or complicate) testing?
    • How do you design for testability?
    • How does your testing infrastructure/plan have to change in the face of changing requirements?
    • Can you design your testing infrastructure/plans to be more resilient to evolution?
  • Debugging: Most programmers spend more time debugging code than writing it. How can our design improve our debugging process?
    • When in the programming process is our code must vulnerable to introduction of bugs?
    • How can our design decisions reduce (or increase) the prevalence of bugs?
    • How can our design decisions simplify (or complicate) debugging?
    • What constitutes "good" debugging practices?

Tue 2/21. Workday

  • Stand-up status meeting (quick!)

Thu 2/23. Effective technical writing and software documentation

  • Guest panelist: Dr. David L Kaminsky, Senior Technical Staff Member and Chief Patent Innovation Architect. IBM.
  • The Bill of “Writes” by Beryl Pittman
  • Writing: Your second evolution is due soon, which means you are hopefully starting to write it up. In this discussion, we are going to talk about what makes good writing versus bad writing, and look for parallels with program design. Specific discussion points to consider include:
    • What are the hallmarks of a well written document?
    • How can you tell if what you have written is good or bad? If you identify something as being poorly written, how do you improve on it?
    • Compare and contrast good writing and good program design.
    • Compare and contrast the process of writing with the process of programming.
  • Documentation: most programmers hate writing it, but wish they had more of it to read...
    • How much documentation has your team written? What form does this take? Are you happy with it?
    • What makes good documentation?
    • Documentation takes time, but what are some ways in which it might save more time than it takes?
    • Can good code documentation improve the quality of the product from the user's perspective?

Tue 2/28. Evolution 2

  • Oral presentations
  • Due today by 8am:
    • Code for this evolution should be submitted
    • This same code should be kept deployed on a production machine
    • Your demo meeting should be scheduled

Thu 3/02. Evolution 2 Reflection

  • Each team should come prepared to discuss:
    • Looking back on what you considered your strengths...were they strengths?
    • Looking back on what you considered your weaknesses...were they weaknesses? What did you do about it?
    • What parts of your design do you think will set you up well for the future? Why?
    • What parts of your system are you most worried about going forward? Why?
    • How is your project/software management methodology working? Have you had to evolve it?
  • After hearing everyone present, we will discuss tradeoffs between different teams' approaches.

Tue 3/07. Workday

  • Stand-up status meeting (quick!)

Thu 3/09. Teamwork: impact of teamwork on programming

  • Guest panelist: Craig Chadwell, Senior Product Manager, Lenovo
  • Chapter 1 of How to Win Friends and Influence People by Dale Carnegie
    (and in the interest of time, you'll be forgiven for just skimming some of the more lengthy anecdotes...)
  • Today's discussion will focus on programming as a team effort:
    • What benefits does team programming have?
    • What difficulties does it introduce?
    • How does leadership/governance work on your team, i.e., how are decisions made and disagreements resolved?
    • How should you deal with a peer who seems discouraged or you feel may be having trouble contributing?
    • How would your approach differ with a peer who you feel could be working harder?
  • Due today by 8am:
    • Project report for evolution 2

Tue 3/14. Spring Break (no class)

Thu 3/16. Spring Break (no class)

Tue 3/21. Maintainability and Refactoring vs. Rewriting

  • Guest panelist: Rebecca Register, Kernel Software Engineer, NetApp.
  • Things You Should Never Do, Part I by Joel Spolsky
  • How To Survive a Ground-Up Rewrite Without Losing Your Sanity by Dan Milstein
  • You are almost done with the semester, and have just about finished three evolutions of the requirements. Hopefully you have significant thoughts on maintaining code in the face of changing requirements, the topic of today's discussion:
    • What kind of evolutions were most difficult to deal with?
    • Can you generalize what makes a specific type of requirement evolution easy or hard to deal with?
    • What makes code easy (or hard) to maintain?
    • How does this inform our design decisions?
    • What is different when you modify code someone else wrote? How do you mitigate these difficulties?
    • Did you ever consider a rewrite of all/part of your project? What are the pros/cons of a rewrite vs. a refactor?

Thu 3/23. Workday

  • Stand-up status meeting (quick!)

Tue 3/28. Evolution 3

  • Oral presentations
  • Due today by 8am:
    • Code for this evolution should be submitted
    • This same code should be kept deployed on a production machine
    • Your demo meeting should be scheduled

Thu 3/30. Evolution 3 Reflection

  • Each team should come prepared to discuss:
    • Looking back on what you considered your strengths...were they strengths?
    • Looking back on what you considered your weaknesses...were they weaknesses? What did you do about it?
    • What parts of your design do you think will set you up well for the future? Why?
    • What parts of your system are you most worried about going forward? Why?
    • How is your project/software management methodology working? Have you had to evolve it?
  • After hearing everyone present, we will discuss tradeoffs between different teams' approaches.

Tue 4/04. Guest lecture: Software Craftsmanship

  • Guest presentation by Daniel Holmes, Senior Software Engineer, NetApp.

Thu 4/06. Workday

  • Stand-up status meeting (quick!)
  • NOTE: Assign subsections of reading for next session's discussion.
  • Due today by 8am:
    • Project report for evolution 3

Tue 4/11. Business stuff: leadership, communication, budgeting, and politics

  • Guest panelist: Henry Vail, Technical Director for Lenovo NextGen IT, Lenovo.
  • Technical Debt by Steve McConnell
  • A assigned subsection from How to Win Friends and Influence People by Dale Carnegie
    (one of the set {3.1-3.12, 4.1-4.9}. )
  • Capex vs. Opex, Diffen.com
  • Whether you're headed to a big corporation, a small startup, or an academic role, it is certain that non-technical business issues will "intrude" on your work. In my experience, once you pass a certain level of technical expertise, your career will likely be defined by your understanding of leadership, communication, budgeting, and politics.
    • What makes a good leader? A poor leader?
    • How do you demonstrate leadership potential when you do not yet have a leadership role?
    • How might someone fail to convince others even when they're right?
    • What motivates decision makers in a business?
    • How could software design decisions affect the budgeting of a software project?

Thu 4/13. Workday

  • Stand-up status meeting (quick!)

Tue 4/18. Evolution 4

  • Oral presentations
  • Due today by 8am:
    • Code for this evolution should be submitted
    • This same code should be kept deployed on a production machine
    • Your demo meeting should be scheduled

Thu 4/20. Overall Reflection

  • Each team should come prepared to discuss:
    • Looking back on what you considered your strengths...were they strengths?
    • Looking back on what you considered your weaknesses...were they weaknesses? What did you do about it?
    • How did your project/software management methodology work?
  • Revisit the previous discussion topics and contemplate how your answers to these questions have evolved.
    • What specific lessons about designing for evolving requirements have you gained from the class project and discussions this semester?
    • What were the most important of these lessons?
    • How can you apply the lessons you learned to design to guard against difficult requirement changes?

Tue 4/25. Party

  • Party
  • Due today by 8am:
    • Final project report
      (Yes it's lame that the final report is due on the day of the party, but come on, it was either that or make it due earlier...)

Course overview and policies

Note: This course and its procedures are based on work by Drew Hilton, and some of the below is adapted from his syllabus.

In order to experience long-term software development and its effects on maintainability, you will be developing a semester-long software project. The requirements for this project will be released in four phases called evolutions. You will complete the project in groups of four students. Once you set your groups, you may not change them, so choose carefully!

The fundamental teaching mechanism at work in this course is reflection: by building a large and evolving software system, you will make decisions; some will turn out well while others may be costly, and that's okay. To get the most out of this course, be mindful of your actions and reflect on lessons learned over time.

Grading

Your grade will be broken down as follows:

Academic integrity

I take academic integrity extremely seriously. Academic misconduct will not be tolerated, and all suspected violations of the Duke Honor Code will be referred to the Office of Student Conduct (for undergraduates) or the departmental Director of Graduate Studies (for graduate students). A student found responsible for academic dishonesty faces formal disciplinary action, which may include suspension. A student twice suspended automatically faces a minimum 5-year separation from Duke University.

The expectations for this course are that anything you turn in (code, project report, etc.) will reflect the work of your group. I expect that you will not copy code/text from or share code/text with other groups, nor have people outside your group write any of this. You are welcome to (and encouraged to!) share design ideas during class discussions. If you choose to use ideas presented by other groups, you should give credit where credit is due: in your written analysis, when you discuss that element of your design, you should note who you got the idea from.

Other issues

Feeling overwhelmed or don't know where to start on something? Come talk to me.

Group dynamics issue?: Come talk to me.

Readings I like but couldn't fit into the schedule