SugarCRM for Job Search Management – Part 1

As I indicated in an earlier article, I've found myself suddenly and somewhat unexpectedly in the job market. Not being one to take such things lying down, I began to make a lot of phone calls and send out a lot of emails. Initially, I used Outlook to track this activity, but it very quickly reached a point where it just couldn't do the trick. In short, I needed CRM, and I needed it fast. I'd recently seen that there was a VMWare appliance available for SugarCRM, so I decided to give it a shot.

Setup

SugarCRM is a mixed-source CRM platform. The basic open-source SugarCRM product is free and available for download, while more advanced Professional and Enterprise editions of the software are available for purchase. There are also hosted and hardware-appliance versions of SugarCRM available. SugarCRM is a fully-functional CRM system, competitive with commercial products like SalesLogix and Salesforce.com. It features the standard Account-Contact-Opportunity relationships made popular by Siebel, and used in nearly all CRM systems now.



In order to use SugarCRM, you have a number of options, including buying a hosted solution. In my case, I was job hunting, so free was good. That meant downloading and installing SugarCRM on my system, or getting the VMWare appliance. A VMWare appliance is a preconfigured OS image, ready to run in VMWare's free VMWare Player. For me, this option offered the fastest setup and great flexibility.



Downloads:
VMWare Player
SugarCRM VMWare appliance



Download and set up VMWare Player, and unzip the SugarCRM appliance. Open the appliance with VMWare Player and start it up. It'll boot into rPath Linux (a stripped-down distribution used to keep the size of the VMWare appliance as small as possible). Log in as "root" with no password. This is clue #1 that this isn't an enterprise-worthy install (nor is it meant to be), so use it only within your firewall. After you log in, type ifconfig and hit enter. Look for a line that says "inet addr" - this is the IP address the machine acquired during boot-up. Make a note of this, we'll need it for the next step.



Now, launch a browser and use the address you just wrote down to navigate to the SugarCRM login screen. Ex: http://192.168.0.5/sugarcrm Note: you can edit your HOSTS file in windows/system32/drivers/etc to add a textual name, like "sugarcrm" for this IP address. Log into SugarCRM as "admin" / "changeme" and take a look around.

Administration

One of the obvious benefits of using the VMWare appliance is that there isn't much administration. The most important thing to do is to make sure you've got good backups. Since this is a VM, this is pretty easy. First, we need to shut down the machine so no files are in use. Log into the console as root, and enter this command: "shutdown -h now". This will shut down the Linux machine, and you can then back up all the files - probably by burning a CD. After you've copied or burned the files, you can start the VM again. If you happen to be using VMWare Workstation instead of the free VMWare Player, you can use the "snapshot" feature to back up the machine.



There are a couple other options for backing up data, but they're not as convenient. First, you can back up all the application files (htm, php, images,
etc) by using the SugarCRM "backups" command from the "admin" menu (upper right on your browser screen). Choose an existing directory, or make a new one (mkdir) under the /usr/share/sugarcrm directory and set permissions (chmod 777) so that the web process can write to that directory. Once the backup completes, you can download the files by typing the appropriate address into your browser. If any of this sounds challenging, just stick to backing up the whole VM to CD.



Ditto for the next backup, which is the database backup. For this, you'll need to open the console, log on as root, change your directory to the backup location you used before, and use mysqldump to write the contents of your MySQL database to a text file (ex: mysqldump sugarcrm > backup_file.sql), and then download the database backup like you did for the application files. This
information may be helpful if you decide to install SugarCRM on a "permanent"
machine. For me, you can't beat the convenience of just burning the whole VM
to a CD.



That's it for part one. In part two, I'll cover usage best practices and
customization.

Job hunting? Avoid double submissions!

