Introducing Elegant Code Solutions

I am announcing the launch of Elegant Code Solutions, LLC. This marks my decision to join the community as an independent trainer, developer, coach, and consultant. For the last four years I have worked for Scrum.org and Microsoft, and I am coming back to my happiest professional roots: Helping teams improve their agility with professionalism and technical excellence.

I am starting my practice with work focused on what I know best: training, coaching, and software consulting. I am looking forward to running more compilers than Power Point decks, and I already have a few prospects in motion.

Ideally, I’d love Elegant Code Solutions (ECS) to grow into a cooperative of like-minded indies who can vouch for each other so we can work together and bid bigger jobs. This guild model would be the second pass I’ve taken at this idea, and I look forward to the possibilities of learning from our earlier efforts.

That said, one step at a time wins the race. For now I am establishing ECS as my own endeavor, knowing I have a huge community of talented professionals and friends to call upon for support and staffing projects.

What This Means for ElegantCode.com

Not much, really. Everyone who has ever published here is still welcome to do so. I passed the whole ECS model by the current Elegant Code bloggers and they are cool with it. Some would love to participate in the opportunities we hope arise.

I will try my best to pick up my blogging efforts and ElegantCode.com will be my blog home. I invite anyone who would like to write, and can back it up with decent writing skills and relevant content, to contact me about joining our little blogging community.

ElegantCode.com was founded on January 2, 2003 as a personal blog, and grew into a community blog which has enjoyed significant success for last 12 years. A wealth of knowledge still lives in our archives, despite fewer blog posts being created these last few years. Twitter really did kill the blog-writing Starr :-), and only a few of us still post on a regular basis.

ElegantCode.com has always been a hobby and has never been directly used for profit. I hope to semi-keep it that way.

Thank You

Thank you, dear reader, for 12 great years on the blog and an even better future for the software development industry we are building together.

Resgrid is a BizSpark Featured Startup

Today Microsoft published an article on their BizSpark Featured Startups blog about Resgrid!

What is Resgrid?

Resgrid is a software as a service product hosted on Microsoft Azure that provides logistics, management and communication tools to first responder organizations such as volunteer fire, career fire, EMS, search and rescue, public safety, disaster relief organizations, etc.

My partner Shawn Jackson and I created Resgrid a few years ago and the buzz is exciting to see.

If you have any interest in following some technical aspects of this little startup. Shawn often posts interesting articles both technical and startup/business related on his site.

Fixing a Dreaded Daily Scrum

I have known many developers who resent the Daily Scrum, or daily stand-up meeting. I have literally watched team members hide from the Scrum Master by leaving the team room before its time for the Daily Scrum.

image

This typically because the Development Team doesn’t feel it is getting sufficient value from the event. More concretely, some vocal member or members of the Development Team don’t feel they are getting value, and other developers just don’t care one way or another. “It’s far easier to go along to get along”, they reason.

The Questions Aren’t the Point

In the experiences I’ve had with teams in this condition, they are focusing the Daily Scrum on THE 3 QUESTIONS that some well-meaning person has insisted be answered each day (probably the “Scrum Master”). You know the 3 questions I mean. They are right there in the Scrum Guide, right? Well, yes. But they are a means to an end, not the end game itself.

image

It’s easy to formulate these discussion points into 3 succinct questions, but doing so every day invites burnout and discourages the actual point of the event, which is to formulate a shared plan for the next 24 hours. That’s the first sentence of the Daily Scrum section of the Scrum Guide, after all. The daily meeting is more about what comes next, not what happened yesterday.

You Aren’t Alone

Most every daily Development Team meeting I’ve seen tries to use the easily formulated  questions as the fundamental discussion. When we do this, it’s far easier for each team member to:

  • Provide a ridiculously long answer to, “What did I do yesterday?” This usually includes descriptions of unproductive meetings with no relevance to the work at hand, or others on the team.
  • Gloss over with general language, “What I’ll do today.” This might sound something like, “I’ll be working on …” rather than a declaration of a short term goal to accomplish.
  • Assume my problems are my problems and I therefore have, “no impediments.”

Thereby implementing the recipe for the worst daily standup meeting you’ve ever attended.

Fix this Silliness

