Sunday, August 25, 2013

Perl blog post #17


Well, it’s been about 2 months since I’ve done a technical post, so I decided to put one together for my Perl homies.  This one is on strong vs weak typing, so pop on over if that sounds like something that might excite you.  If it doesn’t, just take the week off.  Perhaps next week will thrill you more.

Sunday, August 18, 2013

Grokking the Wheel of Time


I’ve talked before about my affection for Robert Jordan’s Wheel of Time series—even mentioning that I named one of my children after one of its characters.  There are 15 books in the series, which I’ve always felt break up into a quadralogy of trilogies (despite the fact that the math on that really doesn’t work, but we’ll get to that in a second).  So it’s a very long series, both in page count (nearly 12,000 pages), and in terms of years of waiting for the series to be completed (nearly 23 years).  I personally have been reading it (off and on, obviously) for about 40% of my life, rereading the older books when the newer ones come out, poring through the online encyclopedia, listening to the audiobooks on long commutes, even fashioning a role-playing campaign around it once.

So it’s been a pretty big part of my life.  And the series is finally finished: the final volume came out at the beginning of this year.  The Wheel of Time outlives Jordan himself, but thankfully his extensive notes were passed on for completion to a new author, Brandon Sanderson, who was hand-picked by Jordan’s widow.  For some reason, after Jordan’s death, I took a break, and I haven’t read any of the Sanderson books (i.e. the final three in the series).  But, now that they’re all complete and I can finally see how it all comes out, I’m anxious to get through them.  After some consideration, I decided to start at the beginning and read straight through until the end.  But not with the paperbacks, although I own nearly all of them.  Nope, I decided to go audiobook for all the Jordan books (they’d all be rereads anyway, and in many cases several-times-over-rereads), then switch to e-book for the Sanderson volumes (so I can pay closer attention to the ones I’ve not read before).  As of writing this sentence, I’m about 3 hours away from finishing Knife of Dreams, the last Jordan book.  I’ll be starting on the first Sanderson book, The Gathering Storm, within the week.

It should go without saying at this point that I’m a fan.  Although that’s not to say that I recommend the books unconditionally: they do have flaws, and I’m keenly aware of them.  I’ve already talked about Jodran’s tendency to stifle his characters.  Also, Jordan never met a subplot he didn’t like: when he started off book #10 (that is, page 7,382 of the series, not even considering the prequel) by introducing a new character perspective, someone we’d heard of before but never seen in the flesh, in a country which none of the characters which could possibly be considered main characters had likely ever even visited ... well, that’s when I knew he had a problem.  No, Mr. Jordan* was not a perfect author ... but then who is?

There are also criticisms of Jordan that I disagree with.  One such persistent claim is that the series (or at the very least the first book, The Eye of the World) is a cheap imitation of The Lord of the Rings.  The typical defense of this is to bring up Jordan’s own words on the topic:

In the first chapters of The Eye of the World, I tried for a Tolkienesque feel without trying to copy Tolkien’s style, but that was by way of saying to the reader, okay, this is familiar, this is something you recognize, now let’s go where you haven’t been before. I like taking a familiar theme, something people think they know and know where it must be heading, then standing it on its ear or giving it a twist that subverts what you thought you knew.**


See? (say Jordan’s defenders) he wasn’t deliberately trying to steal LotR’s plot; he was, rather, making a conscious choice to borrow elements from it in order to make the reader feel more comfortable.  Totally different.

I have a completely different response to this argument: I just reject it.  How are they similar again?  In both cases, a mysterious magical figure comes to a sleepy backwater village and tells some simple country folk that they are now caught up in the ultimate fight against the personification of evil in their world.  Well, when you describe the plot from 50,000 feet, sure, they do sound a bit similar.  But that’s sort of like saying that Harry Potter is a rip-off of James and the Giant Peach because they both involve orphans raised by unpleasant family members who discover a strange, magical world living in the grim, dreary cracks of the real one.  Does The Eye of the World share broad themes with The Fellowship of the Ring?  Well of course.  All modern fantasy shares broad themes with Tolkien.  He invented modern fantasy.  It’s sort of like wondering if some modern detective in crime fiction bears any resemblance to C. Auguste Dupin—how could they not?

So I never bought the Tolkien-rip-off theory.  It’s crap.  Anyone who has the patience to get through the first book knows that this ain’t your daddy’s Tolkien.  And anyone who doesn’t isn’t particuarly qualified to comment: they’ve read less than 7% of the total story (again, not even counting the prequel).  Even Jordan’s quote above doesn’t much phase me.  I much prefer this one:

Question: I have noticed some similarities to The Lord of the Rings. Was Tolkien an inspiration for for you?
Jordan: I suppose to the degree that he inspires any fantasy writer in the English language, certainly.***


The other thing that Jordan is often criticized for is his pacing.  Yes, it’s true that he describes every little thing: the plants, the dresses, the architecture, the history, the shades of meaning of things translated from the Old Tongue, where the armies are getting their supplies from, how this servant used to serve that one’s mother many years ago, how much this character like his or her horse, etc etc ad infinitum.  Nothing wrong with that, per se.  Description immerses us more fully in the world.  It’s not Jordan’s fault if our minds being to wander while he’s painting us a perfect mental picture.  He built an entire world here, and he’s justifiably proud of it.  Besides, Tolkien was very fond of that too, as are many writers in the fantasy genre—not to mention sci-fi (e.g. Frank Herbert) and horror (e.g. Peter Straub).  He’s also accused of being verbose, which, again, is not a crime in and of itself: certainly Stephen King has been accused of that more than any other literary sin, and I’ve already mentioned that he’s my top literary idol.

No, all of these are just roundabout ways of saying that his pacing is too slow.  It takes forever for anything to happen in a Robert Jordan book.  Now, first of all, I don’t even consider that to be particularly problematic.  After all, Jordan’s pacing isn’t any worse than that of Ann Rice (who is fond of having the first ten and the last twenty-five pages happen in the present, while the thousand pages in between are one giant flashback, or the reading of someone’s diary, or somesuch).  And Ann Rice’s works are genius too (remember: another one of my children is named after one of her characers).  But, above and beyond that, I think the problem is just understandig the structure of the series.

Most fantasy series are trilogies, this being the pattern set by Tolkien.  Book 1: establish the characters and set up the action.  Book 2: create obstacles for the characters; allow the villains some victories, and end with the characters seemingly on the brink of defeat.  Book 3: the characters make a mighty comeback, mostly through sheer force of will, and the villains are defeated for once and for all.  This is a tried and true structure for trilogies—not only does the Lord of the Rings follow it, but so do many other fantasy series (e.g. His Dark Materials, the Riddle-Master trilogy, Drizzt Do’Urden, Bartimaeus, etc etc) as well as things as far flung as the first 3 Dune books, the original Star Wars movies, and the Millenium series.  Typically, if a series is longer than that, it’s either from adding prequels and side stories, or it’s from stretching out the various bits of the trilogy into multiple books.  For instance, if you tilt your head and squint just right, you could see Harry Potter as a triology: books 1 and 2 are Book 1, books 3 - 6 are Book 2, and book 7 is Book 3.

But there are series with more complex rhythms, and I’ve always felt that Wheel of Time was one such.  I think that you need to view WoT as a quadralogy of trilogies, with the addition of a prequel, and the fact that the final book in the final trilogy was so huge that it had to be split into 3 books (which gives you the total of 15).  The overall structure goes something like this:  Trilogy 1: introduction and establishment, and the characters begin to lose their innocence.  Trilogy 2: the characters make some strides, despite heavy opposition.  Trilogy 3: the villains get a lot more organized and dangerous, and the heroes start to discover their limitations.  Trilogy 4: well, I’m hopeful that this is where Good pulls it out in the end, but I haven’t actually finished reading yet, so I can’t say for sure.  But I’m pretty confident.

But within each trilogy, the structure is pretty much the same as a traditional trilogy: establish a situation, ratchet up the tension, and then an explosive finish.  However, what this means in the overall context of the series is that books 3, 6, and 9 (and presumbly the final book) are amazingly exciting, with each one being even more amazingly exciting than the previous one.  But that means that book 4 is a bit of a let-down.  And book 7 is a big let-down.  And book 10 is nearly unbearable.  But you have to pace yourself.  You have to remind yourself that Jordan couldn’t keep that level of excitement up for however many more books you have left to go: your head would just explode.  You need to come back down a bit, and then work at getting back up to those dizzying peaks slowly.  Book 3 makes you happy; book 4 makes you want to sigh.  Book 6 makes you want to laugh; book 7 makes you want to grumble.  Book 9 makes you want to cheer ... and book 10 makes you want to gnash your teeth and start tearing out your hair.  Yes, yes, all that info is important, and I’m sure I’ll need to know it as background for the future action, but, as Monty Python would say: GET ON WITH IT!

