Monday, January 31, 2011

6 Months in Review

I missed the boat on this one by a couple of weeks, but I still thought it was worth pointing out: android2cloud turned 6 months old on January 12th. On July 12th, I hit the big green Publish button that put the app live in the market, and put the source code online for everyone to download and play with.

It's been one hell of a ride since then.

We've been covered by most the Android publications, and by the venerable Lifehacker. I got to meet the editor behind that Lifehacker post, and am honoured to be able to refer to him as a friend.

We've been given early access to Google APIs and worked closely with Google engineers to help them improve their products as they help us to improve ours.

As of this writing, the Android app has been downloaded 37,000 times. On January 1st, version 2.0 went public. Since version 2.0, almost 7,000 users have sent almost 40,000 links. Comparatively, it took until December for us to reach 100,000 links, from July. We've been one of the top ten hottest applications on App Brain not once, but twice.

We've weathered insufficient resources, and all of you turned out in droves with money in hand to help keep servers online. We've been blessed with two wonderful sponsors, SiteSpect and Wonderproxy, who helped us to keep the lights on when we couldn't anymore. Another name will be added to that list shortly, but I'll make that announcement in due time.

You're all amazing, wonderful people. This application spread through word of mouth and suggestions. The Google searches leading to any of our properties are for the application, by name. Hardly a day goes by where I don't see someone recommending android2cloud to a friend on Twitter. Really, thank you, all of you. It's awe-inspiring for me, an English major at a tiny little college who plays with software as a hobby, to see my work being used by so many people. Sometimes, I block out the idea that so many people are using my software, which leads to some bad things. It's just a little overwhelming for me to consider. More people have downloaded and used my app than I've ever met in my life. That's... unreal. I've spoken to so many of you on GTalk as you patiently helped me find bugs in the software, and am blessed to know you. You guys are amazing. Thank you to those who do this with me, to those who stick around on the mailing list, answering questions for other people. You are the core of the community. Which leads nicely into my next point:

My focus for the next six months will be on the community. I will be working to move this from my hobby project into an Open Source project of its own right, something with momentum of its own. To that end, I'm publicly declaring my priorities for the next six months:

  1. Stability. Nobody likes using code that doesn't work, and communities don't grow around things nobody likes. We'll be fixing those lingering issues and errors, patching and applying band-aids until we get back to stability.
  2. Readability. Our codebase at the moment is atrocious and sprawling, and that's entirely my fault. I'll be working to clean things up so that others can figure out what the heck is going on in my code, and can start auditing it and contributing to it.
  3. Maintainability. Right now, there are no tests for anything in android2cloud. Nothing. Which leads to some problems, as we've seen. It also makes it hard for someone to have any confidence in the code they're writing for the project, which is a deterrent from people submitting code. I'll be working to develop independent test suites for the Android app, the server, and the Chrome extension. Hopefully, this will help give people confidence in submitting code to the app.
  4. Documentation. The documentation I've written is woefully inadequate and out of date. The in-code documentation is non-existent. I'll be working to remedy both of these. The creation of the help site, which I've been pushing users towards, has helped greatly. The less-publicised bug tracker will become more orderly and better maintained, so users can quickly identify known bugs and see their current status.
  5. Expansion. Right now, we have an extension for Chrome, an app for Android, and an App Engine server. I'd like to expand on those. I'd like to add a Firefox extension. I'd like to finish and release the NodeJS server that is mostly done at the moment, but needs some love. I have the shell of an Android application exclusive to FroYo that can do some interesting things, and I'd like to let the users who have FroYo (the majority, if Analytics are to be believed) get the added benefit. Expansion is the lowest priority for now, because we need to do some cultivating and maintenance on our community before we start adding to it. But expansion is definitely on the horizons. I've got some pretty fun ideas for places this could go, and I hope you guys can give me some more.
A lot of the shortcomings are my fault, and I apologise profusely for that. If anyone wants to step up and help out on any of these fronts, by committing code or lending a hand in the help forums or signing up to beta test or even just making wishlists of documentation or platforms or features in the help forum, I'd like to encourage them to. I'm learning how to run a project of this size and scale as I'm going, and I appreciate the patience you've all had with my amateur mistakes. You guys really are awesome.

The things I outlined above may or may not all get done in the next six months. But android2cloud will never be finished. We'll continue tweaking and improving it, as a community, until something better comes along or enough of us get bored enough that it's allowed to recede into obscurity. But for now, you've put up with six months of issues, bugs, downtime, and an amateur developer, and I appreciate it. And I hope I've learned some things in these last six months that will make my mistakes in the next six months less painful an experience for all of you.