imageHere are my 3 rules for fixing your the Daily Scrum, Daily Standup, or whatever you call it. Keep the originally defined elements in place (Same time and place, 15 minute time-box, etc.), but look out the windshield more than in the rearview. There’s more of it to look at anyway.

  1. Focus on the product.

    If you are about to tell me a long story about why you didn’t get anything done yesterday due to meetings, save it. If you are having trouble getting something working, tell us that you need help. If your contribution isn’t about what we are building together, it’s inappropriate for this discussion.

  2. Move to we from me

    This isn’t a recommendation is to let people hide and not participate. It is a recommendation that every developer can explain what the next 24 hours will look like, assuming things go as planned, for everyone else on the Development Team. Everyone understands the reality of who will leave early, who is frustrated with a vexing problem, etc. All Development Team members can explain the expected state of the product increment and code at this time tomorrow.

  3. How can I help you?

    Instead of denying that I have impediments (because that would show weakness and I am a mighty, mighty, developer who needs no one), offer help with the struggles of others. Even if you know nothing about the problem, a fresh set of eyes almost always helps. Encourage the team to replace, “I have no impediments” with “May I pair with you on that after standup?”

Use different Git Diff Tools Per File Extension

How to setup git to allow different merge/diff tools based on file extension.

I'm going to put this here so I can find it later…

Create a merge-wrapper script

To allow us the flexibility we want to determine which diff tool should be used for different file extensions, we need to break out the logic in to an external script. Below I have 2 samples of a merge script. I started with the .sh file (bottom), but changed over to the .js version (above that) since it is easier for me to maintain.

I haven't yet tried to run this on windows, but suspect we can wrap the merge-wrapper.js in a .cmd file calling it with Node.JS.

Customize the merge-wrapper.js

  1. Extend with other diff tool support:

    If you want to extend the script to add support for your own diff tool, just create a new function that returns an object following the pattern of the existing createP4MergeCommand or createOpenDiffCommand.

  2. Modify which diff tool is used per extension:

    If you want to change which tool is used per file extensions you can modify the diffLookup hash to map various extensions to whatever tool you setup.

  3. Leave me a comment (either here – or in the gist) of what diff tool you added.

    I'd be happy to take contributions of other diff tools in this gist if you leave a comment with yours…

Below was an attempt at using a bash script to manage what I do above, it'll work for some, but I didn't want to maintain this – prefer the JS version instead.

Setup ~/.gitconfig

Now that we've created our merge wrapper script we need to tell git how to use it.

Say we placed our merge script in the following directory: $HOME/dotfiles/tools/merge-wrapper.js. You can add the below to your ~/.gitconfig file and when you use git difftool our new merge-wrapper will be used to pick diff tools based on file extension.

[merge]
    tool = merge_wrapper
[mergetool "merge_wrapper"]
    cmd = $HOME/dotfiles/tools/merge-wrapper.js "$BASE" "$LOCAL" "$REMOTE" "$MERGED"

Introducing SkypeIt – Command Line Skype Phone Calls

SkypeIt

In short npm install -g skypeit and enjoy quickly jumping on conference calls.

What is it?

A simple little command line utility that can be used to efficiently jump on a conference call and automatically dials the extension or conference ID.

What pain does this solve?

I've recently been working on a number of projects where often times more than twice a day I have to jump on a conference bridge.

This typically involves:

  1. Opening the Outlook appointment
  2. Copying just the conference phone number (without extension)
  3. Pasting it in Skype to dial
  4. While Skype is dialing, I go back to Outlook and copy the extension/conference id.
  5. Pasting in Skype's number pad area
  6. Type or use the mouse to press the final # key.

How does SkypeIt improve this?

SkypeIt takes the 6 steps and cuts them in half or more.

  1. Open the Outlook appointment
  2. Copy the conference phone number & extension (if there is one) in one shot.
  3. At the (already open command line – because we developers usually have a command line open) paste in skypeit "<paste here>" <press enter>

The problem this solves may seem like a first world problem, but a big annoyance factor when running through the original steps to get on a conference call is, people who setup these meetings, rarely include the final # sign needed at the end of a conference ID/extension #. So when I paste the extension into Skype, I still have to manually get the # in there.

SkypeIt even better with teams!

If you work remotely as I do, then you're probably communicating through things like HipChat, Skype, Slack, AOL (I-kid, I-kid), etc. Instead of I.M.ing your team to remind them to jump on a call where they would have to repeat the long steps above, you can just paste the skypeIt ###-###-### ###### command necessary to immediately jump on a call. This serves to remind them a call is coming up or already started and saves time from having to find the number/extension as they can copy/paste it directly at the command line.

Or even better, if you're on a Mac and using ZSH at the command line, SkypeIt has tab completion support and a YAML config strategy, so you can easily configure a project with your standard phone numbers (say daily standup conference number) and check in a .skypeitrc file to the project. When you're in the context of the project you can just type skypeit stand<tab> and jump on your daily standup conference call.

Does anyone who works remotely actually stand-up on a daily standup call? hmmm…

