Build Blog Posts http://pages.kiva.org/buildkivablog/rss.xml en How We Moved from Subversion to Git / GitHub http://pages.kiva.org/buildkivablog/2012/04/10/how-we-moved-from-subversion-to-git-github <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"> <p>In February and March, 2012, Kiva moved from Subversion to Git. We&#39;re six years old and have used Subversion from the beginning. For a few years, there has been a growing urge to move to Git. Engineers had a mixture of reasons, but I think it was mostly wanting to use the newest, coolest thing. We didn&#39;t have a &quot;Git wizard&quot;, but a few of us had used it before in various contexts.</p> <p><a href="https://github.com/">GitHub</a> is just a few blocks from Kiva in San Francisco, so I contacted them and we had a field trip. I had seen <a href="http://scottchacon.com/">Scott Chacon</a> speak at <a href="http://zendcon.com/">ZendCon 2011</a>, and he seemed like a friendly, generous, and smart guy. Scott welcomed us into their office, showed us around, talked with us about GitHub and Git, shared our pizza, and answered our questions.</p> <p>We finally decided to go for it. Our engineering leads designated me to own the project -- I had as much experience as anyone with Git. It took me two months to get us fully migrated.</p> <p><strong>Deciding on a Workflow</strong><br /> <br /> Our Subversion workflow was:</p> <ol class="c8" start="1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; font-size: 15px; line-height: normal; list-style-type:decimal; "> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Code for about 7 days on the &quot;main&quot; branch</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Copy that branch to a release branch, begin the QA phase</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> QA / regression / bug fixes for about 2 days</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Do a production release, which meant to start pointing prod at the new release branch</li> </ol> <p><br /> Git enables a wide variety of workflows. We decided to keep our workflow as similar as possible while changing the revision control tool. As a model, we mostly used Vincent Driessen&#39;s &quot;<a href="http://nvie.com/posts/a-successful-git-branching-model/">A successful Git branching model</a>&quot;, with a sprinkle of <a href="http://scottchacon.com/2011/08/31/github-flow.html">GitHub Flow</a>.</p> <p><strong>Choosing GitHub</strong><br /> <br /> For our workflow, we needed to designate a &quot;central repository&quot; equivalent to our self-hosted Subversion one. We decided to go with a GitHub <a href="https://github.com/blog/674-introducing-organizations">Organization</a>. This allowed us to have private repositories, manage our users, and access all of GitHub&#39;s awesome features including <a href="http://help.github.com/send-pull-requests/">Pull Requests</a> for code review / collaboration and its <a href="https://github.com/blog/612-introducing-github-compare-view">diff viewer</a> (with comments). Also, GitHub has <a href="https://github.com/blog/831-issues-2-0-the-next-generation">Issues</a> for issue tracking, and we are considering using it instead of our current tracker, Redmine.</p> <p><strong>Migration Gameplan</strong><br /> <br /> At Kiva, we have a primary codebase where most engineers do their work. But we also have a number of smaller repos that only one or two people work on at a given time. We started by taking one of those repos and moving it completely over to Git, including:</p> <ol class="c8" start="1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; font-size: 15px; line-height: normal; list-style-type:decimal; "> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Clone the repo from Subversion to Git</li> <li class="c0 c6" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Put the repo on GitHub</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Have the engineer spend the iteration working with the Git repo</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Change all the deployment scripts to use the GitHub origin repo</li> </ol> <p><br /> In the end, we had a four-phase migration, each phase taking an iteration (two weeks):</p> <ol class="c8" start="1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; font-size: 15px; line-height: normal; list-style-type:decimal; "> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Migrate one small repo / app, end to end</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Migrate a second small repo, continuing to learn and iron out details</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Prepare documentation, timeline, rollout strategy, and communication for migrating the primary Kiva repo</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Primary repo migration which involved all engineers; (also migrate our other small remaining repos)</li> </ol> <br /> The timing worked out well since we did the main repo migration during <a href="http://blog.build.kiva.org/buildkivablog/2011/02/10/kiva-engineering-innovation-iteration">Innovation Iteration</a>.<br /> <br /> <strong>Steps to Move a Repository</strong><br /> <br /> <p>I followed <a href="http://help.github.com/import-from-subversion/">these instructions</a> to use <span class="c7" style="font-family: 'Courier New'; ">git svn clone</span> to replay the Subversion history into a Git repo and put it on GitHub.</p> <p>For our main repo, I took the additional step of creating an svn post-commit hook to do a<span class="c7" style="font-family: 'Courier New'; ">git svn rebase / git push</span>to keep the GitHub repo up-to-date while engineers continued committing to the Subversion repo. This allowed me to migrate over back-end pieces, like deployment scripts and CI, while engineers continued using Subversion.</p> <p>Migrating the deployment scripts to use Git was fairly straightforward -- replacing<span class="c7" style="font-family: 'Courier New'; ">svn co / svn up</span>references to<span class="c7" style="font-family: 'Courier New'; ">git clone / git pull</span>. The only gotcha I encountered was how Subversion allows empty directories but Git does not -- but there are well-documented workarounds.</p> <p>Migrating a repository took place over one two-week iteration. In the middle of the iteration, normal work happened in Git, while production hotfixes happened in Subversion. When we created the next release branch in Git, I changed the QA deployment scripts to use it. Just before doing the production push, I changed the production deployment scripts to track the Git master branch.</p> <p><strong>Other Behind-the-Scenes Work</strong><br /> <br /> Our Subversioncommits triggered emails to engineers with files changed and diffs. I replicated this for Git using GitHub&#39;s Post-Receive URL Service Hook in conjunction with a small script I wrote to grab the related patch file from GitHub (<a href="https://github.com/rails/rails/commit/67b2404cf9b2c7e0f86bf0294571ef97391a6dcd.patch">see here</a> for example) and email it out. When researching how to solve this problem, I was impressed by the options available for automating tasks in GitHub using the Post-Receive URLs, static patch file urls, and the <a href="http://develop.github.com/">GitHub API</a>.</p> <p>We use Redmine for bug tracking and have a syntax in our commit messages that triggers a homemade script to update Redmine tickets. Kevin, another engineer,replicated this using built-in Redmine change support and the <a href="https://github.com/koppen/redmine_github_hook">redmine_github_hook</a>. He also had to clone our repos onto our Redmine server and set up a cron job to keep them up to date.</p> <p>One unexpected issue was related to Subversion revision numbers being sequentially increasing, whereas Git commit hashes are not. With Subversion, it&#39;s easy to look at a revision number, compare it to the revision number from when you deployed code to a server, and know if that code is on the server. I built a script to replicate this functionality, which essentially compares where two hashes occur in the git log.</p> <p>We use a url prefix for static assets in our CDN. Before, this prefix had our Subversion revision number, so it needed to change to the Git hash, and add an entry for this in our .htaccess file.</p> <p>Finally, I trolled our back-end systems for references to svn and proactively changed the important ones to use Git and have a Git repo. This wasn&#39;t too hard -- I talked it over with one of our ops guys, grep&#39;d for &quot;svn&quot;, and created a spreadsheet inventory.</p> <p><strong>Rolling Out to Engineers</strong><br /> <br /> Up until the fourth and final phase of the migration, my work had no impact on our 20 engineers except Kevin, who works on the first two small repos we migrated. I did three things to make the rollout as smooth as possible.</p> <p>First, I created a wiki page with links to reading about Git, our workflow with diagram, one-time setup, commands to run during normal development, etc. Basically, the &quot;Git at Kiva&quot; bible.</p> <p>Second, I created a sandbox repo on GitHub where engineers could experiment and learn in an environment virtually identical to the real thing.</p> <p>Third, I identified one person from each of our engineering sub-teams to be a &quot;Git Guru&quot; -- a go-to person with Git questions. I chose people who were comfortable at least with Git basics. I had a meeting with them where I went through the wiki page and our workflow in detail and had them do some test commits and pushes to origin with the sandbox. We discussed a few important issues like &quot;Are we going to encourage rebasing by default?&quot; (yes, but be careful about &quot;rebase hell&quot;) and &quot;When are long-lived feature branches dangerous and why?&quot; which helped work out some details and get buy-in from the Gurus.</p> <p>From the engineer&#39;s perspective, the migration was a few emails showing them the wiki page, encouraging them to try out Git with the sandbox, telling them the cutover timeline, and then finally announcing that we were cut over. Some people got it right away, and some people had questions that the Gurus or I answered.</p> <p><strong>Next Steps</strong><br /> <br /> We&#39;ve had some problems with the interplay between PhpStorm (the IDE that most engineers use) and our developer VMs:</p> <ol class="c4" start="1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; font-family: Arial; font-size: 15px; line-height: normal; list-style-type:decimal; "> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Lots of files unexpectedly changing mode</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Not being able to Pull using PhpStorm, as it complains there are uncommitted changes (when there don&#39;t seem to be)</li> <li class="c6 c0" style="padding-left: 0pt; margin-left: 36pt; direction: ltr; "> Your working copy ending up with uncommitted changes that are from a recently pulled commit, but that you didn&#39;t do yourself</li> </ol> <p><br /> Once we cut our first QA branch, we had a number of engineers not understand the subtle differences between the Git workflow (do your work on the release branch, merge the release branch to development) and our old Subversion workflow (commit your changes to both the development branch and the release branch). People had similar problems understanding how to make production hotfixes. This has led me to periodically walk over to an engineer and quiz them / answer questions about our Git workflow and branches. This one-on-one time seems to be a good way to answer questions and get everyone on the same page.</p> <p>Once we have settled in to using Git in a few months, I hope to write another post reflecting its impact on Kiva engineering.</p> </div></div></div><div class="field field-name-field-build-cats field-type-taxonomy-term-reference field-label-above"><div class="field-label">Categories:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/buildkivablog/category/build-blog-categories-6" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Updates</a></div></div></div><div class="field field-name-field-build-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Tags:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/category/build-blog-tags-0" typeof="skos:Concept" property="rdfs:label skos:prefLabel">git</a></div><div class="field-item odd"><a href="/category/build-blog-tags-1" typeof="skos:Concept" property="rdfs:label skos:prefLabel">source control</a></div></div></div> Tue, 10 Apr 2012 19:15:04 +0000 Tim Ledlie 3961 at http://pages.kiva.org http://pages.kiva.org/buildkivablog/2012/04/10/how-we-moved-from-subversion-to-git-github#comments Kiva Engineering: Tools of the Agile Trade http://pages.kiva.org/buildkivablog/2011/03/03/kiva-engineering-tools-of-the-agile-trade <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"> <p> At Kiva, our development process is based on Scrum - with work broken into two week Sprints (we call them &quot;Iterations&quot;). We&#39;re good students of Scrum in some regards (we do release every two weeks, without fail), and bad students of Scrum in others (it seems like we still bite off more than we can chew in each iteration). Like most Scrum teams, the center of our universe is our ticket tracking system. We use Redmine - albeit a rather customized version. We&#39;ve put quite a bit of time and effort into our ticket tracking system - so we thought we&#39;d give you a tour.</p> <h4> Redmine Home Page - Dashboard</h4> <p> One of the biggest lessons I&#39;ve learned as both a web developer, and an engineering manager is that <em>everybody</em> is fundamentally lazy. Users are lazy, and guess what... engineers are lazy too. If you want somebody to do something many times a day - you have to make it really easy to do. If you want somebody to truly internalize a message - you need to deliver it as often as possible. Hence, each engineer&#39;s Redmine home page is a customized one-stop shop. The left hand column shows a list of tasks - divided according to which code branch the task needs to be performed in. We typically have three branches going at a time - one out in real world, one in QA and one in active development. The right hand side shows three burndown charts. One for the entire engineering team, one for each of our sprint teams (we have four), and one for you, individually. The burndown charts show the burndown for the &quot;most relevant&quot; code branch at any particular phase in a Sprint. (<em>Note - the burndown charts are done with <a href="http://highcharts.com">High Charts</a>. Try it, it&#39;s great. </em>)</p> <div style="width: 610px;display:block;margin:0 auto;"> <a href="http://media.kiva.org/agile_redmine_dashboard.png"><img alt="" src="http://media.kiva.org/agile_redmine_dashboard.png" title="Agile: Redmine Dashboard" width="600" /></a> <p> Click to see full size version</p> </div> <h4> More Burndowns</h4> <p> For the burndown addicted, we also have a page where you can view the burndown charts for all active branches at once.</p> <div style="width: 610px;"> <a href="http://media.kiva.org/agile_burndown_all.png"><img alt="" src="http://media.kiva.org/agile_burndown_all.png" title="Agile: Burndown Charts" width="600" /></a> <p> Click image for full size version</p> </div> <h4> Point Distribution</h4> <p> To check out what each individual on a particular sprint team is up to, we have some bar charts that show a point distribution. The bars are stacked - purple for points that are assigned, grey for points that have been completed.</p> <div style="width: 610px;"> <a href="http://media.kiva.org/agile_point_distribution.png"><img alt="" src="http://media.kiva.org/agile_point_distribution.png" title="Agile: Point Distribution" width="600" /></a> <p> Click image for full size version</p> </div> <h4> SVN Integration</h4> <p> One of most recent, and most effective tools is our SVN-Redmine integration. We built a simple SVN post-commit hook that takes information from our SVN commit messages, and then updates the relevant Redmine ticket accordingly. The Redmine ticket is updated with the SVN comment, as well as the list of files changed, and a link to view each diff using webSVN. This feature is particularly handy for reviewing production patches, making it trivial to make sure that everybody knows exactly what was changed to fix Bug #11214.</p> <div style="width: 610px;"> <a href="http://media.kiva.org/agile_svn_integration.png"><img alt="" src="http://media.kiva.org/agile_svn_integration.png" title="Agile: SVN Integration" width="600" /></a> <p> Click image for full size version</p> </div> <h4> Lesson&#39;s Learned</h4> <p> In a feature-driven engineering environment, everything always feels like a rush. It can be hard to stop and take the time to build a feature for <em>yourself</em>, rather than your customers. (It took us a year of procrastination to build both burndown charts and our SVN integration.) With the advantage of hindsight though, I&#39;ve never felt that it was time ill spent - in fact, my experience has been quite the opposite - the amount of productivity gained using a new &quot;engineering tool&quot; always seems to outweigh the cost of building it.</p> </div></div></div><div class="field field-name-field-build-cats field-type-taxonomy-term-reference field-label-above"><div class="field-label">Categories:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/buildkivablog/category/build-blog-categories" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Announcements</a></div></div></div> Thu, 03 Mar 2011 21:55:55 +0000 Cailin Nelson 1353 at http://pages.kiva.org http://pages.kiva.org/buildkivablog/2011/03/03/kiva-engineering-tools-of-the-agile-trade#comments Kiva Engineering: Innovation Iteration http://pages.kiva.org/buildkivablog/2011/02/10/kiva-engineering-innovation-iteration <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"> <p>At Kiva, we tend to attract and hire engineers with a strong creative, entrepreneurial streak. &nbsp;This aligns well with Kiva&rsquo;s office culture - and with our overall mission - an innovative, technology-driven approach to alleviating poverty. &nbsp;However, as the team grows and we become more specialized in an effort to become more efficient, sometimes our day to day work doesn&rsquo;t always give us an outlet for our creative sides. &nbsp;After a long project involving concepts like currency exchange loss, it&rsquo;s easy to feel like you spend your entire working life chasing a few misbehaving pennies around the globe, and that your particular slice of the Kiva pie has become a little divorced from the glorious big picture. In June 2010, many of us were finishing up some pretty tough projects, and as a team, we were in a bit of a funk. We talked as a team about what we could do to restore our energy and excitement. &nbsp;Our solution was an idea called &ldquo;Innovation Iteration&rdquo;. Innovation Iteration was inspired Google&rsquo;s 20 Percent Time - and we do indeed spend 20% of our time in Innovation Iterations. &nbsp;However, there are two important differences to the Kiva approach:</p> <ol> <li> We all take our innovation time at the same time.</li> <li> Our innovation time is an entire, two-week iteration - not an &ldquo;every Friday afternoon&rdquo; approach.</li> </ol> <p>Essentially, an Innovation Iteration is just like any other iteration at Kiva - except that the engineers get to pick their project&rsquo;s themselves. &nbsp;Also, we&rsquo;ve developed a fun and effective way to help us choose the best project to spend our time on. &nbsp;This part of Innovation Iteration is loosely based on third-hand rumors we&rsquo;ve heard about the prioritization process used at Pandora. It&rsquo;s a two part process and it goes like this: <strong>Innovation Planning Phase 1</strong></p> <ul> <li> We all get together in a big room with lots of markers and lots of paper</li> <li> We write our ideas for the iteration down - one idea per piece of paper</li> <li> We assign each idea a cost, in points</li> <li> The pieces of paper are taped to the wall.</li> <li> Each engineer very briefly describes their ideas.</li> <li> Then, we break for lunch.</li> </ul> <p><strong>Innovation Planning Phase 2</strong></p> <ul> <li> Each engineer is allocated 4 points with which they may &ldquo;fund&rdquo; any project on the wall.</li> <li> The points are colored stickies,and you &ldquo;fund&rdquo; a project by putting your sticky on the paper.</li> <li> The engineer commits to work on the project(s) that they fund.</li> <li> No project may be partially funded. &nbsp;(E.g. a project valued at 8 points but with 4 stickies cannot be worked on.)</li> </ul> <p>This last bullet point is what makes the process fun. &nbsp;When the stickies go up on the wall, we usually start out with a bunch of partially funded projects. &nbsp;That kicks off a round of negotiation and cajoling and bribery, that ends with a suite of fully funded projects.</p> <p style="text-align: center;"><img alt="Innovation iteration looking at the ideas" class="aligncenter size-full wp-image-320" src="http://cms.kiva.org.s3.amazonaws.com/pictures/innovation_iteration.jpg" style="width: 594px; height: 434px; " /></p> <p>Once the projects have been selected, we create tickets representing the work to be done in Redmine (our ticket tracking system), and then we get coding! After the coding and QA cycle, Innovation Iteration concludes with a session called &ldquo;Demo Friday&rdquo;. &nbsp;Demo Friday is a festive gathering with beer and snacks, during which each engineer briefly demonstrates what they have been working on in the past iteration. &nbsp;Each demo is between 1 and 5 minutes, and run the gamut from showing off actual code to dazzling displays of javascript wizardry. &nbsp;Demo Friday is a part of all iterations at Kiva, but the Innovation Demo Friday&rsquo;s are particularly fun and impressive, as there is a notable increase in throughput during Innovation Iteration. &nbsp;Innovation Demo Friday&rsquo;s are also the time at which we make the final go/no-go decision on a particular feature. We recently completed our third Innovation Iteration, and this seemed like a good time to reflect a little on how it&rsquo;s been going. &nbsp;I asked the team for their thoughts - here&rsquo;s a sampling:</p> <blockquote> <div> <strong>How does Kiva benefit from Innovation Iteration?</strong></div> <div> &nbsp;</div> <em>It&#39;s keeps us nimble. &nbsp;A risk we face as Kiva grows is becoming too conservative to tackle tough problems. &nbsp;This is a chance to prove to ourselves we can still use creative, timely solutions to solve big issues.</em> -- Jonathan <em>Innovation iteration is our vehicle for delivering grass-roots features whereas the other iterations are used for delivering features developed from an organizational top-down approach. A balance is necessary, one cannot exist without the other.</em> -- Sid</blockquote> <blockquote> <strong>How do you benefit from Innovation Iteration?</strong> <em>It&#39;s a refreshing change from the norm. &nbsp;Especially for those of us who plug away at large-scale projects over many weeks / months, it&#39;s nice to do something totally different for a change.</em> <em>You often end up working with someone you don&#39;t normally work with, which is great for sharing your expertise and just getting to know your co-workers better. +1 knowledge sharing and +1 morale. &nbsp;Not only do I benefit personally from learning what others know, but it helps me build better and more relevant stuff for my teammates</em>. &nbsp;-- Tim <strong>What risks do you think Innovation Iteration poses?</strong> <em>There&#39;s always a chance we bite off more than we can chew. &nbsp;This could mean we fail to even complete a project on time. &nbsp;Or, even worse, that the ongoing maintenance is more than we anticipated and drags the whole org into a mess that one engineer made</em>. -- Jonathan <em>Code that is not released but in the source tree can become stale and eventually bloat.</em> -- Chris <strong>What&rsquo;s your favorite part of Innovation Iteration?</strong> <em>Getting together for the two planning meetings -- hearing everyone&#39;s wild and varied ideas, negotiating for what we fund. &nbsp;I haven&#39;t yet chosen to work on one of my own ideas -- I&#39;ve always been more excited by other people&#39;s ideas</em>. &nbsp;-- Tim</blockquote> <p>Our next Innovation Iteration is just around the corner in March. &nbsp;What do you think we should build next?</p> </div></div></div><div class="field field-name-field-build-cats field-type-taxonomy-term-reference field-label-above"><div class="field-label">Categories:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/buildkivablog/category/build-blog-categories" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Announcements</a></div></div></div> Thu, 10 Feb 2011 21:55:55 +0000 Cailin Nelson 1336 at http://pages.kiva.org http://pages.kiva.org/buildkivablog/2011/02/10/kiva-engineering-innovation-iteration#comments Kiva Engineering 2010 : A Year in Review http://pages.kiva.org/buildkivablog/2011/01/19/kiva-engineering-2010-a-year-in-review <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"> <p>2010 was a year of growth for Kiva Engineering. &nbsp;We started the year with 8 full time engineers (and 2 managers) and ended the year with 14 engineers - a growth rate of 75%. &nbsp;We also kicked off 2010 with a switch to a new ticket tracking system (Redmine), that allowed us to more accurately track exactly what we&#39;ve been up to. &nbsp;Let&#39;s take a look shall we.... <img alt="" class="size-full wp-image-291 aligncenter" src="http://cms.kiva.org.s3.amazonaws.com/pictures/tickets.png" style="width: 600px; height: 371px; " /> Kiva Engineering is an Agile shop, operating roughly on a traditional Scrum model with two week Sprints (we call them &quot;iterations&quot;). &nbsp;We use &quot;tickets&quot; to track both defects in the existing product, as well as tasks for new development. &nbsp;Tickets are created by customer service, other Kiva staff members, our product managers and ourselves. Here we show the raw number of tickets created versus resolved. &nbsp;My take away... there will always be more to do then we can possibly get to! <img alt="" class="aligncenter size-full wp-image-292" src="http://cms.kiva.org.s3.amazonaws.com/pictures/points.png" style="width: 600px; height: 371px; " /> Although demand for our services contains to outpace our capacity, we do continue to get more work done as time goes by. &nbsp;At Kiva, we track work in &quot;points&quot;. &nbsp;Points are a unit-less measure of work that we use to measure how hard we think a task is (estimated points) and how hard it turned out to be (actual points). &nbsp;Like most Agile evangelists - we shy away from giving a rough conversion of points to hours. &nbsp;Engineers new to Agile find this strange and a little frustrating at first, but everybody seems to full into agreement within a month or two. &nbsp;This second chart shows &nbsp;the number of points of work completed per month. &nbsp;Overall, this has been on the rise - no surprise since we&#39;ve also been growing the team! <img alt="" class="aligncenter size-full wp-image-307" src="http://cms.kiva.org.s3.amazonaws.com/pictures/points_per_engineer.png" style="width: 600px; height: 371px; " /> Which brings us to the third and final chart - the one which best captures our efficiency as a team. &nbsp; This chart shows the points completed per coder per month. &nbsp;This chart also tracks how the number of coders on the team has evolved. &nbsp;Although it is clearly expected that we complete more points as the team grows, it is less expected and pleasing that our points per coder is also gradually rising. &nbsp;This means that despite the continual on-boarding of new team members and the increased &quot;noise&quot; of more bodies in the office (more emails, more questions, more dogs...) we&#39;re also continuing to get more efficient. Time will tell if we can continue this upwards trajectory as we continue to grow. &nbsp;(Did I mention that we&#39;re <a href="http://www.kiva.org/jobs" target="_blank">hiring</a>...?) <em>Note - in the final chart December was calculated as a 3-week month - a minimum estimate of the time we each took off to spend with our families over the holidays.</em></p> </div></div></div><div class="field field-name-field-build-cats field-type-taxonomy-term-reference field-label-above"><div class="field-label">Categories:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/buildkivablog/category/build-blog-categories" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Announcements</a></div></div></div> Wed, 19 Jan 2011 21:55:55 +0000 Cailin Nelson 1335 at http://pages.kiva.org http://pages.kiva.org/buildkivablog/2011/01/19/kiva-engineering-2010-a-year-in-review#comments Implementing a CSS Grid http://pages.kiva.org/buildkivablog/2011/01/10/implementing-a-css-grid <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"> <p> The engineering team at Kiva is going through the process of examining the rich set of technologies available for improving user experiences on Kiva&#39;s website.&nbsp; One such technology is the CSS grid. I recently spent some time evaluating and reading up on some of the different options that are out there, ultimately whittling down to 4 CSS grids that seemed to represent a good spectrum of what grids have to offer.</p> <div> After implementing mockups with <a href="1kbgrid.com" target="_blank">1Kb</a>, <a href="http://code.google.com/p/the-golden-grid/" target="_blank">The Golden Grid</a>, <a href="http://www.yaml.de/en/" target="_blank">YAML</a>, and <a href="http://960.gs/" target="_blank">960gs</a> our team came to the following recommendations: <ul> <li> Do not expect to use any of the grids &ldquo;as is&rdquo; for a production site.</li> <li> Pool the practices and styles of the different grids in order to create a grid that works to enhance design and not confine it.</li> <li> Build up a grid in communication with the designer</li> <li> Keep columns and classes down to a minimum by only creating what is necessary.</li> <li> Maintain communication across the development team, building the supporting infrastructure before implementing visual changes.</li> </ul> </div> <p> <strong>Taking the Grids For a Spin</strong> The first grid I evaluated was 1kb, which weighs in at a very minimal 640 bytes, uncompressed.&nbsp; While I was inspired by 1kb&rsquo;s brevity, I wasn&rsquo;t crazy about it&rsquo;s use of &quot;row&quot; and &quot;column&quot; divs. The Golden Grid was the second grid tested out.&nbsp; I like how the Golden Grid has separate grid, reset, and typography stylesheets.&nbsp; Combined, they come in at just around 4Kb and the grid stylesheet alone is just over 1Kb. Some minor things I didn&rsquo;t like about this grid were its use of cramped 10px gutters and its use of a column&rsquo;s width within the column&rsquo;s class name. (i.e. class=&rdquo;g640&rdquo;).&nbsp; I liked that, unlike other grids tested, it did not rely on cascading rules when designating a column element ( e.g. I could do class=&rdquo;g640&rdquo; instead of class=&rdquo;column g640&rdquo;). Following The Golden Grid I tested YAML ( Yet Another Multicolumn Layout ) and 960gs.&nbsp; YAML has the most components of any of grids tested and while I don&rsquo;t plan on using YAML, I do plan on going through YAML&rsquo;s code again and using it as a learning tool. YAML uses a fluid layout and additionally takes advantage of media queries, both which serve as great tools for building a responsive layout. My final evaluation was of 960gs. &nbsp;This is probably the grid I&rsquo;ve come across the most and heard the most praise about and after using it, I can see why.&nbsp; I felt that 960gs did a great job of offering robustness while at the same time avoiding many presumptions about the design.&nbsp; In the situations I have come across, however, I haven&rsquo;t found much use for the push_xx and pull_xx classes, and Ideally, I would prefer not having to rely on a container class in my cascading rules. <strong> </strong> The following are some of the other CSS grids that were looked into:</p> <ul> <li> YUI Grids -&nbsp;<a href="http://developer.yahoo.com/yui/grids/">http://developer.yahoo.com/yui/grids/</a></li> <li> Blueprint -&nbsp;<a href="http://www.blueprintcss.org/">http://www.blueprintcss.org/</a></li> <li> Typogridphy -&nbsp;<a href="http://csswizardry.com/typogridphy/">http://csswizardry.com/typogridphy/</a></li> <li> Tripoli -&nbsp;<a href="http://devkick.com/lab/tripoli/">http://devkick.com/lab/tripoli/</a></li> <li> Baseline CSS - <a href="http://baselinecss.com/">http://baselinecss.com/</a></li> </ul> </div></div></div><div class="field field-name-field-build-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Tags:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/category/build-blog-tags" typeof="skos:Concept" property="rdfs:label skos:prefLabel">css</a></div></div></div> Mon, 10 Jan 2011 21:55:55 +0000 Gabriel Castillo 1334 at http://pages.kiva.org http://pages.kiva.org/buildkivablog/2011/01/10/implementing-a-css-grid#comments