Good News and Bad News

Filed in iDevBlogADay, iOS Development | Comments Off on Good News and Bad News |

Good news — Finding my iOS development rhythm

I have finally managed to get into a good iOS development rhythm over the last several weeks, focusing on my personal iOS projects most of Friday and Saturday, and one or two other evenings during the week. Finding my stride has helped make me much more comfortable in Xcode and the iOS frameworks, and it only takes me a few minutes at the beginning of a session to get back into the flow of iOS.

Bad news — Distractions

Unfortunately, I allowed myself to get distracted from my primary goal for more than a week of that productive time.

Reading a blog post one weekend gave me an app idea I found hard to resist. At first, I was smart. I recorded the idea and some thoughts in my development wiki, and convinced myself to leave it alone. That resolve lasted about three days before I gave in. I deluded myself into thinking I could take the “new shiny” from it’s box and only play with the idea for one evening, but one evening turned into several sessions in a row before I managed to put it back into its box.

I still think the idea has merit, but the allure has worn off enough that it won’t distract me for a bit. (Of course, there is this other idea I just had that will take the app store by storm!)

Current development challenges

My primary goal is developing my photo browser app, and I have prototyped several variations on some ideas I want to incorporate.

I developed a simple wrapper for loading groups and photos using the asset library framework that should be easily extended so I can handle multiple photo sources. I have resisted the urge to build involved hierarchies and large frameworks, and constrained myself to developing some fairly simple protocols. The very basics work now, there are only one or two more features I want to add to the base functionality that my core app needs.

I am currently experimenting with various photo browsing techniques using core animation, and so far it seems promising. This is my first serious use of core animation, so I still have a lot to learn, but @neror’s CA360 project on github has been very useful, as well as Bill Dudney’s Core Animation book published by the Prags.

In typical development fashion, each answered question generates several new questions and problems. I have enough experience to know that most of my problems are the result of limited understanding, misusing a framework somehow, or otherwise doing something stupid.

Some of my current open issues are:

Unexpected pauses in CAKeyframeAnimation

In one of my prototypes I built a single CAKeyframeAnimation animation to move an image across the screen using multiple curve path segments. It pauses slightly at the transition between segments, acting like it takes a small but noticeable amount of time to compute the next segment. I am not comfortable enough with core animation to judge whether I am misusing the framework somehow, or just doing something wrong. Hopefully I will find out this week.

EXC_BAD_ACCESS errors

This evening I encountered EXC_BAD_ACCESS errors in another prototype. I have a very simple framework to handle multi-step animations using blocks which works as expected (except for the EXC_BAD_ACCESS). The EXC_BAD_ACCESS errors occur when accessing values outside the block. I am fairly certain I am creating the blocks correctly, and using them like I have in several other prototypes. But I obviously still have an error, so decided the wisest course was to step away from the code for now and come back to it later this week.

Deciding on best method for photo streams

Several of my experiments have been to help me decide whether core animation is the correct approach for my photo streams. I’d love to let it handle that portion of my app, but I have not gotten far enough to know whether I will be able to use it the way I envision.

What’s next

I am thinking about whether it would be useful to setup a landing page to gauge interest, and if so, how far along I should be in prototyping, experimenting, and customer discovery before I do so. This is all very new to me, so I have continued reading and skimming a lot on the subject. I still need to figure out a way to connect with potential users, but for the moment that is still on the back burner to development experiments.

I am encouraged that as I work on this app, my interest and expectations for it grow. Hopefully I will be able to stay in the flow over the coming weeks and make good progress before 360iDev in Austin. I really want to have a solid core of my app working by then because I know I can get some great feedback from my fellow developers there.


As an indie developer, one of the best things you can do is to find like-minded developers that will provide encouragement and motivation while pursuing a commitment. A great collection of indie iOS developers have helped me stay on track, most of them are either developers associated with iDevBlogADay, or those I have met through the 360iDev conferences. If you can make it to Austin in November, I highly recommend it for its content, the friendships you’ll develop, and the passion it will bring to your iOS development.

Also, here is a little more information about me, Doug Sjoquist, and how I came to my current place in life. You should follow me on twitter and subscribe to my blog. Have a great day!

Today, I choose to be thankful

Filed in iDevBlogADay, iOS Development | Comments (0) |

Frustration

I felt frustrated this week: with my consulting work, with my iOS projects, with my schedule — and it showed.

Sometimes when I feel that way, I focus on the frustrations. But, “that way madness lies, let me shun that”.

Thankfulness

Today I choose to focus on what I have, on what I *can* do, on what is possible.

Today, I choose to be thankful.

Amazing tools

I am thankful that I live in a time where there is so much creative potential sitting here on my desk. It amazes me to think that I have access to literally (really!) everything I need to more than provide for my family’s needs, to pursue a career that invigorates me, to make the bold attempt to follow my dreams.

