Papers & Presentations

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

Presenter First Resources

MVP Graphical User Interface Testing

Open Source

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

Active Projects

Retired Projects

These projects are no longer being updated.

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

What is Presenter First?

Presenter First (PF) is a technique for organizing source code and development activities to produce fully tested applications from customer stories using Test-Driven Development. Though it can be applied in a variety of settings, it is most often used in GUI applications.

History

The core idea of Presenter First came when Mike Marsiglia and Brian Harleton were working on an application team at X-Rite. The pain they felt on adapting a large GUI application suite to the needs of a major customer drove them to create what later developed into and became known as Presenter First. David Crosby worked with Mike and Brian, wrestled with the problems of triad composition and instantiation, and refined the process and motivations for building Presenter First style. The "Burke Porter Dyno Host project was the first large project done in Presenter First style from inception.

Papers

"BIG, COMPLEX, AND TESTED? JUST SAY 'WHEN'"

Appeared in Better Software, February 2007

Better Software Magazine reprint (PDF)

"PRESENTER FIRST: ORGANIZING COMPLEX GUI APPLICATIONS FOR TEST-DRIVEN DEVELOPMENT"

The definitive technical description of Presenter First from the Agile International Conference, 2006.

Agile 2006 Conference paper (PDF)

Examples

  • Simple Java example of Presenter First (PDF) that illustrates the structure of a simple triad; uses jmock and junit for testing.
  • C# Presenter First example (ZIP); VS2003 project for a sliding puzzle game
  • Objective C/Cocoa Presenter First example (ZIP); Simple contact manager application
  • Java Presenter First + Adapter example – Java (ant-only and/or IntelliJ) Swing application that demonstrates the Adapter pattern extension to Presenter First, including how we can use an Adapter to encapsulate the usage of rich GUI library components via their built-in data bindings.
  1. Source and build files (ZIP)
  2. Compiled executable jar of the example (JAR) – "java -jar AdapterExample.jar" to run.
  • Presenter First in the context of GTK+ and C
  1. Find the code at pf_gtk on GitHub
  2. Companion articles describing the project can be found here: original article and updated for 2012

Resources

The original paper on Presenter First (PDF) was not formally published. It describes the core idea and many of the advantages of using this technique.

MVP/Presenter First Video Example by Brian Marick

Video Podcast series with Ron Jacobs of ARCast: Part 1, Part 2, & Part 3

Mocking tools such as NMock, OCMock, JMock, and HardMock are helpful in speeding Presenter First unit testing.

Visual Studio VB macros (TXT) for MVP navigation in C# projects (includes a Test file creator).

Christopher Atkins' approach to PF in ASP.NET: " Presenter First with POA"

Presenter First (MVP) Android Examples – Examples of how to implement the Presenter First pattern in Android based on the code from the book Android Programming: The Big Nerd Ranch Guide (2nd Edition).

Contributed Tools

" A Modeling Tool for the Presenter First Pattern" by Brooke Hamilton of FM Global

"Creating a DSL for Presenter First" – Brooke also provides an interesting write-up on his extension of Presenter First and how to describe the pieces using a succinct DSL