<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
  <title>entp hoth blog - Home</title>
  <id>tag:hoth.entp.com,2008:mephisto/</id>
  <generator version="0.8.0" uri="http://mephistoblog.com">Mephisto Drax</generator>
  
  <link href="http://hoth.entp.com/" rel="alternate" type="text/html" />
  <updated>2008-11-24T10:33:02Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/entp-hoth" type="application/atom+xml" /><entry xml:base="http://hoth.entp.com/">
    <author>
      <name>courtenay</name>
    </author>
    <id>tag:hoth.entp.com,2008-11-24:3150</id>
    <published>2008-11-24T10:31:00Z</published>
    <updated>2008-11-24T10:33:02Z</updated>
    <link href="http://hoth.entp.com/2008/11/24/fun-tender-stats" rel="alternate" type="text/html" />
    <title>Fun Tender stats</title>
<content type="html">
            &lt;p&gt;I’m writing some hacks to get a neat new feature for Tender out the door before we launch into a more public phase.&lt;/p&gt;


	&lt;p&gt;Here are the most common words used in tickets for Lighthouse:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;["not", 258], ["we", 258], ["would", 260], ["if", 264], ["are", 276], ["can", 280], ["as", 291], 
["account", 301"], ["ticket", 304], ["my", 339], ["with", 347], ["but", 360], ["lighthouse", 380], 
["have", 432], ["be", 452], ["this", 498], ["that", 573], ["of", 599], ["in", 656], ["is", 665], 
["for", 710], ["it", 752], ["and", 803], ["a", 1277], ["i", 1295], ["to", 1748],&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Awesome.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>giles@entp.com</name>
    </author>
    <id>tag:hoth.entp.com,2008-11-20:3117</id>
    <published>2008-11-20T22:47:00Z</published>
    <updated>2008-11-20T22:51:22Z</updated>
    <link href="http://hoth.entp.com/2008/11/20/github-uses-tender" rel="alternate" type="text/html" />
    <title>GitHub Uses Tender</title>
<content type="html">
            If you read Ruby blogs, you probably know that GitHub is run and built by some of the best programmers Ruby has. So we're pretty stoked to get &lt;a href="http://github.com/blog/236-support-no-longer-a-pain-in-our-ass"&gt;an endorsement like this&lt;/a&gt;.
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>kyle</name>
    </author>
    <id>tag:hoth.entp.com,2008-11-18:3094</id>
    <published>2008-11-18T00:09:00Z</published>
    <updated>2008-11-18T04:46:23Z</updated>
    <category term="lighthouse" />
    <link href="http://hoth.entp.com/2008/11/18/custom-fields-we-don-t-need-no-stinking-custom-fields" rel="alternate" type="text/html" />
    <title>Custom fields? We don't need no stinking custom fields</title>
<content type="html">
            &lt;p&gt;One of the most discussed feature requests for &lt;a href="http://lighthouseapp.com"&gt;Lighthouse&lt;/a&gt; is the addition of custom fields.  But given the goals of Lighthouse, it’s extremely unlikely that will ever happen.  Why is that you say? Well – custom fields just don’t work, and here’s my argument for why that’s the case.&lt;/p&gt;

&lt;h3&gt;A little background&lt;/h3&gt;

&lt;p&gt;Before my work with ENTP, I worked at one of those big-bad-agencies for almost four years as a web developer.  My job was not to write backend code. My job was not to make pretty designs. My job was to make it all work. Write the HTML, CSS, Javascript given designs from the design team and integrate it into Java/.NET/PHP backend systems.  I was marrying the ideals from design and programming into the real world of a front-end user experience.  Ideals don’t transform too well into the real world, so I ended up dealing with a lot of bugs.&lt;/p&gt;

&lt;p&gt;A &lt;em&gt;lot&lt;/em&gt; of bugs.  During one of my projects, I estimate I was spending between 2-4 hours a &lt;em&gt;day&lt;/em&gt; dealing completely with organizing bugs in our bug-tracking system, JIRA.  JIRA had everything — access control, customizable workflows, priorities, rankings, modules, milestones and yes — custom fields.  But at the end of the day, none of those features amounted to anything. It was just overhead that mandates more man-hours to organizing the bug tracker.&lt;/p&gt;

&lt;h3&gt;Organizing bugs is a myth&lt;/h3&gt;

&lt;p&gt;The basic idea behind custom fields is that you will be able to better organize your bugs and create complicated prioritized lists of work to be done.  You’d be able to add a priority field, severity field, or a homeland security threat level color.  The old prioritization system in JIRA I worked with prioritized bugs with two custom fields – priority &amp;amp; severity.  We had three methods of making prioritization lists:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Priority - This was the priority of the bug, supposedly set by the client&lt;/li&gt;
&lt;li&gt;Severity - This was the severity of the bug – whether it stopped all functionality, or was just a nitpick in the interface, for example&lt;/li&gt;
&lt;li&gt;Project Manager coming over, slamming their laptop on my desk and telling me to fix issue X.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Guess which method worked best?  If you guessed #3 – you’re a winner.  For all the prioritizing and severitizing (which costs a &lt;em&gt;lot&lt;/em&gt; of time during bug input) the best method of bug sorting was human communication (WHAT?!).&lt;/p&gt;

&lt;h3&gt;Bugs really only have three levels of prioritization&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://warpspire.com/misc/dilbert_priorities.gif" alt="Dilbert explains bugs" /&gt;&lt;/p&gt;

&lt;p&gt;Just because custom fields don’t work doesn’t mean you need to give up on prioritization completely.  Simple prioritization can be a huge win for developers in allotting their time.  But you have to realize that there are really three levels of priority for a software bug.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;FIX IT NOW — these are showstopper bugs.  The server is crashed, the code you just deployed is eating up $1500 in sales per minute.  These are solved by phone calls, in-person sit-downs, raving emails and caffeine.  No bug tracker prioritization will help you. Enter the issue into a bug tracker for reference, but the priority is &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Needs to get done very soon. These are bugs that break some non-vital functionality or produce a bad user experience and need to get fixed as soon as possible. We deal with these issues by tagging them ‘@high’ in Lighthouse.  You should have absolutely no more than a dozen of these bugs at any given point.  Any more than that will degrade to noise and developers will ignore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Other bugs.  Any other bugs should be prioritized via milestones and assignees.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Any other prioritization should be considered a &lt;em&gt;recommendation&lt;/em&gt; and therefore as little time as possible should be spent creating the prioritized list.&lt;/p&gt;

&lt;h3&gt;The human brain is more boolean than you might think&lt;/h3&gt;

&lt;p&gt;Project managers seem to have a myth that the human brain works like a computer – where it can align priorities in a list and work on the issues in that order.  Adding more developers to the project should work like parallel processors – they all respect the priority list and work on issues in parallel in order of importance.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://hoth.entp.com/assets/2008/11/17/Things.jpg" /&gt;&lt;/p&gt;

&lt;p&gt;The problem is that the human brain does not work that way.  It decides what it wants to work on, makes it’s own judgement of it’s value, and makes it’s own decision.  Realistically – this falls into one of two categories: needs to be done, can wait.  This is why Getting Things Done (GTD) systems have a concept of things that need to be done today, and things that need to be done next.&lt;/p&gt;

&lt;p&gt;If there is nothing that needs to be done, then people may reference a priority list as a recommendation – but they will ultimately decide for themselves.  They may chose to clear out 50 easy browser bugs (low in priority) versus the one hard bug (high in priority) if nothing is urgent.  Think about bugs like chores – do you take the trash out when it’s almost full, or the day before trash day?&lt;/p&gt;

&lt;h3&gt;Complicated prioritization lists are just false security&lt;/h3&gt;

&lt;p&gt;For all my arguments against custom fields, there will be plenty of people arguing the opposite.  As a client-facing project manager, it’s very easy to think that you need to have complicated prioritization.  You can produce lists of prioritized bugs for clients to look at and gush over.  They are a wonderful source of false security — everyone not doing the work thinks everything is on track. “Look, we only have 5 high priority, showstopper tickets impacting the services layer for next month’s release left!”  But the people on the ground working on the code know that’s not the case. Developers see the project as a whole.&lt;/p&gt;

&lt;p&gt;Just because you &lt;em&gt;can&lt;/em&gt; create a complicated hierarchical, phased priority list does not mean your developers will work on them in that fashion.  I think most people underestimate the impact of personal communication and overestimate the value of technology.  Bug trackers are a good thing, but only if they function &lt;em&gt;with&lt;/em&gt; your team.  &lt;/p&gt;

&lt;p&gt;At Lighthouse we’re determined to make the best possible product – and we think the absence of a feature can be a feature in itself.  Try working without custom fields for a little while and you’ll soon see how the glove fits.&lt;/p&gt;

&lt;p&gt;Next up: How we work with Lighthouse - an eye into how ENTP uses it’s own bug tracker.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>giles@entp.com</name>
    </author>
    <id>tag:hoth.entp.com,2008-11-13:3069</id>
    <published>2008-11-13T20:15:00Z</published>
    <updated>2008-11-13T20:17:48Z</updated>
    <link href="http://hoth.entp.com/2008/11/13/sinatra-hack-lib-models-file" rel="alternate" type="text/html" />
    <title>Sinatra: ActiveRecord lib/models File</title>
<content type="html">
            &lt;p&gt;I've got a Sinatra app using the same Active Record DB as a much larger Rails app. I need code to handle that, and I also want to keep my Sinatra app clean.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://s3.amazonaws.com/giles/sinatra_11308/sinatra.gif"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://s3.amazonaws.com/giles/sinatra_11308/models.gif"&gt;&lt;/p&gt;

&lt;p&gt;It's kind of a cheat, and for some reason &lt;code&gt;lib/controllers&lt;/code&gt; doesn't work, but it's a tidy way to sneak a little naughty complexity into Sinatra's one-file simplicty.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>trevor</name>
    </author>
    <id>tag:hoth.entp.com,2008-11-10:3056</id>
    <published>2008-11-10T21:44:00Z</published>
    <updated>2008-11-10T21:47:35Z</updated>
    <link href="http://hoth.entp.com/2008/11/10/improving-my-git-workflow" rel="alternate" type="text/html" />
    <title>Improving my git workflow</title>
<content type="html">
            &lt;p&gt;I'm a fan of "rip and tear" refactoring.  Dive in, hack and slash, see what works.  Whether my hack-and-slash-fest lasts a few minutes or a few hours, I &lt;em&gt;always&lt;/em&gt; do my dirty work in a git 'topic branch'.&lt;/p&gt;

&lt;p&gt;A topic branch is simply:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git checkout -b trevor-287-date-formatting
# hack and slash
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;NB: at ENTP we name our branches according to committer, Lighthouse ticket #, and a short descriptive string.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At every step along the way, when I think "okay, that works", I commit.  That way, as I continue on my path of destruction, any dead ends I encounter can be undone with a simple "&lt;code&gt;git checkout -- .&lt;/code&gt;" - a project-sized undo buffer, if you will.&lt;/p&gt;

&lt;p&gt;Sometimes I'll even branch off of my topic branch to try out ideas.  Cheap to create, cheap to destroy.&lt;/p&gt;

&lt;p&gt;So topic branches and frequent commits are my safety net.  They let me be as aggressive as I want in my changes and help me to maintain 'flow'.  Except...&lt;/p&gt;

&lt;p&gt;Except for when it comes time to publish my topic branch for peer review.  I may be a hack-and-slash bandit but at ENTP we've got some pretty stringent requirements for making sure code "makes the grade" before it even hits the staging servers, let alone production.&lt;/p&gt;

&lt;p&gt;That means that every change gets pushed to a remote branch and reviewed by at least one other brainiac as a first step.  And this is where my lovely topic branch has let me down, just a little.&lt;/p&gt;

&lt;p&gt;Pushing a branch to remote is easy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git push origin trevor-287-date-formatting
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The only problem is .git/config isn't updated so that I can do a simple "git pull" on those rare occasions Giles or Matt would have the audacity to correct my finely-crafted code.  Until now I've been hand-editing .git/config to make sure everything works.  Blech.&lt;/p&gt;

&lt;p&gt;What I've wanted is a way, with a flick of the keyboard, to 'promote' my topic branch of &lt;code&gt;trevor-287-date-formatting&lt;/code&gt; to a tracked remote branch of the same name.&lt;/p&gt;

&lt;p&gt;And while I could easily &lt;em&gt;start&lt;/em&gt; the whole process with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# create the new remote branch based on current master:
git push origin master:refs/heads/trevor-287-date-formatting
# create a local tracking branch of trevor-287-date-formatting
git branch --track trevor-287-date-formatting origin/trevor-287-date-formatting
# start working on it:
git checkout trevor-287-date-formatting
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It just doesn't feel fluid enough to me. Remember, topic branches appear and disappear from my local repo faster than stock value on the Dow Jones.&lt;/p&gt;

&lt;p&gt;Instead, I wrote a shell script that encapsulates my manual steps (push to remote, amend the config) into a concise command.  Much more satisfying.&lt;/p&gt;

&lt;p&gt;I present to you: &lt;code&gt;git-promote&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh
#
# Promotes a local topic branch to a remote tracking branch of the same name,
# by pushing and then setting up the git config

curr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')

remote_branch=$(git branch -r | grep "origin/${curr_branch}")
[ -z "${remote_branch}" ] &amp;amp;&amp;amp; ( git push origin "${curr_branch}" )

origin=$(git config --get "branch.${curr_branch}.remote")
[ -z "${origin}" ] &amp;amp;&amp;amp; ( git config --add "branch.${curr_branch}.remote" origin )

merge=$(git config --get "branch.${curr_branch}.merge")
[ -z "${merge}" ] &amp;amp;&amp;amp; ( git config --add "branch.${curr_branch}.merge" "refs/heads/${curr_branch}" )
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Assuming you have &lt;code&gt;$HOME/bin&lt;/code&gt; in your &lt;code&gt;PATH&lt;/code&gt;, put that script in a file called &lt;code&gt;$HOME/bin/git-promote&lt;/code&gt; and type this on the command line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;chmod 755 $HOME/bin/git-promote
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you can promote your topic branches to remote tracking branches like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# just to ensure sure my working branch is the one I want to promote...
git checkout trevor-287-date-formatting
git promote
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Done and Done.&lt;/p&gt;

&lt;p&gt;If anyone has better suggestions, do let me know. I'm always keen to learn about other people's workflows.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>giles@entp.com</name>
    </author>
    <id>tag:hoth.entp.com,2008-11-09:3054</id>
    <published>2008-11-09T19:51:00Z</published>
    <updated>2008-11-09T19:53:31Z</updated>
    <category term="ack" />
    <category term="oss" />
    <category term="textmate" />
    <link href="http://hoth.entp.com/2008/11/9/ack-in-project-textmate-plugin" rel="alternate" type="text/html" />
    <title>Ack In Project (TextMate plugin)</title>
<content type="html">
            &lt;p&gt;ENTP programmers produce a lot of open source code. One cool project you might have missed: Trevor Squires' TextMate plugin which allows you to use &lt;code&gt;ack&lt;/code&gt;. Ack In Project is like Find In Project, only faster, and acker.&lt;/p&gt;

&amp;lt;object height="490" width="701"&gt;&amp;lt;param /&gt;&amp;lt;param /&gt;&amp;lt;param /&gt;&amp;lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2196603&amp;amp;amp;server=vimeo.com&amp;amp;amp;show_title=0&amp;amp;amp;show_byline=0&amp;amp;amp;show_portrait=0&amp;amp;amp;color=00ADEF&amp;amp;amp;fullscreen=1" height="490" width="701"&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;

&lt;p&gt;For more detail and a higher-quality version of the screencast, check out &lt;a href="http://somethinglearned.com/articles/2008/06/03/ack-tmbundle-a-faster-find-in-project-for-textmate"&gt;Trevor's blog&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>giles@entp.com</name>
    </author>
    <id>tag:hoth.entp.com,2008-11-07:3051</id>
    <published>2008-11-07T21:41:00Z</published>
    <updated>2008-11-07T21:41:54Z</updated>
    <link href="http://hoth.entp.com/2008/11/7/comments" rel="alternate" type="text/html" />
    <title>Comments, Code Smells, And Clients</title>
<content type="html">
            &lt;p&gt;Neal Ford writes that &lt;a href="http://memeagora.blogspot.com/2008/11/comments-code-smell.html"&gt;comments are a code smell&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;We were on a project where the client insisted on Javadoc comments for every public class and method. We started the project adding those comments, but eventually stopped. When doing agile development, you don't want anything that hampers refactoring. Having comments in place caused a dilemma: do I refactor the method and change the comment (the most work), refactor the method and leave the old comment (with the theory being that I'll change it again later, and would rather just have to update the comment once), or not refactor? No good options here. Having pervasive comments discourages refactoring because it adds significant extra friction. On this project, we abandoned commenting as we went along. The last week of the project we literally did nothing but go back and add comments to the code, which worked well because the code base had settled down by that point. But notice what's lurking in wait: the client wanted all the comments there to make it easier to maintain in the future. But who's to say that whoever maintains that code will keep the comments up to date?&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;Neal's post is very worth reading. He says the Lysol to clear away this particular smell is made of two things: automated tests and &lt;i&gt;composed method&lt;/i&gt;, which is Kent Beck's name for the technique of creating large numbers of very small methods with very clear names. He also offers an explanation to one interesting mystery, that of why this approach is so much more popular in Ruby and Smalltalk than it is in Java: dynamic languages encourage descriptive method names. Check out the comments on Neal's post; he didn't explain that in much detail, so I asked him for follow-up. My guess is that he sees this as a side effect of the more natural syntax dynamic languages use.&lt;/p&gt;

&lt;p&gt;The quote I pulled out raises a different issue: what do you do when your client wants something you can't recommend? Like any consultancy, ENTP encounters this question every once in a while. Neal's example is a great example because it's not cut and dried. The Javadoc comments may have established an obstacle to refactoring and clean maintenance; on the other hand, they resulted in extensive documentation, and extensive documentation is a good thing.&lt;/p&gt;

&lt;p&gt;My personal answer is that you let the client know, but you also let the client decide. I'm not sure what the official ENTP answer is. The official ENTP answer could be different on comments, too. I feel the same way about comments in code as I feel about adverbs in writing. In a perfect world, it would never happen, but in reality you have to give way occasionally.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>kyle</name>
    </author>
    <id>tag:hoth.entp.com,2008-11-07:3044</id>
    <published>2008-11-07T02:48:00Z</published>
    <updated>2008-11-07T03:24:45Z</updated>
    <link href="http://hoth.entp.com/2008/11/7/the-new-entp-com" rel="alternate" type="text/html" />
    <title>The new entp.com</title>
<content type="html">
            &lt;p&gt;Today we launched the new &lt;a href="http://entp.com"&gt;entp.com&lt;/a&gt; &amp;ndash; and I’d like to walk through some of the design thoughts and methodology we used.  First things first: entp.com was designed and built inside the span of ten days (in the midst of client work, too!). We’re a firm believer in &lt;em&gt;doing&lt;/em&gt; instead of &lt;em&gt;talking about doing&lt;/em&gt; – once we had it in our minds to get started, we worked to make it happen as fast as possible.&lt;/p&gt;