I have more information in the electronic books, documentation, and other notes sitting on my laptop right now than was available anywhere when I first started programming.

Through a chunk of electronics and plastic smaller than my thumb, I have wireless access to more useful information than I could digest in a dozen lifetimes.

Sitting on my hard drive are interpreters, editors, and compilers that would be the envy of the world during the first three decades of computing history.

And on some days, I am so nonchalant about it all that I am like a spoiled prince who views the entire kingdom as his playground and birthright.

But, today, I choose to be thankful for my tools.

Incredible community

I am thankful that I am surrounded by thousands of creative individuals who are willing to freely share what they have learned through months and years of painstaking work. Somewhere out there right now, someone is working on a tool, an article, or an application that in the coming weeks will be made public and ease my workload by an order of magnitude. And they will ask nothing in return.

This year thousands of talented individuals will share vital technical information with their competitors through books, blogs, and conferences without any direct economic return.

And on some days, I take this community of friends, peers, and experts for granted.

But, today, I choose to be thankful for the community of developers who freely share with me.

Supportive family

I am thankful for a wife who supports me even though she doesn’t grok what I do at all. When I sit and think for hours, or bury myself into my work late into the night — she understands. When I get stuck or worried, she helps me work through my frustrations. When I am just plain weird, she still loves me.

I am thankful for four grown children who accept the geekiness of their dad, who show interest in those arcane details I sometimes bring to the dinner table, and who bring me more joy than they know.

And on some days, I assume that they will always be there for me.

But, today, I choose to be thankful for my family.

Loving God

I am thankful for a God who loves me unconditionally, and has created this wonderful world to explore.

It is a privilege to dive into the myriad details of this world and realize that every question that gets answered opens up dozens more. The depth and intricacy of life, the universe, and everything reminds me of how great He is, and how much I still have to learn.

And on some days, I selfishly acknowledge no one outside my own mind.

But, today, I choose to be thankful for my creator.

Think on these things

When you get frustrated by thorny technical problems, by difficult coworkers, or even personal struggles, I encourage you to make your own list of good things, and to think on those things.

You might be surprised how much good it will do you.


As an indie developer, one of the best things you can do is to find like-minded developers that will provide encouragement and motivation while pursuing a commitment. A great collection of indie iOS developers have helped me stay on track, most of them are either developers associated with iDevBlogADay, or those I have met through the 360iDev conferences. If you can make it to Austin in November, I highly recommend it for its content, the friendships you’ll develop, and the passion it will bring to your iOS development.

Also, here is a little more information about me, Doug Sjoquist, and how I came to my current place in life. You should follow me on twitter and subscribe to my blog. Have a great day!

iOS Asset Library photo browsing experiments

Filed in iDevBlogADay, iOS Development | Comments (0) |

My photo browsing work has gone in fits and starts over the last two weeks, but I have made some progress through experimentation. Since upgrading to an iPhone 4, and the subsequent announced availability of iOS 4.2 on the iPad, I can now use the Asset Library framework in my prototypes. I want to use other photo sources eventually, but my first version will use the photo albums available on the device.

Experiments with Asset Library lead to experimenting with blocks and Grand Central Dispatch

One of features I want in my app is a photo stream that moves automatically across the device in some fashion, but still allows the user to control the pace. The first step was to build a simple prototype that browsed through the photo albums currently synced to the device.

The Asset Library framework is fairly small and handles all access to on device photos, videos, and the associated albums. Each photo or video is an “asset” in the library. The entry point is through the enumerateGroupsWithTypes:usingBlock:failureBlock: method in the ALAssetLibrary class. As you can tell by the method name, this method makes use of blocks to accomplish its work.

Objective-C blocks are very clean and crisp, taking care of otherwise messy implementation details such as automatically retaining and releasing objects referenced by the block. The syntax for the simplest executable block is:

^{}

which obviously doesn’t do very much, but clearly is not encumbered by extra baggage. A block is a closure that captures the state of any references external to the block and maintains them during the life of the block. Many languages and environments offer closures, and if you come from the Java world like I do, they are a welcome relief from the not-quite-good-enough nature of anonymous inner classes. It is very nice to be able to work with them in iOS.

Another feature of the latest versions of iOS that comes in handy with browsing the photo albums is Grand Central Dispatch (GCD). GCD was introduced to OS X in Snow Leopard, and to iOS in version 4.0. Many of the tasks that used to require creating separate threads can now be handled much easier and cleaner with GCD and blocks.

Here is one method from a very simple example that loads all the asset references on my phone into a mutable array ‘assets’ in the background while updating a simple status label on the main thread with the current asset count:

- (void) updateCount {
    self.statusLabel.text = [NSString stringWithFormat:@"Count: %u", [assets count]];;
}