Tuesday, January 25, 2011

Hiatus

A couple of you may have noticed that I was on an unofficial hiatus for the week of the tenth. If you're really attentive, you may have noticed that the speed of my responses to support requests in the last couple of weeks have not been what they were prior to the hiatus. Part of this is due to my moving back to campus and getting settled back in Buffalo. Part of it, however, is due to a problem with my classes. I won't bore you with the specific details of it, but suffice to say that from last week until today, I was unsure I was going to be able to take enough classes to be considered a full time student. And if I lost my full time student status, I'd have to drop out of college. Obviously, this was a huge priority (and source of stress) for me, and I couldn't devote much energy to android2cloud. Those of you who follow me on Twitter may have noticed a steadily increasing stream of expletives. This situation would be why.

Though the situation is mostly resolved, I still need to devote the vast majority of my energy towards my schoolwork for, at the very least, the rest of the month. While I'll be focusing on it all semester, I'll be living, breathing, and dreaming my school work for the next few weeks to try and recover from this situation in a gainly fashion.

To that end, I must announce I'll be on hiatus for the remainder of January, and probably as late as February 4th. I will strive to release the fix I've identified and implemented already during that time, and may accomplish it soon, but I can't promise anything. There will definitely be nothing beyond the version 2.0.4 bugfixes, however, until at the very least February. Additionally, the support I supply (mainly responding to emails and bug reports) will be heavily curtailed. If you do not receive a response at all, I apologise profusely. I'll try to respond to everything, but please be aware that it will most likely be a few a days before you hear from me. If you want to be absolutely sure your email will get answered, save it as a draft and send it out on February 5th.

In the meantime, I hope you'll all help each other. The help site is there as a communication tool, as is the Google Group. I'll do my best to approve pending Google Group messages in a timely manner, even if I don't respond immediately.

I would also love some feedback about what features you consider the most important, or don't care about. Do you care at all about hosting your own server? How important is stability? What features would you sacrifice for stability? If you could choose between stability in the service and hosting your own server, which would you choose? How do you feel about premium features? I don't want to charge anyone anything for my programming or anything like that, but if we could enable a feature that would cost us money on a per-message basis, the only way we'd be able to support it is through a per-message fee passed on to the users who opted into that. Would you rather I continue to try and improve the stability of the current service, or would you rather see things like Firefox support? Feel free to sound off in the comments, or discuss it in the Google Group.

Thanks for everything, you guys. I'll see you all on February 5th.

Friday, January 7, 2011

Disappointment

I have a confession to make: I'm disappointed, for the very first time, in my userbase.

You guys are normally wonderful. You're very supportive, you donate money to the project like it's your job, and you're helpful with your error reports. Lately, however, I've started to feel like dealing with users on a general basis (the ones I work with on an individual, personalised basis are still a pleasure and a joy to work with) has become the worst part of my day. Everywhere I turn, I'm bombarded with complaints and demoralising messages. I'm told android2cloud sucks, that version 2.0(.1/.2) sucks, I'm told that I should just revert back to 1.0 and leave it.

I feel bad for posting this message here, because the people who read this blog and will see this message are the ones who care about the project, who are patient with bugs, who donate money, who are every developer's dream users. But lately, I've been getting less and less patient and helpful with users. And I wanted to share why. I try not to be; I try to do my best, I really do. But still, sometimes the messages people send are so upsetting or insulting that I can't help but link them to Let Me Google That For You, or sarcastically reply that no, I had no idea the latest version broke my software for 20,000 people, I didn't get that memo.

When people say things like "just give us the old version back", that's really upsetting to me. I worked hard on android2cloud 2.0, and for a very long time. It has been in development since October. I have worked with Google engineers to tweak Google's code specifically to allow features this application uses. I have ignored coursework and work as an intern for my University to develop this application. Now that it is buggy, I have put off work that I'm being paid to do as a freelance developer in order to issue two bug fixes in two days. My sleep schedule is wrecked beyond belief, and my phone is constantly blowing up with bug reports and support requests for android2cloud. I don't know if any of you have noticed this, but on top of developing and patching android2cloud, I respond to every single bug report and support request I can find. I have Google Alerts set for the term android2cloud, and will register on forums for the sole purpose of helping people get it working or hearing their ideas and feedback. I have a twitter search saved in Tweetdeck for android2cloud, and try to help everyone I find who has issues or ideas for it. From the beginning, I've tried to give the best support I could for this product, and all of the work is wearing me down.

So, here's what's going to happen. A lot of you want version 1 back. That's your prerogative. You can get the source code for everything from our project page's Mercurial repository. Don't know how to check out Mercurial source code? LMGTFY. You'll need to set up your own server, because I can't afford to be watching my pay schedule, hoping I get paid in time to pay for the server anymore. It should be free to run if you run your own, so go ahead and set one up. The instructions for doing so are still on our project page's wiki. Just do the minimum possible effort and look for them.

Note, though, that if you decide to revert to version 1, you forfeit any right you had to my support. I will not answer questions, I will not debug, and I will not patch for you. If you switch you version 1, you're on your own. If you stay with version 2 and complain that version 1 was better, I will simply direct you to this post.

android2cloud has always been, and will always be, an open source project. If you think version 2 sucks so badly, I would love to know why I have not received any patches from anyone for it. If it sucks, fix it. That is the nature of open source software.

I'm doing the best I can. Tonight, there will be no patches. I've responded to most the bug reports and support requests I got while I slept, and I make no promises that I'll respond to any more tonight. Tonight, I need to work on client work. Tonight, I need to pay the bills, fulfill my obligations, and stop being such a letdown to the people I've made promises to. I owe them better than what I've been giving them. Also, please remember that android2cloud does not pay me anything. I have to work on my $20/hour job that I don't get abuse from tonight, instead of the $0/hour one that gets me plenty of abuse.

I'll end with a positive note: Thank you, users who are doing the right thing. Thank you for your understanding, for your patience, and for your assistance. Thank you for realising this is a project, not a product, and you are as important to its success as I am. Thank you for understanding there will be bumps and bruises along the way, but we'll get there. Thank you for understanding that I'm human, and doing the best I can. You make this project worth doing. You make me glad I released it in July, instead of just holding on to it and using it myself.

Thursday, January 6, 2011

2.0.2 Just Pushed

I just pushed version 2.0.2 live. It is an update to the Chrome extension and the App Engine server. Basically, it fixes the bug wherein links would open multiple times. I ended up switching away from storing the last link received's ID in the Chrome extension and then simply telling the server to send every link sent after that to have the Chrome extension send the server a message every time it receives a link, confirming that it did receive the link, and then storing that information on the server. Therefore, you should never see a link twice.

I apologise for all the recent problems we've been having. I know there's one other issue that can occur if you type a link into the Android app manually (the Page Not Found error), but it's 2:30 in the morning here, and I need sleep. So I'll be fixing that one soon. In the meantime, just use the Share button to send links, or make sure you include http:// when typing in links.

Wednesday, January 5, 2011

2.0.1 Landing

Just wanted to do a quick post to say that 2.0.1 has landed. This should fix the reported issues with 2.0. If you're running your own server, or obtained the app or extension through non-Market or non-Webstore areas, respectively, you need to manually update. You can find the updates on the project page. As always, please let me know if something breaks.

Sorry this patch took so long to get out.

Sunday, January 2, 2011

About Version 2.0

Clearly, the January 1st update was not as smooth a transition as I had hoped for. I'm going to try and lay out what's going on, but first let me celebrate the good before we get to talking about the bad.

Since the application went live on July 12, 2010, android2cloud has gained over 20,000 users. Those users sent more than 100,000 links through the default server, not including servers set up by users. I was paying roughly $80/week in server bills, and had raised over $800 in donations.

Version 2.0 came about as a result of that server bill. $80 a week is not an expense that I can rely on donations to take care of, and my part-time, minimum wage internship for my University can't just swallow the expense. The underlying architecture had to be rewritten to be faster and more efficient. In the Fall, I was invited to beta test the Channel API on App Engine to speed up our infrastructure and bring down our cost. This became the backbone of version 2.0.

Version 2.0 brings a bunch of improvements with it:

  • Links are now opened in Chrome as soon as they hit the server. There is no more 15 second delay, something that used to be annoying in older versions.
  • Links can now be queued. If you're out and about and Chrome is closed, feel free to send as many links as you'd like; Chrome will open all of them as soon as you start it up.
  • The android2cloud icon is no longer displayed in the Chrome toolbar. The icon no longer had any effect (clicking it used to force a check for the latest link) and people were asking for it to be removed, so I did. Future version plans include reinstating it with some cool functionality, so don't worry if you miss it.
  • android2cloud now supports sending links to individual Chrome installs. I call these installs "Devices", and it's helpful if you have multiple computers, or dual-boot your computer. android2cloud on Windows could be called "Windows Chrome", an install on the same computer but under Ubuntu, could be dubbed "Ubuntu Chrome", and an install on the Cr-48 could be called "Cr-48". Then, you can use those unique names to specify which you want to send to, instead of sending it to all of them, like you used to. As devices, browsers, and Operating Systems are added to our product line, this upgrade will be more and more useful. This is also a requirement imposed by the Channel API.
  • I made an install flow for the Chrome extension. Now you get a friendly wizard to guide you through setting up, instead of an unexplained window popping open, asking for access to your Google account. The new version also sports a settings page for the Chrome extension, which makes using a self-hosted or custom server even easier.
  • The Android app now sports a canon Settings page, using the built-in Android library for it. It should now be more intuitive for people to change their settings.
  • I opened a Help page on Tender, which is kindly hosting us under their free Open Source license. You can use this website to get answers and help with the application.
  • I also opened a Github account for the source code. This marks an official migration from the Google Code hosting; I'll be shutting those repositories off in a couple of days, at which point the Github repositories will migrate from the "development" branch they're currently in to the "master" branch. The switch to Github is easy to explain: I love Google and Google Code, but Github has better support for ad-hoc contributions. I corrected this blog post a few times to try and remove all the references to "we" and replace them with "I", because 99% of the code right now is written exclusively by me. This explains why it's so atrocious and embarrassing. I'd like to change that in the future; I'd like to make this our application, not mine. So, please, fork me and send me Pull Requests. Link me to your Github repository of a new client implementation or entirely new project built on top of android2cloud or using android2cloud, and I'll fork you and list you in the 3rd party repositories. Github simply has better support for social coding than Google Code, and the future of android2cloud is social.
These new fixes should provide a much better product experience for you and be much cheaper to maintain (which means much more server uptime and much less growing pains)—or, at least, they will once we get these issues sorted out.

