12 September 2012

How to hire a software developer

 

Paid advertising: A well-designed database application can make a big difference to your business. By helping you to record, manage and share your business information quickly and easily. Contact Access Guru for more information.

My involvement with hiring developers

I’ve worked at Novatec New Technologies for five years. During those five years I’ve held many roles in the company. My principal role was that of a technical lead, which was may main occupation for most of the time. Sometimes, especially during hiring frenzies I’ve also participated in the requirement process of new hires as a technical interviewer. I think that I’ve had around fifty to seventy technical interviews during that time.

The hiring process was broken into several steps:

  1. An HR person will collect all applicants CVs sort them, discard the most obviously wrong ones and then distribute the rest to various groups in the company for further processing.
  2. The CVs would then be processed by a group of senior developers and the director of software engineering to filter out the most interesting candidates.
  3. Those candidates who passed the second cull were contacted over the phone, asked some rudimentary questions and then we organized a technical interview with them.
  4. A one on one, or sometimes two on one technical interview was held with the goal of assessing the technical level of a person and most importantly their capability to be a good fit in Novatecs technical culture.
  5. Those which passed the technical interview were sent to the director of software engineering for a business interview.
  6. The final hire and no hire decision rested in the hands of the director of software engineering.

In my opinion group interviews are a poor way to filter candidates. Different developers had different outlooks towards what is a good candidate and also had different grades for what a good technical fit is.

I’ve developed my own system of processing candidates. The most important thing for me is to find out if a person is going to be a good technical fit for out culture and if that person has natural eagerness to work in a software engineering environment.

How I look at CV-s

It always starts with a CV. I will not go into what is a good CV. I’ve seen long ones, short ones. I’ve seen people who have written on their CV that they do not want to work as a software developer by have applied for such a position and people with zero experience and education in the field claiming that they are able to do it all.

One good resource for finding out how to write a good CV is the Manager Tools blog. I’ve been listening to them for five years now and they have a ton of information about any subject in the business world, including how to write a good CV.

Here are a couple of links:

On an any given CV I look for the following things:

  • Concrete achievements
  • Projects worked on
  • Career path
  • Interest in software engineering and self growth

What I’m actually looking for is the length of time someone worked on concrete projects, the technologies the worked with during that time and what were their accomplishments during those projects.

On many developer CVs it is possible to see many technologies in the technical skills sections : HTML 5, CSS3, NEO4J, MongoDb and etc.

The problem is during the actual interview the candidate doesn’t really know many of those technologies. For some he just completed a tutorial, or for other he has just been reading about them.  A lot of people put the web duology HTML5 and CSS3 but when asked concrete questions about some HTML5 JavaScript API-s like web sockets or local storage the candidate sometimes doesn’t didn’t hear about them.

So a good was to gather out what technologies are a strength for a candidate is to look at projects the candidate has done. For example if someone has listed that he has worked on a project for one year using Zend framework, PHP and MongoDB I’m going to assume that that person can handle those technologies and I’m going to focus my interview around them.

The career path is an interesting one. To find out what a person is and how he worked so far you can find out where he worked. Some companies I have heard of and know off and for others I can find what they are doing. So a persons work list will tell me from what kind of environment he or she came from and how hard is going to break their bad habits to make them a fit for our development culture.

Switching work is a lot like entering a new relationship after breaking the old one. Habits from the old relationship will break into the new one. They are hard to kick off.

For me the principal characteristics a candidate must have is a great will to continually improve them selves and an understanding of how software engineering is done.

How I prepare for an interview

After I’ve analyzed the candidate CV I list all the areas of her work that piqued my interest. I will focus on projects and technologies listed. The focus order will be from most recent to oldest.

There is a list of introductionary questions I always write down and always ask on an interview:

  • What is your primary development platform and how long have you developed in it?
  • Have you used and know how to work with Version Control System?
  • Do you know how to write and read an UML diagram?
  • Do you know how write Unit tests?
  • What is the latest technical book you have read?