Still early…

SkypeIt was written to solve a personal pain-point and is not yet a complete solution for all conference call situations. If you'd like to see your scenario supported, head on over to the SkypeIt Issues on GitHub and drop me a line.

I'm not currently using a windows machine – but with the windows protocol activation capabilities, we can probably easily add support for windows to SkypeIt.

Manage Work Item Tags in Visual Studio

Visual Studio customers have been asking for richer tagging features inside the IDE for a long time. TFS and VSO have allowed tagging of work items for well over a year, but the only way to really work with the tags has been through the web interfaces.

The teams that build features in Visual Studio have a LOT of things in their backlog (I can attest to this as I was one for a little while). Adding tag management features to VS would be fairly far down that backlog, but luckily a community project has just shipped its first release of a plugin for VS that allows management of tags if you are working with TFS or VSO.

This is thanks to the ALM Rangers, who are basically a group of volunteers who provided patterns&practices style guidance for ALM tooling issues in the Microsoft tool stack.

Tag Admin for VS 2015 only works with VS 2015 Preview builds at this time, but it sounds like work is underway to support current (older versions).

Here’s a demo

Tag Management in Visual Studio

 

I know the fact that this only works with Visual Studio 2015 is a bummer for most of us, but keep watching the project. Backlog is being transformed to Increments, I’m told Smile.

Charging Station – I Apparently do Handicrafts Now

I regret not having blogged in several months and am determined to get back on that wagon. Let’s start simply, with a goofy little holiday project.

This is what happens when my boss puts me on “you’ve been working too much” leave. I do dumb things in the garage.

I despise an untidy mess and tangle of wires. I could easily work atop a dirt floor with a half inch of dust on things, so long as all things in the room are at right angles to one another and there isn’t a knot of wires in sight. I know, it’s my own little OCD problem.

Accordingly, I recently came up with a Pinterest-worthy handicraft that hides all my tangled charging cables. I grew tired of seeing tangles of micro-USB cables flowing from powers strips, so here is my solution.

image

At a friends recommendation, I bought an Anker IQ charging brick. You can get a pack o’ cheap and short micro-USB cables with it for $10 more.

Then I took a wooden cigar box, secured from my local cigar shop, and drilled holes in it to support the power cord and up to 6 micro-USB cables poking out the sides. I velcroed the charger to the inside of the box so it wouldn’t knock around in there when I move the box.

image

It looks a bit like an insect.

image

But it works great and when I am not charging anything, I can push the cables back into the cigar box. Nice and tidy.

image

Thoughts on Working Remotely from Home

This post may seem a bit longer than my usual posts. It's one I've slowly been extending over the last couple years while working remotely. Many of the points may be obvious ones, but if you're considering a work-from-home (remotely) type of position that you consider some of these topics.

Background

My previous job afforded me the opportunity to work from home a couple days out of the week. While putting my wife through school, those days were great. I would start work extra early so I could leave early and watch our little girl while my wife headed off to class. The early start was great because these quiet mornings were often the most productive part of my day. The lack of distractions such as email, meetings, and instant message chats along with the quiet focus time all contributed to this increased productivity.

While I quite enjoyed this time, was often productive, and it helped my family I still preferred to go into the office over working from home.

So why did I still prefer going to the office over working from home?

I did not feel as connected to the group, which left me feeling as thought I was always playing catchup. All of those water-cooler discussions and inpromptu office meetings where I (or anyone else remote) wasn't pulled into more often not left me feeling like I was not able to keep on top of what was going on.

This experience and the feeling it left me with is what concerned me about the new job I was about to take.

Worried to take a remote / work from home job.

Given my limited work from home experience, I was concerned about working remotely 100% of the time. However, the new opportunity to work for a consulting firm I admired, and the thought of being able to constantly try new technologies, and business domains was really appealing.

I have now worked remotely for Vertigo for over 3 years and I'd like to share a list of Pros/Cons that I've gathered through my experience working from home full time.

Con's to working from home