- (void) loadLibrary {
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue, ^{
        void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {
            if(asset != NULL) {
                [assets addObject:asset];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self updateCount];
                });
            }
        };

        void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
            if(group != nil) {
                dispatch_async(queue, ^{
                    [group enumerateAssetsUsingBlock:assetEnumerator];
                });
            }
        };

        [library enumerateGroupsWithTypes:ALAssetsGroupAll
                               usingBlock:assetGroupEnumerator
                             failureBlock: ^(NSError *error) {
                                 NSLog(@"failure");
                             }];
    });
}

I do not completely understand all the interactions between GCD queue, the main thread, and the asset library enumeration. There is not a lot of information in Apple’s documentation about exactly what is going on, but it appears that each enumeration happens on the main thread, even if the caller is run from an asynchronous queue which is *not* on the main thread.

To ensure the loading does not tie up the main thread, and thus prevent GUI updates, I enclosed the call to “group enumerateAssetsUsingBlock…” in a block (lines 20-22) and put that block on the default queue to be run in the background as well. This particular pattern will load each asset in the background, but update the status label in the main thread properly.

Lines 12-14 illustrate the GCD method of running code on the main thread. It looks cleaner to me than calling performSelectorOnMainThread, and is certainly more flexible since it can include any code you wish.

Feedback from non-techies

In addition to experimenting with several different ideas and prototypes based on the Asset Library, I also was able to show a simple photo stream demo to an avid iPad user (my daughter!) while we were visiting my grandson last week. I think I conveyed my ideas fairly well to her, and although she doesn’t yet have an iPad (but wants one), nor does she yet have multiple thousands of photos, she is quickly heading that way. She is also the one who did much of the scanning and sorting a few years ago, so she has an idea of the pain point I am trying to address. She thought it a reasonable approach and as I turn my simplistic prototypes into a more complete app, I hope to get more detailed feedback from her and others.

360iDev Austin, November 7-10th

I finally sorted through my schedule for the fall and registered for 360iDev in Austin this November. If you are like me, and receive most of your iOS encouragement and growth virtually through the internet, you need to attend. I am as much a lone wolf as any developer out there, but the motivation and encouragement I receive from the iOS community through 360iDev keeps me coming back.

I am really looking forward to visiting with old friends and fellow iOS developers, to participate in the game jam, to learning more about iOS development and techniques for building an indie software business, and to being encouraged and motivated in my iOS development. You should register too!


As an indie developer, one of the best things you can do is to find like-minded developers that will provide encouragement and motivation while pursuing a commitment. A great collection of indie iOS developers have helped me stay on track, most of them are either developers associated with iDevBlogADay, or those I have met through the 360iDev conferences. If you can make it to Austin in November, I highly recommend it for its content, the friendships you’ll develop, and the passion it will bring to your iOS development.

Also, here is a little more information about me, Doug Sjoquist, and how I came to my current place in life. You should follow me on twitter and subscribe to my blog. Have a great day!

Useful podcasts for Indie iOS Developers

Filed in iDevBlogADay, iOS Development | Comments (0) |

Since it is time consuming to sort through all the resources on the internet and find useful stuff, I decided to share which podcasts I find useful as an indie for today’s iDevBlogADay post. (I have made progress on my iPad photo app, and hope to report on it next week.)

I do not have a fixed podcast listening schedule, but I eventually listen to almost every episode of the first five on my list. I only listen to selected episodes of the last three, partly because there are so many episodes. I usually listen to podcasts while working around the house or running errands since I prefer silence or music to help me focus while I work.  When I listen, these are my current selections and priorities:

  1. MDN Show
  2. Startups For the Rest of Us
  3. Dim Sum Thinking
  4. Core Intuition
  5. IRQ Conflict
  6. The Startup Success Podcast
  7. Small Business Marketing Blog from Duct Tape Marketing
  8. Mixergy

#1 MDN Show

At the top of my list is the Mac Developer Network show. It is hosted by Scotty (Steve Scott), @macdevnet and John Fox, @djembe.  The MDN show comes out roughly twice a month and each show is around 90 minutes long. It is a magazine format with a mix of regular segments, discussion of events in the Mac or iOS world, and developer interviews.

I enjoy the variety of segments and the community that Scotty has developed around MDN. The show is currently on summer break, but should be returning shortly — I look forward to the next episode.

From the MDN web site:

The Mac Developer Network Show (The MDN Show) is a one stop show for Mac, iPhone and iPad Software Developers. Enfolding, embracing and including some classic Mac developer podcasts such as Late Night Cocoa, The Mac Developer Roundtable, The Mac Software Business Podcast, Developer Lives and CocoaFusion as well as adding features such as news, views, reviews and the now infamous World According Gemmell in an easy to listen to magazine style format.

#2 Startups For the Rest of Us

