<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1065021148863448965</id><updated>2012-01-04T16:13:22.948-08:00</updated><category term='scrum agile motivation pink mastery autonomy purpose flex rest javascript'/><category term='mobile testing test continuous integration ios android robolectric KIF keep it functional'/><category term='sproutcore 2.0 template views &apos;sproutcore 2.0&apos;'/><category term='tdd bdd test first development software generalizing specialist'/><category term='agumentation thinking collaboration work software development recognized'/><category term='lean software development feature injection'/><title type='text'>Sebastien's Engineering Corner</title><subtitle type='html'>Opinions on software engineering</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-7075830981275622740</id><published>2012-01-04T16:05:00.000-08:00</published><updated>2012-01-04T16:11:29.651-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile testing test continuous integration ios android robolectric KIF keep it functional'/><title type='text'>Mobile Application Testing</title><content type='html'>&lt;span style="font-size:180%;"&gt;iOS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For iOS, I use the excellent KIF from Square inc. : &lt;a href="https://github.com/square/KIF"&gt;https://github.com/square/KIF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Although it uses private APIs, it is still very valuable and run fast. It can also run headless on the simulator (think CI server)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Android&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here Robolectric from Pivotal Labs is your friend : &lt;a href="https://github.com/pivotal"&gt;https://github.com/pivotal&lt;/a&gt;/robolectric&lt;br /&gt;&lt;br /&gt;This framework is great because it does not run on the Dalvik VM but as a regular JUnit test suite, that means speed, speed and easy integration in CI.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-7075830981275622740?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/7075830981275622740/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=7075830981275622740' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/7075830981275622740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/7075830981275622740'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2012/01/mobile-application-testing.html' title='Mobile Application Testing'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-5452743575785568508</id><published>2011-07-29T09:35:00.000-07:00</published><updated>2011-07-29T09:42:38.324-07:00</updated><title type='text'>REST API Testing with Cucumber</title><content type='html'>To test an API we are working on, I wanted to document/test the API so that client developers would be able to use theses specification to learn how to use the API and the same documentation would be used to test our API.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After some research, I settled (for now) to use Cucumber, &lt;a href="https://github.com/collectiveidea/json_spec"&gt;json_spec&lt;/a&gt; and &lt;a href="https://github.com/jayzes/cucumber-api-steps"&gt;cucumber-api-steps&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These allow me to write this kind of test against the API:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;code&gt;Feature: User API&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;  Background:&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    Given the following users exist:&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;      | id | name | password | email |&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;      | 1  | ben      | abcdef | ben@email.com |&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;      | 2  | jon      | bcdefg | jon@email.com |&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    When I sign in as "ben@email.com/abcdef"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    And I send and accept JSON&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;  Scenario: GET /users&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    When I send a GET request for "/users"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    Then the response status should be "200"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    And the JSON should be:&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;      """&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;      [&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;         {&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;          "email": "ben@email.com",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;          "name": "ben"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;        },&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;        {&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;          "email": "jon@email.com",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;          "name": "jon"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;         }&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;       ]&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    """ &lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    And the JSON at "0/name" should be "ben"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    Scenario: GET users/1&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    When I send a GET request for "/users/1"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    Then the response status should be "200"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    And the JSON should be:&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;      """&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;        {&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;          "email": "ben@email.com",&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;          "name": "ben"&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;        }&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    """&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;    And the JSON at "name" should be "ben"&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-5452743575785568508?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/5452743575785568508/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=5452743575785568508' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/5452743575785568508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/5452743575785568508'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2011/07/rest-api-testing-with-cucumber.html' title='REST API Testing with Cucumber'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-5214633051783527043</id><published>2011-07-08T22:22:00.000-07:00</published><updated>2011-07-09T08:50:05.700-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sproutcore 2.0 template views &apos;sproutcore 2.0&apos;'/><title type='text'>Sproutcore 2.0, Templates and Datastore</title><content type='html'>With Sproutcore 2.0, there are different ways to use the template views :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Define a view template in the header of a page, define its View class and instantiate it from the body of the page&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Define a template in the body of the page and have it refer to its View class&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Template in the &amp;lt;head&amp;gt; of the page&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;In the HTML:&lt;/div&gt;&lt;div&gt;  &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/html" data-template-name="account"&amp;gt;&lt;br /&gt;MODE:{{mode}}&lt;br /&gt;&amp;lt;h1&amp;gt;{{username}}&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;{{city}}&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;script type="text/html" data-view="App.MyView"&amp;gt;&lt;br /&gt;&amp;lt;h1&amp;gt;Hello world! {{title}}&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/html"&amp;gt;&lt;br /&gt;{{view App.AccountView}}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;In the javascript:&lt;/span&gt;&lt;/h4&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;App.AccountView = SC.View.extend({&lt;br /&gt;templateName: 'account',&lt;br /&gt;usernameBinding: 'App.accountController.content.username',&lt;br /&gt;cityBinding: 'App.accountController.content.city',&lt;br /&gt;mode: 'DEV'&lt;br /&gt;});&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;Template in the &amp;lt;body&amp;gt; of the page&lt;/h2&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;In the HTML:&lt;/div&gt;&lt;div&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt; &amp;lt;script type="text/html" data-view="App.MyView"&amp;gt;&lt;br /&gt;   &amp;lt;h1&amp;gt;Hello world! {{title}}&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;In the javascript:&lt;/span&gt;&lt;/h4&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;App.MyView = SC.View.extend({&lt;br /&gt; mouseDown: function() {&lt;br /&gt;   window.alert("hello world!");&lt;br /&gt; },&lt;br /&gt; title: 'HELLO',&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;h2&gt;Adding the datastore&lt;/h2&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;TBD&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Source code&lt;/div&gt;&lt;div&gt;app.js&lt;/div&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;var App = SC.Application.create({&lt;br /&gt;store: SC.Store.create().from(SC.Record.fixtures)&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;App.MyView = SC.View.extend({&lt;br /&gt;mouseDown: function() {&lt;br /&gt;window.alert("hello world!");&lt;br /&gt;},&lt;br /&gt;title: 'HELLO',&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;App.Account = SC.Record.extend({&lt;br /&gt;username: SC.Record.attr(String),&lt;br /&gt;city: SC.Record.attr(String)&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;App.Account.FIXTURES = [ { username: 'bilou', city: 'new york' } ]&lt;br /&gt;&lt;br /&gt;App.accountController = SC.Object.create({&lt;br /&gt;content: SC.Object.create({ username: 'TEST', city: 'San Francisco' }),&lt;br /&gt;city: 'SF'&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;App.AccountView = SC.View.extend({&lt;br /&gt;templateName: 'account',&lt;br /&gt;usernameBinding: 'App.accountController.content.username',&lt;br /&gt;cityBinding: 'App.accountController.content.city',&lt;br /&gt;mode: 'DEV'&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;SC.$(document).ready(function(){&lt;br /&gt;var account = App.store.find(App.Account);&lt;br /&gt;App.accountController.content = account.objectAt(0);&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-5214633051783527043?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/5214633051783527043/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=5214633051783527043' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/5214633051783527043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/5214633051783527043'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2011/07/sproutcore-20-templates-and-datastore.html' title='Sproutcore 2.0, Templates and Datastore'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-4533397770923356234</id><published>2010-12-01T09:19:00.000-08:00</published><updated>2010-12-01T09:39:40.114-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scrum agile motivation pink mastery autonomy purpose flex rest javascript'/><title type='text'>Mastery Autonomy Purpose - 1</title><content type='html'>These three pillars of motivation as defined by D. Pink seem to be a perfect canvas for evaluating one's motivation status.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's apply it to my previous jobs:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Mastery&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;HTTP, REST API, Restlet framework (+ implemented security customizations)&lt;/li&gt;&lt;li&gt;Spring, JMS&lt;/li&gt;&lt;li&gt;OAuth, Web security&lt;/li&gt;&lt;li&gt;AndroMDA : model driven application and code generation UML -&gt; DB-Java-Hibernate&lt;/li&gt;&lt;li&gt;Flex / Actionscript : implemented a video player and composable widgets, integration with browser plugin&lt;/li&gt;&lt;li&gt;Messaging : ActiveMQ, RabbitMQ&lt;/li&gt;&lt;li&gt;Cloud computing: Amazon Web Services, Rightscale, Engine yard&lt;/li&gt;&lt;li&gt;Javascript client side: ajax, jQuery&lt;/li&gt;&lt;li&gt;Video : playback using streaming, pseudo-streaming, download / Wowza Media Server&lt;/li&gt;&lt;li&gt;Ruby on Rails : proof of concept projects, selection and integration of all plugins needed to cover our needs &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Autonomy&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Agile methodology : the team is at the core and drives the project, user stories, sprint&lt;/li&gt;&lt;li&gt;Scrum : everyone involved/committed as a team (product, qa, dev), daily standup&lt;/li&gt;&lt;li&gt;Collective design of architecture and technical challenges&lt;/li&gt;&lt;li&gt;Collaborative management of issues, removal of blockers, celebration&lt;/li&gt;&lt;li&gt;Involved in the hiring process when building the team&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Purpose&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Technically innovative and challenging&lt;/li&gt;&lt;li&gt;Video is fun&lt;/li&gt;&lt;li&gt;Engineering was core to the business&lt;/li&gt;&lt;li&gt;Excellent team, common goal and investment&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-4533397770923356234?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/4533397770923356234/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=4533397770923356234' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/4533397770923356234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/4533397770923356234'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2010/12/mastery-autonomy-purpose-1.html' title='Mastery Autonomy Purpose - 1'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-6255779507980805521</id><published>2010-08-13T21:04:00.000-07:00</published><updated>2010-08-13T21:11:12.470-07:00</updated><title type='text'>Personal Kanban and Pomodoro technique</title><content type='html'>For a few weeks now, I've been using both a personal Kanban board and the Pomodoro technique. &lt;br /&gt;I've been using the Pomodoro technique for a little while now and I really appreciate the gains in term of productivity and focus. &lt;br /&gt;The satisfaction of getting the things done more efficiently feels great. The breaks are fully appreciated: they allow me to rest my shoulders and back as well as to deal with the 'noise' : emails, twitter, etc.&lt;br /&gt;&lt;br /&gt;The personal kanban board helps me and my coworkers to visualize what I'm working on. I limit my work in progress and see at any moment what I've accomplished, what's left for the current timeframe.&lt;br /&gt;&lt;br /&gt;I invite you to try these tools to enhance your day to day work and feel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-6255779507980805521?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/6255779507980805521/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=6255779507980805521' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/6255779507980805521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/6255779507980805521'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2010/08/personal-kanban-and-pomodoro-technique.html' title='Personal Kanban and Pomodoro technique'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-2478700937540482496</id><published>2009-08-09T19:13:00.000-07:00</published><updated>2009-08-09T19:36:19.826-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lean software development feature injection'/><title type='text'>Lean Software Development and Features Injection</title><content type='html'>I recently discovered '&lt;a href="http://www.infoq.com/news/2009/05/feature-injection-comics"&gt;Feature injection&lt;/a&gt;' and started to apply it in my daily work for part of the project. So far I really enjoyed it and did not find a major flaw in the process.&lt;br /&gt;Lean Software Development resonate as common sense, organized way of getting the work done efficiently.&lt;br /&gt;&lt;br /&gt;Here is what I retained of it:&lt;br /&gt;1- WHY? : Find the value that you want your product to generate for your user, generally this value allows the user to save time or money, gain productivity, have fun, or event better: be really good at what he is doing using your product ("kick ass user of Y").&lt;br /&gt;&lt;br /&gt;2- WHAT? : What are the outputs that represent or give this value to the user ?&lt;br /&gt;&lt;br /&gt;3- HOW? : How do you process to get these outputs ? which features produce them ? what are the inputs needed? Build the model during analysis, list all questions and answers, some questions may get an answer later in the process.&lt;br /&gt;&lt;br /&gt;At this point we have :&lt;br /&gt;OUTPUTs &lt;- Feature(Process + Model) &lt;- INPUTs&lt;br /&gt;&lt;br /&gt;4- Write Feature Tests : for each feature injected we can implement the tests that will pass when the feature is done&lt;br /&gt;&lt;br /&gt;5- Analysis and Design of features allow us to Write Unit Tests&lt;br /&gt;&lt;br /&gt;6- Implement code to green our Unit Tests, then our Feature Tests : at this point the features that are DONE are ready for final review and release in production&lt;br /&gt;&lt;br /&gt;The implementation followed the inverse direction of the analysis so we implemented only what was really needed to produce the outputs that have a value for the user. &lt;br /&gt;&lt;br /&gt;Only the necessary features were injected into the system!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-2478700937540482496?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/2478700937540482496/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=2478700937540482496' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/2478700937540482496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/2478700937540482496'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2009/08/lean-software-development-and-features.html' title='Lean Software Development and Features Injection'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-2999611770016916298</id><published>2009-07-15T14:05:00.000-07:00</published><updated>2009-07-15T14:17:22.922-07:00</updated><title type='text'>The quest of beauty out of the box</title><content type='html'>In my software engineering work as in all my creations, I want to create beauty. It's the common quest of all creative human beings, I guess. This quest gives a meaning to my actions. I appreciate to create and invent things that I can be proud of and to achieve that I have to let my passion for beautiful creation express itself. Every day I try to remember that no matter what I'm doing I can do it in a way that fullfill my needs to create, innovate, build, enhance. I truly believe that the more beauty you create, the more you receive/see.&lt;br /&gt;&lt;br /&gt;It goes the same with happiness: the more happy you make others, the more you are happy yourself !&lt;br /&gt;Ok, easy to say harder to actually do. But if I remind to stay out of the box (when will the french translation of &lt;a href="http://www.amazon.com/Anatomy-Peace-Resolving-Heart-Conflict/dp/1576753344"&gt;"Anatomy of peace"&lt;/a&gt;  - Arbinger, will come out ?), life is clearer and much more enjoyable.&lt;br /&gt;At work, with my family and friends, if I manage to stay out of the box, I feel that I can be really myself and feel good about what I am and what I do. Never betray yourself and you'll be happy. Understand your feelings and you'll be able to go out of the box and stay out !&lt;br /&gt;Sounds simple too, I will read and reread again "Anatomy of peace", this book was really a keystone for my life and how I see the world of human beings.&lt;br /&gt;&lt;br /&gt;Read you later, I have to create some new nice things today to keep my creative mind happy !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-2999611770016916298?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/2999611770016916298/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=2999611770016916298' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/2999611770016916298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/2999611770016916298'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2009/07/quest-of-beauty-out-of-box.html' title='The quest of beauty out of the box'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-4843786148140621006</id><published>2009-06-14T08:09:00.000-07:00</published><updated>2009-06-14T11:26:49.481-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agumentation thinking collaboration work software development recognized'/><title type='text'>Argumentation or Collaborative thinking</title><content type='html'>Something I'm not missing at all since I work in California is the apparent need for french workers to argue and win the argument.&lt;br /&gt;For example, in our US company, when we are in a technical meeting, the common goal for everyone is to come up collectively with the best solution for the product we are building. In France the individual goal for each of the participant would be to expose its arguments and argue until they are accepted by the others or until they surrender : the goal is to win the argument ! The product interest is almost completely out of the picture !&lt;br /&gt;&lt;br /&gt;The collaborative approach has obviously a very good impact on the quality of the product, in the team spirit, in the sustainability of the efforts that will be deployed to achieve the common goal.&lt;br /&gt;Another great side effect of the collaborative approach vs the arguing one, is that the focus is on the ideas and their suitability to the project/goal, therefore the 'ego' of each participant remains out of the target of the argumentation. If I'm not theatened in my self-estim/ego, I can feel free to suggest new ideas to feed the discussion thus the discussion is richer and more productive.&lt;br /&gt;&lt;br /&gt;This leads me to one of the best discovery I've made while working at Veodia : it is actually possible to be recognized and appreciated for your skills and work by your colleague ! Coming after 10 years working in french companies, it sounds revolutionnary. The first time I received an appreciation email from one of my colleague, it completely blew my mind. Since then, I've felt free to express my appreciation of my colleagues work and free as well to express my concerns about it without being afraid of their reaction.&lt;br /&gt;This is an enormous liberation and way of progress. Seeing thing positively, expressing your appreciation of one's work made me feel that I could grow professionnaly in a very happy way.&lt;br /&gt;&lt;br /&gt;That spirit made me feel eager to join the team every morning to continue the adventure of building our platform : the joy to go to work !&lt;br /&gt;&lt;br /&gt;Update: just read great article on pair programming http://misko.hevery.com/2009/06/12/what-pair-programing-is-not/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-4843786148140621006?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/4843786148140621006/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=4843786148140621006' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/4843786148140621006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/4843786148140621006'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2009/06/ego-argumentation-or-collaborative.html' title='Argumentation or Collaborative thinking'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-7697220223826375255</id><published>2009-06-08T08:28:00.000-07:00</published><updated>2009-06-08T08:39:39.563-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tdd bdd test first development software generalizing specialist'/><title type='text'>Generalizing specialist objectives</title><content type='html'>New objectives to grow my skills in the art of software development :&lt;br /&gt;- Implement executable tests first at every level : acceptance. functional, unit&lt;br /&gt;cf. &lt;a href="http://www.davenicolette.net/articles/changing-roles.html"&gt;"Changing roles"&lt;/a&gt;&lt;br /&gt;cf. &lt;a href="http://www.davenicolette.net/articles/functional_tdd.html"&gt;"Functional TDD"&lt;/a&gt;&lt;br /&gt;- Executable tests of UI layer as well as underlying layers&lt;br /&gt;- Continue to become a better generalizing specialist : cf. &lt;a href="http://www.agilemodeling.com/essays/generalizingSpecialists.htm"&gt;"Generalizing specialist"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Implementing executable tests &lt;span style="font-weight:bold;"&gt;first&lt;/span&gt;, leads to :&lt;br /&gt;- better understanding of requirements (acceptance tests)&lt;br /&gt;- better design of functionalities (functional tests)&lt;br /&gt;- better design and implementation (unit tests)&lt;br /&gt;Making them &lt;span style="font-weight:bold;"&gt;executable&lt;/span&gt; brings :&lt;br /&gt;- easier regression testing&lt;br /&gt;- better maintainability&lt;br /&gt;&lt;br /&gt;That makes a great program for an enthusiast software engineer &lt;br /&gt;eager to become a better generalizing specialist !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-7697220223826375255?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/7697220223826375255/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=7697220223826375255' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/7697220223826375255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/7697220223826375255'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2009/06/generalizing-specialist-objectives.html' title='Generalizing specialist objectives'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1065021148863448965.post-2575637048063798122</id><published>2009-04-28T11:07:00.000-07:00</published><updated>2009-04-28T11:18:15.894-07:00</updated><title type='text'>UI Model and separation of concern</title><content type='html'>While reading the excellent &lt;a href="http://tinyurl.com/c6y5ob"&gt;"Beautiful Architecture"&lt;/a&gt;, I found the concepts used by LPS Creator Studio around UI and UI Model very interesting. So I started the implementation of a sample actionscript framework to validate my feelings about this architecture.&lt;br /&gt;So far, I've created Properties (StringProperty, BooleanProperty, CommandProperty) and one form (RegistrationForm). I also started a RegistrationCanvas which represents the 'screen'part : pure UI, no behavior.&lt;br /&gt;&lt;br /&gt;The UI elements on the screen are driven through binding to the form and its properties so the UI can stay 'dumb'.&lt;br /&gt;The form gathers the properties and is in charge of the UI business logic : validation, flow, command launching.&lt;br /&gt;&lt;br /&gt;I like the separation of concerns that this architecture brings and the fact that it will allow to write unit tests easily for the UI model.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1065021148863448965-2575637048063798122?l=spinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spinside.blogspot.com/feeds/2575637048063798122/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1065021148863448965&amp;postID=2575637048063798122' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/2575637048063798122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1065021148863448965/posts/default/2575637048063798122'/><link rel='alternate' type='text/html' href='http://spinside.blogspot.com/2009/04/ui-model-and-separation-of-concern.html' title='UI Model and separation of concern'/><author><name>splisson</name><uri>http://www.blogger.com/profile/16276717644203422741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='31' height='21' src='http://3.bp.blogspot.com/_4HIGCR28xnw/TU4cm5lbWxI/AAAAAAAAG-4/VtlfTGfS_pU/s220/seb_ski_tahoe_porrtait.jpg'/></author><thr:total>0</thr:total></entry></feed>
