Stackoverflair

Twitter Updates

    Follow Me on Twitter

    Where’s the Value in Tech Recruiting?

    I live in the New York City greater metropolitan area where recruiters are in no short supply.  Many recruiters work in specific areas such as executive hiring, administrative hiring, or hiring for financial companies.  There are a number of recruiters who specialize in tech recruiting.  In my most recent job search I’m using a number of them now, but I’m wondering where the value lies for the company who is searching for a candidate.

    Recruiters are paid in one of two ways, but the most common is on a commission basis just like real estate agents.  Once a candidate is offered a position and accepts there is usually a honeymoon period (to make sure that the candidate stays), then the recruiter is paid their commission.  The commission is huge, in the range of  25%-35% of the candidate’s first year salary at their new job.

    Let’s take a look at the math here:

    Consider Jasonium Software is looking for a new programmer.  The salary range for the position is $90K-$110K.  Jasonium’s current team lead makes $150K per year.  Jasonium’s other programmer makes $100K.  Jasonium software is going to use a tech recruiting firm to perform the candidate search.  This means that Jasonium can expect to pay between $22.5K (20% of $90K) and $38.5K (35% of $110K) to fill this position.

    Let’s say that Jasonium were going to perform the search without the help of a recruiter.  The money that they would have spent on a recruiter is equivalent to the following amounts of Jasonium staff’s time.

    $22.5K $38.5K
    Team Lead 1.8 Months 3.08 Months
    Programmer 2.7 Months 4.62 Months

    So using a recruiter is supposedly worth the same as dedicating one person full time for more than 4 and a half months to finding Jasonium’s new programmer?

    How does the recruiting industry justify these gargantuan markups?  And why do companies continually pay them?

    My ATM Sucks.

    I was in an interview recently and after all the questions about code and writing code and reviewing code I was asked

    What is the one thing you would change about the ATM you use most frequently?

    The first thing that popped into my mind was the atrocious $3 fee for taking out any amount of money.  I live right near a train station, so all the local ATMs gouge you.  Seeing that the US taxpayers have bought the bank that runs this ATM twice over I think we ought to abolish these ridiculous “Convenience” fees.  Yeah…I want to take out $60 bucks, but losing 5 percent on my money instantly doesn’t seem too convenient.  I digress…

    I didn’t think the fees were what the interviewer was looking for and the second thing that jumped to mind almost immediately was the abysmal user interface this ATM had.  Let’s go to the film.  I snapped this photo at great personal risk of looking like someone who wanted to rob a Shittibank ATM, but then I remembered that I own it.  Can you really be accused of robbing yourself?  This is a me-eyed-view of what I see when I get to this particular ATM.

    ATM Badness

    I’m not bragging here, but I’m 5 feet 9 inches tall.  I know, I know…you all want me to play center for your kids’ middle school intramural basketball team.  Please, stop calling. If I were Shaq sized I might not have a problem, but as a man of slightly less than extraordinarily average height I don’t think it’s too much to ask that I be able to see all the keys on the keypad.

    The fact that I can’t see the 1,2,3 doesn’t really bother me that much.  I can infer from where the 4,5,6 is where my fingers should do the walking.  But the more insidious problem is that the Enter Key, used to confirm the entry of my pin number, is conspicuously invisible.  I can see the “CLEAR” and “CANCEL” buttons which indicates to me that Shittibank considers me a slackjawed mouth-breathing luddite who couldn’t conceivably enter a 4 digit pin without screwing up, but the “ENTER” key is nowhere to be seen.  Everytime I key in my pin I’m then forced to look down trying to find the enter key and that’s when they sneak up behind me and tickle me until I pay the “Convenience of not pissing your pants” fee (I have a weak bladder under tickle-torture).

    In Steve Krug’s Don’t Make Me Think (Please buy it now if you haven’t already) there’s a section in Chapter 3 on Conventions.

    At some point in our youth, without ever being taught, we all learned to read a newspaper.  Not the words, but the conventions.

    ATMs are exactly the same.  At some point in our teenage years, without ever being taught, we all learned to use an ATM.  Every ATM designer these days has a mountain of conventions to work from such as:

    There should be a mirror on the face of the ATM so that users can watch the people in line behind them pick their nose while waiting to use the ATM.  They’ll have a hearty chuckle and want to use this ATM again.

    There should be an ominous piece of smoked glass on the face of the ATM with a security camera behind it so we can watch the people using the ATM pick their nose.  We’ll have a hearty chuckle and sell the footage on the internets.  They’ll want to come back so often (because of the mirror) that we’ll have a lot of footage.

    And so on.  These things almost design themselves.  Since it seems that no one has done it yet, I’m gonna go ahead and codify the first two conventions of ATM design now for all you ATM designers out there.

    The First Convention of ATM Design

    DON’T MAKE ME THINK! (Thanks Steve)

    The Second Convention of ATM Design

    Pursuant to the first convention any key, button, or touchscreen element that should be pressed by the user of the ATM SHOULD BE VISIBLE TO THE USER AT THE TIME IT IS MEANT TO BE PRESSED.

    OK Shittibank.  Now that there’s some rules set down, I expect you to follow them in the future.  Get the ATM replacement technicians out in the field and make it happen.

    Glass’ Rules of Three

    In Robert Glass’ Facts and Fallacies of Software Engineering he presents his “Rules of Three” when it comes to writing reusable components.

    1) It is three times as difficult to build reusable components as single use components.
    2) A reusable component should be tried out in three different applications before it will be sufficiently general to accept into a reuse library.

    The first thing I like about these rules is that they are implicitly saying, “It is perfectly OK to write single use components.”  These days I think a lot of developers minds spend a lot of cycles on reusability and API writing when they don’t really need to.  This paralysis keeps them from completing a great product in a shorter amount of time.

    Rule two is more powerful than rule one.  You might be able to weasel an extra two days into the schedule for the larger project so you can get your fix and write a reusable component.  You might.  But you aren’t going to be able to shoehorn the component into 2 other places it doesn’t really belong without someone noticing.  If you agree with Glass’ rules, you can see these two corollaries.

    1a)  Assuming difficulty = time, if you don’t have three times the time budget you would need to build a single use component, build the single use component.
    2a)  If you don’t have three real applications where you can use this reusable component, build the single use component.

    These are easier to follow when trying to make decisions because they give you concrete tests to pass before you set down the path for the holy grail of reusability.

    Getting Up and Running…

    Well…Congratulations…you’ve somehow found the least informative site on the internet.  Hopefully that can change over the life of this thing, and maybe we’ll get to learn something together.

    So in this first post, I guess I’ll just describe how I’ve gotten up and running with Wordpress.

    I had the blessing of coming across Slicehost in the last couple of months.  Slicehost is a Virtual Private Server hosting company.  You pick a server configuration with a certain amount of (RAM/Storage/Bandwidth/Linux Distribution) for as little as $20 per month.  They have a very usable management interface that allows you to setup most of what you need pertaining to DNS etc.  Another beautiful feature is their web-based shell which allows you to work on your box from anywhere (even those pesky places that clamp down on the SSH port).  The entirety of this setup can be done from the web shell.

    So I’ve configured my slice for a clean install of Ubuntu 8.10.  Wordpress works on the LAMP stack so its pretty easy to install all that stuff on Ubuntu.  I do all this as root on the web shell, so there’s no sudo’s.  You’ve already got the L in LAMP with Ubuntu, so let’s go on to A.

    Apache

    Type the following into your terminal

    apt-get install apache2

    It may ask you There’s really nothing to do after this but test it.  Go to http://[your slicehost ip]/ in your favorite web browser.  If you see “It Works!” then you’re good.  Let’s move on to M.

    MySQL

    Here we go with that terminal again…

    apt-get install mysql-server

    This will install mysql-server 5.0.  During the install you will be asked for a root password (come up with something secure).  Write this down, we’ll need it for later.  Let’s move onto the P.

    PHP

    Back to the old terminal…

    apt-get install php5 libapache2-mod-php5

    This installs PHP.  To get PHP to work with apache you need to restart it like so.

    /etc/init.d/apache2 restart

    To make sure PHP is working use your favorite text editor to open up /var/www/test.php and enter the following text

    <?php phpinfo(); ?>

    Save test.php and close it.  Now go to http://[your slicehost ip]/test.php and you should see a page with a bunch of diagnostic information.  If so then you’re good to go.  Delete test.php for good measure (you don’t need any looky-loos seeing all your stuff).  Congratulations, you have a LAMP stack.

    What’s Next

    So you’ve got a LAMP stack now, what’s next?  We’re going to install a program that will enable you to administer your MySQL databases from the web called phpMyAdmin.

    At the trusty terminal…

    apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin

    It should ask you what web server you want to auto configure, choose apache2.

    Back in the browser, go to http://[your slicehost ip]/phpmyadmin.  You will be presented with a login box.  Login as root with the MySQL password you wrote down before.  You should see something similar to the screen shot below.  It looks scary but it is really easy, I promise.

    The PHP My Admin Opening Screen

    The phpMyAdmin Opening Screen

    WordPress

    From here on out we’re going to follow the handy-dandy WordPress 5 minute Install Guide (A little out of order).

    Database

    First we need to create a MySQL user and database for WordPress to use.  This is super easy.  Click the Privileges link near the bottom of the list and you’ll be brought to this screen.

    addauser

    Click the “Add a new User” link and you’ll be brought to this screen.

    addauserscreen

    In the “User name” field type wordpress.  In the Host drop down box choose “Local”.  In the password field type a password for the wordpress user  (try and make it something different from the root password you used before).  Re-type it in the “Re-type” field.  Under the “Database for User” section, choose “Create database with same name and grant all privileges”.  Click go and you should have a brandy-new database to use with WordPress.

    Download

    To download the latest copy of wordpress from the terminal do the following.

    cd /var/www/
    wget http://wordpress.org/latest.tar.gz
    tar -xvf latest.tar.gz
    mv wordpress blog
    chown -R www-data blog

    That last line is to make apache the owner of the WordPress directory.  This makes it possible to upload pictures, install plugins and other good stuff.

    Configure

    We need to make some changes to the default configuration file for WordPress, so that it will talk to our database correctly.  Do the following:

    cd blog
    mv wp-config-sample.php wp-config.php

    Fire up that text editor and open wp-config.php

    You’ll need to insert your database parameters in the following lines.

    define(’DB_NAME’, ‘putyourdbnamehere’);
    define(’DB_USER’, ‘usernamehere’);
    define(’DB_PASSWORD’, ‘yourpasswordhere’);

    to

    define(’DB_NAME’, ‘wordpress’);
    define(’DB_USER’, ‘wordpress’);
    define(’DB_PASSWORD’, ‘the password you chose’);

    Save and close.

    The Finale

    You’re so close you can taste it, right!?

    The final step is to go to http://[your slicehost ip]/blog/wp-admin/install.php.  Enter your data (Blog Name and e-mail Address) and click that big Install button.

    An admin account and password will be generated for you.  (WRITE DOWN THAT ADMIN PASSWORD SO YOU CAN LOGIN).  It’s a random string of characters, so you may want to change it to something more memorable later.

    Congratulations

    You’ve got your very own wordpress blog to write your very own “Getting Up and Running…” post.

    Enjoy.