But my attitude is: forewarned is forearmed, and now that you understand how the rhythm and flow of the series is going to work, you can be prepared for it.  If you read this series, and you stick with it, you will be rewarded, I promise you.  The world is rich, and full of interesting cultures.  The politics is subtle, and intriguing, and full of factions (and sub-factions).  The magic is different, in both broad and fine ways.  The allusions (not just to Tolkien, but to Arthurian legend, Norse mythology, Samurai culture, and so forth) are rich and subtle.  The characters—even those you want to strangle for not waking up and seeing their own mistakes—are genuinely affecting, and you will come to care about them.  And, there are so many of them that, if there happen to be a few who rub you the wrong way, you won’t have to put up with them for very long before someone else’s point of view comes along.  The story is intricate, with seemingly throwaway minor characters popping back up, sometimes so subtly that you don’t even notice they’re the same person until you reread for the second or third time.  It’s the work of a master crafstman, and I wouldn’t have missed it for the world.

And I’m really really excited to see how it all turns out.


* Yes, I know that’s not actually his real name.  But I shan’t refer to Mark Twain as Mr. Clemens, and I shan’t refer to Lews Carroll as Mr. Dodgson, and likewise I shan’t refer to Robert Jordan as Mr. Rigney.

** from a June 2002 interview, preserved at Theoryland of the Wheel of Time

*** from an online chat on October 21, 1994, preserved at Theoryland of the Wheel of Time

Sunday, August 11, 2013

Yet another week off


Well, this has been a weird two weeks: a fantastic first couple weeks on a new job, coupled with The Mother‘s car being totalled by a drunk driver—while sitting empty on the street, happily.  (Not sure Facebook will let you see, but in case it does work: here‘s what the poor car looked like afterwards.)  So this week I’ve mostly been consumed with work, and shopping for a new car.  Granted, The Mother did most of the work on the latter, it being her vehicle that needs to be replaced.  But still, it hasn’t left a lot of time for contemplation of things such as blog post topics.  Still, I took a stab at it, but I only got a few hundred words in before other stuff distracted me.  So you’ll have to wait until next week to see that.  Try to contain your disappointment.

Sunday, August 4, 2013

Cynical Romanticism


Many of my friends seem to think I’m a pessimist.  They’re then quite surprised when I seem to display some trait of stunning (and often naive) optimism.  The truth is that I’m not a pessimist; nor do I have moments where I transition to being an optimist.  I am, in fact, a cynic.  But I’m also a romantic.

I’ve mentioned this dichotomy of mine before (more than once, even).  What does it really mean though?  To understand, it’s useful to examine the roots of both terms.

Cynicism is actually an ancient Greek philosophy.  You remember the story of Diogenes, don’t you?  (Of course you don’t—I shouldn’t either, really, but my mother had an odd idea of what constituted a well-rounded education.)  Anyway, Diogenes was the guy who lived in a bathtub on the streets of Athens.  He carried around a lamp in the daytime, waiting for someone to ask him why.  When they did, he would reply that he was looking for an honest man.  The Cynics were sort of proto-hippies, living “in accord with Nature” and eschewing things like wealth and fame as non-natural.  It wasn’t enough to reject these things, though: a Cynic was required to practice shamelessness (sometimes translated as “impudence”), by which they meant that they should deface laws and social conventions.  So they were sort of in-your-face hippies.

You can vaguely draw the connection from this attitude of telling everyone that they were fools for letting things like greed and conformity take them further and further away from the natural state of living and the ultimate meaning that cynicism has today: the belief that people as a whole are vain, gullible, avaricious, and generally not that bright.  Steve Jobs once said:

I’m an optimist in the sense that I believe humans are noble and honorable, and some of them are really smart.  I have a very optimistic view of individuals.  As individuals, people are inherently good.  I have a somewhat more pessimistic view of people in groups.


Although I’ve always preffered the version from Men in Black:

J: People are smart.  They can handle it.
K: A person is smart.  People are dumb, panicky, dangerous animals, and you know it.


J has no answer to this, of course: he is a New York City policeman.  He does know it.

When I was young, I did the required stint in fast food.  My particular greasepit was Burger King.  I worked there when chicken tenders were introduced, and I lived through the “Where’s Herb?” campaign.  Part of this campaign was to get a particular burger for a dollar by mentioning the fictional Herb’s name.  During this period, I saw innumerable people in Burger King ordering a “Herb burger.”  Yes, that’s right: they had absolutely no idea what they were ordering—just that it was cheap.  I am fond of telling people that we could have served them a shit sandwich and they’d have been happy as long as they thought they were getting a bargain.  I’m also fond of telling people that Burger King is where I first began to lose my faith in humanity.  Looking back, I’m not sure that’s entirely true, but I can’t deny that ol’ Herb played a large role in pushing me down that road.  Certainly it’s the place where I learned to appreciate H. L. Mencken’s observation that nobody ever went broke underestimating the intelligence of the common man,* and surely Mencken is a big a cynic as Twain or Voltaire, two of my most cherished quotemeisters.

So do I have, as Wikipedia puts it, a “general lack of faith or hope in the human race”?  Yeah, pretty much.  My experience with politics, business, financial institutions, organized religion, and even smaller coteries of humanity such as neighborhood homeowner’s associations or Internet forum denizens tells me that, if you expect the worst from people, you’ll rarely be disappointed, and occasionally you get a pleasant surprise.  Which is much better than the inverse: expecting the best yields constant disappointment and the occasional situation where your expectations are merely met.  Thus, I’m entirely comfortable with being considered a cynic, even though I don’t think that’s the same as being a pessimist.  I’m happy enough to consider the glass half-full ... I just remain convinced that there’s every likelihood that someone else will come along and drain the glass before I get any.

Romanticism is also tied to nature: it was in some ways a revolt against the rationality of the Enlightenment, a way of stressing that one should go out into untamed Nature and stop trying to analyze it and categorize and just feel it.  Romanticism was a validation of strong emotion—be it wonder, awe, passion, or even horror.  Especially for Art.  As one early Romantic German painter put it, “the artist’s feeling is his law.”  This was a movement of rejecting rules, particularly rules about Art, and it led to the Gothic horror tale and luminaries such as Edgar Allen Poe ... it’s certainly no wonder that I would experience a feeling of kinship towards it.

“Romantic” as a term implying love came later.  Even before Romanticism, “romance” was a term that referred to knights and heroic quests: Shakespeare’s The Tempest was considered a romance.  From knights to chivalry, and rescuing damsels in distress, plus Romanticism’s emphasis on strong emotions (such as passion), we eventually came to think of “romance” as primarily a love story, which today leaves us with Harlequin and Titanic.  Sort of a step down from Romanticism, if you think about it.  Not that there’s anything wrong with romantic love, of course: just that love is only one small part of Romanticism.

As a would-be-writer who idolizes Steven King (among others), how could I not be attracted to the movement that gave us Poe?  Certainly there is no King (nor Straub, Koontz, Barker or Gaiman) without Poe.  This is a movement that also (albeit more indirectly) gave us Robert Browning, who I quoted in my deconstruction of one of my all-time favorite quotes, and who also inspired King’s Dark Tower series.  Like Cynicism, Romanticism was a rejection of rules, and especially the “rules” of conforming to a polite society.  Throw off the chains of conformity, they both proclaim.  Be an individual.

And that’s the heart of my outlook.  Note how both Jobs and Tommy Lee Jones laud the individual person.  And we don’t have to look far to hear more famous people doing so.  Margaret Mead once said:

Never believe that a few caring people can’t change the world.  For indeed that’s all who ever have.


How can you not take inspiration from thatPearl S. Buck said:

The young do not know enough to be prudent, and therefore they attempt the impossible—and achieve it, generation after generation.


So I believe that, despite the fact that humanity in general is close to useless, every individual human has a potential for greatness.  I believe that the universe works hard to put me in good places, and succeeds a surprising percentage of the time, even when the formless churning rat race of mankind is working hard to push in the opposite direction.  I won’t say I’m an optimist—the glass may indeed be half-empty.  But somewhere out there is a person who’s willing to refill it for me.  If I’m fortunate, and if I really need it, I’ll meet them.

This is not a philosophy so much as an outlook.  If you ask me about my philosophy, I’ll go back balance and paradox.  But that theory is how I attempt to make sense of the world when it doesn’t seem to want to make sense on its own.  That’s different from how I approach the world, and what I expect out of it.  When it comes to that, I don’t expect much out of people, but I will never give up my idealism.  The world doesn’t owe me anything, and I wouldn’t expect to receive payment if it did.  But I continue to believe that the universe is a decent enough place, and that there will always enough light to balance the dark, and that what you give out will surely come back to you.  In the end, Good will always triumph over Evil, even if Evil usually gets more votes (and always has better financial backing).