These questions help me understand what the person is really about. For each interview I have my notebook with me. In it I write as notes all the areas I want to question the candidate either things that I think are cool or things I think are obfuscated and I want to know what the real deal is.

Googling a candidate is an important step before interviewing someone. Finding many Stackoverflow questions or a technical blog written by someone is a definitive plus. Also with Facebook, Linked in there is a good chance I will see how somebody looks like if they haven’t added their picture on their CV.

People convicted of serious crimes can be often found on the pages of various judicial web sites. Google will find them and it is a pain free way do filter people out.

What do I look in an interview

In the most cases I held only one technical interview with a candidate. So I try to get as much information about the person as possible.

On Manager Tools they say the main goal of a job interview is to keep people out. That is better to kick false negative then to let in a false positive. And I agree with them. With that in mind there are two check marks I need to tick off for a candidate:

  • Are they technically knowledgeable and are able to grow independently
  • Are they going to be a good fit for our technical culture

How do I conduct an interview

I’ve conducted technical interview in the office with a big white board to write one, I’ve conducted interviews in hallways and office kitchens. I’ve talked to people over the phone and over Skype (generally the same thing, but the latter is far cheaper). But the best place to conduct a technical interview for me is the local pub.

Since I live in Pula the best place for me is the coffee house “Bass”. With big wooden desks, good music and nice people in it.

For me a technical interview is a comfortable conversation between two nice people, who are relaxed and talk freely. A pub is a great place for it. People relax easily and talk freely in a place they usually go to talk.

A relaxed conversation is very important for me. There are several reasons for it:

  • Relaxed people will reveal more information and will freely talk about anything
  • If that person is hired I want to have a head start in building a good an positive relationship with them

I always start interviews by asking the candidate what he knows about the company I work for and the I fill in the blanks, describe the hiring process ask for questions and then kick in for the general questions.

I will always focus on the projects the person has done, the technical  problem she solved and their knowledge of the architecture and domain they were working in.

During that phase I often as for the candidate to draw me the architecture of the latest project they were working on. I want to know if they can visualize and model the software they were working.

On the end of the interview I’m really content if we shake hands and each leave with a smile. I always ask the candidate for questions and answer them as truthfully as possible and I always pay for the drinks.

How do I decide if its a technical fit

When I’m alone at the desk and had time to think about a candidate I write their strengths and weaknesses and if they are going to be a good fit for us. Based on my report I give my hire or no hire decision and let then let the business handle it.

Paid advertising: A well-designed database application can make a big difference to your business. By helping you to record, manage and share your business information quickly and easily. Contact Access Guru for more information

01 September 2012

Kids and drug education

 

I’m currently listening to the Trainspotting sound track on Grooveshark.com and it got me thinking. Trainspotting was a great movie for my generation and for its time, but the book which I read after I watched the movie was event better, more deeper and more powerful. It showed the drug problem of the UK in a real vivid and documentary style which at moments shocked me.

It is a real good book to kick the drug idea from someone head. That idea kick started another idea. Which books should I give my son to read when he enters his teens which are related to the drug problem? One book which came to my mind was the book titled “Zoo Station: The story of Christiane F.” which I read when I was an upper grader in the elementary school which was really shocking and popular with the kids at that time. The story revolves around a young girl and her life as a teen drug addict and prostitute in Berlin. There is also a film by around the same topic Christiane F. – We Children from Bahnhof Zoo which I didn’t see.

I think the drugs problem is a real big problem parents need to face with their children and it really scares me to think that my son might come in contact with this side of reality.

31 August 2012

Atari Lives!

 

Just a quick post for me. This morning I was checking what was cool and new at Microsoft and found this cool blog post about Atari games being redone in Html 5 for the browser and the Windows 8 table .

Check this cool blog post about it (there is an event cooler video).

And of course if you want to forget .NET, Objective-C and Java you can go back to the future and be an Atari developer here.

01 July 2012

Good bye Novatec, welcome Cenosco