&lt;h3&gt;The Challenges&lt;/h3&gt;

&lt;p&gt;Redesigning any agency site is always one of the hardest tasks a designer can take on. Not only do you have the world’s worst client (yourself) – but you’ve got the worst critics (your fellow designers) too.  The biggest challenge with ENTP was just exactly how to portray the company, the work, and the people in it.&lt;/p&gt;

&lt;p&gt;Typical agencies have life pretty easy – they hire almost exclusively full-time employees, force them to sign over their lives, and then take credit for everything that an employee thinks during their employment.  ENTP is a bit different – a large portion of people who work here are contractors, and ENTP allows (promotes!) people to work on their own side-projects.  It makes for a very complicated relationship when you try and explain the relationship between  something like &lt;a href="http://github.com/gilesbowkett/archaeopteryx/tree"&gt;Archaeopteryx&lt;/a&gt; and ENTP. ENTP doesn’t own any rights, but Giles does work here – and I think that’s a credit to the company’s ability.  The same can be said for the dozens of plugins and libraries created by ENTP employees. You would struggle to find a single Rails developer who hasn’t used code from an ENTP employee before.&lt;/p&gt;

&lt;p&gt;Another hurdle in the way of ENTP is that as &lt;em&gt;individuals&lt;/em&gt; each of us are fairly well known in our communities – but as a &lt;em&gt;company&lt;/em&gt; few people have ever heard of us.  The struggle in designing the site was to reign in all of these disparate ideas and combine them into one solidified ENTP image.&lt;/p&gt;

