<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" version="2.0">
  <channel>
    <title>ÜberConf</title>
    <link>http://uberconf.com</link>
    <description>ÜberConf</description>
    <item>
      <title>Chess Pieces or Domain Expertise? Your Choice</title>
      <link>http://uberconf.com/blog/johanna_rothman/2013/06/chess_pieces_or_domain_expertise_your_choice</link>
      <description>&lt;p&gt;Many years ago, I started a job as a contract manager, and it became clear I had a big problem. I had developers who knew one area of the code well. I had testers who knew not much of any area of the code well, even though they had worked for the organization for many years. Why? They had been shuffled from one project to another almost every month for years.&lt;/p&gt;
&lt;p&gt;The writers had more domain expertise than anyone, because they had learned the product from end to end. What was I going to do? This project needed to finish in eight weeks, I needed to hire my replacement, and the people were shell-shocked from one manager after another. I was the fourth Director of Software Development in six months.&lt;/p&gt;
&lt;p&gt;I decided to make a &lt;a href="http://www.jrothman.com/books/manage-your-project-portfolio-increase-your-capacity-and-finish-more-projects/" target="_blank"&gt;project portfolio&lt;/a&gt;, and rank the projects to know which projects were first, second, and third. I knew about this first project, but what was second and third? I was sure we had more crises, waiting.&lt;/p&gt;
&lt;p&gt;Next, I asked people what they wanted to work on. I was sure that people could select their areas of responsibility, and it would work out. This is before we had agile teams. I was using a &lt;a href="http://www.jrothman.com/2008/01/what-lifecycle-selecting-the-right-model-for-your-project/" target="_blank"&gt;staged delivery lifecycle&lt;/a&gt;, so we had cross-functional teams and we worked by feature.&lt;/p&gt;
&lt;p&gt;Next, I asked the teams to develop their deliverables in two-week chunks: what deliverables, as in features, could they deliver in the next two weeks, working as a cross-functional team?&lt;/p&gt;
&lt;p&gt;The teams started to work together. They started to work across the code, not just in one area of the code. It wasn&amp;#8217;t perfect, but it was working. The testers expanded their knowledge, because they were able to focus on the entire product. The developers learned the product end-to-end. The writers were happier, because people answered their questions.&lt;/p&gt;
&lt;p&gt;About three weeks into this, a crisis happened with the second-ranked project. A senior manager wanted to yank a bunch of people off the top-ranked project and put them onto the second ranked project. He told me I had to give him people.&lt;/p&gt;
&lt;p&gt;&amp;#8220;No. I have no one for you.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;But you work for me.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Yes, I work for the organization. But this project, the one that everyone is on, is more important than your project. So, I have no one for you, and I won&amp;#8217;t for another two weeks. Unless I hear from the CEO that your project is more important than this one. In that case, we will stop working on this one, and everyone will work on your project.&lt;/p&gt;
&lt;p&gt;We only have eight people. We can&amp;#8217;t multitask. We can only work on one project at a time. Moving people off and onto projects as if they are chess pieces doesn&amp;#8217;t make sense. This top-ranked project has two more weeks to go, and then it&amp;#8217;s done. When it&amp;#8217;s done, I can assign all eight people to your project, no problem. But assigning them now? Craziness.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Now, should I have called him crazy? That was darn close to a career limiting conversation. Don&amp;#8217;t do that! But the rest of the conversation? Useful.&lt;/p&gt;
&lt;p&gt;And that&amp;#8217;s the topic of this month&amp;#8217;s &lt;a href="http://www.stickyminds.com/s.asp?F=S17987_ART_2" target="_blank"&gt;Management Myth #18: I Can Move People Like Chess Pieces&lt;/a&gt;. When you move people like chess pieces, you deny them the opportunity to learn domain expertise. You don&amp;#8217;t manage the project portfolio, and you decrease the capacity of your organization. It&amp;#8217;s all around bad.&lt;/p&gt;
&lt;p&gt;Did I want to be nice to the senior manager? Of course I did. But, good management is not about being nice to everyone all the time. Much of management is about saying no when you have to. And, I really needed to say no.&lt;/p&gt;
&lt;p&gt;With agile approaches, I would have had more options: I could have used iterations and sequenced the projects differently&amp;#8212;maybe. But that would not have allowed the organization to release the top-ranked project in the next few weeks. It would have made the people feel horrible, as if I&amp;#8217;d yanked the promised dessert away from them. Yes, the project was that close to completion.&lt;/p&gt;
&lt;p&gt;While you &lt;em&gt;can&lt;/em&gt; move people as if they are chess pieces, it&amp;#8217;s rarely a good idea. You want to leave people with project teams, to let them create a solid team&amp;#8212;that&amp;#8217;s the forming, storming, norming part. And, you want to keep people on a product long enough that they develop significant domain expertise in the product. When they become bored and ask to move, then they will tell you in a one-on-one that it&amp;#8217;s time to move.&lt;/p&gt;
&lt;p&gt;In the meantime, don&amp;#8217;t move people as if they are chess pieces. People need to develop mastery over their work. They need the autonomy to select the areas of their work that they will develop domain expertise in. They need to feel as if they have a sense of purpose about the work. Gee, it sounds as if I&amp;#8217;m parroting Dan Pink, in &lt;a href="http://www.amazon.com/gp/product/1594484805/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1594484805&amp;amp;linkCode=as2&amp;amp;tag=rothmaconsulg-20&amp;quot;&amp;gt;Drive: The Surprising Truth About What Motivates Us&amp;lt;/a&amp;gt;&amp;lt;img src=&amp;quot;http://www.assoc-amazon.com/e/ir?t=rothmaconsulg-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1594484805&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; border=&amp;quot;0&amp;quot; alt=&amp;quot;&amp;quot; style=&amp;quot;border:none !important; margin:0px !important;&amp;quot; /&amp;gt;" target="_blank"&gt;Drive&lt;/a&gt;. I guess I am. When you commit to project teams, and leave people where they are, so they can learn the product and learn how to work with their teams, and let the work flow through the teams, you create an environment that allows for autonomy, mastery, and purpose. And, that&amp;#8217;s part of what a great manager does.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=Lubt-6Swzjk:WZnEDxOK_GM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=Lubt-6Swzjk:WZnEDxOK_GM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=Lubt-6Swzjk:WZnEDxOK_GM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=Lubt-6Swzjk:WZnEDxOK_GM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=Lubt-6Swzjk:WZnEDxOK_GM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=Lubt-6Swzjk:WZnEDxOK_GM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=Lubt-6Swzjk:WZnEDxOK_GM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=Lubt-6Swzjk:WZnEDxOK_GM:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ManagingProductDevelopment/~4/Lubt-6Swzjk" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 18 Jun 2013 08:36:00 CDT</pubDate>
      <guid isPermaLink="true">http://www.jrothman.com/blog/mpd/?p=12333</guid>
      <dc:creator>Johanna Rothman</dc:creator>
    </item>
    <item>
      <title>Type-Safe Web with Kotlin</title>
      <link>http://uberconf.com/blog/andrey_breslav/2013/06/type_safe_web_with_kotlin</link>
      <description>&lt;p&gt;&lt;a href="http://blog.jetbrains.com/kotlin/files/2013/06/web1.png"&gt;&lt;img class="alignleft size-medium wp-image-1096" src="http://blog.jetbrains.com/kotlin/files/2013/06/web1-300x225.png" alt="" width="300" height="225" /&gt;&lt;/a&gt;We &lt;a href="http://blog.jetbrains.com/kotlin/2013/01/an-interview-with-andy-selvig-author-of-kara-web-framework/"&gt;told you&lt;/a&gt; about &lt;a href="http://karaframework.com/"&gt;Kara Web Framework&lt;/a&gt; a while ago. It is written in Kotlin and relies on type-safe builders. It doesn&amp;#8217;t have to be the only web framework for Kotlin, but the general principles seem good, so I wrote an article about these principles: &lt;strong&gt;&lt;a href="http://jaxenter.com/type-safe-web-with-kotlin-47395.html"&gt;Type-Safe Web with Kotlin&lt;/a&gt;&lt;/strong&gt;, it gives an overview of the framework design, and then gives many details about builders, extensions and so on.&lt;span id="more-1091"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt; used in this article are available at &lt;a href="https://github.com/abreslav/kara-files/blob/master/src/tutorial.kt"&gt;https://github.com/abreslav/kara-files/blob/master/src/tutorial.kt&lt;/a&gt; and &lt;a href="https://github.com/abreslav/kara-files/blob/master/src/small_builder.kt"&gt;https://github.com/abreslav/kara-files/blob/master/src/small_builder.kt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Slides&lt;/strong&gt; from my talk given at JPoint in Saint Petersburg are also available &lt;a href="https://prezi.com/hndtabwcfy5h/type-safe-web-with-kotlin-jpoint/"&gt;online&lt;/a&gt;.&lt;br /&gt;
The talk was given in Russian, video accessible is &lt;a href="http://javapoint.ru/talks/12/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/kotlin/~4/KVnLELob02o" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 17 Jun 2013 09:13:00 CDT</pubDate>
      <guid isPermaLink="true">http://blog.jetbrains.com/kotlin/?p=1091</guid>
      <dc:creator>Andrey Breslav</dc:creator>
    </item>
    <item>
      <title>It’s Déjà vu All Over Again</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/06/it_s_d_j_vu_all_over_again</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;p&gt;Several years ago I tried to discuss the need for Lean when Scrum was being used on projects with more than one team.  Ken Schwaber didn’t want to hear this and eventually threw me off the Scrum Development Yahoo discussions group.  I admit, I was talking outside the domain of what he wanted – the pretense was that Scrum wasn’t Lean and the Scrum Development group wasn’t the place to talk about Lean.&lt;/p&gt;