So I suppose it’s a bit like Mel Brooks says in The Twelve Chairs:

Hope for the best.  Expect the worst.
Life is a play.  We’re unrehearsed.


Although I would favor the formulation of Benjamin Disraeli:

I am prepared for the worst, but hope for the best.


Because I’m not a Romantic Cynic, after all: I’m a Cynical Romantic.  I may start with dread, but I always try to end on a note of hope.



__________

* Technically, what he said was: “No one in this world, so far as I know—and I have searched the record for years, and employed agents to help me—has ever lost money by underestimating the intelligence of the great masses of the plain people.”










Sunday, July 28, 2013

Technical Debt Strategies


For a new role I’m starting at work, I’ve been thinking about the concept that we in the software development business refer to as “techincal debt.”

In software development, there is always a tension between two opposing forces: the desire to do it fast, and the desire to do it right.  I could probably write an entire blog post on just that topic, but for now I’ll settle for the short version.  If you do it right, then, later, when you want to extend it, or modify it, or use it as a jumping off point for branching out in a whole new direction (and you will always want to do these things eventually, if your software lives long enough), you can do so easily, with a solid foundation as a base.  The downside is that it will take longer.  If you do it fast, you get results faster, which means you can serve a customer’s needs before they change, fill a window of opportunity before it closes, or perhaps even beat your competitors to the market with your offering.  But when you have to modify it later (which you will), it will end up taking even more time to clean things up than if you’d just done it right in the first place.

You can see why we often call this “technical debt.”  You’re saving time now, but you’ll have to “pay it back” later, and the amount of extra time it takes is like the interest.  Primarily, we software people invented this analogy because it makes good sense to business people.  When you’re running a business, sometimes you need a piece of equipment.  You have two choices: you can borrow some money and buy it now, or you can save up and purchase it outright, later.  Buying it now allows you use it now, thus saving you costs somewhere else or giving you new capabilities you can capitalize on.  But you’re going to have to pay for it eventually, and you’ll have to pay the interest too.  Buying it later saves money in the long run, but denies you the advantages of the equipment for however long it takes to save up enough money.

This analogy really works because, despite what some people tend to believe, neither choice is always right or always wrong.  Sometimes it makes sense to borrow the money and buy it now; sometimes it makes sense to wait.  Likewise with software, sometimes it makes sense to just get the damn thing programmed as quickly as possible, and sometimes it makes sense to take the time and do it right the first time.  And business people have to make that call, and expressing the choice in financial terms makes it easy for them to understand the trade-offs.

For instance, when a company is first starting up, “do it fast” is nearly always the right answer.  (David Golden has a great post which explores this in greater detail.)  Basically, there’s no point in worrying about how hard it will be to change your software tomorrow when you’re not even sure there’s going to be a tomorrow.  Once a company leaves the startup phase, though, it’s time to think about paying down some of that technical debt.  If it doesn’t, the lack of agility means it may not be able to respond to customer demands quickly enough to thrive in the marketplace.

Now, technical debt is in many ways unique to every individual company, and there’s no one technique or approach that will work for everyone.  But everyone faces the same basic problem: I need my development team to keep making new features while they’re also paying off this debt; how can I have them accomplish even more than they were doing before without burning out, or creating new problems as fast as they fix the existing ones?  Hiring more people helps, of course, but it isn’t the complete solution.  But there are some general strategies that will work, and can be used by nearly every company that finds itself in the position of having a fair amount of technical debt to pay off.  These five areas nearly always need some attention, and they’re excellent things to think about when looking for ways to make your programmers more efficient, which not only gives them time to work on refactoring messy areas of your codebase, but also gives them more time and confidence to avoid creating technical debt in the first place.

Unit Tests  Few companies have no unit tests, but few have enough either.  I’ve heard people worry about creating too many unit tests, but honestly this is like your average American worrying about eating too many vegetables: I suppose it’s technically possible, but it’s unlikely to be a problem you’ll ever face.  It is possible for your unit tests to be too messy, though.  Remember: your unit tests are supposed to give you confidence.  The confidence you need to get in there and clean up some of that technical debt without being afraid you’re going to break something.  But your tests can’t give you confidence unless you’re confident in your tests.

Now, many people will tell you that you should put as much time and effort into your tests as you do your code (this is often—but not always—what people mean when they say “tests are code”).  I don’t necessarily agree with this.  I think that all the effort you put into your unit tests should go towards making your unit tests effortless.  I think your code should be elegant and concise: you don’t want it too simple, because it’s a short hop from “simple” to “simplistic.”  Imagine the Dr. Suess version of War and Peace and how hard that would be to get through—that’s what I’m talking about.  You need to use appropriate levels of abstraction, and using too few can be as bad as using too many.  You have to strike a balance.

On the other hand, your tests should be simple.  Very simple.  The simpler they are, the more likely your developers are to write them, and that’s crucial.  Whether you’re using TDD or not (but especially if you’re not), devs don’t particularly like writing tests, and anything that gives them an excuse not to is undesireable.  You want your tests to read like baby code, because that way not only will people not have to expend any brainpower to write new tests, but reading them (and therefore maintaining them) becomes trivial.  This doesn’t work as well for your code because of the crucial difference between code and tests:  Code often needs to be refactored, modified, and extended.  Tests rarely do—you just add new ones.  The only times you modify tests is when they start failing because of a feature change (as opposed to because you created a bug), and in many cases you’re just going to eliminate that test.  And the only times you should be refactoring them is when you’re working on making them even simpler than they already are.

So, in addition to trying to extend your test coverage to the point where refactoring becomes feasible, you should probably work on creating underlying structures to make writing new tests simple, and to make reading existing tests even easier.

Code Reviews  There are still plenty of companies out there not doing this one at all, so, if you fall in that category, you know where to start.  But even if you’re already doing them, you could probably be doing them more efficiently.  Code reviews are tough to implement well, and it has as much to do with the process you implement as with the software you choose to utilize.  Of course, it has a lot to do with the software you choose to utilize.  Code reviews, like unit tests, need to be simple to do, or people will find excuses not to do them.  Good software can really help with that.

Hopefully, like unit testing, code reviews are something that you don’t really need to be convinced that you should be doing.  But more people are resistant to code reviews than any other practice mentioned here.  They absolutely do require an investment of time and effort, and they absolutely do mean that you will deliver some features more slowly than you could without them.  Of course, if that extra time and effort catches a crucial customer-facing bug, you won’t be complaining.

But, honestly, catching bugs is not the primary benefit of code reviews ... that’s just the icing on the cake.  Code reviews just produce better software.  They’re the time and place where one developer on your team says to another: “hey, you know you could have used our new library here, right?”  (To which the response is inevitably: “we have a new libary?”)  They’re fantastic for cross-training too: don’t think code has to be reviewed by someone who already knows that code.  Have it reviewed by someone who’s never seen the code before and they’ll learn something.  Have your junior people reviewed by your senior people, and have your senior people reviewed by your junior people: they’ll all learn something.  It makes your codebase more consistent and builds a team dynamic.  It diffuses business knowledge and discourages silo effects.  If it happens to catch a bug now and then ... that’s just gravy.

Once you have code reviews in place, though, you’ll probably still want to tweak the process to fit your particular organization.  If you require reviews to be complete before code can be deployed, then code reviews are a blocking process, which comes with its own hassles.  Then again, if you allow deployment with reviews still outstanding, then you risk making the review process completely ineffectual.  So there’s always work to be done here.

Code Deployment  I suppose there are still software folks out there for whom “deploy” means “create a new shrink-wrap package,” but more and more it means “push to the website.”  At one company I worked at, deployment was a two-hour affair, which had to be babysat the entire time in case some step failed, and, if a critical bug was discovered post-launch, rolling back was even more difficult.  From talking with developers at other companies, I don’t believe this was an exception.

If your organization is big enough to have a person whose entire job is dedicated to deployment (typically called a “release manager”), then you don’t have to worry about this as much.  If that two hours is being spent at the end of a long day of preparation by one of your top developers, you’ve got some room for improvement.  But even if you have a seprate release manager, think how much you have to gain as your deployment gets shorter and simpler and more automated.  You can release more often, first of all, and that’s always a good thing.  And there are simple strategies for making rolling back a release almost trivial, and that’s absolutely a good thing.

Now, I’ve never been a fan of “continuous deployment” (by which I mean deployment happening automatically, triggered by checking in code or merging it).  But I do believe that you should strive for being able to deploy at any time, even mere minutes after you just finished deploying.  Part of achieving this goal is reaching continuous integration, which I am a fan of.  Having those unit tests you worked on so hard being run automatically, all the time, is a fantastic thing, which can free your developers from the tedious chore of doing it manually.  Plus, continuous integration, unlike code reviews, really does catch bugs on a regular basis.

