Re: How to Find Good Developers

A little less than a month ago I made a podcast with John about how recruiters can find good developers. A small part of the podcast talked about reaching out to developers, and how adding something personal (ie, mentioning one of their projects) can really get some attention.

In the past few days, I’ve gotten two emails from recruiters: One awesome one, and a terrible, obviously automated one that I’d never, ever respond to.

First, the bad one:

Hi,
At some point in the past you contacted our firm directly or posted your resume on the internet.

You may not be qualified or even interested in this position but if you know someone in that may be interested in the position described below, please forward this email to them.

The good one:

Hey Kenny,

I work in Team Development (not a crappy tech recruiter spamming people) over at [company] and have hired over 50% of the team over the last three and a half years. In fact, I brought [person I know] on board straight from [place I used to work] a couple months ago. Your experience at Huge and LTech caught my eye because our dev team is growing and we’re looking to add a Software Engineer to the team.

[... The Rest ...]

Sh-bang! That second one is awesome. I responded (saying I was happily employed), but I appreciated the reach-out.

The first one is horrendous. In fact, I was going to click “Report Spam” in GMail, but I decided I would write up a quick post about it instead.

Is that how some firms actually try to recruit people? I can only imagine that the most desperate of job-seekers would actually follow-up on that. And the event that they are truly desperate, I’d say that the probability of the job-seekers being qualified for the job is a tad (just a tad) low [citation needed].

The worst part is that the email was framed as if it was from a real person.

Maybe they aren’t even looking for good developers.. who knows. But this is my point: If you want to increase the probability of someone responding, make it personal.

Posted in Jobs, Life, Offtopic | Tagged , | 1 Comment

CodeIgniter Reactor? What’s Going On?

A couple of weeks ago, Derek Jones of EllisLabs announced that the CodeIgniter Core would officially be branched so a community-driven version of the framework could be created. This new branch will be called CodeIgniter Reactor.

The plan, which was clarified today, is focused on allowing a select group of CI engineers to actively commit new features to the codebase, while taking feature requests via a uservoice forum. Over time, any proven, time-tested features in Reactor will be merged into the Core.

This announcement comes after a two year period of relatively few changes to CodeIgniter — something the community has had mixed feelings about. For some, it meant CodeIgniter would remain a remarkably stable platform to build on in contrast to frameworks like Cake or Kohana. For others, it meant CodeIgniter was probably dead.

So is that why frameworks like Kohana, once a fork of CodeIgniter, exist?

That, and also: A frustrating reality for many in the CodeIgniter community is that although it is the fastest, lightest MVC framework for PHP, it still lacks some important features. Many once-smitten CodeIgniter evangelists grew out of the framework and began looking for something that was more full featured. That is, they wanted an ORM, more libraries, more robust implementations of unit testing and caching, and a style of usage that actually conforms to the definition of MVC.

Why does CodeIgniter still have such a loyal following if more full-featured frameworks are around?

As mentioned, CodeIgniter is considered one of the fastest script-based frameworks available. It takes a “load only what you need” approach — something other platforms definitely don’t do. Rasmus Ledorf, the original author of PHP and skeptic of PHP frameworks in general, has even singled out the framework as something he might actually use.

As a side note, while at Yahoo! I’ve had the chance to read into exactly why Rasmus doesn’t like MVC via the internal wiki pages that he wrote himself — and guess what, he’s right. But that’s a topic for another post.

The other big (if not HUGE) reason that CodeIgniter has remained popular is the documentation. You cannot find a framework with more clear or concise documentation. Of course, it’s easy to keep the docs current when the framework hasn’t changed for two years!

So what the hell is going to happen with CodeIgniter Reactor?

I’m one of the engineers on the project, and I’ll be clear that CodeIgniter Reactor will pick up where CodeIgniter left off. Although the official roadmap hasn’t been laid out just yet, you’ll find Reactor will still have a high level of dependability and outstanding documentation. If Reactor’s docs fall into dismay, hold me personally responsible. I won’t let it happen.

There is a feature request forum for Reactor set up at UserVoice — a place where CI users who want to suggest additions can go.

Of course, that doesn’t mean every feature suggestion, whether it’s the popular or not should actually be implemented. The Reactor team will make intelligent decisions about what and what not to change, remaining in line with the original principals of CodeIgniter: Light footprint, low barrier to entry.

If I had to underscore my own objectives in implementing new features, they are speed, efficiency, and power. That is:

  • Does it belong in the framework?
  • Can this feature be built efficiently?
  • At the highest level of efficiency, will it be fast?
  • Is it comparably robust, and powerful in the face of similar features in other frameworks?

A word to the skeptics:

A tweet I saw immediately following the Reactor Announcement was “Death by bureaucracy is the fate for CodeIgniter shame … Good riddance, it never matured”. This really embodies the sentiment most users have about other frameworks. It’s arguably the fate that Kohana and Cake have seen.

What I’m saying is: stuff away the cynicism until the first quarter of 2011. You’re going to see a ton a positive changes in the framework, and CodeIgniter users will have plenty to brag about without sacrificing usability and documentation.

There are 6 engineers on the dev team — one who I know very well, and a few others who I’ve met just recently. In all honestly, I’ve been very impressed by everyone, and I couldn’t imagine anything but a bright future for the framework. The other devs are:

Six developers can approach the “too many cooks” scenario, but I think you’d also have to recognize that CodeIgniter is supported by volunteers, and a project needs 5 or 6 people in order maintain consistently high activity when they’re generally working on it part-time.

Okay, so now what:

Over the next few weeks, the Reactor team will be getting organized and planning out the future of CodeIgniter. Check back here or at my Twitter feed, because I’ll definitely post a podcast outlining exactly what the Reactor team plans to do. Also, I tend to lurk around the IRC #codeigniter channel on freenode as _kennyk_ .

If you have any questions, comments, or general skepticism, comment below. I’m all-ears.

Posted in CodeIgniter, PHP Development, Tools | 7 Comments

How to Find Good Developers

A comment on one of my favorite CodeFury posts, “How to Get a Job as a Programmer“, asks an interesting question. It was posted by Kyle Carter, the head of HR at Better Advertising. He posed the question, “how or where do I find good developers?”

At the time that I’m writing this, the NYC tech market is picking up fast. More startups are getting funding, big corps are relaxing the budgets, and good developers are jumping ship left and right in search of cooler projects, awesome teams, higher positions, and big checks.

So, to put that question in context: How exactly do recruiters and HR departments find and compete for the best talent right now? John Crepezzi (my startup partner) and I put together a podcast going over a bunch of different things, like identifying good developers, finding them, keeping them and why you want them in the first place. Listen to it here:

http://podcasts.oconf.org/episode1.mp3

If you would rather listen to it streaming online via the HTML5 player @ Tumblr, check out it out here.

The basic gist is this: Good developers are people who like to build/improve and learn. They are very active with both consulting and open-source projects, often outside of a regular full-time job.

They like to work with other good developers, which is why great engineering teams attract more great engineers.

You can find them on GitHub, SourceForge, and Twitter, by reaching out to them (once you’ve identified them as ‘good’). Include a personal note (maybe mentioning some of their projects), which is a big deal — it will likely get you a response at the very minimum. Once you know a core of good developers, it’s not difficult to find more by asking them.

The podcast goes into much more depth. If you’re a recruiter or HR guy, take this podcast not so much as if it’s from an authority (despite the tone), but from developers who love what they do.

If you have any comments, drop’em.

Posted in Jobs, Life, Offtopic | 1 Comment

Social Networking, Mang. It’s Like the Internet All Over Again.

Brief but intense “holy shit” moments have been hitting me quite a bit in the last couple weeks. For the last 5 years, my social networking experience has largely consisted of Facebook, and I took it for granted as an application that was just really good at what it did.

