Papers & Presentations

Atoms frequently share what they know in journals, at conferences, and in classrooms.

Open Source

Open Source

Fair is fair. We use others’ good stuff and contribute our own software tools in return.

Active Projects

EMBEDDED SYSTEMS

CMock

An automated mock object generator for C. Generate mock object code useful for interaction-based unit testing in C.

greatest

A C unit testing library in 1 file. No dependencies, no dynamic allocation. ISC licensed.

heatshrink

A data compression library for C embedded/hard real-time systems.

HexString

Ruby String binary data conversion to/from hex strings. Provides two String extension methods: String#to_hex_string explodes a string of binary data into human-readable hex tuples, and String#to_byte_string converts a string of human-readable hex digits into the corresponding bytes.

Moxy

An automated mock object generator for C++. Generate mock object code that lets you write interaction-based unit tests for your C++ classes. Note: Moxy uses Python version 2.4, GCCXML, and pygccxml (a Python class that reads in the XML from the GCCXML tool and presents the data in a nice structure).

socket99

A wrapper library for the BSD sockets API with a nicer C99 interface.

theft

Property-based testing for C.

Unity

A unit test framework for C. A lightweight xUnit-style framework that possesses special features for embedded development.

JAVASCRIPT

Flexure

Flexure is a library for helping you manage data and communicate with servers in Ember.js. It's designed to fill the niche between when Ember Data is too heavy or opinionated for your needs, but raw ajax and javascript objects are not enough. Its primary goal is to help you get your data into Ember objects that you can do useful things with, like define computed properties or manage simple relationships.

jquery_expand

A structural template engine for jQuery.

jquery_expand_assets

A Sprockets processor that wraps html in a jquery.expand function. It is specifically meant to work within the Rails asset pipeline. The processor outputs CoffeeScript, so you'll need to have the result be processed by the CoffeeScript processor.

Node Decoder Ring

Allows you to use a JSON specification to decode Node.js Buffers into a Javascript object.

Save SVG as PNG

A small JavaScript library to convert browser-based SVGs into rasterized PNG files.

IOS & OSX

motion-objection

Wrapping Objection in RubyMotion

Objection

A lightweight dependency injection framework for Objective-C for MacOS X and iOS. For those of you that have used Guice objection will feel familiar. Objection was built to stay out of your way and alleviate the need to maintain a large XML container or manually construct objects.

RUBY & RAILS

autopsy

A Ruby gem for gathering helpful artifacts when Capybara tests fail.

Fire Poll

Simple polling in Ruby. When your block yields true, execution continues. When your block yields false, poll keeps trying until it gives up and raises an error.

PCAN-USB

A Ruby language wrapper for PEAK System Technik’s PCAN-USB, a USB CAN bus adapter. Download the Ruby gem and type: gem install pcan at the command prompt in the same directory you downloaded the gem to install.

PiecePipe

Helps you break your code into small interesting pieces and provides the glue for pipelining them together to provide elegant, readable code.

MISCELLANEOUS

MethodToDelegate

A C# library for partial application of methods into specified delegates.

odo

odo is an atomic odometer for the command line. It atomically updates a count in a file, which will be created if not present. The count is text-formatted (e.g. "00012345\n"), and will be accurately incremented or reset even when multiple processes attempt to change the counter at the same time.

Retired Projects

These projects are no longer being updated.

DeepSet

A small library that eases the processes of filling in deeply-nested data structures in .NET. We use it mostly in testing code for building complicated input and output data in a way that is easy to read and minimizes screen real estate in our editors. See this blog post for a description of its use.

Hardmock

Mock objects for testing Ruby code. We released this tool to give ourselves more control and expressiveness in our mocking code than we were finding with then-current tools. Though we are no longer advancing Hardmock, it has been updated to work in Ruby 1.9 and is still available for download on Github and Rubygems.org.

HASTE

High-level Automated System Test Environment Our automated system testing framework, Haste, is available under the LGPL.

KioskBrowser

A full-screen, kiosk-oriented browser that features an on-screen keyboard. It was developed using the KDE Libraries and is meant for use in touch screen kiosks where the main presentation layer is via HTML pages.

LaszloMock

Provides Mock Objects for laszlo objects in LzUnit tests by generating them on the fly using JavaScript’s prototype. Laszlo Mock is a great fit for Test Driven Development. Written for use with OpenLaszlo 3.3.3. Available under the terms of the Common Public License.

Matchure

A pattern-matching library for clojure. It offers if, cond, and function constructs and allows destructuring and matching for most built-in types.

OpenStep/VMWare Display Driver

An OpenStep display driver written to support the virtual display hardware in VMWare.

