Part two in my “live”-style screencast series is now available! Watch me code up a small web app from scratch using test-driven development.
In this hour-long episode, I switch from integration testing to unit testing in order to drive out some more features for the Sinatra-based web service I’ve been building. You’ll see me:
IO.popen to pipe text through an external process.Enumerable#each_cons and enumerators to identify a sub-sequence in an Array.Pathname standard library.Here’s a five-minute preview:
If that has piqued your interest, the whole episode is available for immediate purchase.
Did you miss part 1? Get it now:
I hate underscores. They are ugly. They are like the neon orange belt pack of syntax. Dated and unfashionable no matter what era they are found in. As the former owner of a neon orange belt pack, I feel I can speak with authority on this. Aesthetically speaking, underscores are one step shy of “C:\Progra~1“.
Only nerds even know what an underscore is. What’s the first thing I have to teach people who are brand new to programming? What the hell an underscore is, and where to find it on the keyboard. No, not that line. The other line. Hold down shift. There you go.
Underscores require me to hit the Shift key. When writing prose, I only hit the shift once or twice per sentence. In Ruby, I have to hit the shift key every few letters. Awkward. Inefficient.
I’ve been thinking about rebinding the dash key to underscore in Emacs ruby-mode. It’s stupid that I’m even considering such a thing.
Underscores are visually ambiguous. When the font is underlined for some reason, the underscores get muddled up with the underlining. In badly-rendered text boxes it’s not always clear where the underscore leaves off and the bottom border begins.
CamelCase is no better. I still have to hit Shift all the time. Plus it relies on a peculiarity of the Latin family of languages.
Lisp gets it right. Lisp S-expressions have one basic rule that vastly simplifies the syntax: whitespace separates tokens. Always.
This means that “foo - bar” parses out to the three tokens “foo”, “-”, “bar”. Whereas “foo-bar” is a single token that happens to have a dash in the middle. That’s right, your tokens can have dashes in the middle. Ordinary, easy-to-type, recognizable, visually unambiguous dashes. Lisp functions have names like:
find-file
All you have give up for this is tightly-packed arithmetic statements, like this:
5*5-3
Instead, you have to give your tokens some breathing room:
5 * 5 - 3
That’s a trade-off I’ll gladly make if it means using dashed identifiers instead of underscores.
I mostly code in Ruby these days, and I love almost every aspect of its very rich syntax. But I hate all the snake_casing. I want a Ruby that lets me use dashes in identifiers. If I never type another underscore, it will be too soon.
UPDATE: The Recursive blog points out that Japanese keyboards may be more comfortable for typing Ruby.
One of the points I try to make in Objects on Rails is that you don’t need to let other libraries or frameworks dictate the public face of your objects. Just because you use ActiveRecord, for instance, to persist the state of an object doesn’t mean you have to commit that object to honoring the effectively infinite ActiveRecord model API. You can use the facilities of ActiveRecord internally to that object, but still project a tidy, well-understood, easily-substituted interface to the rest of the system.
And of course you can do this entirely by convention, by simply being careful to interact only with the methods you’ve explicitly exposed. But it’s easy to forget these conventions in the heat of implementation, gradually coupling the rest of the program to more and more framework-provided methods until one day you discover that your object’s interface surface area has become quite large indeed.
As an exercise in mindfully limiting the interface exposed by objects and classes, in Objects on Rails I demonstrated a tool called “FigLeaf“. FigLeaf gives you something akin to the “private inheritance” found in some other OO languages. While it doesn’t actually hide the fact that a class is derived from a framework class, it enables you to selectively privatize some, most, or all methods derived from ancestor classes and modules.
Here’s an example from the readme
class Post < ActiveRecord::Base include FigLeaf hide ActiveRecord::Base, ancestors: true, except: [Object, :init_with, :new_record?, :errors, :valid?, :save] hide_singletons ActiveRecord::Calculations, ActiveRecord::FinderMethods, ActiveRecord::Relation # ...
And here’s what happens when we try to send class or instance-level messages which have been hidden by FigLeaf
ruby-1.9.2-p0 > Post.find(1) NoMethodError: private method `find' called for #<Class:0xa1a4a50> ruby-1.9.2-p0 > Post.new.destroy NoMethodError: Attempt to call private method
Today I’m happy to announce that thanks to the dilligent efforts of Sammy Larbi, FigLeaf is now available as a RubyGem. You can install it with:
gem install fig_leaf
The project is also available on GitHub.
It’s important to note that FigLeaf is not intended as a hammer to keep your coworkers or your library clients in line. It’s not as if that would work, anyway; the strictures that it adds are easy enough to circumvent. Instead, it’s intended role is more along the lines of the “rumble strips” along highways which give you a jolt when you veer off into the shoulder. It provides a sharp reminder when you’ve unthinkingly introduced a new bit of coupling to an interface you are trying to keep isolated from the rest of the codebase. Then, you can consciously make the decision whether to make that method public, or find a different way of going about what you were doing.
Got questions or suggestions about FigLeaf or about OO practices in general? Please join us on the Objects on Rails discussion list!
@CapnKernul writes:
[do you know of] a Ruby idiom for converting an object to a type if it isn’t already that type. For example, if you want to only store an attribute of type Foo, you could write an accessor method that would pass any non-Foo object to Foo’s constructor.
There is a de facto idiom among Ruby built-ins to define a method with the same name as a class for doing conversions to that class. My favorite is Kernel#Array:
Array("foo") # => ["foo"] Array([1,2,3]) # => [1, 2, 3] Array(nil) # => [] Array({:a => 1, :b => 2}) # => [[:a, 1], [:b, 2]]
But there are others. Kernel#Integer provides a stricter form of integer conversion than does #to_i:
"42".to_i # => 42 Integer("42") # => 42 "30 seconds".to_i # => 30 Integer("30 seconds") # => # ~> -:4:in `Integer': invalid value for Integer(): "30 seconds" (ArgumentError) # ~> from -:4:in `<main>'
And there are also Kernel#String, Kernel#Float, Kernel#Complex, and Kernel#Rational:
String(123) # => "123" Float("123") # => 123.0 Rational(4,5) # => (4/5) Complex(1,3) # => (1+3i)
You can also find this in standard libraries. The URI library defines an idempotent conversion method for URIs:
require 'uri' u = URI("http://example.com") # => #<URI::HTTP:0x000000030cac80 URL:http://example.com> URI(u) # => #<URI::HTTP:0x000000030cac80 URL:http://example.com>
There’s also Pathname:
require 'pathname' p = Pathname("~/.emacs.d") # => #<Pathname:~/.emacs.d> Pathname(p) # => #<Pathname:~/.emacs.d>
I like to extend this idiom into my own code for idempotent conversions into commonly-used value objects. I did this in Objects on Rails for TagList objects.
module Conversions private def TagList(value) return value if value.is_a?(TagList) TagList.new(value) end end
The TagList method is shorter than calling TagList.new(...). And in addition, it’s safe to call on inputs which might or might not already be TagList objects.
Although they may look a little odd at first, capitalized conversion methods are a well-established Ruby idiom for methods which “do the right thing” to convery any reasonable input value into a desired class. And because unlike #to_x methods they are outside of the objects being converted, they incur none of the maintenance danger of a monkey-patch. I don’t define them for every class in my program; but for oft-used value object types they can be quite convenient.
I’m working on Facebook Open Graph features for a client, and developing these features requires enabling Facebook to somehow crawl my locally-served pages. I asked around for solutions to this problem, and got a pretty long list of replies. I’m listing them here for future reference.
All of these offer a pretty similar service: you download a command-line tool (often in the form of a Ruby gem), start up your server, run the command, and hey presto, your local pages served on localhost:3000 are now being served at http://yoursubdomain.example.com. Most, if not all, use SSH tunneling as the underlying technology.
A couple weeks ago I created cowsays.com, in an effort to introduce the joy of Cowsay to more people. In the announcement I talked about how I created the site over a 24-hour period (not counting some UI tweaks). What I didn’t mention was that I also recorded the entire process.
Since then I’ve been working on editing the video in my spare time, and I’m happy to announce that today part 1, (“Zero to Heroku”), is ready and available.
This video series is a raw, over-the-shoulder look at my solo development process. I narrate what I’m doing and thinking as I work, and occasionally I digress to explain why I’m making a particular decision. I’ve tried to edit out the really long pauses. But you’ll still hear a lot of “hm, what next?”.
In this first hour-long video I take the app from an empty directory up through a successful “tracer bullet” deployed to Heroku. Along the way, you’ll watch me:
Sound interesting? It’s yours for $5.
Over the coming weeks I’ll be releasing the rest of the series. I have all the video, I just need to edit it. In upcoming episodes you can expect to see:
NullDB, for those who don’t know, is a null backend for ActiveRecord. Unlike RSpec’s stub_object, rather than raise an exception on DB access, will NullDB DB interactions simply become no-ops. This is handy for things like testing after_save hooks in isolation.
Myron Marston has done a stellar job shepherding it through the Rails 3 transition, but he’s busy with other awesome projects now and has asked me to look for a new maintainer. So: If you’re interested in helping keep NullDB up to date with the latest changes to ActiveRecord, please get in touch!
This is not strictly software-development-related, but a number of developers have asked me about my experience finding and working with a remote assistant. I’ve had my assistant for a few months now and I thought I’d jot down some notes on the experience.
First, let’s get one thing out of the way. I despise the term “virtual assistant”, along with “virtual team” and “telecommuting”. I’ve been working from home for years and there’s nothing “virtual” about the work I do. The same goes for the work I delegate to my assistant. She may be “remote”, but the work is very real. This may seem like semantic quibbling, but if there’s one thing I find most developers can agree on it’s that using the right names for things is important.
This was my problem for the longest time when I would consider the idea of getting an assistant. When your time is largely filled with communication—email, meetings, calls, travel—it’s easy to see where an assistant would fit in. But for someone whose work consists primarily of making things, where would an assistant be able to help? I knew I needed to do something to lighten the load, but it wasn’t at all clear if an assistant would help.
What finally convinced me to start looking for an assistant was the problem of appointment scheduling. I’ve found myself booking more and more appointments—consultations, team meetings, remote pair-programming sessions, interviewing people for Wide Teams, or, occasionally, being interviewed for other podcasts—and the constant back-and-forth email tag to set the meetings up was stressing me out. I tried all the automated solutions. Tungle, Google Appointment slots, BookingBug, YouCanBookMe, you name it. They all sucked in their own special ways. None of them could learn my own special preferences: for instance, while a day might have six open “blocks” in it for an Open-Source pair-programming session, if someone books one of those blocks, I don’t want any more blocks booked that day.
I realized that the bottom line was that there’s just no substitute for a human being who can learn my habits and trade emails with people.
So initially I set out to get someone to handle my calendar; with the hope that once I had an assistant, I’d think up more stuff I could delegate to them. Which is exactly how it turned out.
There are a number of V***ual Assistant agencies around these days. I opted to skip them and look for someone on ODesk. I did this for a few reasons:
So I put an ad up on ODesk explaining what I was looking for an assistant. Predictably, I got a dozens of responses. I began to think I needed to hire an assistant just to go through all the assistant applicants.
Most of the applicants were in the Philippines, India, and South America, with a smattering of Americans and Europeans. Then one day I checked ODesk and was startled to see an applicant from just a few miles up the road in York, PA. Intrigued, I replied, and that’s how I met my assistant Mandy.
As it turned out, it was not purely the result of wild chance. ODesk is syndicated by various job sites, some of which localize their listings based on the location of the job poster. Mandy had seen one of these listings, and created an ODesk account to respond.
Philosophically I am sort of a combination localist/globalist: I have no problem with sending my dollars overseas to workers who need to feed their families every bit as much as Americans do. To my mind there isn’t a great deal of difference between hiring someone in Detroit and hiring someone in Korea. But I do believe in participating in the really local economy as much as I can. That is, local as in we-could-meet-up-for-coffee local. So I was excited to see a nearby applicant.
I conducted a short interview over video chat. Once we established that both of us were real people and not Internet scammers, I decided that the best way to figure out if she was a good fit was just to start throwing some tasks at her for a week or two and see how she did. With ODesk you there’s no commitment and you only pay for the verified hours worked (and you can set a weekly cap), so this wasn’t a huge risk.
Mandy has been helping me out on a part-time basis ever since, so obviously it went well.
Here’s a sampling of the work I delegate to Mandy. My biggest roadblock to hiring an assistant was figuring out what I would be able to delegate to them. If you’re pondering the same question, I hope this list will help you get a better idea of the sort of tasks you might be able to turn over to an assistant.
Here are some of the tools that have helped me work with an assistant.
Some people are going to be able to make better use of an assistant than others. If you have a simple write-code-all-day routine, you probably wouldn’t get much benefit. But if your life is more complex, with a lot of different people asking for your time, and an increasing number of administrative headaches that fall outside the core of your craft, you might find that an assistant frees up enough of your time to be worth the investment.
If after reading this far you’ve realized that you could benefit from the services of a remote assistant, I have some good news: my assistant, Mandy Moore, has authorized me to announce that she currently has availability to take on more clients. You can find her ODesk profile here. She’s relatively new to the remote assistant trade, but she learns fast, gets things done, and has been a real pleasure to work with. I wholeheartedly recommend her.
I find the subject of starting and interacting with other OS processes fascinating. A few years ago I wrote a never-completed series on the many ways to spawn off processes in Ruby:
system() However, those were all written for Ruby 1.8, and are a little out of date.
Ruby 1.9 substantially expanded and revamped the Ruby process API. Many of the tasks which once required third-party gems like Open4 can now be easily accomplished using the built-in calls. Particularly notable is that Process.spawn was added with a comprehensive set of options for customizing how the process is started, and the other standard process-starting calls were updated to accept the same set of arguments as Process.spawn.
Here’s how www.cowsays.com starts a Perl process in order to generate ASCII-art cows:
cowsay_path = Pathname(__FILE__).dirname + "../bin/cowsay" perl_path = "/usr/bin/perl" cows_path = Pathname(__FILE__).dirname + "cowsay/cows" env = { 'COWPATH' => cows_path.to_s } args = %W[-f #{@cowfile}] @io.popen([env, perl_path, cowsay_path.to_s, *args], 'r+') do |process| process.write(message) process.close_write process.read end
Notes:
@io simply points to the IO class in production. It’s an instance variable so I can write isolated unit tests verifying how my code interacts with the system. IO.popen starts a process and creates a pipe to that process, which your program can use to send data into that process’ STDIN, and read data from its STDOUT. IO.popen. If you pass a string, Ruby will start up a shell process and pass the string to the shell for interpretation. This is handy for commands like ls -l *.rb where you want standard shell-expansion to be performed. It’s also very dangerous when dealing with user-supplied data; it opens up a door for shell-injection attacks similar to SQL injection exploits. Only shell-injection is even more dangerous, since a shell injection can potentially execute any command that your server process has the rights to execute. `some-command ...`) or %x() except in little personal-use scripts. IO.popen, Process.spawn and friends: I customize the environment variables the process will see by passing a hash as the first argument. I want more Ruby programmers to know about this feature; I sometimes see code which accomplishes this effect by setting ENV['somevar'] before spawning a process and then re-setting it afterwards. Passing a hash is much cleaner. IO.spawn documentation for details. r+ as the “file mode” argument. This tells Ruby I want to read from and write to the child process. The default is read-only. process.close_write. This is very important, and something which bites a lot of first-time users of popen (it sure used to bite me!). With many programs, if you don’t explicitly close the pipe for writing after finishing your write, you’ll wait forever trying to read the program’s output. This is because the program being executed as a subprocess was written to read its input up to EOF before outputting and exiting. And it won’t get that EOF until you close the pipe for writing. In addition, the operating system may buffer the data flowing from your program to the subprocess, and calling .close_write forces that buffer to be flushed. I hope you’ve learned something new about starting processes in Ruby from this post. If you have any process tips of your own, or any burning questions about spawning processes, feel free to bring them up in the comments!
By the way, if you’re interested in finding out more about working with UNIX processes in Ruby, the Ruby Rogues book club is currently reading Jesse Storimer’s book on the subject.
If you’ve seen my Confident Code talk you know I’m a fan of the cowsay utility.
cowsay "Quack"
_______
< Quack >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
In fact, I like it so much I wanted to share it with people who might not have had a chance to try it yet. So I put it on the web.
Enjoy it for all of your ASCII-animal speech-bubble needs. The source code is on GitHub if you’re curious. Interesting implementation notes:
IO.popen to open a Perl process and generate the ASCII art. It’s a silly little app, but it’s kind of a big milestone for me personally. All my programming career I’ve worked on other people’s projects. I’ve made regular attempts to kick off projects of my own in my spare time, but invariably I’d get sucked back into day-job/client work, lose momentum, and stop in the middle. My home directory is littered with half-completed project repos.
As sad as it may sound, I think this marks the first time I’ve been able to find a small enough project scope that I could actually launch a working V1. I’d proven to myself that I could write libraries and books, but until now I still hadn’t proven I could launch an app of my own.
So, yay for me!
In this episode I talk to Louis Font of Zyncro. We talk about his internationally distributed team and how they, as a company, seek to be available to customers 24/7 no matter what time zone they are located in, solving communication gaps between businesses and social networks, and how important physical communication is in the world of remote work.
ZyncroBlog
Twitter: @zyncro
Facebook
In this episode I talk to Louis Font of Zyncro. We talk about his internationally distributed team and how they, as a company, seek to be available to customers 24/7 no matter what time zone they are located in, solving communication gaps between businesses and social networks, and how important physical communication is in the world of remote work. Show Notes: ZyncroBlog Twitter: @zyncro Facebook 00:40 - Introduction 02:22 - Louisâ background 04:20 - Distributed team structure and background 09:08 - Challenges working distributed 10:30 - Cultural differences between team members 12:00 - Zyncro as a company 16:22 - Advice for distributed teams 17:20 - Future of distributed teams
In this episode I talk to Joseph Moore of Pivotal Labs. We talk about the challenges of moving from a collocated team to being a “satellite team member” thousands of miles away. What’s especially interesting about Joseph’s story is that he still pair-programs all day, every day with other members of his team despite being remote.
In this episode I talk to Joseph Moore of Pivotal Labs. We talk about the challenges of moving from a collocated team to being a "satellite team member" thousands of miles away. What's especially interesting about Joseph's story is that he still pair-programs all day, every day with other members of his team despite being remote.  Show Notes: 00:55 - Introduce Joe 01:41 - Interview begins  01:58 - Joeâs background 04:50 - Pair Programming 06:55 - Pair Programming 100% of the time while remote 09:10 - Patience and Social Skills while Pairing 13:55 - Keyboard back & forth sharing 23:08 - Daily Pair Swapping 25:09 - Going from co located to remote (Joeâs experience) 27:18 - Daily Standups 32:01 - Daily check-ins with clients 33:56 - Social impact of going from co located to remote 36:40 - Advice for remote workers 38:17 - Type of person who can be successful at remote work 39:40 - How much of a ânormalâ work environment can be replicated with distributed teams? 40:35 - Aspects that are superior to remote versus co located work 42:00 - Remote pair programming and coworking 43:38 - Wrap Up
Hans de Zwart recently finished an experiment in which he encouraged his distributed team to “narrate their work”—to issue frequent updates to the team about what they were doing. In this article, he discusses the results of the experiment. This article was originally posted on Hans’ blog, and he has kindly granted permission to reprint it here.
A few months back I posted a design for an experiment on my blog. The goal of the experiment was to find out whether it would be possible to use a microblogging tool to narrate our work with the intention of making better performing virtual teams.
Over the last two months, the direct team that I work in (consisting of 18 people) basically participated in the experiment in the way that it was designed: They posted constant, daily or weekly updates on our Yammer network. Each update would describe things like what they had done, who they had spoken to or what issues they had encountered. Occasionally the updates were peppered with personal notes about things had happened or were going to happen after work.
There was no formal (or academic) research methodology for this working experiment. I decided to use a well-considered survey to get people’s thoughts at the end of it. Out of the 18 team members 17 decided to fill it in (in the rest of the post you can assume that n=17). The one person that didn’t, has taken up another role. This means there is zero bias in who answered and didn’t answer the survey.
I find it more interesting to zoom out and look at the methodology of this experiment as a whole. To me doing things like this is a very good approach to change in the workplace: a grassroots shared experiment with commitment from everybody working towards solutions for complex situations. This is something that I will definitely replicate in the future.
One concern that people had about the experiment was whether it would take a lot of time to write these updates and read what others have written. I’ve asked everybody how much time on average they spent writing status updates and reading the updates of others. This turned out to be a little bit less than 5 minutes a day for writing the posts and slightly over 5 minutes a day for reading them. The standard deviations where around 4.5 for both of these things, so there was quite a big spread. All in all it seems that narrating their work is something that most people can comfortably do in the margins of their day.
Designing the experiment I imagined three barriers to narrating your work that people might stumble over and I tried to mitigate these barriers:
The qualitative answers did not identify any other limiting factors.
Looking at all the answers in the questionnaire you can clearly see that the experiment has helped in giving people an understanding of what other people in their team are doing and has widened people’s perspectives:
A quote:
I enjoyed it! I learned so much more about what my colleagues are doing than I would have during a webcast or team meeting. It helped me understand the day-to-day challenges and accomplishments within our team.
and:
The experiment was very valuable as it has proven that [narrating your work] contributes to a better understanding of how we work and what we are doing as a team.
People definitely feel more connected to the rest of their team:
There was practical and social value in the posts:
A lot of people would recommend “Narrating your work” as a methodology to other virtual teams:
I asked what “Narrating your work” type of update was their favourite to read (thinking about content, length and timeliness). There was a clear preference for short messages (i.e. one paragraph). People also prefered messages to be as close as possible to when it happened (i.e. no message on Friday afternoon about what you did on the Monday). One final thing that was much appreciated was wittiness and a bit fun. We shouldn’t be afraid to put things in our messages that reveal a bit of our personality. Sharing excitement or disappointment humanizes us and that can be important in virtual teams (especially in large corporations).
Personally I liked this well-thought out response to the question:
The best posts were more than simply summing up what one did or accomplished; good narrations also showed some of the lines of thinking of the narrator, or issues that he/she encountered. This often drew helpful responses from others on Yammer, and this is where some some additional value (besides connectedness) lies.
It made me realize that another value of the narrations is that they can lead to good discussions or to unexpected connections to other people in the company. This brings us to the next question:
The posts in the private group were only visible to the 18 participants in the experiment. Sometimes these posts could be very valuable to people outside of the team. One of the key things that makes microblogging interesting is the asymmetry (I can follow you, but you don’t have to follow me). This means that posts can be read by people you don’t know, who get value out of it beyond what you could have imagined when posting. What to you might sound like a boring depiction of your morning, might give some stakeholders good insight in what you are doing.
So on the one hand it would be very beneficial to widen the audience of the posts, however it might inhibit people from writing slightly more sociable posts. We need to find a way to resolve this seeming paradox.
Based on the experiments results I would like to recommend the following way forward (for my team, but likely for any team):
I liked what one of the participants wrote:
I would like our team to continue as we have, but the important steps to take now are 1) ensuring that we stay in the habit of narrating regularly, 2) showing the value of what we achieved to other teams and team leads, and 3) ensure that there is enough support (best practises etc) for teams that decide to implement [narrating your work].
I have now taken this as far as I have the energy and the interest to take it to. I would really love for somebody to come along and make this into a replicable method for improving virtual teams. Any interns or students interested?
(This article is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Netherlands License. It originally appeared here: http://blog.hansdezwart.info/2011/07/19/reflecting-on-the-narrating-your-work-experiment/)
A discussion with Dan Menard of Macadamian, covering the importance of taking the time to build personal relationships; the advantages of having a team that’s split across time zones, the practice of distributed code review, and much more!
Announcements:
Show notes:
A discussion with Dan Menard of Macadamian, covering the importance of taking the time to build personal relationships; the advantages of having a team that's split across time zones, the practice of distributed code review, and much more! Announcements: Show notes: 03:15 - Danâs background 04:02 - History with oversea startup 06:00 - Schedule Flexibility 07:28 - Importance of relationships 09:50 - Advantages of working with teams across time zones 12:00 - Tools 14:40 - Smartboard 17:06 - Code Review 19:00 - Adjustment to working with distributed teams 20:52 - Future of working with distributed teams 21:24 - Advice to distributed groups
In this episode, an interview with John Hawkins, one of the founders of 9Seeds, a company that specializes in custom WordPress development. The 9Seeds team is fully dispersed, with every team member working from home. We talked about how 9Seeds came to be a distributed company, and why John intends never to set foot in a brick-and-mortar office again.
Show notes:
In this episode, an interview with John Hawkins, one of the founders of 9Seeds, a company that specializes in custom Wordpress development. The 9Seeds team is fully dispersed, with every team member working from home. We talked about how 9Seeds came to be a distributed company, and why John intends never to set foot in a brick-and-mortar office again. Show notes: John Hawkins is @vegasgeek on Twitter 9Seeds LLC The Event Ticketing and Affiliate Manager WordPress plugins 9Seeds sponsors WordCamp conferences
For some remote workers, leaving the office behind is a choice to spend more time with family. For others, it’s a move to an environment more conducive to focus, or a way to travel the world while still making a living. Whatever your reason for working remotely, it’s good sometimes to reflect on the joys of living and working untethered to a desk.
I asked eight remote workers to tell me about their moments of remote work zen—those perfect moments that make it all worthwhile. Here are their answers.
I really hit my work zen at home, in my office, and mainly for two reasons. The first is the ability to control distractions at home, and the second is surrounding myself with what I love. Aside from my music it’s quiet. It’s decorated with all sorts of colorful and fun things that help give me inspiration when I need it. I know where to find anything I need. I find that being able to influence your own environment is very important.
–David Browning, co-founder of Two Guys
–Sahil Parikh, Founder of DeskAway
Being able to watch my daughter’s class assembly because I can catch up the time later in the evening when she is tucked up in bed.
–Marieke Guy, blogger at Ramblings of a Remote Worker
Sitting somewhere around the house (porch/office/living room), only to have the husband/kid come up and mention that is too beautiful a day to be working and suggest we go out and do X (ride the motorcycles/ go to the beach/ swim in the pool).
Since I telecommute (and assuming that is not during a required work period), I can agree and go enjoy the beauty day with them. Work can be made up later that night.
For me the best part of working remotely is that it allows me to change my environment. There are times when I need to be heads down in a task that is monotonous and dull and there are environments that are more conducive to that. Other tasks require creativity, which is something I don’t find easy in a cube. By working remotely I can go to that coffee shop that helps me find my writing muse or one that is great for heads down productivity.
Environment can definitely change our moods and in doing so it can also change our ability to perform well. By working remotely I’m allowed to change my environment as needed to insure that I’m able to complete work in a way that is most effective for me.
–Jessica Dally, Project Manager at TechSoup
My moment(s) of remote work zen are often first thing in the morning. I have a big picture window in front of me and the sun hits the floor next to my desk. My tuxedo pseudo-kitten (8 months old) lays in it seemingly sound asleep. As the minutes pass and the sunbeam move, he slowly rolls over and over steadily following it across the room.
He never opens his eyes, but he looks comfy.
–D. Keith Casey, Jr., Chief Stuff Breaker at Blue Parabola
I love our morning skype video scrums. Often Brad and I have our daughters on our laps and Reid will bring his dog up so he doesn’t feel left out.
–Shane Pearlman, CEO of Shane & Peter, Inc.
What about you? What’s your moment of remote work zen?
In this episode I talk to Shane Pearlman of Shane & Peter, a fully dispersed software consultancy. We talked about recruiting the right kinds of people for a distributed team, and how to stay connected as friends as well as coworkers.
Show notes:
In this episode I talk to Shane Pearlman of Shane & Peter, a fully dispersed software consultancy. We talked about recruiting the right kinds of people for a distributed team, and how to stay connected as friends as well as coworkers. Show notes: Shane Pearlman is @justlikeair on Twitter Shane & Peter Check out the Shane & Peter Lifeblog Redmine Adium Coworking Freelance Camp
Remote workers such as telecommuters and freelancers often face the challenge of little- to no-face time with team members. Lack of in-person communication means one loses access and the non-verbal cues of team members, such as facial expression, body language and sometimes tone of voice. As a result, remote workers face challenges such as misinterpretation of information, lack of information due to delay in response, and low team spirit due to limited personal interaction with team members.
There are ways remote workers can overcome these challenges with different communication techniques. Knowing when to use e-mail, the phone, and instant messaging can also help everyone communicate more effectively.
Title photo “Hotline” by Grant Hutchinson
The latest and greatest news and resources for remote workers, from all around the web.
Set Up Remote Colleagues With the Apps They Need Using Ninite: Online Collaboration «
iPad 2: The Best Tablet for Distributed Teams Just Got Better: Online Collaboration «
I’ve talked about the importance of a “comms appliance” for remote workers; the iPad 2may just be the best device yet for that role.
Great article about some of the advantages of working remotely.
How to Work with Someone 12 Hours Away | Macadamian Blog
Terrific article about one team’s experience with a very widely dispersed organization.
It’s awesome when the critical path moves seamlessly from North America to Western Europe/Asia. For example, say you have 80 hours of tasks that can’t be done in parallel. A local team will need two weeks to do these tasks. A global team, on the other hand, can work separate 8-hour shifts and get them done in one week. That’s twice as fast!
It’s awesome when my code is tested while I sleep. A small team of local developers can be extremely efficient when paired with a remote QA. I spend my day fixing bugs and adding features, and by the time I come in the next morning, these issues have been tested and either re-opened or closed. Prioritizing tasks is a breeze, and we don’t lose as much time on code freezes leading up to a release.
Google Docs Turns Its Comments System Into a Conversation System – ReadWriteCloud
Implicit Communication and Virtual Teams | Leading Virtually
Really insightful article about high-context and low-context cultures, and the different ways they can react to the challenges of remote work.
This podcast is a departure from the dispersed software development teams I usually cover. I interviewed Susan Tenby and Jessica Dally of TechSoup, a nonprofit focused on providing other nonprofits with the technology they need to better accomplish their missions. One way they assist nonprofits is in helping them to use Second Life, a massive on-line “virtual world”, to collaborate and build community online.
I talked to Susan and Jessica about why TechSoup is a distributed organization, and why organizations are using Second Life to meet, network, and do their work. For someone who spends a lot of time doing remote collaboration, it was eye-opening for me to discover this whole new frontier of online interaction. After listening to this interview you may just be inspired to add a virtual world meeting space to your own remote collaboration tool box.
Show Notes:
This podcast is a departure from the dispersed software development teams I usually cover. I interviewed Susan Tenby and Jessica Dally of TechSoup, a nonprofit focused on providing other nonprofits with the technology they need to better accomplish their missions. One way they assist nonprofits is in helping them to use Second Life, a massive on-line "virtual world", to collaborate and build community online. I talked to Susan and Jessica about why TechSoup is a distributed organization, and why organizations are using Second Life to meet, network, and do their work. For someone who spends a lot of time doing remote collaboration, it was eye-opening for me to discover this whole new frontier of online interaction. After listening to this interview you may just be inspired to add a virtual world meeting space to your own remote collaboration tool box. Show Notes: Susan Tenby is @suzboop on Twitter Jessica Dally is @jessicadally TechSoup is @techsoup on Twitter Nonprofit Commons is @npsl on Twitter. A video about NPSL's work in Second Life Second Life Hypergrid Business, a blog devoted to "enterprise users of virtual worlds" Community Voice Mail 5PM project management tool Evernote HootSuite BaseCamp