Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

Also see [[AdvancedOptions]]
<div class='header' role='banner' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div id='mainMenu' role='navigation' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div id='displayArea' role='main'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected {color:[[ColorPalette::PrimaryDark]];
    border-left:1px solid [[ColorPalette::TertiaryLight]];
    border-top:1px solid [[ColorPalette::TertiaryLight]];
    border-right:1px solid [[ColorPalette::TertiaryLight]];
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
    border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
    border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
    border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
    #mainMenu .tiddlyLinkNonExisting,
    #sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0; padding-bottom:0;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox where print preview displays the noscript content */
<div class='toolbar' role='navigation' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
Professional development - week of July 27

!!! Html5 canvas
It's been interesting and somewhat challenging to get all this stuff running.  I don't feel like I've really improved my skill much, but I have definitely increased the breadth of my knowledge.  Not bad for a guy who couldn't really grok GWT a few years ago.

!!! Simplify and Explain
Enjoyed Beyer's session on the quick hit and getting the big idea out there.  Good advice I can use, like shut up after talking.  And I've latched onto this idea of trying to get other people to finish my sentences.  Too often I put all the words I can out there, like the best thing  the conversation can use is a "yup" or "that's pretty much it".

!!! Crucial conversations
Read ch8 and ch9.  The book has gotten much better.  Actionable things I can try - great!

!!! Deep Dive apprenticeship
Good session pulling the interviews into a cohesive framework.  Here are the "phases" and here's the goals for each.  Looking forward to next week when we try it out on Nick and Nicole's memory of past deep dives.
Professional Development:  Week of July 5

!!! Two stack overflow answers

Felt good to share some knowledge - mostly concerned that I spend a lot of time talking, far less time doing.

!!! Crucial conversations
Read ch4 and ch5.  Some of it really resonates, but most of it doesn't.

!!! Met with Euler
Enjoyed the conversation, but not sure what the goal is.  I'm sure I could use mentoring in the things Bill is good at.  How do I practice?

!!! Deep dive apprenticeship
Our current concern is understanding the flow and when to transition between stages of the deep dive.  This is somewhat frustrating because it seems  intuitive, so how can it be taught.  Additionally we're skipping over the easy productive work of making a playbook and focusing on the deeper issues which don't have clear solutions.  I'm going to concentrate on the pattern matching theory with regards to intuituion.  I feel like the right answer here is interviewing Nick and Nicole and getting them to focus a bit more on when they know enough is enough.  Our homework for this week was to think about the stages of a deep dive, which I think I have a handle on, but honestly have never paid much attention to.

Current frustration - how do I find more opportunities to practice?
!! What did I accomplish?
* Can't think of anything

!! What did I want to work on, but didn't?
* Just a vague desire to do something.  I've been wasting a lot of time lately.

!! What is still important?
* Hmmmm....

!! What did I waste time on?
*imgur, questionable content, twitter stalking.  Nothing useful.

!! What Did I Learn?
* My completionist tendencies are dangerous
* Started reading Thinking Fast and Slow.  Not sure I've learned anything yet, maybe I'm not paying attention?

!! Next week's experiment
* WIP limit on a project list?  So things move back and forth to someday maybe?
* Need some sort of heartbeat rule as well.  I don't want to fill a slot with somehing important but never worked on.
* I think there's something I'm missing.  Like my next action is too big?  Can I get to a 5 minute next action?  Then If I limit to 3 projects, that's 15 minutes a week.

!! What if?
* Thinking about talk ideas.  Don't feel like I have the experience to put it together.
!! What did I accomplish?
* Gave my vagrant talk!
* Met new people, got introduced to some new things
* Really excited about how awesome the conference was.  Great crowd, enjoyed talking to almost everyone.  Feel great.

!! What did I want to work on, but didn't?
* Pretty stoked that my talk got done.  Not much else to complain about.

!! What is still important?
* Need to upload my slides and tweet them out

!! What did I waste time on?
*Besides avoiding my talk for two months?

!! What Did I Learn?
* All sorts of cool stuff.  Hoping to come back and write much better cukes that are declarative and focused.  Want to play with the browser tools and  Maybe learn some cucumber-elixr?

!! Next week's experiment
* Maybe setup a projects list like David Allen talks about (note:  Find GTD book)

!! What if?
* I'm back to the place where giving talks sounds like a great thing.  But I know I still don't love putting them together.  So how can I make that less painful?
First try at weekly journaling.
!! What did I accomplish?
''How big should an accomplishment be?''
* Sorted out test data cleanup and got regressions back on track
* Started - did three exercises

!! What did I want to work on, but didn't?
I'm really disappointed about GiveCamp.  I wasn't assigned to a team and failed to find a way that I could be valuable (other than gofer).  I was hoping to give back or at least learn something.  All I really learned is that my skills don't translate well to throw up a webpage in 12 hours.  The worst part is I don't have any real interest in learning those skills - I don't care about static content and hosting.  I know I can contribute to open source, but at some level I want something I can point people to and say - 'I built that'.

I'm also not sure how to balance all the stuff I want to do.  I'd like to:

* Work out
* Get home early and play with Alec
* Let Laura sleep past 6am
* Have a productive day at work
* Learn something new
* Work on finances app (or other gem)
* Mentor someone
* Catch up on all the cool stuff other people are talking about
* Play basketball
* Do my other chores

That's like a 20 hour day.  And I want to do these things every day.  Oh and maybe do something mindless every once in a while

!! What is still important?
I really need to find a way to workout regularly.  It doesn't seem like it should be that hard to find 20mins a day to do a little cardio.

I also need to start on my vagrant talk.

!! What did I waste time on?
I tried to catch up on a number of internet things I had tagged to follow up on.  The javascript koans were largely a waste, as well as venkat's polyglot talk.  I'm really disappointed with screencasts and conf talks because they take up an hour where I have to pay pretty close information and I might get 5 mins of knowledge.  But I don't know until I put the time in and I'm such a completionist....I just don't know what to do.

!! What Did I Learn?
* PHP basics
** PHP isn't very interesting.  I shouldn't be afraid to jump into it, but given that people weren't knocking it out in 30 seconds, there's probably some subletly I don't understand.  Or my experience with other server-side scripting just makes it uninteresting?
* Intro to AntiFragile
** This is very cool.  Not sure what to do with it, as I'm tempted to draw conclusions that may or may not be the point.  Like tying TechSafety to AntiFragile - is a focus on safety the same thing as adapting to adversity?
* Intro to TechSafety
** Nice idea.  Not sure how to tie it back to the lean ux focused principles I'm also learning.  When is making quality the key driving focus useful for a startup situation?  I think some quality requires more strategic thinking than may be appropriate for a biz that needs to survive to next week.

* Tried
* function_module or module_function for static helpers

!! Next week's experiment
* Do 20 mins of cardio after work M-W.

!! What if?
What if I knew what to ask about?
Back fill off of notecard
!! What did I accomplish?
* First deep dive
* CleAg workshop
* Lightning talk

!! What did I want to work on, but didn't?
Better lightning talk.

!! What is still important?

!! What did I waste time on?
* TV
* Workshop slides

!! What Did I Learn?
* Talks take a lot of time
* I'm still scared of estimating
* Scared of making architecture decisions without trying things out

!! Next week's experiment
* Experiment with remote work

!! What if?
What if I could  work effectively from anywhere?
Mary Thorn

!! Case 1: Greenfield
* New project
* Made automation part of done
* PO wrote gherkin
* Dev/QA pair to get cuke ready before work started
* PO wanted to see cuke go green before accepting

!! Case 2: Backward Implementation
* Team was not building the correct thing
* Lots of rework
* No idea what QA was testing
* QA wrote gherkin
* QA sent feature files to DEV/PO to verify assumptions (probably not read)
* Developers write unit tests from feature files
* Manual testing of feature files
* Eventually got PO involved upfront (lots of begging)

!! Case 3:  Hybrid
* Waterfall project
* No colaboration
* Ineffective communication
* Crazy requirement specs
* No test automation
* Lots of issues
* BA wrote Acceptance Tests
* Discussion with Dev + QA
* Estimation based on feature file
* Devs code and handover
* Manual testing of cukes
* Decreased bugs SIGNIFICANTLY
Richard Lawrence

There are 2 kinds of weaknesses - opportunities for improvement, and those that teach us what the thing IS (what it is good for)

!!! Weaknesses
1.  Gherkin isn't a powerful language (No macros or loops)
* Good!  These things make for bad expressions (Cukes are meant to be read).
2.  I have to describe things in two places (Why can't I just put the english with the code - rspec)
* Separate things to TALK about vs implementation details
3. Step defs are global
* Forces you to use ubiquitous language
4. Regular expressions
* It's not that hard!
5. My stakeholders won't write feature files
* Don't let customers throw things over the wall
Christina Aldan

!! 5 tips
# Create space - Pause
# Shift Perspective
** If you can't see it from someone else's perspective, you are holding yourself back.
# Get curious
# Make a List
# Be engage-y

Starts with you - self-reflection
"You still have to show up"
Not talking about disconnecting - "I tried fake it or make it, it only works for two months.  You can't contain that crazy"

!!! Self assessment

!!! Behavioral Self Control

4 superpowers

//sounds like think feel act//

!!! Integrity
* How you behave when no one is watching.  How you do one thing is how you do anything.

Two thoughts:

Looking for an idol:  Realizes code is writing, good at empathy, codes 90% of the time while still being an influential and useful person, realizes coding is usually the least important thing, but has managed to get everything else right so that coding is joy.  Understands that being part of a team is teaching and knows how to present information in such a way that it's understood and need not be repeated.

Coding analogy

Eggs, steel blocks / rocket precision machinery, legos, new

Change language to one of budgets:  //I can afford to spend 2-3 days on this task//

* Parkinson's Law
** work expands so as to fill the time allotted
** "we need something in 2 days" leads to conversations about options

* Task -> Outcome
** Tasks in a plan usually lose sight of the desired outcome
** If we can't get done with this task in 3 days, "what can I give you instead?"
** Lets not argue over the fact that we're lousy at estimating

* Cost -> Value
* Estimates focus on cost and when they turn out to be wrong we focus on "broken commitments" rather than the value of doing this in the first place
* "If you always knew that this task would cost 2 weeks (revised estimate), would you have invested in it anyway?
Henry Ward - CEO eshares

!! How do I get employees to perform better?
Tell them what they are doing well
* Don't minimize their bad work, maximize their great work.
* Positivity creates more positivity

!! How do I give negative feedback?
By being curious
- Assume you hired rational human beings that want to do a good job - what's keeping them from doing it?
- Have a true curiosity for this - why did you do x?

!! How do I decide what to delegate?
Delegate the work you want to do
// I hate this, but realize it's the correct answer//

!! How should I prioritize?
Fix problems.  Then prevent problems.
"Sprint to the fires"

!! How should I grade employees?
Dont.  Teach them to self-evaluate.
Scoring is easy for orgs to sort and filter, but does the employees no-good.
Ask them how they think they're doing and then offer feedback on that.

!! When do I fire somebody?
When you know they can't succeed
- Do not build a case for firing (perf improvement plans)
- Do it swiftly and humanely

!! How do I fire somebody?
By apologizing for our failures
"Unless you were lied to, it is your fault you're firing him".  You either hired incorrectly or didn't support him, either way it's your fault.

!! Why can't I just tell people what to do?
Because the more responsibility you have, the less authority you have.
Employees don't have loyalty to you, they have loyalty to their immediate manager.
You need to work on influencing rather than commanding.

!! How do I know if I am a good manager?
Employees ask you for advice

!! How do I know if I have a good management team?
Shit rolls uphill.
If you delegate all the work you want to do, all you're left with is the stuff no one else wants to do.

The above shows the US East region in Ashburn, Virginia. It has five availability zones, and these are protected areas that are isolated from each other by a couple of kilometers and linked by high-speed, low-latency networks where synchronous replication is possible but there is enough geographic isolation that the odds of two availability zones (housing multiple copies of your data and applications) are very small. The AZ units are connected by optical fibers that use dense wavelength division multiplexing (DWDM) to transport packets between the AZs in the region, and in the case of US East, there are 82,864 fiber strands. The AZs are usually under 1 millisecond apart in terms of latency and are always less than 2 milliseconds apart; this speed is what allows for synchronous data replication, since committing data to a solid state drive takes 㠷ait for it 㠢etween 1 and 2 milliseconds.

Now, drill down into one availability zone. The datacenters inside the availability zones in US East are about a quarter of a millisecond apart on the network, and no datacenter spans more than one zone. In fact, as noted above, an AZ can have multiple datacenters, and in fact, US East appears to have ten datacenters even though the chart above says some AZs have as many as six DCs. There are redundant transit centers into the availability zones. So Amazon can lose a transit center and multiple AZs and everything keeps working.

A single datacenter has up to 102 Tb/sec of bandwidth allocated to come into it 㠦our times the aggregate inter-AZ bandwidth across the US East region, and Hamilton adds that the bandwidth inside the datacenter is 췩ldly higher�han this 102 Tb/sec.
Jerry D'Antonio

!! From Clojure
* Future
* Agent
** Queues up operations against a value

* hamster gem
** high-perf data structure - immutable

*thread_safe library
** threadsafe agent and hash.  Not immutable.

!! From javascript
* Promise

!! From java
** ScheduledExecutorService
** TimerTask

!! From erlang/scala
** Actor

!! From F#
** Functional actor style

!! From Erlang
** Supervisor

!! Concurrent gem
** has future
*** takes observer
** has agent
*** takes observer
** has promise
** has ScheduledTask
*** Written like a future / same API
** TimerTask
*** takes observer
** Actor
***Actor pools sharing a mailbox
** Channel
*** Functional actor
** Supervisor
*** Can add actors and timer tasks
Even after 15 years, there's a lot of zealotry around pair programming.  Opinions range from "I'd never work on a project that didn't pair" to "Pair programming?  You mean cluster disaster?".

!!! Issues
* Expert Beginner trap?
* Finding Mentors?

!!! Questions
* How do you know when you've "graduated from an apprenticeship?"
** Smooth transition to full-time work
** Consistently giving back and living up to it
** No longer focused on learning

* Where do I start?
** A fear / personality trait of knowing the whole thing
** Pick one!
** Control your curiosity

* Right tool for the job?
** Don't be afraid to experiment
Josh Sureth - Typesafe

Add more actors - fragment - to specialize information (scatter phase)
Gather phase - re-aggregate back up the heirarchical tree

It's cheap to make an actor - create a new actor to handle results (gatherer actor)

Scala - Akka - create lots of layers of actors to handle recovery and keep the core functional

Akka clustering - works a lot like Riak
 - Supports automatic cluster membership

Weird code
context.actorFor(rootactorpath(a) / "user" / "singleton" /"search-tree" )

Clustered routing options
Metrics based routing

- Partition state of the system into small pieces - improve concurrency
- Communicate with immutable messages
- Spawn new actors to track temporary state or do dangerous things - keeps the parent safe
- Design app as a topology
- Partition threads on the topoology
 ** Can do the same thing with roles - these 10 nodes are for incoming requests, these 20 nodes are for data processing, etc
 * Bubble errors on the topoloyg
* Keep singleton actors on the leader
* Avoid excessive inter-node messaging
 ** Use statistics based routing
 ** Fragment in 'large pieces'
* Allow time for cluster convergence and fault detection
 ** new nodes think they're the leader until they find out otherwise

Key Point - Design a system that can recover from failure (and be concurrent)
 * auto healing, auto

'' Links ''
Example code (clusters branch)
Sandi Metz - Ruby on Ales 2014

!! Squint test
* change in shape - conditionals
* change in color - multiple levels of abstraction

!! Making changes
Novices feel like they're not allowed to make classes

Feel like you can't create a 20 line class if there is already a 5000 line active record model.  Can you break the pattern without feeling bad?

Procedures are hard to change because there are no seams
- make a seam

!! Duplication is cheaper than the wrong abstraction
The 43 line if statement exists because someone picked an abstraction and got it wrong.  Don't reach too soon for an abstraction.
-- Don't DRY it up as soon as you see it

!! When Inheritance
Shallow and narrow
child uses all the parts of the parent
objects are leaves in the graph
"Duplication is far cheaper than the wrong abstraction"

Another directives presentation:

* Supporting IE7 in production!

Types of directives
* Behavioral
* Component

!! Component (templates)
ui-codemirror - angular directive to show code snippet in text area

 App.directive('hello', function() {
  return {
    template: 'hello!'

* Element based directives need a hack in IE8 earlier

* Use templateURL property instead of template to point to an html file
* Angular has a templateCache - used to avoid fetching templates.  Could also override the options.
* Uses grunt task that stringifies/minifies templates and puts it in the templateCache
* runs before compile time

!! Behavior

* The directives are using the same scope as the view
** You usually don't want this

!!! Isolate your scope
    App.directive('hampsterDanceIsolate', function() {
  return {
    restrict: 'EA',

    scope: {},

    controller: function($scope) {
      $scope.toggle = function() {
        $scope.animated = !$scope.animated;

    templateUrl: '/app/directives/hampster-dance.html'

* You can pass parameters to the isolated scopes
** This is object binding (two-way)
** use '='
App.directive('hampsterDanceIsolate2', function() {
  return {
    restrict: 'EA',

    scope: {
      animated: '='

    controller: function($scope) {
      $scope.toggle = function() {
        $scope.animated = !$scope.animated;

    templateUrl: '/app/directives/hampster-dance.html'
<input type="checkbox" ng-model="dance" />

<hampster-dance-isolate2 animated="dance"></hampster-dance-isolate2>

* Isolate scope string binding
** One way
** Use '@'
App.directive('interesting', function() {
  return {
    restrict: 'AE',

    scope: {
      'header': '@',
      'footer': '@'

    templateUrl: '/app/directives/interesting.html'

<div class="interesting-man">
  <img src="/img/man.jpg">
  <div class="header">{{header}}</div>
  <div class="footer">{{footer}}</div>

  header="I don't always write directives"
  footer="But when I do, I isolate my scope">

* Isolate Scope Function Binding
** Directive callsback
** Use '&'

* You can do optional and aliased bindings

!! Lifecycle
* ng-app triggers a "compile"  Go through the DOM and look for interesting directives
* You can override compile and link behavior in directives
* Compiling a directive happens once (and has a link function)
** Run-time modifications to a template
* Linking happens every time the directive is used
** On-load - modify elements and attributes

* This knowledge is important in testing
describe("hello directive", function() {
  var element, scope;

  function bootstrap($rootScope, $compile) {
    var html = "<div hello></div>";
    element = angular.element(html);

    var compositeLink = $compile(element);

    scope = $rootScope.$new();



  beforeEach(inject(function($rootScope, $compile) {
    bootstrap($rootScope, $compile);

  it("says hello", function() {

* This is essentially what ng-app does

* $digest
** Processes all of the watchers of the current scope (and it's children)
*** Has this expression changed?

* Angular knows that there's only 4-ish ways to change a page
** After a click for instance, angular calls apply

* $apply
$apply() pseudocode:
function $apply(expr) {
  try {
    return $eval(expr);
  } catch (e) {
  } finally {

** You use apply when you know something has changed (outside of angular) and angular needs to figure itself out
*** Say we get/cause an event?
App.directive('whatDoesTheFoxSay', function() {
  return {
    restrict: 'AE',

    link: function(scope, element, attrs) {
      scope.message = "What does the fox say?"; {

        scope.$apply(function() {
          scope.message = "Wa-pa-pa-pa-pa-pa-pow!";


    template: '<span>{{message}}</span>'

scope.$apply tells the watcher on the template to update

!! Recursion
* By default you can use recursive tags in a directive - stack overflow!
App.directive('tree', function(recursionHelper) {
  return {
    restrict: 'AE',
    scope: {
      nodes: '='

    compile: function(tElement) {
      return recursionHelper.compile(tElement);

    templateUrl: '/app/directives/tree.html'
  <li ng-repeat="(key, value) in nodes">
    <a ng-click="hide = !hide">{{key}}</a>
    <tree nodes="value" ng-hide="hide"></tree>
// Mark Lagendijk
App.factory('recursionHelper', function($compile){
  return {
    compile: function(templateElement){

      var contents = templateElement.contents().remove();
      var compiledContents;

      return function(scope, element){
          compiledContents = $compile(contents);

        compiledContents(scope, function(clone){

!! Transclusion
* Put my content in the directive
App.directive('panel', function() {
  return {
    restrict: 'AE',
    transclude: true,
    scope: {
      heading: '@'
    templateUrl: '/app/directives/panel.html'
<div class="panel panel-primary">

  <div class="panel-heading" ng-if="heading">
    <h3 class="panel-title">{{heading}}</h3>

  <div class="panel-body">
    <div ng-transclude></div>

<panel heading="Chuck Norris Facts">

      <li>First program was `kill -9`</li>
      <li>Throws exceptions across the room</li>
      <li>Can divide by zero</li>
      <li>Writes self-optimizing code</li>



!! Dependncies
!!! Dependent Directives
  <tab title="Double Rainbow">
    <img src="/img/double-rainbow.jpg" />
  <tab title="Star Wars Kid">
    <img src="/img/starwars-kid.jpg" />
  <tab title="Chocolate Rain">
      <img src="/img/chocolate-rain.gif" />

*Tabs need to tell a tab it's selected
* Tab needs to register itself with Tabs

!!!! Tabs
App.directive('tabs', function() {
  return {
    restrict: 'AE',
    transclude: true,
    scope: {},
    controller: function($scope) {
      $scope.tabs = [];

      $ = function(selected) {
        angular.forEach($scope.tabs, function(tab) {
          tab.selected = tab === selected;

      this.register = function(tab) {
<div class="tab-list">
  <ul class="nav nav-tabs">
    <li ng-repeat="tab in tabs" ng-class="{active:tab.selected}">
      <a href="" ng-click="select(tab);">
  <div class="tab-content" ng-transclude></div>
App.directive('tab', function() {
  return {
    require: '^tabs',
    restrict: 'AE',
    transclude: true,
    scope: {
      title: '@'
    link: function(scope, el, attr, tabsCtrl) {
    replace: true,
    templateUrl: '/app/directives/tab.html'
<div class="tab-pane"
John Lindquite jetbrains

Recommends putting properties inside models to avoid wiping out references (model.bacon, avengers.cast)

  $scope.myMethod = function(param) {

!!! ng-repeat
ng-repeat allows pipes to add filters (filter, orderby, limitBy etc)
pipes can be stacked
map a text-field input to a property and pipe into filters
you can add your own filters

    <li ng-repeat="member in avengers.cast">{{}}</li>

!!! ng-app
ties to ng-app "baconApp"


var app = angular.module= ("baconApp", [])

app.controller("BaconCtrl", function() {


!!! debugging

  //$0 is the currently selected element
  var s = angular.element($0)

Services treated as Singletons

app.service("AvengersService", function() {
  this.cast = data

!!! Resources

!!! Directives
allow to create tags based off templates
May not be useful, but been holding them for awhile
To show:

order by
e2e runner

List of devs with skills.  Skills are rated by aptitude and enthusiasm.
How to handle currently booked?  What-if scenarios?

http://localhost:8000/test/e2e/runner.html - Andy Hunt

Agile is not a sprint (series of sprints) or marathon - It's an obstacle course

!!Training for software obstacle course
!!! Grow Skills
* Learn a new programming language a year
* Write same program/function 3 different ways
* Strengthen where you are weak

!!! Develop Awareness
* Standup, Flow, Value
* Keep the conversation ALIVE
* Don't rely on static communication (documentation, backlog)

!!! Disposable Software (React to Change)
* Stop treating software as precious
* Wasting effort in maintainable, extensible, reusable - you can't predict this
* Put effort into making it replaceable
* Helps coupling, cohesion, encapsulation

''If you can't rip out every piece of the software easily, then the design sucks''

!! The principles are more important
But beginner's can't apply principles
They need to do the practices and follow the fine print to learn the principles
Following the fine print is hard, and seems to be pointless until you understand the principle

!! The problem
* One size DOES NOT fit all!
* Misunderstanding the practices and principles
* Little support for beginners
* No method for continuous learning (evolving the practices)
* Anyone who isn't a dev is ignored
* ''Agile methods haven't changed or adapted''

A development method is just a way of figuring out how to work together.  Everyone.
When is it ok to go beyond the rules?
When is a practice good?
Practice ''is different'' depending on your skill level.
No one else's experience is the same as yours.

!!! New method
* Be empirical
* Need different levels
** Beginners cannot self-reflect
* Sensitive to our cognitive limits
* Be inclusive and integrated (no us and them)

!! Pillars of Grows
# Skills Model
# Directed Empirical
# Inclusive (execs, users, etc)
# Self-determined (you decide what works)

!!! Skills Model (Dreyfus)
* Novice
** No experience
** Just want to accomplish a goal
** Just follow the rules
** Novices need steps
* Advanced Beginner
** Don't want the big picture
** Want small, frequent rewards
** Still based on rules
* Competent
** Building models
** Can troubleshoot
* Proficient
** Want to understand the big picture
** Don't like oversimplified explanations
** Looking for patterns
** Can now reflect and self-correct
* Expert
** Source of knowledge
** Work from intuition
** Performance is degraded if they actually follow the rules
** Knows what details are relevant and irrelevant
** Usually bad at explaining how they arrived at a decision

Skills model is not per person
** Novice at software development, expert at management, advanced beginner at process

!!! Directed Empiricism
* Make decisions and answer questions based on outcomes
** beware proxies(graphs), theories, estimates
* Feedback loops!
** Intentional, short, real-world, iterative, incremental, anti-fragile
* Don't change or adopt => experiment and adapt
** Need to put your egg in
** It's just an experiment
* Experiments should be:
** Cheap
** short-term (few weeks at most!)
** generate specific, measurable outcomes
** Conditions and outcomes must be agreed to by the team (all)
** No failures, just learning => data has been generated.

!!!! The key to writing software:  Is To Write Software
*''This is how to answer questions''
**Try a few and prototype
**Try a few and extrapoloate
**Stick it in front of users

Pick a tech stack:
We have three competing javascript frameworks.
Let's write hello world in each in one week and see which one we like.
Oh we can't do that.  #2 will take that long to set up.
That's a data point.

!!! Working on GROWS Method practices
* A playbook (Practices of an Agile Developer ?)
Testing clustring and DR software
If it hurts - do it HARDER
exercise, nutrition, healthcare
science vs engineers

Failure as a non-event
 - Risk + consequences

GameDays - google and amazon
Chaos Monkey, Chaos Gorilla, Latency Monkey

Evolve - discover weaknesses and adapt

Failure as an opportunity to learn
Blameless culture - Fear to innovate - if we're constantly changing and improving, we should fail alot, or we're not doing interesting experiments.

Antifragile talk - rather than trying to make arguments, how about posing hypotheses as questions?

TDD makes failure predictable.  DebugLaterProgramming is expensive and wasteful.  Which system is antifragile?  (Anti-fragile vs robust).

Unit tests as change enablers (vs quality control)
* Feedback
* No fear

!! Links
Past:  speakerdeck.smetz

''Mentor TODOs''
* New blog posts
* Nitpick exercism
* Kata Roman Numeral
* Sit down on website

''Think about''
* How do we build confidence in our tools?

* Pull request
* Nitpicks
* Building frontend

* Masonry vs other grid systems - Will took this one

* Unsure about tool selection
Deploying is a great experience
 * Feelings about going live:  nervous
 * Forgot things (links to pdfs from the old site) - had to scramble and fix

Dealing with frustration - sink or swim, being overwhelmed

Feelings on pairing more
 * Don't like working alone
 * It's hard to externalize thoughts

Preferred "owning" a "real" project to pairing more - wouldn't have changed anything
'' Mentor TODOs

'' Accomplishments

* OhioLink Deep Dive

'' Questions

'' Feeling
Juan Delgado

Driving mobile apps with BDD

Mocked Backend
* Sinatra on a hook
* Data in tag
* Assert against the app

Ruby Steps                 Java steps
        |                        |
Calabash            Instrumentation/Robotium
        |                        |
      iOS                   Android
Backlog stages
 - Freezer, Fridge, Ready to Cook

Backlog metrics
 - Group by types:  Features, Bugs, Technical

Account for all work - technical "stories" should be first class citizens
Backlog grooming is a three amigos type stuff:  Group of people pick apart a story
 - Starts with prioritized, well-defined work

Story:  Along with token for future conversation - A check for understanding

No predetermined roles in grooming meeting
Nicole and Paolo

muti-disciplinary collaboration
iterative delivery
focused on value

Deep dive - what does success look like writing exercise

Optimizely - A/B testing

Balancing with Clients presentation

* LeanStartup

!! Cornerstones
* How do we measure success?
* Learning over short-term value
* Customer feedback is king
* Experimentation/Feedback drives from the outside
* Experimentation/Collaboration drives from the inside

!! Customer Facing
* Reduce Requirements and Assumptions to Experiments
* Experiment _with_ customers to discover what they want
* Learning is more valuable than customers/revenue/growth - e.g. A/B pricing tests
** Testing/Action/Risk vs Analysis Paralysis/Arguing/Inaction
*Design Thinking = empathy + creativity + rationality
*User Stories as Market Validation Stories (Hypotheses)
** Reqt to Conversation:  Move from "system shall" to "we believe" to "as a, I want, so that"

  We believe that
        [building this feature]
        [for these people]
        will achieve [this outcome].

   We will know we are successful when we see
        [this signal from the market].

!! Team Focus
*Emphasis on Shared Understanding vs Deliverables
*Move from delivery of features (output) to business value (outcome)
** Focus teams on outcomes over impact
** Outcomes are less binary (not done/done vs "close enough")
* Work together / ignore roles
* Test Ideas Ruthlessly

!! Look out for
* Quality is defined by the  ''customer'' not the dev/engineer
** ComplexityInTheServiceOfQuality
*Vanity metrics vs actual use
** Does signing up for a service count as success?  Are they using it?  Will they spend money on it?

!! Product definition assumptions
* Who is our customer?
* What pain points do they have related to our product/service?
* What features are important?
* What is our differentiation?
* What is our business model?
Matt Wynne @mattwynne

!! Stage 1:  Burned Toast
# Programmers write bugs
# Testers find bugs
# PM prioritize bugs
# Prog fix bugs
# Goto 1

!! Stage 2: Auto Burned Toast
# Programmers write bugs
# Write automated tests
# Tests find bugs
# PM prioritize bugs
# Prog fix bugs
# Goto 1

!! Stage 3: 3 Amigos
# Team defines behavior
# Programmers write bugs
# Write automated tests
# Tests find bugs
# PM prioritize bugs
# Prog fix bugs
# Goto 2

!! Stage 4: Test First
# Team defines behavior
# Automated test for behavior
# Programmers make the tests pass
# Testers find missing scenarios
# Goto 2

''Now you're at BDD''

!! Stage 5:  Disillusionment
# Lots of scenarios
# Build takes ages
# Build normally broken
# Some scenarios flicker
# Poor/mixed readability
# I hate cucumber

** Test value peaks at the time the test is written and drops sharply thereafter
** You don't have to test at the UI - use hexagonal architecture
** Turn testing pyramid 90 degrees and expose more area to test
** Acceptance Tests do NOT have to be full-stack tests

!! Stage 6:  Transcendence
# Problem Domain is well understood by the team
# Solution models the problem well
# Clear architectural boundaries
# Fewer end-to-end tests
# Scenarios are readable
# More Fun!
David Girard (MSFT evangilist)

What does it mean to say "Best way to display data"?

'The visual display of quantitative information' - Tufte

Brain prefers light to dark better than red to green or whatever.

!!! Graphical Integrity
* Don't lie (Fox news!)
Lie Factor = Size of effect shown in graph / Size of effect in the data
14.8 = 783% / 53%

Be careful using 2d or 3d objects to represent 1d of data.  If the data increases 30% and you change the height of a 2D object by 30% you also grow it's width, making it a 900% change.

* Keep things proportion
* Use real dollars
* Provide context

!!! Data-Ink
* Bar charts tend to use a lot of ink to display very little data
* Remove metadata, lighten what is left.
* Iterate, removing things and see if it's "better"

!!! Data Density
* Don't be afraid of density
* small multiples
* spark lines
Ole Michaelis

Writing a parser almost entirely via function defintions.  Look, ma, no ifs!
Writing a binary parser in elixir is a perfect match! -
dnsimple/com/o/ole - free month of dnsimple

* Compression protocol for headers

static table + dynamic table of columns (keys) to values
2 = method: GET
19 = path (key only) then encode the value:  huffman('/resource')

dynamic table starts at 62
62 = user-agent:Mozilla/5.0

!!! dynamic table
* The dynamic table share between request cycles in a "connection"
* Also shared by streams in the connection
* This makes requests "un-stateless"

!!! pattern matching
x = 1
Looks like assignment
Is actually a pattern match
1 = x

!!! Binaries & Strings
* Strings are binaries
 defp parse(<< 1::1, rest::bitstring >>, headers, table) do
    { index, rest } = parse_int7(rest)
    hdr = Table.lookup(index, table)
    parse(rest, [hdr | headers], table)

This pattern matches a bye that starts with 1.  So this method handles all bytes that start with 1 (or maybe a byte stream since it's recursive)

# Figure 7: Literal Header Field with Incremental Indexing — New Name
  defp parse(<< 0::1, 1::1, 0::6, rest::binary>>, headers, table) do
    { name, rest } = parse_string(rest)
    { value, more_headers } = parse_string(rest)
    Table.add({name, value}, table)
    parse(more_headers, [{name, value} | headers], table)

This handles bytes that start with 01 (or maybe a byte stream since it's recursive)

defp parse(<< >>, headers, _), do: Enum.reverse(headers)

Ok, out of characters.  Reverse the memo to get the headers in the right order
(Pre-pending is faster than appending because lists are linked lists in elixir)


Look ma, no ifs!  Strings that start with 1 are huffman encoded.
  defp parse_string(<< 0::1, rest::bitstring >>) do
    { length, rest } = parse_int7(rest)
    << value::binary - size(length), rest::binary >> = rest
    { value, rest }

  defp parse_string(<< 1::1, rest::bitstring >>) do
    { length, rest } = parse_int7(rest)
    << value::binary - size(length), rest::binary >> = rest
    { Huffman.decode(value), rest }


* Package manager for the browser
* Can be anything, not just javascript
* can be retrieved via git or http (joe fiorini using S3)
* Semantic versioning via tags

!! Finding mentors
* Within a company
* User Groups

!! Have multiple mentors
* Multiple expertise, multiple perspective

!! Lessons learned
Leadership is responsibility, not privilege, action, not position, guidance, not knowledge, and outcome, not disposition.

* Trust and respect, until burned - be honest with them if they burn you
* Separate opinions from fact
* Demystify questions - use examples, not definitions
* Encourage their curiosity - admit what you don't know
* Learn their strengths and weaknesses
* Do lunch
* Encourage questions - don't use words to impress
* Say I don't know - encourage mentees to say I don't know
* Push them out of their comfort zone
* Encourage personal development
* Respect career paths
* Discourage Imposter Syndrome
* Analysis Paralysis - They don't have the why - take the the time to explain it
* Gender Concerns

Our mission is to empower every person and every organization on the planet to achieve more


"People are coming to us with ideas of things that don't exist and they say 'Make it So'"
"I personally would like to be responsible for as little as possible.  Did I mention I'll be a father, soon?"

serverless - js framework

"Serverless is a mindset"  - Relying on amazing work by other people to build your own amazing things.

!!! Objectives
* Get data from 3rd party
* Make it searchable
* Provide search interface

!!! Hidden objectives
* Work with a terrible 3rd party apis
* no tech team to maintain
* unknown load
* small focused codebase
* easy to maintain

!!! New and Shiny!
* Environment variables
* Lambda dead letter queues
* API gateway supports ANY and star routes
* Modify cloud front headers on requests at endpoint
* Upgraded node
* SAM file (Serverless Application Model)
* KMS integration to encrypt/decrypt env values

!!! Lessons Learned
* Log vigorously
* Use error notification service
* API gateway is not great for complicated things (run your own tests)
* API gateway works with Swagger (kind of) -
* Think of your app in discrete parts
* Learn IAM roles
Dave Mosher @dmosher

extend.js + Namespacing
- creates or appends for a namespage/object string

extend('app.views.config', {})

app.views.config = {}

! Why should I care
*Meaningful semantics
*Extend erd party
*web components

"KendoUI has a wrapper for angular"

ng-directive example:
Michael Danko

registry, containers, images

docker handles deployment, no god, monit, capistrano

fig - links stuff?

very fast

ubuntu core - 100MB, autoupdates

Mesosphere - manage containers

Can replace vagrant - this docker image is the same thing as production

matrix builds

flynn, deis - mini PaaS
dokku - micro PaaS (single instance)

!!! Questions
compare against packer
kernel level changes?
java audit framework - Google Search

Eclipse BIRT and JasperReports | My Tech Tip

Experience is might!: BIRT vs JasperReports comparison

Birt Queries: Birt vs Jasper

CFR - Code of Federal Regulations Title 21

URL List from Saturday, Jun. 29 2013 12:57 PM

To copy this list, type [Ctrl] A, then type [Ctrl] C.

airblade/paper_trail נGitHub

Overview (Spring Data JPA 1.3.2.RELEASE API)

Inspektr Auditing נdima767/inspektr Wiki

java - Business Audit log - recommended library or approach? - Stack Overflow


Logback-Audit Manual

Chapter 1: Introduction

Chapter 2: Server

Chapter 3: The Contents of Audit Messages

Use appfuse to set up spring/hibernate app and try to plug in audit framework
- No

90  - 70 software devs, 20 clinical specialists
Distributed org - 30 in Ann Arbor

!!! Structure
1.  Single Owner
1.  89 non-owners

Only flat because it works for them.
Minimal Viable Process - is this actually a problem or a one-off thing?
"Controlled Chaos" - embrace that somethings will be ad hoc / informal

!!! HR
* Have to be careful hiring
* Look for people comfortable with ambiguity and have a bias towards action
* Use partner/mentor system to help new hires
* We're doing things right

Automatic - car diagnostic and tracking
nascent object - send CAD get object with circuits embedded
smallorange - starting at $3/month - very limited, lots of tiers
squarespace - $8/month - comes with e-commerce, reasonable limits
mediatemple - $20/month shared/grid, $30/month for wordpress specific
digital ocean - start at $5/month very limited, $10/month reasonable - a Virtual private server, not a web host
Aaron Salvo

16 year old service with 4.1 million lines of code

Interface = List of 0 or more functions
Implemented implicitly
Empty interface types accept any type - 0 functions satisfy the interface!

  type capitalized interface {
    Capitalize() string

!! Go Kit

Toolkit to solve common problems in distributed systems
* logging
* instrumentation
* transport layers
* rate limiting
* service discovery

GoKit - opinionated that requests should look like RPC - requests have a structure, need to be decoded, responses are encoded

!!! How Go applies to microservices
* Concurrent programming
* Runtime reflection
* GC
* End up with a single statically binary

!!! Drawbacks
* Go get doesn't have a good dependency management system.  Semantic versioning is a problem.
* Does have vendored libraries

||I Interrupt | I wait for you to finish |
|I Let You Interrupt| Church of Interruption | The Meek |
|I will say my piece no matter what | Barkers | The Church of Strong Civility |

# Thou shalt interrupt when thou understand鳴.
# Thou shalt speak until I interrupt.
# Thou shalt use physical cues to indicate when I ought continue talking.

# Thou shalt not interrupt.
# Thou shalt speak briefly.
# Thou shalt use physical cues to indicate your understanding and desire to speak.

Interruptors will interrupt to indicated understanding and use physical cues to keep you talking.
Civility will never interrupt and will use physical cues to indicate you should stop talking.

Algorithmic complexity as a metaphor for code change.
O(1) - only one file has to change
O(n)  - changing from SQL to NoSql in a badly encapuslated code base

Label code changes between O(1) and O(n)
11/11/2017 - @Hyland, with @Tech_Elevator


"The jobs are here, we don't have the workers to fill them"

!! Review

* It was good, I'm glad I saw it.  I'm not sure who the intended audience was, sometimes young women, sometimes corporate leaders?
* The first half of it didn't keep my attention, but it's a nice intro if you don't understand why this is important and the importance of women to the field.
* The second half was much more powerful to me, more current examples of women trying to fight "the man" and why it's hard.
* They touched lightly on solutions, but it was kinda disappointing.  Fight stereotypes, create more role models.
* The only solution presented for a company:  Spend lots of money, recruit out of bootcamps, grow talent, fight to retain.
* for more.

!! Outline

* Everyone should know something about CS
** Code is everywhere
** Teaches problem solving skills, need to be precise and creative

* Role Models are important
** Unfortunately most female role models are historical
** Need more Grace Hoppers

* Women were the first programmers -> Now there are few
** In the 50s companies started filtering out woman by marketing programmers as "conquerers of the electronic machine"
** Hacker culture took this a step farther:  young, male, antisocial, slobs, focused on domination and anarchy
** Brogrammer culture ratcheted it up a few more notches

* Pipeline is the problem
** We need to reach everyone with the talent and give them the skills

* Raising boys and girls differently changes the way their brains function
** Has nothing to do with innate ability
** CS should be required curriculum (it is in 5 countries and emphasized in a dozen more)
** Not enough teachers in US

* We need more diversity on teams to build solutions that positively impact people
** (other than white men)
** Airbags killed a lot of woman and children because there were designed based on the engineering team's physicality

* Grace Hopper was awesome

* Stereotypes are holding us back
** "Girls are bad at math"
** Normal frustrations caused by the work cause you to "feel" the stereotype a bit more.  You waste energy trying to fight through that.
** Girls are conditioned to appear "average" at math and science starting in high school
** College is worse, more active discouragment: "You won't like this"

* Hard for women to be encouraging
** Please join this field where you will certainly be belittled and sexually harassed!
** Death by 1000 cuts - unconscious bias
** Women leave tech because they don't want to be "that woman" who speaks up about sexist behavior
** Being excellent isn't good enough
Jan 10-11 2013

Neal Ford - Evolutionary Architecture and Emergent Design (Devworks)





''Functional Superiority With Clojure''
* OOP/D is good for GUIs - a button is a natural for inheritence, it sends messages, has behavior, etc.
* It's not good for everything else - shared data, object graphs, etc add complexity, and are difficult to parallelize.



''Scala/Play hack''


Leon Gersing's Speaking pre-compiler was a great experience.  This was a hands-on session with opportunities to practice speaking and get immediate coaching on things like diction, energy, and projection.  It was structured as a master class, where the attendee presents material and Leon repeatedly stopped the presentation to make suggestions for dramatic and subtle improvements.  Leon guided presenters through identifying their narrative structure and building a better talk.

The Elixir pre-compiler was an interesting look at a newer functional language that's rapidly gaining interest.  Elixir is a dynamic language built on-top of the Erlang Virtual Machine and is designed to build distributed fault-tolerant applications.  Ryan Cromwell and Chris McCord spent the morning leading the class through the syntax and structure of an elixir program.  In the afternoon, the focus shifted to making a distributed application, using all the attendees, to perform a DDoS/build a tweet aggregator.  Here the power of Erlang and OTP mixed with the simplicity of Elixir to make a compelling case for the language.  Nodes were brought on-line and integrated into the mesh with very little ceremony.  The Erlang/Elixir philosophy of error handling blew some minds: just let it die and configure your program to start a new process.  With the ability to create several thousand processes per application, one can quickly grasp how distributed, concurrent and fault-tolerant a system built in this way could become.

Jeremy Edberg of Netflix gave an interesting talk about how Netflix is architected.  This talk went deeper than just talking about pieces and parts; Jeremy made a compelling argument for the culture of Netflix and how they value responsibility and independence over carefully gated processes and unified architecture.  Their culture assumes everything is automated, redundant and repeatable.  They recognize that blame is pointless and have built the famous Netflix Simian Army to take down nodes and services - in production - and actively find problems to resolve.  Jeremy also talked about some of the challenges Netflix has had scaling with Amazon and a number of cool tools they've built.  Many are open-sourced and will continue to be.  [link:].  Their build process was particularly interesting as they've taken continuous delivery to an interesting end - every commit spins up a new amazon cluster with the latest image and directs traffic to it.

The Secrets of Clojure Web Development was a fast-paced ride through the bleeding edge of web development in clojure.  Clinton Dreisbach's enthusiasm for this language and its ecosystem was infectious.  He compared a number of tools to rails equivalents and made it easy to understand how the tools are used and why they might be attractive.  Liberator was very interesting, Clinton managed to build a fully compliant REST API in a handful of lines of clojure.  The demonstration of HTTP Kit was also impressive.  The combination of a functional language and streaming over web sockets seemed very attractive for those scenarios where there is a lot of data to move and HTTP is the least painful way to get it there.

There were also some more advanced sessions that were attended.  Brian Genisio gave an in-depth overview of AngularJS directives that was well done.  Directives are a difficult concept to grasp and Brian did a nice job of working through all the options and presenting some entertaining examples that kept the audience engaged.  With directives a developer can essentially extend html and create semantic or domain-specific tags that can be re-used through the application.  An intuitively functional <tab> html element in a <tabs> container is a common example that most web developers would love to have.  Jerry D'Antonio gave an interesting talk on ruby concurrency and explained examples of concurrency constructs from other languages like clojure, javascript, erlang, scala, and F#.  He "concurrently" presented the same abstraction re-written in ruby using the ruby-concurrency gem.  This provides an interesting alternative for building those applications that would benefit from concurrent constructs.

A possible highlight of the conference was the lightning talks.  Corey Haines did a magnificent job hosting in what appeared to be a crushed velvet dinner jacket.  Most of the talks were good to great, but Gary Bernhardt stole the show with "Useing You're Type's Good" [link:]

Rules 1-4 are pretty pragmatic:
1. One level of indentation per method
2. Don鴠use the ELSE keyword
3. Wrap all primitives and Strings
4. First class collections
High cohesion
* easy to find where a change needs to occur
* limits scope of the change
Low coupling - easy to make a change

Cohesion as explict coupling

!! Cohesion as coupling within a shell:

*Two methods that need to change together are coupled, but the class that contains them is cohesive - for instance readConfig and writeConfig

*What story is your method telling - what story is your class telling?

* If something is stable (rarely changes) can we take advantage of that and use it to couple things together?
** How do you know it won't change?

* Coupling only matters when things change - so something that's tightly coupled might be ok - it's a potential energy vs kinetic energy concern.

!! Detecting coupling
* Detect coupling by looking at diffs (see the trends of things changing together)
* Turbulence, NDepend
* Look at when a file was created vs when it was last changed.  Churning files vs encapsulated ones.
* Things should be easy to name and easy to find - fiddling with cohesion/coupling should help

!! Cohesion vs Coupling - Which is more important
* In general, I've worried about coupling because I have so much battle damage from dealing with code that's hard to change
* Dale Emery:  Focusing on cohesion means you have to improve the names, coupling does not force that
* JB - it seems like one feeds off the other.  So it's more of a question of which you should start with
* Kent - theoretically everything can be coupled to everything else.  So by focusing on cohesion I can limit my scope and avoid thinking about all those potential connections.
* Dale - There are many ways to detect coupling - I just have to be aware of the pain of change and address it then.  Our tools don't help us with cohesion.
Cutting an Agile Groove - David Hussman

!!! Dude's Law
Value = WHY / HOW

Do you  start with why on a given practice?

!!! WHY
Why Collaborative Environment?  Visualize, Create, Inform, Fun, Build Community

!!! Environment Checklist
* Do you have real information radiating?
* Connecting Remote Teams?
* Space for Design?
**Table over whiteboard
      3D       2D
* Do your tools serve you?
** Test-drive your tools

!!! Key Questions
* How much time should we take to figure out where we're going?
Combinatory Logic was invented by Moses Sch殦inkel and Haskell Curry to to eliminate the need for variables in mathematical logic.  A combinator is a higher-order function that uses only function application and earlier defined combinators to define a result from its arguments.

This elminates the need for temporary variables and procedural logic.  Instead it provides a way of thinking about common problems in terms of functions.

Combinatory Logic is a building block for good functional programming.  Reginald Braithwaite wrote a series of posts and an e-book to explain using combinators in ruby or JS.  The idea is to pick a language you're comfortable with and stretch it to learn functional paradigms, rather than learning a language and FP at the same time.  He uses songbird metaphors to describe each combinator.
* Architecture is dependent on a world view for a customer use case.  Change the use case and all that architecture becomes debt.
* Do root cause analysis (5 Why's) on every "mistake".  Learn about your system and how customers ''actually'' use it.  Optimize __that__ quality.
*Go fast with discipline
Not MV*

Component:  js has reference to DOM node and can manipulate that DOM.  Can listen to and trigger events using that DOM node, so it's easy to integrate with existing js.
Attributes:  "member" variables for the component
Inititalizer:  Used for setup

Attaches to each match of the selector.

Can only talk to it via events after it's initialized.
Attributes can be defaulted and overridden, or required.

Mixins - work like modules in ruby, add functions to `this`

Advice - Like aspects or hooks.  Gives you before and after hooks for your functions.
Dan Kacenjar @kacenjar

! OpenBCI
* Org
* $499 for 8 bit board
* EEG(brain), EMG(muscle), ECG (heart)
* Based on arduino uno

!! BCI is hard
* Variable per person
* small signals in a noisy environment (low SNR)
* signal theory, cognitive science, neuroscience

!! Board components
* TI ADS1299
** low noise 8 channel, 24bit analog for bio measurements
** SPI provides i/o to arduino
* LIS3DH 3 axis accelerometer
* ATmega328P microcontroller
** arduino compatible
*** don't need an arduino
* RFduino
** BTLE (4.0)

* OBCI USB dongle
** RFDuino
** connects BCI to PC
** requires FTDI VCP (virtual comm port) driver

board <-- BLE --> dongle <-- serial --> PC

!! Block diagram
3 bytes of data per channel
2 bytes for each axis in the accelerometer (xyz)

!! Programming
* Can use Arduino IDE
* Showed example using Processing (

!! OpenBCI client software
* has it's own client

!! Context Questioning
* 쉳 there any other context which, when this event happens, will produce a different outcome?튪 What do we do when "Given" isn't true

!! Outcome Questioning
* 쇩ven this context, when this event happens, is there another outcome that鳠important? Something we missed, perhaps?튪 If pixies were doing this instead of software, would it be enough? Or do they need to do something else, too?튊
!!! Indirection
"Indirection should add meaning, not hide it" - Jessica Kerr

!!! Naming
"Name objects for what they're responsible for" - Corey

eg. ProcessesPayment
C# - IDoSomething => ITranslateToSoftwareDeliverySystem => class TranslatesToSMS implments ITranslateToSoftwareDeliverySystem

!!! Testing Pain
If you're doing test first, you change the tests
If you're test-driven, you change the design

Determining business value vs Dispelling ignorance
 - Determining most valuable feature is usually a hand-waving exercise of varied opinions.  Instead equate "providing value" to "providing knowledge about the system to build"

Why a pentagon for needed CR features?
 - So you can draw arrows from below
 - Feature support diagrams
Ask questions about the features and figure out what other features can determine the answers to those questions
 - The feature that answers the most questions and has the fewest questions about it shows the highest amount of value (core feature)

Corey likes to start on the simplest case when writing cukes - the degenerate case.  (0th case)

Meat based automation - after the cukes are written but you ned lots of changes at the integration level to get those passing - just use the refresh button and verify by eye - then verify the cukes pass


Use cucumber setup steps to drive out the behavior a controller or some integration layer needs
 - Move code from the tests to the views to the controller (and keep going).  Start with hardcoded data until you get it down to the point where it makes sense to introduce retrieval

Feature support diagram -> Cuke -> hard coded view -> hard coded controller -> ...

"It鳠important for each test to justify its existence in your test suite." - Does it have more value than it's cost?

* Thorough analysis of a requirement
* Confidence to refactor (regression protection)
* Fast feedback
* Repeatable test
* Living documentation
* Less manual testing
* Time for exploratory testing
* Team collaboration (ATDD)

* Time spent learning how to write test
* Time spent writing test
* Time waiting for test to run
* Maintenance time
* False sense of security while tests are passing
!!! Successful conversators

1)  Know what they want
2) Don't make either/or choices

* How would I behave if I really want this?
* What do I want for everyone?
* What don't I want?
* How can I get what I want and not what I don't want?

! Book notes

!! Chapter 2 The Power of Dialog
* Be 100% honest and 100% kind
* Find a way to get all the relevant information into the open

//Because of a shared understanding people willingly act on decisions with conviction//
//You buy in when you understand//

!! Chapter 3 Start with Heart
(Know what you want)
* Start high-risk conversations with the right motives.  Stay focused.
* "What do I want here?"
* "How would I behave if I wanted that"

!! Chapter 4 - Learn to Look
(Is it safe for people to be honest?)

* How do people feel?
* Are they holding back?

How do I know I'm in a crucial conversation?  - Look for people who are afraid.

!! Chapter 5  Make it Safe
//There's this undercurrent of "don't pay attention to the content", or at least "pay more attention to the conditions".  Which is how I talk to my children and it's exhausting.//
* "What is our mutual purpose"
* "Do others believe I care about their goals?"
* "Do they trust my motives?"
* "Do they believe I respect them?"

!!! Making it safe again
(after screwing up)
* Apologize sincerely
** Only if you're really sorry you did and it's appropriate - don't apologize because some over-reacted
* Contrasting
** "I don't want to say/come across/imply x.  I do think y"

!! Chapter 6 Master my Stories
Something happens (Observable Fact) -> Tell yourself a story about it -> Feel -> Act
Cody doesn't text me back -> He obviously doesn't really want to come see me -> Disappointed, angry -> Ignore him

* Am I pretending not to notice my role in the problem?
* What do I want?  What would I do right now if I really wanted that?

!! Chapter 7 STATE My path

* Pause for 4 seconds
* EXPLICIT purpose of conversation
** We're explicitly here to come together, not for one party to win
** //You only need to be explicit during crucial conversations?//

!!! When something that makes me feel bad happens
* Think about what I really want
* Think of possible explanations for their behavior - try to get in a place where they're not the worst person in the world
* Start dialog - Confirm your impression before starting a confrontation.  There's time for confrontation later if they are, in fact, the worst person in the world.

!! Chapter 8 Explore Others Paths
(Help them get to dialog as well)

* Ask for their view
* Mirror - Acknowledge the way they feel
* Paraphrase - Show you are listening and that you're trying to understand
* Prime - If nothing else works, offer a guess about how they might be feeling/thinking

* Agree - Be sure to agree when you share common ground
* Build - If you agree, but feel like something is being left out, agree and then add your thing
* Compare - If you disagree, don't say they're wrong.  Present the two views and acknowledge that there is a disagreement here.

!! Chapter 9 Move to Action
Dialog is not decision making


//Orgs use consensus on things that don't matter and command-style on those that do//

!!! How to choose
1) Who cares?  Don't involve people who don't care.
2) Who knows?  Find the experts.  Don't involve people who contribute no new information.
3) Who must agree?  Whose cooperation/authority/influence do we need?
4) How many people do we need?  Fewer is better.  Do we have enough people to make a good choice?  Do we need others to get their commitment?

//The goal of a leader is to be completely informed and *choose* to not impose their opinion in most situations.//

!!! Assignments

* Saying a group will do the work is foolish (our problem, not my problem)
* Someone must be assigned to keep everyone accountable

TD hangout: Oct 19

Crystal - statically compiled to be syntactically similar to ruby

* perf improvement in sidekiq
* Uses macros for metaprogramming
* Only use crystal at mac and linux (llvm)

!!! types
nil is a type (check for nil at compile time)
Union types

!!! cool stuff
go like channels (not parallel, but non-blocking)
c bindings

!!! Distribution story kinda sucks
It's ok for dependency (can specify github repos)
Itamar Hasin @itababy

Relies entirely on Wire protocol (Cucumber Recipe #15)

!!! Remote control
Off board cuke -> Wire -> Listener -> Network -> Target
Pro:  Target untouched
Con: All APIs must be exposed to the network

Cucumber -> Network -> Listener -> Target
 (Listener is on-board)

Pro:  No APIs exposed
Con: Server part of codebase
Con: Need memory for wire listener

!!! Gateway
Cucumber -> Gateway -> Multiple devices
Orchestrates/Switchboard to multiple devices

Implements wire protcol and dispatches either to another wire protocol listener (in-situ) or translates wire protocol to network or serial commands against the  target.
Cucumber2 - rewrite of ruby version
cucumber-android - built on cucumber-jvm

!! cucumber-ltd/
* Online collaborative cukes
* Backed by github, bitpucket, dropbox
* Tight integration with travis-ci
* Runs cukes
* Realtime synced collaboratin - as you type
* Doesn't run cukes, mostly ties to CI jobs and shows report
* Free for open source

share.js - used for the real-time piece
BDD = Let's have a conversation -> Examples
Important for examples to be concrete
* Foundation for exploring
* Concrete examples are easier to automate

Daniel Wellman @wellman
Alternate step for same gherkin - use ENV variables

 ** Please use cucumber pro - we need feedback **
!!! Ian Dees @undees - Testing embedded

* Mongoose - C Web server - small mostly compatible
* White - Win32 API testing
* rxtx.jar

!!! Richard Lawrence @rslawrence - Story workshop

* Data Personas - Clumps of data that seem to get passed around
** A clump or search criteria
** Personas file to store the data in - like datamagic.yml I guess
Might be a good solution if you have more than one default dataset

!!! Oscar Rieken

* 2700 cukes in 7-10 minutes
* 400 nodes
* Looking at MogoTest and Narcissus for browser testing

!!! Ian Dees @undees - Elixr, Cucumberl

Q:  Can you run erlang in elixr?  Port cucubmerl to elixr - run every scenario in a process - massive multithreading
Dr. Wayne Newman - CWRU

* Uses planar selection to tell the Atlas robot where walls and surfaces are //Shared understanding//
* Teleoperation is out - takes forever.
* Compliant Motion Control - teach the robot skills it can apply
* Ask the robot what it ''can'' do
** Lots of rejected commands
** "If you ask for the impossible you rarely get something desirable"
Mike Bobcock - Inventor of D3
presentation -

!!! TODO
Play with meteorite strike example, fix states example

!!! What do you want to show?
Relationship - scatter, bubble (correlation)
Composition - Pie, stacked columns
* Stacked bar chart better than 50 pie charts with 7 wedges
Comparison - Column, line (versus)
Distribution - histogram (column, line)

!!! Manipulating data
* Map/Reduce using emojii

* Data Details vs Data Size (have to leave stuff out in order to make sense of the data)

!! D3

Find an example viz to start from here

enter - update - exit
d3 essentially iterates over your data passing it to the chained functions
You can think of it sort of like sql, for these rows (which might be scalars), do this thing (append, attr, etc).

d3 supports divs, svg, and canvas

!!! Support functions
* d3.csv  - load csv from service
* renderlets
* scales - convert from the domain data (1 to 100000) to the chart range (1-100)
* domains
* ranges
* axes

!!!! Cool tools

!! Crossfilter

!! Chloropleth
Topojson -> GeoJson -> svg geopath -> d3 projection

!! dc.js
fluent interface for d3 charts

"combing a wookie"

bugs = holes in our mental model

test-driven refactoring - write tests to throw away - document your assumptions on how the codebase works.

Capture the old method in a lambda and then compare it against the new.

mutant - less about code coverage, more about finding methods that do too much
approval_tests - reports when ''results'' have changed - useful for apis

!!! Metrics
time the test suite (should not get slower)
feature to bug ratio (per iteration)
code complexity metrics
code smells (reek)
ask your developers

!!! Tools
churn - how many times has this file changed
rake notes - finds TODOs
fukuzatsu - reports cyclomatic complexity
society - reports how tightly coupled different classes are
pandometer - in progress - can report which commits add complexity, coupling, etc

* Store your results in a database so you can see trends

!!! Questions
Any ideas for testing where the only tests you can think to write are going to constrain your refactoring in a difrection you don't want it to go?
Do you keep these integration tests?  Test every edge?
What's the lifetime on these tests you throw away? - as long as needed for assumption checking

noun project

!!! Circuit Breaker pattern
* Release It!
!!!! Closed
* request succeed -> failures = 0
* request falis -> failures++
* failures = threshold -> trip breaker
(Or measure latency, absolute failures, %  error rate)

!!!! Open
!!!! Half-open
* How to recover?  Retry window?

!!! Pros
* Fail fast
!!! Cons
* Overhead (stat tracking)

!! Bulkheads (thread pools)
Overspecifying cards during estimation sessions
Avoiding dev/product interaction

Solution:  3 amigos during kickoff

"We talk about people over process and then actively go out of our way to create a repeatable process where people don't have to interact more than a bare minimum.

"I find it much more important to go for that elusive Metaphor, and find a common language that all stakeholders can understand. Whether you automate some of that understanding and how, is less important."
" The customers wanted to know the calculations that went in to the acceptance tests. We ended up writing acceptance tests in Clojure, with a small support library to keep the tests clean and readable."
"When embarking on something new, try to understand how you are working, where your feedback is coming from. Then understand where the 讥w頴hing is coming from. While trying the new thing out, keep reflecting and check your understanding against your experiences."

 Willem van den Ende  (

* Get examples by asking for them
** If the answer is tautological - "When I select text and make it italic it should be italic" - drive into specifics

!! Conversational Tricks
* people use 쩦�here Gherkin uses 짩ven튪 or they use 쌥t鳠say this happened杊* or say 췥ll, if I鶥 already done X杊* people use 촨en�nstead of 취en�when they鲥 talking about an event they鲥 performing
* people often skip 촨en�ltogether when they鲥 talking about an outcome, and occasionally skip 취en�
!! Success vs. failure
* Don't make success and failure look the same.  Assume success
 Given I鶥 submitted my application
Given I tried to submit my application
But it was audited and rejected

!! It's OK to have steps that don't execute code
Given I lost my dog
SE radio - Fred George
! Definition
Anarchy = Self-organization
Developers are not managed by anyone, including the business

!! Basic idea
* Time to market is paramount
* PO doesn't have time to guide developers
* Fast feedback is required
* Good for solving problems where the solution is fuzzy ("Make more money")
* Developers experiment quickly (several a day, in production) to find better solutions

!!! Anarchy
* = Self-organization
* Attention grabbing "Marketing" like extreme programming

!!! P.O role
* Describe business goals
* Give developers metrics to "game" (google hits, $ earned per minute, search ranking, etc)
* Educate developers on business
"Customer now educates programmer on business domain, rather than picking what story to play next"
* Stay out of the way

!!! Caveats
* Requires high-trust relationship
** You pay these people a lot of money, vaguely describe what you want for that money, give up authority on how they spend that money, and in return you get fast results
* Non-prescriptive results
* Has to "sold" to C-level and forced down throats (like agile).  Social/culture change.
* Managers/Architects/QA etc must adapt or leave
** At Daily Mail, most managers left rather than become coders.  25%+ left in first six months.
** Most architects became coders
** Had no trouble filling those positions with people who really wanted to work in this environment (leaving banks, google, etc)
* Have to leave the developers alone (judge on merits alone)
** Team chose to rewrite the same service 3-4 times (Managers would never allow this!).  Ended up being the right call.
* Best suited for internal tools?
* Only really works so far with microservices

!!! Innovation
* You have to want it
* Understand that innovation means failing
* Rules will be bent, ignored, and broken

!!! Gaming
* We measure the wrong things for developers (story points, cards per iteration, lines of code).
* Measure money made, improving google results, KPIs.
* Developers identify metrics to game and do so.

!!! No management
* Let programmers vote each other off the island
* There are management like roles
** Mentor - usually senior dev
** Feedback - 360 reviews
** Ambassador - represent team to rest of company (still a programmer)
** Concierge - handle the things the team needs (skills, lan adapters, deal with "fired" programmers) - probably not a programmer

!!! Skills / Pay scale / title
* Competent in a tech - Developer
* Expert in tech - Expert - Senior Developer
* Competent in 5-7 techs - Expert - System Developer
* Expert in 5+ techs - Uber Expert - Master Developer

!!! Is it agile?
* Value Communication
* Value Feedback
* Value working software

* No stories
* No iterations
* No retros
* No standups
(The feedback loop on all of these things is too large if you're deploying multiple times a day)

* No refactoring
* No unit testing
* No QA
(microservices make this waste, just spend another hour and spin up a replacement microservice)
* Deploy it to production and measure the feedback there
* Requires instrumentation
Could lose $300/minute if there was an error, but could produce $1000s per day with an alogrithm update.

!!! Key question
"How much do you value time to market?"

!! Microservices
* Microservices and rapid development leads towards Programmer Anarchy
* Microservices work well when success is very fuzzy and in degrees.
** "Can I tweak just this piece of the feature and have 2-3 versions competing in production?

!!! How big?
* < 100 lines of code (java, C#)
* 15-20 lines of javascript
* Forward had 300 microservices
* Netflix had 800 microservices

!!! Services are scripts
* Logic is simple
* Pull in input
* Make 1-2 decisions
* Produce output

//this rang home with me, I don't TDD most of my scripts - it's hard to mock out IO, wire up a test harness, etc when I'm writing a bash script to move files around //

!!! microservices @forward
* Ruby front-end
* Clojure for heavy lifting
* Node for traffic monitoring
* R for analytics

!!! Duplication
Didn't worry about it.  2 hours to write a new service shorter than maintaining the documentation and library for knowing another service already exists.

!!! Logging, monitoring, deployment
* Logging is just another event on the event bus (if doing async architecture)
* Each service announces it's presence/disconnect, does heartbeat (like MQTT).  Another microservice does monitoring.
* Use the cloud for deployment
** Cloud costs cheaper than programmer costs

!!! My Questions
1)  Does this work for customers who don't want to learn tech?  Will we naturally mask the costs they are deferring by ignoring tests, refactoring, docs, etc?
2)  What's the worth of creating an environment where developers get to write code as much as possible?  Can we abandon the desire to prevent building the wrong thing the first time?

Cory House

* Luck Surface Area
* Find what scares you and run at it
* "You are the average of the five people you spend the most time with"
* Consistently do things that people want
George Dunwiddie

"Express all the details that matter and none that don't matter" - Dale Emery

Clue:  Big setup
Clue:  Big Expectation
Clue:  Run on scenario (when and then when then when then)

Essence of a cooking timer
hour glass, wind up, digital

Clue:  Does the cuke change when we change the workflow?
minute button vs 1-0 keypad for entering minutes

Clue:  Does the cuke change when we change the UI?
Start button vs Go button
1, 2, 3, vs -, --, ---

WARNING:  Don't eliminate all the details - stay away from tautological

Is your essence (of this test) domain or workflow?  Depends on the test.  Should we run/group these tests together?  Or maybe accept slower feedback on workflow tests.
Kel Cecil

!!! docker hub vs
* prefers quay
* better for teams
* quay has an easier "build image from commit" feature

kubernetes - linux like process application over multiple boxes.
deis -  heroku-like abstraction - abstracts away the providers (digital ocean -> aws)

!!! Ideas
* Pull the CI env to a dev machine to fix/play
* Take someone's dotfiles for a spin

Takeaway:  simply uses docker the way I use vagrant
AR Parrot Drone
argus - gem
CFields - module -> Convert C style headers to ruby class

Pulling the Value Forward - most valuable first
Amount of value for each story goes down, so second iteration is less valuable than the first
At some point the value of a sprint becomes negligible (when you get to the nice-to-haves)
It costs the same amount to do the first iteration as the 10th
There should be a point where we notice that we've spent half the money and gotten 80% of the value
ROI - Sooner?
How does this approach compare to the all or nothing comparision?

Ryan Cromwell
Chris Mccord

IRC: elixir-lang on freenode

What do you do when there's no match? - Throws error, let it die?

Uses guard to load exs files into iex to help with playing (don't have to re-write whole modules in iex)

quote shows the AST for any expression

cond do

// would you assign this to something?


Elixr is tail call optimized

Processes are used like Objects in the sense that you give them work and wait for a result - thousands per machine is normal

* Messages are non-durable - so we assume messages are not delivered by default?
* Servers are OTP naming convention for a process that stays alive

* ''Tests are falining for genserver_stack

* iex pry
Eric Hankinson

Deb bootstrap - take major version of debian, ABI (cpu arch) - knows how to copy files to a block (virtual file system) and make a minimal debian
uboot - point here to launch the OS
* Tfttp here to get the kernel

Ran qemu-arm-static to compile "AS ARM" in a VM (rather than doing a true cross-compile)

MAKEDEV - makes things in the /dev folder

sfdisk - scriptable fdisk

use {{{pv}}} to record pipe progress
zcat | pv | dd
- Build an architecture to scale first, be efficient second

12 year old aaron (''find github account'') contributing to travis pulled in by first accepted pull request.
John Daily

x=x+1 -> you're doing it wrong!

"If this is the kind of code you want to write for the rest of your life, you are wrong."
"Crashing is not the worst thing that can happen when you have an exception, silently swallowing an exception is".

Rebootable code - How often has rebooting failed to fix your computer problem?  Rebooting is an awesome feature.

If you're already in an error state, can you trust "yourself" to clean and restore state?

"Why do computers stop and what can we do about it?" - Jim Gray

!!! Tandem Computers
* Fail fast modules: do the right thing or STOP.  Why carry corrupted behavior forward
* Detect module faults quickly
* Configure extra modules for rapid failover

!!! Tandem's Software
* 4 million lines of code
* Several thousand bugs
* Estimated mean time between failure - 50 years

!! Things we need
!!! Isolation
*Erlang module is a process
* No shared memory
* Need messages to transfer data
* Async messaging is better (sync message is fragile)

!!! Supervision
* Should have as little code as possible
* Lazy edge case handling by default - why spend all that time tracking down weird bugs?

!!! Fast Reboot
* Processes are itty-bitty small.  Like 1200 bytes.

!!! Network transparency
* We tried to pretend for years that network calls didn't exist (RPC, CORBA, etc)

!!! State management
* OOP encourages you to keep your state intertwined with your code.  Functional encourages you to separate that.

!! Nice to have
* Hot code loading / REPL
* Garbage collection (lots of little processes to clean up)
* OTP - best practices for Erlang
* Pattern matching (parsing messages)
* Symbolic debugging

!! Resources - Must watch video
* Where is prod?
* Look at Gemfile
* Look at database.yml
* tools - simplecov, turbulence, etc
* Installed DB from heroku (db:pull)
Do you like failure?

In this session we'll talk about why your mind reacts to failure the way it does and what you can do about it.  Using concrete examples, like TDD and Lean Startup, we'll work through some cognitive biases that might hold you back.  We'll talk about failing safely and building environments where failure is encouraged.  Then we'll move on to anti-fragile systems and how focusing on failure pushes a system to thrive on randomness.  We'll close with a discussion on failure-focused strategies that allow us to  build to an ultimate success.
Agile distilled

 - Why do we care about feedback - learn, grow, etc
-Failing and Learning
 - What lessons are you most likely to learn from?
 - What stories do you remember?
-Regret avoidance
-Practice failure
-Lean startup
-Scientific method applied to ATDD
-Write it down
-Start with a hypothesis
-Try to fail!  Embrace failure

! Post Codemash
* Afraid to show unfinished app to a customer?
* Afraid to let customer drive
* Show and Tell with nothing to show?

* View failure as permanent and success as temporary
** Do your friends let you forget your mistakes?
** Can we create spaces where it's ok to mess up?

* Perfectionism
** Story about my dad
** Very limiting, afraid to try new things

* Distinguish between valid and invalid criticism
** Trusted Advisors / Mentors

* After failing
** Ignore or dismiss the data
*** Ego protection
**** The lifeblood of the ego is fear. Its primary function is to preserve your identity, but it fears your unworthiness. As a result, ego pushes you harder in order to achieve more. Ego communicates to you through "oughts," "musts," and "shoulds," persuading you to believe that by achieving more and more, you must be worthy, right?
** Attribute to a personal defeciency
*** Ego protection
*** Afraid to try again
** Attribute to strategy
*** Creates new ideas

Helen Keller, 샨aracter cannot be developed in ease and quiet. Only through experience of trial and suffering can the soul be strengthened, ambition inspired, and success achieved.튊* Prefer local evidence to theory
** Design patterns, etc

!! Killing your darlings
* Stuff - How does this fit?

!! Practice "when things go wrong"
** Work in mentions of the quotes here, all very good about teaching yourself to learn

!! Antifragile
* Tie-in - the capability to embrace failure and react to mistakes is useful in random, uncertain environments
*** Avoid Analysis Paralysis
*** Disorder Paralysis
** The ability to quickly reverse small errors makes a person/system antifragile
** Maximize Luck Surface Area
** Innovation depends on tinkering
** If we get good at reversing expected failure we can get good at reversing random failure
*** It's all about reducing fear of a negative effect

** Randomness and Disorder
*** vs attempts to stabiliize the environment (PROCESS) vs stability by embracing change and randomness
** Stress up to a point
** Barbelling (90% cash, 10% high risk, vs 100% medium)

** Things that are antifragile
* Bones and muscle

* Antifragile things are complex and random
** And need complexity (zoo animals)
* Robust things are simple

* Complex systems resist top-down design - emergence
* Instead use minor tweaks (like evolution does)

* Local failure vs Global failure
** Tech safety

"Good systems are set up to have small errors, independent from each other, or negatively correlated to each other, since mistakes lower the odds of future mistakes"

* Debt makes you fragile - vulnerable
* You have to feel the consequences of your actions

* Don't waste time trying to get better at predicting the world or making it more predictable.

"Antifragility is beyond resilience or robustness.  The resilient resists shock and stays the same; the antifragile gets better.  The antifragile loves randomness and uncertainty, which also means - crucially - a love of errors, a certain class of errors."

* Understand that freedom and accountability are the same thing.
** What does this mean to me?

* Antifragile systems are redundant
** They expect failure of one part

* Redundancy vs Waste
** Antifragile systems are redundant, which looks like waste.  Until the unusual happens.

* CI/Delivery - Antifragile
** Again this comes back to the idea that we try more often, even if that means failing.  Let's keep the failures small and local.

** Balancing act?
*** Antifragile - TechSafety

** Github
*** Jan8 postmortem - one small failure takes down the whole system

!! Closing?
In the end there's nothing significant about success or failure.  What we're looking for is fast feedback for fast improvement.  If you can succeed fast, great!  Please teach me how.  The magic about focusing on failures is that you can still build to a larger success.  With a focus on success, it takes me longer to get that feedback.  I'm also less open to changing tack while I'm succeeding.  All of us take on endeavors that in hindsight, we should have quit very early on.  And in hindsight, the warning signs were there.  But it's  going "well enough", it doesn't hurt that bad, let's keep going and hope it works out.  
William Klos

Bad Voice UI:  Requires a specific order of words, innotation
Alexa Ask MyApp
Alexa Tell MyApp

Keeps a topic open until you "close it" - Is this a timeout thing?
1.  Move all the script in a page to a single block (jquery can help)
1.  Create a namespace for js
1.  Move all script on a page to a js file with the same name.  Use the new namespace
1.  DRY it up
1.  Isolate components
1.  Inject dependencies
1.  Use templates

!!! mockajax library
- Used with spiking out a design with a designer - can build widgets without a server

!!! Wrapping functions
Wrapping function calls in anonymous functions instead of just passing the function (like to jquery) allows you to call functions that you haven't defined on the page yet (because the page loads top to bottom)

  $('#stuff).on('click' doStuff);

  doStuff = function() {

'' Undefined ''

!!! Namespaces

* Use namespace as interim step to organize code
* Not a good solution long term if you have collisions with another library - last write wins


Why on earth would you add functions to an object that require it to know things outside the function definition?    (Step 6ish)

!!! Templates

Templates allow you to stop sending markup across the wire.  Add rows to a table asynchronously, for instance.

!!! amplify
amplify - allows you to publish events to topics.  You can further decouple components from each other.  Also components from server:

Jon Knapp

Open vacation policy was a failure.

* People were unsure how many days were "ok" and no-one wanted to be the slacker.  Forgetful people would just burn themselves out.

"People take less time off, and it's celebrated as a success of giving people more responsibility."

* People would stay hooked in during vacation, and avoid recharging.

"When someone starts checking in during their vacation, it lowers the bar for others to do it, and it increases the uncertainty of whether or not you should be checking in. "

"A company has to learn how to function when people are on vacation and unavailable, however important their role is."

Ended up with 25 MINIMUM vacation days for every employee, including founders

Property Tests

1.  Generate lots of data
2.  Pass it through a function
3.  Validate the output

How to do it:
1.  Think in properties
5.  Models as FSMs.

test "addition with zero returns the same number" do
  ptest c: int() do
    assert(add(x, 0))

def add(x, _y) do


How do you think about applications?
Imagine a model.  Think of it as a FSM:

User -> logs in -> logged_in -> vote -> logged_in -> log out -> logged_out

  test "users votes increase after voting" do
    ptest [commands: gen_commands("chris")] do
       [_state, result } = run_commands(commands, client)


  def gen_commands(name) do
    list(of: gen_vote(name), max: 20)
  gen_vote(name) do
    tuple(like: {


Raymond Chandler III

Fighting borrow checker
let v = vec![1,2,3];
let v2 = v;

v2 now owns v, v is pretty much worthless.
**Only one pointer can point to a spot in the heap**
Functions can move ownership - calling a function and  passing a ref means it's gone to you.
Primitives are "copied".

You can hand back ownership in a function by returning it
fn foo(v1: Vec<i32>) -> vec<i32>, i32 {
  (v1, 5)
Can also pass refs
fn foo(&Vec<i32>)
''Key Question''  Who is it that cares about what you're building?

Using the gherkin as a measure of progress - these features are done, these might not be good tests, this is what we're working on today

Rephrase all conversations as gherkin steps

Whether the gherkin can run or not is not important //to Doug Alcorn//

Writing Acceptance Tests forces a conversation and make expectations explicit.  Gherkin gives us a language that the Whole Team can understand.
Feature = epic
Scenario = story

Rules for communicating status to remote clients
 - If there's not a story for what you're doing, you're doing the wrong thing
 - If your story takes more than a couple days, it's too big
 - You're not really doing anything unless you have a story in progress

Fowler:  (OOPSLA 2000) Because the cost of predicting software is so high, it makes sense to treat it as unpredicatable

Instead of scheduling a meeting, instead start with the question you want answered and encourage a conversation for that.

It's all about talking to your client

!!! Q&A
Psychology of dealing with customers that don't want granular small stories - It's all about the relationship.  To foster breakdowns,  ask questions, do experiments

Kirsten Hunter

Git vs Database
bad at heirarchies, needs infrastructure and maintenance, doesn't do diffs

lightweight, portable, can use branches to label information, tags to label commits and state.  Logs for free, has grep and diff.
Fluid girds
flexible images
media queries

Don't use inline styles, include media query last.
JS Task Runner (like Rake)
* Joe Fiorini uses it  like guard to run tests

 * chain tasks together for a workflow:  requirejs, copy, qunit, watch

AWS-like security
Bill Sempf

* OWASP - has all the tools and stuff

* "Google Hacking" for pentesting

robots.txt - big list of stuff that you don't want people to look at.

Comments should not be revealing, don't hide files, deploy as little as possible.
Services exposed for mobile are ripe for attack
Client objects can be decompiled

Failing to handle exceptions allows the pentester to know TOO much about the system and potentially take the app down.

Research -> Exception -> Source -> Research

Attackers do not use a web browser (they use proxies and scripts)

!! All data is evil
* Incoming data
* Outcoming data
* 3rd party data

!!! Reflected XSS
The error you encountered was: <%= Request.QueryString("error") %> for<haxor code>

!!! Stored XSS
$.post ("insertRecord.php", { field: "Comment", data: "<script>haxor code</script>"})

!!! Preventing XSS
Get Data -> Encode it -> Transfer it

basically anytime user input is directly executed as javascript (like "hi Steve!"),mp4&authkey=!ANVrmMtni6D5uGk


!! Netflix Way
* Built for three - three of everything
* Automated
* Fully automate machine image bakery (no chef or puppet)
* Automated deployment
* Every Independent teams responsible for DEV and OPS
* Redundancy through mult-regiion deployment

!! Freedom and Responsibility
* Hire responsible adults and give them the freedom to do what they think is right
* Things usually don't break
* Manage capacity and autoscaling
* Fix anything that breaks at 4am!

Shared state should be sotred in a shared service - replicate data everywhere

Engr boot camp to teach them how to build in a highy distributed (highly redundant) environment

2B requests per day into the Netflix API
Netflix has all the content stored on a local CDN, rest is on amazon

!! Highly aligned, oosely coupled
* Teams are good at communicating
* Auto-scaling (SOA)
* Effects are narrow

!! All systems choices assume failure is inevitable
* Reliability vs $$
* Chaos Monkey

!! Asgard
Cloud orchestration tool - modifies Amazon - open source
# Push code,
# Launches new cluster with the new software (as an image).
# Load balancer
# Use new cluster
# Delete the old cluster after a day
#  If something goes wrong the balancer can shift some of the traffic back to the old code, or all of it if the new code is SNAFU
* ''Moves granularity from the instance to the cluster''

!! Why Bake?

* Take Base Image
* RPMs
* Jenkins / Yum / Artifactory

* Own your service, own your machine, pick your platform, language, etc, doesn't matter

!! The simian army
* Chaos, Latency
* Everyone knows chaos monkey is coming and builds for it

!! Data
* Cache (memcache)
* Cassandra
* little bit of MySql (fringe)

!! EVCache
* open source
* Wrapper around memcache
* Replicates writes to multiple zones
* Pulls cache data from local zone first (affinity)

!! Cassandra
* Distributes data around the ring
* Horizontal scaling is easy - just add more nodes
* Uses quorum among distributed nodes to determine what will be returned - caller configured
* Prefer availablity over consistency
* Prefer Writes over reads
* Jave-based
* Open-sourced and with commercial support
* Fast negative lookups

!! Going multi-zone
* Loosely connected
* Low latency between zones

!! Leveraging Multi-region
* Claim: 100% uptime is theoretically possible - IF you replicate all your data

!! Acitve/Active
* Data replication challenges
* Cache invalidation
* Misdirected user
* Sudden load increase during failover
* When do you fail over?
* How do you replicate cache?

!! Cache Replication
* Three strategies
** No replication - recommended.  Can you write your software to work without data replication?
** Invalidation only - default mode.  Just re-grab data from the database again when you fail over.
** Full copy - For the teams using memcache as a DB

!! Failover
* Need to scale up
* Need to route misrouted users back "home"
** Mismatch between actual IP and resolver location
* Blog post on netflix (active/active failover)

!! Chronos
* Logging/Event tool

!! Best Practices
* Incident Reviews
** No blame
** What went wrong?
** Detect it sooner?
** Prevent it?
** Prevent this class of problem?
** Improve our reaction to this kind of problem?

!! Circuit Breakers (Hystrix)
* If your dependencies are failing, return a default response
* Gives dependency a chance to recover, rather than hammering it

!! Autoscaling
* Obviously good for peaks
* Good for scaling down too.  Reduces complexity, deployment times, etc
* Leads to renewal of machines as well

* Believes Amazon has some DDOS protection
* Autoscaling covers peak problems

* No teams share data, all access is through the service

!! Intro
* Command pattern is same as passing functions

!! Definitions
* A monad is and object that lets you use the object inside it
** Lists are monads

* Functors are stuff you can map over
** Lists are functors

* Applicative functors are stuff you can map over and get a stuff of functions back

* Currying is a function that takes and argument and gives you a function that does the same thing with one less argument
** Special case of applicative functors

!! Crib sheet
* Declare, don't assign
* Calculate, don't mutate
* Pattern match, don't if-else
* recur, don't loop
* pass functions, not structs
* map, filter, reduce

Kent Beck on how he spreads ideas.

# Adopt personally
# Find the totem
# Repetitively broadcast

!! Adopt personally
Seems obvious, dogfood and work on the theory and mechanics of the idea.

!! Find the Totem
Starts talking one-on-one with the idea that he will fail to explain the idea well.  Focus is on spreading the idea, not convincing everyone that every part of the idea is worthy of consideration.  The idea is to find the hooks that make this resonate.
//This is obviously a problem with my failure talk and how reluctant I was to cut any part//

* Name.
* Motto.
* Metric.
* Mascot.
* Gesture.
* Utopia.
* Abbreviation.
* Diagram.

!! Brute Repetition
This is hard and it sucks.  It takes years and decades of repeating yourself.
Robert Cialdine Influence - The Psychology of Persuasion

'' Giving ''
Give gift
Give time
Set a rule - give a pass

''Commitment Consistency ''

After making a commitment you'll work very hard to keep it
 - Get people to make concessions and keep twisting - Chinese army did this to make soldiers look like they were against the US

Standups create commitment consistency by getting people to publicly declare what they will do today

Commitment consistency will cause people to follow through on a commitment even when conditions change and make it a bad idea or impractical or violates the original spirit on the commitment.

Scrum changed from team commitment to team forcasting to allow for teams to change with conditions rather than sticking with bad commitments.

'' Authority ''
 - Can use second hand - "Kent Beck says.."

'' Scarcity ''
Let's do this for a short amount of time
Quantity scarcity, knowledge scarcity

'' Social Proof ''
- If nobody's doing nothing then it must already be taken care of
Vague blanket statements - everyone assumes someone else will do it
Pick someone!  Force action.

'' Liking''
Body language mirroring - miror inflection, speed, temper of the voice - helps make connections.  People like themselves and like people like them.

"I'm one of you, I want to work with you, make it easier for you"

Key concepts of Industrial Revolution:
* Break endeavors into small, easy tasks (assembly line)
* Mechanize some of those steps
* Who do you most admire and why?
* In your last employee review, what areas for improvement were identified?
* Why are you here?
* What is your passion?
* Describe an environment in which you would not thrive.
* If you could do anything, what would be your ideal job? 
Tell me about a problem you solved recently.

Tell me about your most recent project: what was your role?
What kinds of challenges did you have?
Tell me about the problem you solved that you have the most pride in. When was it and what happened?

Tell me what you are learning about these days.
-Side projects
!!Intro to Android /-- Start here, most popular google hits are out of date :)
Use android support library (selection in SDK)
Create Android Application Project
Create an android virtual device(AVD)
  - Set an SD card
  - Create snapshots (VM style)
Launch AVD from AVDM

Activity - Intent - App  whats the relationship?

Everything in res is autogenerated into
* If this gets out of wack, clean your project

Everything in android is a view - buttons, controls, etc are views
Activity.onSaveInstanceState - used to save everything when user changes orientation, switches app, etc

Can I write an app for alec?  Click on letters to spell words?


Pick C
filter letter list based on dictionary?


After finishing a word go grab an image from wikipedia of it?  (hmmmm...could get messy)

Intents wrap Activities
An activity can launch another activity by creating an intent.

Hand off loading to Loader (vital if doing network, probably good idea regardless)
Use AndroidHttpClient to execute web requests
Open templates for requests using a resource from the context

* Pairing is a skill you have to learn
* Mostly communicative norms, like a foreign language
* Arlo converted 198/200 people to pairing (introverts, skeptics, etc)

* If pairing is not working, then it's because the team has taken for granted how hard it is to learn
* 3 weeks to break-even productivity if pairing 100% of the time

!! Cronology
* First two days - this is a good way to collaborate and learn
* End of first week - this is exhausting, too much noise
* 2nd week - same
* End of week 2 - filters are starting to build, still hurts
* Sometime in week 3 - Huge payoff is discovered:  huge bug fixed easily, fewer meetings, pair-thinking, etc
* week 4 - lots of wins, lots of converts

!! Arguments
* What about half-day pairing - probably takes longer.  Approach pairing as an experiment, something the team wants to learn/try.

!! Arlo rules
* Full team must commit
* 4 week commitment
* It's an experiment that can be abandoned
* Team understands it will learn these skills
** Speak in half-sentences (allow the pair to pick up)
** How to talk about unformed ideas safely (accept a low signal-to-noise ratio)
** Establish subconscious filters
** Collaborate creatively
** Collaborative research
** Collaborative analysis and deep thinking

* - Andy Hunt

!!! Very few "Agile" teams are actually agile
* Not adhering to a particular methodology
* Continuous Deployment might be the shining indicator of a truly agile team
** " It doesn鴠matter if your design is awesome and you鶥 figured out the customer鳠needs if you can鴠then actually get software out the door consistently, reliably, and automatically."

!!! No one likes change
"What folks want is new and different results. Preferably for free, without having to change anything significant. But most of all, folks really don鴠like to be changed. For any chance of success at all, change needs to come from one鳠own desire. It鳠like the old joke where the lightbulb has to want to change. "

''What's the upside for me?''

!!! Experiments as a first-class feature of the methodology
* "For novices, the feedback and evaluation are very concrete and unambiguous, with no judgment required. That part comes later."
* Experiments are time-boxed
** Limit risk, limit the "change" fear
* Everyone participates in the experiment and the evaluation
** Put your egg in
** Participation is KEY

!!! Build feedback loops to advance
* Try it before you "buy" it
* Encouraged to modify and reject experiments

* Closures
* Interface enhancements
* Bulk collection

shapes.forEach(s -> {
  if(s.get Color() == RED)

In essence, a community is a collection of relationships.

!!Social capital
* trust, reciprocity, cooperation
* difficult to build, how likely people are to do something for you, how likely you are to help out.  

!!! Trust
* You do the things you say you'll do
* If you know there is a trust boundary, don't get too close to it.  Don't press your luck.

!!! Reciprocity
* Do good things without being asked
* If someone does something good for you, repay that in kind

!!! Cooperation

!!!Positive Conflict Resolution
* Accept conflict, look for good result
* Interested in building relationships (between the parties and between each party and you (relationship-triangle?)

!!! Find Out
1.  What is the main problem?
2.  Who is involved?
3.  When/where did it happen?
4.  Is this dangerous?
* Improve Cycle Time
* Smaller Batches
* High Quality

* Major disruption environment
* Customer uncertainty
* What do people want?
= __Lean Startup__
* Avoid Building the Wrong thing efficiently
* Find the Right Thing
* Remove barriers to real-world
* Help kids open up
* Push boundaries
* Building empathy

* Mobile apps are the bridge to real-world pitches - Give kids scaffolding
* Change perspective by changing environment
* Get Out - ''Iterate'' - Pivot
* Embrace Failure - Let them fail
* Self eval, Peer eval
* Constant communication creates safety + comfort

* Great Idea gong
* Taught by critique
* No tutorials
IoT client giveaway - neat lamp that lights up when mentioned on twitter

Hackathon every 2 months?

How do we build slack?

So I've tried to explain a phenomena to a few people lately and I keep falling flat.  I can only conclude I'm explaining it badly, or it's a solved problem that I haven't seen the solution for.

So imagine some legacy code.  My most recent example was a chunk of a few thousands of lines in a class spread across a handful of methods.  Pretty much status quo for this app, but this was particularly painful because it was a huge chunk of the business rules for various validations.  There was temporal coupling, where half the code was basically ignored under some conditions.  This caused some issues when we'd go to add new checks - it wasn't apparent that this 1200 line chunk was effectively dead code under normal operations, because the coupling was enforced three layers up.

So we did our due diligence and got most it under test coverage.  At least to the point where we felt comfortable pulling at it a bit.

It's hard to describe test-driving a change where the "wrong" solution is already in place.  Here we have 6 years of tweaks and pokes of fairly complicated code all dumped in the middle of an even larger class (this logic is probably 5% of the total class size).  It's a big, awful, mess.  I had two goals in mind:

1)  Make the temporal coupling explicit
2)  Put a fence around this minefield

So here's where I have trouble explaining what happens.  Here I have a chunk of code.  I want to change it safely with small refactorings.  So I make a small change.  Run my tests.  Repeat for hours/days/whatever.  Unfortunately, unlike "normal" TDD - I'm not getting feedback on design direction.  I'm running my tests constantly and staying green, but I have no idea that this idea for trying to pull out a class is a good one.  Or that changing the return value on this method helps in any way.

I think part of the problem in my explanation is that I'm saying "refactor" but I'm really talking about "re-design" in a significant way.  Refactoring a class is easier to think about; hopefully I can wrap my mind around all the relevant parts and keep seeing the simple steps forward.  This is still refactoring in the application sense, I don't want to change it's behavior.  However I do often want to change how several classes work together to simplify the design.  With TDD that's easy (for me), I just listen to the tests.

Normally in TDD I can listen to my tests.  If the setup is excruciating for a test case I can see where it needs to change.  If the assertion is complicated, I can see that I'm probably testing via the wrong method.  If I'm copy/paste/hacking chunks of code around, that's an alarm that I'm making this too hard to understand.  Tests provide great FAST feedback on design decisions.  I detect obvious seams and can see where my classes are taking on too much responsibility.  I can make little experiments very quickly and get that fast feedback where a first class collection worked well here, but introducing this value object didn't clear much up.

With this case - we have a ton of painful tests.  Think about how many unit tests we needed to cover all the conditional complexity in this example.  I'm completely immune to this pain - I just spent days sucking it up to get the code under test.  And I don't want to change these tests - they're now my safety net for future change.

So yes, I make my changes.  I run my tests.  I keep the bar green.  But I'm not getting anywhere.  I might spend hours gradually building the wrapper for this code and plumbing it through the layers.  Just to find that it won't work because X.  Or it's making things worse!  Some abstractions just don't work.  How many code bases have I dumped a new idea into that didn't take off?  Too many code bases are swamps of vestigial tails.

I've only stepped away from one of these sessions twice feeling like I'm now "ok" with this code.  *That* problem won't haunt my dreams forevermore.  The first time I was extremely lucky.  Everything just worked, I focused my chi, I was guided by the Muses - just one of those "zone" experiences that only seem to happen at the rarest of times.  Generally I fail/fumble my way to a solution - I tell myself it's the scientific method.    I have no idea how to reproduce this miracle, I took small refactoring steps as I'd prefer to, I just always picked the right one that led to a simpler solution.

The second time I essentially started test-driving the solution from scratch.  I built the whole thing up again, using the existing tests as my guide.  And then I had a big-bang switchover where I drove the new solution with the old tests before deleting those monstrosities forever.  And that sucked.  First there was the process of doing 4x the work of just getting it under test in the first place and hacking something together.  Then there was the problem that the new solution was completely worthless until it was done.  Then there was the integration step at the end.  Back to the bad ol' days of pulling it all together at the end and wondering why it didn't work.

I've tried to detect places where you can split the big ball of mud and test-drive those into smaller-bang switchovers.  But I seem to pick the wrong splits to keep my old tests working and still move towards a better design.  In this case we were just trying to get it all into a single terrible class.  And we couldn't figure out how to get there from here without breaking everything.  Twice.

Every other time, I've tried what seems like the safe route.  Get it under test.  Refactor the obvious stuff.  Hem, haw, and pontificate.  Get burned out and move on to something else.

There has to be a way to handle this problem.  If not, we're screwed, because code like this isn't going to be wished away.  It's strange that when we build every line of code of a project with an eye to the future,  it doesn't last.  But if we get a few things right, we can pile terrible hacks on top of it for decades and it just keeps plugging along.

Any ideas?
Jeremy Miller @jeremydmiller

First used in production in 2004
Nothing remains but the name.

!! Long lived codebases
* language has evolved
* use cases become obsolete
* new cases become very important
* architecture is obsolete (no xml)
* Tooling evolves
* performance and threading issues due to adoption outside the original case

Need feedback mechanism to evolve

"Crimes against computer science" =  Instead of re-architecting  just bolt it on.
** Used chain of responsibilty to fix a deep copy

!! Architecture cannot be Set in Stone
* Should have done a rearchitecture
** Key question:  Why is this thing I'm trying to do so hard?  Don't get locked into a bad idea.

!! Re-write or Improve in Place?
** Started a re-write, got distracted, bombed.

!! Automated Testing
* You have to do both acceptance and unit level
* Self contained acceptance tests - test inputs should be defined with the setup (no fixtures for acceptance tests!)
** Follow same rule with unit tests - duplication is A-OK

!! The great refactoring
"When we say big refactoring we're lying...It's fine I'm just rewriting the whole data layer"
* Introduce an alternative programmatic configuraiton
* New, better ways to do it
* Tried to shove a bunch of wouldn't it be cool features

!! Don't couple runtime code to configuration
* Aerosmith doesn't setup the stage
* Roadies do configuration

!! Build features for real needs

!! 2004 vs 2015
* 2004 Everything explicit "never surprise me"
* 2015 Try to figure it out "just let it work"

!! API
* Don't let the impl bleed through the API - hard to change
* Be the client first
* Be consistent

!! Diagnostics and Errors
"Here's your error.  And here's what you might do to fix it."
If you have any magic - provide diagnostics that explain the magic for a given input

!! Documentation
"Do as I say, not as I did...."
"Living" documentaiton - part of your build process. - save yourself the future headache - bad documentation is a constant pain point.
*** DocTest

!! The cost of backward compatibility
* You cannot win
* Take the trash to the curb
* "Python 3000"
* Semantic Versioning

!!! Concepts
Forget about nil
declarative modeling
Let the compiler drive

!!! Forget about nil
* "Whats the return type?"
* if nil is involved, it MAYBE will return the correct type
''consistent return type''

Maybe ''will'' go viral => good thing
Can handle errors at the edges.

!!! Declaratively modeling our domain
WE can't control transitions. Going from creation time to "full valid" object provides a state where a model might be inconsistent.
So we code defensively to keep things from blowing up.

//Interesting observation!//

Haskell forces us (via compiler) to handle all the types of the customer whenever we use a customer.

!!! Composition
* Use domain concepts as things
* Build big things from little things

Change is cheap before the implementation

''Types provide context''
  type chunks :: [String]

//I like this idea of types avoiding primitive observation - seems cheaper than a class//

Build a mirror with live data (weather, calendar, notes)

15" LCD with 12"x12" mirror seems the cheapest, materials in the $150 range.

Or a LCD controller

Or a LCD controller + screen
!! Six questions you should know the answer to about your manager
* Where does your manager come from?
* How does your manager compensate for their blind spots?
* How does your manager communicate to the rest of the org?
* How does your manager talk to you?
* Do they do what they say they'll do?
* Do they make things happen?
* What happens when they lose their cool?

!! Freakouts
* Don't pile on
** Listen, nod
* Give the benefit of the doubt
** They've obviously given this a lot of thought and it concerns them
* Ask questions - try to move towards a rational conversation
* Listen for solutions

!! Agenda detection
* Identify Pros
* Identify Cons
* Identify Issue

!! Make a rolodex
* People you respect and would go to war with again

!! Teams
* Incrementalists need Vision
* Completionists need Action
* Pair Incrementalists with Completionists

* Don't feel sorry for myself
* Don't blame others for my choices (My boss made me)
* Embrace change, adapt
* Accept that some things are outside of my control, focus on what I can change
* Don't try to please everyone - be kind and fair
* Don't fear calculated risk (CBA)
* Don't dwell on the past - acknowledge past, embrace present, plan for future
* Don't repeat mistakes
* Don't resent others - celebrate their accomplishments
* Use failure to grow and improve
* Don't fear being alone
* Don't feel entitled - try, fail, adapt, try again
* Don't expect immediate results - anything worth doing takes time
I need a mentor
 (Venkat, Angela, Doc)?
* What do I want?
** Advice on delegation, letting go, finding time
*** Angela on Collaboration, Cooperation, Delegation - consider each person is an autonomous agent.  They have to agree to be delegated to.
* How do I approach it?
* What do I offer?

How to be sociable?
* Canned icebreakers

!! Mentoring
* What is the one thing a student can do to move them forward?
* Encourage Why? And beginner questions.
* Being Geek - Michael Lopp
* How to get an inexperienced mentee engaged with solo experimentation and discovery?
Will Evans

6 Keys to Lean Startup
* Uncover your customer's pain points through research
* Invalidate your assumptions
* Formulate hypotheses
* Experiments, Not Features
* Learning isn't failure
* Amplify what works

Think -> Make -> Check -> Think -> ....
As quickly as possible - start with what you're trying to learn.  What's the smallest thing you can do to get feedback?  1 hour sprints, 1 day sprints.

Lean Startup: Customer Development Process
1)  Problem Solution Fit
Focus:  Validated Learning
Experiments: Pivot
2) Product/Market Fit
Focus:  Validated Learning
Experiments: Pivot
3) Scale
Focus: Growth
Experiments:  Optimizations

1) Clearly articulate & test your assumptions about the customer - "The customer is the person that gives you money"
2)  Get out of the building
3) Fast Think > Make > Check
4) Think in terms of experiements (not features)
5) Iterate
6) Don't sink time into something that hasn't been validated

!!! Minimal viable Product
* Means something different to everyone

In Lean UX - It's the minimal amount of effort you have to do to make one turn of the feedback loop.

"Features based on user stories without customer validation are called guesses"

Solving Customer Problems

Cycle Time

The delta between a prediction and the observed outcome is the "amount" you've learned

!!! 4 Kinds of MVPs
* Exploration - investigation with a customer's problems
* Pitch - attempt to sell
* Concierge - Provide the proposed product as a manual service (no software product)
* Wizard of Oz - Small testable model that exists to generate feedback

!!! Vanity Metrics
* Don't lead to action
* Always go up (and to the right)
** hits, followers, etc

!!! Good Metrics
* Actionable
* Accessible
* Auditable

!!! One Metric That Matters
* Capture everything, but focus on the most important team
* Success == THIS ONE THING
* Forces a line in the sand
* Must be a ratio
* Must be actionable
* Must be understandable and auditable

!!! The LeanUX Kata
* Who is the customer?
* What is their problem?
* What do you know and how do you know it?
* What are your assumptions? How will you test them?
* What have you learned and what should you learn next?
* What is your very next experiment?
* How will you measure it?
* LTE network latency is ~50 ms

!! Big steps
# Distribute Delivery (CDN)
# Store objects closer to the end user (Advanced CDN (pre-cache)), user cache
# Decrease end-to-end time

!!! Dynamic Content Accelerator
* Essentially a private backbone to conquer a geographic constraint (edge-to-edge)

!! Optimize for Mobile
* Deliver mobile content first - Make desktops throw it away
* Mobile browsers have small caches (32M)
* Send the right images (use headers)
* Pre cache based on user's guided experience (interaction diagrams?)

!! Embrace mobile constraints
* Imagine no cache.  How do you conserve power (avoid requests)?
* Assume user will not stay connected.  How will they use the app?
* Avoid Polls
* Group requests and pushes

!! Ideas
* Monitor state of radio and piggyback when its active
* Decouple UI from network calls
* Burst and idle
* Optimize network for bursty traffic like that (TCP window adjustments)

!!! Fundamental problem with software estimates
* Estimates work well on products - you've done the same thing many times and have a good idea what it takes.
* Software isn't a product, it's design all the way through.
* If you get to the point where you can estimate accurately, you've screwed up.  Since a software product is FREE to duplicate, your estimate should be zero by the time you can estimate it accurately.
* It doesn't matter what you estimate if you build the wrong thing
!!! Flip the question around
* What estimate would change how you approach this problem?  Does it make a difference?
* What's the go/no-go figure?
** Sometimes it's easier to say what can be accomplished on a budget rather than "what's the combined time for everything I might want?"
** Could this drive us to decide when to pull the plug on a project?
* How can we make better decisions?
* Can we prove estimates help us make good decisions?
* Would you prefer to hit the deadline if it means you don't get what you want?
* If we spent the time estimating on building the project, would we learn something useful?
** So rather than spend two months figuring out how big it is, spend two months building it and see if it's worth pursuing further?
!!! What if we could decide when to start and stop projects?
* Focus on modeling values and risk
!!! Why are estimates attractive?
* Estimates are easy.  They make decisions easy
* Should we have confidence in them?
!!! Where could this go?
* What if we could build the top %5 in a week?  Release, measure, iterate
* What if a week of work could fund itself?
* By quickly adding value, increasing efficiency or increasing revenue - we can fund the next piece.
* We stop when something else shows up when there doesn't seem to be additional value of something else seems more valuable
* What if I have to pick between multiple projects?  How about starting them all and figure out which one is most valuable TODAY?
Same size
Slicing Heuristic
 * One acceptance criteria per story
 * others...
Key to the heuristic is that it's something concrete that you know before you start working on the story
Steve Klabnik  "I happened to get an X1 Carbon. I was coming from a 13" MacBook Air 13", and the Carbon is very similar. It鳠14" though, which is a really nice size; it still fits in the same pocket in my bag as the MBA did, but I get a little more screen real estate. A note for those who give presentations: the X1 Carbon uses a MiniDisplay port, so save your Apple connectors!'


Hanselman: - Zach Briggs

* Everytime you do a google search - make it your own
** Create an index card - search on one side, answer on the other
** Review those cards

* Memorize a good tutorial.  Treat it like a kata
** Spent 40 hrs on Gary Bernhardt's Suck Rocks screenscasts

* Sentinel Object
** Don't return nil!  They're useless in stacktraces.
** You don't need to go overboard with errors either.  Just do something simple:

class Scoreboard
  NoScore =

  def score player
    calculate_score player || NoScore

Leads to stack trace like:
  NoMethodError: undefined method 'each' for Scoreboard::NoScore
Public, part of the users 좩ography�n an internal web site.  Includes past OKRs and 짲ades"

* Discipline + Focus
* Communicates accurately (what is important)
* Establishes feedback loop

* 5 objectives, 4 key results  MAX
* 60%+ objectives come from the bottom-up
* All must mutually agree - no dictating
* One page best
* Not for perf evals
* 60-70% good, 40% bad.  Should be uncomfortable
* Continue with Incomplete Key Results only if they are still important

don't really matter other than to talk about direction

Public grading:
Don't get it, why would you want to sit through that?

Use google sites

!! Strawmen refuted
** OO is not state
** All programs are functions bound to data
** FP imposes discipline on assignment
** OO imposes discipline on pointers
** Design patterns are useful regardless of the constructs of your programming language

What benefit does polymorphism have that normal Functional Programs don't have? By the same token, what benefit would OO programmers gain from imposing discipline on assignment?

!! OO provides polymorphism.  What does that get you?
Polymorphism inverts the source-code vs runtime dependency.  This provides interfaces and makes plugin systems possible.

!! FP provides immutablity.  What does that get you?
On Being An Agile Change Agent From The Inside - John Ceglarek

* "We sent IT off to learn agile.  We thought agile was a process.  Agile's not a process.  Agile is a culture"
* "The sizing step didn't add any value, so we got rid of it.  We were always wrong anyway"
* If you have to integrate with silo'd teams, you just steal one of their people to pair with you.
* "For every three cards we write, we only end up implementing one...get it into someone's hands and you'll find you don't need it"

!!! How to fund an agile team in a project budget allocation environment

Made the case:  Here's our "contractor" spend year to year
Fund a product roadmap instead - "Eternal funding" for a "product line"
Justification:  "We always need stuff"

Whenever I find myself expressing 졮ti-�houghts I think back to a wonderful trick that I learned from Arlo Belshee and James Shore. They ran a workshop about integrated tests where they asked what benefits they give us, rather than focusing on all the problems that they cause. When they did this, the discussions in the room became so much more constructive than the ones I餠seen online. Not only that, but we (mostly) stopped dwelling on the problems we faced, and instead shared numerous ways that we get those same benefits by other means. It can also help find essential benefits that we don鴠get by other means, and encourage us to look for alternatives.

What is beneficial about estimates? ''They reveal assumptions''

!!! How do we avoid the trust breakdown?
* PO upset about conservative estimates
* Programmers pulling rank to pick an estimate
* PO pressure when estimates are higher than expected
* Work is already committed so estimate is worthless

When the trust is broken, I'll tell you what I think you want to hear so I can get away from you.

!!! Expiring estimates
* Encourage revisiting estimates - say every 2 weeks
** If we're going to assume estimates go bad quickly, why put any real time into them?

''It seems clear that talking about the estimate is more valuable than the estimate itself''
//Obviously true (to me) shared understanding is the thing//

!! A practical alternative to estimating = BDD
* Task/story-level estimates routinely cause more problems than they solve.
* The act of estimating with people that we trust helps us reveal significant risks in the assumptions we make about the work.
* The act of estimating with people that we don鴠trust leads eventually to ritual, Cargo Cult, whatever you prefer to call it.

Figure out:

* What are issues for? (on this project)
* How to tackle?
** Read all of them (find your bearings, what sort of things are common?)
** Do it again.  Now you can triage.
* What's our triage algorithm?
** Is it a feature request?  Do X
** It is a request for help? Do Y
** Is it potentially stale?  Ask if anyone knows if affects the current version.
** Not enough information to even try reproducting?  Ask for more information - ideally the specific things it needs.
** Enough info to repro?  Try against HEAD.  Leave a comment indicating how that went.
** If reproducable, assign it according to the bugfix policy.
* How will you tend the garden?
** Need a scheduled time to stay current on all the issues.
*** Klabnik used github notify and read the emails every morning - small repeatable chunks

!! Results
* 200 issues were closed during the initial run-through (out of 800)
* After two weeks of no comments, the rails team decided that meant the issue was stale. - Close
** Closing is not permanent.  If someone really cares they can reopen.  Guilty until proven innocent.
* 150 more issues closed this way after 2 months.

!! Side affects
* After 2 months of this, knew enough about Rails to know about every open bug and enough to submit patches or at the least leave dead-simple reproduction instructions for someone else to pick up.
"The only thing better than reproduction instructions are when those instructions say git clone."

* After stopping the constant tending the issues blew up again.

Creates images for multiple providers (VM softwares) from a single template.

Think of it as a speedier way to do the initial vagrant install (provider + provisioning)
Will Dages -

1M pulls and 1M pushes a month for free
Easy to use, lots of options for integrating with other service
Create an app on, quick start, pick your platform
Parse will autogenerate help text to the SDK and API keys(if using web)

function saveQuote() {
   var Quote = Parse.Object.extend("Quote")
   var quote = new Quote();

   quote.set("key", value);
   ..., {
     success:  function(quote) {
     error: function(quote, error) {

function getQuotes() {
    var Quote = Parse.Object.extend("Quote")
    var query = new Parse.Query(Quote);



     success: function(results) {
       $ ("#quotelist").html("");
       var template = Handlebars.compiles...

       $(results).each(function(i, e) {
         var q = e.toJSON();

     error: function(error) {

Parse can allow some code to run on their server "CloudCode" - parsing, validation

Do something - creates a "project" on your local file system
 - Looks like JS

Parse.Cloud.beforeSave("Quote", function(request, response) {

 response.error() //-- sends error callback

  request.object.set("by", "Anonymous")

Another command sends the project back to the server.  No need to reload clients, just run the app.
Provide service to track inbound helicopters to a hospital

Needed a cloud based solution (no servers, no IT staff) - cheap hosting for hospital budget
200 records, 20000 read-writes

heroku, ruby, sinatra, couchdb, redis

Used resque to mock out dispatcher calls

dispatcher -> resque -> couchdb -> hospital

most of the work is just plain ol development, small slices for mobility and cloud

Hospital polls
Hospital has push capability just to request a helicopter

!!! Issues
Heroku assigns blocks, but you cannot request more when load increases.

Creates lots of queues to take that fixed block allotment and assign resources horizontally.

All these queues causes a request to split into multiple transactions (parallelism, right?)

!!! Patterns

* Dynamic scaling
* Colocation - colocating data and processing to cut response times

Async processing is king because data is orthogonal and easy to correlate

* Loose error handling - if it's wrong, don't worry about it

*Receipt pattern Return a receipt for an async call.  Caller can then use that receipt to make another call to check on the real-time status of that operation (like a UPS tracking number/ coat check)

* web api
* pub/sub - uses redis - an in memory database
** redis is a cache that supports 5 data structures (strings, hashes, lists, sets, sorted sets) with the BigO performance you'd expect for each type
**  It has support for pub/sub among many other things.  Supports partitioning, replication, etc.

* async sinatra
** Sinatra::Async allows a request to complete async, sending the response to GET/POST etc later.  Use aget in the sinatra configuration.

server-side caching is good?
!!! Security
 - key based system with known pad challenge
 - All data goes away after flight ends

!!! Postmortem
AWS is your weak spot - all systems seem to run on AWS
Cloud developers don't need to know a lot of "cloud" stuff, it's more important to know all the systems and how to put them together (systems engineering)
Use simulators
* Use named roles instead on "I" in scenario
* Describe they system instead of what the user should do "I should see"
* Avoid ambiguity

  Given I login as Mary
   When I have a lamb
   And I go to school
   Then a lamb should go to school

Given ''Mary'' had a little lamb
When ''Mary'' goes to school
Then ''her'' lamb ''goes'' to school
* What do you like about this evil thing?
Let them answer. Allow for some silence. Let them answer further. Let them notice that they actually like this evil thing more than they think. Now, once they鶥 got that out, ask them:

*What other things can we do to get all these benefits?
* Pinch hitter
** Verify posts

* Clojure
** re-build hot or not
** Something with hobbitses

* Scala
** Rewrite play tutorial test-driven

* Python
** Leandog dashboard

* Stack overflow
** Mind map

* Finances
** Next steps

* Gametel
** Add List View accessor

* Blog
Re-read TDD and live blog it

Requests for estimates with a high-level of precision (hours/days) are a sign that management does not trust you.

Build trust by delivering frequently, demoing frequently - basically giving the impression that you get shit done.

Teams need to finish features.  Maybe not at a predictable velocity, but they get to done.

숯w much will this project cost? When will this project be done?� Even with all our expertise, we're giving you a guess.  Are we negotiating a contract or trying to make decisions here?

Better question:  Is this project worth doing?  Given an order of magnitude estimate, would you want this project done?
"If we spend time on this program, will we get something valuable that is releaseable to customers before we鶥 spent all our money?튊If we're not sure, suggest using the time (that order of magnitude) that the estimate could be off by to build a walking skeleton.  Now that it took us this long to get this far, do you still want this?

Embrace change!  If we can release something in x weeks, then you can decide if you want to spend another x weeks working on it.  Or if that release teaches us something we can radically change our direction.

Run to a milestone.  Once we hit this place, what does the situation look like?

If I discover the program is not on track, when would you like to know? As soon as I know; after I鶥 done some remediation work; when I鶥 done everything I can and it鳠a disaster?

Software is about delivering value.  Getting value sooner is better.  Large things are a waste of time, the value is always hidden inside there.  Do the small stuff.  Do the most valuable stuff first.  Everything that is valuable today may not be tomorrow.  These valuable things have to work.  They have to continue to work.
Bill Horan - Bressler Group

Get pics from phone
Mike Ward

* Has a virtual DOM like React
* One way data flow
* Does server-side rendering
* Use what you want, plays well with others
* Only has 12 APIs
* 20K

!! Plumbing
* Source the "tags"/components
* Mount the app

In React you start with JS and put HTML in
In Riot you start with HTML and put JS in

!! Style
* You can put your style in the component
* markup, style, js all in one place
* supports sass, less

Len Smith
Slides:  es6 to es5 viewer

surge - static site on the web:
npm run build && npm install surge && surge


Can share store between react-web and react-native
In practice the views are quite different so you need two codebases

Skip to the end:
Kevin Swiber @kevinswiber

Works on Zetta

Zetta hubs connect to devices and local clients.  The zetta hubs have APIs.  Another zetta hub/serer can exist somewhere in a data center and proxy calls between the internet and the other hubs.

!!! Desired Architectural Problems
* Decouple implementations (devices in differnet locations/zones should be able to evolve indepentdently)
* Independent evolution
* Scale
* Load balancing
* Centralize complexity, distribute simplicity (taken from xmpp)
* Reduce latency
* Support event streams
= '' Good fit for REST ''

!!! Hypermedia spec

!!! How HTTP streams are done
* Webhooks
** Requires registration
** params can get stale

* Chunked Transfer-Encoding
** Not well supported

* HTTP Pipeling
** Not really used by anyone (keeps socket open - kinda slow)

* Long Polling
** kinda slow, awkward

* Server Sent Events
** Not supported by IE

!!! Other protocols
amqp  (rabbit mq uses this)

!!! How it works
* Model responses (future request) based on current state
* Model resources as finite state machine
* Zetta built on nodejs

!!! Reactive clients

Load a url, parse the response, subscribe to a resource.

!!! Producer-Consumer problem
** Consumer can't keep up with producer
*** App crash
*** network throttling
*** server resources

!!! Reactive Stream Control Protocol
*** Consumer controlled streams
*** Runs over websockets
*** Multiplex streams
*** uri scheme definition

Zander on setting up a VPS:

Stuff from Zee:

Stuff from Levi:

Tmux woes on OSX:

SSH+Tmux pairing on a mac: - google hangout:


Zander is using for a virtual office where everyone has an office and you can move your avatar to go talk to people.   Pretty awesome idea.

** Doers
** Trustworthy + Trusted
** Can write (much remote communication is asnyc)
** Can handle less social workplace (fewer opps for chit chat and bonding)

** Group chat (campfire, hipchat, etc)
** Video chat (skype, hangout, sqwiggle)
** Email, IM
** Trello (light weight work tracking tool)
** DVCS (github)
** iDoneThis or other standup type tool
** LastPass (no need to ask for credentials)
** Collab writing tools (Draft, Google Docs)
** Hello Sign (for signing docs)

* Process
** Explicit shared values and vision (all hands on deck for support, high quality, etc) - 'How Things Work'
** Weekly hangouts
** Weekly Learning
** Monthly One on Ones
** Daily feedback - don't leave people on an island
** Regular in-person team building (culture)
** Automate everything
** Random checkins (try to stay connected with what other teams are working on/good at)
* Tightly scoped
* Explicit Dependencies
* Minifies, Optimizes
Rider is rational mind
Elephant is emotional mind

Put both in a room - who's going to win?

Provide a path to adopting something new - don't just say it's cool - provide a compelling argument of why and HOW to move from x to y (business case).

Sometimes we shouldn't dive in and refactor.
* What if you can identify lots of potential ways to fix it?
* What if none of them is compelling?
* What if you can't think of a name for an extracted responsibility?

This is sorta similar to Beck's DRY rule.  If you copy it once, cringe a little but do it.  If you copy it twice, start looking really hard to eliminate.  If you do it a third time, it's worth a lot of effort to DRY it up.
Scala scales - It's performant, supports actors and parallelization.  Has interesting pattern matching feature.

Ruby has more gems, stronger community

Scala can be snuck into a java shop (Eckel)

Both have cleanish syntax, lambdas, implicit types (duck typing), dynamic calls, mixins, testing support

# All the tests pass.
# There is no duplication
# The code expresses the intent of the programmer.
# Classes, and methods are minimized.

Uncle Bob:

We can change Ron's rules for Simple Design, into rules for Simple Tests:

# The test expresses the intent of the programmer
# The test passes.
# The test has no duplication.
# The test has a minimum of classes and methods.

In the TDD cycle, this means that we first write a portion of a test; and before we make it pass, we clean it up to ensure that it says what we mean it to say. We get that tiny portion of the test to express our intent; and then we make it pass.

The red-green-refactor cycle becomes Red -> Clean Test -> Green -> Refactor.

cargo is both a package manager and a build system

crate is a module, binary or library.  They are compiled in parallel, though each crate is compiled serially.  So a common pattern is to break a binary into libraries to get a faster compile.

semicolon on each line unless it's the return value for a function (expression-based langauge)

Borrowing vs taking the value (pass by reference).


Controllers deal with the real world - they do the "unclean" stuff.  State, side effects, etc.

SRP: Easiest to talk about, one of the hardest to get right.
OCP:  How do you extend in Elixir?
 {{{ defprotocol }}}
* this is like an abstract "method" that needs to be implemented by implementations.
 {{{ defoverridable }}}
* this allows you to do override an existing implementation when you {{{use}}} a module.
ISP:  Making a commitment to decrease the volatility of a particular area.  These are the things you can depend on.
LSP:  If you say you're going to do something, you should do it.
DIP - Caller owns the protocol that the dependency implements.  Ripples only go in one direction - down to the details.
* TDD - Caller wins!

Human beings think in abstractions - not details.  Named abstractions allow us to group details into larger concepts.  This allows us to keep building higher and higher abstractions that can solve bigger problems.
Connect to remote machine and tunnel their http access over port 8080 on localhost

!! Cmd line
ssh -v -L 8080:localhost:80 -p 2298 <username>@<remote_ip>

!! .ssh/config
host remotemachine
  Hostname <remote_ip>
  Port 2298
  ForwardAgent no
  ForwardX11 no
  User <username>
  LocalForward 8080

"works by taking a failing test and progressively inlining parts of it until you can't inline further without losing sight of the defect." \

1.    Inline a non-working method in the test.
1.   Place a (failing) assertion earlier in the test than the existing assertions.
1.    Prune away parts of the test that are no longer relevant.
1.    Repeat.

1.  Literally replace the method call with the source code IN the test.
1.  Move the assertion into the source code section.
1.  If that fails, you can delete all the code after that.
1.  Move your assertion up another level and keep trying, inling additional methods as you go.

Bruce Eckel

- Objects are a good way to structure code
- Scala brings in functions as first class as well(OO + functional)
- Raises the functional level of abstraction on procedural code
- Since scala compiles to .class files, it can be trojan horsed into a company
- Typesafe:  Maintain scala, akka, play

class Dog(age:Int, val name:String) {
  def indent(id:String) = name + age + id + Dog.dogCounter

  //Note that anything passed into the constructor is automatically a member and accessible throughout the class

object Dog { // Companion object
  private var docCounter
  def +(n:Int) = dogCounter += n

//Companion objects are utilities (like static methods on a class)

object BasicClasses extends App {
  val dog = new Dog(4, "Comet")
  Dog + 1 //Dog.+(1)

case class => Used to do DTO/structs
case class Person(first:String last:String)
public members, hashcode, equals, toString do what you'd expect

 * //This talk seems to be mostly about how scala reduces java noise//
 ** //The result is very similar to ruby//

  s.foreach(x => x.draw) //closure
  s.foreach(_.draw) // perl like

passing blocks
parallel collections
val a = future { pause("three", 3) }
val b = future { pause("one", 1) }
val c = future { pause("two", 2) }

  val result = for {
    three <- a
    one <- b
    two <- c
} yield one + two + three

Must have scala-library.jar on the classpath when calling scala from java

(1 to 10).groupBy(_ % 3)
 = Map (2 -> Vector(2, 5, 8),
        1 -> Vector(1, 4, 7, 10),
        0 -> Vector(3, 6, 9)
}}} for examples from talk
Scala streams can be passed to other functions to add one more to the stream without recomputing all those that came before.  Calculating sensor offsets seems like a plausible use case.  Another is breaking a search after finding the result, while in the iterator.  So you don't need an interim data structure.

Clinton N. Dreisbach

Mind Blown.  @cndreisbach enthusiasm for clojure is contagious.

!! Tools
Ring is Rack for clojure
 Middleware is manipulating requests (auth, mime-type, routing, etc)

Routing - Compojure
Templating - Hiccup or Selmer
Asset pipeline - Stefon
-Luminus wraps up these libraries as Leiningen tasks.  Get started here

!! Hoplon
* HTML as clojurescript
* Compiles to static files, drop in anywhere

!! Liberator
* Provides resources
* Resources are decision trees
* Every result in liberator is added to ctx (fold back it into the context, call the next one in-line)
* Override the decisions (allowed? authorized? exists?) to inject handlers in the code for that kind of request (200, 404, etc)
* Provides default responses in the representation that the mime-type is asking for - want json?  want csv?, want html?, want xml?  \\This sounds awesome for testing\\

!! HTTP Kit
* Supports web sockets and long polling
* Supports streaming
* SO fast!

!! Resources

Brad Colbow

!! The asthetic
!!! Contrast

' I will never make it as a designer because my brain does not work like the common'
What's important, 2nd important
What goes together (subtler)

!!! Repetition
Sets up patterns, used for "scene" changes

!!! Alignment
Grids can keep a page together when one element might break the normal borders and contrast

!!! Proximity
These things grouped together

!!! Hierarchy
Create levels to the design - important stuff at the top

!!! Intent
"Design is the rendering of intent" - Jared Spool

Comics often create a confusing panel order - what's the intended way to read this
Hamburger is not an obvious menu button
Leave the user a scent (like a bloodhound) - how do I get back where I was?

When everything is exciting, nothing is exciting
Simple Rule:  Do the expected in an unexpected way

!!! Interaction
* Wireframes - capture features but don't capture interactions

Found the first few days of the project were the most important
steve's web notebook
Charlotte Chang

* Find a mentor:
Looking for an idol: Realizes code is writing, good at empathy, codes 90% of the time while still being an influential and useful person, realizes coding is usually the least important thing, but has managed to get everything else right so that coding is joy. Understands that being part of a team is teaching and knows how to present information in such a way that it's understood and need not be repeated.

* javascript koans
* xmpfilter
* emacs

* Docker as a New Guy bootstrap tool (redo vagrant project)
* pinch_hitter
** Re-investigate issue, try to think of a way to accomodate or build in another gem?

* pretty face history
** Jenkins like history of scenario counts and passing
** Incorporate timings?

* Data Personas
** Stewing

* Take notes
** - 10 mins in, looks good

* Blog
** Script + slides from cukeup
** Coding analogy - Eggs, steel blocks / rocket precision machinery, legos, new

* exercism and work on some issues
** Sign in
** Next exercise
** Review 3 exercises
** Look for issue
Simon Sinek
  * Why? //you get out of bed//
  * How? //you work (values) //
  * What? //you produce//

Seceding vs Replacement

Start by having conversations, engaging both testers and business stakeholders or their proxies (analysts are good here). If you can鴠have those conversations, stop. You can鴠do BDD. You might be able to write some scenarios or some acceptance tests, but they鲥 likely to be brittle and it鳠unlikely that anyone will be interested. Here鳠why.

* Focus on Discovery - Deliberate Discovery
* Realize this isn't about testing or tools
* Write fewer scenarios
* Assume you got it wrong
** You never get it right the first time

!!! Two problems to unlearn in TDD
1) Changing Impl details breaks tests.  Lots of tests.
2) More test code than impl code

!!!! ProgrammerAnarchy - Devs work directly with customers and throw the code away after a year.

!!! Where did it all go wrong?
* Not testing behaviors - Dan North
* Coupling impl details to test because of failure to refactor

!!! When do I write my next test?
* NOT when you add a method
* When you add behavior

!!! Test the Surface Area
* Only test the surface area (public API to the module).  Treat it like a box.
* Start with the "Best possible application public interface" Program by wishful thinking

!!! Kent Beck's definition of unit test:  A test that runs in isolation from other tests
* This is different than the rest of the industry - OOPS
* NOT testing a module in isolation
* NOT only one class under test
* YES - no side effects
* Test is isolated, not the system under test
* NOT - mocks everywhere specifying too much impl detail
** Only mock things that keep the test from being isolated, not things that keep the "class under test" isolated.

!!! Red -> Green -> Refactor
* Quick green excuses all sins -> BE SINFUL
** It's difficult to think about both solving the problem and engineering it well
** Don't do engineering yet - you don't know if you're going to SOLVE anything yet
* Refactor -> Now you can be clean
** Refactor to patterns
** Don't write new unit tests!
** You need a new class - Do it!  Don't write tests for it.

!!! Ports and Adapters
* Unit test at the port - Tests are an adapter running the code
* System Tests are at the boundary

!!! Gears
* 5th gear is obvious changes - we can't get to green because this obvious refactoring is distracting us.  Just do it - but don't get carried away here.
* 4th gear - hack your way to green
* Downshifting - Getting sticky here, not sure how to find my way through.
** If I throw away these tests will I miss them - do I still have tests that check the behavior from a port-type level.
** These tests are coupled to the implementation
** Maybe I should leave them to help another programmer find his way through
** Middle ground - maybe comment that these tests are deletable if they get in your way - Feel free to delete these tests.

!!! Mocks
* Don't mock internals, privates or adapters

"Tests don't enable change. Tests prevent change!"

Mostly we want tests at an interface level (API or UI) but that makes for UGLY tests.

!! Generative Tests
(Or property-based testing)

In generative testing we can't know what the inputs are so we can't specify what the outputs are.  But we can put bounds around them.
 Maybe, it should be between these values. It should go down as this input value goes up. It should never return more items than requested, that kind of thing.

!!! What should we end up with?
This doesn't preclude small tests that drive our class design. Use them, and then delete them. This doesn't preclude example tests for documentation. Example-based, expected == actual tests, are stories, and people think in stories. Give them what they want, and give the computer what it wants: lots of juicy tests in one.

Points out this is way harder and requires thinking about boundaries that we usually don't worry about.
//I wonder if this would encourage a more failure-resilient thought process?//
Unity - runner
CMock - mock headers
Ceedling - rake tasks to automate - can do things like sub in test headers and what not

Is CMock the tool that lets you auto-magically mock out 21 headers
- it's used for expectations
- Creates a mock version when you add a mock_
- Links in the mock c impl instead of the "standard".c
* Set aside time for TD - pay down before adding features

The failure to make the program align to the current understood operation of the system - me paraphrasing Ward
* Each disagreement with reality is interest
* Bankruptcy is when you don't trust the code.

Safety is a keystone habit - this habit grows a culture of excellence.  Keystone habits shift, dislodge and remake other habits.  Like exercising leads to eating healthy, leads to avoiding drugs, leads to work/life balance.

Tech safety is a pathway to excellence - not an end in itself.

Tim Ottinger, a veteran coach at Industrial Logic, said, "It's in the constant, daily decisions that tech safety has meaning. We don't settle for learning to cope with failures, flaws, injuries, irritants, etc. Instead of accepting a poor work system and an unsafe environment, we transform our environment in ways large and small to make it less prone to failures and injuries."

Tying TechSafety to AntiFragile:
Failure is inherently unsafe and most teams and organizations are not places where we can safely learn from failure.
 * My hypothesis is that embracing failure (vs XPs embracing change) is the way that we can build high quality software fast.  If each failure/injury makes us stronger - is that an antifragile system?
Let me explain further. Failure 㠦or most of us 㠩s not an enjoyable experience. However some of us have become good at it. And the major reason behind this is SAFETY. If we feel safe to fail, and are rewarded for it regularly, we can find ways to fail fast and learn quickly.
* Making change feel safe = Help people see that others have succeeded + Everyone wants to make the same change + The change is at least as safe as the current approach
* Second-order safety:  We need to see the people that have threatened us for trying to make things better in the past and see that they agree with this change.  You're not on an island, you're going with the group.  Change is the obvious, safe choice.
Ben Rogers

Connectivity is the thing.  Users expect an immediate remote upgrade that will fix the thing or they will return it.

!! Test Rig Basics
* Need loader to load code into a device automatically from ci (can't change a flash card)
* Need to mock IO
* Debug interface is nice

!! Start coding (before picking a processor)
* Uses pi to do prototyping- Pi bootloader
* 1 pi for loader/compiler, 1 pi as SUT

!! Processor chosen, order a devkit
* loader (JTAG)
* SUT (devkit)
* logic analyzer on I/O
* UART for debug

!! During hardware design
* Need to ask for JTAG, UART, pins for logic analyzer

!! We've got hardware
* loader (JTAG)
* SUT (prototype)
* logic analyzer
* UART for debug

!! Better tests
* loader (JTAG)
* SUT (prototype)
* I/O mock (pi)
* logic analyzer for debug

!! Hardware characterization test
* Need tests to replace the datasheet (who's going to remember 1400 pages of low-level detail?)
* Need tests to avoid flaws in the hardware
* Do you want to brick a device because the processor has faultly logic around an instruction?

* Exploration
* Analysis - Did pin analysis to see that a chip was failing to respond within the 100ns (according to spec) - this meant that the recommended clock speed was wrong and needed to be reduced
* Codification
** Make sure you write your tests can be included in your manufaturer's test suite and make sure the devices coming off the line are correct

!! Hardware in the loop (HIL) Test
Acceptance level tests demonstrating the correct integrated system

Uses robot framework to build tests (gherkin-like)
HIL is used ATDD, CI, Manufacturing

!! Unit Tests
* Google Test / Google Mock (C++ only)
* cmocka - simple lightweight C testing

!!! Mocking memory
1. Substitute headers with new #define
1. extern variables that get omcked by the test
1. linker scripts that create global variables

!!! Gotchas
* Be wary of state bleed - RESET YOUR STATE
* Test all your boundaries - write tests until your paranoia turns into boredom

saleae - logic analyzer

!!! Network mocks

Had problems testing service to service interactions

!!! Microservices: Lessons Learned
 :) Faster deployments
 :( Automation is required
 :) Easier to handle (mental model)
 :( Tracing requests
 :) code ownership
 :( code duplication
 :) Speed up tests
 :( Decrease test safety, now need end-to-end tests

!!! Testing Service to Service Interactions
1) Standup the whole world
* Ugh, slow, brittle, black box
2) Mock out dependencies
* You're testing against the version of the API that existed when you wrote the mock
3) Contract Tests

!!! Pact Demo

!!!! Consumer-side
Consumer writes the test
Pact Runs the test, mocking out the provider
It also creates a pact file.  This is the "published" interface the provider should implement.

!!!! Provider-side
The Provider can then pull the pact file (all the pact files for all the Consumer's presumably)
It will create tests for the pact file, run them against the server and verify the assertions defined in the first step.

This probably won't work out of the box because there needs to be setup, but pact provides helper methods or whatever to allow you to put data in the value.

"TDD at the architectural level - crossing services and doing TDD which is cool"

!!!! Making server-side changes:
Introduce new change, keeping backwards compatibility
Run provider tests, should pass (old consumer still works)
Update consumer to new change
Run consumer tests, creates new pact file
Go to provider, delete backwards feature
Run tests - if all consumers have been updated, they will pass, if not you'll know.

''Postel's Law''

!!! Pact features
* Recommended by TW
* Multiple languages
* Can be used with MQ interfaces (service A will put this message, service B will pull it)

Hypothesis:  If the 1:1 is not awkward, you're not talking about the real stuff.
>"Change and growth are always awkward - embrace that."

!!! Two Rules:
1)  Don't talk about any topic you could discuss in the open - If it's safe to be overheard, it's not the right content for a 1:1

2)  Commit to saying one rather awkward thing every 1:1 and get the other person to commit too.  Gives permission and creates peer pressure to be real.

!!! Other Tips:

* Get started by commiting.  That's an awkward conversation and counts for the awkward thing in the first 1:1

* Fix any other communication channels.  If 1:1s are the only channel, they're going to be spent on updates, easy questions, and simple feedback.

* Plan to be awkward.  What would be great to get off your chest?

!!! Awkward stuff
* Meta topics
* Feelings
* Fears
* Trust checks - How would it be easier to share intimate things?
* Extra Honest Feedback
* Are they acting like the best manager/report/partner?
* What have you said or heard said about this person?
* What is everyone neglecting to tell this person?
* Advice Seeking (with humility instead of bragging)
* Growth area advice
* Here's something I complained about, what could I have done differently?
* How can I be better?
* Admit faults and mistakes

This is one of those articles I'm glad I went back and read a bit more carefully.  I glazed over the section headers and said, yup, yup, yup, but kept it around for some reason.  It's got some nuance in the "stuck" sections and in the idea of consciously drawing boundaries for our system.

Basic outline - TDD as a series of cycles
 - Three Laws of TDD     (several times a minute)
 - Red, Green, Refactor  (every minute)
 - Specific/Generic          (every 10 minutes)
 - Boundaries                  (hourly)

* The Three Laws of TDD are designed to get you the write (and think) about one line of code at a time.
* Specific/Generic - tests get more specific, code gets more generic
** Uncle Bob believes that if you don't generalize your code (because the tests don't make you), then you'll end up getting stuck in your TDD cycle.  You'll have to write a ton of code to get the next test to pass.
* Every hour, stop and look for boundaries we want to control.  We draw the lines and then stick our work for the next cycle in that area.

Michael Feathers
Andy Hunt -

!! Concrete Rut
* Inspect and Adapt are too abstract for new agile teams to follow
* New agile teams take the practices and follow the rules (or worse a subset of practices and rules)
* Following the rules limits you to a novice (Dreifuss) - following the rules means you can't get the experience to break the rules

''We are stuck in a rut because the practices have not changed in over a decade''

!!GRowing Real-World Oriented Working Systems (GROWS)
* Growth means change
* Real-World means we need to base decisions on evidence
* Working software - of course

//But not at the expense of a working, functional team and overall organization//

* Evidence-based
* Dreyfus Skill Model
* Local Adaptation
* All-Inclusive

Anthony - founder of dnsimple

!! Path based version
* not mime-type based, but could go that way in the future
* Simple transition through minimal changes - picked path-based versioning
* versioned URL is easily visible in the logs
* Easiest implementation for both production and consumption
* Easy to check in a browser

!! New hostname
* Distinguish api calls
* easier to scale
* common error handing
* extract to custom controllers

v0 -> v1 - one month, mostly
simone went out and opened PRs for all open source projects to enable easy API version change.

!! v1 -> v2
* 3 years
* Used Hanami
* Built as a sub application
** Get all that institutional knowledge from years of development
* No longer tightly coupled to the Rails controllers

!!! Conversions to Commands
* Similar to Command design pattern -> "Reusable business logic" -> Encapsulate behavior
** Convert controls to use commands

!!! Remove resource names from parameters
* (don't need them in REST, you know you're dealing with "Zones" for instance from the path)
* It's dangerous to make the response data the top level keys.  Using "data" allows you to support "errors", "pagination", "meta" etc.
* Built custom parser to avoid rails serialization in hanami

!!! Error management
* unified error responses
* Use http response codes

!!! Authentication
* Retained HTTP basic auth
** easiest way to get access
** nice for testing
** might get rid of it later
* Access tokens
** Move to Oauth

!!! Pagination
* Add query strings
* using payload
* could be added to the headers later

!!! Sorting and filtering
!!! Throttling
* Used headers
* Why put that in the header?  Users care about pagination, but don't care about rate-limiting
!!! Methods (endpoints)
* Track all the new/changed/removed endpoints
!!! API clients
* Ruby - original:  2010, new: 2016
* Go - 0.15, not yet released
** Nice for design feedback
* Node - new: 2016
* Elixir - new: 2016
* Java - unreleased
* PHP - unreleased


!!! Kent Beck's version
# Passes tests
# Minimizes duplication
# Reveals its intent
# Has fewer classes/modules/packages

!!! Corey Haine's version
# Passes tests
# Reveal intent
# Don't repeat yourself
# Fewer classes

J.B thinks the difference between 2 and 3 doesn't matter because they form a rapid feedback loop.

I have noticed over the years that when I try to focus on removing duplication, new, useful structures emerge. I like to say that if the solution wants to be structured a certain way, then removing duplication helps that structure to emerge.2 I have also noticed that when I try to focus on improving names, Feature Envy and its friends become more apparent, and code makes it clearer that it wants to move somewhere else. Similar concepts scattered throughout the system start calling out to each other, hoping for the programmer to unite them in a single module. Crowded, unrelated concepts struggle to get away from one another. Responsibilities gradually move to a more sensible part of the code base. Both of these contribute to higher cohesion.

Remove duplication -> Structure Emerges
Improve Names -> Redistribute Responsibility

Creating new structures to handle these responsibilities drive these loops.  As we struggle to name this new thing we continually add/remove behavior until it becomes cohesive.  Eventually it settles into an abstraction (the rest of the code treats it as a black box).

So you end up with:

Remove duplication -> structures emerge -> structures need names -> improve names -> abstractions emerge -> higher-level-duplication -> remove duplication

Or you can start with improving names and end up in the same place.

I would probably think about this more as starting with an abstraction (make the change easy) vs removing duplication (make the easy change).
!!! Why novices?

Functional diversity - different backgrounds bring novel approaches to tough problems

Individuals from similar backgrounds identify problems in a similar way(perspective) and similar ways of solving those (heuristic)

//This is basically an exercise in avoiding groupthink//

How do you find novices?
 - avoid internal biases (picking people like you, who are easily available, look nice, etc)

!!! Hungry academy
Very intense training schedule - 24 students, 5 months, 40 hrs/week training, 20-30hrs/week homework
Burned everyone out - idea was to take a person up to the standards where livingsocial would hire them normally
5 months on a salary phasing into normal hire - 24 new hires

!!! Assignments
Choose your own optimization points on an assignment, 8 or 9 axes to grade on with a near impossibility to max out all categories (performance, ux, class design, etc) - helps a new dev figure out what they like/are good at

- Rebuild the same app using a different set of buzzwords (new db, design style, api, etc)

!!! Mentoring
Start with the end in mind - what do you want the newbs to learn?  Design an exercise (experiment), gather results and iterate.  Multiple assessments, fast loops.

Strive to setup devs to be
- autonomy
- mastery
- purpose

Take extra time to teach the devs to increase their mastery and push them towards autonomy.

Tracking tools (pivotal) allow an individual to see their contribution //lencioni idea of transparency//

Have mentors commit to being consistent

!!! Habits
Habit 0:  Each novice should have a technical mentor
Habit 1:  Take nothing for granted.  Set expectations early.
Habit 2:  Design a pairing schedule
Habit 3:  All code reviewed via pull requests - make sure to find positive feedback
Habit 4:  Set dedicated learning time with self-chosen objectives
* Hard to test = badly designed
* Done is in production - stop screwing with this to make everyone look good in reports.
* Trying to "smooth" the path for developers up front is less efficient than figuring it out as the code is written
** With the caveat that devs hate being jerked around
John Van Enk - @sw17ch

* Low precision - high range
** Like all the temperatures in the universe
* High precision - low range

Pull-down resistor - remove noise in analog circuits - default to 0

Reed switch - detects magnet - 1, no magnet = 0
Photo cell - detects light -

analogRead - something between 2.5v and 4.5v with a 10K ohm resistor

temp sensor - transistor

diagram tool:
Daniel Kahneman

!! Two Systems
* System 1  - automatic, intuitive, associative memory, rarely confused
* System 2 - requires effortful attention, makes judgements, lazy, appreciates a coherent story,

!! Econs and Humans
* Econs - rational.  Always makes coherent, careful, consistent decisions and uses all the information at hand.
* Humans - makes contradictory decisions based on biases, laziness, etc.

!! Two Selves
* Remembering Self - Keeps the score.  Often forgets the duration of events and judges goodness of an experience based on the peaks it remembers.  Last part of experience is weighted highest (Bad ending ruins the whole movie)
* Experiencing Self - Does the living.

!! The lazy controller (System 2)
* If an easy answer comes to mind (System 1), System 2 will rarely fact check it.  Although someone may be able to solve a difficult problem by engaging System 2, if a simple answer springs to mind and "seems reasonable" they will "go with it".
* "Those who avoid the sin of intellectual sloth could be called 'engaged'.  They are more alert, more intellectually active, less willing to be satisfied with superficially attractive answers, more skeptical about their intuitions.
* //Am I less rational (more instinctive) about simple math problems because I've been right so often?  What does that say about getting the right answer quickly? //

!! Causes Trump Statistics
* After learning a surprising statistic, the normal behavior is to ignore it when looking at a specific case.  For instance  you learn that after an accident 90% of observers didn't help an injured person. You later interview one of those observers and they seem very nice and upstanding.  Although you know the vast majority of people didn't help, you'll assume that this nice person was the exception, despite having no real reason to do so.
* Personal experience trumps reality.
* This is how stereotypes are formed - you met one smart Swedish person, therefore all Swedes are smart.  One Indian person was hard to understand, therefore all Indians are difficult to understand.

!! The Illusion of Understanding
* "The core of the illusion is that we believe that we understand the past, which implies that the future also should be knowable, but in fact we understand the past less than we believe we do."
* The world is unknowable
* We usually don't notice that we were surprised by events because we can create a coherent narrative with hindsight.  With hindsight, the 9/11 attacks were preventable, there was the memo in August, etc.  It was a FAILURE rather than a SURPRISE.  Likewise, we knew football team A would win in hindsight because they were better prepared, had homefield advantage, etc.

!! Outside and Inside View
* Extrapolation (Inside View) vs Base Rate (Outside View)
** This feature will take us 2 more days because we've spent 2 days on it already and we're halfway done
** This feature will take us 4 more days because features usually take 6 days
** Wishful forecasting vs Back of the envelope calculation

* Outside view helps anchor reality before giving optimistic Inside View data
* Outside View is often better at predicting failure
* We will always over-value the Inside View because ''this'' project is different because I'm part of it.
* "It is easier to change directions in a crisis, but this was not a crisis, only some new facts about people we didn't know.  The outside view was much easier to ignore than bad news in our own effort.  I can best describe our state as a form of lethargy - an unwillingness to think about what had happened."

!! The Engine of Capitalism
* "Optimistic individuals play a disproportionate role in shaping our lives.  Their decisions make a difference; they are the inventors, the entrepreneurs, the political and military leaders."
** Influential people are optimistic and overconfident.  They take big risks.
* Delusional optimism leads to action.  Small businesses drive innovation even though 65% of them fail in the first 5 years.
* "Overconfidence is another manifestation of WYSIATI: when we estimate a quantity, we rely on information that comes to mind and construct a coherent story in which the estimate makes sense.  Allowing for information that does not come to mind - perhaps because one never knew it - is impossible"
** //Are estimates without a base rate impossible? //
* '"Generally, it is considred a weakness and a sign of vulnerability for clinicians to appear unsure.  Confidence is valued over certainty and there is a prevailing censure against disclosing uncertainty to patients."  Experts who acknowledge the full extent of their ignorance may expect to be replaced by more confident competitors, who are better able to gain the trust of clients.'
* Humans prefer pretended knowledge to acknowledgement that these are guesses, especially when the stakes are high.

!!! The premortem (Gary Klein)
* Overconfidence cannot be fixed with training
* Prior to committing to a difficult decision
* "Imagine that we are a year into the future.  We implemented the plan as it now exists.  The outcome was a disaster.  Please take 5-10 minutes to write a brief history of  that disaster."

!! Keeping Score
* The remembering self controls future behavior
* We go to great lengths to avoid regret
* Doing the default option (nothing) will produce less regret than doing something, even if both cause the same effect.
* If we prime ourselves for regret, we will likely feel less of it
** This movie will suck sooooo bad

!! HDD talk
* TDD, ATDD, Learning Tests, Exploratory Testing
* Meetings - start with success and failure criteria - end the meeting when either is hit
* Overvaluing personal experience / intuition over data
* Learning from failure requires being aware of hindsight bias.  So be "scientific" and record your assumptions beforehand.
* Recording assumptions before you start usually requires at least a trivial amount of imaging and calculation.  You can avoid wishful forecasting by ignoring incomplete data of an in-process task.  Give some thought to failure criteria to avoid wasted work.
* Evolution in planning?  Optimistic External(Waterfall), Extrapolation (Agile), Base Rate anchored (Lean)
* How can we change directions based on data before we we hit a crisis?
** Thought experiment:  Your team is part of an effort to integrate with the next hot consumer good - the iGlass.  Things seem to be going well, you're ahead of schedule and everyone is pumped.  Then you receive the news - your key competitor that you're racing to market is giving up on the iGlass.  They claim it's too flaky to work with in a non-trivial application.  What would your team do?
*** Celebrate that victory is now assured
*** Give up.  After all that other team included half the engineers from the original iGlass team and you're undoubtedly doomed to failure.
*** Re-prioritize the work to stress test the iGlass before moving forward
** Suppose your team was immediately called into the office of the CEO.  How would you advise him to proceed?
* Troubles in being honest about assumptions - most people would prefer to hear pretend knowledge over guesses, especially when the stakes are high.
* The premortem - more research
** Alternative to 6 thinking hats?
** A version of hypothesis-driven development - seek to disprove the hypothesis
* Embrace failure to avoid regret from trying things

!! Quotes
* The acquisition of skills requires a regular environment, an adequate opportunity to practice, and rapid and unequivocal feedback about the correctness of thoughts and actions.

* Our subjects left the choice to their remembering self, preferring to repeat the trial that left the better memory, although it involved more pain...An objective observer making the choice for someone else would undoubtedly choose the short exposure, favoring the sufferer's experiencing self.

# Write out any, and I mean any, meaningful end-to-end scenario in detail with concrete values at every step.
# Now that you鶥 chosen one real scenario, go to each step in that scenario and ask the question, 엨at would I need to assume to eliminate this step?�f you find those assumptions make for a reasonable scenario, then use that assumption to simplify the scenario.
# Repeat step 2 until exhausted or unable to come up with a simplifying assumption with five minutes頴hought.

Part of this process is discovering other requirements and external systems.  We're exposing risk and complexity when we think we're in a "simple" reduction exercise.  Neat!
! Load Testing
Sometimes a Locust Storm is a Good Thing

! Open Source
!! Removing nokogiri

! Deep Dive & Process (Balanced Team Recap)

! Apprenticeship

! Happiness

! Failure

! Nerdiness


* Strive towards standardizing the size of work so you can optimize flow and enable predictability

Toaster Heuristic:  Imagine a software team as a toaster oven.
* The toaster oven is analogous to a work system - it produces a predictable amount of heat when toasting, the only real variables are time and type of bread.
* Usually unhappy with the results - every experience is completely different and the estimates (spots on the dial) are significantly wrong
* What if I just observed the toast and timed how long it took to do a typical piece of bread?
* Provide the toaster oven a small slice of work to do.  Measure the cycle time to where the quality of the end-product is satisfactory.
* Adjust the work to meet this measured result.  (Slice the bread thinner, but always keep the oven set the same way).

Moral of the story:  Use empirical data to inform the amount of work we slice off, rather than guessing at adjustments.  This enables predictabiity and and leads towards a stable work system where the baseline is known.

Jessica Kerr

Balancing Moving Together vs Moving Forward

!! Moving together
One team of 2-7 people can move fast and get a large interplay of useful ideas.

Two teams will mean more coordination with lots of lines of communication.  Each team gets about half as much done as the first team did by itself (but is tackling problems in parallel).  Both teams are moving in the same direction.

4 teams, different levels of communication, different levels of coordination.  The teams that have more coordination are moving slower, but moving together.  A team that is less connected is moving faster, but is off target.

Coordination costs are now burdensome.  Moving quickly is hard because you might break everyone's stuff.

!! Moving forward

Create boundaries and decouple everything.  Very few coordination pathways, but every team must do more stuff because they can't leverage another team's work without more coordination.  Backwards compatibility and degradation must be built in so the teams can work on different release schedules.

Amazon works this way, every team moves forward with a full set of armor.  You have no idea what anyone else is doing.

Google is the opposite extreme, monorepo and lots of tooling and shared libraries allow integration.   They've built tests, refactoring tools, custom version control and programming languages to support this.  Thousands of engineers work on infrastructure.

!! Balance
Consensus is needed at the business level.  What are our objectives and direction?  Consensus is crippling on the back end.  Agreeing on databases, upgrading  libraries and coordinating releases slows us down.

We should try to share some tools and expertise.  Don't make every team re-invent the wheel.  If it makes sense, create shared service teams that are more like the "full armor" amazon teams and let the "full speed" teams leverage them.

!! Conclusions
* Avoid shared libraries unless you have dedicated support for them
* Avoid shared databases (but create DBMS tools that can be shared)
* Encourage shared ideas
* Reach consensus on what we want to achieve and why we are doing it.  At a high-level, agree on how it will be done.

* UX is before, during, and after.  Expectations, beliefs, preferences, emotion.
* Dan Willis - UX umbrella
* Convenience + Design - Cost = UX

* Mind Maps and Site Maps
** Freemind - mind mapping tool - sadukie uses for brainstorming

* Personas
** Crisis persona
* Gherkin
* Wireframes
** Balsalmiq, Pencil
* Focus groups to test
* Heatmaps & analytics
Eric Evans @ericevans0

!! Modeling mistakes
* Looking for the 1 true model
* DDD says 4 models in 4 separate contexts is fine.
** Elephant : Tree, Elephant : Wall, Elephant : Snake, Elephant : Rope

!! Translating between models
Rope context - > Translator -> Snake context
Rope.tiedown -> Translator -> Snake.location
Rope.tiedown -> Translator -> GIS Context.address -> GIS Context.geo_loc -> Snake.location

!! What are models for?
* Identifying risk
* Exploring other models

!! Modeling breakthrough!
Parts of a whole:  Elephant : Wall + Tree + Snake + Rope
Now we have 5 models!

!! DDD Whirlpool

# Tell a story
# Flesh it out
# Refocus on hard part
# Refocus on core domain

Describe Scenario -> Define model -> Probe model
Story -> Theory -> Experiment

Get in, swirl around, GET OUT

!! New data

Elephant seems to crush people's feet some of the time
Can we maintain our model with this data?
So Elephant : Tree must hop  = New Hypothesis to test.

This is just an iteration of our original model.  Still have 5 models.

!! Model breakthrough
Elephant is-a animal and has-a trunk
Animal has-a tail and has-a leg (one to many)

Now we have 6 models!

!! Translation is tricky
In Tree Context:  Tree.Trunk -> Translator -> Animal.Leg  (Not Elephant.Trunk)

!! DDD in a nutshell
* Bounded context
* Ubiquitous language (UL is context specific!  So we have 6 languages)
* Model Exploration

''"We'll never get to perfect, perfect is the enemy of the good"''

!! Where to start?
* Start with scenarios that worry the domain experts the most.  They'll want to talk about them and help you model them to mitigate that risk.
* Don't strive for perfect language.  Cut off theorizing at some point and experiment.  Use the language and see where it falls short.
Christopher Houdeshell

Had takeaway as early slide - good idea!

Made productive and efficient
Instill Confidence

Tolerate mistakes
Make Time - 8 hours per week
No grunt work - no maintenance apps
Help define their goals - must be attainable, can't be lofty

!! Takeaways
"I am trying to __ so that I can ___ I'm running into ___ .  I've looked at __ and tried ___."
Add interviewing day - day 2 - what do you do here?


Number | Expected | Actual        | Pass/Fail |
<typed> | <typed>   | <function> | expected == actual |

Actual ties to a spreadsheet function
Record time to start from scratch ''23 minutes'' + 20 mins to install virtualbox, vagrant, and java
Record talk again, find 5 minutes to cut
Put slides on memory stick

Start from scratch (vagrant destroy) ''done''
How many steps to get to testing?  ''doc'd''

Test with no wifi ''works fine''

fork play2 - ''done''
 - chown vagrant
 - update default

write cukes - ''done''
test selenium remote ''done''

 - picture showing vagrant, chef-solo, virtual box, Berkshelf
 - picture showing cukes, app, dev/new tester
 - picture showing cukes, app - new CI box

!! Steps
vagrant up
start selenium
vagrant ssh
cd /vagrant/todolist
play run
'' Need a way to warm up play'' - ''play compile'' in vagrantfile
cd /vagrant

!! Issues
 * New tester
 * Multi-project developer
 * Synching CI with prod
 * Shared resources
 * Trying out new envs
 * Envs changing outside of version control
 * works on my machine

!! Outline
 * What is Vagrant
 * magic formula slide
 * Environment as code
 * Problems and Solutions - can I build up to the finale?
 * Ecosystem, plugins, etc
 * Selenium remote

!! Cons
 * VM incompatibilities
 * Slower
 * No UI - Windows users


Immutable deployments
AWS demo

Vagrant is a pretty powerful tool that will let you setup virtual machines the same way, everytime automatically.

Formula slide
  VMWare and Amazon EC2, via their plugin system.
  It has the ability to take a VM provider.  Initially this was just virtualbox, but they've recently added integration with VMWare and Amazon EC2, via their plugin system.
  chef, puppet, ansibile, shell scripting, there are  a ton of plugins out there, - salt

* Env to source code
 - Vagrantfile lives with your source

* Vagrant = How do I run my application?
* Vagrant = Executable Readme?
* Vagrant = Multi-platform setup script
* Vagrant = Environment as Code

* Options!

* 1:  Setup machine that looks like my production server
  Works on my machine!
 * Env changes in source control!
*  Show vagrantfile
* Show vagrant up
* Show vagrant ssh

* 3:  Demo system
   My history - 3 day install process
   Build machine as demo box
   Solution:  Vagrant supports multiple VMs networked together with the enviroment up-to-date

*2:  Try new system - new OS, new app server version, etc

* 4:  Perf test
   2 week perf test

* New CI server

*5:  Hate installing stuff
  - Clean machine joy
  - Oracle DB, hard to install, what did I install
  - Use a VM, snapshots, easy to throw away and start over

*6:  Multi-project developer/designer
  - VM for every project

*5: Test isolation

*7:  VM for QA = joy
 - On issue, pause VM, send it over to a dev for on the spot troubleshooting.

*7:  Ruby installs
   - History lots of crappy installs
   - Goal: Make a new user productive in under an hour
   - Examples:  windows, rvm, link headers, missing libraries, homebrew and mac ports

*8:  Shared resources BAD
  -NO time to set him up, lets share some resources
  - Point him at the build machine!
  - Cleanup to a clean state
  - Want to know what the system looks like before we execute tests
  - Why is this test failing
  - False positives
  - Deleting stuff, conflicts
  - New build being pushed

* Browser test on the VM
  - Not ideal, resources
  - Would you install a browser on your prod server?

* How to start from nothing
  - install vagrant
  - install virtualbox
  - install java
  - selenium
  - clone repo

* Finale!

* Drawbacks
Katie Quehl


!! Why
*Encourage creativity
*Overcome being stuck
*Gain perspectives
*Develop empathy
*Explore uncomfortable topics

!! Questions to generate bad ideas
How would I design for the opposite of what I want to accomplish?
How would a kindergartener solve fore this?
What would I suggest if I wanted to kill this project?

!! Examine ideas
* What is bad about this?
* Why is it bad?
* Is there a different context where this would be good?

Mozilla Developer Network
HTML5 Boiler Plate
Dive into HTML 5
A List Apart

css - compass
* What does it do?

*What's a css property?
*What's hoisting in javascript?
Tian Davis - Respoke developer advocate

 * Video from rep, customer audio only

DataChannel - secure data xfer - p2p
Chunking images
API will converge at 1.1

Firebreadth - > activex and nbap

ICE - framework for browser p2p
STUN - candidate = (ip and firewall (ports?))
Singaling - websocket server- facilitates the STUN connection
TURN - provides for situations when p2p fails
 * (How does that work?)
 * Why is it more reliable?
 ** When STUN fails - can't get through firewall - TURN is the mediator

rfc5766-turn-server (stun and turn server from google free)

Not just websockets - p2p - it's free from a server standpoint.

''what's the story on mobile?'' - not ready
''clojure signaling server''

''lunch and learn - create video to video app''

You can鴠fight too much cleverness with more cleverness. At least, not directly. Instead, go the other way. Go simple. Go straightforward.
Inline the code you were trying to abstract away. Do repeat yourself. Keep your code explicit.
Cory House

* HTML should be a projection of app state not a source of truth (//not the system of record//)
* JS and HTML in the same way
* Unidirectional flow is better than two-way binding
* Inline styles are good.

''react-slingshot - open source from Cory''

!!! JSX
* Markup in this middle of your javascript
* Angular, ember, knockout puts js in your html
* In Angular, you write Angular.  In React, you write JavaScript.
* Composing UI in javascript gives you a compile-time error vs runtime

!!! Virtual DOM

!!! Hot reload
Code on the left, browser on the right.  Just make a change and save the code file.

!!! Isomorphic
* Code is rendered on the server and shipped to client as html
* Performance, Accessibility, Maintainability

!!!Unidrectional Data Flow
* So clean
* React, Action, Dispatcher, Store, React

!!! Angular vs React
* Big names are using react.  Angular has a bigger list, but less humungous players.

What's your favorite worktime conversation?
What would you like someone else make happen?
What would you change if you were allowed to?
What decision has upset you the most in the last six months?
What incentive would make you change the way you work?
What's holding you back?
@jasonkarns - td hangout dec22
hub clone testdouble/testdouble.js - Get the "github" url for free in any hub command

hub browse -> open a page to github
hub compare v1.0.0...master
hub browse -- issues
hub fork -> fork to my user
hub pull-request -o  -> open github with a pull-request from my current HEAD to origin/master

can checkout PRs directly

hub checkout (url to pr) - > create a local branch with that PR

!!! component based
Focused on components - components take data and spit out html.
 * React figures out how to change the DOM
// Does this mean rendering is atomic?// - ''YES''

!!! jsx
syntax used by facebook to avoid boilerplate - basically can embed html tags in javascript code
  return <h1> Hello from React </h1>;
** Should be precompiled in production

!!! Components

<TodoItem text="Code" />

//elsewhere in TodoItem render() function:
return <li>{this.props.text}</li>

!!! Flux
* Events from components are broadcast to a "Dispatcher"
* Dispatcher has listeners that register for interesting things

!!! Wiriing up updates
 getInitialState - first time data
 componentWillMount - called before render (good place to register for listeners)
 setState - refresh widget
''Find links''

Romans 7

Punished By Rewards - ''Find link''

To tweet:

@franklinchen and ...  - ML

To follow: