h2. DISCLAIMER: you guessed it, this is a rant!
I am very interested in doing mobile development as a hobby. I started iOS development about a year ago but i stopped after publishing “my first iPhone app dzone mobile”:http://dzone.nofail.de/ because i thought that all those AppStore(TM) and iTunes Connect(TM) stuff was a pain in the ass and distracting me from beeing productive.
So I began developing this same app for the ANDROID platform, in order to get a feeling for it. I’ve been doing Java for about 7 years now, so developing on ANDROID should be rather familiar to me instead of learning all this verbose Objective-C nerdy pointer stuff. I am very well known to Eclipse, so working with the ANDROID Plugin should be easy, right?
I started the app in November of 2010, when I had some spare time between jobs, but somehow I stopped in the middle of the project and just recently started all over. I was wondering why I had not worked on the app for about half a year?
The answer is simple: Developing ANDROID sucks!
I stopped working with Java in the middle of last year, switching to Ruby development with TextMate and MacVim. Coming back to Eclipse is like getting hit by a truck! This IDE is so overwhelming, but instead of giving you what you need it hides “the most common features, so that you have to search for it on stackoverflow”:http://stackoverflow.com/questions/3175035/eclipse-find-in-project.
Is it really necessary for me to do Open-Clean-Refresh-Close-Open-Refresh cycles on my project to let Eclipse realize that everything is fine besides Eclipse itself?
Why do people, building Eclipse plugins, make the same errors again and again? Swallow errors, so that you need to have the Error Log View open all the time? Show build failures without any hints? Are you serious about that LogCat stuff? WTF?
I am using the debugger all the time when I am new to some Framework in order to better understand what is going on. But this is not very usefull unless you can see the source code of where you currently are… Guess what, it’s “reeeeally hard to get it going”:http://android.opensourceror.org/2010/01/18/android-source/!
The ANDROID Emulator is really slow on the Mac. I don’t know if it’s much faster on other systems, but i think it sucks. The startup time takes even more than eclipse, you need to “fiddle around with runtime settings in order to adjust it to your needs”:http://stackoverflow.com/questions/2359895/android-emulator-screen-too-tall and why is it so difficult to put all the options you have in the menu bar instead of “hiding it somewhere in the function keys”:https://sites.google.com/site/androidhowto/how-to-1/rotate-mac-emulator?
But the best thing is, that the “emulator is just not working right in the beginning”:http://stackoverflow.com/questions/3557996/android-httprequest-java-net-unknownhostexception.
It does not properly respond to mouse gestures or the keyboard and ah yeah, I forgott, it’s ugly!
Developing for iOS is a tough choice if one is coming from a language like Java that has a decent Runtime with garbage collection. I spent most of my development time with allocation/deallocation problems. This is something you really need to get into if you want to have fun working with Objective-C even though they “just released ARC (automatic reference counting) on iOS 5”:http://stackoverflow.com/questions/6368600/some-questions-about-automatic-reference-counting-in-ios5-sdk. Besides that, I really think that iOS does a better job in designing an architecture that is developer friendly.
The thing that I just can’t get over on ANDROID devices is that the application (the activity to be precise) is going to be reloaded if you rotate your device and you need to take care of a lot of things in order to let your app respond to that interaction. Just have a look at “_your future self_”:http://developer.android.com/resources/articles/faster-screen-orientation-change.html …
It’s really sad to me, that the ANDROID designers decided to repeat the bad design decisions that had been established in Java Enterprise(TM) all over again! It took the Java community about a decade to step back and come to frameworks where developer productivity is THE thing to focus on. All the rookies that start their “Java career” with ANDROID will be doomed to go through this same process again! Poor bastards…
Finally! Let’s define everything in XML! I am getting bored at bashing on XML…
$ find . -name "*.xml" ./AndroidManifest.xml ./res/layout/details.xml ./res/menu/options.xml ./res/values/strings.xml ./res/xml/preferences.xml
iOS is also using XML for their interfaces, but they hide all that shit behind a really decent “InterfaceBuilder”:http://developer.apple.com/tools/interfacebuilder/!
The Builder and XML Tools in the Eclipse Plugin are so ugly that i rather write the whole shit by hand, BITCHES!
h2. Tight coupling
Why, for gods sake, did they come up with the idea to use inheritance for everything in ANDROID? It’s even worse than in J2EE because you are not bound to Interfaces but Classes! Hello dear ANDROID designers, there is no such thing as Mixins or Multi-Inheritance in Java?! How am I supposed to write clean code with that? Answer: You are not going to write clean code anyway, because you have to do premature optimization on your code so that it can run on all the shitty ANDROID devices! YEAH!
Just forget everything you learned form state of the art frameworks like MVC or DI. It’s just not possible! BY DESIGN!
Just put state, lifecycle, business and view logic in one class; also helps reducing your package size, HOORAY!
h2. Checked Exceptions
Do we really need more Checked Exceptions? Really?
Writing tests for iOS was nearly impossible at the time I was doing it. Even the guys at the Cocoaheads Hamburg did not know how to get it running. But this situation has improved over the last months. Special thanks to XING for doing a lot of research there and presenting it on the Usergroup!
I thought that testing for ANDROID would be really cool, because the Java community has a really strong background on TDD and “Testing is even a Topic on the Dev Guide”:http://developer.android.com/guide/topics/testing/index.html, even though it is the LAST one…
Let me make it clear to you: Testing ANDROID sucks!
Because of all the tight coupling and multithreaded environment it is nearly impossible to test something. Even simple tasks like testing your Utility-Methods needs to be done in the Emulator! Just have a look at this “multiscreen setup guide of how to get it running with JUnit”:http://mobile.tutsplus.com/tutorials/android/android-sdk-junit-testing/ (Hello?! JUnit 3 is deprecated for YEARS!).
Despite all this crap, I finally did it! So please test “my dzone application”:https://github.com/phoet/dzone_android, because I do not own an ANDROID phone myself…