Along with every other hacker on the planet, I got into programming because I wanted to write games. It wasn’t long at all, though, before I learned that the greatest game of all is teaching the machine to do your will and get things done. I lost interest in game development pretty quickly and moved on to systems and application programming.
My son J. is almost 16, and he wants to write games too. However, in his case I have reason to believe he’s a lot more serious about the “games” aspect than I ever was. So I’m trying to put together a curriculum with an emphasis on game programming. This is a little tricky, since it’s a sub-field I have little connection to.
Here’s what I have so far, with many thanks to the folks on Twitter who helped me narrow down the list: (Book links include my Amazon affiliate code.)
Learn to Program, by Chris Pine. While I already have him working on Hackety Hack, I honestly hesitated to make Ruby his first language. Ruby is a programmer’s language; it has an enormous amount of syntax and many ways to do something. I worry that, as with C++, it will make learning the basics more difficult because it will be hard to separate the fundamentals from the incidentals.
After thinking about it for a while I came around, though. My reasons:
I suppose Javascript would fit the bill as well, and has the advantage of being ever-so-accessible inside the nearest browser. That said, for all that there is a beautiful language hidden in it, Javscript has more than it’s share of warts. I think in some ways Javascript might have even more of a fundamentals-obscured-by-incidentals problem than Ruby. Tough call though; I could definitely see starting with Javascript, especially if the student were most interested in programming for the web.
Land of Lisp, by Conrad Barsky. A timely book: it’s our next Ruby Rogues book club book. It’s about Lisp, which I want to give J. early exposure to, for ever so many reasons. And it’s about writing games. Win!
C Primer Plus, by Stephen Prata. For someone interested in web applications I might wait C until much later. But if it’s games you want to build, you simply can’t avoid C. Eventually you’re going to find yourself writing OpenGL or DirectX code. Even if you’re writing it in a higher level language, chances are the API documentation will be for the C/C++ API, so a basic understanding of C is essential.
And anyway, a little C goes a long way towards understanding just what the hell the computer is up to.
Blender Foundations, by Roland Hess. J. is particularly interested in modeling. I don’t know jack squat about 3D modeling, but I know Blender is free, Open Source, and widely used. I suspect I won’t need to give him much guidance in this area beyond giving him the tools he needs to get started.
Some C++ book, TBD. I suspect this will be a necessity for understanding later OpenGL texts and working with various game SDKs. If he does well with the earlier languages I’ll probably give him Accelerated C++; or maybe I’ll just go over the basics with him myself without resorting to a text.
OpenGL SuperBible: this one seems to come reasonably well recommended. And honestly I would love to learn some OpenGL along with him.
That’s what I’ve got so far. Any other suggestions?
Let’s say we want a helper method #build_fuzzy everywhere we have a collection of socks.
Sock.build_fuzzy # => #<Sock type: "fuzzy" id: nil drawer_id: nil> sock_drawer.socks.build_fuzzy # => #<Sock type: "fuzzy" id: nil drawer_id: 123>
At first we might think to put it in an a collection extension module:
class Sock < ActiveRecord::Base module SockCollectionHelpers def build_fuzzy build(type: "fuzzy") end end # ... end
Now we have to remember to add it to every Sock association:
class Drawer < ActiveRecord::Base has_many :socks, extend: Sock::SockCollectionHelpers # ... end
And we also need to include it in Sock:
class Sock < ActiveRecord::Base # ... extend SockCollectionHelpers end
…but this doesn’t work:
sock_drawer.socks.build_fuzzy # => #<Sock type: "fuzzy" id: nil drawer_id: 123> Sock.build_fuzzy # => Raises no method exception for Sock.build()
And anyway, we want this to be available globally without explicitly extending associations.
Next, we try adding a class method to the Sock class. Since ActiveRecord association proxies delegate missing methods to the assoication class, it seems like this should work.
class Sock < ActiveRecord::Base def self.build_fuzzy build(type: "fuzzy") end # ... end
This is a complete failure. While the association does forward the .build_fuzzy call to Sock, once in the call it is operating in the context of the class object, which as we saw before has no #build method.
sock_drawer.socks.build_fuzzy # Raises no method exception for Sock.build() Sock.build_fuzzy # => Raises no method exception for Sock.build()
However, a slight change makes everything work as hoped:
class Sock < ActiveRecord::Base def self.build_fuzzy scoped.build(type: "fuzzy") end end
Now when we call #build_fuzzy on the class it builds a fuzzy sock unassociated with any drawer, and when we call it on an association it builds a fuzzy sock with the appropriate drawer ID set:
Sock.build_fuzzy # => #<Sock type: "fuzzy" id: nil drawer_id: nil> sock_drawer.socks.build_fuzzy # => #<Sock type: "fuzzy" id: nil drawer_id: 123>
All this thanks to the #scoped method, which is aware of the current scope.
Thank you to Dan Kubb for figuring this out for me.
UPDATE: Fixed def build_fuzzy to be def self.build_fuzzy in the last two examples.
Several people have asked about my self-publishing process. I’d really like to write something comprehensive about this, along with code/scripts/config for my whole build stack, but I haven’t had time yet. Until that time, here are some notes on tools I use.
I can recommend all of these tools to anyone looking to self-publish a technical book. I also recommend that anyone thinking of doing this read Jeremy McAnally’s book on the subject; it has a lot of good advice on how to plan, structure, write, and sell an eBook.
The Ruby community has some diversity challenges. I don’t think the Ruby community is any more biased than other tech communities; if anything, I think Rubyists are more apt to make a big deal over offensive content which would be considered business-as-usual in much of the traditionally white-male-dominated tech industry. Which, ironically, may make us seem like a hotbed of scandal.
As a community we also like our colorful gem names. A little while back someone wrote a blog post about some of the more questionable naming choices. Which got me thinking about one of my own gems.
The gem in question is HookR. It’s a library I wrote a few years ago for adding event hooks to arbitrary classes and objects.
The name amused me at the time. Actually, let’s be honest, the name still amuses me. But I’m also concerned it could be offensive. Not in an overt, groping-bottoms-at-a-conference kind of way, but in that insidious way that monocultures tend to be subtly threatening to outsiders without even realizing it.
As I personally read it, it is not gender-offensive since “hooker” is a gender-neutral term. However, it is potentially offensive to sex workers. And anyway, as I’ve noted before, ultimately I’m not the one who gets to decide which of my statements are offensive.
So my question for you: is HookR an offensive name? I realize it’s an unconventional, non-enterprisey name; that much I’m OK with. But is it offensive? Is it amusing, or is it off-putting?
And if you do find it problematic: can you suggest a better name?
Software development is a wonderful field to be a noob in. Perhaps more than any other discipline, there is a wealth of information available for free online–everything from fundamental computer science courses, to the night-by-night learning notes of a master programmer. And, of course, there are millions upon millions of lines of Open Source code free for the reading.
Unfortunately, this embarassment of riches can be as much stumbling block as well as a stepping-stone. You can learn a lot from this information overload, but you can also waste a great deal of time and find yourself with very little to show for it. Personally, I’ve probably wasted thousands of hours in this way over the years. It’s only recently that I’ve come to identify the antipattern behind this waste. I hope that in writing this I can help you to avoid my mistakes.
The pattern usually looks something like this:
Oh man, this web programming stuff is HOT! I need to get in on this!
Let’s see… if I want to program for the web, I’ll need to learn a programming language better suited for the web. And I don’t want to get stuck with on that sucks, so I need to pick the very best one. Research ALL the languages!
[insert 3 months of reading about Perl, Python, Ruby, and PHP and maybe writing one or two "hello world" examples]
OK, my “hello world” was totally better in Blub than in any of the other languages. But now I need to pick the right web stack for my awesome app ideas. Subscribe to ALL of the blogs!
[Insert three months of voraciously reading web programming blog articles.]
I’ve been reading some of these blogs, and while it seems like everyone is using “Ruts”, it has almost become passé now. Some of the more obscure competitor frameworks look a lot cooler. I’ve read all of their design rationales, and despite the fact that I’ve never written an app in Ruts, I totally agree with their critiques. Yeah, I don’t want to to be stuck in a 6-month- old outmoded framework like Ruts.
Also I need to remember to use the “Box Turtle Pattern” that everyone is talking about.
No wait, now they are realizing Box Turtle doesn’t scale, and the Elephant Plop pattern is the way to go. Man, why did we ever think Box Turtle was a good idea? Whew, glad I hadn’t started my app yet. Dodged a bullet!
Oops, no, looks like Classic Box Turtle coding is making a comeback with a vengeance. Man they are totally right, when you do it correctly it’s way more robust than Elephant Plop.
Gosh, what a vibrant community! These advances are hard to keep up with! When am I ever going to find time to write code?
Oh man, this smartphone programming stuff is really heating up…
Maybe you mastered web programming long ago, but if you’re still learning at all there’s probably some technology that you’re at this point in. Maybe you’re like me and right now it’s client-side JavaScript frameworks. You know it’s there, you know you’re interested, you know where to find out more information about it. And you know that there are a lot of alternatives, and that despite the overwhelming amount of information available it isn’t at all clear where to start.
Without further ado, here is Avdi’s autodidact guide to learning a new programming technology:
This is the framework I’m going to try to stick to, going forward. If you decide to try it, please let me know how it works out for you.
Tim Bray has an article up about static versus dynamic languages, and why he finds the static ones less annoying for Android programming than for web programming. It’s a good article.
Something I’ve noticed over the past few years of web programming is how it’s slowly becoming more like the systems/realtime/embedded programming I once did. Not exactly like it, but similar.
In the early days the difference was stark: as Tim points out, the stereotypical web app is an input/output machine. Requests go in, responses go out. Everything you do in a web app occurs somewhere in between receiving a lump of data and pushing out another lump of data. You don’t have to coordinate multiple threads; the app server does that for you. You don’t have to worry about race conditions; database transactions take care of that for you. It’s a black box: data goes in one end, different data goes out the other.
The big difference Tim sees between web programming and device programming is the number of APIs you typically have to deal with:
- Touch-screen interactions.
- Telephony.
- More radio interfaces, potentially: WiFi, NFC, and BlueTooth.
- A GPS and compass and maybe altimeter.
- Audio gear, including speakers and a microphone.
- A camera, with a sensor and lots of controls.
- An accelerometer.
- Last but not least, a vibrator.
The thing is, web programming is starting to look more and more like this, as web programs become nodes in ever more complex constellations of services.
And much like the many data busses embedded programs have to coordinate (RS-232! USB! Ethernet! 1553!), often each of these external services requires a slightly different kind of impedance-matching code in order to talk to it.
What’s especially reminiscent of systems programming is that any one of these services can fail. In the primordial web app, a failure of the hardware hosting the app, or the database backing the app, is Not Your Problem. The request either works; or it has a software bug (which is your problem); or the platform fails (which is some poor overworked sysadmin’s problem). But when your app depends on a half a dozen services, any of which could crash, or get really slow, or go just plain wonky at any time, you have to start thinking about failure modes and exception safety and sanity checking and periodic self-tests.
I’m not sure if this new “cloud systems programming” will prompt a resurgence of interests in static languages. But I think it is causing a lot of programmers to rethink how web programs are designed. And a lot of the new thought is eerily familiar. For instance, a lot of web programmers appear to be rediscovering that RPC is a terribly leaky abstraction whether done via UNIX domain sockets or HTTP, and why systems that exchange fire-and-forget messages are almost always preferable.
On the whole, I’m excited about the challenges of heavily interconnected web applications. Yes, it brings with it a lot of the headaches I thought I’d left behind in the systems programming world. But these are interesting problems to solve. And there are few better feelings as a programmer than looking at a system happily humming away, knowing that inside there is an intricate dance going, dozens of inputs being handled and coordinated and dispatched, all according to your careful choreography.
The Ruby community has seen a renaissance of interest in classic Object-Oriented thinking lately. We’re talking about Presenters, and DCI, and Data Objects. But with these new discussions come new problems. Namely: the dreaded pattern terminology debate. He says it’s a Decorator. She says it’s an Adapter. Who is right?
Well fret no more, because I have devoted literally tens of minutes of effort to creating a solution to all of these nagging semantic questions. I give you: the Design Pattern Classifier. Give it a chunk of code, and it will tell you, to within 0.001 of a Dijkstra (the universal measurement unit of software correctness), the name of that pattern!
Enjoy, won’t you?
Configuring Omniauth for GitHub authentication is easy enough. But I needed to optionally add extra permissions to the authentication token. I eventually figured it out, but since I had to piece the steps together from various sources, I thought I’d document what I learned.
A basic Omniauth GitHub setup looks like this:
Rails.application.config.middleware.use OmniAuth::Builder do provider :github, github_id, github_secret end
That just gives you a basic read-only authorization, however. If you want to go beyond that, for instance to update user details and manage repositories, you have to pass a “scope” option. The value of the option must be a comma-delimited string of scope names.
Rails.application.config.middleware.use OmniAuth::Builder do provider :github, github_id, github_secret, scope: "user,repo" end
Available scopes include user, public_repo, repo, and gist.
That’s all you need if you always want the same set of priviledges. But what if you want to authenticate some users with more priviledges than others?
The answer lies in the Omniauth “setup phase”. You can pass a :setup option to an Omniauth provider, with a proc which will be executed before the authentication is performed. Inside this proc you can query and alter the request environment. The Omniauth wiki has some basic documentation on how to do this.
I wanted to be able to pass an optional “role” parameter to the /auth/github action, with an app-specific meaning which would be used to determine which scopes to request. In order to encapsulate this logic I specced-out a GithubAuthOptions class:
describe GithubAuthOptions do subject { described_class.new(env) } context "given no special role" do let(:env) { Rack::MockRequest.env_for("/auth/github", params: {}) } its(:to_hash) { should be_empty } its(:to_hash) { should be_a(Hash) } end context "given a shopkeeper role" do let(:env) { Rack::MockRequest.env_for("/auth/github", params: {'role' => 'shopkeeper'}) } its(:to_hash) { should eq(:scope => 'repo') } end end
I wrote the following implementation:
class GithubAuthOptions def initialize(env) @request = Rack::Request.new(env) end def to_hash if 'shopkeeper' == @request.params['role'] {scope: 'repo'} else {} end end end
Finally, I added GithubAuthOptions to my Omniauth initializer:
Rails.application.config.middleware.use OmniAuth::Builder do # ... provider :github, github_id, github_secret, setup: ->(env) { options = GithubAuthOptions.new(env) env['omniauth.strategy'].options.merge!(options.to_hash) } end
The net result: if I redirect a user to plain /auth/github, they will be authenticated using the standard, read-only scope. But if I redirect them to /auth/github?role=shopkeeper, they will be authenticated with the “repo” scope as well, giving the app the ability to manager their public and private repositories.
The latest Smalltalk-to-Ruby translation in my SBPPRB archive is “Dispatched Interpretation”. It’s one of the bigger ones I’ve tackled so far. I’m not going to go over the whole pattern here; for that you’ll just need to buy a copy of Smalltalk Best Practice Patterns :-)
However, one potentially interesting snippet is this one:
class Object def if_false self end end class TrueClass def if_true yield end end class FalseClass def if_false yield end def if_true self end end
This is another take on Smalltalk-style method-based control flow. Specifically, the following Smalltalk idiom:
aPredicate ifTrue: [ ... ] ifFalse: [ ... ]
The key difference here from our last foray into Smalltalk-style flow control is a special implementation of #if_true on FalseClass, which ignores the given block and instead returns itself. This enables a call to #if_false to be chained onto the #if_true call, and the #if_false defined on FalseClass then yields to its block in order to execute the negative case.
On the flip side, if the initial object is true, then TrueClass‘ #if_true method is hit, which yields to the given block. It returns the result value of the block, which, assuming it is not false, will respond to #if_false with the do-nothing method we defined on Object. There is an obvious bug in the case where the block given to if_true does, in fact, return the false constant. I’ll leave fixing that bug as an exercise to the reader.
Bugs aside, the upshot is a chained call idiom which looks not unlike the Smalltalk keyword argument version:
object.if_true{ puts "true!"}.if_false{ puts "false!"}
As with some of the other Smalltalk-in-Ruby articles, I put this forward as a curiosity. If you really want to use method-based flow control pervasively, Ruby might not be the best language for it.
A few people have asked for recommendations of good foundational Object Oriented Programming texts. The truth is I’m kind of behind on my formal OOP reading, and some of the early texts I read I wouldn’t recommend. My first proper OOP book was Object-Oriented Analysis and Design with Applications by Booch, and while it’s not a bad book, I remember it being awfully dry.
Honestly, most of what I know I learned from surfing WikiWiki. It’s still the best source of collected software development thought on the planet, albeit not the most organized. I highly recommend killing an hour or hundred link-surfing WikiWiki.
I haven’t read all of it yet, but Object-Oriented Software Construction, by Bertrand Meyer, is probably one of the better guides out there about how to think of the world in terms of objects with well-defined responsibilities.
I can wholeheartedly recommend Kent Beck’s Smalltalk Best Practice Patterns. It masquerades as a book about Smalltalk, but it’s really a book about how to write clean OO code all the way down at the method level.
I have a long list of OO books I’ve been meaning to get to. I hear good things about both Domain-Driven Design and Growing Object-Oriented Software, Guided by Tests. I’ve always wanted to read some of Rebecca Wirfs-Brock’s work, such as Object Design: Roles, Responsibilities, and Collaborations, as well as Uncle Bob’s take on the subject. Speaking of Uncle Bob, his Ruby Midwest keynote piqued my interest in Ivar Jacobson’s book on use-case driven OOP.
Obviously, this list is far from comprehensive. So I’d like to open the floor: what books do you consider essential first-level Object Oriented reading material?
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/)
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!
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.
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
- working from home so I can take frequent breaks to play with my little baby…
- working from a coffee shop on a sunny afternoon for a couple of hours
–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.
- In the car, tethering my phone to my laptop, while also talking to a customer about an urgent issue, run through the fix/test/check-in/deploy process, while my wife drove me and the kids to Grandma’s house.
- After picking up a sick child from daycare and comforting/medicating them, knowing that I can get back to work later, and be able to take care of my family, and meet client deadlines at the same time.
–John McCaffrey, Rails Developer, blogger at Ruby on Rails Performance Tuning
What about you? What’s your moment of remote work zen?
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.
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
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.
“It becomes clear that the best employees are the ones not stuck in traffic,” he said.
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.
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.
When you don’t occupy the same office for the same period of time every day with your co-workers, you can’t walk to your co-worker’s desk, or turn around in your chair to have a chat about what you’re working on. There is no water cooler to mill around get in the loop on what’s happening, and having lunch together is difficult. Differences in location, timezone, and working hours, can all combine to make you and the members of your team disconnected from each other.
This disconnect is difficult for both sides: it’s easy for work to be duplicated, or misunderstood. It’s also easy to get lost in details and disappear when your teammates might have helped you with some of the problems you were having trouble with. None of these problems are insurmountable: they are all easily solvable with a few tools and practices that are easy to adopt. The practices outlines in this article will help your team communicate more effectively, and help everyone feel better connected to their co-workers.
When working on-site, you have a very well defined start to your day: arriving at the office. When working remotely, it’s possible to find it difficult to get started, or find that you don’t really know where to start, or not know what related tasks others may be working on. One way to encourage everyone to have a clear idea of what’s going on around them is to have a quick daily team meeting. This will allow everyone to catch up with their teammates, and is a great first step to encouraging active involvement in the project.
For a co-located XP team, we would have a Stand Up, and there’s no reason a remote team can’t do the same. Of course, the details are slightly different. Some enjoy starting their day with the daily meeting, because it gives them a clear idea about what they should be working on, and how it fits with what their co-workers are working on. A remote team with members in many timezones will probably have to pick a time for a daily meeting that is not first thing in the morning for everyone, but that overlaps the working day for as many people on the team as possible. In XP, we call the meeting a “Stand Up” because we have the meeting standing up to remind everyone that it should be kept short. With remote work, few people are standing up, so extra care and attention may have to be paid to keeping the meeting a reasonable length.
There are many tools that can facilitate this, and unfortunately none of them are great. Skype, or a conference call line, is a good way to have a voice call. If you want to spend some money in order to see your teammates’ faces, you can purchase a product like Adobe Connect which allows many people to video conference in a window that looks like the opening of the Brady Bunch. Regardless of which time or tool you use for your meetings, the act of having the daily meeting is a huge benefit to all members of the team.
One of the things that I advocate for all distributed teams is to have a group chat forum. An IRC room may work just fine for you, but requires additional tooling to allow team members to see discussions that took place while they were offline. Web based tools like 37signals’ Campfire provide private chat rooms, at a relatively small cost. There are also Campfire applications for desktops and mobile phones that allow you to improve on the user experience of the web site, or take your team on the road with you.
Once you have a group chat, it’s important to use it. While I’m not a fan of hard “rules” and strict “process”, your group chat should be made a part of the culture. To encourage participation, make it fun and light. It doesn’t always have to be about work. It’s much easier to feel connected to the rest of your team when you get to know them on a personal level. Talk about the weather where you are, what you’re doing after work, and link to the great articles you’ve read that help you improve your skills at your job.
Perhaps you have an office with only a few remote people, or half of your team is in a single office, it’s still important that the group chat become part of the team’s culture for everyone. This will allow some of the “in office” staff to enjoy some of the same freedoms that the remote workers enjoy, by enabling them the communication tools to work from home from time to time without missing any of the discussions. It will also ensure that the remote workers don’t feel left out, or less important than those who are in the office.
Mailing lists are another great tool for communicating. Open Source projects, which are some of the best examples of successful distributed teams, have been using them for decades to communicate. Mailing Lists aren’t as immediate as group chat, but they give you a way to contact all members of your team in a way that you know will be read and internalized.
Mailing lists are great for things that are important for everyone to see, not just the people who are at their desk right this second. For instance, you might write about an appointment that you have to go to and will be away from your desk: “I have a colonoscopy tomorrow, so I will miss the morning meeting and be unable to sit for the rest of the day.” Another great use of a mailing list is to describe a new idea, or something you’ve found in the code, in a way that everyone gets to see at a time that is convenient for them. Such an email might start out like “I just looked at our five slowest tests, and they all use the FooBaz class, so I profiled it and here’s what I’ve found.”
A team mailing list may not be for everyone. For especially small teams, or for teams who all work on a fixed schedule in the same time zone, they may be a bit heavy. Mailing lists are just one of a number of tools that can be utilized to make remote working easier and more enjoyable for everyone involved.
In a traditional office, you can generally find out what your co-workers are up to, what kinds of problems they’re solving, and how you might help them through passive interactions. The water cooler, walking down the hall, or sharing a table at lunch all provide additional interactions with your co-workers that remote members don’t get. Non-verbal cues are also easier to pick up on when you’re in the same physical location, but are completely lost in remote working situations. You may notice that your co-worker is puzzled by a problem, or frustrated by something, simply by observing their body language, hearing their cursing, or dodging the thrown chairs.
Yammer is a tool for providing Twitter- or Facebook-style status updates. Yammer is closed to groups, so only the people you allow in your group can see your status updates. This allows nice bite-sized communication that is less invasive than group chat or instant messaging. Yammer is great for simple “heading out for lunch”, which will let your co-workers know you’re away from your work without being invasive. When working through a problem you might write “wishing I had a widget that could frobnicate this foobar”, and a co-worker who knows of such a widget might see this and help you out.
One of the benefits of status updates over group chat, is that it’s non-intrusive. It’s meant for broadcast communication, that won’t make your co-workers feel like they need to be present for the conversation before it goes away. It has some benefits over email in that the statuses are smaller bite sized thoughts, which can be ignored if needed, but contain valuable information if you want it.
Team members feeling left out is one of the biggest costs of a remote working team. In order to get the most out of our remote working environment, we have to encourage interaction. The resulting team will be stronger, and more effective as a result. There are many other tools and practices that teams can adopt to help them be more effective, this article just touches on the basics.
In this episode I talked to Sahil Parikh of DeskAway.com, a web-based collaboration tool for distributed teams. This is another episode recovered from near-disastrous technical malfunction, and as a result all of my audio has been re-dubbed. Thankfully, Sahil's insights into he advantages of a dispersed team have been fully preserved.
One day early in our marriage, the topic of dead baby jokes came up on a mailing list my wife and I were subscribed to, and I was startled to see her go into bloody-minded rage in reaction. I thought the humor was in bad taste but I didn’t understand the violence of her reaction. At this point my wife had children from a previous marriage, but we had yet to have any children together.
Nowadays, having helped birth two babies, one of which came out with an umbilical cord around his neck and needing some help in the breathing department, I understand her reaction perfectly. My first, instinctive reaction when someone makes jokes involving harm to children is to gut them with a bowie knife then and there. Then I remember I live in a civil society and decide that perhaps reporting them to the cops as a psychopath might be sufficient. Eventually I calm down and settle for regarding the speaker as a sadly defective human, and hope optimistically that he or she will eventually grow out of it.
Parenthood changes a person at a very basic level. But that’s not what this post is about. The point is that everyone has something which is Not Funny. Even comedians have their limits.
One of my longtime favorite shows—even though it’s been years since I watched it regularly—is South Park. What I love about Matt and Trey’s sense of humor is that it is relentlessly, aggressively, fair. They make fun of everyone and everything. Liberals. Conservatives. Gays. Straights. Jews. Athiests. Muslims. Scientologists. Kids. Adults. The magic of South Park is that one moment you’ll be having a belly laugh and the next you’ll have an appalled look on your face saying “woah, too far, man, too far. And you know that somewhere, someone else is watching the same show and saying the same thing—only about the parts you found hilarious. And laughing at the parts you found objectionable.
Humor is just one of those things that humans do. I’ve heard that EMT humor is some of the blackest there is; the kind of humor which would make a corporate ethics officer’s head explode. Does that make EMTs bad people? Hardly. Thank goodness for them. If it helps them get through the day, I don’t care what kind of depraved car-wreck jokes they are telling while they wheel me into the ER.
Which brings me to the subject of Sensitivity. I worry a fair amount about being sensitive. I question my own actions and try to get outside opinions. I sometimes yell at people for being insensitive and driving away diversity when we should be embracing it. I rage at my computer screen to see the casual misogyny of privileged male nerds.
But for all that, I don’t feel like I fit in with the Sensitivity people. Lately I’ve been reading /r/ShitRedditSays, a sub-reddit where people highlight the misogyny, racism, homophobia, and general douchebaggery that shows up reguarly on Reddit (as it does in any open online forum). And it’s certainly instructive. I’ve learned some things about subtle bias, about casually throwing around words like “rape” denatures them and desensitizes readers to the true infamy of actual rape.
But at the same time, I find around 50% of the tasteless comments that are linked to as exhibits of bad behavior to be laugh-out-loud funny. Even as I acknowledge that they are insensitive. And I realize that to the other members of /r/ShitRedditSays, these things are simply Not Funny. They are beyond the pale.
Now, I suppose this could just mean I’m a bad person. But I think it speaks to a difference in philosophy. I don’t want a world where we defeat bigotry by being perfectly polite and sensitive to every possible background. I want a world where we defeat bigotry the South Park way: by telling filthy jokes about each other until we all finally realize that human differences are, fundamentally, hilarious. Not wrong. Not shameful. Just really fucking funny.
I do think we need to be sensitive to context. That’s why I worry about subtle misogyny and racism in the land of software engineering. It’s one thing to have a room full of men and women of all races and backgrounds laughing about each other’s differences. It’s a very different thing to have a room full of men—and a lone woman—where the men are all telling “slut” jokes. It’s not that slut jokes are Wrong. It’s the the context which makes them threatening.
Unfortunately, I feel like a lot of people aren’t able to make this distinction of context vs. content. One the one side you have people who, when you tell them that now is not the time and here is not the place, think that you have no sense of humor and want to censor them in all contexts and on all topics. And on the other you have the watchdogs of sensitivity, many of whom seem to think that perfect equality is a world where nobody ever has cause to blush. And I worry that the twain shall never meet, and that I’ll be somewhere in the middle, a stick-in-the-mud to some and a neanderthal to others.
And then God saw the man's spirit, and was afraid. And he gave the man Craft, so that the man would be distracted from his calling. And he gave the man family, so that he too would know fear. And finally he gave the man pride, so that the man would never again recall his true name.
I think I’m pretty well on record as far as my feelings on police. I think it’s a job description that naturally attracts bullies, the last sort of person who should be given power over people. I, personally, despite being about as law-abiding a person you might hope to find, have had nothing but bad experiences on the rare occasions I’ve been forced to deal with them. I think the militirization of our police forces and rising use of SWAT teams against nonviolent, sometimes innocent, civilians is appalling. I read Reddit, and see stories almost daily of police abuse of power. I know from the public record and from reading frank interviews with police officers that police will protect their own, sometimes to the point of framing innocents if it means keeping a fellow officer out of trouble. I think the automatic characterization of police as “heroes” is stupid.
I am not a fan of the police.
That said, I’ve been seeing some really dumb stuff said about the police lately, and it’s getting to be a bit much even for me.
Let me be clear, I’m opposed to the use of police force to break up law-abiding exercises of free speech. If someone’s sitting in a public park holding a sign which is not obscene by local standards, having a cop come and pepper-spray them and drag them away is Not OK.
In recent days, however, the Occupy movement has started going beyond plain speech. It has begun organizing shut-downs of public transit facilities like buses and subways.
In this post I’m going to confine my comment to the use of police force against protesters deliberately breaking laws or ordinances by obstructing public services or right-of-way. I.e. civil disobedience.
The way civil disobedience works goes like this:
Imagine you are a city administrator. Your job is to make sure that the city functions smoothly. If you fail to do that, money is lost, people are aggravated, and there will be hearings calling your competence into question.
You have certain tools at your disposal for accomplishing this task. If a water main breaks, you send in the Public Works people. If people block traffic or transit, breaking the law in the process, you send in the police to clear them out.
Let’s say you’re confronted with the latter situation Here’s how you would go about creating a bloody disaster.
Here’s what you do if you want to avoid that scenario. You send in cops dressed like these guys:
Scary looking, aren’t they? One of my friends called them “stormtroopers”, a moniker which, historically, misses the mark a bit.
These cops are dressed in riot gear. Frightening as it looks, this is actually a Good Thing as far as keeping things (relatively) nonviolent goes. These are cops that know that unless things get really out of hand, they aren’t going to be badly injured by a stray rock or elbow. These are cops who are prepared to take some blows without immediately reaching for their sidearms. In short, these are cops who probably aren’t going to start shooting people.
Assuming a) the law is being broken, b) people are causing a public nuisance, and c) these guys have been lawfully directed to round up those people, I’m actually happy that they look like extras from Equilibrium, sans automatic weapons.
Imagine you are charged with non-lethally breaking up an act of civil disobedience. We’ll assume you can’t just ask them nicely to leave; that would kind of defeat the purpose of civil disobedience. In civil disobedience you don’t put up a fight, but you also don’t comply with official directives to go away.
So here you are with a bunch of people in front of you that you need to cause to not be where they currently are. True, you could go to each protester one by one, read them their rights, and physically haul them in jail. And at a lot of protests this is exactly what happens.
But I have to imagine that this doesn’t scale above a certain size. And anyway, the costs involved have to be high. How much does it cost taxpayers to arrest, haul away, charge, process, and incarcerate one hundred people for a night? One thousand? It can’t be cheap.
Given those parameters, warning the protesters you will use tear gas if they don’t move on, and then using it, seems like the pragmatic thing to do. It gets the job done fast, no one is permanently harmed, and the city is saved a lot of money.
This is a fair question. Why not just leave them alone and let the city route around them for a while?
Well, again, if you’re in charge of a city, leaving obstructions alone is pretty much exactly what people expect you not to do. People are losing time, money, and patience, and they expect something to be done about it.
But there’s a bigger problem. You can’t just ignore the protesters. If it goes on long enough, sooner or later some fed-up commuter is going pitch a rock at a protester and before you know it you’ll have a real riot on your hands. So if you leave the protest be, you still have to keep a police line around it 24/7. This, again, is not cheap.
Since Occupy has explicitly declined to come up with a specific list of demands, that’s not a possibility right now.
The use of police does not make the US a police state. In an actual police state, you are arrested before you get as far as creating an actual protest. And if you somehow do manage to protest, you get shot or put away for life.
If you expect civil disobedience to occur without any police force used at all, you clearly didn’t read the label. This is how the civil disobedience game is played, and as far as I can tell everyone is playing their parts admirably. The protesters are getting their voices heard on national TV, the cops haven’t killed anyone, nobody’s been carted away to mass detention camps. Considering that the way this sort of thing has been handled through most of history (and still is, in many countries) is to just start shooting people until they clear the streets, I have to reluctantly say to the cops involved: this time, you done good.
Yeah, so I can’t avoid this any longer. Time to start creating jobs.
I need an assistant. His or her roles will be many and varied. Certainly they will include managing my calendar. Eventually they may include all sorts of secretarial tasks.
Actually, the biggest skill I’m looking for is the ability to be creative and proactive about figuring out how they can help me. I’m not very good at delegating; I tend to look at all the stuff I do and think “I couldn’t possibly delegate that”. Or, worse than that, there’s stuff I’m sure it hasn’t even occurred to me to wonder if I could delegate it.
So I’m looking for someone who can think up new ways to help me. Beyond that:
Anyway I’m probably going to put this up on ODesk or one of the other sites that specailizes in this sort of thing, but if you know someone trustworthy and deserving, let me know.
Sometimes one of my kids gives me the great big bambi-eyed look
because I'm going downstairs to my office instead of staying and
playing with them, or some similarly microscopic tragedy. And I can
barely stand it.
I mocked the Occupy Wall Street protesters recently; not because of their aims but because they were protesting. You might reasonably conclude from that that I consider their efforts misguided and pointless. This is not, however, the case, and understanding why involves explaining just how weird things are in my head.
One of my many core philosophies is one which I suppose is called Humanism. I believe (among other things) humans must do what humans do. A big part of self-actualization is simply doing that which you are compelled to.
From my perspective, I don’t think the protesters are accomplishing as much towards their goals as they might by, say, starting local businesses which create jobs in their home towns. On the other hand, the experience of simply being at OWS may be a turning-point in a lot of their lives. That experience will stay with them to the end of their lives, shaping their thoughts, coloring how they see themselves and others.
So what is, from one curmudgeonly perspective, a waste of time, is also an absolutely vital point in the personal growth of thousands of people.
From one perspective, they “should” doing something else. From another perspective which I hold equally valuable, they are exactly where they should be, doing exactly what it is best for them to be doing.
This sort of thing goes on in my head all the time, and it makes debating points… interesting. Most of the time I just automatically pick out one perspective that clashes with that of the person I’m talking to. What most people (understandably) don’t get is that the one thing I’m really arguing against all the time is failing to see the world from many angles at once.
Ah! So you don’t actually think they are wasting time, you just wish they’d realize that they are really there for themselves.
No, and that’s where it gets really hinky inside this brain box of mine. I think an essential part of many formative experiences is the beliefs we bring into them. Go to the mountaintop believing you will be transformed, and you will come down a new person. Otherwise you might come down as simply “a person with blisters”. Go to OWS believing you are part of changing the world, and your whole perspective about the world and your place in it may be shifted and expanded.
So forget what I said a couple paragraphs ago; I don’t even want everyone to see the world from many angles! Sometimes it is essential to their humanity to see it from only one. Sometimes it is essential for me to be only one of the many different philosophers living in my skull.
I’m just using OWS as an example; for all I know they turn the tide of public policy and prove my assertions about the outward utility of their movement completely wrong. More power to them.
The point I’m making is a more general one, which is just that my head is a confusing place to be, and I often find my full perspective on anything impossible to express.
And there are the meta-level perspectives, for instance: the realization that this is an incredibly fucking pretentious piece of writing I’m typing out right now. And so on… but I’ll cut it off at that.
So I guess it’s generic protest season again? Seems to come around every couple years. I apologize if I sound dismissive; it’s just that these unprecedented, revolutionary outbreaks of nonpartisan grassroots activism seem to happen on a pretty regular schedule.
Then again, I’m over 30, so you should probably take what I say with a grain of salt. You can’t trust people who remember more than two electoral cycles.
I used to march. Where, when, and the topic under contention is immaterial. The important thing is that I realized eventually that protests are good for exactly two things:
This second point is worth expanding on. It’s amazing what protests will bring out in people. You could go to Washington and protest against armpit fungus, and I promise you at least five dyed-in-the-wool armpit fungus supporters would crawl out of the woodwork just to counter-protest you in the strongest, most Godwin-invoking terms.
And then the capitol police would come and break it up and prove how DC is in the pay of the BO lobby.
Actually, there’s a third reason to protest: to build popular and international sympathy for your cause. Unfortunately, there’s a catch: this one only works if the police come and kill you. And even then chances are the U.N. will just issue a Strong Condemnation and adjourn for bon-bons.
“That’s not fair! We’re being discussed on CNN!”
Mm-hmmm. So does the Bedroom Intruder guy. Best case scenario, $PROTEST_SLOGAN becomes a bullet point in the next campaign cycle, used by someone who initially courts your demographic and then leaves you miserably disappointed.
“You’re just a cynic! Step aside and let positive thinkers change the world!”
I protest! I’m not a cynic. I’m an optimist. I suspect you’re going to win, for certain values of winning, only it may take longer than you want, and it might be more despite you rather than because of you.
The thing about protesting is that it’s fun, and it’s easy. The worst thing that will happen to you is you get taken away in a paddy wagon and become eternally exalted in your social circles as a hard-core freedom fighter. More likely, though, the worst hardship you’ll encounter is having to hold your pee in for a really long time.
Protests are also lazy, and profoundly negative. It’s virtually impossible to hold a positive protest; you have to have an enemy to put together a proper protest; otherwise all the energy drains out of it. Jon Stewart and Steven Colbert tried to hold an apathetic rally, but the lack of energy didn’t last. The idea that we all actually work together pretty well, for the most part, is one which is hard to get excited about. Much easier to focus on that bastard who just took the last slice of cake.
Anger is easy, and satisfying, and you can get it all out at once and have time to grab a beer afterwards. Then you can wait for the anger to have it’s expected effect—pie for everyone, or whatever. And if it doesn’t, you get to be angry again!
Positive action is hard, because you have to make a plan, and then stick to it for days, weeks, or years. You have to take personal responsibility for it, and and you have to actually pay attention to the results and adjust accordingly.
I don’t want to be hand-wavey about positive action; but this article is running long already and I have kids to put to bed. It warrants a whole entry on it own anyway.
So I’ll just leave you with this teaser thought: how many people are involved in (insert protest here)? What would happen if every single one of them named two unique individuals affected by (insert travesty here) and, instead of focusing on their powerlessness and the idiocy/corruption/malevolency of the people responsible, focused 100% of their energy and attention a specific plan of action to make those two victims' lives better?
At some point in my childhood, I remember suddenly realizing that it was weird not to look people in the eye while speaking to them. From that point on, I studied how other people made eye contact, and attempted to mimic it. I tried to learn how to do it just enough, without doing it so much that it becomes creepy.
I still can’t make eye contact when I’m thinking hard, though.
Without going into too much personal detail, I’m fairly certain I have autism spectrum disorders in my family. And I believe I inherited them to a small degree. There were times in the past I probably could have gotten myself diagnosed with Asperger’s syndrome. But I was only ever affected to a small degreee, and through a series of conscious choices, like that choice to learn to make eye contact, I’ve arrived at a point which at least appears relatively “normal”.
It’s a strange thing, though… I can feel it in my blood. It’s like having a kooky uncle living in the attic of my own head. Being socially appropriate is still an act of conscious intention for me sometimes, and I don’t always succeed.
The connection between the autism spectrum and the field of computer science & engineering is pretty well established by now. I think we’ve all either known, or been, That Guy: the guy that just doesn’t get social interactions the way most people do.
Hell, a decade or two ago we were all That Guy, as far as the rest of the world was concerned. Then something remarkable happened: the world learned to respect us geeks, and we got better haircuts and better t-shirt and got laid.
Well, at least some of us did. We’re all rock stars now. Except the ones who aren’t. And I worry that in the rush to hipness and relevance, some of us nerds have tried to distance ourselves from That Whole Scene; that scene being the one where people with acne and very bad hair obsess over technical minutiae to the exclusion of all other concerns.
I don’t think everyone has the opportunity to make the same choices I did; nor do I think the choices I made were objectively “right”. It’s not wrong to be socially inept. But it can make life a lot harder.
The thing is, the true neckbeards are often also the true innovators. By all accounts Steve Wozniak was/is in that category; fortunately for him he had a good friend and business partner who was more than able to do the talking and glad-handing and occasional ass-kicking.
For every hundred lifelong dorks obsessing over something that no one else will ever care about, there’s an RMS writing the next GNU system.
I guess the point of all this is that sometimes I see someone technically brilliant say something incredibly socially inappropriate, and I think “that could easily have been me”. And I worry that some of my other fellow geeks are so eager to distance themselves from the “bad old days” that they’ll (rhetorically) throw him under the bus just as readily as a jock laughs at an awkward kid with a pocket protector.
We can’t all be cool kids. Some of us can’t even manage acceptability. I hope when I’m old and my brain has crusted over and say loud and insensitive things without realizing, or talk over and over about that one technical breakthrough I had that no-one ever appreciated, or otherwise make a nuisance of myself, that there will be a few people willing to shake their heads and smile and hang around me anyway.
Well and here we are. You sway
with a beat I cannot quite
catch and I am horn rimmed and black socks and
tennis shoes
A few friends have asked, in light of the obvious toll it’s taking on me emotionally and financially, why I’m “on tour” this year. It’s a good question. I’ll come to the answer in a somewhat roundabout way.
These days I am chiefly concerned with sustainability. Specifically, family sustainability. There have been way too many times in the last decade when I had to anxiously watch our bank account balance, praying that my paycheck would clear before the rent payment cleared. And a few too many times when a job dropped out from under me, and I found myself scurrying desperately for work.
I am not much for equanimity. I did not enjoy these times. In fact, if stress is as bad for one’s health as they say, these periods probably noticeably shortened my lifespan.
There are some standard rules everyone knows for increasing sustainability. They include:
As a family we’ve hammered pretty hard on all these points over the past few years. But at some point I realized that there is a sustainability rule which trumps all of these:
We live in an uncertain world. One major medical event (just as an example) can wipe out years of saving and debt elimination. The closest thing we have to real security is our community: our family, our friends, our associations, and our business contacts.
I’ve come to the conclusion: more important than money in the bank is the knowledge that no matter what happens, I can always find work.
Last year, I submitted talks to a few conferences and had most of them rejected. This year I submitted talks to just about every Ruby/Rails conference in the US and, to my great astonishment, saw almost every one of them accepted. I’ve had the opportunity to speak at an average one conference per month this year.
That’s one hell of an opportunity to meet people.
I’m not so cock-sure to believe that this is something which will happen every year. Conference tastes could change. The popularity of Ruby and Rails will eventually fade. People might get sick of hearing me yap. The Software development economy could tank. And I might not always be free to travel: I might find myself with a new baby to care for, or locked into a particularly time-consuming job.
So I decided to strike while the iron is hot, as it were, and make this the year I flit about hither and yon, speaking, listening, meeting people.
It’s been rough, but also fun. I’m a born introvert, so the constant socializing is draining. On the other hand, I’ve always loved travelling. It’s expensive, and hell on my ability to consistently get billable hours in, and it has meant putting a lot of personal projects on hold or at least on very low priority. But it has also been profoundly inspirational, meeting longtime programming heroes as well as smart, passionate, but lesser-known developers I might never have had the chance to know otherwise.
As I’ve said to everyone who asks, I’m only doing this once. Next year I’m keeping things a lot closer to home.
Bottom line, it’s an investment. I hope I’m right about it. I think I am.
Much as I dream of a more genteel age of modern airship travel, I'm a
pretty happy jet traveler. I get the feeling I'm the minority in this.
It seems popular to complain about flying.
The point of these measures is retribution against a single villain who allegedly escaped the severe penalty she deserved. But a law specifically aimed at preventing a repeat of today's notorious case will almost certainly be irrelevant to the shocking crime of tomorrow. In these instances, the unforeseen and surprising are the norm.
Our politicians ought to be the mature voices of reason saying "yes, we feel outraged too, but we shouldn't change the system based on one outlier". Instead, as often as not they are the ones pandering to the mob.
The sad thing is that those parents probably encouraged him to get the loan in the first place.
Originally a comment, but it’s worth saying here:
I really, really don’t get it the angst over Netflix price increases. Well, I get that people don’t like paying more for things. But this is ridiculous. Netflix is still an insanely good deal compared to anything else out there (hello, remember spending ~$4 for every single rental???). Not only that, because all of their streaming deals with studios are expiring, Netflix is about to go from having licensing costs in the hundreds of millions to having to spend $1-2 billion/year on licensing to the studios. That money doesn’t come out of thin air. I’m actually surprised they are able to keep the price increases as low as they are.
How soon do we forgot that Netflix slew the crappy video rental chains, and then broke open the market for streaming video of major studio content? Hell, even now their only real competition in that department is Hulu, a service that charges you a monthly fee for full service but still forces paying members to watch ads every few minutes.
Cut Netflix some slack. $8/mo for unlimited, legal, ad-free viewing of their entire streaming video catalog is still fucking amazing, and $16/mo for that plus video rentals is completely reasonable and still a zillion times better than the $4 2-day rentals we used to get from blockbuster.
Honestly, people.
Just a PSA, because apparently some people STILL haven't received
and/or acted on this memo: NEVER, EVER use the same password for
different online services, ESPECIALLY services like E-mail that
contain private information about you. Use separate passwords for
email, Facebook, Twitter, etc. Preferably long, random passwords with
letters, numbers, and symbols.
Offended by the title? Find it to be disrespectful of an entire class of humans? Well then, you should understand why I think the CNN editorial piece on parenting, currently making the rounds on Facebook etc., isn't worth reading past the title. Let alone making a reasoned comment on.
When the online response to this weekend’s screening faux pas grew to a howl, the TSA issued the same statement it’s issued dozens of times since its founding: "We have reviewed the circumstances involving this screening and determined that our officers acted professionally and according to proper procedure."
Again, it's not about some vast government power grab. It's about what *always* happens when you give thousands of people a secure government job, a little training, almost total authority, a mandate to protect but not to serve, and assurance that you'll back them up even when they misbehave.
I know I mope a lot, and it’s important to take note of the positives where they occur.
We just marked a major milestone in our family history: we bought a new family car.
This is a Big Deal for us for a number of reasons. For one thing, having a Suburban and (more importantly) the big family to justify it has been my dream and plan since I was in my teens.
It’s also a big deal because for more than a year, we haven’t had a vehicle big enough to seat everyone—-severely curtailing our ability to have family outings and trips.
But it’s an even bigger deal because it marks the first time we were able to plan, save up, and buy a car outright: no new loan payments to drag down our monthly budgets. Yes, it’s 11 years old and needed a lot of work to pass inspection, but it’s ours now, free and clear. It’s one more victory in our war on debt and our mission to live more frugally and sustainably. From now on, if all goes well, we will never take out another car loan—-just make planned, budgeted purchases like this one.
Next step: farm in the country!
Hating your child's behavior is like saying you don't love the part of your child that wants to behave that way. To love unconditionally, you must find a way to love the behavior, too.
I try to remember this when Kashti screams in frustration at blocks that won't stand up right or train tracks that don't fit together. Do I hate the screaming, or love the drive to build things which leads to such frustration? His frustration at being stymied is not so different from mine when my computer stops responding. Do I hate myself for being frustrated?
Right around Occoquan VA, after caravaning through steadily degrading
road conditions for a few hours, we realized we had to rethink our
plans. With the roadside being increasingly festooned with spun-out
cars and traffic moving at as much as 10MPh, the goal of reaching
Florence, SC in the early evening was looking less and less
achievable. Our cars were decidedly not snow-rated, and the report was
that conditions would steadily worsen over the next 300 miles.
It's fun watching the very beginning stages of Kashti and Ebba
recognizing each other as playmates.
Kashti is at just the right age for the Christmas lights - he was
quietly entranced the whole way through. Ebba seemed to enjoy it as
well.
Yesterday I taught Josh to wrap a present, and then later he made
dinner while I assisted.