<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Teehan+Lax</title>
	
	<link>http://www.teehanlax.com/blog</link>
	<description>We define and design custom experiences in the digital channel</description>
	<lastBuildDate>Wed, 29 May 2013 15:00:05 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/teehanlax" /><feedburner:info uri="teehanlax" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Getting Started with ReactiveCocoa</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/iOFAuaKVkfQ/</link>
		<comments>http://www.teehanlax.com/blog/getting-started-with-reactivecocoa/#comments</comments>
		<pubDate>Wed, 22 May 2013 14:08:48 +0000</pubDate>
		<dc:creator>Ash Furrow</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/blog/?p=10397</guid>
		<description><![CDATA[Note: This is going to be a slightly more technical post geared toward our friends in the iOS developer community. In my previous post, I covered high-level aspects of ReactiveCocoa, the Objective-C framework that allows developers to write apps declaratively. Now I&#8217;d like to introduce some patterns in ReactiveCocoa, discuss a few best practices, and [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note</em>: This is going to be a slightly more technical post geared toward our friends in the iOS developer community.</p>
<p>In my previous post, I covered <a href="http://www.teehanlax.com/blog/reactivecocoa/">high-level aspects of ReactiveCocoa</a>, the Objective-C framework that allows developers to write apps declaratively. Now I&#8217;d like to introduce some patterns in ReactiveCocoa, discuss a few best practices, and outline common gotchas to be on the lookout for. ReactiveCocoa can have a steep learning curve – let&#8217;s climb it together.</p>
<div>
<h3 dir="ltr">Patterns</h3>
<p dir="ltr">There are three basic patterns to using ReactiveCocoa: chaining, splitting, and combining. I covered the first two last time, but let&#8217;s go back for an in-depth look.</p>
<p dir="ltr">Recall that the core of ReactiveCocoa is the signal: it represents changing state over time. When we chain, split, or combine, we&#8217;re operating on those signals.</p>
<p>Chaining is the most common pattern in ReactiveCocoa – it&#8217;s when you have one signal and you transform it into a new one. Common ways to create new signals are by using filter:, map:, and startWith:. Let&#8217;s take a look at an example.</p>
<script src="https://gist.github.com/5621776.js"></script><noscript><pre><code class="language-objective-c objective-c">RAC(self.textField.text) = [[[RACSignal interval:1] startWith:[NSDate date]] map:^id(NSDate *value) {
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:value];
    
    return [NSString stringWithFormat:@&quot;%d:%02d&quot;, dateComponents.minute, dateComponents.second];
}];</code></pre></noscript>
<p>In this example, we&#8217;re binding the text property of the textField to be the result of a chain of three signals. First, we create an interval signal that sends a new value of the current time every second. When we create this signal, it doesn&#8217;t have a value yet (and won&#8217;t for another second), so we start that signal with startWith:. Finally, we use map: to transform the NSDate value from the signal into a string, which will be assigned to the text property of textField.</p>
<p><img class="aligncenter size-full wp-image-10398" title="chaining" src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/chaining.png" alt="" width="662" height="540" /></p>
<p dir="ltr">Chaining is the most common of operators and it&#8217;s often done inline without storing the signals in local variables. The above example is equivalent to the following.</p>
<div> <script src="https://gist.github.com/5621791.js"></script><noscript><pre><code class="language-objective-c objective-c">RACSignal *intervalSignal = [RACSignal interval:1];
RACSignal *startedIntervalSignal = [intervalSignal startWith:[NSDate date]];
RACSignal *mappedIntervalSignal = [startedIntervalSignal map:^id(NSDate *value) {
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:value];
    
    return [NSString stringWithFormat:@&quot;%d:%02d&quot;, dateComponents.minute, dateComponents.second];
}];

RAC(self.textField.text) = mappedIntervalSignal;
</code></pre></noscript></div>
</div>
<p>Splitting is similar to chaining in that it transforms signals into other signals, but different in that it reuses the intermediate signals. Splitting sounds complicated, but it’s as easy as using a signal more than once.</p>
<div><script src="https://gist.github.com/5621801.js"></script><noscript><pre><code class="language-objective-c objective-c">RACSignal *dateComponentsSignal = [[[RACSignal interval:1] startWith:[NSDate date]] map:^id(NSDate *value) {
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:value];
    return dateComponents;
}];

RAC(self.minuteTextField.text) = [dateComponentsSignal map:^id(NSDateComponents *dateComponents) {
    return [NSString stringWithFormat:@&quot;%d&quot;, dateComponents.minute];
}];

RAC(self.secondTextField.text) = [dateComponentsSignal map:^id(NSDateComponents *dateComponents) {
    return [NSString stringWithFormat:@&quot;%d&quot;, dateComponents.second];
}];
</code></pre></noscript></div>
<p>In this example, we&#8217;ve created a signal by chaining a few signals together, then stored it in an local variable named dateComponentsSignal. We then use that one signal to create two new signals and bind those individually to two text fields.</p>
<div><img class="aligncenter size-full wp-image-10399" title="Splitting" src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/Splitting.png" alt="" width="434" height="578" /></div>
<p>The last common pattern is combining. Combining is when you create a new signal from several signals. For example, if we wanted to create a signal to determine the enabled state of a submit button, we could combine the latest values from two text fields&#8217; signals.</p>
<div><script src="https://gist.github.com/5621819.js"></script><noscript><pre><code class="language-objective-c objective-c">RAC(self.submitButton.enabled) = [RACSignal combineLatest:@[self.usernameField.rac_textSignal, self.passwordField.rac_textSignal] reduce:^id(NSString *userName, NSString *password) {
    return @(userName.length &gt;= 6 &amp;&amp; password.length &gt;= 6);
}];</code></pre></noscript></div>
<p>Here we&#8217;re binding the enabled state of our button to a signal created with combineLatest:reduce:. The second parameter is a block which is itself passed parameters that are the latest values from the signals being combined. Since we are combining two signals that send NSString values, the reduce block takes two NSString parameters. It&#8217;s this block&#8217;s job to reduce those two down to one value.</p>
<div></div>
<div><img class="aligncenter size-full wp-image-10400" title="Combining" src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/combining.png" alt="" width="407" height="409" /></div>
<div>
<p dir="ltr">Combining is common when you need to wait for several conditions to be met or need to make a choice between the latest values carried by several signals.</p>
<p dir="ltr">It’s important to think of the linear flow of logic and how the values sent by signals are chained, split, or combined. This flow defines the application logic and it can be helpful to draw these diagrams when starting to use ReactiveCocoa. Reading about the <a href="https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/BasicOperators.md">Basic Operators</a> can also help you become more familiar with these patterns.</p>
<h3>Best Practices</h3>
<p dir="ltr">Now that we&#8217;ve covered the basics of ReactiveCocoa patterns, let&#8217;s dive into some <a href="https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/DesignGuidelines.md#best-practices">best practices</a>.</p>
<p dir="ltr">ReactiveCocoa is a tool that programmers can use to make writing apps easier by removing state. However, even in a &#8220;completely reactive&#8221; app, you have to deal with non-ReactiveCocoa code. Things like table view delegate methods, for example. When you want to bridge the gulf between non-reactive and reactive worlds, use RACSubjects.</p>
<p dir="ltr">A RACSubject is a signal which can be manually sent new values. For example, imagine if gesture recognizers weren’t a part of ReactiveCocoa – we might use two RACSubject properties to receive events from a gesture recognizer: one for whether or not the recognizer is underway, and one for its current location.</p>
<p dir="ltr"><script src="https://gist.github.com/5621841.js"></script><noscript><pre><code class="language-objective-c objective-c">self.gestureRecognizerIsRunningSubject = [RACSubject subject];
self.gestureRecognizerValueSubject = [RACSubject subject];

