Tweet Quality

April 4th, 2009

As Twitter becomes more and more popular, the quality of tweets (Twitter updates) seems to be taking a dive. I attribute this to a couple side effects of the relentless population rise:

  1. An increase in conversational, challenging, and defensive tweets.
  2. The use of tweets to mass-distribute unoriginal ideas and propaganda.

Conversational Tweets

I wasn’t among the earliest adopters of Twitter, but I’ve been a member long enough to remember the days when you were more or less likely to know everybody you followed, and vice-versa. In this environment, Twitter’s concept of a “reply tweet” was ideal, facilitating a mix of public statements and conversation among friends.

As the Twitter ranks grew, it became more common to stumble upon people we don’t know, but whose work we admire, or whose thoughts are original and worth reading. I follow a number of people whose reputation is well known to me, and they have no idea who I am. This is fine, because I am getting something of value from their tweets, while my quiet observation is generally of no bother to them.

But Twitter’s egalitarian implementation of reply tweets allows responses to tweets even from somebody you don’t follow. This has many positive effects, because a genuinely helpful or insightful person can respond intelligently to a tweet, and have a fair amount of confidence that the original author will receive their feedback. In short, Twitter replies enable the masses come to your aid, sing your praises, or perhaps less conveniently, to call you on your bullshit.

Calling bullshit can be a useful service, but on the internet it tends to become a pathological blood sport. Some members of internet society become so invigorated by the opportunity to prove somebody wrong, that they’ll stop at nothing to quench their thirst for victory. They stretch facts, bend logic, and insinuate false intentions for the chance at glory. The chance to prove you wrong on Twitter.

So here we have a system on which millions of users stake their personal reputation, and where some significant percentage of users makes a pathological game of trying to assassinate those reputations. The more followers you have, the greater the number of idea assassins you have at your quite unfortunate beck and call. When even the most innocuous of statements invites pointless scrutiny, the original author is bound to get defensive. This leads to an unfortunate and noisy interchange that looks something like this:

  • MacLover: Man, these new MacBooks looks awesome, but I don’t think I can buy one unless they put Firewire ports back on them.
  • Apple4Ever: @MacLover If you hate Macs, you should just buy a PC. There’s no point in complaining about it. Just buy a PC if that’s what you want.
  • MacLover: @Apple4Ever What are you talking about? My freaking name is MacLover. Of course I love Macs. I was just making an observation about the new
  • MacLover: @Apple4Ever MacBooks, they’re sooo close to being perfect. I wish they would make a MacBook that is as fine-tuned as the old PowerBook 12″.
  • Apple4Ever: So buy a PowerBook 12″.
  • * MacLover Head Asplode *

This conversation is agonizing enough for the people involved, but the poor followers of MacLover and Apple4Ever had to follow along, utterly disinterested (unless they turned on “Only show me @replies to people I follow,” which can be a good idea). In this scenario, Apple4Ever is assassinating MacLover’s ideas, scraping the bottom of the barrel for any controversy that could possibly lure MacLover into a personal dialogue.

People in MacLover’s position would do well to ignore such bait, but it’s not always clear cut. The 140 character limit in Twitter makes it difficult to completely express a thought without ambiguity. Conversational moods such as sarcasm and irony are hard to convey, and the audience is filled with people who are chronically deaf to such tones.

So Twitter is filled with people who care that their thoughts be expressed with accuracy and meaning. And it’s also filled with people who, because of boredom or lack of attention, are hell-bent on causing rifts that invite confrontational interchange. This is a recipe for lots of misunderstandings and escalating hostility. It sucks, man.

To improve the quality of conversational tweets, I propose a little more consideration on both sides of such conversations:

  1. To the would-be idea assassin: take a step back and examine the tweet you’re responding to. Does it actually say what you’re alleging it says? Are you making a leap of logic to start an argument, just because you’re in the mood for a debate?
  2. To the would-be defensive tweeter: breathe. The person egging you on is one drop in a puddle next to a lake abutting an ocean. Their provocative tweet is only visible to you and some subset of their followers. Chances are, most people will never see it.

I’d like to think I’m never the idea assassin myself, but I am sure we all have the tendency sometimes. As for the defensive tweeting, I’m positive that I do it to a fault. So I’ll be trying especially hard to take my own advice #2 above.

Tweet Propaganda

Twitter connects a hell of a lot of people. The idea that a simple viral tweet message could prompt others to act in a manner that itself perpetuated further tweets, is irresistible to commercial marketers and internet stuntmen. The simplest form of viral propaganda on Twitter is the simple word-of-mouth repetition of ideas in an author’s own voice. I wrote about Word Of Tweet Marketing just over a year ago, after being impressed by the growing impact Twitter was having on my own company’s sales and reputation.