Configuration Management  Similar to deployment, and for the same reasons.  If building a new production server is a heinous chore, you’re not going to want to do it often, and that’s bad.  Horizontal scaling is the simplest way to respond to spikes in traffic, and you should be able to bring a new server online practically at the drop of a hat.  It should be completely automated, involve minimal work from your sysadmins, and zero work from your developers.  There are all kinds of tools out there to help with this—Puppet, Chef, etc—and you should be using one.  Using virts goes a long way towards achieving this goal too.

For that matter, it should be trivial to bring up a new development server, or a new QA server.  Once that ceases to be a big deal, you’ll find all sorts of new avenues opening up.  Your developers and/or your QA engineers will start thinking of all sorts of new testing (particularly performance or scalability testing) that they’d never even considered before.  Figuring out how to handle database environments for arbitrary new servers can be a challenge for some shops, but it’s a challenge worth solving.

For Perl in particular, you also need to be able to reproduce environments.  You can’t spin up a new production web server alongside your existing ones if it’s going to be different than the rest.  If your server build process involves cloning a master virt, you don’t have to worry about this.  If you’re rebuilding a server by reinstalling Perl modules, you must expect that CPAN will have changed since you last built production servers, because CPAN is always changing.  For this reason, a tool like Pinto (or Carton, or CPAN::Mini, or something) is essential.

Version Control  In this day and age, I doubt seriously I need to convince anyone that they should start using version control ... although one does hear horror stories.  More likely though, you should be thinking about what VCS you’re using.  If you’re using CVS, you should probably be using Subversion, and, if you’re using Subversion, you should probably be using Git.  But along with thinking about which software to use and how to switch to a better one (preferably without losing all that great history you’ve built up), you also need to be thinking about how you’re using your VCS.

Are you using branches?  Should you be?  If you’re not, is it only because of the particular VCS you’re using?  If you’re using CVS or Subversion and telling me branching is a terrible idea, I can understand your point of view, but that doesn’t mean you shouldn’t be using branches—it just means you should probably be using Git.  Now, granted, branches aren’t always the right answer.  But they’re often the right answer, and they allow experimentation by developers in a way that fosters innovation and efficiency.  But it takes work.  You have to come up with a way to use branches effectively, and not just your core developers should agree.  If you have separate front-end developers, for instance, they’re going to be impacted.  If you have a separate QA department, they’re definitely going to be impacted—in fact, they can often benefit the most from a good branching strategy.  Your sysadmins, or your ops team (or both), may also be affected.  If you’ve tried branches before and they didn’t work, maybe it wasn’t branching in general that’s to blame, and maybe it wasn’t even the particular VCS ... maybe it was the strategy you chose.  Feature branches, ticket branches, developer branches—again, there’s no one right answer.  Different strategies will work for different organizations.


So these are some of the things you need to be considering as you look to reduce your technical debt.  None of these things address the debt directly, of course.  But, in my experience, they all play a part in streamlining a development team by increasing efficiency and cohesiveness.  And that’s what you really need in order to start paying down that debt.

Sunday, July 21, 2013

Restoration of balance: anticipated


Once again I’m going to forego my usual blog post, this time because I don’t really have anything to say I haven’t said before.  About a year and a half ago, I posted a rather long, rambling musing on the topic of fate.  This week I’m reminded of that posting, in a very positive way.  I continue to believe that everything happens for a reason, and even things that seem to be bad at the time can often lead to a better outcome than expected (or hoped).  Not always, of course.  But the universe has a way of tempering the bad with the good in such a way that makes it difficult not to believe that there is an ordered plan.  My current plan is still ongoing, so I can’t guarantee it’ll end up where I think it will.  But, so far, my faith in the universe is back on track, and aiming at a destination that I’m currently pretty excited about.

Until next week.

Sunday, July 14, 2013

Guides: Marion Burden


[I wrote this earlier this week, for my family.  I’ve decided to post it here as a part of my series about people who have had a great impact on my life.  You may wish to read the introduction to the series.]

For me, as a child, “family dinner” meant the mid-day meal on Sundays, with my grandparents on my father’s side.  Oh, we had dinners with my maternal grandparents as well, sometimes, but it was more infrequent, and more ... reserved.  Not as much fun.  And, once or twice a year, we’d go to family reunions, which were huge, sprawling affairs, with more relatives than I could keep track of.  My paternal grandmother had a very large family, and most of her brothers and sisters had decent-sized families themselves, and it made for quite a lot of “cousins” to keep up with.  Except they weren’t technically my cousins ... they were my dad’s cousins, or in some cases my second cousins.

My dad’s family was smaller, more intimate.  Dad has just one brother, and no sisters.  At first I was the only kid.  Then I had one cousin, then two cousins, and then two cousins and a little brother.  And that was as big as our family dinners ever got: grandmother and grandfather, mother and father, aunt and uncle, two cousins and a sibling.  We had a lot of family dinners—big dinners at Easter or Thanksgiving or Christmas, little dinners on your average ordinary Sunday—and I ate a lot of food at my grandmother’s table.  There were certain things that were very predictable at these dinners.  My grandmother would burn the biscuits.  Us kids would start eating before everyone was at the table, and we’d get yelled at.  There would be a minimum of one dish containing potatoes: boiled potatoes, mashed potatoes, or potato salad, and possibly two of the three, and, for a big dinner, probably all three.  There would always be homemade biscuits for everyone else, and canned biscuits because my uncle Jimmy and I liked those better.  And, if it was a holiday, there would be some sort of lime green Jello concoction, with whipped cream and unidentifiable chunks floating in it, and my aunt Marion would say “You know what that looks like, don’t you?”  And us kids would giggle, and my grandmother would sniff disapprovingly, but then she’d say that she only ever made the stuff just so Marion would get to deliver that line.

My grandmother and grandfather are both gone now, but all the rest of us are still here ... or at least we were, until a few days ago.  That’s when I got the word that my aunt Marion had passed away.  She’d been sick for a while now, so it wasn’t really a surprise.  Not that that helps.  When your family members die after a long illness, people will tell you that at least they’re not suffering any more, and when they die suddenly, people will say at least they didn’t suffer, but none of that really makes a dent in how you feel.  There’s a sense that you have of a person, regardless of how often you see them: it might be a large looming presence, or it might be just a comfortable feeling tucked away in the back of your mind, like the keepsakes you have up in your attic—you don’t take them out and look at them very often, but you’re comforted just knowing they’re there.  Then, one day, that sense is gone ... the loss might be overwhelming, or it might be like an itch you can’t quite reach, or it might be anywhere in between, but it’s always very sharp.  It cuts.  And it’s hard to adjust to.

I haven’t seen my aunt Marion for many years.  But I remember many things about her.  Some are superficial: her boundless capacity for the color red, and her endless delight in Snoopy, for instance, are things that everyone who knew her even slightly remembers.  Some are not even very well connected with her as a person: for instance, my earliest remembrances of my aunt and uncle are probably going out to their house, which was way outside town, and playing with their electric organ.  I don’t specifically see Aunt Marion in these memories, but the organ made quite an impression on me, as I was very young and it was very cool.

I remember giant stuffed Snoopies, and I remember elaborate piled hair-do’s, and I remember her candy-making business, with the rainbow assortments of white chocolate and the candy molds and she even made her own peanut butter cups, and that was pretty cool no matter how old you were.  And I remember lots and lots of family dinners.  I remember her bringing over my cousin Chris for the first time, and I remember her bringing over my cousin Cathy for the first time.  I remember that she laughed the loudest, and the easiest, and the most often.  I remember her giving us silly Christmas gifts, like bad cologne, just because she knew that my brother and I loved to say “Brut: by Faberge” in our best Eddie Murphy voice, and I guess she liked hearing us say it.

What I remember most about her, though, was her strength.  My Aunt Marion said what was on her mind, and she said it straight, and she didn’t care who heard her.  She was the only person in our family who did that.  My mother’s family was polite to the point of obsession; my father’s, more plain-spoken, but still proper.  But Aunt Marion went beyond plain-spoken and into what was to me a strange new world of honesty and forthrightness.  She came into a room like a whirlwind, dominated a conversation without monopolizing it, was brazen without crossing the line into shocking.  Well, I’m sure she crossed some people’s lines.  There were probably people who considered her rude.  There were probably those who were secretly jealous of her apathy towards what others thought of her.  I just thought she was cool, and, the older I got, the cooler she was.

