Thursday, February 17, 2011

Tentative course plan for first course taught

Introduction to software engineering topics outline:
8 weeks

week 1: History
week 2: Process models, Testing (TDD, Unit, Functional) introduce project
week 3: Source Control tools (versioning, continuous integration) form teams
week 4: Requirements analysis (BDD, CRC cards, Joel on Software Functional Specs)
week 5: Design (UML, design patterns, MVC)
week 6: Implementation? (In class XP session. We may get a lab. Otherwise, bring your laptops!)
week 7: Testing of other team's projects
week 8: wrap up

Textbooks / Resources:
-- Fred Brooks The Mythical Man Month (Required)
-- Dave Hunt and Andy Thomas The Pragmatic Programmer (Required)
-- Grails in Action (Required)
-- Head First Object Oriented Analysis and Design & Head First Design Patterns (Optional)
-- Joel on Software
-- Coding Horror
-- Software Engineering Radio
-- Grady Booch on Architecture

Books you should read:
-- Patterns of Enterprise Application Development
-- Refactoring
-- Design Patterns
-- Test Driven Development
-- Clean Code
-- Domain Driven Design

Waterfall - I'm not even going to teach it to you, because it's wrong.
Your only responsibility is to know that it exists.
When someone brings it up, you should spit in disgust.
Some people argue that on small projects it's ok.
They're wrong. I've yet to see a meaningful project that doesn't require iterative refinement.

Spiral -- A historical method. We'll talk about it a bit, since Rational Unified Process and every proceeding Agile method is basically Spiral on steroids.

Project:
We're going to work from an Agile methodology, using Test Driven Development, to build
a social networking web application where users can connect in real-time.
Many classes like this allow you to choose your own implementation technology, and do the entire project from soup to nuts.
In my own experience, we built the backend of a restaurant management system.
We did no coding until the month before it was due, then we choose to use Visual Studio because it made GUI creation easy.
We spent 2 weeks learning the language and basically had 2 all-nighters where we cranked out the components.
I will not allow you to repeat that process.

Furthermore, it doesn't reflect what happens in the real world. Most of you will get a job at a company where you will already have prescribed
implementation technologies. You will probably be supporting an existing code base (in which case you should definitely read Refactoring), which will
need maintenance while you add new features. Consequently, I'm going to constrain you a little bit. This actually makes your life easier.

You will use Grails to build a social networking application where users can connect and have real-time video conferencing. Think Facebook meets LiveJasmin.
(Don't pretend you don't know what I'm talking about ;P)

-- Resources
Peter Ledbrook & Glen A. Smith's Grails in Action
Scott Davis Mastering Grails IBM Developer Works series
Grails.org documentation
W3schools.org
Head First HTML/XHTML/CSS

-- Expectations
If you have not developed web applications before, you'll have the joys of learning HTML/JS/CSS (the Assembly of the web) real quick.
All of you know Java from CSE110/CSE205.
Groovy is a "psuedo" superset of Java that incorporates lessons learned from dynamic languages like Ruby and Python.
Grails is an incredibly powerful web application framework built in Groovy.
You will learn these technologies. Quickly.
You will use a source control system. We will have mini tutorials for setup of SVN, git, and Mercurial. You will lead them.
You will achieve at least 90% code coverage on your tests.
You will use a continuous integration server environment.
You will deploy new stable versions of the application "to production" every week.
YOUR CODE WILL BE REVIEWED. If it is shit, I _will_ call you out on it. In class. You'll get to explain why saw fit to write Crap McScript to achieve unmaintainable functionality that belongs on ___
When you are done with my class, you will walk into a job interview and they will ask you "Are you a good software engineer?", you will say "I'm not just a good software engineer, I AMZ t3h SEX!" and proceed to wow the pants off of them.

I cannot teach you everything that you need to know to be a good software engineer.
But I vow that you will not have the experience that many of my friends have experienced, where you go into industry and know none of the tools and have only academic knowledge about how to build enterprise, _professional quality_ software.
If you want to snooze through an easy A, this is not the course for you.
That said, there will be _plentiful_ extra credit opportunities.
I *want* to give you all As. But you're going to have to _earn_ it.
If you expect a boring and dry lecturer, look elsewhere. If you expect to sit around and never answer questions, this is not the course for you.
You will all be expected to bring name tents, every session. No name tent = loss of points. I will call on you.
Also, in the words of dhh (fist bump if you know who I mean), I'm a R-rated Individual. You're all junior level students in a CSE curriculum, i.e. mature adults.
If you're easily offended, you may not like me. Your call.
I've gone back and forth about laptops in class. Final decision: No Internet. I know that when I'm not engaged, the first thing
I do is go to Facebook/check my e-mail. It's natural. But I'm an asshole. This is a wi-fi jammer. When we're in class this is on.
I will also be walking around the room. If you're on Minesweeper or watching something else, I'll say "thanks for coming. We'll see you next week."
No phones, obviously.

Grading
- You will be graded based on your contributions to the project. Each of you will be expected to contribute in every step of the way.
For the project, you will have to prepare:
-- A functional spec (no dated SRS documents here. We're going Agile with something similar to the Spolsky document)
-- A set of UML design diagrams (Class, Use Case, possibily Activty)
-- On Sunday night every week I will be checking out your code from source control and reviewing your progress.
You will be graded based on your NON-TRIVIAL commits. All of you will be expected to write both tests and feature code.
-- You will write a few short essays. You will write reflections on The Mythical Man Month, The Pragmatic Programmer,
and you will produce critiques on one another's designs and other work artifacts. #protip: "It's cool" won't cut it.


Read the whole Mythical Man Month in a week? Yeah buddy. Honors students in the liberal arts get asked to do that all the time. If you're going to be a professional
Computer Scientist you should be at least as smart as some pretentious kid studying ancient Greek literature that sips lattes and reads the New York Times daily.

"You don't snuggle with Max Power! You STRAP YOURSELF IN AND FEEL THE Gs!" -- Homer Simpson
...buckle up, baby. >:D