As people recognize the power of word-of-mouth dissipation, it becomes tempting to spread every good idea that comes along. Every funny joke. Every classic YouTube video. Every friend worth following. Since people are lazy, and rephrasing an idea in one’s own voice takes time, the phenomenon of the “retweet” emerged. People annotate a tweet with “RT @whoever”, implying that the contents are being more or less repeated verbatim. Great for the spread of ideas, terrible for the individual personality of a Twitter account.

But even a retweet involves some personal involvement by the account owner. More and more, we’re seeing examples of tweet propaganda where the contents of the tweet are entirely machine made. A classic example occurred a few weeks ago, when a steady flow of “Don’t click this URL” messages began pouring into peoples’ tweets.

The gist of this prank was that clicking the URL took you to a page where, if you clicked another URL after being warned not to, it would submit a tweet to Twitter under your logged in account name. A classic example of the power of reverse psychology.

There was no financial gain for the perpetrators of this idea virus. Just the satisfaction of Twitter being virtually painted, for a few hours, with identical tweets from thousands of different accounts. People who fell for the trick were embarrassed and apologetic, recognizing that the tweet was not only of no value to their followers, but also posed the risk of snaring them into the same gag.

In other cases, the propaganda is voluntarily added to a person’s twitter stream. Some vanity services, for example, will do an analysis of your twitter account and tweet the results with your permission. Often, the permission is thinly veiled or questionable, and users end up apologizing that they “didn’t realize it was going to tweet that.”

Tweet propaganda is still young, and people are still grappling with where to draw the line. By engaging in a viral process of any kind on Twitter, you’re trading your originality to be part of a larger scheme. Depending on the terms of the scheme, it could be beneficial to you and your followers, or it could be annoying and embarrassing.

Just a few days ago, a controversial form of tweet propaganda came by way of the MacHeist promotion. Their so-called TweetBlast rewards buyers of their bargain software bundle with extra software if they agree to let their Twitter account be used to promote the bundle. If you follow more than a few Mac users, you’ve no doubt seen the tweets by now:

One of the nice things people like to do is share information about great deals. This makes viral marketing a natural avenue for sales and bargain discounts. But there’s a distinction between a person, writing in their own voice to endorse a sale, and a mechanized robot puking thousands of tweets into the system on behalf of users looking for a freebie.

Michael Lopp recently wrote about The Art Of The Tweet, and touched upon something that I think is important and appropriate for this discussion. In a section titled “Add a Bit of Yourself”, he discourages the excessive use of re-tweeting, and opens with a bold rationale for this discipline: Twitter is you.

More Of You, Less Of Them

Ultimately, the quality of tweets is closely related to how much of you there is in them. When you forfeit your individuality to a commercial promotion, or to the vain attempt to either defend your own honor or assassinate somebody else’s, you compromise your own tweet quality.

Whenever anybody complains about some aspect of Twitter, a fair number of people like to respond reflexively: “If you don’t like something, don’t follow them.” This advice is fine, but apply it to the other fine things in life, and you quickly find that it leads to stasis, a situation where the state of the art does not advance for lack of iteration and refinement. If nobody reviews and offers opinions on books, movies, fine arts, poetry, etc., then they are all liable to degrade in quality over time.

My intentions in being critical of Twitter and the state of declining tweet quality is not to bask in my own whining or seek consolation or apology. I honestly think that by rethinking the situation, we’ll decide what kinds of tweets are of best service to us all.

Certainly, different subsets of Twitter will have differing standards. There is room enough in Twitter for all attitudes and priorites, but I’ll be filling my follow list with the people who put the “you” into Twitter.

Fast Unit Testing Iterations

March 31st, 2009

It’s not as though unit testing is completely new to me, but even years after I wrote my first tests, I still consider myself a naive amateur in many regards. I’ve been ramping up my use of tests lately thanks in large part to a technique I read about in Michael Feathers’s book Working Effectively With Legacy Code.

Essentially, the idea is that before you do any major refactoring in your existing code base, you should attempt to locate a “bottleneck” to how that code is reached, and test the interface at that bottleneck. So, if all the code paths to Class A and Class B are through Class C, I can effectively just cover Class C with unit tests and be relatively certain that the functionality of Classes A and B are covered to the extent that I care about them.

Refactoring then becomes a lot less stressful, because you’re more likely to catch stupid mistakes and changes in functionality you might cause in the process. I realize that no set of tests is a guarantee against introducing new bugs, but in the process of covering classes with test coverage, you also end up learning quite a bit about what the classes actually do. This is no small victory when working with code that you either didn’t write, or that you haven’t reviewed in a number of years.

As I’ve become more and more dedicated to testing in my Mac and iPhone projects, the size of my test suites has grown. I’m subscribing to guidelines for good test writing: that they should be fast and as isolated as possible. But they still take a non-trivial amount of time to run. It’s gotten to the point where the tests for my “web publishing frameworks” take at least a minute to run on my MacBook. This is pretty fast in the big scheme of things, but a long time to wait when I’m engaged in a rapid edit, build, and test iteration.

I figured there must be some way to limit the test cases that get run to just the specific one I’m working on at the moment. And it turns out there is. Thanks to the “Other Test Flags” build setting in Xcode, I can temporarily change the behavior so that it runs only a subset of all the tests contained in my test bundle. For example, right now I’m working on tests that cover the functionality of my RSRESTCall class:

The -SenTest option is passed on to the test rig, in my case the default “otest” command that comes with Xcode. This lets the test rig know that instead of the default behavior of finding and running every test in the bundle, it should just run the tests in the “RSRestCallTests” SenTestCase subclass.

Something I didn’t mention yet but which is also aiding me greatly in the measuring my test coverage is the “gcov” library that also comes bundled with Apple’s developer tools. I’m using this to create a “Code Coverage” build of my code, that makes it possible to see exactly which lines of code did or did not get run during a particular set of tests. This, in conjunction with a cool application from Google’s Mac developers, makes it pretty easy for me to seek out uncovered areas of code, think about how to cover them with tests, and iterate.

JSTalk – An Alternative To AppleScript?

March 26th, 2009

My friend Gus Mueller of Flying Meat is having a busy week. On Tuesday it was revealed that his awesome image editing application, Acorn, is part of the MacHeist 3 Bundle. I have been openly critical of these rock-bottom-pricing bundles in the past, and I remain uncertain as to their long-term benefits for the Mac software ecosystem. But in the short-term, consumers obviously have the option of picking up some amazing software for an unbeatable price. And if folks like Gus end up benefiting then I wish them the best.

In the wake of his high profile MacHeist debut, Gus announced something new today which is decidedly less consumer-oriented (though if it takes off, it could certainly have wide-reaching consequences). JSTalk is Gus’s JavaScript-based answer to what he sees as outdated and clunky about AppleScript, Apple’s preferred scripting language on the Mac.

For starters, Gus’s JSTalk provides syntactic sugar on top of standard JavaScript in order to give it some comfortable Objective-C style conveniences. Then, he provides a teeny bit of source code that any application can embed in order to respond to incoming JavaScript commands. This results in a scenario where an Objective-C based application can easily expose its internals to other applications, so that a script written in JSTalk can control it from another application.

I’m excited about the idea of JavaScript taking a more prominent role in the scripting infrastructure of Mac OS X. In fact, about 9 months ago I wrote some challenging words about my opinion on the matter. Responding to Apple’s impressive enhancements to JavaScript in the context of WebKit:

I hold a soft spot in my heart for AppleScript. But I’m slightly more of a pragmatist than a romantic. If JavaScript is what Apple cares most about, and JavaScript is where massive performance improvements are going to be made, then Apple should leverage those improvements to the benefit of every desktop scripter.

Since then, Apple has given no indication of pursuing a system-wide infrastructure for JavaScript scripting. So in comes Gus Mueller with JSTalk, and solves the problem. Right? Well, sort of. Gus’s idea is very cool and clever given the constraints he’s working with. Namely, he can’t easily control how every application works, or how it interacts with the system and every other application. His solution is cool, and may even be worth adding support for to your application, but it’s not as cool as a system-wide, Apple-endorsed solution would be.

Michael Tsai makes some smart observations about JSTalk, also agreeing that it’s cool, but taking exception to Gus’s claim that getting away from the rigid structure of AppleScript’s XML-based scripting dictionaries is a good thing:

I think defining the object model, e.g. using XML, is a feature. Otherwise there’s no separation between the scripting interface and the application’s unstable internal interfaces.

Taking a closer look at Michael’s post, I think I could have avoided this somewhat long-winded post by starting simply with, “Yeah, what Michael said.”

MarsEdit 2.3

March 24th, 2009

I’m happy to announce that MarsEdit 2.3 is now officially released.

  • Now supports Tumblr blogs
  • Media manager now opens much faster with lots of photos
  • Revision of the Technorati Tags editor
  • Improved weblog Favicon detection

It feels great to finally have an official release out there that supports Tumblr. I would like to thank Marco Arment for his patience in working with me to improve the Tumblr API, so that it will work better with MarsEdit. There are still areas where we can improve the integration on both sides of equation, but I think this release represents a great start.

If you’ve got a blog and you haven’t tried MarsEdit before, give it a spin! Just put your blog’s home page URL in when MarsEdit asks for it, and you’ll be off and editing.