Why Higher Rates are Better (for everyone)
Posted: July 6, 2011 Filed under: Sofware Engineering Leave a comment »As owner of an independent software firm , I apply for a lot of contract jobs. I probably talk to 20 potential clients for every one that I actually and up billing. Many of these potential clients don’t even let me write up an estimate because they get scared away by my “high” hourly rate.
Now whether or not my rate is actually that “high” (it’s not), I do know for a fact that there are literally thousands of other programmers who charge much much less. Just go take a look at vworker or craigslist and you’ll see tons of offers for programming gigs that pay as low as $15/hour.
Or look at my inbox last week: “I have talked with a couple other developers and they have been around $40/hour. Just wondering why you are so much more?”
Or at this post I saw on HN from a guy who is very excited about some very low rates.
Here’s a reddit thread recommending anywhere from $15-$100
And another one in which the first post kindof has the right idea, and is the first big reason you should charge (or pay) a higher software consulting rate:
If you price yourself like garbage you will be treated like garbage.
As the saying goes, time is money, but many businesses seem to forget this, and your rate is a good way to remind them.
A previous client of mine, during my first week of work, told me I should let them know when would be a good time for my “mandatory, 2-day on-site HR training.” I told them I would be available whenever they liked, but that I would bill that time at my full rate. It turns out that training wasn’t nearly as mandatory as the HR department initially thought.
But aren’t I just throwing away money? No. I’m in the business of writing software, not the business of wasting people’s money. I want to write great software and a higher rate allows me to concentrate on what I do best, since it isn’t worth it for a client to waste my time. Those 2 days I didn’t spend in pointless meetings were instead 2 good productive days of coding.
As a client as well, I highly doubt you are in the business of purchasing garbage. You would certainly be skeptical of a 60-80% discount on a new company car, so why aren’t you skeptical of bargain-bin software?
It just isn’t worth it
Freelance development is a much different beast from a working a 9-5. If you are working for $40/hour, the absolute most you can make in a year, if you bill 40 hours per week (which you won’t), is around $83k before taxes. (about the median for an experienced softare engineer in phoenix) And what about all the non-billable time you spend finding clients, invoicing, meeting, planning, etc.
If you want to work 50-60 hours per week for $83k a year, I think you’re better off in a office where you get free equipment, vacation time, health insurance and retirement benefits on top of your salary for only 40 hours of work. Which reminds me:
Full Time != 40 hours
At least in my variety of contact work, I bill incredibly tight. I stop the clock for bathroom breaks, on the job training, phone calls, etc. I bill actual time I work on actual code for an actual client.
I’ve worked a lot of “9-5″ jobs where the software guys show up at 9:30, take an hour lunch, watch a bunch of youtube, leave early on Friday, and call that 40 hours. On my own, not only do I still watch youtube, read blogs and hang out in IRC, but I have meetings, lunches, accounting, and other unbillable “work.” A 25-billable-hour week is good for me, and I’ve never actually billed more than 40.
And yet I produce as much if not more than many people who claim to do 40. If you are paying a “cheap” software developer for 40 hours per week, I’m almost certain he isn’t actually doing 40 hours of work. What if I produce the same amount of code in the same amount of calendar time (1 week) for the same total price, but I only bill you 20 hours for it? Is my rate really double, or am I just being more honest with how I spend my time?
You get what you pay for
There is a great post on Jeff Atwood’s blog from a few years ago that described the disparity in the skill level of programmers. This post is probably more true today than when he wrote it in 2004. Programming in general has been getting much more accessible because of noob-friendly frameworks, screencasts, books, and the open source community. That doesn’t mean it’s gotten any easier.
Sure you can create a weblog in 15 minutes but what happens when something breaks and there’s no 15 minute screencast to help you fix it? What happens is you end up spending 10 times as long fixing it as someone who charges only 3 times as much per hour. Or maybe you don’t pay the “higher cost” contractor anything at all:
Warranty your code
All code contains bugs, but well designed, DRY code will contain fewer bugs than a $15/hour copy-paste job, and the bugs it does contain will be easier to fix. You might even consider warrantying your code. Your clients expect your code to work, but none of them will ever agree to pay for testing. You can wrap cost of testing into your rate and you end up delivering a higher-quality product.
Nobody likes being nickel-and-dimed, especially when the client has to pay for your mistakes. Occasionally I’ll bill for a really complex, time-consuming bugfix(never without warning), but your clients will love seeing “Fixed rendering issues in IE – 1 hour – $0.00″ on their invoice.
Preventing feature-creep
Feature creep is the bane of software projects. It’s a major cause of going over budget (both in time and money) and very often leads to bloated, bug-filled software. It is also the reason you should never, ever do a “fixed-bid” project, which is basically equivalent to charing $0/hour. If the client can buy features for pennies, he will, and more features are not always better.
As a freelancer, shouldn’t I want more work? Shouldn’t I encourage more features? No. I should write an entire post on this topic, but a big reason I went into business for myself was to have more creative control over what I write. Good software is important to me, and clients are notorious for not knowing what good software looks like. I’d rather have a website I’m proud to show off than one I’m embarrassed of that made me a few extra dollars. A higher rate can disincentivize the hasty addition of features, and ensure that both sides of the project are thinking about how to get the most value out of everyone’s time (and money).
Programming != IT
I know there is a lot of buzz about so-called “devops” positions, but that’s not what I do.
Your client needs a new webserver configured? They can get an entire month of high-quality, dedicated service from a managed hosting provider for the same amount they would have to pay me to reinstall ubuntu and run ‘apt-get upgrade”. Or you can make an extra $40 staring at the console window of the cheapest linode server for half an afternoon. It’s up to you.
And when the server goes down in the middle of the night, if you ding them $25 for a 3am phone call, I guarantee you’ll receive that call. If it costs them $200 then maybe they just call the nice people at rackspace instead.
Hourly rates don’t even matter
As a client, you absolutely need to get an estimate from your freelancers before you can judge. This sounds obvious, but a lot of people apparently get sticker shock when they hear 3-digit hourly rates. But if the “expensive” programmer and the “cheap” rogrammer both quote you $5000 for the project, I would bet the former has a better chance of finishing on time and on budget than the latter.
This is probably the most important point here. Having a higher hourly rates doesn’t even mean you make more money, or that you would be more expensive for any particular project. Your rate really just signals how good your work is, how high the client’s expectations should be, and how you expect to be treated.
If the client is worried about cost, there are ways to negotiate that don’t involve changing your rate. Higher-value code, limited scope, better responsiveness, creative control, and a slew of other factors are all more important than what rate you charge.
Of course this post assumes you’re good at what you do. If you’re happy copy-pasting vb.net code from google into a vworker job, by all means continue charging $10/hour. But if you are a great software developer with a good reputation and happy former clients, do yourself a favor and raise the rate. You will feel more valued, and that feeling will manifest in the your work. You will get to do more of what you like, less of what you don’t, and that will let you provide much more value for you clients.
And if you are looking for great software developers, concentrate on the big picture, not on the big (hourly) figure.
Has it been a year already?
Posted: June 24, 2011 Filed under: Sofware Engineering Leave a comment »It looks like it’s been over a year since I blogged. That’s probably because I’ve been absurdly busy starting my own company!
I plan on updating this site more frequently from now on, and I’m going to start with a shameless plug. Although business is good at the moment, I’m always looking for new clients. If you or anyone you know needs some outstanding software written, whether it be Ruby on Rails, Android, Java, or even *shudder* PHP, shoot me an e-mail. Anything (at) briansamson.com will get delivered.
Also you can take a look at my online résumé which I recently updated to have a mobile version if you visit on your phone.
The iPhone is not Facebook
Posted: May 28, 2010 Filed under: Don't do that Leave a comment »The iPhone is a great, magical, revolutionary device. I owned first-gen one for 2 years and loved everything about it (except AT&T). I think it’s great how many apps are out, and how much emphasis the platform has put on software development in general. Without the iPhone I’m sure my Nexus One wouldn’t even exist.
However.
Shaq released an iPhone app today: The Shaq App. The entire point, as far as I can tell, is to watch shaq’s twitter feed. There are about a thousand ways you could have done that already, the easiest of which is going to his twitter page. There is no reason for this.
But Shaq is rich. And social. If he wants to pay somebody to write The Shaq App, that’s fine by me. What spurred this post was a spam I got from contacts.com with this in it:
“Our new LensGauge™ iPhone App makes it easy. It prompts you when to change your contact lenses. It maintains all pertinent information about your contacts. And it makes re-ordering a snap.”
This LensGauge ™ app is so dumb it is hard for me to properly articulate it. It is dumber than the fart app(s). It is dumber than the “I am Rich” app. It is maybe even dumber than The Shaq App. From the reviews on that page, it sounds like it doesn’t even work (how that is possible is beyond me).
This isn’t new. Lots of companies seem to be “promoting their brand” through “new business channels” by “having a presense” on a “social platform.”
So listen up, all you pillars of industry. You probably don’t need an iPhone app. If your best idea for an iPhone app can be used at most once a year, you definitely don’t need one. If it doesn’t do more than your website, just make your website work on mobile devices. If you just yearn for virtual friends to “like” you, go get a facebook page or open a twitter account. If all you desire is to be “social,” you should probably quit your job, because you are terrible at it.
The iPhone isn’t Facebook, although with 100,000 apps its starting to get pretty close.
New from BrianSamson.com! Really like this blog post? Take it with you! With the new BrianSamson.com iPhone app, it’s like having Brian Samson in your pocket at all times! You can re-read all your favorite posts, and be the first of your friends to know when there is a new post! Download the BrianSamson.com iPhone app today! (Coming soon to Android and iPad)
The worst comment I’ve ever written
Posted: May 21, 2010 Filed under: Rails 1 Comment »I’m sitting here trying to debug a very complex piece of “meta” code. This code generates web forms that have fields that automatically show/hide based on the selections in other fields. It’s usually very nice to work in, and it makes creating dynamic forms easy, but it is insanely complex under the hood. I finally find the source of the bug is a hip, railsey, ruby one-liner. It’s not to hard to figure out what that line does (adds some kind of prefix to each key). However I have no idea why it would do that. Luckily when I wrote this code I knew this was confusing, so I included a comment:
if (@if)
#in case this is being rendered in a subsection, the key
@if.each {|andor, array| array.each {|h| h[:key] = field_name_prefix + h[:key] }}
end
Except I forgot to finish it. The key…. the key….. WHAT ABOUT THE KEY YOU IDIOT?? This is the worst comment I’ve ever written. It is worse than no comment. No comment wouldn’t have got my hopes up….and then crushed them. Why isn’t it lunch time yet?
Kiln’s kilnauth.py crashes under python 2.4
Posted: April 12, 2010 Filed under: Computers, Linux Leave a comment »We recently switched to using Mercurial hosted at Joel Spolsky’s Kiln. So far I love it. I think distributed source control is the way of the future and I’m all for it.
Anyway, Kiln provides a number of useful Mercurial plugins, one of which is called ‘kilnauth’ and helps by caching your http authentication cookies so you don’t have to enter your password a bunch of times. I was setting this up on our linux box, which only has python 2.4, and kilnauth was causing a crash when it tried to do an md5 hash. The fix is pretty easy. Near the top where they import the md5 library, change this line:
try:
from hashlib import md5
except:
# Python 2.4
import md5
To this:
try:
from hashlib import md5
except:
# Python 2.4
from md5 import md5
That’s it. Simple little typo that they probably just didn’t test.
And on the subject of passwords, if you are bothered that capistrano outputs your inline http authentication passwords to the console, you can install this gem I wrote, cap_password_filter, to fix that.
Word count in your Browser
Posted: November 30, 2009 Filed under: Sofware Engineering Leave a comment »My wife is taking an online class that has a requirement that she make some number of forum posts on their blackboard. This is not uncommon for online classes to encourage participation. The ridiculous part is that she is required, at the end of her post, she needs to include the number of words she wrote so that the instructor knows the post is long enough. So she ends up launching Word and writing her post over there so she can use the word counter over there to make sure she gets all her words. So I thought I’d be nice and write a little bookmarklet that does this for her:
<a href='javascript:var briansamson_com_wordcount=function(){var tas=document.getElementsByTagName("TEXTAREA"),wc="",regex=/[a-z0-9]b/igm,match,s=document.getSelection(),c=0;for (var i=0; iWord Count
Drag this link up to your bookmarks bar and click on it and it will tell you the number of words you’ve typed into all of the text areas on the page. It reports the count back using the internal name of the field, but that will usually be enough to figure out which field you’re typing in. It also counts the number of words you have selected in the web page, just because its easy to do. I hope this helps somebody else out there meet arbitrary post length guidelines.
Internationalization is Hard
Posted: October 23, 2009 Filed under: Computers, Sofware Engineering Leave a comment »Either that or programmers are lazy. I’ve been working on an App at work that requires internationaliztion, and until you get used to doing it, its very easy to let strings just leak through. I just installed Google Chrome, and right there on the first prefs page is a whole slew of I18n bugs: 
They missed a translation and another couple don’t fit in the space and just run off the page into oblivion. These bugs are annoying to fix, but at least they are easy to find: Just change the locale on your computer while you develop. Only one person on the team really needs to do this.
I have my computer’s language set to spanish, so I notice these problems right away while testing, which is certainly something you should do for at least a round of QA before you ship, but preferably while you develop. You can make it fun if you write a pirate locale or something, but you should absolutely be running your app in a language other than english before you can even come close to calling it finished.
Yahoo learns nothing, enforces “security questions”
Posted: October 1, 2009 Filed under: Don't do that 1 Comment »I play fantasy football on yahoo. For the last few weeks they’ve been hassling me to enter “security questions” so I could reset my password if I forgot it. I already have an alternate e-mail address registered with them in case I forget the same password I’ve been using for 5 years, so I’ve been clicking “Later.” Until today, when I went to adjust my team and saw this:

This is infuriating to me, especially considering how badly yahoo got burned in the media after that UTenn student “hacked” Sarah Palin’s e-mail address. I really wish that people would stop doing this, or at least make it not mandatory. Even Time Magazine had an article about how stupid these questions are.
So please, internet, I’m begging you to stop doing this.
Don’t send “Unsubscribe Confirmations”
Posted: July 23, 2009 Filed under: Don't do that Leave a comment »I recently got some spam from American Airlines, and like usual I went down and clicked the unsubscribe link. A few minutes later I get this:
from American Airlines <AmericanAirlines@na.info.aa.com>
to my@email.address
date Thu, Jul 23, 2009 at 9:26 AM
subject Unsubscribe Confirmation
mailed-by na.info.aa.com
This message is to confirm our receipt of your request to receive no further messages from American Airlines.
Thank you.
Message-Id: <hrc2l0f5nsz6vx4cn6v76Splnv@na.info.aa.com>
This is exactly the opposite of what I wanted to happen. Whoever came up with the idea to send an email to confirm that you will receive no more emails should die of ghonnorea and rot in hell.
Sharing internal Javascript libraries between Rails projects using SVN and Rake
Posted: June 19, 2009 Filed under: Computers, Rails, Sofware Engineering Leave a comment »I’ve been developing rails apps for over a year with Six Fried Rice, and we’ve been using ExtJS as our Javascript framework. As is quite common in industry, we’ve developed internal libraries for Ruby, Rails, vanilla Javascript, and ExtJS. When I used to write Java, we would have our shared libraries in separate source control projects, package them up as JARs and just distribute binaries, which we would check in to each project that used them. This worked fairly well because of 2 important reasons:
- Our libraries were mature
- They could be developed independently of a certain project
Number 1 is nice because the libraries don’t need to be updated often, so you usually only needed to spend time getting them set up at the start of a new project. Number 2 was true because our libraries usually revolved around authentication/single sign on and they were maintained by an entirely different group in IT. This is more typical of large enterprise development.
So when I wanted to do something similar for our rails/js libraries, I initially turned to gems and plugins. Either of these solutions would work fine for our modifications to Ruby, and we do currently maintain 2 internal rails plugins that handle our ruby convenience methods and also some changes we’ve made to rails (that haven’t made it into core rails yet….). We keep those plugins in separate subversion projects, and everything work great.
Now enter Javascript. We write lots of javascript. Many times as much as we write ruby. The Javascript also tends to be dirtier than ruby, and we run into a lot of problems that are much harder to reproduce so I usually prefer to test changes to the libraries in the context of the applications that use them. This JS code is also very immature and changes frequently, often daily. The traditional method of developing a library on the side and updating it occasionally breaks down for this case, so the situation for the JS libraries is the opposite of the traditional way I described above:
- Immature code that changes frequently
- Development depends on applications that use the library
It turns out that there is a nice property that is supported by subversion called externals. This allows you to set a directory in one repository to link right to another repository. You can make changes to the library right there, commit it back, and then go run update on a different project and it will go grab the changes. This is perfect, except for one thing. Say I branch off of trunk to write a big new feature that ends up adding a lot of code to the Javascript UI library. This branch may take a few weeks to finish and the whole time I’m committing new code to the javascript, which gets propagated to trunk everytime I update, which could certainly introduce bugs that we might not want in other branches.
This leads me (finally) to the point of this post. I solved this by writing a rake task to “freeze” and “unfreeze” the library. When it is frozen, the library just stays at a version we know to be stable. When you want the latest code, or if you need to make changes, you unfreeze it and test. We’ve been using this solution for a few weeks now and its works really well, so I decided to post the rakefile that handles installation and freezing of a javascript library, called ‘jslib’ by default.
Now I can do cool stuff like
rake jslib:freeze
which makes sure that the library stays at whatever version it is at right now forever, or until I issue:
rake jslib:unfreeze
which sets it back to HEAD and updates. I don’t think this is a replacement for gems/rails plugins, but it does a very good job of handling our shared javascript library. Thoughts?