&lt;h3&gt;The Approach&lt;/h3&gt;

&lt;p&gt;At ENTP, we approach design a little differently than everyone else.  The design we ended up with was a true collaboration between Justin &amp;amp; myself.  We spent a couple of days tossing PSDs back and forth between each other and then threw up a few options to the ENTP Campfire room to make the final decisions.  The result is a design that keep a great focus between &lt;strong&gt;what we do&lt;/strong&gt;, &lt;strong&gt;what we make&lt;/strong&gt;, and &lt;strong&gt;who we are.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The result is this evolution of the home page:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://hoth.entp.com/assets/2008/11/7/entp_timeline.jpg" alt="Design Timeline" /&gt;&lt;/p&gt;

&lt;h3&gt;Simply Static&lt;/h3&gt;

&lt;p&gt;Hanging out with a group of developers, it’s hard to convince people that sometimes a static lifestyle is the way to go.  For simple brochure sites – I still think 100% static is the best method out there.  But there are some challenges associated with this – for example, I wanted to pull in people’s github repositories and rotate out employees at the bottom.  Luckily for me, Github offers a nice JSON API with callbacks – so I’m able to pull in everyone’s non-forked repositories (thanks to a quick &lt;a href="http://logicalawesome.lighthouseapp.com/projects/8570/tickets/370-api-filter-between-source-and-forks"&gt;bribe&lt;/a&gt;) and show them there.  Storing everyone’s information in a nice static &lt;a href="http://entp.com/json"&gt;json file&lt;/a&gt; allows me to work the rest of my magic, all with Javascript.  Our deployment strategy is a cron job running a &lt;code&gt;git pull&lt;/code&gt; – so anyone with access to the git repository can edit content and push it live.&lt;/p&gt;

