Archive for April, 2009

Traveling…

Monday, April 20th, 2009

… and unlikely to post again till May.

The Problem with Healthcare

Thursday, April 16th, 2009

Matt Asay posed a suggestion today on CNet.com that our healthcare problems here in the US could be solved by “Open Source”.  He points out that the current information architecture is designed to handle the needs of the insurance and collection agencies, not the doctors and patients.  Essentially, the systems handle billing, not patient care.

So the solution is easy, right?  Have the open source community create a system for free that handles the patient data for the doctors, efficiency improves and everyone wins!

Trust me, if the solution were that easy, it would have been done already.  There are a number of movements to digitize patient records and test results and otherwise bring the medical profession into the digital age, but still, as was pointed out in the article, only 34% of these records are transmitted electronically.

To give you an idea of a common problem, suppose that a hospital created a digital records system that would allow patient data, test results, care instructions and anything else you might need to be stored electronically.  A doctor goes to see a patient and takes his patient history and symptoms, discusses treatment and care and decides which tests to order. 

  • How does she enter this data into the system? 
    • Does the room have a computer in it? 
      • If it does, how is it secured against patient/visitor access for those long periods of time when the patient is alone in the  room? 
      • If it is secured, how is authentication done so that if there is an emergency other doctors/nurses can quickly pull up the patient’s data.
    • If there is not a computer, is the doctor expected to take notes and then enter it into the system later?
      • Does the doctor enter the notes or are they transcribed by someone else, or automatically scanned?
      • If the doctor doesn’t enter the notes, how is accuracy handled and verified?  A mistake in transcribing a dosage could kill someone.
    • How do you handle down-time?
  • Who controls access to the data?
    • Can the patient deny the doctor access to certain “sensitive” data?
    • Can an insurance provider see the data?
    • How do you verify the patient data against the actual patient?

Answer these questions and you begin to have a solution (and it is only a beginning, I make no claim to even understand the full context of the issue)., but nowhere in these questions is there a problem with proprietary solutions.  Doctors and nurses don’t care if the source code is available.  They just want it to work with them, not against them.  Open source in software is simply a non-issue.  Smart folks are out there working on the real problems right now, and they are making progress.  Let’s not confuse the issue by demanding they release the source code under a belief that if we simply make the software open, it will solve everything. 

Shaking the Doldrums

Wednesday, April 15th, 2009

How do you decide when its time to change projects, companies, jobs?  How do you decide to move from software development to management or back again?  I have one simple test – persistent boredom.

After much experience I have learned that persistent boredom is the single best predictor that it is time for a change.  The problem is that boredom can be comfortable.  Boredom is predictable.  It can be relied on in a crisis, and it keeps the paychecks coming in.  But boredom forces you to remain still. 

If you seek out new experiences and new opportunities, you cannot be bored.  If you are not stretching yourself or your abilities you are not growing, you are not moving.  In essence you become bored.  Most problems with a job seem to stem from this boredom.

A bit of boredom is natural.  We all have lulls where things aren’t as exciting as they could be.  I tend to have a hard-time with the post-release lull where everyone coasts for a few days while we re-engage with our customer about the next release.  But that is a temporary boredom, and during that time I am actively working to alleviate it.  The boredom I am talking about is a persistent state.  When I enter into that prolonged apathy, I know it is time for a change.

Standing out in a Crowd

Monday, April 13th, 2009

How many of you have ever commented on a manager’s lack of technical ability and/or knowledge?  I’d wager that most of us have been astonished at least once in our careers by the technical incompetence of someone in charge of a technical project.  A manager who doesn’t understand what “compile” means, who can’t grasp the concept of “automated testing”.  Someone who doesn’t understand the domain of their employees.

It is difficult to work for someone like that.  It can be difficult trusting their judgment when you know that they can’t grasp the simplest functions of your day-to-day job.  Now, before you think this is another internet rant about clueless managers, let me ask you a question:

Can you have a conversation with your customers in their domain? 

If you write financial software, can you sit down and talk with the financial analysts who use their software, without requiring the use of a “domain expert” to translate for you?  If you can’t, you should consider learning how. 

Too often we focus on learning our domain.  We learn all the neat tricks in our chosen language.  We become experts in the quirks of automated memory management.  We learn about the differences between allocating on the stack versus on the heap.

