How to Sell Enterprise Software

iStock_000005223179XSmallOne of the biggest differences between selling software to small businesses versus selling into the Enterprise space is the price. Most people think that it has to do with how well the software scales and it’s ability to do its job on an “Enterprise” level, whatever that it supposed to mean. Others will say it has to do with the feature sets and whether you bought the Micro-ISV edition or the Enterprise Edition. Simply not true.

The one and only difference is the total price on the bottom of the bill. And it is this total price that dictates whether or not you need sales reps to sell your software.

First, let me quantify roughly what I consider to be the different market segments. This is mostly based on my experience as a Symantec partner, so your definitions may vary but I want to give you an idea of what I’m talking about. In my world, up to 1,000 client computers is considered small to medium business(SMB), up to 5,000 is the Enterprise, and above that is Large Enterprise.

The Problem

At any given company, managers and directors have a certain level of purchasing authority. Below a certain dollar amount, they have free reign and can buy whatever they feel is appropriate and within their yearly budget without getting a signature from their manager for approval. So $50 isn’t a problem. Spending $50,000 isn’t quite as easy.

The problem of selling “Enterprise” software comes about because of the size of the company making the purchase. If I’m selling widgets for $50 each, I can sell just one to an Enterprise level company and they won’t even think twice. But what if they want one for every employee?

Suddenly the price tag for your widgets went from $50 to $50,000 for a 1,000 employee company, and to $250,000 for a 5,000 employee company. These companies make millions, or even billions but they’re not stupid. They put spending controls in place to ensure that people aren’t wasting money on frivolous things. It’s just common sense.

Unfortunately for the vendor, this prolongs the sales process from what might have been a few minutes on the vendors’ website, to one that takes several weeks or even months to complete. This is why sales reps are hired to sell into Enterprise accounts. The sales process needs to be managed from beginning to end.

What does the sales rep do?

Well, they buy dinner, they buy drinks. They make sure you get drunk and have a good time at whatever event they happened to convince you to come to. Eventually, you like them enough, or are drunk enough to blow thousands of dollars of money that isn’t yours and everyone is happy.

I’ve seen that happen, but most companies don’t really work that way. Mainly, it is the job of the sales rep to manage the sale and try to close the deal. That means determining if there’s an opportunity for a sale, and then driving that sale to its Natural End. Note that I don’t say to completion. The Natural End of a sale can be one of four things.

  1. You won the deal
  2. A competitor won the deal
  3. The sale got pushed into the future
  4. The sale died somewhere along the way

Winning the deal or losing it to the competition are self-explanatory. Sales get pushed to the future for a variety of reasons. Some are budget related, some are concerns over the product or vendor, etc. We’re going to focus on the last outcome,  which is that the sale died.

When a sale dies, it typically happens because you weren’t paying attention to something important. This tends to be the most painful outcome. If you are head to head with a competitor, at least you had a shot at it. When deals get pushed, you still have a shot, but you won’t receive a PO anytime soon.

The biggest problem with deals that die is that you wasted your time, money and effort chasing something that you never had a chance at winning. Everything you did was for something that wasn’t ever going to happen. Unfortunately, we’re all too human and think that because the customer is talking to us, we have a chance at winning.

Let me break you of that habit right now. Just because a customer is talking to you and likes you doesn’t mean they’re going to buy anything from you. In fact, it might be your best friend in the whole world on the other end of the phone who completely trusts you and it still might not happen.

Sales reps are typically compensated by the volume of sales they make, not the relationships they have with the customers they talk to. To be successful making sales at the Enterprise level, you need to spend  your time working on deals that have a good chance of landing, and avoid talking to customers who are either unwilling, or unable to make a purchase. So how do you tell the difference? Enter the sales methodology BANT.

BANT

BANT is an acronym which stands for Budget, Authority, Need, and Timeline. Without all four of these things, any deal you’re working on is going to die before you get a PO. This methodology technically is applicable to any sale, regardless of the price. But it becomes a lot more important at the Enterprise level where you are spending human resources chasing a small handful of customers. A sales rep can only talk to so many customers in a day, but a single website can “talk” to millions of customers all at the same time. So what do these terms mean and why are they important?

Budget – Make sure that whomever you’re talking to has a budget for whatever you’re selling or that they can get one. And remember that just because someone says they can get the money, doesn’t mean that they can. You can have all the ROI justifications you want in your back pocket, and if they don’t have the cash to spend, it’s just not going to happen. Spending $1 million now to save $10 million sounds great, but if they don’t have $1 million, it doesn’t matter.

Authority - Is the person you’re talking to the guy or gal who makes the final decision? Does he put his name on the PO? If not, you need to find out who does make the decision and talk to them instead. It’s ok to ask to talk to this other person. If you’re afraid of offending the person, then you’re in the wrong business. Always try to talk to the person in charge. You can convince every single one of his minions that what you’re selling will really help them out, but at the end of the day, they’re not the ones who have the authority to make the decision. Without speaking to him or her, you won’t know if there are other projects that take precedence.

Need - Is there a genuine need for what you’re selling? At the personal level, luxury items like chocolate and nice cars are not absolutely necessary. A Honda gets you to the same place as a Ferrari. It might be slower, but it gets the job done. Find out if what you’re selling is a necessity, or if they can get by with the way things are today.

Timeline - How long can things go on the way they are without addressing the issues that your product or service would address? If you sell RFID tags which help companies do inventory, ask how long they can do their inventory manually. If they can go forever, move on to the next lead. Remember that you can’t push a rope.

Summary

It’s important to make sure that the people you’re talking to have the ability to move forward and make a purchase. If they don’t have the ability to move forward, it doesn’t matter how badly they want what you have to offer. It’s a little unnatural to avoid calling people whom you’ve started to develop a relationship with, but it’s necessary if you want to make the best use of your time.

The fact of the matter is that this methodology applies whether you’re selling Enterprise software or dish detergent. Understanding the methodology behind the sales process is the key to being successful, no matter what it is that you’re actually selling or who you’re selling it to.

Do you have a favorite sales methodology that works for you? Leave a comment and let us know.

Sales reps are typically compensated by the volume of sales they make, not the “quality” of the customers they sell to.

A lesson in economics for the CFO of Microsoft

I happened across this little tidbit a few days ago and was a little surprised that someone as high up as the CFO of Microsoft might actually think this way.

Microsoft CFO Chris Liddle had this to say on a conference call after their Q3 earnings report.

Businesses’ reluctance to upgrade PCs, he said, has to fade eventually. “This can’t continue forever,” Liddell said. “Eventually those PCs wear out and have to be replaced. We hope and expect (the refresh cycle) to be next year.”

I realize that picking on Microsoft is like trying to hit the broad side of a barn with a rock, but this is just so easy I can’t help myself. Really Chris? Are you kidding me? I’m sure that as the CFO of Microsoft, you probably think that computers break every three years like magic. The warranty on the hardware expires and *POOF*, the computer dies and is thrown in the recycling bin, along with all the Microsoft software that was installed. Naturally, this happens in every company around the world, and naturally they all rush out and buy a brand new computer and brand new software for every employee as soon as the first one breaks.

The reality is that it just doesn’t work that way.

Skeptics who read my blog are going to point out that he said “eventually”. I’ll concede the point that “eventually” everything is going to wear out, but he “expects” that to be next year. Computers tend to be different than most other physical goods and if this recession has shown people anything, it’s that doing a full hardware refresh for the entire company every three years is no longer necessary. In fact, I would argue that it hasn’t really been necessary for the last three years. So what makes the next three any different?

The answer is absolutely nothing.

