<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><description>I’m Sean Johnson, the founder of Snooty Monkey.This is Monkey Opus, the Snooty Monkey Blog.</description><title>Monkey Opus</title><generator>Tumblr (3.0; @snootymonkey)</generator><link>https://blog.snootymonkey.com/</link><item><title>High Geek Humor</title><description>Brett: ls&lt;br /&gt;&#13;
Brett: sorry, wrong window!&lt;br /&gt;&#13;
Sean:&lt;br /&gt;&#13;
stuff.txt&lt;br /&gt;&#13;
music.mp3&lt;br /&gt;&#13;
todo.txt&lt;br /&gt;&#13;
Sean: -bash: sorry: command not found&lt;br /&gt;&#13;
Brett: lol&lt;br /&gt;&#13;
Sean: -bash: lol: command not found&lt;br /&gt;&#13;
Brett: lol &gt;&gt; /dev/null 2&gt;&amp;1&lt;br /&gt;&#13;
Sean:</description><link>https://blog.snootymonkey.com/post/31055417236</link><guid>https://blog.snootymonkey.com/post/31055417236</guid><pubDate>Fri, 07 Sep 2012 09:30:00 -0400</pubDate></item><item><title>Git Better</title><description>&lt;p&gt;&lt;a href="http://git-scm.com/" target="_blank"&gt;Git&lt;/a&gt; (along with the &lt;a href="https://github.com/" target="_blank"&gt;GitHub&lt;/a&gt; web app) is the best version control system I&amp;rsquo;ve ever used. And it&amp;rsquo;s not even close. Git is so much better than all the version control systems I used before it (SVN, Perforce, SourceSafe, CVS and RCS) that it&amp;rsquo;s hard to compare them. They don&amp;rsquo;t even seem to be the same kind of products. It&amp;rsquo;s like trying to compare a train and a cruise-ship because they both happen to be means of transportation. I just have to exclaim, &amp;ldquo;It&amp;rsquo;s BETTER!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Besides a better personal and team development workflow, git and GitHub have been instrumental to opening up the open source world to wider participation. It’s hard to find a working developer who uses git and GitHub, and hasn’t contributed to an open source project. That just wasn&amp;rsquo;t the case a few years ago when SVN ruled the scene and contributions were by emailed patches rather than pull requests. The ability to own your own version of a project with 1 click of the mouse (or entry at the command-line) and the ability to contribute back your improvements with 1 click, with neither click requiring permission, has been transformative.&lt;/p&gt;
&lt;p&gt;All that being said, git still gets lots of well deserved flack, and not just from proponents of other distributed version control systems, like Mercurial (which I&amp;rsquo;m sure is great too), but from git&amp;rsquo;s users. Yes, there are lots of ways git could be improved, and it seems to be getting better all the time, but one thing I&amp;rsquo;ve not seen discussed is better handling of in progress changes on a single machine.&lt;/p&gt;
&lt;p&gt;Git&amp;rsquo;s greatest strength, making branching easy and common place, leads to personal and team workflows that involve a lot of moving from branch to branch. When every feature and fix gets its own branch, and you are participating in code reviews, and handling pull requests and doing all the wonderful things git makes possible, you can be switching branches dozens of times a day, even dozens of times an hour. The problem is your uncommitted changes come with you from branch to branch! This is madness.&lt;/p&gt;
&lt;p&gt;Just commit them or stash them you say? Sure, that is the current idea. When you need to change branches you have some choices, commit or stash, lose the changes or take them with you. But why not leave them where they are?&lt;/p&gt;
&lt;p&gt;Your change is incomplete. It&amp;rsquo;s in progress. Committing broken, half done things feels wrong. Stashing? It&amp;rsquo;s fine, but it&amp;rsquo;s manual, time consuming and error prone. It&amp;rsquo;s a hassle. Taking changes with you is not always an option (if the other branch conflicts) or a good idea (if the changes have nothing to do with the other branch). Why not just have a smarter git that lets you leave them where they are?&lt;/p&gt;
&lt;p&gt;I want to checkout a different branch and have my in progress changes to the current branch just stay where they are, as uncommitted changes to the working copy of that branch. When I change back to the branch later, my changes are sitting there just as I left them, ready for me to pick back up that work. You can&amp;rsquo;t tell me this isn&amp;rsquo;t how git should work! It just makes sense.&lt;/p&gt;
&lt;p&gt;Occasionally you do want the changes to come with you, and there is backwards compatibility to worry about, so it can probably be a flag:&lt;/p&gt;
&lt;p&gt;git checkout -keep &amp;lt;other branch&amp;gt;&lt;/p&gt;
&lt;p&gt;-or-&lt;/p&gt;
&lt;p&gt;git checkout -leave &amp;lt;other branch&amp;gt;&lt;/p&gt;
&lt;p&gt;-or-&lt;/p&gt;
&lt;p&gt;git checkout -stash &amp;lt;other branch&amp;gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m no expert on git internals, and I&amp;rsquo;m sure git would need to do some fancy things to pull this off. I can imagine reusing the stash feature to implement the mechanics of this, but preferably in a way that&amp;rsquo;s cordoned off from the normal stash so that the stash continues to work as is today and doesn&amp;rsquo;t get cluttered up with these auto-stashes.&lt;/p&gt;
&lt;p&gt;I could be completely off on the implementation details, but I&amp;rsquo;m not off on the desirability of this feature. What say you git developers?&lt;/p&gt;
&lt;p&gt;Not a git developer but think this is a wonderful idea? It can probably be done as a wrapper. Send me the GitHub link when you have it working! :-)&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/25156033379</link><guid>https://blog.snootymonkey.com/post/25156033379</guid><pubDate>Fri, 15 Jun 2012 09:01:00 -0400</pubDate><category>version control</category></item><item><title>Shaving the Yak (or why software development is so distracting)</title><description>&lt;p&gt;tldr; software development is prone to distractions as new tasks spin out from the original task. Developers should try a productivity aid (just a notebook, text editor, or outliner to start) to help them manage this phenomenon, mainly by increasing their awareness of the issue as it happens.&lt;/p&gt;
&lt;hr&gt;&lt;p&gt;For non-developers that might be reading this, the &lt;a href="http://en.wikipedia.org/wiki/Call_stack" target="_blank"&gt;call stack&lt;/a&gt; (or just stack) is the place where an executing program keeps track of what it is doing. When part of a program calls to another part of the program, an entry is placed on the stack so that when the other part of the program is finished, the program returns back to the original point where the call was made, and the program continues on from there. This layering of the stack as one procedure calls another which calls another, and so on, can get very deep. The stack can get so deep in fact, that the execution of the program must be abandoned. When this happens it is called a stack overflow (which is where the name for the &lt;a href="http://stackoverflow.com/" target="_blank"&gt;software development Q&amp;amp;A site&lt;/a&gt; comes from).&lt;/p&gt;
&lt;p&gt;Why mention this (simplistic) definition of a call stack? Because software developers often use the stack as an analogy to the functioning of the human mind. You start one task and realize that to complete it, you need to do some other thing, but to complete that other thing, you need to first do a third thing, and so on. When this happens, your mind is acting like a call stack. What you really want to do is task A, but you are actually working on task C, because task C is needed to complete task B, which is in turn needed to complete task A. You have to keep track of all of this.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s consider filling out your income taxes by way of an example. You want to complete your taxes on time, but to do that you need to have a list of all your deductions, and to do that you need to know what your out of pocket medical expenses were, and to do that you need a receipt that you are missing from your dentist, and to get a copy of the receipt you need to call them, and to call them you need to find their phone number. So you find yourself Googling local dentists rather than completing your taxes (frankly, you&amp;rsquo;d be better off texting them). In a sense you &lt;em&gt;are&lt;/em&gt; completing your taxes by Googling for dentists, but there are some important risks you start to face when your call stack gets this deep.&lt;/p&gt;
&lt;p&gt;One risk is analogous to stack overflow. Your stack gets so deep that you can no longer keep track of everything. It could be that you find yourself so far removed from your original task that you can&amp;rsquo;t remember what all the intermediate steps were, or you just abandon the whole affair because the original task starts to feel hopelessly remote. Here&amp;rsquo;s an example of what this can feel like, &amp;ldquo;Let&amp;rsquo;s see, I was originally sitting down here to work on my taxes, and I just now found that email from Frank from back in September, once I Googled a solution to getting my email search working again, and tried the third solution after the first two didn&amp;rsquo;t work, and I down-voted those and up-voted the third one, so I now see that the Dallas meeting was in September, and that means that my hunch was right, Jeff couldn&amp;rsquo;t have been there and hmmm&amp;hellip; why do I care if Jeff was at the Dallas meeting? What&amp;rsquo;s that got to do with my taxes?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Another type of risk of a deep stack is that one of these sub-tasks becomes huge and time consuming to complete. This is very common in software development. So common in fact that software developers have special names for this: a rat&amp;rsquo;s nest, a rabbit hole, or &lt;a href="http://www.catb.org/jargon/html/Y/yak-shaving.html" target="_blank"&gt;yak shaving&lt;/a&gt;. Whole companies have been built as a side effect of this common phenomenon. Developers come up with a good solution for problem C, so they can get task B done, so they can build product A, only to realize that the benefits of a solution to problem C actually make for a more compelling product (or at least one that&amp;rsquo;s already built).&lt;/p&gt;
&lt;p&gt;This morning, I found myself in this ridiculous call stack:&lt;/p&gt;
&lt;p&gt;13. Googling lots of links to put in this blog post because I&amp;rsquo;m a compulsive hyperlinker.&lt;/p&gt;
&lt;p&gt;12. Writing this blog post because I realized how deep my call stack had gotten this morning, and feeling like it was a common and vexing problem that all of us, but especially developers, regularly face. Maybe by examining the problem, describing it, and thinking about possible solutions, I can help myself and others.&lt;/p&gt;
&lt;p&gt;11, Googling for solutions on how to get &lt;a href="http://www.haskell.org/cabal/" target="_blank"&gt;Cabal&lt;/a&gt; (a &lt;a href="http://www.haskell.org/haskellwiki/Haskell" target="_blank"&gt;Haskell&lt;/a&gt; package manager) to use &lt;a href="http://gcc.gnu.org/" target="_blank"&gt;gcc&lt;/a&gt; on the Mac when it&amp;rsquo;s not in /Developer/usr/bin/gcc. Answer: use a sym-link as specified &lt;a href="http://www.haskell.org/pipermail/cabal-devel/2011-October/007843.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;10. Using Cabal to &lt;a href="https://github.com/jgm/pandoc/blob/master/INSTALL" target="_blank"&gt;install pandoc&lt;/a&gt;, a markdown converter written in Haskell.&lt;/p&gt;
&lt;p&gt;9. Using &lt;a href="http://johnmacfarlane.net/pandoc/" target="_blank"&gt;pandoc&lt;/a&gt; to convert a &lt;a href="http://en.wikipedia.org/wiki/Textile_(markup_language)" target="_blank"&gt;textile&lt;/a&gt; &lt;a href="https://gist.github.com/1839777" target="_blank"&gt;gist&lt;/a&gt; I found and &lt;a href="https://gist.github.com/2419995" target="_blank"&gt;forked&lt;/a&gt; that documents &lt;a href="http://www.sublimetext.com/blog/articles/sublime-text-2-beta" target="_blank"&gt;Sublime Text 2&lt;/a&gt; &lt;a href="https://gist.github.com/1839777" target="_blank"&gt;keyboard shortcuts&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;9 (aborted). Trying to get &lt;a href="http://markedapp.com/" target="_blank"&gt;Marked&lt;/a&gt; to &lt;a href="http://brettterpstra.com/using-textile-in-marked/" target="_blank"&gt;use&lt;/a&gt; &lt;a href="http://redcloth.org/" target="_blank"&gt;RedCloth&lt;/a&gt; to render textile.&lt;/p&gt;
&lt;p&gt;8. Trying to get Marked to render the local version of the shortcut reference.&lt;/p&gt;
&lt;p&gt;7. Trying to move the shortcut reference, so I can edit and preview it locally in Marked rather than as a gist because I&amp;rsquo;m worried I&amp;rsquo;ll lose track of the gist.&lt;/p&gt;
&lt;p&gt;6. Modifying the shortcut reference I found to contain just the shortcuts I&amp;rsquo;m likely to use in an order that makes more sense for me.&lt;/p&gt;
&lt;p&gt;5. Googling for shortcut references for Sublime Text 2.&lt;/p&gt;
&lt;p&gt;4. Looking up Sublime Text 2 keyboard shortcuts so I can get more comfortable with Sublime Text 2.&lt;/p&gt;
&lt;p&gt;3. Working to get more comfortable with Sublime Text 2 so I can use it rather than &lt;a href="http://macromates.com/" target="_blank"&gt;TextMate.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. Switching away from TextMate because the &lt;a href="http://clojure.org/" target="_blank"&gt;Clojure&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Common_Lisp" target="_blank"&gt;Common Lisp&lt;/a&gt; support is not really up to snuff.&lt;/p&gt;
&lt;p&gt;1. Setting up a reasonably productive Clojure development environment that&amp;rsquo;s not &lt;a href="http://www.gnu.org/software/emacs/" target="_blank"&gt;Emacs&lt;/a&gt; (my wife won&amp;rsquo;t let me grow a &lt;a href="https://www.google.com/search?q=neckbeard&amp;amp;um=1&amp;amp;ie=UTF-8&amp;amp;hl=en&amp;amp;tbm=isch&amp;amp;source=og&amp;amp;sa=N&amp;amp;tab=wi&amp;amp;authuser=0&amp;amp;ei=oAiQT5jhLOLo0QGw58SLBQ&amp;amp;biw=1280&amp;amp;bih=1505&amp;amp;sei=owiQT8iNKIHk0QHcxK2pBQ" target="_blank"&gt;neckbeard&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Meta-goal: Start to work more with Clojure for use on some projects (and tangentially Common Lisp because I&amp;rsquo;m not a big fan of the &lt;a href="http://en.wikipedia.org/wiki/Java_virtual_machine" target="_blank"&gt;JVM&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;At some point I got deep enough in this stack to realize I was in trouble, but it took the reconstruction of this call stack just now to realize how much trouble I was truly in (I&amp;rsquo;d have guessed my stack was about 4 deep).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Given a stack this deep, how much time has gone by?&lt;br/&gt;&lt;strong&gt;A: &lt;/strong&gt;About 3 hours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; How much have I got accomplished towards my original task #1?&lt;br/&gt;&lt;strong&gt;A&lt;/strong&gt;: Almost nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; How often has this happened with the task #1?&lt;br/&gt;&lt;strong&gt;A&lt;/strong&gt;: This is the second day in a row; different call stack, same result.&lt;/p&gt;
&lt;div&gt;&lt;strong&gt;Q:&lt;/strong&gt; Sitting there at task #11, what are my chances of getting back on task with the original goal?&lt;br/&gt;&lt;strong&gt;A:&lt;/strong&gt; Very low.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Q:&lt;/strong&gt; How many of these calls where unavoidably necessary and how many of them could have been skipped to stay on task?&lt;br/&gt;&lt;strong&gt;A:&lt;/strong&gt; This is a judgement call, but from #6 on, I was pretty far off the rails.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Q:&lt;/strong&gt; If any of these tasks turned into a rat&amp;rsquo;s nest and started taking more time than their value towards the original task warranted, would I have been aware and known to turn back?&lt;br/&gt;&lt;strong&gt;A:&lt;/strong&gt; No, in fact #6 turned into a rat&amp;rsquo;s nest but I plunged ahead anyway.&lt;/div&gt;
&lt;p&gt;So what could have improved this? I think the solution to this problem lies mostly in increased awareness. If someone had tapped me on the shoulder, described the call stack I was in, and asked, &amp;ldquo;Is this a rational plan to achieve #1?&amp;rdquo; I would have blushed, said &amp;ldquo;no&amp;rdquo;, and immediately adjusted my activities.&lt;/p&gt;
&lt;p&gt;I sometimes serve this role with my co-workers when I notice some task is taking a long time or when they come to me asking for help on some issue that seems very remote from what they are ostensibly working on. My first response is often to ask them to recreate the stack so we can decide together if some of it needs rolled back.&lt;/p&gt;
&lt;p&gt;Usually no one is there to prompt us to be more efficient so we need to be able to prompt ourselves. We need to develop a self-awareness of this common and productivity sapping pattern. How might we do this?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to try doing it with a textual call stack. As I work, I&amp;rsquo;m going to jot little notes about what I&amp;rsquo;m doing, why I&amp;rsquo;m doing it, and when I started.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;1 - 5:17 AM - Setup a productive Clojure environment&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;2 - 5:17 AM - search the web and read about Clojure/REPL/editor integration&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;2 - 5:25 AM - Setup Sublime Text 2&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;3 - 5:25 AM - D/L Sublime Text 2&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;3 - 5:26 AM - Read about Sublime Text 2 extensions&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;3 - 5:31 AM - Install Sublime REPL extension&lt;/strike&gt;&lt;/li&gt;
&lt;li&gt;3 - 5:31 AM - Configure Sublime REPL extension for use with Clojure&lt;/li&gt;
&lt;li&gt;4 - 5:32 AM - Google error with Sublime REPL and Clojure&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;If this method, once iterated upon, proves to be effective, I&amp;rsquo;ll consider creating something that helps with the process. I can imagine that help with automatically entering the time and depth, calculating the elapsed time, &amp;ldquo;popping&amp;rdquo; the stack, getting alerts when too much time is spent on deep tasks (too much time probably being relative to depth of the task) and help with task switching (freezing one stack so you can resume work on another). All of these could probably be very beneficial to this process, but at this point the minimally viable tool to try this out is a notebook or text editor window in a very prominent place.&lt;/p&gt;
&lt;p&gt;Is this a good idea? Let&amp;rsquo;s &lt;a href="http://news.ycombinator.com/item?id=3867811" target="_blank"&gt;discuss it on HackerNews&lt;/a&gt;. If do you try it out, let me know if it helps you and I&amp;rsquo;ll be sure to report back on my results too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I&amp;rsquo;m going to use &lt;a href="http://www.topoftree.jp/en/tree/" target="_blank"&gt;Tree&lt;/a&gt; for the Mac (a left to right outliner) rather than a text file so that &amp;ldquo;calling&amp;rdquo; and &amp;ldquo;popping&amp;rdquo; are easier and so my call stack depth (how far in the weeds I am) is more visually apparent.&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/21377807221</link><guid>https://blog.snootymonkey.com/post/21377807221</guid><pubDate>Thu, 19 Apr 2012 08:29:00 -0400</pubDate><category>development</category><category>productivity</category></item><item><title>Snooty Monkey: Andrew's Perspective</title><description>&lt;p&gt;&lt;em&gt;Guest post by Andrew, one of the Snooty Monkeys.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I met Sean the same year that Snooty Monkey was started. At the time, I was working on a digital textbook application called ezLearnz, while working at a day job that had nothing to do with software. Sean was also working on an education app called Live Syllabus, while working a day job at IBM. We saw the possibility of a 1 + 1 = 3 situation&amp;hellip; known as a synergistic relationship in the corporate world we were working in at the time.&lt;/p&gt;
&lt;p&gt;Sean and I met regularly on Saturday mornings for more than a year. During this time, Sean mentored my process of becoming a software developer and we discussed educational topics, including an idea very similar to what is now &lt;a href="http://p2pu.org/" target="_blank"&gt;P2PU&lt;/a&gt;. We realized we were both passionate about products that simplify and facilitate education and learning. In the end, we did not continue to pursue either of our education apps; we realized the education landscape was changing too rapidly, and what was missing from existing products was a revolutionary user interface that would radically improve users&amp;rsquo; learning experience. During this time, I started getting interested in self-improvement apart from our discussions on the subject.&lt;/p&gt;
&lt;p&gt;A year later, I started contracting for SnootyMonkey. Our discussions on education continued, but at this point broadened to self-improvement, philosophy, maximizing global happiness, and other interesting thoughts.&lt;/p&gt;
&lt;p&gt;Recently I&amp;rsquo;ve become interested in the softer skills of web app development, particularly marketing. I like the idea of becoming a well-rounded web app generalist&amp;hellip; being able to not only create an awesome app, but find people willing to pay for it. Luckily, Snooty Monkey happens to be in need of a suitably Snooty (yet open, transparent, and ethical) Marketer. And applying Snooty Monkey&amp;rsquo;s new tagline, &amp;ldquo;Simple Self-Improvement for a Complex World&amp;rdquo; to my own career, while improving Snooty Monkey, is just so deliciously recursive. Stay tuned for more Simian Snootiness as I work to figure out ethical web marketing!&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/11151931845</link><guid>https://blog.snootymonkey.com/post/11151931845</guid><pubDate>Fri, 07 Oct 2011 17:06:00 -0400</pubDate></item><item><title>A New Direction for Monkey Opus</title><description>&lt;p class="p1"&gt;The Snooty Monkey tagline is a common household phrase of course. But just in case anyone reading this is a recent immigrant from Papa New Guinea, or just concluded a multi-year NASA space travel deprivation experiment, the tagline is, &amp;ldquo;Simple Software for a Complex World&amp;rdquo;.&lt;/p&gt;
&lt;p class="p1"&gt;As of this moment, Snooty Monkey has a new tagline, &amp;ldquo;Simple Self-Improvement for a Complex World&amp;rdquo;. Why the new tag line? The old tagline reflected a clear mission in 2008, let me take my skills as a &amp;ldquo;software product person&amp;rdquo; and build a self-supporting consultancy, lest my family starve to death. The new tagline reflects an &lt;a href="http://blog.snootymonkey.com/post/10740247408/snooty-monkey-lessons-learned" target="_blank"&gt;aspirational change here at the end of 2011&lt;/a&gt;, and it better fits the broader original goal of Snooty Monkey, which was to create a bootstrapped software company.&lt;/p&gt;
&lt;p class="p1"&gt;This brings me to the actual topic of this blog post, changes in &lt;strong&gt;Monkey Opus&lt;/strong&gt; (which happens to be the very blog you are reading). In the past &lt;strong&gt;Monkey Opus&lt;/strong&gt; has not been terribly focused. There has been a mix of entrepreneurship, product management, and technology topics. Moving forward, the focus will narrow. It&amp;rsquo;s not that entrepreneurship, product management, and technology topics will never be discussed here. I certainly won&amp;rsquo;t be able to always resist that temptation, but the major focus of &lt;strong&gt;Monkey Opus &lt;/strong&gt;is now self-improvement.&lt;/p&gt;
&lt;p class="p1"&gt;Why self-improvement? Because it&amp;rsquo;s what Snooty Monkey is all about as a software company. We are all monkeys. This life of ours is our opus. Let&amp;rsquo;s be snooty about it and make it a good one!&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/10954512976</link><guid>https://blog.snootymonkey.com/post/10954512976</guid><pubDate>Sun, 02 Oct 2011 18:35:47 -0400</pubDate></item><item><title>Snooty Monkey: Lessons Learned</title><description>&lt;p&gt;Snooty Monkey was started in 2008 as an experiment. The focus of the experiment? Can a CTO / Lead Developer / Product Manager type (that&amp;rsquo;s me by the way) create a hybrid micro-ISV / consultancy company? One that purposely stays small (just me? me and 2?), while serving a niche client base (bootstrapped entrepreneurs) with a niche service (temporary technical co-founder). Can doing this afford me the time to experiment with software products of my own without the traditional startup pressure that each one be a hit or the whole company fails?&lt;/p&gt;
&lt;p&gt;Unlike a good experiment, where things are tested one at a time and variables are controlled, by necessity this experiment had lots of variables and was chaotic at times. The grand experiment is far from over, in many ways it&amp;rsquo;s just begun, but some of these experiments have now run their course, their questions have been answered and the results are ready for review and confirmation by the rest of the scientific community. It&amp;rsquo;s time to refocus the lab on new questions.&lt;/p&gt;
&lt;p&gt;So, what has been tested so far with Snooty Monkey? What were the hypotheses? And what can now be concluded?&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Experiment&lt;/strong&gt;: Can I support my family without a &amp;ldquo;job&amp;rdquo;?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;: Yes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;: Yes. I&amp;rsquo;ve worked for myself since early 2009. I have yet to take the plunge and hire an employee, but Snooty Monkey is the main source of income for a few contractors (I call them friends though).&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Experiment&lt;/strong&gt;: Is there a market for a freelance &amp;ldquo;temporary: technical co-founder / CTO / lead developer / product manager&amp;rdquo; in the bootstrapped entrepreneur community?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;: Yes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;: I can say in no uncertain terms that many non-technical founders of bootstrapped startups will be willing to partner for some or all of the technical aspects of their business so they can focus on what they do best, eventually replacing Snooty Monkey with their own technical team when the business finds product/market fit and needs to scale. If you have the skills, drive, maturity and experience to make a good technical co-founder, there is a market for you services for cash rather than equity. In these 3 years, about 80% of the work and about 90% of the revenue for Snooty Monkey has more or less fit the experimental description. At times I&amp;rsquo;ve done work for big companies (mostly sub-contracted through interactive marketing firms) and for venture-funded startups, and almost without fail, this work has been less rewarding and fulfilling for me and less successful for the company. At the end of the day, I&amp;rsquo;m a technical entrepreneur. If I&amp;rsquo;m doing something else for you, you&amp;rsquo;re probably not getting as much bang for your buck as you should and I&amp;rsquo;m probably not having as much fun as I should.&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Experiment&lt;/strong&gt;: Can I pick and chose the projects I want to work with to fit my technical interests?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;: Yes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;: Yes. When I left the Biggest Blue Java shop, I made a promise to myself not to work with technology I don&amp;rsquo;t like. I&amp;rsquo;ve built many Ruby on Rails and Objective-C products, and I&amp;rsquo;ve got projects with Erlang, CoffeeScript and even Prolog in them, all of which I really enjoy. The couple of side trips into C++, Flash, Flex, and Java have been few, brief and mostly self-inflicted (Ouch, I forgot how much that sucks! Note to future self&amp;hellip;).&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Experiment&lt;/strong&gt;: Can I pick and chose the projects I want to work with to fit my interests?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;: Yes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;: Mostly no. My main interests are self-improvement, philosophy, literature, sports, alternative software development technology, and education. I&amp;rsquo;ve had some luck building products in the field of sports, but other than that, I&amp;rsquo;ve not had much interest aligning my interests with my bootstrapped entrepreneurs&amp;rsquo; product needs. I&amp;rsquo;ve built many branded marketing apps. I&amp;rsquo;ve built scientific apps, quality assurance apps, customer service apps, healthcare apps, etc. All of these have been very interesting in their own right and I&amp;rsquo;ve learned a ton with each one. But when I work on my own products as Snooty Monkey, I have a perfect fit with my own interests (Snooty Monkey&amp;rsquo;s two current products are in self-improvement and sports). This kind of alignment is a powerful force that should not be undervalued.&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Experiment&lt;/strong&gt;: Can I mantain my own high ethical standards while contracting my time to others?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;: Yes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;: Mostly yes. I&amp;rsquo;ve been extremely impressed with the character of the entrepreneurs I&amp;rsquo;ve been fortunate to work with. I regularly hear and read about startup horror stories starring villainous and greedy entrepreneurs. But the entrepreneurs I&amp;rsquo;ve met and agreed to work with have been some of the most upstanding people I know. They&amp;rsquo;ve been impeccably fair to me and to their customers. I&amp;rsquo;m close to suggesting a hypothesis that entrepreneurs are better people on average than society at large would lead you to expect. The one exception to charting my own ethical course has been in the area of software patents. Unfortunately I&amp;rsquo;ve not seen eye to eye with some of my very best clients about the nature, value and ethical standing of the broken US patent system. The work I&amp;rsquo;ve done in just the last 3 years has led to over a dozen patent applications, many of which I directly helped formulate (Snooty Monkey does work for hire so those patents belong to the clients). I&amp;rsquo;m not proud of this. It is a case of my deeds not living up to my thoughts and words. I&amp;rsquo;m considering declining to directly participate in software patent activities in the future. This could cost Snooty Monkey valuable business.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;In looking back over these questions, I find it a bit difficult to remember how scary and unknown they seemed at the time, I can&amp;rsquo;t help but be pleased at how things have turned out.&lt;/p&gt;
&lt;p&gt;The risk I now face is that I become complacent. I&amp;rsquo;m my own boss, I have a decent income, and I get to work with great people, my team of contractors and bootstrapped entrepreneurs, who want nothing more than for me to succeed. After all, me succeeding is the only way my clients get to succeed. There are no politics, no ulterior motives, and no bureaucracy. It&amp;rsquo;s the business of software in its purest form. Just them and their idea and me and my keyboard.&lt;/p&gt;
&lt;p&gt;In some sense then, I&amp;rsquo;ve become too successful at what I do now, which is helping others build software companies without taking or before taking investment. This is now an 80-hour-a-week job for me. I could do nothing else for the foreseeable future. But it&amp;rsquo;s not what I set out to do. It was all a means to an end. That end being to build my own bootstrapped software company. And not just any software company. I want to create software products that help me improve my life, and if all goes well, help others improve their lives in the same way.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m ready to admit that I&amp;rsquo;m no longer making any progress on this. I&amp;rsquo;ve done some really amazing and cool things since starting Snooty Monkey. I wrote a book, I created some great products, I&amp;rsquo;ve even helped create what are now some great companies. But I need to get this train back on the original track. I need to better balance the two parts of my business. I need to manage my goals, my time, my tasks and my attention to achieve more. I need to improve myself. I need to be better.&lt;/p&gt;
&lt;p&gt;I owe this to myself, I owe it to my family, I owe it to Snooty Monkey&amp;rsquo;s contractors, clients and current and future customers.&lt;/p&gt;
&lt;p&gt;During the last couple of weeks I&amp;rsquo;ve been working with Andrew (one of said contractors) on the seeds of a new plan. This plan is going to germinate and change and grow (or shrivel and die) here in the open on this blog. Get your popcorn ready! It&amp;rsquo;s going to be an exciting show.&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/10740247408</link><guid>https://blog.snootymonkey.com/post/10740247408</guid><pubDate>Tue, 27 Sep 2011 17:54:00 -0400</pubDate></item><item><title>Build Erlang R14Bx on Mac OS X Lion</title><description>&lt;p&gt;Usually to build software from source on Linux or Mac OS X, you follow the pattern:&lt;/p&gt;
&lt;pre&gt;./configure
make
sudo make install
&lt;/pre&gt;
&lt;p&gt;When trying this on Mac OS X Lion you&amp;rsquo;ll find that make is no longer part of the OS like it was with Snow Leopard and before. Instead, it is part of Xcode 4.1 or greater. So you need to head to the Mac App Store app and get your free copy of Xcode 4.1 (or greater) so that you&amp;rsquo;ll have make installed.&lt;/p&gt;
&lt;p&gt;Another wrinkle, specifically for getting Erlang from source, is that there are some obscure flags you need to use with configure to get Erlang to build cleanly. This sequence works (tested on Erlang R14B03 and Lion 10.7 (11A511):&lt;/p&gt;
&lt;pre&gt;CFLAGS=-O0 ./configure --enable-darwin-64bit
make
sudo make install
&lt;/pre&gt;
&lt;p&gt;Thanks to the community on the &lt;a href="http://www.erlang.org/static/doc/mailinglist.html" target="_blank"&gt;Erlang questions mailing list&lt;/a&gt; for collaborating on this solution. I&amp;rsquo;m just passing it along.&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/8127011784</link><guid>https://blog.snootymonkey.com/post/8127011784</guid><pubDate>Wed, 27 Jul 2011 08:42:00 -0400</pubDate><category>Erlang</category><category>mac os x</category><category>Lion</category></item><item><title>Erlang's Treatment of Memory and Threads</title><description>&lt;a href="http://www.javacodegeeks.com/2011/04/erlang-vs-java-memory-architecture.html"&gt;Erlang's Treatment of Memory and Threads&lt;/a&gt;: &lt;p&gt;This is a good, short post on Erlang’s unusual treatment of memory and threads. Substitute “Ruby” or “Python” for “Java” if it makes it easier for you to understand and none of the comparisons will be much different. It serves to explain why you overlook Erlang’s quirky syntax (which I happen to mostly like) when you need extreme concurrency.&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/4580923462</link><guid>https://blog.snootymonkey.com/post/4580923462</guid><pubDate>Wed, 13 Apr 2011 11:08:37 -0400</pubDate><category>Erlang</category></item><item><title>Bringing Serendipity Back</title><description>&lt;p&gt;If Timberlake can bring sexy back, then I guess dictionaries can bring serendipity back too. I&amp;rsquo;m a regular user of online dictionaries and they all seem about the same to me (which is to say, somewhere between pretty bad and awful) so I use them through Google rather than having a go to favorite. I search for the word and then pick one or more of the top 10 hits to look at.&lt;/p&gt;
&lt;p&gt;Today a search on the word &amp;ldquo;monotonist&amp;rdquo; (I know what it should mean, but I said it the other day, and then wondered if it was actually a word or if I just made it up) brought me to this fairly gross site - &lt;a href="http://www.websters-dictionary-online.com/definition/monotonist" target="_blank"&gt;http://www.websters-dictionary-online.com/definition/monotonist&lt;/a&gt; (linked with nofollow to avoid giving them any link juice). I&amp;rsquo;m certain, due to the suspicious lack of branding, the poor performance of the page loads, and the dubiousness and quantity of its ad content, that it&amp;rsquo;s not actually associated with Webster&amp;rsquo;s (which is here - &lt;a href="http://www.merriam-webster.com/" target="_blank"&gt;http://www.merriam-webster.com/&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;What caught my eye was this part of the page:&lt;/p&gt;
&lt;p&gt;&lt;figure class="tmblr-full" data-orig-height="253" data-orig-width="383"&gt;&lt;img src="https://64.media.tumblr.com/90857d6a9e68f3ff2dbc3c542240317a/b6e2779708cafc12-31/s540x810/9e7565fa3b8c74f28b97fb516547ec620023b28e.jpg" data-orig-height="253" data-orig-width="383"/&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;How cool! I can&amp;rsquo;t begin to count how many hours I spent unintentionally reading the dictionary as a kid. I&amp;rsquo;d ask my parents how to spell a word, or what a word meant, and they&amp;rsquo; d inevitably answer &amp;ldquo;d-i-c-t-i-o-n-a-r-y&amp;rdquo; or &amp;ldquo;it means you should look it up&amp;rdquo;. I&amp;rsquo;d traipse over to the family set of the &lt;a href="http://en.wikipedia.org/wiki/Funk_%26_Wagnalls" target="_blank"&gt;Funk &amp;amp; Wagnall&amp;rsquo;s encyclopedia&lt;/a&gt; (bought from the grocery store on subscription, those were the days!) and its accompanying dictionary (in 2 volumes) and look up the word. Once I found my word, I could never resist the siren call of the other words on the page. Mixed among the handful of words I knew were amazingly short words, gigantic polysyllabic monstrosities, foreign words without enough vowels or with too many vowels, and words with accompanying black and white pictures, line drawings or maps. Each trip to the dictionary was a multi-paged odyssey through the English language.&lt;/p&gt;
&lt;p&gt;Sadly, I doubt my kids, lifelong online dictionary users, have ever experienced this. The Web was &lt;strong&gt;invented to provide better context&lt;/strong&gt;; the raison d'etre of the hyperlink and the subsequent Web server and Web page was to provide context to referenced concepts with just one simple click. But what these online Web dictionaries don&amp;rsquo;t have is &lt;strong&gt;page context&lt;/strong&gt;. What else is on this dictionary &amp;ldquo;page&amp;rdquo;? What is on the &amp;ldquo;opposite page&amp;rdquo;? The &amp;ldquo;next page&amp;rdquo;? The &amp;ldquo;previous page&amp;rdquo;? And why are these words near one another? Is there a shared prefix or root? A shared word of compound words?&lt;/p&gt;
&lt;p&gt;Links and the power of the Web to provide context are used in every online dictionary page and it would be hard to argue that the Web doesn&amp;rsquo;t provide a much better experience for exploring a specific word. You have links to antonyms and synonyms and etymology and stems and related words, and, and, and&amp;hellip;  But what about the words that are &amp;ldquo;physically&amp;rdquo; near this one? I haven&amp;rsquo;t seen an online dictionary attempt to provide this until stumbling on this shady site.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;nearness&amp;rdquo; of words is an important concept in my brain&amp;rsquo;s structure and in my understanding of English. I don&amp;rsquo;t think I&amp;rsquo;m alone in this, but I do think that in the span of just one generation we&amp;rsquo;ve probably lost that part of the organizational structure of our language in our brains. It&amp;rsquo;s a shame. We shouldn&amp;rsquo;t go back to paper dictionaries of course, but there is something for the other dictionary sites to learn from and improve on in this site&amp;rsquo;s listing of adjacent words.&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/3897449263</link><guid>https://blog.snootymonkey.com/post/3897449263</guid><pubDate>Wed, 16 Mar 2011 08:13:00 -0400</pubDate></item><item><title>This is not healthy. All but one (#7 Angry Birds) of the top 10...</title><description>&lt;img src="https://64.media.tumblr.com/tumblr_li12belY4J1qatkgeo1_400.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;This is not healthy. All but one (#7 Angry Birds) of the top 10 grossing applications in the Mac App Store are from Apple.&lt;/p&gt;
&lt;p&gt;Also not good: when my daughter asked about the mind mapping tool I use, I told her to get it from the Mac App Store, and then my wife and son looked at me puzzled and said, “You mean in iTunes?” These are two long time Mac users.&lt;/p&gt;
&lt;p&gt;Why exactly did the Mac App Store need to be a separate application?&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/3847383259</link><guid>https://blog.snootymonkey.com/post/3847383259</guid><pubDate>Sun, 13 Mar 2011 23:14:00 -0400</pubDate></item><item><title>Settling for (the Right) Mediocrity</title><description>&lt;a href="http://www.workingsoftware.com.au/page/Settling_for_mediocrity"&gt;Settling for (the Right) Mediocrity&lt;/a&gt;: &lt;p&gt;Smart stuff from the folks at Working Software:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What is it that you can compromise on that people may &lt;em class="evenChild"&gt;expect&lt;/em&gt;, in order to deliver what you consider to be exceptional in a period of time that fits your budget and release schedule? … they may be willing to forgo such pleasantries if you deliver them some quality in your application which they consider to be &lt;em class="evenChild"&gt;exceptional&lt;/em&gt;. The key to living with mediocrity, releasing software and, hopefully,  making money is to figure out which bits of the application you’re  building can get away with being mediocre, then spend all your time  working on the bits that will make your product exceptional.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>https://blog.snootymonkey.com/post/2794308803</link><guid>https://blog.snootymonkey.com/post/2794308803</guid><pubDate>Mon, 17 Jan 2011 08:24:01 -0500</pubDate></item><item><title>Apple is Not a Software Company</title><description>&lt;p&gt;Marco Arment, the founder of Instapaper and former tech lead at Tumblr &lt;a target="_blank" href="http://www.marco.org/2546655554"&gt;recently wrote&lt;/a&gt; that there really isn&amp;rsquo;t much of a market for tablets, just for iPads. I have no bone to pick with his main point, he&amp;rsquo;s right about that. But part of his analysis is way off base (the bold emphasis is mine):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And, like they’ve done so far with Android, the hardware  manufacturers will continue to attempt to make their own user-facing  applications and front-end interfaces, but these usually suck. (Other  people may describe “suck” with kinder, apologist adjectives like  “getting better” and “not bad”.)&lt;/p&gt;
&lt;p&gt;These manufacturers aren’t software companies: they’re hardware  companies that write software out of necessity. &lt;strong&gt;Apple is a software  company that makes hardware out of necessity.&lt;/strong&gt; The software side of a  modern computing platform is far more difficult and expensive to create  and maintain than the hardware. Anyone can cobble together the same  processors, DRAM, flash, and radios as Apple, put them into a plastic  case, and run a commodity OS on them with slight front-end  customizations. But not everyone can create an entire software platform.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Apple is &lt;strong&gt;absolutely not&lt;/strong&gt; a software company that makes hardware out of necessity. That sells Jonathan Ives and his team of brilliant industrial engineers short. Creating innovative hardware is still very hard. Copying Apple&amp;rsquo;s hardware is easier, but still difficult; it takes a few tries to get right.&lt;/p&gt;
&lt;p&gt;I can see where Marco is going with this, he wants to paint a simple picture of two types of companies, hardware and software companies. He wants to put Apple, Google and Microsoft into the software category and all the other tablet makers that use Windows and Android such as HP, Dell and the Asian manufacturers into the hardware category. He then wants to say good software is really hard and good hardware is really easy, so the tablet manufacturers that aren&amp;rsquo;t software companies are stuck. Apple makes their own hardware so it works fantastically well with their software, but the hardware companies are forever disadvantaged because they can&amp;rsquo;t make software that will will work fantastically well with their hardware.&lt;/p&gt;
&lt;p&gt;This is just not an accurate picture though, Apple is not a hardware company dabbling in software or a software company dabbling in hardware. Apple is the last of a breed of something we used to have a lot of, a &lt;strong&gt;systems company&lt;/strong&gt;. Systems companies create systems composed of hardware and software.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure how old Marco is, but I&amp;rsquo;m guessing he&amp;rsquo;s a bit younger than me because I can remember a time when the computing landscape was dominated by systems companies: IBM (z/OS, RS/6000 and AIX, PS/2 and OS/2), DEC (VMS), HP (HP 3000, HP-UX), SUN (SPARC and SunOS/Solaris), Silicon Graphics (IRIX), Apple (Mac), Be (BeOS and Be Machine).&lt;/p&gt;
&lt;p&gt;In a classic disruptive move, Microsoft and it&amp;rsquo;s flock of PC OEM&amp;rsquo;s (Dell, Gateway, Acer, etc.) killed off the systems companies one by one, either outright, or by forcing them to abandon their systems (HP, IBM except for the mainframe) in favor of becoming a Windows OEM. Apple is the only one that survived as a systems company at a time that didn&amp;rsquo;t favor the systems companies; hardware compatibility was king and hardware innovation was static (More&amp;rsquo;s Law was driving all the innovation).&lt;/p&gt;
&lt;p&gt;Now that Moore&amp;rsquo;s Law is breaking down and innovation in hardware form factors and interfaces is back on the top of everyone&amp;rsquo;s agenda, it&amp;rsquo;s a great time to be a systems company again. Apple is outperforming their technology peers, and we all want iPad systems, not some hardware devices running Android or Windows software.&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/2567895042</link><guid>https://blog.snootymonkey.com/post/2567895042</guid><pubDate>Sun, 02 Jan 2011 10:16:00 -0500</pubDate><category>Apple</category></item><item><title>The Golden Football</title><description>&lt;p&gt;&lt;strong&gt;The Golden Football&lt;/strong&gt; is a &lt;a href="http://www.evanmiller.org/golden-football.html" target="_blank"&gt;new description by Evan Miller&lt;/a&gt; of the economics of &lt;a href="http://www.groupon.com/" target="_blank"&gt;GroupOn&lt;/a&gt;. The idea is that GroupOn moves the economic activity to the right of the normal micro-economics price/demand curve by offering up a lower price than the market has settled into charging for that particular good or service in exchange for a higher volume than the market would normally demand for that good or service at that lower price.&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" title="groupon-golden-football.png" src="http://www.evanmiller.org/images/groupon-golden-football.png" border="0" alt="groupon-golden-football.png"/&gt;&lt;/p&gt;
&lt;p&gt;The Golden Football is formed from happy customers getting a price lower than they&amp;rsquo;d pay&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" title="groupon-indifference.png" src="http://www.evanmiller.org/images/groupon-indifference.png" border="0" alt="groupon-indifference.png"/&gt;&lt;/p&gt;
&lt;p&gt;And from business getting more quantity of sales than the price would normally generate, and therefore more profit.&lt;/p&gt;
&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" title="groupon-isoprofit.png" src="http://www.evanmiller.org/images/groupon-isoprofit.png" border="0" alt="groupon-isoprofit.png"/&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s an interesting model, and very different than the loss leader / lifetime customer value story that&amp;rsquo;s normally told about GroupOn.&lt;/p&gt;
&lt;p&gt;All the graphs and the model are courtesy of Evan, I&amp;rsquo;m just trying to spread the word so that hopefully some enterprising economist will test the model or some entrepreneurs will validate it by applying it in new ways.&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/2444989227</link><guid>https://blog.snootymonkey.com/post/2444989227</guid><pubDate>Fri, 24 Dec 2010 07:47:43 -0500</pubDate><category>economics</category></item><item><title>The $20 Starbucks Test</title><description>&lt;p&gt;A couple of weeks ago I had the good fortune to meet &lt;a href="http://www.crunchbase.com/person/hugh-crean" target="_blank"&gt;Hugh Crean&lt;/a&gt;, the ex-CEO of &lt;a href="http://www.bing.com/travel/about/howAirPredictions.do" target="_blank"&gt;Farecast&lt;/a&gt;, ex-Microsoft executive (they acquired Farecast) and current Entrepreneur in Residence at General Catalyst. A group of us talked to Hugh for close to an hour, and I learned more about the travel industry in that short span than I&amp;rsquo;ve learned in a lifetime of flying, hoteling and using Kayak, Priceline and the like.&lt;/p&gt;
&lt;p&gt;The purpose of our chat with Hugh was to get some feedback on a project we are working on, and Hugh shared a cool $20 technique for validating your new product, service or startup idea that I&amp;rsquo;d like to pass on. Here is how it works:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Get yourself a nice crisp $20 from an ATM&lt;/li&gt;
&lt;li&gt;Go down to your neighborhood Starbucks&lt;/li&gt;
&lt;li&gt;Walk up to strangers with empty coffee mugs and tell them you are worried about your brother, need some advice, and can you buy them a cup of coffee in exchange for a quick 5 minutes of their time. (This will be awkward for most of you to do. Get over it. The &amp;ldquo;worried about my brother&amp;rdquo; line is a bit of psychology that means most people won&amp;rsquo;t turn you down. If they do turn you down, you just got a point in the &lt;a href="http://rejectiontherapy.com/" target="_blank"&gt;Rejection Therapy Game&lt;/a&gt; anyway, so consider yourself lucky).&lt;/li&gt;
&lt;li&gt;Buy them a simple coffee, not a mocha-whippa-frappa-latta-chino; you want your $20 to last.&lt;/li&gt;
&lt;li&gt;Explain that your brother has a crazy business/product idea, and that he&amp;rsquo;s about to get a 2nd mortgage on his house, raid his 401k and quit his job. His wife is a nervous wreck, afraid that they&amp;rsquo;ll lose their house and retirement fund, and he&amp;rsquo;s hit your parents up for seed money that they really can&amp;rsquo;t afford to lose. Your parents and your sister-in-law have come to you for help to try to talk him out of his hair-brained scheme.&lt;/li&gt;
&lt;li&gt;Explain that this is where they come in, your brother is a very logical and reasonable guy, and can be convinced by good reasons, but he has been blinded by thinking this is a really good idea. The problem is, you sort of agree with him, so you need some really solid reasons to give him as to why his idea won&amp;rsquo;t work, and why he shouldn&amp;rsquo;t proceed with his plan. Then&amp;hellip; pitch your idea! Sell it the best way you can. Respect their time (you asked for 5 minutes), but give the best 2-3 minute pitch you can.&lt;/li&gt;
&lt;li&gt;Now, ask for their reasons the idea won&amp;rsquo;t work. Keep them focused on the idea, not the backstory (they may want you to convince your brother of the merits of retirement savings or the dangers of 2nd mortgages), and really listen. Resist the temptation to argue against their objections. Then thank them heartily for their time.&lt;/li&gt;
&lt;li&gt;Repeat until your $20 runs out.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;What will you learn from the experiment?&lt;/p&gt;
&lt;p&gt;The most likely outcome is you&amp;rsquo;ll hear mostly the same obvious rejections of your idea that you yourself have and have come to believe are surmountable. Your $20 didn&amp;rsquo;t generate any great new insight, but was an inexpensive check that you aren&amp;rsquo;t blind to an obvious shortcoming.&lt;/p&gt;
&lt;p&gt;A good outcome, is that you hear lots of interesting and sound new objections that you never thought of before. This should give you real pause about your idea. Both its merits, if the objections are good ones, and the extent that you&amp;rsquo;ve sufficiently thought through your idea and are being realistic about it.&lt;/p&gt;
&lt;p&gt;A not so likely outcome is that your strangers will find themselves agreeing with you and your &amp;ldquo;brother&amp;rdquo; that it is a great idea. They themselves will want to buy the product or service and they&amp;rsquo;ll start naming other people that need it. They&amp;rsquo;ll also probably apologetically offer up a few lame objections, because that&amp;rsquo;s what you asked for. In the unlikely event this happens with your idea, you probably have a real hit on your hands. Run with it!&lt;/p&gt;
&lt;p&gt;Two quick caveats&amp;hellip; this works best for a consumer product or service. If your idea is for a better steel retracting refluxerator for pediatric heart surgeons, then the man on the street in the coffee shop might not be a great source of insight. Also you have to get comfortable with the white lie you&amp;rsquo;ll be telling about your &amp;ldquo;brother&amp;rdquo;. If you can&amp;rsquo;t get comfortable with that, it&amp;rsquo;s understandable, but it is an important part of the technique. The negative priming and the distancing of yourself from the idea gives your coffee companion free reign to trash your idea so find some other way to provide some distance from the idea. If instead you say it&amp;rsquo;s your idea, then even when you invite criticism and honesty, people will candy-coat their feedback. Luckily our social norms will not stand in the way of them trashing your brother who&amp;rsquo;s not in the room.&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/2432103782</link><guid>https://blog.snootymonkey.com/post/2432103782</guid><pubDate>Thu, 23 Dec 2010 11:06:00 -0500</pubDate></item><item><title>"Fools ignore complexity; pragmatists suffer it; experts avoid it; geniuses remove it."</title><description>“Fools ignore complexity; pragmatists suffer it; experts avoid it; geniuses remove it.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;Alan Perlis&lt;/em&gt;</description><link>https://blog.snootymonkey.com/post/2378505119</link><guid>https://blog.snootymonkey.com/post/2378505119</guid><pubDate>Sun, 19 Dec 2010 16:58:06 -0500</pubDate></item><item><title>Always Be Building Your Own Products</title><description>&lt;p&gt;Like many small technology companies, Snooty Monkey makes the  mortgage and the payroll through work for clients while carving  off time to build products. It&amp;rsquo;s not ideal, but it beats the alternatives: working a corporate job for years to save up a financial runway, or ceding autonomy to outside  investors, who of course get a say in how their money is spent.&lt;/p&gt;
&lt;p&gt;Once  you have built a successful services business in a  niche that matches your passions and interests (in the case of Snooty  Monkey, building brand new  products for entrepreneurs), you can start to ask yourself: this is profitable; this  is fun; why not just do this forever?&lt;/p&gt;
&lt;p&gt;Even if your long term goal is to have a services business (or be a freelancer) and build products for other people, you  should &lt;strong&gt;never stop building your own products&lt;/strong&gt;. There are important professional obligations that client work brings. Being free at times from those obligations is critical for long term success.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#1 Learn radically new stuff&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When working for a client, you have an &lt;strong&gt;obligation&lt;/strong&gt; to manage technical risk and to properly represent your experience and skills. Both of these work to prevent you from learning radically new stuff &amp;ldquo;on the clock&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Managing technical risk involves choosing a sound technology that&amp;rsquo;s suited for the task at hand, that&amp;rsquo;s robust and relatively bug free, and where you have a reasonable assurance that they&amp;rsquo;ll be future development to fix bugs, fix security issues and adapt to new operating systems and language versions. You also are obliged to choose technologies that are readily picked up by someone else should you get hit by a bus. If you are the only &lt;a href="http://en.wikipedia.org/wiki/Logtalk" target="_blank"&gt;Logtalk&lt;/a&gt; programmer in a 4 state radius from your client, it&amp;rsquo;s probably not a great idea to build your client&amp;rsquo;s project in Logtalk without their informed buy in.&lt;/p&gt;
&lt;p&gt;Representing your experience and skills is all about communication and honesty. If you literally wrote the book on a given technology, say so. If you are waiting for your copy of the book to arrive from Amazon, and will know more next week once you get to chapter 2, say so! When hiring freelancers or project teams, clients are usually paying for more than your raw intelligence. Part of your rate derives from your skills and experience with a technology. If you don&amp;rsquo;t have said skills and experience, many clients won&amp;rsquo;t be interested in you learning them on the job, and others may expect a break in your usual rate until you come up to speed. This is a reasonable position for your client to take if your usual rate properly reflects the skills and experience you bring to the table.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s not to say a given client might excuse you from all these obligations and give you free reign to learn a risky new technology that you have no experience with on the job. But that&amp;rsquo;s a &lt;a target="_blank" href="http://www.youtube.com/watch?v=OQSNhk5ICTI"&gt;double rainbow&lt;/a&gt; client. Don&amp;rsquo;t expect to have them.&lt;/p&gt;
&lt;p&gt;None of this precludes trying new things and continual improvement. You also do your clients a disservice by never learning, adapting and improving. Each project should be better than the last. Always been a  Test::Unit user but want to use RSpec for the next project? Want to switch from your tried and true restful-authentication to the new hotness, authlogic? These evolutionary improvements are not what I&amp;rsquo;m cautioning against in client work. It&amp;rsquo;s the big disruptive changes that make you suck for a long time until you &amp;ldquo;get it&amp;rdquo; and that you have a good chance of deciding are a mistake and abandoning.&lt;/p&gt;
&lt;p&gt;So how do you make those big leaps forward that require a huge step back first? Do them on your own time of course. And rather than building the blog sample from the book or some other toy project, you might as well try building a useful product. You&amp;rsquo;re going to invest the time in the new technology anyway, if it turns out to be great stuff, it&amp;rsquo;d be great if you got a fantastic new product out of it along the way.&lt;/p&gt;
&lt;p&gt;In that vein, Snooty Monkey kicked off the development of a new product last week; the idea for it has been kicking around since Summer. Some weeks we&amp;rsquo;ll spend no time on it, some weeks we&amp;rsquo;ll be able to carve out a few hours or a whole day. Our &amp;ldquo;rule&amp;rdquo; (admittedly arbitrary) is, &lt;strong&gt;everything&lt;/strong&gt; has to be new. The main purpose of the project is learning and having fun. The secondary goal is creating the product (if it was the primary goal, we&amp;rsquo;d use the tried and true technology stack).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Out:&lt;/strong&gt; MySQL &lt;strong&gt;In:&lt;/strong&gt; &lt;a target="_blank" href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Out:&lt;/strong&gt; Ruby &lt;strong&gt;In:&lt;/strong&gt; &lt;a target="_blank" href="http://www.erlang.org/"&gt;Erlang&lt;/a&gt; (the 1 tiny exception to the rule, it&amp;rsquo;s new for all but 1 of us)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Out:&lt;/strong&gt; Rails &lt;strong&gt;In:&lt;/strong&gt; &lt;a target="_blank" href="http://nitrogenproject.com/"&gt;Nitrogen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Out:&lt;/strong&gt; XHTML &lt;strong&gt;In:&lt;/strong&gt; &lt;a href="http://diveintohtml5.org/" target="_blank"&gt;HTML5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Out:&lt;/strong&gt; JavaScript &lt;strong&gt;In:&lt;/strong&gt; &lt;a href="http://jashkenas.github.com/coffee-script/" target="_blank"&gt;CoffeeScript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Out:&lt;/strong&gt; AJAX interval polling &lt;strong&gt;In: &lt;/strong&gt;Comet and Web Sockets&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Out:&lt;/strong&gt; CSS &lt;strong&gt;In:&lt;/strong&gt; &lt;a href="http://lesscss.org/" target="_blank"&gt;LESS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Reader&amp;rsquo;s imaginary Socratic dialog section:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Is this choice of technology driven by the needs of the project or is it a bit gratuitous? &lt;strong&gt;A:&lt;/strong&gt; Uhh&amp;hellip; the tail is wagging the dog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Will you be able to build the new product as fast as you would if you used a tech. stack in your comfort zone? &lt;strong&gt;A:&lt;/strong&gt; No.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Will you be able build a successful product with it? &lt;strong&gt;A:&lt;/strong&gt; Dunno.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Will you learn a lot? &lt;strong&gt;A:&lt;/strong&gt; Hell yeah!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q from a Geek:&lt;/strong&gt; Is it going to work well to combine CoffeeScript with all the JavaScript generated by Nitrogen. &lt;strong&gt;A:&lt;/strong&gt; Dunno, waiting for that CoffeeScript book to get here from Amazon. We&amp;rsquo;ll find out. But I think you missed the point. Go back to the top and re-read the post.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#2 Reconnect with your inner customer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The other great reason to not stop building your products is empathy. &lt;strong&gt;Being a &amp;ldquo;customer&amp;rdquo; of your own services stokes the flames of empathy&lt;/strong&gt;. It&amp;rsquo;s important to walk in your customers shoes, to put yourself in the position to care about the same things they care about. Are you sitting your customer down for the three legged stool  talk (&amp;ldquo;Sorry Jack, scope, time or resources; only 2 can be fixed&amp;hellip;&amp;rdquo;)  yet again? When was the last time you sat yourself down for the same talk?&lt;/p&gt;
&lt;p&gt;Treat yourself like you treat your customers. Don&amp;rsquo;t give yourself special breaks and exceptions you wouldn&amp;rsquo;t give them. &lt;strong&gt;Make a budget (in time, not dollars) and try to stick to it as they have to&lt;/strong&gt;. How easy do you make sticking to the budget? Are there things you are doing, such as lots of tangential work on the project that&amp;rsquo;s not core, or a lack of timely visibility and tracking that make it hard to stick to it? Or are you so fixated on the budget that you sacrifice the other goals of the project?&lt;/p&gt;
&lt;p&gt;Most important to rebuilding the empathy with your clients is to scratch your own itch with the product. Build something that you are madly passionate about, and that you are the customer for. It&amp;rsquo;s easy to slip into a calloused, distanced, assembly-line mode of working when building product after product for customers. You need to rekindle the spark that comes when you are building something that you are truly obsessed with. &lt;strong&gt;By reminding yourself what it&amp;rsquo;s like to care so much about the outcome, you&amp;rsquo;ll be better able to empathize with your clients.&lt;/strong&gt;&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/2373482505</link><guid>https://blog.snootymonkey.com/post/2373482505</guid><pubDate>Sun, 19 Dec 2010 08:58:00 -0500</pubDate></item><item><title>Erlang native compilation, why not?</title><description>belucid: what are the downsides of compiling Erlang native? (HiPE)  Any reason not to use it all the time?&lt;br /&gt;&#13;
MononcQc: the native modules aren't garbage collected when loading a new version&lt;br /&gt;&#13;
MononcQc: also they are not portable like .beam files&lt;br /&gt;&#13;
MononcQc: they're slower to compile and are not necessarily faster&lt;br /&gt;&#13;
MononcQc: but they are entirely worth it for numerical stuff&lt;br /&gt;&#13;
belucid: ok&lt;br /&gt;&#13;
belucid: so I should run some perf tests with both&lt;br /&gt;&#13;
belucid: and see if it makes a diff for my application&lt;br /&gt;&#13;
MononcQc: ideally, yeah&lt;br /&gt;&#13;
MononcQc: always measure&lt;br /&gt;&#13;
belucid: yep&lt;br /&gt;&#13;
belucid: and then... if they do make a meaningful diff, the impact is that I really shouldn't plan to load new versions&lt;br /&gt;&#13;
belucid: and of course, need to compile for the target machine&lt;br /&gt;&#13;
MononcQc: oh, load new versions all you like&lt;br /&gt;&#13;
MononcQc: it's not a big overhead&lt;br /&gt;&#13;
MononcQc: just something to consider&lt;br /&gt;&#13;
belucid: ok&lt;br /&gt;&#13;
belucid: just shouldn't plan on loading new versions forever and ever then &lt;br /&gt;&#13;
belucid: at some point it would add up&lt;br /&gt;&#13;
MononcQc: yeah, but then you'll need to tear the node down to upgrade the VM&lt;br /&gt;&#13;
MononcQc: so I'm not sure it's actually that problematic in practice&lt;br /&gt;&#13;
belucid: gotcha&lt;br /&gt;&#13;
belucid: on days like today, Erlang R14B release day&lt;br /&gt;&#13;
belucid: you'll bring the app down anyway&lt;br /&gt;&#13;
belucid: thanks as always MononcQc!&lt;br /&gt;&#13;
MononcQc: no problem</description><link>https://blog.snootymonkey.com/post/1126622642</link><guid>https://blog.snootymonkey.com/post/1126622642</guid><pubDate>Wed, 15 Sep 2010 10:27:14 -0400</pubDate><category>Erlang</category></item><item><title>The Erlang Shell</title><description>&lt;p&gt;One option to running the Erlang shell when your code is in ./src, including files in ./include, and building to ./ebin is to run erl from ./src as such.&lt;/p&gt;
&lt;p&gt;﻿erl -pa ../ebin&lt;/p&gt;
&lt;p&gt;All your modules are then local and can be accessed. You can include records with rr(module).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks MononcQc on #erlang.&lt;/em&gt;&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/1115267199</link><guid>https://blog.snootymonkey.com/post/1115267199</guid><pubDate>Mon, 13 Sep 2010 09:19:40 -0400</pubDate><category>Erlang</category></item><item><title>"From a single bit to a few hundred megabytes, from a single microsecond to a half an hour of..."</title><description>“From a single bit to a few hundred megabytes, from a single microsecond to a half an hour of computing, it confronts us with completely baffling ratio of 1 to 1,000,000,000! The programmer is in the unique position that his is the only discipline and profession in which such a gigantic ratio, which totally baffles our imagination, has to be bridged by a single technology. He has to be able to think in terms of conceptual hierarchies that are much deeper than a single mind ever needed to face before.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;Edsger Dijkstra via &lt;a href="http://axisofeval.blogspot.com/2010/09/programmer-feel-good-quote.html" target="_blank"&gt;Manuel Simoni&lt;/a&gt;&lt;/em&gt;</description><link>https://blog.snootymonkey.com/post/1077392190</link><guid>https://blog.snootymonkey.com/post/1077392190</guid><pubDate>Mon, 06 Sep 2010 17:16:45 -0400</pubDate></item><item><title>rm all the results of a find</title><description>&lt;a href="http://www.linuxforums.org/forum/linux-newbie/1585-possible-rm-finds-output.html"&gt;rm all the results of a find&lt;/a&gt;: &lt;p&gt;I’d never had the need to remove everything found by the find command before. Since rm expects arguments, rather than piped input… it breaks the normal Unix pipe it all together paradigm.&lt;/p&gt;
&lt;p&gt;Some quick googling brought xargs into the picture though. xargs constructs an argument list from its piped input and executes its argument with them. Perfect for what I was trying to do:&lt;/p&gt;
&lt;p&gt;﻿find . -name *.pyc -print0 | xargs -0 rm&lt;/p&gt;</description><link>https://blog.snootymonkey.com/post/1047942801</link><guid>https://blog.snootymonkey.com/post/1047942801</guid><pubDate>Wed, 01 Sep 2010 10:03:02 -0400</pubDate><category>Unix</category><category>Mac OS X</category><category>Linux</category></item></channel></rss>