Maybe that’s even what Zuck thought. (Hey Zuckerberg, comment on my blog whydontcha. I’m having convulsions here.)

I have often wished I was twenty-something in 1995, prime for the internet boom. But in 1995, would I have recognized what was taking place? Would I have realized the extensive impact the internet would have on my life and on human history? I don’t know.

But I’m twenty something now, and I think it’s happening again. Something incredibly profound is happening, and it will affect us forever. It won’t just affect your life online. People will inevitably be 100% connected to this vast social grid, because they want to be.

I am guilty of drinking way too much soda + coffee and getting delusional later in the day, but I don’t think I’m blowing this out of proportion. I’m almost dizzy from thinking about it.

Some questions that are cropping up in my mind include:

  1. How will Facebook and other social networks become even more real-time?
  2. How will desktop-based social browsers like RockMelt fair? Don’t RockMelt’s social extensions essentially do what Facebook’s more portable Apps can already do if they wanted to? If desktop social browsers prevail, why did they?
  3. How many investors invest in social apps because they think anything social will make money, and not because they understand the insanity of it all?
  4. What is sum of it all? Where is all this stuff leading us? Social networking is surely not the terminus. There’s a crazy future ahead of us.

That’s all for now. Comment if you think I’m all wrong, or you have some answers for those questions. @seejohnrun? @johnbellone?

Posted in Uncategorized | 5 Comments

A Better WordPress Search with WPSearch 2.0.2.0

I’m definitely not the type to evangelize something I don’t think is useful. Ask friends of mine, and they’ll likely tell you how I went through phases where I endlessly promoted things like Notepad++ for Windows, Netbeans IDE (PHP), Sequel Pro, Gnome-Do, Thinkpads, Macbooks, Toy Story 3, iPod Touches, and Visual Studio ’08. I just can’t help it. When I get excited about something, I have a hard time stfu-ing.

But holy crap. Let me tell you — if you think the WordPress default search sucks — as I did 2 years ago, try WPSearch. It’s (IMO) the second-most-useful plug-in that has ever existed for WordPress. It also has the slickest admin UI I’ve ever used in WordPress (a big thanks to JQuery and it’s plug-ins, of course).

I wrote WPSearch, and I 100% recommend it to anyone running something that isn’t a traditional WordPress blog. Run a recipe catalog? Use It! Review engine? Use it! Shopping engine? What the hell are you doing without my plug-in on your site? Your customers can’t find shit!

Fun scenario: Let’s imagine you sold laser printers on your site along with other computer peripherals, and every product page on your site had “[brand] [model] Printers” in it’s title, like “Dell 1100 Laser Printer”. If someone searched for “printers” with default WordPress search, they wouldn’t get those products back.

Does that scare you? It should. Get WPSearch now. And if you don’t like it, tweet @_kennyk_ and be brutally honest. I can take it.

Side note #1: When I wrote WPSearch, I was also trying to cash-in big time at a programming contest where the grand prize was a trip to RailsConf and the runner-up would get a set of steak knives (presumably to stab whoever won the grand prize).

Side note #2: Toy Story 3 is an intellectually provocative and introspective masterpiece!

Side note #3: Askimet is #1, but is tragically taken for granted

Posted in Gadgets, PHP Development, Search Engine Development, Tools, Wordpress Development | 2 Comments

The Best WordPress Search Plug-in: WPSearch 2

If you want to read about the background of the WPSearch Search plug-in for WordPress, read below. But if you just want the gist of this post, here it is:

WPSearch is the best search plug-in for your WordPress blog. It is a stemming, stop-word blocking, fast, relevant, fulltext search for WordPress. There isn’t a single plug-in in the WordPress repository that can do what it does.

You can get it here: http://wordpress.org/extend/plugins/wpsearch/ — or just install it through the WordPress plugin administration backend. Just search for WPSearch.

If you run any sort of monetized blog, you might be losing sales or readership if users can’t find what they need on your site. According to Adotas, 43% of users hit the search box first.

Background:

I’ll admit that I’ve been pretty vocal already about WordPress’ lacking search functionality. I’ve been vocal about it for 2 years, and it was the original impetus to get this blog up and running. It was also the reason that I wrote wpSearch, the original version of WPSearch — the lucene-based search plug-in for WordPress. wpSearch was the first true fulltext search for WordPress, in my opinion.

But the problem with wpSearch was that it wasn’t highly engineered. I had written it for a programming contest, and I was on a tight deadline — and when projects are rushed, the quality of code goes down. And because of that, bugs made their way out of the woodwork over the next two years.

Consumed by college work and my job, I didn’t have much time to address those issues. In fact, I had declared wpSearch unsupported a year after it was released in 2009.

A year following that, Daniel Hay at Pixelberry in New Zealand had requested that I add the ability of searching within a category for a client of his. That’s when WPSearch 2 development began.

I wanted to give wpSearch a full rewrite, and correct several mistakes I made with the first version:

  • Rename it from wpSearch to WPSearch
  • Change the listing name in the WordPress repository to WP Search, so searches for ‘search’ would bring it up
  • Follow and MVC pattern (it’s a complex plug-in)
  • Build a configurable search driver framework, so any driver could be written to search and index
  • Build better logging
  • Evangelize it to no end (wpSearch was barely promoted)
  • Give it a UI independent of the default WordPress stylesheets, and also make it stylish

The biggest change is the configurable driver part. The free version of WPSearch contains a driver that uses Zend Lucene in the background. Any driver, however, can be written to work with WPSearch. Drivers for SOLR, sphinx, the Google Search Appliance, or name-your-own-search-product could be written.

I did that because PHP is not the best language to write a search engine in. Since Zend_Search_Lucene is the backend driver of the free version, there is an upper-bound of scalability on the plug-in. After all PHP is a scripting language, and I doubt Zend ever really imagined someone would make the ludicrous decision of indexing tens of thousands of posts in PHP. I found the breaking point to be about 20,000 docs. At that point, I ran into memory issues, slow mid-indexing optimizations, and slow first-hit (non-cached) searches.

So the point is that I poured everything I had into WPSearch 2, and I want to tell everyone about it. I did this project under the umbrella of OConf, my start-up, with business partner John Crepezzi. John’s an ex-engineer at Sun Microsystems, and he spends his days at Patch.com now. He also wrote the backend driver for WPSearch Pro, an alternate driver for WPSearch 2 which can handle up to 500,000 docs.

John and I gave a talk at Wordcamp NYC, where we officially launched WPSearch 2.The topic was on the default WordPress search, and why avoiding a remedy to it can lose you both readers and money. If you run a shopping engine, people can’t find your products. If you run a news site, readers can’t find your content.

If you don’t think people even use the search box — heads up, the advertising gurus at Adotas say 43% of users who find your site do.

You can check it out here: http://wordpress.org/extend/plugins/wpsearch/ . In it’s short time in the repository (about 9 days), it’s already had around 1,000 downloads, and I’ve had a lot of positive feedback coming in. I also dropped a comment about it on WordPress founder Matt Mullenweg’s site, where he mentioned a search product for Drupal. Hopefully he’ll check it out and let me know what he thinks.

Check it out!

Posted in PHP Development, Search Engine Development, Tools, Wordpress Development | 3 Comments

WPSearch 2 To Be Released At WordCamp!

After almost two years since the last major release of WPSearch, WPSearch 2 will be released this weekend at Wordcamp NYC.

WPSearch 2 has been the highest rated search plug-in in the WordPress repository, with much thanks to the bug reporters, testers, and donations along the way.

WordCampNYC – Oct 16-17

WPSearch 2 was built for WordPress 3, and features:

  • A COMPLETELY rewritten codebase
  • An in-page progress bar for index builds
  • Verbose logging for troubleshooting
  • A ‘test’ mechanism that tells you exactly what things you still need to do to run WPSearch (like changing file permissions, and other things like that).
  • An engine that can handle close to 10,000 posts
  • The one and only word-stemming analyzer for Zend Lucene