Companies across the world said loud and clear “We’re not going to upgrade our operating systems to that piece of garbage you call Vista.” And you know the kicker?

NOTHING BAD HAPPENED!

Amazing. Just absolutely amazing. People still bought new hardware though. So, lets talk about why.

Corporate Hardware Refreshes

Companies have a tendency to replace PC’s every 3 years because they want to, not necessarily because they need to. From around 1995 – 2007, companies were conditioned to buy new computers for every employee every 3 – 5 years because the hardware was so dramatically improved in the course of 3 years that they could see instant productivity gains. At the time, buying newer hardware was a relatively inexpensive way to get great productivity increases out of workers for relatively low cost. Moore’s law essentially held true and every 18 months, processing power would double. This loosely translated to doubling the speed of computers every 18 months.

Then the speed of silicon hit a brick wall and it wasn’t cost effective to get faster processors. But Moore’s Law persevered for a bit longer and on May 25, 2005 Intel released the Pentium D. With that release, multi-core processors started to take over the market. Instead of faster processors, you have more of them in a single chip. And the business world was content with the Pentium D, Core Duo, Core 2 Duo, Athlon MP, Athlon XP, and all the other multi-core processors that came out.

Suddenly,  it’s 2007 and Microsoft releases Vista and it bombs hard core. People still refresh their PC’s because they think they need to, but they choose not to upgrade to Vista, instead choosing a 5 year old operating system for their brand spanking new hardware. Now here’s the problem.

All these companies bought dual processor computers with beefed up hardware specs because that’s what it would have taken to run Vista. Compliments of Wikipedia, below are the minimum hardware requirements to run Vista.

Windows Vista system requirements[51]
Vista Capable Vista Premium Ready
Processor 800 MHz[60] 1 GHz
Memory 512 MB 1 GB
Graphics card DirectX 9.0 capable DirectX 9.0 capable and WDDM 1.0 driver support
Graphics memory 32 MB 128 MB
HDD capacity 20 GB 40 GB
HDD free space 15 GB
Other drives DVD-ROM

And here are the specs for Windows 7:

Minimum hardware requirements for Windows 7[94]
Architecture 32-bit 64-bit
Processor 1 GHz 32-bit processor 1 GHz 64-bit processor
Memory (RAM) 1 GB of RAM 2 GB of RAM
Graphics Card DirectX 9 graphics processor with WDDM driver model 1.0 (For Aero)
HDD free space 16 GB of available disk space 20 GB of available disk space
Optical drive DVD drive (only to install from DVD/CD Media)

You’ll notice that the hardware requirements to run Windows 7 are basically the same as they were for Vista.

No business in their right mind bought a computer in 2007 that had a 1GHz processor. Not even notebooks were that lame and netbooks didn’t exist yet. At a minimum, they were at least 2GHz and had dual-core processors because that’s what it took to sell computers in 2007. Computers today are not significantly better than what was available in 2007, as much as Intel, AMD, Dell, HP and all the other computer manufacturers would like to have you believe. All of this means that the hardware refresh rate can be extended for those PC’s bought in 2007 with virtually no ill effects.

Some pretty smart companies over the past few years figured out that if you can extend a hardware refresh from every 3 years to every 4 years, the company will achieve a substantial 25% yearly savings. If you extend it from 3 years to 5 years, it becomes a 40% yearly savings. That means that a company with 1,000 employees using computers with an average cost of $1,500 are going to spend $500,000 on hardware alone every year if they do a complete hardware refresh every 3 years. If they are able to extend it to four years, they’ll save $125,000 each year and extending the hardware refresh to 5 years, saves $200k every year.

When the guy in charge of the IT budget is being forced to do more with less each year, he’s going to quickly realize that buying new hardware for every drone in the company isn’t going to help him do his job. He’s going to find places to cut the budget which doesn’t involve the lost of his employees. The hardware refresh cycle is the perfect place because there’s very little downside and a huge upside.

Why Companies Refresh Hardware

There’s a short list of reasons why companies use a 3 year hardware refresh rate.

  1. They have money to burn
  2. They’ve always done it that way
  3. The hardware today is so much better than it was 3 years ago
  4. The warranty on the hardware has expired

That’s about it. Until a few years go, the first three were true. They’re not anymore. As for the fourth, it’s called a warranty. Most major computer vendors offer 3 year warranties on computers for their corporate customers. Depending on your vendor, you may be able to swing a 4 or even a 5 year warranty for just a fraction of the cost. Replacing parts is a heck of a lot cheaper than replacing entire computers, so they’ll save buckets of cash by extending the hardware refresh, whether they get extended warranties or not.

Back to Microsoft

The latest hardware refresh has obviously been delayed for quite some time and it is impacting both Microsoft and the major computer vendors. As the economy improves, we’re going to see a lot of companies that initially pushed out their hardware refresh commit to it and spend the money. Microsoft will probably still sell millions of copies of Windows 7 and Bill Lumbergh’s stock will go up 1/4 of a point.

Unfortunately, many of these companies are going to realize that the latest hardware refresh didn’t do them a bit of good beyond renewing their hardware warranties. The next hardware refresh will get pushed out even longer as companies realize that it just isn’t necessary. When that happens, Microsoft is going to be in real trouble, as are the PC manufacturers whose major revenue source is selling hardware.

Earlier this year, Dell bought Perot Systems in an effort to boost their lucrative services arm and compete better with HP and IBM. Smart move. I think they see this coming and realize that the virtualization trend isn’t the only thing working against them. Moore’s law has been undergone a transition such that it now applies to overall computing power, not just raw speed. Past a certain point, 99% of corporate employees just don’t need more computing power. It’s going to waste. So why should you upgrade those PC’s?

The smart answer is: You don’t.

Microsoft needs to start looking ahead beyond Windows because it’s not going to be a cash cow for much longer. The fact that people are still using an operating system that is bearing down on 7 years old is telling, especially when it’s in preference to a more recent release. It means that customers don’t see a compelling reason to upgrade. This is part of the reason that Apple is doing so well with the Mac.

Without a compelling reason to upgrade, customers aren’t buying new licenses or upgrading old ones and Microsoft isn’t making nearly as much money. Microsoft uses the money they make from Windows to fund other business lines, so if the margin on Windows starts to falter 5 years out, they’re going to have to make some hard choices. It makes me wonder if I’ll even care in five years. Will you? Let me know your thoughts by commenting below.

Outsourcing for Entrepreneurs

If you’re an entrepreneur, you should try to outsource as much as you can possibly get away with.

In the tech industry, ‘outsourcing’ is a dirty word. Outsourcing. The very word invokes thoughts of high technology jobs being sent overseas from the US to be fulfilled by people in India or China. This is seen to be unfortunate for tech workers in the US. It’s a widely accepted misconception that if you don’t speak English well, then you’re somehow less intelligent. If you don’t speak English at all, you’re somehow better off than if you spoke it poorly. No English means you never learned and it’s not your fault. Poor English translates to idiocy. This is obviously wrong, but I digress.

What many people don’t realize is that outsourcing is an entrepreneur’s best friend. Now, before you track me down and smash my car headlights with a baseball bat, let me explain what I mean.

Most businesses outsource various functions and it’s widely accepted as standard practice. Don’t believe me? Go look up the definition of “outsource“. I’ll wait.

Done yet? I didn’t think so. Seriously. Go read the definition, it’ll take you 10 seconds and prove the point I’m about to make.

