I’m now an MCPD!

MCPD-RGBEver since I passed my MCTS exam back in December last year, I’ve been hard at work doing further study and practice to attempt to pass the follow-up exam 70-576: PRO: Designing and Developing Microsoft SharePoint 2010 Applications.


Well, I finally took that exam earlier this week and I’m pleased to report that I’ve passed!  Once again, I managed to get 100% on the exam, although I really don’t know how I achieved such a high percentage score this time around as I was convinced I’d got answers to some of the questions wrong!  Again, I’m over the moon with my result!


Passing this exam has now earned me the distinguished certification of:

Microsoft Certified Professional Developer – SharePoint Developer 2010


In taking these two exams within the last couple of months, it seems I’ve stirred something inside of me that quite likes the idea of acquiring further Microsoft Certification.  For now, though, I think I’ll take a little break from the intense study that I’ve done of the SharePoint platform, although I’ll still be using SharePoint 2010 quite frequently.  I seem to have amassed a fair sized collection of other tech books in the intervening period that I really need to get on with reading!

Mercurial Pushes and the authorization failure of doom!


imageEver get the notorious “abort: authorization failed” message from a Mercurial “push” command??


You are not alone!


It seems the way to fix this is to always ensure that the Bitbucket username is specified within the “remote repository” URL!


imagei.e. the remote repository URL should be something like “https://craigtp@bitbucket.org/craigtp/fizzbuzz” and NOT “https://bitbucket.org/craigtp/fizzbuzz” – See the screenshot to the right.  In this case, my username is “craigtp”, obviously, replace that with your own username for your own repository/Bitbucket account.


Bizarrely, this is still required to get around the “authorization failed” issue even though TortoiseHg will prompt you at runtime for both your Bitbucket username and password (if the username is not specified in the URL).  Once you’ve specified your username in the URL, you’re no longer prompted for it, only the password, however the “abort: authorization failed” issue will go away!



I’ve done further digging since posting this article, and unfortunately, I’m not convinced that this is the exact answer to the authorization problem.  Doing the above certainly fixed my specific problem at the time I had it, in the very specific circumstances of my environment (which including accessing BitBucket via a rather fussy proxy server) however I’ve since been able to happily make Mercurial pushes to BitBucket without having to specify the username in the remote repo URL in different environments.  My research on this matter continues!

Alternative FizzBuzz-style Interview Questions

Hand drawing chart in whiteboardWhen interviewing programmers, I will usually reserve a portion of the interview for a simple programming exercise.  This is never anything too difficult and is usually conducted on a whiteboard.

I’ve blogged before about the FizzBuzz problem, which is a great little problem to pose to a prospective candidate within the hands-on programming part of an interview.  Of course, it’s possible that some enterprising candidate may well have come across the FizzBuzz problem on the internet and will remember the answer, by route, to the problem without really thinking through the problem and organically realising their own solution.  In and of itself, this isn’t always necessarily such a bad thing, since a candidate that has a familiarity with the FizzBuzz problem is, in my own personal experience, already a step ahead of a lot of other potential candidates, as their familiarity with FizzBuzz shows that they read the kind of blogs and internet pages that care to talk about such things.

Despite this, I often find myself trying to come up with alternatives to the FizzBuzz problem.  This isn’t so easy as it first may sound as there’s a number of distinct properties that the resulting problems must have: 

  • The answer should be short enough to be able to be written in a few lines of code on a whiteboard.
  • The problem must be simple enough to focus one one specific problem area.
  • The problem should allow the candidate to display some aptitude that you care to test for.

Interestingly, I think that a lot of the best FizzBuzz alternatives also make great Code Katas.  A Code Kata is a small exercise that all programmers can perform and practice over and over again in order to improve and hone their skills.  I’ve also found Code Katas to be a great tool to practice Test-Driven Development (TDD), and indeed, many of the FizzBuzz style problems lend themselves very well to TDD derived solutions.

Here’s my list, which is incomplete, but serves to offer a flavour of the alternatives:

  • Reverse a string (without using any built-in reverse functions in your language of choice).
  • Reverse a sentence (i.e. "bob likes dogs" becomes "dogs likes bob").
  • Check if a given string is a palindrome (again, without using any built-in reverse functionality).
  • Find the first location of a string within another string (again, avoiding any built-in language functions to do this).
  • Find the minimum value in a list.
  • Find the maximum value in a list.
  • Calculate a remainder (given a numerator and denominator).
  • Return distinct values from a list including duplicates (i.e. "1 3 5 3 7 3 1 1 5" becomes "1 3 5 7").
  • Return distinct values and their counts (i.e. the list above becomes "1(3) 3(3) 5(2) 7(1)").
  • Check if a given string is a palindrome without using a built-in string.Reverse function.
  • Calculate the factorial of a given number.
  • Calculate the Fibonacci sequence.
  • Given a starting number, count down from that number to 0.
  • Output all multiples of 3 between 1 and 200 in reverse order.

As you can see, many of these are quite trivial to accomplish, much like the original FizzBuzz problem, but there are quite a number of ways in which each simple test can be subtly altered for something similar but different, and which can affect the solution code.  If used in an interview situation, asking a candidate to write a quick solution on a whiteboard to question of "Counting down a number" seems trivial (and is!), but you can easily build upon this by asking for the countdown to be by a specific or arbitrary decrement (i.e. count down by 2 or 3 each time).  Other questions, which are again on the surface fairly simple to answer, are good candidates for a follow up discussion on things like optimization and performance improvements.  For example, the question of checking if a string is a palindrome has various interesting ways in which such a check can be optimized and the check short-circuited.  Finally, all of these questions are great to follow-up with discussions about how the candidates simply code might be altered to ensure testability of the solution via a suit of unit tests.