Bryan Ray My endeavors in software development

5Mar/100

Playing around with the DynamicObject class

I’ve recently been playing around with the .NET 4.0 System.Dynamic namespace and just wanted to make an update about my experience with it. For the past couple weeks a buddy of mine, Curtis, and I have been tinkering with gppg and gplex. Curtis has slowly been teaching me the intricacies of building a lexer and parser and building your own language. Understand, that I use the term “language” very loosely here.

All this language does right now is store variables and some of your basic math operations, but still … it’s territory that I haven’t ever ventured in to and to be honest its helped me understand what’s going on behind the scenes of the languages that I’m using.

Anyhow, in the language that we’ve put together we’ve created a Primitive type. This Primitive type is aware of all the standard types that are in my language. Which, to me seemed extremely tedious, but I believe this is just one of the differences between writing a statically typed language and a dynamically typed language. In my case, I’m currently working with numbers and assigning them to variables so, to be honest, I really don’t care if it’s an int or a double. I just want the language to tell me the result.

This is where the DynamicObject class comes in. DynamicObject is a new .NET 4.0 sealed class. What it provides is the base for you to start building a new dynamic object. So, what I did was created a DynamicPrimitive class that inherits from the DynamicObject class, like so:

public class DynamicPrimitive : DynamicObject {}

I’ll get in to the details a bit later, but the DynamicObject base class provides a boat load of overloads allowing you to tell your object how to interact with other objects when specific operations are performed on it. For instance, in my situation I wanted to be able to do something like dynamicObject1 + dynamicObject2 get a result.

In order to do this I added a simple constructor to my DynamicPrimitive:

public DynamicPrimitive(object value) {}

Now, the question is … what exactly do you do with that value? Simple, store it in a Dictionary<string, object> so that you can grab it out later.

private readonly Dictionary<string, object> _dictionary = new Dictionary<string, object>(); 

public DynamicPrimitive(object value) { _dictionary["value"] = value; }

Excellent. Now this will allow me to do something like this:

dynamic left = DynamicPrimitive(2.5); dynamic right = DynamicPrimitive(3.5);

Now, you just need access to that value, right? Introducing the TryGetMember(GetMemberBinder, out object) override. This is as simple as:

public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            return _dictionary.TryGetValue(binder.Name.ToLower(), out result);
        }

Now you can do something like this:

dynamic two = new DynamicPrimitive(2);
dynamic five = new DynamicPrimitive(5);

Console.WriteLine(two.Value); // Outputs: 2
Console.WriteLine(five.Value); // Outputs: 5

Pretty nifty! Now, the interesting part of this is what primitive type is actually stored inside that "Value" property. Honestly, my inital thought was that it would be an object. After all, my constructor takes an object and my dictionary is storing an object, but it's actually storing an int.

Console.WriteLine(two.Value.GetType()); // Outputs: System.Int32

Now lets say that we want to add our two dynamic primitives together. Something like:

dynamic two = new DynamicPrimitive(2);
dynamic five = new DynamicPrimitive(5);

Console.WriteLine(two + five); // Throws a run-time exception

Currently, this will throw a run-time exception, because we haven't instructred our dynamic primitive on how to handle the "+" operator. This is where the TryBinaryOperation(BinaryOperationBinder, object, out object) override comes in to play. So, lets go ahead and implement the Add operator now:

public override bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result)
{
	object numericResult;

	dynamic left = _dictionary["value"];
	dynamic right = ((DynamicPrimitive)arg)._dictionary["value"];

	switch (binder.Operation)
	{
		case ExpressionType.Add:
			numericResult =  left + right;
			break;
		default:
			result = null;
			return false;
	}

	dynamic finalResult = new DynamicPrimitive(numericResult);
	result = finalResult;
	return true;
}

This will allow the previous code to run correctly and give you the result of 2 + 5. This is all pretty basic implementation stuff, but if you look at the new DynamicObject and ExpandoObject they might come in handy sometime down the road.

Filed under: Uncategorized No Comments
4Dec/090

Bowling Kata in C#

Recently, I decided to work on the Bowling Game Kata in C#. The purpose of this exercise wasn't really to come up with an extraordinary design. Rather to get some interaction with a couple of my developer buddies and work on test driven development and agile practices.

Initially, Curtis and I went to the white board and put together, in my opinion, a really 'pretty' design. It was elegant, flexible, extensible, and a very object oriented approach. It took advantage of the Visitor pattern for calculating the game's score and had the concept of a single Frame and FinalFrame class in order to distinguish the tenth, and final, frame in a bowling game.

As great as the initial design was, in the end, it ended up being pretty irrelevant. Not that it wouldn't be a completely valid implementation in a specific situation though. It just wasn't necessary for our immediate purposes. When Curtis and I eventually sat down a couple days later and did some pair programming (!) we came up with a much simpler implementation that was just as object oriented as the "up front design" and accomplished our goals as well.

Here's a few pictures of our initial white board design that we came up with initially:

A couple days later we spent an hour at lunch and actually had the rubber meet the road. We didn't put a lot of focus on the initial design work that we used. But rather started with tests first; As any good TDDer would. Curtis started off writing the test(s) and I wrote the code to make it pass. We went back and forth like this the entire hour; discussing implementation and doing a couple minor refactorings along the way when one of us felt the code wasn't being as expressive as we liked or had a bad "smell" to it. It had been a while since I'd actually pair programmed and done real test driven development and I have to admit that it was refreshing to get a chance to get back in it.

Our initial hour was pretty basic implementation. We came up with tests that managed the basic scoring of bowling and didn't take much consideration for spares or strikes. We were only concerned with adding up standard scores. After we had the tests written for that we went back and refactored the implementation a bit to DRY up the code a little bit and make it a bit more structured.

We actually wrapped up our first coding session during that lunch with tests and code that added a standard bowling score and kept track of frames. It didn't take any account for spares, strikes, or final frames, but it had the basics down. All that was left to do was add in the ability to keep track of the rest.

A few days later we sat down again and started coding away. It was so nice to have our tests in place when we came back to it after a three day hiatus, because we actually broke the tests a couple times while we were putting in the implementation of strikes and spares.

There's really not a lot more to say about this other than taking a look at the code and giving some feedback about it if you have any, but it was definitely a great exercise and I'll be sure to do it again sometime in the near future.

Download - Bowling Kata - Iteration 1
Download - Bowling Kata - Iteration 2

Tagged as: , No Comments
3Nov/090

Issues with Windows 7 and Samba

So, I recently updated my desktop computer to use Windows 7. Which, I have to admit, I'm fairly impressed with overall. It's a big upgrade from Vista; which just annoyed the piss out of me. And a nice upgrade from XP; which is just entirely too old for my liking any more. I have, however, found a pretty big problem with it. It actually could be more of a show stopper for some if you have more than just a Microsoft household.

The problem is this: if you happen to have any other machines on your network that are not Windows based ... you can forget about file transfers. Samba has either a) had some major changes done to it and accidentally messed something up or b) intentionally been changed in order to piss on mac and linux community. I'm not really big on conspiracy theories or whining about it either way, but the fact still remains that something changed and I'm left not being able to transfer files from my linux or mac machines to windows.

To be fair, I haven't done an extensive amount of digging or research to prove that it's not my network setup. But according to Google there are other people out there (1) experiencing the same thing.

I have, however, found a "work around" that has kept me from completely scrapping Windows 7 until it gets fixed. I installed an Ubuntu virtual machine using VirtualBox on the Windows 7 (host) machine. Then I used VirtualBox to create a folder share on the ubuntu machine that pointed to my 1TB D:\ drive on the Windows machine. After that, I setup samba on Ubuntu and now I can use the ubuntu virtual machine running on Windows 7 to transfer files to the appropriate place on my Windows machine.

This is, obviously, not the most ideal solution, but as far as I can tell there isn't many other options. To be honest, I really shouldn't be using Windows as my file sharing machine anyhow. And this has just pushed me in to building a small little FreeNAS machine in the near future.

Hopefully this might keep someone out there from ditching Windows 7 until there's a fix for it. Best of luck to you if this came in handy.

References
(1) Windows 7 Samba Issue: http://www.tomshardware.com/forum/75-63-windows-samba-issue

2Oct/090

Euler Problem 2 – Fibonacci Sequence

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Find the sum of all the even-valued terms in the sequence which do not exceed four million.

Similar to problem one, problem two is pretty straight-forward as well. It basically boils down to generating the fibonacci sequence efficiently, grabbing only even values in the sequence that do not exceed 4,000,000 and them summing them up.

To start with I needed an algorithm to generate the fibonacci number. There are a ton of ways to do this, but I decided to go with the straight forward recursive approach initially. For anyone who might be interested here is my recursive fibonacci method:

        private static int Fibonacci(int n)
        {
            if (n < 2)
                return n;
            else
            {
                return Fibonacci(n - 1) + Fibonacci(n - 2);
            }
        }

That's about as basic as it’s going to get for generating a slow fibonacci sequence. Now all we really have left to do is take values from the fibonacci sequence that are less than or equal to four million, and stop. My first pass at this looked like this:

            List list = new List();

            for (int i = 0; i <= 50; i++)
            {

                int fib = Fibonnaci(i);
                list.Add(fib);
                long sum = list.Where(a => a%2 == 0).Sum();

                if (sum > 4000000)
                    break;

                Console.WriteLine("Fibonacci({0}) = {1:###,###,###,##0} [{2:###,###,###,##0} sum]", i, fib, sum);
            }

Basically that will go through the fibonacci sequence 50 times, but it will break out sooner if the sum of the even values is greater than 4,000,000 as the problem states. Aside from being extremely verbose and not very effecient. That's really all you need to do to solve this problem.

Refactor Time!

I could go in to the fibonacci method and improve the speed of that thing, but to be honest … solving this specific problem only takes ~35 iterations through the fibonacci; which doesn’t really require too much processing power. So I’ll leave the fibonacci enhancement for another post. Instead, lets see if we can make the filtering algorithm a bit clearer.

The for loop is just oozing code smell. My solution is limited to 50 iterations max at the moment and I’m just not a big fan of prematurely breaking out of a loop. So, lets use some LINQ goodness and fix that up.

I didn’t really “optimize” the Fibonacci sequence, I just made it yield back results so that it could be processed by a Predicate. For starters I created a simple Fibonacci method that yield returns an IEnumerable<int>:

        public static IEnumerable Fibonacci
        {
            get
            {
                int i = 1;
                int j = 2;
                while (true)
                {
                    int x = i;
                    yield return x;
                    i = j;
                    j = j + x;
                }
            }
        }

This little method allows me to yield back results to a TakeWhile Predicate for evaluation, like so:

            var fibs = Fibonacci.TakeWhile(n => n <= 4000000);  // Grab numbers out of the fibonacci sequence until > 4,000,000
            var evens = fibs.Where(n => n % 2 == 0);            // Filter out only the even numbers from the list of < 4,000,000

            evens.ToList().ForEach(Console.WriteLine);
            Console.WriteLine("Sum: {0:###,###,###,##0}", evens.Sum());

There we go. Looking a little cleaner now. I could definitely condense this down even further using some extension methods, but I’ll leave that up to any readers who want to take this a step further.

Tagged as: , , , No Comments
2Oct/092

Euler Problem 1 – Programming Kata

Decided to do a little programming kata tonight and came across Project Euler. I started off with the first problem and while it wasn't the most complex thing in the world ... I learned quite a bit from it! My initial thought process was "loop" ... so I put together these bits:

            int size = 0;
            int upper = 999;

            var results = new int[upper];
            int sum = 0;

            for (int i = 1; i < upper; i++)
            {
                     if (i % 3 == 0 || i % 5 == 0)
                     {
                                   results[size++] = i;
                                   sum += i;
                      }
             }             

             results.TakeWhile(val => val != 0).ToList().ForEach(Console.WriteLine);
             Console.WriteLine("Sum: {0}", sum);

