2013 - Here We Code

An Awkward Moment for the Mayans

With a renewed sense of purpose due to the fact that the Mayan gods have given us a stay of execution I spent sometime to reflect on 2012 and what I need and want to do for 2013. Year after year I find myself increasingly motivated to become a better developer. Specifically iOS…and as luck would have it being an iOS developer never runs out of interesting challenges and rewards.

C What is Underneath

Over the past two months I have interviewed five potential canidates for an open developer position at work. I was shocked that they didn’t have a basic understanding of the language they were “proficient” in, as well as, basic problem solving skills and experience with development fundamentals. After I reviewed my notes I began to wonder just how well I understand numerous aspects of Objective-C and UIKit. The language and frameworks I understand pretty well, but what I found was I had taken the foundation of Objective-C for granted: C.

Why is NSError passed by reference? Why do you block copy when you want to modify it? In order to satisfy my curiosity I bought the following books:

  1. All the C You Need to Know
  2. The C Programming Guide

While I don’t have an urge to become an expert in C (as of today) I do want to achieve of understanding of the language fundamentals.

Nerds of a Feather

Conferences and meet ups. These are resources that, regretfully, I didn’t partake in very much in 2012. Usually because work, however on the rare occassions I did go I was blown away by the amazing knowledge and skills of the presenters and attendees. Becoming a regular at these events will be a priority.

AppKit – Oh My

Ever since I started development for WhoNote I have a much greater appreciation for those developers who make their living writing Mac apps. Concepts that I took for granted in iOS are beyond trivial when dealing with AppKit. However, I do not shrink towards challenges but rise. I’m committed to becoming just as knowledgeably and proficient with AppKit as UIKit.

Putting the Who in WhoNote

WhoNote has been my biggest endeavor to date and by far my greatest labor of love. Getting the iOS and Mac App out are a top priority.

Passing the NSArray Test

The Setup and Crash

The other night I was working on the event image gallery for WhoNote and stumbled upon an interesting scenario. I am using UIPageViewController instead of an infinite UIScrollview to mimic the native photo app, I created a POC for this when I was at the WWDC so I thought I could just reuse that.

CRASH

The source of the crash wasn’t immediately obvious. I setup the controller properly and made all the necessary delegate/datasource associations. What was the problem? Turns out that in the the POC my image array was populated with photo objects, but the image array I’m passing around in WhoNote between view controllers contains NSDictionaries.

Consequently, when calling

NSUInteger currentIndex = [self.imageArray indexOfObject:currentPhotoObject];

I get an index that is not only out of bounds, but an incorrect object. The reason for getting the index of the object is that I can handle the forward and backwards pagination with the UIPageViewController and which image to display.

Time to rethink my implemenation approach.

Predicates

The first avenue I went for was NSPredicate. Though the background of NSPredicate is out-of-scope for this article I would suggest reading Cocoanetics’ Filtering Fun with Predicates for some pretty interesting usages of this class.

Search Criteria

Because I don’t have instances of WNPhoto in my array I needed a way to efficiently search the array of dictionaries for a specific key value and then stop.

Example of values:

Finding a predicate to satisify my search requirements was easy:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ffUrl ==  %@)", @"ffUrlToPhoto"];
NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate];

But that didn’t do me any good with the UIPageViewController pagination because now I an array with only one element. I really didnt’ want have to write some less than optimatal iterator to manually search the array for the value I was looking for.

When In Doubt Read the Docs

The methods that Apple provides for NSArray are extensive, and while on the surface it might appear they could be duplicated I’m going to go ahead and say that the engineers at Apple are smarter than me and figured out the best ways to find the needle in the haystack.

indexOfObjectWithOptions:passingTest:

Returns the index of an object in the array that passes a test in a given Block for a given set of enumeration options.

Sounds good to me. I do feel the method signature could be improved, but that is for another discussion. After fumbling the syntax a couple of times I ended up with logic that provided the solution I was needing without having to mutate the original dataset. More importantly I learned something new.

NSUInteger currentIndex = [self.imageArray indexOfObjectWithOptions:NSEnumerationConcurrent passingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop)  {
       NSDictionary *metaDict = (NSDictionary *)obj;

       if ([metaDict[@"ffUrl"] isEqualToString:metaData.ffUrl]) {

         *stop = YES;

        return *stop;
     }

     return NO;
  }];

From Baby Showers to Banaroo

WhoNote might not have floated to the next $250,000 round pitch, but it did float it’s way into the public. Last night I presented to a packed 4th Floor at the Chattanooga Library on my latest project, WhoNote. It was an amazing experience in every aspect. Hearing some pretty kick-ass ideas being presented, the warm reception from the crowd and decor.

