Dependency injection is a form of inversion of control. This means that a component’s dependencies are not part of a component’s internals, they are defined...more.
If you're like me, you have a love-hate relationship with styling. Probably because along with HTML, these languages seem to force you to enact poor...more.
On a recent project, working with Elixir, Ecto, and Phoenix, we were encountering difficulty modeling and managing a complex business workflow. This is a fairly...more.
Most of my software experience has been in developing web applications that use various front-end frameworks. By now I've come to expect these frameworks to...more.
Deploying an application is hard. Deploying an application that has only one real chance at success, coinciding with a live event that can’t be repeated,...more.
Two-factor authentication, or 2FA, provides extremely effective protection against account takeovers. But as SIM-swapping attacks have become more commonplace, more and more folks are starting...more.
Isn't it great to be able to sign in to one application (Trello, for example) using your credentials and user profile that are stored somewhere...more.
Thread Basics Let's start from the beginning—what is a thread? A thread stores the information necessary for your computer to execute some part of your...more.
"I think if you maintain a force in the world that comes into people's sleep, you are exercising a meaningful power." — Don DeLillo, Underworld...more.
As a new Python programmer, I ran into three common language gotchas: passing variables by reference, unbound local errors, and mutable default arguments. Hopefully this...more.
This is part two (of three) in a series about ReasonML and typed functional programming. Once posted, you can see the full series here. ReasonReact...more.
This is part one (of three) in a series about ReasonML and typed functional programming. Once posted, you can see the full series here. Introduction...more.
Since the release of version 8, Java has been taking great strides to facilitate writing expressive and functional code. Unfortunately, these strides are often tripped...more.
In a previous post, I wrote about dependency inversion using render props. If you don’t know about the render props pattern, I would recommend checking...more.
RubyConf 2018 kicks off today in downtown Los Angeles. Since 2001, RubyConf has gathered the global Ruby community to discuss emerging trends and share insights....more.
As software developers, we're often given access to various pieces of sensitive information in order to do our job. This could be anything from database...more.
Pair programming is two coders working together at one workstation on a single piece of code. Done well, the coders sit together and discuss the...more.
Microservices are a big deal. They can give us some pretty big wins for our architectures and teams, but microservices have plenty of costs too....more.
I remember the day when I “discovered” dependency injection. I was having a difficult time testing a console view, and all of my mocking strategies...more.
When you're learning another language, there can be periods of frustration where you're having trouble expressing an idea that would have been easier in a...more.
[Updated 2018-04-16] I was corrected on Twitter about how Event (async) invocation throttling behaves, and have updated this post accordingly in several places marked like...more.
If you need to make a marketing website for your business, aside from the branding and design aspect, your main concerns are probably: Will the...more.
The Problem Working in many different languages across multiple projects means it's often a pain to remember how to build all the different components. How...more.
To understand closures and their use in JavaScript, it is essential to understand that closures rely on the scope mechanism. So, before we jump into...more.
When I first started learning React, I went through the “Intro to React” tutorial by Facebook, which you can conveniently follow on Codepen. It all...more.
Elixir Applications In Elixir, an application is a component implementing some specific functionality. It is a unit that can be run independently, thus started and...more.
When I first started working in Vim, reading Bram Moolenaar's Seven Habits of Effective Text Editing was very helpful. In it, he outlines three fundamental...more.
Functional Programming nowadays is seen as kind of sexy by some sects of programmers and developers. Object Oriented Programming has for so long been a...more.
If you have ever used Docker Compose to run multi-container applications, there is a good chance that you have run into the following situation. Service...more.
You've probably heard the sales pitch for Clojure before. It's simple! It's scalable! It turns you into a genius who can machine-learn their way out...more.
I recently started a ClojureScript project, for fun not pay, which might surprise those who know me well. You see, when I had used ClojureScript...more.
There’s been a lot of excitement in our industry recently about progressive web apps, these shiny new websites that can transform themselves into native-like mobile...more.
I mostly work with developers who prefer Vim or Emacs as their editor of choice. This is certainly understandable, because each of those editors provides...more.
Docker promotes itself as "a tool for developers and sysadmins to build, ship, and run distributed applications," and there is much literature available to describe...more.
Welcome! Often times when working with Clojure newcomers I sense a bit of confusion around the relationship between functions, symbols, vars, and namespaces. Typically the...more.
When learning something new, I need to see a lot of details around the subject. I crave something explicit and tangible — and naturally, concrete...more.
Being able to run your unit tests quickly from Vim is vital when doing test-driven development. I've often seen developers using Vim to write code,...more.
Do you write JavaScript? If you do, you probably do a lot of asynchronous stuff. Here’s the thing about asynchronous stuff: typically we use callbacks,...more.
Flexbox is a CSS module that efficiently lays out items inside a container. It makes sure that spacing and alignment are always consistent and that...more.
In building professions, as well as software development, there is the saying “don't blame your tools.” During a recent project, my pair and I were...more.
I first heard about the idea of deferring database decisions from Bob Martin, who pioneered the concept while working on FitNesse and has expanded on...more.
As a developer there are an infinite number of things to remember: everything from intricacies of the language you’re using to the domain knowledge of...more.
strace is awesome [1] [2] [3]. It lets you see exactly what system calls are being made by your running application. Wondering what configuration files...more.
8th Light's software craftsmen are bonded together by their singular pursuit of mastery. We challenge ourselves constantly to learn and grow through a combination of...more.
"Programming today is all about doing science on the parts you have to work with." — Gerald Sussman Designing and maintaining good software is an...more.
Late last year, Reid Draper came to 8th Light University to give a keynote presentation on property-based testing in Clojure. Reid is a software developer...more.
I'm a proponent of building small, composable pieces over one large piece that does many things. The large piece usually works well, but it eliminates...more.
In a previous blog post, craftsman Dave Torre showed how optional types can alleviate common problems with null values. Bulding on that post, we are...more.
The ability of lisp programs to manipulate themselves is beautiful. When we take into account the amount of the language that is implemeneted by manipulating...more.
Go lang offers a wide range of features that help us achieve loosely coupled program designs. Coupling refers to the direct knowledge that an element...more.
In early October, Markus Gärtner visited 8th Light's Chicago office to give a presentation on "Testing With A Stranger" for an 8th Light University event....more.
Unit tests that fail intermittently, without exposing any production bugs, are the worst. Like the boy who cried wolf, they reduce our confidence that they're...more.
The concept of CSS methodologies was pretty foreign to me for the first two years I spent building websites. During those early years, I approached...more.
When immersing yourself in a new programming language, as in a new culture, it’s important to take time to understand the nuances of its common...more.
A developer joining a project, unless the project is starting a completely new application, will be working with dreaded “legacy code.” The process of becoming...more.
One of the most difficult aspects of learning Clojure for most programmers who have been brought up in the object oriented tradition is the Lisp...more.
What do architects (designers of buildings), software developers, and thieves have in common? They each have a pattern language. I was watching “Ocean’s Twelve” recently...more.
There are already several eloquent web postings available explaining the Strong Parameters feature of Rails 4. In this post I’ll provide my take on one...more.
ClojureScript is an incredible new project that any Clojurian can appreciate. What could be better than replacing vexing JavaScript with the clean, flowing syntax of...more.
If there's anything where opinions amongst my development colleagues differ heavily, it's about the evil of context blocks inside a spec suite. Proponents of nesting...more.
There has been some recent interest in the Elixir language and with good reason, it's an exciting language! Elixir not only brings the power of...more.
Unit test frameworks automated the tedious work of verifying bits and pieces of code by hand, replacing a haphazard process of trial, error, and judiciously...more.
I use TDD as my development workflow. Red, green, refactor. It creates a quick feedback cycle, allows me to build momentum, and gives me confidence...more.
Most of us use distributed systems on a daily basis, and for good reason; the stability, fault tolerance and scalability they offer give us the...more.
Some Background Thoughts There is an experiment from Richard Held and Alan Hein who raised kittens in total darkness. For a short period during the...more.
For those new to Test Driven Development, understanding how to take small, incremental steps when writing your tests can be a confounding practice. Even the...more.
Coauthored by Kelly Steensma Wikipedia defines a kata as a detailed choreographed pattern of movement. Based on the Japanese word meaning "form", katas were originally...more.
Characters seem like an easy concept to grasp at first glance. , "Java"has a primitive type char and an object wrapper Character, and these are...more.
A recurring theme on the 8th Light blog is decoupling your applications from the implementation of details. A detail can be anything from UI elements...more.
In December of 2012 HTML5 gained Candidate Recommendation status by the W3C, and with it comes a large number of updates that browsers are officially...more.
The Riak database provides a great MapReduce framework allowing you to execute complex queries, leveraging the parallel processing power of distibuted systems. However, I recently...more.
I’ve been using routing constraints a lot lately. Before I learned about constraints, my controllers were littered with data typing checks and filters, some of...more.
One of the more confusing and often overlooked parts of CSS are Selectors. By understanding descendant, child, and sibling selectors we can reduce the level...more.
Don’t trust outside data! SQL injection attacks were once considered the greatest threat plaguing the Internet. They continue to be the source of many large...more.
Quite often typography is one of most ignored aspects of website design. Poor typography can make your website feel bland or boring, and at worst...more.
JavaScript frameworks like Backbone.js can provide the structure missing in ad hoc approaches but there are some common pitfalls. Like many developers today my first...more.
A recent search on Career Builder, found that out of over 12,000 software development positions, only 120 of them were tagged ”entry level.“ With a...more.
When writing my first Clojure application, I came across a very common problem, validating user input. Even though there are a few libraries out there...more.
SASS (Syntactically Awesome Style Sheets) is a powerful extension to CSS that allows you to use variables, nested styles, mixins and more, but for someone...more.
There's a special sort of satisfication I get from turning absolutely awful code into a well-tested, well-factored program. Not only have I increased the amount...more.
Dependencies are nearly unavoidable for non-trivial software projects. These can be large dependencies, such as web frameworks and databases, or smaller decisions, such as pagination...more.
Monads are ... .stanza { font-size: 1.1em; text-align: center; } Boxes full of fruit And a fruit to fruit transformer That takes apples from the...more.
When the Single Responsibility Principle is taught among developers, one aspect - the responsibility - is harped on the most. But what counts as a...more.
Primitive Obsession is bad stuff. But it's bad, not because primitives are bad, but because obsession is bad. From Merriam-Webster: ob-ses-sion, noun: a persistent disturbing...more.
Many Lisp beginners find quoting to be a foreign concept. My own confusions around quote and friends began with my first ventures into Scheme, and...more.
“polymorphism is a programming language feature that allows values of different data types to be handled using a uniform interface” -Wikipedia In most Object Oriented...more.
When first getting started with iOS development, there were very little resources to get up and started. And with the strict NDA Apple had over...more.
Working with Javascript can be, at best, a mildly frustrating experience. As I've started to work more with Jasmine and Backbone.js, I've added some simple...more.
Do you consider yourself to be a software craftsman? Do you find yourself frequently writing html? Would you feel comfortable giving a talk on Expressive...more.
I recently sat through a software development team retrospective. The facilitator began the retro by taking the “temperature” of the room. He asked us to...more.
Last week, I wrote a brief article that demonstrated how to build a form with well structured, semantic markup. In that article, I started with...more.
In a web saturated with numerous opinion blogs, gallery showcases, tutorial sites and technical references, where should an aspiring web developer go to seek knowledge...more.
This February 13th will mark a decade since the creation and signing of the original Agile Manifesto. The lean development thought leaders who came together...more.
At Agile 2010, I shared an airport shuttle bus with Henrik Kniberg and César Idrovo Carrillo, the organizers of the manifesto translation project. They told...more.
Day 3 at Relevance began, as the previous days, with the company standup. Stuart Sierra, of clojure.test and Practical Clojure fame, was my pair for...more.
I’m honored, humbled and excited to represent 8th Light, Inc. on its most recent Craftsmanship Swap, with Relevance in Durham, North Carolina. I’d first heard...more.
“It's kind of a Frankenstein.” We’ve used this phrase more than a few times to describe the architecture and technology used to design a product...more.
Today we released a new and exciting version of Limelight. Just a reminder, Limelight is a user-interface framework for Ruby. Included in this release are...more.
I spent the beginning of my career working on embedded systems for some audio company. These embedded systems were my first love in programming and...more.
I’m pleased to announce the open source Limelight project: A thin client and application framework written in Ruby (JRuby). Check it out at https://github.com/slagyr/limelight. https://github.com/slagyr/limelight...more.
When building a software system composed of multiple decoupled components, the need typically arises for interprocess coordination and communication. As an example, say that we...more.
I’m a big fan of agile. I’ve long been convinced that the agile movement truly is uncovering ways to do software better. It’s revolutionizing the...more.