Allen Pike 2015-04-09T14:56:41-07:00 http://www.allenpike.com/ Allen Pike http://www.allenpike.com/2015/moving-mountains Moving mountains 2015-03-31T18:00:00-07:00 Allen Pike http://www.allenpike.com/ <p>Let’s say you’re an independent developer, and you want to convince the most profitable and successful tech company in history to make a change that benefits you. How might you go about that?</p> <p>Naturally you start by <a href="https://blackpixel.com/writing/2012/02/radar-or-gtfo.html">filing a Radar or Getting the FO</a>, but beyond that, it is infamously hard to determine who at Apple is actually responsible for your issue. It would be nice if every developer had a knowledgeable and responsive Developer Relations rep they could contact, but given that there are hundreds of thousands of iOS developers, that’s hardly practical. The same is true on Google’s and Microsoft’s platforms — at a certain scale, they can’t practically listen to every voice. As such, we reach to the most classic of persuasive methods: the critical article.</p> <p>A critical article about some Apple technology or policy is like a kind of thought virus. If you make a compelling argument, you can seed it on the open internet, and by its nature the article will spread among people who care about Apple and its success or failure. Naturally, this includes Apple employees. While it may be impossible from the outside to discern who is responsible for a particular iOS 8 usability issue, a thoughtful critique of the problem has a decent chance of making its way to that team and driving change for the better.</p> <h2 id="running-to-the-press">Running to the press</h2> <p>The introduction to the App Store Review Guidelines give this advice:</p> <blockquote> <p>If your App is rejected, we have a Review Board that you can appeal to. If you run to the press and trash us, it never helps.</p> </blockquote> <p>A lot of folks have argued that this is hypocritical to say, since negative press around a ridiculous rejection does seem to expedite resolution. At its root though, there is some truth: if you do a press interview feeding the latest “Apple is doomed because they rejected my fart app” article on Valleywag or Forbes, then Apple PR and the App Store team aren’t going to be enthusiastic about helping you, even if they may have their hand forced. On the other hand, if you write some thoughtful criticism on some actual problems with one of their policies or APIs that happens to be circulated in the press, there will be people at Apple who want to solve the problems. There’s a difference between trashing a company and criticizing their policies.</p> <p><a href="https://www.flickr.com/photos/rubin110" title="Photo: Rubin Starset"><img style='max-width: 100%' src="/images/2015/signs.jpg" alt="Photo: Rubin Starset" /></a></p> <p>In his recent short novel “<a href="http://www.elischiff.com/blog/2015/3/24/fear-of-apple">Fear of Apple</a>,” Eli Schiff argued that independent iOS developers aren’t critical enough of the fact that it’s increasingly difficult to make a living on the App Store. Now, I don’t know what iOS developers Eli has been talking to, since I’ve seen more articles, talks, and rants on this topic than any other in the community. What was more interesting to me, though, was that Eli attributed the supposed lack of criticism to a fear of Apple.</p> <p>While there are enough “vengeful Apple” stories from the Jobs era to give some long-time Apple developers pause, it’s unclear to me what potential critics are afraid that a modern Apple might do to them. Pulling some indie’s app from the store because they wrote a critical blog post is hardly Apple’s MO. Hell, I <a href="http://www.allenpike.com/2014/schrodingers-shift-key">called the iOS shift key the “the worst thing to happen in the history of software”</a> and I privately got positive feedback from folks at Apple. As <a href="http://www.marco.org/2015/03/25/censoring-myself-for-apple">Marco put it</a>:</p> <blockquote> <p>No sensible developer should be worried about angering “Apple” by fairly expressing legitimate criticism.</p> <p>There is no single “Apple” to anger, as the company comprises thousands of people across many different departments, all of whom can think for themselves. I’m sure some of them can’t take criticism well and may be vindictive — any large group of people will contain almost every personality type — but that’s not the attitude of any of the Apple people I’ve interacted with.</p> </blockquote> <p>Admittedly, if for some reason Apple PR noticed your dissection of serious bugs in some new API, they wouldn’t be pleased — but how often is your indie app business dependent on Apple’s PR department? Contrast that to how often you benefit from the work Apple’s API teams are doing on the many technologies we depend on to build our businesses. Consider how much you benefit when they improve the platforms you and your customers live on. Every fix you might motivate could affect hundreds of millions of users around the globe. For me, the math is clear: if there’s a chance you can help Apple build better software, it’s worth writing something critical.</p> <p>That said, the nature of developers’ critical pieces is going to be different than the dramapress’. We understand how hard software is, we know that Apple’s designers and engineers made the tradeoffs they did for a reason, and we actually want to effect positive change, not just get pageviews because we’ve riled up a frothing mass of anti-Apple noise. Apple makes various products and decisions that are interesting to talk about. Many of them are good, some of them are bad. In the end though, they’re a <a href="http://www.allenpike.com/2014/a-company-made-of-people/">company made of people</a>, and if we want to actually convince them to do better, we need to do just that: convince them.</p> <p>As a group, indies are saddened and frustrated by all the business challenges that unsustainable pricing and oversupply have created. We have been and will continue to be critical of specific App Store decisions, like lack of upgrades, that make it harder to keep writing good software for iOS and the Mac. We should continue to push issues like App Store search that hurt users and developers alike every day. Still, yelling at Apple for the fact there are 500,000 people flooding the store with mediocre apps isn’t going to effect change.</p> <p>Independent app developers live in the shadow of a mostly benevolent giant that can at a whim create and destroy entire markets. We’re usually too small to be intentionally slighted, so we have the freedom to speak up that folks at larger companies might not have. We may fear Apple the same way we fear nature: it’s a powerful force we don’t control. Unlike nature, though, it’s a force that’s trying to do good, and it’s one we can influence - if we make a compelling argument.</p> http://www.allenpike.com/2015/javascript-framework-fatigue A JS framework on every table 2015-02-28T18:00:00-08:00 Allen Pike http://www.allenpike.com/ <p>Most programming languages support a small number of popular, stable application frameworks. Objective-C and Swift apps use Apple’s excellent Cocoa framework. Ruby apps more often than not use Rails. Java has a handful of established web app frameworks, and they come and go relatively slowly.</p> <p>In the meantime, the latest and greatest JavaScript framework comes around every sixteen minutes.</p> <p>Studies show that a todo list is the most complex JavaScript app you can build before a newer, better framework is invented. Luckily, there’s an excellent site called <a href="http://todomvc.com/">TodoMVC</a> dedicated to comparing JavaScript frameworks by way of todo sample projects. There, you can see how 63 JavaScript app frameworks’ todo examples compare to just jQuery or vanilla JavaScript. If you think 63 frameworks are a lot, you ain’t seen nothing yet: the TodoMVC team <a href="http://blog.tastejs.com/yet-another-framework-syndrome-yafs">gets multiple pull requests weekly</a> from people flogging new JavaScript frameworks. </p> <p>For example, <a href="https://github.com/tastejs/todomvc/pull/1178">the most recent TodoMVC pull request</a>, as of this writing, wants to add Riot.js 2.0. What is Riot.js 2.0, you ask? Apparently, it’s the second version of something called Riot.js, an app framework that’s like React.js, but better in some ways that are definitely important. “But wait,” you may ask, “didn’t React like just come out and isn’t even 1.0 yet? How can a thing based on it be 2.0 already?!” The answer, my friend, is JavaScript.</p> <p><img style='max-width: 100%' src="/images/2015/javascript-guy.jpg" /></p> <p>Why is the JavaScript framework environment so unstable? What is driving this insanity? Why are Ruby developers using Rails 4.2 but client-side developers are hyping boron.js 0.2.1?</p> <p>The problem is, as always, the browser. The modern web browser is an incredible feat of engineering, especially considering its humble roots as a way to display simple documents. There is definitely a substantial amount of framework turnover in the node/io.js community, but it’s nothing compared to the zoo that is the browser app framework world. The wild instability of the client-side JavaScript landscape is a product of the browser: both its historical limitations and its incredible rate of improvement.</p> <p>The browser is the most ubiquitous app runtime in history by a wide margin, and to write applications for it you need to write JavaScript. As a consequence, JavaScript is the least elective programming language in the world – most people who are writing client-side JavaScript applications are not doing so because they chose JavaScript, but because they chose client-side web development. These people come from a wide variety of backgrounds, and have a wide variety of goals. This constant inflow of new ideas and interests has made the JavaScript community unusually diverse.</p> <p>Meanwhile, the browser itself changes far more rapidly and unpredictably than the underlying languages on which other frameworks are built. The browser has changed more since Backbone.js debuted in 2010 than Objective-C has changed since Cocoa debuted all the way back in 1988. Browser improvements that inspire new generations of frameworks happen constantly.</p> <p>These inputs fuel an incredible amount of experimentation, excitement, and adaptation. Every day new frameworks, new approaches, and new tools <a href="https://github.com/trending?l=javascript">erupt from the geyser we call Github</a>. Every year there are more instant-classic JSConf talks about <a href="https://www.youtube.com/watch?v=ztspvPYybIY">crazy new ideas</a>, <a href="https://www.youtube.com/watch?v=GNO_CYUjMK8">impressive new browser features</a>, and <a href="https://www.youtube.com/watch?v=x7cQ3mrcKaY">rethinking best practices</a>. This beautiful chaos is exciting in a way that I’ve never seen in another developer community.</p> <p><a href="https://www.flickr.com/photos/aperezdc/9756603043/" title="Photo: Adrián Pérez"><img style='max-width: 100%' src="/images/2015/jsconf-eu-banner.jpg" alt="Photo: Adrián Pérez" /></a></p> <p>Unfortunately, while the community is busy driving new features and new frameworks, the browser is is busy killing them.</p> <p>Unlike the frameworks we use in C++ or Swift, the entirety of your app framework must be downloaded, parsed, and turned into machine code before users even see your app. Caching and offline access continue to improve, but the very real constraints on bandwidth, latency, memory, and loading time are a huge challenge for the kind of huge app frameworks that we take for granted in native app development.</p> <p>This is especially true on mobile, where the already problematic constraints of memory, CPU, and network bandwidth can be crippling. While JavaScript is now a remarkably fast language, the ubiquity of the web means that your code and framework can be downloaded and run in some incredibly hostile environments. Frameworks that can take advantage of Chrome Canary’s supernatural powers on a Mac Pro aren’t going to enjoy themselves on “Browser” on an old Acer EvoAMAZE Plus 3G E.</p> <p>The churning seas on which client-side frameworks sail are especially treacherous for large, ambitious frameworks that try to create a rich environment and UI library for building apps the way we do natively.</p> <p>When SproutCore and Cappuccino appeared in 2007, I was totally sold by <a href="https://vimeo.com/6930037">the amazing demos</a>. I’d thought Moore’s law had finally delivered stable, featureful JavaScript frameworks for building beautiful desktop-like apps in the browser. Then I spent two years <a href="http://ajaxian.com/archives/technical-details-behind-iworkcom">shipping stuff</a> with SproutCore, dealing with megabytes’ worth of somebody else’s JavaScript, wrestling with weird technical choices necessitated by horrible DOM performance on IE7, and somehow cramming the whole thing into the iPad’s 256MB of RAM. Meanwhile, the documentation never caught up to the pace of breaking changes, and performance was a constant battle. Before long, the dream felt more like an evolutionary dead end.</p> <p><a href="http://en.wikipedia.org/wiki/Sharovipteryx" title="&quot;Sharovipteryx BW&quot; by Nobu Tamura (http://spinops.blogspot.com). Yes, this was a thing."><img style='max-width: 100%' src="/images/2015/flying-dino.jpg" alt="&quot;Sharovipteryx BW&quot; by Nobu Tamura (http://spinops.blogspot.com). Yes, this was a thing." /></a></p> <p>While in many ways I still dream of a framework that could deliver on the promises that SproutCore and Cappuccino made, I now have much more respect for how hard such a thing is to build, especially in JavaScript. The same flexible, untyped nature that makes JavaScript fun to write a microframework in makes it kind of unpleasant to learn or maintain a large framework in. While the strong typing of native app frameworks can feel like a drag on tiny projects, it makes their often-massive APIs easy to explore and use effectively: just tab-complete your way to victory.</p> <p>A deprecated API in the Cocoa framework just means that a warning comes up when I open my project, and sometimes I can even right-click to replace the old way of doing things with the new way. Meanwhile in JavaScript, poking around in the Webkit REPL to find APIs you might make use of is a good way to find unsupported accidentally public APIs that will blow up your app at runtime after some point update of your framework.</p> <p>All these forces – the rapid changes, the diverse needs, the hostile environment, and the loose language features – make large, feature-rich JavaScript frameworks slow, lumbering prey. A horde of young, nimble <a href="http://microjs.com/">microframeworks</a> swarm them, take them down, and fight over the meal. Modularity and componentization reigns.</p> <p><a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month"><img style='max-width: 100%' src="/images/2015/tar-pit.jpg" alt="Evolution's a bitch." /></a></p> <p>A world dominated by endless tiny frameworks actually works okay for JavaScript experts and consultants. We become skilled at mixing and matching components, are able to spend time keeping up to date on the latest options and their relative strengths, and gain a lot of fodder for our conference talks. Yet for those who are new to JavaScript or who aren’t full-time client-side developers, any given tiny framework can’t possibly solve the wide range of problems that JavaScript developers struggle with. Product companies building large, long-lived client-side apps need to settle on some framework, and live with the consequences for years as they discover its limitations.</p> <p>The well-regarded <a href="http://lhorie.github.io/mithril/getting-started.html">Mithril.js framework is only 5kb</a>. That’s great for load and parse time, but it necessarily can’t solve a rich array of problems. Rails, by contrast, has more than 100x as much code. <em>Just ActiveRecord is 1274kb!</em> In the browser, you can’t sanely use a 1.2MB framework, and so the proliferation continues.</p> <p>Neck deep in frameworks, <a href="http://blog.andyet.com/2014/08/13/opinionated-rundown-of-js-frameworks">choosing one we’re actually happy with</a> becomes virtually impossible. The Paradox of Choice means that knowing you’re probably not using the right framework causes endless cognitive dissonance. Ironically, this dissatisfaction drives even more people to create their own frameworks.</p> <p><a href="http://cube-drone.com/2014_02_19-Cube_Drone_76_Many_Angular_Ones.html" title="Cube Drone by Curtis Lassam."><img style='max-width: 100%' src="/images/2015/cube-drone-angular.jpg" alt="Cube Drone by Curtis Lassam." /></a></p> <p><a href="http://blog.tastejs.com/yet-another-framework-syndrome-yafs">Framework</a> <a href="https://the-pastry-box-project.net/addy-osmani/2014-January-19">fatigue</a> has driven down the number of frameworks that JavaScript developers actually try. Who is going to actually build a non-trivial application with Dojo, YUI, ExtJS, jQuery UI, Backbone, Ember, Cappuccino, SproutCore, GWT – oh man remember GWT? – Angular, Sencha, jQuery Mobile, Knockout, Meteor, Ampersand, Flight, Mithril, Polymer, React and Flux? Seriously?</p> <p>Nobody can try all the popular options, but everybody wishes for consolidation and more wood behind fewer frameworks. As such, a lot of developers have fallen into a pattern: avoid learning a new framework until it seems like one is finally ascending to the throne as the widely popular, exceptionally capable, “won’t get you fired” choice for building JavaScript frameworks. While Google Trends is no double-blind study, it seems clear that interest in Angular has far surpassed that of any historical web app framework. After a decade of chaos, it finally looks like one we’ve found the chosen one!</p> <p><img style='max-width: 100%' src="/images/2015/rise-of-angular.jpg" alt="Composition of Google Trends searches of &quot;%s tutorial&quot; for 9 frameworks." /></p> <p>Yes, Angular,js, the framework that I initially described in 2009 as “unreasonably weird” seems to have achieved a level of popularity that no JS app framework ever has. Between serious support from Google, an easy ramp-up path, and a rich community, Angular looks poised to finally settle the…</p> <p>Wait, what’s that? The Angular team has decided that <a href="http://developer.telerik.com/featured/can-angularjs-maintain-dominance/">Angular 2 will not be compatible with Angular 1.x</a>, and there will be no easy upgrade path?</p> <blockquote> <p>Developers familiar with the Angular 1.X will encounter a drastically different looking framework and will need to learn a new architecture.</p> </blockquote> <p>Oof.</p> <h2 id="is-this-forever">Is this forever?</h2> <p>Perhaps we should just resign ourselves to it always being this way. While I’ve long argued that creating your own JavaScript framework out of a microframework and a DOM library is madness, maybe it’s the least bad option. Maybe the quirks of the language and the constraints of the browser make a sophisticated but bulletproof framework like Cocoa or Rails just kind of impossible.</p> <p>Maybe I should just call off the hunt. Though, people do seem pretty excited about React.js. They have some smart developers and exciting ideas, at least from what I’ve seen.</p> <p>You know, maybe I should build something new with it and see what it’s like. Maybe… maybe it’s the one.</p> <hr /> <p><em>Special thanks to Henrik Joreteg, Angelina Fabbro, and Nigel Brooke for their feedback on the ideas behind this piece.</em></p> <p><em>This article has been <a href="http://postd.cc/javascript-framework-fatigue/">translated to Japanese</a>.</em></p> http://www.allenpike.com/2015/aeropress-when-used-properly When used properly 2015-01-21T09:00:00-08:00 Allen Pike http://www.allenpike.com/ <p>It is well known in the tech world that <a href="http://chasegallagher.com/writing/2012/10/1/a-fussy-way-to-make-coffee">to be successful, you need a fussy way to make coffee</a>. A couple years ago, after seeing some great recommendations, I thought I might finally try the legendary <a href="http://en.wikipedia.org/wiki/AeroPress">AeroPress</a>. Next time I was down at our local <a href="http://revolvercoffee.ca/home/">fancy coffee shop</a>, waiting for a fancy coffee, I took a look on their fancy shelves, and found the box. It was not what I expected. </p> <p><img style='max-width: 100%' src="/images/2015/aeropress-box.jpg" width="300s" /></p> <p>An AeroPress box is hexagonal, cheap, and ugly. Enough people had recommended it that I’d expected AeroPress may be <em>the best coffee maker</em>. Holding a flimsy box that declared <em>“The best coffee maker”</em> in 200pt bold italic Frankfurter, I was less sure. </p> <p>The box seemed to anticipate I might be doubtful, and as such it sought to reassure me. Flanking the unappealing product photo, it was covered nine long customer testimonials from notable coffee luminaries such as “Margie Gray, Milburn, NJ” and “David Maier, Brush Prairie, WA.” One glowing testimonial starts like this:</p> <blockquote> <p><strong>When used properly, AeroPress produces a remarkably good espresso-<wbr />style coffee</strong></p> </blockquote> <p><em>When used properly?</em> I felt awkward, as one does in the pharmacy when they’re trying to read a package they don’t want to be seen reading. I put the box back down gingerly, collected my fussy coffee, and fled.</p> <p>In the months that followed I kept hearing <a href="http://www.marco.org/2013/12/12/gift-guide-actually-used-for-a-year">recommendations</a> for this thing, so I eventually asked for one for my birthday. Karen got me one, but she had to ask: “Is that the one you wanted? It seemed like it, but the box looked…” Yeah, I know. It looked like infomercial junk.</p> <p>Since then, I’ve fallen in love with AeroPress. I use one at home and one at work, and make AeroPress coffee almost every day. It’s clean, it’s simple, it’s durable, and it makes good coffee. I’ve since learned its quirky origins as <a href="http://priceonomics.com/the-invention-of-the-aeropress/">a whiz-bang invention by an inventor of whiz-bang things</a>, which explains the “As Seen On TV” style packaging. I now concur that it is indeed <em>the best coffee maker</em>. Still, while the box’s quote was true in the end, its Five Guys testimonials-in-random-fonts approach made it hard to believe.</p> <p><img style='max-width: 100%' src="/images/2015/five-guys.jpg" width="100%" /></p> <p>In recent years, coffee aficionados, a group that rarely agrees on anything, seem mostly in agreement: AeroPress is the easiest, cheapest way to get started making good coffee. At only $27, it should be a strong seller in every department and housewares store in the country. Instead, it’s mostly sold online.</p> <p>Side by side on a shelf with a more familiar coffee machine or french press, our beloved plunger is going to lose out. It’s unattractively packaged, strange, and its price seems too good to be true. I suspect the testimonials are intended to make it seem less weird, but beside the clean lines of a Bodum’s box they do the opposite. Shoppers looking for a gift are so turned off by AeroPress’ package that there is a market for <a href="http://shop.squaremilecoffee.com/products/aeropress-gift-box">aftermarket gift boxes</a>. A sad state for a great product.</p> <p>One might argue that crafting an attractive design to promote a plastic plunger tube is an insurmountable task. Look no further than the <a href="http://worldaeropresschampionship.com/">AeroPress World Championship</a> for proof that it can be done well. In recent years, the competition has inspired an array of excellent AeroPress-themed graphic designs.</p> <p><img style='max-width: 100%' src="/images/2015/aeropress-posters.jpg" /></p> <p>All of these posters are an order of magnitude nicer than the AeroPress box. After my own heart is the one that depicts the destruction of an AeroPress box.</p> <p><strong>So, my unsolicited business advice to the AeroPress team at Aerobie is this.</strong> Get in touch with one of the talented folks who design the AeroPress Championship posters, and offer them what may be their dream job: design AeroPress some high quality packaging. Commission something that’s worthy of <em>the best coffee maker</em>, and conveys it instead of just claiming it. Sell your great product in something that feels like it will contain something great, and give your customers a complete experience. Then, raise the price by $10 and you’ll sell more AeroPresses than you ever dreamed.</p> <p>Oh, and let me know if you need a testimonial.</p>