My Development Stack
I'm always interested in improving my development stack in order to maximize productivity, facilitate rapid iterations, and maintain flexibility. Over the years I've periodically iterated my web stack, from a Microsoft-based self-hosted environment, to a PHP-centered world, to finally my present Python\Django stack on top of a cloud platform.
I thought I would detail my current stack and technology choices for those interested. I would also love to hear from you on what you use or if you have any suggested improvements.
Mac Book Pro 15''
Not only does Apple make elegant Mac Book Pro laptops for both portability and to serve as a desktop replacement, but the Mac OS X operating system is terrific for web development, since the underlying Linux OS allows the system to closely mimic my production environment.
Dell Ultrasharp 24''
Ever since getting my Dell Ultrasharp 24'' monitor, I refuse to do any serious development away from it. The productivity gains from having a large monitor are astonishing and I can't believe I lived without one for so long.
Klipsch Quintet III
I spend a lot of time listening to music while coding, so this top notch speaker system, Klipsh Quintent III, has become an essential component to my development environment.
Eclipse \ PyDev \ Pylint
While some will rave about the elegance of TextMate as the IDE of choice for Mac (or simply emacs or VI), I've always been a fan of powerful IDEs. (I did work on the Visual Studio team for 2 years before coming to the valley, after all). Eclipse, coupled with the PyDev and Pylint plugins, provides a great development environment for Python. In addition to all the Eclipse productivity features, you get Python specific syntax highlighting, code completion, syntactic analysis from PyDev and semantic analysis from Pylint.
Subversion \ svnX
Subversion is my go to version control repository, with svnX as the native Mac client. While Git is the latest craze, I haven't found it's features compelling for my small team. Though Github itself as a hosted Git provider has some compelling features that I have been meaning to try.
While Basecamp or Trac are the tools I most often recommend to young startups for basic project management, I instead use a very simple task manager I built called MonkeySort. It has the 3 things I need and nothing more: lists, prioritization, and task history.
All of my specs, project timelines, feature breakdowns, competitive analysis, overviews, and presentations are produced in Google Docs, including documents, spreadsheets, and presentations. While not as feature-full as Microsoft Office, they provide anywhere access and easy collaboration which are very important to me.
Amazon Web Services
I'm a big supporter of cloud platforms to reduce the administration overhead of deployments as well as increase the flexibility of increasing\decreasing capacity whenever necessary. I've used AWS for my previous startups and continue to use it for my new projects. I've dabbled with Google App Engine as well, but found it too limiting for large applications.
I have a cheap $10/mo shared host running on WebFaction. I use it for hosting my Subversion server. While I could easily do this on AWS, I personally prefer having my development servers separate from my production environment.
I'm excited for the innovation we are seeing in HTML 5. For the first time in a decade we are experiencing the browser wars again. I'm taking advantage of the new HTML 5 capabilities wherever possible (especially on mobile web apps), including offline support, local data storage, canvas, video, and audio components.
jQuery \ MicroTemplating
I discovered Python while learning Google App Engine. While I've abandoned App Engine, Python has stuck with me as a highly productive and elegant web programming language. The additional benefit of it over PHP is that it is easily usable for non-web code, so I use it for all my queue server and offline processing as well, allowing one elegant language across all my web and non-web components.
Django in my mind is a great compromise between Ruby on Rails and raw PHP programming. RoR has too much magic going on for me under the covers and has somewhat of a take it all or leave it all mentality. Django, on the other hand, is extremely pluggable, allowing you to use individual pieces like the ORM, templates, URL dispatching, etc or to abandon an individual component without throwing out the framework. The flexibility allows you to easily start on the complete stack and switch components as you grow out of them.
Apache \ mod_wsgi
I use Apache with mod_wsgi as my app web server for all of my Python\Django code.
Nginx has been a great web server in front of my apache instances for static file serving as well as round robining for distributing server load. Very easy to configure and super fast for these tasks.
CentOS is a complete open source version of Red Hat Enterprise Linux, so it has the robustness and scalability of Red Hat's core operating system. In addition, it's extremely lightweight and perfect for server deployments. I've moved most of my prior Fedora instances (AWS default) to CentOS.
MySQL has been the reliable back-end relational database I've been using for years. Development has been significantly simplified now with Django's ORM, but MySQL is still a crucial piece of the architecture.
memcached has been a relatively new addition to my stack in order to significantly improve the performance of applications that have complex SQL queries behind them. I've also started using it to cache API requests in addition to database query results.
While Amazon provides it's CloudWatch server monitoring solution, it's needlessly expensive and limited in the kind of monitors you can attach. Instead I use Munin, which is completely free and has a rich ecosystem of pluggable monitors that you can add. I use it to track everything from website latency, to memcached usage, to MySQL query usage, to Apache requests, to Nginx load balancing. All visible in one easy to use web dashboard.
It's of course necessary to get real-time alerts when servers are down. I trust Pingdom for this task. I have also been using Cloudkick recently for this and it's additional cloud platform server monitoring functionality.
May 10, 2010