Systir

System testing in Ruby. Write and run automated system tests in a domain specific language (DSL) you design, as you need it.

Business Model Canvas Workshop

Presented by
Business Model Canvas Workshop
at
Business + Tech: Fintech Challenge
|
February 2023
February 2023

Bank of America Client Advisory Council

Presented by
Bank of America Client Advisory Council
at
|
July 2022
July 2022

Marketing's Marketing Problem

Presented by
Marketing's Marketing Problem
at
|
July 2022
July 2022

Generous Acts of Attention

Presented by
Generous Acts of Attention
at
Small Giants Summit
|
May 2022
May 2022

Routines and Flourishing at Work

Presented by
Routines and Flourishing at Work
at
University of Michigan, Ross School of Business
|
February 2022
February 2022

Tech Talk for Women in Computing

Presented by
Tech Talk for Women in Computing
at
Michigan State University
|
November 2021
November 2021

Job Crafting as an End to the Endless Work-from-Home Debate

Presented by
Job Crafting as an End to the Endless Work-from-Home Debate
at
A2 Tech Talk, SPARK's A2 Tech 360
|
October 2021
October 2021

Masked Up and Mission Driven: How (And Why) Small Giants Are Returning to the Office

Presented by
Masked Up and Mission Driven: How (And Why) Small Giants Are Returning to the Office
at
Small Giants 2021 Summit
|
April 2021
April 2021

Culture of Learning

Presented by
Culture of Learning
at
Small Giants Leadership Academy
|
March 2021
March 2021

The Challenge of Ethical Design

Presented by
The Challenge of Ethical Design
The Challenge of Ethical Design
at
UXOK
|
February 2021
February 2021

The Atomic Accelerator: Staffing a 100-Year Company

Presented by
The Atomic Accelerator: Staffing a 100-Year Company
at
GLSEC@home
|
November 2020
November 2020

How to Render Twenty Thousand Rows without Crashing Chrome

Presented by
How to Render Twenty Thousand Rows without Crashing Chrome
How to Render Twenty Thousand Rows without Crashing Chrome
at
Code PaLOUsa
|
August 2020
August 2020

Defining Your Culture

Presented by
Defining Your Culture
at
Atomic Object — Ann Arbor
|
January 2020
January 2020

Tidying Up Design

Presented by
Tidying Up Design
Tidying Up Design
at
MWUX 2019
|
October 2019
October 2019

Writing Code that (Practically) Writes Itself with Typescript

Presented by
Writing Code that (Practically) Writes Itself with Typescript
at
Strange Loop
|
September 2019
September 2019

Scaling Your Impact with Shared Ownership

Presented by
Scaling Your Impact with Shared Ownership
at
Good for Michigan
|
July 2019
July 2019

Thinking in SQL: Going beyond “find record 5”

Presented by
Thinking in SQL: Going beyond “find record 5”
Thinking in SQL: Going beyond “find record 5”
at
Kansas City Developer's Conference
|
July 2019
July 2019

Let's Sort Out Sorting: How to Think About Sorting like a Computer

Presented by
Let's Sort Out Sorting: How to Think About Sorting like a Computer
Let's Sort Out Sorting: How to Think About Sorting like a Computer
at
Beer City Code
|
June 2019
June 2019

AIGA Case Studies

Presented by
AIGA Case Studies
AIGA Case Studies
at
AIGA Detroit
|
May 2019
May 2019

Amplify Your Culture of Ownership Through Employee Ownership

Presented by
Amplify Your Culture of Ownership Through Employee Ownership
at
Small Giants Summit 2019
|
May 2019
May 2019

Mind the Gap: Bringing Design, Management, and Development Practices Together

Presented by
Mind the Gap: Bringing Design, Management, and Development Practices Together
Mind the Gap: Bringing Design, Management, and Development Practices Together
at
Agile & Beyond 2019
|
May 2019
May 2019

Think Long Term

Presented by
Think Long Term
at
Positive Business Conference 2019
|
May 2019
May 2019

How to Grow as a Leader

Presented by
How to Grow as a Leader
at
Michigan Celebration of Women in Computing
|
March 2019
March 2019

Michigan Celebration of Women in Computing: Panel Discussion

Presented by
Michigan Celebration of Women in Computing: Panel Discussion
Michigan Celebration of Women in Computing: Panel Discussion
at
Grand Valley State University, Eberhard Center
|
March 2019
March 2019

"Tidying Up" Information Architecture

Presented by
"Tidying Up" Information Architecture
"Tidying Up" Information Architecture
at
2019 World IA Day Ann Arbor
|
February 2019
February 2019

