In my 14 years in the tech industry, I've built 100s of computers, reinstalled operating systems more times than I care to share, helped build an ISP, ruled several networks, wrangled countless servers, launched over 60 websites, removed and added bugs in lots of software, ran multiple businesses and somehow kept my sanity (mostly). Currently I am working on several projects as a freelancer, and am accepting new clients.
My Development Philosophy
Software is best grown organically in an iterative process, building to requirements but also reevaluating them during every step of the way. I strive for simplicity over features. My favorite part of development is deleting code.
Skills
- Ruby
- I started learning Ruby in 2006 when I was put on a Ruby on Rails project for the Weiden and Kennedy web site. Since then I've made Ruby my primary web scripting language, and have extensive experience not only in Rails, but Ruby as a language itself. I enjoy it's expressiveness as a language, and it introduced me to concepts such as blocks and procs (basic functional programming), enumeration and metaprogramming.
- Server Administration
- Starting with Windows NT 4 backoffice servers in 1998 and onwards through Windows 2000, eventually moving away from MS to open source (Linux and FreeBSD), I've configured, maintained and secured many servers throughout the years. I'm familiar with soft setup (web servers, database servers, file servers, DNS, FTP, LDAP, etc) as well as hardware (all the way down to building the systems by hand), and currently with VPS (some experience with EC2, but mostly maintaining slices on Slicehost).
- Google Maps API
- My first Google Maps mashup was Unthirsty, a happy hour finder. Since then I've been using the Maps and Geolocation API in building web sites and applications, including TwitterLocal, which let people filter tweets by location (before Twitter did); Knitmap, a yarn store finder; and Standard Locator, and Store Locator API service.
- Ruby on Rails
- I've built several web sites and web applications in Rails, and have also hacked it to shreds building Interface, which is a CMS framework built on top of Rails. I've spent countless hours reading and debugging Rails source code, and learning a ton from it.
- HTML
- I've been writing HTML since 1998, when I first hit the "edit source" button on MS Frontpage '98. I'm a believer of semantic markup, tables for data, and writing standards-compliant markup.
- CSS
- Since reading the classic "Designing with Web Standards" book by Jeffrey Zeldman back in 2003, I've been writing CSS on a daily basis.
- Javascript
- I've just recently fallen in love with Javascript as a language, sparked by the "Javascript: The Good Parts" book by Douglas Crockford. I've since thrown myself into learning all I can about Javascript, and concepts like closures, prototype inheritance, functions as first-class objects and advancements in browser APIs (geolocation, local storage, web sockets, etc) have me very excited to continue learning. Most web sites I've worked on in the past couple years have made heavy use of Javascript.
- jQuery
- Currently my Javascript framework of choice. I'm not totally psyched on using it because it abstracts a bit too much away from bare JS, but it's necessary for creating cross-browser compatible sites.
- Sinatra
- Used Sinatra in many places as a quick and dirty prototyping tool, as well as a production framework for Standard Locator. I did an extensive audit of the source while building my own micro web framework.
- Linux
- I started using Linux back in 2000 and have done just about everything with it: recompiling kernels, building my own distro (using Linux from Scratch), building server platforms for web, database, mail and DNS, as well as using it as my primary desktop environment for several years.
- Functional Programming Concepts
- Higher-order functions (taking other functions as arguments or returning them as results), closures (maintaining state of variables within functional scope), memoization and recursion are all concepts I'm familiar with and use in development. I haven't written much in pure functional languages like Lisp, Scheme or Haskell, however I do apply similar concepts when writing Javascript and Ruby.
- Bash
- I probably write at least two to three Bash scripts a week. I've been using it as my primary shell since I first got into using Linux back in 2000. Both Bash and Emacs are where I live for 80% of my development day.
- Python
- Most of my Python experience is from Google AppEngine, but I've also written a few one-offs: a Python client app using Twisted that received Jabber messages and passed them to Growl, from an experimental service I was developing called Dispatch; a content aggregation and scoring application that was used to measure "buzz" in social media for an Audi Super Bowl commercial.
- Google AppEngine
- I headed development on two Google AppEngine powered web sites for Google: chromeexperiments.com and whatbrowser.org, my first real exposure to Python in production. It also exposed me to the "NoSQL" concept for the first time. It has it's warts, but AppEngine can be a fun framework to develop in.
- MySQL
- I've been using MySQL since the 3.x days, and have used it not only as a database backend for web sites, but also have configured and maintained servers.
- Adobe Photoshop
- I've been using Photoshop since 1994, when I touched up graphics for my high school newspaper on a Mac Centris 610. It's hard not to have to open Photoshop daily considering it's the industry standard for creating web site comps.
- Adobe Illustrator
- I can get around pretty well in Illustrator. Recently I've been using it to create vector art and exporting it to HTML 5 canvas elements.
- Rack
- I've written a micro web framework on top of Rack for Togo, using it as the base for the admin tool, giving me lots of exposure to it's inner workings.
- Canvas
- Most of my canvas experience is what you're looking at right now. Also built a canvas speedometer that showed your browser speed using the V8 test suite for Google's WhatBrowser.org site. Unfortunately they nixed the speedometer at the last hour because it made all other browsers look bad.
- Mac OS X
- Extensive use of OS X since 2001. Experience administering OS X Server.
- Regular Expressions
- I use regular expressions on a daily basis while programming, and have learned the hard way that parsing XML with regular expressions isn't fun.
- SQL
- I wrote my SQL queries by hand when I was primarily developing in the LAMP stack, so I have plenty of experience writing joins, subqueries, building indexes and optimizing queries. Even though most of the mundane work is now done with ORMs, I still get my hands dirty writing more complex queries that ORMs can't handle efficiently.
- Metaprogramming
- I've learned a lot about metaprogramming writing Ruby, specifically while developing Interface, which in essence programmed itself by creating classes and functions and runtime, used to build data models for the CMS. Ruby lends itself quite well to metaprogramming, and while not all languages are as flexible, I've taken what I've learned and applied it where I can in other contexts.
- UI/UX Design
- Plenty of experience building web apps, control panels and content management systems has allowed me to refine my User Interface and User Experience skills. My philosophy on UI/UX is to keep it as simple and clutter-free as possible to let users get in, get done and move on. Good UI design is almost invisible.
- HTML 5
- If I didn't include this you might think I'm behind the times. HTML 5 is the new Web 2.0. Can I do that in HTML 5? Yes, I can!
- CSS 3
- CSS effects, transitions and transforms that are available in CSS 3 are an amazingly simple way to add some flair to a site. Unfortunately it's not supported everywhere yet, but I've been sprinkling them into my projects while making sure they degrade gracefully for older browsers.
- PHP
- Ah PHP, you taught me a lot but also formed many bad habits along the way. I picked up PHP when it was just barely onto version 4, and worked with it as my primary web scripting language from about 2000 to 2006. I've written mini frameworks, a shopping cart and e-commerce application, and countless CMSes in PHP. It also exposed me to configuring and optimizing Apache and MySQL. I haven't used PHP in production since 2006, but I've occasionally had to modify old sites and hack sites together in Wordpress.
- Perl
- I haven't had much use for Perl for quite a while, but back in the day I was writing text processing and simple CGI programs in Perl, before I started using PHP as my primary web scripting language.
- Django
- I worked extensively with Django at Urban Airship. They used it as the framework for their API and web application for their users. I'm familiar with setting up and developing in Django, though it might not be my first choice in web frameworks.
- Prototype
- I used the Prototype Javascript framework for about a year when I started learning Rails.
- Node.js
- Since my interest in Javascript has grown in the past couple years, Node.js really excites me. I'm currently developing a micro web framework called Maru.js.
- Nginx
- My current goto web server. Primarily using it as a reverse proxy to backend applications (Rails mostly). Helped write an nginx plugin that lets you MD5 hash any arbitrary string in the config files, using it to check hash values of filenames on an image resizing and caching system built for Interface. The end result is nginx would serve up the files from the filesystem instead of going through the backend app, speeding up things considerably.
- Apache
- Since the 1.3 days, I've been configuring and maintaining Apache web servers.
- Bind
- Configured and maintained a few Bind DNS servers in my day.
- FreeBSD
- Used FreeBSD as my primary OS on server and desktop for a couple years. Got to know it pretty well.
- Adobe AIR
- Built my first app TwitterLocal in AIR. Used my experience there to lead development on the Nike Stream AIR client.
- Wordpress
- Set-up and used many Wordpress blogs since about version 1.5. Hacked many installs and plugins to bits getting it to do what I needed.
- Emacs
- Picked up Emacs from a co-worker and haven't looked back. Currently using Emacs as my primary text editor and development environment.
- Vim
- Started out using Vim administering servers, and eventually started using it as primary text editor for about a year.
- Java
- I've only worked with Java twice in my career: one was working with Java developers as their sysadmin at Kietra, and the other was a small amount of exposure while working on the Nike Stream Adobe AIR application. I prototyped a file transfer daemon that didn't end up being used, and now currently maintain the codebase for the Stream application.
- Objective-C
- I prototyped a couple iPhone apps, getting exposure to XCode and the iPhone SDK. Obviously this also means I have some experience in Objective-C in the context of developing iPhone apps. I'm still interested in learning more and actually putting an app into production.
- PostgreSQL
- Along with Sybase, I configured and maintained PostgreSQL production database servers. I haven't had much experience beyond that, as I've usually gone with MySQL servers.
- Sybase
- Set up and administered a Sybase server back in 2002 for Kietra. Wasn't fun. Client drivers were buggy and installing was arcane.
- Jabber
- Worked with Jabber as a client pulling in data from Twitter back in 2007 for TwitterLocal. Also built a prototype push notification API using Jabber called Dispatch.
- HTML 5 Video
- Did a bit of exploration with HTML 5 Video as a background for a client web site. Verdict: not quite there yet.
- Socket Programming
- Much of the experience I've had in socket programming was writing a prototype file transfer daemon in Java, however I get the concepts and am looking to furthering my knowledge when the right project comes along.
- Mobile Web Development
- Web apps for mobile first, and native apps where it makes sense. I'm excited to see a continuing investment in bringing a richer set of functionality to mobile web browsers, allowing developers to write once for multiple platforms.
- Game Development
- I've recently been getting into game development, mostly by writing a couple random things using Javascript and Canvas. I'm interested in working on a game for a native platform like iOS.
- C
- My career has kind of run the opposite way of a typical programmer: I started out with super high-level languages and have worked my way down to the lower level languages. I haven't had much opportunity or need to write programs in C, but I'm interested in learning.
- Lisp
- The concepts of Lisp continue to intrigue me, and I'm slowly wrapping my brain around it by reading code and re-reading "The Little Schemer".
- AS3
- Have been interested in learning AS3. I like the way the language is structured, and intrigued by it's event dispatching system.
- Erlang
- Really interested in using Erlang, but haven't had the right project come along. Love the idea of distributed independent code.
- Web Sockets
- I'm excited about having a browser be able to communicate over the network in such an open and low-level way. I haven't had a chance to use it in a project yet, but I've got my eye on it.
- WebGL
- I've played around with some examples in the Three.js framework, but haven't gotten beyond modifying the examples to see how it works.
Experience
- Freelance Developer - Programmer, UI, UX
- 6/2011 - Current Currently accepting clients for UI/UX and backend programming projects.
- Urban Airship - Engineer
- 12/2010 - 6 mos. Focused primarily on frontend experience for Urban Airship's service offerings. Developed "Push Composer" interface for a more user-friendly way to deliver push notifications. Worked on UI/UX design and development for a new reporting infrastructure, which aggregated user behavior for 1000s of mobile devices.
- Instrument - Technical Director
- 10/2006 - 4 yrs. Leading a team of developers working on both back-end and front-end web projects.
Lead developer on CMS platform Interface (getinterface.com) Lead developer on Nike Stream, a multi-faceted creative inspiration platform that integrates Adobe AIR, Jabber, HTML/CSS, Flash and Javascript Worked as lead developer for web sites such as chromeexperiments.com, whatbrowser.org, portlandmonthlymag.com, getuncommon.com Interact daily with project managers and developers to assure quality and timeliness on projects Consult on technology and business decisions
- Standard Web Design - Owner/Developer
- 1/2006 - 2 yrs. Worked on several client web sites, including rivernetwork.org and sportscarmarket.com. Managed web sites for several smaller clients, as well as setting up and maintaining web hosting.
- Portland Internet Co. - Co-Owner/Developer
- 3/2003 - 3 yrs. Co-Owner and primary developer on web applications and web sites. Created e-commerce platform used on several client projects. Helped run day-to-day business tasks. Clients include Garden Burger, DB Clay, Skeies Jewelers, and Sports Car Market.
- Magnet Internet - Owner
- 3/2001 - 2 yrs. Magnet Internet was my side business that offered web hosting, web development and design. Eventually it was merged into Portland Internet Company.
- Kietra - Systems Admin/Developer
- 4/2000 - 3 yrs. Worked on prototyping a online medical record system before handing off to developers to implement. Maintained mission-critical infrastructure, including web servers and database servers. Developed Informed Consent e-commerce site for clinics, which currently seems to be all that's left of the company.
- Darkhorse Comics - Developer
- 10/1999 - 6 mos. Developer on both tfaw.com (e-commerce) and darkhorse.com, which at the time were written in an arcane scripting language/e-commerce framework called WebDNA.
- Fantastic Creations - Systems Admin/Developer
- 2/1999 - 8 mos. Helped build an ISP from scratch, called Clacknet, which was subsequently sold. I also worked as developer for client web sites, writing HTML and server-side scripts in ASP.
- CNSI/NWNetcom - Systems Technician/Network Admin
- 1/1997 - 5 yrs. Started as computer assembler and moved up to setting up networks and configuring servers for clients. The biggest network I helped maintain was for the Portland Art Museum. I continued work on a contract/freelance basis from 1999-2002.
Recent Projects
- Google Developer Days - http://www.google.com/events/developerday/2011/
- Working again with Instrument (http://www.weareinstrument.com), I developed the home page globe experience. I worked with designers at Instrument to bring their concept to life using HTML 5 and CSS 3 technologies like canvas, CSS transitions and CSS transforms. The experience shows a highly stylized view of each city on the Developer Day tour, changing from day to night based on real time and showing real weather conditions. There are a few hidden easter eggs in there that show you how the experience works.
Visit Site
- Google I/O Site - http://www.google.com/io/
- Working on contract with Instrument (http://www.weareinstrument.com), I was the primary developer on the Google I/O Conference 2011 site. I was responsible for writing HTML and CSS, as well as all interactive parts of the site, including the countdown clock on the home page. There were several easter eggs on the site, such as the ability to move home page elements around, allowing users to interact with the countdown dots; and countdown variations for holidays, like floating hearts for Valentine's Day and an old-school site for April Fools. I also created the countdown finale (http://www.chromeexperiments.com/detail/google-io-conference-html5-countdown-finale/ in HTML 5.
Side Projects
- Togo - http://github.com/mattking17/Togo
- Togo is a CMS framework that aims to integrate with Ruby ORMs.
- Maru.js - http://github.com/mattking17/Maru.js
- Maru.js is a micro web framework written in Javascript, built for Node.js.
- Knitmap - http://www.knitmap.com
- Knitmap is a Google Maps mashup that catalogs yarn stores from around the world. It's built using Ruby on Rails and Google Maps.
- Trimet Tracker - http://trimet.onmyiphone.net
- A site I built on top of the Trimet API to show arrival times at bus and MAX stops. It runs on the Camping microframework.
- Standard Locator - http://www.standardlocator.com
- A small side-business I'm still working on getting off the ground. It's a store locator service with a Javascript API. Standard Locator is a Sinatra/Datamapper app.
- dm-geokit - http://github.com/mattking17/dm-geokit
- I developed dm-geokit, a Datamapper plugin that adds geographic search functionality to Datamapper objects, while creating Standard Locator.
Hiring
I'm currently accepting short-term or long-term client projects on a contract basis. If you're interested in talking about how I can help with backend programming, Javascript, HTML 5 or UI/UX, get in touch!