Wednesday, March 23, 2011

CSE360 syllabus rev 0.2

Introduction to software engineering topics outline:
8 weeks

Schedule:
week 1: History (Read : The Mythical Man Month. 5 page reports due class 1 next week )
-- 1960s : We Have a Problem...60% of software fails.
-- 1970s : Focus on Process! (origins and evolution of project management.)
-- 1980s : Focus on tools! (Rational Rose, code generation)
-- 1990s : Focus on People! (Agile Manifesto. Evolution of WWW. .Com bubble)
-- 2000s : Focus on evolution! (frameworks, design patterns, continuous integration, source control becomes standard, the software craftsman movement)
-- 2010s : The Brave New World (Mobile, Mesh, Cloud, etc)

Case studies/scenarios
Therac-25
Nasa Rover
Google
Windows Vista

week 2: Process models, Testing (TDD, Unit, Functional) introduce project
(Read : The Pragmatic Programmer. 5 page reports due class 1 next week )

Introduce Agile methodology.
Discuss project.
Introduce a "Planning Game"
Introduce NUTs (Nebulous Units of Time -- brief discussion on estimation techniques)
Introduce Source control, CI, bug tracking, and deployment process
Form teams
Extra topics:
"a discussion and discourse of how to build software from start to finish. Various topic matter falls under this umbrella which includes"
* CMMI
* ISO/IEEE process standards
* Software Metrics
* Analyzing/Managing/Mitigating Risk"


week 3: Source Control tools (versioning, continuous integration) form teams
Team led tutorial setup of :
Mercurial
SVN (can use Google Project Hosting or local box for tutorial. Project Hosting required for course)
Git (GitHub)
Tutorial about the source control methodologies themselves:

In class Flame War/Debate
This is an activity where the groups that researched the source control tools will lead an argument as to why it's obviously better and more correct than yours
Iteration 1:
Implement "Hello world"
Add authorization and authentication

week 4: Requirements analysis (BDD, TDD, Mock Objects, CRC cards, Joel on Software Functional Specs)
Discussion of TDD/BDD/Domain Driven Design
Discussion of SRS/Functional Spec/CRC cards
Flame War/Debate
This is an activity where the groups that researched the functional requirements methodologies will lead an argument as to why it's obviously better and more correct than yours

Iteration 2:
Implement functional spec

Write behavioral tests using mock objects for domain model that stores teachers, students, and profiles (easyb)

Write unit tests for CRUD teachers, students, profiles. Users can modify own profile but not other profiles. Admin can modify all.

week 5: Design (UML, design patterns, MVC)
Discussion of basic UML (class diagram, activity diagram, sequence diagram)
Discussion of Design Patterns
-- Group Led Presentations on
Strategy
Factory
Template Method
Observer
Command
-- I will discuss
Decorator
Mediator
Facade
Software Architecture -- Pipe & filter, Blackboard, MVC

Iteration 3: revise domain model.
Add lessons and scheduling.
Refactor standard grails views to use AJAX.
Develop different compensation Strategies (pay in full before session.Pay half up front half after. Pay all after)
Develop a Lesson Factory
Use Command Objects to encapsulate validation and pass parameters to controllers

week 6 & 7: Implementation (In class pairing sessions. We may get a lab. Otherwise, bring your laptops!)
Extreme Programming/Scrum/Lean
Self documenting code
red light/green light/refactor/repeat
code analysis (CodeNarc)
Documentation (Doxygen)

Iteration 4:
Integrate 3rd party plugins to add
Audit Logging
Full-text Search for lesson material, profile content
Graphs and charts for teachers to see number of students / week, number of lessons / month, revenue made, time spent
Investigate use of external solutions to integrate real-time chat functionality
Red5, Adobe Air, OpenLazlo, others?

week 8: Testing of other team's projects / wrap up
Security penetration Testing
Load Testing
other misc topics...


Textbooks / Resources:
-- Fred Brooks The Mythical Man Month (Required)
-- Dave Hunt and Andy Thomas The Pragmatic Programmer (Required)
-- Grails in Action (Optional)
-- 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 to be awesomesauce instead of Lame McSlame:
-- Patterns of Enterprise Application Development by Martin Fowler
-- Refactoring by Martin Fowler, Kent Beck, et al
-- Design Patterns by GoF
-- Test Driven Development by Kent Beck
-- Clean Code by Robert Martin
-- Domain Driven Design by Eric Evans

Contrast to traditional CSE360 courses:
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 ChatRoulette.


-- 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 code analysis tools to diagnose implementation issues.

You will use a continuous integration server environment. Jenkins http://jenkins-ci.org/

You will deploy new stable versions of the application "to production" every week.

Your code will be reviewed. I will savagely hunt down lame code form the depths of obscurity and shine the light of critique on it. Every time you write dirty.hack I expect a multi-line comment apologizing for it and rationalizing why you had to do it that way. The codebase itself better not be a patchwork set of hacks. We're practicing the Pragmatic CARE About Your Craft in this course.

My goal is for you to be able to walk into a job interview and impress the hell out of your interviewers.

I want you to know all of the latest and greatest technologies, likely know at least some of the tools they're already using, and have some insights and ideas about how they could do things better based on the current state of best practices as identified by your studies.


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.

Disclaimer:
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. 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
- The class grade comes out of 1000 points.
- 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) 200 pts
-- A set of UML design diagrams (Class, Use Case, possibily Activty) 200 pts
-- On Sunday night every week I will be checking out your code from source control and reviewing your progress.

400 pts / 8 wks = 50 pts / week.
10 pts/ feature spec.
10 pts for test.
10 pts for implementation.
10 pts for analysis.
10 points for refactoring (optimization for performance, clarity, elegance. Adequate documentation on code produced)

You will be graded based on your NON-TRIVIAL commits. All of you will be expected to write tests, design, feature code, and documentation.
-- 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.

200 pts = 2 x 100 pts essays (The Mythical Man Month and The Pragmatic Programmer)
100 pts / 8 wks = 20 pts / week (collaborative code review/critique/analysis)
(>_>)..."wait a minute", you say, "20 pts / week != 100 pts!"
Correct. This is why I'm a Software Engineer, not a Theoretical Computer Scientist. I can't do math.

...Actually, it's because critique and analysis are higher order cognitive functions.
Novices/Advanced Beginners will struggle with this, but this is how we ascend Bloom's Taxonomy and acheieve expertise.
You are not experts. But you can try hard. Hopefully, in those attempts you will create new neural pathways and channel into some Higher Order Ideas.
But you're not expected to blow me away, though I always respond well when I am blown...away.
...(In other words: PSSST, THERE'S EXTRA CREDIT HERE)


Read the whole Mythical Man Month in a week? Then the whole Pragmatic Programmer the week after? 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. ;P
(Relax, I'm just teasing! We all love hipsters/'anti-hipster intelligentsia' with their little chai tea lattes, Apple products, and panache for pretty services like Facebook and tumblr. )

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