What makes a good Software Developer?

by Mark Nijhof, in Improvement Craftsmanship | Saturday, May 16, 2009 | 1 comment
A few days ago Børge Hansen asked on Twitter “What does it take to be a successful consultant these days” which resulted in a small but interesting discussion (Anders Norås even brought Twitter down by a flood of tweets). So I thought to write about what I think what makes a good Software Developer, as I believe there should be little to no distinction between an in-house Developer or a hired Consultant.

And yes because I am a Geek I am showing you my thoughts in a Geeky way!

    1 using System.Linq;
    2 using NUnit.Framework;
    3 using TinyBDD.Dsl.GivenWhenThen;
    4 using TinyBDD.Specification.NUnit;
    5 
    6 namespace Fohjin
    7 {
    8     [TestFixture]
    9     public class SoftwareDeveloperTests
   10     {
   11         private SoftwareDeveloper _softwareDeveloper;
   12 
   13         [Test]
   14         public void Should_engage_in_quality_orientated_development()
   15         {
   16             var software = new Software();
   17             Scenario.New("Should engage in quality orientated development", scenario =>
   18             {
   19                 scenario.Given("A Senior Software Developer", 
   20                     () => _softwareDeveloper = new SoftwareDeveloper { ExperianceLevel = Level.Senior });
   21 
   22                 scenario.When("Writing software", 
   23                     () => _softwareDeveloper.WritesSoftware(software));
   24 
   25                 scenario.Then("The produced software should be of high quality ensuring that "+
   26                               "the code is Maintainable, Extendable and of overall High Quality", 
   27 
   28                 () => {
   29                     software.IsMaintainable.ShouldBeTrue();
   30                     software.IsExtendable.ShouldBeTrue();
   31                     software.IsOfHighQuality.ShouldBeTrue();
   32                 });
   33             }).Execute();
   34         }
   35 
   36         [Test]
   37         public void Should_demonstrate_creativity_and_insightful_thinking()
   38         {
   39             var requestOrDemand = new RequestOrDemand();
   40             Scenario.New("Should demonstrate creativity and insightful thinking", scenario =>
   41             {
   42                 scenario.Given("A Senior Software Developer",
   43                     () => _softwareDeveloper = new SoftwareDeveloper { ExperianceLevel = Level.Senior });
   44 
   45                 scenario.When("Presented with a request or demand",
   46                     () => _softwareDeveloper.PleaseSolve(requestOrDemand));
   47 
   48                 scenario.Then("The software developer should demonstrate insight and creativity "+
   49                               "in trying to understand the request or demand. He or she should "+
   50                               "also provide one or more possible solutions to solve the problem",
   51 
   52                 () => {
   53                     _softwareDeveloper.UnderstandsTheProblem.ShouldBeTrue();
   54                     requestOrDemand.GetPossibleSolutions().Count.ShouldNotBe(0);
   55                     requestOrDemand.GetPossibleSolutions().First().IsCreative.ShouldBeTrue();
   56                 });
   57             }).Execute();
   58         }
   59 
   60         [Test]
   61         public void Should_be_professional()
   62         {
   63             const string description = "Issue Description";
   64             Scenario.New("Should be professional", scenario =>
   65             {
   66                 scenario.Given("A Senior Software Developer",
   67                     () => _softwareDeveloper = new SoftwareDeveloper { ExperianceLevel = Level.Senior });
   68 
   69                 scenario.When("Presented with a major problem",
   70                     () => _softwareDeveloper.GetProjects().First().HasAnIssue(description));
   71 
   72                 scenario.Then("The software developer should as soon as possible notify the stakeholders "+
   73                               "so that they can make an informed decision. It should be noted that some "+
   74                               "thought for finding a possible solution should be given before completely "+
   75                               "scaring the stakeholder",
   76 
   77                 () =>
   78                 {
   79                     var project = _softwareDeveloper.GetProjects().First();
   80                     var stakeHolder = _softwareDeveloper.GetStakeholderOf(project);
   81                     stakeHolder.KnowsOfAnIssue.ShouldBeTrue();
   82                     stakeHolder.GetKnownIssues().First().Project.ShouldBe(project);
   83                     stakeHolder.GetKnownIssues().First().Description.ShouldBe(description);
   84                     stakeHolder.GetKnownIssues().First().GetPossibleSolutions().Count.ShouldNotBe(0);
   85                     stakeHolder.GetKnownIssues().First().GetPossibleSolutions().First().IsCreative.ShouldBeTrue();
   86                 });
   87             }).Execute();
   88         }
   89 
   90         [Test]
   91         public void Should_always_be_learning()
   92         {
   93             Scenario.New("Should always be learning", scenario =>
   94             {
   95                 scenario.Given("A Senior Software Developer",
   96                     () => _softwareDeveloper = new SoftwareDeveloper { ExperianceLevel = Level.Senior });
   97 
   98                 scenario.Then("The software developer should always be learning",
   99                     () => _softwareDeveloper.IsLearning.ShouldBeTrue());
  100 
  101             }).Execute();
  102         }
  103 
  104         [Test]
  105         public void Should_be_awesome()
  106         {
  107             Scenario.New("Should be awesome", scenario =>
  108             {
  109                 scenario.Given("A Senior Software Developer",
  110                     () => _softwareDeveloper = new SoftwareDeveloper { ExperianceLevel = Level.Senior });
  111 
  112                 scenario.Then("The software developer should be awesome",
  113                     () => _softwareDeveloper.IsAwesome.ShouldBeTrue());
  114 
  115             }).Execute();
  116         }
  117     }
  118 }

Now when we run these tests you will notice that we only get around 1% test coverage when we talk about a fully implemented Software Developer. An other thing to note is that these projects on average take more then 20 years to complete if at all. By using small iterations and constant feedback you have the opportunity to constantly adapt the Software Developer depending on it’s environment.

I hope you forgive me my Geeky way of showing a very small part of what I think is important in a software developer, one thing that I want to stand out is that one should never ever stop learning new things, and always be open to suggestions. And once you learned something, teach it to someone else!

The BDD style is from TinyBDD
Torbjørn Marø (gravatar)

Since I know you have a lot of Norwegian readers I would like to share my own blogpost about the four main skill categories I believe every software developer should cultivate:

http://blog.kjempekjekt.com/2009/04/10/utviklerprofiler-og-fire-ferdighetskategorier/

And I will definitely check out TinyBDD :)

Torbjørn Marø, Friday, May 22, 2009 at 10:44 PM

Mark is reading

 
Creative Commons License
This work is licensed under a Creative Commons Attribution 3.0 Unported License.