Categories
Uncategorized

The Difference Between Microsoft and Apple Coverage on Techmeme (or: “Nobody Likes Us, Everybody Hates Us, Think We’ll Go Eat Worms”)

Looking at tonight’s list of stories in the tech news aggregator Techmeme, it seems that I made the right call in leaving Microsoft.

I left in 2011, when I held the title of Developer Evangelist and a special role of Windows Phone Champ. One of the factors in my decision to leave was their promising to make me the specialist for “the next version of Surface”; I’d heard that they were yanking that name from the big-ass table and repurposing it for the new “slate” computer.

“Oh, great,” I thought, “I’ll be representing not one, but two products that no one will care about, fighting hammer-and-tongs for a very sad, very distant, third place.”

It would seem that my instincts were correct. Consider the stories that were listed on Techmeme tonight, Tuesday, October 22nd, 2013 at around 11 p.m. Eastern time. It’s the evening of the day when both Nokia, now effectively Microsoft’s mobile hardware department, and Apple made big announcements about their new tablets.

Here all two of the “Nokisoft”-related stories on Techmeme’s main story list, which were clumped together at the bottom of the page:

microsoft-nokia on techmeme

And here are the Apple-related stories, which were positioned at the top. They dominated a huge swath of Techmeme:

apple on techmeme

Now while you have to keep in mind that Apple’s announcements spanned more than just mobile devices — they also covered OS X Mavericks and the fact that it’s free-as-in-beer, the new free-as-in-beer iWork and iLife, as well as the Mac Pro and MacBook Pro — the difference in coverage must hurt. I’m glad that’s not my problem anymore.

Microsoft’s present situation is a big reversal from when I started in the industry back in the mid-’90s. Back then, Apple was doomed and The Empire was unstoppable. Things were such that most startups’ business plans ended with the sentence “…and then we’ll get bought out by Microsoft”. Nowadays, I get the feeling that they’re singing the song performed on this Kids in the Hall sketch in the hallways at Redmond:

Categories
Uncategorized

Today’s Tablet Announcements: The Lumia 2520 and iPad Air

lumia 2520 and ipad air

The first of the two new full-sized tablets announced today was the Lumia 2520, which is Nokia’s analogue to Microsoft’s Surface 2. It’s a gorgeous device, and in my opinion, it’s the most beautiful Windows RT tablet out there.

Here’s a guided tour of the Lumia 2520 with Nokia’s Adam Giles:

A couple of hours after Nokia’s announcement, Apple announced the latest generation of iPad, the much-awaited iPad Air. Here’s their video, featuring Jony Ive, Dan Riccio, and Craig Federighi:

ipad air

Click the photo to watch the video.

Here’s the full Apple keynote video, which includes a slew of Apple announcements including OS X Mavericks (available now, and free-as-in-beer), the MacBook Pro refresh, and the new iPad Mini:

tim cook oct 22 keynote

Click the photo to watch the video.

Both tablets will be available in time for the holiday season (the iPad Air will be available November 1st, the Lumia 2520 in “Q4 2013”), and both will start at $499.

Categories
Uncategorized

I’d Much Rather Be Doing This Than Reading SharePoint Documentation at 10:30 on a Monday Night

kurtwood smith reddi-wip

Seriously: how anyone gets anything done with SharePoint is totally beyond me.

Categories
Uncategorized

How to Turn Your Smartphone into a Microscope

smartphone microscope 1

With some tools, the focus lens from a cheap laser pointer, about 10 bucks’ worth of stuff from a hardware store, and 20 minutes of your time, you can build a rig that turns your smartphone into a digital microscope.

smartphone microscope 2

You’ll be able to magnify objects up to 175 times (which is enough to see cells), shoot high-quality macro photos, and thanks to the rig’s simplicity and sturdiness, take the rig anywhere. The clear plexiglass stages let light pass through, often negating the need for a light source.

Here’s what salt looks like through the microscope:

smartphone microscope 3

Here’s an elderberry:

smartphone microscope 4

Here’s a still from some time-lapse photos from the cells of a red onion:

smartphone microscope 5

The instructions for building this rig are in the video below:

Categories
Uncategorized

Alex Payne’s Advice to Young Programmers Considering Startups

alex payneI know Alex Payne from his days on Joi Ito’s IRC channel from about ten years ago, and he’s since gone on to work at some startups you might have heard of, including Simple and this little social media thingy called Twitter. He’s now got his own business with the equal-parts-techy-and-highbrow name Syntax Atelier, which provides technical consulting to early-stage startups. He describes the idea behind it in more detail here.