Now, while Con's do not outweigh the Pro's for me, there is quite a bit of grey area here, so let's review some con's.

  • Less human/social interaction on a daily basis. As an introvert, and a software developer, this is generally not too bad. This was a bigger concern for me originally and is much less of an issue now that I've tried it out. I make sure to take some time to have great Skype video calls with fellow remote coworkers and I also try to offset this by participating in local user groups or and other social occasions. However, the best medicine for this is a simple trip to the park with my little girls. I will say that I've had a day or two where I jumped at the opportunity to take a trip to Costco or other errand just so I could get out of the house…
  • Shipping Hardware.
    • This one is a bit of a pain. Working for a consulting firm means there are many of different projects that require varying hardware configurations. From Xboxes, test phones, tablets, computers, and even TVs. I semi-regularly run to FedEx and send something to H.Q. or the Apple Store or Best Buy to pick up some hardware based on the needs of a project.
  • It can be a little too easy to sit at the personal computer in the evening and reach over to my work computer to reply to a late work-related email, or hammer on some code. So you need to be careful about the work/family balance when it's so easy to work from home. This takes a bit of discipline.
  • Sitting in the office chair when the amazingly yummy aromas of some fresh home cooking – distracting me from being productive as the smell is driving my stomach to scream at me to go downstairs for some food!
  • Communication
    • Being remote, you have to become an over-communicator. An email here and there is fine, but combine that with chat/I.M., phone calls, video chat calls (preferred), and more emails. However, you have to work a little harder to be noticed, especially if you have to compete with people who are all working in the same office.
  • It often takes a little more discipline to take breaks.
  • Time Zones
    • Time Zones are a hassle from many different angles, even when you work at an office; however, working remotely often means your employer has hired you because you are not near them. This increases the chance that you are several or more timezones away from your company's headquarters. Which can mean the usual things like meal planning, start/stop times, etc require a bit more planning and accommodation.

Pro's to working from home

  • Home office temperature!
    • Like most indoor jobs, AC and Heat are good amenities to have, but in big buildings people cannot often control the temperature. It's either too cold or too hot as big buildings have a mind of their own (their airflow and ventilation kinks). However, working from home, you're the master of your indoor weather. If you get hot, take off some clothes or turn on the AC. If you're too cold, put on some clothes or crank up the heat.
  • Commute
    • I often joke with my fellow Californian commute ridden co-workers when they complain about traffic that day that I narrowly avoided a 3 (lego) car pile-up on my way to the office.
    • I live where it's cold in the winter and not having to scrape the ice off of the windshield of my car in the morning due to the icy dew is a HUGE benefit.
    • Plus there's the, well not commuting part. While I enjoyed using the commute to zone out to my favorite podcasts, I still find time to keep up with my podcast when doing things like laundry, dishes, etc.
  • More family time overall. Since my coffee, water, bathroom breaks all lead to opportunities where I can say hello to the family.
  • SWEATPANTS! My wife recently introduced me to sweatpants. OMG they are comfortable, try wearing those at the stuffy-formal-office…
  • Quiet place to focus. It's easy to isolate yourself from the outside world if you need some quiet time to focus and be productive. Shut off the I.M., put phone on do not disturb, close email and get some serious work done.
  • We have all the usual necessities at home,
    • Tools (for that time you need a screwdriver)
    • Easy access to hygiene related products/tools. Ever need to take a shower in the middle of the day? Change of clothes (spilled coffee….)? Or brush your teeth?
  • Invest in your office.
    • When you invest in your home office, you're investing in yourself. Get a good chair, desk, keyboard, mouse, etc.
  • Lunch at home. My wife is a great cook. I'm spoiled to nearly always have a great set of leftovers in the fridge. Keeping me from eating out all the time. Not having to worry about someone eating my leftover chicken-wings (ya, that really happened – not even funny – You know who you are!)
  • My wife just brought me the most amazing homemade burrito. I didn't even care I was on a video call with my team. nom…nom…nom…
  • One of my favorite perks, is not even a perk that any company could offer (or even replace). I take the opportunity to for 10-minute break in the afternoon, where I walk up the street to meet my daughter at the bus stop. This is so much more important in my life than practically any company can offer (like free lunches, ping-pong table, etc…).
  • Scheduling an at-home call is easy. It's rarely a problem to have a fix-it man come by, or cable-guy, or if a package needs to be signed for, working from home makes this easy.
  • David's Additions: I shared a draft of this post to a good friend and coworker and he gave me some other tips, I hadn't thought of, which I totally agree.
    • You struggle on problems and your kid walks in the room and puts your life in perspective.
    • I can listen to my music turned way up!

What about distractions?

I get this a lot, when I tell others I work from home. "I don't know how you don't get distracted with other things to do at home." This may be a very individual thing. While, there can be distractions at home, I've always been a focused individual and I would say it's often easier to be distracted at the office with office chit-chat, meetings, going out to lunch, etc.

Not-so socially appropriate

  • When you're at the office, possibly in a long meeting, what do you do if you have some gas? Working remotely, there's no stress, or stomach pain… Mute your conference call, relax and nobody is the wiser. (Except this one time, I did such a thing not realizing my wife was within an earshot. Yea, a bit embarrassing but we had a laugh over it.)