Commit 34ddbb14 authored by Florian Moser's avatar Florian Moser
Browse files

Finish project management course

parent 75e76204
......@@ -53,4 +53,193 @@ blockquote > *:last-child {
.color-red {
color: red
}
\ No newline at end of file
}
.ml-2 {
margin-left: 2em
}
.inverted {
background-color: black;
color: white;
}
.pyro > .before, .pyro > .after {
position: absolute;
width: 5px;
height: 5px;
border-radius: 50%;
box-shadow: -120px -218.66667px blue, 248px -16.66667px #00ff84, 190px 16.33333px #002bff, -113px -308.66667px #ff009d, -109px -287.66667px #ffb300, -50px -313.66667px #ff006e, 226px -31.66667px #ff4000, 180px -351.66667px #ff00d0, -12px -338.66667px #00f6ff, 220px -388.66667px #99ff00, -69px -27.66667px #ff0400, -111px -339.66667px #6200ff, 155px -237.66667px #00ddff, -152px -380.66667px #00ffd0, -50px -37.66667px #00ffdd, -95px -175.66667px #a6ff00, -88px 10.33333px #0d00ff, 112px -309.66667px #005eff, 69px -415.66667px #ff00a6, 168px -100.66667px #ff004c, -244px 24.33333px #ff6600, 97px -325.66667px #ff0066, -211px -182.66667px #00ffa2, 236px -126.66667px #b700ff, 140px -196.66667px #9000ff, 125px -175.66667px #00bbff, 118px -381.66667px #ff002f, 144px -111.66667px #ffae00, 36px -78.66667px #f600ff, -63px -196.66667px #c800ff, -218px -227.66667px #d4ff00, -134px -377.66667px #ea00ff, -36px -412.66667px #ff00d4, 209px -106.66667px #00fff2, 91px -278.66667px #000dff, -22px -191.66667px #9dff00, 139px -392.66667px #a6ff00, 56px -2.66667px #0099ff, -156px -276.66667px #ea00ff, -163px -233.66667px #00fffb, -238px -346.66667px #00ff73, 62px -363.66667px #0088ff, 244px -170.66667px #0062ff, 224px -142.66667px #b300ff, 141px -208.66667px #9000ff, 211px -285.66667px #ff6600, 181px -128.66667px #1e00ff, 90px -123.66667px #c800ff, 189px 70.33333px #00ffc8, -18px -383.66667px #00ff33, 100px -6.66667px #ff008c;
-moz-animation: 1s bang ease-out infinite backwards, 1s gravity ease-in infinite backwards, 5s position linear infinite backwards;
-webkit-animation: 1s bang ease-out infinite backwards, 1s gravity ease-in infinite backwards, 5s position linear infinite backwards;
-o-animation: 1s bang ease-out infinite backwards, 1s gravity ease-in infinite backwards, 5s position linear infinite backwards;
-ms-animation: 1s bang ease-out infinite backwards, 1s gravity ease-in infinite backwards, 5s position linear infinite backwards;
animation: 1s bang ease-out infinite backwards, 1s gravity ease-in infinite backwards, 5s position linear infinite backwards; }
.pyro > .after {
-moz-animation-delay: 1.25s, 1.25s, 1.25s;
-webkit-animation-delay: 1.25s, 1.25s, 1.25s;
-o-animation-delay: 1.25s, 1.25s, 1.25s;
-ms-animation-delay: 1.25s, 1.25s, 1.25s;
animation-delay: 1.25s, 1.25s, 1.25s;
-moz-animation-duration: 1.25s, 1.25s, 6.25s;
-webkit-animation-duration: 1.25s, 1.25s, 6.25s;
-o-animation-duration: 1.25s, 1.25s, 6.25s;
-ms-animation-duration: 1.25s, 1.25s, 6.25s;
animation-duration: 1.25s, 1.25s, 6.25s; }
@-webkit-keyframes bang {
from {
box-shadow: 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white; } }
@-moz-keyframes bang {
from {
box-shadow: 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white; } }
@-o-keyframes bang {
from {
box-shadow: 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white; } }
@-ms-keyframes bang {
from {
box-shadow: 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white; } }
@keyframes bang {
from {
box-shadow: 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white, 0 0 white; } }
@-webkit-keyframes gravity {
to {
transform: translateY(200px);
-moz-transform: translateY(200px);
-webkit-transform: translateY(200px);
-o-transform: translateY(200px);
-ms-transform: translateY(200px);
opacity: 0; } }
@-moz-keyframes gravity {
to {
transform: translateY(200px);
-moz-transform: translateY(200px);
-webkit-transform: translateY(200px);
-o-transform: translateY(200px);
-ms-transform: translateY(200px);
opacity: 0; } }
@-o-keyframes gravity {
to {
transform: translateY(200px);
-moz-transform: translateY(200px);
-webkit-transform: translateY(200px);
-o-transform: translateY(200px);
-ms-transform: translateY(200px);
opacity: 0; } }
@-ms-keyframes gravity {
to {
transform: translateY(200px);
-moz-transform: translateY(200px);
-webkit-transform: translateY(200px);
-o-transform: translateY(200px);
-ms-transform: translateY(200px);
opacity: 0; } }
@keyframes gravity {
to {
transform: translateY(200px);
-moz-transform: translateY(200px);
-webkit-transform: translateY(200px);
-o-transform: translateY(200px);
-ms-transform: translateY(200px);
opacity: 0; } }
@-webkit-keyframes position {
0%, 19.9% {
margin-top: 10%;
margin-left: 40%; }
20%, 39.9% {
margin-top: 40%;
margin-left: 30%; }
40%, 59.9% {
margin-top: 20%;
margin-left: 70%; }
60%, 79.9% {
margin-top: 30%;
margin-left: 20%; }
80%, 99.9% {
margin-top: 30%;
margin-left: 80%; } }
@-moz-keyframes position {
0%, 19.9% {
margin-top: 10%;
margin-left: 40%; }
20%, 39.9% {
margin-top: 40%;
margin-left: 30%; }
40%, 59.9% {
margin-top: 20%;
margin-left: 70%; }
60%, 79.9% {
margin-top: 30%;
margin-left: 20%; }
80%, 99.9% {
margin-top: 30%;
margin-left: 80%; } }
@-o-keyframes position {
0%, 19.9% {
margin-top: 10%;
margin-left: 40%; }
20%, 39.9% {
margin-top: 40%;
margin-left: 30%; }
40%, 59.9% {
margin-top: 20%;
margin-left: 70%; }
60%, 79.9% {
margin-top: 30%;
margin-left: 20%; }
80%, 99.9% {
margin-top: 30%;
margin-left: 80%; } }
@-ms-keyframes position {
0%, 19.9% {
margin-top: 10%;
margin-left: 40%; }
20%, 39.9% {
margin-top: 40%;
margin-left: 30%; }
40%, 59.9% {
margin-top: 20%;
margin-left: 70%; }
60%, 79.9% {
margin-top: 30%;
margin-left: 20%; }
80%, 99.9% {
margin-top: 30%;
margin-left: 80%; } }
@keyframes position {
0%, 19.9% {
margin-top: 10%;
margin-left: 40%; }
20%, 39.9% {
margin-top: 40%;
margin-left: 30%; }
40%, 59.9% {
margin-top: 20%;
margin-left: 70%; }
60%, 79.9% {
margin-top: 30%;
margin-left: 20%; }
80%, 99.9% {
margin-top: 30%;
margin-left: 80%; } }
\ No newline at end of file
......@@ -44,7 +44,7 @@ Nearly universally referenced issues:
- Inaccurate estimates
- Unexpected risks
[Source 1](https://www.atspoke.com/blog/it/reasons-for-it-project-failure/), [Source 2](https://www.orellfuessli.ch/shop/home/artikeldetails/ID39325699.html), PMO Survey 2020
[Source 1](https://www.atspoke.com/blog/it/reasons-for-it-project-failure/), [Source 2](https://www.orellfuessli.ch/shop/home/artikeldetails/ID39325699.html), [Source 4](https://www.gartner.com/en/documents/2892218), PMO Survey 2020
<img src="images/project-fail-reasons.png" width="100%">
......@@ -158,13 +158,22 @@ Projects: https://famoser.ch/
---
# Targets of this course
# This course
**Know what makes a good project.** High-level view about a suitable environment for you and your project.
Parts:
- **Know what makes a good project**: High-level view about a suitable environment for your project.
- **Plan a successful project**: How to create a convincing project plan.
- **Execute a successful project**: How to execute & finish your project.
**Plan a successful project.** How to create a convincing and actionable project plan.
**Execute a successful project.** Concrete resources how to execute and finish a project.
Targets:
- You can detect favorable environments for projects
- You feel confident estimating features
- You can create a realistic project schedule
- You can finish a project
- on time
- within budget
- within schedule
- which satisfies customer expectations.
---
......@@ -207,7 +216,7 @@ stakeholder(s):
- have realistic expectations?
- personally support with time and money?
> E-Learning Platform
> E-Learning Platform.
---
......@@ -240,12 +249,15 @@ class: center, middle
Steps:
- Understand problem to be solved
- Develop solution concepts
- Formulate requirements
- Estimate cost, reward
- Schedule implementation
- Analyse risks
- Feedback & repeat
> Target: Avoid as much work as possible while still solving the problem.
Reduced uncertainty as much as possible?
Contract with customer & start!
......@@ -261,40 +273,112 @@ Listen carefully:
- Proposed solutions
- Tedious tasks (=sucks)
You task is to solve their *problem*.
---
# Formulate requirements
Decompose concept to suitable abstraction level.
functional & non-function requirements
Decompose concept to suitable abstraction level.
Do not neglect non-functional requirements (performance, usability, ...).
YAGNI: Effort increases in O(exponential) due to complexity.
YAGNI: You Ain't Gonna Need It.
**Effort increases in O(exponential) due to complexity.** (*baseless claim alert*)
<img src="images/effort_increases_exponential.png" width="30%">
<img class="ml-2" src="images/effort_increase_with_new_feature.png" width="30%">
<img src="images/effort_increases_exponential.png" width="50%">
---
# Estimate requirements
Cannot predict the future -> how to estimate cost?
Can estimate relative complexity!
Cannot predict the future, but **can estimate relative complexity**.
Technology / mastery independent!
Tips:
- Use coarse-grained numbers (Fibonaccy; 1 1 2 3 5 8 13 ...)
- With more unknowns, tend to increase complexity
Same for rewards.
Reward / Complexity = Payoff.
| Feature | Complexity | Reward | Payoff |
| :------ | ---------: | -----: | -----: |
| Sign-Up | 8 | 5 | 0.625 |
| Confirm E-Mail | | | |
| Login | | | |
| Password Recover | | | |
| Add Additional E-Mails | | | |
technology / mastery independent
---
# Estimate requirements
Tipps:
- Use coarse-grained numbers (Fibonaccy)
Cannot predict the future, but **can estimate relative complexity**.
Technology / mastery independent!
Tips:
- Use coarse-grained numbers (Fibonaccy; 1 1 2 3 5 8 13 ...)
- With more unknowns, tend to increase complexity
Same for rewards.
Reward / Complexity = Payoff.
| Feature | Complexity | Reward | Payoff |
| :------ | ---------: | -----: | -----: |
| Sign-Up | 8 | 5 | 0.625 |
| Confirm E-Mail | 13 | 3 | 0.23 |
| Login | 5 | 8 | 1.6 |
| Password Recover | 21 | 5 | 0.24 |
| Add Additional E-Mails | 21 | 3 | 0.14 |
---
# Schedule implementation
Combine features into sensible packages.
Resolve dependencies.
Decide upon milestones (properly spaces, measurable).
Convert complexity into implementation effort.
| Feature | Complexity | Expected | Measured |
| :------ | ---------: | -------: | -------: |
| Sign-Up | 8 | - | 3h |
| Confirm E-Mail | 13 | 5h | ? |
| Login | 5 | 2h | ? |
| Password Recover | 21 | 8h | ? |
| Add Additional E-Mails | 21 | 8h | ? |
Multiplication factors:
- Technology (low for established, high for often changing)
- Complexity (increasing factor with more total features)
- Special requirements (translatable, performance, ...)
> 26h \* 1.1 (PHP only) \* 1.1 (translatable) = 31.5h
> 26h \* 1.5 (PHP + JavaScript frontend) \* 1.1 (translatable) = 43h
---
# Schedule implementation
Combine functionality into **features** (=sensible packages).
Resolve dependencies & reduce uncertainty.
> Login 31.5h
> Submit vote 23h
> Electionsmanagement 10h
> Candidatemanagement 16.5h
> Vote count 8.5h
**Milestones** should be properly spaced & measurable.
> 1. Deployment of skeleton to server
> 2. Public voting area
> 3. Administration area
> 4. Feedback of trial election processed
---
......@@ -302,9 +386,9 @@ Decide upon milestones (properly spaces, measurable).
For overall project & for each feature collect risks.
> Users prefer different tool
> Team-member quits project before completion
> Server too slow for estimated data size
> Compromise of election data
> Users reject tool due to security reasons
> Server deployment too constrained
For each risk:
- Avoid: Eliminate the risk (avoid feature / use different solutions)
......@@ -317,102 +401,126 @@ For each risk:
# Contract
Formulate a constract about the project.
Formulate a contract.
Content:
- Vision ("Sales-pitch")
- Requirements on suitable abstraction level
- Schedule & Milestones
- Price & Payment agreements
- Legal: Intellectual Property, Bugfixing, Maintenance
- (Maintenance for 10% - 20% yearly effort)
Advanced:
- Recommend options based on payoff
- Maintenance for 10% - 20% yearly effort
- Legal: Intellectual Property, Bugfixing
Courses:
- [E-Business Recht](http://www.vvz.ethz.ch/Vorlesungsverzeichnis/lerneinheit.view?lerneinheitId=139975&semkez=2020W) (HS)
- [Contract Design](http://www.vvz.ethz.ch/Vorlesungsverzeichnis/lerneinheit.view?lerneinheitId=141671&semkez=2020W) (HS)
- [Introduction into Negotiaton](http://www.vvz.ethz.ch/Vorlesungsverzeichnis/lerneinheit.view?lerneinheitId=135075&semkez=2020S) (FS)
- [Introduction into Negotiation](http://www.vvz.ethz.ch/Vorlesungsverzeichnis/lerneinheit.view?lerneinheitId=135075&semkez=2020S) (FS)
**Up until now, an estimated 10 - 30% of total project effort has been spend!**
---
Do not work for free: For bigger projects, sell requirements engineering or proof of concept.
# Value of a good plan
---
**Up until now, an estimated 10 - 30% of total project effort has been spend!**
Is it worth it?
class: center, middle
Yes!
- Align expectations (cost, schedule, result)
- Decrease cost by not implementing lower-value features
- Decrease risk of project failure
# Execute a successful project
It feels good:
- Make promises you can keep
- Customers / Users will be satisfied (and so will you!)
- You get done, get payed and move on.
<i>No surprises.</i>
*Hint: You can also sell this work as "requirements engineering" or "proof of concept"*.
---
# Review progress & risks
class: center, middle
# Execute a successful project
Take corrective action early
<i>Core idea: No surprises.</i>
---
# Manage expections
# Continuous tasks
You're 1# job!
*manage expectations*. Keep customer up to date with relevant developments. Incorporate doubts, recent developments and feedback
Communicate progress to stakeholders.
> "The milestone is completed, and the next meeting can go along as planned."
> "Next big maintenance will be completed in 8 months."
---
*track progress*. Check if estimation matches measurements, and high-risk tasks proceed as expected. Take corrective action as early as sensible!
# Manage changes
> Substantial increase in effort for feature: Systematic or one-time?
> High-risk tasks: Solution in sight or stuck?
keep stakeholders informed
manage expectations
measure progress & react early
control change
control risks
*long-term planning*. Resolve dependencies for future tasks.
> Hosting is ready in one week; delivery is due in two months. Hence can schedule meeting in four weeks to get feedback for final product.
---
# Rollout
incremental updates & releases help to adapt rapidly (saving time with shortcuts, skipping unneeded functionality, improving through early feedback)
big bang is more efficient with no unknown unknowns (the longer the project, the smaller the chance)
Strategies:
- **Incremental**: Multiple releases, i.e. for each feature. *Additional effort due to shims for future features / release tasks.*
- **Big Bang**: Single release at the end. *No feedback till the end*.
maintenance needs to be considered
**Incremental updates usually beats Big Bang**: The earlier issues are found / feedback is incorporated, the cheaper it is.
<hr/>
---
Changing `person.gender` from `Boolean` to `Text`:
# Getting it Done
| Start | End |
| :------ | ---------: |
| Add field to table | Add field to table |
| | Find all usages of field |
| | Re-understand how and why it is used |
| | Find new solution & adapt code |
| | Re-test usage & all related features |
getting it done
bugs after launch
---
class: center, middle, inverted
# After the project
<div class="pyro">
<div class="before"></div>
<div class="after"></div>
</div>
# Done!
---
# during project
class: center, middle
continuously overview risks
manage cost
manage expectations
# Some closing notes
---
# About changes
Changes happen: Deal with it.
Changes happen, deal with it.
Proposals:
- Incorporate in project execution plan.
- Clarify expectiations.
- Finish (sub-)projects quickly.
- Define how & when changes are applied (and who pays for it).
Tools:
- Schedule features early with uncertainty.
- Explicitly acceptance test features / milestones.
- Clarify expectations (changes in cost / schedule).
- Define process how & when changes are applied (and who pays for it).
Baseless claim: Ignoring change requests is as much a project failure as unapproved delays / cost overruns over it.
---
# About people
People are strange, but predictable.
Important factor of project not in your control!
Get to know all involved persons:
- Motivation (agenda?)
......@@ -422,56 +530,76 @@ Get to know all involved persons:
Likely True Facts About People™:
- People are predictable
- People can't be changed
- People change very slowly (too slow for your project)
- People are good (or at least persuade themselves that they are)
Analysis approaches: [4 Colors](https://www.thecolourworks.com/insights-discovery-colour-types-guide/), [Big 5](https://www.simplypsychology.org/big-five-personality.html), [16 Personalities](https://www.16personalities.com/) (*(un)soundness alert*)
---
# About bad people
# Getting it done
With some, you will not get along!
*Getting it done* is hard!
- Tedious tasks procrastinated till the end
- Some level of perfection needs to be reached
- Bugs right before / immediately after launch likely
Powerful combination:
- Ignorance (don't care about everybody their work affects)
- Incompetence (don't have relevant experience)
- Arrogance (don't consider inputs)
- Rhetorics (can defend their shortcomings)
Why most private projects never finish...
Options:
- Fight (usually a bad idea)
- Co-exist (sometimes not possible)
- Run (sometimes required)
Tools:
- Assign buffer before release to get it down
- Keep days around release free
- Rollout incrementally to reduce severity of effects
- Set expectations of customer over risk of release
---