Author Archives: chuck

3 People in a Room

Sometimes in Software development, the organization is not quite mature enough to know what we’re going to do. In other organizations there are tons of ideas about what to do, but it’s not written down.

Three People in a Room is a tenet that I coined back in 2012 to describe what needs to happen as a feature/story is generated.

To put it simply, three groups need to be in the represented whenever a decision is made about a feature. Those groups are:

  • The idea Owner (typically a product manager)
  • The Doer (typically development)
  • The Verifier (typically a tester)

It is imperative that these three (3) groups are represented in EVERY conversation and participate in EVERY decision about a feature.

Communication Part 2: Don’t waste my time

Do not send meeting invitations for a meeting in the next hour (or early the next business day) if you haven’t directly contacted me beforehand.  I won’t be there.

Do not invite me to a meeting in which I do not actively participate.  Instead,  just send me a recap via email.

Do publish meeting minutes and include Action Items with assigned responsibilities for meetings.

Do not invite me to daily status meetings.  I will be sending my status via email.  Better yet, I will be show you how use your project management tool of choice and run the canned report.

Elements of a great developer job

Over the past few months, I’ve been thinking about my dream job.  Not that I’m not happy where I am right now, but what would make me really happy?  Just thought I’d share.

Company Feel – Excited or boring?  Does the company feel big or small.  I like to work in a fast-paced environment with a lot of control.  Others will like the warm, snugly feeling of a great big company will lots of bureaucracy and red tape.  What about the fringe benefits?  Do they have free beverages, Taco Tuesdays or do they sponsor a local user groups?  Are they located in a cool part of town, or do they allow working remotely?  These things can differentiate a good company from a great company.  I know some of these fringe benefits are kind of cliche these days, but they really do add to employee morale, especially that of a developer.

IT – Your IT team is there to support you in your work, not hinder.  Let’s face it, employees are still people and have obligations outside of work that need to be taken care of during work hours. Accept it.  Slow internet connections are simply unacceptable.  Things like site blockers take the “nanny for 9 yr olds” approach to adult management.  Instead of doing this, let everyone know that the internet is being monitored, and they will be fired if they use it improperly.

Management – Management is there to tow the company line.  But it can be done without severity.  Does management tend to say, “Hey, you were five minutes late!”, or “I saw you logged in last night at midnight, working on anything fun?”  Let’s face it, developers develop on their own time.  A great book that I read recently was Pragmatic Thinking and Learning, in which the author recognizes the necessity of a calm working block of time and the impracticality of getting one at work.  The best work environment (and hence the best manager) embraces this concept and allows you to work when it is best for you, yet still holding you to be accountable for promised work product.

Product Management – Do the product managers know what they provide?  Do they know their audience? or are they flying by the seat of their pants?  If they are, do they at least acknowledge that?

Executive Leadership (C-Level) – Does the highest level of management have a clue?  Or are they just blowing smoke?  Do they have an accurate view of what is going on at the lower levels?  A telltale sign that this is not happening is when product releases are delayed.  A good sign that this is happening is when you see them conducting 360 reviews, talking with people outside the C-level block, like investors, support staff, clerks, etc.

HR – I prefer to be a consultant and remove HR from the whole equation.  No one has your best interests at heart but you.  Earn your paycheck, and pay for your own damned healthcare.  Depending on your station in life, you may need to have company-sponsored healthcare.

Priority and Severity

Priority and Severity are the foundational methods to categorize work items in software development. With the agreement and buy-in across the team on the accepted definitions, it is much easier to order and schedule work.

Below are the industry standards for Priority and Severity. Do not stray from these definitions. You will only end up dooming your team to failure.

Priority
An organizational ordering of the work item. It is not based on how hard the problem is or who it affects. It defines importance to the team. It typically affects when the work will be scheduled.
1 – High – Most important/valuable to the organization. We will fix this bug first.
2 – Medium – Moderately important. We’ll fix this bug eventually.
3 – Low – Least important. We’ll fix this bug when we get around to it.

There is no need for more than 3 levels of prioritization.

Severity
A technical categorization of the bug. How much of an effect does the work item have? Is it the game changing new feature that we think will make our profits soar? Is it the terrible bug that every one of our users sees every time they login? Maybe it’s just a typo on the About Us page. Severity defines the what. There are 4 levels of severity:
• Critical – This is a serious. Wake up the CIO. Some part of the system is down and it is affecting all customers. There is no known workaround. If necessary, all hands on-deck to get this done.
• Major – Some part of the system is not working properly, affecting all customers. There is an effective workaround.
• Minor – Some part of the system is not working properly, affecting some customers.
• Low – Pesky problem for some customer, but they can live with it until we fix it.

Blockers
A blocker is neither a Priority nor a Severity. Do not get caught in that trap. A blocker indicates that something is blocking something else from occurring. A bug can block other bugs from being tested. Knowing that something is a blocker can affect the bug’s priority.


Software Craftsmanship