On April 28th 2008 I was the first engineer that was hired by Roberto Gobo, the then and currently active director of Software Development, at Novatec New Technologies. And now, four years and almost two months later on July 1st 2012 it will be my last day at Novatec.
I will leave my position of Technical Lead which I continuously held since the beginning of my work there. I worked in many different technologies, in many different domains and for many different client. I worked with small teams, with big teams and sometimes solo. And it was quite a ride.
But it is my time to leave and start something new.
In July I will start my work with a Dutch based company Cenosco in the role of a Software Architect and I really look forward to that.
So goodbye to my mentor and friend Roberto Gobo, my good colleagues with whom I’ve shared laughs and perils and hope I will meet you and work with you again, but not just yet this year :) .
What are the best lessons learned from my spent at Novatec:
  • -         Write down every meeting with the client, share those minutes as references and they will come handy when change requests are being negotiated
  • -        Use you issue tracker for storing everything: tasks, issues, change requests and defects. Your issue tracker is your best friend for storing software requirements.
  • -        Write you architecture in as short a document as possible using as many pictures as you want.
  • -        Be gentle with people you work with, bend and do not be stiff you will get more done
  • -        Technical knowledge starts projects, relationships finish projects
  • -        Do the most important thing for the client first
  • -        Do the most important thing for the project second
  • -        Find time to increase software quality attributes
  • -        Teaching people takes time and effort, if you spend it will save money later.
  • -        Learn, take time to learn on and off your job. Use whatever podcasts in your car, book, your kindle for reading articles, presentations from the web and you own coding katas.
  • -        Connect with you peers in other companies.

When all is said and done I’ve done a great job there. I’ve trained a lot of people, I’ve done a lot of projects and helped creating the technical culture of the company.
I will miss it but it is time for something new.

15 June 2012

What is technical leadership

Use Case Model

What is a technical lead?

In my opinion a technical lead  is a person who is senior enough and has the required set of skills that can manage the technical aspect of implementing a complete software product or just a part by managing the technical aspect of its development for a small team of up to five people.

The principal focus of a technical lead is the correct technical implementation of a set of requirements by her and her team.

How do I become a technical lead?

In my experience technical leads (or whatever name they have) share the following characteristics:

  • A Technical lead has a level of technical excellence in a all areas core to the product development
  • A Technical lead has the ability to create a technical vision of a finished product, transform that vision in a set of tasks and lead people in their development,
  • A Technical lead can take onto him self to develop the core of the product being developed.
  • A Technical lead needs to have soft skills

In short you need to have all those skills and experience to make it to a technical lead level. But that is not enough. To be successful as a Technical lead you need implicit backing from the organizational management structure. A Technical lead is responsible for the technical aspect of the product being developer and without a proper and implicit organization backing he cannot achieve her goal because technical excellence and soft skills are not enough to technically lead people.

On aspect of the technical lead job is to be the arbiter of any technical decision. In short words if there is any doubt what technical solution is proper for a given problem the duty of the technical lead is to accept upon himself the responsibility of the final decision.

What does a technical lead do?

A technical lead has several areas of responsibility. He is is both an engineer and a operational level manager and thus his work covers both spectrums:

  • Translations of business requirements into technical tasks
  • Planning and organization of technical tasks
  • Technical planning and technology selection
  • Team technical communication
  • Stakeholder technical communication
  • Project technical quality attribute management
  • Construction of the project core

OF the entire list the following two areas of responsibility are important:

  • Construction of the project core
  • Planning and organization of technical tasks

The technical lead must accept and develop the most important and critical part of any project. And he also must manage the implementation of all technical tasks related to the product being build.

02 June 2012

JavaScript inheritance

 

There are many ways to do Object Oriented Programming in JavaScript. And there are multiple syntaxes for creating object inheritances. Given the fact that JavaScript is a functional prototype oriented programming language the classic inheritance pattern and syntax is not actually something which is on the top of the list for most JavaScript developers.

But what if your team or you are classical server side developer and are well versed in the Object Oriented Inheritance model found in Java, C# or PHP and you need to develop a JavaScript based RIA application?

Well there is a JavaScript inheritance model which is simple and is similar to the classic inheritance syntax used by more server oriented programming languages. Of course in JavaScript we don’ have private or protected methods but there are ways to handle that. What is important is the ability to create a proper inheritance tree in a very simple manner.