It didn’t hurt that ChattanoogaWhiskey and Fork and Pie provided the food and beverages either :)

So what’s next? Finishing the app of course. I took the past week off from development to work on the pitch, but with a renewed sense of purpose and excitement I’m back on it. Working closely with FatFractal as the BaaS provider and the time spent making the UI as simple/easy to use I believe the final product will be a joy to use.

Don’t forget to signup at whonoteapp.com for updates on the development and launch.

A huge thanks to my close friend Scott Wills for all the design work on WhoNote. Couldn’t be happier with how it is taking shape.

If you are interested in seeing the desk then hop over to Speaker Deck.

Will WhoNote Float

Ten days ago I received an email from my friend Tiffanie Robinson urging me to apply for the tonight’s “Will This Float” event here in Chattanooga in order to pitch WhoNote.

Will This Float? celebrates the diversity of the creative and entrepreneurial spirit across the Chattanooga region by showcasing up-and-coming innovators as they pitch their ideas! Join us for good food, drinks, great company, and innovative start-up ideas.

What does the mean for WhoNote? Well, a few things.

  1. It as made me focus on the mission of the app.
  2. It provides an forum for constructive critisim and feedback
  3. I’m able to contribute to the growth of the emerging tech scene in Chattanooga

It has been very challenging to come up with a pitch that covers the range of topics that were required and keep everything under 3 mins, but the result has been rewarding.

-Why should I care? (If you can’t get me excited/inspired, I won’t help you…)

-What is your business model? (how do you make money)

-Who is your market? (why do they want your stuff, and how many are there, how much money is that)

-Who’s on your team? (Do you have any mad skills or super connected/successful team members or advisors that greatly increase your odds of being successful)

-Is this just another idea that will fizzle out in a month or two? (Show that you have some momentum, that people are joining your team, committing to help, or using your thing, and that you and your team are destined for greatness.)

-What is your vison for the future? (This is where you make your ask to the audience- “I’m doing a Kickstarter.” or “I need mentors/specific advisors/industry connections/investment capital.” This needs to be a logically laid out plan without skipped steps or unrealistic expectations, i.e. not “I have a great idea, give me 1.5 million.” more like “Next steps are to talk with industry experts to help wireframe a product to raise seed capital to prove the concept…”

Regardless of the outcome, the development of WhoNote will continue. It has been the best project that I have ever worked on. Don’t forget to signup for updates.

If you are in the Chattanooga area come you should come and check the event out. Not just for WhoNote, but all the other awesome pitches and amazing food from Fork and Pie….and did I mention Chattanooga Whiskey is a sponsor as well. That is pretty much a win for everyone

It's a Dispatch Group Thing

One Thing Multiple Times

When it comes making iOS apps multi-threaded by now we should have at least heard of Grand Central Dispatch. The most common use case that is implemented and used is asynchronously fetching an image or web page, returning the resource…manipulating it in some fashion and the updating the main thread (UI) with updated resource.

Image Async Example

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_NORMAL, 0), ^{
    // fetch image from remote server
   dispatch_async(dispatch_get_main_queue(), ^{
     // set image for imageview
     // reload view if necessary...i.e. table view
   });
});

Copy and Paste Should Work Right?

For a project I’m working on I thought I would be able to utilize the same paradigm for the following scenario;

Grab a list of all our customers accounts. For any given customer they can have n+1 accounts and I don’t want them to run serially, but concurrently (our vendor has a POORLY design datastore so the queries take forever) to keep wait time to a minimum. Once all the calls for getAccountDetailsForAccountNumber have finished the tableview on the main view controller is refreshed with the info.

// AccountInfoViewController

- (void)viewWillAppear:(BOOL)animated {
      [super viewWillAppear:animated];

      [self.imf getAccountListMetaInformation:^(id obj, BOOL success, NSError *error, IMFClientErrorType clientError) {

          if (error) {
           // handle error
          } else {
            // NSArray *aggregatedInformation = (NSArray *)obj;
            //refresh tableView with aggregatedInformation
          }
    }];
 }

// IMFClient pseudo

@property (nonatomic, strong) NSMutableArray *willHoldAccountDetails

-call getAccountListMetaInformation
       // do general setup and check for cache
       // START CODE THAT SHOULD RUN CONCURRENTLY
      // BUT getAccountListMetaInformation COMPLETION BLOCK SHOULD WAIT
      -call getAccountDetailsForAccountNumber
         -run completion block
             - ADD return object from getAccountDetailsForAccountNumber to willHoldAccountDetails property
      -call getAccountDetailsForAccountNumber
        -run completion block
             - ADD return object from getAccountDetailsForAccountNumber to willHoldAccountDetails property
     -call getAccountDetailsForAccountNumber
        -run completion block
             - ADD return object from getAccountDetailsForAccountNumber to willHoldAccountDetails property
      // END CONCURRENT CODE - SAFE TO CALL COMPLETION BLOCK FOR getAccountListMetaInformation
-finish getAccountListMetaInformation
-willHoldAccountDetails is now populated and passed to completion block

First Attempt

I failed.

Why It Failed

The first reason my code failed was because of my failure to take the time and truly appreciate and understand what happens with custom queues, dispatch_* methods and how objects are managed by queues and threads. I tried to apply the same logic to a totally different scenario.

The second reason my code failed was getAccountListMetaInformation is running on the main thread, so none of getAccountDetailsForAccountNumber’s dispatch_async calls are going to be able to run until getAccountListMetaInformation returns. Anytime the code runs on the main (or any) thread, that’s going to block other code from running on that thread.

I regrouped….literally

I went back and rewatched the WWDC videos from 2010 and 2011 on Grand Central Dispatch, as well as, read over Mike Ash’s posts regarding GCD. Paying particularly close attention to Friday Q&A 2009-09-04: Intro to Grand Central Dispatch, Part II: Multi-Core Performance.

Winning with Simplicity

dispatch_group_async to the rescue. When going back and evaluating what I was trying to do, which is to iterate over list of accounts and fetch each one concurrently, and then updating the comletionBlock with aggregated array, the simpliest approach was to push each request on to a dispatch_group and then WAIT for all of them to complete.

Shocker…it worked.

Lesson Learned

The most important lesson I took away from this is regardless how much abstraction and convience that GCD provides it can’t/won’t abstract the business logic and having a firm understanding of the GCD paradigms are paramount.

Project

ThreadingHell. If you have a better/different implemenation then please let me know.

Fo' Swizzle

It is said that necessity is the mother of invention. Granted, I haven’t invented anything, however necessity did drive my latest solution.

Vendors – PIA

While working on a project for work I have the unfortunate requirement of using one of our vendor’s iOS frameworks that is horribly written and documented. From day one I discovered bugs and inconsistencies with how it is implemented. For one case I ended up reverse engineering what they were doing and sent them the snippet they should add in to fix the problem.

Not Wasting Time

Getting vendor to make changes that I needed, and consequently, the company, is about as quick as standing in line at your local DMV. I had to move the project along as fast as possible. During the early stages of the project I picked up a copy Graham Lee’s Test Driven iOS Development and took his advice on how to make my unit testing much more efficient with better coverage…so I started writing as many mock objects as I could for unit testing. In order to handle future test cases I created a MockObjectDataManager, but I found myself writing a lot of if/else statements throughout the app itself to handle switching between dev/test/stage/production web services vs. mockobjects. This was not good.

What I needed to do was setup the app so that any other developer, including myself, only had to write calls to the vendor’s framework, but could switch easily to using mockobjects when appropriate.

Method Swizzling to the rescue!

Fo’ Swizzle

The What

Unlike creating a category method with the same name as the original method (effectively replacing the original method), MethodSwizzling lets your replacement method make use of the original method, almost like subclassing.

Source: CocoaDev

Danger Will Robinson, Danger

I have read and seen developers using this technique, but it usually followed up with disclaimers such as:

  • unstable
  • experimental only
  • use at your own risk

Because of this general attitude I had seen I shy’d away from every really using this runtime feature. While I was foolish early on in my iOS development career to not learn more about it, using it without serious thought and consideration would probably proved distasterous. Granted, swizzling does allow a developer to swap methods for their own implemenations, sed developer has to make a lot of assumptions about the implemenation of the original method. If that implemenation changes the likelihood for your replacement method to break increases.

Necessity

As stated earlier myself and my team needed the ability to rely on the vendor framework for communication to and from the web services, but also needed the ability to writing unit tests and CRUD mockobjects WITHOUT cluttering the app code base.

First, I recreated the json response from each endpoint and saved those into static files. Second, I rewrote the mock object manager to access and cache the models asynchronously, with better error handling. Third, I added in a preprocessor macro to flag whether or not the swizzled method should be used. Finally, added in a convience method to handle swizzle.

I hit Cmd+r and was off to the races. The app crashed. Had I been over confident in my ability to leverage the almighty runtime. Well, no…I just needed to pay attention to how classes are loaded. As I stated earlier, my mockobject data manager loads the .json files asynchronously. When the swizzled method was called the dispatch_queue was NULL and resulting in a BAD_ACCESS error.

iFixit

The first attempt was to check for existence of the queue in the loadLoginResponse method:

if (!_fileQueue) { _fileQueue = dispatch_queue_create(fileQueueName, 0); } But wait…I had already instantiated _fileQueue in the sharedManager class method. Didn’t seem very reusble. As to not be out done this far into it I remembered the lifecycle of how/when classes are loaded and most importantly which the order of the meta methods. I moved the property and check from both the sharedManager and loadLoginResponse methods to + (void)initialize. Setting the USEMOCKOBJECTS to 1 and rerunning the app I successfully loaded my mock objects.

Lessons Learned

The most important lesson learned is to not be afraid to experiment with the more advanced features of Objective-C. When used correctly they provide a lot of flexibility and benefits to development and testing. My app is now setup to give any developer the ability to test against any live enviornment, as well as, test out new/existing features without changing a 3rd party framework or cluttering the codebase with a bunch of unnecessary “if/else” statements.

A great example of using these types of techniques is PonyDebugger from a little company called Square.

Get the Gist

gist.github.com/3762103

Exercise in Aysnc Web Image Scraping

Motivation

For the past five months my wife and I have been building our new house here in Chattanooga. A new house is basically a blank canvas. Each room and area of the house has its own requirements and design. This is very overwhelming and I am NOT an interior designer. Most people would take to Pinterest for their design inspiration, but for me inspiration came from Freshome. Every day I would comb through the latest articles, download one by one the images that inspired me the most. Needless to say this was time consuming. I wanted to be able to automate this process. It was time to crack open SublimeText 2.

Requirements

The requirements that were quite simple:

  • Grab latest 10 articles
  • Download each ‘inspiration image' for a given article asynchronously

Dependencies

Making it Better?

I’m always looking for advice and tips to improve my python scripts. The ease and strength of language has made developing these types of utilities extremely fun. I would really like to hear people’s thoughts regarding the multithreading or making the parse selector better.

FH_ImageDownloader

FatFractal - From Code to Cloud

The Service Business

PaaS, BaaS, IaaS have been a growing, and, I dare say, welcome, industry over the past 5 years. There is a lot of *aaS options out there with specific offerings.

While there are many varying opinions as to when to choose one or many or none of these types of services, this article is an overview of the latest comer to the service space, and in this humble developers opinion, the best out there: FatFractal

First let’s define what each of the different types of services is:

Platform as a Service

PaaS provides all the infrastructure needed to run applications over the Internet. It is delivered in the same way as a utility like electricity or water. Users simply “tap in” and take what they need without worrying about the complexity behind the scenes. And like a utility, PaaS is based on a metering or subscription model so users only pay for what they use.

With PaaS, ISVs and corporate IT departments can focus on innovation instead of complex infrastructure. By leveraging the PaaS, organizations can redirect a significant portion of their budgets from “keeping the lights on” to creating applications that provide real business value.

This model is driving a new era of mass innovation. For the first time, developers around the world can access unlimited computing power. Now, anyone with an Internet connection can build powerful applications and easily deploy them to users wherever they’re located.

Source: SalesForce

Infrastructure as a Service

Infrastructure as a service (IaaS) means delivering a virtual server, desktop computer or remote storage from the cloud. In other words, a hosting provider such as Dell gives you a remote data center — where it manages the infrastructure, servers and virtualization — and you access your virtual computers and storage from the internet through a secure virtual private network (VPN) connection.

An IaaS approach to infrastructure can offer:

  • Faster responses to changing business conditions or internal customer needs, enabled by rapid system provisioning and rapid scalability, both up and down, without the long-term lock-in of hardware purchases
  • Productivity increases resulting from access to your applications and data from anywhere and the reliability that comes from a distributed computing model.
  • Reduced capital outlay for hardware acquisition, maintenance, data center real estate, and power and cooling, when using a pay-for-use (public cloud) model

Source: Dell

Backend as a Service

BaaS, as we shall call it for the sake of brevity, has carved its own little niche nestled neatly between Platform as a Service (PaaS) and Software as a Service (SaaS). Unsurprisingly, it does exactly what it says on the tin – that is – it provides a near complete server side stack including persistence, user management, data retrieval and querying, file storage and a few other things at the flick of a switch.

Source: Cloudspring

Who Is Out There

I’m sure I am not covering them all, but these are the platforms and back ends that I have used myself.

They all offer varying takes on the following list of features:

  • PUSH notifications
  • iOS, JS, Android SDKs
  • REST Service
  • Twitter, Facebook integration
  • Server Extension (Stackmob and Kinvey only)
  • Location Services
  • File storage
  • Payments (In-app Purchasing)

From Code to Cloud

When I was first invited to FatFractal’s private beta I was expecting more of the same. That isn’t to imply that the above services are bad, just more of the same with their own flavor. You know that expression, “You don’t know what you’ve got until it is gone.”. With FatFractal I never knew what I didn’t have until I experienced it.

As I stated above all of these services offer the same features in some shape form or fashion, however they fail to implement the basic of features in the correct manner.

What developers want and need is a platform that has the benefits of Google App Engine in regard to scalability, language support, and schedule tasks, but an abstracted data store (BaaS) that gives developers complete control over their models. Enter FatFractal. A true, abstracted data store and an engine that is language agnostic. You have all the features I described above but without endless endpoint creation and spaghetti client code. Plus, you get a new and refreshing approach to data-modeling.

The four main areas where FatFractal excels above all the others are:

  1. local development
  2. modeling
  3. object graphs
  4. server-side functionality

Local Development

Since the genesis of BaaS there has been an assumption that developers want to manage the life cycle of their app data in the cloud. Incorrect. We want to be able to have a light-weight local environment that is an exact replica of what we deploy into the cloud. The only current option is GAE, but the trade-off is that you lose the benefits of what BaaS providers offer out of the box. Not with FatFractal.

The FatFractal platform was built on an engine model. We believe that during application development it is imperative to have the local runtime environment be a carbon copy of what’s up on the cloud. When you set up for local development, you install a fully-featured FatFractal Engine on your desktop. This is not a crippleware version, not a simulation.

Source: Lovin’ Localhost

Deploying is literally one line (local): ffef deploylocal (cloud) ffef deployFFFabric

Modeling

I like to create models as subclasses of NSObject. `` I know it seems like a far out idea, but it is a far to common practice to force developers to interact with models that are only hashmaps or dictionaries or having to create a map between my objects and backend. The specifics of how models are defined and created go beyond just defining properties. It could involve conforming to a protocol like NSCoding or using KVO. The reverse is also true. There are many use cases when I just want clean objects. I don’t want extra overhead that is unknown to me.

Functionality like this should not have to be written.

Data Graph

Six degrees of separation refers to the idea that everyone is on average approximately six steps away, by way of introduction, from any other person on Earth, so that a chain of “a friend of a friend” statements can be made, on average, to connect any two people in six steps or fewer. When we talk about object relationships we are usually discussing these relationships based some sort of defined structure, whether that is a join table, circle references or foreign keys. The truth is, relationships aren’t always explicitly defined. Most BaaS’s will provide a standard, one-to-many or many-to-many option, but you still run into the “noSQL join” obstacle. Data relationships are like human relationships. What makes objects/data useful are these relationships but where is the flexibility to define these complex relationships in a simple and meaningful way? John Doe and Jane Smith are friends but their friendship graph is:

John’s mother' second cousin’s nephew’s best friend’s ex-wife’s bridesmaid is also Jane. With FatFractal’s grabbag datatype and back references this kind of complex relationship is trivial to define and return through a query.

Most models start clean but the moment you start defining relationships other PaaS/BaaS services start to fall down:

  • Pivot tables
  • guids
  • duplicate data

When defining a grabbag as part of an object definition the values aren’t loaded by default with the instance. The grabbage is kept as datastore reference and populated via API. Long story short it doesn’t pollute the object graph with each instance request.

Essentially FatFractal has solved the NoSQL join problem.

Creating and managing relationships, no matter how complex, are finally straight forward without compromising data integrity or performance. One-to-many, many-to-many, many-to-infinity…it doesn’t matter to FatFractal, but it is a big problem for FatFractal’s competitors.

Server-side Functionality

A major, deciding factor when choosing any sort of “automated” service to replace something that you could hand-roll yourself is how easy or difficult it is to extend functionality. This mentality is always at the forefront of a developers mind. It is our nature. Why?…Because it is the very being of object-oriented programming. You extend classes, and inherit parent functionality. You implement interfaces to enforce signature. The same functionality should exist with BaaS providers. Stackmob does provide extension capability, but you are restricted to Java and there isn’t a way to ensure that your local development will run the same when you deploy into your dev or production API (see local dev enviornment above). FatFractal is language agnostic. You want to write your extension in Python, no problem, JS, go for it…hey I’m one of those cool ruby kids what about me?…they have you covered too.

In addition to extending the server you can also code up event handlers.

Event handlers execute when an event occurs on your app’s backend and are one of the most powerful and unique aspects of the FatFractal Platform. Every CRUD action automatically generates an event, with no coding required by your application, that may trigger an event handler.

In the examples I’ve reviewed from other services I see way too much server-side code being performed on the client, whether it’s list filtering, validation or post processing…the reason being, the ability to perform most of these server tasks, on the server-side, doesn’t exist. It does with FatFractal.

For example, if I have an app that “checks-in” a user I would probably also want to update a user property “myEvents” (list of all events I have attended) and “currentEvent” (instance of Event) and add myself to the events group of attendees which will provide me certain resource permissions. Having to do this on the client-sizde of a mobile app is horrible design. The mobile app should post to a “checkin" resource, essentially validating an access code or something and then continue on. The server-side should have an event handler which takes a successful checkin and updates the object instance and any other related objects. Aside from StackMob, where you would have to roll and trap your own events in Java, it isn’t possible to do this on any other service.

Using It

Over the past 9 months I have used all of the aforementioned BaaS services with production apps where I hand-rolled my own webservices using RDBMS, as well as NoSQL…not just ‘hello world’ tutorials. Each one has its niche in the market; but when making the decision of which service I would use for developing WhoNote (still in development), and any future applications, FatFractal is the clear choice. I am able to keep clean, native objects easily, define a complex object-graph, implement proper server-client design with extensions, event handlers, scheduled tasks and last, but not least, have configurable implicit and explicit permissions while developing in an exact duplicate, local, development environment that I then push to the cloud.

Summary

FatFractal is the next evolution of app development platforms.

*Note: I am not employed by FatFractal and was not paid, bribed or coerced into writing this article. I wrote it because their approach to PaaS/BaaS provides the level of out of the box features and customization that I have seen in parts and pieces all over the interwebs, but hadn’t yet found in one solution.

Incentives for Hiring the Best - A Developers Point of View

Introduction

Yesterday I sat on a luncheon panel for the Chattanooga Technology Council with ~100 attendees representing most of the larger business in Chattanooga. The topic of discussion was Mobile App Development in the Enterprise. A growing topic amoungst most larger business. This was to provide attendees with a forum to learn more about what it takes to tackle the inevitable wave of mobile in the enterprise. The different areas covered where:

  • Security
  • Governance
  • Challenges
  • Development
  • Talent Acquisition

I spent a lot of time, maybe too much, on what non-tech companies should do to attract development talent. These companies have great ideas on what they would like to do with mobile applications, but are having an extremely difficult time acquiring talent.

Below is a summation of my opinion on what it takes.

You Want the Crazy Developers

Here’s To The Crazy Ones. The misfits. The rebels. The trouble-makers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules, and they have no respect for the status-quo. You can quote them, disagree with them, glorify, or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world – are the ones who DO ! – Apple

First Rule of Business is to Know Your Competition

You have a great idea and one of the first things you do before attempting to execute it is analyze your competition. I find it interesting that companies haven’t learned from their competitors on how to not only attract, but recruit talent. It is no secrect that iDevices have created a paradigm shift in not only how to we consume content but the way that businesses communicate with their customers and run their operations. Being a mobile, specifically iOS developer, today is like being a rockstar in the 60’s. The demand for our talents is unprecendted in a generation. Most large companies may have large budgets and 401k’s, but they still can’t fill these positions.

Let’s explore why.

Free to Choose

It’s all about choices, and we have a lot of them.

Startups

Whether or not you feel there is a “tech bubble” or not the fact remains that, as of today, the entrenpuenal environment is at its nurturing peak. Everything from bootstrapped app ideas, to city sponorsed startup accelators, crowd-sourced funded projects and finally national legislation that is incentivising those with business ideas to pursue them.

Anything West of the Mississippi

The list of top-notch, cutting edge companies that are recruiting mobile developers and engineers is too long for this article.

This doesn’t include the obvious one’s like:

  1. Apple
  2. Facebook
  3. Google
  4. Microsoft
  5. Twitter
  6. LinkedIn

But the end result is the same. You’re company sells paper products….they have cult like followings, fanboys, goats that cut the grass, lots of natural light, amazing whiteboards, free food/beverages and pool tables.

Sample of Google’s office pictures

Contract Work

Not everyone has the time, talent or resources to be, nor hire fulltime a dedicated iOS developer, but that doesn’t mean the grabbag of ideas doesn’t exist. Finding interesting contract work is as easy telling your local bartender, “Please sir…may I have another”.

Recognize the Creative Force

There is still this stereotype/assumption, that I wish would die a quick death, that developers sit in dark basements, with no windows, and a cooler full of Redbull scared to actually speak to warm-blooded human-beings. This is nothing further from the truth. Just take a look at all the different language and technology meetups, conferences and even a whole developer community movement, Appsterdamn.

We are social creatures who enjoy open dialogs, large whiteboards and gatherings of like creative minds. We don’t want large cube walls and flickering flourescent lights, rather open space with LOTS of natural light. We are not wrench turners, but a creative force that will take your abstract idea and create a beautiful product or service. All we need are the tools and atmosphere.

Sample of creative tech office pictures

Out With the Old and In With the New

So what does it take for corporate America to attract the talented, creative, engineers to work for them?

Dress

Developers are throwing away ties faster than women burned bras in the 60’s. I know it seems junvenille, but this is the standard that has been set. I can’t think of 1 company outside of corporate America that has a dress code. Suprise most of the talent is there. People should feel comfortable when they go to work. Hell, they spend most of the day there so why wouldn’t you?! If I was a VP of Finance at a bank I would wear a suit and tie. That is the appropriate attire that has been dictated by the profession and I honestly believe people should fall in line with that. The culture for developers and technology are t-shirt and jeans. Your company will probably need to fall in line with that.

Hours

More so than the dress policy, your company’s “work hour” policy needs to be evaluated and probably revised. Some developers are night owls and do their best work from 11pm to 5am. I myself, do my best work early in the morning, starting at 7:30am – 3:30pm and then from 8:30pm to 12:00pm. However, if I am on a streak of progress that carries me until the wee hours of the morning then I’m not coming in at 8am. Forcing them to come in between 8am to 5pm does nothing for your company or employee. You should allow that employee to work those hours that provide the best output. Providing this type of flexibilty allows for not only a happier employee, but more times than not, better productivity and an increase in the number of hours worked for the same salary.

Travel

Even with the best office enviornments there is nothing like a change of scenary. Especially if there is a big milestone coming up, with a tight deadline, being focused is paramount. Allowing your devs to actually be offsite to work is a huge incentive.

For example, in the next few months I plan, on my dime, working from here for 3 or 4 days. Result will be epic.

Location

I wrote a whole article on benefits and experience of working remotely. Below is my viewpoint on why most remote work policies are wrong and outdated.

I have strong opinion that, in general, as a country, managers/HR are still stuck on the notion that if they can’t see you work then you aren’t. If they let you work remotely then you will spend the entire day watching TV, drinking, playing HALO while taking the Lord’s Name in vain. The truth is that the same people who are great/productive employees on-site will have the same productivity at home and vice versa. Individuals who screw off while working from home are the same people who are wasting company time on-site. It is a personnel issue.

Source: Working Remotely – Remotely Working?

Continued Education

I don’t mean paying for a post graduate degree. Offering these are great, but traditionaly universities are waaayyyy behind in the rapid changing pace of technology, design and development. You should not just encourage and support your developers to attend meetups, drinkups and conferences, but make it MANADATORY. One weekend, evening or a 20 minute coversation over a nice old fashioned could solve problems or generate new ideas faster than you can say grand central dispatch. These types of social interactions and mini-classes can’t be understated.

Technology Stack

If you tell a potential developer candidate, especially mobile, that they are going to have to work with Microsoft, SOAP or spreadsheets on shared drives that are FTP’d to an IIS server you’ll probably be looking for a decent developer for a loooong time. While it is an undeniable, and unforatunate truth, that most large companies are powered by MS servers or SAP the medium to aggregate, format and secure this data doesn’t and shouldn’t have to be. The best solutions for data aggregation middleware is going to be Linux based servers using Python, Ruby or PHP and utilizing a more flexible datastore(s) such as Postgres, MySQL or any flavor of NoSQL. The best desktop solution isn’t Windows it is Mac. It is futile to argue otherwise. Trying to dangle a Windows branded “carrot” in front of your a potential candidate has the same effect as bring a live skunk in the room. He/she will run.

Show Off Your Problem Solving

Developers, the one’s that you want at least, love to solve problems. Just because you are power company or insurance company doesn’t mean you don’t have cool problems to solve. Whether that is improving effciency with business operations or finding a better way for customers to self service their accounts. Who would have thought working for a municipal power company would be cool? On the surface it seems like some corporate factory, but trying write software that intelligently reroutes power to customers based upon a smart grid is about as cutting edge as it can get.

