We're hiring!

We're actively seeking designers and developers for all three of our locations.

For Product Demos and Lightweight Usability Testing on Mobile, Give Ziggi-HD a Try

Due to the form factor and software constraints of personal devices such as phones and tablets, giving demos and observing user testing on platforms other than desktop and laptop computers has historically been complicated. Crowding around the device so that everyone can see is awkward, resulting in uncomfortable demos and self-conscious user testers.

Recently, my colleague and I wanted to perform a lightweight usability test on a mobile web app. We were interested in gauging users’ ability to perform an end-to-end workflow within the application, as well as identifying any particular pain points that could be mitigated. We took an afternoon and tested with 6 volunteers, and we used our new Ziggi HD USB Camera as a way to comfortably observe while the user completed the test. It worked great! Read More »

Posted in UX/Design Tools | Leave a comment

Backbone Event Best Practices

When our Backbone.js apps become complicated, we need to utilize Backbone’s EventAggregator. From the Marionette docs: “An event aggregator is an application level pub/sub mechanism that allows various pieces of an otherwise segmented and disconnected system to communicate with each other.”

// Three ways of creating an event bus in backbone
var marionetteVent = new Marionette.EventAggregator();
var backboneVent   = new Backbone.Wreqr.EventAggregator();
var vent           = _.extend({object}, Backbone.Events);

1. Make sure you need it.

It’s harder to follow the execution of an event-based program than of regular synchronous method calls, so make sure you understand why you need an event in the first place. It’s worthwhile to ask: if events weren’t available, what would I have to do to solve this problem? Read More »

Posted in Platforms & Languages | Leave a comment

Pro Tip: Anticipate Your Customers’ Needs

anticipate-needs

Over the years, I have learned and observed others at Atomic Object anticipating the needs of a customer to ensure that, if an issue does arise at a future date, we can react quickly and minimize any complications. Taking the time to anticipate future needs and putting yourself in a position act on them shows that you give a shit and have the customer’s best interest in mind.

Here are a few needs I think are important to try and anticipate. Read More »

Posted in Business Practices | Tagged | Leave a comment

When Not to Build Custom Software

Defer

Sometimes you shouldn’t spend resources on a custom software application. And sometimes, you should realize that you aren’t ready to create a software product.

Atomic Object gets hundreds of inquiries every year from people interested in engaging us to build a custom software application or product. Our ultimate goal is help our clients succeed in their business. That means we occasionally recommend deferring custom software, reducing the scope of custom software, or not building custom software at all. Read More »

Posted in Planning Your Project | Leave a comment

Easy Asynchronous Operations in iOS with ReactiveCocoa

chain2

Dealing with asynchronous operations is a common problem in mobile development. To keep our app’s user interface as fast and responsive as possible, we need to offload network requests, resource loading (e.g., images), bluetooth operations, and file I/O onto a background thread.

Calling one asynchronous routine and responding to its result is a relatively simple matter, but what happens when several different asynchronous operations must be executed in some set order (serialized)? Apple has built in support for queuing asynchronous operations with NSOperationQueue and Grand Central Dispatch, but there’s another solution: using a functional reactive approach with Reactive Cocoa. Read More »

Posted in iOS / OS X | Tagged , , , | Leave a comment

Git-SVN Gotcha with Empty Directories

This short post is intended to serve as a warning about a potential gotcha with git-svn, and how to prevent it.

An Anecdote

First, a sort of “postmortem” of my run-in with this issue:

I was working to migrate an old SVN repository full of documents to Git. We had decided that we didn’t need to maintain a complete history going forward, that we would just take what was currently there and put it in a new Git repository. We would keep the old SVN repository around for reference in case we ever did need to go back through that older history. We wanted to preserve the old history in SVN, but make a clean break from it for a fresh start with a new Git repo.

I used SVN to check out a fresh copy of the repo, removed .svn, turned the directory into a Git repo, and pushed it out to the new remote. All good there. Read More »

Posted in Developer Tools | Tagged , | Leave a comment

Follow the Data

One of the exploratory testing techniques I use is a ‘Follow The Data’ tour. For this test I follow a piece of data through the system from where it’s first introduced to where it’s stored, wherever it’s used, and where it’s displayed.

As well as checking that the data is actually used (there are times when input that is carefully validated is never actually used by the system) this technique can also lead to further test ideas.

Printing Problems

If you find that the data is printed out, this can give you a test about whether non-printable characters can form part of the data. And if so, what happens to them? How long can the data be? What happens to the printout when the maximum length of data is used? will it wrap or print off the page or obscure other parts of the printout? Read More »

Posted in Exploratory Testing | Leave a comment

Customers – Out of Sight, But Still in Mind

remote-meeting

A lot of discussion seems to happen around whether pair programming is good or how to do it pragmatically. Ditto on unit testing, and especially test driven development. Oddly enough, I don’t hear nearly as much conversation about the customer role and the common Agile strategy of having an “on-site customer.” Read More »

Posted in Project & Team Management | Tagged | Leave a comment

Floating Point Numbers & Currency Rounding Errors

A reminder to those who learned this lesson long ago, and a warning to those that have not learned it for themselves: Don’t use floating point numbers for money.

When doing any kind of calculation with currency, accuracy is extremely important. And floating point numbers (floats and doubles) don’t have an accurate enough representation to prevent rounding errors from accumulating when doing arithmetic with monetary values.

An excellent StackOverflow response that explains the issue states:

Representing money as a double or float will probably look good at first as the software rounds off the tiny errors, but as you perform more additions, subtractions, multiplications and divisions on inexact numbers, you’ll lose more and more precision as the errors add up. This makes floats and doubles inadequate for dealing with money, where perfect accuracy for multiples of base 10 powers is required.

Ways it Can Go Wrong

When it comes to dealing with money in a computer program, a developer needs to stay ever-vigilant. Just because you, or a previous developer, made the right call by using a DECIMAL column when creating the database schema, doesn’t mean that accuracy can’t be lost before the result of some calculation is displayed to an end user. It’s all too easy to slip up and lose the necessary accuracy without even realizing it. Read More »

Posted in Development Techniques | Tagged , | Leave a comment

Haskell SDL Bindings on Windows

I recently wanted to get the Haskell SDK bindings running on windows. It was a bit trickier than I thought it would be — mostly due to a terrible macro SDL used to redefine the main() function. I used the SDL 1.2 bindings as they’re a little more mature than the SDL 2 bindings, which are pretty much brand new. Here is how I got things working:

1. Install the Haskell Platform

Download and run the installer from the Haskell website.

2. Get the msys Base Environment

Download mingw-get-setup.exe from the MinGW website and run it. You should only have to select the msys-base meta-package (which will install several other packages). Then from the menu, select “Installation” -> “Apply Changes” and press the “Apply” button to download and install. Once the changes are applied, you can close the installer. Read More »

Posted in Functional Programming | Tagged , , | Leave a comment