I spoke at StirTrek a few weeks ago and they did me the service of recording my talk. It is
entitled jQuery & 10,000 Global Functions: Working with Legacy JavaScript and I present it here for your perusal.

The talk consists of a discussion on where legacy code comes from, some good strategies for dealing with it, some bad
strategies to avoid, and lots of specific techniques more specific to JavaScript.

The slides for this talk are on
SlideShare
and, given that there is a lot of code on them, they might be a handy reference. Check ‘em out.

In preparation for this talk I put together an exercise foolishly thinking I might have time during the talk to
actually do some coding to provide some more concrete examples. I ran out of time but
the exercise is still out there if you want to practice some of
these techniques.

I also plan to record a series of screencasts where I show off some of these techniques against this repository. Watch
for those here or on my YouTube channel.

I find myself back in ruby land for a bit and it was time to help some of my
co-workers get RVM running on Mavericks. Having recently figured this out (and
needing to share it with more co-workers) I figured I’d share it with everyone.

These instructions will show you how to install RVM on Mavericks for a single
user. And, it’s all pretty easy so no worries. We can handle this.

First off, make sure you don’t already have RVM. Just look in your home
directory and make sure there is not a folder called .rvm.

$ ls ~/.rvm
ls: /Users/guy/.rvm: No such file or directory

If there is a folder called, this you can either remove it (scorched earth,
baby!) rename it, or go find another blog post on how to repair it.

Now, install RVM.

$ \curl -sSL https://get.rvm.io | bash -s stable

Once this is done you can verify everything is installed by checking the .rvm
folder.

$ ls ~/.rvm
...lots of stuff...

Hooray! It’s installed. But it doesn’t work. Well, that’s because we ain’t
done. You also need to add some stuff you the end – and this is import –
the end of your startup scripts. If RVM finds that it is not at the top of
the $PATH environment variable it’ll work but nag you like an old lady. Just
put it as the end.

I put them in .bashrc but you might put them in .bash_profile. Just make sure
they are the last thing to execute. Remember. Old lady.

One of the people I have the distinct pleasure of working with at
Pillar is Dan
Wiebe. He loves to code more than anyone I have
ever met. He is smart, focused, and just ever so slightly crazy.

And every Tuesday evening Dan goes to prison.

No, he’s not on work release. He’s there to teach about a dozen inmates how to
code. In all fairness, Dan isn’t actually teaching them to code, they are doing
that themselves. However, he is there to provide direction, experience, and
wisdom. He is there to provide the perspective of the outside as it relates to
coding, to help give them a skill that they can use if and when they get out,
and – I think – more then anything to provide them some hope.

Prisoners are people that much of the world wants to turn their back on. If
people think of them at all they assume that they are all “bad people” and they
deserve to be there. I can’t refute the argument that they deserve to be there
as, in many cases, it is true. However, in my experience, there are no “bad
people”. There are only bad choices. And when you start to interact with
prisoners you quickly realize that the number of steps between you and them
really isn’t that many. A bad choice or two and you could end up in the same
place as them.

My father spent time in prison when I was a kid. He made plenty of bad choices
and I know for a fact that he deserved the time he spent in prison but I would
never say that he was a bad man. He wasn’t even my biological father, but he
raised me as his own and cleaned up his life because of his love for me and my
sister.

In most cases, prisoners will be released one day and they need to be able to
function in society. They will need a job. They will need to be able to work
with others. Technology may have passed them by while in prison and they will
need time and assistance in adjusting.

My cousin spent ten years in prison. I remember when his sister and I first
picked him up. We gave him a cell phone so he could talk to his mother. He kept
moving the cell phone from his ear to his mouth and back again because he
didn’t understand how the microphone could pick possibly up his voice without
being in front of his mouth. He had never used a phone without a handset.

While in prison my father got sober and it helped to keep him that way. While
in prison my cousin studied horticulture and was able to get a job within weeks
of getting out. They were able to do this because people were willing to go
inside and help them.

So, last month, I decided to help Dan and go to prison too.

Fortunately, Dan has a good forum for introducing people to working with
prisoners. He calls it “Coding in the Clink”. In a sense it is like a
Coderetreat in prison. Lots of people gather for the
day to practice their skills. There is food provided. We test drive our code.
We pair.

