Remote Work

While Spark::red has offices, we are primarily a distributed team, and as we continue to grow more and more of our team will be geographically separated from one another.  So the topic of remote working and distributed teams is an important one for us, and one I’m personally invested in.  I feel that there are significant advantages to both working in an office (collaboration, communication, culture, and more) and working remotely (freedom, focus, no commute, and more), so I do both.  I work from the Spark::red office outside of Boston 3-4 days a week (unless I’m traveling) and work from home 1-2 days a week.  As you may have read in several previous blog posts, I am also experimenting with one month or longer remote working situations.

Why Remote?

There are several reasons that Spark::red embraces the remote working approach.  It’s both something that we want to do, as well as something that we have to do.

For employees near a Spark::red office, being able to work from home as well can be a great perk. You can balance the pain your commute with the benefits of being in the office.  You can stay home if the plumber is coming by.  You can work from Boston if you have an appointment in town and don’t want to get stuck in rush hour.  You can visit your family in another state and still work as needed.  So it’s a benefit that many of our employees appreciate and take advantage of to differing degrees.

The type of person that we want to hire as we continue to grow is rare.  Our focus is ATG Oracle Commerce, which is a very small niche, so it’s difficult to find people with the right experience and skill set to join our team.  As a small company performing important work for large clients, it’s also imperative that any team members are amazing.  I know there’s a strong backlash against terms like “rockstar”, “ninja”, “A level”, etc… but there’s always going to be a wide spectrum of talent, experience, motivation, and effectiveness.  Spark::red can’t afford anyone who isn’t a GREAT team member, both from a effectiveness standpoint, but also from a cultural fit.  Find a person who fits is hard, and it’s impossible to find everyone we need from a single city.   We need to be able to hire the right people, regardless of their physical location.

Our clients’ sites are 24x7x365 operations.  They need to be supported, monitoring, maintenance, and improved at all hours.  Our clients are spread coast-to-coast in the United States, as well as multiple other continents.  Our global client base is growing, and is likely to be one of our largest growth areas in the coming years.  As such we need to be able to provide support, and not just emergency support, over a wider range of the day.  Deployments, support tickets, and alerts can happen from the early morning to the late night.  The more geographically diverse the Spark::red team is, the more of this can be accomplished by people working normal hours.  When you’re up until 4 AM helping a client with a deployment, you can’t be at your best the next day.  If that deployment can be done by someone 8 or more hours behind you on the globe, then it’s easier to provide better service.

The following three points drive home the fact that embracing and supporting a geographically diverse team is important for Spark::red’s growth and success, both from a team member happiness and from a client satisfaction standpoint.

The Struggles

Having a remote team comes with a unique set of potential difficulties, both hard and soft.  It’s worth doing, but you need to be mindful of the risks and have plans, tools, and processes in place to address them.

The “hard” issues are technical, procedural, or quantifiable and range from things like “how do you handle it when someone has a problem with their laptop and they live thousands of miles away from the nearest office?” to “how does the team communicate effectively?”  How are tasks managed, progress tracked, support and mentorship given, how do you make sure people know what’s going on in the company around them without overloading them with a river of distracting updates and information they don’t actually need?

The “soft” issues are more around corporate culture, interpersonal relationships and communication, maintaing and evolving the company ethos and soul.  They are hard to measure and harder to solve.  Also, everyone is different.  Everyone works differently, and is motivated by different things.  So don’t expect everyone to want to work remotely, or for it be effective for them, or for a given set of tools/ideas/processes to work equally well for everyone.

How Spark::red is Working

Spark::red has two main offices in Redmond, WA and Chelmsford, MA, employees who split their time between an office and working from home, as well as employees who live thousands of miles away from the nearest office.  Our tools and processes are certainly a work in progress and by no means are the end-all-be-all approach you should adopt, but there’s some good stuff going on here.

We use Campfire for group chat.  We have several standing rooms, for internal teams, for clients, for random chat, and also create rooms on demand for projects or topics as needed.  The chatroom provides a good way for large numbers of people to interact, but it can be as interrupt driven as you let it be.  You can check the rooms each time a new message is posted, or only look when the chime means your name was mentioned, or just glance over when you’re not in the middle of something.  Or you can just sign-out for a while, and when you get back into Campfire you can scroll back through and see what you missed.  We use Flint as a Campfire client instead of using the web app.  We can also use it on our phones and iPads so if we’re  not at our computer and need to ask something, or check in on something, it’s easy.