Anyone with a compiler today can call themselves a programmer.  Some are doing it and don’t even realize that they are doing it (think Excel formulas).  But even narrowing the field down to those that make a living writing code, there is a great disparity in the quality of developers out there. Compared to  various other professional careers out there, software developers are vastly unregulated.  How can we tell (without extreme vetting and interviews) how good a developer an individual really is?

Engineer – An engineer can do the work.  She understands the basic and advanced levels of the work.  He knows the tools and knows how to do them.  In software engineering, this person does not need Google to write code.

Let’s begin with some definitions that help us understand Craftmanship:

Craftsman – A craftsman lives the life of their craft.  It is part of their being.  They know intimately the tools and materials that are available when building something from scratch. They know how to fix things the right way.  A craftsman intuitively knows when something is right.  This person learns and educates at the same time.  When I think of craftsman,  I immediately get this image in my head of some learned old dude in worn coveralls with a white beard, hunched over a tool, finely tuning that end product while dropping knowledge on some younger apprentice.  Craftsmen can just do their work without thinking, almost intuitively. Craftsmen mentor.  They educate.  They teach.

Levels – Many other professions regulate their membership.  These are the common levels of craftsmanship in organizations and professions like Masons, Doctors, Electricians, Engineers, Architects, Plumbers, HVAC, and others in which we place trust with our lives:

  • Apprentice – Has identified an interest.  Studying, learning.  An apprentice must prove proficiency via testing and practice.  Must be supervised by a Journeyman. Membership at this level is usually a period of 3 or more years or classroom and practical experience.
  • Journeyman – Can work alone at the direction of a Master.  Usually consists of 5,000+ hours of on the job training and hundreds of classroom hours.  Tested.
  • Master –  10,000+ hours of experience.  Has been a journeyman for a certain time period.  Testing.  Proven track record.

Guild – An organization of members that facilitates and oversees the entire process.  A guild regulates and certifies its members, requires regular and ongoing professional training, and recommends professionals based on those certifications. 

What does the field of software engineering have today that satisfies the Craftmanship challenge?  In short, very little:

  • Schools – let’s face it, from the 2 week programmer’s boot camp program to undergraduate and graduate school, these programs are all the same: A let down.  These organizations teach you a few skills, take your money, hand you a piece of paper, and wish you luck.  At best, these serve only a portion of the Apprenticeship requirement.
  • ACM – I was a member of this organization when I was in college.  ACM leans a little more to the hardware engineering side of IT.  It is disappointing from the software engineering viewpoint.  Their levels fall short of a mastery certification or a process of development.  Membership levels  are based simply on years of membership and member endorsements.
  • Software Craftmanship NA – Interesting conference.   But it’s only a 2 day conference. It is a good options for ongoing training learning.
  • User groups/Meetups – Great ongoing learning opportunities
  • Conferences – Also good opportunities for learning.  I especially like attending the community run conferences in my local area.

So why don’t we follow this same course in Software Engineering?  There is certification testing available:

  • National Council of Examiners for Engineering and Surveying
  • PE exam in software dscipline

A Call to Action

So where are you along your journey?  Are you an apprentice, still trying to figure out if you like the  job?   Or are you just paying the bills so you hack out some code every few days?  Do you consider yourself a Master?  If so, why?

Debug logging sucks

I’ve seen a bunch of production killers caused by debug logging.

Why does debug logging suck?  Because it’s debug, stupid:
1) It’s usually extremely verbose.
2) It opens you up for potential security violations.  Who know what that contractor put into a debug statement?
3) It’s not meant to be performant.  In other words, it’s slow.  Like sloth-slow.

The only time you should ever use debug logging is during development. Even then, debug logging just means “I was too lazy (or proud) to step through my shitty code in the debugger”. It’s logging overkill. Most of the problems I’ve seen are caused by different threads all trying to access non-threadsafe code at the same time.

Either way, logs fill up with useless crap.  That crap fills up your disk, etc.  It marginalizes the stability of your software.  So following are few quick pointers.

  1. Never let your users know it’s available. Once you do, it’s on forever.
  2. Better yet, just don’t create debug log messages.  Do one of these instead:
  • Create a no-op method for your debug messages in production.  Use a “Production” configuration tag to determine when your code is in a production environment.  Don’t log when in production mode. [Good]
  • Create a single logging class and always use it. Compile out the debug messages when building Release software. [Better]
  • Create integrated performance counters in your code that instrument key metrics like methods calls /sec and average method call execution times. Identify and instrument the key methods in your software. This way, you can track your software performance in real time, regardless of your environment. [Best]

Support Sprints

The nature of our support dictates that when our customer calls, we drop what we’re doing to work on the problem.  This keeps our customers happy. And it makes us feel good that we can fix it.