Seeking System Zen with Universal TypeScript

Presented by
Seeking System Zen with Universal TypeScript
at
Full Stack Toronto
|
November 2018
November 2018

Making Work Matter

Presented by
Making Work Matter
at
REBar GR
|
September 2018
September 2018

Understanding TypeScript's Structural Type System

Presented by
Understanding TypeScript's Structural Type System
at
Strange Loop
|
September 2018
September 2018

The Modern Command-line Tool Stack: Pipenv, Click, and Friends

Presented by
The Modern Command-line Tool Stack: Pipenv, Click, and Friends
at
PyOhio 2017
|
July 2018
July 2018

Electron in the Real World

Presented by
Electron in the Real World
at
Beer City Code
|
June 2018
June 2018

The Art & Craft of Secrets: Using the Cryptographic Toolbox

Presented by
The Art & Craft of Secrets: Using the Cryptographic Toolbox
The Art & Craft of Secrets: Using the Cryptographic Toolbox
at
Fluent
|
June 2018
June 2018

Buckets of Testing – working in a multi-project environment

Presented by
Buckets of Testing – working in a multi-project environment
at
Kitchener Waterloo Software Quality Assn
|
March 2018
March 2018

Introduction to Test-Driven Development

Presented by
Introduction to Test-Driven Development
Introduction to Test-Driven Development
at
Grand Valley CIS Computing Club
|
October 2017
October 2017

Compassion

Presented by
at
Creative Mornings Grand Rapids
|
September 2017
September 2017

Intro to GraphQL

Presented by
Intro to GraphQL
at
BarCamp Grand Rapids
|
August 2017
August 2017

Using Higher Order Functions to Build SQL

Presented by
Using Higher Order Functions to Build SQL
at
BarCamp Grand Rapids
|
August 2017
August 2017

Security Hygiene for Software Professionals: Lightning Edition

Presented by
Security Hygiene for Software Professionals: Lightning Edition
at
PyOhio 2017
|
July 2017
July 2017

"Ladies First" Women in Tech Conference

Presented by
"Ladies First" Women in Tech Conference
, Nora Bouchard; Meredith Bronk, Kristian Grant, Brianna Marshall, Andrea Wallace
at
|
June 2017
June 2017

How to Make Data Make Sense: Choosing the Right Visualization

Presented by
How to Make Data Make Sense: Choosing the Right Visualization
at
Great Lakes Software Excellence Conference
|
May 2017
May 2017

Design for the Design Illiterate

Presented by
Design for the Design Illiterate
at
MHacks 9
|
March 2017
March 2017

Why Developers Should Care About Design

Presented by
Why Developers Should Care About Design
at
MHacks 9
|
March 2017
March 2017

The Importance of Diversity in the Technology Industry

Presented by
The Importance of Diversity in the Technology Industry
at
Midwest Tech Project's G Code Gala
|
February 2017
February 2017

Testing your Swift Code

Presented by
Testing your Swift Code
Testing your Swift Code
at
CodeMash
|
January 2017
January 2017

Using iBeacons in iOS with Swift

Presented by
Using iBeacons in iOS with Swift
Using iBeacons in iOS with Swift
at
CodeMash
|
January 2017
January 2017

When Things Go Wrong: A Toolkit for Handling Harassment

Presented by
When Things Go Wrong: A Toolkit for Handling Harassment
at
Michigan Celebration of Women in Computing
|
January 2017
January 2017

IoT Made Easy with Particle

Presented by
IoT Made Easy with Particle
at
Embedded GR Meetup
|
September 2016
September 2016

SLICING UP FUN - Testing Out Your Mobile Apps

Presented by
SLICING UP FUN - Testing Out Your Mobile Apps
at
Targeting Quality 2016
|
September 2016
September 2016

A Tool for Reigning in Self-Doubt

Presented by
A Tool for Reigning in Self-Doubt
A Tool for Reigning in Self-Doubt
at
AndConf 2016
|
August 2016
August 2016

Panelist, PowerUp Tech Fair

Presented by
Panelist, PowerUp Tech Fair
Power Up Technology Fair
at
|
August 2016
August 2016

Command Injection, or How /bin/sh can rm -rf your server

Presented by
Command Injection, or How /bin/sh can rm -rf your server
at
PyOhio
|
July 2016
July 2016

Episode 37: Hybrid Xamarin Apps

Presented by
Episode 37: Hybrid Xamarin Apps
at
Gone Mobile Podcast
|
July 2016
July 2016

Bringing Functional Concepts to OO Languages