This has become one of my favorite podcasts for advice and tips on indie based business. It is hosted by Mike Taber, @singlefounder, and Rob Walling, @robwalling, both of whom have solid backgrounds in micro-ISV businesses.

The focus is not platform specific, but each show has clear advice that you can easily adapt to your iOS based business. I do not keep most podcasts I listen to, but I have kept a number of their shows, including:

  • Episode 4, 8 Things We Wish We Knew When We Started Out
  • Episode 6, How to Get Traffic to Your Site
  • Episode 9, Our Biggest Startup Mistakes
  • Episode 11, The Five Biggest Hurdles to Getting Started

If you find any of the shows worthwhile, I would suggest start back with episode 1, and follow through to the present.

From Startups for the Rest of Us web site:

Welcome to Startups for the Rest of Us, the podcast that helps developers be awesome at launching software products. Whether you’ve built your first product or are just thinking about it. We are Mike Taber and Rob Walling. Combined we have over 20 years of experience as software entrepreneurs and we’re here to share those experiences to help you avoid the mistakes we’ve made.

#3 Dim Sum Thinking

This is a new podcast by Daniel Steinberg, @dimsumthinking. Each weekly show is relatively short and focused on a single topic related to professional and personal development told in a unique way.

I have really enjoyed Daniel’s story telling approach, and I look forward to new episodes.

From Daniel’s About page:

Apple gives third party developers the same advice. So many iPhone developers want to open up the development tools and start writing code. Apple’s advice is that you stop and identify carefully who your audience is and what problem they will be able to solve or task they will be able to accomplish with your app. Spend time prototyping your app on paper and really working on the human interaction before you write a line of code. Identify the audience and the story and story board your app just as someone might sketch out scenes in an animated feature.

#4 Core Intuition

Core Intuition is primarily a discussion between the hosts about a wide range of topics pertinent to developing for the Mac. It ranges from technical discussions of new Apple frameworks to conferences to handling user support to marketing your software. It is hosted by Daniel Jalkut, @danielpunkass, and Manton Reece, @manton.

I like the variety of the discussions, and even though not every show has something directly applicable to my day to day work, it helps give me a broader perspective on developing a software based business.

From Core Intuition’s web site:

Core Intuition is a podcast about the process and life of Mac development.

#5 IRQ Conflict

IRQ Conflict is a short podcast which began earlier this year and comes out roughly twice a month. The format is similar to the old “Siskel and Ebert” movie reviews where the two hosts, one a Microsoft developer, and the other a Mac developer, react to a series of tech items in the news. It is hosted by Justin Williams, @justin, and Mikel Berger, @mikelberger.

Living in an iOS world (and in my case an iOS and Java world), I can easily lose touch with the perspective outside those worlds. This short podcast is entertaining, and occasionally provides a perspective I might not have considered.

From IRQ Conflict’s web site:

Apple Developer. Microsoft Developer. FIGHT!

Debates about the 5 top tech stories from the past few weeks. All in about 10 minutes.

#6 The Startup Success Podcast

The Startup Success Podcast interviews someone different each week ranging from consumer startups using technology to enhance their core business to technical startups that sell software or services. It is hosted by Bob Walsh, @bobwalsh, and Patrick Foley, @patrickfoley.

I have been listening to the Startup Success Podcast longer than any other business oriented podcast, and even though I don’t listen to every show, I listen to most and usually benefit from the interviews.

From the Startup Podcast web site:

The mission of The Startup Success Podcast is simple: make microISVs, startups, Mac indies and everyone pursuing the dream, challenge and reality of starting their own software company more successful. Each week, we hope to bring you about 20 minutes of valuable information on the business, technical and social developments, tools and trends that will give you an assist in your startup.

#7 Small Business Marketing Blog from Duct Tape Marketing

Duct Tape Markerting is not a tech focused podcast by any means, but there is enough variety that you will find useful information here. It is hosted by John Jantsch, @ducttape.

I do not listen to every show but the content and interviewees in this bi-weekly podcast are diverse enough that I usually listen in full to an episode every month or so.

From the Duct Tape Marketing web site:

His blog was chosen as a Forbes favorite for marketing and small business and his podcast, a top ten marketing show on iTunes, was called a “must listen” by Fast Company magazine…His practical take on small business is often cited as a resource in publications such as the Wall St. Journal, New York Times, and CNNMoney.
“John Jantsch is the Peter Drucker of small business marketing tactics.” — Seth Godin, author of Linchpin
“Business blogger John Jantsch, a Kansas City marketing consultant, has built quite a following with his Duct Tape Marketing site. The blog provides small-business readers with successful marketing techniques that don’t require a large budget to execute.” — Harvard Business School

#8 Mixergy

