looking back on six months
October 24, 2010 | by rob @ 9:49 am | comments (0) | filed under [consulting]

The end of October marks my six month anniversary as an independent consultant. This post is a reflection, with a goal of documenting my many mistakes and ideas on moving forward. If you find yourself in a similar situation, I’d appreciate any comments about how you approach marketing your consulting or freelance business.

My Background

I have a background as a Java/J2EE programmer and application server administrator. Since you’re reading this post, you are probably aware of the issues the Java platform has faced during the slow demise of Sun Microsystems. There is a sense that Oracle is taking the reigns to complete a long overdue release of Java7, but no concrete terms have been established. After such a debacle, it’s hard to imagine Java being a first choice for any developer with a perspective on the field.

With that uncertainty in mind, I’ve explored a variety of other languages over the years, including Groovy, Python, C#, and Erlang, completing projects in several. I assume most Java folks have taken this route to remain competitive in the market.

I founded the consulting business hoping to market those broad skills as a general troubleshooter, architect, and developer. Someone who could arrive at an organization and suggest and implement some best practices. My focus was efficiency: cutting development costs by utilizing commoditized resources and streamlining inefficient processes.

However, I didn’t have much experience in the business and marketing world. Developing people skills can be exceptionally difficult for someone who has spent most of their professional years behind a computer screen in a cubicle. After several months of building a business, I truly believe the sales process is phenomenally more difficult than completing the actual work.

The rest of this article details a few of the key issues I’ve encountered while learning (or at least attempting to learn) the art of business building.

Start By Leveraging Your Existing Network

A family friend once told me “it’s not what you know, it’s who you know”. A different friend mocked this suggestion, believing the commentor was lazy and only capable of succeeding because of his ability to exploit relationships. Looking back, the friend who mocked has excelled in the construction business by leveraging his experiences in prior jobs.

As Americans, we hold dearly the concept of self-determination. Hard work and a go-getter attitude will open every door. However, it is impossible to discount the impact of mutual effort in any significant undertaking. Human beings are social creatures who build networks to better confront the challenges of nature.

I decided to start the business after moving across the country, back to the medium sized city where I had lived and worked for two years before moving to California. I assumed that my old colleagues from so many years before would be a great source for new opportunities. Unfortunately, this was an extremely egotistical notion, believing that people I had known as acquaintances from so many years before would jump at the opportunity to help me succeed. As if they didn’t have lives, careers, and families of their own. To this day, I’ve only managed to have lunch with one of those old co-workers. This person was also a business developer and probably more obligated to relationship building; otherwise, I honestly don’t think he would have taken the time.

My first stable client was my former employer from California. Even with a country separating us, the level of trust was much more established between people with solid, recent memories and associations. A former college roommate gave me an opportunity after reminiscing about college experiences at a wedding.

If you plan to freelance, you will find much more success engaging your current contacts, friends, and family.

Extending Your Network

If you find yourself without a strong network to draw from, you’ll need to get out and start building one. I started by attending “networking meetings”, found on sites like Meetup.com. Some are more informal than others. The most famous (and probably infamous) of these is BNI, a group that charges an annual fee and has a strict schedule. Their central premise is that any new business opportunities should be channeled through group members. The members are paying, both in time and money, for the network. I attended a few of these meetings, both with BNI and PRO (a group local to Richmond).

Unfortunately, I found that most of the services offered by the members were business to consumer oriented. For example, there were a lot of insurance sales people and realtors. These groups make sense for people in those industries, but my technology services were geared more towards enterprise. It might have been possible to sell some small to medium size businesses, but I would strongly recommend anyone following this approach to look for more business-to-business oriented groups.

In technology, users groups tend to be better sources of contacts. For instance, I’ve met several folks at Linux User Groups who not only share interests, but can provide connections into the companies where they work.

Prioritizing

Another big issue is what I term “thrashing”. In technology terms, this indicates a machine that is spending more time managing resources than accomplishing actual work. In the consulting world, I define “thrashing” as continuously developing efforts that never turn into billable hours. Many tasks could be included in this category.

Unless you are a full time business developer, attending networking events that are inappropriate for your offered services is huge time drain. If you decide to approach these groups, try to talk to some members before spending the full hour to two hours, travel included, required to participate.

Be very wary when approaching new clients. In today’s economy, people are looking to squeeze dollars. I’ve found that a strict limit on the amount of non-billable development time is absolutely necessary in a new engagement. Presenting a good strategy and starting point quickly in the process, along with clear expectations, will save a lot of potentially wasted time.

Don’t get stuck with a large amount of small projects. I think two to three clients, certainly as a sole proprietor, should be a limit for any responsible consultant. If you are finding you wind up and down a large amount of business within two or three weeks and you spend more time developing relationships than billing, then you should reconsider your strategy. Of course if you have a process or product geared towards that strategy, you might find more success. However, trying to take on too much is a disservice to both you and your customers.

Find a Niche

The roles of contract programmer and systems administrator are largely commoditized. International freelance websites and large full service IT shops have largely cornered these markets. As a consultant, you need to find a specialty that is not widely available and will greatly impact the bottom line. Examples might be reducing redundant processes or support costs.

If you are having problems defining that niche, find ways to communicate with business leaders in your field of expertise. I spent several years working in healthcare, mostly around HIV and the associated research. A SCORE counselor suggested I contact local hospitals to determine where there are lacking in service providers. Of course, you will need to define what you plan to offer, but after a few engagements you might determine a developable option.