Basically, the definition of outsource is to subcontract work, to contract work out, or to obtain goods or services from an outside supplier or source. While in the paragraph above, I mentioned outsourcing from the US to China, that’s not in the official definition at all. The idea of outsourcing to China or India are connotations of the word that we have become accustomed to. To help out the every day entrepreneur, I’ve put together a list of five things you should always outsource which illustrates the areas for outsourcing that you can clearly benefit from as an entrepreneur.

1) Payroll – You can do your own payroll, but it takes time and effort. You can also be on the hook for any mistakes that you make. Is it worth it to do it yourself? In my experience, it isn’t. Payroll services from either ADP or Paychex will only cost you around $25 per pay period. If you assume it would take you an hour to do the work, then $25/hour isn’t a bad price. If it would take you 2 hours, then this is an absolute bargain. Unfortunately, as companies expand beyond one employee, the cost increases for each employee and it can add up quickly. Most companies still outsource this function, if for no other reason than to shift liability and to get the benefits of direct deposit.

2) Tax preparation & Accounting – I still do my own accounting, mainly because I feel like I need to have a solid handle on my business finances. On the other hand, I haven’t done my own taxes in ten years. I remember the first year I owned a business and tried to do my taxes on my own. Ten hours later, I wasn’t even half way done. I cut my losses and paid H&R Block to do them from scratch. It took them two hours and about $350.

3) Health/Dental care – I’m not going to bother buttering you up with this one. I know some doctors self diagnose and all, but I’m hardly a qualified physician, and even if I was, I can’t write myself a prescription for Vicodin, as nice as that might be sometimes.

4) Website/Email hosting – Website and email hosting is one of those situations where if you know enough about running your own server to be dangerous, you can easily make the wrong choice. There are a lot of things you need to think about if you’re going to host your own website and mail servers. I’m not referring to colocation or dedicated hosting. I’m referring to running a server out of your basement/office that is publicly accessible and hosts critical business services. There are so many things that you need to worry about. Sure, it’s cheap enough to take an old computer that’s lying around and slap a Linux distro on it, but what about a static IP address? It costs a lot more for that. How about UPS backup systems? Tack on a few hundred for a good one. And what happens when the power goes out for two full days? Your measly UPS isn’t going to cut it. I actually considered doing this for a while to save myself an extra $50/month and eventually decided against it. When your business depends on things like this, it needs to be reliable. There are plenty of low-cost alternatives out there.

5) Legal services - This is basically the same as health/dental care. You’re just not qualified to do it. If you know what to look for, you can certainly cut down on the amount of work that your attorney has to do by pointing out your concerns, but don’t think that you can completely replace him. There are nuances to the law that you’re just not familiar with.

There are certainly many other things that companies outsource, but this list clearly illustrates a number of areas where most companies outsource services and don’t think twice about it and you should too. These forms of outsourcing are perfectly acceptable because for most companies, it is not the core business to provide health or dental care for anyone, let alone company employees. The same goes for payroll services or utilities. Last I checked, I wasn’t aware of any company that had a giant hamster wheel in the back of the factory where workers could run to turn a generator so the lights would stay on in the warehouse. For the record, if the “employee hamster wheel” ends up in a Dilbert cartoon, I want the credit.

There are two fundamental reasons why a company chooses to outsource a particular task or job.

1) It is not your core competency.
2) It is not cost effective to perform the task in-house.

Obviously, if you don’t know how to do something, then you should outsource it. But number two is a lot trickier. Most entrepreneurs know how to do a great many things. That’s why they’re entrepreneurs. The trick is being able to differentiate between what you need to do yourself, and what you could do but makes more sense to outsource from the standpoint of either time or money. I’ve been giving a lot of thought to what time really means to an entrepreneur. Time is far more valuable than money. Once spent, you can’t get it back. I read that somewhere once, so I won’t be taking credit for it. But it’s so very true. If you know where that came from, please leave a comment and I’ll give credit where credit is due.

The bottom line is that if you have the ability to outsource a job or task, you should seriously consider it if doing so is going to save you time or money. What are your thoughts?

Tips on negotiating a great consulting rate

One of the more difficult parts of being a consultant is determining and negotiating your rate with a customer. Consulting is a lot different than product based sales because you can generally charge whatever you think you can get away with. The first few months of my consulting career, I was charging $67.50/hour. It took several iterations for me to find out what my time and expertise was worth, but eventually I did. My rate increased to $70 for my second client, $90 for the third, $120 for the fourth, and eventually peaked at $275/hour.

The key to making good money as a consultant is to know how to negotiate your rates. This is not a skill you generally learn in college. It takes time, practice, and even if you’re good at it, you don’t always get what you want.

A Recent Experience

Recently, I had the distinct “pleasure” of competing against another company for a relatively short contract. The initial engagement was only intended to be a week, but the potential for more work existed. How much more work had yet to be determined, and it was by no means guaranteed.

My competitor bidding for the same work was another consulting company based out of the Midwest. This particular customer is in downtown Boston and given that I’m only a short 45 minutes away (with no traffic, which NEVER happens), I figured that given the standard rates, I should have won hands down due to travel expenses for my competitor. It didn’t quite turn out that way.

My competitor lowballed the deal by nearly 1/3 and went so far as to include travel expenses. I knew for a fact that they were in trouble. They had been cutting employees left and right and earlier this year they let a consultant go just two weeks into an eight week engagement for a client. I understand the customer was pissed, but that’s not my business. The point is that I knew my competitor was desperate, but I couldn’t fathom how far they’d go to win a single week of work.

Making cash with nothing but your computerI was notified by the customer that I would need to match their low-ball rate via a 2 minute phone call in order to be selected to perform the work. I knew the customer had a preference for a local resource and that aside from my company (Moon River Consulting), there aren’t any other options in New England. Before I finish this story, let’s get into a few rules of negotiating.

Tip #1: Never be the first to mention a price

Standard practice for negotiating anything is to let the other person state a price point first. This establishes the minimum or maximum price. It also tells you whether or not you are in the right ballpark for whatever it is that you are negotiating over. For example, if you are going for a job interview and they ask you what the salary is that you are looking for, then you’re in a difficult position to be able to play this game. If you state a number that is too high, you’ll be disqualified. If your desired salary is too low, then again you’ll be disqualified because they will think you don’t have the required skills, regardless of whether you do or not.

Your goal is to land somewhere in the middle, and preferably at the high end of their price range. Unfortunately, they’re simply not going to tell you what that is unless you ask. If they were willing to pay $70k-$90k for the position and you only asked for $70k, chances are that you’ll end up with less because you set the maximum price by saying $70k.

In every case, someone has to mention the price first or everyone goes home. Companies will generally tell you what their expected range is up front in order to save time, but if they’re looking to save money, a lot of times they’ll simply say something like “salary commensurate with experience”. It’s garbage, but you have to live with it.

When negotiating a consulting rate, you will probably be asked flat out to name your price and there’s no way around it. When this happens, you are setting the maximum bar at which you will get paid and need to negotiate down from there. You might want to pad your number a bit to give you some room to negotiate. Don’t be afraid to pad this number if you’re sitting at the table doing a negotiation. If the negotiation is taking place via email, dodge the question and push for a time to talk. “It depends” is a classic consulting answer and it never ceases to amaze me how well this phrase applies to any given situation.

Tip #2: Never negotiate against yourself

If you’re the first to name a price, never let the other person tell you that the price is too high and ask you offer a lower price. This is known as bidding against yourself. There are two problems here. First, you are giving up ground in the negotiation without the other party doing the same. I’ve seen this happen and I’m sure I’ve been guilty of it myself. Second, you will unintentionally give up more ground than you intended to.