Mixergy is really a video interview show, but I subscribe to the audio podcasts. There are far more shows than I could watch or listen to, even if they applied (multiple hour long shows per week), but I do subscribe to the feed to keep an eye out for interesting interviews. It is hosted by Andrew Warner, @AndrewWarner.

Many of the interviews do not appeal to me, but there is usually one or two a month that I really find useful or captivating. I have kept a couple of Mixergy interviews, including:

  • How Shopify Became Profitable By Helping Anyone Open An Online Boutique with Tobias Lütke
  • DODOcase: How An iPad Case Generated Almost $1 Mil In Revenue Within 3 Months with Patrick Buckley

From Mixergy’s web site:

The Mixergy Mission

The Mixergy Mission is to introduce you to doers and thinkers whose ideas and stories are so powerful that just hearing them will change you.

The Mixergy Mission is to give you an alternative to the “know-it-all, professional gurus.” I want to convince you that no single person knows it all. I want to show you that the best way to grow is to learn from a mix of smart people who are willing to share their expertise and experiences.

The Mixergy Mission is to infect you with a passion for business and then help you build your business.

The Mixergy Mission is to encourage YOU to have a mission, not just a startup, not just a company, but a calling.

The Mixergy Mission is to act as a counter-weight to all the venture capitalists who’ll try to convince you that the only reason to build a business today is so you can flip it tomorrow. The world isn’t changed by people who have an eye on the exit.

The Mixergy Mission is to convince you to follow a vision so big and important that you can’t do it alone. Then I want to give you a mix of wicked-smart people who will help you achieve it.

The Mixergy Mission is too big for me to achieve alone. If what I’m describing here calls to you, jump in and join me.


As an indie developer, one of the best things you can do is to find like-minded developers that will provide encouragement and motivation while pursuing a commitment. A great collection of indie iOS developers have helped me stay on track, most of them are either developers associated with iDevBlogADay, or those I have met through the 360iDev conferences. If you can make it to Austin in November, I highly recommend it for its content, the friendships you’ll develop, and the passion it will bring to your iOS development.

Also, here is a little more information about me, Doug Sjoquist, and how I came to my current place in life. You should follow me on twitter and subscribe to my blog. Have a great day!

A problem to solve

Filed in iOS Development | Comments (0) |

Finding the pain

Old Slides and PhotosI have a confession to make. I take a ton of photos.

From 1982 when I got married until about 1999 I took thousands of slides and prints (I have four children and dozens of extended family members.) Since 1999 I have been completely digital and taken thousands more. Most of our slides and prints are now scanned and I have over 15,000 digital photos — all synced to my iPad which has become a very fun family photo album.

In the last five years I have built a dozen slideshows for open houses, graduations, weddings, and anniversaries. Each of those slideshows turned out well, but required many hours of work. Scanning physical photos is a very labor intensive task, but fortunately I am close to 90% complete in that task.

I have tried many different photo organization methods over the years, but currently have a very simple method: I keep a separate folder for every slide tray, every print album, and every month of digital photos.

But, something that still takes much more time than I would like is finding the photos I want to include in a given slideshow.

I plan to build something to ease that pain point.

Past attempts to ease the pain

My first “major” slideshow was for my oldest daughter’s high school graduation and open house. We homeschooled our children, so this was a very personal and exciting time for us, and I wanted it to be special.

During that year I purchased a slide scanner, and she scanned in all our slides (from her birth in 1987 until my Pentax SuperME died in 1997), and select photos from the albums between my slides and digital camera era. By the time she was finished, we had over 10,000 photos to search through to produce the slideshow — a bit overwhelming.

I don’t remember exactly what software I tried during that time, but I know I looked at dozens and tried most of them at least a little. I do know that I could not find anything very useful for selecting the photos I wanted — so I did what any good hacker does, I rolled my own.

Through several iterations, I ended up with a simple Delphi application (once my favorite development environment!) that would allow her to quickly browse all those photos and identify all the ones where she appeared. It worked pretty well given it’s limitations, but by judicious use of workarounds and copying of directories, it helped us narrow the 10,000+ photos to around 3,000 that had her in them. We then used the same application to select out a subset of those 3,000 to produce a set of photos we wanted to use in the slideshow. I used slightly enhanced versions of that application and other simple methods for my oldest son’s graduation in 2007, second son in 2008, and youngest daughter in 2010.

For other slideshows I have used simple methods such as general file browsing using my MBP and copying the photos I wanted to a new directory. Not terribly difficult, but pretty time consuming.

What I really want

Until Google or someone develops image searching as good as the text web crawling available today, I do not think any completely automated method of finding photos will ever satisfy me. I would love to tag all my photos with names, events, places, etc., but even if facial recognition improves a great deal, doing so will remain an intensively manual process.

Now that I have an iPad with a copy of all my photos, it is amazing how quickly I can flow through photos and find individual photos I had forgotten about. I want to take that ease of browsing on my iPad and apply it to quickly select a set of photos that can then be turned into a slideshow.

My App idea

My target customer is someone who has thousands of digital photos, probably only loosely organized, and wants to select a subset of those photos for a slideshow or other display.

The initial requirements for my iPad app are:

  • create a project that will hold the state and can be edited later,
  • select photos from iPad albums,
  • attach a playlist,
  • play slideshow on iPad or through video out.

Current status

Initial MockupI first started mocking up something like this at the iPadDevCamp in San Jose last April. The purpose of iPadDevCamp was to show what could be done within the constraints of the existing platform, but since iOS 3.x does not allow access to to photo albums on the device, I shelved the idea. It has now been announced that iOS 4.2 will be available on the iPad, so my idea is viable again.

During iPadDevCamp, I came up with some screen ideas using iMockups that are my starting point this week. I shared those ideas with other developers there and received useful advice, and will take that into consideration as I develop some prototypes. I have talked with some local iPhone users about my idea, but not in detail, and none of them are iPad owners.

This week I began exploring the AssetsLibrary framework in the iPhone simulator, but will have to wait for a 4.2 beta SDK before I can play with the iPad simulator or device. Since I will need some photo sources in the meantime, I spent some time experimenting with other options, and decided to start with a simple ftp based photo loader for now.

What’s next

It is vital to find potential customers early so I can validate my ideas, but that will definitely be a challenge for me. I am reading through Steve Blank‘s book “The Four Steps to the Epiphany”, about his customer development process and even though it is probably geared towards multiple developer startups, it has given me some insight into how to begin.

Once I have a simple photo loader to simulate photo album access, I will begin prototyping various ideas. I have learned to treat my prototypes as disposable code so I can move quickly, hopefully I will stick to that.

My task list for this next week:

  • Prototype methods for quickly browsing a set of photos,
  • Begin building a customer development plan,
  • Find at least one local iPad user with a decent collection of photos.

Mini-review of Sun Scout app

Filed in Miscellaneous | Comments (0) |

I finally gave in and upgraded my phone (iPhone 3G) and my wife’s phone (older RAZR) to iPhone 4’s this week. Since I had skipped the 3GS, this was my first extended experience with all the new cool stuff like compass and video, and now with the iPhone 4 the gyroscope and retina display. (I am definitely enjoying the upgrade, but I did find out something about my wife that I did not know: her normal method of holding her phone is the dreaded “iPhone death grip.”)

I wanted to try out an app that took advantage of some of the new features and found Sun Scout by fellow indie developer, Benjohn Barnes of Splendid Things. SunScout’s website says:

Sun Scout shows you live what your phone’s camera sees, but augments the image with where the sun will be at each hour of the day. To see everything that might cast a shadow on you, simply sweep your phone across the sky from dawn to dusk.

and Benjohn also has a video tutorial on calibrating your iPhone compass so that SunScout works best.

Track of sun across the sky at hourly intervals, large arrow points the way to current sun track
SunScout is an augmented reality app with a clear, single purpose: Show me where the sun will be based on my current position. Once I calibrated my compass, I checked the image for 18:00 (my current time) and it was within a few degrees of the actual position of the sun. So SunScout fulfills it’s basic mission just fine. The sun track is displayed for each hour which seems to be enough information to be useful without overcrowding the image.

In cases where you cannot currently see the sun because it’s night, heavily overcast, or you live in the UK like Benjohn where it only comes out once in awhile, he has added a large yellow arrow that directs you back towards the sun’s arc for the day.

Like many iPhone users, I download and try quite a few apps that I delete shortly thereafter. But, this simple app is interesting and useful enough that it stays.

Putting more focus in my focus

Filed in iDevBlogADay, iOS Development | Comments (0) |

Time to focus!


Your focus needs more focus

Recently my wife and I saw the Karate Kid remake at the second-run theater (yes, I’m a cheap date), and the “your focus needs more focus” scene grabbed my attention. It prodded me to clarify where I am on my iOS development path.

One of the few drawbacks to being an indie developer is finding ways to make and keep myself accountable to someone. I made a commitment to make iOS development a major component of my work, and I am pleased with my progress. I am proficient in key areas; knowledgeable and growing in others; and am actively doing iOS contract work. But, I still have not published one of my own apps on the App Store. I could come up with a long list of reasons, but I don’t want to feed those thoughts.

Instead, I want to put some more focus in my iOS focus, so I will be using my iDevBlogADay posts as a method of accountability.

My options

I have sketched out dozens of app ideas both on paper and in iMockups. I have prototyped or brainstormed dozens of game mechanics and themes. I have downloaded dozens of apps and games looking for inspiration. One thing I know for sure: I no longer need more ideas, I need to choose.

In evaluating my current development skills and knowledge, I am:

  • very strong in overall development and design,
  • getting pretty good in iOS development,
  • not far past the novice stage in game design.

So, I believe my best option is to refine one of my non-game ideas, develop it into a viable app, polish until it shines, and release. I am not giving up on my game ideas, but my shortest path to a polished app in the store does not lie that way.

My plan

Early and continual engagement with real users is important, so an on-going task will be to involve a variety of other people. I hope to get at least one new person involved each week, as well as building on previous contacts throughout the process to:

  • solicit feedback on my ideas, sketches, and mockups,
  • watch new and old users try out the app with limited instruction,
  • ask what features are missing, and what ones should be dropped,
  • do usability testing.

I will keep each development iteration short to keep momentum and see regular bits of progress. I will not be able to devote myself full time to the project, so I need to do things that will keep me passionate about it.

To that end, by next week’s post, I will have:

  • chosen an initial app idea,
  • developed a clear focus for the first version,
  • produced one or two mockups to share,
  • built a description of my target customers,
  • discussed my idea with at least two people that fit that description.

Defeating the “Squirrel Factor”

I plan on posting each week on my progress, and hope for some feedback from others from time to time.

So, if you see me chasing after squirrels, I’d be thankful if you follow me on twitter and give me a tweet slap, or post comments demanding some progress so I don’t end up like Dug from Up!

Squirrel!


As an indie developer, one of the best things you can do is to find like-minded developers that will provide encouragement and motivation while pursuing a commitment. A great collection of indie iOS developers have helped me stay on track, most of them are either developers associated with iDevBlogADay, or those I have met through the 360iDev conferences. If you can make it to Austin in November, I highly recommend it for it’s content, the friendships you’ll develop, and the passion it will bring to your iOS development.

Also, here is a little more information about me, Doug Sjoquist, and how I came to my current place in life. You should follow me on twitter and subscribe to my blog. Have a great day!

Commitment: "This may sound too simple…"

Filed in 360iDev, iDevBlogADay, iOS Development, Miscellaneous | Comments (0) |

One of my favorite quotes1 is from a book by Scottish mountain climber, W.H. Murray:2

‘But when I said that nothing had been done I erred in one important matter. We had definitely committed ourselves and were halfway out of our ruts. We had put down our passage money–booked a sailing to Bombay. This may sound too simple, but is great in consequence. Until one is committed, there is hesitancy, the chance to draw back, always ineffectiveness.3 Concerning all acts of initiative (and creation), there is one elementary truth the ignorance of which kills countless ideas and splendid plans: that the moment one definitely commits oneself, the providence moves too. A whole stream of events issues from the decision, raising in one’s favor all manner of unforeseen incidents, meetings and material assistance, which no man could have dreamt would have come his way. I learned a deep respect for one of Goethe’s couplets:

Whatever you can do or dream you can, begin it.
Boldness has genius, power and magic in it!’

Commitment is making a decision, then making choices that support that decision.

A personal example:

I made a commitment to my wife to have a healthy marriage for the rest of our lives. That means I will choose to do some things because they bring us together, and that I will forgo some things that I might want but are likely to push us apart. That also means I am very careful to reserve physical and emotional intimacy for her alone.

A professional example:

I made a commitment to make iOS development a major component of my work. That means even though I have many interests, I choose to spend much of my creative time growing as an iOS developer, keeping up with topics that advance that goal, and avoiding too much dabbling with cool things that do not.

Make a commitment you can keep

I believe there is a purpose to my life, and I have life goals built on that purpose. By having some fairly clear life goals, I can make better decisions about which commitments to make. If you don’t have any idea what you want from life, even short-term, then you will be hard pressed to make commitments that you can keep.

When you make a new commitment, it must compete with your existing commitments for time or money. If there is not enough to do it all, you will have to decide between them. The harder you work to convince yourself that you *can* do it all, the more likely that you are only deceiving yourself. Worthwhile endeavors should stretch you, but sometimes that means making the hard decision to drop something else.

Sometimes the conflict is more basic and a new commitment is at cross purposes to your other goals. If you try to do it anyway, you will pile up stress along an underground fault in your psyche. Eventually, something will trigger a quake, and your goals or your commitment will break, leaving you disheartened.

The answer to all of these conflicts is straightforward:

You need to choose–it is that simple.

But “simple” does not imply “easy”. If you are having difficulty choosing, enlist the help of those with experience and wisdom who know you well and care about you.

Once you make a commitment that is consistent with your other goals, you must weave it into the fabric of your life.

  • You will need to be deliberate about creating new habits that reinforce that commitment and breaking habits that deter from it.
  • If you are doing this alone, find others who will hold you accountable or check on your progress fairly regularly (I use Twitter for this).
  • Devote some of your most productive and clear-thinking time towards thinking, designing, and developing your project.
  • Be willing to sacrifice short-term comfort to achieve something that will last.
  • Take concrete steps to renew your vision when your passion wanes.
  • If constant comfort or instant gratification is your life goal, then almost any commitment you might want to make will be in conflict with it.

