Archive for the ‘PHP’ Category

Web Developer Contractor Rates

Wednesday, November 18th, 2009

We just happened* to start chatting in the #pdxdjango IRC channel on Freenode about what the rates web developer contractors charge today, and I wanted to post my experiences after leaving the contractor world a few months ago after 2 years of more or less successful contracting either individually or via Lo-Fi Art.

A really rough table of my rates as a contractor:

Language Experience Rate per hour
PHP Entry Level $8-20
PHP Experienced $20-65
PHP Specialist never got here with PHP (thankfully ;) )
Sysadmin Slightly Experienced $45
Python Entry Level $25-35
Python Experienced $35-65
Python Specialist (Django) $65-85

However, I think I’ve billed pretty cheaply, especially for Python work. If I had continued in the contracting world I think I would have been aiming for north of $100/hr for new contracts by the end of 2009.

Important Notes

  • All of the experience levels and rates are really rough estimates, please don’t read too much into it. I just wanted to give people some idea of what rates are floating around. (I also have a terrible memory, so these numbers could be way off. Mea culpa.)
  • The sysadmin job is a career oddity for me and consisted of mostly doing Active Directory / Exchange setup (snuck in a Debian server of course). That being said I still enjoy sysadminish type work today.
  • Experienced means you have a few “serious” projects under your belt (not the meaingless “5 years of experience” so many job descriptions call for).
  • Specialist is a poor term, but I needed someway to describe the shift from “I’ll do anything if it’s PHP or Python” to “I’m a Django” developer. My guess is that real specialists (contributors to major projects or popular plugin/module authors) fall into the upper end of this spectrum and can often charge well over $100/hr for highly sought after specialties (Anything + Facebook might be a good example of that right now).
  • I started with PHP first (2000-2006), so I was just less experienced in general.
  • Not only does supply & demand help Python devs fetch a higher rate (reasonable demand, with low supply), but also a Python developer knows how to write code.

    A PHP “developer” could just be someone who has setup a few WordPress or Drupal sites and maybe done some theming. I think you’d be hard pressed to find a web developer who couldn’t be described as having PHP “experience.”
  • My entire career in the “Specialist (Django)” range was in Portland, OR which has a vibrant web related economy (at least as far as my untrained eye can tell). All other rates fell at least partially into time periods where I lived in Illinois (and not Chicago), so that could account for some of the upward shift in the my rates.
  • These numbers are also rough estimates because I’ve done flat per-project billing, retainers, and a variety of other crazy ways of exchanging money for labor. Dollars per hour is still what it all comes down to in the end (like DPS for you MMORPG freaks).

So I’m {ripping off,getting ripped off by} my clients?

I don’t know, but I doubt it. If anything my rough estimates should show what an inexact science billing is. It probably varies more on project factors than on the contractor’s experience.

Right up until I took my full time job at YouGov my favorite client was still paying me at my $35/hr rate. In fact sometimes I wonder if there might have been an inverse relationship between hourly rate and job satisfaction.

This could be a quirk of me being a pretty neurotic person and therefore feeling more pressure when working at a higher rate. At lower rates I generally worked more hours and spent more time tweaking designs, writing tests, and doing other tasks other than putting my head down and coding. Thus at the end of the day, the more hours I worked on projects I liked, the less money I made (relative to working fewer hours on less enjoyable projects).

* Ok, so it looks like I brought it up… but I’d like to think it spawned some good discussion.
Left off the Python category as that gets syndicated on Unofficial Planet Python, and I don’t think this post is high enough quality to deserve that. :)

Web Server Quandary

Saturday, December 27th, 2008

Apache was probably the first Linux application I learned how to configure. However, I’ve gotten a bit frustrated with it recently…

The Problem

A memory leak. Apache is eating up memory so quickly that I need to restart it every couple days or risk my entire server grinding to a halt as it starts swapping wildly. I’ve poured over log files and pmap output, but I still can’t figure out where the problem lies. Curse you monolithic in-process architecture!

Actually I know what my problem is, I’m running a mess of modules:

  • ssl – 2 certificates on 2 ports
  • php5 – blerg, who doesn’t have to run this?
  • suphp – I suspect this is my problem, but I can’t prove it. A client’s 3rd party web application requires it, but I think its easily replaceable with FastCGI.
  • wsgi – No complaints. Python apps are out-of-process thankfully.
  • proxy – Again no complaints. Can’t imagine how this module could cause any problems except it does proxy some large (multi-megabyte, not huge) POSTs at times. I can’t imagine a memory leak could slip into this module without a lot of people noticing.

Solution A: Apache+FastCGI

I love the idea of putting each web application in its own process and letting Apache just act as an HTTP router. FastCGI seems to have all the features I need, and I’m not really worried about the CPU overhead incurred by IPC.

However, there are 2 competing FastCGI modules for Apache, and I have no idea what to choose. Anecdotally the official mod_fastcgi is buggy and fastcgi.com is a spam infested wasteland. However, I’ve found no authoritative source saying: “fastcgi is dead, long live fcgid!” (Lame excuse, I know.)

Solution B: Lighttpd

I know Lighty is the darling of Rails sites, but whenever I stop by its site I’m greeted with a list of recently fixed security bugs, and now it seems as though they’re rewriting the core!

I’m sure Lighty is a high quality intelligently engineered project, but it seems to be the definition of immature. Not necessarily bad (in fact it usually means its progressing quickly!), but perhaps not as reliable as good old workhorses like Apache.

Solution C: Cherokee