Honestly though, when was the last time a successful release hinged on some arcane development trick that only 10 people in the world know about?

Every software release hinges on the ability of that software to solve some pressing need of its customers.  And unless you are selling software and services to other software developers, those customers do not care about the software development domain.  They care about the financial services domain.  They care about the medical domain.  They care about the cellular phone domain.

Become a domain expert.  Learn to talk to your customers so you can anticipate their needs before they do.  Don’t be content to be just an expert developer, strive to be more, so that the next time a customer calls you, you don’t become that clueless manager, asking what exactly it means to compile your software.

How Much Should I Charge?

Friday, April 10th, 2009

Most developers I know have wondered what it would take for them to “cut the ties” and go out on their own, but inevitably are ill-prepared to deal with the change.  The biggest problem most of them have is calculating their costs.  Too often they charge rates that are simply a patchwork of guesses and hopeful wishing that they are competitive.  They can’t understand why they aren’t making as much money as they should be.

So how exactly should you calculate your rates?

If you just want a ballpark figure, a rule of thumb to get you started would be to take your take-home pay rate and multiply it by 2.5.  Calculating your take-home pay rate is simple:

PayRate = DesiredAnnualSalary / PaidHoursPerYear

How many paid hours are there in a year?  If you assume a standard 52 week year with a 40 hour work week you get a total of 2080 hours (more or less – it is actually missing a day or two depending on the year, but its good enough). 

PaidHoursPerYear = 2080 hrs/yr

So a good estimate of your hourly-rate would be:

BallparkHourlyRate = PayRate*2.5

Using these two calculations, if you wanted to make $60k/yr, you would have a pay-rate of $28.84/hour, and an hourly rate of roughly $72.10/hr.

Of course, that rate is only useful as an estimate.  What you really need to do is calculate a rate based on your own circumstances.  To do that, you need to account for much more.

Calculating Hours

The first thing we need to change is the number of hours in a year.  When you determine your pay-rate you include all of your paid time-off.  When you calculate your hourly rate, you do not.  This means that we need to remove all the vacation and holiday time from our hours in a year. 

WorkingHours = PaidHours – VacationHours – HolidayHours

If you assume a 10 holiday year and 4 weeks of vacation, you would get the following number of working hours per year:

WorkingHours = 2080 hrs/yr – 80 hours – 160 hours = 1840 hrs/year

However, not everything you do during a day is “billable”, which is the number we really need.  So our final calculation reduces the number of working hours by the amount of time spent on “overhead” – tasks that cannot be billed but are still necessary:

BillableHours = WorkingHours – OverheadTime

Overhead time can range anywhere from 20% to 50% of the time.  I usually use a 25% overhead rate.

OverheadTime = .25 * WorkingHours

Calculating Salary Costs

Now that we know how many hours we can bill for in a year, we need to determine how much total money we need to make to cover all our costs.  Of course, our major cost will be our salary.  We will also be responsible for the employer portion of Social Security taxes and Medicare, along with any state taxes (for simplicity, we will combine these into a single number).  We should also include any retirement benefits we may have to pay, and the cost of insurance:

AnnualSalaryCosts = DesiredAnnualSalary + EmployerTaxes + RetirementBenefit + EmployerInsuranceCost

Currently, Medicare costs 1.45% of the salary and Social Security costs 6.2% of the salary (Social security has an income cap, but I am ignoring the cap to keep it simple).  State taxes will depend on your state, so I am going to ignore them:

EmployerTaxes = .0145 * DesiredAnnualSalary+ .062*DesiredAnnualSalary

Insurance costs can vary greatly, so I am just going to use a rule of thumb that says it will be about 25% of the annual salary:

EmployerInsuranceCost = .25 * DesiredAnnualSalary

Finally, we can use a fairly standard 6% matching program as our retirement benefit:

RetirementBenefit = .06 * DesiredAnnualSalary

If we combine all these different numbers and assumption, we get the following equation:

AnnualSalaryCosts = 1.3271 * DesiredAnnualSalary

Calculating Total Cost

You may have noticed that the multiplier used to calculate the salary costs is a little over half the multiplier we used to create our ballpark estimate.  So what else do we need to account for to determine our total costs?

There are 3 major areas left to consider.  The first is equipment.  This means computers, software licenses, etc.  The second is facilities.  This means the cost of renting an office, keeping the lights on, the water running, and the internet surfing.   The final major component is the profit.  This is the money that goes back into the company to build and expand it and keep it running.  Adding these final items into our cost calculation gives us the following:

AnnualCost = AnnualSalaryCosts + AnnualEquipmentCost + AnnualFacilityCost

TotalAnnualCost = AnnualCost + Profit

Profit is usually some percentage of the annual cost.  A modest profit would be 10%, but a 20% profit is not unreasonable.  For a single person, the facility costs can run from about $500 a month up to as much as $1000 or more.  The equipment costs will obviously vary depending on your needs, but I usually assume about $3000 a year.  That covers a new computer every few years and license costs for any needed software.

Calculating the Hourly Rate

Now that we know what our total costs are, and how many billable hours we have, we can calculate a much more accurate hourly rate:

HourlyRate = TotalAnnualCost/BillableHours

Using our example salary of $60K/yr and the assumptions  list above (with a $500 monthly office cost), we can calculate our actual hourly rate to be

HourlyRate = 101409 / 1472 = $68.89/hr

Of course, I would round that number up to a nice and even $70/hr and use that as a basis for all my calculations.  If I needed to know how much I should bid for some project, I would first estimate what I need to do and how long it will take me, then multiply that by my hourly rate.  If I was making a commercial piece of software, I would use that development cost to help guide how I set its price.  If I combine that information with sales forecasts, i can get an idea of whether I will even be able to break even on the project.

Knowing your true hourly rate is essential to determining how to price yourself and your skills.  Even if you are working for a company it is worthwhile to calculate it simply to have an idea of what your time is actually worth.  Plus you’ll know how much to ask for the next time a friend calls up asking for technical support.

Erecting Barriers

Thursday, April 9th, 2009

I am often surprised at how difficult it can be to give other people your money.  Too many sales departments in companies providing business services seem to be under the unfortunate impression that their software/service is *so* compelling, that it can dictate the terms of the conversation.  They erect barriers so they can control the sale process and prevent simple comparisons.  By controlling the terms and content of the sales and marketing process, they believe that they can maximize the sale.  Of course, they all claim to do this to ensure that their potential customers “understand” their choices and “select the option that provides the best value”.

Unfortunately, I have yet to encounter a piece of software or a business-related service that is so compelling that I will not walk away from it if I cannot control the terms of the sales process.  As someone who is frequently asked to make purchasing decisions, I have dealt with a wide spectrum of approaches to sales and have discovered a number of common barriers that will almost immediately cause me to look elsewhere.

  1. No up-front pricing.
    If you can’t tell me how much your product will cost, I can’t tell you how much I will pay so don’t ask me how much money I have budgeted.  When asked, I will generally lie to you and expect that you are lying to me.  Your base price should be posted on your website.  If I have to work to find your price, I will assume it is over my budget.
  2. Sales Inquiries do not *require* anything.
    If I try to submit a sales inquiry on your website, you should accept it.  If I don’t want to give you my phone number, use my email address.  If I don’t want to tell you where I heard about you, just be thankful I found you.  It is not my job to sell myself your product.  All I want to know is if it will meet my needs and you don’t need to know where I am located to tell me if your package can work with WordPerfect documents.  If your contact form bounces back to me, I’m not liable to try again.
  3. I am more than capable of selecting the “best” option.
    I don’t need your help unless I ask for it.  If I ask for it, it usually means you failed somewhere, so you better work twice as hard to answer my questions.  I do not need to spend an hour on the phone taking a survey about my problem.  I know my problem.  What I want to know is how you will solve it, and if I have to spend longer than 5 minutes figuring that out, I won’t.
  4. Contact must be done on my terms.
    Making these decisions is a very small part of my overall responsibilities.  It is not my job to listen to your sales pitch.  Give me a variety of ways to contact you and make yourselves available on my schedule.  Do not take my contact information and contact me on your schedule.  Just because your contact form demanded my phone number does not give you the right to use it.  Besides, I probably used a fake one anyway.

I have found that companies that use these barriers generally do so because of a lack of confidence in their product.  They usually have a number of close competitors and they are afraid of making the process transparent because they believe it will give their competitors an edge.  This may be true, but it is not my problem.  All it indicates to me is that your product or service is not as compelling as you want me to believe.  If it was, you wouldn’t be worried about your competitors because your product or service would stand on its own merits, and a product or service that can do that is always the best option.