&lt;p&gt;Times have changes – &lt;em&gt;a little.&lt;/em&gt;  We now hear how Scrum &lt;em&gt;is&lt;/em&gt; based on Lean but I have heard little acknowledgement that Lean-thinking, used explicitly, is an essential ingredient for Scrum teams.  At the Scrum gathering I heard of a successful Scrum implementation of a company that had 150-200 folks in it.  I can validate that myself.  Because I had been in there myself, &lt;em&gt;before they were successful with Scrum across the enterprise.&lt;/em&gt;  True, it didn’t take much to get them from successful &lt;em&gt;team&lt;/em&gt; Scrum to successful &lt;em&gt;enterprise&lt;/em&gt; Scrum, but it did take Lean-thinking, value stream mapping and an understanding of Lean-flow to get them there.  While Scrum is a great team process I still contend it is rarely successful at scale because the framework itself does not provide the insights needed to extend it.  If that’s the case, part of the Scrum discussion should be about &lt;em&gt;what is needed to include in the framework.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For the last few years I have been promoting Kanban, both team-Kanban and the Kanban Method, a transition management method across the entire value stream.  Team-Kanban is best used within a full-value stream view as well, but it doesn’t require the Kanban-Method’s approach.   It is unfortunate that the term Kanban has been so overloaded (see &lt;a href="http://www.netobjectives.com/files/resources/articles/Demystifying-Kanban.pdf"&gt;De-Mystifying Kanban&lt;/a&gt; for a description of all the types of Kanban).   &lt;/p&gt;
&lt;p&gt;Net Objectives is not attached to any one method.  I believe we are the only company that promotes Scrum, XP, Team-Kanban, Kanban Method, SAFe, and Lean, along with technical practices.    Our approach is to see where people are, what their culture is, how much discipline they need, the extent they can form teams, amongst other things.  If you missed our webinar, &lt;a href="http://www.netobjectives.com/business-and-agile-webinar-series"&gt;Beginning an Agile Transformation&lt;/a&gt;, you might want to watch it for a full list of what to look for.&lt;/p&gt;
&lt;p&gt;Our experience enables us to cull the best approach from all of these methods to suit our clients’ needs. Sorry, I’m not trying to make this a sales pitch, anyone can take this approach.  Unfortunately, relatively few consultants do.  I’ll admit I'm writing this blog for practitioners and my advice is &lt;em&gt;don’t decide between methods, learn from each of them&lt;/em&gt;.  In other words, it’s not Scrum Vs Kanban, it’s how do we take the best approach for the needs at hand. This requires understanding the strengths and limitations, particularly where they best apply, of both.&lt;/p&gt;
&lt;p&gt;Since the Lean-Kanban community has been forefront in bringing new methods to the Agile space, I had thought it would behave a bit different from my experience in the Scrum community. Unfortunately, apparently not.  Because Net Objectives uses both Scrum and the Kanban Method, we’ve learned a lot from both.  While the Kanban Method facilitates the creation of effective value streams when true teams can’t be created we’ve seen that teams are truly valuable (see &lt;a href="http://www.netobjectives.com/blogs/day-19-100-know-power-teams"&gt;Know the Power of Teams&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;I started discussing the value of teams on the Kanban Development board and essentially ran into the same attitude as I had years ago.  First it was – “teams are orthogonal to the method.”  Then it was “let’s not discuss this.”  Then it was “you (meaning me) are not behaving professionally.”  This time I left before getting moderated or thrown off.  But it’s a bit distressing to see the same attitude – &lt;em&gt;“our method is correct, let’s not discuss things that aren’t defined in it.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Tragic.&lt;/p&gt;
&lt;p&gt;Practitioners – please don’t fall into this trap.  There are many consultants out there not attached to any one method.  Because of this, they often don’t have an accreditation from either the Scrum Alliance or the Lean-Kanban University.  Don’t take that as a negative – it might be a plus.&lt;/p&gt;
&lt;p&gt;Al Shalloway&lt;br /&gt;CEO, Net Objectives&lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/ACmODaTVHz8" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 13 Jun 2013 21:22:00 CDT</pubDate>
      <guid isPermaLink="true">1106 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>Slides from Exploding Management Myths Posted</title>
      <link>http://uberconf.com/blog/johanna_rothman/2013/06/slides_from_exploding_management_myths_posted</link>
      <description>&lt;p&gt;I gave a talk last week at Better Software/Agile Development, called &lt;a href="http://www.slideshare.net/johannarothman/exploding-managementmyths" target="_blank"&gt;Exploding Management Myths&lt;/a&gt;. This is my first talk based on some of my management myths. Yes, the ones I&amp;#8217;ve been writing for the last 18 months. Yes, I have more in me :-)&lt;/p&gt;
&lt;p&gt;I have posted the slides and the audio from my talk at &lt;a href="http://www.slideshare.net/johannarothman/exploding-managementmyths" target="_blank"&gt;slideshare&lt;/a&gt;. I still cannot understand how to properly sync the slides and audio at slideshare. I don&amp;#8217;t talk evenly, which is what slideshare expects. I tried to separate the slides and audio. Can&amp;#8217;t do that either. Grumble, grumble. However, it&amp;#8217;s posted, and if you download the slides and then listen to the audio, you can manually sync the slides and the audio :-)&lt;/p&gt;
&lt;p&gt;If you have a favorite myth that I have not yet addressed, please let me know. I will write about it.&lt;/p&gt;
&lt;p&gt;I really need help from you. I need a title for the eventual book. Everyone talks about debunking myths, so I don&amp;#8217;t think I want to go with debunking. I thought it might be &amp;#8220;Exploding Management Myths.&amp;#8221; Maybe. Doc List suggested it might be &amp;#8220;Blowing Up the Bullshit.&amp;#8221; Maybe :-) Do you have ideas for the eventual title for this management book? I would like at least a few more options.&lt;/p&gt;
&lt;p&gt;See the management myths on &lt;a href="http://www.stickyminds.com/s.asp?F=S17973_ART_2" target="_blank"&gt;Stickyminds&lt;/a&gt; here, and on my &lt;a href="http://www.jrothman.com/2012/01/management-myth-1-the-myth-of-100-utilization/" target="_blank"&gt;site&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=GxHqrtldunY:Fr2Cq6gZUYU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=GxHqrtldunY:Fr2Cq6gZUYU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=GxHqrtldunY:Fr2Cq6gZUYU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=GxHqrtldunY:Fr2Cq6gZUYU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=GxHqrtldunY:Fr2Cq6gZUYU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=GxHqrtldunY:Fr2Cq6gZUYU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=GxHqrtldunY:Fr2Cq6gZUYU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=GxHqrtldunY:Fr2Cq6gZUYU:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ManagingProductDevelopment/~4/GxHqrtldunY" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 10 Jun 2013 07:24:00 CDT</pubDate>
      <guid isPermaLink="true">http://www.jrothman.com/blog/mpd/?p=12327</guid>
      <dc:creator>Johanna Rothman</dc:creator>
    </item>
    <item>
      <title>Talk @ GeekOUT Tallinn: Language Design Trade-Offs (Kotlin and Beyond)</title>
      <link>http://uberconf.com/blog/andrey_breslav/2013/06/talk__geekout_tallinn_language_design_trade_offs_kotlin_and_beyond_</link>
      <description>&lt;p&gt;This week I&amp;#8217;m speaking at &lt;a href="http://geekout.ee/"&gt;GeekOUT Tallin&lt;/a&gt;, and my colleagues Mikhail Vink and Sergey Karashevich are holding a 15-minute DEMO on Thursday, telling you about cool stuff in JetBrains&amp;#8217; IDEs.&lt;/p&gt;
&lt;p&gt;The topic of my talk is &amp;#8220;&lt;strong&gt;Language Design Trade-Offs (Kotlin and Beyond)&lt;/strong&gt;&amp;#8220;, so one can summarize it as &amp;#8220;why designing languages is SO interesting&amp;#8221;.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;img class="aligncenter" src="http://www.b-lay.com/wp-content/uploads/2013/01/finding_balance_news_625x430.jpg" alt="" width="350" /&gt; &lt;span id="more-1080"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;strong&gt;Abstract&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;If your programming language is small, you’re probably born before 1950, and your first computer was bigger than your present apartment. And even those languages are not so small. One spends quite some time to master a programming language. Why?&lt;/p&gt;
&lt;p&gt;Because there are very many decisions “compressed” into the form of a language. Nothing limits a programmer’s imagination like a compiler, and nothing limits a language design like a real world with all of its “legacy”, compatibility concerns, performance limitations, generations-old habits and leaky abstractions.&lt;/p&gt;
&lt;p&gt;This talk is about tradeoffs: why we, as language designers, do (or rather did) this and not that.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;See you on Friday, 14 June 2013 11:30 @ Room 2&lt;/p&gt;
&lt;p&gt;&lt;a href="30 @ Room 2"&gt;http://geekout.ee/schedule/andrey-breslav-jetbrains-building-jvm-languages/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;UPD:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/abreslav/trade-offs-22989326"&gt;Slides for this talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://confluence.jetbrains.com/display/Kotlin/Talks+and+Publications"&gt;More slides and videos about Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/kotlin/~4/DUPNOxyK1Ww" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 10 Jun 2013 06:27:00 CDT</pubDate>
      <guid isPermaLink="true">http://blog.jetbrains.com/kotlin/?p=1080</guid>
      <dc:creator>Andrey Breslav</dc:creator>
    </item>
    <item>
      <title>In Defense of Kanban</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/06/in_defense_of_kanban</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;p&gt;As many folks know, Net Objectives does both Scrum and Kanban. Admittedly, our Scrum is very much like Scrumban (or Scrum done under the context of Lean) but it is still an implementation of Scrum.  Scrum, as it normally manifests itself, has several challenges in that it requires teams to learn too much about how to apply it (much is know that hasn't been incorporated into it) and many teams try it when it really isn't the best framework for their situation. &lt;/p&gt;
&lt;p&gt;Challenges such as an inability to form true teams, close the gap between coding and testing and the resulting unfinished stories at the end of sprints has many teams abandon the true Scrum practices of cross-functional teams that are truly time-boxed.  Some in the Scrum community have called this Scrum-but, a demeaning term which I've always disliked for two reasons.  First, it is disrespectful, and second, it hides the fact that most of poorly practiced Scrum is a result of Scrum the lack of most of the Scrum thought leaders not stressing the Lean principles on which Scrum is based and why it works.&lt;/p&gt;
&lt;p&gt;The new vogue now is for Scrum teams to drop time-boxing and cross-functional teams and say they are doing Kanban.  I suppose the logic is that Kanban doesn't have these.  While true, Kanban is not defined by not having iterations or not needing cross-functional teams.  It is defined by visibility, managing flow, explicit policies, a white-box process, and continuous improvement with PDCA.  Let me be clear - &lt;em&gt;if you have been doing Scrum and have stopped time-boxing and don't have devs and testers working together &lt;strong&gt;you are not doing Kanban.  You are not even doing a shallow version of Kanban. You are not really doing any well-defined Agile method/framework.  &lt;/strong&gt;&lt;/em&gt;END OF STORY. (but not the end of the blog).&lt;/p&gt;
&lt;p&gt;This actually reminds me of a company I contracted with over a decade ago. They claimed they did XP, but when I asked them how they did XP, they defined it in terms of what they didn't do: we don't document, we don't do major designs up front, we don't ...  Unfortunately, they also didn't pair program, write tests up-front, do continuous integration - bottom line, they did not do XP.  Methods are not defined by what you don't do alone.  They are defined by what you &lt;em&gt;do&lt;/em&gt; and what you &lt;em&gt;don't do&lt;/em&gt;.&lt;em&gt; &lt;/em&gt;In most cases, when a method/framework doesn't do something, there is something else it does to achieve the intent of what other methods may have practices for. For example, Kanban's explicit policies and managing WIP accomplishes what cross-functional teams and time-boxing purports to do.&lt;/p&gt;
&lt;p&gt;What's unfortunate, however, is that many folks don't understand this.  This belief, along with, oddly enough, the belief that you should start with Scrum and then move to Kanban, is widely promoted by folks who have never done Kanban but make their living with Scrum. It's not unlike Chevy dealers telling prospective customers what's wrong with Fords.  My advice is that when deciding between the two, actually, not a good move, in that you should learn from both.  So, perhaps I'll say "when learning about the two"  learn from someone who has done both, someone who can tell you what the advantages and disadvantages are.  There are lots of these folks around, btw, so I am not saying you should pick us (although that'd be a good thing, I assure you).&lt;/p&gt;
&lt;p&gt;Al Shalloway&lt;br /&gt;CEO, Net Objectives&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/NfEzb44eq7w" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 08 Jun 2013 21:03:00 CDT</pubDate>
      <guid isPermaLink="true">1103 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>The Differences Between Lean Manufacturing and Lean Software Development</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/06/the_differences_between_lean_manufacturing_and_lean_software_development</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;p&gt;Since lean comes from manufacturing, many question its validity for software developers. Our own experience is that Lean in software is very important.  This blog covers three areas:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;The essential paradigm shift of lean and why it applies even more to software&lt;/li&gt;
&lt;li&gt;How the physical world is different from the software world during implementation&lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;The Essential Lean Paradigm Shift.&lt;/h2&gt;
&lt;p&gt;Lean builds on top of Deming’s systems thinking and management style.  Taichii Ohno, the creator of Lean, says he added two concepts to Deming’s work: a focus on “just-in-time” and “autonomation”. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Just-In-Time&lt;/strong&gt; basically means, do work just in time for the following step.  In software it means don’t do the requirements too far before you are ready to design.  Don’t do the design too far before you are ready to code.  Don’t code until you are almost ready to test.   Agile manifests this by having small batches or even, as in XP, doing these different tasks seemingly simultaneously.    The essential shift here is to take our focus off of productivity and people or machines and put it towards time and the workflow.  In other words, instead of attempting to have each stage of the work (or each person) be as productive as possible, we focus on eliminating the delays between the steps.  Just-in-time can be implemented by having small batches of work and coordinating the flow via pull.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Autonomation &lt;/strong&gt;means automation with a human touch.  Essentially, things should flow until there is an error and then a person needs to step in, see what happened, and improve the system.&lt;/p&gt;
&lt;p&gt;Both of these concepts apply to software development, even more so than in the physical world.  The reason is that when one doesn’t do “just-in-time” work piles up and delays occur between work stages.  This increases the amount of work to be done even when errors (e.g., bugs) don’t occur.  When errors do occur, these delays dramatically causes extra work.  Consider the time it takes to fix a bug when it is detected immediately.  Detect it just a couple of weeks later, and even if it hasn’t escaped from the development team it will take many more hours to fix than when caught early.  In other words, just-in-time in software saves more than it does in building physical world products.&lt;/p&gt;
&lt;h2&gt;How the physical world is different from the software world during implementation,&lt;/h2&gt;
&lt;p&gt;A Lean mantra is “eliminate waste.” In the physical world, one can see waste in many forms:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Materials left over on the shop floor&lt;/li&gt;
&lt;li&gt;Inventory on-hand that isn’t needed yet&lt;/li&gt;
&lt;li&gt;Improperly made items that are hanging around, waiting to be fixed&lt;/li&gt;
&lt;li&gt;The amount of work that is taking place&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Unfortunately, in the software world, &lt;em&gt;none&lt;/em&gt; of these are visible, at least not directly. The mantra – “eliminate waste” is a sound good mantra that provides little guidance.  However, these wastes can be made visible by focusing on tracking delays in the workflow. Virtually all wastes in software development come from one of the following types of delays:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Delay from getting information until using it (e.g., old requirements)&lt;/li&gt;
&lt;li&gt;Delay from making an error until detecting it (e.g., long time between code and test)&lt;/li&gt;
&lt;li&gt;detecting an error until fixing it (actually a variant of #1)&lt;/li&gt;
&lt;li&gt;waiting on someone for information&lt;/li&gt;
&lt;li&gt;waiting on the next person to hand the work off to&lt;/li&gt;
&lt;li&gt;workflow interruption due to something else receiving our attention&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The salient characteristic of delay is that it can be made easily visible by noting the relationship between queue size and delay.  If we create a workflow board (Kanban board) that explicitly describes our work, then we can see delays in our workflow by having queue sizes being larger than they should be.  Hence, while the mantra “eliminate waste” makes sense in the physical world, in the software development world it should be “eliminate delays.”&lt;/p&gt;
&lt;p&gt;For a seven minute expose on how delays cause a lot of extra work, watch: &lt;a href="http://www.youtube.com/watch?v=5S97z0taHB8&amp;amp;feature=player_embedded"&gt;How Delays Cause Waste, A Main Tenet of Lean&lt;/a&gt; one of our &lt;a href="http://www.netobjectives.com/resources/lightning-webinars"&gt;Lightning Webinars&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;While Lean springs from manufacturing, the insights that were so relevant there are even more critical in software.  The main lessons are:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;We must eliminate delays in our workflow&lt;/li&gt;
&lt;li&gt;Work in software development is not visible, but delays, which can be seen via queues, are&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Al Shalloway&lt;br /&gt;CEO, Net Objectives&lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/LCbNY4CFBVE" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 08 Jun 2013 17:18:00 CDT</pubDate>
      <guid isPermaLink="true">1102 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>Installing PostgreSQL 9.0 on Mac OS X 10.6.8 via MacPorts</title>
      <link>http://uberconf.com/blog/bruce_snyder/2013/06/installing_postgresql_9_0_on_mac_os_x_10_6_8_via_macports</link>
      <description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-xiBNHcpxjWE/TndsywouDGI/AAAAAAAAAoY/X3SPSn0bhcE/s1600/postgresql_logo-555px.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 175px;" src="http://3.bp.blogspot.com/-xiBNHcpxjWE/TndsywouDGI/AAAAAAAAAoY/X3SPSn0bhcE/s320/postgresql_logo-555px.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5654107476491897954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;While installing PostgreSQL 9.0 on Mac OS X again, I had to figure out all these steps yet again. So I'm documenting this process for my own sake because I have been through this now twice on two computers recently, having to hunt down all of these commands each time. I'm hopeful that this will help others as well. &lt;br /&gt;&lt;br /&gt;Use the MacPorts command &lt;code&gt;port&lt;/code&gt; to install PostgreSQL 9.0, then create and own a data directory and a logs directory: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ sudo port install postgresql90-server&lt;br /&gt;$ sudo mkdir -p /opt/local/var/db/postgresql90/defaultdb&lt;br /&gt;$ sudo chown -R postgres:postgres /opt/local/var/db/postgresql90&lt;br /&gt;$ sudo mkdir -p /opt/local/var/log/postgresql90&lt;br /&gt;$ sudo chown -R postgres:postgres /opt/local/var/log/postgresql90&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now you need to initialize the database using the data directory that was created above: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ sudo -u postgres /opt/local/lib/postgresql90/bin/initdb -D /opt/local/var/db/postgresql90/defaultdb&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I prefer to change the postgres user's shell to bash: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ sudo dscl . -create /Users/postgres UserShell /bin/bash&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;View the postgres user account just to make sure it all looks OK: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ dscl . -read /Users/postgres&lt;br /&gt;AppleMetaNodeLocation: /Local/Default&lt;br /&gt;GeneratedUID: 5B38F583-CBBF-4082-A32D-C17947394A27&lt;br /&gt;NFSHomeDirectory: /opt/local/var/db/postgresql90&lt;br /&gt;Password: *&lt;br /&gt;PrimaryGroupID: 501&lt;br /&gt;RealName:&lt;br /&gt; PostgreSQL-90 Server&lt;br /&gt;RecordName: postgres&lt;br /&gt;RecordType: dsRecTypeStandard:Users&lt;br /&gt;UniqueID: 502&lt;br /&gt;UserShell: /bin/bash&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Also check the postgres group: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ dscl . -read /Groups/postgres&lt;br /&gt;AppleMetaNodeLocation: /Local/Default&lt;br /&gt;GeneratedUID: 715FEB22-D0F1-443F-BC93-55896210DB44&lt;br /&gt;Password: *&lt;br /&gt;PrimaryGroupID: 501&lt;br /&gt;RealName: postgres&lt;br /&gt;RecordName: postgres&lt;br /&gt;RecordType: dsRecTypeStandard:Groups&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now edit the &lt;code&gt;pg_hba.conf&lt;/code&gt; file to add the appropriate permissions: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;# "local" is for Unix domain socket connections only&lt;br /&gt;local   all             all                                     trust&lt;br /&gt;# IPv4 local connections:&lt;br /&gt;host    all             all             127.0.0.1/32            trust&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This should allow you to connect easily using the &lt;code&gt;psql&lt;/code&gt; utility. &lt;br /&gt;&lt;br /&gt;I prefer to use the &lt;code&gt;pg_ctl&lt;/code&gt; command to start and stop PostgreSQL. This is simply because I learned PostgreSQL on Linux and that's all there was. To prevent having to retype the full command every time I want to start or stop the database, create a start script and a stop script in the postgres user's home directory named &lt;code&gt;pg_start&lt;/code&gt; and &lt;code&gt;pg_stop&lt;/code&gt;. Below are the contents of the &lt;code&gt;pg_start&lt;/code&gt; file. Make sure to create these files  as the postgres user in the home directory: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ sudo su - postgres &lt;br /&gt;$ vim ./pg_start &lt;br /&gt;#!/bin/sh &lt;br /&gt;/opt/local/lib/postgresql90/bin/pg_ctl -D /opt/local/var/db/postgresql90/defaultdb -l /opt/local/var/log/postgresql90/postgres.log start &amp;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Below are the contents of the &lt;code&gt;pg_stop&lt;/code&gt; file: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ vim ./pg_stop &lt;br /&gt;#!/bin/sh &lt;br /&gt;/opt/local/lib/postgresql90/bin/pg_ctl -D /opt/local/var/db/postgresql90/defaultdb -l /opt/local/var/log/postgresql90/postgres.log stop&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Don't forget to make them executable: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ chmod +x ./pg_start &lt;br /&gt;$ chmod +x ./pg_stop&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;(There is a Mac OS X way of starting PostgreSQL using &lt;code&gt;launchctl&lt;/code&gt; but I don't tend to use that because I'm used to the standard &lt;code&gt;pg_ctl&lt;/code&gt; command.)&lt;br /&gt;&lt;br /&gt;Now use the &lt;code&gt;pg_start&lt;/code&gt; script to start up PostgreSQL. Execute it as the postgres user (&lt;code&gt;sudo su - postgres&lt;/code&gt;) I tend to cat the log file just to make sure it's running correctly: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ ./pg_start &lt;br /&gt;$ server starting&lt;br /&gt;&lt;br /&gt;$ cat ../../log/postgresql90/postgres.log &lt;br /&gt;LOG:  database system is ready to accept connections&lt;br /&gt;LOG:  autovacuum launcher started&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Looks good so we'll create my user: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ /opt/local/lib/postgresql90/bin/createuser bsnyder&lt;br /&gt;Shall the new role be a superuser? (y/n) y&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Because I made my user a superuser, I can create my own db schema, so log out of the postgres user account and back to my own account first: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ exit&lt;br /&gt;$ /opt/local/lib/postgresql90/bin/createdb&lt;br /&gt;CREATE DATABASE&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;code&gt;createdb&lt;/code&gt; command automatically uses my username as the schema name. &lt;br /&gt;&lt;br /&gt;The only thing left to do before starting up the database is edit your &lt;code&gt;~/.profile&lt;/code&gt; or &lt;code&gt;~/.bash_profile&lt;/code&gt; to put the path to the PosgreSQL bin directory into the PATH: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;export PATH=/opt/local/lib/postgresql90/bin:$PATH&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now just log into the PostgreSQL server using &lt;code&gt;psql&lt;/code&gt; to make sure we're ready to roll: &lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;$ psql&lt;br /&gt;-bash: psql: command not found&lt;br /&gt;bsnyder@skunk [darwin](DARWIN-1527) $ /opt/local/lib/postgresql90/bin/psql &lt;br /&gt;psql (9.0.4)&lt;br /&gt;Type "help" for help.&lt;br /&gt;&lt;br /&gt;bsnyder=# select version();&lt;br /&gt;                                                                 version                                                                  &lt;br /&gt;------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt; PostgreSQL 9.0.4 on x86_64-apple-darwin10.8.0, compiled by GCC i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664), 64-bit&lt;br /&gt;(1 row)&lt;br /&gt;&lt;br /&gt;bsnyder=#&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And we're good to go!  &lt;p&gt;&lt;b&gt;UPDATE: &lt;/b&gt; For those who want a nice seamless experience stopping/starting Postgres via a Mac OS X preference pane, check out &lt;a href="https://github.com/jwang/pgpane"&gt;John Wang's PGPane&lt;/a&gt;.  &lt;/p&gt;</description>
      <pubDate>Fri, 07 Jun 2013 12:13:00 CDT</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-9088482399688345277.post-9201245674781682753</guid>
      <dc:creator>Bruce Snyder</dc:creator>
    </item>
    <item>
      <title>Remove/Reinstall of MacPorts</title>
      <link>http://uberconf.com/blog/bruce_snyder/2013/06/remove_reinstall_of_macports</link>
      <description>&lt;a href="http://upload.wikimedia.org/wikipedia/commons/b/be/Macports-logo.png" imageanchor="1" &gt;&lt;img border="0" src="http://upload.wikimedia.org/wikipedia/commons/b/be/Macports-logo.png" /&gt;&lt;/a&gt; &lt;p&gt;After trying to upgrade Mercurial to the latest version via MacPorts, I ran into some compilation issues with a couple dependencies that I could not resolve at all. After realizing that there were dependency resolution issues amongst different versions of dependencies for different ports, I decided to remove and reinstall MacPorts from scratch. This provided a clean slate and everything worked without a problem, though I was annoyed that I had to take this drastic action and spend the time to get MacPorts working again.  &lt;/p&gt; &lt;p&gt;&lt;h3&gt;Bash Completion For Git&lt;/h3&gt;One thing that I ran into was another change to the bash completion and prompt for git. As I mentioned in a &lt;a href="http://bsnyderblog.blogspot.com/2013/04/after-upgrading-macports-recently-i.html"&gt;previous post&lt;/a&gt; about this topic, the location of the location for the &lt;tt&gt;git-prompt.sh&lt;/tt&gt; file had changed but this time I discovered that I had to source both the &lt;tt&gt;git-completion.bash&lt;/tt&gt; file and the &lt;tt&gt;git-prompt.sh&lt;/tt&gt; file to get things working. Below is what worked for me.   &lt;pre class="brush: xml"&gt;&lt;br /&gt;if [ -f /opt/local/share/git-core/contrib/completion/git-completion.bash ]; then&lt;br /&gt;  . /opt/local/share/git-core/contrib/completion/git-completion.bash&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ -f /opt/local/share/git-core/contrib/completion/git-prompt.sh ]; then&lt;br /&gt;  . /opt/local/share/git-core/contrib/completion/git-prompt.sh&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt; &lt;p&gt;&lt;h3&gt;Bash Version 4.x&lt;/h3&gt;As I was reinstalling ports I noticed some logging that flew by in the terminal stating something about a requirement to use Bash 4 for the bash completion functionality to work properly. So I decided to utilize the newer version of Bash installed by MacPorts and here's how:   &lt;ol&gt;&lt;li&gt;Add the path to the new bash (&lt;tt&gt;/opt/local/bin/bash&lt;/tt&gt;) to &lt;tt&gt;/etc/shells&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;Use the &lt;tt&gt;chsh&lt;/tt&gt; utility to change the shell to the new bash: &lt;tt&gt;chsh -s /opt/local/bin/bash&lt;/tt&gt;&lt;li&gt;After closing the terminal and opening a new one, check the bash version using either of these methods:  &lt;pre class="brush: xml"&gt;&lt;br /&gt;$ echo $BASH_VERSION&lt;br /&gt;4.2.42(2)-release&lt;br /&gt;&lt;/pre&gt;&lt;/ol&gt;As long as the version displayed is the newer version from MacPorts, you should be ready to go.  &lt;/p&gt; &lt;p&gt;Just for my own sake and in case I need it in the future, I'm going to list a number of items that I had to reinstall:   &lt;pre class="brush: xml"&gt;&lt;br /&gt;$ sudo port install git-core +bash_completion +doc +svn&lt;br /&gt;$ sudo port install tig &lt;br /&gt;$ sudo port install mercurial +bash_completion&lt;br /&gt;$ sudo port install gnupg curl wget ncftp tree pstree watch screen proctools mtr cowsay&lt;br /&gt;$ sudo port install postgresql90-server&lt;br /&gt;&lt;/pre&gt; For more info about installing and configuring PostgreSQL, see my post titled &lt;a href="http://bsnyderblog.blogspot.com/2011/09/installing-postgresql-90-on-mac-os-x.html"&gt;Installing PostgreSQL 9.0 on Mac OS X 10.6.8 via MacPorts&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 07 Jun 2013 12:12:45 CDT</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-9088482399688345277.post-77365004289894376</guid>
      <dc:creator>Bruce Snyder</dc:creator>
    </item>
    <item>
      <title>MacPorts Upgrade Changes Bash Completion</title>
      <link>http://uberconf.com/blog/bruce_snyder/2013/06/macports_upgrade_changes_bash_completion</link>
      <description>&lt;a href="http://2.bp.blogspot.com/-UB-bnHVIx9A/UVsryvcIQoI/AAAAAAAABQ8/FSze41ZyHXI/s1600/Macports-logo.png" imageanchor="1" &gt;&lt;img border="0" src="http://2.bp.blogspot.com/-UB-bnHVIx9A/UVsryvcIQoI/AAAAAAAABQ8/FSze41ZyHXI/s320/Macports-logo.png" width="200"/&gt;&lt;/a&gt; After upgrading Macports recently to version xxx, I started seeing the following error in the terminal when the &lt;tt&gt;.bash_profile&lt;/tt&gt; is loaded:   &lt;pre&gt;__git_ps1: command not found&lt;/pre&gt; Upon investigation, I discovered that the bash completion for git has been split into more than one file. Previously, all that was needed in the &lt;tt&gt;.bash_profile&lt;/tt&gt; was to source the single file for git like so:   &lt;pre class="brush: xml"&gt;&lt;br /&gt;if [ -f /opt/local/etc/bash_completion ]; then&lt;br /&gt;  . /opt/local/etc/bash_completion&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt; Since the update to Macports, now I also need to source the second file like so:   &lt;pre class="brush: xml"&gt;&lt;br /&gt;if [ -f /opt/local/share/git-core/contrib/completion/git-prompt.sh ]; then&lt;br /&gt;  . /opt/local/share/git-core/contrib/completion/git-prompt.sh&lt;br /&gt;fi&lt;br /&gt;&lt;/pre&gt; After closing/creating the terminal tab, the error is gone.</description>
      <pubDate>Fri, 07 Jun 2013 11:06:00 CDT</pubDate>
      <guid isPermaLink="true">tag:blogger.com,1999:blog-9088482399688345277.post-6439663983307211054</guid>
      <dc:creator>Bruce Snyder</dc:creator>
    </item>
    <item>
      <title>Forget Search, Lets Talk Discovery — A Recap of Enterprise Search Summit</title>
      <link>http://uberconf.com/blog/eric_pugh/2013/06/forget_search_lets_talk_discovery__a_recap_of_enterprise_search_summit</link>
      <description>The middle of May saw me road tripping to not just one, but two Enterprise Search Summits to tell some war stories in doing search at scale. I attended my first ESS back in New York in 2010, and I was curious to see how the conversation had changed in the intervening three years. Would [...]</description>
      <pubDate>Thu, 06 Jun 2013 11:01:00 CDT</pubDate>
      <guid isPermaLink="true">http://www.opensourceconnections.com/?p=3612</guid>
      <dc:creator>Eric Pugh</dc:creator>
    </item>
    <item>
      <title>Kotlin M5.3: IntelliJ IDEA 13, Delegated Properties and more</title>
      <link>http://uberconf.com/blog/andrey_breslav/2013/06/kotlin_m5_3_intellij_idea_13_delegated_properties_and_more</link>
      <description>&lt;p&gt;Kotlin M5.3 brings support for IntelliJ IDEA 13 and some new features for you to check out. We are moving towards powerful runtime support, including reflection and other framework-enabling features. This milestone marks our first steps in that direction.  &lt;span id="more-1060"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;IntelliJ IDEA 12.1 and 13&lt;/h2&gt;
&lt;p&gt;First early access versions of &lt;a href="http://blogs.jetbrains.com/idea/2013/05/intellij-idea-13-early-preview-is-out/"&gt;IntelliJ IDEA 13&lt;/a&gt; are coming out, and we ship a Kotlin plugin compatible with these versions. Remember it&amp;#8217;s an EAP, use it at your own risk. Of course, good old &lt;a href="http://www.jetbrains.com/idea/download/"&gt;IntelliJ IDEA 12.1&lt;/a&gt; is supported as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Some news about Kotlin support in &lt;a href="http://developer.android.com/sdk/installing/studio.html"&gt;Android Studio&lt;/a&gt; are coming soon.&lt;/p&gt;
&lt;h2&gt;Many Improvements&lt;/h2&gt;
&lt;p&gt;As usual M5.3 brings many improvements both in the compiler and the IDE. In the compiler we are still mostly concerned with performance, which is gradually improving. The IDE gets new quick fixes and refactorings, some of which are described below. You can now navigate to properties overriding the one you are looking at (see icons in the left gutter). The editor recognizes the syntax of &lt;a href="http://confluence.jetbrains.com/display/Kotlin/Kotlin+Doc"&gt;KDoc&lt;/a&gt; (thanks to &lt;a href="https://github.com/JetBrains/kotlin/pull/280"&gt;this pull request&lt;/a&gt;)&amp;#8230; But first, let&amp;#8217;s talk about cool new language features, some long awaited, some unexpected (maybe).&lt;/p&gt;
&lt;h2&gt;New Language Feature: Delegated Properties&lt;/h2&gt;
&lt;p&gt;We often get feature requests like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support lazy properties: the value gets computed only upon first access.&lt;/li&gt;
&lt;li&gt;Support observable properties: listeners get notified about changes to this property.&lt;/li&gt;
&lt;li&gt;Support storing properties in a map, not in separate field each.&lt;/li&gt;
&lt;li&gt;Support &amp;lt;my favorite kind of property semantics&amp;gt;&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One way of addressing these requests would be to say that life is tough and users have to suffer. Another way would be to support different kinds of properties on the language level. We do not like either of these approaches: too many unhappy users on the one hand, too many ad hoc features on the other hand. So, we take a third approach: support a unified mechanism that covers all these requests (and probably more), so that particular kinds of properties can be implemented in libraries, without altering the language.&lt;/p&gt;
&lt;p&gt;Meet &lt;strong&gt;delegated properties&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;class Example {
  var p: String by Delegate()
}&lt;/pre&gt;
&lt;p&gt;There&amp;#8217;s some new syntax: you can say &amp;#8220;val &amp;lt;property name&amp;gt;: &amp;lt;Type&amp;gt; by &amp;lt;expression&amp;gt;&amp;#8221;. The expression after &lt;strong&gt;by&lt;/strong&gt; is the &lt;em&gt;delegate&lt;/em&gt;, because get() and set() methods corresponding to the property will be delegated to it.  Property delegates don&amp;#8217;t have to implement any interface, but they have to provide methods named get() and set() to be called. For example:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #222222;font-family: 'Courier 10 Pitch', Courier, monospace;line-height: 21px"&gt;class Delegate() {&lt;/span&gt;
  fun get(thisRef: Any?, prop: PropertyMetadata): String {
    return "$thisRef, thank you for delegating '${prop.name}' to me!"
  }

  fun set(&lt;span style="color: #222222;font-family: 'Courier 10 Pitch', Courier, monospace;line-height: 21px"&gt;thisRef: Any?, prop: PropertyMetadata, value: String) {
    println("$value has been assigned")
&lt;/span&gt;  }
}&lt;/pre&gt;
&lt;p&gt;When we read from p, the get() function from Delegate is called, so that its first parameter is the object we read p from and the second parameter holds a description of p itself (e.g. you can take its name). For example:&lt;/p&gt;
&lt;pre&gt;val e = Example()
println(e.p)&lt;/pre&gt;
&lt;p&gt;This prints &amp;#8220;Example@33a17727, thank you for delegating &amp;#8216;p&amp;#8217; to me!&amp;#8221; Similarly, when we assign to p, the set() function is called. The first two parameters are the same, and the third hold the value being assigned:&lt;/p&gt;
&lt;pre&gt;e.p = "NEW"&lt;/pre&gt;
&lt;p&gt;This prints &amp;#8220;NEW has been assigned to &amp;#8216;p&amp;#8217; in Example@33a17727&amp;#8243;.&lt;/p&gt;
&lt;p&gt;Probably, you already see how to implement things like lazy or observable with this mechanism. Try it as a metter of exercise, but most of it is already done in the &lt;a href="https://github.com/JetBrains/kotlin/blob/build-0.5.742/libraries/stdlib/src/kotlin/properties/Delegation.kt"&gt;standard library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/JetBrains/kotlin/blob/build-0.5.742/libraries/stdlib/src/kotlin/properties/Delegation.kt#L12"&gt;kotlin.properties.Delegates&lt;/a&gt; object holds the most useful stuff. Let&amp;#8217;s start with lazy:&lt;/p&gt;
&lt;pre&gt;import kotlin.properties.Delegates

