30.3. Program Management¶
30.3.1. Program Management¶
30.3.1.1. Project Management¶
Project management is a skillIt has to be learnedIt has to be practicedAny skill-based class will typically grade you on processConsider taking a class to learn TennisThis semester, we will pay a lot of attention to your processWe are working on ways to grade process
30.3.1.2. Scheduling¶
Managing large-scale projects involves scheduling activitiesIt is human nature to work better toward intermediate milestones.The same concepts can/should be applied to mid-sized projects encountered in class.For any project needing more than a week to complete, break into parts and design a schedule with milestones and deliverables.Find some way to keep track of details.
Note
For me, programming takes a lot of focus and concentration. One concern for me is the many details to remember. I use "todo" lists a lot. I find things like the GitHub Issue Tracker invaluable for bigger projects (but that might be overkill for CS3114 class projects). The key thing is to write down any details that occur to you that you don't want to deal with right this instant.
30.3.1.3. Historical Data¶
30.3.1.4. Historical Data 2¶
Results were significant:90% of scores below median were students who did less than 50% of the project prior to the last week.Few did poorly who put in > 50% time earlySome did well who didn’t put in >50% time early, but most who did well put in the early time
30.3.1.5. Historical Data 3¶
Correlations:Strong correlation between early time and high scoreNo correlation between total time spent and scoreNo correlation between % early time and total time
30.3.1.6. What is the Mechanism?¶
Correlations do not necessarily mean causationDo they behave that way because they are good, or does behaving that way make them good?But, we have data from students who sometimes spread their work over time (and generally doing better) vs. doing work at the last minute (and generally doing worse)Why would this matter?Spreading projects over time allows the “sleep on it” heuristic to operateAvoiding the “zombie” effect makes people more productive (and cuts time requirements)
30.3.1.7. How to fail at implementing your project:¶
Write the projectDebug the project
30.3.1.8. How to succeed at implementing¶
Write the smallest possible kernelDebug that kernel thoroughlyRepeat until completion:Add a functional unitDebug the resulting programHave a way to track detailsDo mechanics earlyDo structural design before implementationImplement the tricky parts last
30.3.1.9. How to Survive¶
Keys to success:Keeping Track of all the detailsYou can't remember it allRational Planning (and keeping to the plan)Spread the work over timeIncremental DevelopmentInterleave writing and debugging
30.3.1.10. Being Organized 1¶
Software development has so many detailsSpec requirementsProgram interactionsSo does LifeAssignments and other things to do
30.3.1.11. Being Organized 2¶
You can't turn this on/offEither you get in the habit of developing in an organized way, or you can't succeed as a software developerPart of it is developing the attitude of "sweating the details"Part of it is having the coping mechanisms to handle the details (organizational tactics)
Note
The good news is that there is an alternative: there are plenty of jobs where someone will tell you what to do every minute of the day. The bad news is that they tend not to pay well. Many of these jobs involve hamburgers.
30.3.1.12. Memory Can't Handle It¶
ExternalizeTODO lists (What)Scheduling (The Plan for How)Issue trackersDocumenting/CommentingBe able to update lists at any time,Repository: GitHub
30.3.1.13. Spread Work Over Time¶
For anything beyond a small software project, you must have a plan/scheduleExplicitly develop a schedule:Break into pieces: List of subtasksDeadlines for subtasksRealistic, enough flexibility built inContinuously modify and refine the plan
30.3.1.14. Incremental Development¶
Break the project into a small initial coreImplement and TEST and COMMENT the coreThen gradually add functionalityOn any given day, write only as much code as you have time to debug THAT DAYThis works well with Scheduling and Organizing
Note
For our projects, you need implementation, comments, and tests. If you write the comments (especially javadoc comments) and the tests when you add a functional unit, its not that big a burden. If you add them at the end, it feels really tedious (and you don't get any of the benefits).
30.3.1.15. Milestones¶
Big positive effect with milestones (S16) vs without (F14)
A 43% 23% B 16% 22% C 11% 11% D/C- 8% 6% F 4% 5% Drop 19% 33%
30.3.1.16. Working with a Partner (1)¶
Typically, about half to 2/3 of students work with a partner.As a population, we cannot distinguish differences in performance in terms of score distribution between partnerships and singles.Data indicate that each member of partnership works about 80% as much as a person working alone.
30.3.1.17. Working with a Partner (2)¶
About 1/3 of partnerships end badly.The common complaint is one blaming the other for "letting me down".Two approaches:Divide and Conquer: BadExtreme Programming: Good
Note
Historically, about 1/3 of CS3114 partnerships have crashed-and-burned. The most common culprit appears to be that one person thought that the other person "let me down". This stems from (is even possible because of) lack of cohesiveness. Meaning: The did not work together.
Divide-and-conquer reduces to "throw it over the wall". Even if both parties hold up their end, this leads to inefficiencies in putting the pieces together. And its easier to work without design discipline. With two pairs of eyes on everything, quality is more likely.
Extreme Programming: Everything is done together. Design together. Code together. Debug together.
The one place where you might want to separate: "Tiger-team testing". Meaning, one person writes test cases for the other person's code.