urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mindMillard's blog about software development (and sometimes other stuff)102014-12-10T08:57:12-05:00IBM Connections - Blogsurn:lsid:ibm.com:blogs:entry-102095ed-1fee-4406-9719-fe98ffdb9f8fDoing it the Docker way: Standalone web serverMillard060001WYSUactiveComment EntriesLikes2014-12-08T15:16:38-05:002014-12-08T15:55:18-05:00<div dir="ltr">
I&#39;ve started looking at Docker&trade; seriously as a way to make all sorts of things easier. We&#39;re considering it for our team&#39;s next generation development environment work, incorporating it into our build process to make testing easier and perhaps even as a way to reguarly push new versions into production. I have a lot left to learn (and working on Windows, at least for now, it&#39;s all just a little bit harder since the support is not yet native -- though this seems to be changing http://azure.microsoft.com/blog/2014/11/18/docker-cli-for-windows-clients/).</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
To help with my learning, I try to answer relevant questions from a &quot;How would I do this with Docker?&quot; perspective. I needed to standup a standalone web server to test something recently. I could have downloaded and installed Apache or IBM HTTP server, but that would lead to some cruft as I may not need it for long and now there would just be more stuff in my path and on my system that didn&#39;t really need to be there.</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
Of course Docker could help with this, no? Turned out to be a piece of cake (though largely because of past research and efforts). Here&#39;s what I did with some background notes in case it helps you do something similar (or increases your interest in Docker). Most of this is easier if you aren&#39;t on Windows, so I&#39;ll focus on the Windows parts.</div>
<div dir="ltr">
<hr />
<p>
Steps to stand-up a standalone web server mapped to your local system are below. This is not a complete step-by-step tutorial for getting started with Docker. You can learn more about Docker (and using it with Windows) at <a href="http://www.docker.com">www.docker.com</a>.</p>
<p>
&nbsp;</p>
</div>
<h2 dir="ltr">
Prerequisite</h2>
<div dir="ltr">
Mostly just that <strong>boot2docker</strong> has been installed (see&nbsp;<a href="http://boot2docker.io/">http://boot2docker.io/</a>) and works (you can at least do the helloworld-style tutorial). That gives you the infrastructure for the rest of this.</div>
<p dir="ltr">
&nbsp;</p>
<h2 dir="ltr">
0. Start boot2docker</h2>
<p dir="ltr">
&nbsp;</p>
<h2 dir="ltr">
1. Get Apache&#39;s httpd&nbsp;</h2>
<div dir="ltr" style="margin-left: 40px;">
<em><strong>docker pull httpd</strong></em> -- will download the official Apache image from Docker hub</div>
<p dir="ltr" style="margin-left: 40px;">
&nbsp;</p>
<h2 dir="ltr">
2. Start the image, exposing the port and mapping to your local (Windows) file system</h2>
<div dir="ltr">
This is the interesting step and where some of the background information comes in handy. As of late 2014, Docker will use VirtualBox Guest Additions to automatically map your Windows C:\Users folder for sharing with the VM running docker (see <a href="https://github.com/boot2docker/boot2docker">https://github.com/boot2docker/boot2docker</a>). What this means is that C:\Users will be known as /c/Users to the OS running in your docker container. This is critical (and cool) because you can edit files on Windows using your normal tools and when you save them, they will be available via the web server immediately.</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
The example startup from the docker hub image page (https://registry.hub.docker.com/_/httpd/) is:</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr" style="margin-left: 40px;">
<strong>docker run -it --rm --name my-apache-app -v &quot;$(pwd)&quot;:/usr/local/apache2/htdocs/ httpd:2.4</strong></div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
Rather than use whatever directory you are in &quot;$(pwd)&quot;, use a mapping that works for Windows and the VirtualBox Guest Additions. For me, this changed the -v argument to:</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr" style="margin-left: 40px;">
<strong>-v /c/Users/Public/project/webserver:/usr/local/apache2/htdocs/</strong></div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
This maps my C:\Users\Public\project\webserver directory to the top-level where Apache expects to find web files.</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
The other piece you need to add to the startup is a port mapping. I&#39;m pretty sure this is another boot2docker thing and wouldn&#39;t be necessary if you weren&#39;t running under Windows. While the image exposes port 80 on the container, I need to map that to my host system to make it visible. So I have to add a &quot;-p 80:80&quot; to make the port visible (if your port 80 is already in use, you can use this mapping to set it to something else). I dropped the &quot;:2.4&quot; from the image to run since just running the latest version of the one I just downloaded was fine. &nbsp;My final startup command for boot2docker is:</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr" style="margin-left: 40px;">
<em><strong>docker run -it --rm --name my-apache-app -p 80:80 -v /c/Users/Public/project/webserver:/usr/local/apache2/htdocs/ httpd</strong></em></div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
By quick explanation, &quot;-it&quot; says to run interactively rather than push it into the background and &quot;--rm&quot; says to automatically remove the container when it closes. This keeps startup simple -- it&#39;s always this same command. Otherwise, you&#39;ll need to use <em><strong>stop</strong></em> and <em><strong>restart </strong></em>for the container and if you want to change the arguments, you&#39;ll need to provide a new name (or remove the existing one first). See the Docker docs for more details</div>
<p dir="ltr">
&nbsp;</p>
<h2 dir="ltr">
3. Create or copy your html to your mapped directory</h2>
<div dir="ltr">
For my initial test, I just made a simple <em>Hello World</em> index.html and put it in a directory named <strong>helloworld</strong> under <strong>\webserver</strong> (the mapped top-level location for web files).</div>
<p dir="ltr">
&nbsp;</p>
<h2 dir="ltr">
4. Hit the new web page at the super secret IP address</h2>
<div dir="ltr">
Okay, it&#39;s not really a secret, but you will need to figure out what it is. From a command window, enter <em><strong>boot2docker ip</strong></em>. This will likely show you that the IP for the Docker image is 192.168.59.103. But it could get mapped to something else, so it helps to check if things don&#39;t seem to be working.</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
So I visit http://192.168.59.103/helloworld/index.html and see:</div>
<div dir="ltr" style="margin-left: 40px;">
&nbsp;</div>
<div dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/docker-apache.png" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/docker-apache.png" style="display: block; margin: 1em 1em 0pt 40px;" /></a></div>
<p dir="ltr">
&nbsp;</p>
<div dir="ltr">
Now I can just add folders to my /project/webserver folder for other web sites. I can get updated web server software by just downloading an updated Docker image -- no need to run updates on my local system. And when I&#39;m done with this side project, there&#39;s nothing to uninstall and no cruft left behind. Docker FTW!</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
<em><strong>How will you use Docker?</strong></em></div>
<p dir="ltr">
&nbsp;</p>
I&#39;ve started looking at Docker&trade; seriously as a way to make all sorts of things easier. We&#39;re considering it for our team&#39;s next generation development environment work, incorporating it into our build process to make testing easier and...20550urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00urn:lsid:ibm.com:blogs:entry-257fdd1d-12b7-42a0-93ad-9db4f9c9ae24Hacking in the cloud with IBM Bluemix(TM) and DevOps ServicesMillard060001WYSUactiveComment Entriesapplication/atom+xml;type=entryLikes2014-06-01T22:00:36-04:002014-06-23T20:07:46-04:00<p dir="ltr">
A while back a friend and fellow IBMer @ProfAvery turned me on to <a href="https://github.com/sahat" target="_blank">Sahat&nbsp;Yalkabov</a>&#39;s <a href="https://github.com/sahat/hackathon-starter" target="_blank">hackathon-starter</a> project on <a href="https://github.com/" target="_blank">GitHub</a>. At the time I was just trying to learn some more about node.js and the project provided some solid examples for using various APIs and over time with contributions from many folks has become what I expect would be a solid base, at least for a hackathon effort and possibly for more serious, long-term development. And as I have watched it develop I&#39;ve been pleased to see how Sahat has stuck to his guns about keeping it reasonably simple and approachable -- he has politely turned down a variety of contributions that may have added some value, but would have also moved the project away from its purpose.</p>
<p dir="ltr">
As IBM Bluemix&trade; and its DevOps Services started to develop, I realized it would be a great match for hackathon-starter. While it&#39;s easy to stand up hackathon-starter in many environments (including Bluemix -- more on that in a moment), DevOps Services integration makes it simple to collaborate and provide a continuous delivery pipeline automatically deploying each delivery to Bluemix. With a shared Git remote at DevOps Services, you could easily work together on a hackathon from distributed locations.</p>
<p dir="ltr">
I think that&#39;s the best way to stand up hackathon-starter: using Bluemix and DevOps Services together for a collaborative, continuous delivery environment so I wrote a <a href="http://ibm.biz/hackstart" target="_blank">developerWorks&nbsp;piece&nbsp;about&nbsp;it</a>, complete with screen shots, some sample code bits and a short video.</p>
<p dir="ltr">
Another way that also works -- but without the DevOps Services integration -- is to just use the Cloud Foundry command line to push it to Bluemix, configuring the required database service and a process environment variable to connect to it. While I consider this approach less capable from a teaming perspective, it can certainly work if you just want to stand up the example and poke at it yourself. I&#39;ll do it two ways: the first feels like the easiest to me and takes you to the Bluemix web interface where you can explore other things about your project; the second is a completely command line approach (#protip: reading through the first will provide some useful context for the second one).</p>
<p dir="ltr">
For both approaches, the basic steps are very similar:</p>
<ol dir="ltr">
<li>
Obviously, you&#39;ll need an IBM ID registered at <a href="http://bluemix.net" target="_blank">Bluemix</a>.</li>
<li>
Get the <a href="http://www.ng.bluemix.net/docs/BuildingWeb.jsp#install-cf" target="_blank">Cloud&nbsp;Foundry&nbsp;command&nbsp;line interface</a> if you don&#39;t already have it (using cf v6 here).</li>
<li>
Make directory on your system for the project files.</li>
<li>
Get a ZIP of the hackathon-starter files and extract the profie files to your new project directory.</li>
<li>
Use cf push to create your application at Bluemix (it won&#39;t really work yet since it requires a database service we have not yet configured, but we need the app to exist so that we can register the service to the app).</li>
<li>
Configure a MongoDB database service for the application.</li>
<li>
Create a process environment variable to hold the DB URL for the database instance so that we can connect to it (in config/secrets.js, you can see that hackathon-starter will query the environment variable MONGODB for the connection information).</li>
<li>
Restart the application and get hacking!</li>
</ol>
<p dir="ltr">
<em>Note: On June 23, 2014, the IBM BlueMix service dropped the ng.bluemix.net domain in favor of mybluemix.net. While I have fixed the text, some of the screen captures still show the previous name. Please be aware of the difference while working through the material.</em></p>
<p dir="ltr">
The first four steps are pretty basic stuff and I won&#39;t explain those further. Step 5 is the same for both, so let&#39;s do that first.</p>
<p dir="ltr">
Since you&#39;ve installed the Cloud Foundry client, it should be on your path. Make your current working directory the one with hackathon-starter&#39;s package.json file. From your command line window, execute <strong><span style="font-family:courier new,courier,monospace;">cf push </span></strong><span style="font-family:courier new,courier,monospace;"><em>your-app-name</em></span><strong><span style="font-family:courier new,courier,monospace;"> -m 512m</span></strong>. Obviously, replace <em>your-app-name</em> with whatever you like.</p>
<p dir="ltr">
You&#39;ll see a lot of activity in your command line window as Cloud Foundry processes the package.json file and pushes your application to the cloud. It should start something like this:</p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/cf-push-1.png" style="width: 100%; display: inline-block;" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/cf-push-1.png" style=" display:block; margin: 0 auto;text-align: center;" /></a></p>
<p dir="ltr">
and end something like this:</p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/cf-push-2.png" style="width: 100%; display: inline-block;" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/cf-push-2.png" style=" display:block; margin: 0 auto;text-align: center;" /></a></p>
<p dir="ltr">
But if you believe it and go to your application URL, you&#39;ll see this (because there is no MongoDB service configured for the application yet):</p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/first-result.png" style="width: 100%; display: inline-block;" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/first-result.png" style=" display:block; margin: 0 auto;text-align: center;" /></a></p>
<p dir="ltr">
There are two paths for fixing that, let&#39;s start with the cuter one.</p>
<p dir="ltr">
&nbsp;</p>
<h1 dir="ltr">
hackathon-starter and Bluemix</h1>
<p dir="ltr">
Log into the Bluemix web application, go to the Catalog and create a MongoDB service. Where it says <strong>Add to:</strong>, insert <em>your-app-name</em>, same as how you named it for the <strong><span style="font-family:courier new,courier,monospace;">cf push</span></strong> command earlier. You can leave the name as the generated default or change it to something that is more meaningful to you:</p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/create-mongodb-service.png" style="width: 100%; display: inline-block;" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/create-mongodb-service.png" style=" display:block; margin: 0 auto;text-align: center;" /></a></p>
<p dir="ltr">
You will be prompted to restart, but don&#39;t do it yet - there&#39;s no point until we complete the next step.</p>
<p dir="ltr">
Click on your application from the <strong>Dahsboard </strong>page and then on the <strong>Runtime </strong>section. Scroll down to the <strong>Environment Variables</strong> section. Under the VCAP_SERVICES section you&#39;ll see some JSON that describes your MongoDB service. Copy out the text of the &quot;url&quot; attribute towards the bottom of the section -- be sure to get it all. It should look something like this: <span style="font-family:courier new,courier,monospace;">mongodb://68638358-a3c6-42a1-bae9-645b607d55e8:46fb97e6-5ce7-4146-9a5d-d623c64ff1fe@192.155.243.23:10123/db</span></p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/vcap_services.png" style="width: 100%; display: inline-block;" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/vcap_services.png" style=" display:block; margin: 0 auto;text-align: center;" /></a></p>
<p dir="ltr">
Now switch to the<strong> USER-DEFINED Environment Variables</strong> section -- it is likely empty. Using the string you just copied from the VCAP_SERVICES MongoDB url, create a new environment variable called <strong><span style="font-family:courier new,courier,monospace;">MONGODB </span></strong>and set that string as its value.</p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/user-defined-env-var-for-mongodb2.png" style="width: 100%; display: inline-block;" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/user-defined-env-var-for-mongodb2.png" style=" display:block; margin: 0 auto;text-align: center;" /></a></p>
<p dir="ltr">
Your application will automatically restart after you save the change and after a moment, if you visit the Route shown at the top of your application&#39;s overview (<em>your-app-name</em><strong>.mybluemix.net</strong>, you should see hackathon-starter. Note that configuring the database this way is a touch fragile as if you needed to make any changes to the MongoDB URL (you dropped and recreated the service, you wanted to use a different service that works with the MongoDB wire protocol, etc., you&#39;d need to come fixup this environment variable to match.</p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/app-is-running.png" style="width: 100%; display: inline-block;" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/app-is-running.png" style=" display:block; margin: 0 auto;text-align: center;" /></a></p>
<p dir="ltr">
&nbsp;</p>
<h1 dir="ltr">
Command line only, please</h1>
<p dir="ltr">
We can configure a service for our application from the Cloud Foundry command line as well as interrogating the environment variables to get the values we need to set our new user-defined variable. For the command line purists in the audience, I&#39;ll step through those parts next.</p>
<p dir="ltr">
I&#39;ll leave most of the investigation to you, but here are some basic commands that will help. Use<strong><span style="font-family:courier new,courier,monospace;"> cf marketplace</span></strong> to see a list of available services, <strong><span style="font-family:courier new,courier,monospace;">cf services</span></strong> to see a list of your services, <strong><span style="font-family:courier new,courier,monospace;">cf create-service</span></strong> (add <strong><span style="font-family:courier new,courier,monospace;">-h</span></strong> to see help for this, including an example) and <strong><span style="font-family:courier new,courier,monospace;">cf -h</span></strong> or <strong><span style="font-family:courier new,courier,monospace;">cf </span></strong><span style="font-family:courier new,courier,monospace;"><em>command </em></span><strong><span style="font-family:courier new,courier,monospace;">-h</span></strong> for help at any time.</p>
<p dir="ltr">
1. To create your MongoDB service from the command line, use (the last part is a name you choose): <strong><span style="font-family:courier new,courier,monospace;">cf create-service mongodb 100</span></strong><em><span style="font-family:courier new,courier,monospace;"> your-service-name</span></em></p>
<p dir="ltr">
2. Bind your new service to your application: <span style="font-family:courier new,courier,monospace;"><strong>cf bind-service</strong> <em>your-app-name your-service-name</em></span></p>
<p dir="ltr">
3. Use <strong><span style="font-family:courier new,courier,monospace;">cf files </span></strong><span style="font-family:courier new,courier,monospace;"><em>your-app-name</em></span><strong><span style="font-family:courier new,courier,monospace;"> logs/env.log</span></strong> to see the content of the VCAP_SERVICES environment variable.</p>
<p dir="ltr">
4. Copy out the url attribute value in its entirety.</p>
<p dir="ltr">
5. Create a new environment variable for your application with: <span style="font-family:courier new,courier,monospace;"><strong>cf set-env </strong><em>your-app-name</em><strong> MONGODB</strong> <em>your-url-value</em></span></p>
<p dir="ltr" style="margin-left: 40px;">
It will look something like this:</p>
<p dir="ltr" style="margin-left: 40px;">
<span style="font-family:courier new,courier,monospace;">cf set-env bm-hackstart MONGODB mongodb://68638358-a3c6-42a1-bae9-645b607d55e8:46fb97e6-5ce7-4146-9a5d-d623c64ff1fe@192.155.243.23:10123/db</span></p>
<p dir="ltr">
6. To see the currently configured user-defined environment variables for your app (to verify it worked), use: <span style="font-family:courier new,courier,monospace;"><strong>cf env </strong><em>your-app-name</em></span></p>
<p dir="ltr">
7. As the TIP in the <span style="font-family:courier new,courier,monospace;">cf set-env </span>command output suggests, use <span style="font-family:courier new,courier,monospace;">cf push<span style="font-family:arial,helvetica,sans-serif;"> (see full command example earlier) </span></span><span style="font-family:arial,helvetica,sans-serif;">to </span>make sure the changes take effect. Using just <span style="font-family:courier new,courier,monospace;"><strong>cf restart</strong> <em>your-app-name</em></span> might work, too.</p>
<p dir="ltr">
Go visit your app at <strong><em>your-app-name</em>.mybluemix.net</strong> -- it should be running and ready to go.</p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/bm1.png" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/bm1.png" style=" display:block; margin: 1em 0pt 0pt 1em; float: right;" /></a></p>
<p dir="ltr">
&nbsp;</p>
A while back a friend and fellow IBMer @ProfAvery turned me on to Sahat&nbsp;Yalkabov &#39;s hackathon-starter project on GitHub . At the time I was just trying to learn some more about node.js and the project provided some solid examples for using various...004943urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00urn:lsid:ibm.com:blogs:entry-d5f270d3-ecc1-4788-82a8-423bdf08f009The incredible deliciousness of simplicity (or "winner, winner, chicken dinner")Millard060001WYSUactiveComment Entriesapplication/atom+xml;type=entryLikes2013-10-03T17:50:13-04:002013-10-04T16:45:51-04:00<p dir="ltr">
This time I&#39;m going to make your life better in a most delicious way (unless you are vegetarian/vegan). There&#39;s going to be some useful but gratuitous technical design stuff and some links, but the meat of the post is after that.&nbsp;</p>
<h2 dir="ltr">
Importance of simplicity</h2>
<p dir="ltr">
KISS. Keep it simple,silly.</p>
<p dir="ltr">
But why? Because people don&#39;t like to learn and won&#39;t bother to when they can avoid it:&nbsp;<a href="http://www.nngroup.com/articles/stagnating-expertise/">http://www.nngroup.com/articles/stagnating-expertise/</a>&nbsp; If you force cognitive strain on your users you will lose their trust and this has many downsides:&nbsp;<a href="http://www.nngroup.com/articles/navigation-cognitive-strain/">http://www.nngroup.com/articles/navigation-cognitive-strain/</a>.</p>
<p dir="ltr">
When we look at great designers who have done simple well, it&#39;s hard not to see Steve Jobs at the head of that group (these quotes are from&nbsp;<a href="http://blogs.wsj.com/digits/2011/08/24/steve-jobss-best-quotes/">http://blogs.wsj.com/digits/2011/08/24/steve-jobss-best-quotes/</a>, which includes many others if you like this sort of thing):&nbsp;</p>
<p dir="ltr" style="margin-left: 40px;">
<span style="font-size:12px;"><em><span style="color: rgb(24, 24, 24); font-family: georgia, serif; line-height: 18px;">&ldquo;Simple can be harder than complex: You have to work hard to get your thinking clean to make it simple. But it&rsquo;s worth it in the end because once you get there, you can move mountains.&rdquo;</span></em></span></p>
<p dir="ltr" style="margin-left: 40px;">
<span style="font-size:12px;"><em><span style="font-family:georgia,serif;"><span style="color: rgb(0, 0, 0); line-height: 18.390625px;">&ldquo;Look at the design of a lot of consumer products &mdash; they&rsquo;re really complicated surfaces. We tried to make something much more holistic and simple. When you first start off trying to solve a problem, the first solutions you come up with are very complex, and most people stop there. But if you keep going, and live with the problem and peel more layers of the onion off, you can often times arrive at some very elegant and simple solutions. Most people just don&rsquo;t put in the time or energy to get there. We believe that customers are smart, and want objects which are well thought through.&rdquo;</span></span></em></span></p>
<p dir="ltr">
Simplicity tells your audience that you care. Even if they are smart enough to use your complicated product and even if they are inclined to do so, they won&#39;t forget that you didn&#39;t try harder to build them what you should have.</p>
<p dir="ltr">
If you are jonesing for some more technical discussion of why simplicity matters in software design, here&#39;s Rich Hickey&#39;s 2012 Rails Conf keynote:&nbsp;<a href="http://www.youtube.com/watch?v=rI8tNMsozo0">http://www.youtube.com/watch?v=rI8tNMsozo0</a>. Some folks prefer his talk from Strange Loop the year before:&nbsp;<a href="http://www.infoq.com/presentations/Simple-Made-Easy">http://www.infoq.com/presentations/Simple-Made-Easy</a>&nbsp;Either way, you win.</p>
<h2 dir="ltr">
Winner, winner, chicken dinner</h2>
<p dir="ltr">
We cook at home often. After a while, we got good enough that the results were better than going out in just about every way (except the cleaning up part afterwards). This of course leads to experimentation, different styles of cooking, using different approaches, etc. Some times these can get quite involved and use small amounts of difficult to find or expensive ingredients (and you always need to find the recipe to recreate it).&nbsp;</p>
<p dir="ltr">
This post is a result of a recent chicken dinner at home. Everything I wrote above was just to get us here. I was surprised that such a simple recipe regularly produced some of the most delicious chicken I&#39;d ever enjoyed. But as I pondered that, I realized that the simplicity may be the reason it was so reliably good.</p>
<p dir="ltr">
Having prepared chicken many ways over the decades, we&#39;ve settled on this recipe:&nbsp;<a href="http://www.epicurious.com/recipes/food/views/My-Favorite-Simple-Roast-Chicken-231348">http://www.epicurious.com/recipes/food/views/My-Favorite-Simple-Roast-Chicken-231348</a>&nbsp;because it is simple, easy to follow and yields the same delicious result every time. It&#39;s literally as simple as (1) rinse and dry the bird, (2) salt and season the cavity, (3) truss the bird, (4) rain salt on the outside, (5) cook it for about an hour. Sit down to a delicious dinner -- if that sounds too easy, just try it.. If the trussing-the-chicken part has you worried, it&#39;s also dead simple -- here&#39;s a 90 second video that will have you doing it in no time:&nbsp;<a href="http://ruhlman.com/2010/07/how-to-truss-a-chicken/">http://ruhlman.com/2010/07/how-to-truss-a-chicken/</a></p>
<p dir="ltr">
Simplicity isn&#39;t just about the quality of the result but also in how you get there. Thomas Keller is a phenomenal chef and could have written pages worth of directions (that people would have slavishly followed), but they weren&#39;t needed. He had a simpler way that worked perfectly every time. After you have done this once, maybe twice, you won&#39;t even need the recipe any more -- the simple steps will just stick in your brain. That&#39;s perfect instructional design. Enjoy!</p>
<p dir="ltr">
Addendum: &quot;Winner, winner chicken dinner&quot; was stuck in my mind and I couldn&#39;t remember where it came from. So I had to Google it:&nbsp;<a href="http://www.urbandictionary.com/define.php?term=Winner+Winner+Chicken+Dinner">http://www.urbandictionary.com/define.php?term=Winner+Winner+Chicken+Dinner</a></p>
This time I&#39;m going to make your life better in a most delicious way (unless you are vegetarian/vegan). There&#39;s going to be some useful but gratuitous technical design stuff and some links, but the meat of the post is after that.&nbsp;
Importance...00867urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00urn:lsid:ibm.com:blogs:entry-a7c3e51f-7e9a-40a2-89b9-72720854ffebCase Study: How social interactions changed my life (or how seeing rock god guitarist Eric Johnson made me a bluegrass fan)Millard060001WYSUactiveComment Entriesapplication/atom+xml;type=entryLikes2013-07-10T01:26:38-04:002013-10-03T17:51:35-04:00<p dir="ltr">
For me (and I imagine many others), social media and the opportunities it brings enrich my life. Everyone is more interesting than we probably give them credit for and if you listen to their story it will be hard not to like something about them. But that&#39;s not where this story begins...</p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/ocms_oregon_zoo.jpg" style="width: 100%; display: inline-block;" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/ocms_oregon_zoo.jpg" style=" display:block; margin: 0 auto;text-align: center;" /></a></p>
<p dir="ltr">
Shortly after seeing <a href="https://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;ved=0CC8QFjAA&amp;url=http%3A%2F%2Fwww.crowmedicine.com%2F&amp;ei=X-HcUZaCOIjk9ASC0oGQDg&amp;usg=AFQjCNFl57F_cQSzRO1ZtEwXUrCpk6Msmg&amp;sig2=Dxk03XEwwOg5qQ1iUZsk-g&amp;bvm=bv.48705608,d.eWU" target="_blank">Old&nbsp;Crow&nbsp;Medicine&nbsp;Show</a> (pictured above <em>sans </em>one member too far left to fit in the frame) at the opening of the <a href="http://www.oregonzoo.org/events/category/concerts" target="_blank">Oregon&nbsp;Zoo&#39;s&nbsp;35th&nbsp;annual&nbsp;concert&nbsp;series</a>, my wife and I were on a short road trip, reminiscing about the concert and the series of events that brought us there. I grew up on 60s hippie music (wearing out that <a href="http://en.wikipedia.org/wiki/Woodstock:_Music_from_the_Original_Soundtrack_and_More" target="_blank">Woodstock&nbsp;3&nbsp;record&nbsp;set</a>) and came of age listening to 70s progressive rock of Yes, Emerson, Lake &amp; Palmer, early metal from Black Sabbath (no one really appreciates <a href="http://en.wikipedia.org/wiki/Sabbath_Bloody_Sabbath" target="_blank">Sabbath&nbsp;bloody&nbsp;Sabbath</a> as much as it deserves) and the hard-edge rock of early <a href="http://en.wikipedia.org/wiki/We%27re_An_American_Band" target="_blank">Grand&nbsp;Funk&nbsp;Railroad</a>. I&#39;ve played in a band the singer not-very-jokingly referred to as &quot;post Roman death metal&quot;.</p>
<p dir="ltr">
So I&#39;m still surprised that I now seek out bluegrass and Americana and these are the live shows I&#39;m most likely to attend. What the heck happened? It all started at an <a href="http://en.wikipedia.org/wiki/Eric_Johnson" target="_blank">Eric&nbsp;Johnson</a> concert. [Eric is considered one of the most respected guitarists on the planet, though I&#39;m not sure he&#39;s strayed into my new genre much.]</p>
<p dir="ltr">
This is where it gets social, where one thread leads to another until you are no where near where you started. I find this sort of thing happening a lot when I have the time to follow links from one place to the next -- though not always with such dramatic life changes. My wife and I put this chain together as we were riding along the Columbia river.</p>
<p dir="ltr">
<a href="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/social_connections.png" style="width: 100%; display: inline-block;" target="_blank"><img alt="image" src="https://www.ibm.com/developerworks/community/blogs/millarde/resource/BLOGS_UPLOADED_IMAGES/social_connections.png" style=" display:block; margin: 0 auto;text-align: center;" /></a></p>
<p dir="ltr">
<a href="http://www.tonyfurtado.com/" target="_blank">Tony&nbsp;Furtado</a> opened the Eric Johnson show. I never heard of him before that night (but I&#39;m one of those people that comes for the whole show, not just the headliner). He was amazing (and the main thing I remember from that evening). I went home and searched for more about him because I wanted to share it with my wife. I found a link to a performance he did for the <a href="http://www.woodsongs.com/" target="_blank">Woodsongs&nbsp;Old&nbsp;Time&nbsp;Radio&nbsp;Hour</a>. Given the name and my musical background, I was a bit dubious, but watched it anyway. Also on the same program was <a href="http://www.adrienneyoung.com/" target="_blank">Adrienne&nbsp;Young&nbsp;and&nbsp;Little&nbsp;Sadie</a>. I fell in love both with one of the songs they played (<em><a href="http://www.youtube.com/watch?v=2r7KCJiz2Bc" target="_blank">Home&nbsp;Remedy</a></em>) and their upright bass player&#39;s amazing smile.</p>
<p dir="ltr">
This led to two subsequent actions: purchasing the album the song was on (the Grammy nominated <a href="http://www.cdbaby.com/cd/adrienneyoung" target="_blank"><em><strong>Plow&nbsp;to&nbsp;the&nbsp;End&nbsp;of&nbsp;the&nbsp;Row</strong></em></a>) and attending the <a href="http://www.liveoakfest.org/" target="_blank">Live&nbsp;Oak&nbsp;Music&nbsp;Festival</a> near Santa Barbara, California where they would be performing. The Live Oak Music Festival turned into an annual trip, introducing us to many other artists along the Americana, bluegrass and Celtic path.</p>
<p dir="ltr">
My wife gets all the credit for the next link in the chain that brought us to Old Crow Medicine Show (OCMS). While we were enjoying the song <a href="http://www.youtube.com/watch?v=8YCaP-Fq4Jk" target="_blank"><em>Conestoga</em></a> from the album, she heard a guy singing background vocals whose voice was interesting to her. A bit of research in the liner notes turned up the name <a href="https://www.facebook.com/OldCrowMedicineShow?rf=108295849204816" target="_blank">Ketch&nbsp;Secor</a>. Along with being a generally talented multi-instrumentalist, he&#39;s also the front man for OCMS (he was also Adrienne Young&#39;s banjo teacher). This, of course, brought us to OCMS who we saw for the first time at <a href="http://stubbsaustin.com/" target="_blank">Stubbs&nbsp;BBQ</a> in Austin, Texas (wonderful outdoor concert venue if you ever get the chance). Pretty sure <a href="http://www.youtube.com/watch?v=GDw4_A2v1Lo" target="_blank">this&nbsp;video</a> was taken at the show we attended. Yeah, there were a lot of people there -- a lot of young people very into the high energy music of OCMS. We were hooked.</p>
<p dir="ltr">
What has kept me hooked, weird as it may sound, is the teamwork of a good bluegrass band. Many bluegrass groups work around a single microphone, moving in and out to raise their volume when it&#39;s appropriate. You can tell that they are listening intently to each other, feeding off clues, reacting to what they hear. There&#39;s a case study in teamwork there that I may chase down some day. On the Americana front, the often deep and meaningful lyrics of the singer-songwriters keep me listening and wanting more. It&#39;s a shame everyone hasn&#39;t heard of&nbsp;<a href="http://slaidcleaves.com/" target="_blank">Slaid&nbsp;Cleaves</a>&nbsp;(we own all of his albums and have seen him at least a half-dozen times).</p>
<p dir="ltr">
I&#39;m hooked on social media and the opportunities it opens for everyone to find new things to learn about and cherish. Follow lots of different people, listen to their stories and see where it takes you.</p>
For me (and I imagine many others), social media and the opportunities it brings enrich my life. Everyone is more interesting than we probably give them credit for and if you listen to their story it will be hard not to like something about them. But...102142urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00urn:lsid:ibm.com:blogs:entry-987810c2-090b-4034-85ac-b55253a54e12Why I won't be reviewing your stuff (or how to get me to)Millard060001WYSUactiveComment Entriesapplication/atom+xml;type=entryLikes2013-05-23T19:50:01-04:002013-05-23T19:51:16-04:00<p dir="ltr">
<span style="font-size: 12px;"><strong>It&#39;s mostly my fault</strong> for being optimistic and hoping that this time will be different, trying not to let a bad experience with someone else in a different context prejudice me against you and your situation. But it has become such a predictable pattern that the only thing to do was either <strike>rant</strike>&nbsp;blog about it or run about the room waving my hands in the air, screaming. A little from column A, a little from column B...</span></p>
<div dir="ltr">
Only once in recent memory has this worked the way it should:&nbsp;</div>
<ol dir="ltr">
<li>
Someone comes to me early in their content production process and asks me for a review.&nbsp;</li>
<li>
<em>I read the material carefully and provide what I hope are useful suggestions to improve it.</em></li>
<li>
They use the suggestions to improve the material. The time I spent added real value to someone else&#39;s work.</li>
</ol>
<div dir="ltr">
<span style="font-size: 12px;">This happened with an early draft of <a href="http://www.ibmpressbooks.com/store/practical-guide-to-distributed-scrum-9780137041138" target="_blank"><strong>The&nbsp;Practical&nbsp;Guide&nbsp;to&nbsp;Distributed&nbsp;Scrum</strong></a>. <a href="https://www.ibm.com/developerworks/community/profiles/html/profileView.do?userid=270001YW5Q" target="_blank">Elizabeth&nbsp;Woodward</a>, the lead author, asked me to review it. I didn&#39;t particularly care for the structure of some of the content -- the hardest sort of thing to fix. But she asked early enough and we worked through the issues and the book turned out much better because of it.</span></div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
Usually, it works like this:</div>
<ol dir="ltr">
<li>
Someone comes to me (often late) in their content production process and asks me for a review.&nbsp;</li>
<li>
<em>I read the material carefully and provide what I hope are useful suggestions to improve it.</em></li>
<li>
They thank me profusely for my time and excellent comments and apologize that they just don&#39;t have time to make the changes. [I could have spent that time golfing for all the good it did.]</li>
</ol>
<div dir="ltr">
<span style="font-size: 12px;">When I agree to review something, I accept partial responsibility for the end product. I become a partner, even if a minor one. I will not skim the material and give you a winking thumbs-up. I will ask questions, some times lots of them. More than one person over the years has been shocked, I think, to get a detailed set of suggestions (from outline adjustments to copy-editing) rather than a &quot;looks fine to me&quot; reply.</span></div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
I do this for one simple, perhaps egotistical, reason: If you are going to tell people that I reviewed it, then I want it to look like something I would publish, present or approve of. I&#39;m going to treat it as partly mine and put the same level of effort into reviewing your work as I would put into reviewing my own.&nbsp;<span style="font-size: 12px;">But that seems to almost never be what you want (or at least not something you can use). You want me to say it&#39;s okay so you can be done with it and claim to have had it reviewed. <strong>I&#39;m never going to do that.</strong>&nbsp;</span></div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
Just like changing code, fixing demonstrations and tutorials after they have been written is costly. Just like code, you are probably up against a shipping date and you&#39;ve waited too long. So let&#39;s promulgate proper planning for handling reviews, particulary if you are using reviewers outside of your team who have their own projects to worry about:</div>
<ol dir="ltr">
<li>
If you care about what you are creating, you should plan a requirements or story review. Using your elevator speech as an introduction, explain what you are trying to accomplish and your plan for getting that across. A lot of structural and scenario issues can be addressed cheaply at this stage.</li>
<li>
Before you commit to detailed instructions and especially screen shots or artwork, outline your demonstration or tutorial. A story board or wire frame approach can bring across the general flow without involving details. At this point, it&#39;s still easy to fix problems with the story arc of the material and we can talk about useful visuals.</li>
<li>
If you haven&#39;t at least done the design review in #2, <strong>don&#39;t ask anyone to review your final product</strong>. You&#39;re in too deep and you no longer have the time nor energy to fix what you&#39;ve wrought. Ship it or start over, but don&#39;t look for half-hearted validation from people who commiserate with you.</li>
</ol>
<p dir="ltr">
If this seems like too much effort for your project, then don&#39;t do your project -- it&#39;s probably not worth doing. My father (and I&#39;m sure many parents) always said &quot;If it&#39;s worth doing, it&#39;s worth doing well.&quot; If time is too tight, talk your team or management out of doing it. If they think it&#39;s too important to drop, ask them why it&#39;s not important enough to do well.</p>
<div dir="ltr">
<span style="font-size: 12px;">Before I get to the closing fun, it&#39;s important for me to state clearly that <strong>I LIKE reviewing things</strong>. I like being able to add value to something I didn&#39;t have to build from the ground up myself. I like that someone trusts my opinion enough to ask for it. I just can no longer afford the time, effort and frustration it costs me if you aren&#39;t actually going use the feedback (part of the Lean mantra: Identify and remove waste).</span></div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
I have a new set of questions I will be using before agreeing to review anything:</div>
<ol dir="ltr">
<li>
How close do you think this is to done? If you think it&#39;s really close, then it&#39;s too late to review -- we&#39;re only spell and grammar checking. There are automated tools for that, you don&#39;t need me.</li>
<li>
Who else have you asked to review the material and when? If the answer includes a list of people or &quot;yesterday&quot;, I may be opting out. If a bunch of people have already reviewed it, why are you still getting reviews? If it was just reviewed yesterday, have you incorporated those comments yet? We all know you get more resistant to changes the more you&#39;ve made.</li>
<li>
If I suggested something that would cause you to <em><strong>rip out 20% and rework it</strong></em>, would you have the time and energy to do that? If not, then you are really looking for approval, not a review. Let me try my hand at play writing:</li>
</ol>
<div dir="ltr" style="margin-left: 80px;">
<span style="font-size: 12px;">ME: I&#39;m imagining it&#39;s fine, go ahead and use it.</span></div>
<div dir="ltr" style="margin-left: 80px;">
<em>YOU: But you didn&#39;t even look at it!</em></div>
<div dir="ltr" style="margin-left: 80px;">
ME: You just told me you wouldn&#39;t have time to fix it if I found something worth fixing. What&#39;s the point of me looking at it?</div>
<div dir="ltr" style="margin-left: 80px;">
<em>YOU: But maybe you won&#39;t find anything big that needs fixing...</em></div>
<div dir="ltr" style="margin-left: 80px;">
ME: Maybe not. But given the rush you&#39;ve put this together in, it&#39;s almost certain.</div>
<div dir="ltr" style="margin-left: 80px;">
<em>YOU: Well, why don&#39;t you review it anyway and we&#39;ll fix the big things in the next version.</em></div>
<div dir="ltr" style="margin-left: 80px;">
ME: Why don&#39;t you just publish it and when you are ready to start work on the next version, I&#39;ll review it then?</div>
<div dir="ltr" style="margin-left: 80px;">
<em>YOU: Because I need at least one reviewer to sign off or I can&#39;t publish it.</em></div>
<div dir="ltr" style="margin-left: 80px;">
ME: Sorry. Let me refer you to <a href="https://www.ibm.com/developerworks/community/blogs/millarde/entry/why_i_won_t_be_reviewing_your_stuff" target="_blank">this&nbsp;blog&nbsp;post&nbsp;I&nbsp;wrote</a>.</div>
<div dir="ltr">
&nbsp;</div>
<div dir="ltr">
I&#39;m not being difficult. Like most of us, I can fill my days (and evenings) with my own work. I&#39;ve read that learning to say &quot;no&quot; can improve your productivity by avoiding wasted effort and distractions. This is how I start.</div>
It&#39;s mostly my fault for being optimistic and hoping that this time will be different, trying not to let a bad experience with someone else in a different context prejudice me against you and your situation. But it has become such a predictable pattern...011433urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00urn:lsid:ibm.com:blogs:entry-b403f490-56c7-42d2-ac3a-d6a72f348af2Where are you on your path to Agile Fluency?Millard060001WYSUactiveComment Entriesapplication/atom+xml;type=entryLikes2013-01-18T21:17:20-05:002013-01-18T21:17:20-05:00<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">I hadn't heard of <b>Agile Fluency</b> until a few days
ago. I had recently joined AgilePDX (our local Portland group of
folks interested in all things agile) and the email reminder came in
about the monthly evening talk. Jim Shore and Diana Larsen were going
to discuss their Agile Fluency model as part of the group's annual
Agile Tune-up where everyone comes to think about what good goals might be for
their teams for the coming year.</span></p>
<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">The fog was thick outside. As bad as
I'd ever seen it (and it proved to be as difficult to drive in as I
feared). I thought about not going to the meeting, but then I googled
“agile fluency” and started to read a bit about Jim's background
(I hadn't realized InfoQ had named him one of the most influential
people in agile for 2012:
</span><a href="http://www.infoq.com/news/2012/04/agile-influential-people" style="line-height: 1.5228364280871403;">http://www.infoq.com/news/2012/04/agile-influential-people</a><span style="line-height: 1.5228364280871403;">).
Then I read the article. Then I realized I really needed to go –
this was going to be interesting.</span></p>
<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">I won't recap the article, you can read it here: </span><a href="http://martinfowler.com/articles/agileFluency.html" style="line-height: 1.5228364280871403;">http://martinfowler.com/articles/agileFluency.html</a><span style="line-height: 1.5228364280871403;">.
I won't recap the meeting, Moss Drake did a great job in his blog the
next day:
</span><a href="http://mxmossman.blogspot.com/2012/01/agile-levels-of-fluency.html" style="line-height: 1.5228364280871403;">http://mxmossman.blogspot.com/2012/01/agile-levels-of-fluency.html</a><span style="line-height: 1.5228364280871403;">
(though I'll mention to him that it's really 2013 now). I'll presume
you've already popped those links into a new tab and skimmed them. No? Go ahead, I'll wait.</span></p>
<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">Okay, just in case you didn't go read,
I'll recap a little bit (most of this is in the article, some of it
embellishments from the meeting): Jim and Diana discuss a team's path
through agile fluency (based on their extensive experience in the
space and with many teams), giving each level a star:</span></p>
<ul>
<li><p style="margin-bottom: 0in">With no stars, you can be
effectively building code. You write stuff based on specs others
give you and it mostly comes out fine. You're not agile and you may
not care.</p>
</li><li><p style="margin-bottom: 0in">With a <i>team culture shift</i>, you can
reach the one star level, <b>focusing on value</b>. You are likely using
Scrum or Kanban and working with User Stories and doing some
estimation and you see your progress in terms of business value.
You're probably hitting most of your iteration goals but you are not
necessarily continuously delivering and your scope is just your own
backlog. These are the Agile Fundamentals.</p>
</li><li><p style="margin-bottom: 0in">With a<i> team skills shift</i>, you are
now at the two star level and delivering value at the market's
cadence. You are <b>capturing value</b> and delivering it as quickly as the
market will absorb it – maybe it's a web app you update every few
hours or an enterprise application that delivers once a quarter, but
you are delivering reliably. You are likely invested in continuous integration, thorough unit testing, perhaps even TDD, and other XP practices. This level can be thought of as Agile
Sustainability and a team and product could be very successful at
this level for a long time. Depending on the size of the
organization, this may be all you'll ever need.</p>
</li><li><p style="margin-bottom: 0in">With an <i>organizational structure
shift</i>, you get three stars and reach a point of <b>optimizing value</b>
across the product. It's no longer just about your team or your
piece of the pie but the organization has shifted to optimizing
value across the product and throughout the organization. There are no
hand-offs and excellent product level decisions are getting made
routinely. This is “Agile's Promise” and what some refer to as
Enterprise Agile.</p>
</li><li><p style="margin-bottom: 0in">With a complete <i>organizational
culture shift</i>, you reach a four star level where you are<b> optimizing
for systems</b> across your enterprise. This is “Agile's Future” and
it's not clear that many organizations have neared this level yet.</p>
</li></ul>
<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">What struck me most about the article
is the use of the word “fluency” and how it is defined by Shore
and Larsen. They draw a bright line between proficiency and fluency.
Proficiency means you understand the set of practices and are capable
of following them. In their words, “Fluency is how a team develops
software when it's under pressure. Anyone can follow a set of
practices when given time to focus...true fluency is a skillful,
routine practice that persists when your mind is distracted with
other things.” Like broken builds and disgruntled customers (or,
here in the Pacific Northwest, the first sunny day in weeks).</span></p>
<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">I'm reminded of a saying about
musicians: <i>Amateurs practice a piece until they get it right; professionals practice a piece until they never get it wrong</i>. For me
that sums up the difference between proficiency and fluency in this
context.</span></p>
<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">Having been involved in several team's
attempt at agile transformation, I've seen a lack of
understanding of the need for fluency disrupt the transformation.
The team has had some training and faltered in their early sprints
(as is common and generally expected) but they are using the
retrospectives and honestly looking at what needs improvement. Then,
before they reach a point of fluency, something distracts them, some
disruption in the force tries to throw them off their game. And it is
successful. Before they can get back on track, their manager decides
(problem #1) that the retrospective meeting is worthless because
nothing seems to get better – and it just sort of crumbles from
there. They are now a Scrum-but team and may always remain one. Had
they been given the space to reach fluency at their current level,
the could have weathered this storm. Lacking that fluency, they could
only return to what they used to be fluent at.</span></p>
<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">Reminds me of another saying from a
different field: <i>Under stress, you will not rise to the occasion,
but default to your level of training</i>. So your level of training
needs to bring you to fluency at the things you care about and your product and team depend on.</span></p>
<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">Models like CMMI tend to focus on
practices that you adopt – so perhaps you are proficient. But the
Agile Fluency model's focus on fluency, not just being capable of the
practice but having adopted it so completely that it's just what you
do makes a lot of sense to me. I also like the model because it is
not about some set of practices you have adopted or a particular
metric you've hit but about who you are, how you behave.
Your fluency allows you to “be” at that level – it's what your
team has become, how it's focused, what behavior feeds its soul.</span></p>
<p style="margin-bottom: 0in"><span style="line-height: 1.5228364280871403;">The article includes a nice diagram of
the path as well as a discussion of the benefits, investments and
core metrics at each level. It's frank about the type and size of
investment required at each level. Two stars can be hard because of
the breadth and depth of skills required and the level of practice to
become fluent. If you work in an organization that cares about agile
development, go read and share the links (and this blog if you are so
inclined). The ideas are valuable and I expect you'll hearing more about
them.</span></p>
I hadn't heard of Agile Fluency until a few days
ago. I had recently joined AgilePDX (our local Portland group of
folks interested in all things agile) and the email reminder came in
about the monthly evening talk. Jim Shore and Diana Larsen were going
to...001554urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00urn:lsid:ibm.com:blogs:entry-83791af6-1b91-45ef-8c14-cb4c69132c8aAre we the reason our kids aren't technical professionals?Millard060001WYSUactiveComment Entriesapplication/atom+xml;type=entryLikes2012-04-08T20:18:29-04:002012-04-08T20:18:29-04:00
<p>You don't have to look around much to find articles decrying how few American students are choosing engineering or technical professions. It has been feeling like an annual set-piece for years. Hiring managers wonder why more American students don't choose these high paying and professional career paths. Is it because they aren't properly prepared by our education system? Are they too lazy? Too interested in video games or rap music or marketing?</p><p>I'll suggest it's our fault. You and me.</p><p>I don't have a lot of data, but I have some that's poignant and personal.</p><p>My son is a smart kid. He does well in most subjects if he cares to. He's in college and certainly could be studying a technical discipline if he wanted. I've been a software developer my whole career (and as you could tell by past posts, I enjoy it). As a profession it has supported our family well including some private school education for the boy, quite a few glorious vacation experiences and many of life's amenities that we could have done without (and many do).</p><p>While enjoying one of those fun-to-do-but-somewhat-expensive outings with my son (and a couple co-workers), I had to step away from the group to pay for parking. [I learned of this discussion later, but confirmed it with all parties involved.] My teammates were politely chatting with my son about his plans now that he was in college. And the somewhat obvious question came up: &quot;Have you ever thought about working for IBM and doing the sort of stuff your dad does?&quot;. Without needing to reflect much on the topic, my son replies &quot;No. I see how much he works -- all the nights and weekends. That's not the sort of life I want.&quot;</p><p>I feel the need to defend us momentarily. By all accounts, I've been a very good father. I never miss an event (and I'm not late to them nor distracted at them, either). I read to him at bed time every night until he was almost a teenager. We did Tae Kwon Do together. I've been involved in all sorts of volunteer activities in support of him (I was a Cub Master and Assistant Scout Master for many years and ran fund raising for the wrestling team). I was his Statistics tutor. In my son's defense, he's not lazy nor unmotivated -- he's an Eagle Scout and has worked tirelessly and without complaint many times and in many situations. We work side-by-side in support of our local food bank and Habitat for Humanity organizations. He's been on the Dean's list or Honor Roll more than once and his first full year of college isn't quite over yet. And I know he thinks I've been a good father because he brought a large room full of people to tears (including me) during the speech he gave at his Eagle Court of Honor recently.</p><p>So what gives?</p><p>It's not me complaining about my job (most of the time) as I'm the first person to tell you I love what I do for a living. [I'd rather play bass for Lynyrd Skynyrd, but that job was taken.] It's not him being incapable of doing the work. As he's playing XBox on the large HDTV with explosions coming from the surround sound speakers while posting to his Tumblr on his Mac Book, it's not because he's unaware of what earning a good living makes possible.</p><p>Part of it is politeness on my part, failing to provide a complete context. At least some of those evenings or weekends I was working were caused by not-working so that I could attend the school play or teacher's meeting or wrestling match or drive a car load of kids to a campout on a Friday. Fortunately, the work I do makes it possible to have that flexibility. But you don't want to say very often &quot;Daddy's working tonight because he took time to be with you today.&quot; These activities were never a burden and I refused to give him any reason to think they were.</p><p>Part of it is a personal achievement complex I've never been able to shake. I don't want to do good work, I want to do great work whenever the situation allows. If I can swap a couple hours of relaxing in the evening for an impressed customer, I'm usually happy to make that trade. I'm a maker at heart and want to make things worthy of my time and effort (and other people's attention).</p><p>But I think the larger part of it is how we run this business of software development (not necessarily at IBM, I've worked a few other places during my career): Plans that were never achievable unless everything went perfectly (and when is the last time that happened?). Customers that want more because they know you could give it -- and if you don't maybe they won't give you the next job. Teams that want to do more than they promised because that's just how they roll. And all of this comes at a personal cost to those involved -- and it may be convincing their children to look for other kinds of work.<br /><br />An oft-overlooked (have we just given up?) practice of Extreme Programming is working at a Sustainable Pace (<a href="http://www.extremeprogramming.org/rules/overtime.html">http://www.extremeprogramming.org/rules/overtime.html</a>). There may be more to that than developers wanting some of their weekends back. It may be how we demonstrate to the next generation of possible software developers that these jobs are worth having and can provide a lifetime of personal satisfaction.</p>
You don't have to look around much to find articles decrying how few American students are choosing engineering or technical professions. It has been feeling like an annual set-piece for years. Hiring managers wonder why more American students don't choose...00818urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00urn:lsid:ibm.com:blogs:entry-1660cdc6-1e27-44fa-811a-2ee5c8ccc4feDon't go there and Reading List #1Millard060001WYSUactiveComment Entriesapplication/atom+xml;type=entryLikes2012-03-26T16:32:08-04:002012-03-26T16:32:08-04:00
Following up a bit on the last topic (where I talk about how much I love the field of software development because I always have to be learning new things), a college professor friend of mine who teaches software development shared a disappointing story...<br /><br /><div style="margin-left: 40px; font-style: italic; font-weight: bold;">As he’s chatting with some students after class, they ask him which language or technology they can learn so that they don’t have to learn anything else once they get their degree.<br /></div><br />This blew me away on several levels: (1) These are university students participating in a largely optional learning activity (college) and they are already trying to figure out how to stop learning?! That doesn’t bode well for their lives in general, much less their future as software developers, (2) They are studying a technology field and are old enough and smart enough to get into college, yet they’ve missed the fact that technology has done nothing but change their entire lives? There’s a chance that some of the specific technologies they learn in college won’t even be relevant by the time they graduate, (3) They think they’d actually want the job they are describing. [That last one is wrapped up with some personal bias, for sure -- I can’t imagine any period in my career where I would have been happy doing just that thing for the remainder of it.]<br /><br />Yet, somehow I fear I may be the odd one here. One of my favorite interview questions (sorry, no bizarre thought puzzles like “how do they make M&amp;Ms”) was “<i>What was the last book you read and what magazines do you read regularly?</i>” I rarely got a decent answer. Often I’d get quizzical looks and would have to eventually follow up with “<i>Software development is a rapidly changing field. You’d like to come work for us as a software developer. I’m trying to figure out how you go about keeping up with change and staying abreast of new technologies and practices.</i>” Unfortunately, they often now understood my question and still had nothing satisfying to say.<br /><br />BUT, here’s the answer that I hated the most: “<i>Yeah, you’re right, doing that’s a good idea but my company doesn’t pay for books or magazine subscriptions.</i>” So you know it’s a good idea, that it would be valuable to you as a software developer and by extension make you more valuable as an employee, but unless someone else pays for the book or magazine subscription, you’re not going to do it? [imagine several more paragraphs of crazed ranting here -- it’s harder than I thought to not include them]<br /><br />I’m afraid to ask this question any more. It’s so easy to follow folks on Twitter or Google+ or read their blogs or get entirely free magazines sent to you in email or buy even cheaper e-book versions of books that the interviewee’s quizzical stare would cause me to tilt. <br /><br /><div>To help fight this phenomenon I will occasionally curate a useful set of links or list of books that I personally find valuable. If you know of equally good or better books or links, please post in the comments -- I can’t read everything and I won’t post about something I haven’t actually read or used and found value in.</div><div> </div>Recently, the topic of getting someone up to speed to work with Dojo came up. The team is using Agile/Scrum practices. Based on things I’ve read trying to climb the same learning curve, here are my recommendations (I don’t want to seem to support any one bookseller over another, so please just search on the title and buy where you’d like):<br /><br /><b>JavaScript </b><br /><u>Eloquent JavaScript: A Modern Introduction to Programming</u> by Marijn Haverbeke (don't let the subtitle fool you, it's a good introduction and recently published).<br /> <br /><u>JavaScript: The Good Parts</u> by Douglas Crockford. See also www.crockford.com/javascript<br /><br /><u>JavaScript Patterns</u> by Stoyan Stefanov, presentation by author at http://www.slideshare.net/stoyan/javascript-patterns <br /><br /><b>Dojo</b> <br /><u>Getting StartED with Dojo</u> by Kyle D. Hayes with Peter Higgins. A gentle yet useful introduction, nicely organized and presented. <br /><br /><u>Dojo: The Definitive Guide</u> by Matthew A. Russell. As I searched for a really good Dojo book, this one kept appearing at the top of people's lists. While based largely on dojo 1.1, it focuses on fundamental aspects of Dojo that I expect remain the same today. I understood things after reading this that I only thought I understood before reading it.<br /><br /><b>Agile and Scrum </b><br /><u>Implementing Lean Software Development: From Concept to Cash</u> by Mary and Tom Poppendieck. This book &quot;made it click&quot; for me, providing a vivid description of how you can deliver high quality software of value to the customer while eliminating waste and constantly improving your team. <br /><br /><u>Succeeding with Agile: Software Development Using Scrum</u> by Mike Cohn. I very much enjoy Mike's writing style and I give this book an edge over Ken Schwaber's original treatment, but either will suffice.<br /><br /><u>Agile Estimating and Planning</u> by Mike Cohn. If you want to really understand how Story Points are meant to work and how Agile Planning seeks to mitigate risk, this is the book. If you're more into Cliff Notes, Mike provides lots of useful material at his web site: http://www.mountaingoatsoftware.com <br /><br />I personally have a Safari Books Online (http://safaribooksonline.com/Corporate/Index/) Individual subscription. For $23 a month I can read any book I want, up to 10 at a time on my personal &quot;bookshelf&quot;. You also earn credits that allow you to download books permanently to your computer, often in a variety of formats (PDF, .mobi, .apk, etc.) <br />
Following up a bit on the last topic (where I talk about how much I love the field of software development because I always have to be learning new things), a college professor friend of mine who teaches software development shared a disappointing story... As...001384urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00urn:lsid:ibm.com:blogs:entry-40488ba5-872c-41ac-b645-4999b7197569The Beginner's MindMillard060001WYSUactiveComment Entriesapplication/atom+xml;type=entryLikes2012-03-19T23:55:37-04:002012-03-20T00:25:25-04:00
<p>Part of what makes software development a perfect career choice for me is that it never stales. At least during my lifetime so far, technology hasn’t sat still for more than a few years at a time. The next layer of capability, the next opportunity, the next <span style="font-style: italic;">whatever </span>is always incubating. I can safely say I’ve rarely had the same year of experience twice.</p><p>And I love that about it. I love that I need to keep learning and reinventing myself as a technical professional, that what I know is only a little bit more important than what I’m learning. We are served well if we can maintain a “Beginner’s Mind”. [I first learned of the Beginner’s Mind from <u>Zen Guitar</u> by Philip Toshio Sudo but a quick search will provide many references.]</p><p>One of my favorite stories (perhaps even a parable) related to the Beginner’s Mind (cobbled together from a couple different versions) goes...</p><blockquote><i>A university professor comes to visit a famous Zen master. While the master quietly serves tea, the professor talks on and on about Zen. The master fills the visitor’s cup to the brim and keeps on pouring. The professor watches the overflowing cup until he can no longer restrain himself. “It’s overfull! No more will go in!” he blurts out. “You are like this cup,” the master replies, “full of your own opinions and speculations. How can I show you Zen unless you first empty your cup?”</i></blockquote><p>Technology doesn’t always shift so much that it feels new or even is all that new. Sometimes people (*cough* marketers) try to hide the shift even if it’s there to dampen people’s fear of change. When I first encountered JavaScript it seemed toy-ish (okay, it was the mid-late-1990s so perhaps this was at least partially true) and not very useful and certainly not very like Java (but Java was hot then, so I'm sure JavaScript seemed like a great name to someone) . And that impression stuck, especially after using it for a little while from a Java developer’s mindset. That impression filled my understanding and wanted to inform further speculation.</p><p>Then in more recent times I read about JavaScript frameworks and AJAX technologies and my first reaction is “Who would build anything they really cared about with that mess?” [Clearly I’m not practicing a Beginner’s Mind at this point.] And some of these technologies feel like the “future of the Internet” -- maybe apocalypse <b>is</b> just around the corner...</p><p>Recalling the practice of the beginner's mind, I decide it’s time to start over with JavaScript. My early experiences and opinions have filled my cup and made me unable to sufficiently process any new meaning that is inconsistent with my preconceptions. Part of how we become “experts” is by building a useful network of information in our brains that allows us to easily process investigations and test ideas against it. The problem is that as that network “solidifies”, it becomes harder to expand and adapt it to information that is inconsistent with its nicely formed structures. Our expert status can become frozen at a moment in time, resistant to new and valuable information.. That’s a form of death to a technologist.</p><p>I empty my cup and read <u>Eloquent JavaScript</u> by Marijn Haverbeke (among other books) and do the examples as if I’m really just learning the language for the first time. I watch most of Douglas Crockford’s video lectures (<a href="http://javascript.crockford.com/">http://javascript.crockford.com/</a>). I watch the one on functional programming more than once -- hard shaking loose years of object-oriented programming brain structures.</p><p>Then I find myself in a position writing widgets in JavaScript as part of my job. Now JavaScript is just another tool with its advantages and weaknesses just like any other tool. I learned a valuable lesson (or am reminded of one) about maintaining a Beginner’s Mind as I approach my life and my work.</p>
Part of what makes software development a perfect career choice for me is that it never stales. At least during my lifetime so far, technology hasn’t sat still for more than a few years at a time. The next layer of capability, the next opportunity, the next...001157urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00urn:lsid:ibm.com:blogs:entry-0adb302e-d4e2-4ce0-8074-633184d3ba31InauguralMillard060001WYSUactiveComment Entriesapplication/atom+xml;type=entryLikes2012-02-13T11:17:57-05:002012-03-20T00:04:07-04:00I chose this profession on purpose -- and in a moment of desperation.<br /> <br />I had started college as a journalism major after a successful run as editor of my high school’s newspaper (which won its first state-wide awards under my direction). I liked doing it, was successful at it and was attending a real School of Journalism at a decent university. And things were going well. I started questioning my choice as journalists were starting to be jailed (in the United States, believe it or not) for refusing to disclose their sources. I wondered if I could protect some criminal source at the cost of being ripped from my family and imprisoned for an unknown period of time. Then a visiting professor who had taught my news editing and headline writing class told me at the end of the semester that “you really have a career in this if it’s what you want to do”.<br /> <br />Chalk it up to being young and inspired to become a member of the fourth estate -- I had not really thought of it as a choice up to that moment. It was just the path I was on and what I (thought I) was meant to do. Sitting here in 2012 with many newspapers dead or dying and many news organizations generally in difficult times (or not really “news” organizations any more), I’m glad it was a choice (and one that I could remake).<br /> <br />As that young, inspired journalist I knew that I’d be called upon to write about all sorts of things and it would help if I knew something about them. Having grown up in a rural area in the 1970s, I knew almost nothing about computers so I decided to learn about programming during my freshman semester. I loved the class and finished at the top of it, ticked it off as “knowledge acquired” and moved on. Until that fateful December when I realized I needed to choose a different major. As I cast about my brief life’s experiences looking for something that I enjoyed doing and might support me (and the family I didn’t have yet), I recalled that programming class. Could I really get paid for something that just seemed fun to me? Would someone pay me to solve technical puzzles and build software? [Those sound like crazy questions now, but back before personal computers and the Internet and smart phones the answers were not as obvious.]<br /> <br />Thus began my journey to this moment, this Sunday morning in early 2012, with decades of solving technical puzzles and building software behind me (and hopefully many more in front of me). Knowing that my career was a choice and I made it well. Waking up most mornings wanting to go to work despite having done it until bed time the night before. Using those skills to fuel hobbies and community activities and house and feed and support my family.<br /> <br />Also at this moment, I find myself in Hillsboro, Oregon working at the IBM Lab in Beaverton helping develop the next version of IBM Rational Team Concert -- a tool that helps people and companies (including me, my team and IBM) build software better. Given how I feel about my career choice, I can’t imagine a better job -- building software that helps people build software (and getting to use that software myself for that purpose).<br /> <br />Thanks for reading this first post. Hopefully you’ll find value in the ones that follow. I expect to write a bit about software development in general and sometimes about RTC in particular. Because of my journalism background, I can chase tangents and write for hours -- doesn’t mean anyone would want to read it. So unless the topic requires deep explanation or lots of pictures, my personal post size limit is one page (and this one just breached).I chose this profession on purpose -- and in a moment of desperation. I had started college as a journalism major after a successful run as editor of my high school’s newspaper (which won its first state-wide awards under my direction). I liked doing it, was...00543urn:lsid:ibm.com:blogs:entries-f8fe6ee9-79e5-4050-875f-e8bb6668e99dbeginner's mind2014-12-10T08:57:12-05:00