Earlier this year, he wrote a post on his blog titled Letter to a Young Programmer Considering a Startup. As the platform lead at Twitter in its early years, he gets a fair volume of email from young developers trying to make career decisions, including whether or not to join a startup.

The article, which you should read in full, makes these points that you’re not likely to hear from the startup cheerleader crowd:

  • A startup is just a means to an end. Many people forget that a startup is a category of business and that what the business does, who it serves, how it makes money, and where it takes you are far more important considerations.
  • Startup jobs are the new office jobs; startup culture is now the new corporate culture. Many people choose to work at a startup to break away from the herd mentality of cubicle-bound corporate life, but it turns out that not only does corporate life have its own advantages (I know; I’ve done it myself), but startup life has its own stultifying sameness and herd mentality.
  • Startups are part of the system, not a rebellious wrench in the cogs. They’re just another piece — a high risk one, the hope of making high returns — in an investor’s portfolio. As Alex says, “The machine doesn’t care about you. In fact, the machine is designed with the understanding that most startups will fail, or at most offer unremarkable returns to investors. The majority of the companies in many VC portfolios are acknowledged duds.”
  • There’s a personal cost to being in a startup. Entrepreneurial work is often lonely work. It can also exact a toll on your relationships with friends, family, and lovers.
  • And then, there’s Alex’s summary: “I won’t equivocate: I am deeply skeptical of this system. I’m skeptical of this system’s slavering, self-congratulatory fetishization of “disruption” while so obviously becoming the sort of stolid institution it seeks to displace. I’m skeptical of the startup community’s often short-term outlook. I’m particularly skeptical of its callous disregard for both the lives of the people who participate in it and the lives of those who live in the world that startups seek to reshape. Let’s not even begin to discuss how commonplace collusionprice fixing, and other market-corrupting activities are in the world of VC. The point being: it’s a bad game and a rigged one.”

Since writing that article, he’s refined his ideas, which appear in this talk he gave at the recent Monktoberfest conference. The video’s about an hour long, and it’s worthwhile viewing:

Categories
Uncategorized

It’s Windows 8.1 Upgrade Time — Wish Me Luck!

windows 8.1 floppies

Click the photo to see it at full size.

I’m already on disk 479!

(By the way, if you want to know how to make Windows 8.1 boot straight to the desktop, check out my article on the topic.)

Categories
Uncategorized

I Has the Dumb (or: How I Embarrassed Myself in My Interview with Google)

double facepalm

When I do something, I like to do it big. When I blow a technical interview, I don’t do it with two programmers working out of a cafe; I do it with effing Google.

Landing an Interview with Google

My friend Enrico Bianco, who works at Google, heard that I was looking for other opportunities.

“There’s openings for developer advocate positions, and I think you’d be good at it,” he said in a Facebook chat. “You’re the only person who’s ever managed to make me reconsider my opinion that Microsoft is evil.”

I sent him my resume, and he submitted it a few days later. A mere 48 hours after that, I was contacted by someone at Google HR who asked “How soon can you be ready for a phone interview?”

I had that phone interview yesterday afternoon at 2:30, conducted by a Google developer advocate. He was quite personable, as a tech evangelist should be, and I was in my home office, on my own computers, and feeling quite comfortable. It should’ve gone off without a hitch, but instead, it went like this:

i has the dumb

The interview started off well. My resume, which is essentially a cut-and-paste from my LinkedIn profile,  is a pretty good one for someone seeking a developer evangelist / advocate / advisor position, and I’ve got my answers about what I’ve done and what I’ve learned down to the point where I can do them on autopilot.

The Programming Test

With the initial interview out of the way, it was time for a little programming test. For developer advocates, this is a less difficult test than for those who do actual production coding, and in an attempt to ramp up my skills and build a portfolio, I’ve been doing at least an hour of iOS coding after work on most days. The purpose of this test was to see if I could code at all, and he would’ve been well within his rights to hit me with FizzBuzz.

“Time for the coding test. What language would you like to do it in?”

“How about Ruby?” I answered. I picked it and opened irb in a terminal window so that I could double-check my work.

“My Ruby’s a little rusty,” he said, “I’ve been doing more Python these days.”

Score one for my Batman-like strategic thinking:

batman wins

I’ve heard that the languages in general use at Google are C++, Python, Java, and JavaScript; going with Ruby meant that he wouldn’t go all “language lawyer” on me. It became clear to me that I’d made the right choice when he tried to use __init__ as the name of a class constructor (that’s a Pythonism).

He typed a class like the one below into a Google doc. This is a cleaned-up, working version of what was typed:

# Cleaned-up working version of the class
# that he typed into Google Docs