If you're a job seeker and you work with multiple recruiters or staffing / consulting companies, you have to be very aware of who is showing your resume to which contacts. If your resume shows up twice at the same company via two different channels, feathers are going to get ruffled -- this is known as double posting or double submission, and it'll cause recruiters and employers to drop you in a heartbeat.
My first experience with a double submission was close to ten years ago, when I received the same resume twice as a hiring manager. Not realizing the goo I was walking into, I interviewed the candidate, keeping the first recruiter abreast of my progress (we ended up passing on they guy). Shortly thereafter, I got a call from a very angry recruiter #2, demanding to know what the hell was going on. Boy, was I blind-sided.

More recently, I saw this happen again, and this time I was better prepared. I saw the problem before we called the candidate in for an interview (not always easy to do if the recruiter / staffing company mangles the resumes before submitting), and got both sources on the phone. I let them know what was going on, whose submission had arrived on my desk first, and asked them to sort out among themselves who was going to go forward. Many employers would not have been that cooperative.

Luckily, the two recruiters knew each other and reached a peaceful arrangement. If there had been even the slightest remaining conflict, I wouldn't have moved forward with this candidate at all.

Now, I find myself on the other side of the table. I'm working with recruiters, and they're trying to get me in to see some clients. I've tried to keep up with who's showing my resume to whom, and I ended up catching one today. A recruiter started telling me about a "Planning Architect" position, and it sounded familiar. A quick spin through SugarCRM while I'm on the phone, and I find where I've already learned about this position.

The letter of the law in these cases turns on who actually puts a resume in front of a client first, and though the first recruiter in this case hadn't actually sent my resume in yet, I was scheduled to meet them to discuss the position, and I felt compelled to wave off the second recruiter.

Close call.

Hopefully, this isn't a problem that you run into too often, but you do need to be aware and diligent to make sure you're not creating or walking into one of these situations.

Billable rate vs. Salary

When a company goes through the kind of turmoil I've seen recently, there are frequently opportunities to pick up some consulting hours to help with the transition. I got a shot over the bow last week: "Hypothetically, what would your rate be to do 'XYZ'?" I hadn't given it an awful lot of thought, but suddenly found it was time to do some "back of the envelope" calculations. I found a link that was helpful for me, and I dropped some of my calculations into an Excel spreadsheet that's available for you to download.
First, it may be helpful to consider whether you have any preconceived ideas about what you think your rate might be. They might turn out to be way off, but it'll be useful later to see whether the rate you compute is anywhere near the rate you thought you'd end up with.

Next, grab a copy of the spreadsheet and open it. This spreadsheet is based on a thread about the same subject on the Joel on Software site.

There are just a few numbers in here for you to adjust. I'll comment on them briefly here.

  • Salary. This is your W2-equivalent salary, or what you'd expect to make if you worked for someone else.
  • Hardware-software budget. After all, nobody's going to buy you that new laptop but you.
  • Insurance. Health, liability, and other insurance normally provided by your employer
  • Billable hours per week. This is the first of three factors designed to account for the fact that as a contractor, not all of your hours will be billable This is an area you'll want to give some careful thought to, as I'll discuss below.
  • Working weeks. You want vacation? Sick time? Holidays?
  • Utilization rate. Another billable hours factor. See below

The most important part of the spreadsheet to fiddle with will be the factors in the Revenue area. Generally, you're trying to account for risk here. There's nobody paying you if you find yourself without a client, so you need to plan for downtime to line up that next deal, as well as all the incidental time-wasters that come up during the week.

You can play with both the hours / week factor and the utilization rate factor to see what effect they have on your rate, but remember to leave a few hours per week for administrative tasks like accounting and IT support. You may also want to adjust the utilization rate to account for the length of your contract. If you've got a year-long contract, for instance, you can get a whole lot higher utilization than if you have a series of one-week contracts.

Even with a long-term contract, though, don't go to 100% utilization, since there will still be time spent at some point lining up the next gig, not to mention education, training, and decompression time. In general, the more confident you are that you'll always have another gig spun up and ready to go when another one finishes, the closer you can approach 100% utilization, but remember that 80% is considered a very healthy utilization for consultants that have a supporting crew selling deals for them.