&lt;p&gt;For simple sites, static is the way to go – don’t be afraid to under-engineer your solution if you need to.&lt;/p&gt;

&lt;h3&gt;Meet ENTP&lt;/h3&gt;

&lt;p&gt;Now that we’ve finally got (almost) all of our team up, you can get an idea of &lt;a href="http://entp.com/team/"&gt;who entp really is&lt;/a&gt; – you might be surprised to see who’s been working here.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>giles@entp.com</name>
    </author>
    <id>tag:hoth.entp.com,2008-11-05:3042</id>
    <published>2008-11-05T21:56:00Z</published>
    <updated>2008-11-05T21:58:49Z</updated>
    <link href="http://hoth.entp.com/2008/11/5/what-git-add-really-means" rel="alternate" type="text/html" />
    <title>What "git add" Really Means</title>
<content type="html">
            &lt;p&gt;Not being a git expert, I still sometimes stumble on straightforward things. Recently I did a &lt;code&gt;git checkout&lt;/code&gt; and ran into merge difficulties. One version of a spec had a particular example commented out; another version didn't. I wrestled git for a while, trying to find a way to tell it, "Dude I don't care, pick one file or the other so I can get on with my day." Neither version of the file mattered, because after a day or two more of work, the branch won't need the file at all.&lt;/p&gt;

&lt;p&gt;After searching for a simpler solution, I cleaned the file up by hand, did &lt;code&gt;git add filename&lt;/code&gt;, plus &lt;code&gt;git commit filename&lt;/code&gt;, and I was done. Some of the messages I got during the process were confusing, however, and I didn't remember right away that you're supposed to &lt;code&gt;git add&lt;/code&gt; a file that git already knows about.&lt;/p&gt;

&lt;p&gt;The first time you use git, people tell you, first you &lt;code&gt;git add&lt;/code&gt; the new files git needs to know about, and then you &lt;code&gt;git commit&lt;/code&gt; those files. It's pretty easy to leap to the conclusion that &lt;code&gt;git add&lt;/code&gt; means "add this file to the list of things git cares about," which makes this use case a little counter-intuitive, or at least less obvious than I would have liked. It's kind of like git has Alzheimer's and you have to introduce it to the same new person twice.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://smalltalk.gnu.org/blog/bonzinip/using-git-without-feeling-stupid-part-2"&gt;A git tutorial on the GNU Smalltalk blog&lt;/a&gt; has part of the answer:&lt;/p&gt;