RAC(self.someView.frame) = [self.gestureRecognizerValueSubject map:^id(NSValue *value) {
   CGPoint location = [value CGPointValue];

   CGFloat size = 100.0f;

   return [NSValue valueWithCGRect:CGRectMake(location.x - size/2.0f, location.y - size/2.0f, size, size)];
}];</code></pre></noscript></p>
<p dir="ltr">We&#8217;ve bound the frame of a view to be centred under the latest location of the gesture recognizer.</p>
<p dir="ltr">Sending the subjects events is as easy as implementing a very stripped-down gesture recognizer method.</p>
<p dir="ltr"><script src="https://gist.github.com/5621995.js"></script><noscript><pre><code class="language-objective-c objective-c">-(void)gestureRecognizerReceivedTouch:(UIPanGestureRecognizer *)recognizer {
   if (recognizer.state == UIGestureRecognizerStateBegan) {
       [self.gestureRecognizerIsRunningSubject sendNext:@(YES)];
   }

   else if (recognizer.state == UIGestureRecognizerStateChanged) {
       [self.gestureRecognizerValueSubject sendNext:[NSValue valueWithCGPoint:[recognizer locationInView:self.view]]];
   }

   else if (recognizer.state == UIGestureRecognizerStateEnded) {
       [self.gestureRecognizerIsRunningSubject sendNext:@(NO)];
   }
}</code></pre></noscript></p>
<p dir="ltr">While RACSubjects are great for bridging non-reactive code to ReactiveCocoa code, there is a danger in over-using them. Don&#8217;t rely on sending explicit values when chaining signals together would work instead.</p>
<p dir="ltr">ReactiveCocoa is designed to eliminate as much state as possible from our applications. This reduction in state leads to simpler program logic but doesn&#8217;t allow us to easily perform side-effects. For example, consider the above gesture recognizer code. We may wish to flash the scroll indicators of a table view whenever the gesture recognizer finishes to let the user know where in the table they&#8217;re currently scrolled to. We can do that with an explicit subscription.</p>
<p dir="ltr"><script src="https://gist.github.com/5622002.js"></script><noscript><pre><code class="language-objective-c objective-c">[[self.gestureRecognizerIsRunningSubject filter:^BOOL(NSNumber *gestureRecognizerIsRunning) {
   return !(gestureRecognizerIsRunning.boolValue);
}] subscribeNext:^(id x) {
   [self.tableView flashScrollIndicators];
}];</code></pre></noscript></p>
<p dir="ltr">Here we&#8217;ve filtered out events where the gesture recognizer is running to only subscribe to events when it has completed. Then, in our subscribeNext: block, we perform our side-effect.</p>
<p dir="ltr">While subscriptions are useful and necessary for performing side-effects, be careful not to overuse them. They are like mutable variables – state – which ReactiveCocoa tries to avoid. Don&#8217;t use RACSubjects to manipulate application state where binding properties to mapped signals can work instead.</p>
<h3>Gotchas</h3>
<p dir="ltr">Like any new paradigm, there are gotchas that are likely to trip up beginners. For example, when we create a new signal from a property, like in the following code, nothing will happen until the <em>first</em> value is sent the next time the someString value changes.</p>
<p dir="ltr"><script src="https://gist.github.com/5622033.js"></script><noscript><pre><code class="language-matlab matlab">RAC(self.label.text) = RACAble(self.someString);</code></pre></noscript></p>
<p dir="ltr">If you want to send the current property&#8217;s value immediately, use RACAbleWithStart. This &#8220;starts&#8221; the signal with the current value of the property being bound to.</p>
<p dir="ltr"><script src="https://gist.github.com/5622041.js"></script><noscript><pre><code class="language-matlab matlab">RAC(self.label.text) = RACAbleWithStart(self.someString);</code></pre></noscript></p>
<p dir="ltr">Similarly, when using interval: to schedule a periodic timer, the timer does not fire until the first interval has passed, much like using NSTimer. Remember the first example from this post where we were binding some text field&#8217;s text to be the current time? We started the signal manually with startWith: and sending the current date. If we didn&#8217;t then the text field would be empty for a second before the first interval tick.</p>
<p dir="ltr">While we&#8217;re on the topic of interval:, it&#8217;s important to note that this method delivers its results on the high-priority scheduler (similar to a GCD queue). That means that UI updates cannot be performed directly and the code at the top of this article has a subtle bug. It should be re-written to deliver results of the interval: signal on the main thread scheduler.</p>
<p dir="ltr"><script src="https://gist.github.com/5622049.js"></script><noscript><pre><code class="language-objective-c objective-c">RAC(self.textField.text) = [[[[RACSignal interval:1] startWith:[NSDate date]] map:^id(NSDate *value) {
   NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:(NSMinuteCalendarUnit|NSSecondCalendarUnit) fromDate:value];

   return [NSString stringWithFormat:@&quot;%d:%02d&quot;, dateComponents.minute, dateComponents.second];
}] deliverOn:[RACScheduler mainThreadScheduler]];</code></pre></noscript></p>
<p dir="ltr">That&#8217;s better.</p>
<p dir="ltr">This post has covered common patterns, best practices, and some gotchas. Hopefully you&#8217;ve gained some insight into how you can leverage ReactiveCocoa to build declarative applications. If you have any questions, the community is quite active on <a href="http://stackoverflow.com/questions/tagged/reactive-cocoa">StackOverflow</a> and <a href="https://github.com/ReactiveCocoa/ReactiveCocoa/issues">GitHub</a>.</p>
</div>
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/iOFAuaKVkfQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/getting-started-with-reactivecocoa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/getting-started-with-reactivecocoa/</feedburner:origLink></item>
		<item>
		<title>Shifting Our Thinking for a Day</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/ZjVzQbSzgwg/</link>
		<comments>http://www.teehanlax.com/blog/shifting-our-thinking-for-a-day/#comments</comments>
		<pubDate>Wed, 15 May 2013 14:04:48 +0000</pubDate>
		<dc:creator>Kate Bowen</dc:creator>
				<category><![CDATA[How We Work]]></category>
		<category><![CDATA[Labs]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/blog/?p=10362</guid>
		<description><![CDATA[What happens when a developer, a project manager, and a designer are all put into a room together with Arduino software, a USB cable and a Grove kit? We found out, and called it Hack Day. Prior to Hack Day, some of us had no idea what Arduino or a Grove kit even was at [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-large wp-image-10378" title="Hack-Day-09" src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/Hack-Day-094-1024x575.jpg" alt="" width="1024" height="575" /></p>
<p>What happens when a developer, a project manager, and a designer are all put into a room together with <a title="Arduino" href="http://www.arduino.cc/" target="_blank">Arduino</a> software, a USB cable and a <a href="http://www.seeedstudio.com/depot/grove-starter-kit-p-709.html" target="_blank">Grove kit</a>? We found out, and called it Hack Day.</p>
<p>Prior to Hack Day, some of us had no idea what Arduino or a Grove kit even was at all &#8211; let alone how to manipulate it into some new invention or give it the ability to complete a task. That’s what <a href="http://labs.teehanlax.com/" target="_blank">Labs</a> is for. The purpose of Labs is primarily to explore creative uses of technology and frame new possibilities for the agency, clients, and wider community. In short, they make epic shit.</p>
<p>While some of us look on with envy, Hack Day offers everyone a chance to think differently and create something, even if we have no idea what we’re doing. And it isn’t exclusive to just the technologically skilled. It’s about encouraging everyone in the company to dip their hands into this creative pot, work with developers, think in ways we aren’t used to thinking, and ultimately, improve the way we work together to make us better and smarter individuals, and as a company.</p>
<p>It took place back in March, a full nine-to-five of internal hardware hacking experimentation for all. What was intended to be a light introduction to physical prototyping and hardware hacking allowed us to open our minds and shift our thinking into a realm that we don’t typically get to play around in. And the best part is, there were no rules, no brief, and no client. We had complete creative freedom. <a href="https://www.facebook.com/media/set/?set=a.587785821249193.1073741825.205333082827804&#038;type=1&#038;l=694b9d5590" target="_blank">We took lots of photos</a>. And we got it all on video.</p>
<p><iframe src="http://player.vimeo.com/video/66183421?byline=0" width="700" height="393" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><br />
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/ZjVzQbSzgwg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/shifting-our-thinking-for-a-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/shifting-our-thinking-for-a-day/</feedburner:origLink></item>
		<item>
		<title>Functional Reactive Programming on iOS with ReactiveCocoa</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/ixg7ISYierg/</link>
		<comments>http://www.teehanlax.com/blog/reactivecocoa/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 14:08:14 +0000</pubDate>
		<dc:creator>Ash Furrow</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/?post_type=blog&amp;p=9289</guid>
		<description><![CDATA[Objective-C is a programming language which often finds itself mired in the antiquated ways of C, the programming language upon which Objective-C is built. While improvements in computing power have advanced the state of art in programming language design, Objective-C sometimes seems stuck in the past. ]]></description>
			<content:encoded><![CDATA[<p><img src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/Photo.jpg" alt="Whiteboarding some ReactiveCocoa" title="Whiteboarding some ReactiveCocoa" width="1024" height="683" class="aligncenter size-full wp-image-9425" /></p>
<p><em>Note</em>: This is going to be a slightly more technical post geared toward our friends in the iOS developer community. </p>
<p><a href="https://en.wikipedia.org/wiki/Objective-C#History">Objective-C</a> is a programming language which often finds itself mired in the antiquated ways of C, the programming language upon which modern Objective-C is built. While improvements in computing power have advanced the state of art in programming language design, Objective-C sometimes seems stuck in the past. </p>
<p>Objective-C and C are <em>imperative</em> programming languages where software developers provide statements that the computer executes in sequence. Behaviour emerges from executing these instructions. If a developer has written the correct instructions in the correct order, then the behaviour that emerges should satisfy the requirements of the program. </p>
<p>However, the instructions often have flaws. We use manual and automated testing to mitigate the risk of these flaws, but it would be better if we could abstract away the individual instructions and focus solely on the <em>desired behaviour</em>. That&#8217;s where declarative programming comes in.</p>
<p>The imperative paradigm forces developers to write <em>how</em> a program will solve some task. The declarative paradigm frees developers to describe <em>what</em> the task is. </p>
<p><a href="https://github.com/ReactiveCocoa/ReactiveCocoa">ReactiveCocoa</a> is an approach to making Objective-C less imperative and more declarative. It abstracts much of the <em>how</em> and focuses on the <em>what</em>. </p>
<p>Let&#8217;s take a look at a few examples to see what a declarative program in Objective-C might look like. </p>
<p>At the core of ReactiveCocoa is a <em>signal</em>. A signal represents a stream of events that occur over time. <em>Subscribing</em> to a signal allows developers to access those events. Let&#8217;s take a look at a basic example.</p>
<p>A text field in an iOS app can provide a signal which produces events when its text changes. ReactiveCocoa provides a category on <code>UITextField</code> with the function <code>rac_textSignal</code>, which we can subscribe to. </p>
<script src="https://gist.github.com/5404679.js"></script><noscript><pre><code class="language-objective-c objective-c">[self.textField.rac_textSignal subscribeNext:^(NSString *value) {
    NSLog(@&quot;Text field has been updated: %@&quot;, value);
}];</code></pre></noscript>
<p>Here, we&#8217;ve <em>declared</em> that when the text field&#8217;s text changes, its new value is logged. Whenever the text field&#8217;s signal emits an event, the block is executed and passed the updated value. </p>
<p><img src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/subscription.png" alt="" title="Subscribing to a signal" width="315" height="328" class="aligncenter size-full wp-image-9297" /></p>
<p>The nice thing about signals is that they can be composed. Let&#8217;s <em>filter</em> the signal returned by <code>rac_textSignal</code> to make sure that the length of the string is at least three characters before we log it. </p>
<script src="https://gist.github.com/5569937.js"></script><noscript><pre><code class="language-objective-c objective-c">[[self.textField.rac_textSignal filter:^BOOL(NSString *value) {
    return [value length] &gt;= 3;
}] subscribeNext:^(NSString *value) {
    NSLog(@&quot;Text field has been updated: %@&quot;, value);
}];</code></pre></noscript>
<p>The <code>filter:</code> returns a new signal. When the first signal emits an event, the value of that event is passed to the filter block. If the block returns <code>YES</code>, then the new signal emits an event. The subscription is to the signal returned by <code>filter:</code>. </p>
<p><img src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/filter.png" alt="" title="Filtering a signal" width="469" height="496" class="aligncenter size-full wp-image-9298" /></p>
<p>Let&#8217;s do something more complex. Let&#8217;s <em>combine</em> two signals from two different text fields and <em>reduce</em> their values into a boolean which we then <em>bind</em> to the enabled property of a button. </p>
<script src="https://gist.github.com/5569942.js"></script><noscript><pre><code class="language-objective-c objective-c">[[RACSignal
   combineLatest:@[self.firstNameField.rac_textSignal, self.lastNameField.rac_textSignal]
          reduce:^(NSString *firstName, NSString *lastName){
              return @(firstName.length &gt; 0 &amp;&amp; lastName.length &gt; 0);
          }] toProperty:@&quot;enabled&quot; onObject:self.button];</code></pre></noscript>
<p>The <code>enabled</code> property of the button is always derived from the latest signal values from the two text fields. This represents one of the core components of FRP: deriving state.</p>
<p><img src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/combine.png" alt="" title="Combining two signals" width="484" height="511" class="aligncenter size-full wp-image-9299" /></p>
<p>In each of these cases, we make declarations once in <code>viewDidLoad</code> and the statements stay true for the duration of the application runtime. There are no delegate methods to implement or state to store. Behaviour is explicitly declared instead of implicitly inferred. </p>
<p>FRP can get much more complex, and <a href="https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/FrameworkOverview.md">learning</a> the nuts-and-bolts of ReactiveCocoa takes time. However, this time is an investment that will yield more stable programs with predictable, well-defined behaviour. </p>
<p>We&#8217;ve seen throughout computing history that software development tends toward higher levels of abstraction. We no longer, for instance, deal with punchcards or assemblers. I believe that FRP represents another level of abstraction which programmers should leverage to build better applications, faster. </p>
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/ixg7ISYierg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/reactivecocoa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/reactivecocoa/</feedburner:origLink></item>
		<item>
		<title>5 Things to Know When  Designing for iOS</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/WjocZE_JQeY/</link>
		<comments>http://www.teehanlax.com/blog/5-things-to-know-when-designing-for-ios/#comments</comments>
		<pubDate>Wed, 20 Mar 2013 14:36:10 +0000</pubDate>
		<dc:creator>Ash Furrow</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/?post_type=blog&amp;p=9244</guid>
		<description><![CDATA[Based on our experience creating great iOS apps, we&#8217;ve come up with a list of 5 things we believe designers should keep in mind while conceptualizing interfaces for iOS. While the focus of this article is only on iOS apps, much of the advice here translates directly to other mobile platforms. 1. Understand Your Medium [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-large wp-image-9246" title="iOS Design" src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/Hand-1024x682.jpg" alt="" width="1024" height="682" /></p>
<p>Based on our experience creating great iOS apps, we&#8217;ve come up with a list of 5 things we believe designers should keep in mind while conceptualizing interfaces for iOS. While the focus of this article is only on iOS apps, much of the advice here translates directly to other mobile platforms.</p>
<h3>1. Understand Your Medium</h3>
<p>This seems obvious, but designing apps instead of websites actually represents a huge shift in mindsets. Apps aren&#8217;t websites and shouldn&#8217;t be designed like them, either. Let&#8217;s talk about specifics.</p>
<p>Apps have a completely different user interaction model from websites: taps vs. clicks, views vs. pages, buttons vs. links, etc. We believe a change in language when discussing app design helps us keep the right frame of mind.</p>
<p>In addition to a different interaction model, apps should have different modalities. Don&#8217;t overload the user with too much in one view; separate different functionality into different views. This is even more important on the iPhone than on the iPad, since screen space is even more constrained.</p>
<p>How users get around in apps vs. on websites is another area of contrast to consider. Navigation hierarchies in apps tend to be narrower and deeper than on the web. Users are <em>used</em> to having to tap several times in order to achieve some goal or to access some content; don&#8217;t try and prevent this natural drilling-down behaviour by putting too much on the screen at once.</p>
<p>Navigation is very different on iOS – there is no browser chrome or Back button. Since iOS launched, many navigation conventions have emerged; which one is right for your app depends on your specific needs. Check out <a href="http://pttrns.com/categories/13-navigations">Pttrns</a> for a great collection of approaches that apps have taken in regards to navigation.</p>
<p>Finally, remember that iOS apps run on iOS devices. Duh, right? But it&#8217;s an important point. Rendering semitransparent content with rounded corners and a drop shadow over top of a image overlaid with an animated gradient is probably going to cause a performance problem. Work with a developer to figure out a way to implement tricky designs without causing user-noticeable lagging in the interface.</p>
<p>Wikipedia has a <a href="http://en.wikipedia.org/wiki/List_of_iOS_devices" target="_blank">comprehensive breakdown of all iOS devices</a>, but we thought we&#8217;d distill that down to a short list of devices running iOS 6. We&#8217;re hoping this will help you make informed decisions about your app&#8217;s design and how it can degrade gracefully on less capable hardware.</p>
<div style="overflow: scroll;">
<table width="100%">
<tbody>
<tr>
<th>Device</th>
<th>Size</th>
<th>Dimensions</th>
<th>Common Gotchas</th>
</tr>
<tr>
<td>iPhone 3GS</td>
<td>3.5&#8243;</td>
<td>320&#215;480</td>
<td>
<ul>
<li>
<p>Only non-Retina display for iPhone idiom</p>
</li>
<li>
<p>No gyroscope</p>
</li>
<li>
<p>No front-facing camera</p>
</li>
</ul>
</td>
</tr>
<tr>
<td>iPhone 4</td>
<td>3.5&#8243;</td>
<td>640&#215;960</td>
<td>
<ul>
<li>
<p>Only single core despite Retina screen</p>
</li>
<li>
<p>Lowest performer of iPhones</p>
</li>
</ul>
</td>
</tr>
<tr>
<td>iPhone 4S</td>
<td>3.5&#8243;</td>
<td>640&#215;960</td>
<td>
<ul>
<li>
<p>N/A</p>
</li>
</ul>
</td>
</tr>
<tr>
<td>iPhone 5</td>
<td>4&#8243;</td>
<td>640&#215;1136</td>
<td>
<ul>
<li>
<p>Tall displa</p>
<p>y</li>
</ul>
</td>
</tr>
<tr>
<td>iPod Touch (4th Generation)</td>
<td>3.5&#8243;</td>
<td>640&#215;960</td>
<td>
<ul>
<li>
<p>Only single core despite Retina screen</p>
</li>
</ul>
</td>
</tr>
<tr>
<td>iPod Touch (5th Generation)</td>
<td>4&#8243;</td>
<td>640&#215;1136</td>
<td>
<ul>
<li>
<p>Tall display</li>
<li>
<p>Half the RAM of iPhone 5 despite same screen</p>
</li>
</ul>
</td>
</tr>
<tr>
<td>iPad (2nd Generation)</td>
<td>9.7&#8243;</td>
<td>1024&#215;768</td>
<td>
<ul>
<li>
<p>Low-quality camera</p>
</li>
</ul>
</td>
</tr>
<tr>
<td>iPad (3rd Generation)</td>
<td>9.7&#8243;</td>
<td>2048&#215;1536</td>
<td>
<ul>
<li>
<p>Retina screen can cause performance problems</p>
</li>
</ul>
</td>
</tr>
<tr>
<td>iPad (4th Generation)</td>
<td>9.7&#8243;</td>
<td>2048&#215;1536</td>
<td>
<ul>
<li>
<p>N/A (fixed performance problems from 3rd generation)</p>
</li>
</ul>
</td>
</tr>
<tr>
<td>iPad Mini</td>
<td>7.9&#8243;</td>
<td>1024&#215;768</td>
<td>
<ul>
<li>
<p>Pixels, and therefore controls, are physically smaller; vet your designs</p>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
<h3>2. Design Universally</h3>
<p>We believe that the best applications are those that work universally. That means they work on Retina screens and non-Retina screens; they work on tall screens and short screens; they work on iPads and iPhones and iPod touches; most importantly, they work <em>well</em> in all these contexts.</p>
<p>This is hard, but we&#8217;ve got a few quick tips to get you 80% of the way there.</p>
<h4>Avoid odd-sized Retina graphics</h4>
<p>Non-Retina assets <em>must</em> have <em>exactly</em> <a href="http://www.teehanlax.com/tools/density">half the size</a> of their Retina counterparts. That means that a non-Retina asset corresponding to a 101 pixel Retina asset would have a dimension of 50.5 pixels, which is impossible. Save yourself and your developer some headaches and always use round dimensions for Retina assets.</p>
<h4>Make Tap Targets Big Enough</h4>
<p>Remember how users aren&#8217;t using your app in a web browser? Well, they also aren&#8217;t using a mouse. Instead, all interactions with your app are made with a far less precise instrument: a finger.</p>
<p>In order to make sure that users can easily interact with your app&#8217;s interface, make sure that anything they can tap is <a href="http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/Characteristics/Characteristics.html#//apple_ref/doc/uid/TP40006556-CH7-SW6" target="_blank">at least 44 points wide and tall</a>.</p>
<h3>3. Design on a Device</h3>
<p>iOS devices have a range of pixel densities and vary in their reproduction of colour. When designing iOS apps, you should take that into account.</p>
<p>In order to get an accurate idea of what your app will look like, you need to render it on a range of devices: Retina and non-Retina, tall and short, iPad and iPhone. Use <a href="http://www.teehanlax.com/blog/how-to-design-pixel-perfect-photoshop-files-for-ios-apps/">LiveView</a> or Skala to mirror your photoshop files on your device. Lastly, don&#8217;t forget to vary the screen brightness to make sure your app looks good in all circumstances.</p>
<h3>4. Animate your Interface</h3>
<p>Animations are easy on iOS – Apple has gone to a lot of trouble so apps can easily be supplemented with cool animated transitions. It would be a shame not to take full advantage of this opportunity.</p>
<p>Unfortunately, animations are not easily conveyed through PSDs. The best idea for designing awesome animations is to work with a developer to prototype them on an actual device. Together, you can make throwaway apps that explore your idea for an animation. This will let you get a precise feel for exactly how your animations behave.</p>
<p>When designing animations, take advantage of what the user is already familiar with. Users expect that when they tap on an item to see more details, the new view should &#8220;push&#8221; in from the right; they also expect views for creating new content to slide up from the bottom. Mimic those motions in your own custom animations and don&#8217;t associate new actions with the existing animations. You should lean on what the user is familiar with to give them a better sense of familiarity and trust with your app.</p>
<h3>5. Involve Developers Early</h3>
<p>We believe that the best apps are made when developers are involved early in the design process, and when designers stay involved late in the development process. Collaboration between designers and developers will lead to some great work.</p>
<p>Implementing any reasonably complex design will have implementation challenges – the sooner developers can start thinking about solving those problems, the better the solutions will be.</p>
<p>We developers have ideas about interfaces that we&#8217;re not necessarily able to polish into an actual design. We also know iOS like the back of our hands, so we can point out elements of designs that don&#8217;t fit well within iOS. When designers and developers work together, awesomeness happens.</p>
<p>So there you go. Apps aren&#8217;t websites. Design universally. Design on a device. Animations are awesome. Involve developers early. These points will get you most of the way there – the rest is up to you.</p>
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/WjocZE_JQeY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/5-things-to-know-when-designing-for-ios/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/5-things-to-know-when-designing-for-ios/</feedburner:origLink></item>
		<item>
		<title>Welcome to the new teehanlax.com</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/XUFnmFBG6Iw/</link>
		<comments>http://www.teehanlax.com/blog/welcome-to-the-new-teehanlax-com/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 15:17:06 +0000</pubDate>
		<dc:creator>Geoff Teehan</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/?post_type=blog&amp;p=9198</guid>
		<description><![CDATA[I had to go back and look to be sure, but this is now the 7th iteration of teehanlax.com. It&#8217;s by far the biggest departure we&#8217;ve taken and quite a bit different from a traditional design agency site. It&#8217;s different for a reason We don&#8217;t list out our services. You won&#8217;t find a portfolio section. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://teehanlax.com.s3.amazonaws.com/wordpress/wp-content/uploads/new.jpg" alt="" title="new" width="1000" height="584" class="alignnone size-full wp-image-9238" /></p>
<p>I had to go back and look to be sure, but this is now the 7th iteration of teehanlax.com. It&#8217;s by far the biggest departure we&#8217;ve taken and quite a bit different from a traditional design agency site. </p>
<h3>It&#8217;s different for a reason</h3>
<p>We don&#8217;t list out our services. You won&#8217;t find a portfolio section. When we talk about our work, it&#8217;s done as long-form story-telling. We call them <strong>Stories of Making</strong>. They&#8217;re quite long, but give them a chance because we didn&#8217;t write them to read like case studies. We don&#8217;t list cringe-worthy &#8220;results&#8221;—We talk about what we learned in the hopes you can learn something too. They&#8217;re open and honest. They reveal failures, not just successes. </p>
<h3>Written for you, our peers</h3>
<p>Most agency sites are written for clients or potential clients. It seems inevitable when you write for this audience, you end up looking and sounding like everyone else out there. We&#8217;ve decided to focus on a different audience, you, our peers. We&#8217;re good at speaking to you and with you. We know what you want because, well, you are us. So going forward everything we will be doing on teehanlax.com is designed for people who like making stuff, just like us.</p>
<h3>Our peers are our clients</h3>
<p>While this may seem counterintuitive to focus our site at other creative professionals, we think potential clients will understand who we are, what we do and how we work far better through this site, than any site we&#8217;ve put out before.</p>
<p>Over the past 2 years we&#8217;ve found that more and more of the people we partner with <em>are</em> our peers. Our peers are responsible for hiring companies like us, not just CMOs and IT departments.</p>
<p>We have a ton more to share about the new site, but it&#8217;ll be far better experienced in a forthcoming making of story than it will be in this blog post. In addition to new stories we&#8217;ll be posting up new tools that help you do your job. We also have some old sections (like this blog) that will be getting an overhaul.</p>
<p>We hope you like <a href="http://www.teehanlax.com" title="it.">it.</a></p>
<p><script type="text/javascript" src="http://embed-script.branch.com/assets/embed/embed.m.js?body=0" data-branch-embedid="qrPBakAdAPY" ></script><br />
<noscript><a href="http://branch.com/b/redesigning-teehanlax-com">Redesigning teehanlax.com</a></noscript></p>
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/XUFnmFBG6Iw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/welcome-to-the-new-teehanlax-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/welcome-to-the-new-teehanlax-com/</feedburner:origLink></item>
		<item>
		<title>Latest Additions at Teehan+Lax</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/NTSCcDGvAho/</link>
		<comments>http://www.teehanlax.com/blog/latest-additions-at-teehanlax/#comments</comments>
		<pubDate>Mon, 25 Feb 2013 22:15:19 +0000</pubDate>
		<dc:creator>Geoff Teehan</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/?post_type=blog&amp;p=9184</guid>
		<description><![CDATA[I&#8217;m very pleased to formally announce two new additions to our crew today. The first is Ash Furrow, an outstanding iOS developer. Also joining us (again) is Kate Bowen, who did a good stint here a couple years back. Seeing as Kate is a copywriter, I asked her to write a little something about Ash [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/bowenfurrow.png" alt="" title="bowenfurrow" width="646" height="288" class="alignnone size-full wp-image-9185" /></p>
<p>I&#8217;m very pleased to formally announce two new additions to our crew today. The first is Ash Furrow, an outstanding iOS developer. Also joining us (again) is Kate Bowen, who did a good stint here a couple years back.</p>
<p><em>Seeing as Kate is a copywriter, I asked her to write a little something about Ash and herself to put here on our blog:<br />
</em></p>
<p>– – –</p>
<p>We are excited to welcome Ash Furrow, a new member to the Teehan+Lax family, and considerably more excited to welcome returning member, Kate Bowen. </p>
<p>Ash moved to Toronto from New Brunswick to work as an iOS developer and lead the iOS team at 500 Pixels for a year and a half, shipping their iPhone and iPad apps. After working closely with (but mostly just watching) the designers, Ash became more involved in design and photography. He also began a podcast on software design with two others&#8230; It was alright.</p>
<p>Kate grew up in our hometown of Toronto—we love that about her. She first joined Teehan+Lax back in 2007, where she called it a home for just shy of four years. These years are often referred to as the golden era of T+L. After flying the coop two years ago to explore working with different mediums like print and radio, many tears were shed (by us). Kate pretty much helped us to grow into the company we are today, so it&#8217;s nice to have her back.</p>
<p>Ash co-authored a book on Objective-C development (whatever that is) and has just finished another on collection views, a new technology in iOS. Kate single-authored enough short-stories to make up a beautiful, emotionally moving and intricate book that someone will probably adapt into a screenplay one day.</p>
<p>– – –</p>
<p>We&#8217;re looking forward to great things from them–even Kate.<br />
;)</p>
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/NTSCcDGvAho" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/latest-additions-at-teehanlax/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/latest-additions-at-teehanlax/</feedburner:origLink></item>
		<item>
		<title>Lessons in Learning: Creating a Functional Prototype</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/2aPPpA4yC3k/</link>
		<comments>http://www.teehanlax.com/blog/lessons-in-learning-creating-a-functional-prototype/#comments</comments>
		<pubDate>Wed, 16 Jan 2013 14:34:13 +0000</pubDate>
		<dc:creator>Christina Truong</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/?post_type=blog&amp;p=9036</guid>
		<description><![CDATA[Modern web and browser technologies are now capable of supporting features that give us the ability to build websites that go beyond hyperlinked media. In a recent project, we had the opportunity to create a web-based product for a client. In an effort to create a realistic prototype for the web app, we decided to [...]]]></description>
			<content:encoded><![CDATA[<p>Modern web and browser technologies are now capable of supporting features that give us the ability to build websites that go beyond hyperlinked media. In a recent project, we had the opportunity to create a web-based product for a client. In an effort to create a realistic prototype for the web app, we decided to explore technologies extending beyond the HTML/CSS/JavaScript realm. We wanted to take advantage of the client&#8217;s existing API and integrate the content from their database, rather than create static templates with placeholder content.</p>
<p>Getting to this goal required a change to our workflow. The traditional approach of separating tasks by disciplines into progressive phases would not work for this type of project; we had to adopt a more agile approach.</p>
<h3>Traditional vs. Agile</h3>
<p>In a traditional workflow, tasks are based on disciplines and are scheduled one after another. First the analysis and planning is completed, followed by design, development and QA. The finished product is then presented and delivered to the client. Although there are rounds of feedback, revisions and collaboration within this workflow, for the most part each discipline is tackled separately until completion before the next task can start. Progress is measured by which activity has been completed.</p>
<p><img class="alignnone size-full wp-image-9049" title="calendar-traditional" src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/calendar-traditional.jpg" alt="" width="678" height="379" /></p>
<p>In an agile workflow, instead of planning around one complete deliverable, this process breaks down the requirements into key features. Workflow is managed by the priority of features, which are iterated and built on rather than creating one final product. Each iteration is shared with the client to review. Progress is measured by how many features have been completed. Tasks may still be separated by disciplines but can be worked on concurrently.</p>
<p><img class="alignnone size-full wp-image-9050" title="calendar-agile" src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/calendar-agile.jpg" alt="" width="678" height="379" /></p>
<h3>Technology used</h3>
<p>There are <a title="20 JavaScript Frameworks Worth Checking Out" href="http://net.tutsplus.com/articles/web-roundups/20-javascript-frameworks-worth-checking-out/" target="_blank">many</a>, <a title="Journey Through The JavaScript MVC Jungle" href="http://coding.smashingmagazine.com/2012/07/27/journey-through-the-javascript-mvc-jungle/" target="_blank">many</a> tools to choose from but after some research and testing, we settled on <a href="http://angularjs.org/">angular.js</a>, a JavaScript MVC, to create a dynamic web application. We also used <a href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a> and <a href="http://lesscss.org/">LESS</a> for fast prototyping and more efficient CSS as well as <a href="http://git-scm.com/">Git</a> for version control.</p>
<h3>Lessons Learned</h3>
<h4>Wins</h4>
<ul>
<li>Being able to use dynamic content makes it easier to identify functionality issues and see how the designs work in context.</li>
<li>Different activities can run concurrently, tasks can overlap. There still needs to be some lead time between tasks but not as much as required in the traditional flow.</li>
<li>Code is not used to fake the functionality of features just to be tossed out and replaced in production. Instead, the code is written to be production ready and can be delivered and used as-is.</li>
<li>If cost or time becomes an issue, thoughful decisions can be made about which features can be left out.</li>
<li>If there are changes to the project timeline, the prototype may not have all of the planned features but will still be functional.</li>
</ul>
<p>All of these things let us make decisions by actually using the product. <a href="http://ma.tt/2010/11/one-point-oh/">Usage is oxygen for product design</a>.</p>
<h4>Challenges</h4>
<ul>
<li>Getting used to tearing down code and designs, rebuilding and redesigning over and over again is a hard adjustment. You have to learn how to be flexible and expect the inevitable.</li>
<li>Deciding where to draw the line between creating a pixel perfect prototype versus a functional prototype when time becomes a factor can be tough and often happens on a case by case basis.</li>
<li>The project team and client have to have the resources to create and maintain the technology used.</li>
</ul>
<p>Managing many concurrent activities and making informed tradeoffs takes a lot of executional discipline.</p>
<p>As with any process, tool or technology, one solution may not work for all situations. There needs to be some experimentation to find the right fit. Despite some of the challenges using a different approach, the project was a success because the final deliverable had more value than what would have been accomplished using the traditional approach.</p>
<p>We&#8217;re excited to continue in this direction because we strongly believe it will help us get better at making digital products and services that people love and want to use.</p>
<p>Reference: <a href="http://www.agile-process.org/" target="_blank">http://www.agile-process.org/</a></p>
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/2aPPpA4yC3k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/lessons-in-learning-creating-a-functional-prototype/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/lessons-in-learning-creating-a-functional-prototype/</feedburner:origLink></item>
		<item>
		<title>Sustainable Digital Ecosystems</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/PCNy7Hskyqk/</link>
		<comments>http://www.teehanlax.com/blog/sustainable-digital-ecosystems/#comments</comments>
		<pubDate>Tue, 08 Jan 2013 14:29:38 +0000</pubDate>
		<dc:creator>Kyra Aylsworth</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Strategy]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/?post_type=blog&amp;p=8972</guid>
		<description><![CDATA[I haven’t been able to stop thinking about this Ted Talk by Dan Barber I saw a while ago about a sustainable fish farm. It’s called Veta La Palma, an aquaculture farm located in Spain. Wikipedia tells me that it produces 1,200 tons of sea bass, bream, red mullet and shrimp each year. Unlike most [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-large wp-image-9018" title="en_23_~_Lake_pink_flamingos" src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/en_23__Lake_pink_flamingos-1024x768.jpeg" alt="" width="1024" height="768" /><br />
I haven’t been able to stop thinking about <a href="http://www.ted.com/talks/dan_barber_how_i_fell_in_love_with_a_fish.html" target="_blank">this Ted Talk</a> by Dan Barber I saw a while ago about a sustainable fish farm.</p>
<p><iframe src="http://embed.ted.com/talks/dan_barber_how_i_fell_in_love_with_a_fish.html" frameborder="0" scrolling="no" width="560" height="315"></iframe></p>
<p>It’s called <a href="http://en.wikipedia.org/wiki/Veta_La_Palma">Veta La Palma</a>, an aquaculture farm located in Spain. Wikipedia tells me that it produces 1,200 tons of sea bass, bream, red mullet and shrimp each year. Unlike most of the world’s fish farms, it does so not by interfering with nature, but by supporting it.</p>
<p>When Barber asked <a href="http://www.time.com/time/magazine/article/0,9171,1902751,00.html" target="_blank">Miguel Medialdea</a>, the lead biologist at Veta La Palma, how he measured success, he pointed to thousands of pink flamingoes blanketing the water and said, “That’s success. Look at their bellies, they’re feasting!” He explains that the flamingoes travel 150 miles every day to feed on his fish “because the food’s better.” His fish farm is also one of the largest and most important private bird sanctuaries in Europe.</p>
<p>Barber asked him, “Isn’t a thriving bird population the last thing you want on a fish farm?” He explains that the flamingoes, by eating mostly shrimp, create an abundance of nutritious algae left for his prized fish. “We farm extensively, not intensively,” says Medialdea.</p>
<h4>Barber describes Veta La Palma as:</h4>
<p>1. A farm that doesn’t feed its animals.<br />
2. A farm that measures its success by the health of its predators.<br />
3. A farm that’s literally a water purification plant.</p>
<p>As interested as I am in sustainable aquaculture, I find the model compelling as a blueprint for healthy ecosystems of all kinds. Imagine digital environments that could be described that way: places that require little maintenance, that provide value to everyone (not just the ‘farmer’) and contribute to improving the overall health of the wider digital environment.</p>
<p>It seems like everyone is talking about the importance of ecosystems these days, especially in the context of ‘brand ecosystems’. And although I think this is an interesting topic, I am using the ecological metaphor to talk about something a little different.</p>
<h3>The Problem: Digital Landfill</h3>
<p>Many award-winning digital campaigns are really very empty experiences. You are led along an arduous (though often very pretty) path for a “chance to win” something great. Which is fine &#8211; it is what it is &#8211; but I don’t think these represent excellence in digital experiences; marketing or otherwise.</p>
<p>Two well-received campaigns that spring to mind are Volkswagen’s “Hitchhike with a Like” and the Shoppers Drug Mart “Spin to Win” contest. Both are brands that I really like, but after going through the motions of their game mechanics (spinning wheels, clicking to ‘hitch’ a ride), I left both experiences feeling a bit used. I didn’t get anything out of them except for that chance to win and the likelihood of winning anything is slim. Both of them present themselves as games, so even if I don’t win, I should be having fun, right? Instead, I left both experiences with a tangible film of regret, my life energy being converted into a “time spent” stat for someone’s impending measurement exercise.</p>
<p>What is the goal of these programs? That I spend half an hour on their Facebook promotion? I know it’s a game, but it’s slow and unfulfilling. It’s pretty, but I expect more from my game experiences these days.</p>
<p>And what happens to these sites when the quarter is over? Some will be recycled but most will drift off toward the garbage heap. Which makes sense because they weren’t built to last.</p>
<p><a href="http://madebymany.com/" target="_blank">Made by Many</a> coined the concept of ‘<a href="http://www.slideshare.net/madebymany/silicon-beach-d01" target="_blank">landfill marketing</a>’ or ‘digital landfill’, which is a great way to describe disposable digital marketing efforts. They don’t provide much value to anyone and are a threat to the health of our digital environment. Good digital experiences, on the other hand, are designed to be durable and to provide to long-lasting benefit to everyone involved.</p>
<h3>An Alternative Model: Sustainable Digital Environments</h3>
<p>How do we create digital experiences that are sustainable and that function in a way that benefits both customers and brands … and even our competition?</p>
<p>I was inspired by <a href="http://www.bigspaceship.com/" target="_blank">Big Spaceship</a>’s case study on creating the <a href="http://www.bigspaceship.com/projects/crayola-website/" target="_blank">Crayola website</a>:</p>
<p><em>“Unlike many websites, the purpose of Crayola.com is not to keep visitors on the site for as long as possible. The site is a tool for driving product usage so we made it very simple for users to get inspired and start creating.”</em></p>
<p>Healthy digital environments should leave you feeling refreshed and energized or empowered in some way. But in order for them to do that, brands need to think of them as something that can exist long-term and have that sort of effect from the outset.</p>
<p>How do we do this? Using Barber’s description of the <em>Veta La Palma</em> as a guide, let’s look at digital experience through three lenses we can use to question our efforts. If we aren’t providing value to someone, somewhere, then maybe we should rethink our approach or our motivation.</p>
<p><strong>1. Support natural behaviour (Don’t feed the animals.)</strong><br />
The first lens is probably the most straightforward. Healthy digital environments aren’t about carrots and sticks. When people are self-motivated to participate in something, they are fed by the environment in a more substantial way. They are not taken out of their natural state and asked to do something unnatural. People behave in a certain way already, so it’s important to support them in that rather than distract them from their goals. And let’s not mistake conditioned reflexes for engagement. Think <a href="http://nikeplus.nike.com/plus/" target="_blank">Nike+</a>.</p>
<p>A less obvious example comes from Yancey Strickler, one of the founders of Kickstarter. He <a href="http://www.youtube.com/watch?v=c25G3QrcsCc">talks about</a> how the classic formats for Kickstarter videos have evolved since they launched. He says, “We never told people how to structure the rewards or how to make their videos or anything … there’s sort of a collective intelligence that emerged over time on how to do this thing.” Letting go of some of the control can yield interesting and ultimately more authentic results. If you can commit to supporting the experience, other things will sort themselves out organically.</p>
<p><strong>2. Be generous (Measure success by the health of your predators.)</strong><br />
This quality points to the importance of what <a href="http://www.wired.com/business/2012/12/mf-tim-oreilly-qa/">Tim O’Reilly</a> refers to “creating more value than you capture”. How this manifests will depend on the goals of the brand. But if we agree that the best experiences are those that provide people with something they need or want, it would indicate some level of success if people want to use, share or outright steal what you’ve got on offer.</p>
<p>A good example of this is how ProPublica uses <a href="http://www.niemanlab.org/2012/12/propublica-why-we-use-creative-commons-licenses-on-our-stories/" target="_blank">Creative Commons</a> on their stories to encourage other publishers to distribute their articles. The terms of their license are laid out on a page titled: <a href="http://www.propublica.org/about/steal-our-stories" target="_blank">Steal Our Stories</a>. The result is a substantially wider reach, which supports their mission to have an impact and spur reform.</p>
<p><strong>3. Improve the world around you (Be a water-purification plant.)</strong><br />
The fact is, most of us don’t get to work on world-changing projects all of the time. But there is something inspirational about creating digital experiences for the people of Planet Earth that actually serve their needs. By holding ourselves to some of these standards, we can improve the cultural environment around digital making and marketing.</p>
<p>If you support the environment you rely on and don’t take more than you need, you can improve the lives of your customers (and neighbouring communities) in tangible, and often intangible, ways.</p>
<p>An admirable example is the <a href="http://makezine.com/about/">MAKE</a> phenomenon. It’s a magazine, it’s a festival, it’s a community. Sure, they sell things, but it’s so much more. They describe their audience as: “a growing culture and community that believes in bettering ourselves, our environment, our educational system—our entire world. This is much more than an audience, it&#8217;s a worldwide movement that Make is leading—we call it the Maker Movement.” Importantly, this movement is not an accident, it’s by design.</p>
<h3>What’s In It for You?<br />
Sustainable Relationships.</h3>
<p>Understanding the real relationships that exist between your customers and your brand helps support the development of brand utility. Instead of force-fitting your brand’s product into customer’s lives, the sustainable ecosystem model helps us to ask: What is your brand really doing for its customers? Or, as Ingmar Delange asks in his <a href="http://www.slideshare.net/idelange/a-useful-guide-to-the-brand-utility-3961712?from=ss_embed" target="_blank">presentation</a> on brand utility, “What can we do for you?”</p>
<p>It is not possible to create and maintain healthy digital environments for customers without understanding what motivates and supports behaviour in context. A healthy digital ecosystem simultaneously provides sustenance and room to breathe &#8211; that is, meeting customer needs while also getting out of the way.</p>
<p>Thinking about digital experience design in this way helps us keep customers in focus &#8211; instead of trying to create faux experiences around marketing objectives, we can strengthen the mutually-beneficial relationships that exist in these ecosystems.</p>
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/PCNy7Hskyqk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/sustainable-digital-ecosystems/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/sustainable-digital-ecosystems/</feedburner:origLink></item>
		<item>
		<title>Subcompact Publishing meet Epic Storytelling</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/tMR5W0Ob9HI/</link>
		<comments>http://www.teehanlax.com/blog/subcompact-publishing-meet-epic-storytelling/#comments</comments>
		<pubDate>Fri, 04 Jan 2013 15:10:17 +0000</pubDate>
		<dc:creator>Jon Lax</dc:creator>
				<category><![CDATA[Strategy]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/?post_type=blog&amp;p=8985</guid>
		<description><![CDATA[(This post originally appeared on Medium) On December 20, 2012 the New York Times released Snow Fall, The Avalanche at Tunnel Creek, a 5 part story of skiers and snowboarders trapped by an avalanche in Washington State’s Cascade mountain range. It is an amazing story reminiscent of Jon Krakauer’s, now famous 1996 Outside Magazine piece, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-large wp-image-8995" title="Screen Shot 2013-01-04 at 10.13.37 AM" src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/Screen-Shot-2013-01-04-at-10.13.37-AM-1024x575.png" alt="" width="1024" height="575" /></p>
<p>(This post originally appeared on <a title="Subcompact Publishing meet Epic Storytelling" href="https://medium.com/i-m-h-o/3c5aa3d6375f" target="_blank">Medium</a>)</p>
<p>On December 20, 2012 the New York Times released <a href="http://www.nytimes.com/projects/2012/snow-fall/#/?part=tunnel-creek" target="_blank">Snow Fall, The Avalanche at Tunnel Creek</a>, a 5 part story of skiers and snowboarders trapped by an avalanche in Washington State’s Cascade mountain range.</p>
<p>It is an amazing story reminiscent of Jon Krakauer’s, now famous 1996 Outside Magazine piece, <a href="http://web.archive.org/web/20110208224849/http://outsideonline.com/outside/destinations/199609/199609_into_thin_air_1.html" target="_blank">Into Thin Air</a>. As a piece of journalism, John Branch’s Snow Fall is an extraordinary piece of writing. It is a form of writing not often seen on the Web; long, well researched, impeccably edited, Pulitzer bound. But most of the conversation around the piece surrounds its layout and presentment.</p>
<p>In between the words are incredible motion graphics, videos and photos that bring life to the story. In fact, most people commenting on the story really only viewed it as a picture book. Due to its length and depth I had to carve out a solid hour to read it and haven’t viewed every element.</p>
<p>Snow Fall is everything that Craig Mod outlines in his article “<a href="http://craigmod.com/journal/subcompact_publishing/" target="_blank">Subcompact Publishing: Simple Tools and Systems For Digital Publishing</a>” isn’t. Snowfall is Epic.</p>
<p>Craig outlines several characteristics of Subcompact Publishing, which arguably Snow Fall follows… it has clear navigation, HTMLish, Open Web etc. But Craig’s overall theme in Subcompact publishing is that it is lightweight, lesser than by design. Subcompact publishing is really something that should be easy to do.</p>
<p>In contrast, Snow Fall was not easy to do. It took 11 people 6 months to create. It is greater than in every way to Subcompact pieces (like this one). Snow Fall isn’t the first of these pieces. ESPN’s <a href="http://sports.espn.go.com/espn/eticket/story?page=Dock-Ellis" target="_blank">Doc Ellis story</a>, <a href="http://www.theverge.com/2012/8/28/3262089/history-of-dubstep-beyond-lies-the-wub" target="_blank">The Verge</a> and the work that <a href="http://pitchfork.com/features/cover-story/reader/bat-for-lashes/" target="_blank">Pitchfork</a> are doing lately with their features are all coming from the same place.</p>
<p>Of course, these long intensive pieces are the stuff magazine journalism is based on. These publishers are just following in the footsteps of their predecessors.</p>
<blockquote><p>Gay Talese, <a href="http://www.esquire.com/features/ESQ1003-OCT_SINATRA_rev_" target="_blank">Frank Sinatra Has a Cold</a>. (Esquire, April 1966)<br />
Hunter S. Thompson, <a href="http://www.ralphsteadman.com%2FKYDerby.asp" target="_blank">The Kentucky Derby is Decadent and Depraved</a>. (Scanlan’s Monthly, June 1970)<br />
Neal Stephenson, <a href="http://www.wired.com/wired/archive/4.12/ffglass.html" target="_blank">Mother Earth, Mother Board: Wiring the Planet</a>. (Wired, December 1996)<br />
David Foster Wallace, <a href="http://www.gourmet.com/magazine/2000s/2004/08/consider_the_lobster" target="_blank">Consider the Lobster</a>. (Gourmet Magazine, August 2004).</p></blockquote>
<p>We stand on the shoulders of giants.</p>
<p>There seem to be 2 separate but related currents running in publishing right now, minimlaists and maximalists. Subcompact Publishing meet Epic Storytelling.</p>
<h3>Epic Storytelling is a designed experience.</h3>
<p>Epic Storytelling is about bringing significant resources to bear to tell a story. It requires specialists bringing their craft to it for it to happen.</p>
<h3>Epic Storytelling is bespoke.</h3>
<p>It is not (at least right now) system driven. As NY Times Design Director Andrew Kueneman: said in the <a href="http://www.theatlanticwire.com/technology/2012/12/new-york-times-snow-fall-feature/60219/" target="_blank">Atlantic Wire</a></p>
<blockquote><p>“This story was not produced in our normal CMS, which is probably pretty obvious.”</p></blockquote>
<p>There are attempts to create publishing systems that can create Epic Stories systematically, (<a href="https://www.atavist.com/" target="_blank">The Atavist</a>) but these are in their infancy.</p>
<h3>Epic Storytelling requires the reader to focus.</h3>
<p>It is not lightweight for the creator or the reader. Epic Storytelling wants your attention in a way that is different than Subcompact. Both require focus but Subcompact enables focus by removing cruft, making reading easier. Epic Storytelling rewards those readers who give it focus.</p>
<h3>Epic Storytelling is an art, not a science.</h3>
<p>Buzzfeed and HuffPo turned writing into a science, the science of optimizing clicks and headline writing. A/B the piece into existence. Epic Storytelling creates a splendid artifact. One, that is what it is, not optimized for page views but optimized for experience.</p>
<h3>Epic Storytelling is considered.</h3>
<p>Given the resources required to make these pieces, they need to follow a considered process. One that is well suited for large editorial organizations. The exact qualities that impede them in the Subcompact world, help them in the Epic world.</p>
<p>I see these two worlds not as opposite ends of a spectrum but rather a Venn diagram overlapping. They share as many qualities as they don’t. I believe that they can co-exist in the world quite nicely. At times each will be envious of the other, for one’s strengths are often the other’s weakness.</p>
<p>Maybe the best publications are equally adept at both and that is where the future lies.</p>
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/tMR5W0Ob9HI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/subcompact-publishing-meet-epic-storytelling/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/subcompact-publishing-meet-epic-storytelling/</feedburner:origLink></item>
		<item>
		<title>Our Walking Dead (aka ImageSpark)</title>
		<link>http://feedproxy.google.com/~r/teehanlax/~3/fnqmWFP5CTk/</link>
		<comments>http://www.teehanlax.com/blog/what-should-we-do-with-image-spark/#comments</comments>
		<pubDate>Tue, 11 Dec 2012 14:47:54 +0000</pubDate>
		<dc:creator>Jon Lax</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.teehanlax.com/?post_type=blog&amp;p=8878</guid>
		<description><![CDATA[History In September of 2008, one of our designers, Greg Washington, began discussing a frustration he had. When starting any design project he would assemble a collection of images. These images are the foundational design research he would do before opening Photoshop or sketching. Over years of projects he collected dozens of folders of loose [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/thumbs_down.jpeg" alt="Thumbs Down" title="Thumbs Down" width="700" height="327" class="alignnone size-full wp-image-8943" /></p>
<h3>History</h3>
<p>In September of 2008, one of our designers, <a href="http://www.gregwashington.ca/">Greg Washington</a>, began discussing a frustration he had. When starting any design project he would assemble a collection of images. These images are the foundational design research he would do before opening Photoshop or sketching. Over years of projects he collected dozens of folders of loose images on his hard drive. </p>
<p>Most designers maintain private collections of visual inspiration and research to fuel their creative process. Their typical workflow involved going out on the Web and downloading images to a local folder. There these images would sit with a bunch of other badly named files like img4065.jpg and fre566ba01.tif. If highly motivated, designers might bring those images into another program like Illustrator, InDesign, Photoshop or Keynote to create a &#8220;moodboard&#8221;. These files—both the individual files and the moodboards—might get printed once, or thrown into the depths of a server only to be lost.</p>
<p>Greg was looking for an easier way to find, organize and store images that would serve as creative inspiration. He wanted to be able to easily share these images and see what other designers were using as inspiration. He wanted to be able to network those folders that he knew were sitting on everyone&#8217;s computers.</p>
<p>We loved the idea and decided to put some effort behind building a site that could do this. Through October, November and December of 2008 about 4 people worked on a site that we called <a href="http://www.imgspark.com" title="Image Spark" target="_blank">Image Spark</a>. It launched in January of 2009. </p>
<p><img src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/Screen-Shot-2012-12-10-at-2.19.01-PM.png" alt="" title="Screen Shot 2012-12-10 at 2.19.01 PM" width="1214" height="1013" class="alignnone size-full wp-image-8896" /></p>
<p>As of December 2012 Image Spark has over <em>1,152,487</em> images, <em>21,996</em> moodboards and <em>48,947</em> user accounts. It had <em>155,339</em> visits last month, 89,816 of which were unique. Those users generated some <em>968,057</em> page views. </p>
<p>In 2012, it had over 1.1 million unique visitors viewing almost 9 million pages.</p>
<p><strong>So why are we considering shutting it down?</strong></p>
<h3>How 37Signals made us all believe</h3>
<p>In 2008, when we were building Image Spark, we discussed, how we could commercialize it. We discussed different business models, including display advertising, premium features and membership. We thought we had an idea that could be commercially viable. But how would we know what to invest in it? Should we pull people off client work? Should we take some of the cash we had saved as a business and hire additional people? </p>
<p>We convinced ourselves that we would know very quickly whether it was successful or not. People would either love it or they wouldn&#8217;t. The &#8220;people&#8221; would tell us. Usage would give us evidence about whether to put more resources into it. In retrospect, this seems insanse. The &#8220;Field of Dreams&#8221; approach to product development&#8230; build it and they will come. Why did we believe 6 weeks after launch we would know whether to sacrifice part of our services business for Image Spark? Because 37Signals made us believe it was possible.</p>
<p><a href="http://www.37signals.com">37Signals</a> was the worst thing to happen to services businesses trying to make products. They fucked it up for all of us, because they made it. For those of us old enough to remember, 37Signals was a services company like Teehan+Lax. They had clients and did work for hire. Of course, 37signals isn&#8217;t a services company anymore. They make amazing digital products and their success is enviable. </p>
<p>What&#8217;s more enviable is how they made the transition from services to products. They seemingly did it with very little disruption. One day they had clients, the next day they were running Basecamp. Cash started rolling in.</p>
<p>The great lie, agencies tell themselves is that it can be done. You can make the transition. Look, 37Signals did it. So can we. Image Spark might have been our Basecamp. Several years later, a startup called Pinterest proved there was a business in image sharing. Why wasn&#8217;t that us?</p>
<p>Let me explain why, I think, 37Signals were able to do it and why we failed with Image Spark.</p>
<p>Clayton Christensen, the father of disruptive innovation, says, &#8220;you can&#8217;t start a disruptive business from inside an incumbent one.&#8221; The incumbent business will always take the resources from the disruptive one. He argues that if you want to create a disruptive business you need to isolate it from the incumbent business. The disruptive business needs its own values, processes and resources to be successful. </p>
<p>In our example, the incumbent business, Teehan+Lax, which gets its revenue from charging clients, was too powerful for Image Spark. As soon as Image Spark launched, the people who worked on it (the resources) went right back on to the work that paid the bills. In the spring, Greg (a driving force behind Image Spark) left for an opportunity on the west coast. Image Spark became the Christmas toy that sat neglected in the corner.</p>
<p>So how did 37Signals do it? Basecamp was a project management tool that 37Signals was using to manage their clients.</p>
<blockquote><p>&#8220;We built Basecamp because we needed it. I&#8217;m a big believer in investing in what you know and what you need. We invested our time, energy, and focus into building a product that we knew we needed to run our own business. When you build what you know, and when you use what you build, you&#8217;ve got a head start on delivering a breakout product.&#8221; [<a href="http://www.oreillynet.com/network/2005/03/10/basecamp.html">source</a>]</p></blockquote>
<p>Basecamp got the resources (capital and human) it needed because it fueled the incumbent services business of 37Signals. It was able to take root because it wasn&#8217;t disruptive but highly complimentary.</p>
<p>This allowed them to mature a product and then realize, &#8220;hey others might like this&#8221;. This is why, I believe, 37Signals succeeded in their transition, and most agencies will fail.</p>
<p>Image Spark had some complimentary aspects but it wasn&#8217;t like its existence was crucial to Teehan+Lax&#8217;s services business. After we launched we got positive response from the design community, but not enough to gather the evidence we would need to invest heavily in it. </p>
<p>This is actually what happens with most products. They are rarely complete failures nor are they complete successes. They limp into the world on launch and then the real work starts. The real work of maturing and scaling. </p>
<h3>Image Spark dies a horrible death and becomes a zombie</h3>
<p>We did the worst thing you can do for a product: we left it alone. Over the past 3 years we&#8217;ve made only a few incremental updates to Image Spark, all on the backend. We moved it over to AWS from a dedicated server and then later re-engineered the database to improve performance. </p>
<p>There was never enough evidence that we should invest in it and so we just left it out there. It cost relatively little to keep open (about $2500 in server costs) and some people use it. But the product has become, what Joe Olsen at Phenomblue calls, &#8220;a &#8216;zombie idea&#8217; not dead, yet not alive either.&#8221; <a href="http://www.wired.co.uk/news/archive/2012-11/28/innovation-labs-good-or-bad?page=all"></a></p>
<p><img src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/6573056641_c96278e021_b.jpeg" alt="" title="6573056641_c96278e021_b" width="1024" height="754" class="aligncenter size-full wp-image-8891" /></p>
<p>Image Spark is our zombie and now we need to decide whether to kill it. </p>
<p>In December, MongoHQ informed us that our database requirements have grown to such a size that we need to upgrade to a Large server. Our AWS bill, while not huge, is getting larger not smaller. Next year, we estimate Image Spark will cost us about $9,000. </p>
<p>We aren&#8217;t sure it&#8217;s worth it.</p>
<h3>What do we do now?</h3>
<p>We are faced with a decision about the future of Image Spark. It has become this zombie walking through our business. A small asset is growing into a increasing liability.</p>
<p>Stock investors use a simple model for making investment decisions&#8230; buy, sell or hold. </p>
<p>We adapted that model to make investment decisions in our business.</p>
<p><strong>Improve &#8211; </strong>Invest the required resources to improve the product so that it is valuable to users.<br />
<strong>Maintain &#8211; </strong>Do nothing more than is required to keep it alive<br />
<strong>Kill &#8211; </strong>Shut&#8217;er down<br />
<strong>Sell &#8211; </strong>Can someone else find value in what&#8217;s been built?</p>
<p>Right now, Image Spark is on the kill list. We aren&#8217;t interested in maintaining it, finding a buyer and negotiating a sale feels like a distraction. Improving it, means diverting resources from money making activities to Image Spark which in a post-Pinterest world seems foolish.  </p>
<p><strong>We&#8217;d be interested to know from you, what do you think we should we do with Image Spark?</strong></p>
<p><img src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/Screen-Shot-2012-12-10-at-2.09.59-PM.png" alt="" title="Screen Shot 2012-12-10 at 2.09.59 PM" width="1212" height="976" class="alignnone size-full wp-image-8899" /></p>
<p><img src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/Screen-Shot-2012-12-10-at-2.11.08-PM.png" alt="" title="Screen Shot 2012-12-10 at 2.11.08 PM" width="1213" height="652" class="alignnone size-full wp-image-8900" /></p>
<p><img src="http://teehanlax.com.s3.amazonaws.com/wp-content/uploads/Screen-Shot-2012-12-10-at-2.13.05-PM.png" alt="" title="Screen Shot 2012-12-10 at 2.13.05 PM" width="1111" height="880" class="alignnone size-full wp-image-8901" /></p>
<p>Zombie Photo Credit: <a href="http://www.flickr.com/photos/e_monk/6573056641/sizes/l/in/photostream/">e_monk</a></p>
<h3>UPDATE: If we decide to close Image Spark, we will provide an export function and time for people to get their images. We wouldn&#8217;t leave you hanging.</h3>
<img src="http://feeds.feedburner.com/~r/teehanlax/~4/fnqmWFP5CTk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.teehanlax.com/blog/what-should-we-do-with-image-spark/feed/</wfw:commentRss>
		<slash:comments>187</slash:comments>
		<feedburner:origLink>http://www.teehanlax.com/blog/what-should-we-do-with-image-spark/</feedburner:origLink></item>
	</channel>
</rss>