So today I’m missing my aunt, even though I hadn’t spoken to her in forever.  Even though those family dinners are long gone, they remain fresh in my mind.  Even though I haven’t seen my cousins in years, my thoughts are with them, because they’ve lost their mother, and even though I haven’t talked to my uncle for just as long, my thoughts are with him, because he’s lost his soulmate.  My loss compared to theirs is very small, but I still feel it.  I’m going to miss my loud, crazy Aunt Marion because, in many ways, she was the best of us.  And that’s always worth celebrating.

Sunday, July 7, 2013

Interesting


Well, it’s been an interesting week (more in the Chinese curse sense than the scientific inquiry sense).  I’m going to take some time to regroup and refocus, so I won’t be doing an extensive blog post this week.  Next week will be better.

Sunday, June 30, 2013

Perl blog post #16


I had hoped the fact that the family was gone this week (camping) would allow me to get ahead on blog posts again, but, alas, it didn’t work out that way.  So I’m cheating a bit, by revisiting the same topic I essayed last week, since it seemed to stir up some strong emotions.  Toddle off to my Other Blog if you’re interested in seeing my rantings for this week.  This one doesn’t require any Perl knowledge at all, really; it’s more of a reflection of the nature of these sorts of debates on the Internet (such as they are).

Sunday, June 23, 2013

Perl blog post #15


Still recovering from a bit of a cold this week—I’m in that lovely phase where you mostly feel fine, except every once in a while you start hacking and coughing until you hock up a big ol’ glob of phlegm—which was my second week at my new job.  Not the most awesome time to get sick.  Here I am trying to impress folks with how intelligent and savvy I am and instead I’m wandering around with virus-induced zombie-brain.  Ah, well.  I’ll have plenty more shots at it.

Anyway, I did I a quick tech blog post this week.  Just a response to some other blog posts I read recently.  Head on over there and check it out if you’re into Perl.  This one doesn’t require any technical knowledge, but a bit of understanding of programming languages in general and their evolution wouldn’t hurt.

Sunday, June 16, 2013

Character Building


I fancy myself a writer.  I am, after all, in the midst of writing a book right here on this very blog, where anyone can read it.  Being an aspiring writer, I often ponder the various elements that one must master to create compelling literature.

Pacing, for instance, is one I struggle with a lot.  I tend towards a more deliberate (unkind version: slow) pace, and I have to push myself occasionally to keep from getting bogged down.  There’s also style (wherein I ponder if I’m being too verbose, or using too many adverbs) and setting (wherein I wonder if I’m describing things so thoroughly that people forget what’s going on in the action) and theme (which I have a bit of a love/hate relationship with).  But possibly the biggest one of all is: characters.

Characterization is one of the most important aspects of writing, at least in fiction (and, honestly, most non-fiction too).  Even if you write a story in which not a single human being appears, you will have characters.  Your animals will become characters.  Your haunted house, or old car (or haunted old car) will become a character.  As sick as I am of hearing some schmuck on a DVD special features video say “you know, the city itself really is another character in our movie,” it really can be true, when you’re writing.  We writers have a tendency to turn almost anything into a character—wind, diseases, furniture, electronic devices—and it’s because characters are so essential to a story.  If you’re a writer, there’s a pretty excellent chance that your reader is going to be a person, and they’re going to want to see a person in your story to identify with.  A person like them, or like someone they know, or like someone they’ve always wanted to know, or like someone they’ve always been afraid to get to know.  A character.

So, in order to draw the reader in, your characters needs to be as realistic as you can manage.  There are all sorts of tricks to achieve this.  You can base the character on someone you know, for instance; that’s always a popular one.  Or on some historic figure.  But of course the character will never be (can never be) exactly like another person.  They must have at least some qualities that are unique to them.  You will always have to, at least partially, make something up.

Now, as near as I can tell, there are two schools of thought on this.  This is not really an either/or choice, of course, but rather two extremes on a spectrum, with many people falling at either end, but many falling somewhere in the middle as well.  At one end are the authors who say “my characters do exactly what I tell them to and nothing more.”  At the other end are the authors who say “I just let the characters speak through me; I never know what they’re going to say or do until they tell me.”

The people at the first end tend to think of the people at the other end as New Age hippies spouting pseudo-mystical bullshit.  Contrariwise, the people at the far end tend to the people at the other end from them as fascist megalomaniacs who won’t let their characters “breathe.”  Given my belief in balance and paradox, it will not surprise you to hear that I think both camps are right ... and also that both camps are wrong.

Let’s pick on one of my favorite authors for a minute, Robert Jordan.  Now, please don’t accuse me of Jordan-bashing.  I’m not being facetious when I call him one of my favorite authors—I named one of my children after one of his characters, after all.  But that doesn’t mean I have to agree with everything he says.  Here’s something he said once:

The characters never surprise me. In terms of the book I am God. A writer who says that the characters take control is doing one of two things... either he or she is telling people what they want to hear because a lot of people seem to want to hear that the characters have taken over... or else, that writer is being exceedingly lazy and not paying attention. The characters NEVER really take over.*


As much as I respect the man, I have to say I think he was wrong here.  And, if you’ve ever been reading the Wheel of Time series and wanted to reach into the pages and strangle one of his characters for making the same stupid mistake for the fifth or sixth time in a row, I bet you’ve wished he was willing to let his characters surprise him too.

On the other side, some of my other favorite authors, including Anne Rice (after whose character yet another of my children is named) and Stephen King (who is my ultimate literary idol) have implied or even come out and said that they never know what their characters are going to say next, and they’re just as surprised as the reader by their characters’ actions.  This is a bit too much hand waving for me.  It goes beyond metaphysics and into prestidigitation.

Basically, what I want is a theory that does allow my characters to surprise me, at least sometimes, but is still founded on rational, explicable thinking.  I want to be in charge as far as I can be, but not so far that I limit the organic reality of my faux people.

And, after a lot of pondering, I think I’ve found such a theory.

Let me approach this from an oblique angle.  Imagine your best friend.  Do you ever have conversations with your best friend, in your head?  You know, practicing for what you fear might be a difficult topic, or daydreaming about the two of you doing this or that, or whatever?  Sure you do.  In those conversations, your friend will say, or do, different things, and those things are likely exactly what your friend would do or say in real life.  But it’s all in your mind.  You have the ability to predict, with a pretty high degree of success, how your friend is going to react in a given situation.  And you know why you can do that?  Because you know things about them.

You know he never got along with his parents and left home at 17.  You know that she had an older sister that she always competed against, even though the sister herself never tried.  You know that he was raised Baptist and is now an agnostic.  You know that she was raised atheist and discovered Buddhism and fell in love with it.  You know that he hates peas but loves asparagus; you know that, when she goes to an amusement park, she’ll ride anything except the rides that go around in circles, because they make her queasy.  You know that, when he gets drunk, he gets maudlin and sappy; you know that she harbors a secret disdain for women who “pamper” themselves with massages or manicures.  You know that, in middle school, he was a bully, which he looks back on with shame.  You know that, in high school, she considered herself dorky and unpopular, but that there were at least two different boys who were madly in love with her.

And it doesn’t actually have to be your best friend.  Anyone that you’ve known for a long time will fall into the same bucket: family, even if you don’t particularly like them; out-and-out enemies, for that matter; even co-workers, if you’ve worked together long enough.  If you know them well, you know what they’re going to say in response to this or that.  If you can’t do that, you don’t really know them that well, right?  And, sure, you’re occasionally wrong, but that just adds another datapoint that will make you more likely to be right the next time.

We know that knowing all these details makes us more able to predict with certainty what a given person will do, how they will react to a given situation.  But we don’t know exactly how.  We know that all these details feed into a complex mental model, a sort of simulation of the other person.  The friend that you had that conversation with in your head isn’t actually your friend: it’s just a symbolic representation of that person.  But it’s close enough that you can use it to have a conversation with, just like a real person.  And, most of the time, your mental model of the real person will react in realistic, appropriate ways.

So how does knowing that your friend hates peas help you predict that he won’t take kindly to the suggestion that he’s treating his girlfriend badly?  We don’t really know.  But it all feeds into it, somehow.  We know that some mental conditions make it much harder for certain people to do this.  We know that, just like anything that people do, some people are better at it than others.  But everyone can do it, to a lesser or greater extent, and it works.  And the fact that we don’t entirely understand it provides the element of mystery to it.  Sometimes your mental model of your friend will surprise you with her answers.  And yet you still know it’s right.