After an amazing presentation by the Streaming Eagles from GitHub at the FutureStack 13 conference last month, we’ve started using video chat for one-on-one discussions and some small group chats as well.  We’ve played with several different tools for video (google hangouts, FaceTime, and currently are using Skype.  I hate the Skype application, but it’s video quality and reliability under sub-par network conditions have really made it work for us.  The video chat gives you a much more natural conversation style, and makes it clear that on the other end is a real person, with real feelings, and a real life, and I think it makes people less likely to be snarky or miscommunicate.  This is still an experiment in progress, but so far I think it’s good.

We use Jira for task tracking.  It makes it easy to hand off a task to another person or another team, providing the full history of the task and current status.  We use Confluence for a wiki.  We use DropBox for sharing files.  We’re starting to use Evernote as well for collaboration and notes.

While we don’t do development (agile or not) we are doing a daily scrum call with the entire company.  We quickly go through what we’ve done, what we’re working on today, any blocking issues, if we need help from anyone, etc…  It’s 15 minutes well spent and gives everyone a good idea of what’s going on, let’s people ask for help, and gets everyone “together” virtually.  As our team grows internationally it may become harder to involve the entire team at any given timeslot.

We do some inter-office travel and office visits.  Getting people to meet, talk, work, and hangout in person provides huge benefits in their long term working relationship and communication effectiveness.  We’ve done a company all-hands summit, and that’s something I’d like to make an annual event, although it’s tougher to do now that we have more clients and more daily support need.  This is something I’d like to figure out better.

We have a lot to learn still, and I don’t think we’re doing things as well as we could be, but we’re connately trying to improve how we work and how we work remotely.

Go Forth and Work!

I think most companies would benefit from allowing, encouraging, and empowering their employees and team to work remotely.  The big cons are pretty easily solvable and the pros are significant.  I would love to hear what you’ve found works or doesn’t work around working remotely.  I’m constantly looking to improve what we’re doing and try new things.

Jira to OmniFocus Integration

At Spark::red we use Jira extensively for internal projects and tasks, for alerts and issues, and for handling client support requests.  It’s a great tool.  I also use OmniFocus for other types of tasks: personal, errands, write an email to so-and-so, create a proposal, etc…  What that’s left me with is two separate to-do lists, that I have to check separately, which is a pain.

I finally started looking at possible integrations between the two tools, and I found several scripts that sync Jira tasks into OmniFocus.  Unfortunately every single one I tried didn’t work.  Either my version of Jira was too new (5.1.5), or my OmniFocus is too new (1.10.5), or my Ruby is too new, or various Ruby Gems wouldn’t install correctly, or the integration required massive additional library/software installation.

So while I was stuck in the San Francisco airport a few nights ago waiting for a very delayed flight home, I hacked up a simple Ruby script that does what I need it to do. I’ve never written anything in Ruby before, so it’s probably terribly written, but it works!  I have it running every 10 minutes as a cron job on my laptop.

What it does is two things:

It pulls back all unresolved Jira tickets that are assigned to you and if it hasn’t already created a OmniFocus task for that ticket, it creates a new one.  The title of the task is the Jira ticket number followed by the summary from the ticket.  The note part of the OmniFocus task is just the URL to the Jira ticket so you can easily go right to it.  I chose not to pull over the full description, or comment history into the task notes as it’s usually more than I want to see in OmniFocus.

It also checks all the OmniFocus tasks that look like they are related to Jira tickets, and checks to see if the matching ticket has been resolved.  If so, it marks the task as complete.

Very simple.  The Ruby code is straight forward and it should be easy to modify to do other things to meet your specific needs.

You will need to install a few gems

gem install rb-appscript json

You’ll need to edit the configuration values at the top of the script (please note this current version does not hide/encrypt your password), and then save it somewhere.  I have mine in /Users/devon/bin/ but you can put it anywhere.  Then you can add a cron entry to run it every 5 minutes or 10 minutes or whatever you need (it will take a minute or so to run so don’t make it run too often).

You can use crontab -e to edit your user crontab and create an entry like this:

*/10 * * * * /Users/devon/bin/jiraomnifocus.rb

That should be it!  If it doesn’t work, try adding some puts debug statements and running it manually.  I can’t offer any support, as I don’t know Ruby that well and just magically cobbled this together:)

Tools and Processes for Work

For the background on this, please read my first post – Tools and Processes

While my work includes a lot of email, con-calls, proposals and contracts, the relevant tools and processes are covered in the previous post.  Here I’m going to focus on the technical aspects of my work: writing code, managing servers, and troubleshooting Java applications.