class LazySample {
    val lazy: String by Delegates.lazy {
        println("computed!")
        "Hello"
    }
}&lt;/pre&gt;
&lt;p&gt;Delegates.lazy() is a function that returns a delegate that implements a lazy property: the first call to get() executes the lambda expression passed to lazy() as an argument and remembers the result, subsequent calls to get() simply return the remembered result. If you want &lt;strong&gt;thread safety&lt;/strong&gt;, use blockingLazy() instead: it guarantees that the values will be computed only in one thread, and that all threads will see the same value.&lt;/p&gt;
&lt;p&gt;Now, let&amp;#8217;s turn to observable:&lt;/p&gt;
&lt;pre&gt;class User {
    var name: String by Delegates.observable("&amp;lt;no name&amp;gt;") {
        d, old, new -&amp;gt;
        println("$old -&amp;gt; $new")
    }
}&lt;/pre&gt;
&lt;p&gt;The observable() function takes two arguments: initial value and a handler for modifications. The handler gets called every time we assign to &amp;#8216;name&amp;#8217;, it has three parameters: a property being assigned to, the old value and the new one. If you want to be able to &amp;#8216;veto&amp;#8217; the assignment, use vetoable() instead of observable().&lt;/p&gt;
&lt;p&gt;Next may be somewhat unexpected: users frequently ask what to do when you have a non-null var, but you don&amp;#8217;t have an appropriate value to assign to it in constructor (i.e. it must be assigned later)? You can&amp;#8217;t have an uninitialized non-abstract property in Kotlin:&lt;/p&gt;
&lt;pre&gt;class Foo {
  var bar: Bar // error: must be initialized
}&lt;/pre&gt;
&lt;p&gt;You could initialize it with null, bit then you&amp;#8217;d have to check every time you access it. Now you have a delegate to handle this:&lt;/p&gt;
&lt;pre&gt;class Foo {
  var bar: Bar by Delegates.notNull()
}&lt;/pre&gt;
&lt;p&gt;If you read from this property before writing to it, it throws an exception, after the first assignment it works as expected.&lt;/p&gt;
&lt;p&gt;The last thing to show is properties stored in a map. This comes up a lot in applications like parsing JSON or doing other &amp;#8220;dynamic&amp;#8221; stuff:&lt;/p&gt;
&lt;pre&gt;class User(val map: Map&amp;lt;String, Any?&amp;gt;) {
    val name: String by Delegates.mapVal(map)
    val age: Int     by Delegates.mapVal(map)
}&lt;/pre&gt;
&lt;p&gt;In this example, the constructor takes a map:&lt;/p&gt;
&lt;pre&gt;val user = User(mapOf(
    "name" to "John Doe",
    "age"  to 25
))&lt;/pre&gt;
&lt;p&gt;Delegates take values from this map (by the string keys &amp;#8211; names of properties):&lt;/p&gt;
&lt;pre&gt;println(user.name) // Prints "John Doe"
println(user.age)  // Prints 25&lt;/pre&gt;
&lt;p&gt;Of course, you can have var&amp;#8217;s as well (with mapVar() function), that will modify the map upon assignment (note that you&amp;#8217;d need MutableMap instead of read-only Map).&lt;/p&gt;
&lt;p&gt;There are other use cases, and probably numerous improvements to these ones. Fantasize, experiment, enjoy! &lt;img src='http://blog.jetbrains.com/kotlin/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;h2&gt;First Steps in SAM Conversions&lt;/h2&gt;
&lt;p&gt;We introduced &lt;a title="Kotlin M5.2: IntelliJ IDEA 12.1 and Gradle" href="http://blog.jetbrains.com/kotlin/2013/04/kotlin-m5-2-intellij-idea-12-1-and-gradle/"&gt;SAM constructors&lt;/a&gt; last time. Of course, this is not enough, so we are working on full SAM conversions. The feature is not finished yet, but you can already use it in simple case like this:&lt;/p&gt;
&lt;pre&gt;SwingUtilities.invokeLater {
  button.setVisible(true)
}&lt;/pre&gt;
&lt;p&gt;To remind you, SAM conversions is what Java 8 uses for lambdas: when you have an interface with only one (abstract) method, like Comparator or Runnable, you are allowed to pass in a lambda where an instance of this interface is expected (in this example we pass a lambda instead of a Runnable). Kotlin does not have this as a language feature (for it is not needed in a language with proper function types), so it will only work for Java classes.&lt;/p&gt;
&lt;h2&gt;First Steps in &amp;#8220;Callable References&amp;#8221;&lt;/h2&gt;
&lt;p&gt;Another thing we are working on is &amp;#8220;Callable References&amp;#8221; or &amp;#8220;Feature Literals&amp;#8221;, i.e. an ability to pass named functions or properties as values. Users often ask &amp;#8220;I have a foo() function, how do I pass it as an argument?&amp;#8221;. The answer is: &amp;#8220;you prefix it with a &amp;#8216;::&amp;#8217;&amp;#8221;. For example:&lt;/p&gt;
&lt;pre&gt;fun isOdd(x: Int) = x % 2 != 0

val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd)) // Prints [1, 3]&lt;/pre&gt;
&lt;p&gt;Here &amp;#8220;::isOdd&amp;#8221; is a value of function type &amp;#8220;(Int) -&amp;gt; Boolean&amp;#8221;, and you can pass it as a filtering predicate. Another example:&lt;/p&gt;
&lt;pre&gt;fun compose&amp;lt;A, B, C&amp;gt;(f: (B) -&amp;gt; C, g: (A) -&amp;gt; B): (A) -&amp;gt; C {
    return {x -&amp;gt; f(g(x))}
}&lt;/pre&gt;
&lt;p&gt;This function return a composition of two functions passed to it: compose(f, g) = f(g(*)). Now, you can apply it to callable references:&lt;/p&gt;
&lt;pre&gt;fun length(s: String) = s.size

val oddLength = compose(::isOdd, ::length)
val strings = listOf("a", "ab", "abc")
println(strings.filter(oddLength)) // Prints "[a, abc]"&lt;/pre&gt;
&lt;p&gt;If you want to use a member of a class, you need to qualify it, and the result will be of type &amp;#8220;extension function&amp;#8221;,  e.g. String::toCharArray gives you an extension function for type String.&lt;/p&gt;
&lt;p&gt;Note that this is &lt;strong&gt;early work in progress&lt;/strong&gt;, so many things do not work yet, for example, overload disambiguation, type inference, support for properties etc. Eventually this feature will evolve into full type-safe reflection, but today we are only starting working on it.&lt;/p&gt;
&lt;h2&gt;Change Signature Refactoring&lt;/h2&gt;
&lt;p&gt;Adding/removing/reordering function parameters may be tedious when you have a lot of call sites to update. That&amp;#8217;s why IDEs prove a &amp;#8220;Change Signature&amp;#8221; refactoring. Place your cursor on a function or a constructor and hit Ctrl+F6 (Cmd+F6 on Mac), and you&amp;#8217;ll get a dialog like this:&lt;/p&gt;
&lt;p&gt;&lt;img class="aligncenter" src="https://www.evernote.com/shard/s171/sh/b4eb0e6e-b866-4a12-83f9-b94ed3daf8d9/1ec5d8ee74c94a7c6433813dd3c488e9/deep/0/Screenshot%206/5/13%206:42%20PM.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Change type, rename, reorder or delete parameters and all your call sites will be updates accordingly.&lt;/p&gt;
&lt;h2&gt;Quick Fixes for &amp;#8220;Type Mismatch&amp;#8221; etc&lt;/h2&gt;
&lt;p&gt;Thanks to contributions by &lt;a href="https://github.com/univerio"&gt;Jack Zhou&lt;/a&gt;, &lt;a id="js_3" href="https://github.com/sapal"&gt;Michał Sapalski&lt;/a&gt;, &lt;a id="js_5" href="https://github.com/lopekpl"&gt;Wojciech Łopata&lt;/a&gt; and other students of Open Source Mentorship program led by Stanford University, we now get many cool quick fixes. For example, when you get a type mismatch error, hit Alt+Enter and get some proposals to fix your code:&lt;/p&gt;
&lt;p&gt;&lt;img class="aligncenter" src="https://www.evernote.com/shard/s171/sh/ff9bd33c-ecd1-4800-91f2-4a69db761a37/f829b15d7de80df501e39b64f6973754/deep/0/Screenshot%206/5/13%206:51%20PM.jpg" alt="" /&gt;&lt;/p&gt;
&lt;h2&gt;Code Transformations&lt;/h2&gt;
&lt;p&gt;Another group of useful IDE actions to convert between equivalent forms of code, like:&lt;br /&gt;
&lt;iframe width="640" height="360" src="http://www.youtube.com/embed/Cfwq-pYtiDY?feature=oembed" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;You can also use Ctrl+Shift+Up/Down to move statements or declarations:&lt;/p&gt;
&lt;p&gt;&lt;iframe width="640" height="480" src="http://www.youtube.com/embed/RRRROZc3-2g?feature=oembed" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;As usual, the new plugin can be installed from &lt;a href="http://plugins.jetbrains.com/plugin?pr=idea&amp;amp;pluginId=6954"&gt;our plugin repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Have a nice Kotlin!&lt;/strong&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/kotlin/~4/w8U-OQRA2zM" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 06 Jun 2013 01:48:00 CDT</pubDate>
      <guid isPermaLink="true">http://blog.jetbrains.com/kotlin/?p=1060</guid>
      <dc:creator>Andrey Breslav</dc:creator>
    </item>
    <item>
      <title>Day 20 of 100 Consider Tests First</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/06/day_20_of_100_consider_tests_first</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;
&lt;div class="field-items"&gt;
&lt;div class="field-item even"&gt;
&lt;p&gt;&lt;span style="margin: 0px; padding: 0px; color: rgb(77, 85, 96); font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;Continuing with the &lt;/span&gt;&lt;a href="http://www.netobjectives.com/100-things-you-must-know-be-effective-software-development" style="margin: 0px; padding: 0px; color: rgb(2, 122, 198); text-decoration: none; font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;100 Things You Must Know to Be Effective In Software Development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Many consider doing Test-Driven Development but think it is too much work or will lead to future challenges.  Many folks find that their tests become unsustainable over time.  That's a different story, and you are holding off on TDD because of this, check out our &lt;a href="http://www.sustainabletdd.com/"&gt;Sustainable TDD site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This blog is about something much simpler.  It's about the insight that considering your tests (not even writing them, but just considering what they will be) will improve your code dramatically.  The reason for this is that thinking about how you will test your system is a looking at your system from a behavioral perspective - which is a strong design method.  Not coincidentally, one of the critical mandates from design patterns - design to interfaces (which is what tests are).&lt;/p&gt;
&lt;p&gt;Anyway, here's the first page and a half from &lt;a href="http://www.netobjectives.com/files/books/esad/essential-skills-define-tests-up-front.pdf"&gt;Chapter 3: Define Tests Up-Front&lt;/a&gt; from our &lt;a href="http://www.netobjectives.com/resources/books/essential-skills-agile-developers"&gt;Essential Skills For the Agile Developer: A Guide to Better Programming and Design&lt;/a&gt; book. If you want the rest, just click the link above.&lt;/p&gt;
&lt;h3&gt;Chapter 3&lt;/h3&gt;
&lt;h4&gt;Define Tests Up-Front&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;With the advent of agile methods, Test-Driven Development (TDD) has been gaining momentum.  A mantra of agile is that stories are completed, not merely written, every iteration.  This means they have to go through testing to be considered “done, done, done.” Many teams have experienced the productivity gains and value of TDD. Many teams have, unfortunately, shied away from it as well.  We believe that the value and reason that TDD works is not fully appreciated.  This chapter discusses both why TDD works, and why it isn’t really testing up-front.&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;
&lt;h5&gt;A Trim Tab: Testing and Testability&lt;/h5&gt;
&lt;/div&gt;
&lt;p&gt;As mentioned in the preface, this book represents the set of &lt;a href="http://www.netobjectives.com/resources/trim-tabs-in-software-development"&gt;trim tabs&lt;/a&gt; we, at Net Objectives, considers to be most useful for enhancing the productivity of software developers.  We consider the issue of testability (the focus of this chapter) to be, perhaps, the greatest of these.  Hence, we could say this chapter is about the trim tabs of trim tabs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What Is Testing?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Merriam Webster’s dictionary defines test as &lt;em&gt;“the procedure of submitting a statement to such conditions or operations as will lead to its proof or disproof or to its acceptance or rejection.”&lt;/em&gt; This is testing as an action.  However, a test can also be a noun, something that is &lt;em&gt;“a basis of evaluation.”&lt;/em&gt;  We’re sure you recollect a time someone put a “test” on your desk and then you had to take it.  The test you were given in this case specified what you needed to know in order to get a good grade.  The action of taking the test is something different altogether.&lt;/p&gt;
&lt;p&gt;In the same way, tests in software are about what the software needs to do in order to be considered successfully implemented.  This is why we can write tests before we have code to test.  We are specifying what the software needs to do.  We would suggest this insight leads to the observation that test-first is really analysis first using tests. In other words, we use the tests to determine the behavior we want of the functionality we are testing.  This is a form of analysis.&lt;/p&gt;
&lt;p&gt; But it is actually more than that – it is also a type of design using tests to accomplish the design.  That is, simultaneously with the analysis, we are figuring out how to implement the interfaces of the functionality.  We are splitting the classes up into their methods.  We are, in essence, doing design. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testability and Code Quality&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Why is this useful?  We suggest it’s because testability is highly correlated to the code qualities we want to manifest, in particular, loose coupling, strong cohesion and no redundancy.  We can recollect times that at the start of testing our code we have remarked:&lt;br /&gt;“I can’t test this code, it does too many things that are so intertwined” (weak cohesion)&lt;br /&gt;“I can’t test this code without access to dozens of other things” (excessive coupling)&lt;br /&gt;“I can’t test this code, it’s been copied all over the place and my tests will have to be duplicated over and over again” (redundancy)&lt;br /&gt;“I can’t test this code, there are too many ways for external objects to change its internal state”&lt;/p&gt;
&lt;p&gt;We’ve often summed it up by saying – “gee, I wish they had thought of how this code was going to be tested while they were writing it!”&lt;/p&gt;
&lt;p&gt;I’m kind of slow sometimes because it took me quite some time to realize (comment by Alan):&lt;br /&gt;&lt;strong&gt;&lt;em&gt;     I should consider how my code is going to be tested before writing it!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The reason is clear – testability is related to loose coupling, strong cohesion, no redundancy and proper encapsulation.  Another way to say this is that the tighter your coupling, the weaker your cohesion, the more your redundancy and the weaker your encapsulation, the harder it will be to test your code.  Therefore, making your code easier to test will result in looser coupling, strong cohesion, less redundancy and better encapsulation.&lt;/p&gt;
&lt;p&gt;This leads to a new principles:&lt;br /&gt;&lt;strong&gt;&lt;em&gt;   Considering how to test your code before you write it is a kind of design.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since testability results in so many good code qualities and since it is done before you write your code, it is a very highly leveraged action. That is, a little work goes a long way – it’s a great trim tab.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Click &lt;a href="http://www.netobjectives.com/files/books/esad/essential-skills-define-tests-up-front.pdf"&gt;here&lt;/a&gt; for the rest of the article.&lt;/p&gt;
&lt;p&gt;If you are looking to improve your code, I really suggest this simple tip.  It &lt;em&gt;will&lt;/em&gt; make a difference.&lt;/p&gt;
&lt;p&gt;Al Shalloway&lt;br /&gt;CEO, Net Objectives&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Did you like this? Please tweet by clicking on twitter icon below.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/cxmmd4hRG2I" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 05 Jun 2013 10:40:00 CDT</pubDate>
      <guid isPermaLink="true">1100 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>Day 19 of 100 Know the Power of Teams</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/06/day_19_of_100_know_the_power_of_teams</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;p&gt;&lt;span style="margin: 0px; padding: 0px; color: rgb(77, 85, 96); font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;Continuing with the &lt;/span&gt;&lt;a href="http://www.netobjectives.com/100-things-you-must-know-be-effective-software-development" style="margin: 0px; padding: 0px; color: rgb(2, 122, 198); text-decoration: none; font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;100 Things You Must Know to Be Effective In Software Development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This blog is also in preparation for a webinar I am doing this Wednesday called: &lt;a href="http://www.netobjectives.com/events/business-agile-series-how-to-start-2013-06"&gt;How to Start an Agile Implementation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wrote a blog about a year ago called &lt;a href="http://www.netobjectives.com/blogs/why-scrum-works-and-how-tells-us-when-it-won%E2%80%99t"&gt;Why Scrum Works and How This Tells Us When It Won’t&lt;/a&gt; it was a follow up to a blog now more than 6 years old &lt;a href="http://www.netobjectives.com/blogs/challenging-why-not-if-scrum-works"&gt;Challenging why (not if) Scrum works&lt;/a&gt;. I have long held that Scrum was an incomplete manifestation of Lean-Thinking and I have to say it is nice to see thought leaders in the Scrum community finally coming around to this thinking as well.&lt;/p&gt;
