Complexity Multipliers
Jason Felice
@eraserhd
Tuesday, August 27, 13
Act I: Models
Tuesday, August 27, 13
How to Understand Things
Stolen from Gerald Weinberg
Tuesday, August 27, 13
“Complexity”
Tuesday, August 27, 13
Complexity Multiplier
• A change which increases the cost of future
activities.
Tuesday, August 27, 13
• 50 Tasks
• Average task takes 5 days, normally
distributed, with a deviation of 2 days
A Really Simple Model
Tuesday, Au...
Tuesday, August 27, 13
• 50 Tasks
• Tasks start as an average of 5 days with
about 2 day deviation
• Each task accrues a 1% complexity
multiplier...
Tuesday, August 27, 13
• 50 Tasks
• Tasks start as an average of 5 days with
about 2 day deviation
• Each task has a 10% probability of incurring...
Tuesday, August 27, 13
Tuesday, August 27, 13
From Mythical Man Month, Fred Brooks
Tuesday, August 27, 13
Act II: Conflict
Tuesday, August 27, 13
A task can almost always be
completed more quickly by
ignoring its effect on the
complexity of the system.
The Trade-Off
T...
“Let’s Maintain Two”
• Code modules
• Git repositories
• Code paths
• Config files
Tuesday, August 27, 13
“A basic principle of data processing teaches
the folly of trying to maintain independent
files in synchronism. It is far ...
Stage Gates
• Sign-off required by another team
• Work required by another team
• Any process required for each task (or
g...
Communication
Tuesday, August 27, 13
FuzzyVersion Matching
• Package A: 2 point versions released
• Package B: 3 point versions released
• Package C: 2 point v...
Language Design
Tuesday, August 27, 13
(defvar foo 42)
(defun foo ()
79)
(defmacro foo ()
‘(* 7 9))
Tuesday, August 27, 13
(symbol-value ‘foo)
=> 42
(symbol-function ‘foo)
=> #<FUNCTION FOO>
; equivalent to #‘foo
(macro-function ‘foo)
=> #<FUNCT...
(setf ‘foo 24)
(setf
(symbol-function ‘foo)
#’(lambda () 26)))
(setf
(macro-function ‘foo)
#’(lambda (x) x))
Tuesday, Augu...
(let ((bar 5))
...)
(flet ((bar ()
6))
...)
(symbol-macrolet ((foo ()
‘(* 6 4)))
...)
Tuesday, August 27, 13
(let* ((bar 5)
(baz (* bar 2)))
...)
(labels ((bar ()
5)
(baz ()
(* (bar) 2)))
...)
; No equiv. for symbol-macrolet
Tuesda...
defun
defvar
defmacro
macro-function
symbol-value
symbol-function
let
let*
flet
labels
symbol-macrolet
macrolet
compiler-l...
define
let
let*
define-syntax
let-syntax
let-syntax*
Tuesday, August 27, 13
=
Tuesday, August 27, 13
(let ((x 5))
(labels ((somefn ()
...))
(let ((y 7))
(labels ((otherfn ()
...))
...))))
Tuesday, August 27, 13
(let* ((x 5)
(somefun (lambda () ...))
(y 7)
(otherfun (lambda () ...)))
...)
Tuesday, August 27, 13
x = 5
somefun = ...
y = 7
otherfun = ...
Tuesday, August 27, 13
Java
• int versus Integer
• int[] versus List<Integer>
• (autoboxing only works for simple types)
Tuesday, August 27, 13
In Node.js
• CPS-style functions versus regular functions
Tuesday, August 27, 13
Act III: Resolution
Tuesday, August 27, 13
Complexity Dividers
(or “Complexity Multipliers < 1.0”)
Tuesday, August 27, 13
Tuesday, August 27, 13
Tuesday, August 27, 13
Upcoming SlideShare
Loading in …5
×

Complexity Multipliers

381 views
324 views

Published on

Ever been on that project where you've been able to turn around a new feature inside an hour? And then the next project where it takes six weeks to turn around a feature that feels just about the same size? You rack your brain, and when you try to figure out why, all you come up with is small stuff. "Well, I guess we have to commit twice for a config change instead of once…"

I posit there are a class of things which are "complexity multipliers"–things which seem small, but when a few of them get together, they have a major impact on the velocity of the project.

The good thing is that complexity multipliers are easy to identify–if you know what you are looking for. They can be things inherent in the structure of the code, in the development process, in the development tools. I'd like to show you some graphs and some common examples and define a conceptual framework of how they affect projects.

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
381
On SlideShare
0
From Embeds
0
Number of Embeds
57
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Complexity Multipliers

  1. 1. Complexity Multipliers Jason Felice @eraserhd Tuesday, August 27, 13
  2. 2. Act I: Models Tuesday, August 27, 13
  3. 3. How to Understand Things Stolen from Gerald Weinberg Tuesday, August 27, 13
  4. 4. “Complexity” Tuesday, August 27, 13
  5. 5. Complexity Multiplier • A change which increases the cost of future activities. Tuesday, August 27, 13
  6. 6. • 50 Tasks • Average task takes 5 days, normally distributed, with a deviation of 2 days A Really Simple Model Tuesday, August 27, 13
  7. 7. Tuesday, August 27, 13
  8. 8. • 50 Tasks • Tasks start as an average of 5 days with about 2 day deviation • Each task accrues a 1% complexity multiplier - about 20 minutes on the first task A Better Model Tuesday, August 27, 13
  9. 9. Tuesday, August 27, 13
  10. 10. • 50 Tasks • Tasks start as an average of 5 days with about 2 day deviation • Each task has a 10% probability of incurring about 20% complexity (with a deviation of about 4%) A “Realistic” Model Tuesday, August 27, 13
  11. 11. Tuesday, August 27, 13
  12. 12. Tuesday, August 27, 13
  13. 13. From Mythical Man Month, Fred Brooks Tuesday, August 27, 13
  14. 14. Act II: Conflict Tuesday, August 27, 13
  15. 15. A task can almost always be completed more quickly by ignoring its effect on the complexity of the system. The Trade-Off Tuesday, August 27, 13
  16. 16. “Let’s Maintain Two” • Code modules • Git repositories • Code paths • Config files Tuesday, August 27, 13
  17. 17. “A basic principle of data processing teaches the folly of trying to maintain independent files in synchronism. It is far better to combine them into one file with each record containing all the information both files held concerning a given key.” – Fred Brooks (in 1975) Tuesday, August 27, 13
  18. 18. Stage Gates • Sign-off required by another team • Work required by another team • Any process required for each task (or group of tasks) to proceed Tuesday, August 27, 13
  19. 19. Communication Tuesday, August 27, 13
  20. 20. FuzzyVersion Matching • Package A: 2 point versions released • Package B: 3 point versions released • Package C: 2 point versions released • Total: 12 configurations Tuesday, August 27, 13
  21. 21. Language Design Tuesday, August 27, 13
  22. 22. (defvar foo 42) (defun foo () 79) (defmacro foo () ‘(* 7 9)) Tuesday, August 27, 13
  23. 23. (symbol-value ‘foo) => 42 (symbol-function ‘foo) => #<FUNCTION FOO> ; equivalent to #‘foo (macro-function ‘foo) => #<FUNCTION {...}> Tuesday, August 27, 13
  24. 24. (setf ‘foo 24) (setf (symbol-function ‘foo) #’(lambda () 26))) (setf (macro-function ‘foo) #’(lambda (x) x)) Tuesday, August 27, 13
  25. 25. (let ((bar 5)) ...) (flet ((bar () 6)) ...) (symbol-macrolet ((foo () ‘(* 6 4))) ...) Tuesday, August 27, 13
  26. 26. (let* ((bar 5) (baz (* bar 2))) ...) (labels ((bar () 5) (baz () (* (bar) 2))) ...) ; No equiv. for symbol-macrolet Tuesday, August 27, 13
  27. 27. defun defvar defmacro macro-function symbol-value symbol-function let let* flet labels symbol-macrolet macrolet compiler-let makunbound fmakunbound Tuesday, August 27, 13
  28. 28. define let let* define-syntax let-syntax let-syntax* Tuesday, August 27, 13
  29. 29. = Tuesday, August 27, 13
  30. 30. (let ((x 5)) (labels ((somefn () ...)) (let ((y 7)) (labels ((otherfn () ...)) ...)))) Tuesday, August 27, 13
  31. 31. (let* ((x 5) (somefun (lambda () ...)) (y 7) (otherfun (lambda () ...))) ...) Tuesday, August 27, 13
  32. 32. x = 5 somefun = ... y = 7 otherfun = ... Tuesday, August 27, 13
  33. 33. Java • int versus Integer • int[] versus List<Integer> • (autoboxing only works for simple types) Tuesday, August 27, 13
  34. 34. In Node.js • CPS-style functions versus regular functions Tuesday, August 27, 13
  35. 35. Act III: Resolution Tuesday, August 27, 13
  36. 36. Complexity Dividers (or “Complexity Multipliers < 1.0”) Tuesday, August 27, 13
  37. 37. Tuesday, August 27, 13
  38. 38. Tuesday, August 27, 13

×