There's clearly a lot more sophistication that could be built into this model, but this should serve to help structure your "back of the envelope" scribblings a bit. Good luck!

CIO Article: Open Source Models

A couple months ago, CIO had a great article on open source models: Free Code for Sale: The New Business of Open Source. The really nice part about this article is not that the content is especially deep (it isn't), but that it's a great executive summary of what's going on out there. Having the article show up in CIO also lends real legitimacy to the topic of open source. The article does a good job of descriibing the real business models at work here -- this is more than just hobbyists hacking away on code in their spare hours. I've referenced this article a couple of times already to people who understand the software industry in general, and want to learn more about this aspect of the business.

Ch ch ch changes ….

It's been an eventful week.

Last Friday, I found out that the company where I've been working for the last seven years was shutting its doors forever. I'd joined Resolution EBS as a CRM consultant, and ended up building a commercial Business Rules Engine product. Now, I had the weekend to think about what I was going to do next.
It was pretty emotional at work on Friday, and Monday, too, when everyone came into the office to clean up their desks. I've been working with most of these guys -- heck, I hired most of them -- for several years, and it was a lot of change to absorb in a short period of time. As you can imagine, there was a lot of shock, a lot of disillusionment, and a little anger, too. The normal stuff.

It'll pass, but not for a while.

I've been through changes like this before, but you never really get used to them. My first job out of college was at a little insurance company that ended up getting acquired by a larger insurance company. There, too, there came a day when the moving vans showed up in the parking lot, and everyone knew it was over. Unlike this time, though, we had some warning. This time was pretty abrupt.

So, I spent this week getting my job search cranked up. I've got some tips to post here on that subject, so if you happen to find yourself in similar straits, please check back from time to time or point your favorite RSS reader at my feed.

Finally, if you've been reading AppDev for a while, you'll notice that I've personalized the site a little bit. After all, I'm marketing me now, you know?

Oh, and "so long, and thanks for all the fish."

David Lambert

This is the obligatory "who is this guy and what makes him tick" page.  I'm lucky enough to have had a really broad background in software development, but all the really good bits are about connecting business and technology.  I'm comfortable with work in both areas, which makes me somewhat unique in this field, I believe.

Technically, I've run the gamut of Microsoft technologies, with most of my recent experience in the .Net stack.  I was introduced to Agile practices before they were fashionable, though I've seen variations done well and less-well a number of times since.  I got a chance to build commercial software and to grow a software team early in my career, and these remain the most exciting parts of being in software for me.

My introduction to CRM was also another big learning opportunity for me -- seeing business transformation up-close at the C-level exec point of view really reinforced why we're building software.  It was really rewarding to work with business leaders who wanted to use those CRM rollouts as opportunities to evolve their businesses.  This lesson sticks with me every day -- our software is nothing if it's not a benefit to the business.

Tip: Avoid repetitive code

I'm still slogging through the aforementioned legacy code, and I keep stumbling upon places where the original coder just worked waaaayyy too hard. Case in point: I step into a page load subroutine in this ASP.Net code, and there's a page and a half worth of this:

strVar1 = Request("Var1")
If IsDBNull(strVar1) Then strVar1 = vbNullString
strVar2 = Request("Var2")
If IsDBNull(strVar2) Then strVar2 = vbNullString

There's an easier way.I'd already written some functions to handle DBNull values when pulling records out of the database:

Public Function intFromDB(ByVal dbField As Object) As Integer
    Try
        If Not (dbField Is System.DBNull.Value) Then
            Return Convert.ToInt32(dbField)
        End If
    Catch ex As Exception
    End Try
        Return 0   'DBNull or exception
End Function
Public Function strFromDB(ByVal dbField As Object) As String
    Try
        If Not (dbField Is System.DBNull.Value) Then
            Return Convert.ToString(dbField)
        End If
    Catch ex As Exception
    End Try
    Return ""   'DBNull or exception
End Function

(There are also functions for Dates and Doubles, but you get the idea). When I use this on the lines above, I get something a little more compact:

strVar1 = strFromDB(Request("Var1"))
strVar2 = strFromDB(Request("Var2"))

Update: as I work through this conversion, I've found a couple places where I could stand to have an optional param for default value.

Wrong on so many levels…

I'm stuck doing some re-work on an inherited system. It's a long story. As I'm threading my way through this mess, however, I stumble on a function. It's a remarkable function. This function is a tiny monument to twisted intent, and it's certainly worth two minutes of your contemplation.
Ok, so before you behold the actual code, take a minute to think about all the other screwed up routines you've seen in your day. The routines that stretch on for pages and pages, with nested loops six-deep and variables whose scope has been violated back and forth and forth and back.

This isn't like that.

This one is subtle. Elegant. Take a look at this baby and see if you can appreciate the totality of its ruin.

Private Function Add(ByRef Which As Integer, ByVal HowMany As Integer)
    Which = Which + HowMany
End Function

Ok, so what's wrong with this code? How many of these did you get:

  • It was found in an asp.net web page as vb.net code. Vb.net, of course, features the "+=" operator, which replaces this whole function rather neatly.
  • The whole "which" and "howmany" naming convention reeks of "apples" and "oranges", not to mention its disdain for mundane pursuits like variable naming conventions.
  • The "byval" and "byref" are actually correct here, but I've got $20 that says it was wrong the first time through. -g-
  • It's a function, right? (what's it return?)