Now you see how we can apply this to creating fictional characters.  Authors are famous for inventing countless details about their characters that never appear in the actual story: “backstory,” we call it.  Why do we bother with this?  Because we’re building mental models.  Our mental models of a made-up person have a major disadvantage that models of real people don’t have: there’s no feedback loop.  With a real person, their actions in the real world are constantly helping us refine our models of them.  On the other hand, models of fictional characters have a huge advantage over models of real people: they can be complete.  No matter how well you know another person, you will never know everything about them.  There will always be some secrets, something held back ... even if the other person doesn’t mean to.  There just isn’t enough time for someone to tell you everything that’s ever happened to them or everything they’ve ever thought about when they were alone, even if they could remember it all.  But a fictional character can’t hide anything from their author.  You know all: their deepest secrets, their innermost thoughts.  You can make up as much or as little as you need to, and you can always add more later.

Of course, you have to be careful about adding.  If your character has already appeared in the story, and you go fiddling with their backstory, you might inadvertently change how they should have reacted to something that you already wrote.  You also have to consider that the experiences that happen them in your story (that is, the plot points) are now experiences that feed into your mental model of them.  In this way, your characters will grow as the story goes on.

And now you can see how you are in charge of everything, and yet your characters can still surprise you.  With my characters, I find myself having long imaginary conversations with them, and, yes, occasionally they do surprise me with their answers.  I don’t always know why they say this or that; I just know it feels right.  And sometimes they even do things which completely mess up my authorial plans.  And, when that happens, you better just go with it.  If you try to force them into the course of action your plot demands, they’ll start to feel fake to the reader.  The reader won’t even be able to put their finger on why; they’ll just throw down your book in frustration and cry “Frederica would never act like that!” and storm off in a huff.

You see, readers have mental models too.  And they’re not required to respect your plot.

So, in a certain way, it is like your characters are talking to you, but there’s nothing mystical about it.  There’s a perfectly logical explanation, and it involves you maintaining ultimate control.  But that doesn’t mean you get to put words in your characters’ mouths all willy-nilly either.  There are boundaries.  And there can be surprises.


* from an AOL chat, preserved by Theoryland of the Wheel of Time

Sunday, June 9, 2013

Perl blog posts #13 and #14


For only the fifth time ever, I missed a blog post last week.  I lost my driver’s license—actually, my entire money clip—and I was scrambling around, trying to replace everything before I had to get on a plane last Sunday.  So I have a reasonable excuse, I suppose.  Except for the fact that I had several posts all ready to go; all I had to do was get one of them up.  Ah, well.  My mind was fried.

Part of this was the moronity encountered when I was trying to replace my photo ID (which, you know, is sort of important for flying these days).  (If you were at YAPC with me, you probably want to skip this paragraph and the next, because I’ve already subjected you to this rant.)  Let’s start with the California DMV: the new driver’s licenses are all fancy and holographic, presumably to cut down on fake IDs.  But it means that, when you go to get a new license, they hand you a piece of paper off their printer.  Like a dot-matrix printer, even.  The fancy license gets mailed to you later.  Try convincing a TSA guy in Texas that the piece of paper printed off on 1980’s technology is your official state-issued ID.  But here’s the stupid part: there were 17 windows at the DMV, and, at every single one, there’s a thumbprint scanner.  Which scans your thumbprint and identifies you in real time.  Nice that I don’t really have to have much ID to get my ID, once I got my thumbprint in there in the first place, but the point is, you can afford 17 real-time biometric scanners, but you can’t afford one lousy holographic printer? really?

And then there’s Costco.  Your Costco card has your picture on it, and I actually read online that people had successfully used that with the TSA in a pinch.  So I went to get a replacement Costco card, just in case it might be useful.  They asked me for a photo ID.  I was tring to get a photo ID, I pointed out.  They said they couldn’t issue me a Costco card without a photo ID.  I pointed out that they already had my picture online: just bring it up on your computer and then look at me.  The lady looks at me and says: “But the picture is stored at the corporate headquarters.  It could take a few days to bring up.”  Seriously???  Have you people never heard of this little thing called the Internet?  I can get pictures from China in seconds, but you think it’s going to take you a few days?

And, after all that, the only person who really gave me any crap over not having a license with a picture on it was the dork at the cheap hotel I stayed at.  I even managed to get a rental car with my dot-matrix ID.  So that was nice.

Interesting side note: our best guess as to where the money clip went was that my youngest threw it away.  That’s her new thing: taking whatever she can lay hands on and thoughtfully putting it into the trash can, or recycling bins.  So helpful.

Anyhow, to make up for missing last week, I’ve posted not one, but two tech posts on my Other Blog.  So, if you’re into Perl, check out my post on notes in Vroom.  And you can also read about my experiences at YAPC 2013 if you like, and that one doesn’t require you to speak Perl at all.

I should be back on track starting next week.

Sunday, May 26, 2013

Free at Last, Free at Last ...


Next week I won’t have a job.

This is by design, I should clarify.  I’ve given myself two weeks between jobs to decompress a little.  You know how some people say you should regularly do saunas or colonics to flush all the toxins from your system?  Sort of like that.

So for the next 15 blissful days, I’ll be lazing around, mostly doing nothing.  I’ll spend part of the time at a technical conference (where I’ll actually be delivering a talk, which is pretty nifty), but mainly just doing nothing.  Relaxing.  Winding down.  Chillin’.

Then I’ll start a new position at a new company, which I’m pretty excited about.  Not much to say about that yet, since all I know is what one can gather from the interview process and the background research that accompanies it, but I’m heartened by that fact that folks there seem to have read this blog (including the extensive series on the Barefoot Philosophy) and wanted to hire me anyway.  I think our goals will be plenty sympatico.

What I’m leaving is approximately six years at a company that I really enjoyed being with ... at least for part of that time.  Having signed a piece of paper that strongly enjoins me from saying anything that might cast my former employer in a negative light (and tell me that shouldn’t have been a danger sign), I will restrict myself to enumerating a few facts.

  1. When I started work at this company, it was owned by eBay.
  2. eBay was a pretty great place to work.  It wasn’t perfect by any means, but what complaints I had were mostly surmountable, and there were many layers of management between me and those policies, most of which layers were dedicated to making sure said policies didn’t impact my productivity.
  3. This company was sold by eBay to a different company.
  4. One year later, I’ve resigned.

There.  Nothing “negative” about that, right?  Just the facts.

I have noticed a trend in smaller companies that are acquired by larger companies.  The last company I worked for being owned by two different companies, I got to experience it twice.  Also at the company I worked for before that.  Also at a few of the companies I consulted for when I owned my own business.  Also at companies which I know of because they’ve employed friends, or family members.  Large companies which are essentially conglomerations of smaller companies (or one core business surrounded by many “satellite” subsidiaries, as in the case of eBay) seem to be run very differently than the smaller companies they were once composed of.  I’m not sure why this is.  The smaller companies were successful when they were independent: if they had not been, they would not have been purchased.  However, they inevitably fail as part of the larger entity, when they’re being run differently.  This is a trivial pattern to pick out for anyone who has spent more than a few years in the corporate workplace.  And yet the mistake continues to be made, over and over again.  I’ve always had a high tolerance for ignorance, but a very low one for stupidity.  When you make a mistake once, that’s ignorance.  When you continue to make the same mistake over and over, that’s stupidity.

The mistakes are somewhat varied, but the core of them is pretty much the same.  The smaller organization was nimble and responsive, but the larger company imposes rules and process.  The smaller organization had some lean years, but they perservered and grew stronger because of them; the larger company seems to expect an infinitely-increasing growth curve, with the result that even when you make money, you’re chastised for not making enough money.  The smaller organization valued employees and built its team slowly and with great precision, until every warm body was integral to its success, and there was no waste—not a single speck of fat to be trimmed.  The larger company sees the employees as faceless, replaceable cogs in a machine, and can’t understand why people with vast amounts of business domain knowledge stored in their heads leaving should be a big deal.  Just get some more people.  Lots of people out there wanting jobs.  Hell, you can probably find someone even cheaper to do the same job.  That’ll help the bottom line, too.  Win-win.

I continue to believe that there are companies out there, even larger companies composed of disparate subdivisions, that don’t have this rather large blind spot.  But that’s mainly because I’m at heart a romantic, even though I’m also a cynic.  One day I’ll have to do a blog post on Cynical Romanticism.  I’m also considering a longer post exploring some of the concepts above in more depth.  But for today, I’m just happy to be free.  To do what I want.  Any old time.  (And you’ll have to take my word for it that that’s an obscure 90’s song reference and not an obscure 60’s song reference.  That’s just how I roll.)

I’d ramble on a bit longer, but this is starting to cut into my lazy time.  I’m sure you can all find something to amuse yourselves.  The Internet’s a big place, after all.  As for my little corner of it, it’s about hang up an “Under New Management” sign.  In a couple of weeks.  This week, the sign just says “Gone Fishin’.”

Sunday, May 19, 2013

Perl blog post #12


I’ve done another technical post on my other blog this week; it’s on the augment feature of Moose.  That’s Perl-speak, so pop on over there if you speak Perl.  If not, just relax and perhaps I’ll get something a bit more exciting next week.