Definitely not the prettiest code I've ever written. So I set out to refactor a little. Enter LINQ. Using LINQ I came up with this:

            var list = Enumerable.Range(1, 999).ToArray();
            var results = from item in list where item%3 == 0 || item%5 == 0 select item;
            var sum = results.Sum();

            results.ToList().ForEach(Console.WriteLine);
            Console.WriteLine("Sum: {0}", sum);

Which was about as condensed as I can imagine this thing getting (in C#). I was trying to come up with some sort of Predicate or Func to replace the item%3 == 0 || item%5 == 0 in the LINQ query, but nothing came to mind that would make the code more readable or efficient (suggestions?).

Sure enough, I chatted with Philip (because we're both insomniacs at times) and was able to come up with something smaller. Granted, it's completely unreadable and definitely not recommended for any sort of production code:

var list = Enumerable.Range(1, 999).ToArray();
var sum = list.Where(item => item % 3 == 0 || item % 5 == 0).TakeWhile(i => { Console.WriteLine(i); return true; }).Sum();
Console.WriteLine("Sum: {0}", sum);

Yikes ... maintenance nightmare! "Future me" would definitely not know what the hell I did there. But it's definitely shorter. I gave it another go with Philips help in an attempt to make it a bit more readable. I condensed it down with some extension methods and actually made it a bit more readable with fewer lines.

var list = Enumerable.Range(1, 999).ToArray();
Console.WriteLine("Sum: {0}", list.Where(item => item%3 == 0 || item%5 == 0).WithEach(Console.WriteLine).Sum());

Now this code is a bit deceiving in terms of lines of code (LoC), because all the work is actually being hidden down in the WithEach extension method:

    public static class MyExtensions
    {
        public static IEnumerable WithEach(this IEnumerable list, Action f)
        {
            foreach (int item in list)
            {
                f(item.ToString());
                yield return item;
            }
        }
    }

And just to make sure I beat this horse to death ... I got it down to 1 LoC that is actually not too bad in readability. Again this is only 1 line of code, because a lot of the muscle is being pushed down in to an extension method which I think would actually need to be included in the LoC, but ya know ...

Console.WriteLine(1.To(1000).Where(item => item%3 == 0 || item%5 == 0).WithEach(Console.WriteLine).Sum());

and the hidden extension method doing the work:

    public static class MyExtensions
    {
        public static IEnumerable To(this int i, int upTo)
        {
            return Enumerable.Range(i, upTo-1);
        }

        public static IEnumerable WithEach(this IEnumerable list, Action f)
        {
            foreach (int item in list)
            {
                f(item.ToString());
                yield return item;
            }
        }
    }

Anyhow ... that's about all that I can come up with. Hopefully this might prove useful to anyone looking for information on LINQ or Extension methods. It was definitely a worthwhile exercise. Let me know if you have any other suggestions, ideas, or questions.

Tagged as: , , , , 2 Comments
2Sep/090

Setting up my GTD system…

I've recently been setting up my Getting Things Done (GTD) system to be more efficient and I've found a small thing that I've been able to change to really help me stay focused on whatever it is that I'm working on.

I typically use Mailplane and Outlook as my email clients of choice, but I'm pretty sure that the default behavior for any client nowadays is to display a "Mail Notification" popup in one of the designated screen corners whenever a new mail arrives. For some reason I've never realized exactly how distracting that thing actually is until I stopped to think about it!

Perhaps it's just me, but whenever a new email arrives I instantly find myself switching focus from whatever it is that I'm doing to thinking, "Did I just get an important email?" or "I wonder if that's something that I need to read/respond to right this minute?"

Now this may not be the case for everyone, because some people's jobs may rely on being Johnny on the Spot with their emails, but in my current situation I have no need to immediately reply to every email that I receive.

So obviously the simple solution was to remove the distraction. All I had to do was disable the alert notification all together. I find that without the notification I'm able to stay focused on whatever I'm working on and come back to my email when I'm in email processing mode.

Obviously this is a really small change, but it has made such a huge impact on my daily workflow. I'm not sure it warranted writing about, but it's something I never thought about turning off until recently so I thought maybe I would see if anyone else would benefit from it.

Tagged as: No Comments
26Aug/094

A small dilemma with posterous …

First off, for those of you who don't know about Posterous. I highly recommend you take a look if you manage more than one social / media site (YouTube, Flickr, Facebook, Twitter, etc). Posterous acts as a sort of middle man for a huge number of social networking and media sites. In a nutshell, if you have a Facebook, Twitter, and Wordpress account ... you can use Posterous as your "central" place to submit data to and update all of your other accounts.

A small example

I take a picture on my iPhone, email it to post@posterous.com and Posterous will 1) upload the picture to Facebook 2) Change my status on Twitter and 3) post an update to my WordPress blog. This is extremely handy if you're on the go.