&lt;p&gt;&lt;i&gt;What git add does is to move the current version of the named file to a special staging area, holding files that are ready to be committed&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/blog/196-gittogether-2008"&gt;The GitHub blog&lt;/a&gt; reports that &lt;code&gt;git add&lt;/code&gt; may soon take on the new name &lt;code&gt;git stage&lt;/code&gt;, to reflect this.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;I’m excited that staging files may soon be done via ‘git stage’ rather-than/in-addition-to ‘git add’. This is nice for new users who often have a hard time seeing why you have to keep ‘git add’ing to stage your changes.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;The GNU Smalltalk git tutorial's interesting and worth reading. I also stumbled across an awesome feature I hadn't known about: &lt;code&gt;git add&lt;/code&gt; (aka &lt;code&gt;stage&lt;/code&gt;) has an &lt;a href="http://www.kernel.org/pub/software/scm/git-core/docs/git-add.html"&gt;&lt;i&gt;interactive console&lt;/i&gt;&lt;/a&gt; like IRB or the Rails console. You can also use it for &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-commit.html"&gt;commits&lt;/a&gt;. I'm going to give that a whirl and I'll post here if I get any interesting results.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>giles@entp.com</name>
    </author>
    <id>tag:hoth.entp.com,2008-10-31:3041</id>
    <published>2008-10-31T19:32:00Z</published>
    <updated>2008-10-31T19:32:20Z</updated>
    <link href="http://hoth.entp.com/2008/10/31/asdf" rel="alternate" type="text/html" />
    <title>Craziness Considered Irrelevant</title>
<content type="html">
            &lt;p&gt;ENTP has some of the best programmers in the Rails community. I'm lucky to be a part of a group like this. Some companies organize around best practices and competent coders. That's great, but it's not enough - it's middle-of-the-road. ENTP's more like the Avengers or the Justice League: a team of unusual people who rock at their individual specialities.&lt;/p&gt;

&lt;p&gt;Recently I posted something controversial on my personal blog, and somebody criticized ENTP on Twitter in response. That's unjustified. My views go on my blog, and ENTP's views go on ENTP's blog. I think anybody who uses the Internet understands this. If you need it clarified, consider that the same &lt;i&gt;page&lt;/i&gt; on my blog where my rant appeared also featured a blog post entitled &lt;a href="http://gilesbowkett.blogspot.com/2008/10/cannibal-baby-love-story.html"&gt;&lt;i&gt;Cannibal Baby: The Love Story&lt;/i&gt;&lt;/a&gt;. That is not an ENTP-sponsored post &lt;i&gt;either&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;Courtenay, ENTP's founder, gives this as his official position:&lt;/p&gt;

&lt;p&gt;&lt;i&gt;I formed ENTP after reading a book, &lt;i&gt;&lt;a href="http://www.amazon.com/Lucky-Smart-Secrets-Entrepreneurial-Life/dp/140006290X"&gt;Lucky or Smart?&lt;/i&gt; by Bo Peabody&lt;/a&gt;. It's a tiny book, and really you only need to read the first chapter. Following his inspiration, I went out to find the smartest motherf*ckers in my field, get them together, and let them do their thing.&lt;/i&gt;&lt;/p&gt;
  
&lt;p&gt;&lt;i&gt;We give people a free reign to do pretty much whatever they want: that's the point. Recently Giles wrote some batshit crazy post, on his own blog. Some people thought that it reflected poorly on our company. I had a much longer post written, but the summary of it is this: we know that Giles is crazy, we knew that when we hired him. Giles is a foundry of many, many awesome ideas. He also has some terrible ones. The opinions and words he writes on his own blog are his alone, and while I personally disagree with some of them, his good ideas are &lt;b&gt;really&lt;/b&gt; good, and he's a valuable asset to our company.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Courtenay isn't the only person at ENTP to disagree with my controversial stance. Only one person at ENTP said that they thought any part of my post seemed even slightly reasonable &lt;i&gt;at all&lt;/i&gt;. Even if they had agreed, it would have had nothing to do with the company. Like Courtenay says, I have a reputation for taking controversial stances and creating innovative projects. They hired me for the innovation, and they knew they'd have to take the crazy along with it.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>giles@entp.com</name>
    </author>
    <id>tag:hoth.entp.com,2008-10-31:3038</id>
    <published>2008-10-31T08:49:00Z</published>
    <updated>2008-10-31T08:49:33Z</updated>
    <link href="http://hoth.entp.com/2008/10/31/what-s-hot-on-github-entp" rel="alternate" type="text/html" />
    <title>What's Hot On GitHub: ENTP</title>
<content type="html">
            &lt;p&gt;Ruby Inside's monthly &lt;a href="http://www.rubyinside.com/whats-hot-on-github-october-2008-1246.html"&gt;&lt;i&gt;What's Hot On GitHub?&lt;/i&gt;&lt;/a&gt; post features two projects this month by developers at ENTP: &lt;a href="http://github.com/entp/astrotrain/tree/master"&gt;astrotrain&lt;/a&gt; and &lt;a href="http://github.com/entp/seinfeld/tree/master"&gt;seinfeld&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Astrotrain&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&amp;lt;object height="344" width="425"&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;embed src="http://www.youtube.com/v/nVCa7UisifE&amp;amp;hl=en&amp;amp;fs=1" height="344" width="425"&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;&lt;/p&gt;

