The Design of Everyday Things

For anyone who is interested in design, even if you know plenty already, you should still participate in this class:

It’s free, and it’s not very long (unfortunately). Take a peek.

I’ve read Don Norman’s (who is one of the three instructors) “The Design of Everyday things”, twice. It’s about to be three as a new edition of his book was released last month. It’s an amazing book on how and why we design things for humans. It will change the way you look at anything that works well, and things that are poorly designed. You will never look at a door the same way again. Anyway… If you design anything for humans to interact with, this is an awesome topic taught by an awesome person. Even if you don’t design things, this might help you discuss concerns you may have with a designer of anything, be it a website, an app for an iPad, a lamp, or a wall mounted switch.

I love the trend of all these online classes. I have participated in many. They are free and priceless.

You should also check out these sites for more awesome content: – Courses from many prestigeous institutions ( – MIT Open Courseware

Posted in Random Thoughts | Comments Off on The Design of Everyday Things

Don’t Be Lazy

I received an email from our local Java User’s Group (AJUG, the Atlanta Java User’s Group) which was a continuation of a thread which requested help on resources/tutorials for development on mobile platforms, specifically iOS and Android. My previous post was my response which included iOS resources that I found extremely useful during the last few years of my iOS development career. The lastest response from another AJUG member in the thread had suggested to look into Sencha Touch or Appcelerator (I’ll throw PhoneGap into the mix too). So, I’m going to chime in (like everyone else with an opinion and please remember this is my opinion) with my experience with the whole “Native” or “Cross-platform” approach.

First off, I am going to address all the wonderful experts who dedicate a large portion of their development time to JavaScript. I am not attacking you or your craft. You are awesome at what you do. You’ve worked wonders hacking at an environment (HTML/DOM) that was never intended for what you’ve been able to do with it. That being said, I have only experienced that JavaScript environments are just not a great fit on the mobile platforms (yet). Please read “Why mobile web apps are slow” if you want to read into detail about this. It’s a great resource which explains some of the pain points of the JS environment on constrained devices.

That being said and out of the way…

My response to the suggestion of using these cross-platform/web frameworks APIs is as follows:

“Don’t be lazy.”

Sencha Touch, PhoneGap, Appcelerator or any of those “cross-platform” libraries are just excuses for cutting corners that shouldn’t be cut. Don’t be lazy. Learn the languages. Learn the APIs. You will only make yourself more competent, experienced, well-rounded and knowledgeable in the long run: that’s a huge bonus! Just as everything in computer science is a tradeoff the tradeoffs here are huge. I’ve seen by first hand experience a lot of time and money wasted by using these toolsets. I’ve seen user’s cringe at the way an application responds. I’ve seen product owners, sales persons, and engineers drop their heads in disappointment when receiving feedback regarding the deliverables (I know this is anecdotal, I’m just speaking from my experience).

The reason is that most of the time all you end up with is a slow HTML based application which does not perform, look, animate or behave anywhere as well a native application does on these devices.

“Don’t make your users suffer for you.”

If you are going to deploy something to the world all I have to say is “Don’t make your users suffer for you.” Software development is a complex task. Design is a skill. Orchestrating a great UX is a complicated and difficult job. We are expected to take this task on for our customers and solve it. It’s not right to deliver something to tens, thousands or millions of people that is substandard just so we can save a little time for a few developers. The user is the most important part of our development efforts. Do them a favor and do the best you can do and not limit it to what has been provided for you.

“You’ve already done 80% of the work”

Once you have actually developed an application in one platform you’ve already done 80% of the work to port it to another. The hard part is flushing out the requirements, defining the services, designing the interface and all that not-so-fun stuff. If you have an app in iOS and you want to port it to Android it’s simpler than you think. You aren’t spending any of your time on anything but coding. I have someone porting one of my iOS applications to Android as we speak. This developer had never done any Android development (although, a very talented Java developer) and they are enjoying the time porting. What took myself (I wrote the iOS application) and an 1-2 Java developers (backend services guys) about 14 months of concurrent development to complete is taking the Android port about 3 months. I’d also like to mention the mobile developers (myself and the other developer) had never used an Android based device before this porting effort. Anyway, back to the point… So, lets say ~3 man years to get the front and backend done for this product. We are only adding only ~3 months for an Android port. Meanwhile, the iOS version has been on the store during this development. Since I used storyboards on this project the developer could easily see the outline of the entire workflow of my application. The developer could read the SQL and predicate queries that were located in the application’s source code. They could reuse all the digital assets (images and audio) that were included in the original application. They could talk to me about how I did something. The idea is that this ground work was all done for the client. It’s really not that big of a deal to port! The developer porting can focus all their time on making the port a great native application which looks correct, acts in a manner a user expects and can be as efficient as possible without affecting the other application(s) that are already done.

Don’t forget the same problem occurs in the cross-platform APIs that has always plagued web development: different browsers|devices = different capabilities. Fixing something for one device or platform might break another or just make it awful. It’s just not worth it. If you fix a UI bug for one use case for a platform, QA has to test across each platform. What ends up happening is you end up developing for the least common denominator which is just a loss for your users (and yourself if you want to show off those skills).

“If you’re the target user, then do whatever you want.”

If this is an “internal enterprise application” (not commercial) I think differently (and I don’t mean the Apple way). If you’re the target user, then do whatever you want. It might be easier as the expectations of the business and users aren’t as high. This is the 5% of the time I would consider writing a non-native application. Sometimes we need to hack out a quick application that is purely functional and not necessarily done in regards to the aesthetics.

“Those who cannot remember the past are condemned to repeat it.” (link)

Another note… Since this is a Java list I thought a prime example of trying develop to far away from the platform is Java on the desktop. Over the last 15 years developers have been and are primarily the only users that use this (Swing) as desktop applications. Even the Eclipse foundation hated java components and created SWT to get by this issue. Java has always given a suboptimal client-side (AWT then Swing) user experience that has annoyed the users since the very beginning and it never recovered. Perhaps if Netscape had finished the Java version of their browser I’d be telling a different tale. A lot of mobile devices are limited in memory, CPU, and (what everybody seems to forget) battery! We as Java devs are so use to just saying “add more ram”, “oh add another CPU”. We can’t think this way in the mobile/battery-powered world. When I speak of mobile, I speak of anything running with a battery. I don’t limit this to smart phones and tablets. You have to be as efficient as you can (we should do that for desktops too, why not be green?) when taking someone’s precious power. So, by getting your application to finally squeak by with performance because you are now only using 80% of the CPU, you still aren’t doing the user any favors. Be nice and as efficient as possible.

Anyway, those are just my thoughts. I’ll probably modify this post a few times before I am done. I have other thoughts:

  • Loss of developer control using cross compiler technologies
  • Debugging is much nicer and robust in the native toolsets
  • Licensing adds another huge cost or confusion in many circumstances
  • Refactoring tools in Java, .NET and Objective-C are far superior to JavaScript’s tooling availability.
  • Drastic API changes in Javascript are very difficult to move forward and just require a rewrite anyway. Android and iOS have been awesome at forward compatibility. Take a look a Sencha’s track record for drastically changing their APIs/framework (a writeup of moving from Ext 3 to 4 see “Upgrade Transition”)

TL;DR – 95% of the time I will write native applications.


Posted in Random Thoughts, Software | Comments Off on Don’t Be Lazy

My Collection of Awesome iOS Resources

I’ve compiled a list of resources that I found indispensable during my iOS development endeavors. One of the most important resources is Stanford’s CS 193P “Coding Together: Developing Apps for iPhone and iPad” class available for free on the iTunesU site. I have considered this to be a prerequisite course for planning on developing iOS applications.

Links marked with a “*” are considered extremely important and should be visited very early in your iOS/Apple development efforts.

Video Training

Stanford: CS 193P Coding Together: Developing Apps for iPhone and iPad (Winter 2013)

Requirement for any iOS developer. It’s free, it’s a legitimate source and it gives a very good mid-level overview of some of the most important aspects of Objective-C and the iOS SDK.

(*)Stanford: CS 193P iPhone Application Development (iTunesU Link)

Apple’s Video resources

(*)Apple’s Video Resources All the videos from WWDC 2013, WWDC 2012, WWDC 2011 and a bunch of other resources are available here. These videos are extremely important as they cover the technology in succinct chunks. They are also ‘correct’.

Blogs, Tutorials and Code (Oh My!)

NSBlog by Mike Ash – Friday Q & A covers many topics in C and Objective-C, a must for any serious developer.

Cocoa is My Girlfriend Blog Another good resources for some goodies about Cocoa development.

NSHipster is a journal of the overlooked bits in Objective-C and Cocoa, updated weekly.

NSScreencast has screencasts on different iOS APIs (paid site which I subscribe to), updated weekly.

Cocoanetics A cocoa programming Blog.

iDeveloperTV Various tutorials (paid) and a podcast (free).

(*)Cocoa Application Competencies for iOS Lists key components of the Cocoa framework for iOS and their descriptions. Everything an iOS developer must know.

(*)Apple Developer Forums, Apple Developer Site Forums and documentation from the source. You are better off asking questions
here and not finding the wrong answers on Stack Overflow. Yes, that is just my opinion but the feedback can be quicker and sometimes Apple engineers will jump on board. Plus, you might have an NDA if you are working on beta software.

(*)Tech Note TN2250 Very important document on troubleshooting code signing. Always go here before asking anyone on any forum or whatnot.

(*)iOS Mobile Human Interface Guidelines

Ray Wenderlich Tutorials for iPhone / iOS developers (including game development).

API/Components/Library Stuff

(*)CocoaPods: The Objective-C Library Manager. This is how we will manage dependency references within our Xcode projects at my company.

(*)AFNetworking The de facto networking API for iOS.

Cocoa Controls A site for Custom UI Controls for iOS and Mac OS X. Great for learning how people do cool stuff. Some automation tool we may be looking into.


(*)The C Programming Language Second Addition (A must read).

(*)Programming in Objective-C (5th Edition) (A must read).

Programming in Objective-C 2.0 Video (Pay Site).

Safari Books Online There are a lot of books available on O’Reilly’s Safari Books Online, get yourself a subscription and learn about every technology you can dream of.


TestFlight Deploy your applications to your beta testers through this awesome service. It provides crash reports, user feedback, install bases, reports and more.

Parse Let someone else do all the heavily backend lifting. A great framework for persisting your data in the cloud.



Posted in Software | Tagged | Comments Off on My Collection of Awesome iOS Resources

VMware Fusion 4 Changes

After installing VMware Fusion 4.0.1 some of my custom settings were lost, again. The new version has completely changed where it stores its configurations. So, here are some updates.

The former directory, once used for dhcp, nat and other configurations:

/Library/Application Support/VMware Fusion

Seems to be only a container for license keys.

The new location is:

/Library/Preferences/VMware Fusion

But, this location no longer contains the scripts ( to restart any networking changes you have made. The scripts are now stored within the main VMWare Fusion application directory (OS X Appellation bundle ‘VMware’). If you installed VMware Fusion in the normal ‘/Applications’ directory, the file path to the scripts is:


It also seems that the ‘’ script necessary to restart any services (NAT for example) that have changed is no longer there. The script I used is called ‘’. To restart the services you must issue two commands:

sudo "/Applications/VMware" --stop
sudo "/Applications/VMware" --start

Posted in Software | Tagged , , , , , , | 1 Comment

Composite Comparator

Available at GitHub:

Allows two comparators to be merged, so that if the major comparator returns equal, the other comparator is used. This can then be used to form composite comparisons.


        new CompositeComparator(new BeanPropertyComparator("lastName"),
            new BeanPropertycComparator("firstName") ) );

The example above sorts items on last name, and then first name. Two beans with the same last name will then be sorted on first name.


A simple utility class for sorting collections based on its contained bean’s properties.

    //example bean
    public class PersonBean {

        private String firstName;
        private String lastName;

        public PersonBean(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName  = lastName;

        public final String getFirstName() {
            return this.firstName;

        public final String getLastName() {
            return this.lastName;

    final List people = new LinkedList();
    people.add(new PersonBean("Benjamin", "Franklin"));
    people.add(new PersonBean("Ronald", "Reagan"));
    people.add(new PersonBean("George", "Bush"));
    people.add(new PersonBean("George", "Washington"));

    //sort by last name
    SortUtil.sort(people, "lastName");

    //sort by first name
    SortUtil.sort(people, "firstName");

    //sort by last name and first name
    SortUtil.sort(people, "lastname", "firstName");


The comparator factory can also create comparators based on bean property names.


final Comparator firstNameComparator = ComparatorFoctory.getComparator("firstName");

The ComparatorFactory can also create a composite comparator containing as many comparators as you like. So, instead of having a primary and secondary you can have a tertiary, quaternary and so on.

Posted in Code | Tagged | Leave a comment