Let’s start with Eclipse.  Eclipse is a Java based IDE (Integrated Development Environment) that I use for writing code, editing code, debugging code, interacting with SVN, analyzing JVM heap dumps for memory leaks, remote debugging applications and much much more.  Many people feel that Eclipse is too heavyweight but for large Java applications it is the best tool I’ve found for the many jobs involved with developing and maintaing applications.  I use many Eclipse plugins such as Subclipse for SVN support, eGIT for GIT support, Mylyn for task integration with Jira (and many other ticket systems), MyEclipse for lots of neat things, and many more.

For SSH I use iTerm which has several advantages over the built-in OS X Terminal application.  The one I use the most is the ability to send the same keystrokes to many tabs at once.  This means I can login to 15 servers, and run the same set of commands on all of them at the same time, and only have to type things once.  When you’re managing more than one box (say 300-400) this is a life saver.

I use Flint as a Campfire chatroom client for all of our company communication both internally and with clients.  I also use Skype, especially when traveling abroad.

I use the Thread Dump Analyzer for analyzing thread dumps from stuck or spinning JVMs.

I use Textmate for text editing and reading log files.   While Textmate can be a very powerful plugin driven development environment in its own right, I’m only scratching the surface and using it for basic text editing.  One feature I use frequently though is it’s regex support in the find and replace functionality.  Regexes can be an amazingly powerful tool for getting the data you need from a log file, or converting a spreadsheet into Apache redirects.  Having this all work in a GUI text editor with undo support, is nicer than using awk or sed on the command line, at least for me.

I use OpenVPN with a two factor auth system for securely accessing our systems from anywhere in the world.

There’s a lot more than I use but these are the big ones.

When I start my laptop it boots up the following: Dropbox, Evernote Helper, OpenVPN, Skitch Helper, RescueTime, CloudApp, Flux, Timebar, and Quicksilver.  On my Dock are Adium, Mail, Safari, Textmate, Calendar, OmniFocus, iTunes, Pages, ActivityMonitor, iTerm, Eclipse, Evernote, and Flint.

So there you have it.  How do you work best?  What tips have made a difference for you?  Let me know if the comments or just email me.

Tools and Processes

I’ve been working with computers since I was a kid.  The longer I’ve been using technology on a day to day basis, the more integral to my daily life it has become.  Laptops, cell phones, tablets, the internet, web applications, the cloud.  I am quite reliant on tech at this point, my I use a pen so infrequently that my handwriting, never good to begin with, has gotten so rusty I can barely read it.  But it’s also made many improvements in my life and work.  I am constantly refining my tools and processes to improve my work and life.

I want to document some of that here.  I’m going to break things into two sections: the first is work/life, around productivity, organization, and assistive technology; the second is the technical part of work, development, server management, etc…

Let’s start with the basics.  For many reasons, I’ve adopted an Apple-centric platform.  If you prefer Windows or Linux that’s fine too, I don’t want to argue about operating systems.  One thing I will say is don’t be cheap. Select the hardware and software which is the best for your needs.  It’s an investment that will pay off many times over.

I have a 15” MacBook Pro with 16 GB of RAM and a fast SSD drive.  At home and the office I have large external displays, wireless keyboards and trackpads.  The extra screen real estate of the external display is amazingly useful for many of the tasks I perform for work.  The laptop means I can travel easily, from the office to home, to San Francisco, to Mexico, to visit clients, etc…  The RAM and SSD make it possible for me to do what I need to do for work, effectively and quickly.

I also use an iPhone and iPad.  The Apple environment means I get lots of data and application synergies between my phone and my laptop, etc… iCloud, iWork, Keychain, and much more allow me to have the information and applications I need anywhere and everywhere.  My calendar, address book, web bookmarks, and more.

I use Apple’s default calendar, address book, and email applications.  They work well for me, sync between all devices, are available on the web if needed, and require no special installs.  I use OmniFocus for task management as my todo list.  OmniFocus isn’t cheap at $79, but it is a well written applicaiton which provides great support for the GTD workflow, or just works as a simple todo list.  I like the GTD approach of contexts and projects, with sequential tasks.  OmniFocus lets you flag high priority tasks and set due dates easily.  It syncs between my laptop, phone, and tablet, so I always have access to quickly add something I just remembered or to see what errands I need to run while I’m out.

I strongly believe in Inbox Zero, i.e. having no email in your inbox.  Whenever I have mails in my inbox it creates stress for me.  They represent tasks, todos, things that need to be read, replied to, handled, etc…  Having them sitting there creates a mental load, and is yet another place to manage my tasks.  If an email can be filed, or quickly replied to, I handle it immediately.  I need to work on limiting my email handling to only periodic checks, to reduce the level of interrupts during the day.  Anything that represents a task or todo list, goes into OmniFocus.  You can even file an email, and drag it to an OmniFocus task, so for instance if someone emails you and you need to write up a proposal and send it back to them, you can file the mail in the Sales folder, create a OmniFocus todo “Create and send Proposal”, drag the filed mail to the todo, and then when you work on the todo, you can just click on the mail icon on the todo item, and it will open the email for you to reply to.  It makes things very easy.