&lt;p&gt;However, Scrum still provides little insights into how to create teams when they are not present and are difficult to form.  The notion that the development group is comprised of generalists is simplistic (see &lt;a href="http://www.netobjectives.com/blogs/day-3-100-specialization-exists-honor-it"&gt;Specialization Exists – Honor It&lt;/a&gt;). While the espoused Scrum model is clearly the most efficient, it is not always the most cost-effective, or even an achievable approach in many situations.&lt;/p&gt;
&lt;p&gt;This blog will focus on &lt;em&gt;why&lt;/em&gt; teams are so important.  In a follow up blog I’ll talk about different ways of achieving them.  Let’s consider the seven wastes of software development:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Partially done work&lt;/li&gt;
&lt;li&gt;Task switching&lt;/li&gt;
&lt;li&gt;Handoffs&lt;/li&gt;
&lt;li&gt;Defects&lt;/li&gt;
&lt;li&gt;Delays&lt;/li&gt;
&lt;li&gt;Relearning&lt;/li&gt;
&lt;li&gt;Extra features&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;It not a coincidence that cross-functional teams can help eliminate each of these when they focus on doing iterative development.  This is best achieved when the teams understand Lean-Flow and that it implies they should work on the fewest number of features they can – this allows for quick completion of the work with few items in play.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Partially done work. &lt;/strong&gt;With a team focusing on getting work done, this won’t happen much.  Start something, finish it.  Stop starting and start finishing works for Scrum teams as much as it does for those doing Kanban.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Task Switching. &lt;/strong&gt;If we focus working on one story, completing it before going on to the next, there will be little task switching.  Pull an item, swarm on it, finish it, go to the next one.  No task switching.  Nice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Handoffs. &lt;/strong&gt;Part of the way to complete stories quickly is getting all of the folks you need work on it.  This also eliminates handoffs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Defects. &lt;/strong&gt;Swarming as described above means coders and testers will be working together (pairing even?).  This will lower the number of defects and enable their quick elimination when they do occur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Delays. &lt;/strong&gt; Delays are the cause of extra work, but, by avoiding the above, there will be few delays and overall waste is eliminated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Relearning. &lt;/strong&gt; This will be reduced by folks working together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Extra Features. &lt;/strong&gt;By building stories incrementally and getting feedback on how the system is manifesting value, we can avoid building things we don’t need.  This, of course, requires us to build the most important items first.&lt;/p&gt;
&lt;p&gt;Teams are also powerful because they provide for synergy, building camaraderie, creative ideas, higher morale and just plain fun.&lt;/p&gt;
&lt;p&gt;Teams are good, work towards having them.&lt;/p&gt;
&lt;p&gt;And, of course, if you don’t see how to do that, drop me a line – I’ll be happy to talk to you about how to do that.&lt;/p&gt;
&lt;p&gt;Al Shalloway&lt;br /&gt;CEO, Net Objectives&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Did you like this? Please tweet by clicking on twitter icon below.&lt;/em&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/bUJz1o_GPyQ" height="1" width="1"/&gt;</description>
      <pubDate>Sun, 02 Jun 2013 09:41:00 CDT</pubDate>
      <guid isPermaLink="true">1095 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>Day 18 of 100 Learning What You Don't Know You Don't Know</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/06/day_18_of_100_learning_what_you_don_t_know_you_don_t_know</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;p&gt;&lt;span style="margin: 0px; padding: 0px; color: rgb(77, 85, 96); font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;Continuing with the &lt;/span&gt;&lt;a href="http://www.netobjectives.com/100-things-you-must-know-be-effective-software-development" style="margin: 0px; padding: 0px; color: rgb(2, 122, 198); text-decoration: none; font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;100 Things You Must Know to Be Effective In Software Development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm writing this and the next day's blog, &lt;em&gt;"The Importance of Teams and How to Create Them"&lt;/em&gt; (posting later today) in preparation for a webinar I am doing this Wednesday called: &lt;a href="http://www.netobjectives.com/events/business-agile-series-how-to-start-2013-06"&gt;How to Start an Agile Implementation&lt;/a&gt;. I believe these two concepts are critical for starting Agile initiatives.  Too many folks go down a path that literally dooms them to failure, or, at least, makes it much harder to succeed.  Here it is.&lt;/p&gt;