I’ll be presenting this with John Crepezzi, co-founder of our company, OConf. We’ll be discussing why the WordPress search is lacking by default, the effect it has on the monetization of your site, and the new release of WPSearch.

We’ll also mention a premium version of WPSearch, which can handle up to 500,000 posts, but uses a proprietary back-end driver.

Come check us out! If you have any questions, drop a comment!

Posted in Uncategorized | 1 Comment

Easy Reverse Routing with CodeIgniter

I really can’t stand hard-coding URLs in the views or controllers of my application — and I’m sure most other people can’t either. Here’s an extension for the CodeIgniter Router class that I wrote that gives you a nice way to write routes that are reversible and also have the ability to take parameters.

<?php
 
class MY_Router extends CI_Router
{
    private $_reverseRoutes = NULL;
 
    CONST ARR_ROUTE_POS      = 0;
    CONST ARR_ROUTE_NAME_POS = 1;
 
    function _parse_routes()
    {
		// Do we even have any custom routing to deal with?
		// There is a default scaffolding trigger, so we'll look just for 1
		if (count($this->routes) == 1)
		{
			$this->_set_request($this->uri->segments);
			return;
		}
 
		// Turn the segment array into a URI string
		$uri = implode('/', $this->uri->segments);
 
		// Is there a literal match?  If so we're done
		if (isset($this->routes[$uri]))
		{
			$this->_set_request(explode('/', $this->routes[$uri][self::ARR_ROUTE_POS]));
			return;
		}
 
		// Loop through the route array looking for wild-cards
		foreach ($this->routes as $key => $val)
		{
			// Convert wild-cards to RegEx
            //echo "$key --> ";
			$key = preg_replace('/\:\w+/', '[\w\-_]+', $key);
            //echo "$key <br />";
			// Does the RegEx match?
			if (preg_match('#^'.$key.'$#', $uri))
			{
				// Do we have a back-reference?
				if (strpos($val[self::ARR_ROUTE_POS], '$') !== FALSE AND strpos($key, '(') !== FALSE)
				{
					$val = preg_replace('#^'.$key.'$#', $val[self::ARR_ROUTE_POS], $uri);   
				}
 
				$this->_set_request(explode('/', $val));
				return;
			}
		}
 
		// If we got this far it means we didn't encounter a
		// matching route so we'll set the site default route
		$this->_set_request($this->uri->segments);
    }
 
    function _buildReverseRoutes()
    {
        $reverse_routes = array();
 
        foreach($this->routes as $route => $info)
        {
            # If this is a default route or scaffolding key, ignore it
            if(!is_array($info)) continue;
 
            $name = $info[self::ARR_ROUTE_NAME_POS];
            $reverse_routes[$name] = $route;
        }
 
        $this->_reverseRoutes = & $reverse_routes;
    }
 
    function reverseRoute($route_name, $args_keyval = array())
    {
        if($this->_reverseRoutes === NULL)
            $this->_buildReverseRoutes();
 
        if(!array_key_exists($route_name, $this->_reverseRoutes))
            show_error("No reverse route found for '$route_name'");
 
        $route = $this->_reverseRoutes[$route_name];
 
        foreach($args_keyval as $key => $val)
        {
            $route = str_replace("(:$key)", $val, $route);
        }
 
        return $route;
    }
}

Drop that into application/libraries, then rewrite your routes to look like this:

$route['users/(:username)']  = array('users/$1', 'user-homepage');
$route['companies/(:slug)']  = array('companies/$1', 'company-homepage');

Let me explain that.

CodeIgniter lets you use wildcards in your routes like (:any) or (:num). That’s no more with this extension. Basically, anything you put in (:[name]) format with be treated like (:any). That’s handy, and I’ll tell you why.