For instance, if you are negotiating a consulting rate, most companies will ask you flat out “What is your hourly/weekly rate?” and the expectation is that you have to tell them. Again, you can’t always avoid naming the price first, so this is pretty common. Just make sure you are in the same ballpark as others who offer similar services. But when they tell you that your rate is too high, ask them what they would be willing to pay or what they see as reasonable. If you say $100/hour, and then drop it to $90/hour, you’ve just given away $400/week and received nothing in return. You haven’t even established the bottom yet, so you have no idea if they’re willing to pay $50/hour or $10/hour.

The point is, don’t immediately counter a resistance to your rate with a lower rate, even if you’re desperate for work. In fact, especially if you’re desperate for work. People like a consultant who is confident in their rates, but able to justify them with a list of happy customers who paid that much. Just don’t cross the line into cocky. Prospective customers will walk you out the door and eventually, out of business.

Tip #3: Don’t negotiate your price until you are ready to

Through a long-time friend, I met a guy in Philadelphia several years ago who was interested in having some programming work done for his business. He didn’t want much more than 10-15 hours per week and was looking for what I thought was pretty basic PHP and mySQL work. My thinking was that it was just a meet-and-greet to establish a relationship and then we’d go from there to discuss the work that needed to be done and the rates for that work.

Maybe 5 minutes into the conversation, he asked me flat out what my rate was. Now, in keeping with Tip #1, I tried to dodge the question and was a bit vague, saying that it depended on what he needed done. He pushed hard telling me exactly what programming languages were to be used and how many hours of work each week he was willing to pay for, so I had little choice but to name a number and it was pretty close to our standard consulting rates in the small enterprise space. Immediately he jumped all over it and said it was too high and waited for my response. I certainly wasn’t going to negotiate against myself, so I asked him what he felt was reasonable. Of course he low-balled it at $25/hour, which we both knew was way too low.

I never knew what hit me. It couldn’t have been more than 5 minutes later when we “agreed” on $50/hour and he ended the meeting quickly, saying he had to get going. As I walked away with my friend, I shook my head wondering what the heck just happened. We hadn’t even reached the bar when I realized that $50/hour didn’t even cover my costs, let alone make me any money. In fact, in all my years of consulting I’d never charged as low as $50/hour. What was I thinking?

This is a nice lead in to the next tip, but I haven’t finished with this one so here’s the lesson. If you’re not ready to negotiate a price, don’t. This is really hard to do when someone jumps into negotiating your rate or calls on the phone unexpectedly because you get excited about landing more work and new business. Play it cool. You need to tell them that it’s not a good time and that you will need to reschedule the conversation. Sit down and give it some serious thought, then reschedule. Otherwise, you’re just not prepared or in the right state of mind to negotiate properly.

Tip #4: Establish the lowest rate you can accept and don’t budge

From the previous paragraph, I obviously made two mistakes at the same time. First, I wasn’t ready to negotiate. I had intended to feel out his personality and find his hot buttons, but when he immediately launched into negotiating, I got too jumpy and played the game. Bad idea. Second, I had given absolutely no thought to the minimum rate at which my developers could work for to break even. It didn’t even occur to me until after we’d concluded negotiations. By then, it was too late.

Decide for yourself what the lowest rate you can work for is, and don’t accept a penny less. Losing money is no way to stay in business.

Tip #5: Be ready to walk away if it’s not going to work out

Too many consultants make the mistake of reducing their rate further and further until their prospective customer accepts. You’ll never get ahead this way. If you do good work, people will hire you. You want your rate to increase over time, not decrease. If a customer only has a budget of $2,000 and can’t get a penny more for a week of work, you’d better be willing to work for just $50/hour. If not, you need to walk away and find another customer.

Any retailer will tell you that when you sell at a loss, you can’t make it up on volume. At least not without cross selling other items. It’s “Ok” to do something very short term to lose less money on a particular week or to land a longer term arrangement for more money, but don’t make a habit of it. If a job isn’t going to make ends meet for you, then you need to walk away and find one that does.

In the previous case of my abysmal Philadelphia negotiation, I eventually ended up walking away. There was no reasonable way to renegotiate the rate. For the money and anticipated length of the engagement, it just wasn’t worth the effort.

Back to my story…

After receiving my unexpected phone call regarding dropping my rate, I decided to delay things a bit. I could have agreed to the rate decrease immediately, as it was simply an offer to “match this one, and you win”. However, I wanted to think it over. The last thing I wanted to do was commit to the lower rate, only to end up in a bidding war and have my competitor cut his rate again, forcing me to match him at another lower rate.Make the deal

I also thought about whether or not the customer was bluffing. After all, I had no proof that my competitor had indeed slashed his rates to the bone. Most retail stores operate with a policy of “guaranteed lowest price” by asking the consumer to show them a competitive advertisement listing a lower price for any product. A store will virtually never sell a product at a significant loss, for fear that customers will take them up on it. But the onus is on the customer to provide the proof that the competitor is offering a lower price.

This brings me to the last tip.

Tip #6: Take what a customer says about your competitors’ rates at face value

Was my customer bluffing about the rate of my competitor or no? Maybe, but I’ll never know. I basically had two options. I could either accept/deny the rate decrease, or I could ask for proof, trying to call his bluff.

Had I called his bluff, there were only two possible outcomes and neither was going to be good.

1) If he was unable to produce proof of the competitive rate, then I could probably have maintained the same rate. However, I would have also been calling him a liar. I somehow doubt that calling a customer a liar is going to encourage them to hire me.

2) If he was able to produce proof, then I still called him a liar because I didn’t believe what he originally told me.

This was a lose-lose situation if I were to attempt to call the bluff and I think he’d have gone with my competitor in either case. Ultimately, I accepted the lower rate because I wasn’t going to lose money on it and I knew it would hurt my competitor a lot more than it would hurt me.

Summary

Before you start any negotiation, make sure you know what you want, know what the minimum is that you’re going to accept, and be ready to walk away if you need to. If you’re not ready to negotiate, don’t. Ask for more time or to reschedule, citing a need to do some research or give some thought. Simply saying that you’re not prepared to discuss it is an honest way to handle the scenario. It tells the customer that you’re not brash and are willing to think things through. They may not want to wait, but this does a lot for your credibility as someone who understands how businesses operate.

Last of all, remember that negotiating your rate isn’t about you winning or losing. You need to ensure that you and your customer both get what you need. The key is to establish a long term relationship with your customers so they keep coming back for more consulting services when they need them. If you nail them to the wall during every negotiation, eventually they’re going to walk away and find someone else to work with

Good luck, and happy negotiating.

Optimize Your Code!!!

Last December, Jeff Atwood of Coding Horror wrote that Hardware is cheap, Programmers are expensive. While I certainly agree with the spirit of his premise and eventual conclusion, it is only applicable if you are running Software as a Service. But he doesn’t say this and I wonder if it was an oversight, or if he forgets what it’s like to ship software to other people. There is clearly a case to be made for telling developers to optimize their code in shipping products.

Let’s first take a look at the rules for optimization that Jeff lays out for us.

  1. Throw cheap, faster hardware at the performance problem.
  2. If the application now meets your performance goals, stop.
  3. Benchmark your code to identify specifically where the performance problems are.
  4. Analyze and optimize the areas that you identified in the previous step.
  5. If the application now meets your performance goals, stop.
  6. Go to step 1.

