We're hiring!

We're actively seeking developers and designers for our Detroit & Ann Arbor locations.

Graduating from CoffeeScript to LiveScript

CoffeeScript to the Haskell equals LiveScript

CoffeeScript is a nice syntactic alternative to JavaScript and, in the end, that’s all it is: syntax. CoffeeScript doesn’t offer anything not already found in JavaScript, no standard library nor any new operators. Looking for more in a compiles-to-JavaScript language, I stumbled across LiveScript.

Where CoffeeScript is a Ruby- and Python-inspired version of JavaScript, LiveScript is a Haskell-inspired version of CoffeeScript. Like CoffeeScript, LiveScript compiles to readable JavaScript about the same size as the original source file.

Here are a few reasons to explore LiveScript. Read More »

Posted in Web Apps | Tagged , | Leave a comment

Beyond Domain Experience – 3 Qualities of Great Software Teams

A shot from the Surgeon Simulator 2013 sim game.

Surgeon Simulator 2013

Let’s look at a hypothetical situation. You have a medical issue requiring surgery. While there are many surgeons that could get the job done, each one has their own level of ability and skill. Through their choices, the surgeon will affect overall “quality” of the operation — which procedure is used, cosmetic results, general odds of success, and how any unforeseen complications will be dealt with. The surgeon won’t have a complete picture of the situation until the operation is underway, and even then surprises are possible, so overall skill is essential.

If faced with this choice, how do you determine which surgeon to hire? It’s not easy when risks are (potentially) high and your technical understanding of the field is low. Your choice could have a potentially dramatic effect on the outcome, and there’s no going back.

I imagine that this is very similar to how it feels to be tasked with selecting a firm to develop custom software for your business.

Read More »

Posted in Choosing Your Team | Leave a comment

Tackling Silence, Avoidance, & Negativity in Project Retrospectives

Improve Your Retrospective

At retrospective meetings, we reflect on how our team has been operating, sharing both the good and the bad. We try to identify problems and take actions that solve those problems.

But just as important as fixing procedural problems is giving individual team members the chance to speak, be heard, and “air-out” anything that’s been bothering us. Ideally, we will honestly share our feedback and perspectives, and humbly acknowledge our mistakes. In reality, though, most of our retros fall short of that standard. Here are some common problems and ideas to help work through them. Read More »

Posted in Project & Team Management | Leave a comment

Developing Business in Detroit, the Atomic Way

One of my responsibilities as the managing partner of Atomic’s Detroit office is business development. At first it sounds like a new-age word for “sales,” but while there is a sales component to this responsibility, at Atomic it encompasses more than being focused on a single sales transaction.

Don’t misunderstand me — we’re working hard on bringing work to our growing Detroit office. Our ability to remain in the Detroit market depends on it. But “business development” means taking a longer approach, becoming an active, contributing member of the business community and building relationships with other people in it.

Here are four ways we’re developing business and growing in Detroit. Read More »

Posted in Business Practices | Tagged | Leave a comment

Learning Names and Faces with Anki

When I joined Atomic Object back in July 2012, learning the names and faces of my fellow Atoms was a challenge. I was working from our recently-opened office in Detroit, but most of the people in our company were based in our original Grand Rapids office. Aside from the three people I was working remotely with on my first project, I wouldn’t have much opportunity to see or interact face-to-face with Atoms in the other office.

Screenshot of the Anki software displaying a picture of the author, and the question "Who's That Atom?"I decided to use Anki to create a set of digital flashcards to help. On the front of each card, I put a person’s photograph from their bio page on our website, and on the back I put their name and some trivia, such as the year they joined Atomic.

Creating the cards in Anki was a piece of cake. I started with Anki’s built-in “Basic” card type, which simply has “Front” and “Back” fields, representing the two sides of a flash card. To make each card, I downloaded the person’s photo from our website, dragged the image file into the “Front” field in Anki’s “Add Card” window, then typed the person’s name in the “Back” field. Over time, I refined the cards and incorporated more of Anki’s features, such as tags, custom fields, and custom card layouts and styles. Read More »

Posted in Extracurricular Activities | Tagged | Leave a comment

GLSEC 2014 Focuses on Craftsmanship & Teams – Register Today

The annual Great Lakes Software Excellence Conference (GLSEC) will be held at The Prince Center at Calvin College on May 5, 2014.

GLSEC is the premier software conference in West Michigan. This year’s keynote speaker is Rich Sheridan, the CEO of Ann Arbor-based Menlo Innovations. He will be kicking the conference off by discussing the business value of joy. Rich is an amazing storyteller, and I am looking forward to his presentation. Read More »

Posted in News & Events | Leave a comment

combineLatest vs. zip in ReactiveCocoa

Recently, I’ve been learning the ins and outs of Functional Reactive Programming with Reactive Cocoa. The library comes with a number of operators that can be used to modify incoming signals. In this post, I am going to compare two of those operators: +combineLatest: and +zip:.

Both +combineLatest: and +zip: can be used to combine two (or more) signals into one new signal that sends a single RACTuple containing both values. This can be very useful when two separate events occur, or when two pieces of changing data need to be processed together.

Read More »

Posted in Objective C | Tagged , , | Leave a comment

Words Worth Working For


Carl Erickson wrote back in 2009 about his practice of distributing “nice words” from clients to the company at large. It is a practice that continues, and something that I personally love about working at Atomic. It lifts my spirits and makes me proud to be a part of such a highly-praised group. I know I’m not alone in my appreciation for this practice.

Nice words mean so much to all of us in part because they result from hard work. To us, these words are like a flag flying triumphantly atop a newly-constructed castle. Weeks or months of time has often gone into erecting the solid, stone walls. Thoughtful, sometimes difficult, decisions have shaped it for its intended purpose. Throughout the process we’ve sweated the details, pursued knowledge and empathy, and as a team brought a vision to life.

These are words worth working for. Read More »

Posted in Business Practices | Leave a comment

Inexpensive Ethernet JTAG Adapter with Raspberry Pi and OpenOCD

I recently wanted an ethernet JTAG adapter for a project I was working on. Unfortunately ethernet JTAG adapters can cost upwards of $300, and even then they can be specific to particular chipset and toolchains.

However, were already using OpenOCD with ST-LINK/V2 programmers to communicate with out hardware, and it turns out that it’s very easy to set up OpenOCD on the Raspberry Pi. You can then plug the programmer into the Pi, connect a debugger (gdb in our case) to the OpenOCD instance, and debug your firmware remotely! Read More »

Posted in Embedded Systems | Tagged , , , | 2 Comments

Why Vagrant? – Preventing Deployment Issues from Day One with a Virtual Machine


One of the traditional problems in software development is the delivery of a finished project. Atomic Object writes custom software, but we ultimately need to deliver it to our customers, which usually implies deploying it to an existing infrastructure environment, or handing it off to an operations team.

Unfortunately, this hand-off process often introduces a variety of glitches and bugs due to differences between the environment that the software was developed in (the development environment), and the environment it will actually run in (the production environment).

Vagrant is a tool for creating and configuring virtual machines. It provides an interface to easily bootstrap and manage virtual machines using a variety of different virtualization platforms and configuration management tools, both open source and commercial. By using Vagrant, developers can easily write and test applications in environments similar to which they will actually be deployed. This reduces the likelihood of glitches and bugs when handing off a finished project to customers. Read More »

Posted in Technical Practices | Tagged , , | Leave a comment