Monday, November 17, 2014

Test Driven Development - Think about it!

Over the last few years I've been moving my teams towards Test Driven Development.  If you're not there, you need to be looking at this paradigm.  In essence, the following is what you are shooting for:
  1. Write your test.
  2. Run your test - the test should fail because the code hasn't been written yet.
  3. Create the bare minimum of code that will allow the test to pass.
  4. Continue to refactor the code until you are satisfied - is it simple, have you removed any duplication?
  5. Repeat - accumulating additional tests until full functionality matches the agreed upon requirements and design criteria.
I've been on this push for a couple of different reasons: 1) The QA Team is spending an inordinate amount of time performing regression tests that should be in the build process; 2) The QA Teams and Development Teams should spend most of their time on new feature/new function testing - not regression testing; 3)  Within the old paradigm that we were following, by the time the development team member became aware of a defect in the code, they had long since moved on to other parts of the code and it was not fresh on the mind.

I've recently spoken with several groups of students - some high school and some at the collegiate level - and the one common theme that I have been impressing on all of these groups is that they need to think about testing first.  That means while doing the design work and prior to any code being written, they should understand how they will test the code and then execute against the plan.

In a separate session. when meeting with some of the instructors - another individual recommended that the instructors should have a base set of tests created that the students will need to execute against their assignments.  The students could do this at any time to get immediate feedback.  If an instructor were to pursue this paradigm within their classrooms, I would encourage them to create a portion of the tests, but force the students to create their own set of tests.

Unless our teams are working on a completely new system - there should exist somewhere in the organization a base set of tests that cover the current functionality.  It may not be extensive, but it's there somewhere.  That's the baseline!  No build of the system should happen without improvements to that baseline with your development team increasing the code coverage with additional unit tests that are then included in the set of regression tests the next time that code is touched.

Let's face it, immediately after the code has been written and the developers focus shifts on to the next task, their ability to maintain the code begins to drift.  I'm not saying they can't maintain it, but that they will need to spend time re familiarizing themselves with the code and then planning how to make the change.  Additionally, you can't guarantee that the next time the code needs to be touched it will be touched by the same developer.  By having these tests complete and in the pool of regression tests, you set an expectation with the developer that they can't claim they are complete with the code until all regression tests are complete and they can prove that they have tested against the new feature/functionality of the application.

Really, when it comes down to it, it's about accountability within the development team.  They are just as responsible for the quality of the code as are the people working the front end of the project - discovery and requirements, design - and those working the back end of the project quality assurance and the user representatives.

If you'd like more information on my background: LinkedIn Profile

Wednesday, November 12, 2014

STEM - Stop Talking, Start Helping!

There is a lot of talk across the nation in promoting STEM careers with our younger students.  This continues to be an issue that we need to address.  More jobs continue to open up within these fields and that trend will only accelerate as the Baby Boomers retire.

Take a quick look at the number of job openings that are expected thru 2022: BLS: Occupational Outlook Quarterly.  Let's review the top jobs identified in this report (as of Spring 2014):
  • Software Developers - 218,500 openings thru 2022, average wage $92,660
  • Computer Systems Analysts - 209,600 openings thru 2022, average wage $81,190
  • Computer User Support Specialist - 196,900 openings thru 2022, average wage $46,620
  • Software Developers, System Software - 134,700 openings thru 2022, average wage $101,410
  • Civil Engineers - 120,100 openings thru 2022, average wage $80,770
You know what, those are pretty good wages!  I recognize that these are not the starting wages, that said, you can see that overall, these are jobs that will be in demand.  Students entering into these jobs should see wage increases that will allow them to earn a decent living.

My focus in this post will be careers in Computer Science.  While other STEM careers are critical - I'll focus on those that I'm most familiar with, those that have powered my careeer.

Unfortunately, here in the States, we are doing a very poor job of educating our students about what opportunities are available and are not focusing our curriculum to encourage young students to explore the career choices.

Only 1 in 10 of our high schools offer computer science programs for their students (as identified by TEALS).  That is a scary statistic - if 9 out of 10 schools can not provide early experiences to students that might be interested in Computer Science, how are we expecting these students to make the choice to pursue degrees in Computer Science.  More importantly, if it is this bad at the high school level - what do you think it looks like at the middle school level.

I firmly believe that if we don't find a way that allows middle school students a way to explore these careers early and then do not reinforce that through high school experiences, that we are failing the next generation.  More importantly, we are putting the future of our companies at risk.

So, here are my ideas of what needs to be done:
  • Our local school boards need to find a way to introduce computer science curriculum into all middle schools.  These courses need to count as math or science credits.
    • We need to specifically find ways to encourage both young men and women to take these courses.
  • Our local school boards need to find a way to introduce computer science curriculum into all high schools.  These courses need to count as math or science credits.
    • Alternately, some states are declaring that computer language courses would count as foreign language credits.
  • Our states need to fund the expansion of STEM exploratory courses at both the middle and high school levels.
  • Businesses need to step up and provide volunteers to go into the schools and assist students as they explore STEM careers.  Some of this is being done through initiatives like Lego League, but we need to find these types of programs and make them available to every school, every year.
  • Businesses need to open up and hire more entry level technology students.  I have seen the tide shift to where many companies now only want to hire people with several years of experience.  They no longer want to hire newly graduated students and mentor them into the next generation of experts within their company.  Or they only want to contract and rotate people in and out every 18 months.  That may work for their bottom line today, but it destroys the expertise that they will need when current subject matter experts retire.
And, yes, before you ask, I'm holding myself accountable.  For years, I have taken time to regularly talk to high school and college students about career opportunities and what life is like working within the Computer Science field - specifically software engineering.  I have volunteered to assist as schools present various tech initiatives for their students.

If those of us in this field don't take the time to encourage the next generation to step up and become the future technology experts, who will?  If we don't take the time to encourage our schools to address the educational needs that will drive job opportunities, who will?  If we don't take the time to personally lobby/communicate with our state leaders on the need to drive change in this area, who will?

If you'd like more information on my background: LinkedIn Profile

Monday, November 3, 2014

It's NOT all about you, it's about the Team!

I'm not a success without the people on my team!  Flat and simple - if they aren't succeeding, then I'm failing.  As a leader inside the organization, it's one of my responsibilities to look out for the needs of my team and find ways to make them successful.  I can't guarantee them success every time, but I need to find ways for them to succeed more than they fail and within their failure, I need to recognize that I own some of that failure.

I've seen people that have been great contributors on the team suddenly put themselves in a position where they look like they are going to hit the wall.  I've had to step in-front of them and prevent the smash up that is about to occur.  Sometimes these discussions can be difficult, because they don't want to admit that they are about to fail.  Sometimes there is a look of pure relief on their face when someone steps in and says - hey, I'm here to help.

One of the first projects I worked on after becoming a manager was a fairly mundane project needed within the organization - there were several pieces of the software being developed and one of the pieces was being held up because there was nobody else to work the issue.  I made the decision that I would jump in and work the issue myself.  At this point, my boss asked me why I was working on the code.  I explained to him my logic and he began to ask questions:
  • If  you're working on the code - who's going to keep track of all the pieces that are moving within this effort and make sure overall we're on target?
  • If you're working on the code - who are your engineers going to escalate the issue to when there's a problem and how will you manage those issues?
  • If you're working on the code - who's going to keep myself and the rest of that management team aware of the status, issues, risks and plans?
There were several other questions - but you get the general sense of the conversation,  I was young and eager and for every question he had, I had an answer, me!  My manager made it clear to me that this was not the right answer and that I was going to end up hitting the wall.  I assured him, that I would be able to handle all of it and went on my merry way.

Soon, I began to trip up on myself - at first it was missing a status report here and there, not escalating an issue that needed to be escalated.  Then the impacts grew - I wasn't paying attention to all of the different moving parts and coordinating the delivery.  I hit the wall.  My boss looked me in the eye and asked me what I was going to do to clean it up.  I had failed!  Luckily, he reached out and helped clean up the mess and get the project back on track.  But what he taught me happened after all the pieces had been put back together and the project was again running forward.  He sat me down, told me that this time he had allowed me to fail and had helped me out so that I could learn what not to do going forward!  The next time this happened, if I let it happen, I would need to clean up the mess by myself.

Where to start?  First I learned as a manager, it's tough to be the one in the details and still be the one coordinating everything else that needs to be done.  Two, I learned that sometimes it's alright to let people fail.  Three, I learned that when somebody does fail, you have to be there to pick them up and help them get back on track - give them the ability to learn.

Now in some instances - the failures begin to outweigh the successes and you come to the moment of truth.  Is there a way that I can make this person successful, or have they proven that they are incapable of performing within the role that they've been hired for - a difficult decision.

As leaders - either formal supervisors/managers or informal project managers - it's not enough just to do the tactical parts of the job.  It's essential that we work work with the people we touch in the organization and help lift them up.  Only if we truly give them the tools and skills they need to perform their role and prepare them for more difficult responsibilities in their future, will we reap the rewards and succeed within our own role.

If you'd like more information on my background: LinkedIn Profile