As Jeff points out, you can multiply the performance of an application by throwing hardware at the problem. Take the guys over at Plenty of Fish who upgraded their database server to a HP ProLiant DL785 with 512 GB of RAM and 32 CPU’s. No, that is not a typo, and yes it really means 512 Gigabytes of RAM with eight CPU sockets with quad core processors. This is a classic case of throwing hardware at the problem to avoid a lot of additional engineering time restructuring and optimizing the code to ensure that the server can keep up with the workload. This was probably at least a six figure expense that saved more than a year of engineering time, so a cost-benefit analysis would show that this was well worth it.

The problem lies in the very first step where there are some major underlying assumptions which you can infer from the list.

  1. This is your budget we’re talking about.
  2. You have the budget and means to upgrade the hardware.
  3. The software isn’t a dog out of the box.

First, if you’re running Software as a Service and your installation is the only installation in the world, then it’s easy to justify throwing hardware at the problem. It’s a lot more difficult to tell your customer that he needs to buy new hardware to get your software to run faster. Don’t get me wrong, there are cases where this approach is justifiable. Most applications slow down over time as they outgrow the hardware they are on because the business grows, but the hardware stays constant. Eventually, the system slows down until you either upgrade to a newer (and hopefully faster) version of the software, or you break down and purchase new hardware. I think most of us can agree that this is a reasonable expectation and a customer should be able to budget for this sort of thing over the life-cycle of an application.

The second problem is actually more difficult for most people to understand. It’s easy to forget that the budgets of IT departments in larger companies are far below what they used to be and these companies are completely subservient to their budgets. One person shops and small companies don’t realize this for two reasons. First, they are more profitable on a per-employee basis than a larger company. Second, they tend to look at the total dollar amounts that larger companies are making and ignore the costs associated with actually running the company. Smaller companies simply have a lot more flexibility in making purchases.

In large companies, budgets exist so people can plan ahead and make the best use of their money to move the business forward. The ultimate goal of that budgeting process is to stay in business. If you ignore your budgets, you will spend more money than you make and ultimately, that’s the reason that any company goes under. Upgrading hardware isn’t always in the budget. It might make sense, but it’s not always possible.

The final assumption is worth taking note of and is the real reason for this post, so let me give you an example. Or “the” example, rather. A few weeks ago, I was asked to perform a demo of the final Release Candidate for an Enterprise software package. Minimum requirements for the installation alone were as follows:

  • Windows 2003 Server (64 bit recommended)
  • 4 GB of RAM (16GB recommended)
  • 2 CPU’s (4 cpu’s recommended)
  • SQL Server 2005 (64 bit recommended)
  • 10GB disk space

Try installing that onto a virtual environment on a moderately high end laptop to do a demo for a customer. Seriously, I’d like you to try it. Survey says! bzzzzzzzzz!

I had two main issues with these hardware requirements. First, was that they were absolute requirements to get past the installer. You couldn’t install the software unless you had 4GB of RAM and 2 CPU’s. I think it’s reasonable at the Enterprise level to require “new-ish” hardware for installing your application onto a server. The fact of the matter is that in many cases, dual socket, quad-core servers are not uncommon as a requirement to adequately run an application that touches thousands of computers in an environment. Hardware requirements like these are implemented for the “general good” of the customer.

But come on guys. If the standard mechanism for selling your software is to have a pre-sales engineer install it on a mid-range laptop to perform an on-site demo for a customer, do everyone a favor and drop the hardware requirements a bit. You can barely find a laptop that’s capable of meeting those requirements, especially if it needs to run other virtual machines at the same time. Resellers of your software shouldn’t have to bring a mini-data center to a customer site just to perform a demo. I’ve seen it done, and it’s not fun. If you’re going to enforce hardware requirements for the sake of “scalability” to keep your customers from doing something stupid, make sure that people who know what they are doing can say “I know what I’m doing, so let me do this anyway”.

When you’re designing your application, how you sell, ship, and market your software is just as important as the features you implement.

That’s Rule #1.

When the hardware requirements outlined above are met and it still takes 5 minutes just to get to a login screen on a fresh installation, then something is seriously wrong. I don’t care if it’s common for the “minimum hardware requirements” to mean that it barely runs and is completely not demo-able. Dual CPU’s and 4GB of RAM in this day and age should not mean barely functional for an unloaded web application.

If your software is a dog out of the gate, you need to optimize your code.

That’s Rule #2.

I think that ultimately Rule #1 is more important.

Mike’s Laws of Business

This is the first in a series of articles that I’m writing on How to Build a Consulting Practice.

Once upon a time, I wrote an article called “How to bootstrap a consulting business“. It was a good article and was well written for what it was designed to convey. The last line of the article sums it up pretty well:

The hardest part about the process is having the willpower to make the leap into being self employed. After that, it’s really not that hard.

If you want to get anywhere, you have to start your own business. It doesn’t matter if you do it alone, or if you have one or more partners. The most difficult thing to do is get started. And that gave rise to the first of Mike’s Laws of Business.

Mike’s First Law of Business: A business in motion will stay in motion unless acted on by another force.

Another way of saying that is that unless you stop thinking about what you should be doing and actually start working on your business, it will never get off the ground. When you work for a large company, there are a lot of cogs in the wheel. Not all of them have to be moving to make the whole business move. In fact, at any given time most of them are watching YouTube. But in most cases, it simply doesn’t matter. There are enough people working at moving the business forward at any given time that a lot of people can slack off and the business will still make progress.

If you’re a one man shop and you take a week off, guess how far your business moves forward? That’s right. It doesn’t. As your business grows and has more employees, it becomes easier and easier to keep the ball rolling, so to speak. But in the early stages, you need to really work at it and work hard to do it. If you don’t do something, there’s nobody else who is going to do it for you. So one of the most effective things you can do to drive your business forward is to keep moving and keep working.

Sure you need to stop on occasion to eat, sleep, and watch some stupid things on YouTube yourself, but always keep it in the back of your mind that you need to be driving the business forward.

Mike’s Second Law of Business: The relationship between the profitability of a consulting company measured by P is directly affected by the average expenses E, average billable hours B, the average billing rate R, the number of employees N and the average salary S. This is expressed as P = (B * R – E)/(N * S).

If your billing rate is $50/hour, you are able to bill for 40 hours per week, and your salary is $2,000/week, then your Profitability P is 1.0. That’s not good. It means you’re not making any money. Technically, you’re not losing any money either which is great, but you’re not getting ahead either or saving for a rainy day. If your profitability is less than 1.0, then it’s only a matter of time before you don’t have enough money in the bank and can’t pay your own salary.

Keep these numbers and ratios in mind because they will inevitably affect how well your business does. If you spend 10 hours in a week doing paperwork and only 30 doing billable work, you’re losing money. However, if you raise your billable rate by 25%, you can cut your average number of hours to 30 and still make ends meet.

With the exception of the monkeys running the US automakers these days, this math isn’t incredibly difficult and I would expect that any programmer worth his compiler can follow this formula. Don’t forget to factor in expenses either. It’s very easy to overlook other expenses there are to running a business. Rob Walling has a pretty good outline of many of the expenses that you will run into when you start your business, but probably wouldn’t think of until you got into it and started working for yourself. But don’t let that list scare you!

I’ve found that the biggest costs are not associated with hardware or software, but are the monthly fees you pay for insurance and taxes. Business insurance alone can cost more than $5,000. In the US, you will pay employment taxes that amount to about 11%-12% on top of salary, even if it’s your own. Profits at the end of the year will be taxed an additional 25% – 35%, depending on your tax bracket. When I first started out on my own, I was lucky enough to be able to depend on my wife’s job for her health insurance, which helped make my business wildly profitable.

Mike’s Third Law of Business: For every bit of business advice out there telling you to do something, there is someone else saying that you shouldn’t.

No matter what anyone tells you, myself included, take it with a grain of salt. Beware of people who say something is absolutely true without exception. As in, the only way to be successful is to run out and get Angel Investors or Venture Capital funding for your business. It’s simply not true. Success is a very subjective measurement. The guy down the street who barely makes enough money to feed his family, but loves what he does might not be successful to me, but he might very well see it that way. Each and every one of us will measure success in our own way. Some measure with money, others will measure by the number of customers, and some will even measure it by how long they haven’t had to work for “the man”. Personally, I’m coming up on 4 years for that mark. In fact, this is the longest I’ve ever had a single job.

So now that I’ve told you not to listen to anyone who speaks in absolutes, I feel safe in saying this. There’s only one person who can cause you to fail, and that’s you. No matter what else happens, and no matter what anyone else does, the only person who can make you fail is you. The economy may be terrible, but it’s been terrible before. Remember the 30’s? No? Me neither. Maybe it never happened. Who knows. But I do know that the world is still here, so it apparently hasn’t turned into Ghostbuster slime.

The only thing that means is that you are still in control of your destiny. People complain all the time that they don’t have time to do things. I’m guilty of this too. I complain about it virtually every day. But I saw a quote on my Google homepage reminding me that I have the same number of hours in a day as Albert Einstein, Linus Torvalds, Bill Gates and Larry Wall. It’s time that people come to grips with reality and stop blaming their failures on everyone else. People need to take responsibility for their own actions, or lack thereof.

I know this is going to be a little controversial, and in some cases downright mean, but if you’re not successful, then it’s your own fault. Period. Somewhere along the line, you made a mistake. That’s the bottom line.

There, I said it. Now if you find yourself on the losing end of the road to success, you have approximately two options. First, you can break down and cry about it. If that’s your chosen road, let me know. My sister has a PhD in psychology and might be willing to help you out. Unfortunately, you’re probably broke and couldn’t pay the therapy bills so that takes us to your second option.

If at first, you’re not successful, take a good hard look at what went wrong. Maybe it’s you personally. Maybe you just made some bad decisions due to incomplete information. In either case, once you’ve pinpointed the problem, fix it and try again. Persistence in the face of inevitable defeat is why everyone loves the underdog. Just don’t get carried away.

Last minute crash

Well, at 5:05pm on Friday (go figure on the time problems started), my computer was acting flaky so I decided to do the normal thing and reboot. Unfortunately, my desktop at the office decided to flake out entirely and for some reason decided it no longer wanted to be part of the Moon River domain. To top it off, the local passwords weren’t working either, so I couldn’t log in and do anything about it. I left it for the weekend and decided to deal with it on Monday when I got back.

So now it’s Monday and things have gotten worse. My PC has decided that it doesn’t like the filesystem on my boot drive and disk checks claim it is corrupted. My data drive is still perfectly intact, but the boot drive thinks there are now two partitions instead of just one and that neither of them is bootable. I think I’m going to have to resort to reinstalling the OS, which I always hate to do because of the fact that it’s just such a pain in the neck to reinstall all of my applications.

The only bright spot is that I’m pretty good about keeping non-essential data off my main PC and keeping backups of that data on an external drive and maintain regular backups of that external drive on my NAS server. I’m guessing that the odds of me having any essential data on that drive is pretty low, although I could be mistaken. I do tend to keep text files of notes I’ve taken about different phone calls on my desktop until I get a chance to enter them into our CRM system.

In other news, I’ve started on a new series of articles on how to build a consulting company. I expect to have the first article out the door sometime next week. It would be sooner, but I have a small computer problem to deal with.

Repeated Characters in VMWare

For those of you who experience occasional typing problems with your VMWare machines, there’s still hope. Over the past few years, I’ve run into this problem several times, and every time the symptoms are basically the same.

When you’re using a remote console to access a virtual machine, as you start typing the characters will start repeating themselves on the screen. Most of the time, typing and then seeing those characters on the screen is exactly what you expect. Until you hit go to type ‘root’ into a Linux VMWare image and it comes out as ‘rrrooooooooootttt’. Typing very slow sometimes gets around the problem, but not always. Typing a password becomes especially difficult as you have no idea whether extra characters are appearing and depending on how your machine is configured, you might lock out an account. Rebooting the image will sometimes make the issue go away for a little while, but it often returns at the worst possible time.

I used to think this was a low memory related problem, caused by the host using too large a pagefile, thus causing delays and screwing with the low level interrupts. I came to this conclusion mainly as a result of running VMWare Server on a Windows 2003 server with about 4GB of RAM. After overcommitting the memory, this bug tended to surface quite a bit, so I started offloading the virtual images and only running a few when it was absolutely necessary. It turns out this isn’t solely related to memory.

There’s a VMWare KB article that explains how to address this issue and states that it happens due to low bandwidth situations. I beg to differ on the bandwidth situations, as I’m running gigabit on my network and lets face it. My network really isn’t that big. I have at most 2 hops between any given location and it’s generally limited geographically to about 10 feet.

Basically, their fix is as follows: power off the virtual machine and modify the .vmx file for the image you’re having problems with to include the following line:

keyboard.typematicMinDelay = "2000000"

Once you’ve done that, there will be a 2 second delay introduced to prevent single characters from repeating themselves numerous times. Unfortunately, I found this recommended fix didn’t work as well as I would have liked. You see, 2 seconds is a long time for computers. And after you’ve done this, the Backspace key becomes pretty much useless. After some trial and error, I found that cutting this value by 75% seemed to work pretty well.

keyboard.typematicMinDelay = "500000"

Since I added this line to each of my .vmx files, I’ve yet to run into this issue again using any of the remote administration tools provided by VMWare.

How to Convert Your Blog From SubText to Wordpress

No matter what anyone tells you, there’s more to changing blog engines than just clicking a few buttons and importing data. It tends to be a fair amount more complicated than that. In my last post, I highlighted some of the reasons, both rational and not so rational for my decision to change from SubText to Wordpress.

It’s only been about a week or so, but I’ve learned a huge amount of “stuff”, for lack of a better term, and am thus far, I am rather pleased with the transition to Wordpress. I thought that for the benefit of others, I would document my move to Wordpress 2.7 from SubText 1.9.3 so that if others decide they’d like to try it, they can hopefully retrace my steps and experience a little bit less pain than I did.

When undertaking this sort of project, there’s really only one viable place to start looking for information on how to do this. Google. I found a number of links that I thought might be helpful and used them as a general starting point for deciding what to do, and how to do it.

Subtext to Wordpress:
http://www.ageektrapped.com/blog/subtext-to-wordpress-converting-blog-engines/
http://www.copyandwaste.com/2008/09/15/hello-goodbye-subtext-to-wordpress/
http://blog.digitaltinder.net/2008/12/exporting-blogml-from-subtext-21-and-importing-blogml-into-wordpress-27/

Blogger to Wordpress:
http://www.aaronlerch.com/blog/2007/08/23/breaking-up-moving-blog-engines/

DasBlog to Wordpress:
http://www.kavinda.net/2008/10/23/migrating-from-dasblog-to-wordpress.html

Wordpress to SubText:
http://betterthaneveryone.com/archive/2007/11/04/wordpress-to-subtext-done.aspx

Obviously the first set of links was much more helpful than the others, but for reference purposes, seeing how others dealt with converting to Wordpress or reasons they moved away was somewhat enlightening. After running through the instructions on each of the first set of links, I came to one conclusion: that none of their sets of instructions were going to work for me directly due to the myriad of problems I was running into that they did not address. I felt there was more hand waving than hand holding. I like to hold hands, so here’s how I converted from SubText 1.9.3 to Wordpress 2.7.1.

At a high level, the idea is to export from SubText to some intermediate format, and then import that into Wordpress. In this case, the intermediate format which is probably the most straightforward to use is a BlogML XML file. The rationale is that you want to be able to keep all of your content and save time doing the conversion. The last blog engine transition I did was from CityDesk to SubText and it involved a lot of copy/pasting. Not fun.

BlogML is supposed to be a standard of some sort for moving your blog content from one platform to another. Unfortunately, the development is somewhat stagnant and not much of anything has gone on in quite some time. Their roadmap as of today indicates that version 3.0 is expected to be released in mid-2008. It’s early 2009 and version 2.5 is the only thing out there.

Another potential sticky point is that Wordpress does not ship with a BlogML import module. Fortunately, a fellow blogger named Aaron Lerch built one and there are several variations floating around which fix a few different bugs. I’ll be offering up my own version in order to fix a couple more.

So, to reiterate, the idea is to export from SubText to BlogML, then import the XML into Wordpress. Easier said than done.

Problem #1: Exporting to BlogML.
The BlogML exported in SubText doesn’t appear to work. At least it didn’t at first and in the version of SubText I was using. For the record, I was using version 1.9.3. Fortunately, I discovered almost by accident that the BlogML export feature for SubText doesn’t work if you instruct it to include embedded content, which is the default. I’m not sure specifically what that is meant to be, but from doing a bit of research, I gather that embedded content includes things like flash files, YouTube videos, or maybe even local images. In any case, including the embedded content caused it to fail. I unchecked the box to include embedded content, and viola. My BlogML XML file was ready to download.

Apologies to those of you using embedded content, but I really didn’t look too far into this. The cursory research on what embedded content was lead me to believe that I didn’t have any on my blog and could probably safely ignore it. Your mileage may vary.

Problem #2: Using Aaron Lerch’s BlogML Importer for Wordpress.
This seemed flaky at first and it wasn’t clear at all why it just wasn’t working. I’d get the file upload textbox like the instructions stated, I’d attempt to upload my file, and then the fields would disappear and my browser would act as if nothing was wrong and it was done doing what it was supposed to do. I tried a few different browsers and got the same result with Firefox, IE 7, and Google Chrome.

It turns out that the BlogML import seems to use a fair amount of memory. My BlogML XML file was about 1.6MB. After digging through the apache error logs on my web server, I found that the web page was requesting about 32MB of memory to parse the XML file and the web server was denying that request, as it was limited to much less in terms of memory.

I really don’t have any idea why it requires so much memory to parse the BlogML file. Quick estimates ballpark the required memory to be about 20 times the size of your BlogML file. In my case, this was about 32MB of RAM. If my BlogML file were 5MB, I would likely need more than 100MB memory.

The quick fix to this issue was to add the following line of code to the blogml.php file:

ini_set("memory_limit", "64M");

You could always bump it up to 128M or higher, if needed. The alternative is to modify your php.ini file and alter the memory_limit for the entire apache instance, but I felt that this blog import was only going to be done once, so there was no need to allocate additional resources if it wasn’t really necessary. The machine has them to spare, but no point in wasting them.

You can download the XPath.class.php and blogml.php files that I used from here.

Problem #3: File upload problems
Once the BlogML importer seemed to be working, I immediately ran into a permissions issue. The BlogML Importer was unable to save my uploaded file to the web server due to a permissions error. I poked around a lot and the “fix” most often recommended was to change the permissions on the /wp-content/uploads directory to 777. Forgive me for working in the security field, or even being remotely security minded at all, but that’s the single most ridiculous suggestion I’ve ever heard.

If it was only made by one person, I could possibly dismiss this as just ignorance, but numerous people were suggesting that this approach was not only common, but was the recommended fix. Sorry folks. It’s not. I found that the most straightforward approach was to provide ownership of the uploads directory to apache. Immediately the problem went away, and nothing had to be made writeable by world.

Problem #4: Link redirection
This one could have been a total nightmare, but wasn’t nearly as bad as it could have been. If you have a blog that you’ve been running for any length of time, the hope is that other people have linked to your blog. Even better, there’s a steady stream of traffic headed your way. Well, to keep that traffic from drying up quickly, you’re going to need to set up URL redirection using a .htaccess file on your new web server, thus redirecting pages from
/2008/12/25/its-christmas-time.aspx to something like /2008/12/25/its-christmas-time/.

That means that you need to know exactly what every single internal link on your site is, and exactly where it goes. Once you know where all your links are, then you add a RewriteRule to your .htaccess file for each of them. This RewriteRule will perform a redirection at the web server level, simultaneously providing the browser with a 302 error code to indicate that the page has permanently moved.

This should have been easier than it was, but I wasn’t using pretty URL’s in SubText, so I had to suffer through this part of it. It didn’t take long before I came up with what I felt was an adequate solution. I poked around a lot using Google and Yahoo, looking for web tools that would crawl my site and find all of my page links for me, but I didn’t find anything that was terribly helpful. Finally, I gave up and decided to roll my own.

Using my trusty Perl skills, I wrote a website crawler which I pointed at my original blog. After reading in the main page, it parsed the page for every link on the page. If the link was local to my domain, it would retrieve the contents of that page and recursively continue to do so until it had followed every single link on my website which pointed back to itself. I ignored image references and relative URL’s. I also ignored any link that was to an external website, as I have no control over those links anyway.

Given that there was a page in SubText containing a list of archived links, this solution worked really well. I was able to capture every single link on the page and for each URL, I was able to obtain the title of the page. This made building my .htaccess file pretty hassle free. It was still a little tedious, but for a few hundred links it only took a couple hours to search the content of my new blog for the title’s that I captured and match them up to the original URL’s.

Here is a link to the Perl code that I used for this. Feel free to hack away and use it for whatever you want. I’m releasing it under the GPL 3 license. Do with it what you will. To use it, simply install the Perl libraries (assuming you don’t have them) and set the primaryURL and the TLD variables. Run the subTextCrawler.pl file, and it will spit out a bunch of half-written RewriteRule’s for your .htaccess file.

The assumption is that you have your Wordpress site up and running and have imported your BlogML file. I used a temporary domain pointer for this, so I was able to take the title printed on each RewriteRule line and search for the corresponding URL on my new Wordpress site.

I could have gotten much fancier and searched my Wordpress site using the title from the SubText site and completely automated it, but I’ll leave that for someone else to do. I’m just trying to get you most of the way there.

subTextCrawler.pl

Problem #5: Learning how to actually build a .htaccess file.
I was pretty stupid the first time I was working with my .htaccess file. It turns out that there are two things you need to keep in mind when using Wordpress. First, is that Wordpress expects to be able to modify this file. So, making .htaccess owned by apache solved the first issue. The second issue I had here was that the .htaccess file automatically is filled in with a set of rules that are dictated by your Permalink preferences. Whenever you browse to the Permalink preferences page within Wordpress, this file is read, parsed, and then rewritten. All without clicking a save button.

It’s pretty irritating to put all of your RewriteRule lines in there, only to find they don’t work for some reason and not realize that it’s because the file is being overwritten whenever you browse to a specific admin page in Wordpress. Your .htaccess file should look something like this:

# BEGIN WordPress
‹IfModule mod_rewrite.c›
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
‹/IfModule›
# END WordPress

The trick to adding your own RewriteRule options is to add another set of instructions above the ones created by Wordpress. Once you do that, your changes will not be lost whenever you browse to the Permalinks page. I’m a fan of examples, so here’s some of what I ended up with:

‹IfModule mod_rewrite.c›
RewriteEngine On
RewriteBase /
RewriteRule ^archive/2005/08\.aspx$ /2005/08/ [R=302,L,NC]
RewriteRule ^archive/2005/08/21/1\.aspx$ /2005/08/21/day-11-starting-a-new-business/ [R=302,L,NC]
RewriteRule ^archive/2005/08/22/2\.aspx$ /2005/08/22/day-12-the-website/ [R=302,L,NC]
...
one rule per line of subTextCrawler.pl output
...
‹/IfModule›

# BEGIN WordPress
‹IfModule mod_rewrite.c›
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
‹/IfModule›

# END WordPress

Conclusion:

Hopefully, someone out there finds this retelling of my experience useful and can save themselves a great deal of time and effort. Between the links above where people explained their processes, and my retelling of the problems that I ran into, you should at least have some answers as to how to tackle some of the problems you might run into.

Eventually, the Google Blog Converters project may help to allow your data to migrate between blog engines a little easier but it’s really just not there yet. Good luck!

Abandoning SubText

Apologies for the lateness of this post. I wanted to post it last Tuesday which was when I made my new blog engine live. Unfortunately, I developed double ear infections that evening, which rapidly turned into a pair of ruptured ear drums, lots of pain, some hearing loss, 5 days of bed rest, and prescriptions involving Percocet and antibiotics. I can’t hear much at the moment, but happy about it and don’t feel any pain. I don’t really know how that works but it does. I slept for a few hours this afternoon so now it’s the middle of the night and I can’t sleep. I feel like I’m on the mend for the time being. Monday I go under the knife for unrelated surgery which will put me back on bed rest for several days. Back to my originally scheduled blog post…

It’s pretty amazing that it’s so incredibly easy to start a blog these days. Unfortunately, writing and maintaining a blog is like getting married. Once you choose blogging platform, you’re essentially stuck and changing blogging platforms is about as painless as getting divorced. In the best case, it’s not any fun. In the worst, you lose pretty much everything you ever had.

For more than a year now, I’ve been considering changing blog engines. Interestingly enough, that time frame also coincides quite nicely with my dramatic drop-off in blog posts. Why put more work into a blog if you’re just digging your hole deeper? I knew that every blog post I was going to add was just going to increase the amount of work I’d need to do to perform the conversion and decrease the motivation to actually move to another platform.

However, last week I decided to finally bite the bullet and just get it over with. After all I’d been absent from my blogging duties for nearly a year. With my Masters degree now out of the way, I really didn’t have a good excuse to put it off any longer. So I started at the most obvious place imaginable for how to convert my blog from SubText to something else. Google.

I suppose I should back up a little bit and explain my reasons for abandoning SubText. After all, I do a fair amount of .NET development and SubText is written in .NET with a SQL Server back end. Let me put it bluntly. I had higher expectations for SubText as a platform.

Issue #1: Annoying bugs
One example I can point immediately to because it was the most irritating when I finally found the cause was the existence of a paging error in the categories. If you had 9 catagories, it worked fine. If you had 10, it wouldn’t show any categories. If you had 11, you were ok again. So for a while I had 11 categories, one of which I never ever used.

But you’re a .NET developer! It’s an open source platform! You could have fixed it yourself.

I’m sorry, but I have this thing about software. It just needs to work. Time and time again, I hear developers scream about how great open source software is because if there’s a bug, you can go into the code and fix it yourself. That’s nice. Honestly, I think that’s really great. But when push comes to shove, I really don’t have the time to waste making features work that should have worked to begin with. The release I was using was

Issue #2: Excessive Complexity
I opened up the source code for version 1.9.3, which is the version of SubText I was on and there were 10 projects. TEN! Maybe I feel like I was just spoiled by the classic ASP programming model where you had one asp page file, maybe a couple of include files for commonly used functions, and that was about as complicated as it got for any given web page. I’m as much a fan of the .NET framework as the next Windows programmer, but ten projects for a blogging engine just seems really excessive. Just finding the right project is sometimes a chore, and the documentation for SubText leaves a little to be desired. You also need to download additional components to get SubText to compile.

I’ve always hated it when you want to compile something and you’re missing a dependency, which has another dependency, which also has another dependency. Eventually, you’ve installed just about everything and are 9 dependencies deep, only to find out that there are bugs which won’t let it compile anyway and then you have to fix those too because someone didn’t account for something like 64 bit processors which were years and years away. Occasionally, you’ll also find that due to some obscure bug in version 9.4.2 of dependency 34 in the sixth level of hell, it won’t compile, but only on your machine, as evidenced by the following directives found buried in some include file.

#ifdef YOURMACHINE
#error "This won't compile on your machine because we think you're a loon!"
#else
#error "Not your computer this time, but we still think you're a loon!"
#endif

In this case, I actually already had the required additional components from Microsoft on one of my machines, but not all of them. This wasn’t terribly painful, just another minor annoyance.

In the end, I found the guts of it just too incomprehensible to work with easily. I’m sure that given enough time, I could have done so, but time is not something that I have a lot of, so I simply didn’t bother.

Issue #3: Roadmap, or lack there-of
Another point in the defense of SubText is the fact that I was running version 1.9.3 and the most recent version is 2.1. Perhaps the most recent version would have made a difference, but I’m guessing not. There have only been 4 new releases since I installed the version I have, and that was 4 years ago. The roadmap for the product could use some work, as could the communication of when releases are actually going to happen.

Knowing what is going to be available in version 2.0 is nice. Knowing when I should expect to actually see version 2.0 would be nicer. Yes, I know it’s an open source product, but I really don’t care. I see no reason why open source projects shouldn’t be held to the same standards as commercial software. If they want to be treated as if they’re just as good, they need to be just as good, and that includes release schedules.

Issue #4: Plug-ins for extensibility
Something else I wanted was to be able to extend the blog with plug ins, and there just weren’t any for SubText. Were they coming, and if so, when? I had no idea. Supposedly in version 2.0, whenever that was going to be. (See Issue #3)

Issue #5: Comment spam
Honestly, this should have been a no-brainer. Didn’t anyone working on SubText see the amount of spam coming into their own blogs? It’s pretty ridiculous the amoung of comment spam that I get on my own blog, and the expressions that you’re supposedly able to add to help filter them simply don’t work. (yes, another annoying bug, see Issue #1)

Issue #6: Haphazard looking website
If you browse the website for SubText, one thing you’re going to notice is that depending on which links you click, you seem to get conflicting information. For example, the main page states that version 2.1 is out. If you click on Docs, then About, and then “Requirements”, they state the requirements for Subtext 1.5 and 1.9(when it is released).

Eventually, I realized that none of these things were getting any better. I could get involved and try to help out, but I really just don’t have the time. Maybe when I’m independently wealthy, I’ll revisit this course of action, but for now it’s easiest to just abandon SubText and move to a blog engine that better suits my needs.

It took me all of 10 minutes to decide to switch to Wordpress. I’ve used it in the past for other blog projects, and it worked really well. I did a quick install on one of my linux servers, kicked the tires a bit, and decided that it was certainly going to be worth whatever trouble I had to endure. In fact, I installed a plug-in called WP-Syntax in less than 5 minutes and achieved syntax highlighting and line numbering on the C pre-processor code you see above. And so it is, that you’re reading this today on a new Wordpress blog engine.

My next post (possibly not until after my surgery) will be all the fun things I encountered while trying to get away from SubText and into Wordpress.

Twitter Delicious Facebook Digg Stumbleupon Favorites More