Adventures in Remoting – Part 2

Wednesday, April 8th, 2009

In my last post I covered some of the lessons I have learned during my time spent telecommuting.? Today, I want to focus on some of the things my team has learned dealing with a remote version of me.

Integrating Remote Employees

  • Communicate, communicate, communicate.
    • Sound familiar?? If you think your team is communicating enough to the remote employee, you aren’t.
  • Have the employee start in the office.
    • The team needs to time to integrate a new member, and that is best accomplished locally.? Before an employee is allowed to telecommute full time, they should be required to work locally for at least a month so that everyone can meet and learn to work together without the additional burden of being remote.
  • Video-conferencing works when travel doesn’t.
    • Obviously, it would be preferable to have the employee local for meetings and so forth, but that can be prohibitively expense and time-consuming.? Install and use a reliable video-conferencing system, along with virtual white-boards and any other program that can make the meeting virtual.
  • Ad-hoc is not a process.
    • Dealing with place- and/or time-shifted employees amplifies any and all randomness in your process.? If your build is not automated, it will break.? If your code is not controlled, it will be lost.? If your tasks are not prioritized, your release will be late or won’t have needed functionality.? Your process must be able to handle the absence of hallway conversations.? If there is ambiguity or if it is too onerous, it will not work.? Be prepared to tweak, modify, and retool your process to meet your needs.
  • Define roles and responsibilities up front.
    • Without a clear delineation of who does what, there will inevitably be duplication of effort.? This is amplified when a remote employee may not discover the duplication until several days later.
  • Take every opportunity to include the remote employee.
    • Remote employees are just as important to your team as your local employees, so include them in everything.? If the team is celebrating a milestone, ask your remote employees to attend.? Cover their time and costs.? Treat them as if they are local and offer them the same opportunities the rest of the team has.

Obviously, this is not a complete list, but I have found that when my team observes these simple points, the whole experience improves.? When one is missing, the experience quickly devolves into unpleasantness for everyone.

Adventures in Remoting – Part 1

Tuesday, April 7th, 2009

In my day job, I have one of the perks that many folks dream of – I telecommute full time.? Working remotely (I am not even in the same time zone as the main team) requires a level of discipline from both the remote members and the overall team that most groups are not prepared for.? These are some of the things I have learned.

Working Remotely

  • Communication, communication, communication.?
    • If you think you are communicating the right amount, you are not sharing enough.
  • Who pushes you to excel??
    • You have to learn to work and be productive through the periods when you might have other distractions or the rest of the team may not have enough work to occupy you.? You need to be able to help the team towards your goal even when the team may not know what to do next.
  • Work space vs. personal space.?
    • This is not just the standard “have a private room with a door you can shut” advice.? Use a separate work-only laptop.? Log into a work computer remotely via VPN.? Create a virtual machine that contains your work configuration.? When you are telecommuting, you should be working on the same configuration as if you were in the office.? This improves compatibility with the rest of your team, and helps reduce the temptation to play just one more round of solitaire.
  • Manage your career.
    • Telecommuting full-time means that you do not have as much of an opportunity to build contacts and the relationships that are necessary to excel in your career.? This means you must focus that much more on managing and building those professional relationships.? Try to make travel on-site as often as possible to remind the team that you are an actual person.? Join professional groups and attend conferences.? Make yourself indispensable.? Work with your manager to develop a plan and make sure that you follow through.? Update frequently with your manager to ensure he/she is doing the same and nothing has changed.
  • Attack problems when they occur.
    • If something is wrong or bothering you, attack the problem head on.? Do not rely on someone else to notice and fix the problem because no one will.? Learn to deal with people in a straightforward, honest manner and learn to accept criticism.?
  • Prepare for change.
    • Unless you and your team has an established history of telecommuting, there will be growing pains which necessitates change on both sides.? Processes and roles will be updated and modified.? Privileges will be added and removed.? The organizational structure of the team will change.? Be proactive in making these changes, even if you do not know exactly what to do.? Experiment and admit failure if it doesn’t work out.? There is no set of magic rules and processes that will work for every team and every situation, so commit to finding those roles and procedure that work for you.

I can’t admit to always following all of these items, but I have found that when I do adhere to these lessons, things tend to go much smoother.