Once you’ve determined that niche, target your marketing and development efforts. My business offering is very general, not targeted to efficiency or cloud processes, and dilutes my pitch behind unrelated services. To date, I haven’t turned down any clients, even when the work doesn’t relate to my business. Starting to do this has been difficult to consider, certainly with rent bills due, but should strengthen my brand and expertise over the long haul.

Accept Defeat

Stubborn people have a hard time accepting failure and learning from their mistakes. I certainly fall into this category. However, I am now searching for contract work through recruiters so I can begin to retire clients that don’t fit my business model. The long term goal is to reduce my client load to one while I redesign my web site, business cards, and sales strategy.

I hope some of these ideas will help focus your business initiatives, feel free to leave a comment if you have any additional ideas.

interested in learning a new job skill? how I chose python
March 4, 2010 | by rob @ 2:56 pm | comments (8) | filed under [consulting]

A few years back, with the excitement of Rails reaching fever pitch, I decided to investigate promising new technologies. The effort was intended to keep my skill set fresh, believing I might get left behind in the job and consulting markets. In younger years with lighter schedules, learning new technology was an enjoyable hobby. Now, as many “older” developers would probably agree, there just isn’t that much time to fully investigate entirely new approaches to software development, unless they have a significant appeal to potential clients or employers.

Background
Most of my career was spent with JVM based languages, mainly Java with a notable amount of Groovy and Scala. PHP was in the mix, along with several “languages” for systems administration, such as bash scripting, sed, and awk.

Functional Languages
The functional paradigm seemed like a natural choice, considering the power of lambda calculus and the headaches from state change side effects. Lisp was obviously well respected and Clojure would integrate with my prior knowledge of tuning and managing JVMs.

Unfortunately, functional programming work appeared limited to academia and the scientific community. I am meagerly equipped with just a bachelor’s degree, constraining my opportunities to the business and bureaucratic worlds. Even today, a dice search for functional programming jobs produces very few results, certainly when compared with my aging preference. Honestly, I don’t think I’m connected enough to find functional programming work.

Also, I was concerned about managing ubiquitous software such as databases and search packages. Lisp didn’t seem to offer anything comparable to JDBC for the mundane task of managing a relational database. It probably made sense, considering that type of data is highly mutable. I wondered how many other components would be missing that were taken for granted in Java? Clojure would presumably bridge that gap, but how well? I mean, isn’t functional programming a fundamentally different approach? Investing scarce training time, at least anything more than a cursory glance, seemed like too much of gamble.

Ruby
The next obvious consideration was the hot contender touted as the best thing since sliced bread in just about every blog and trade journal. After years of writing Java, the concise and practical syntax was a godsend, even without quality auto-completion support from an IDE. First class functions opened a world of possibilities. Generators for resource-intense collections seemed so natural. The idea of continuations as an alternative to coding verbose and difficult-to-manage threads might have saved so many headaches.

But something was missing. There was no community process for designing and developing new features. Many people thought the Java Community Process was cumbersome and stifled innovation. However, much like a democracy, that central location served an important purpose: issues could be discussed, evolved, and possibly even dropped. Lacking such an institution might have bred confusing features. Message board postings like this one and this other one made me a little nervous. After dealing with groovy’s confusing side-effects from seemingly innocuous statements, I was hesitant.

Secondly, no major institution “backs” the development of ruby. With Java there was Sun. With .NET there was Microsoft. For me personally, this isn’t a big deal. But how many employers and potential clients would take the language seriously, without the integration and PR push? Could ruby disappear with it’s popularity? At that point in my career, I recognized software had a tendency to be replaced, for the better. But as an average joe-schmo who made a living from a skill set, dying languages represented a major threat to my livelihood. How much longevity did Ruby have?

Python
Python seemed to satisfy most of my concerns with Ruby. PEPs would keep a controlled evolution. Google presumably had her full weight behind the language, from using it develop the search engine, to hiring the creator, to even supporting important projects like unladen swallow.

It also seemed much more widespread in the systems world. Older versions of Solaris had versions of Python installed. Ubuntu used it for many infrastructure pieces. At the time, in a Java coding position, Python really showed strength for systems tasks. When I needed to count patterns in access logs, Python replaced what would have been a nightmare in shell scripts. And it was still pretty quick. Need a prototype SMTP wrapper for a web query? No problem.

So how about web development? Unfortunately there is, and will probably never be, a web platform with the popularity of Rails for Python. Too many frameworks. However, this could be a positive. Presumably, with the WSGI specification, things will be somewhat consistent across platforms. Maybe sometimes a stripped down system like Pylons is what you need. Need to create a low level network appliance? How about Twisted? Django might be a contender for Rails, good for environments where you need to jump right in.

Of course, there are some problems. First and foremost, the GIL. I know contention is an issue, but multi-threading is really important in the web world. A guess part of the transition to Python (and seemingly also Ruby) is to run multiple processes instead of creating one large process with many threads. This will force me to write scalable applications that should run fine on different machines if they are designed to run on multiple processes, right?

Standardization doesn’t seem quite as complete as Java, in some places. For instance, there is no JDBC. I know, ORMs should mostly handle the database, but what about when I’m trying to convince a Sybase shop to switch to Django? What if I need to do some data mining on that Sybase database and then port the system to Oracle for another client or environment?

So was it a good decision to chose Python over Ruby? As of today (March 4th, 2010), there were 746 “ruby” jobs on Dice. There were 1527 “Python” jobs. Also, a large majority of langpop indicators side with Python. I’m certainly not suggesting popularity is a suggestion of quality, just that the community (and therefore potential) might be larger.