The problem with support is that it cannot be scheduled effectively.  Why?  Because we don’t know how long support will take.

  • The actual time could be more than the allocated time. This leads to sprint leakage as properly estimated work cannot be completed.
  • The actual time could be less than the allocated time, which leads to either: 1) pulling in random work which may not get completed, 2) spending too much time on stories that are really complete, but we’ll write one more unit test, or 3) twiddling our thumbs.
  • Context switching which is hard to do and wastes a lot of time. (cit. Spolsky, cit. Atwood)

A method that I have seen work well in past consultant engagements is to designate a support sprint. In each iteration, one dev team gets the support sprint. That team is essentially “on call”. When not actively engaged in a support call, the team can work on the support backlog (the triaged list of open support/infrastructure/internal bugs). This affords the following:

  • Dedicated feature sprints without interruptions (and hopefully less sprint carryover).
  • A pool of semi-dedicated resources always at the ready to work those critical severity / high priority issues as they arise.
  • A built-in method to whittle down the infrastructure backlog.
  • No single team feeling stuck in a support capacity because the support sprint rotates among the teams.

Have you used support sprints in your organization?  I’d like to hear more about how you implemented them and how well or poorly they worked.

Microsoft Surface Activation Error 80072f8f

So you can’t activate your spanking brand new Microsoft Surface and the device is pretty much useless?

There’s a simple fix for this. I’ve had to do this several times on new Microsoft Surface devices.  Basically, the Windows activation server is confused by the fact that your device’s bad date and time.  (Silly, I know).  To fix the problem:

Swipe from the right to get the charms menu.
Select Change PC settings.
Select Time and Language.
Turn off the ‘Set time automatically’ option.
Click the button under Change Date and time.
Set the correct date and time.

Boom.

Your device will automatically activate. And you are whole once again.

Tenets of a Performant Development team

Our customers are very important to us.  We will do everything reasonable to make our customers happy.  If we cannot satisfy or customer, they will fire us.  If our customer is unreasonable, we will fire them.

Our software is not overly complicated;  it is easy to understand.  If the architecture takes an hour-long meeting to explain, it’s wrong.

We operate as a team.  We communicate.  Occasionally, we will argue (respectfully) because we all have different opinions.  That’s ok. We are not offended by it.  If someone on my team needs help, I readily volunteer to help.  For you manager types, read this article of stages of team development to help your team get to the Performing stage.

We commit completed, tested, demonstrable code.  What does that mean?

  • We don’t break features up into a bunches of unrelated stories.  We are committed to getting the feature done by the end of our development cycle (iteration/sprint).
  • We don’t commit half-assed ideas to the trunk in lots of little piece.   Every source control system out there has a way to save your bits and pieces off to the side (branches, forks, shelvesets, etc.) while they are not complete ideas.  Your feature should be committed to the trunk in a single piece.
  • There are automated tests around as much of it as possible (i.e. all of it).
  • We can show it to the customer and they can understand it easily.

We write software.  If our automated builds/test are broken, then we are no longer writing software, we are writing bugs.  Therefore a properly functioning, successful (green) build is a priority.  We regularly monitor our builds and fix them.  Our software is tested automatically;  we do not accept broken software.

Write better JavaScript code using JSLint

For those of you that may not be familiar with lint, lint is a programmatic process that seeks out common programming mistakes.   Lint was originally written decades ago for C code.  JSLint and other tools like it were developed to do the same for your JavaScript code.  JavaScript is an extremely intricate language that allows you to write really bad code.  These JavaScript linters will highlight hundreds of common JavaScript programming errors.   

If you are developing an application that uses JavaScript, you should have a linting tool in your development toolbox.  Below, I’ve evaluated a few.

Option 1: Use Web Essentials

At a minimum, you should install Web Essentials.

Then you get a JavaScript linter for free.  http://vswebessentials.com/features/javascript

You also now have cool menu options under Web Essentials to edit your ‘*int’ configurations (JSHint, TSLint, CoffeLint, and JSCS).

You’ll need to play with them, because out of the box, Web Essentials only finds the most grievous errors. 

Your JavaScript errors will show automatically in the Messages tab of the Error List:

clip_image002

Option 2 – JSLint.Net Add in

The best integration with Visual Studio and Web projects seems to be with The JSLint.Net add in

Once installed, you get new context-sensitive menu options by right-clicking a project or .js file. 

Project settings are integrated with the web project via a JSLintNet.json file, so they can be checked in and shared with other developers.

In the example below, I right-clicked on my web project and selected

1) Changed the ‘Output Errors As’ setting to Messages so that lint errors go to the Messages tab in the Error List window.

2) Checked ‘Run on save’ and ‘Run on build’

3) Previously ignored a bunch of .js files that I didn’t write.

clip_image004

On the JSLint Options screen, added a few Predefined Globals.

As we refer to them all too frequently in our code, I don’t want to see errors on these objects.

clip_image006

Option 3 – JSLint add-in for Visual Studio

If you want to take it a step further, you can install the JSLint add in for Visual Studio.  It has A LOT of functionality that you can play with, but is a little harder to configure.   Be sure to set the linter to JSHint, which is a little bit less restrictive than JSLint.

clip_image008