Presented by
Bringing Functional Concepts to OO Languages
Bringing Functional Concepts to OO Languages
at
Grand Rapids Functional Programming Meetup
|
June 2016
June 2016

Diversity Is In Our DNA

Presented by
Diversity Is In Our DNA
at
West Michigan Design Week
|
April 2016
April 2016

Welcome to the Dark Side: Anticipating Threats with Dark Personas

Presented by
Welcome to the Dark Side: Anticipating Threats with Dark Personas
at
Great Lakes Software Excellence Conference
|
April 2016
April 2016

We’re All Software Companies Now – How Software Can Help Companies Innovate & Serve Markets Better

Presented by
We’re All Software Companies Now – How Software Can Help Companies Innovate & Serve Markets Better
at
Techweek Detroit
|
April 2016
April 2016

Atomic's Process and 5 Design Techniques You Can Try Without "Design" Experience

Presented by
Atomic's Process and 5 Design Techniques You Can Try Without "Design" Experience
Atomic's Process and 5 Design Techniques You Can Try Without "Design" Experience
at
Grand Rapids Area Professionals for Excellence
|
November 2015
November 2015

Careers in Software Development

Presented by
Careers in Software Development
at
Hudsonville High School Java Class
|
November 2015
November 2015

Implementing the Elm Architecture in ClojureScript

Presented by
Implementing the Elm Architecture in ClojureScript
Implementing the Elm Architecture in ClojureScript
at
Clojure/conj
|
November 2015
November 2015

Monads for Real People

Presented by
Monads for Real People
Monads for Real People
at
GR Functional Programming Meetup
|
November 2015
November 2015

Startup Grind Interview with Carl Erickson

Presented by
Startup Grind Interview with Carl Erickson
at
Startup Grind Lansing
|
October 2015
October 2015

The Craftsperson's Toolbelt

Presented by
The Craftsperson's Toolbelt
at
GVSU Computing Club
|
October 2015
October 2015

Understanding DevOps

Presented by
Understanding DevOps
Understanding DevOps
at
GVSU Computing Club
|
October 2015
October 2015

Communicating Sequential Processes

Presented by
Communicating Sequential Processes
Communicating Sequential Processes
at
SoftwareGR
|
September 2015
September 2015

Configuring Laptops with Ansible

Presented by
Configuring Laptops with Ansible
Configuring Laptops with Ansible
at
DevOps West Michigan
|
September 2015
September 2015

Drawing the Performance of your Web App

Presented by
Drawing the Performance of your Web App
Drawing the Performance of your Web App
at
SE Michigan JavaScript
|
September 2015
September 2015

From Code to Production

Presented by
From Code to Production
From Code to Production
at
GRWebDev
|
September 2015
September 2015

Ember Data Roller Coaster

Presented by
Ember Data Roller Coaster
Ember Data Roller Coaster
at
SE Michigan JavaScript
|
June 2015
June 2015

Team Health Checks

Presented by
Team Health Checks
at
Agile Leadership Network West Michigan
|
June 2015
June 2015

Intro To Python

Presented by
Intro To Python
Intro To Python
at
Girl Develop It Ann Arbor
|
May 2015
May 2015

The Burrows-Wheeler Transform: Better Compression with a Reversible Sort

Presented by
The Burrows-Wheeler Transform: Better Compression with a Reversible Sort
The Burrows-Wheeler Transform: Better Compression with a Reversible Sort
at
!!Con
|
May 2015
May 2015

Craftsmanship as Competitive Advantage

Presented by
Craftsmanship as Competitive Advantage
at
HighEdWeb Michigan
|
April 2015
April 2015

Meet Atomic Object

Presented by
Meet Atomic Object
at
Western Michigan University
|
April 2015
April 2015

The Right Kind of Startups

Presented by
The Right Kind of Startups
at
Techweek Detroit
|
April 2015
April 2015

5 Lessons from My First 5 Years in the Industry

Presented by
5 Lessons from My First 5 Years in the Industry
5 Lessons from My First 5 Years in the Industry
at
Kendall College of Art & Design IxDA Student Chapter
|
March 2015
March 2015

"What Is Good Design" A Research-Driven Investigation

Presented by
"What Is Good Design" A Research-Driven Investigation
at
Speaking of Design Meetup
|
February 2015
February 2015

Deconstructing Single Page Applications

Presented by
Deconstructing Single Page Applications
Deconstructing Single Page Applications
at
CodeMash
|
January 2015
January 2015

Companies for Craftspeople

Presented by
Companies for Craftspeople
at
1DEVDAY Detroi
|
November 2014
November 2014

Lean IT – Software Development & Deployment (Panel Discussion)

Presented by
Lean IT – Software Development & Deployment (Panel Discussion)
at
Information Technology Management Association
|
November 2014
November 2014

Sketchnotes: Harnessing the Messy Mind

Presented by
Sketchnotes: Harnessing the Messy Mind
Sketchnotes: Harnessing the Messy Mind
at
AtomicCon
|
November 2014
November 2014

The Intersection of Clients and Design

Presented by
The Intersection of Clients and Design
at
WordCamp Grand Rapids 2014
|
October 2014
October 2014

make and redo for Building and Automation

Presented by
make and redo for Building and Automation
make and redo for Building and Automation
at
DevOps West Michigan
|
October 2014
October 2014

Configuration Management Testing with Chef

Presented by
Configuration Management Testing with Chef
Configuration Management Testing with Chef
at
DevOps West Michigan
|
September 2014
September 2014

Stage Fright: Don't Be Phased By Compilers

Presented by
Stage Fright: Don't Be Phased By Compilers
Stage Fright: Don't Be Phased By Compilers
at
Detroit Lambda Lounge
|
September 2014
September 2014

Content Marketing at Atomic Object

Presented by
Content Marketing at Atomic Object
at
Ann Arbor SPARK - Michigan Marketing Minds
|
August 2014
August 2014

Talent in the Tech Industry

Presented by
Talent in the Tech Industry
at
The Right Place Investor’s Breakfast
|
June 2014
June 2014

The Path to "Software Developer"

Presented by
The Path to "Software Developer"
The Path to "Software Developer"
at
Samsung Mobile App Academy
|
June 2014
June 2014

Extinguishing the Flame War on Quality and Automated Testing

Presented by
Extinguishing the Flame War on Quality and Automated Testing
Extinguishing the Flame War on Quality and Automated Testing
at
Google IO Extended Grand Rapids
|
May 2014
May 2014

Introduction to Emmet (Lightning Talk)

Presented by
Introduction to Emmet (Lightning Talk)
Introduction to Emmet (Lightning Talk)
at
South East Michigan Javascript Users
|
April 2014
April 2014

Introduction to Machine Learning

Presented by
Introduction to Machine Learning
Introduction to Machine Learning
at
Ann Arbor Craftsman Guild
|
April 2014
April 2014

Why execution matters for innovation – Integrating software development and Human-Centered Design

Presented by
Why execution matters for innovation – Integrating software development and Human-Centered Design
, John Wettersten (IDEO)
at
Great Lakes Software Excellence Conference
|
April 2014
April 2014

Going Mobile: From Idea, to Development, to Final Outcome

Presented by
Going Mobile: From Idea, to Development, to Final Outcome
, Mark Van Holstyn, Josh Hulst
at
Mobile Technology Assn. of Michigan
|
March 2014
March 2014

Hey, Girl. You know you want to be a software developer.

Presented by
Hey, Girl. You know you want to be a software developer.
Hey, Girl. You know you want to be a software developer.
at
Oakland University Women in Computing Lecture Series
|
March 2014
March 2014

Practical Abstraction

Presented by
Practical Abstraction
at
Detroit Lambda Lounge
|
March 2014
March 2014

14 Years of TDD: What We’ve Learned at Atomic Object

Presented by
14 Years of TDD: What We’ve Learned at Atomic Object
at
Agile Groupies
|
January 2014
January 2014

Whirlwind Tour of Writing Games in Ruby

Presented by
Whirlwind Tour of Writing Games in Ruby
Whirlwind Tour of Writing Games in Ruby
at
Scale 12x
|
January 2014
January 2014

Communicating with a Fist Full of Wires

Presented by
Communicating with a Fist Full of Wires
Communicating with a Fist Full of Wires
at
CodeMash
|
December 2013
December 2013

Cocoa Auto Layout – Part Deux

Presented by
Cocoa Auto Layout – Part Deux
Cocoa Auto Layout – Part Deux
at
Ann Arbor CocoaHeads
|
November 2013
November 2013

Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whole-Team Collaboration

Presented by
Inclusive & Accessible UX Practices – How Low-Fidelity Artifacts Promote Whole-Team Collaboration
at
Balanced Team Conference
|
October 2013
October 2013

The Role of UX and Usability Testing at Atomic Object

Presented by
The Role of UX and Usability Testing at Atomic Object
at
Grand Valley State University, CIS 368
|
October 2013
October 2013

Kicking and Screaming: Bringing Agile Practices to the Reluctant

Presented by
Kicking and Screaming: Bringing Agile Practices to the Reluctant
Kicking and Screaming: Bringing Agile Practices to the Reluctant
at
Agile Groupies
|
September 2013
September 2013