Share This

Protecting intellectual property is important to every company. In most cases it is your competitive advantage, but you create a lot of attraction when a potential candidate does research on your company only to find that you have open sourced some of your functionality or a piece of software. Once again, this is part of a developer’s DNA to share ideas and promote open source.

Encourage Side Work

Isaac Newton said an object in motion will stay in motion unless acted upon by a equal or stronger force. When applying this principal to humans, and in this context developers, staying in constant motion means “more of the same” and we fall into doldrums of stagnation. Our minds, creativity and problem solving skills become extremely routine, and thus out of date compared to our collegues. As a company culture, you should encourage side work to be that equal or stronger force which keeps our creative Midi-chlorians in over-drive.

If anything, this is free R&D for most companies. It is inevitable that concepts and applicaiton of ideas discovered during this side work or free time work themselves into the tools that are used in products/services for the company.

We Write Software Not Manuals

Companies need to get rid of this obsession with paperwork, documents, etc! A few white papers, “readme” files, or web pages, to get developers started with new concepts is fine, but hundreds and hundreds of pages of documents to describe every nuance of how your software is supposed to work is ridiculous! Just write the software as soon as possible, then iterate and iterate, until you get the first release out the door. The business world thinks getting things down on paper leads to quality, but all it really does is delay the software cycle and lower the quality until the very end of the process.

Source: Stan Harris (If you are reading this you should take his advice)

Only Thing to Fear Is Fear Itself

What has been proposed above, I am pretty certain, is every corporation’s nightmare. It is a paradigm shift to existing company culture or what has been deemed “the way things are done here”. I completely respect that, but you will never execute your visions in technology and specifically mobile development. Mobile and SOA are going to be the conduits of business for the next 20 years. You can and will be successful by instituting these changes in company policy and recruitment. The reason is due to the fact that you will attracting the best and brightest men/women/young/old to create something amazing for your company.

Developers want to make great products and they want to do it in an environment that fosters innovation, creativity and know that their skillset is valued.

P.S. We do all drink Redbull

NDAs - I'm Pretty Much Done

Probably Not Signing

I won’t go as far as saying that I will never sign another NDA again, but a company or individual is really going to have to pitch me before hand that their idea is revolutionary in five minutes or less to even get me to look at a copy. My previous stance on the issue of reading and signing of NDAs was I really didn’t care. I felt as long as it didn’t prevent me from pursuing my own ideas then it didn’t have a large impact of my professional or personal pursuits. Over the past two years I have signed numerous NDAs and there has only been 1 that actually warranted it. The rest were either average app ideas, or different, not revolutionary, implementations of existing technology workflows or use cases. I am not sure were the genesis of this practice started, but I wish it would stop. Your “social media” app idea isn’t revolutionary or different than a thousand other apps currently in the AppStore or being developed at this exact moment. This doesn’t mean that your idea is bad or you shouldn’t pursue it, but I, as well as a growing number of developers, are not going to be apart of some vague, open ended legal agreement which would prevent me from choosing my own path either professionally or personally.

Intent Vs. Execution

I completely understand why NDAs exist and intellectual property should be protected, however the pattern emerging for how they are applied by every Tom, Dick and Harry startup or recent MBA grad student who has dreams of being the next “insert awesome young CEO here” has got to stop. It is being applied to use cases, mediocre intellect at best and workflow too often and for the wrong reasons. If you hand me a piece of paper right when I walk into the door to sign before any discussions have begun then the potential relationship has already gotten off the wrong foot. By signing I am legally guaranteeing you that I won’t even have a late night thought about your product with someone close-by without fear of retribution from some overzealous law firm, but yet you give me no guarantee that your app is any good or that I would have a long term and equally beneficial compensation if I were hired. At the end of the initial meeting we could part ways and never talk again, but I am still bound by your NDA. Not cool. Wrong execution.

Honesty is the Best Policy

When deciding on whether or not you should ask someone to sign an NDA you have to brutally honest with yourself about what you are trying achieve and why your idea, product or service warrants such a code of silence and secrecy. I know many potential entrepreneurs over the years who continue to talk about their great idea in vague vignettes, but have yet to be able to execute anything because their NDAs have turned into this mountainous barrier. No one in their right mind would sign them. The truth is most people who are brought on to build or market your idea aren’t interested in stealing that idea for themselves…they are interested in working with a great team on a great product.

Can you handle the truth in order to see your idea materialize?