Once you rewrite you routes, you can now call a new method on the routing class when you need to, say, redirect the user to his homepage after login:

  # login was successful, and we now have a $user object
  $this->load->helper('url');
  redirect($this->router->reverseRoute('user-homepage', array('username' => $user->username));

The reverseRoute method takes two parameters: The route you want to send the use on, and any wildcards that you need to fill in the url. For the user-homepage route, there is a (:username) wildcard in the route. We can pass the appropriate fill-in for that wilcard with the second parameter with an associative key-value array.

A redirect to a company-homepage would look like:

  # ...
  redirect($this->router->reverseRoute('company-homepage', array('slug' => $company->slug));

Then in the future, if you feel like changing your routes, go no further than the routes file! Mucking around in views is a recipe for broken links.

Posted in Uncategorized | 7 Comments

ajax-proxy: A PHP AJAX Proxy with Cookie Support

A common annoyance in the world of AJAX is the ol’ cross-domain request error. That is, a script sitting on domain1.example.com can’t make AJAX calls to domain2.example.com. This is in place for the sake of security, but sometimes developers have legitimate reasons to do so.

A common workaround is writing a server-side script that will sit on domain1.example.com, and make proxy requests to domain2.example.com, and send the output back to the client. Many times, this is a “quick and dirty” solution to a common problem. You can find many of these short ‘n ugly procedural proxy scripts online.

But what if our needs are more complicated? What if our AJAX calls needed to be made over an authenticated session which requires forwarding of cookies? This is much harder to find online, and is a bit more complicated.

Lastly, just try and find an AJAX proxy that doesn’t rely entirely on cURL as it’s request mechanism. Developers using shared hosting or servers with draconian admins might not of the luxury of access to third-party fluff like cURL.

Over the past few weeks, I’ve developed ajax-proxy over at HUGE in Brooklyn, which is a class and script that solves both of the problems above. Additionally, it’s functionality is entirely encapsulated inside of a re-usable class. It was made so that it could stand alone on a server as proxy.php, or be incorporated into a larger framework like Zend, Kohana, or CodeIgniter.

Here are it’s features:

  • Uses cURL, but falls back to the less-speedy fopen if the former sin’t available
  • Forwards cookies and other headers in both directions
  • Has optional error and exception handling for behavior as a standalone script (frameworks would likely not want this)
  • Extremely well documented (I’m a documentation fanatic)
  • Written entirely in OO PHP 5, to the Zend standards

Additionally, the proxy underwent 2 weeks of development and intensive code review by the HUGE development team before it’s v1.0 push to GitHub. This is by no means a “quick and dirty” solution — it’s a rock-solid, full featured ajax-proxy that’s dead easy to use. Assuming proxy requests were going to be made to a base url of domain2.example.com, the code to run the proxy looks like:

$proxy = new AjaxProxy('domain2.example.com');
$proxy-&gt;execute();

If there’s anyone that loves simplicity, it’s me. Of course, there are more constructor options, but that’s better left to the README.

Anyway, the project is posted on GitHub at: http://github.com/hugeinc/ajax-proxy, where there is also pretty extensive documentation on the class’ usage. For documentation about the internal class members and methods, everything is doc’d with PHPDoc.

As a side note, I think it’s about time that I add KLogger to github. I get a fair amount of emails from people telling me they’re using it, and it’s about time I incorporated some new features in, like rolling log files, etc. I’m tired of having dusty old zip files sitting around. I’ll make another post when I put it up there!

Posted in Uncategorized | 4 Comments

How To Get A Job As A Programmer

It seems that for the better part of my life, America’s economy has been in murky water. I was born into a Reagan economy (good), graduated to Bush Sr. (bad), did my time with Clinton (good), and started looking for jobs as a developer during Bush Jr.’s tenure (bad). And while I’ll abstain from the more political conversation, Obama’s reign doesn’t look much better in terms of economic health (of course, he inherited a lot of trouble).

And throughout those recessions of the last ten years, there doesn’t seem to be a much more exciting topic for news anchors to talk about then joblessness. The unemployment rate is up, it’s down, this year’s graduates can’t find jobs, and here’s the story of Marty McNoJob, who has been unemployed for 62 years. Many people (grandmas in particular) eat it right up, and try and convince you to get into whatever field is hot at the time.

And accordingly, mountains of advice articles (like this one) try and give you a good idea of how to get a job in this tough economy. Put these words on your resume, wear a suit, get a minor in management, send thank-you notes, get a degree if you don’t have one, and talk about how much you raised revenue at your last job, etc.

But here’s the startling truth about one-size-fits-all advice like this (which you can find almost anywhere): These rules do not really apply to software development. Software development is a completely different ball game.

So now that I’ve given you a fairly lengthy segway into the actual topic of this post, let me be clear about my background:

  • As a freelancer, I’ve been to a hell of a lot of interviews
  • Almost all of those interviews resulted in job offers (yes, in this economy)
  • I’ve interviewed plenty of people for employers and as a business owner
  • I’ve written plenty of resumes for co-workers and friends that have gotten them interviews

The number one rule to getting a job as a programmer is to be good at what you do. This applies to recent graduates too.

When you go to school for a computer science degree, there’s a good chance you went somewhere that offered other engineering degrees such as Mechanical, Civil, and Electrical Engineering. Think of those other majors. How the hell is a Civil Engineering major going to get any real field experience before his first job? He can’t. But programmers have it completely different. Programmers can get field experience as early as they want. If a young programmer in middle school wants to write a website or a video game, he can learn how. He can read up on the vast, free resources on the internet and build up his awesomeness. If a Civil Engineering major wants to build a bridge in high school, he better like playing with Legos.

The programmers who get jobs in a tough economy are those with experience and projects they can associate their names with. That leads me to my next rule.

The second rule to getting a job as a programmer is to have a portfolio.

Software development is a wacky world in that good companies hire people based on talent, not on “years of experience”. In fact, 15 years’ experience in the world of software development could mean absolutely nothing. This is something that recruiting firms have yet to grasp (which is why programmers should probably stay away from headhunting firms, which is for another post). Good hiring managers know this.

So you may be thinking, “I’m a recent grad, how can I possibly have a portfolio this early?” If you became a software developer because it supposedly paid well, you’re out of luck. You likely don’t love the craft, and you might lack the ambition to have done anything significant as a developer up until this point. But developers who love what they do can:

  • Get an internship
  • Get involved in an open-source project
  • Roll your own project

The point is to have something cool to talk about at your interview. If you’re being hired out of college, for the love of god, make sure that you have something that your interviewer can talk about other than what your favorite classes were in school.

The third rule is that you can’t look like a rookie.

Forgive the l33t talk, but in a tough economy, companies don’t have the money to risk on hiring a noob. They want to hire someone who can jump in on a project and hit the ground running. There is little to no “on the job training” in the world of software development.

So what can you do to avoid looking like a noob?

  • Chances are, you shouldn’t wear a business suit to the interview. The goal is to look well put-together, but fairly casual.
  • Bring a nice stack of screenshots which showcase projects you worked on. Don’t unnaturally force the interviewer to take a gander, but if you’re explaining a project you worked on, it can be much more effective to put an image to the description.
  • Don’t use idiotic jargon on your resume. Example resumes online have absurd phrases like “goal-oriented, motivated individual seeking position in a fast-paced agile environment where they can grow, learn, and advance”. All I see when I read that is “n00b, noob, noob, I’m a fat scrub.”
  • Don’t use acronyms that you can’t back up. If you list both Ruby and PHP as languages that you know, be sure that you can answer thorough question on each. And expect to answer the fraud destroyer questions like, “So can you tell me about some of the ways that PHP and Ruby differ for both good and bad?” This is truly an open-ended question, and the interviewer is really just trying to gauge your expertise.

The fourth rule is that it’s okay to say that you don’t know.

“I don’t know.” — A wonderful phrase used by millions of students in the world to get teachers off their backs when they’re called out because they weren’t paying attention. But in the business world, apparently ”I don’t know” is an invitation to disaster.

Guess what? If you’re pitched a cut-and-dry question like “How is garbage collection handled in C#?,” and you don’t know, just say so! Essentially, be calm and say something like “that’s something I’ve actually never looked very deeply into, so I’m not entirely sure.” The interviewer may ask you describe how you think it works. This is when it’s okay to say something that might be wrong.. He just wants to hear you think out loud.

The worst thing you can possibly do is act like you do know, but be wrong. In software development, admitting when you need help or you don’t know how to do something is key to the success of the team. Project managers want someone with a “can do” attitude, but they don’t want someone who is going to throw the project off schedule because of his pride and his refusal to admit he needs help.

Also, saying you don’t know does not make you look like a rookie (see rule #3). Software development is a gigantic, always-changing field, and it’s impossible to know the ins-and-outs of everything.

The fifth major rule is that you have to build street cred.

Expect to be Googled (especially if you have a unique last name like Katzgrau). For me, no one’s name is safe from The Google. Whenever I’m about to work with another developer, I check up on their internet rep. Why?

Because if they have a website, blog, github account, stackoverflow account, sourceforge page, etc, I can begin to verify their authenticity. Suppose I get two resumes, and one of them has a GitHub account listed. If I can see some of their code contributions online, I have a much more realistic sense of who they are as a developer — not the actor that walks in the door trying to impress me. I would absolutely feel much better working with someone who’s code quality and contributions I can verify.

Get a website, blog, or some other public account where the smart guy that you are can really shine.

A word on having a college degree:

College degrees are not always required for some of the best development jobs. You can easily make 100k+ if you’re great at what you do, and you don’t have a degree.

That being said, you should probably have one. I hate to think it, but some companies and hiring managers will actually check to make sure you have a degree despite other fantastic credentials on your resume. It’s practically a stamp of approval from another institution.

But in reality, what good is a degree? There are certainly some institutions out there whose Computer Science degree courses are fantastic, useful, and progressive. But the majority of them — and I think I’m safe to say this — suck. Students are usually stuck in a classroom with professors who haven’t worked in industry for at least 20 years, if ever. They can’t tell you about things like unit testing, design patterns, version control, agile development, code reviews, or other industry shenanigans like that. But that’s just my take, and certainly doesn’t apply to everybody.

It’s really interesting, because the development fields’ laxness in regard to degrees is in stark contrast to fields like Education. For many teaching jobs, you must have a Master’s degree. Did that Master’s really help any teachers teach more effectively? I don’t know the answer to this question, but I’m skeptical.

And a degree from a fancy-pants place like MIT will probably help you get in the door (if not from sheer prestige, than probably from networking), but it won’t carry you forever. Ultimately, it’s the work that you’ve done that gets you future jobs, and help you take over the world.

Lastly, some smaller, but important notes that don’t deserve a spiel

  • Don’t pitch yourself as a language-specific developer. It’s important to list technologies that you’re really good at, but don’t make it seem like the only thing you’re interested in is one language. Java developers seem to do this a lot, but I have little basis for this other than observation.
  • If you’re still in school, maintain a good GPA, and above all, read this classic on the Joel On Software Blog
  • Know at least one language that is widespread. It’s cool to be a Python developer right now, but most job postings are looking for C, PHP, .NET, or Ruby devs. Python is something that is totally awesome, but it might not open all the doors that you’d like.
  • Always make sure your resume is up to date. When you work with a new language or you are on a new project, make sure it gets a spot.
  • Resumes, contrary to popular belief, do not have to fit on one page. If you’re a developer with a few or more projects, this can be somewhat difficult to achieve without sacrificing important information
  • Prepare for the interview. Look up questions commonly asked on the interview on places like GlassDoor.com

Anyway, if you needed this advice, take it to heart, and build your cred. If you read it just to see what I had to say, pick out anything you agree or disagree with and comment. And if you think this is oh-so-absurd, start a flame war.

Posted in Jobs, Life, Offtopic | 13 Comments