<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>path11 crafters</title><generator>Tumblr (3.0; @path11blog)</generator><link>http://blog.path11.com/</link><item><title>Enrique Comba Riepenhausen: The Impersonator Pattern: Redux - Getting rid of the world at a method level</title><description>&lt;a href="http://www.ecomba.org/post/47130417597/the-impersonator-pattern-redux-getting-rid-of-the"&gt;Enrique Comba Riepenhausen: The Impersonator Pattern: Redux - Getting rid of the world at a method level&lt;/a&gt;: &lt;p&gt;&lt;a href="http://www.ecomba.org/post/47130417597/the-impersonator-pattern-redux-getting-rid-of-the" class="tumblr_blog" target="_blank"&gt;ecomba&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Last 4th of April I gave a talk on the &lt;a href="http://blog.path11.com/post/37324695474/clean-cukes-the-impersonator-pattern" target="_blank"&gt;Impersonator Pattern&lt;/a&gt; during the &lt;a href="http://skillsmatter.com/event/agile-testing/cukeup-2013" target="_blank"&gt;CukeUp!&lt;/a&gt; event at &lt;a href="http://skillsmatter.com/" target="_blank"&gt;SkillsMatter&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Before my talk I was talking to &lt;a href="http://pages.andrew.premdas.org/" target="_blank"&gt;Andrew&lt;/a&gt; who also &lt;a href="http://skillsmatter.com/podcast/agile-testing/working-in-the-cucumber-world" target="_blank"&gt;presented&lt;/a&gt; during &lt;a href="http://skillsmatter.com/event/agile-testing/cukeup-2013" target="_blank"&gt;the conference&lt;/a&gt; and we had a nice idea about how to improve my &lt;strong&gt;impersonator pattern&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;There was always one thing…&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.path11.com/post/47177389229</link><guid>http://blog.path11.com/post/47177389229</guid><pubDate>Fri, 05 Apr 2013 09:09:56 +0200</pubDate><dc:creator>ecomba</dc:creator></item><item><title>Kicking ass - The experiment</title><description>&lt;p&gt;At the end of last year we wanted to give you an offer you could not refuse to take, we called it &lt;strong&gt;Kickass 2013&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Our aim was to help people with ideas not to have any excuse to get it out to the market by offering an insanely attractive price.&lt;/p&gt;

&lt;p&gt;The experience has been really nice! We talked to some really nice people and started working on some really nice products.&lt;/p&gt;

&lt;p&gt;Soon we will be reporting more about them, so stay tuned!&lt;/p&gt;

&lt;p&gt;Now that the &lt;strong&gt;kickass deal&lt;/strong&gt; is over we have revamped our site, &lt;a href="http://patheleven.com" target="_blank"&gt;check it out&lt;/a&gt;!&lt;/p&gt;</description><link>http://blog.path11.com/post/42017270670</link><guid>http://blog.path11.com/post/42017270670</guid><pubDate>Fri, 01 Feb 2013 13:10:53 +0100</pubDate><category>kickass2013</category><category>thankyou</category><dc:creator>ecomba</dc:creator></item><item><title>It's out!</title><description>&lt;a href="http://www.ecomba.org/post/40508351368/its-out"&gt;It's out!&lt;/a&gt;: &lt;p&gt;&lt;a href="http://www.ecomba.org/post/40508351368/its-out" class="tumblr_blog" target="_blank"&gt;ecomba&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;span style="float:right;padding-left:1em"&gt;&lt;img src="http://media.tumblr.com/3fe4892d8ddb794fd3fe5fc5a777156b/tumblr_inline_mglw5hQDO11r7vmi2.png" alt=""/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What a frantic weekend!&lt;/strong&gt; Last week I made the bold statement that I wanted to publish my book on Monday. Since then I have been regretting that decision more and more as Monday slowly drew closer. It’s possibly a common thing when you are going to release something that you haven’t done…&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.path11.com/post/40508506895</link><guid>http://blog.path11.com/post/40508506895</guid><pubDate>Mon, 14 Jan 2013 09:35:45 +0100</pubDate><dc:creator>ecomba</dc:creator></item><item><title>Kick some ass in 2013</title><description>&lt;p&gt;2012 was a &lt;strong&gt;great one&lt;/strong&gt; for &lt;a href="http://path11.com" target="_blank"&gt;patheleven&lt;/a&gt;. We got to work with &lt;a href="http://kuotus.com" target="_blank"&gt;some&lt;/a&gt; &lt;a href="http://lyagushka.co.uk" target="_blank"&gt;amazing&lt;/a&gt; &lt;a href="http://poweredbybeam.com" target="_blank"&gt;people&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We &lt;strong&gt;delivered&lt;/strong&gt; great work. We poured ourselves into their mind, their business and their dreams.&lt;/p&gt;

&lt;p&gt;We learned a &lt;a href="http://blog.path11.com/post/36132887259/11-things-we-learned-part-1" target="_blank"&gt;great&lt;/a&gt; &lt;a href="http://blog.path11.com/post/36805681853/11-things-we-learned-part-2" target="_blank"&gt;deal&lt;/a&gt; and experimented with some ideas. Actually experimenting with ideas is in the core of what we do. You see, for us &lt;a href="http://path11.com" target="_blank"&gt;patheleven&lt;/a&gt; is a vessel. A vessel that allows us to be creative and live the lives we want to live.&lt;/p&gt;

&lt;p&gt;Anyhow&amp;#8230; Let&amp;#8217;s get to what we wanted to share with you with this blog post&amp;#8230;&lt;/p&gt;

&lt;p&gt;In the spirit of experimentation we came up (&lt;em&gt;actually it was Sebastian, so you know who to blame if this goes wrong&lt;/em&gt;) with a really crazy idea; start 2013 with an &lt;strong&gt;insanely attractive weekly rate&lt;/strong&gt; and slowly increase our prices during the year.&lt;/p&gt;

&lt;p&gt;This idea was inspired by &lt;em&gt;Jason Sadler&lt;/em&gt; who in 2009 sold an entire year of shirt-wearing, promoting a different company every single day. We loved the concept as we didn&amp;#8217;t know about anyone doing this kind of business and we thought we could apply the same principles to our business.&lt;/p&gt;

&lt;p&gt;The principle is very simple, you will be able to book weeks during the year (&lt;em&gt;we call them iterations&lt;/em&gt;) and we will kick some ass for you!&lt;/p&gt;

&lt;p&gt;The only issue is that we will only be offering bookings at the super reduced price till the &lt;strong&gt;end of February&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;You should &lt;a href="http://path11.com" target="_blank"&gt;checkout our website&lt;/a&gt; and book some time with us so that we can some &lt;strong&gt;kick some ass with you&lt;/strong&gt;!!!&lt;/p&gt;

&lt;h2&gt;&lt;a href="http://path11.com" target="_blank"&gt;What are you waiting for?&lt;/a&gt;&lt;/h2&gt;</description><link>http://blog.path11.com/post/38318506328</link><guid>http://blog.path11.com/post/38318506328</guid><pubDate>Wed, 19 Dec 2012 20:13:31 +0100</pubDate><category>kickass2013</category><category>community</category><category>craftsmanship</category><category>path11</category><category>customers</category><category>service</category><category>work</category><dc:creator>ecomba</dc:creator></item><item><title>We are changing our logo for 2013, this is a fake 3d...</title><description>&lt;img src="http://24.media.tumblr.com/cbdcdc8d1b775e69ff595a60bcbacdd7/tumblr_mf85yxJLfy1rpyq4fo1_r3_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We are changing our logo for 2013, this is a fake 3d representation of what’s about to come…&lt;/p&gt;</description><link>http://blog.path11.com/post/38220560306</link><guid>http://blog.path11.com/post/38220560306</guid><pubDate>Tue, 18 Dec 2012 12:44:00 +0100</pubDate><category>logo</category><category>kickass2013</category><category>design</category><dc:creator>ecomba</dc:creator></item><item><title>Clean cukes: The impersonator pattern</title><description>&lt;p&gt;On our path of writing cleaner code we often forget that the code that is testing that our application  should be clean as well.&lt;/p&gt;

