#ByMoonlight – Yosemite

Unfortunately it was a new moon when we where in Yosemite for a mid week getaway.  So I traded the moon for a flash or phone LED torch to do some light painting.  Enjoy!

Your typical landmarks –

  • Half Dome (from Glacier Point) just after sunset, with a painted tree in the foreground.
  • El Capitan, just after sunset (note the two lights which are climbers camped for the night) with the meadow in the foreground highlighted by passing cars.
  • The Yosemite park sign, much later in the evening, painted with phones in torch mode with stars in the background.

All photos are as captured, with no post-processing.

Feel free to comment below or reach out to me if you want to discuss.

Advertisements

Using Google’s “+” Email For Opting Out and Catching SPAM

Fortunately, with strong spam catching features in most of the mail systems, the bother of spam is considerably less than it was 10 years ago.  It is clear that the perennial concern about opting out being a magnet for new sources of spam is well and truly founded.  Fortunately, you can use the “+” option for email to opt-out safely as well as getting a solid read on the how the opt-out either cuts down on or increases spam. Continue reading “Using Google’s “+” Email For Opting Out and Catching SPAM”

Converting a ChromeBook to a Dev Environment

Chromebooks are inexpensive, generally single purpose devices that are 90% of what most people need for day to day use.  Developers however need just that little bit more.  My preferred development environment includes using the atom.io text editor among other tools.

When my normal OSX development environment was not available, I re-purposed an Intel based ChromeBook to being a dev environment.  This article describes the process and some of the final thoughts.

The steps needed are

  1. Backup local storage
  2. Enable Developer Mode
  3. Install Crouton
  4. Install the Crouton Extension
  5. Install Atom

Note this gets a developers editor, but does not set up other development tools (compilers, etc).  I’ll leave this as an exercise for the reader.

Continue reading “Converting a ChromeBook to a Dev Environment”

New #bymoonlight images

A quick photo #bymoonlight photo for tonight.

las-palmas-bymoonlight

Ambiguous Requirements in the Simplest Places (and how to fix it)

Below is a photo from New Mongolian BBQ, a favorite dinner place for the family.  This is a really interesting example of an ambiguous requirement as demonstrated by an ambiguous API.  As part of the instructions at the start of the line, a patron is suggested to use two bowls – one for meat, and one for vegetables.

IMG_20150201_184436When the patron gets to the end of the line for the their Mongolian to be cooked and they are presented with this spot for two sets of waiting customers.  The first question that comes to mind is I have two bowls.

The two immediate options that I see for what this means is

  • Customers front and back, bowl 1 and bowl 2.
  • Customer 1 and customer 2

Judging from the customers choosing randomly from the two options above.  I generally opt for bowl 1/bowl 2 if there aren’t any bowls already up when I arrive.

So how do we take the ambiguous requirement and make it mostly obvious to most patrons?  My suggestion would be to place a thick line to separate the two customer spots.  This would rely on human nature to want to have their bundled things bundled together.  If you look carefully at the picture, this might be the intent since there is already a slightly larger gap between the front and back.

Any other suggestions on how to resolve this ambiguous requirement?  Any similar simple but confounding ambiguous requirements issues that you have found?  Post a comment below.

If you aren’t yellow, you aren’t pushing hard enough.

Came across great execution: balancing order and chaos blog post by Mike Abbott on uncapitilized.com.  In particular the following quote

If the environment at a startup isn’t crazy, then something’s wrong.

This reminds me of an adage that I use fairly often.

If you aren’t yellow, you aren’t pushing hard enough.

For those unfamiliar with the Red/Yellow/Green (RYG)status colors, otherwise known as the Traffic Light Rating System (apologies for the British-isms in the wikipedia article), which is commonly used in project management to rate the status of a project.  Very quickly, here are some broad guidelines on what RYG means..

GreenProject in great shape, no issues, no concerning risks

Red Project in troubled state, needs help, impactful risks realized, late, overbudget
Yellow Project in okay to not-so-bad state, some issues, some risks, needs care and feeding, might become late, might go over budget
Green Project in great shape, no issues, no meaningful risks, no concerns… All good!

Quite often, project go through their lifecycle going something like the following…

Green, Green, Green, Green, …, Green, Yellow, Red

The optimistic behavior isn’t usually intended, it is human nature to assume that issues are under control, unknowns can be ignored, risks are mitigated and under control.   It’s only at crunch time close to the end when integration is occurring, latent issues or risks are discovered that a project moves to yellow.  Since they collapse on top of each other, the project quickly goes from yellow to red.  Project resets occur, scope is thrown out the window, crap products ship…

Realistically, a good project will ferret out risks, issues, assumptions and dependencies early on in the project.  If after a thorough analysis, the project would generally be yellow.