I file my email into many folders.  I don’t like Gmail and never really got into using tags.  Search is helpful, but I prefer folders so I can more easily find what I’m looking for even if I don’t know the right search string.  To make this easier I’ve just begun using MailHub, which analyses the contents of your mail folders, and then guesses where a new email should be filed, allowing you to file it correctly with one click instead of dragging to or selecting a mailbox manually.  It seems like a small thing, but when you’re handling 200+ email a day it saves a great deal of time.  It also has other features, but that’s the most important one for me.  It’s similar to the DevonThink auto sorting technology.

I use Evernote for note taking, web page clipping, blog post writing (like this one), and generally capturing and organizing information.  Again it syncs to all my devices so everything I need is available everywhere at anytime.  I use the Web Clipper all the time to capture blog posts I want to read later, grab technical how tos, and make PDF documentation easily searchable and available offline.  I take call notes that I can share with my team, I keep personal notes large and small, it’s currently full of almost 700 notes and growing quickly.

I use DevonThink for long term storage, and scanning towards a paperless life.  I scan all my bills, notices, etc… using a ScanSnap hooked up to my iMac, to suck everything that used to live in my filing cabinet or would live in my filing cabinet in the future into DevonThink.  It’s all OCRed, searchable, and auto-organized. It can also sync to my laptop and has a mobile app.

Evernote is short term information, things I want to read in the near term – and DevonThink is the long term archive.  A blog post about presentation techniques goes into Evernote, my paid electric bill goes into DevonThink.

I use Timebar for pomodoro style focus sprints where I’ll spend 30-60 minutes focused on a single task, and then get a break.

I also use RescueTime.  This application tracks everything you do on your computer and lets you know two important things:  How much time did you spend on your computer, and how productive was that time.  Facebook isn’t very productive, Email can be productive, writing a presentation/application/proposal is very productive.  Spending 14 hours a day on the computer if your’e only 50% productive means you could be doing an 8 hour day if you can be 87% productive.  I average 70-80% productive currently.  When I first started using RescueTime it was much worse.  You don’t realize how much time you waste online.  RescueTime makes the truth clear and is very motivating.  I love pushing that number up!

That’s a high level summary of how I manage email, todos, and information.  These tools and techniques are designed to reduce stress and increase my productivity.  I will talk about the work side of the house in another blog post.

Installing GitLab on RedHat Enterprise 5 RHEL 5

GitLab is a free (they also have a paid enterprise version) and open source software package to make managing a Git server easier.  It provides a nice web admin, detailed user and group permissions, and much more.  I looked at gitolite however I was unable to get it working correctly after several frustrating days, and GitLab looked like a more refined option with better documentation and support.

The only problem is that all the installation documentation is geared for Ubuntu, and doesn’t work well with RHEL 5.  I’ve fought through some of the issues and have it working.  I wanted to share some of the steps I had to take to get it playing nicely with RHEL 5.  Many of these steps may also apply to other Linux systems with older packages.

Python - The default Python install is too old

yum install python26
yum install python-docutils.noarch
unlink /usr/bin/python2
cd /usr/bin/
ln -s python26 python2

Ruby - The default Ruby install is too old

yum remove ruby
mkdir /tmp/ruby && cd /tmp/ruby
curl --progress | tar xz
cd ruby-2.0.0-p247
make install

rm /usr/bin/ruby
ln -s /usr/local/bin/ruby /usr/bin/ruby

gem install bundler --no-ri --no-rdoc
gem install rails

Install Gitlab-Shell

sudo su - git

git clone
cd gitlab-shell
git checkout v1.7.1
cp config.yml.example config.yml
# Edit config and replace gitlab_url with something like ‘‘  and change paths from /home/git to /opt/git
emacs config.yml

Install MySQL and Setup

yum install mysql-server mysql mysql-devel mysql-libs
/etc/init.d/mysqld start
mysql -u root
CREATE USER 'gitlab'@'localhost' IDENTIFIED BY ‘password';     
CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';

Upgrade ICULIB (RHEL5 is too old)

as root:

yum install  gcc-c++
svn export
cd release-52-1/source
chmod +x runConfigureICU configure install-sh
./runConfigureICU Linux/gcc
make check
make install

Install GitLab

Follow the install docs and good luck!!!