Whew ... boy, that was fun. I hope you enjoyed it, too.

What’s the difference between an ISV, a VAR, and an SI?

When I communicate, I try hard to do so with some precision. I try to choose my words carefully, and I do my best to ensure that the message I speak is received and understood as I intend it to be. A common vocabulary really helps here. I'm a big fan of everyone meaning the same thing when they use a word.

I recently found myself struggling with some peers over what seemed to be a misunderstanding in terms - specifically, what is an ISV? I did some digging and found a general consensus - read on for results and commentary.The terms ISV, VAR, and SI are thrown around in a lot of discussions about our industry, particularly in discussions of markets and marketing. These terms are usually assumed to be universally-understood, and are usually meant to be exclusive; that is, every company falls into one and only one of these categories. As is often the case, a deeper understanding of the question reveals a little more complexity.

At a minimum, I question whether these terms are universally-understood. I'd expect nearly universal recognition of what the acronyms stand for (ISV=Independent Software Vendor, VAR=Value-Added Reseller, and SI=Systems Integrator). I don't believe, though, that everyone agrees on what these terms mean. When you add modifiers on top of the base terms (ie, micro-ISV), you can get to the point where you're talking about apples and oranges.

So faced with this lack of clarity, I did some googling. As you can imagine, I found a lot of links; these are the ones that stood out.

http://www.osisoft.com/5_1062.aspx This seemed to be the best overall breakdown. There are some very specific cues in here, which I found helpful in breaking through the fuzziness in terms.

http://software.ericsink.com/Small_ISV_Defined.html This definition distinguishes ISV's from VAR's (like SI's). Eric owns his own small ISV, so his site has lots of great information for that audience.

http://www.tsleads.com/how_we_help/channel_marketing.htm Here, all 'partners' grouped together. Not nearly as clean as the first definition, I think.

The themes and ideas that stood out in this search:

  • The lines are blurry. As hard as we work to classify companies, we have to expect that each company is mainly in one category or another, but may have activities that fit in one or more of the other categories.
  • ISV's make products. "Shrinkwrapped software" comes from ISV's. Even if all customers don't get exactly the same software (shrinkwrapped), if the company positions their software as a product, they're an ISV.
  • SI's vs VAR's In general, SI's tend to be more software-oriented and more likely to contribute more custom work, while VAR's are more hardware-oriented and more likely to add small amounts of integration work - customization, for example.

Hopefully, these findings will be of some help. If you find any other helpful links, please let me know!