&lt;p&gt;Astrotrain is an experimental e-mail to Web router. It receives incoming mail and turns it into HTTP POST requests. If you've seen the innovative and intuitive way &lt;a href="http://www.tripit.com/"&gt;Tripit&lt;/a&gt; folds e-mail into its user interface, Astrotrain's a similar kind of project.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Seinfeld&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&amp;lt;object height="344" width="425"&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;embed src="http://www.youtube.com/v/hllDWSbuDsQ&amp;amp;hl=en&amp;amp;fs=1" height="344" width="425"&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;&lt;/p&gt;

&lt;p&gt;Seinfeld is the code which powers &lt;a href="http://calendaraboutnothing.com/"&gt;Calendar About Nothing&lt;/a&gt;, which is based on a &lt;a href="http://lifehacker.com/software/motivation/jerry-seinfelds-productivity-secret-281626.php"&gt;classic LifeHacker post&lt;/a&gt; about Jerry Seinfeld.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;[Seinfeld] said the way to be a better comic was to create better jokes and the way to create better jokes was to write every day. But his advice was better than that. He had a gem of a leverage technique he used on himself and you can use it to motivate yourself—even when you don't feel like it.&lt;/p&gt;

&lt;p&gt;He revealed a unique calendar system he uses to pressure himself to write. Here's how it works.&lt;/p&gt;

&lt;p&gt;He told me to get a big wall calendar that has a whole year on one page and hang it on a prominent wall. The next step was to get a big red magic marker.&lt;/p&gt;

&lt;p&gt;He said for each day that I do my task of writing, I get to put a big red X over that day. "After a few days you'll have a chain. Just keep at it and the chain will grow longer every day. You'll like seeing that chain, especially when you get a few weeks under your belt. Your only job next is to not break the chain."&lt;/p&gt;

&lt;p&gt;"Don't break the chain," he said again for emphasis.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://s3.amazonaws.com/giles/whats_hot_103108/october.jpg"&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>giles@entp.com</name>
    </author>
    <id>tag:hoth.entp.com,2008-10-30:3037</id>
    <published>2008-10-30T19:55:00Z</published>
    <updated>2008-10-31T09:01:27Z</updated>
    <link href="http://hoth.entp.com/2008/10/30/link-up-lighthouse-to-github" rel="alternate" type="text/html" />
    <title>Lighthouse/GitHub Integration Screencast</title>
<content type="html">
            &lt;p&gt;Cameron Westland from BigBang Technology &lt;a href="http://bigbangtechnology.com/blog/post/setting_up_communication_between_github_and_lighthouse_via_a_secure_token"&gt;posted a screencast&lt;/a&gt; demonstrating how to use Lighthouse and GitHub web hooks to view your GitHub changesets from within your Lighthouse project.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Integrating Github with Lighthouse has been a great time saver. It has allowed us to stay on top of fixes and keep track of everything we're doing in one place. We don't need to have everyone looking through the git logs now! This short screencast shows you how to get things set up.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;These features are easy to use and make your Lighthouse experience better. &lt;a href="http://bigbangtechnology.com/blog/post/setting_up_communication_between_github_and_lighthouse_via_a_secure_token"&gt;Check out the screencast&lt;/a&gt; - it's short, clear, and to the point.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>justin</name>
    </author>
    <id>tag:hoth.entp.com,2008-10-07:3030</id>
    <published>2008-10-07T00:15:00Z</published>
    <updated>2008-10-07T15:27:42Z</updated>
    <category term="badge" />
    <category term="github" />
    <category term="jquery" />
    <category term="lighthouse" />
    <link href="http://hoth.entp.com/2008/10/7/add-lighthouse-tickets-to-your-github-wiki-4" rel="alternate" type="text/html" />
    <title>Add Lighthouse tickets to your GitHub wiki</title>
<content type="html">
            &lt;p&gt;&lt;img src="http://hoth.entp.com/assets/2008/10/6/lighthouse-badge.png" alt="Lighthouse Tickets on Github" /&gt;&lt;/p&gt;

&lt;p&gt;In case you've missed it, we're drinking the &lt;a href="http://github.com"&gt;Github&lt;/a&gt; Kool-Aid extensively.  One request we've heard quite often is a way to show your Lighthouse tickets on your Github wiki.  Check out the newly minted &lt;a href="http://github.com/Caged/lighthouse-badge/wikis/home"&gt;Lighthouse badge&lt;/a&gt;.  Just include a little bit of code and the JavaScript file into your wiki and you have your list:&lt;/p&gt;

&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;span style=&amp;quot;display:none&amp;quot; id=&amp;quot;lighthouse-parameters&amp;quot;  account=&amp;quot;activereload&amp;quot; query=&amp;quot;state:open&amp;quot;&amp;gt;YOUR API KEY&amp;lt;/span&amp;gt;
&amp;lt;div&amp;gt;&amp;lt;script src=&amp;quot;http://github.com/Caged/lighthouse-badge/tree/master/src/lighthouse-badge.js?raw=true&amp;quot;&amp;lt;/script&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span&gt;Because Github doesn't allow inline script blocks, you specify your parameters with a hidden span&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href="http://github.com/Caged/lighthouse-badge/tree/master"&gt;README&lt;/a&gt; for full instructions and be sure to watch the project to keep up with changes.  This is a preliminary version that uses jQuery, but we plan on expanding this in the days to come.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>rick</name>
    </author>
    <id>tag:hoth.entp.com,2008-09-30:3016</id>
    <published>2008-09-30T17:56:00Z</published>
    <updated>2008-10-01T16:59:53Z</updated>
    <link href="http://hoth.entp.com/2008/9/30/warehouse-is-now-open-source" rel="alternate" type="text/html" />
    <title>Warehouse is now open source</title>