Then again, my parents are visiting all this coming week, so perhaps not.  Who can say?

Sunday, May 12, 2013

Another Mother's Day



Sometimes when you pick up your child you can feel the map of your own bones beneath your hands, or smell the scent of your skin in the nape of his neck. This is the most extraordinary thing about motherhood—finding a piece of yourself separate and apart that all the same you could not live without.
— Jodi Picoult, Perfect Match


Last night I had a dream.

In it, I was back in college—not my past, college-age self, but my present-day self.  In the dream, this was a bizarre experience, both better and worse than it was at the time.  On the one hand, age and experience makes it much easier to be able to handle some of the things that we handled badly at that age.  On the other, perspective and an ever-increasing awareness of the preciousness of fleeting time means that’s it’s very hard to take some things seriously, like whether you got an A or a B on some test.  At least that’s how it was in the dream, with the result that I would shake my head fondly (but calmly) at the things my fellow matriculates were freaking out about, but attack seriously the things they blew off to have one more beer.

Many of those attending classes with me were actual people I went to college with.  Not my close friends, but friends of friends, or people who were just in the same class with me, or lived in dorm rooms next to friends of mine.  You know the people I mean: the ones you’d drink with at the parties, or debate points of philosophy with in the library, or perhaps sit with in the cafeteria if there wasn’t anyone else around you knew, but that’s about the extent of it.  In the dream, more than going to class, we would sit around and talk about stuff—I don’t know about your college experience, but that was a big part of mine.  You’d take some class you never really knew much about before, like anthropology, or psychology, or Eastern religion, and you’d learn these things that blew your mind, and you just had to share them with people.  And they were sharing with you the things that they’d learned which had blown their minds.  And you all worked together to make these things relevant to your life, dithering over whether the Heisenberg uncertainty principle could be applied to Jung’s theories of déjà vu and synchronicity, or whether believing that the rites of cannibalistic tribes are acceptable for them but not for you was simply intelligent avoidance of ethnocentricity or downright moral relativism.  A whole hell of a lot of what you learn in college is just facts: sparkly, and exciting, but useless in isolation.  Those long talks over alcohol, nicotine, illicit drugs or no drugs at all, just constant lack of sleep—those were how we developed the framework on which we hung all the pretty facts.

For some reason, all my opinions and outlooks on life surprised my former classmates.  Perhaps it was just that they’d never known me that well.  But, the more we talked, the more I realized that my responses were peppered with phrases such as “there’s just no way you can maintain that philosophy once you have children.”  Which is odd, because all of my perspectives on parenting were developed back in my college days, and they really haven’t changed very much.  But none of these disucssion were actually about parenting.  They were about ... well, it’s hard to remember—you know how dreams are .. but things such as foreign policy and population control and spirituality vs religion and those sorts of abstract things upon which we all have strong but mostly uninformed positions.  But all my ways of looking at the world, my entire weltanschauung (to use a fancy word I learned in college), seemed subtly but irrevocably altered by my fatherhood.

And (I don’t know how I can know this, but, in that strange way of dreams, I do) it wasn’t merely the fact of my fatherhood.  It wasn’t just the existence of my children, but the children themselves.  Them as individuals, the particular people that they both already are and are growing to be.  There is a certain, inexplicable way that any new person you develop a close association with modifies your course in life, but the way that children do so is more profound, somehow. 

Abraham Lincoln supposedly once said:

All that I am or ever hope to be, I owe to my angel Mother.


(A shorter version of the quote is also attributed to George Washington.)  So it occurs to me that, if my children are responsible for changing the way I view the world, the ultimate repsonsibility for that lies with their mother.

Now, I’ve explored this concept before, both explicitly and abstractly, but apparently my subconscious felt there was more ground to be covered here.  Perhaps the annual recurrence of a day devoted to the celebration of motherhood was just seeping into the undercarriage of my brain.  Or perhaps my super-ego is trying to tell me that I need to appreciate The Mother a bit more.

On the one hand, it’s silly that I should need to be reminded to do this.  Without her, our children would never get educated, our bills would never get paid, our vacations would never get planned, and very little of our home would ever get improved.  Many of us would never get fed ... or would get fed infrequently, at least.  Tough to take all that for granted.

On the other hand, it can be too easy to forget the details as life goes whipping by.  There’s always something else to quibble over, some point of parenting to disagree about, some monetary issue to agonoize over.  Children can be annoying, whether human or otherwise: they pee on the carpet, spill your giant cup of water, feel sick to their stomachs, require help with video games or Legos or having their nails stuck in blankets ... there’s an endless amount of need to deal with, and sometimes you get lost in it, forgetting to pop your head up every now and again and remember how good you’ve got it.  Because they also curl up on your lap, nuzzle your legs, chase you around the house, challenge you to games, or just sneak up on you while you’re sitting on the sofa and lick your nose.  And none of that—not a single giggle or adoring look or nuzzled neck—would be possible without The Mother.

So one really shouldn’t require an annual day of celebration to remember all these things.  But I suppose one does, if only to force one to stop and ponder.  How much she has given.  Author Elizabeth Stone said:

Making the decision to have a child—it is momentous.  It is to decide forever to have your heart go walking around outside your body.


Author Debra Ginsberg went further:

Through the blur, I wondered if I was alone or if other parents felt the same way I did—that everything involving our children was painful in some way.  The emotions, whether they were joy, sorrow, love or pride, were so deep and sharp that in the end they left you raw, exposed and yes, in pain.  The human heart was not designed to beat outside the human body and yet, each child represented just that—a parent’s heart bared, beating forever outside its chest.


It’s a lot to risk, bringing a child into the world.  More than thrice as much, to risk bringing three, not even considering those who were lost along the way.  It’s hard, and joyous, and terrifying, and rewarding, and painful, and the most important, vital, life-affirming thing you get in this difficult, bitter world.  I’m lucky enough to have three quite pretty ones, and a mother for them who takes care of them, and of me.  It’s perhaps more than I deserve.  And a lot to be thankful for.

And I am.

Sunday, May 5, 2013

In Search of Better Résumés


Today’s blog is about writing a better résumé.

Having run my own business for 12 years, I certainly saw my share of résumés.  In fact, in my current job, I’ve spent many months working on hiring.  Between the two, I’ve seen hundreds of résumés, and been involved in hiring dozens of candidates.  So I have a bit of experience in this area.

Of course, mine is only one opinion.  Some people are going to agree and others will disagree.  I’ve already been told by one person with some experience in these matters that he didn’t care for my personal résumé format ... too “fancy.”  But my format is informed by several rules that I have when personally reviewing résumés, and I have been, at several points in my career, the guy to impress when you wanted to get a job at my company.  So take that as you will.

Tip #1: Keep it short.  Résumés are almost universally too long.  The truth is that, when you’re faced with reading a dozen résumés a day, you can’t read them all anyway.  You’re going to just scan them.  And, even then, to be terribly terribly honest, I’m usually starting to drift off towards the top of page two.  Do everything in your power to reduce your résumé to one page.  And, realistically, unless you’ve been doing whatever it is you do professionally for a minimum of ten years, this shouldn’t even be difficult.  Having a two or even three page résumé when you’re just a year or two out of college isn’t impressive.  It’s pretentious.  Even at 10+ years, when it ceases to be unbelievable, it’s still unnecessary.

Let’s face it: the vast majority of résumé content is bullshit.  Everyone knows this.  Any decent résumé reviewer also knows this and will completely ignore most of the crap on your résumé anyway.  So don’t give them lots of crap to ignore.  Hit the highlights—that’s all they were really going to read in any case.  And this way you get to decide what the highlights are instead of having the reviewer take their best guess at it.

This year I’ll hit my 26th anniversary as a professional programmer.  I still got my résumé down to a single page.  If I can do it, you can too.  And people are far more likely to read the whole thing at that length.

Tip #2: Focus.  I’m a Perl programmer.  I generally am looking to hire Perl programemrs.  If you send me a résumé with a list of languages on it and Perl isn’t first in the list, I’m setting your résumé aside.  I’ve got plenty of other résumés where Perl is the first language in the list.  I want someone who’s passionate about Perl.  When you bury the lead in the middle of a rote list of languages you know, that doesn’t scream “passionate” to me.

Even worse, don’t put it in the wrong category, and don’t misspell it.  I have seen résumés for Perl jobs where Perl didn’t appear in the list of langauges at all, but in some other category like “Scripting.”  Sure, Perl is a scripting language.  Listing C++ and Java under “Languages” and Perl under “Scripting” isn’t going to win you points for being technically correct.  Even if I were to agree with you that you were technically correct—which I certainly would not—why on earth would I want to hire someone with so obvious a disdain for the language they were looking to be hired for?  And while misspelling anything on your résumé is pretty awful, misspelling the primary focus (e.g. “PERL” instead of “Perl”) is instant death.

