Ben J. Christensen

Software Development and Other Random Stuff

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/b44×97M0GFydt3jCKcowsU+++TI/-Tmp-/

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

/private/var/folders/b4/b44×97M0GFydt3jCKcowsU   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

Initial Impressions on Ruby Performance

I’ve spent the past day playing with Ruby and decided to test some basic performance – iterating and string parsing – to get an idea of what the performance is really like.

Ruby is not doing so well in my tests.

Note to Ruby Experts: If anyone can demonstrate what I’m doing wrong in my code or testing, I would love to be corrected.

My approach was to write the exact same code in Java and Ruby that loads up a file, reads each lines, tokenizes it into words using whitespace as the delimiter and counts up the tokens.

This avoids network or database IO and other external resources – except the filesystem which I don’t consider a significant variable in the test.

Further testing I’m planning on doing will test Rails, multi-threading and other common things I do in my apps.

Picture 3

On my laptop, a MacBook Pro 2.53Ghz Core 2 Duo with 4GB memory, the average times are:

  • Ruby 1.8.6 app: 8022ms
  • Java 5 app: 2986ms
  • Java 6 app: 1443ms

Source Code

After downloading, strip the .doc ending off of the files.

Program Output

macbook-pro:src benjc$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java FileReadParse
Starting to read file…
The number of tokens is: 7764115
It took 1502 ms
macbook-pro:performance benjc$ ruby file_read_parse.rb
Starting to read file …
The number of tokens is: 7764115
It took 7999.955 ms

macbook-pro:src benjc$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java FileReadParse

Starting to read file…

The number of tokens is: 7764115

It took 1502 ms

macbook-pro:performance benjc$ ruby file_read_parse.rb

Starting to read file …

The number of tokens is: 7764115

It took 7999.955 ms


Filed under: Code, Performance

Software Development Is Not Engineering

I have long considered it a fallacy to call software development “engineering”. Even though the term technically works for software as “the science, discipline, art and profession of acquiring and applying technical, scientific and mathematical knowledge to design and implement structures, machines, devices, systems, and processes that safely realize a desired objective or inventions” (see Wikipedia), this is not how the term ends up being interpreted and therefore misrepresents how software development actually occurs – since engineering has become synonymous with building physical structures such as buildings, bridges, roads. Recently someone with authority on the subject expressed this opinion much better than I could have, and since he has authority on the subject and in the industry, it means something.

According to Wikipedia, “Tom DeMarco has authored over nine books and 100 papers on project management and software development” and has been intimately involved over the past 40 years in the software industry and the establishment of “structured analysis”, software project management concepts and legendary software development projects such as the first large scale telephone exchange for Bell.

He recently wrote an article titled “Software Engineering:  An Idea Whose Time Has Come and Gone?

The article is well written and there is no value in me repeating it verbatim, so read the original.

The following quotes however are worth me repeating along with my commentary:

Software development is inherently different from a natural science such as physics and its metrics are accordingly much less precise.”

Software development is not like building a bridge – where the materials, laws of physics and chemistry, labor times etc have all been experienced and practiced thousands of times, can be accurately predicted and correctly planned for, then managed.

Software development is and always will be somewhat experimental. The actual software construction isn’t necessarily experimental, but its conception is. And this is where our focus ought to be. It’s where our focus always ought to have been.”

If we are writing software, it’s because we’re trying to do something that hasn’t been done before or is different in some way from what already exists, otherwise we’ll purchase the existing software. We are building a solution to a problem – to create value of some kind.

If we’re doing something that hasn’t been done before – either with new technologies, new rules, new performance criteria or whatever it is that makes it unique – then we are doing “research and development” – experimentation. It is not as if a blueprint for a house is given and the construction team comes in to build it as they’ve done 1000 other houses in the same community. Software “architecture” doesn’t work that way. There is never a replicate – because it’s not physical.

Yet business and project management would love it to be – it makes it easier to control, schedule and most critically, budget for.

Tom DeMarco discusses “metrics” in the most detail in the article, about why we spend so much time trying to control software development projects, and particularly the timeline/cost aspect.

He says:

For the past 40 years, for example, we’ve tortured ourselves over our inability to finish a software project on time and on budget. But as I hinted earlier, this never should have been the supreme goal. The more important goal is transformation, creating software that changes the world or that transforms a company or how it does business.”

After giving an example of two projects, one creating little value and one creating significant value he states:

“This leads us to the odd conclusion that strict control is something that matters a lot on relatively useless projects and much less on useful projects. It suggests that the more you focus on control, the more likely you’re working on a project that’s striving to deliver something of relatively minor value.

Ironically, I’ve generally seen the opposite perspective from business – that the “expensive” projects, the ones typically capable of creating the most value, are the ones where the most control of timeline and cost is desired and therefore the most damage done by “management” as opposed to allowing the necessary experimentation, design, thought, research and development to occur to create the most value out of the software.

Being criticized of being “unable to delivery on time” in software development is not something I can really take personally – when the industry at large struggles so significantly with this, largely because it has tried so desperately to liken software development to a public works engineering project such as building a bridge, a building or a road.

Software development is more like art than most seem willing to accept.

It is driven by creativity, experimentation, research, design and artistic drive.

