Thursday, December 20, 2007

Anatomy of a hiring decision

Our clients are looking for the top developers in the country. They look at their code and look for the best usage possible. Here's an unmodified example from a hiring team at one of our clients.

"Code Critique

In the following, I will go through the code and point out some thoughts along the way. Some of them are merely stylistic, but others can be considered bugs. The list of comments shouldn’t be considered exhaustive.

class SelectionStateController
{
protected:
typedef std::map States; // a collection pairs: a unique string of a manager's id and
// a boolean selection state (true if selected)
typedef States::const_iterator CIt;
typedef States::iterator It;
// the function object to set up the list of displayed managers
struct Value
{
States::value_type operator()(const std::string &id) { return States::value_type(id,false); }
};
protected:
Container &clients; // a collection of clients to notify about selection state changes

Holding the client list as a reference can be a problematic choice. It makes it impossible for the controller to enforce invariants on the client list and to control list management. Admittedly, neither of those requirements were specified in the problem that was presented.


// returns the selection state of the manager 'id', true if selected
CIt cit=states.find(id);
#ifdef _DEBUG
check(cit,id);
#endif

C++ has a shortcut for this: assert(check(cit, id)). Spelling it out just adds visual clutter.

return cit->second;
}
// setters
void set_state(const std::string &id, bool new_state)
{
// sets the selection state of the manager 'id', notifies clients if the selection state is changed
It it=states.find(id);
#ifdef _DEBUG
check(it,id);
#endif
bool &state=it->second;
if (state!=new_state)
{
// update state and notify clients about the selection state change
state=new_state;
for (Container::iterator cont_it=clients.begin(); cont_it!=clients.end(); ++cont_it)

Standard C++ requires the keyword typename in front of Container::iterator as Container is a dependent type. MSVC doesn’t catch/enforce this – yet.


{
SelectionStateChangedFunc selection_state_changed(*cont_it);
selection_state_changed(id,new_state);
}
}
}
template
void set_displayed_managers(InIt first, InIt last)
{
// sets the list displayed managers in a range from the 'first' to the 'last'
// note: this method should be redesigned if selection states must be preserved upon changing the list of managers
states.clear();
std::transform(first,last,std::inserter(states,states.begin()),Value());
}
protected:
void check(CIt cit, const std::string &id) const throw(std::logic_error)
{
// checks if the manager 'id', which is pointed by the iterator 'cit', exists in the list of displayed managers
// throws the exception std::logic_error if it does not exist
if (cit==states.end())
throw std::logic_error("Manager "+id+" does not exist");
}

If I understand correctly, check is used as a way to check preconditions on function arguments. Essentially, it is an assertion; as such, it should never throw an exception. Assertions are debugging tools. Throwing an exception will unwind the stack, thus destroying valuable state information when debugging the issue.

};


class Client
{
public:
// function object that is invoked to notify about changing a manager's selection state
struct SelectionStateChanged
{
Client &client;
SelectionStateChanged(Client &client) : client(client) { }

Single argument constructors should be explicit unless an implicit conversion is really needed. In this case, the implicit conversion hides a subtle bug in the code (discussed below).

void operator()(const std::string &id, bool new_state)
{
std::cout
<< "Client " << client.id
<< " was notifyed about changing selection state, manager=" << id
<< ", new state=" << new_state << std::endl;
}
};
private:
friend struct SelectionStateChanged;
const int id;

Having id be a const member makes Client non-assignable, as assignment would require changing id in the assigned-to object. All standard containers required their value_type to be assignable.

public:
// constructor
Client(int id) : id(id) { }
// type conversion operator that constructs a notification funcation object
operator SelectionStateChanged() const { return SelectionStateChanged(*this); }

Implicit conversions are frowned upon in C++, as they almost invariably lead to problems in all but simple code bases. In this case, the conversion operator is never called as SelectionStateChanged’s conversion constructor is preferred over this function. If it were to be called, the program would crash after running out of stack space because it is recursive. Since the conversion operator is a const member function, *this is a const lvalue. It thus cannot be used as the argument to SelectionStateChanged’s conversion constructor that was defined requiring a non-const lvalue. What gets called is SelectionStateChanged’s implicitly defined copy constructor after calling Client::operator SelectionStateChanged() const on *this. This recursion leads to the crash.

};

int main()
{
// define a collection of clients
typedef std::list Clients;

Client is not assignable so this is not guaranteed to compile on a standard compliant std library. It will fail in future concepts-enabled code.

Clients clients;
std::back_inserter(clients)=Client(1);
std::back_inserter(clients)=Client(2);

The use of std::back_inserter here is odd. I can’t come up with a reason why std::list::push_back is not the better solution. Apart from that, it’s not std compliant. The standard requires output iterators to be dereferenced upon assignment. The fact that it works is an implementation artifact of the std library used."

Tuesday, July 10, 2007

The power and value of serious software development search.





Here's a software development success story Core Search Group is immensely proud of.

Automated Trading Desk has entered into an agreement with Citi to be acquired for $680 million. While most people in SC still don't even know who this company is or what they do ATD is one of the biggest business success stories in the history of our state. ATD helped us become who we are in a big way and we think we had a hand in helping them get where they are.




In 2001 I had the incredible business foresight to purchase this company from the previous owners at precisely the same moment that the internet bubble imploded. I had worked for the firm for two years as a recruiter placing software developers, networking people, and anything else related to IT. We were a generalist IT staffing company and unfortunately so was everyone else. When the bubble burst every company we worked for suddenly was not hiring. We had no jobs to work on. A lot of recruiters were suddenly on the street with an old guitar and a tin cup and a surprised expression. So there I was at my desk, the only employee of the company, having taken on some debt, with no jobs to recruit for. I figured I better find a specialized niche where people were still hiring, pronto.

To make a long story short I became aware of this little and extremely impressive company on the coast of SC that was hiring software engineers. I began a dialogue with ATD but they were quick to point out what they were looking for was very difficult to find. At this point the degree of difficulty wasn't a big obstacle for me. I had to succeed. ATD hires very proficient software engineers. People who are exceptionally skilled and productive at what they do. People with a history of innovation that is driven by their passion for developing quality software that suits a given need. So I decided to become a specialist in finding those kinds of developers.


I met with the people driving the software development at ATD and interviewed them to find out what they were doing, why they needed this exceptional level of talent, and how I might be able to help. Around this time I hired Mr. Vander Voort who helped hone our approach to finding the people. We learned about ACE and TAO and a bunch of other new (to us) things. ATD was our first client that is the absolute leader in their software development space. We now hold to working only with companies that fit that criteria. It's a short list.

Over the following years we've placed around 10 highly capable folks with ATD, which is approximately 15% of their total development team. Most of those folks are still there because ATD is careful to give them a beautiful environment to work in, their own office, the best tools, and the best colleagues. The pay is also great and it's hard to complain about living in a place like Charleston, SC. Like us they are a small but entirely focused and driven company which has allowed them to grow to the point that 6% of all stock trades on the Nasdaq and NYSE are executed through ATD's systems.

ATD taught us to specialize in what matters to the top software development company in a given market. Not collecting and delivering resumes. Researching specialized areas of software development, approaching the leaders in that space, developing quality win-win relationships, and carefully finding the few people who really meet the bar the company has set AND are looking for the type of relationship, responsibilities, location, and compensation the company can offer.

Everytime we place someone we feel a surge of pride because we know when we follow our system the folks we place will have a huge impact on the client. We're immensely proud of our part in the success of ATD and hope to help them get to the next chapter of their story. We don't place people to get fees. We place people to grow companies, deepen our relationship, and broaden our responsiblity for their success.

Congratulations ATD, and thanks for helping Core Search Group become who we are. Forward!

Friday, June 1, 2007

Good or Great?

Jim Collins' book Good to Great has been a very valuable resource to me and I am sure a lot of other business owners and professionals.

Have you sat down and asked yourself lately whether what you are producing is good or great? What was the last thing you did at work? Was it good or was it great?

If you're good and happy with good that's fine. Most people I talk to though are striving for great. There is a world of difference between your reality if you are good and your reality if you are great. Chad Hurley of YouTube can tell you where great gets you. When I buy a product or service I look long and hard for the great one. Seems a lot of you do too.

Core Search Group believes in the greatness of our vision: to be the best tool for companies to attract Google-quality software development talent.

Here's the text of an email I sent our team this morning:


Hey guys.

I have been reviewing the information and raters we filled out from Jim Collins' website, the author of Good to Great. If you recall this guy and a bunch of researchers did a multiyear research project to study what separates great, enduring companies that change the world from good companies that don't. I think we all agree we can be one of the great ones.

I think we can synthesize all the information in the book down to a pretty simple distinction. When we post a job, call a candidate, do a sendout, test a candidate, talk to a manager, do an innerview, etc, let's ask ourselves: "is the way I am doing this good or is it great?" Make it great.
The simple difference between the good and great companies is the great companies made a conscious choice and set a direction for greatness. Starbucks, Google, Microsoft, GE, etc. all start from one idea. Let's be the great company in our industry. Deciding this early on makes all other decisions easy. Do the great thing. Core Search Group is the great company in the recruiting space.

I really appreciate the work all of you have put into helping us be there. Obviously we have a ways to go but I see the path clearly. CSG will be ubiquitous in the software industry like Skype is in communications-clearly the best tool for the job. Let's all look at everything we do today with a critical eye. Is the action we just completed good or is it great? Is the candidate we are getting ready to send out good or great? Let's make it great.

Thanks!

DAVE

Tuesday, May 1, 2007

How NOT to disappoint 2/3 of your customers, in 3 easy steps


At Core Search Group we've long taken the stance that we are a customer service organization, not a search firm. We think our client companies are customers and our candidates are customers. Even if we elect not to help them. We talk to clients and candidates all day who give us orders to fill. Clients want certain types of talent. Talent wants certain types of jobs. We accept a small percentage of the orders and go to work trying to fill them. While our focus is on filling these orders we also think it makes good business sense to treat our customers the way we like to be treated. This is saying a lot as I may be the most difficult customer known to humankind. I want to be served what I am buying with a smile, as fast as humanly possible, and without wasting any of my time. Most organizations in my experience don't deliver. Evidently job seekers think so too.

Weddle's latest newsletter has some interesting survey results. When asked about negative experiences in their recent job search, only 32.4% of candidates reported not having any. So 2/3 of all the candidates surveyed had negative experiences. What would happen to a Starbucks or other service business that had this record?

We've been talking in this blog and in our offices about the ways we can strive to make every person's interaction with Core Search Group positive. I think we can give a candidate a positive experience even if we elect not to work with them. I even want the candidates who go interview with our client but do not get selected to have a positive experience. How can we do that?

First, we think every person who sends in their resume/application to our company should get a response. Not some boilerplate like "thank you for sending your resume. We will be in touch if there is a match." The majority of those who apply are not people we can help at the moment so most often the response is going to be, "thanks for sending your resume. We do not have a matching position for you now because (fill in the reason.) We are entering your resume in our system so we can contact you about positions that we have in the future that match your desire for (what the candidate wants.)" We've found the truth tends to make people satisfied even if they don't necessarily get what they want. If I went into Starbucks and ordered a Gaelic Ale I expect they would not be able to serve it to me. If I got a smile and a reason why and directions to the brewpub down the street I probably wouldn't be mad about it. And I'd come back when I needed a coffee.

Second, every candidate should be notified about what is happening at every stage in the interview process. They should know how the process works at the given company, how long each step should take, and how long it will take to get them a yes or no.

Third, candidates should be educated as part of the process about how the selection process works, which I have found most candidates are not clear on. As far as I know there is no manual to read on how great companies select employees but candidates seem to forget the Core Search Group theory of relativity: "it is not about if you and your skills match the job, it is about how you and your skills match the job compared to the other people interviewing." Companies are looking for rockstars. You shouldn't be upset if you interview for a job and someone else gets it. You should figure out what you didn't have that they did and go to work developing that trait in yourself. If the recruiter you are working with can't help you by getting feedback they or the company just don't get it.

As always I am interested in feedback from anyone with thoughts on how Core Search Group can better serve you today.

Wednesday, March 28, 2007

Software developer's guide to working with recruiters-decision analysis.

I hear from so many candidates so much confusion about what recruiters do and why. As our mission here is partly to treat our candidates like customers, I want to help you understand.

1. Your responsibilities. Many of the problems I hear about from candidates can be traced back to things they themselves did or did not do. Let's look at some of the things you should do to control your experiences.

Study the game. Imagine software development organizations as professional football teams. A professional football team is in a constant process of reorganizing itself around the strengths of the individual players. There are 2nd and 3rd string quarterbacks waiting in the wings to replace the first string person if he stops producing for whatever reason. They are gunning for his job but only get it if they get to be better than him. Unless you as the candidate can demonstrate superior production to that person you won't get his job. If you work for a company no one has ever heard of don't send your resume to Google. If you work for Yahoo don't send your resume to Google unless you are the star developer on your team. Decision point-can you articulate why the company should want you based on what you know about them compared to your current company? If not your odds of getting hired are poor.

Learn to play the game. Forget about tweaking your resume with keywords, studying for the interviews, and all the other things people do to get a job for a minute. Companies are looking for the best people they can attract based on their position. Say you are the quarterback for the #8 team in a conference of 2o teams. Don't apply for the QB position at the #1 team. They won't hire you unless you can demonstrate you took your team from #20 to #8 in a single season due to your proficiency. And even then it will be as a backup to their current star. Everything you go through in an interview is to qualify you compared to who they have now and the other people interviewing. If you rank with the best you get the job, period. Let me ask you a question. How many developers are on your current team? That number is x. Pretend you own the company and rank the developers from 1 to x with #1 being the person who has contributed the most to the organization and #x being the one who has contributed the least. I only want to talk to you if you are #1 or #2. Because companies only pay fees to third party recruiters for the best of the best. Decision point-can you tell me why you are the best on your current team? If not start looking for openings through job postings and internal recruiters.

Control your information. I have worked with a lot of candidates who wanted to get into one specific company but ruined their chances by choosing the wrong route to go through. When we placed software engineers with Amazon.com we had a byzantine and unexplainable set of rules to function under. For example Amazon employs hundreds of 'researchers' who scour the web all day for resumes that fit keywords. They dump the resumes into a database where they sit. And sit. And sit. Amazon has a rule that if they have the resume they won't consider the person through a recruiter for 6 months. So we would find a good candidate and check the system. The person was in the DB. Had been for three months. No one had ever contacted him. So we would call the candidate, explain the situation, tell them why we thought we could get them the job, wait three months, resubmit the candidate, and place him. We did this several times. Amazon could hire a lot more good people if their system didn't make it so hard. The fact is most hiring managers do not have time to sift through a DB of ten thousand resumes. This is where the experienced headhunters come in. We qualify and use judgement to present the manager with the top 1% matching his/her requirements. Your job as a seasoned and experienced software developer is to do a smart search. Don't submit your resume online to a company if you can find a better way in. Find a qualified recruiter who has access if you can. Once you get in your target company's database you have a short window of time where your chances are good. If you fail a couple of interviews or are resubmitted by competing agencies who you have tried to play off on each other you can consider your chances with that company to be zero. You are done. Also if you are working with more than one recruiter be honest with each about it and which companies you are already talking to. If two different recruiters submit you to the same company the company rejects you because a. they don't want to fight with two recruiters about who gets the fee and b. they think you must be lying to one of them and great companies try not to hire liars.

Your resume. Don't post it on monster or other job boards or keep it on the web perennially unless you do it confidentially. Remove your name and address and the name of your current company. If your resume is on the web with your name and contact info on it you are being submitted to companies without your knowledge. I have talked to many candidates who can't get an interview at the company they want to work at because their resume has been submitted without their knowledge by a recruiter nobody knows. Learn to qualify recruiters for their skill just like recruiters qualify you. If a recruiter can't tell you the name of the company, the group, the hiring manager, and why they think you have higher than average chances of getting the job, do not let them submit you. They are not qualified to represent you. Decision point-are you convinced the recruiter is the best out there? If not do not proceed.

Research. Once you are in the door and an interview is being coordinated you need to go into full bore research mode. Find every website and blog of current developers at that company and learn everything you can about their backgrounds. This will give you clues to what type of traits they are looking for. You need to pinpoint the areas you are most likely to be grilled on technically and study all of those areas. Learn what the team is doing and be ready to demonstrate how you can help. Pretend you are defending your dissertation. Be ready to answer everything you might get asked. Decision point-have you prepped for days for the interview and had people you trust give you a mock interview? If not reschedule it and take a couple days off work and do the prep.

Understand qualifying. I often explain to candidates that an interview is not about you and your skills and whether they match the job. The interview is about you and your skills relative to all the people currently working there and all the great developers they have ever worked with. Oh and all the other candidates they talk to. You need to have the best technical skill of all the candidates, the best presentation of all the candidates, and have done the most prep of all the candidates. You need to demonstrate that you meet the bar. That you're in the club. You have used and know all the design patterns and can demonstrate it. You have invented cool things, saved projects from failure, and otherwise performed to the level of the current team. If you can't demonstrate that you don't get the job. Consider an interview your own personal "The Apprentice." If you're not number 1 out of the group of interviewees you don't get the job. Decision point- are you convinced no one can do this job better than you? If not look for one that you are sure on.

2. Choosing a recruiter. You need to learn to qualify recruiters just like they qualify you. When I talk to a developer the question in my mind is "why is this person the most likely to get offered this job?" If I can't convince myself you are we don't proceed. You need to ask "why is this recruiter the most likely one to get me this job?" Interview the recruiter like they interview you. How many people has he placed at this company? How long has he worked with the company?

Types. Headhunters. A headhunter is a third party who is paid a fee to bring and place good candidates. Back to the exercise where you ranked yourself in your current group. If you are #1 or #2 great. You should find a qualified headhunter to help you in your search. Qualified means they make placements of people with your skill set all the time (and can provide references,) and have openings in the location you want, and help you get the job. Also look for a number of years of experience and a track record of specializing in what you do. Companies that claim to specialize in "IT, health care, and purchasing managers, nationwide." are full of it. Decision point-do you see an uncommon level of focus (and success) on placing people like you? If not keep looking.

Internal recruiters are like convenience store clerks. They are paid to sell you what is on the shelf, not what you want. They can't give you detailed information on what's on the shelf. They can just point you to it. If you want customized attention and the right thing for you my suggestion is to become the best and then call me or another qualified headhunter. I recently talked with Google about a contract recruiting job. I learned that the internal metric is they want 5 interviews a week set up by the recruiter. Not 5 interviews with good candidates, not 5 interviews that result in an offer, just 5 interviews. This is just one of the ways Google does a really sloppy and ineffective job of recruiting. Decision point-don't work through internal recruiters unless you can't find any other way to get in.

3. Working with the recruiter.
Don't lie. We just dropped a candidate because we learned he had lied to us about interviewing with our client previously. We might have been able to place him regardless of the earlier interview, but we know our client doesn't hire liars so we weed them out right away. If you work with multiple recruiters make sure they all know every company you are already talking to so they don't multiple submit you. Make sure you know every place they submit your resume. Sometimes candidates think going through two headhunters to the same job or company without telling either of them doubles their chances. It doesn't-it almost always completely destroys your chances. Decision point- have you been honest with everyone involved? If not now is the time to start.

What else do you want to know about the best way to get the job you want? Drop me a line and we'll get you the information you need.



Wednesday, February 28, 2007

The symbiotic relationship.


What do the clownfish and the sea anemone have in common with the technical recruiter and the software developer? Everything. Especially the symbiotic relationship.

The clown fish is like Steve Jobs. It lives an existence where it's survival depends on speed and intelligence. It doesn't really fit in anywhere. It doesn't school with other fish for protection. It is vividly colored which makes it an easy target. It is able to take bigger risks than other fish only because it has learned different survival strategies than other fish. It can see around the reef and from one population of sea creatures to another. When threats mount it can retreat to the safety of the relationship with the anemone for protection. The clown fish protects the interests of the sea anemone because the sea anemone protects the interests of the clown fish.

The sea anemone is rooted in one spot. It isn't able to swim around and see what's going on or what threat is around the corner. Due to it's circumstances it can't pick up and run when an anemone-eating creature is closing in. It relies on the clown fish to defend it from such a peril. Sure the anemone can sense when ocean conditions are changing and move to a new spot, but it takes time to happen. The sea anemone protects the clown fish because the clown fish protects the sea anemone.

I have a candidate now who has been watching his company/department shrink due to the continued telecom turbulence. Developing world-class telecommunications provisioning/ routing/OSS software is hard enough without having to go into work every day wondering if this will be the day they close the office. He's been with the company 20 years and would like to stay until he retires. He's given everything of himself to this company. He's been rewarded and they've made a lot of money from his work (hmmm what would we call this type of relationship?) but he can see the ocean is drying up. His ecosystem is dying.

As his clown fish I need to find him a great company in Central NJ with the desire to have one of the best minds in the world making them millions with his talents. I am checking out all the likely places an anemone would like to settle in that area. When I find the best spot I won't rest until I get him settled there. When he is thriving again I'll be able to attract other great people to his team.

Who is your clown fish?

Monday, February 12, 2007

What do candidates want?

Core Search Group is a work in progress. Though we are 7 years old we look for at least one way to improve every day. We solve a vexing and expensive problem for both candidates and companies. We want to be the best in the world at solving that problem. We only are effective when we have a symbiotic relationship with both groups.

I asked a question over on Linkedin and was very interested in the responses. The question: "How do you as a candidate pick a third party recruiter/headhunter to work with? Please list your top 5 criteria in descending order of importance." If you're in my network you can view all the responses over there. Here are select answers:

"I have found that the following criteria work well for me when selecting a recruiter/headhunter (listed in descending order):
- understanding the network of clients in your specific industry that they have access to
- understanding how they work with client companies (are they a retained recruiter or contingency based)
- how well do they match your desired target areas (types of companies/positions/industries, geographical preferences, number of positions, etc.)
- are you looking to use the recruiter one time or build a relationship (i.e. are you always open to good opportunities?)
- personality (i.e. can you work with this person – you can’t underestimate the amount of time you will spend talking with a good recruiter"

From a candidate we are currently working with:
"I have too many recruiters contact me with the same attitude. I have a position that I need to fill and I need you to do this. I don't care what you want as a candidate that does not matter to me. I want you to fill this job, and who cares if it meets your needs if it gets me my commission. If as a recruiter you come at me this way, I will be more than happy to show you the door. "

From another headhunter:
"1) Find out from two or three experienced recruiters that specialize in your field whether or not they think that you are "fee eligible". This means that they think that their clients will definitely want to pay 25-33% of your base salary to the agency above and beyond what they will pay you in salary. Ask them to be brutally honest. If you are not fee eligible, no recruiter can help you.
2) Presuming that you are "fee eligible", ask hiring managers in your field if they can recommend any recruiters that they have had a good experience with from the client side.
3) Ask professional colleagues who have been candidates of recruiters the same question.
4) Once you have met with a recruiter, ask yourself whether or not the recruiter views you merely as a transaction or if they seem like they have your best interest at heart. Remember, if you are fee eligible you could be worth thousands of dollars to a recruiter.
5) While experience alone does not always translate to quality, more experienced recruiters tend to be more effective. Bear in mind that contingency recruiters would have had to been good enough to survive and succeed in a 100% commission environment for however many years that they have been in the game. "

What do you think we should be doing for you? We want to know.