&lt;p style="margin-left:.5in;"&gt;&lt;em&gt; “It ain't what you don't know that gets you into trouble. It's what you know for sure that just ain't so.”  - Mark Twain&lt;/em&gt;&lt;/p&gt;
&lt;p style="margin-left:.5in;"&gt;&lt;em&gt; “The problem ain't what people know. It's what people know that ain't so that's the problem.” – Will Rogers&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We’ve all heard that there’s what we know, what we don’t know and what we don’t know we don’t know.  While it may appear difficult to discover what you don’t know you don’t know, when it comes to a particular field, such as “how do I do software development” all you have to do is ask others who are doing it. One of the reasons Net Objectives is one of the few (only?) companies that teach and coach in: business portfolio management, Scrum, Kanban, Lean, XP, SAFe, and our own Lean-Agile Framework, is that we’ve found you need lessons in the practices from all of these. With the exception of Lean, which is more mindset and a container for practices, all of the others have different levels of value in different places.  However, it is worth knowing the value of each since it provides insights into where you are.&lt;/p&gt;
&lt;p&gt;By taking advantage of different ways different folks approach a problem, we can learn about things we might not otherwise become familiar with – and might just let you know about something you previously didn’t know and didn’t know you didn’t know it.&lt;/p&gt;
&lt;p&gt;Here’s a list of some things that I think everyone should at least know about, that many folks don’t appear to know, and don’t seem to know they don’t know it.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The best place to start is often at the top, not the team.&lt;/li&gt;
&lt;li&gt;If executives appear to development to be acting in a less than ideal way, it may be that they are not being presented with the information they need&lt;/li&gt;
&lt;li&gt;Hacking in code is not always the fastest way to do it in the short term&lt;/li&gt;
&lt;li&gt;Lean is not about going fast, it is about removing delays&lt;/li&gt;
&lt;li&gt;Starting an Agile transformation by creating a pilot by picking all of the people required for it without regard if you are removing skills required by the rest of the organization may be a sure way to early Agile success while dooming the transition to failure (see &lt;a href="http://www.netobjectives.com/blogs/day-5-100-how-successful-pilots-can-hurt-organization"&gt;Day 5 How Successful Pilots Can Hurt an Organization&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The right approach is not to take the time to do the correct thing, the right approach is to take the time to not do the wrong thing&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There are probably more, but I don’t know them.  But at least I know I don’t know them, so I’ll keep thinking about it. Let me know any you find. Remember Nietzsche's observation:&lt;/p&gt;
&lt;p style="margin-left:.5in;"&gt;&lt;em&gt;“Many are stubborn in pursuit of the path they have chosen, few in pursuit of the goal.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here are two other quotes by Twain and Rogers that can provide insight:&lt;/p&gt;
&lt;p style="margin-left:.5in;"&gt;&lt;em&gt; “A man who carries a cat by the tail learns something he can learn in no other way.” Mark Twain&lt;/em&gt;&lt;/p&gt;
&lt;p style="margin-left:.5in;"&gt;&lt;em&gt;“There are three kinds of men. The ones that learn by readin’. The few who learn by observation. The rest of them have to pee on the electric fence for themselves.” – Will Rogers&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Learn from others, but don't discard your own experience. If one doesn’t understand why others are doing what they are doing, they may be seeing things you are not seeing and they may be ignoring things you are counting on.  I would suggest you each have something to learn from each other.&lt;/p&gt;
&lt;p&gt;As always, if you or your company are having challenges in business, management, team agile or team technical practices, contact me so I can be of value.&lt;/p&gt;
&lt;p&gt;Thanks for reading,&lt;/p&gt;
&lt;p&gt;Al Shalloway&lt;br /&gt;CEO, Net Objectives&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you liked this blog please tweet about it by clicking the icon below.&lt;/em&gt;&lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/dGWUSNRCbxU" height="1" width="1"/&gt;</description>
      <pubDate>Sun, 02 Jun 2013 07:12:00 CDT</pubDate>
      <guid isPermaLink="true">1094 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>Day 17 of 100 The Lessons of Design Patterns</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/06/day_17_of_100_the_lessons_of_design_patterns</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;p&gt;&lt;span style="margin: 0px; padding: 0px; color: rgb(77, 85, 96); font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;Continuing with the &lt;/span&gt;&lt;a href="http://www.netobjectives.com/100-things-you-must-know-be-effective-software-development" style="margin: 0px; padding: 0px; color: rgb(2, 122, 198); text-decoration: none; font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;100 Things You Must Know to Be Effective In Software Development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Years ago people knew they didn't know much about design patterns.  Now, most folks think they know design patterns, but my experience in talking to them makes me believe otherwise.  Sorry if this sounds a bit aloof, arrogant or elitist, but I do believe it is true.  Patterns have been called "solutions to recurring problems in a context" by Christopher Alexander in his &lt;a href="http://www.amazon.com/Timeless-Way-Building-Christopher-Alexander/dp/0195024028"&gt;Timeless Way of Building&lt;/a&gt; (one of my all-time favorite books that I highly recommend, whether you want to learn patterns or just learn more about architecture). While this phrase is bandied about quite a lot, what's not as well know is another quote from the book: &lt;em&gt;"at this final stage, the patterns are no longer important: the patterns have taught you to be receptive to what is real."&lt;/em&gt;  Alexander is referring to the forces in the problem domain - that is, the issues you must attend to to achieve a high quality design.&lt;/p&gt;
&lt;p&gt;The Gang of Four book, &lt;a href="http://www.amazon.com/Design-Patterns-Elements-Object-Oriented-ebook/dp/B000SEIBB8"&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt; actually provides these forces, but if one is looking for solutions, they are often overlooked.  While getting into a discussion of how patterns teaches us about forces would be beyond the scope of this blog (see references at the end of this blog for that), we can talk about how design patterns provide us with a solid approach to design - one that is often overlooked.  Chapter 1 (Introduction) from the book provides an overview of the lessons learned from Design Patterns:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;design to interfaces - that is, design to the behavior of the object, not it's implementation.&lt;/li&gt;
&lt;li&gt;find what varies and encapsulate it (essentially, put a layer in, either with an Interface, Abstract class, or even an object that figures out the proper delegation&lt;/li&gt;
&lt;li&gt;favor delegation over inheritance. In other words, instead of having different ways of doing things by deriving new methods in a class that uses these methods (which leads to a complex inheritance hierarchies), have objects that are hidden behind interfaces and have the using object refer to this interface&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Basically, patterns tell us to hide variation in our solutions and do it by encapsulating the implementations that vary behind Interfaces, abstract classes, function pointers, or any way you can think of.  You can quickly see most of the patterns are examples of this by looking at our list of &lt;a href="http://www.netobjectivestest.com/PatternRepository/index.php?title=PatternsByEncapsulation"&gt;Patterns by Encapsulation&lt;/a&gt; on our &lt;span&gt;&lt;a href="http://www.netobjectivestest.com/PatternRepository"&gt;Design Patterns Repository&lt;/a&gt;.&lt;/span&gt;  You'll notice all of the behavioral patterns are about this. To accomplish this requires &lt;a href="http://www.netobjectives.com/files/books/esad/essential-skills-separate-use-from-construction.pdf"&gt;separating use from construction&lt;/a&gt;.  This is essentially the practice of encapsulating construction so that objects don't know which particular implementation of a behavior they are using.  You either make an object or use an object, but not both.  Patterns that do this are the creational patterns.&lt;/p&gt;
&lt;p&gt;But what do you use when you already have objects and want to put them into this encapsulating scheme?  That's where the structural patterns come in.&lt;/p&gt;
&lt;p&gt;I do strongly suggest you delve more in here in some way or another.  While knowing a few patterns (e.g., strategy, template method, bridge, ...) is great, understanding what they truly are and how to think in terms of the forces they expose is much more powerful.&lt;/p&gt;
&lt;p&gt;Want more?  Check out:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.netobjectives.com/resources/articles/can-patterns-be-harmful"&gt;Can Patterns Be Harmful? &lt;/a&gt;A good introduction to patterns&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.netobjectives.com/resources/books/design-patterns-explained"&gt;Design Patterns Explained: A New Perspective on Object-Oriented Design &lt;/a&gt;(while admittedly biased, I believe this is still the only book that talks about patterns as forces a la Alexander)&lt;/li&gt;
&lt;li&gt;A webinar: &lt;a href="http://www.netobjectives.com/resources/webinars/design-patterns-explained"&gt;Design Patterns Explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Our leading edge course that will be a design attitude changing experience: &lt;a href="http://www.netobjectives.com/training/design-patterns-explained"&gt;Design Patterns Explained&lt;/a&gt; course.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;As always, please let me know if you'd like to chat about opportunities.&lt;/p&gt;
&lt;p&gt;&lt;span style="margin: 0px; padding: 0px; line-height: 19.2px;"&gt;Al Shalloway&lt;/span&gt;&lt;br /&gt;&lt;span style="margin: 0px; padding: 0px; line-height: 19.2px;"&gt;CEO, Net Objectives&lt;/span&gt;&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; color: rgb(77, 85, 96); font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;&lt;span style="margin: 0px; padding: 0px; line-height: 19.2px;"&gt;A note on the 100 in 100 challenge: I will pick up the daily entries this week.  To be able to accommodate this with my existing schedule, I will start writing short blogs that point to other materials when available.  The intent will shift to awareness instead of trying to explain the concept.&lt;/span&gt; This should make it both easier for both author (me) and reader (you) to keep up.&lt;/div&gt;
&lt;p&gt;&lt;em&gt;If you liked this blog please tweet about it by clicking the icon below.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/9KMXBbwiw08" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 01 Jun 2013 10:29:00 CDT</pubDate>
      <guid isPermaLink="true">1093 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>Slides and Audio from Let’s Test Posted</title>
      <link>http://uberconf.com/blog/johanna_rothman/2013/05/slides_and_audio_from_let_s_test_posted</link>
      <description>&lt;p&gt;I delivered a keynote at &lt;a href="http://lets-test.com/" target="_blank"&gt;Let&amp;#8217;s Test&lt;/a&gt; in Sweden last week, &lt;a href="http://www.slideshare.net/johannarothman/becomingkick-asstestmanagerr1" target="_blank"&gt;&amp;#8220;Becoming a Kick-Ass Test Manager.&amp;#8221;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A lovely gentleman, Aleksis Tulonen, recorded the audio. Thank you, Aleksis! I attempted to marry the audio to the slides. I was not successful. However, the audio is up on slideshare. You can download the slides, page through them and listen to the audio. There are gems, such as, &amp;#8220;I&amp;#8217;m not done yet. This is &lt;em&gt;my&lt;/em&gt; keynote.&amp;#8221;&lt;/p&gt;
&lt;p&gt;On the slideshare, there is a link to my original keynote, the video of my &lt;a href="http://youtu.be/pdaXhaW2ev8" target="_blank"&gt;StarWest 2012 keynote.&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=vN-eD3ouoGM:ABT8_HO84lQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=vN-eD3ouoGM:ABT8_HO84lQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=vN-eD3ouoGM:ABT8_HO84lQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=vN-eD3ouoGM:ABT8_HO84lQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=vN-eD3ouoGM:ABT8_HO84lQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=vN-eD3ouoGM:ABT8_HO84lQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=vN-eD3ouoGM:ABT8_HO84lQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=vN-eD3ouoGM:ABT8_HO84lQ:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ManagingProductDevelopment/~4/vN-eD3ouoGM" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 31 May 2013 07:35:00 CDT</pubDate>
      <guid isPermaLink="true">http://www.jrothman.com/blog/mpd/?p=12317</guid>
      <dc:creator>Johanna Rothman</dc:creator>
    </item>
    <item>
      <title>Clojure on Cloud Foundry</title>
      <link>http://uberconf.com/blog/matt_stine/2013/05/clojure_on_cloud_foundry</link>
      <description>&lt;p&gt;I was inspired by Brian McClain&amp;#8217;s &lt;a href="http://catdevrandom.me/blog/2013/05/16/buildpacks-in-cloud-foundry-v2/"&gt;post on bringing Haskell to Cloud Foundry&lt;/a&gt; using Cloud Foundry v2 buildpacks, so I decided to go on a buildpack journey of my own. Since Clojure is the language I most enjoying &amp;#8220;toying around with,&amp;#8221; I thought I&amp;#8217;d try to deploy a simple Clojure web application using the &lt;a href="https://github.com/mstine/heroku-buildpack-clojure"&gt;Heroku Clojure Buildpack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To reiterate some of the coolness around buildpacks, they are what allows a PaaS like Cloud Foundry or Heroku to support various runtimes without first building that support into the core platform. If your favorite language or framework runtime isn&amp;#8217;t available, there&amp;#8217;s absolutely nothing stopping you from providing your own buildpack to support it. Stuff can get crazy &amp;#8211; McClain has even &lt;a href="https://twitter.com/BrianMMcClain/status/339479905974751232"&gt;hinted at bringing FORTRAN support to Cloud Foundry&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I decided for my experiment to build a VERY basic &amp;#8220;Hello World&amp;#8221; style application using &lt;a href="https://github.com/ring-clojure/ring"&gt;Ring&lt;/a&gt;, which is &amp;#8220;a Clojure web applications library inspired by Python&amp;#8217;s WSGI and Ruby&amp;#8217;s Rack.&amp;#8221; The easiest way to get started building Ring applications is to utilize the popular Clojure build tool &lt;a href="http://github.com/technomancy/leiningen"&gt;Leiningen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First I started by creating a new project:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;lein new hello-cf
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;hello-cf
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The next task was to add the Ring dependencies to my &lt;code&gt;project.clj&lt;/code&gt; file:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defproject &lt;/span&gt;&lt;span class="nv"&gt;hello-cf&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0.1.0-SNAPSHOT&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:min-lein-version&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;2.0.0&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:description&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Hello Clojure on Cloud Foundry!&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:license&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Eclipse Public License&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;            &lt;span class="ss"&gt;:url&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;http://www.eclipse.org/legal/epl-v10.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="ss"&gt;:dependencies&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nv"&gt;org.clojure/clojure&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;1.4.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ring/ring-core&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;1.1.8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;                 &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ring/ring-jetty-adapter&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;1.1.8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Then it was time to create the Ring application itself, by editing &lt;code&gt;src/hello_cf/core.clj&lt;/code&gt;:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='clojure'&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;ns &lt;/span&gt;&lt;span class="nv"&gt;hello-cf.core&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:use&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ring.adapter.jetty&lt;/span&gt; &lt;span class="ss"&gt;:only&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;run-jetty&lt;/span&gt;&lt;span class="p"&gt;]]))&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;handler&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;request&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:status&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="ss"&gt;:headers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;text/html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;   &lt;span class="ss"&gt;:body&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Hello Cloud Foundry from heroku-buildpack-clojure!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;defn &lt;/span&gt;&lt;span class="nv"&gt;-main&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;run-jetty&lt;/span&gt; &lt;span class="nv"&gt;handler&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:port&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Integer.&lt;/span&gt; &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)}))&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Let&amp;#8217;s break this down a bit. The &lt;code&gt;handler&lt;/code&gt; function will handle any HTTP request that hits our application, and will return an &amp;#8220;OK&amp;#8221; response containing a pleasant message indicating that we&amp;#8217;ve succeeded. That&amp;#8217;s really about it. Our application is complete. We can test it out by running the following:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;lein trampoline run -m hello-cf.core 8080
&lt;/span&gt;&lt;span class='line'&gt;2013-05-29 22:42:52.576:INFO:oejs.Server:jetty-7.6.1.v20120215
&lt;/span&gt;&lt;span class='line'&gt;2013-05-29 22:42:52.804:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Hitting &lt;code&gt;http://localhost:8080&lt;/code&gt; in the browser confirms that we&amp;#8217;re well on our way. Now it&amp;#8217;s time to trying pushing the application to Cloud Foundry. As Brian stated in his blog, one of the stellar aspects of Cloud Foundry buildpacks is that they are approximately the same as Heroku buildpacks. Practically, this means that one &lt;em&gt;should&lt;/em&gt; be able to utilize a Heroku buildpack on Cloud Foundry with minimal or no modifications. Let&amp;#8217;s put that theory to the test, shall we? Before we do, let&amp;#8217;s create a &lt;code&gt;Procfile&lt;/code&gt; quickly to let the buildpack know what we want to run:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;web: lein with-profile production trampoline run -m hello-cf.core &lt;span class="nv"&gt;$PORT&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And on with the push:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;cf push hello-cf --buildpack&lt;span class="o"&gt;=&lt;/span&gt;git://github.com/heroku/heroku-buildpack-clojure.git
&lt;/span&gt;&lt;span class='line'&gt;Using manifest file manifest.yml
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Creating hello-cf... OK
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;1: hello-cf
&lt;/span&gt;&lt;span class='line'&gt;2: none
&lt;/span&gt;&lt;span class='line'&gt;Subdomain&amp;gt; hello-cf
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;1: mstine.cf-app.com
&lt;/span&gt;&lt;span class='line'&gt;2: none
&lt;/span&gt;&lt;span class='line'&gt;Domain&amp;gt; mstine.cf-app.com
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Binding hello-cf.mstine.cf-app.com to hello-cf... OK
&lt;/span&gt;&lt;span class='line'&gt;Uploading hello-cf... OK
&lt;/span&gt;&lt;span class='line'&gt;Starting hello-cf... OK
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Downloaded app package &lt;span class="o"&gt;(&lt;/span&gt;12K&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;Initialized empty Git repository in /tmp/buildpacks/heroku-buildpack-clojure.git/.git/
&lt;/span&gt;&lt;span class='line'&gt;Installing heroku-buildpack-clojure.git.
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Installing OpenJDK 1.6...done
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Installing Leiningen
&lt;/span&gt;&lt;span class='line'&gt;       Downloading: leiningen-2.1.2-standalone.jar
&lt;/span&gt;&lt;span class='line'&gt;       Writing: lein script
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Building with Leiningen
&lt;/span&gt;&lt;span class='line'&gt;       Running: lein with-profile production compile :all
&lt;/span&gt;&lt;span class='line'&gt;       Retrieving lein-standalone-repl/lein-standalone-repl/0.1.5/lein-standalone-repl-0.1.5.pom from clojars
&lt;/span&gt;&lt;span class='line'&gt;       Retrieving lein-standalone-repl/lein-standalone-repl/0.1.5/lein-standalone-repl-0.1.5.jar from clojars
&lt;/span&gt;&lt;span class='line'&gt;       Performing task &lt;span class="s1"&gt;&amp;#39;compile&amp;#39;&lt;/span&gt; with profile&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="s1"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;       Retrieving org/clojure/clojure/1.4.0/clojure-1.4.0.pom from
&lt;/span&gt;&lt;span class='line'&gt;       ...
&lt;/span&gt;&lt;span class='line'&gt;       Compiling hello-cf.core
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Uploading staged droplet &lt;span class="o"&gt;(&lt;/span&gt;66M&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Uploaded droplet
&lt;/span&gt;&lt;span class='line'&gt;Checking hello-cf...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 down
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 flapping
&lt;/span&gt;&lt;span class='line'&gt;Application failed to start.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Drat. Let&amp;#8217;s take a quick look at the logs to see what may be awry:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;Reading logs/stderr.log... OK
&lt;/span&gt;&lt;span class='line'&gt;/home/vcap/app/.lein/bin/lein: line 42: java: &lt;span class="nb"&gt;command &lt;/span&gt;not found
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Ah-hah! Looks like the existing buildpack is making some assumptions about the structure of our application that no longer hold true on Cloud Foundry. So, I followed in Brian&amp;#8217;s footsteps and &lt;a href="https://github.com/mstine/heroku-buildpack-clojure"&gt;forked away&lt;/a&gt;. One small &lt;a href="https://github.com/mstine/heroku-buildpack-clojure/commit/fd2c46cc23267fa2d808123d2fd58f4295da4b85"&gt;commit&lt;/a&gt; looks like it ought to fix the problem. Let&amp;#8217;s give it another try:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;span class='line-number'&gt;47&lt;/span&gt;
&lt;span class='line-number'&gt;48&lt;/span&gt;
&lt;span class='line-number'&gt;49&lt;/span&gt;
&lt;span class='line-number'&gt;50&lt;/span&gt;
&lt;span class='line-number'&gt;51&lt;/span&gt;
&lt;span class='line-number'&gt;52&lt;/span&gt;
&lt;span class='line-number'&gt;53&lt;/span&gt;
&lt;span class='line-number'&gt;54&lt;/span&gt;
&lt;span class='line-number'&gt;55&lt;/span&gt;
&lt;span class='line-number'&gt;56&lt;/span&gt;
&lt;span class='line-number'&gt;57&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;cf push hello-cf --buildpack&lt;span class="o"&gt;=&lt;/span&gt;git://github.com/mstine/heroku-buildpack-clojure.git
&lt;/span&gt;&lt;span class='line'&gt;Using manifest file manifest.yml
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Not applying manifest changes without --reset
&lt;/span&gt;&lt;span class='line'&gt;See &lt;span class="sb"&gt;`&lt;/span&gt;cf diff&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;more details.
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Uploading hello-cf... OK
&lt;/span&gt;&lt;span class='line'&gt;Changes:
&lt;/span&gt;&lt;span class='line'&gt;  buildpack: &lt;span class="s1"&gt;&amp;#39;git://github.com/heroku/heroku-buildpack-clojure.git&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;git://github.com/mstine/heroku-buildpack-clojure.git&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;Updating hello-cf... OK
&lt;/span&gt;&lt;span class='line'&gt;Stopping hello-cf... OK
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;Starting hello-cf... OK
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Downloaded app package &lt;span class="o"&gt;(&lt;/span&gt;8.0K&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Downloaded app buildpack cache &lt;span class="o"&gt;(&lt;/span&gt;17M&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;Initialized empty Git repository in /tmp/buildpacks/heroku-buildpack-clojure.git/.git/
&lt;/span&gt;&lt;span class='line'&gt;Installing heroku-buildpack-clojure.git.
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Installing OpenJDK 1.6...done
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Using cached Leiningen 2.1.2
&lt;/span&gt;&lt;span class='line'&gt;       Writing: lein script
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Building with Leiningen
&lt;/span&gt;&lt;span class='line'&gt;       Running: lein with-profile production compile :all
&lt;/span&gt;&lt;span class='line'&gt;       Performing task &lt;span class="s1"&gt;&amp;#39;compile&amp;#39;&lt;/span&gt; with profile&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="s1"&gt;&amp;#39;production&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;       Compiling hello-cf.core
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Uploading staged droplet &lt;span class="o"&gt;(&lt;/span&gt;66M&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;-----&amp;gt; Uploaded droplet
&lt;/span&gt;&lt;span class='line'&gt;Checking hello-cf...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;Staging in progress...
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  0/1 instances: 1 starting
&lt;/span&gt;&lt;span class='line'&gt;  1/1 instances: 1 running
&lt;/span&gt;&lt;span class='line'&gt;OK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;BOOM!&lt;/p&gt;

&lt;p&gt;I quickly pointed my browser, and as yesterday&amp;#8217;s tweet indicates, success:&lt;/p&gt;

&lt;blockquote class="twitter-tweet" data-partner="tweetdeck"&gt;&lt;p&gt;Yeah&amp;#8230;that just happened. cc: &lt;a href="https://twitter.com/cloudfoundry"&gt;@cloudfoundry&lt;/a&gt; &lt;a href="https://twitter.com/search?q=%23clojure&amp;amp;src=hash"&gt;#clojure&lt;/a&gt; &lt;a href="https://twitter.com/search?q=%23buildpacks&amp;amp;src=hash"&gt;#buildpacks&lt;/a&gt; &lt;a href="https://twitter.com/search?q=%23winning&amp;amp;src=hash"&gt;#winning&lt;/a&gt; &lt;a href="http://t.co/9lJHqmWQPw"&gt;pic.twitter.com/9lJHqmWQPw&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Stine (@mstine) &lt;a href="https://twitter.com/mstine/statuses/339248683151417344"&gt;May 28, 2013&lt;/a&gt;&lt;/blockquote&gt;


&lt;script async src="http://mattstine.com//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Score another win for Cloud Foundry&amp;#8217;s buildpack support. I&amp;#8217;m now toying with the idea of doing something of a world tour of LISP on Cloud Foundry. My next candidate may be &lt;a href="https://github.com/evhan/heroku-buildpack-chicken"&gt;Scheme&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Wed, 29 May 2013 22:10:00 CDT</pubDate>
      <guid isPermaLink="true">http://mattstine.com/2013/05/29/clojure-on-cloud-foundry</guid>
      <dc:creator>Matt Stine</dc:creator>
    </item>
    <item>
      <title>Into the Crucible</title>
      <link>http://uberconf.com/blog/matt_stine/2013/05/into_the_crucible</link>
      <description>&lt;p&gt;Wow&amp;#8230;it seems I only post to this blog toward the end of May. Well, that all changes now. You see, as of June 3, 2013, this blog is going to become one of many aspects of my new &amp;#8220;day job.&amp;#8221; On Monday, I start my life as a Community Engineer with &lt;a href="http://cloudfoundry.com"&gt;Cloud Foundry&lt;/a&gt; by &lt;a href="http://goPivotal.com"&gt;Pivotal&lt;/a&gt;. What&amp;#8217;s a Community Engineer? Quite honestly, I&amp;#8217;m not completely sure of the answer to that question yet. But given the many conversations I&amp;#8217;ve had over the past few weeks, it seemingly fits right in with the bridge-building roles I&amp;#8217;ve played many times over the course of my career. In this case, I have one foot squarely planted in the world of Cloud Foundry engineering, and one foot squarely planted out in the world with you guys and gals - the community. My job is to help you understand how we are quite literally seeking to &amp;#8220;build a new platform for a new era.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Of course, this is a journey that for me started a few years ago. In my previous life as a front-line development manager, I helped lead an agile transformation within my team with &amp;#8220;ruthless automation&amp;#8221; playing a central role in everything that our team did. However, it seemed that the better we &amp;#8220;did agile,&amp;#8221; the more pain we felt when dealing with those outside of our circle of control. It was only years later, after reading Eliyahu Goldratt&amp;#8217;s &lt;a href="http://en.wikipedia.org/wiki/The_Goal_(novel)"&gt;The Goal&lt;/a&gt; and coming to an understanding of his &lt;a href="http://en.wikipedia.org/wiki/Theory_of_Constraints"&gt;Theory of Constraints&lt;/a&gt;, that I realized what was happening. Our constraints had moved &amp;#8220;out of the plant,&amp;#8221; if you will, and landed in the world of operations. Even without this understanding, I developed a keen interest in this newly emerging topic called &amp;#8220;DevOps&amp;#8221; and began to explore the ideas emerging around agile operations and infrastructure as code. I started playing with tools like Puppet, Chef, and Vagrant, and taught sessions on all three of them at the Project Automation Experience in 2011.&lt;/p&gt;

&lt;p&gt;You can read my &lt;a href="http://www.mattstine.com/2012/05/24/the-relaunch/"&gt;last entry&lt;/a&gt; and find out that not much later I joined VMware as a Senior Consultant for its Cloud Application Platform. I was hired into that role based on my extensive background in enterprise Java and the Spring ecosystem, but it was nothing short of a staffing accident that I found myself thrust into a role on a virtualization platform provisioning team helping to build out a private self-service cloud! I was steadily getting carried further away from my role as an application architect, steadily becoming assimilated into that mysterious world of web operations that I knew so little about. These experiences, along with my continued reading and thinking about the worlds of DevOps, Lean, and Kanban, have quite literally changed the way I look at the world of software engineering (or as I prefer to think of it now, value delivery through product engineering that just so happens to involve software!). These experiences have formed around me a &lt;a href="http://en.wikipedia.org/wiki/Crucible"&gt;crucible&lt;/a&gt;, melting me that I might be poured into a new professional mold.&lt;/p&gt;

&lt;p&gt;So now it&amp;#8217;s time to plunge into the world of building the leading &lt;a href="http://wattersjames.com/2013/03/04/my-fork-you-shirt/"&gt;open&lt;/a&gt; platform as a service, and to help YOU experience the &lt;a href="https://twitter.com/mstine/status/339570787914760195"&gt;HUGE can of @cloudfoundry awesome&lt;/a&gt; that we at Pivotal are about to unleash on the world. Sound good to you? &lt;a href="http://blog.cloudfoundry.com/2013/05/16/want-to-contribute-to-cloud-foundry-come-on-in/"&gt;Join us!&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 29 May 2013 09:00:00 CDT</pubDate>
      <guid isPermaLink="true">http://mattstine.com/2013/05/29/into-the-crucible</guid>
      <dc:creator>Matt Stine</dc:creator>
    </item>
    <item>
      <title>Gr8conf EU 2013 at a glance</title>
      <link>http://uberconf.com/blog/andres_almiray/2013/05/gr8conf_eu_2013_at_a_glance</link>
      <description>&lt;p&gt;Last week Copenhagen became the grooviest city in the world for a few days, as &lt;a href="http://gr8conf.eu/index"&gt;Gr8conf EU 2013&lt;/a&gt; had it's fifth edition. Here's a quick report of what transpired during this awesome time.&lt;/p&gt;

&lt;p&gt;The trip began with a quick stop at the annual Groovy DevCon. What's Groovy DevCon you ask? Well it's a meeting of people behind the Groovy language. Topics discussed in this meeting usually shape the future of the language and some of the projects related to it. This time &lt;a href="https://twitter.com/springjuergen"&gt;Jürgen Höller&lt;/a&gt; was in attendance as the next version of the Spring Framework (version 4) will provide a much improved (and integrated) support for Groovy. Later that evening we had the traditional Speaker's dinner, a perfect occasion to catch up with old friends and make new ones.&lt;/p&gt;

&lt;p&gt;During the University Day (May 22nd) &lt;a href="https://twitter.com/cedricchampeau"&gt;Cédric Champeau&lt;/a&gt; and myself presented a workshop on Groovy AST transformations. Cédric did an amazing job building a comprehensive set of exersises and documentation (all of which available at &lt;a href="https://github.com/melix/ast-workshop"&gt;https://github.com/melix/ast-workshop&lt;/a&gt;), full credit to the workshop's success goes to him &lt;img src="http://www.jroller.com/images/smileys/smile.gif" class="smiley" alt=":-)" title=":-)" /&gt; He has written down his own &lt;a href="http://www.jroller.com/melix/entry/gr8conf_europe_2013_is_over"&gt;conference report&lt;/a&gt; too. Basically what happened is I rambled for 30 minutes on my own experiences writing AST transformations then we switched gears into hacking solutions for each exercise.&lt;/p&gt;

&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/22116307" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen=""&gt; &lt;/iframe&gt;


&lt;p&gt; &lt;/p&gt;&lt;div style="margin-bottom:5px"&gt; &lt;strong&gt; &lt;a href="http://www.slideshare.net/aalmiray/groovy-ast-demystified-22116307" title="Groovy AST Demystified" target="_blank"&gt;Groovy AST Demystified&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="http://www.slideshare.net/aalmiray" target="_blank"&gt;Andres Almiray&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Later that evening attenddees joined in what has become a Gr8conf staple: &lt;a href="http://gr8conf.eu/Presentations/Hackergarten-on-tour"&gt;Hackergarten on Tour&lt;/a&gt;. We had over 50 participants working on 10 tasks. Some of the tasks included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving the &lt;a href="http://gpars.codehaus.org/"&gt;GPars&lt;/a&gt; codebase for multiverse.&lt;/li&gt;
&lt;li&gt;Adding a &lt;a href="https://github.com/grails/grails-core/commit/016e9141e80381a1aacf54e8d51d7155582b7ec4"&gt;@Transactional AST transformation&lt;/a&gt; to Grails; no more Spring proxies.&lt;/li&gt;
&lt;li&gt;a &lt;a href="https://github.com/glaforge/doctorpad"&gt;Griffon + JavaFX&lt;/a&gt; document viewer for Asciidoc sources, relying on &lt;a href="https://github.com/asciidoctor/asciidoctor-java-integration"&gt;Asciidoctor&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Updates to a handful Grails plugins (JodaMoney for example).&lt;/li&gt;
&lt;li&gt;Improved code coverage for &lt;a href="http://open-dolphin.org/dolphin_website/Home.html"&gt;Open Dolphin&lt;/a&gt;, reaching 100%.&lt;/li&gt;
&lt;li&gt;Spock, Ratpack, Geb and more&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="https://twitter.com/steveonjava"&gt;Steve&lt;/a&gt; took the opportunity to interview some of us during the Hackergarten, videos were posted to &lt;a href="http://www.youtube.com/user/gr8conf2011"&gt;Gr8conf's Youtube channel&lt;/a&gt;. I must confess that so far Hackergarten is my favorite part of the conference as it brings out the best of our Groovy community: friendship, synergy and lots of fun. We stayed there until the doors closed; I'm pretty sure some of use would had continued if we were allowed in the room for more time (sleep is overrated anyway).&lt;/p&gt;

&lt;p&gt;The very next morning &lt;a href="https://twitter.com/sbglasius"&gt;Søren&lt;/a&gt; declared the conference officially open for business by making an introduction and recounting the history behind it. Then came the turn for &lt;a href="https://twitter.com/venkat_s"&gt;Venkat&lt;/a&gt; to inspire the audience with his keynote "The rise and fall of empires: Lessons for language designers and programmers", and inspire he did! There's one rule when Venkat appears in a conference: you simply don't miss his presentations. Now, the organizers made an excellent job building up the schedule, as it was hard to choose which session to go next as all of them were of high quality presented by talented people, this trend continued for the rest of the conference -- aside, there was a good number of newcomer speakers to the conference this year. Later in the day Venkat came back with a vengeance presenting "Functional Groovy", shedding some light on Groovy's functional capabilities in case you're fed up with procedural shenanigans. The first day was brought to a close with the Meet'n'Greet, that is, a big grill + beer party for attendees and speakers alike. The Gr8conf crew brew their own brand of beers, ales and malts which were delightfully sampled, tasted and drank by all.&lt;/p&gt;

&lt;p&gt;Friday began half an hour earlier than yesterday, a fact &lt;a href="https://twitter.com/russel_winder"&gt;Russel&lt;/a&gt; felt compelled to mention every 5 minutes during his talk "Is Groovy as fast as Java?", because why not, it &lt;em&gt;was&lt;/em&gt; early after all &lt;img src="http://www.jroller.com/images/smileys/tongue.gif" class="smiley" alt=":-P" title=":-P" /&gt; Russel presented some shocking results when running Groovy with JDK8; I won't spoil them here, just be sure to check out &lt;a href="http://www.russel.org.uk/"&gt;his report&lt;/a&gt;, fork the code and test it for yourself. Next up was "Griffon Update" by yours truly. I asked the audience who was making use of the framework, turns out more than half was working with it already! The talk was a mixture of what has happened since last Gr8conf (remember Griffon 1.0.0 was released live on stage last year, the book was deveiled too). The slide deck has some interesting numbers in terms of growth and usage; turns out Griffon is being put to work in 86 countries around the world. There was a live demo moment too, where the latest feature "action interceptors" was shown in the context of the &lt;a href="http://artifacts.griffon-framework.org/plugin/shiro"&gt;shiro&lt;/a&gt; and scaffolding plugins. Doctorpad (the Asciidoc viewer built during the Hackergarten) made an appereance as well.&lt;/p&gt;

&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/21824219" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen=""&gt; &lt;/iframe&gt;


&lt;p&gt; &lt;/p&gt;&lt;div style="margin-bottom:5px"&gt; &lt;strong&gt; &lt;a href="http://www.slideshare.net/aalmiray/griffon-update-gr8conf-2013" title="Griffon Update Gr8conf 2013" target="_blank"&gt;Griffon Update Gr8conf 2013&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href="http://www.slideshare.net/aalmiray" target="_blank"&gt;Andres Almiray&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;I was planning to get another surprise shown during the talk, sadly fumbled the plans during my stay in Mexico a week prior to Gr8conf, so it'll have to wait for the next opportunity. However I managed to bring some cool give-aways&lt;/p&gt;

&lt;p align="center"&gt;&lt;a href="http://www.flickr.com/photos/22798066@N04/8878009964/" title="Griffon stickers &amp;amp; pins by aalmiray, on Flickr"&gt;&lt;img src="http://farm6.staticflickr.com/5449/8878009964_95f77691a5.jpg" width="375" height="500" alt="Griffon stickers &amp;amp; pins"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;What is Gr8conf without &lt;a href="https://twitter.com/mrhaki"&gt;Mr. Haki&lt;/a&gt;? I'm glad Hubert came back again and shared  enlightening and very cool tips and tricks that Groovy 2.0 has to offer. Also, he's probably one the fastest type-while-speaking people I've seen; always a great show. The room was fully packed because ...&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://weknowmemes.com/generator/uploads/generated/g136938725959007036.jpg"&gt;&lt;/p&gt;


&lt;p&gt;Lastly on my list of attended talks is &lt;a href="https://twitter.com/ldaley"&gt;Luke Daley&lt;/a&gt; and his &lt;a href="http://www.ratpack-framework.org/"&gt;Ratpack&lt;/a&gt; reboot. Luke showed us the latest tricks coming in Ratpack 0.9, including a full tour of the Java APIs. He dared to show Java code at a Groovy conference, yes, he's &lt;em&gt;that&lt;/em&gt; guy &lt;img src="http://www.jroller.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt; Ratpack has matured a lot since Luke joined the team a few months back. He painstakenly pays attention to API design, tool support and documentation, which makes it much easier to get started with Ratpack.&lt;/p&gt;

&lt;p&gt;A big shoutout to the Gr8conf Crew and sponsors for making Gr8conf EU an incredible experience and unforgettable event. Very much looking forward to the next edition!&lt;/p&gt;

&lt;p&gt;Keep on Groovying!&lt;/p&gt;</description>
      <pubDate>Wed, 29 May 2013 07:23:00 CDT</pubDate>
      <guid isPermaLink="true">http://www.jroller.com/aalmiray/entry/gr8conf_eu_2013_at_a</guid>
      <dc:creator>Andres Almiray</dc:creator>
    </item>
    <item>
      <title>How We Do the Kanban Method</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/05/how_we_do_the_kanban_method</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;p&gt;Sorry to be pushing back the 100 in 100 project but hopefully the readers of that will find this blog just as interesting.  If you are not familiar with Kanban, you should get familiar with it. It is one of the most exciting things to have happened in the Agile space.  See my article &lt;a href="http://www.netobjectives.com/files/resources/articles/Demystifying-Kanban.pdf"&gt;De-Mystifying Kanban&lt;/a&gt; for a brief introduction.&lt;/p&gt;
&lt;p&gt;I have been involved in an interesting discussion on the &lt;a href="http://finance.groups.yahoo.com/group/kanbandev/?yguid=24453814"&gt;Kanban Dev group&lt;/a&gt; (a great place to go to engage in discussions about the Kanban method).  I wrote up a description of how we (Net Objectives) does Kanban.  This is an appropriate paraphrasing of it.  Though it might be of interest.&lt;/p&gt;
&lt;p&gt;To summarize our approach to the Kanban Method, and trying to be a bit clearer:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Start where you are&lt;/li&gt;
&lt;li&gt;Create visibility by making a Kanban board&lt;/li&gt;
&lt;li&gt;Establish explicit workflow policies&lt;/li&gt;
&lt;li&gt;Determine if the Kanban Method is appropriate (I’ve sometimes veered away from it at this point and done more of a pure lean flow approach where we mapped out an approach that was based on swarming, not WIP limits).  This determination is often made based on who should pull the work.  Sometimes the folks doing the work now are not organized correctly and the value stream mapping makes this apparent.&lt;/li&gt;
&lt;li&gt;If Kanban Method is appropriate, establish WIP limits and a pull mechanism if it is not in place already&lt;/li&gt;
&lt;li&gt;As move forward look for opportunities to:&lt;br /&gt;&lt;ol style="list-style-type:lower-alpha;"&gt;&lt;li&gt;Load balance&lt;/li&gt;
&lt;li&gt;Redo flow to reduce delays in feedback, error detection&lt;/li&gt;
&lt;li&gt;Have  folks work together&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Take these opportunities as they seem appropriate and validate improvement in flow/quality/discovery&lt;/li&gt;
&lt;li&gt;Repeat steps 4-7&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;A note about #4.  These seem to fall into two camps.  One is a significant change in the manner work to be done is initiated by the business stakeholders.  Improvements here can have dramatic affects downstream.&lt;/p&gt;
&lt;p&gt;One of my favorite quotes is by Eli Goldratt: “Often reducing batch size is all it takes to bring a system back into control.”  By focusing on minimal business increments, this is often achievable.  The other camp is to improve workflow directly by changing how work is done.  This is often a dramatic change and most often involves changing the order of the work or who pulls the work.  We then do continuous improvement a la Toyota Kata. I would not suggest what was happening in these cases was the Kanban method.   In our practice we don’t really make such a distinction though, whether it is Kanban Method or Lean – that appears to be arbitrary.  But I am wanting to honor the distinction being made on this group.&lt;/p&gt;
&lt;p&gt;Regardless of what happens in step 4, our focus is on delay as we believe that is the main problem.  Limiting WIP reduces delay, and is a great proxy for process improvement.   But I believe these four types of delay is what causes virtually all of the waste in software development:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;From when information is obtained until it is used (e.g., getting requirements too soon)&lt;/li&gt;
&lt;li&gt;From when an error is made until it is detected (e.g., delayed testing, delayed integration)&lt;/li&gt;
&lt;li&gt;From when information is needed until it is obtained (e.g., waiting for someone to be available)&lt;/li&gt;
&lt;li&gt;Delays in workflow – just stoppage due to an interruption&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;I would suggest just about every challenge to workflow shows itself up as a delay.  This is the striving for Just In Time of Lean. Limiting WIP is a vehicle for that.   There are other mechanisms (teams, ATDD, continuous integration, small batches).&lt;/p&gt;
&lt;p&gt;I believe understanding delay is useful to explain why Kanban works so well.&lt;/p&gt;
&lt;p&gt;To me, the power of the Kanban Method is not just improving flow, it is a great example of Toyota Kata (I strongly suggest reading this wonderful book by Mike Rother if you haven’t).&lt;/p&gt;
&lt;p&gt;As always, if you have interest in this and want to see how it might help your organization, please contact me.  Always happy to provide a free consult.&lt;/p&gt;
&lt;p&gt;Al Shalloway&lt;br /&gt;CEO, Net Objectives&lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/vYEJv6bWSb4" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 28 May 2013 05:32:00 CDT</pubDate>
      <guid isPermaLink="true">1092 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>Why I Endorse Both SAFe &amp; the Kanban Method</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/05/how_i_can_endorse_safe__the_kanban_method</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;p&gt;This was originally titled "How I Can Endorse SAFe &amp;amp; the Kanban Method" due to consternation my endorsing SAFe seems to be causing some in the Kanban community.  But then I realized that most folks in the Agile community don't have this concern, so I thought it's current title to be more appropriate.  In a nutshell, I endorse both, because they both have value.&lt;/p&gt;
&lt;p&gt;I was recently asked how I can support both the Scaled Agile Framework (SAFe) while being a supporter of evolutionary methods (Lean and Kanban Method).&lt;/p&gt;
&lt;p&gt;Here is a paraphrasing of the email:&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;You sound in so far as I read below as someone who promotes the evolutionary approach. However it is a bit confusing to me where you actually stand.&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;For example: You seem to endorse SAFe as it stands today, SAFe's prescription (no options) of a disruptive method at the team level does not indicate &lt;strong&gt;doing&lt;/strong&gt; something about that understanding (trusting it exists). As an example Operation teams, Enterprise Data Movement teams balk at this. This prescription as you may already know - does not take into account team's capacity for change and undermines their probable understanding of their scope of Continuous improvement. &lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;To me it's not of prime importance what size an evolutionary step (adaptation) should be but &lt;strong&gt;how&lt;/strong&gt; you improve.&lt;/p&gt;
&lt;p style="margin-left: 40px;"&gt;The Kanban method calls for Continuous improvement &lt;strong&gt;collaboratively - &lt;/strong&gt;Not a coach or consultant or method or framework or model or Agile office rolling out adaptations to teams that are going through transformation (small or large).&lt;/p&gt;
&lt;p&gt;First, SAFe is not as prescriptive as many hold it to be.  It is a starting point and can be tailored considerably. SAFe is explicitly based on Lean and uses Kanban at the portfolio level and Scrum at the team level.  Scrum's use is merely because there are lots of Scrum teams out there - Kanban at the team level could just as easily be used.  Dean had me present an intro to Kanban at the SPC training I did.&lt;/p&gt;
&lt;p&gt;But, in my opinion, apparently counter to both Scrum and Kanban Method thought leaders, there is no right way to transition.  Some companies can use a jump, others need evolutionary.  Scrum has demonstrated it can be quite useful in jumping, but if that’s the only thing you have it can also be quite dangerous. In all cases, one must look where you are, create visibility, create explicit policies, then make your move and evaluate (PDCA).&lt;/p&gt;
&lt;p&gt;I endorse SAFe because it creates a vision about the big picture that many in the software industry are looking for.  One that Scrum thought leadership has not provided - continuing to endorse Scrum-of-Scrums.  I have/had been involved in LSSC, LSS, LKU primarily to create this vision.  SAFe at least creates that.  Whether it is the right method to use depends upon the organization.&lt;/p&gt;
&lt;p&gt;Net Objectives supports SAFe because in some situations, it is the right way to do it.  We also have the &lt;a href="http://www.netobjectives.com/net-objectives-lean-agile-framework"&gt;Lean-Agile-Framework&lt;/a&gt; which is evolutionary (our own IP, consistent with SAFe, but more flexible).  The point is you need to do what works for you.  If SAFe only introduced the key points that were needed for enterprise agility that would be useful.  But it provides a way of doing it that can be a starting point for common understanding.  It provides methods that have worked at scale.  The irony is, that for all the fuss people have complained about SAFe being heavy or just plain old wrong, there is a lot of evidence that it works.  I'd like to see folks point out more case studies for companies with IT organizations greater than 1000 people where Scrum or Kanban has worked.&lt;/p&gt;
&lt;p&gt;What I think i like most about SAFe, however, is that it is changing.  No one in the SAFe organization says anything is out of scope in the discussions as has happened in the Scrum and Kanban Method communities.  If it can help, it is worth discussing.  If it can't, then it is worth discussing why the person talking is misled.&lt;/p&gt;
&lt;p&gt;I try not to hold to a mindset, but continuously look for solid ideas that can help our clients.  So far, I've seen SAFe provide value.&lt;/p&gt;
&lt;p&gt;Al Shalloway&lt;br /&gt;CEO, Net Objectives&lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/SSdvErrjL4s" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 27 May 2013 16:19:00 CDT</pubDate>
      <guid isPermaLink="true">1091 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>Day 16 of 100 Understanding and Achieving Robust Architectures</title>
      <link>http://uberconf.com/blog/alan_shalloway/2013/05/day_16_of_100_understanding_and_achieving_robust_architectures</link>
      <description>&lt;div class="field field-name-body field-type-text-with-summary field-label-hidden"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt; &lt;p&gt;&lt;span class="date"&gt;May 17, 2013 — Posted by &lt;a href="http://www.netobjectives.com/blogs/13"&gt;Al Shalloway&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="margin: 0px; padding: 0px; color: rgb(77, 85, 96); font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;Continuing with the &lt;/span&gt;&lt;a href="http://www.netobjectives.com/100-things-you-must-know-be-effective-software-development" style="margin: 0px; padding: 0px; color: rgb(2, 122, 198); text-decoration: none; font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;100 Things You Must Know to Be Effective In Software Development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Many wonder how a quality architecture can be built in an large organization attempting to achieve Agile methods.  While most acknowledge big design up front (BDUF) has certain disadvantages, the design as you go approach that many espouse in the Agile community seems to have its own pitfalls and risks.  At Net Objectives we believe that both extremes – too much architecture and no architecture - are fraught with risk and waste and are to be equally avoided.  To understand what is needed and how to achieve architecture in the Agile space, one must step back and look at what architecture needs to provide to us.&lt;/p&gt;
&lt;p&gt;Architecture, whether Agile or otherwise, needs to provide the following:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;A vision of the context within which we are designing so as to allow different teams to stay aligned while implementing in the best way for their local needs&lt;/li&gt;
&lt;li&gt;Enable extensions to the system, in particular, new concepts, technologies and scaling requirements that are discovered/demanded/required must be able to be implemented with low overhead&lt;/li&gt;
&lt;li&gt;Enable new ways of implementing existing concepts (e.g., new pricing, new countries) with only the cost of the new functionality.  That is, there should not be any impact to existing functions.&lt;/li&gt;
&lt;li&gt;Foster testability throughout the system – both at the acceptance level and team functional level.  In particular, new requirements should not adversely affect regression testing.&lt;/li&gt;
&lt;li&gt;De-couple systems from the application.  As systems evolve, the application should not have to change merely because the system architecture does unless the changing system enables new functionality&lt;/li&gt;
&lt;li&gt;Facilitate reuse of common functions across teams&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Doing the above is not necessarily easy, but it is made much more possible with an understanding of:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;how to evolve systems with emergent design&lt;/li&gt;
&lt;li&gt;how to test systems at the behavioral and functional level&lt;/li&gt;
&lt;li&gt;the different perspectives of conceptual Vs specification; creation from using; and system architecture from application architecture&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The skill sets associated with the above are:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Being able to do quickly identify sets of implementations that are conceptually the same and how they relate to each other (this is readily achieved with commonality / variability analysis using the analysis matrix)&lt;/li&gt;
&lt;li&gt;Pattern oriented design&lt;/li&gt;
&lt;li&gt;Test-Driven Development&lt;/li&gt;
&lt;li&gt;Acceptance Test-Driven Development&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Agile architectures will then enable us to:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Inject new concepts with little to no rework&lt;/li&gt;
&lt;li&gt;Add new implementations of existing concepts with only minimally affecting the existing system&lt;/li&gt;
&lt;li&gt;Change the system with little risk of introducing errors and full confidence that if you do you will detect them&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;We would suggest the needs of Agile and non-Agile architecture are really the same, Agile architecture merely needs to evolve in smaller increments.  Architecture shifts from being this static structure that can accommodate everything to one of an architecture that can be easily modified as new information (often in the form of additional requirements) become known.&lt;/p&gt;
&lt;p&gt;As you might guess, we have training and coaching on all of the areas mentioned above.  We are introducing an online course, instructor facilitated course as well.  If you are interested in improving the skill sets of your folks, please send me a note.&lt;/p&gt;
&lt;p&gt;&lt;span style="margin: 0px; padding: 0px; line-height: 19.2px;"&gt;Al Shalloway&lt;/span&gt;&lt;br /&gt;&lt;span style="margin: 0px; padding: 0px; line-height: 19.2px;"&gt;CEO, Net Objectives&lt;/span&gt;&lt;/p&gt;
&lt;div style="margin: 0px; padding: 0px; color: rgb(77, 85, 96); font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt; &lt;/div&gt;
&lt;div style="margin: 0px; padding: 0px; color: rgb(77, 85, 96); font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;"&gt;&lt;span style="margin: 0px; padding: 0px; line-height: 19.2px;"&gt;A note on the 100 in 100 challenge: I will pick up the daily entries this week.  To be able to accommodate this with my existing schedule, I will start writing short blogs that point to other materials when available.  The intent will shift to awareness instead of trying to explain the concept.&lt;/span&gt; This should make it both easier for both author (me) and reader (you) to keep up.&lt;/div&gt;
&lt;p&gt;&lt;em&gt;If you liked this blog please tweet about it by clicking the icon below.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
 &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="field field-name-field-staff-member field-type-user-reference field-label-above"&gt;&lt;div class="field-label"&gt;Author:&amp;nbsp;&lt;/div&gt;&lt;div class="field-items"&gt;&lt;div class="field-item even"&gt;&lt;a href="/users/al-shalloway"&gt;alshall&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetObjectivesThoughtsBlog/~4/2puAMuYJTss" height="1" width="1"/&gt;</description>
      <pubDate>Sun, 26 May 2013 17:20:00 CDT</pubDate>
      <guid isPermaLink="true">1090 at http://www.netobjectives.com</guid>
      <dc:creator>Alan Shalloway</dc:creator>
    </item>
    <item>
      <title>Devs in the ‘Ditch Slides Posted</title>
      <link>http://uberconf.com/blog/johanna_rothman/2013/05/devs_in_the_ditch_slides_posted</link>
      <description>&lt;p&gt;I gave a talk at Devs in the &amp;#8216;Ditch last week when I was in London. I posted the slides on &lt;a href="http://www.slideshare.net/johannarothman/devsinthe-ditch" target="_blank"&gt;slideshare: Overcoming Three Pitfalls of Transitioning to Agile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The very nice people at 7digital made a video and &lt;a href="http://youtu.be/PLX1twVeH0E" target="_blank"&gt;posted&lt;/a&gt; it, too. If you can take the time, watch the entire video. Rob Bowyer gave a great talk about kanban and theory of constraints. My part about overcoming these three pitfalls starts at about 42 minutes in.&lt;/p&gt;
&lt;p&gt;There are many other pitfalls to transition. This talk had just three of them: the stories are too big, you need experts to do the work, and you implement as layers instead of through the architecture.&lt;/p&gt;
&lt;p&gt;I hope you enjoy the presentation and the video.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=JZB57O5UZb4:3ven0G0k3sc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=JZB57O5UZb4:3ven0G0k3sc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=JZB57O5UZb4:3ven0G0k3sc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=JZB57O5UZb4:3ven0G0k3sc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=JZB57O5UZb4:3ven0G0k3sc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?i=JZB57O5UZb4:3ven0G0k3sc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=JZB57O5UZb4:3ven0G0k3sc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?a=JZB57O5UZb4:3ven0G0k3sc:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManagingProductDevelopment?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ManagingProductDevelopment/~4/JZB57O5UZb4" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 21 May 2013 00:29:00 CDT</pubDate>
      <guid isPermaLink="true">http://www.jrothman.com/blog/mpd/?p=12298</guid>
      <dc:creator>Johanna Rothman</dc:creator>
    </item>
  </channel>
</rss>