Is it any wonder that the “transformative” software projects most often come from startups (Apple apparently being the exception with their iPhone OS and demonstrating the amazing culture of design they allow to flourish) and then as they mature become stagnant once quarterly reports drive business as opposed to the development of a product? Or that opensource, where timelines mean nothing, can build great software such as Linux, Firefox and MySQL? Look at what has happened to MySQL over the past 2 years as business “management” has replaced “experimentation” and focus on quality — the key people who built MySQL over the years have left to work on something where strict control is not the focus.

As Tom DeMarco suggests, I hope to be focusing on development where the value is worth allowing the proper time, people, experimentation and development to occur – so that something of true value can be created. If management of “costs” is the most important aspect of the project, the greatest value to be created, I don’t even want to bother. I’d rather work on a project that has the ability to be transformative, and create greater value than the cost of the effort.

software engineering:
An Idea Whose Time Has Come and

Filed under: Management & Leadership

Apprenticing to Learn Software Development

The foundation of my software development skills was set between 1995 and 1998 while I worked under the direction of my friend and mentor Andre Kruger. For a long time I called it “job shadowing”, but I have come to realize that it was an informal apprenticeship.

I have found those 3 years taught me more about software, system administration and technology than most get the opportunity to experience that early in their career – as I was learning and working on the job, tutored by someone who was incredibly intelligent and had years of knowledge and experience to share. He also provide me with invaluable insights and suggestions on what technologies and platforms to follow. It was he who suggested Java (when it was at version 1.0) was what I should focus on, not C – and that has served me well to this day – when the schools were telling me to learn Pascal.

I loved it and sucked up as much as I could learn. I also built software that did real things. Now I recognize how poor the code was – it was very bad. The point was that I was learning through doing real things in an environment where I couldn’t do significant damage and could receive instruction and guidance – and eventually as I progressed I could truly understand the benefits of design patterns, object oriented design and what it meant to be “in production”. It wasn’t theoretical – or some forcefully memorized and quickly forgotten trivia – I knew it.

I didn’t complete college/university – because by the time I got there it bored me to tears, as I had spent several years being apprenticed already and learned quickly on my own through books and experimentation. If I could have, I would have skipped to 3rd year and enjoyed myself, but our society and academic programs don’t work that way.

I believe apprenticeships are the ideal way to learn software development, as I see software as a craft – not an engineering or scientific skill where rules are learned and applied the same way every time.

I wish our society and industry would look seriously at its academic and theoretical approach to training – which I feel does not work very well – and consider a model more similar to apprenticeship.

I also really enjoy mentoring others who have raw talent and desire. Some of my most rewarding work of the past 5 years has been that which has resulted in colleagues progressing and growing, such as a good friend of mine Adnan Memon.

Perhaps I’ve accomplished the “master” status in certain aspects of my work, in others I’m still a “journeyman” I’m sure. I hope to find others who can continue to mentor me as I try do so for my juniors, as I think that’s where the best talent in our industry comes from.

Filed under: Skills

Learning by Pair Programming

Last week I learned how to program on the iPhone using Objective-C and Cocoa Touch by having two 2-hour pair programming sessions with Brent Coursey and about 8 hours of my own playing around.

I am comfortable now with XCode, Interface Building and Objective-C – enough that I can build code to do what I want it to do, compile, run, debug, test and install on my personal iPhone.

I’ve connected to web services via Objective-C and built a user interface to interact with the services.

All in all it was a good experience and great way to learn – and the pair programming was very useful in speeding up the learning process. Unlike 10 years ago where I plenty of time to learn through trial and error, it was much more effective to sit and watch someone and see how everything worked together. I was able to pick it up very quickly that way.

Of course, 10+ years of object oriented programming in Java translates over well to the thinking and expectations – but the syntax and different ways of doing things were far from natural for a java programmer (especially one who had respectfully ignored the C way of doing things), so the demonstration received through pairing was immediately beneficial. (On second thought, ignoring C probably helped since I saw Objective-C as an OO language from the start – not as C)

A 2 hour session with Kent Beck sold on EBay for $405. That would be quite the experience – would love to do that and see how he or someone else at his level does their craft.

Filed under: Skills

Software Development is Not “Computer Science”

These guys are “computer scientists”.

Being a programmer, developer, architect etc does not in my opinion constitute being a “computer scientist” or working in “computer science”.

Perhaps the most general definition of science can be used for “developers” if we stretch:

- a branch of knowledge or study dealing with a body of facts or truths systematically arranged and showing the operation of general laws: the mathematical sciences.

But that doesn’t describe the whole of it like these definitions do:

- systematic knowledge of the physical or material world gained through observation and experimentation.

- knowledge, as of facts or principles; knowledge gained by systematic study.

As programmers we don’t do this – we use technology (the “applied science”) to build things and solve problems.

We may sometimes pretend to venture into “science” as we “research solutions” – but we’re just looking for knowledge and facts the “scientists” have figured out and then applying them in unique and novel ways.

Calling a programmer a scientist is like calling an artist a chemist because they use chemical compounds (paint, graphite, clay, steel, glue whatever).

Why does this matter to me?

Because by training our programmers in theoretical “Computer Science” educational programs, we are not actually creating employable or productive people. Sure, they have basic skills and theory that can then be applied through further effort – but unless they are one of the rare few to study, analyze and experiment with computer science theory – most of the knowledge gained serves little to no value in applying the techology of software development in real-world programming of software.

Filed under: Skills

Twitter Updates

View Ben Christensen's profile on LinkedIn