If the project is still green, the project is a slam dunk.  If you think it’s a slam dunk, then the team can push harder.  Pushing harder brings in some yellow through any of the RAID items above, but they also bring in an element of chaos that Mike talks about in his blog.

Thoughts, comments, counterviews?

Estimating for Software is Like Estimating for Skinning a Cat

As I’ve mentioned a few times, estimation is an imprecise art.    There are ways to increase accuracy of the estimation either through consensus based estimation or other methods.    This post explores why estimations are hard and why the software world struggles to find tools, techniques and methods that provide for consistent and accurate estimations.

I’ve recently been playing with Codewars (connect with me there) and have been intrigued by the variance of the solutions that are provided.  In particular, you have the “smart” developers who come up with one-liners that need a PhD to decode, tight code, maintainable code, and then clearly hacked till it works code.  This variance is likely the underlying reason for the difficulty in getting consistently accurate estimates.

Read on for more some of the examples that I have pulled from the Convert Hex String to RGB kata.  The variance is quite astonishing.  When you dig deeper into the differences, you can begin to see the vast differences in approaches.  I’m not going to dig deeper into my personal views of the pro’s and cons of each one, but it did provide me a lightbulb moment as to the how software in particular always going to be difficult to estimate accurately.

I came up with an interesting analogy when pushed by a colleague on systematic ways of estimating.  His assertion was that other industries (building in his example) have systematic ways of doing time and cost estimates for doing work.  While not diminishing the trades, there are considerably less degrees of freedom for, say, a framer putting up a house frame.  The fundamental degrees of freedom are

  • experience – apprentice or master
  • tools – Nails or nail gun
  • quality of lumber – (not sure how to build this in)

For an master carpenter, framing will be very quick, for an apprentice, it will be slow.  The actual person doing the framing will likely be somewhere in between.   Likewise, using nail and hammer will be slow, and a nail gun will be fast.  The combination of those two factors will be the prime determinant of how long a piece of framing will take to complete.

I code however, we bring in other factors that need to be include in estimates, but are typically not considered until the code is being written.  Looking at the examples below, we see the tools that are available.

  • Array utility operators (ie: slice)
  • string operators (ie: substring)
  • direct array index manipulation (array[index])
  • regular expression (.match)
  • lookup Tables (.indexOf)

Using each of these tools has an general impact on the speed that the code can be written, and the speed that it can be debugged and the general maintainability of the code.

With this simple example, I feel that the current practice of “order of” that is popular in agile is sufficient for the type of accuracy that we will get.  Fibonacci, t-shirt sizes, hours/days/weeks/months/quarters, are really the among the best classes of estimates that we can get.

function hexStringToRGB(h) {
  return {
    r: parseInt(h.slice(1,3),16),
    g: parseInt(h.slice(3,5),16),
    b: parseInt(h.slice(5,7),16)
  };
}
function hexStringToRGB(hexString) {
  return {
    r : getColor(hexString),
    g : getColor(hexString, 'g'),
    b : getColor(hexString, 'b')
  };
}

function getColor(string, color) {
  var num = 1;
  if(color == "g"){ num += 2; }
  else if(color == "b"){ num += 4; }
  return parseInt("0x" + string.substring(num, num+2));
}
function hexStringToRGB(hs) {
  return {r: parseInt(hs[1]+hs[2],16), g : parseInt(hs[3]+hs[4],16), b : parseInt(hs[5]+hs[6],16)}
}
function hexStringToRGB(s) {
  var foo=s.substring(1).match(/.{1,2}/g).map(function(val){return parseInt(val,16)})
  return {r:foo[0],g:foo[1],b:foo[2]}
}
function hexStringToRGB(hexString) {
  var hex = '0123456789ABCDEF'.split('');
   hexString = hexString.toUpperCase().split('');

  function hexToRGB(f,r){
    return hex.indexOf(f)*16 + hex.indexOf(r);
  }

  return {
    r: hexToRGB(hexString[1],hexString[2]),
    g: hexToRGB(hexString[3],hexString[4]),
    b: hexToRGB(hexString[5],hexString[6])
  }
}

About Skinning the Cats

There are many ways to skin a cat” has it’s earliest print etymology in Money Diggers article in the 1840’s Gentleman’s Magazine, and Monthly America Review.  Even that reference implies it is a phrase already in use before then.  Generally the phrase implies there are many ways to achieve something.  In the context of this article, the analogy is that even simple tasks like writing a hex to RGB converter can be achieved in may different ways.


As always, vehemently opposed positions are encouraged in the comments, you can also connect with me on twitter @tippettm, connect with me on LinkedIn via matthewtippett, and finally +Matthew Tippett on google+.