<content type="html">
            &lt;p&gt;After a long vacation, we’ve decided to release &lt;a href="http://warehouseapp.com/"&gt;Warehouse&lt;/a&gt; as open source.  The fact is, we (and most of our target audience) moved from subversion to git or mercurial.  Also, the Logical Awesome guys scare us.  First, there’s their &lt;a href="http://github.com/"&gt;kick ass git commit browser&lt;/a&gt; out there that embodies the spirit of git exceptionally well.  Then, they prove that they can do &lt;a href="http://svnhub.com/"&gt;Subversion hosting&lt;/a&gt; better than us.  Yikes.  &lt;/p&gt;

&lt;p&gt;What happens to the current customers?  We’ll be issuing refunds out for anyone that’s purchased in the last two months (that’s as far as Paypal will go back).  Anyone else that feels they should get a refund can &lt;a href="company@activereload.net"&gt;contact me&lt;/a&gt; and we’ll work something out.  We’ll still be providing support at &lt;a href="http://forum.activereload.net"&gt;the forums&lt;/a&gt;.  It will be getting its own Voxpop instance soon as well.  Oh yes, don’t forget to &lt;a href="http://github.com/entp/warehouse/commit/9be7dcf74c9ae407465aeecc880d3211865f9ad1"&gt;remove the license check&lt;/a&gt; on your existing warehouse installs.  We don’t want to leave you stranded like Walmart music customers.&lt;/p&gt;

&lt;p&gt;There’s still a need for something like Warehouse though.  Something localized for your internal git servers.  We actually need one for the internal ENTP gitosis server, so there’s work started on a &lt;a href="http://github.com/entp/warehouse/tree/master"&gt;git/svn hybrid version&lt;/a&gt;.  I’ve spoken with several people interested in this, so I’m hoping we can get this finished up relatively soon.  It’d also be really cool if someone could add mercurial support :)  &lt;/p&gt;

&lt;p&gt;We’re going with the &lt;a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html"&gt;AGPL license&lt;/a&gt; and have the source (both the &lt;a href="http://github.com/entp/warehouse/tree/master"&gt;unreleased master branch&lt;/a&gt; and the &lt;a href="http://github.com/entp/warehouse/tree/rel-1.1.6"&gt;latest 1.1.6 release&lt;/a&gt;) on github.  Thanks for all the support from the Warehouse customers, and happy forking!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://hoth.entp.com/">
    <author>
      <name>giles@entp.com</name>
    </author>
    <id>tag:hoth.entp.com,2008-09-22:3008</id>
    <published>2008-09-22T23:24:00Z</published>
    <updated>2008-09-22T23:29:11Z</updated>
    <link href="http://hoth.entp.com/2008/9/22/vox-populi" rel="alternate" type="text/html" />
    <title>Vox Populi</title>
<content type="html">
            &lt;p&gt;ENTP's launching something new soon. It solves a problem every ticket-tracking system has.&lt;/p&gt;

&lt;p&gt;Here's the scenario: User A finds a bug, submits a ticket. User B finds the exact same bug, submits another ticket. User C finds completely different behavior in the UI which traces back to the exact same bug, submits another ticket. Tech Support Person goes, oh, these are all the same ticket, and closes out two of the three.&lt;/p&gt;

&lt;p&gt;User B and User C complain about their tickets being closed. They're still seeing the bugs, so they open new tickets. Which Tech Support Person then closes again. The cycle repeats until the bug's eliminated, or until the heat death of the universe.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;FAIL&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;At ENTP, we're fans of Post-It Notes.&lt;/p&gt;

&lt;p&gt;&amp;lt;object height="285" width="507"&gt;	&amp;lt;param /&gt;	&amp;lt;param /&gt;	&amp;lt;param /&gt;	&amp;lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=1700732&amp;amp;amp;server=vimeo.com&amp;amp;amp;show_title=1&amp;amp;amp;show_byline=1&amp;amp;amp;show_portrait=1&amp;amp;amp;color=00ADEF&amp;amp;amp;fullscreen=1" height="285" width="507"&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/1700732?pg=embed&amp;amp;amp;sec=1700732"&gt;EepyBird's Sticky Note experiment&lt;/a&gt; from &lt;a href="http://vimeo.com/user737605?pg=embed&amp;amp;amp;sec=1700732"&gt;Eepybird&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;amp;sec=1700732"&gt;Vimeo&lt;/a&gt;.

&lt;p&gt;The brilliant thing about the Post-It Note: &lt;i&gt;simplicity&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;The simple solution to this age-old ticket-tracking problem is to say there's a difference between bug reports and tickets. With Vox Populi you're going to have a user-oriented front end to Lighthouse that separates user observations from task scheduling. You won't have to care if other tickets exist already. &lt;a href="http://alienlovespredator.com/?id=80"&gt;If you see something, say something&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
</feed>
