Now that Tweetsville is out there, I thought I’d reflect a bit about where it came from and how it came to be.
When the app store opened, I downloaded several Twitter clients. Each was interesting in their own right, but I couldn’t use any of them because of one reason: the scrolling performance. I didn’t get why everyone’s scrolling was not as smooth as any of the built-in iPhone applications. For me, it made the apps frustrating to use, to the point that I just never used them.
A Simple Proof
As an experiment, I wanted to prove that I could make something that scrolled as good as the Apple-made stuff. I had already done other samples using the Twitter API as part of Blueprint at Yahoo! as well as in a Widget for Konfabulator I worked on but never finished. So I figured it would be fairly quick to throw something together.
I wrote a simple web fetcher and then did a rudimentary list. Originally, it was completely a navigation based app. You’d get a list of items such as ‘With Friends’, ‘History’, etc. and click those and get the listing of 20 tweets (the default that you get with the API). It was at this point that I started messing with getting the scrolling fast. In the end, it was smooth as silk. But I also didn’t have features such as the current balloon look and clickable links and @names.
The clickable links took me quite a while to get to work. I spent much time working on line breaking and making sure it was as efficient as it could be, using Instruments to find and eliminate bottlenecks.
After that, I had something that could line break beautifully and yet it still scrolled incredibly fast. Implementing the balloon look however, did slow it down a bit, but again I spent a lot of time trying to cache and get things to the point that you see it today.
But even after all that, there was still tons to do. I mean, it was really just something to prove to myself I could do this. But at this point, I realized I was onto something real here and could really build something exciting. But there were plenty of competition out there. Why build another Twitter app? I wasn’t really sure, but I kept going anyway to see where it took me. By the time I got to the end, I knew I had something big on my hands.
Making It Real
For the next few weeks I worked pretty much 24/7 getting things to cache properly, push things off onto threads as much as possible, use a real database, etc. and make sure that things just worked correctly. Despite the simplicity of what Twitter is, making an application to really behave properly and ensure that things are always as you expect is pretty darn hard. Even something as ‘simple’ as clicking a tweet and then iterating your tweets with the up and down arrows in the upper right was interesting. Not because of the iteration of the items, but because you now have yet another view that needs to be aware of state changes in the application. For example, if you favorite something, I needed to make sure that if it was showing elsewhere in the UI the change was reflected. Good times.
I also rewrote certain sections more than once to get things right. The database for example, was originally just a plist, but the more complicated the UI became, the more necessary SQLite was. And that had to be threaded for even more fun. I had also originally started with MGTwitterEngine, but ended up writing my own engine for two reasons:
- design-wise, MGTwitterEngine didn’t fit with what I needed to to (it was too centralized, I needed many delegates, not just one).
- I decided to use JSON instead of XML to try to keep the data smaller and simpler to parse. XML really is a pain to deal with.
And since I didn’t find a JSON parser that seemed to be small enough and simple enough to integrate, I wrote one. Admittedly, it’s been something I’ve wanted to do for a while. I’m sure somewhere out there there’s a JSON parser that would have fit the bill, but I didn’t find it in my cursory search of the interweb tubes.
You know all those ‘standard’ form controls you see in all the Apple applications? Yeah, they ain’t standard. So a bit of time was put into creating my own version of those constructs and making them look and behave as closely to the Apple stuff as I could.
I also needed to handle image uploads and tweet compositions, loading followers so you can help address messages, doing the first run screen, etc. Lots of little things to make stuff right.
And even after I thought I had everything done, I ended up rewriting the messaging section to what you see today. It originally had inbox and sent like the web site, but one of my beta testers suggested a threaded view. At first I was like “man, that’s going to take forever”, but it only took me a day or two to get right. Most of my time in fact was spent drawing the stupid balloons to try and match the SMS app, only this time in delicious purple!
That was the making of 1.0. Right before I handed it over to Tapulous, I also added:
- Flickr upload support
- Re-tweet functionality
- Ability to quit during writing a tweet and come back to where you left off the next time you launch.
I know there are several other thing that people want. I originally did envision adding things like multiple account support, etc. and I see that people also really want to have it save where you last were and not jump to the top when you load tweets. That one actually came up during development and there seemed to be strong arguments on both sides. So I left it as it was, but perhaps Tapulous can add that as an option.
People also have been asking for the ability to tap the status bar and have it jump to the top, but it already does that (the iPhone frameworks do it for you in fact). Perhaps there’s a bug in there that stops it from working sometimes.
So that’s my story, and I’m sticking to it. The best part for me has been seeing people’s comments on Twitter which echo exactly those attributes I held dear in its inception:
- UI speed. It tries its best to not get ‘stuck’. It only now gets stuck when it’s loading the table for the first time. I hope.
- Simplicity. It’s not glossy black. It’s just iPhone.
- Power. You can do almost everything the Twitter API allows: follow friends, drill down in a user’s history or followers, search for your favorite terms, etc.
I want to thank everyone that helped me test the application and suggested features, etc. This includes Arlo Rose, Rob Marquardt, Karl Adam and Aaron Hurley. These people had much input into the end design. Arlo suggested the use of the Tab Bar over the nav-style interface. Karl caused me to go to threaded messages, Rob and Aaron both suggested many different enhancements to make things more user-friendly and do what you’d expect. You can blame Rob in particular for my adding Flickr upload.
Again, thank you all. It was a great project!