We're hiring!

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

9 Lessons Learned from a Year of Usability Tests

user-testing

When I started at Atomic, I had never participated in or conducted a usability test. In true AO teach-and-learn fashion, I’ve since then been a part of user testing on all of the major projects that I’ve been on since I started almost a year ago.

I have a few concrete take aways that I would want to hear if I were going back and learning about usability testing all over again.

1. Sit in on a test first.

This is probably obvious. But be sure to sit in on a test first, and not as the lead facilitator. See how your teammates run tests, and be there to ask supporting questions and take notes. I recommend pen and paper notes so that you don’t intimidate the tester with the clicking of a keyboard after every comment. Read More »

Posted in UX/Design Techniques | Tagged | Leave a comment

Keeping a Development Journal

journalingLife gets crazy, and things slip our minds. A great discovery, a bug, or a general direction we were taking our code can get lost between development sessions.

In my personal projects, where time between development sessions can be days or weeks, I have been keeping a development journal. As much as it takes an additional couple minutes, it allows me to express intent and task my future self with necessary work.

Read More »

Posted in Development Practices | Leave a comment

Using the Raspberry Pi as a Simple Current and Power Meter

On a recent project I needed to fairly accurately measure current and power consumption of a handful of parts in real time. We needed to measure current in the range of micro amps, so this was actually somewhat tricky.

I could have just used a bunch of super expensive current meters, but I managed to find a much more convenient and cheap solution using a Raspberry Pi. We were already using a Pi to allow for remote debugging, so I went looking for something I could hook up to that.

I found these ADCs:

They plug right into the GPIO headers on the Pi and even come with some python libraries for reading them.

Read More »

Posted in Embedded Systems | Tagged | Leave a comment

Serving Static Assets with DropWizard

Over the last few months, I’ve had the opportunity to do a lot of work with DropWizard, an awesome Java web framework for developing RESTful web services.

I was recently prototyping a small application, and I wanted to serve static files directly from DropWizard. While this isn’t what DropWizard is primarily designed to do, I didn’t want to go through the process of setting up another web server just to serve static assets for a prototype. While DropWizard has some out-of-the-box support for serving static assets, I found the documentation surrounding it to be incomplete and confusing. It actually took me a couple hours of debugging to figure out how to do exactly what I wanted, So I thought I would document what I learned here.

My end goal was to serve a small single page JavaScript app on the root of my DropWizard application, while having my DropWizard REST endpoints available at /api. The limited documentation around serving assets in DropWizard suggest that setting up an AssetsBundle for / and changing the application context path in your config file should be enough to achieve this, but that did not work for me. I had to do the following steps: Read More »

Posted in Java, Web Apps | Tagged | Leave a comment

Interacting with Git: Cryptic RPC Errors, HTTPS, and SSH

PC_Load_Letter_590

In my experience, working with a Git repository hosted by Gitlab, Github, or Gitorious has generally been issue free and enjoyable. Recently, however, three members of my team ran across the same cryptic RPC error when trying to push changes to a remote repository on Gitlab:

error: RPC failed; result=22, HTTP code = 411

In two cases, developers were trying to push new framework libraries (they were moderately sized, 2-9 MB). In the third case, a designer was trying to push a large batch of image assets. In all cases, the problem was caused by using the HTTPS protocol with a server configuration that disallowed individual files larger than 1 MB.

After some basic investigation (thanks Stack Overflow!), we found that using the SSH protocol with Git solved the problem. This type of issue could trip up a new user of Git, so I am going to use this post to briefly describe the problem and summarize the pros/cons of using HTTPS vs. SSH protocols to talk to remote repositories.

Read More »

Posted in Developer Tools | Tagged , , , | Leave a comment

Why Sustainable Pace Is Important

Sustainable Pace

As software developers, we work in a highly skilled industry. Our day-to day-work is extremely collaborative, very thought intensive, and down right exhausting. Burnout is prevalent among developers, and we owe it to ourselves and our coworkers to make sure we are all working at a sustainable pace.

Psychologists use the term burnout to explain feelings of exhaustion and diminished interest. Inability to concentrate, lack of restful sleep, fatigue, irritability, and negativity are all glaring symptoms. A burned out developer is an ineffective developer who is going to make mistakes. Here are three reasons why it’s best to avoid burnout and seek a sustainable pace. Read More »

Posted in Personal Optimization | Tagged | Leave a comment

Nicer C99 APIs with Designated Initializers

While working on a library for property-based testing in C, I discovered a trick that can be used to make significantly nicer library interfaces in C99: “designated initializers”. As of C99, struct literals can have their fields set by name, in any order. The C99 standard explicitly updated the behavior for how fields in struct literals are handled:

6.7.8 point 21:

“If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.” (emphasis mine)

Since memory with static storage duration is already initialized to zero, this means that in C99 we can finally depend on stack-allocated structs’ fields being set to zero, rather than garbage data from previous stack frames. This is a huge improvement! If pointers to structs are used as arguments for function calls, it also gives C99 a portable way of using optional and keyword arguments. Read More »

Posted in C & C++ | Tagged , , , | 3 Comments

SoftwareGR – Now on YouTube!

As long-time Spin readers will be aware, Atomic Object founded a non-profit trade association in 2003 called SoftwareGR. Our fall speaker series season has kicked off, and we’re very happy to announce a new experiment. We’re going to be filming several speakers and posting the videos to the SoftwareGR YouTube channel. We think our speakers do a great job and present very interesting information, we’d like to be able to share these talks with a wider audience.

For our first session, on September 23rd, Brett Hackleman presented his talk “Life in a Hardware Startup.”

We were very happy to have a full house for the presentation and a spirited Q&A session that lasted a good 30 minutes after the talk. If you weren’t able to make it, I’d highly recommend checking out this very entertaining session! If you were at the meeting and enjoyed it, I’d appreciate you sharing the link. Read More »

Posted in Evolving the Industry | Leave a comment

8 Questions to Ask before You Automate

This post is revised and republished from Carl’s blog at Crain’s Detroit Business.

Mobile phone construction conceptInnovation is not exclusively about revolutionary new products or services. Extending an existing offering or improving an internal business process can be an important form of innovation, too.

When I talk with business owners about using software to automate an existing business process, the request usually goes something like this: “We have this clunky process to do X which uses an old buggy application (or spreadsheets or email). It drives the people who do the work crazy. We’re growing and really need to automate the whole thing. Can you help?”

Of course, custom software and even automation is not always the answer. Given the cost of software development, jumping into a project too quickly can doom the hoped-for return. I always start with a few crucial questions: Read More »

Posted in Planning Your Project | Leave a comment

Turning Asynchronous Networking Inside-Out

Developing asynchronous networking applications is an interesting problem with unique challenges and no shortage of solutions for, particularly in Python. But the way you’ve traditionally had to write your code to make it work well could leave you with a codebase that, while solid, could be challenging to read or follow.

I’ll take you through a quick introduction to what asynchronous networking is, show you a callback-based asynchronous implementation using the venerable and excellent Twisted, and then finally show you how Python’s new asyncio library uses coroutines to solve the problem in a whole new way.

Read More »

Posted in Development Techniques | Tagged , , | Leave a comment