But the pairing is always aligned prisoner to visitor. The prisoners code with
each other all the time, they need an outside perspective. A visitor could pair
up with another visitor any time they wanted. There is no reason to come to
prison to pair with someone you could meet with at Panera.

The format is also different. The coding is in Java for reasons Dan explains
elsewhere. We normally
pair on a machine for an iteration and the next pair on that machine picks up
the code where it was left off instead of deleting and starting over. At the
end of the day we come back to our original machine with our original pairing
partner to see how the code we started changed over the course of the day.

Also, we do not code the Game of Life as the longer format requires a longer
exercise. At the Coding in the Clink that I attended, I was quite please to be
working on the Evercraft Kata
that George Walters (who was also in
attendance) and I put together a couple of years ago. That made this event a
little extra-special.

But it wasn’t the only special thing. Uncle
Bob
was there as well as his son Micah. They paired with the prisoners and provided
instructive feedback during the retrospectives. Muy cool!

I personally paired with five prisoners that day. Three stand out in my mind.
One had been a programmer before he came to prison – he was sharp and we wrote
much code. One had been programming for a week – we spent our session teaching
him some basics. Another was studying electrical engineering at college when he
came to prison 20 years ago – I worked with him last and we spent our session
refactoring a mess we had inherited.

Lunch was pizza and pop, another way in which Coding in the Clink varies from a
Coderetreat. But we socialized for a good bit and talked about what we were
learning and teaching and doing. It felt like a Coderetreat as we were just
geeks discussing what we enjoy.

Looking at all this from the point of view of the prisoners, this was a
wonderful day. They got to meet and pair directly with Uncle Bob, they had a
room full of visitors (some of them women – woohoo!), they got to work on an
exercise with the folks who created it, and they got pizza and Mountain Dew for
lunch.

From my point of view, the whole event wasn’t about my kata, or Uncle Bob being
there, or hacking all day, or even pizza. Those things were cool and I enjoyed
myself very much. But really, I wasn’t there for those reasons.

I was there because there are no bad people just bad choices. I was there
because the people on the inside needed my help. I was there because they are
people.

I’m going to continue going to prison with Dan. Others helped the people in my
life when they were in prison. People that I don’t even know. People that
wanted to be part of the solution. I want to be part of the solution too.

OK. Let’s say you’ve got some big, bulky, enterprisey application. This
application consists of an outer page (probably called index.jsp or something
like that) that never moves and assorted iframe tags for portlets and tabs.

The first through you probably have is “Ewwww, iframes, really?” You’re second
thought is probably that this is an application very much like the one Guy
works with. And, I hope, your third thought is one of sympathy for me since I
have to work on such an application. But I digress, como siempre.

Also, this application has session data that needs to be shared between
portlets and tabs and across tabs and all other sorts of complex interactions.
And, you want to do this client side for performance reasons. How, pray tell,
can you do this without writing spaghetti code?

If you’re really smart (and you are, right?) you’re probably just saying that I
should use HTML5 Local Storage and be
done with it. Great idea! I even wrote
ProtonDB, a framework to make this
sort of thing super-easy. But, alas, I’m stuck in Enterpriseland and HTML5 is
not permitted because it’s new and we fear newness because it is fraught with
risk and uncertainty.

But, I do have an elegant solution to the problem and the key lies in the fact
that the parent page doesn’t move. And since it doesn’t move it can simply hold
my session state in a JavaScript object. I can define this object with one line
of code and import the .js file in all HTML pages (i.e. each portlet, tab, and
the outer page)

varsession=session||parent.session||{};

This code is simple and complex. Make sense of that! It assigns session if it
hasn’t been assigned yet. Since the outer page loads first, it gets defined
there initially because session doesn’t exist, and parent.session doesn’t
exist. All of the iframes then evaluate this same code and session doesn’t
exists but parent.session does. And, just in case someone has defined this
already we’ll always assign session to session if it exists.

To use the code simply modify the session object. For example:

session.foo='bar'

Now I like to know what I’ve put in session so that I have a feel for how big
it is. So I actually use a slightly more complex pattern. I define a session
object with explicit accessors so the code tells me what’s stored there. And I
use a closure so no one can mess with my internal state and they have to go
through the defined session object. Here’s the code: