Ben J. Christensen

Software Development and Other Random Stuff

Moved to Netflix

This week I started a new job at Netflix as a Senior Software Engineer on their API Platform team to work on this: http://techblog.netflix.com/2011/02/redesigning-netflix-api.html.

Hence, the silence while I’ve worked at Apple is somewhat lifted so I may get back to writing on my blog more often – particularly about technical things.

Filed under: Uncategorized

3 Signs of a Miserable Job

I read “3 Signs of a Miserable Job” and found it to have some good insights into jobs, career and particularly management. It’s an easy read, most of the book in the form of a fable, readable in an evening or two. 

It can be found on Kindle or iBooks

Below are some screen-captures of passages I liked (sorry for the images as opposed to text):

Summary of the “3 Signs”

3 signs of a miserable job

The book makes it clear that it doesn’t matter what the job is nor does higher compensation ultimately negate the need of these things. 

What a miserable job is

Miserable employee

In the end, the manager is the person who has the biggest impact on a persons happiness in their job and the case is made as to the importance of a manager in the life of those he manages yet how most managers don’t realize this nor act on it – hence the misery of many in what would otherwise be fulfilling and satisfying jobs.

managers should be frank

For me “immeasurement” is the one that hits closest to home as being something that affects me in my day to day life and that I’ve done poorly when I’ve managed others. 

immeasurement

Software development (where I personally have experience and can apply these lessons) in general is difficult in this regard – projects and code are never really done. Sure, something is deployed or ships, but then it’s on to fixing things, adding the next feature or whatever, and rarely does an individual person have full impact on a product or system such that they can measure their success with it, especially on large teams or products. 

Timelines or task completion are impossible to use as yardsticks as they vary wildly and change all the time – the very definition of “moving goalposts”. Don’t even get me started on “lines of code” – the worst possible form of measurement. Bugs (or lack thereof) don’t work either for many reasons that I won’t get into here. 

I have yet to see an objective way of measuring software development that works – any ideas?

Filed under: Management & Leadership

Leadership, Solitude and Thinking

These are quotes that I liked on the subject of leadership from the following article which I recommend taking the time to read and think about.

Solitude and Leadership: an article by William Deresiewicz | The American Scholar

“solitude is one of the most important necessities of true leadership”

“what I saw around me were great kids who had been trained to be world-class hoop jumpers. Any goal you set them, they could achieve. Any test you gave them, they could pass with flying colors. They were, as one of them put it herself, ‘excellent sheep.’”

“excellence isn’t usually what gets you up the greasy pole. What gets you up is a talent for maneuvering. … Not taking stupid risks like trying to change how things are done or question why they’re done. Just keeping the routine going.”

“We have a crisis of leadership in this country, in every institution.”

“We have a crisis of leadership in America because our overwhelming power and wealth, earned under earlier generations of leaders, made us complacent, and for too long we have been training leaders who only know how to keep the routine going. Who can answer questions, but don’t know how to ask them. Who can fulfill goals, but don’t know how to set them. Who think about how to get things done, but not whether they’re worth doing in the first place. What we have now are the greatest technocrats the world has ever seen, people who have been trained to be incredibly good at one specific thing, but who have no interest in anything beyond their area of exper tise. What we don’t have are leaders.

What we don’t have, in other words, are thinkers. People who can think for themselves. People who can formulate a new direction: for the country, for a corporation or a college, for the Army—a new way of doing things, a new way of looking at things. People, in other words, with vision.”

“there are a lot of highly educated people who don’t know how to think at all.”

“what makes him [General David Petraeus] a thinker—and a leader—is precisely that he is able to think things through for himself. And because he can, he has the confidence, the courage, to argue for his ideas even when they aren’t popular.”

“true leadership means being able to think for yourself and act on your convictions”

“people do not multitask effectively. And here’s the really surprising finding: the more people multitask, the worse they are, not just at other mental abilities, but at multitasking itself.”

“Multitasking, in short, is not only not thinking, it impairs your ability to think.”

“You do your best thinking by slowing down and concentrating.”

“Leadership means finding a new direction, not simply putting yourself at the front of the herd that’s heading toward the cliff.”

“Once the situation is upon you, it’s too late. You have to be prepared in advance. You need to know, already, who you are and what you believe: not what the Army believes, not what your peers believe (that may be exactly the problem), but what you believe. How can you know that unless you’ve taken counsel with yourself in solitude?”

Filed under: Management & Leadership, Politics, Skills

Trigger Native Javascript Events with Prototype.js

After much searching and playing with various solutions, I found one at this page:

http://stackoverflow.com/questions/590289/javascript-event-that-fires-without-user-interaction/590339#590339

This provides an easy method for programmatically invoking native events such as “onchange”.

Here it is:


// this supports trigger native events such as 'onchange' 
// whereas prototype.js Event.fire only supports custom events
function triggerEvent(element, eventName) {
    // safari, webkit, gecko
    if (document.createEvent)
    {
    var evt = document.createEvent('HTMLEvents');
    evt.initEvent(eventName, true, true);</code>

        return element.dispatchEvent(evt);
    }

    // Internet Explorer
    if (element.fireEvent) {
        return element.fireEvent('on' + eventName);
    }
}

This is primarily to deal with prototype.js not allowing the firing of native events (which jQuery does).

Here is another approach I found but have not tried which adds the capability to prototype.js: event.simulate.js

Filed under: Code

Useless SVN Error Message: Network connection closed unexpectedly

If you’re trying to do a subversion checkout using svn+ssh like this:


svn co svn+ssh://hostname/path

… and are getting a useless error like this …

svn: To better debug SSH connection problems, remove the -q option from 'ssh' in the [tunnels] section of your Subversion configuration file.
svn: Network connection closed unexpectedly

Try removing .ssh/known_hosts (which fixed my issue) or ensure that the private/public keys in .ssh have the right permissions, such as this:

benjchristensen-notebook:~ benjchristensen$ ls -al .ssh/
drwx------ 6 benjchristensen staff 204 Jun 1 09:30 .
drwxrwxrwx+ 39 benjchristensen staff 1326 Jun 1 09:24 ..
-rw------- 1 benjchristensen staff 1743 Jun 1 09:17 id_rsa
-rw-r--r-- 1 benjchristensen staff 423 Jun 1 09:17 id_rsa.pub
-rw-r--r-- 1 benjchristensen staff 413 Jun 1 09:30 known_hosts

Filed under: Tools

My Job Hunt – How I Ended Up At Apple

I started working for Apple in their iTunes Store division on December 14th 2009. It’s been a great 6 weeks so far and I look forward to a long and interesting future here at Apple.

Considering the state of the economy and job market I consider myself blessed to have gotten such a great new job – but I worked hard in my hunt and thought it might be of use or interest to others what it took to find a new job.

So, my job hunt “by the numbers” …

Time on Hunt
  • 14 weeks (4 1/2 months)
  • August 11th to November 18th
Job Boards Used
  • 7+
  • Dice, TheLadder, Monster, Jobirn, Indeed, CyberCoders, SimplyHired
Cost (in money, not time)
  • $1000+
  • $700 on resume
  • expenses that weren’t reimbursed during interviews I traveled to
Friends or Colleagues Notified
  • 6 (It was a private affair for the first 3/4s of the search)
Cities I Looked At
  • Virtually anywhere in the US with a big city ….
  • In particular I was pursuing cities in the following order…
    • Denver (cause that’s where I lived and own a home)
    • Austin
    • Dallas
    • Phoenix
    • Las Vegas
    • Southern California
    • Northern California
  • I considered East Coast and that direction (New York, Virginia, DC, Chicago etc) after finding opportunities out there.
Jobs Applied or Responded To
  • 59 or more not counting the many emails I received and ignored outright
Outright Rejections
  • 6
Companies Who Ignored Me
  • 30+ whom I never heard from even after attempted followups
Advanced Interviews
  • 6
Source of Leads (for those 6)
  • 2 – recruiter found my resume on a job board and contacted me
  • 1 – I responded to a posting on a job board
  • 2 – I submitted to job postings directly on the company site
  • 1 – friend referred me to a job at his company after seeing me post on LinkedIn that I was looking (in the last 1/4 of my search when I made it public)

Number of Engineers that Interviewed Me at Those 6 Companies

  • 30+
    • 12 at one company, 10 at another

Flights to Onsite Interviews

  • 4
    • Chicago
    • Cupertino
    • San Francisco
    • Carlsbad (San Diego County)
Offers Received
  • 3
Rejections After Advanced Interviews
  • 1

All in all it was a great experience. I learned a lot about myself, my worth, what I’m interested in and what opportunities are out there for me.

I had been at Etilize for 7 1/2 years and NEVER gotten a job via a resume before, so this was a significant experience for me to go “out of the blue” searching for a job and get one without having connections before hand.

A few things that I found significant in the process:

1) Get a Professional Resume

Paying for a professional resume writer to redo my resume made a HUGE difference. It made me feel much more confident about sending it off, but I also got much better feedback and callbacks once I began using it. It was completely worth the money and I’d recommend it to anybody serious about their job hunt.

As for the high cost — don’t go cheap is my opinion. Think about how long it takes to do a good job, the hourly rate you want to be paid and you’ll see that it’s impossible to have a proper job for $150 – which you’ll see advertised. I paid $700 and it was deserved.

2) It Takes Time

Plan for it to take longer than you want or expect. It all takes time.

3) Study

The questions I was asked are things that NEVER get asked or come up in the “real world” and are things I’d typically Google.

Sometimes that’s a valid answer … “I’d Google that” … but it won’t get you far on most interviews.

I had to dust off my understanding on a lot of computer science theory, algorithms, data structures, and other such things. In fact, the one major set of interviews I went through and ultimately got rejected from was the first series I went through and I believe 3 things caused the rejection (not my lack of skill):

a) questions about things I hadn’t studied (and studied thereafter and was prepared for in subsequent interviews)
b) I was over-dressed … a suit and tie for an engineering position set the wrong tone
c) I was not myself and stressed (this was more to do with the fact that it was my first real interviews in a decade … ok, ever…)

It was really frustrating at times and absolutely exhilarating at others … a real roller-coaster all the way through. By the end though I had a better sense of value and who I am and an exciting new career path.

Good luck to anyone else reading this and doing their own search!

Filed under: Personal, Skills

Technical Debt Quadrant

Martin Fowler wrote a blog entry on technical debt this week that communicates the concepts of “technical debt” and classifies them very well.

techDebtQuadrant

Some favorite portions:

“A mess is a reckless debt which results in crippling interest payments or a long period of paying down the principal.”

“The prudent debt to reach a release may not be worth paying down if the interest payments are sufficiently small – such as if it were in a rarely touched part of the code-base.”

“Not just is there a difference between prudent and reckless debt, there’s also a difference between deliberate and inadvertent debt. The prudent debt example is deliberate because the team knows they are taking on a debt, and thus puts some thought as to whether the payoff for an earlier release is greater than the costs of paying it off. A team ignorant of design practices is taking on its reckless debt without even realizing how much hock it’s getting into.”

“while you’re programming, you are learning. It’s often the case that it can take a year of programming on a project before you understand what the best design approach should have been. Perhaps one should plan projects to spend a year building a system that you throw away and rebuild, but that’s a tricky plan to sell. Instead what you find is that the moment you realize what the design should have been, you also realize that you have an inadvertent debt.”

Filed under: Architecture, Code, Management & Leadership

Statistics for Why Web Performance Matters

Following are some good posts with further evidence of the impact of webpage/webapp responsiveness to the user experience, amount of usage and ultimately revenue.

Good introductory quote to the external links and images shown below:

There’s no longer any debate. There’s reliable, reproducible evidence that web page latency is directly tied to the bottom line. At Velocity, Microsoft, Google and Shopzilla made this abundantly clear in a series of awesome presentations: detailed, controlled testing proves that slower pages hurt the bottom line. In Google’s case, adding delay reduces the average number of searches a visitor does each day even after the delay is removed.

Regarding “smaller scale” sites more typical than Google and Bing:

The results of their analysis show how significant a reduction in page latency can be. In addition to reducing bounce rates, and increasing pages per visit & time on site, they found a 16.07% increase in conversion rates and a 5.50% increase in average order value.http://radar.oreilly.com/2009/10/watching-websites.html

External Links:

http://radar.oreilly.com/2009/10/watching-websites.html
http://radar.oreilly.com/2009/07/velocity-making-your-site-fast.html
http://www.watchingwebsites.com/archives/proof-that-speeding-up-websites-improves-online-business

Good summary PDF showing metrics of performance impact.

conversion-rate-and-order-value

bing-delayimpact

Filed under: Performance, Production, User Interface

Mac OSX 10.6 Java – java.io.tmpdir

Migrating from OSX 10.5 to Snow Leopard, 10.6 caused all of my java projects using embedded MySQL MXJ to fail.

I found that this was because Java returns a very odd path for the “java.io.tmpdir” property:

/private/var/folders/b4/b44x97M0GFydt3jCKcowsU+++TI/-Tmp-/

This causes issues with MySQL MXJ as it converts the + signs into spaces so the path becomes:

/private/var/folders/b4/b44x97M0GFydt3jCKcowsU   TI/-Tmp-/

The original code was:

   private static File tmpDir = new File(System.getProperty(“java.io.tmpdir”));

To fix it I put in the following hack so that MySQL MXJ will now work again and I can still use the “java.io.tmpdir” property on other systems such as Windows:

   private static File ourAppDir;

   static {
      String tempPath = System.getProperty(“java.io.tmpdir”);
      // a fix to handle the crazy path the Mac JVM returns
      if (tempPath.startsWith(“/var/folders/”)) tempPath = “/tmp/”;
      ourAppDir = new File(tempPath);
   }

Filed under: Code

GMail Down for 100 Minutes

“Gmail’s web interface had a widespread outage earlier today, lasting about 100 minutes.”

See the following for details:

http://gmailblog.blogspot.com/2009/09/more-on-todays-gmail-issue.html

Filed under: Production Problems

Twitter Updates

View Ben Christensen's profile on LinkedIn
Follow

Get every new post delivered to your Inbox.