Building a Golang project from scratch requires making some important decisions that will shape the future of the project, providing a scaffolding for yourself and...more.
One of the biggest challenges companies have managing their software is the ever growing complexity from growth. As your business grows, you need to actively...more.
Software testing may form the bedrock of quality software, but most teams find that quality is more important than quantity in their test suites. Not...more.
When I switched from the dynamically typed language of JavaScript to the statically typed language of Kotlin, I realized that I had to familiarize myself...more.
Over the last week, cybersecurity experts and developers around the world have scrambled to understand and mitigate a frightening zero-day vulnerability in a popular Java...more.
Job interviews are an inescapable reality of the labor market, and unfortunately they’re still an imperfect science. Different companies will have different qualities they’re looking...more.
Ports and Adapters is an architecture pattern that aims to decouple your application from the details. By details here, I mean things like: Your web framework...more.
Hey, my name’s Ian. I’m a Senior Consulting Software Engineer at 8th Light’s Pod Services division. And I have struggled with remote collaboration for a...more.
8th Light’s modern apprenticeship program allows us to hire software professionals from a wide range of backgrounds, and Ian Carroll is no exception. In an...more.
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.
Software teams have a variety of tools, software patterns, architectural decisions, and process flows at their disposal. This can be daunting for a new engineer...more.
Recently, I encountered a conversation about "clean code." This was in the context of an engineering organization trying to improve the quality of its output....more.
Recently, in preparation to deliver agile training for a shipment tracking company, I was struck by how many of the comments I heard from stakeholders...more.
As health care professionals work on the front lines of the COVID-19 pandemic, they’re at risk of more than just contracting the virus. Witnessing and...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.
8th Light is pleased to announce its relationship with a new remote software development company, One World Coders. Former 8th Light COO Doug Bradbury has...more.
I am thrilled to announce that 8th Light has acquired Lunar Collective, a software consultancy based in Austin, Texas. This acquisition—along with WisdomGroup, Adorable, and...more.
As our organization has grown and evolved, we realized that our job descriptions had lagged behind our progress. They no longer aligned with the reality...more.
I’ve thought for years in terms of two kinds of software quality: “internal” and “external” quality. The idea is that “internal” is essentially the stuff...more.
One of my favorite aspects of working in different languages on various client projects is seeing how concepts learned in one paradigm bleed into others....more.
Often, as well-meaning programming language enthusiasts, we might find ourselves encouraging newcomers with simplified descriptions of language features. There’s sometimes a tricky balance between explaining...more.
Using CDN to prevent performance issues of content management systems Craft CMS is a content management system that allows a team to organise and edit...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 am thrilled to announce that 8th Light has agreed to merge with Madriska, the general web-development consultancy based in Chicago. Madriska’s owner and only...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.
Does your product backlog look like an ever-growing laundry list? Does your backlog grooming session feel like an exercise in futility? Follow this guide to...more.
One of the earliest, most fundamental things I learned about writing code was the Don't Repeat Yourself (DRY) principle. Initially, this resonated with me. When...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.
The evidence supporting the value of employee training is undeniable. Professional learning and growth opportunities increase employee engagement, improve satisfaction, and drive potential. According to...more.
Whether you are currently hiring or currently evaluating your company’s recruitment and onboarding processes, I want to let you in on a little secret: the...more.
One of the most prevalent fears for managers in an organization going through agile transformation lies in the uncertainty of their new role. Agile advocates...more.
Your code is complex and working with it is difficult. Years of development and bug fixes have you ready to declare bankruptcy on your technical...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.
I’ve been learning more about computer networking recently, and part of that exploration has led me to learn more about domains and domain name servers....more.
This article was originally published on Medium on September 4th, 2018 One of the things about being a developer is that you’re never done learning....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.
Learning, sharing, growth. Those three things are what brought together 60 software crafters on a Thursday evening in Seattle, Washington. David Scott Bernstein, the author...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.
The journey from global variables to managed dependency injection When writing object-oriented code, we inevitably end up with some objects that are either unique (we...more.
I recently created an open source plugin for Jekyll, the Ruby static site generator. Jekyll LilyPond Converter (henceforth JLC; source, RubyGems) converts specified code snippets...more.
Most modern languages that we use today provide tools and documentation for unit tests, which make it simpler to test our code. If unit testing...more.
Elm approaches JSON much differently than languages like JavaScript and Ruby. Elm's built-in functions don't offer the immediate convenience of JSON.parse. You'll find built-in Decoders...more.
8th Light is committed to diversity and inclusion, and the recent conversations in the tech community have been an important reminder that we need to...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.
Elm approaches JSON much differently than languages like JavaScript and Ruby. Elm's built-in functions don't offer the immediate convenience of JSON.parse. You'll find built-in Decoders...more.
Elm approaches JSON much differently than languages like JavaScript and Ruby. Elm's built-in functions don't offer the immediate convenience of JSON.parse. You'll find built-in Decoders...more.
In any non-trivial codebase we rely on third-party dependencies. These dependencies can be libraries or frameworks, but can also be external services that provide an...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.
I've spent the last few months implementing a compiler that targets the Erlang Virtual Machine (BEAM). BEAM code itself seemed like a tricky initial target,...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.
Many companies offshore the development of computer applications or supplement their software teams with remote developers. This arrangement can provide significant cost savings, but other...more.
A pottery teacher splits the two sections of her introductory class into a "quantity" group and "quality" group. Students in the "quantity" group are graded...more.
When adding a third-party library to a project, I typically find plenty of examples of how to use the library in a dead-simple, script-like way,...more.
Developers are typically trained to look out for and guard against logical errors that have been accidentally introduced to their code. Such errors will range...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.
When I join a new team, I am fascinated to watch how quality issues are handled. Application users complain about bugs in production, testers report...more.
Ideally, software should cost less than the value it creates. For an established product, we may be able to easily calculate the ROI and determine...more.
Pipeline transformations can be a wonderful mechanism for creating self-describing code. Many languages offer a built-in pipe operator. The list includes Elixir, F#, Clojure1, Hack,...more.
When taking on a large project, one of the most difficult tasks a software crafter faces is breaking it down into manageable, deliverable pieces. If...more.
Continuous Delivery is a hot concept in the software industry these days, but can often seem like an impossible goal. "How could our system ever...more.
1995, Taiwan Taiwan was going through a series of education reforms in the '90s. Our teachers started to incorporate new teaching methods inspired by the...more.
In this multi-series blog post, we're going hands-on through the steps that can help transform the design of a default Rails application into one with...more.
I was recently tasked with fixing a third-party integration issue that started occurring suddenly and with no apparent reason. The source of the problem was...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.
In this multi-series blog post, we're going hands-on through the steps that can help transform the design of a default Rails application into one with...more.
In this multi-series blog post, we're going hands-on through the steps that can help transform the design of a default Rails application into one with...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.
Identifying the Illness Medicine clearly distinguishes between chronic and acute conditions. Acute conditions have a clear and relatively sudden onset, affect a clearly defined component...more.
There is a story of three bricklayers. Each one was asked what they were working on. The first bricklayer answered gruffly, “Isn’t it obvious, I’m...more.
I recently saw a terrific talk by Sandi Metz at the Abstractions conference where she encouraged the audience to learn to identify the concrete code...more.
Dependency injection[1] is a powerful pattern that is relatively simple to implement. However, it is often overlooked—or even misunderstood—in the development of many web applications....more.
I've recently been working in PHP and have been very impressed by the Laravel web framework. At first, having only heard horror stories of massive...more.
I’m excited to announce that 8th Light has agreed to acquire WisdomGroup, the leading voice in Chicago’s vibrant Ruby community. This acquisition combines two powerful...more.
The words "legacy code" strike fear into the hearts of developers everywhere. Behind that fear, legacy code means it's slow to understand existing behavior, slow...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.
The head judge of Top Chef, Tom Colicchio, has expressed a simple mnemonic for dealing with customer problems in a restaurant setting. There are three...more.
Bugs, defects, issues, glitches, hidden features—call them what you want, but inevitably we discover that something in our software system is not working as expected....more.
Often the hardest part of programming is knowing where to start. With test-driven development the right place to begin is with a test, but when...more.
In recent years, various code schools have flooded the developer markets with hordes of beginners. These schools have done a great job of introducing people...more.
Communication is hard, especially in the software industry that has, for whatever, reason preferred introverts for decades. That stereotype is slowly eroding, but it doesn’t...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.
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.
In my last post, I cautioned against hastily reacting to the abundance of talks and blog posts describing migrations away from Rails monoliths. A preliminary...more.
I spent much of my programming youth in object-oriented land, so I grew accustomed to attaching patterns to object-oriented features. In particular, when I heard...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.
Sustainable pace is an early Extreme Programming concept that was intended to protect programmers from going on “death marches” to meet deadlines that are arbitrary...more.
If your project is localized, it’s probably internationalized. If it isn’t, there’s a good chance it’s not. Depending on your familiarity with those terms, the...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.
Ruby's low-overhead metaprogramming facilities make it easy to create elegant APIs with minimal effort. As a testament to its power, I can say with a...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.
Let's play a word association game. When I say "stack overflow" what comes to mind? Is it Spolsky and Atwood's popular question and answer site?...more.
Regular expressions are a powerful way to search through and manipulate text. But as we know from Spiderman, with great power comes greatly reduced readability....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.
In 2009, I started an internship at a Los Angeles-based audio/video post production studio. The audio engineer I was learning from was an avid musician...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.
One of my favorite tips for writing software comes from one of my favorite software role models, Sandi Metz. In her book Practical Object-Oriented Design...more.
The Project A few years ago, I was tasked with the migration of data across build, staging, and production environments. It was heavy with software...more.
One of the quickest ways to turn a well-factored Rails project into an old-fashioned legacy app is to use ActiveRecord where and find_by_sql calls outside...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.
Varnish From the docs, Varnish is a web application accelerator, or a caching HTTP reverse proxy. At its core, Varnish is designed to reduce response...more.
When developing software, it's generally desirable to hide the details. This allows you to increase the cohesion of parts in our software, and to decouple...more.
Speed limits exist to encourage traveling at speeds that are deemed safe for a given road. Although the meaning of "safe" will vary per person,...more.
Yesterday, my pairing partner and I came across an interesting situation. The feature we were working on required receiving some data, constructing a date range...more.
What does it mean to be a software craftsman? You can read the Manifesto for Software Craftsmanship and draw conclusions; but if you posed that...more.
This week I experienced first-hand the knowledge ramp-up that is required when joining a project of any real size and complexity. I had actually worked...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.
Estimates are a fundamental part of our business. We rely on them to schedule our workflow and to communicate honestly and openly with clients. We...more.
Working with web forms can be tedious and time-consuming. Many of the tools that exist today require individual setup and handling for each form element....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.
Controllers are powerful and complicated objects that easily accumulate responsibilities. Even when following the classic Rails convention of "Skinny Controllers, Fat Models," controllers still have...more.
In his recent post, Doug Bradbury claims that aiming for gender equality runs the risk of further homogenizing our culture. Instead, he suggests that we...more.
Doug asked a couple of thought provoking questions in his recent blog post about gender equality: What is unique about women that make them not...more.
Pair programming always works. To explain why, we will take a look at an important study which explains how people learn in social contexts. The...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.
Writing good software is hard. Fortunately, we can borrow from our everyday life experiences to make it easier. Consider the following situation: You're sitting at...more.
Before I started working at 8th Light I spent two years at a boarding school teaching German, Economics, and coaching fencing. Although I didn’t study...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.
Today marks the 5th Anniversary of the publication of the Manifesto for Software Craftsmanship. We are doing a couple of things to celebrate to mark...more.
Five years ago, a handful of us nervously deployed a little application that held some pretty lofty ideals for the future of software development. We...more.
We show respect for our customers and fellow software crafters. We do not act unprofessionally or unethically. —from the 8th Light Principles of Productive Partnerships...more.
During the Second World War, both the Japanese and United States armies set up bases on remote islands in the Pacific Ocean. The islands’ inhabitants,...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.
The overt purpose of testing is to ensure that code does what is expected of it, but tests themselves also act as documentation. Highly readable...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.
In 1826 Marc Isambard Brunel and Isambard Kingdom Brunel, a father and son engineering team, sought to build a tunnel under the Thames river in...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.
The Hindley-Milner type system is very powerful: it allows you to express functions with complex type signatures in an elegant, readable way. For example, consider...more.
What is Mindfulness? Mindfulness is an attentive awareness of the reality of things in the present moment. Learning how to be mindful brings the wisdom...more.
For over a month, I received occasional reports that an existing feature, adding secondary accounts, wasn't working. I could never reproduce the failure in any...more.
In The Pragmatic Programmer, Andy Hunt and Dave Thomas talk about software entropy and the broken windows theory. The premise of the broken windows theory...more.
As craftsmen, we admire and encourage a sustainable pace. We also encourage ourselves to always be learning, to always be expanding our knowledge and abilities....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.
We partner with our customers to understand their business. We do not propose solutions until we are sure we have found the right problem. —from...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.
We communicate our progress honestly and openly with our customers. We do not conceal or embellish. —from the 8th Light Principles of Productive Partnerships My...more.
Steadily Adding Value We estimate with diligence. We do not let fear or pressure make us promise what we can’t deliver. Estimation is Difficult As...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.
We take responsibility for the correctness of our code by testing it thoroughly. We do not tolerate preventable defects. —from the 8th Light Principles of...more.
The process of learning Ruby has brought several surprises. Some of which are more pleasant than others. The latest I have encountered is that Array#sort...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.
We embrace differences of opinion and personality. We do not allow our current practice to impede improvement. —from the 8th Light Principles of A Community...more.
We humbly demonstrate our expertise by delivering quality software. We do not inflate our abilities or claim expertise where we have none. —from the 8th...more.
We always apply our best efforts to complete our work. We do not make excuses. —from the 8th Light Principles of Steadily Adding Value Everyone...more.
Keep your cookies to yourself Browser cookies are a good way to provide a stateless protocol with some memory. Unfortunately, they're also good for hijacking...more.
We continually master a variety of technologies and techniques. We do not let unfamiliarity dissuade us from using the best tools. —from the 8th Light...more.
If you've ever worked on a software development project under a time crunch, then you may have heard the phrase "mythical man month." This phrase...more.
Have you ever watched an interview with a successful product creator? I have, and lots. Typically the interviewer will ask what mistakes the entrepreneur has...more.
I have been reading on blogs and tweets the sentiment that "software craftsmanship is elitism". This perception is formed around comments of code, process, or...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.
Here's the situation: You use RSpec. You like RSpec. But you want more confidence from your tests than you get with RSpec's dynamic mocks while...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.
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.
A short post to start the new year. Let's imagine that you are building an application that requires the application of a specific algorithm, but...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.
Two years ago, when Agile Alliance started a translation project for their manifesto, I was fortunate enough to be one of the translators of the...more.
You just found your dream home: it’s vastly spacious, a gym-sized pool with twin jacuzzis, a massive home-theater and game room, along with riverside boat...more.
Protect your users, take password management seriously. There are too many databases in the world with completely unencrypted passwords. Even when databases have encrypted passwords,...more.
Editing text can be tedious and mechanical; you are often required repeat the same sequence of commands several times. Keyboard macros are one way in...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.
“The only constant is Change.” — Heraclitus While it was doubtful that Heraclitus was addressing developers, the sentiment certainly still applies. As developers, we live...more.
Frameworks are about efficiency and effectiveness. They save you time. By forcing common conventions, a framework helps solve common issues like view rendering, asset generation,...more.
The last 2 weeks of 8LU were very interesting. Steven Degutis delivered 2 great talks on programming languages, covering the pros and cons of a...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.
How does one develop software the "old-fashioned" way? Here is how my very first, non-TDD* version of Tic-Tac-Toe went. First thing's first - I need...more.
Being wrong sucks. Unfortunately, being wrong is a fact of life for developers. Personally I have chosen the wrong technology for the task at hand,...more.
Being a professional developer means that you are responsible for delivering software on time that works. It's a satisfying job - you solve the problem...more.
This blog is for non-technical people looking to purchase custom software. Purchasing software is very difficult and very expensive. It is a decision that is...more.
Scenario: We are sitting in a planning meeting and a business stakeholder asks one simple question. “How hard would that be?” What answer do we...more.
A Rails application has many configuration options. Learn how to test one of them. Why? Well, what are the consequences of an improperly configurated application?...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.
It is the long history of humankind (and animal kind , too) those who learned to collaborate and improvise most effectively have prevailed. Charles Darwin...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.
I interviewed a bright young woman today who is graduating from high school this spring among the top of her class. Despite having several generous...more.
Lately I've been fascinated with the idea of logical fallacies, and especially problems in arguments that may at first glance seem reasonable. Now, clearly not...more.
Many of us admire other professionals, such as musicians and athletes. We even emulate them in our own profession by practicing. What about that time...more.
The Statistics of IT projects going over budget and over schedule are alarming. According to an exhaustive study of over 1400 IT projects from the...more.
TL; DR Rather than including modules and hooking into .included, write a method that adds the behaviour (even if the method just includes and extends)....more.
Time and materials vs. fixed bid is the classic duo of billing models in software services business. Time and materials puts all the pressure on...more.
Putting extensive business logic in Rails controllers is bad and you should stop doing it. I suppose I should demonstrate why that's true with an...more.
Recently, I was pairing with Steven. We were wrapping up work on a feature. While reviewing our changes and running our acceptance test suite, he...more.
"The Manifest for Software Craftsmanship is obvious!" "How could you not agree with it?" "Duh!" These are common reactions to the Manifesto. As an example,...more.
The 2011 SCNA (Software Craftsmanship North America) conference concluded just a few days ago, and there was a large audience turnout as well as an...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.
I remember in my times as a restaurant worker that the management would always give us these rhyming platitudes that were after-school-special cheesy. One of...more.
I'm writing this blog from the train, my head hung in shame. I'm taking a course in Game Optimization and today something exceptionally embarrassing happened....more.
One of the habits that’s valued highly at 8th Light, and should be valued by professional developers everywhere, is the habit of practice. If you're...more.
Do you use validates_uniqueness_of in Rails? Do you feel confident that it works to prevent duplicate records? If you’re like most of us, you won’t...more.
If you follow me on twitter @paytonrules you’ve probably seen me griping at various times about writing a testing framework for Objective-C. I’m currently writing...more.
I have been working on migrating half a dozen 8th Light projects to our continuous integration server last week. Barring one open-source gem project, most...more.
Let's start off with some backstory: there was a time when only one Ruby implementation existed in the world: Matz's own Ruby Interpreter (MRI) written...more.
We encountered a strange spec failure today in our continuous integration build. It’s a Rails project, we’re using RSpec, and this was the failing expectation...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.
Acceptance testing was one of the first challenges I faced during my apprenticeship. I learned that complexity scales in proportion to the number of scenarios,...more.
Many small software contracting companies (boutiques) have been popping up in the last few years with our company, 8th Light, featuring among them. Their fundamental...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.
After attending tonights got:ruby I became obsessed with and started installing rvm. It worked swimmingly. I’m looking forward to getting my development machine off of...more.
Today was day one of my Craftsmanswap with eLabs developer Anders Tornqvist, and so far they have treated me with the hospitality and graciousness I...more.
This blog post originally appeared on a blog I maintain for my current game development class. Generally speaking my posts over there are pretty specific...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.
Last week concluded the Hangman Ruby Sparring Tournament. Unlike the previous Battleship Tournament, I put the effort in to write a competitive hangman player (of...more.
Michael Feathers recently wrote about boutique software shops. He drew a parallel between master chefs and software shops and made a few great points to...more.
Several months ago, I hosted the Ruby Battleship Tournament. It was an all-round fun event where craftsmen sharpened their claws and pitted their skills against...more.
Craftsmanship has been used as a metaphor for software development. Pete McBreen argues in his book “Software Craftsmanship” that craft is a better metaphor for...more.
It’s with great pleasure that I announce the creation of chiPhone, the Chicago iPhone developer’s group, with our first meeting on July 23rd at 6:30....more.
Many of us have heard a lot of talk about functional programming and its benefits, especially when it comes to highly concurrent applications where thread...more.
8th Light and Obtiva have partnered up to provide a journeyman program. Traditionally, a journeyman program is when a master craftsman hires a journeyman for...more.
Here’s the situation. You’ve spent days working on an open source project. Your sweat, blood, and tears have been poured into thousands of lines of...more.
Quick announcement, Selenium on Rails has been released, now supporting Rails 2.2 and with the latest Selenium Core. Numerous bug fixes are in this release...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.
We recently had an interesting requirement surface. In anticipation of the release of a number of demo environments, our customer requested that system configuration be...more.
My path in becoming a craftsman was not through conventional academics. I did get a Bachelor degree in Computer Science. During those years of learning,...more.
I’ve recorded my Langston’s Ant kata for all to see. This particular kata, with slight variations, has been in front of an audience twice before....more.
This release of limelight contains many new features and stability. Perhaps most notably, Limelight will no longer eat 95% of your CPU (ouch)! I’m proud...more.
I'm pleased to announce the inception of the Software Craftsmanship Group. http://groups.softwarecraftsmanship.org. The first meeting is October 13th at 7pm in 8th Light's office. Hope...more.
At 8th Light, they follow a practice of training people through an apprenticeship period. As it is nearing the end of my apprenticeship, my mentor...more.
Craftsman Clarification: There has been some discrepancy in the use of the term “Software Craftsman”. Rather than going into details about various uses of the...more.
There has been an interesting discussion happening about adding a 5th value statement to the Agile Manifesto. Uncle Bob Martin proposed this addition earlier this...more.
OCP was defined in 1988 in Bertrand Meyer’s book “Object Oriented Software Construction” as follows: “Modules should be both open (for extension and adaptation) and...more.
I have three step-children and I rarely promise them anything. It’s not because I’m a horrible father, but because a promise is a fundamentally special...more.
There is no perfect software. At least I have never seen it. Bugs and minor feature changes are indications people are using your software. Real...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.
One of the famous studies on peer pressure was the Stanford prison experiment, conducted by a team of researchers led by then Psychology professor Philip...more.
Often times while writing meta programming code, I am using the eval function and doing manipulation on method/class/variable names. Today I needed to un–Rubify a...more.
Recently, I started reading Knuth’s Art of Computer Science. To spice up the exercises, I am writing them out in Ruby. Thinking about the basic...more.
I hate debugging. Loathe it, despise it, pick your synonym and I’ll use it. Computer programming is building something out of nothing, making the computer...more.
Ruby files have to require other files. There’s no avoiding it. Techniques to manage require statements are numerous and varied. Having tried most of them,...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.
The most widespread and common greeting in the American culture is the handshake. Handshakes are shared between anyone meeting for the first time, and at...more.
I’m a bit overdue on blogging, so in lieu of the normally brilliant and insightful commentary on the state of…er something…I usually put here I...more.
There’s a common pattern I’ve seen for developing DSL in Ruby. It’s used in RSpec, the Statemachine Gem, and Unclebob’s Clean Code talk at RailsConf...more.
Hello again from RailsConf. I’ve gone through five presentations. I don’t have any enormous revelations, and no good pictures yet, but I do have some...more.
Recently I had the pleasure and frustration of working the net-sftp gem for Ruby. Pleasure because it’s a well written library, with an easy to...more.
Occasionally even great developers fall into bad habits, and the rest of us do it more than occasionally. This is especially true when under deadline...more.
Often in Statemachines, duplication can arise. For example, the vending machine in our examples may need periodic repairs. It’s not certain which state the vending...more.
If your situation matches the following conditions, beware! You’re working in rails. You’re using Postgresql. You’re storing binary data in the database. This was the...more.
If you’re doing any significant amount of work with statmachines, you will most certainly encounter some conditional logic in your Statemachines. Take our vending machine....more.
I consider Statemachines to be a programming gem. An invaluable tool for the software craftsman’s toolkit. It’s not everyday that a Statemachine comes in handy,...more.
BOC is a testing pattern that Unclebob briefly mentioned on fitnesse.org shortly after it was published. It describes the typical steps taken in an automated...more.
In Paul Graham’s Book, Hackers and Painters, he talks about patterns and Human Compilers. I started to think about how some traditional Object-Oriented patterns are...more.
The self-shunt method of testing has been conflicting for me. Self-shunt is a good testing pattern to test observers/views. A colleague of mine has started...more.
Recently I was working on FitNesse to solve the problem of large file uploading and downloading. Previously when a file was downloaded FitNesse would happily...more.
I’ve noticed using more mocks lately. Instead of using them sparingly for controlling services which are not instrumental to what I am testing, I’m essentially...more.
David Chelimsky puts it gently…We’ve actually had some heated arguments about these mocking frameworks and it’a all kinda silly. In the end we’re writing good...more.
Delegates: one of the few unique aspects of .NET. How useful are they? Here’s a delegate declaration. The syntax can take some getting used to....more.
What is building software like? The common belief is that software is like engineering. Most people seem to think that building a software system is...more.