How I have my sites integrated

I use Tweetie on the Mac for a majority of my "tweet" needs. I have also configured Facebook to automatically change my Facebook status whenever my Twitter status changes.

So far, so good. Now enter Posterous. I have Posterous setup to update my Twitter status for any posts that I make to Posterous. Posterous happily posts my update to Facebook, then to Twitter.

Therein lies the rub

Posterous posts to Twitter and Facebook. Twitter then posts its status to Facebook again.

So what I end up with is Facebook having duplicate updates; one from Twitter and one from Posterous. Which I'm sure drives any of my friends bonkers and also drives me nuts, because I'm a pretty anal person when it comes to functionality.

So I don't suppose anyone has any suggestions for how I could go about fixing this problem?

The one solution I see is that by simply removing the Twitter update from Posterous I would avoid any duplication, but that also means that Twitter is never updated when I send a Posterous; which kind of defeats the purpose.

24Aug/090

This warms my heart …

Visitors Overview - Google AnalyticsI'm actually kind of surprised about this statistic, but according to Google Analytics ... Safari is the most popular web browser on my site? Followed by Firefox! And then Internet Explorer. Now I know my site isn't really Microsoft oriented, but it these margins aren't exactly close either. Safari is at 45% for the love of all that's holy!

Perhaps I'm just completely out of touch with who visits my site, but I was under the impression that a majority of people were recruiters in the .NET industry. Or at least .NET developers. And to be honest, I can't say as I've ever even thought about running Safari on Windows.

But either way, I'm really excited to see Internet Explorer in 3rd place! Keep up the good work Firefox and Safari. You've make the interwebs a much prettier place.

If you have time and wouldn't mind leaving a comment with your industry (recruiter, developer, stalker) and which browser you're visiting with ... I'd love to get some real data to confirm google analytics.

Filed under: Uncategorized No Comments
5Aug/090

The ASP.NET Page Life Cycle