class MiniGoogle

  attr_accessor :index

  def initialize
    @index = {}
  end

  def add_to_index(url, body)
    @index[url] = body
  end

end

“Let’s say I’m making a cheap clone of Google,” he said. “And I’m using this class to store an index of pages by their URLs.” It was a rather Googly example, and it made sense: some client code crawls the web and records the URLs and content of the pages it crawls into an instance of MiniGoogle with add_to_index. He then typed the following:

def search(term)
end

“Finish this search method,” he said. “It should return only those pages containing the search term.” “Seems straight-forward enough,” I said, and got to work. I couldn’t remember the name of the Ruby string method for determining if a string was a substring of another string. Luckily, I’d already had ruby-doc.org open, but the brain just wasn’t working. I searched through the documentation for the String class, probably scrolling past index at least two or three times before finally spotting it, thinking out loud for the benefit of my interviewer. In the end, I typed up something like this into the Google doc:

# My lame attempt

def search(term)
  results = []
  @index.each do |item|
    if item.value.index(term)
      results << [url, body]
    end
  end
end

The code above won’t work at all. I’d completely forgotten how you run a hash through a block in Ruby, and I’d also forgotten to return the result array. If I’d looped through the dictionary properly, the code still wouldn’t work, as it would just return the last value it referenced, namely @index — the entire collection of page URLs and their contents. Duh. Here’s code that works…

# This works, but it's wrong for other reasons

def search(term)
  results = []
  @index.each do |url, body|
    if body.index(term)
      results >> [url, body]
    end
  end
  results
end

Once I was done typing, the interviewer gave my code a quick glance and said “You know, I was kind of hoping you’d do it another way, say using select.

That’s when I got this feeling:

Not only is using select a more elegant way to solve the problem, but it’s exactly the approach you want to take in an interview with Google. When your bread and butter is crunching through large amounts of data with MapReduce, it only makes sense that you tend to take a more functional approach and think in terms of single-operation mapping, filtering, folding, and sorting. Once upon a time, my job was to be able to get inside programmers’ heads and know how they approached problems and why, and I completely forgot to do that.

I could blame my “let’s iterate through the hash and perform a test on each element as we go” approach on all the coding I’ve been doing lately has been in Objective-C (which doesn’t have all of Ruby’s functional niceties), but I have no excuse for blowing this. I’ve actually written a whole series of articles on the power of Ruby’s Enumerable module, including the select method (and what I think was a pretty clever explanation of fold).

I thrashed about on the Google doc, finally writing something like this in half-pseudocode:

# Wrong 

def search(term)
  @index.select{|item| item.value.index(term)}
end

As Murphy’s Law would have it, after the call, I whipped this up in seconds:

# Right, but too late to be useful for anything
# other than a code example in the blog entry
# documenting my FAIL

def search(term)
  @index.select{|url, body| body.index(term)}
end

After that disastrous coding-in-a-Google-doc exercise, it was back to more Q & A, with me asking my interviewer questions, such as what a “typical” day for him was like (and yes, developer evangelism is so all over the map that there are few “typical” days).

I also asked him a number of questions about what Googly life is like; after all, I sure as hell wasn’t going to experience it after that interview.

Lessons Learned

I’ve hosted a number of “FailCamp” events, which are big confessionals where you stand in front of an audience and tell them your best story about FAIL, and then the lessons that you took from that experience.

I can’t blame it on nervousness coding in front of others, because I used to do that all the time. Anyone who’s seen my “Biebersmash” Windows Phone game development tutorial presentation knows that I start with an empty Visual Studio file and live-code it in front of an audience.

While my work for the past year has involved little or no coding, I can’t say that it’s been a while since I’ve written a program. In fact, I’ve been doing a little bit every day, working on my iOS programming and even managing to squeeze in a little Android. I’ve been writing iOS programming tutorial articles. I’m not what you’d call a seasoned pro yet, but I can make apps that actually work.

I am terribly out of Ruby practice. In the interview, I found myself looking up the simplest of things in the Ruby documentation. Dead air is deadly during an interview, which meant splitting my attention between looking up information and keeping the conversation going with the interviewer, which just slowed me down. If I could do it again, I’d love to prepare by noodling with Ruby, just to harness the power of habit and make sure I had my “sea legs” for the interview.

I’m going to take the philosophical approach to this. First, it’s gratifying that I could land the interview and that they wanted to talk to me rather quickly. There’s also some wisdom offered to me by computer science professor and C# book author Rob Miles: “What doesn’t kill you makes a great blog entry.”

get up and deal with it

Got a story of interview FAIL? Feel free to share it in the comments.

Be sure to read the follow-up article!