&lt;p&gt;At &lt;a href="http://path11.com" target="_blank"&gt;path11&lt;/a&gt; we try to make sure that every piece of the software we write is &lt;strong&gt;clean&lt;/strong&gt;, &lt;strong&gt;dry&lt;/strong&gt; and &lt;strong&gt;readable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Recently we have been looking with more detail at how we write our &lt;a href="http://cukes.info/" target="_blank"&gt;cucumber&lt;/a&gt; &lt;a href="https://github.com/cucumber/cucumber/wiki/Feature-Introduction" target="_blank"&gt;features&lt;/a&gt; that will drive the acceptance testing of our code.&lt;/p&gt;

&lt;p&gt;When you think about the features in depth there is a recurring theme in them: &lt;em&gt;&lt;strong&gt;you are testing the application assuming the role of a user interacting with the system&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is oftentimes overlooked and you end up with features and scenarios that look like this (&lt;em&gt;I&amp;#8217;m going to use an application I am developing for internal use at path11&lt;/em&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Feature: Logging in
  In order to make sure that the site is secured
  As a path11er
  I want only other path11ers to log into ledger

Scenario: path11er logs in
  Given I am a path11er
  And I am on the landing page
  And I follow "login here"
  Then I should be on the dashboard

 Scenario: anonymous user trying to access
  Given I am an anonymous
  And I am on the landing page
  And I follow "login here"
  Then I should be on the landing page
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are a few problems with the scenario definitions in this feature.&lt;/p&gt;

&lt;p&gt;First I am tying the description of the steps in the scenario to the actual pages the user is &lt;em&gt;&amp;#8220;visiting&amp;#8221;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Secondly, and more importantly &lt;strong&gt;I am NOT concentrating on the real value proposition of this story&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most of the time we overlook what the &lt;strong&gt;real value&lt;/strong&gt; of a feature is and write the cukes in a way that we as &lt;em&gt;developers&lt;/em&gt; understand better.&lt;/p&gt;

&lt;p&gt;A way better approach is to &lt;strong&gt;only&lt;/strong&gt; describe the &lt;em&gt;value proposition&lt;/em&gt; of the feature and hide the &lt;em&gt;implementation details&lt;/em&gt; &lt;strong&gt;inside&lt;/strong&gt; the step definitions (&lt;em&gt;or even better inside an &lt;strong&gt;impersonation&lt;/strong&gt; of the user interacting with the &lt;strong&gt;system under test&lt;/strong&gt;, as we will see later&lt;/em&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Feature: Logging in
  In order to make sure that the site is secured
  As a path11er
  I want only other path11ers to log into ledger

Scenario: path11er logs in
  Given I log into ledger as a path11er
  Then I should be on the dashboard

Scenario: anonymous user trying to access
  Given I log into ledger as an anonymous user
  Then I should be on the landing page
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see this &lt;a href="https://github.com/cucumber/cucumber/wiki/Feature-Introduction" target="_blank"&gt;feature&lt;/a&gt; and the step definitions are coincise and to the point. We (&lt;em&gt;or our customers&lt;/em&gt;) are not interested in the &lt;strong&gt;how&lt;/strong&gt; this is accomplished, but we want to see that the application implements the features we requested.&lt;/p&gt;

&lt;p&gt;Most developers will now implement the step definitions describing how the &lt;strong&gt;browser&lt;/strong&gt; interacts with the application.&lt;/p&gt;

&lt;p&gt;The problem we found by doing so is that we are not impersonating a user and we will have to write redundant step definitions that assure that the user that is interacting at that moment is the user we are interested in.&lt;/p&gt;

&lt;p&gt;We felt that there was some key point missing there, something that would help us to describe our application better. During our &lt;em&gt;inception workshops&lt;/em&gt; we define &lt;a href="http://www.agileweboperations.com/pragmatic-personas-concrete-examples-of-your-users" target="_blank"&gt;personas&lt;/a&gt; that we later relate to when thinking about how to implement the user stories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;These personas where actually &lt;em&gt;the missing link&lt;/em&gt; we needed to change the way we write our cukes.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;Introducing the Impersonation pattern&lt;/h2&gt;

&lt;p&gt;Let&amp;#8217;s first look into the step definitions for the &lt;em&gt;improved&lt;/em&gt; feature we saw earlier:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Transform /^a path11er$/ do |user|
  path11er
end

Transform /^an anonymous user$/ do |user|
  anonymous
end

Given /^I log into ledger as (a path11er|an anonymous user)$/ do |user|
  user.is_in_the_landing_page
  user.login
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is where the &lt;strong&gt;impersonation magic&lt;/strong&gt; is defined.&lt;/p&gt;

&lt;p&gt;We first use &lt;a href="https://github.com/cucumber/cucumber/wiki/Step-Argument-Transforms" target="_blank"&gt;cucumber&amp;#8217;s transformations&lt;/a&gt; to initialize the &lt;strong&gt;impersonation classes&lt;/strong&gt; that will be interacting with the system. This classes are implemented as &lt;strong&gt;modules&lt;/strong&gt; and will sit in the &lt;em&gt;support&lt;/em&gt; directory of your features and &lt;em&gt;included&lt;/em&gt; into the &lt;a href="https://github.com/cucumber/cucumber/wiki/A-Whole-New-World" target="_blank"&gt;world definition&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class LedgerWorld
  # other includes left out for clarity
  include Ledger::Cucumber::User
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let&amp;#8217;s look with more detail into this &lt;strong&gt;impersonator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As we saw earlier in the transformations  the instantiation of the &lt;em&gt;impersonator&lt;/em&gt; will happen in there and is declared like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module Ledger
  module Cucumber
    module User
      def anonymous
        @anonymous ||= AnonymousUser.new(self)
      end

      def path11er
        @path11er ||= Path11er.new(self)
      end
      #…
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you look again into the next step definition we have:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Given /^I log into ledger as (a path11er|an anonymous user)$/ do |user|
  user.is_in_the_landing_page
  user.login
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It becomes obvious what those objects implement:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class AnonymousUser
  def initialize world
    @world = world
  end

  def is_in_the_landing_page
    @world.visit '/'
  end

  def login
    # stubbing of omniauth requests left 
    # out for clarity of the example

    @world.click_link 'login here'
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;em&gt;Path11er&lt;/em&gt; class has a similar declaration as the &lt;em&gt;AnonymousUser&lt;/em&gt; class (&lt;em&gt;although in the real implementation the stubbing of the &lt;a href="https://github.com/intridea/omniauth" target="_blank"&gt;OmniAuth&lt;/a&gt; code is silghtly different in both cases&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;The greatest benefits we have found for implementing our cucumber features like this are:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Our scenarios are much clearer and to the point without unnecessary steps.&lt;/li&gt;
&lt;li&gt;The step definitions make reveal what the user is doing in a clear way and without the details&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;impersonator objects&lt;/strong&gt; help us think as the user interacting with the system at that moment improving the general user experience of the system.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;What are your thoughts on cucumber testing?&lt;/strong&gt; &lt;em&gt;We would love to hear from you and see if we can improve even further the way we test our applications.&lt;/em&gt;&lt;/p&gt;</description><link>http://blog.path11.com/post/37324695474</link><guid>http://blog.path11.com/post/37324695474</guid><pubDate>Thu, 06 Dec 2012 10:35:23 +0100</pubDate><category>code</category><category>cucumber</category><category>acceptance testing</category><category>impersonator pattern</category><category>clean</category><category>testing</category><category>bdd</category><dc:creator>ecomba</dc:creator></item><item><title>11 things we learned (part 2)</title><description>&lt;p&gt;This is the second part of our post &lt;a href="http://blog.path11.com/post/36132887259/11-things-we-learned-part-1" target="_blank"&gt;11 things we learned&lt;/a&gt;, if you haven&amp;#8217;t read &lt;a href="http://blog.path11.com/post/36132887259/11-things-we-learned-part-1" target="_blank"&gt;the first part&lt;/a&gt; we urge you to &lt;a href="http://blog.path11.com/post/36132887259/11-things-we-learned-part-1" target="_blank"&gt;read it first&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Okay, let&amp;#8217;s continue with the things we have learned in this past year then.&lt;/p&gt;

&lt;h2&gt;7. Starting from the UX seems to be the answer.&lt;/h2&gt;

&lt;p&gt;We have found out that when we work on a user story we have a hard time coding it if we don&amp;#8217;t pay attention to the overall user experience.&lt;/p&gt;

&lt;p&gt;We tried coding without going through wireframing and thinking how the flow of the story (or application or the screens) should be and the result is more often than not a mess.&lt;/p&gt;

&lt;p&gt;Coding, although not easy, is the simplest task you can do when implementing a user story. We figured a common workflow of how we work best which has given us pretty good results.&lt;/p&gt;

&lt;p&gt;When we work on a story we usually do the following:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;create a low key wireframe of the flow (&lt;em&gt;for this we use &lt;a href="http://www.apple.com/iwork/keynote/" target="_blank"&gt;Apple&amp;#8217;s Keynote&lt;/a&gt;&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;share that work with the customer (&lt;em&gt;either by sending them a pdf or in most cases share a video over dropbox with our thoughts behind that flow&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;once it is validated we write a &lt;a href="http://cukes.info/" target="_blank"&gt;Cucumber&lt;/a&gt; &lt;a href="https://github.com/cucumber/cucumber/wiki/Feature-Introduction" target="_blank"&gt;Feature&lt;/a&gt; and the accompanying &lt;a href="https://github.com/cucumber/cucumber/wiki/Feature-Introduction" target="_blank"&gt;Scenarios&lt;/a&gt; to have an acceptance test for that user story.&lt;/li&gt;
&lt;li&gt;then we start our TDD/BDD cycle and work on the story and apply a little design to it&lt;/li&gt;
&lt;li&gt;once it is finished we share that with the customer on a staging environment for the app and try to get validation from it.&lt;/li&gt;
&lt;li&gt;once validated we will do some UI magic, revalidate it with the customer and have the story ready&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;We are still refining those processes we do as we go. Maybe this is worth another blog post to share with you our process in more depth (&lt;em&gt;let us know if you&amp;#8217;d like to hear more about it&lt;/em&gt;).&lt;/p&gt;

&lt;h2&gt;8. Short projects make us happier than long projects.&lt;/h2&gt;

&lt;p&gt;We are always looking for new techniques and technologies, we love it!&lt;/p&gt;

&lt;p&gt;We have figured out that, although the projects we do haven&amp;#8217;t been specially long in time (if we compare to those year long projects you can find in more enterprisey environments), we do like projects that are rather shorter than the longer ones better.&lt;/p&gt;

&lt;p&gt;When you start something new it is exciting and you are all hyped about it. This fades away over time as it is hard to keep a group motivated for long.&lt;/p&gt;

&lt;p&gt;Also this has to do with the amount of work we put into the work we do. Unlike other teams that have a slower start into a project we make sure that from the start of the project things move quickly and our customers feel and see that they are getting value for money immediately.&lt;/p&gt;

&lt;p&gt;When a project is really long this is harder to maintain as the value of the things most customers request over time is less valuable to their business.&lt;/p&gt;

&lt;h2&gt;9. Don&amp;#8217;t rely on email communication for difficult conversations&lt;/h2&gt;

&lt;p&gt;We&amp;#8217;ve made this mistake. It&amp;#8217;s an easy one to make. Sometimes you are just tired or you don&amp;#8217;t feel like starting a conversation, and you send an email. That&amp;#8217;s wrong.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s not like if email is wrong, sometimes, and for some easy talk, it is ok to communicate like that. The problem is when you use an email to start a difficult conversation. It&amp;#8217;s always better to call.&lt;/p&gt;

&lt;h2&gt;10. Our market is global&lt;/h2&gt;

&lt;p&gt;When we started path11 a compelling reason to set up the company in spain was that the market in this country is very immature in terms of agility and craftsmanship, or should we say, quality work. We thought that we could offer a great service to spanish customers who are really interested in having great products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We could not have been more wrong&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The spanish market is a whole different kind of fish than the markets we are used to. In Spain you don&amp;#8217;t look for quality, but for the cheapest solution around. It seems that the whole country is in a race towards zero (I will offer less than you and then you offer less than me and at the end no one wins).&lt;/p&gt;

&lt;p&gt;We first thought that it might be that we are just talking to the wrong people, but as time went by we realised that it is a cultural thing, something that is not likely to change in the future.&lt;/p&gt;

&lt;p&gt;The good news is that our services are cheaper than the average high quality development work you find out there in the USA and northern European market, which has won us a deal or two.&lt;/p&gt;

&lt;p&gt;We might be wrong about Spain and the spanish market, so if you are there and need our help just &lt;a href="mailto:info@path11.com" target="_blank"&gt;get in touch with us&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;11. Love your customers&lt;/h2&gt;

&lt;p&gt;One thing you have to realise is that your customers shape your business. The way you interact with them and the way they do with you; what you as a team allow and don&amp;#8217;t allow will set a precedence into future interactions with customers.&lt;/p&gt;

&lt;p&gt;For that reason you have to truly understand your customer if you want a productive working partnership and be really able to provide the maximum value.&lt;/p&gt;

&lt;p&gt;This is why we set up an &lt;em&gt;inception workshop&lt;/em&gt; at the start of every project to know what exactly is in our customers mind. This will give us an initial understanding of the project and the team we will be working with, which helps to gauge and see if the relationship can take us to where we want it to be.&lt;/p&gt;

&lt;p&gt;An &lt;em&gt;inception workshop&lt;/em&gt; is a wonderful tool, but it&amp;#8217;s by far not sufficient if you are wondering. When you are in the service business you have to really start your every day you are giving a service to your customers as a new challenge, focusing on trying to understand your customer, where he is coming from, and trying to offer the best solution that suits you both best.&lt;/p&gt;</description><link>http://blog.path11.com/post/36805681853</link><guid>http://blog.path11.com/post/36805681853</guid><pubDate>Thu, 29 Nov 2012 13:33:46 +0100</pubDate><dc:creator>ecomba</dc:creator></item><item><title>Coffeescript cookbook</title><description>&lt;a href="http://coffeescriptcookbook.com/"&gt;Coffeescript cookbook&lt;/a&gt;: &lt;p&gt;Do you write coffeescript instead of javascript? Are you learning it right now? You should check out this website that offers some recipes for coffeescript. Very useful when your memory is not the best in the world any longer ;)&lt;/p&gt;</description><link>http://blog.path11.com/post/36656863947</link><guid>http://blog.path11.com/post/36656863947</guid><pubDate>Tue, 27 Nov 2012 10:00:52 +0100</pubDate><category>coffescript</category><category>javascript</category><category>interesting</category><category>cookbook</category><category>recipes</category><category>code</category><dc:creator>ecomba</dc:creator></item><item><title>Commands, Queries and RSpec </title><description>&lt;p&gt;Reading part 4 of &lt;em&gt;Growing Object Oriented Software&lt;/em&gt; book has made me think a lot about how I test drive my code. There is a lot of insight in that part of the book about how to write readable and maintainable tests and how to use them to catch design problems.&lt;/p&gt;

&lt;p&gt;One of the tools you have to find those issues are &lt;a href="http://en.wikipedia.org/wiki/Mock_object" target="_blank"&gt;mock objects&lt;/a&gt; and the use you make of them. Depending on whether the method uses collaborator’s &lt;a href="http://en.wikipedia.org/wiki/Command-query_separation" target="_blank"&gt;&lt;em&gt;commands&lt;/em&gt; or &lt;em&gt;queries&lt;/em&gt;&lt;/a&gt; the test should change.&lt;/p&gt;

&lt;p&gt;For those of you who don’t now what &lt;em&gt;commands&lt;/em&gt; and &lt;em&gt;queries&lt;/em&gt; are, it’s just a way of categorize the methods of an object. If the method causes side effects then we call it a &lt;em&gt;command&lt;/em&gt;. If the method doesn’t change anything we call it a &lt;em&gt;query&lt;/em&gt;. Typically commands do not return a useful value while the main purpose of queries is precisely providing information.&lt;/p&gt;

&lt;p&gt;For a long time I’ve being making this distinction while testing my code with RSpec:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;
&lt;p&gt;If the method I am testing needs to call a query on one of the subject-under-test’s dependencies, the test will &lt;em&gt;stub&lt;/em&gt; the value returned by that method. And I will use RSpec’s &lt;a href="https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/method-stubs/stub-with-a-simple-return-value" target="_blank"&gt;&lt;code&gt;stub&lt;/code&gt; and &lt;code&gt;and_return&lt;/code&gt; methods&lt;/a&gt; to do that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the method needs to call a command on one of the subject-under-test’s dependencies the test will assert that call has been made. I will use a &lt;em&gt;mock&lt;/em&gt; object for the dependency and the &lt;a href="https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/message-expectations" target="_blank"&gt;&lt;code&gt;should_receive&lt;/code&gt;&lt;/a&gt; method for the assertion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;That means that if I ever need to use &lt;code&gt;should_receive&lt;/code&gt; and &lt;code&gt;and_return&lt;/code&gt; in a method, something is wrong with my design. The method I am mocking/stubing is both a command and a query and that shouldn’t happen.&lt;/p&gt;

&lt;p&gt;This vision seems pretty aligned with what Steve and Nat say in the book and the use they make of JMock’s &lt;em&gt;allowances&lt;/em&gt; and &lt;em&gt;expectations&lt;/em&gt;. There is a feature I have missed from RSpec though, which is actually used often in the book’s examples: the &lt;em&gt;ignoring&lt;/em&gt; clause.&lt;/p&gt;

&lt;p&gt;When you have a method that sends &lt;em&gt;commands&lt;/em&gt; to two different collaborators then you would end up with a test with two message expectations. Let’s see an example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
def success
  @collaborator1.notify_success
  @collaborator2.handle_success
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That leaves us with two options: either add both message expectations in the same spec or write two separate tests and &lt;em&gt;stub&lt;/em&gt; one message and assert on the other. I don’t like tests with more than one expectation because they end up making diagnosis harder. So I usually &lt;em&gt;stub&lt;/em&gt; the message. You can see an &lt;a href="https://github.com/path11/hexabat/blob/master/spec/hexabat/client_spec.rb#L28" target="_blank"&gt;example&lt;/a&gt; in &lt;a href="https://github.com/path11/hexabat" target="_blank"&gt;a library that we recently open sourced&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This breaks the semantics that I usually give to &lt;code&gt;stub&lt;/code&gt; as I am using it to ignore a &lt;em&gt;command&lt;/em&gt; instead of actually stubbing the return value of a &lt;em&gt;query&lt;/em&gt;. I am going to start aliasing the &lt;code&gt;stub&lt;/code&gt; method to &lt;code&gt;ignore&lt;/code&gt; in my spec helper file so I can write the specs like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
it 'notifies success' do
  @collaborator1.should_receive(:notify_success)
  @collaborator2.ignore(:handle_success)
  subject.success
end

it 'handles success' do
  @collaborator1.ignore(:notify_success)
  @collaborator2.should_receive(:handle_success)
  subject.success
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While this is only a semantic problem makes a huge difference while you are reading the test because it removes the ambiguity &lt;code&gt;stub&lt;/code&gt; usually has.&lt;/p&gt;</description><link>http://blog.path11.com/post/36584610644</link><guid>http://blog.path11.com/post/36584610644</guid><pubDate>Mon, 26 Nov 2012 11:00:36 +0100</pubDate><category>tdd</category><category>goos</category><category>bookclub</category><category>rspec</category><category>mocks</category><dc:creator>j4cegu</dc:creator></item><item><title>rbenv</title><description>&lt;a href="https://github.com/sstephenson/rbenv"&gt;rbenv&lt;/a&gt;: &lt;p&gt;Do you want to be hip again? You know, the cool ruby cats use rbenv now…&lt;/p&gt;

&lt;p&gt;I have been using &lt;a href="https://rvm.io/" target="_blank"&gt;rvm&lt;/a&gt; for a while now, but today I switched to rbenv (just for the chops actually) and like it so far.&lt;/p&gt;

&lt;p&gt;If you miss &lt;a href="https://rvm.io/" target="_blank"&gt;rvm&lt;/a&gt;’s &lt;a href="https://rvm.io/rubies/installing/" target="_blank"&gt;ruby installer&lt;/a&gt; there is a plugin for that: &lt;a href="https://github.com/sstephenson/ruby-build" target="_blank"&gt;ruby-build&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you miss &lt;a href="https://rvm.io/" target="_blank"&gt;rvm&lt;/a&gt;’s &lt;a href="https://rvm.io/gemsets/" target="_blank"&gt;gemsets&lt;/a&gt; there is a plugin for that as well: &lt;a href="https://github.com/jamis/rbenv-gemset" target="_blank"&gt;rbenv-gemset&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.path11.com/post/36581604736</link><guid>http://blog.path11.com/post/36581604736</guid><pubDate>Mon, 26 Nov 2012 09:00:37 +0100</pubDate><dc:creator>ecomba</dc:creator></item><item><title>The Early History Of Smalltalk</title><description>&lt;a href="http://worrydream.com/EarlyHistoryOfSmalltalk/"&gt;The Early History Of Smalltalk&lt;/a&gt;: &lt;p&gt;&lt;a href="http://coreyhaines.com/" target="_blank"&gt;Corey Haines&lt;/a&gt; &lt;a href="https://twitter.com/coreyhaines/status/270900422254919683" target="_blank"&gt;tweeted&lt;/a&gt; this link a few days ago and it’s definitely worth reading!&lt;/p&gt;</description><link>http://blog.path11.com/post/36550180336</link><guid>http://blog.path11.com/post/36550180336</guid><pubDate>Mon, 26 Nov 2012 00:46:00 +0100</pubDate><category>code</category><category>history</category><category>oo</category><category>smalltalk</category><category>interesting</category><dc:creator>ecomba</dc:creator></item><item><title>Old article from Kent Beck about design</title><description>&lt;a href="http://www.threeriversinstitute.org/blog/?p=338"&gt;Old article from Kent Beck about design&lt;/a&gt;: &lt;p&gt;A very interesting read about &lt;strong&gt;&lt;em&gt;Connected and Modular Design&lt;/em&gt;&lt;/strong&gt; which focuses on writing software systems so that the cost of features stays the same over the lifetime of a project/product development.&lt;/p&gt;

&lt;p&gt;If you have read about &lt;strong&gt;&lt;em&gt;Adapters and patterns&lt;/em&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;em&gt;Hexagonal Architectures&lt;/em&gt;&lt;/strong&gt; you should definitely read this article!&lt;/p&gt;</description><link>http://blog.path11.com/post/36425166183</link><guid>http://blog.path11.com/post/36425166183</guid><pubDate>Sat, 24 Nov 2012 14:10:46 +0100</pubDate><category>adapters and protocols</category><category>code</category><category>design</category><category>hexagonal</category><category>interesting things</category><dc:creator>ecomba</dc:creator></item><item><title>The Little Redis Book</title><description>&lt;a href="http://openmymind.net/2012/1/23/The-Little-Redis-Book/"&gt;The Little Redis Book&lt;/a&gt;: &lt;p&gt;We stared recently toying around &lt;a href="http://redis.io/" target="_blank"&gt;redis&lt;/a&gt; when we need some low key store that we can use without much ceremony. I found this little book while searching for some more information about &lt;a href="http://redis.io/" target="_blank"&gt;redis&lt;/a&gt; and found it very instructive and simple to read.&lt;/p&gt;</description><link>http://blog.path11.com/post/36270662496</link><guid>http://blog.path11.com/post/36270662496</guid><pubDate>Thu, 22 Nov 2012 07:57:29 +0100</pubDate><category>code</category><category>data</category><category>redis</category><category>interesting things</category><dc:creator>ecomba</dc:creator></item><item><title>The rake file task</title><description>&lt;p&gt;I have been using rake for at least 2 years now, but it looks like I don&amp;#8217;t know how to get the best of it yet. I watched &lt;a href="https://twitter.com/jimweirich" target="_blank"&gt;Jim Weirich&lt;/a&gt;&amp;#8217;s talk at Goruco 2012 (&lt;a href="http://confreaks.com/videos/988-goruco2012-power-rake" target="_blank"&gt;Power Rake&lt;/a&gt;) and I realized (again) how important it is to know the tools your using.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slow tasks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In one of our projects, we use rake to compile our coffeescript files to one javascript file, and to minimize that javascript file. We do this to speed up the application, but that&amp;#8217;s a different story.&lt;/p&gt;

&lt;p&gt;This approach works fine, but it is somehow slow when your in your development environment and you want to run the app. At that point, we are generating the minified javascript first and then we are launching the app.&lt;/p&gt;

&lt;p&gt;Compiling the javascript takes around 10-20 seconds (depending on how good your computer is. Mine is not the best one), so the server start up is not as fast as we would like it to be.&lt;/p&gt;

&lt;p&gt;This is more or less what how we do it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;task :some_js do
  files = [
    'views/coffee/models/a_model.coffee',
    'views/coffee/models/another_model.coffee',
    'views/coffee/models/one_more_model.coffee',
    'views/coffee/collections/a_collection.coffee',
    'views/coffee/collections/another_collection.coffee',
    'views/coffee/views/a_view.coffee',
    'views/coffee/views/another_view.coffee',
    'views/coffee/views/one_more_view.coffee',
    'views/coffee/views/still_one_more_view.coffee'
    ]
  compile :some_js, files
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The compile method generates the public/js/some_js.js file.&lt;/p&gt;

&lt;p&gt;We have more than one task, since not every part of the application uses the same set of coffeescript files. In total, we have 5 rake tasks like the previous one, and our rake task to compile the coffeescritp and to start the aplication is like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;task :rackup =&amp;gt; ['coffee:some_js', 'coffee:different_js', 'coffee:more_js', 'coffee:a_bit_more_js', 'coffee:some_more_js'] do
  system 'foreman start -p 5000'
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is too slow because it compiles and minifies all the javascript everytime we launch the application, even if we haven&amp;#8217;t changed any of it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File task&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We&amp;#8217;re not the first ones with this problem, and there is already a solution to it in rake (Thanks Jim Weirich!).&lt;/p&gt;

&lt;p&gt;We need to use the &lt;a href="http://onestepback.org/articles/buildingwithrake/filetasks.html" target="_blank"&gt;file task&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;As it says in the documentation, &amp;#8220;If a target file is newer than all its dependencies, then the task actions do not need to execute&amp;#8221;. This is exactly what we want! If nothing changes, don&amp;#8217;t execute the task :)&lt;/p&gt;

&lt;p&gt;We can change our rake tasks to looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;LOT_OF_FILES = FileList[
  'views/coffee/models/a_model.coffee',
  'views/coffee/models/another_model.coffee',
  'views/coffee/models/one_more_model.coffee',
  'views/coffee/collections/a_collection.coffee',
  'views/coffee/collections/another_collection.coffee',
  'views/coffee/views/a_view.coffee',
  'views/coffee/views/another_view.coffee',
  'views/coffee/views/one_more_view.coffee',
  'views/coffee/views/still_one_more_view.coffee'
]

file 'public/js/some_js.js =&amp;gt; LOT_OF_FILES do |t|
  compile t.name, LOT_OF_FILES
end

task :rackup =&amp;gt; ['public/js/some_js.js', 'public/js/different_js.js', 'public/js/more_js.js', 'public/js/a_bit_more_js.js', 'public/js/some_more_js.js'] do
  system 'foreman start -p 5000'
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now, everytime we run our rackup task, it will only compile and minified the coffeescript if we made some changes to it. By default, the app will start without any delay and, even if we change some of the coffeescript, it won&amp;#8217;t compile all of it, only the tasks that need to be updated because of that change, so it will be faster than before.&lt;/p&gt;

&lt;p&gt;I think this is pretty awesome.&lt;/p&gt;</description><link>http://blog.path11.com/post/36202409157</link><guid>http://blog.path11.com/post/36202409157</guid><pubDate>Wed, 21 Nov 2012 11:00:50 +0100</pubDate><category>code</category><category>rake</category><category>slow tasks</category><dc:creator>plagelao</dc:creator></item><item><title>Docco</title><description>&lt;a href="http://jashkenas.github.com/docco/"&gt;Docco&lt;/a&gt;: &lt;p&gt;I found this by pure chance while I was reading some documentation of some open source project. The way some projects are documented (using docco as it happens) always caught my attention and I always wanted us at &lt;strong&gt;path11&lt;/strong&gt; do something like this for our open source projects. Maybe now we don’t have an excuse ;)&lt;/p&gt;</description><link>http://blog.path11.com/post/36199714303</link><guid>http://blog.path11.com/post/36199714303</guid><pubDate>Wed, 21 Nov 2012 09:10:00 +0100</pubDate><category>code</category><category>documentation</category><category>interesting things</category><category>open source</category><dc:creator>ecomba</dc:creator></item><item><title>11 things we learned (part 1)</title><description>&lt;p&gt;&lt;strong&gt;We are one year old!&lt;/strong&gt; Oh, well, this was supposed to go out on our birthday, but it didn&amp;#8217;t&amp;#8230;&lt;/p&gt;

&lt;p&gt;In this post we want to share what we have learned the past year. Some of them are failures and other ones small victories that define what &lt;a href="http://path11.com" target="_blank"&gt;path11&lt;/a&gt; is today.&lt;/p&gt;

&lt;p&gt;As the post was very long we split it into 2 parts. Let&amp;#8217;s start with part 1 then, shall we?&lt;/p&gt;

&lt;h2&gt;1. We like sharing things with the outside world; but we didn’t do a good job at it.&lt;/h2&gt;

&lt;p&gt;We really love reading blog posts, articles and books other people write. In fact we have a part of our daily standup meeting where we share new and interesting things we have discovered. We also love the idea of sharing our experiences, but let&amp;#8217;s be honest, we are really bad at it.&lt;/p&gt;

&lt;p&gt;We get bogged down in our own world (customer projects and other ideas) that we totally forget that sometimes it would be interesting to you, our readers, to know about what we are up to or what we have discovered.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://path11.com" target="_blank"&gt;path11&lt;/a&gt; &lt;em&gt;Zeitgeist&lt;/em&gt; so to say.&lt;/p&gt;

&lt;p&gt;This is something that we are actively working on improving, and we have decided finally to take action about it and post more often.&lt;/p&gt;

&lt;p&gt;In the days to come we hope that you will find more interesting posts here as well as links to the things that catch our attention while learning; what we call &lt;strong&gt;interesting things&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;2. It’s very hard to let co-founders go.&lt;/h2&gt;

&lt;p&gt;You might, or might not know that we let two of our co-founders go during this last year. It was a really hard decision, possibly the hardest one we took.&lt;/p&gt;

&lt;p&gt;When you build a company you build it with the shared dreams and vision from all the founders. During the process you align those and find common denominators that will help the company to shape the way you want it to be shaped.&lt;/p&gt;

&lt;p&gt;If things go well everything seems to flow into the right direction not needing to struggle to much about it (apart from the common problems of running your own company that is).&lt;/p&gt;

&lt;p&gt;The alignment of &lt;a href="http://path11.com" target="_blank"&gt;path11&lt;/a&gt; was broken for some time and we were battling internally very hard to get it moving in the right direction. This led to the inevitable and yet so painful situation of letting go.&lt;/p&gt;

&lt;p&gt;Letting go is hard, it can kill friendships and cause a lot of damage. We really crossed some dark times going through the separation, but at the end we came out of it stronger than before.&lt;/p&gt;

&lt;h2&gt;3. It’s hard to find a sustainable rhythm of work.&lt;/h2&gt;

&lt;p&gt;Everything seems to be urgent when you have a company, but you can not achieve everything even if you work 12 hours a day (&lt;strong&gt;&lt;em&gt;we’ve tried that!&lt;/em&gt;&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Finding our pace is one of the most difficult things we’ve found this year. We are still trying to find it.&lt;/p&gt;

&lt;p&gt;You need time to live your life appart from the company, but yet your company seems your only life sometimes.&lt;/p&gt;

&lt;p&gt;The main problem is that the work you love doing is now shared with the work it takes to run a company. Somehow you don&amp;#8217;t want to give up on coding, or designing a great new user experience for an application, so you set the &lt;em&gt;&lt;strong&gt;business time&lt;/strong&gt;&lt;/em&gt; to after work; result 12+ hours of work.&lt;/p&gt;

&lt;p&gt;This is sometimes not even true, we have another problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our passion&lt;/strong&gt; for developing software makes us stay late at night trying new things or working on internal and even projects for our customers. It&amp;#8217;s something that we cannot leave doing.&lt;/p&gt;

&lt;p&gt;We are still learning to let go and find time to do other things, but it is a hard thing to do. One of the solutions we found to that problem is to have one day a week were one of us has to take off and do something else not &lt;a href="http://path11.com" target="_blank"&gt;path11&lt;/a&gt; related; a one day vacation so to speak.&lt;/p&gt;

&lt;h2&gt;4. Short term can kill you.&lt;/h2&gt;

&lt;p&gt;Day to day work never ends and it’s difficult to focus on middle and long term work. This is possibly a reality for any service company that is still in it&amp;#8217;s infancy as we are.&lt;/p&gt;

&lt;p&gt;Now and then we setup a day when we talk about our medium and long term plans and guess what? &lt;strong&gt;We fail&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We have an amazing product that we prototyped to see if it worked and then we wanted to build it for real (we even mentioned it in twitter). But other priorities seem to pop out of nowhere and the medium term (build this product so that you can use it) get&amp;#8217;s pushed away.&lt;/p&gt;

&lt;p&gt;Possibly it is a matter of making more realistic medium term plans (and make the medium term shorter than it is now), but we are still learning and trying to adapt it to how we work.&lt;/p&gt;

&lt;h2&gt;5. It takes time to mature a vision.&lt;/h2&gt;

&lt;p&gt;It’s hard to keep a vision together for a long time. And harder to let that vision all together.&lt;/p&gt;

&lt;p&gt;When we started &lt;a href="http://path11.com" target="_blank"&gt;path11&lt;/a&gt; we had an idea of what we wanted &lt;a href="http://path11.com" target="_blank"&gt;path11&lt;/a&gt; to be in the future, well, we had many ideas. Some of them where utopias some of them just noise (&lt;em&gt;we had even ideas about being software service company that gives cooking lessons as a service&amp;#8230; go figure&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;The first thing you have to learn is that ideas are just that, ideas. And visions are sometimes just that ideas and &lt;em&gt;&lt;strong&gt;brain-farts&lt;/strong&gt;&lt;/em&gt; (trust us there, we have so many it&amp;#8217;s unreal!).&lt;/p&gt;

&lt;p&gt;The core of what &lt;a href="http://path11.com" target="_blank"&gt;path11&lt;/a&gt; means is still there, unchanged, but what we do and what our longterm vision is has changed a little bit.&lt;/p&gt;

&lt;p&gt;We don&amp;#8217;t set hard monetary targets anymore, but concentrate on the one thing that matters most; &lt;em&gt;&lt;strong&gt;our happiness&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;6. Working remotely works, but it can be hard.&lt;/h2&gt;

&lt;p&gt;A lot has been written in the agile world about working remotely and how it doesn&amp;#8217;t work. In our experience this is untrue.&lt;/p&gt;

&lt;p&gt;Working remotely works. It just requires a different set of things and skills than normal collocated work.&lt;/p&gt;

&lt;p&gt;We spend the whole day in &lt;a href="http://campfirenow.com/" target="_blank"&gt;campfire&lt;/a&gt;, it has become our main hub of communication. Our standups are done in &lt;a href="http://www.skype.com/" target="_blank"&gt;skype&lt;/a&gt; (we started using &lt;a href="https://plus.google.com/" target="_blank"&gt;Google+&lt;/a&gt;, but we had some bandwidth related issues and stopped using it), but the rest of the time we spend in &lt;a href="http://campfirenow.com/" target="_blank"&gt;campfire&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Because of that we keep an eye on how to augment the experience in &lt;a href="http://campfirenow.com/" target="_blank"&gt;campfire&lt;/a&gt;. We have our own instance of &lt;a href="http://hubot.github.com/" target="_blank"&gt;hubot&lt;/a&gt; running (we call him p11) and we constantly add more functionality to it to help us in our day by day tasks.&lt;/p&gt;

&lt;p&gt;p11 will report when someone commits new code, when someone posts a comment on &lt;a href="http://www.uservoice.com/" target="_blank"&gt;uservoice&lt;/a&gt; for one of our customers sites etc. We are currently even building an interface to the project management tool we use at the moment so that we can control it from within &lt;a href="http://campfirenow.com/" target="_blank"&gt;campfire&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All this is not enough though. Even when you trust your team and you work remotely pretty well you still need the contact. For that reason we decided to do periodically &lt;a href="http://path11.com" target="_blank"&gt;path11&lt;/a&gt; retreats where we will meet somewhere for a couple of days and spend time together working and doing other fun stuff together. &lt;em&gt;The last one we did was at the beach and we had &lt;strong&gt;a blast&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The next few things we will leave for part two. In the meantime we hope you will enjoy reading this and the rest of the posts which will come more periodically.&lt;/p&gt;

&lt;p&gt;_~ your &lt;a href="http://path11.com/crafters" target="_blank"&gt;path11 team&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.path11.com/post/36132887259</link><guid>http://blog.path11.com/post/36132887259</guid><pubDate>Tue, 20 Nov 2012 12:18:00 +0100</pubDate><category>retrospective</category><category>coding</category><category>11things</category><category>remoting</category><category>vision</category><category>short term</category><category>co-founders</category><category>sharing</category><dc:creator>path11</dc:creator></item><item><title>RSpec matchers are an underused feature</title><description>&lt;p&gt;In our last two GOOS book club meetings we have being discussing how to make
test driven development &lt;em&gt;sustainable&lt;/em&gt;. That&amp;#8217;s one of the most important parts
of the book. There is a lot of good advice on those pages.&lt;/p&gt;

&lt;p&gt;I have been struck for the emphasis they put on writing readable assertions.
A lot of helper methods are written in the book in order to express really
well the intent of the test and what&amp;#8217;s being tested. This helper methods have
made me think about &lt;a href="https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/custom-matchers" target="_blank"&gt;RSpec matchers&lt;/a&gt; which are seldom used.&lt;/p&gt;

&lt;p&gt;Using this RSpec feature we can make our tests very readable and focused. They
allow us to use the correct language for our assertions. Let&amp;#8217;s review their
advantages using an example from a kata:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;describe 'Roman Numerals' do
  it 'transforms 1 to I' do
    RomanNumeral.from_arabic(1).to_s.should eq 'I'
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is a lot of information in that single line:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;The class that represents the roman numbers.&lt;/li&gt;
&lt;li&gt;The factory method that allows us to transform an arabic number to a roman
one.&lt;/li&gt;
&lt;li&gt;What the string representation of a roman number should be.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Each one of them is a way that spec can end up failing. In other words, each
one of them is a form of coupling. There will also be a lot of duplication
once we start adding more specs.&lt;/p&gt;

&lt;p&gt;Once we have several tests and refactor the spec we will probably have a method like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def roman_for(arabic)
  RomanNumeral.from_arabic(arabic).to_s
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So we can end up with expectations like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;it 'transforms 1 to I' do
  roman_for(1).should eq 'I'
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This reads better and also removes the duplication, but the expectation doesn&amp;#8217;t use the domain language. Let&amp;#8217;s use a Matcher to see how the code is shaped:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RSpec::Matchers.define :be_roman_numeral do |expected|
  match do |arabic|
    RomanNumeral.from_arabic(arabic) == expected
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see creating matcher is really easy: you just need the name and a &lt;code&gt;match&lt;/code&gt; block that returns a boolean value that represents whether the expectation has been met.&lt;/p&gt;

&lt;p&gt;Using the matcher we just built the spec would read like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;it 'transforms 1 to I' do
  1.should be_roman_numeral 'I'
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This version is better. It has all the advantages the helper method had but also allows us to express our expectations using the domain language.&lt;/p&gt;

&lt;p&gt;Definitely RSpec Matchers are a really nice feature. We should use them more often.&lt;/p&gt;</description><link>http://blog.path11.com/post/36057467401</link><guid>http://blog.path11.com/post/36057467401</guid><pubDate>Mon, 19 Nov 2012 10:35:34 +0100</pubDate><category>tdd</category><category>goos</category><category>bookclub</category><category>rspec</category><dc:creator>j4cegu</dc:creator></item><item><title>GOOS Book Club Update</title><description>&lt;p&gt;First things first: we must apologize. Last week we totally forgot to share which chapters we were going to read for yesterday&amp;#8217;s meeting. We are ashamed and we have punished ourselves by using emacs for three days.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_mc2vdaWdUC1r9hw7c.png" alt="pinky punishment"/&gt;&lt;/p&gt;

&lt;p&gt;On yesterday&amp;#8217;s episode of &lt;a href="http://www.growing-object-oriented-software.com" target="_blank"&gt;GOOS&lt;/a&gt; book club &lt;strong&gt;we finished reading and discussing part 3 of the book&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That means we have already covered the example. It has been really awesome to share our experience with you guys. We have discussed a broad set of topics that go from design to UX, and how it affects the development process.&lt;/p&gt;

&lt;p&gt;But &lt;em&gt;there is more&lt;/em&gt;. Now we dive into deep waters. We &lt;strong&gt;start the fourth part of the book&lt;/strong&gt; which talks about being able to test-drive your applications sustainably. This part of the book is really dense and explains the ideas that have been applied during the development of the example. That&amp;#8217;s why we are going to slow down. We know these chapters will trigger very interesting conversations and we don&amp;#8217;t want to miss them because of having only an hour per week.&lt;/p&gt;

&lt;p&gt;If you have been falling behind with your reading now you have the time to catch up. It&amp;#8217;s only a chapter, the first one of a new part of the book. It&amp;#8217;s only 25 pages long. You have no excuses!&lt;/p&gt;

&lt;p&gt;Make sure you have paper by your side. We want &lt;strong&gt;you&lt;/strong&gt; to make questions! We want &lt;strong&gt;you&lt;/strong&gt; to play a bigger role in the book club and help us facilitating it. It&amp;#8217;s a hard duty and we are outsourcing it. :P&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next wednesday at 18:00 GMT&lt;/strong&gt; (20:00 spanish time) &lt;strong&gt;we will discuss chapter 20&lt;/strong&gt;. Ping us &lt;a href="http://twitter.com/path11" target="_blank"&gt;on twitter&lt;/a&gt; if you want to take part.&lt;/p&gt;</description><link>http://blog.path11.com/post/33827060379</link><guid>http://blog.path11.com/post/33827060379</guid><pubDate>Thu, 18 Oct 2012 09:44:41 +0200</pubDate><category>goos</category><category>bookclub</category><dc:creator>j4cegu</dc:creator></item><item><title>Sorry, no book club today</title><description>&lt;p&gt;We are currently spending a few days with limited bandwidth somewhere in the South of Spain, celebrating the end of the Summer and start of the Autumn.&lt;/p&gt;

&lt;p&gt;We checked if we could gather somewhere around a coffee shop, but there is nothing in miles around. So we won&amp;#8217;t be having the book club today. Sorry for the late notice.&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/sebastianpublic/images/no-goos-today.png" width="100%"/&gt;&lt;em&gt;Our first bath at 7:15am this morning&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We see you all next week! We will be looking at Chapter 12, 13 and 14.&lt;/p&gt;

&lt;p&gt;Cheers,
Sebastian&lt;/p&gt;</description><link>http://blog.path11.com/post/32319549942</link><guid>http://blog.path11.com/post/32319549942</guid><pubDate>Wed, 26 Sep 2012 10:17:25 +0200</pubDate><category>goos</category><category>book club</category><dc:creator>sebastianlab</dc:creator></item><item><title>Switching to Vim</title><description>&lt;p&gt;I decided to use to Vim as my main editor in 2012.&lt;/p&gt;

&lt;p&gt;I had it on my list next to other New Year Eve&amp;#8217;s resolutions: &lt;em&gt;getting in shape&lt;/em&gt;, and &lt;em&gt;spend more time with the family&lt;/em&gt;, so you&amp;#8217;ll think that I would have given up by now.&lt;/p&gt;

&lt;p&gt;But I didn&amp;#8217;t.&lt;/p&gt;

&lt;p&gt;Before that I used to spend my time in Emacs and Eclipse. Eclipse for Java and Emacs for the rest. I was happy with my setup. I even wrote a couple of &lt;a href="http://happyprog.com/" target="_blank"&gt;plugins&lt;/a&gt; for Eclipse, and Emacs was a fun environment to work with.&lt;/p&gt;

&lt;p&gt;I considered giving Vim a try because the majority of us at path11 are Vim users, so pairing left one of us at disadvantage, either me in Vim, or them in Emacs.&lt;/p&gt;

&lt;p&gt;But what really got me motivated was asking myself: Am I missing out on something great?&lt;/p&gt;

&lt;p&gt;After 9 months of use, I am really liking the switch. I use Vim for almost everything, everyday.&lt;/p&gt;

&lt;h1&gt;Using Vim&lt;/h1&gt;

&lt;p&gt;Picture this: You are surgeon performing emergency surgery. Laying on the bed is the patient, your code. With very precise moves and using the right tools you quickly slice, extract, and inject new code.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s how I feel when I am using Vim&lt;/p&gt;

&lt;p&gt;&lt;img src="https://s3.amazonaws.com/sebastianpublic/images/my-vim-tooling.png" alt="image"/&gt;&lt;/p&gt;

&lt;p&gt;But the first contact with Vim is rather strange. You have to type &lt;em&gt;i&lt;/em&gt; to insert text. And then type &lt;em&gt;ESC&lt;/em&gt; when you are done. You move around the text with &lt;em&gt;j&lt;/em&gt; and &lt;em&gt;k&lt;/em&gt;. I understand that this stops a lot of people from trying it.&lt;/p&gt;

&lt;p&gt;But I think this is where I find the power in Vim. As a programmer, I spend my time either typing or searching for the right place to insert/fix my code. And Vim optimizes for both scenarios with a &lt;strong&gt;insert&lt;/strong&gt; mode and &lt;strong&gt;command&lt;/strong&gt; mode.&lt;/p&gt;

&lt;p&gt;I made my switch in small steps, learning new commands and tricks everyday. Today, I use vim in my terminal, but I started with &lt;a href="http://code.google.com/p/macvim/" target="_blank"&gt;MacVim&lt;/a&gt; which lets you copy/paste/open/save like any other OSX text editors. It&amp;#8217;s less intimidating.&lt;/p&gt;

&lt;h1&gt;Speaking Vim&lt;/h1&gt;

&lt;p&gt;I find that the majority of the commands are easy to remember. At first, it helped me to spell them out aloud as I was typing them.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;typing: &lt;strong&gt;dw&lt;/strong&gt;, saying: &lt;strong&gt;d&lt;/strong&gt;elete &lt;strong&gt;w&lt;/strong&gt;ord.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;typing: &lt;strong&gt;dtx&lt;/strong&gt;, whispering: &lt;strong&gt;d&lt;/strong&gt;elete &lt;strong&gt;t&lt;/strong&gt;ill an &lt;strong&gt;x&lt;/strong&gt; is found on this line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;typing &lt;strong&gt;ctx&lt;/strong&gt;, murmuring: &lt;strong&gt;c&lt;/strong&gt;hange &lt;strong&gt;t&lt;/strong&gt;ill an &lt;strong&gt;x&lt;/strong&gt; is found.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;typing &lt;strong&gt;ci&amp;#8221;&lt;/strong&gt;, whispering: &lt;strong&gt;c&lt;/strong&gt;hange code &lt;strong&gt;i&lt;/strong&gt;nside the quotes. One of my favorites.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;typing &lt;strong&gt;f0r1&lt;/strong&gt;, shouting: &lt;strong&gt;f&lt;/strong&gt;ind the &lt;strong&gt;0&lt;/strong&gt;, &lt;strong&gt;r&lt;/strong&gt;eplace it with a &lt;strong&gt;1&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h1&gt;Extending Vim&lt;/h1&gt;

&lt;p&gt;The ecosystem of plugins is as big as the universe. With package installers like &lt;a href="https://github.com/gmarik/vundle" target="_blank"&gt;Vundle&lt;/a&gt; or &lt;a href="https://github.com/tpope/vim-pathogen" target="_blank"&gt;Pathogen&lt;/a&gt;, it&amp;#8217;s super easy to extend vim in any way you want.&lt;/p&gt;

&lt;p&gt;I personally use Vundle, but I have heard great things about Pathogen.&lt;/p&gt;

&lt;p&gt;Here is my top 3 list of plugins I use everyday&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/kien/ctrlp.vim" target="_blank"&gt;crtlp&lt;/a&gt; is how I search for files in my projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/scrooloose/syntastic" target="_blank"&gt;syntastic&lt;/a&gt; helps me commit less mistakes by checking my syntax every time I save a file. It compiles the majority of files that I use everyday: ruby, coffeescript, javascript, sass, python, you name it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/vim-scripts/dwm.vim" target="_blank"&gt;dwm&lt;/a&gt; is how I organize my buffers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Special mention to &lt;a href="https://github.com/tpope/vim-surround" target="_blank"&gt;surround&lt;/a&gt;. I am learning it this week. It&amp;#8217;s a super fast way to insert/change tags and quotes that surround your text.&lt;/p&gt;

&lt;p&gt;Looking for more? I keep my list &lt;a href="https://github.com/sbastn/dotfiles/blob/master/.vimrc" target="_blank"&gt;here&lt;/a&gt; starting on line ~30.&lt;/p&gt;

&lt;h1&gt;What am I Missing&lt;/h1&gt;

&lt;p&gt;I run into problems when working with clojure on Vim. I can&amp;#8217;t get it to work, so I go back to Emacs for that.&lt;/p&gt;

&lt;p&gt;I now have Emacs running &lt;a href="http://emacswiki.org/emacs/Evil" target="_blank"&gt;Evil&lt;/a&gt; which allows me to reuse my insert/command modes fu.&lt;/p&gt;

&lt;h1&gt;Switching to Vim&lt;/h1&gt;

&lt;p&gt;Want to give Vim a chance? Here is a starting list of things to consider:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;Understand how to customize and grow your environment. Don&amp;#8217;t copy blindly the configuration from your Vim uber hacker friend. With package managers like &lt;a href="https://github.com/gmarik/vundle" target="_blank"&gt;Vundle&lt;/a&gt; or &lt;a href="https://github.com/tpope/vim-pathogen" target="_blank"&gt;Pathogen&lt;/a&gt;, it&amp;#8217;s easy to get started.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start with a graphical interface to make it less painful. On OSX, I recommend &lt;a href="http://code.google.com/p/macvim/" target="_blank"&gt;MacVim&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don&amp;#8217;t use the arrow keys to move around. Yes, it&amp;#8217;s weird the first half hour. Moving &lt;strong&gt;is&lt;/strong&gt; a command, so you can combine commands: &amp;#8220;1jf1r0&amp;#8221; Jump 1 line down, find the 1 and replace it with 0.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memorize a couple of new commands everyday.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Give it a honest try for a month.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Happy Vimin&amp;#8217;&lt;/p&gt;</description><link>http://blog.path11.com/post/31975273572</link><guid>http://blog.path11.com/post/31975273572</guid><pubDate>Fri, 21 Sep 2012 09:47:22 +0200</pubDate><dc:creator>sebastianlab</dc:creator></item></channel></rss>