I’ve been following Cherokee for some time now and running it locally on my workstation. I love the web interface. I’m usually a very anti-webmin, pro-vim kind of guy, but I’m sick of editing Apache’s config files. I do it about once a month and therefore it always takes lots of double-checking the docs. I don’t know why, but its configuration has just never felt natural to me.

However, the lead Cherokee developer’s bravado is by the most off-putting aspect of the project. He mocks modwsgi and posts simplistic benchmarks showing Cherokee to be the fastest web server, but meanwhile Cherokee churns out numerous bug patch releases in-between feature releases and has yet to reach 1.0 status.

It seems like an excellent project technically, but I’m afraid there will be negative consequences for the lead developers hubris. (I’m not meaning to insult the guy. He’s probably a far better hacker than I’ll ever be. Self-promotion just makes me uncomfortable.)

Solution D: nginx

I don’t know much about nginx except that it works. Basically all I’ve heard about it is:

  • It works.
  • Its fast. Really fast.

While “working” is definitely my primary objective, nginx seems a bit bare bones for me. I just don’t think I’m the target demographic. I’d kind of like for my web server to handle spawning and kill of FastCGI processes.

nginx feels like git to me. Those who know it: use it and love it. Those who don’t: stand in fear and awe of its unbridled power.

…or maybe its just a nice simple barebones HTTP server…

Conclusions?

I think Solution A: FastCGI is the most sensible. Apache has always served me well, and the memory leak is most likely due to that shoddy suphp module.

Moving my web applications to FastCGI is also the best way to prepare to move to one of these 2nd generation web servers.

However, I’m getting kind of sick of Apache, and the ambiguousness of which FastCGI solution to choose is fairly annoying.

So dear lazyweb, for your everyday web developer consultant looking to run a bunch of PHP and Python web applications, what HTTP server stack should I use? (Debian Lenny packages are a plus.)

Selling some books

Saturday, July 26th, 2008

I’m selling some books on Amazon.

Here’s the full list that I’m too lazy to link individually (click above instead):

0-262-53170-4 - $16 - Evolution and Human Behavior
0-534-95216-X - $6.35 - Data Structures
0-321-26853-9 - $14 - Succeeding with Open Source
0-7382-0142-1 - $6  - Emergence
0-596-00792-2 - $8  - Mono A Developer's Notebook
1-861008-07-4 - $9  - Professional PHP Web Services
0-90571261-7  - $8  - Foundation Trilogy Stars Like Dust Naked
0-446-53268-1 - $6  - America (the book)
0-943575-32-X - $16 - Matthew Henry's Commentary (unabridged)
0-8499-1815-4 - $5  - And the Angels Were Silent
0-7637-2339-8 - $20 - Computing with C#

I also have the following books that I’m ready to get rid of, but they’re not worth enough to bother selling on Amazon. Contact me if you’d like one of them:

The Emperor's New Mind - Roger Penrose (1989 Paperback)
0-596-00559-8 - Wireless Hacks
0-451-21166-9 - The Procrastinator's Guide to the Job Hunt
0-88730-866-X - The Dilbert Future
0-43936213-X  - Harry Potter and the Sorcerer's Stone
0-13-088262-3 - Business Data Communications and Networking (list price on Amazon is a hilarious $115)

WordPress Rocks at Updates

Tuesday, July 15th, 2008

I feel I owe it to my friends who put up with my senseless Python fanboying to admit WordPress is not only a great blog engine, but rocks at updates.

I just upgraded from 2.5 to 2.6 by doing a simple svn switch http://... and then logging into the web admin interface. It took about 30 seconds to complete.

Now compare that to my last experience upgrading Trac from 0.10 to 0.11… ugh.

I love you Trac. Python just lacks an easy and efficient web app deployment method.

Simple WordPress Upgrade Using Subversion

Sunday, October 28th, 2007

I’ve been using subversion to update WordPress for a few minor revisions now. I simply followed the 2.2 branch and ran…

svn up

…to update my code.

Today I ran…

svn switch http://svn.automattic.com/wordpress/branches/2.3

…followed by visiting the upgrade script page and everything worked beautifully!

Anyone not using subversion to update WordPress is doing way too much work! Time to play with tags…

Now if I was really cool I’d use bzr to maintain my local code changes and plugins in my own repository… maybe later.

IRC After a 10 Year Hiatus

Friday, September 21st, 2007

Its probably been 10+ years since I’ve touched IRC. In the early days of the public Internet, IRC was IM + MySpace + Filesharing, only a lot geekier. :)

Then came ICQ and soon after a flood of IM clients that rendered IRC clumsy and antiquated for casual chatting. When I went from High School to College in 2000, I left IRC behind…

Now its 2007, I’m an old man and returning to my old ways. I’m back on IRC except instead of chatting with friends using pIRCh* on Windows 98, I’m lurking in technical channels using irsii centrally located on a Debian Etch server.

If you want to track me down I go by the nick schmichael** and am currently lurking in the following channels.

  • #cherrypy on irc.oftc.net
  • #linode on irc.oftc.net
  • #python-genshi on irc.freenode.net
  • #drupal-ecommerce on irc.freenode.net

I also pop in and out of #gnome on gimpnet and #drupal-support on irc.freenode.net.

To experienced free and open source software community members the fact that IRC is new or strange to anyone is probably a bit hard to grasp. As far as I can tell, IRC is simply the de facto method for communicating about FOSS projects. Mailing lists may be more popular for some projects, but I find the instance gratification of IRC much more appealing.

* I remember liking its scripting better then mIRC or some such nonsense… I’ve never been known to use the most popular software available…

** A very unimaginative combination of my first and last names given to me by some friends in college. It works.