These improvements (and some things we've been working on that weren't quite ready, or were less ready) were only made possible by the help and support of awesome people:

  • First, our first sponsor, WonderProxy and the representative who contacted us, Paul Reinheimer. They donated a large sum of money to us to keep our server online during our first main financial crisis.
  • Our second sponsor, SiteSpect and its representative, Eric Hansen. They matched WonderProxy's donation to keep our server up during our second financial crisis. Without these two companies, our public server would not have been offered for the past few months, and hundreds or thousands of users would have been terribly inconvenienced. We owe both of them our thanks and support.
  • Matthew Turland has been, apart from a good friend, a huge source of help as I struggle to refactor our codebase into something respectable, a source of inspiration as I struggle to maintain the frantic pace of college, employment, and development on this, and a source of wisdom that has helped guide me through a turbulent time in my life. I can honestly say that there would have been no software to release were it not for his patient and methodical help bug-fixing, explaining computer science theories my English and Education backgrounds have left me lacking, advice in figuring out what the application should be and what technologies would best implement it, and selfless sharing and experience as he talked me through making life decisions.
  • Ed Finkler has been a mentor and a friend to me ever since I started contributing the open source Twitter client, Spaz. His philosophies on open source match up rather well with my own, and I look to him when I fight myself over moral issues involving the application and paying for it. His Javascript wizardry and patience in figuring out the ethical choice have been invaluable to me.
  • Steve Pirk and the rest of the Yensid team adopted me shortly before I launched android2cloud back in July. Since then, they've been quietly accepting of my lack of time and breakneck pace of life, even after they stood stoically behind me with everything (including financial support!) they had during the initial release and the crush of users that Lifehacker brought on.
  • Kevin Purdy, of Lifehacker. Kevin originally covered the application back in August, and it has been spiraling out of control in terms of use and popularity ever since. I discovered while I was back at school that Kevin lived in Buffalo, NY, which just so happens to be where I go to college. We arranged a meeting, and had a wonderful conversation about Android, Google, and computers. Since then, he has been constantly pushing paid work my way and serving as an advocate for me. My professional advancement through the last few months has accelerated at an alarming pace, and most of that is thanks to Kevin. I am proud to know him, and excited to work with him.
  • Florian Sellmayr is someone I know very little about (including their gender; I'm going to, risking misogyny, proceed with the assumption of male. Correct me if I'm wrong, Florian, and I'll update immediately with my apologies), but someone I have enormous respect. I got an email from Florian five days ago, letting me know that he had created a pure Java implementation of our old client, one that would allow users to open their latest links in the browser of their choice, as long as the Java program was running on their computer. This is a huge achievement, and was accomplished without any input on my part. Florian is currently hard at work trying to patch the software to work with the new version of the server software, and I'll be sure to update everyone on the progress of that.
  • Everyone who donated. $800 in donations, most of which were $0.70 donations from the paid Android app, means a lot. The people who donated as much as $50 or $200 have my undying gratitude and respect.
  • All of the users who use the app and tell their friends. I'm still shocked that it grew to over 20,000 users without any advertising effort on my part. I've been kept on my toes, constantly sprinting, trying to keep up with the pace at which all of you are making this grow, and I couldn't be more excited. Trying to keep up with all of you is much, much easier than trying to drag all of you along with me, and I'm humbled that so many of you use and take value from this application. The fact that we've had so many rough patches and problems but still maintain an Android Market and Chrome Webstore rating of over 4 stars speaks volumes about our user base.
Speaking of rough patches, it's time to address our current one. I'm going to start off with an apology, and move on to what's going on and how I'm addressing it, and finally finishing up with what I've learned and how I'll be improving in the future.

First, the apology. I planned out the version 2.0 upgrade in my head, mapped it all out, put it on a timetable. There was an exciting announcement I had planned to announce simultaneously, but that I've now delayed until this can all be sorted out. The fact that we're having such widespread issues is my fault entirely; I gave the wonderful beta testers only a few days to play with the Android app, and was fixing these and cutting features right up until the release itself in an attempt to keep to my self-imposed schedule. I was determined to release something that night, after working for months, and I rushed it and botched the job. I apologise for the inconvenience that caused and am hoping you'll stick with me as I sprint to fix it. I understand if you don't. I failed you, and I apologise.

The problems I've seen reported so far, and their respective fixes/causes (or my best guess, at least), are as follows:
  • People are nervous that the Chrome icon disappeared. This is, in fact, not a bug but a feature, and something I should have communicated more clearly.
  • The Android application shows an empty popup when a link is sent, and the link never reaches Chrome. I suspect this has something to do with how I'm handling caching on the server side, and I will be attempting to trace the exact source. Anyone that experiences this, I would love a few testers to work with me on it. If you're interested in trying things out for me, email paddy at android2cloud dot org. I would appreciate any help I can get, as I cannot seem to reproduce the problem myself.
  • Silent Sending no longer functions on the Android app. This, I am almost certain, is a result of the switched handling of the settings. It should be an easily fixed issue, and I'll roll out an update as soon as I have one available to me.
  • Chrome keeps opening the setup window, even after you've gone through the setup process once. From my understanding of this, people are getting to step four, a window pops open to authorize their Google account, and they assume they're done. You actually need to return to the setup screen, and click Continue >> one last time. After that, the setup page will disappear. I'll be issuing an update soon to make this clearer.
  • Everything seems to work fine, but Chrome fails to open the link. I'm hearing this mostly occurs after Chrome has been reopened. My best guess is that there's some difference between how the extension connects to the server during normal startup vs. how it connects to the server after being set up. I'll be finding the specifics behind this and correcting it as soon as I can. Until then, apparently, going to chrome-extension://hkelgkihphkegiaagbcgglfidabmgkgp/setup.html and going through the process again will get it working for that session, at least. A pain, and one whose removal is my highest priority. If anyone experiences this, I'd love to see any errors their console reports from background.html, and what background.html holds in the config and channel variables. Emails to paddy at android2cloud dot org are greatly appreciated.
  • I've had a single report of a memory leak, and am diligently trying to find where one would occur. The user (the generous @shawn) has agreed to continue using the extension, and will help me track down the problem if it occurs again. I've heard no other reports of this but am remaining alert for it. Anyone who experiences it, I'd love any diagnostic information you can give me, or even a notification that you experienced it, so I can find out how widespread it is.
  • I've also had a single report of a force close. I've no idea, as of yet, where in the Android application this occurred or what could have caused it, but I'll be trying to get some diagnostic information to get it sorted.
The fact that there are so many errors and problems upon release is an embarrassment and a travesty, and one I take full responsibility for. I cannot apologise enough for the inconvenience it has caused users, nor can I show my appreciation for the users who are supporting us even as they weather these problems. The fact that we have four star reviews saying "Great application, but latest version broke it." is mind-boggling to me. You're all understanding and generous, and I thank you all for it.

To ensure this doesn't happen again, I'm devoting some time to developing a release schedule for the next major release, a release that will be much less of a rehaul for the software, but should therefore be implemented without error. This schedule will only run up to the beta; therefore, the final release should never be rushed again, and everything should be sufficiently beta tested. Furthermore, I'm going to learn test-driven development, something I have no experience with. This is where my lack of Computer Science background hurts me, and something I'm working to remedy. It will take me time to build up tests for the software, but when done, it should assure quality and well-tested software is released every time, making situations like this far less likely.

Again, you all have my apologies and gratitude.