And don’t give me any excuses about how you need a single résumé to submit to multiple different jobs.  If you’re seriously applying for more than one different kind of job—perhaps you’re both a Perl programmer and a C++ programmer, or perhaps both a programmer and a QA engineer—then make different résumés.  Even if the only difference is which language you list first, that’s a difference worth making.

Speaking of listing languages, don’t list every language you’ve ever dabbled in.  Hit the top 4 or 5 (or even fewer) and move on.  Remember: just the highlights.  I used to put Fortran on my résumé because I took a course in it once.  In college.  Thirty years ago.  I couldn’t program in Fortran if my life depended on it; why was I putting it on my résumé?  Just to pad.  And since it was tenth in a list of ten languages, I’m sure my reviewers had already decided they were drifting into bullshit territory long before they got there.  So why was I bothering?

Hopefully you can turn these specific examples into general advice.  If not, you probably have more issues than I can reasonably help you with.

Tip #3: Dates.  I don’t read most of the details on a résumé.  You know the one thing I do read?  The dates.  The dates on a job.  I look for particularly long gaps.  I look for how long ago you last worked with this or that.  I look for how long ago your first job was, because that tells me far more precisely how long you’ve been at this than some general “blah-di-blah years of experience” up at the top.

Every job should have a month and year that you started, and a month and year that you ended.  The most recent job (i.e. your current job, if you’re currently employed) should be first, and they should go in reverse chronological order, and your first job should be last.  I may very well jump to the end to see the start date on that first job.  Don’t bother with the exact day; I don’t care that much.  On the other hand, just years may not be fine-grained enough.

If you do have a large gap in employment, don’t try to hide it by leaving dates off altogether.  However bad it may look, I can always imagine worse.  When you don’t put dates on your résumé at all, I can’t see when you did what.  This irks me.  Don’t irk me.

Oh, and by the way: include every job you’ve held in the field you’re trying to get a job in now.  Some people will tell you not to do this.  I’ve been told, for instance, that I shouldn’t bother with my first couple of jobs.  They were a long time ago, after all, and there isn’t much there that’s relevant to my career now.  But when I review résumés, as I said above, I’m going to jump to the end at some point and look at the date on your oldest job.  That’s how long you’ve been in the business.  If you leave off your first job in the field, then I don’t know how long you’ve been doing this.  Do you not want me to know how long you’ve been doing this?

Now, don’t get me wrong: I don’t need to see (and actively don’t want to see) your jobs outside the field.  It doesn’t matter that you were a dishwasher or a pizza delivery guy or a construction worker or a paperboy.  I could care less.  But if it’s related to what you want to do—even tangentially—put it in there.  Be very brief in your description, since it doesn’t much matter and I’m likely not going to read it anyway, but put it in there.

Tip #4: Nobody cares about ...  Remember how, in high school, your teachers and your principal and your guidance counselor told you that your school record would follow you around for the rest of your life?  They lied.  I have never told a single person in my entire life what my high school grade point average was.  I never even put it on my college applications, although I’m sure they got it from the high school records upon request.  I have also never told a single person what my college grade point average was.  I don’t even remember what either of them were any more, to be honest.  I used to tell people what I made on the SATs every now and again, until I realized there were plenty of people in the world who had done better than I had and I should just shut up about it.  But I’ve never told an employer what it was, and I’ve never been asked.

I do not care what your grade on anything was.  It’s beyond irrelevant.  I also do not care what your hobbies are.  Some people will tell you that interesting personal details like this make you stand out.  They do not.  They make reviewers wonder why the hell you are telling them this.

One other thing: I have never called a personal reference.  Ever.  And I never will.  If you put them down on your résumé, they like you.  No, more than that: they adore you.  If you put someone down on your résumé as a personal reference who does not adore you, then you are a moron.  If you are a moron, I’m not going to hire you anyway, and I don’t need a bad personal reference to figure that out, so it’s a waste of time to call them.  If you are not a moron, any personal reference I call is going to tell me how utterly awesome you are, and I know they’re going to say that ahead of time, so it’s a waste of time to call them.  I don’t have time to waste.  I have hundreds of résumés to review, remember?

Tip #5: But they do care about ...  Every field is going to have a few unique things that don’t fit into a standard résumé format.  For me, it’s a link to my blog (my technical blog) and a list of the CPAN modules I maintain.  For you it might be professional organizations, or certifications, or who knows what all.  Put yourself in the reviewer’s shoes.  Pretend that you were going to hire a coworker.  If you had to work with someone for the next several years, what would you want to know about them besides all the other places they’d worked?  Would you really care where they went to school and what they majored in?  (There are perhaps some jobs where you would, but probably not.)  What about articles they’d written?  (Probably so, but then again maybe not.)  Only you, or someone else in your field, can answer this question.

Tip #6: Contact info.  Please, for the love of all that is holy, put your phone number and your email address on your résumé.  And absolutely under no circumstances allow your recruiter, if you must use one, to remove them.  Nothing frustrates me more than a résumé for someone I can’t contact.  And do not put either one or the other.  Put both.  Some people like phone calls.  Some people (like me) prefer emails.  You don’t know which type is going to end up with your résumé; don’t risk pissing off half of your potential reviewers.

Tip #7: Review.  Everything you ever write you must review.  Never, ever, under any circumstances, let a single thing that you write leave your possession without rereading it.  Nothing.  Not a letter, not a report, not an email, not an instant message.  And absolutely positively not something as vital as a résumé.  A résumé should be reread several times.  In fact, you should reread it before you send it to anyone.  Every time you send it to anyone.  You will constantly find mistakes or areas of improvement in your résumé, even when it’s been around for years and you’ve read over it hundreds of times.  Read it again.  You’ll find something else.  Pick apart the spelling, the punctuation, the grammar.  Give it to friends to read for you.  Pick the people you know who write the best and make them help you.  Read it aloud to yourself and listen to yourself.  Any time you hear yourself stumble over something, change it.

Tip #8: Don’t be afraid to experiment.  There is something to the idea that your résumé can be too over-the-top.  But there’s a long way to go before you go too far.  Résumés are depressingly similar, and when you have to go through hundreds of them, they all start to blur.  Anything that sets yours apart is far more likely to be positive than negative.  Look at it this way: even if the reviewer doesn’t like the risks you take, they’ll remember them.  I got a résumé once completely written in a strange, futuristic font.  I made fun of it mercilessly, but I still remember that candidate’s name.  Moreover, in the process of making fun of it mercilessly, I showed it to everyone in the office.  That’s the sort of exposure you can’t buy.

Once upon a time, people might recommend that you put your résumé on some sort of unique paper: pink, perhaps, or a heavier bond.  Nowadays everything is electronic, though.  Of course, you can do things with an electronic format that would be difficult or impractical to do on paper, if you have the skills.  You could, for instance, make your own watermark.  Or add a detailed image to your résumé, if that might have value.  You can definitely take this one too far—if you could somehow rig it so that, whenever I opened your résumé, a .wav file of the 1812 Overture played, I would consider that to be the résumé equivalent of the dreaded blink tag, and I would see you in hell before I saw you in the workplace.  But there’s a hell of a lot of room to play in before you reach that point.  Try it out on your friends before you try it out on an employer, if you’re worried.

Putting it all together.  So do I practice what I preach?  Well, here’s my résumé so you can judge for yourself.  Note that it all fits on one page, despite having quite a few years to fit on there.  In order to make that happen, I went with the two-column format, which is the experimental part.  I included a few things that some résumés don’t; I excluded a bunch of things many résumés have.  All my programming jobs are listed, and they all have dates.  Every job (except the first few, which are listed last) also includes exactly what technical things I was doing, so that anyone can see how old my experience with this or that is, or how long I’ve been continuously working with something.  My technical skills section has gone from being a long list of long lists to being a short, singular batch of bullet points, with only the top-tier skills listed.  And Perl is first, because that’s the sort of job I want to get.  And I’ve read it over and over again a hundred times.  At least.

In fact, the only piece of my own advice I didn’t take was including my phone number.  This is because I am a grumpy old man who doesn’t particularly care for phone calls, and I can afford to eliminate those people who can’t operate their email.  But this is definitely one of those do-what-I-say-not-what-I-do things.

So, there’s some advice on how to present your résumé, from someone who has some experience in those sorts of things.  Take it or not, as you please.  In fact, now that I think on it, the more people who listen to this advice, the fewer résumés I can toss aside without having to do phone screens.  So, actually, don’t take my advice.  Haven’t I told you not to read this damn blog?  Stubborn bastards.