🦄 Hiring? Josh is looking for work! More info. 🦄

Recent Articles

Articles by jjmojojjmojo

Branching With Git And Testing With Pytest: A Comprehensive Guide

This is part one of a three-part series. This is a comprehensive guide to a basic development workflow. Using a simple, but non-trivial web application, we learn how to write tests, fix bugs, and add features using pytest and git, via feature branches. Along the way we'll touch on application design and discuss best practices.

In this installment, we will:

  • Talk a bit about the design of the example application.
  • Ensure we are set up for development.
  • Exercise the basics of pytest, and git by writing some tests, adding a fixture, and committing our changes.

Advice For New Programmers

I am a proud autodidact. That means I am entirely self taught. 🤔 🎓 ❤️ People like myself are not uncommon in the tech industry, but we have always been in the minority. Autodidacts represent industry outsiders, because we've diverged from the typical learning path: a degree at a four-year college. With the advent of "let's code" initiatives, coding boot camps, better programming curriculum at 2-year colleges, and easier self-lead study, the number and varieties of outsiders is growing every day. We need to stick together.

We are a constant stream of new programmers, often without any sort of support system to help us along after we complete our training. Getting into this industry can be scary. So, for my fellow outsiders, I've put together some thoughts that will help you thrive and excel. I've based this on on what helped me, and my personal observations over the years.

However, I've realized that the difficulty of getting established is real, even for people with a typical education. There's a sort of innocence that is impressed onto new graduates, and there aren't a lot of resources for them either. So college grads, this is for you too.

The Johnson Pyramid Of Programmer Greatness

A few years ago, inspired by the TV sitcom Parks and Recreation, I fired up Adobe Illustrator and put together an infographic that highlights my personal philosophy about what makes a great software engineer, The Johnson Pyramid Of Programmer Greatness. This is the latest version.

In this post, I'll talk a bit in depth about how it came about, and what it all means.

State And Events In CircuitPython: Part 3: State And Microcontrollers And Events (Oh My!)

In this part of the series, we'll apply what we've learned about state to our simple testing code from part one.

Not only will we debounce some buttons without blocking, we'll use state to more efficiently control some LEDs.

We'll also explore what happens when state changes, and how we can take advantage of that to do even more complex things with very little code, using the magic of event detection 🌈 .

All of this will be done in an object-oriented fashion, so we'll learn a lot about OOP as we go along.

State And Events In CircuitPython: Part 2: Exploring State And Debouncing The World

In this part of the series, we're going to really dig into what state actually is. We'll use analogies from real life, and then look at how we might model real-life state using Python data structures.

But first, we'll discuss a common problem that all budding electronics engineers have to deal with at some point: "noisy" buttons and how to make them "un-noisy", commonly referred to as "debouncing".

We'll talk about fixing the problem in the worst, but maybe easiest way: by blocking. We'll also talk about why it's bad.

State And Events In CircuitPython: Part 1: Setup

This is the first article in a series that explores concepts of state in CircuitPython.

In this installment, we discuss the platform we're using (both CircuitPython and the Adafruit M0/M4 boards that support it), and build a simple circuit for demonstration purposes. We'll also talk a bit about abstraction.

This series is intended for people who are new to Python, programming, and/or microcontrollers, so there's an effort to explain things as thoroughly as possible. However, experience with basic Python would be helpful.

Advanced Boot Scripting

As covered in a previous post, boot is an all-around useful tool for building clojure applications, but one feature in particular has proven a adjuncti finalum [*] : boot lets you do clojure scripting. This elevates clojure to the same high productivity of scripting languages (like my personal favorite, Python), but bakes in dependency management and other goodies. This allows the user to build complexity iteratively, in a straight-forward manner (verses generating a bunch of boiler plate project code and building a package). This article explores boot scripting further, illustrating how boot can be used to quickly and easily develop and distribute applications and tools. There's also discussion about getting your jars into Clojars, and setting up a simple bare-minimum Maven repository.