This post really isn't anything that you can't find in the public domain, but I just wanted to write down the asp.net page life cycle so I could have it as a reference. I also find that if I write things down my brain considers them a little more important and pushes it to the top of it's memory cache. :)

  1. Page Request - This is the initial stage of the life cycle. It will determine whether or not an ASP.NET page needs to be compiled or parsed, or if a cached version of the page can be sent in response without processing the page.
  2. Start - Page properties like Response and Request are initialized. The Page will also determine whether or not the request is a PostBack or a new request and sets the IsPostBack property accordingly.
  3. Page Initialization - Controls that are on the page are now available at this stage and each controls UniqueID property is set. The Postback data has not yet been loaded and control property values have not yet been restored from the view state.
  4. Load - If it's a postback, control properties are loaded with the information found in the view state and control state.
  5. Validation - the Validate() method is called on any Validator controls, which sets the IsValid property of individual
  6. Postback Event Handling - Any event handlers are called (if it's a Postback)
  7. Rendering - Before rendering, the view state is saved for the page and all controls. The Page will call the Render method for each control, providing a text writer that writes its output to the OutputStream of the pages Response property.
  8. Unload - The Response and Request objects are unloaded and any cleanup is performed.
Filed under: ASP.NET No Comments
30Jul/095

Recruiters and Companies in the Market Today

Before reading this ... please understand that I'm not pointing the finger at anyone. I'm merely stating what it's like to be a good developer out here in this economy trying to get through the "gatekeeper" (recruiters) in order to have an opportunity to interview with the “keymaster” (company).

I consider myself a fairly "senior" level developer, but I also think that title is mostly for show. Why? Because I'm the type of person who knows that there is always something I can do to make myself better. There are always people out there who I can learn something from. There is always a way, especially in the software development, to improve myself or to improve the software that I'm working on.

In my opinion, a "good" developer is defined as someone who understands that technology is constantly changing and is willing and eager to keep up. There are constantly new ways to develop software or implement patterns to increase your development skills and make the software that you're developing more extensible, flexible, etc.

This is, in my opinion, what companies are, or should be, looking for. They want developers who are willing to put in the time to understand how to better perfect their craft and apply that knowledge to the products they're working on.

I honestly don't think that managers or companies are expecting a developer to walk in and just know everything about every technology that the company is using in their development process. There are entirely too many ways to get things done using all the different technologies that are available today.

Now don't get me wrong. If you're looking for a "senior" level developer the developer should have an understanding of what object oriented development is, be extremely proficient with his crafts, know how to use design patterns, etc ... the willingness to learn is not enough to be at a "senior" level.

Unfortunately, with the way the market is right now there is a huge flood of developers who are looking for development work. Hell, there's a huge flood of everyone looking for work. But I think companies have started to grow weary of filtering out the "rift raft" that recruiters are sending them. What developers are these you ask?

Developers who don't even know what an interface is. Developers who don't know the difference between inheritance and composition. Or what dependency injection is used for. Or developers who really can’t speak the english language very well.  These developers are abundant in the market today.

Companies expecting recruitment agencies to be able to filter these developers out is completely understandable. It's a complete waste of the businesses time and money to go through candidates that just don't really know the first thing about software development and shouldn't be interviewing for developer positions to begin with.

So what's the problem then? The problem is that companies begin to put the reigns on recruiters saying something like, "Seriously ... if you send us one more candidate like that we're not going to take any more from you." So now what do the recruiters do? They look at this list of requirements that companies send out and search for resumes with massive amounts of buzzwords in search of the "holy grail" developer. Someone who fits the companies requirements to the T. And in all actuality ... it is a rarity that you find a software developer who fits job requirements perfectly.

This is a job requirement that I’ve actually seen: Developer who have 7+ years of vb.net and C# with Sharepoint, WinForms, WPF, WCF, asp.net, SSIS, SSRS, with Oracle and SQL Server experience.

Let me help you out recruiters ... developers like this do not exist. I have worked with some absolutely great developers in my time and I can honestly say that some of the job requirements that are listed nowadays are above and beyond even their skill set, but I would seriously question what a company is doing if they turned down some of the developers that I have had the pleasure of working with.

Finding good candidates for companies, in my opinion, is a bit like dating/relationships. You will never find someone out there who is absolutely perfect for you. They just don't exist. That's where compromise comes in to play. Am I willing to put in the time and effort in to making this relationship work? The same question is valid for both the employee as well as the company, though.

I might be lacking a few areas of technology that a company is looking for, but if the company is good enough then I am more than willing to put in the time and effort needed to meet the companies needs. And in my experience, companies are typically excited about finding people with that sort of initiative, but right now recruiters are not granting some developers that opportunity, because they're searching for the "perfect" candidate.

So I know that businesses have requirements. These requirements typically consist of a plethora of things ranging from technology requirements to experience in a specific industry. I really have met some really good recruiters out there who actually understand what their clients are looking for and have the right knowledge needed to communicate to developers, but for some reason I find a vast majority of the recruiters who get in touch with me don't know the first thing about what they're looking for.

My biggest pet peeve is this one; which I'm sure many developers have encountered before:

Recruiter: Have you ever worked with ASP.NET?

Candidate: Yes, I've written quite a few asp.net web applications.

Recruiter: Oh, great. How many years of ASP.NET experience do you have?

Candidate: I've been doing web development for about 7 or 8 years now.

Recruiter: Excellent. Have you ever used C# or VB.NET?

At this point ... my alert "radar" is on high. Do recruiters really not know enough about the technology or positions that they're recruiting for that they don't know that you develop ASP.NET and WinForm applications using a .NET language (typically C# or ASP.NET)? It is extremely difficult, if not impossible, to find a company in Houston who develops an ASP.NET or WinForms application in a language other than C# or VB.NET. It's really not that complicated to understand, but for some reason it just drives me nuts when I'm having to answer questions with a completely incorrect answer just so I can have the hope that a recruiter will forward my resume on to a client.

Another one of my pet peeves is this extremely exaggerated scenario, but I actually have encountered it:

Recruiter: Do you have any experience with C#?

Candidate: Yes, I've been doing development with C# for 10+ years.

Recruiter: Do you have any experience with design patterns, sdlc, agile, xsl, xml, web services, etc, etc ... (I'm paraphrasing)

Candidate: Yes. I've actually used every one of those technologies for 10+ years as well.

Recruiter: Wow. You sound like a perfect fit for this position.

Candidate: Thanks. I'm technically a god amongst every developer I work with. I'm really great at what I do.

Recruiter: Perfect. One last question ... have you ever worked in the <insert industry here>?

Candidate: I've actually never done direct work with ...

<Dial Tone>

Seriously over-exaggerated, but the point still stands. Are companies honestly willing to pass up a developer that is top notch just because he's not familiar with the details of a specific industry? And if a company is willing to pass up on that type of developer I really don't think that it's the recruiters responsibility to make that decision. In my opinion, a recruiter that passes up that sort of developer is doing the company a huge disservice by not allowing good developers the opportunity to at least interview.

I think companies should be aware that they're not going to just get an interview and fall in love with the first developer that walks in the door. They might have to fish through 4 or 5 developers who are "adequate" for the position.

So what's the solution then? I'm not entirely sure there is one and even if there is I doubt this blog post is really going to make any kind of change, but I honestly think that both sides are responsible.

Recruiters

Study. Study. Study. You really need to know at least the tip of the iceberg when it comes to technology. That's not to say that you need to know how to write code, but you should at least be able to identify that there are basically two languages in the .NET framework and they're both used to build web applications (asp.net) or desktop applications (winforms/wpf). Take an hour or two out of your day and just read up on wikipedia about the .NET framework and some of the technologies that link from it. Trust me. The developers that you talk to will appreciate it!

Don't blindly rely on the requirement sheets that companies send you. From a developers perspective they are mostly irrelevant. You should be able to identify the parts that stand out and make your own decision on the type of person that would be a decent fit, but don’t expect to find the "perfect" candidate.

I would imagine that a lot of companies don't have the time or resources to update a requirement list for every position they have available. So what do they do? Obviously, they have someone copy and paste a Word document together out of older job requirements that they have laying around and email it out hoping that you'll do the rest of the work.

Companies

Realize that recruiters are not really interested in the details of technology. They're not interested in asking us developers intricate questions about how we apply specific design patterns to an application. All they care about is that we match your requirement list. Possibly ease up on your requirements list or spend an hour or two and work on refining exactly what it is you're looking for (with realistic expectations about what kind of developers are out there). Tell the recruiters you're working with what is acceptable and what is an absolute must!

Filed under: Miscellaneous 5 Comments