Thursday, December 05, 2013

Multiple Simultaneous Interactive SSH sessions

As I've been doing more and more Sys Ops on, I have had the strong desire to avoid having to repeatedly ssh into multiple systems in order to do the same actions over and over again.  So, I started searching for "parallel interactive SSH" and other variations.

Cutting to the solution for OSX, I found csshx (The project is also on

Here's an example of using it:
Some notes:

  • csshX opens a small, red command window at the bottom. This needs to be the active window to get the commands to go all client windows
  • The command window has a "control mode" that lets do things like re-tile, sort, add and remove windows and exit (you'll be prompted individually for each window).  You can also simply type "exit" to exit the shell in all the terminal windows and then close each one.
  • You can click into one of the client windows to issue a custom command on only that system
  • I have my ssh public key on the target machines, but it also worked on those machines without the public key, passing my login password through to all ssh clients
  • When launching csshX from the terminal, use your "primary" screen. I found when launching it from my secondary monitor in OSX Mavericks (10.9) that the child windows immediately closed. Perhaps they couldn't resize correctly. 
  • I've tried this with up to 15 windows, YMMV, but that looks like my maximum, given that this was running on my primary window - the laptop screen.  If you switch to a massive secondary screen, you may be able to squeeze in more.

Wednesday, October 30, 2013

Conducting Project Retrospective with a Distributed Team

Like many modern software development teams, some of our team members do not work in the same office as we do.  We have the added and common scenario that some of our colleagues work nearly half way around the world, so our morning is, quite literally, their evening.

And, like many modern software development teams, we like to us an Agile process, using a Scrum model with typically a two week sprint.  On the last day of the sprint, we hold a project retrospective, so that the sprint's events are quite fresh in our mind, then we close the sprint and start the next one.

As in so many aspects of team and sprint management, I like the retrospective to be completely democratic; each team member has an equal opportunity to provide comment.  Here's how we do it:

The purpose of the retrospective is process improvement; what can we learn from this and previous sprints so that we can codify successful behavior and modify less-successful behavior?  To focus on learning lessons, ask two questions:

  1. What did we do well in this sprint?
  2. What could we have done better in this sprint?

To get answers, start with question one and go round-robin, with the questioner going last in the sequence, giving every involved team member (pigs only, please) an opportunity either answer the question at hand.  Each person can either provide a new answer to the question or take a pass.  When they take a pass, they typically are not asked to provide any more answers to the question.  Don't be draconian; if someone remembers something in the course of the process, it is better to be inclusive than rigid to a rule.

It runs something like this:

Scrum Master (SM): Person 1 (P1): Do you have something we did well in this sprint?

P1: Yes, We completed some significant new functionality for our users

SM: Thank you.  Person 2 (P2): Do you have something we did well in this sprint?

P2: Yes, We were very responsive in reviewing Pull Requests

And so forth until everyone has taken a pass on the question.  Then move on to question two.

One way to document the answers in a group is to use a document, word processor or presentation, and put one answer on a page.  Put the document on a large screen so everyone can follow along. Then, print out all pages and put them on the wall.  Each person takes a pen, marker, sticker or something similar and makes three votes on the answers to each question.

The votes are then tallied up and the top three answers are documented in some centralized document of Retrospective Summaries.

How then to do this for teams that are geographically disbursed?  We want everyone to follow along with the documentation of the answers so they every team member can agree to the wording used.  We want every team member to be able to vote and we need to tally up the votes.

When facing these challenges for the current team, I first looked at collaborative work spaces that would let us all see the same documents and perhaps collaboratively edit the documents using some kind of tick mark or initials to indicate votes.  These were less than elegant.

Today we use two technologies to conduct our project retrospectives.  First, we use to have the entire team view the screen of the Scrum Master.  The Scrum Master creates a survey on  The survey has two questions, the ones above.  Each question requires exactly 3 answers be selected.  We then go round-robin and document each answer.  Here's what it looks like as we edit a question:

When we have finished the process of gathering the answers, the SM posts the URL of the survey in to the team chat window and pauses  Every team member votes and when all votes have been collected, the SM unpauses and the team reviews the answers.

The top three answers are documented in a centralized document and an executive summary is sent around.  Every other or third sprint we look back at previous answers to see how we're trending.  We look for answers that we have repeated and talk about how we will retain good practices and what we could use to replace less-successful practices.

By retaining our focus on process improvement, we have the opportunity for every team member to have a voice and everyone has had very helpful inputs, that even if not voted, stay in the collective consciousness.

Wednesday, October 09, 2013

The Joy-Infused Workplace

This is a new thought, so please bear with with while I work it out, but I was so excited by this that I had to put something down on paper, as it were.

I was chatting with some colleagues during a quick coffee break and they were joking about business management practices: ISO, CMMI, MBO, etc.  Joking about how all these were problematic, but they liked ISO because it didn't matter how bad the product was, as long as the process was documented and reproducible.  We steam-rolled into the laughable over-reaching of business processes and how they can block and stifle productivity and creativity.

Then came the seminal moment: One colleague said, "But you have to have some process!  Otherwise everything would just be chaos!"

I couldn't resist.  I was bursting.  I blurted out, "Yes! And it does not matter which process you choose; as long as the team works with it, owns it, uses it, improves it and you, the team and the company are ultimately successful!

"Your processes doesn't even need to come from only one source!  Mix, match and combine!  Pull a little Peer Programming into your Agile Scrum.  Waterfall?  Heck, if it works for you: YES!"

We laughed a bit about that, but I wouldn't let it go.   "If you, your team and your company is successful, then your process is a good one, whatever it is.  I have learned that if you can help everyone enjoy what they do, they will do it well and will want to continue doing well.  The process is incidental; the joie de vivre is what is critical.

"As a matter of fact; that is what the management goal of the company should be: Success by fostering an environment of joy within the company."

My colleague pointed out, "That could backfire: The server went down, but we're happy, so who cares!"

"Great point!"  I practically yelled.  I am excitable.  "But, that would be antithetical to the company's goal of being successful. If the staff is enabled to keep the servers running, maintained and address critical repair issues in a timely manner, then they will feel a tremendous sense of accomplishment and satisfaction; right?"  My colleague agreed.

If everyone in my company felt joy, accomplishment and satisfaction, I doubt there would be a business challenge we could not over come.  So, it's my new business and management philosophy: The Joy-Infused Workplace.

Perhaps I'm just supremely lucky to be able to work standing up and dancing to great music while I write, debug and review Ruby and Rails code and work with some really fine colleagues on my team.  But I suspect, based on the laughter, respect and support we have for one another that we are a high-performing team because of the way we choose to let joy in to our working environment.

Yes, OK, I know: one can't be happy all the time.  I think that does not at all take away from the goal of creating a workplace environment where everyone one can feel acknowledged, accomplishment and satisfaction that leads to regular expressions of joy.

Wednesday, September 25, 2013

Aarrgh!! Sports Authority Web App Fail

Gonna complain here. Sports Authority, you never fail to Piss Me Off. Every time I enter your store, the employees make me feel like I am intruding on their personal time. It takes for-evah to find what I want. And now, now I have "The League" to talk about.

Yes, I signed up for your customer loyalty program. With the level of activity in our family, I am regularly at your store.

So, I signed up, gave my info and my wife tried to use the card. Nope; we have to register on your website first.

I come to your website, enter the card number and my email address. Then I generate a secure 15 digit password. The form pukes; passwords have to be 7 - 14 characters. OK, my bad. I generate another password, this one is 14 characters. Enter. Hmm, the page doesn't refresh, maybe the old 15 digit password wasn't cleared. Generate a new password, copy it, carefully delete the current password and try again.

What? Another error message? Passwords have to be 7 - 14 characters. F-f-f-f-f-ffffff But it is!! Hey, I'm a smart guy; you probably also don't accept special characters. So I generate another password, 14 characters, but not special characters and resubmit.

Fails again. Now my email address doesn't match. WHY DIDN'T YOU MENTION THAT FIRST? And what happened to the new password I generated? Generate a new password and try another email address. Nope. Try another email address and yet another password. Nope.

Bail on the email address and use my phone number. With a new password; how many is that now? Hmm, 1, 2, 3, 7 or so. I'm going to have to clean up all the old entries from the password safe after I verify which one actually works. Crap.

I successfully log in and look at the email address right away. F-f-f-f-f-fffff!!!! It's the first email address I used, but in all caps. The !@#$ engineer isn't doing a case-insensitive match? Holy amateur, Batman!! 

OK, I hate you Sports Authority. Have crappy service and make my shopping experience lousy and I'll do everything to avoid your store until I have to go, but hire idiot programmers and put a amateur, 1990's type experience on the web today and you have earned my disdain.

Oh, but wait!!  There's more!

Just before clicking "accept", I read the terms.  If you spend $100 within a quarter -- not any three month period, but a calendar quarter -- then you get $5.00 back. Any unused points are reset to 0 with each quarter.

Wow.  I am totally underwhelmed.

Monday, June 10, 2013

Reveal.js: Elegant presentations in the browser

This is chock full of really good stuff for browser based presentations:

Companion site for editing really cool browser based presentations:

The creator of these things:

Friday, March 29, 2013

Sandy Metz on Design

This is excellent:

Sandy talks about OO design and brings us through the thought process of how to get to loosely coupled, independent objects.  Highly recommended.

Thursday, March 28, 2013

Forecast: A great Web App

Check out this site: Forecast

That's some impressive web app for getting local, regional and global forecasts

Thursday, January 10, 2013

Code Smells & Solutions in Rails Applications

I came across an interesting presentation by Brandon Keepers at GitHub that he gave in June of 2012.  I didn't make it through the 35 minute video of the presentation, but there is also the slide deck. Scanning the rest of the presentation in the slide deck, I was delighted to see Brandon promoting appropriate separation of concerns with respect to the use of Rails and its components.

It's time to move away from Fat Models and get Domainy.  Use ActiveRecord to be the encapsulator of things specifically related to working with the database.  Build your domain model on top of that.

Gary Bernhardt of Destroy All Software fame promotes the same.

I liked Brandon's identification that test cases can illustrate where the code smells when the tests are too complex.  Spot on.