Project Overview
Furnace began in 2006 out of a desire to better understand the “magic” going on inside newly popular PHP frameworks like Symfony and CakePHP. URL Routing, Front Controllers, Object Relational Mapping, all of it was fascinating to me. In the process of developing web applications up to that point I had amassed a small toolkit of useful homegrown scripts for doing common tasks like implementing user authentication, form generation, and so on. These formed the basis for what would eventually become Furnace.
For several years, Furnace was my playground; my sandbox for exploring PHP and trying out new ideas for “making things better”. More than once I rebuilt it from the ground up, and I learned to appreciate the importance of thinking things through architecturally, of flushing out potentially limiting assumptions before they become hopelessly ingrained in layers of code.
After a few years, many lessons, and over a thousand Subversion revisions later, I had a framework that I was actively using in a number of personal projects and even some applications for consulting clients. It wasn’t fancy, but neither was I engaging it in anything too exotic. The primary concern was that I was the only person on Earth who knew how it worked. I found myself never being able to turn over a project and move on, because no one else could readily maintain it. This reality, combined with the fact that, suddenly, the traditional LAMP stack wasn’t the only choice for web applications anymore, was the beginning of the end for my relationship with Furnace.
I occasionally use Furnace as an excuse to try new things. In 2011 I moved the Furnace codebase to GitHub, partly as an attempt to get greater visibility for it, but mostly for the chance to dig into Git and the absolutely addictive magic that is GitHub. Furnace helped me grow as a software engineer. It was a project I poured my soul into, and thus had an incentive to maintain over time. It taught me about organizing code, the challenges of refactoring a large codebase, introduced me to continuous integration and unit tests, allowed me to explore the promise and the limitations of object-relational-mapping, balance optimizations and performance, and probably a hundred other things besides.