The basic inheritance story looks like this:

   1:  function User(){
   2:   
   3:  }
   4:   
   5:  User.prototype.Authenticate = function (username, password) {
   6:      return true;
   7:  }
   8:   
   9:  function Clerk(){
  10:      User.call(this);
  11:  }
  12:   
  13:  Clerk.prototype = new User();
  14:  Clerk.prototype.constructor = Clerk;



The class User is a basic class with a single method Authenticate. The method Authenticate doesn’t do much. The class Clerk inherits from the class User. The basic inheritance pattern is this:


   1:  Clerk.prototype = new User();
   2:  Clerk.prototype.constructor = Clerk;
 



 

The prototype of the class Clerk receives a new instance of the class User. The constructor of the class Clerk is reset again (since it was overridden in the previous call with the class User) to Clerk again.


Thus the class Clerk has now all the properties and methods of the class User. In the constructor of the class Clerk we call its parent constructor to initialize any constructor initialized properties or activities.


   1:  function Clerk(){
   2:      User.call(this);
   3:  }



The first parameter of the call function set the context of the this variable in the called function. With this line now the this in the User constructor is no longer the User class but the Clerk class.


The above example is the bare minimum you need to use in order to have classical inheritance in JavaScript. The next example will deal with three advanced concepts:



  • Method overriding

  • Passing parameters to the base constructor class

  • Calling parent methods in overridden methods while conserving the this context

   1:  function Institute(name){
   2:      this._name = name;
   3:  }
   4:   
   5:  Institute.prototype.getName = function() {return this._name;}
   6:  Institute.prototype.setName = function(name) {this._name = name;}
   7:  Institute.prototype.educatePeople = function(){
   8:      console.log("The instititute " + this._name + " will educate 200 people this year");
   9:  }
  10:   
  11:   
  12:  function PrivateInstitute(name){
  13:      Institute.call(this,name);
  14:  }
  15:   
  16:  PrivateInstitute.prototype = new Institute();
  17:  PrivateInstitute.prototype.constructor = PrivateInstitute;
  18:   
  19:  PrivateInstitute.prototype.educatePeople = function(){
  20:     Institute.prototype.educatePeople.call(this);
  21:     console.log("And we will earn mucho dinero!";
  22:  }



In the above example we have two classes the Institute base class and the PrivateInstitute child class. The Institute class receives one parameter in its constructor its name.


When inheriting the Institute class the name parameter is passed to the parent constructor after the this parameter in the call method like this:


   1:  function PrivateInstitute(name){
   2:      Institute.call(this,name);
   3:  }



Both classes the implement the educatePeople method. The version in the PrivateInstitute class is a simple override. In order to override methods in JavaScript we just need to repeat their names and the that version will be used instead of the parent method. But what is we need to call the parent method, or a method belonging to a different ancestor in the inheritance tree? Well the syntax for that is a little different. We need to call the method on the prototype of the class of the ancestor we are calling the method on and as the first parameter we need to pass the current object instance like this:


   1:  PrivateInstitute.prototype.educatePeople = function(){
   2:     Institute.prototype.educatePeople.call(this);
   3:     console.log("And we will earn mucho dinero!";
   4:  }



Normally as was the case in the previous constructor example if the ancestor method receives any parameters they are passed after the this reference in the call method.


There is one further things one needs to be very carefull and is the this context in DOM event callbacks which reference to the DOM element being operated on. The following trick makes all the this pain go away.


   1:  SomeClass.prototype.callbackMethod = function(event) {
   2:     console.log(this.SomeProperty); //printing property belonging to the same class
   3:     Parent.prototype.SomeMethod.call(this); 
   4:  }
   5:   
   6:  SomeClass.prototype.UIHandler = function(){
   7:     var self = this ; //alternate name for this
   8:     $('button').click(function(event) {
   9:        self.callbackMethod(event);
  10:     });
  11:  }



The main focus is the replacement of the this variable with the self variable in the scope of the method. The self variable in the callback of the click event handler is the SameClass this context thanks to the closure feature of JavaScript.

02 May 2012

Ramblings about life and software in general


“Good news everyone!” , said the nutty professor in Futurama. And good news indeed. I get to talk another year on the Case24 software engineering conference in Zagreb. And I'm the first talk of the day with my talk about “Agile architecture with distributed teams”. And the time I have to talk about this really big topic is around 30 minutes. When I talk about this it usually takes me around 2 and half hours to scratch the surface.

I plan actually to focus on the key getaways I learned about working with distributed teams and agile architecture. In 30 minutes it is the only thing someone can really tell.

Fortunately I get to also write a paper on the topic in which I can get in more deeper in the problem space.

Software developers really should write more. It is a skill rarely seen in the software cummunity. Really, who of you guys writes regular documentation or event writes something which usable or even re factored or reworked as the project progresses? A really small number of people really.

But without good documentation we cannot do our work. See PHP or .NET for example both good examples of documentation overflow. You can learn PHP only from its manuall and on MSDN there is a ton of things about which ever way a specific class may be used. Java on the other side didn't really made be fuzzy and worm inside with the state of its documentation.

I've started refocusing on .NET lately watching BUILD presentations, reading about some new things doing my katas with .NET and Mono code. And was really taken aback in the difference of the quality of learning materials the basic platform documentation has for .NET and Java developers.

I've done a small 2 day Java project lately and it was Google/Stackoverflow all the way. I'm working on a PHP project currently and its is only the PHP manual by good that is the best piece of documentation I've ever seen. It is so freaking useful , a shame PHP is littered with problems as a language.

Of course .NET has a problem of its own , its like a flood. Microsoft really is getting a ton of things out if its development engines out into the world and you need a real control mechanism to stem the tide of information if you want to survive the day. That would explain some of the behavior I've seen in some .NET developers which can be described simply as “Ok I learned this, and I will stick to as if its the only parachute in the airplane and it is about to crash. “ Getting some of those guys to try something new or change paradigms is really, really hard . On the other hand I've see a lot of PHP guys with the attitude “Oh God let me learn and try something new, it is is so cool and so easy I just want to pile so many new things.” The few Java developers I know are mostly silent guru like types who for any problems just say “It is not a problem”. I do not know what to make out of those yet.

As a general rule more if more things are written and maintained around a technology the better, but if too much is written people will shun most of since they really cannot catch with everything and do something productive at the same time.

I've just started things what is the difference in the effort of training someone in .NET and PHP. I've done both. I've trained people to work in .NET (ASP.NET, C# , SQL Server, Nunit, Javascript) and PHP (PHP, MySQL and Javascript) and it is easier to train a complete newbee in PHP then it is to train the same person into .NET. It also takes longer to train someone to work with .NET. I think it has to do with the fact that .NET solutions have more complex code bases then PHP solutions with the same functionality implemented (lets face it .NET is more rigid then PHP and you really need to type more code to get some things done).
On the other hand you can be a better engineer with .NET since it enables you more clearly design and develop your system then PHP. PHP is more liberal and chaotic and while you can make good design and engineering work with PHP it takes more effort and is harder to battle entropy then it is with .NET. Of course bad coding is bad coding and no language can replace it. But given the fact that more effort needs to be spent in learning .NET then PHP I think some people just give up, or learn good practices or just raise more awareness around things then before.
It was just so with me. I've started as a PHP developer and then after a three or four years of constant PHP development I've switched for around a year of Python development (still do it some times) and the for four years of .NET work with mix matching PHP work. And it changed me. It really did.
I've transferred my PHP skills and way of thinking around the code to .NET , saw that some things do not work that some things do work and then I've returned to PHP with .NET experiences which I could transfer and apply to PHP projects. Like energy regardless on the platform or language you are working on nothing is lost, knowledge just changes state.

Life is complicated, software development is complicated as hell , it is not easy and it is not pretty but I love it none the less just as I love life and my family. To me being an architect and technical lead or just a developer is natural like breathing and cannot imagine my self doing something else.