One last piece of advice. Do not become so focused on your project that you let your personal relationships break down, for people are far more important than things.


As an Indie, one of the best things you can do to find like-minded developers that will provide encouragement and motivation while pursuing a commitment. A great collection of indie iOS developers have helped me stay on track, most of them are either developers associated with iDevBlogADay, or those I have met through the 360iDev conferences. If you can make it to Austin in November, I highly recommend it for it’s content, the friendships you’ll develop, and the passion it will bring to your iOS development.

Also, here is a little more information about me, Doug Sjoquist, and how I came to my current place in life. You should follow me on twitter and subscribe to my blog. Have a great day!


1. Over the years, this quote has incorrectly been attributed to Goethe.
2. When you consider Murray’s life and the circumstances under which he wrote his book, this passage reveals much about the man’s character.
3. Emphasis mine.

My iOS development logjam is breaking up!

Filed in iOS Development | Comments (0) |

Success!

I made excellent progress last week in breaking my iOS development block. I started with nothing but a simple game mechanic to explore, and turned it into a very simple, semi-playable game that I think has great potential. Most days with my client were very full, but it was productive and low-stress work, so fortunately I still had some energy left to get some iOS work done.

My Week

After checking into my hotel early Sunday afternoon, I was able to spend several hours setting up an empty game template project by starting with Ray Wenderlich’s Cocos2D example game, Tom the Turret and stripping out everything but the overall structure. I ended the evening with a bare-bones loading screen, start menu, and game scene to build on the rest of the week. Once I had the mostly empty game “running”, I setup a local git repository to protect me from myself.

I had a couple of hours available Monday evening, and did some more code cleanup and made some simple additions, but I had nothing that resembled gameplay. Tuesday through Thursday were very full days, but I did manage to add some basic game actors and the beginning of some gameplay those evenings.

Trips to this client normally end by noon on Friday so I can manage to get home by late that night. Often, the week has been long and exhausting and the only I thing I have energy for is a nap. But, since I had made it my goal to have something playable by the time I returned home, I was motivated to open my laptop on the first flight and implement some cleaner game play. During my two hour layover in Minneapolis, I made very visible progress and “almost” had a simple game working before boarding my second flight. But, it was getting pretty late, and the plane was really too small for my 17″ MBP, so I called it a night.

Saturday and a self-granted extension

I had not reached my goal of having a playable by the time I returned home, but I was motivated enough to spend Saturday afternoon and evening to get it to the point where I could show it to my family to get their opinions. I spent a few of those hours trying different combinations of game parameters and made notes about what to explore next.

Overall, I am very satisfied with what I accomplished last week. I believe I finally have a game idea that I can get polished enough soon enough in my current time constraints. I still think several other of my ideas have great potential, but they seem to be involved enough that progress stalls before I reach critical mass.

Underlying causes for my “success”

The fundamental reason I feel successful was because of my limited scope. I managed to beat back the scope creep each time I sat down and stuck with my original thought.

Also, these factors were great multipliers:

  • Cocos2D and it’s various example projects
  • I had dedicated time to jump start the project
  • I have had enough experience with tools and frameworks to make steady progress
  • I have played with enough game mechanics, ideas, and examples that I have some good code samples to pull from

What’s next

I have enough work commitments and family time scheduled the next two weeks that I do not anticipate any real progress–but I’m far enough along that I do not think I will be hit with iOS development block anytime soon. Once my kids head back to college in two weeks, I will be highly motivated to dive back in.

Watch for progress reports here!

Breaking my iOS development logjam

Filed in iOS Development | Comments (0) |

Like most iOS developers that have client work or a job that is not primarily iOS related, my iOS development goes in spurts. I finished a iOS project for a client in June, since then it has come to a standstill because of family time and work commitments. But, this week I am working on-site at a client, so while I am away from home I plan to use my evenings to break my logjam. Shortly after returning home, all my kids will be back off to college, and I will have more time available to spend on iOS work, so hopefully I will be able to keep some momentum.

My first task was to pick something from my list of game ideas that has a small enough scope that I can have a playable game by the time I return home Friday.

I believe my best chance of getting something playable that is reasonably fun is to use a game mechanic I tried during the last 360iDev GameJam, but chose not to follow up. I have some working code to use as an example, and with some modifications I think there is potential for it to be fun. The graphics and sound will initially be very simple since they can chew up a lot of my time and leave me with yet another unfinished idea.

Since I had to take a morning flight, I still have several hours of design and development time available today, and I hope to have a few hours available most evenings this week without shortchanging my client work.

Off to XCode!