Friday, February 28, 2014

14.1 In the books

So I didn't do as well with 14.1 as I thought I would, but I did ok -- 215 reps (a little over 4 1/2 rounds).  I was hoping to get more, but my shoulders tired much faster than I thought.  Things I found in doing the workout:

- the shoulders burned out faster than I thought
- I was able to keep the double unders unbroken for the last two rounds (I evidently did better on the later rounds than the earlier ones)
- I had to break up the snatches into fives and then into threes.  By the end, I was just trying to get through as many as I could one-by-one

It's a tougher workout than I gave it credit, and it's easy to redline fast -- and I got less than half of the really elite athletes!  I was able to push through and tie a competitor in the class, so I was happy to keep up.

Thursday, February 27, 2014

Open Workout 14.1

The first open workout is here, and admittedly it's making me a bit nervous.

10 Minute AMRAP:
30 double unders
15 snatches @ 75#

These are two movements that I think I can move well through, but I'm worried about red lining after a few rounds.  I know I can do 30 double-unders unbroken (most of the time, if I'm not flustered), but as soon as I get to the Snatches, it's going to burn my shoulders out.  By round 4-5, I'm sure it's going to burn out my grip strength and shoulder strength.

The "conventional wisdom" is:
  • Pace the first 5 minutes and keep the breathing even
  • Muscle snatch as long as you can, then power snatch
  • Hook grip the hell out of the bar to preserve grip strength
  • Keep a good form on the snatch (don't round the back or "lever") or you'll burn out faster
  • Take a breath and reset before each set of double unders
Anyways, here's hoping that I survive it!  I'm hoping for 6, maybe 7 rounds, if I can rock it.

Windows Price Cuts: Also an Ecosystem Problem

It looks like I wasn't the only one who thought that the Windows 8 price cut to OEMs was not a good idea.

They point out the importance of the ecosystem in choosing devices, which is something that I missed in my own analysis, and a very good point -- when you are buying into the device, you are also buying into all of the company's other products, all the third-party apps that can run on it, etc.

I think the article only goes part way: it describes the capabilities of their web products like SkyDrive, Office 365, etc.  But these aren't really Windows desktop's ecosystem, but pale extensions of their real apps.  It wants Microsoft to have competitive cloud offerings to win users over from Google's products, which of course is the right way to go since the market is shifting to all-cloud and users are using multiple types of mobile devices.  However, All of Microsoft's best offerings, and core competencies, are native Windows apps.

Going "all in on cloud", as strategically logical as it may be, isn't going to help Windows 8, or low-end PC notebooks today.  Their operating system is designed to run "heavy apps" locally, not be a lightweight web-centric OS.  So even if they have really amazing web versions of their apps, why do they need all the power of Windows?  Wouldn't all of that work perfectly well and fine on a Chromebook, obviating the need for Windows at all?

Like I said before, this puts Microsoft in a tough spot.  They need users to need Windows to run heavy native apps, so moving to all cloud products only hurts them.  But heavy apps on "weaker" machines run terribly.  Is the best move for Microsoft to offer a stripped-down, web-centric OS, and only offer it on the low end?


Wednesday, February 26, 2014

How Not To Send Recruitment Emails

I've got a bit of a rant -- one of many -- that I've had brewing for a while.  Full disclosure: this is probably first-world problem territory.

Like many of you in tech, I get headhunter "poach" emails.  I get that it's someone's job to do this kind of work, and it's probably very hard work, so I try to respond to every one that I can to make their lives easier.  Demanding clients, unresponsive or very rare candidates, high-pressure sales pitches and up-and-down pay probably make it challenging.  Some of the recruiters I've talked to are very nice, well-versed in their trade and in tech, and I would definitely talk to again...so this doesn't apply to all of them.

However, I've received a couple of reach-outs that missed the mark, so to speak.  I thought I would give some pointers on how to completely disinterest anyone from considering their position.  These are some of my own personal experiences that have actually happened...

Not telling me who you're hiring for, even after I ask directly.

I get it, you want to draw people in, make them want to know more, get a commitment to talk about it on the phone, whatever -- but when I ask point blank "who are you hiring for?"  And you don't say who it is in your response, I don't take you seriously.  Good companies with good names that "sell themselves" don't have to be secret or play games -- not saying who it is means it's probably someone who I don't want to work for.  Save us both the time.

Not telling me where the job is located.

Same thing -- If you don't say where it is upfront, it probably means I'd have to uproot my life to move there.

Sending an opportunity for my current level, or lower(!) levels.

If someone is going to leave their current position, and take a risk, why would they take a step down in their career or even 'only' make a lateral move?  I understand that you just typed in the job name into the search box in LinkedIn, but at least consider that you may have to offer something more for me to leave a job where I'm very likely happy.

Asking me if I fit what is obviously a set of contrived, imaginary requirements full of buzzwords.

"Have you innovated using synergy of cross-organization collaboration?  Do you have 12+ years of Big Data experience with Bitcoin?"  You may want to know the space you're recruiting in well enough to know some of these are just complete nonsense.  Also: read my profile.

Not responding to my response.

If I accept your invite or respond back, not responding to my response is a sure fire way to make sure I never take you seriously.  Maybe you filled the position already or something, but why not keep the relationship?  Maybe I'm not that interesting.

Maybe these are all first-world problems, but it just seems to me that it would save us all a lot more time.  What have you all seen?

Tuesday, February 25, 2014

Mis-scoring

I've been feeling sore and a little under the weather today, possibly because of a pretty nasty workout today:

EMOM for 5 min:
6/4 Muscle Ups (Rings or Bar) - I did the bar with a band
ME Double Unders

 -Rest 2 minutes-

 4 Rounds of:
30sec ME Power Cleans (185/135/95)  -- I did 135
60sec ME Row for Cals60sec Rest

The scoring was the lowest number of double unders / cleans / calories.  So if you got 10 double unders in one round, even if you did 50 the next round, your score is still 10 (and if you didn't get to any, your score is 0 even if you did zillions the other rounds).

Aside from being a weird mishmash of timing, I dislike these kinds of workouts because you have no incentive to push hard if your numbers in previous rounds were low.  Once you get to the "magic lowest number", you just throw down the equipment and rest.  I get the intention of these workouts: maintain a high intensity across multiple rounds.  But it never turns out that way (at least for me):  it anchors me on only doing the minimum number of movements, which I think is a bad workout.  One small change (score is the *total* number of movements) makes it a very different workout.  (I did 22 / 6 / 13, but I did scale the muscle ups a lot)

I'm eager to see what the open workout will be this week, and hopefully I will recover in time to hit it with full force.

Monday, February 24, 2014

The Homebrewer's Dilemma

Admittedly, I have a bit of writer's block today, partially because I don't have a lot of time to write, and most of the ideas that I have to write about seem trite.

But one idea stuck out as not-as-mundane (thanks to my wife for the suggestion): one of my New Years resolutions.  As a homebrewer and part-time wine collector, I often have many beers & wines at my disposal -- before the new year, it was not uncommon for me to drink several a night.  Call it rationalization that made me think "I deserved it after a hard day" or "two glasses of wine are fine for you", but two drinks often gave way to three or more.

This eventually caught up with me: I was about five pounds heavier than I wanted to be, and I was not progressing in Crossfit as much as I would like.  I'm sure part of it was because of my (still less than ideal) diet and my overindulgence in the sauce.  Having to work out at 7 AM while being semi-dehydrated is also not ideal.  Consuming 500+ calories at night probably doesn't help.

This drove a tough choice for me:  I enjoyed my hobby, but it was slowing me down in my workouts and damaging my health.  I made a compromise: with a new year's resolution to not drink during the week and limit it only to the weekends/holidays.  A sacrilege for a homebrewer, but certainly better than letting it slowly kill me.

It's been a challenge so far, since it's always accessible and there are some days that I think, man, it would be nice.  But I've been able to keep to it, luckily.  In the first workout after I stopped, I already saw the difference:  when running, I was able to push faster than I could before, and I surprised myself with how much further I could go with less lactic acid building up in my veins.  The difference even after ~eight weeks is noticeable, with faster workout times and less weight (I've dropped the 5 already)

I still like booze, I don't think that will change, but I was able to improve my health even a little.  But as Abraham Lincoln said,  "It has been my experience that folks who have no vices have very few virtues." 

Sunday, February 23, 2014

The Danger of Promotion by Group Size

I just spotted this article on the New York Times about how Google goes about choosing who to hire.  In my own experience, most of it is spot on.  Hiring turns out to be the most important thing you do anywhere, because if you do it wrong, it will completely destroy your company/team -- a bad hire will alienate other good people, drag down velocity and create a toxic atmosphere, not to mention cost you a lot to boot them out.   (My mental definition of "bad hire" vs. "low performer": a bad hire has a negative effect on the group, whereas a low performer has a neutral/zero effect on the group.)

The traits in this article are great for any organization, but they're also extremely rare to find in the right combination -- I doubt I even have half of those traits.  (Chances are someone else is trying to hire them too, I have my own opinion on how to win that battle that I'll keep for another post.)  Most organizations would be tempted to lower their bar to get more people through the door.

The general rarity of people with these kinds of traits and the negative effects of bad hires got me to thinking about how many companies should not reward and promote their employees.  "Wha?  How does this have anything to do with hiring decisions?", you might say.

For many large organizations, seniority / influence / rank / power is determined by the size of the group that one controls, oftentimes, "how many heads do I have reporting to me".  Those with more people reporting to them can make more change happen, are groomed as future senior managers, get more visibility, get paid more, etc.  Maybe you've seen this yourself:  a "to get to the next level, you need to have X people reporting to you and increase your scope", the continuous desire to grow the team more, and the difference between an "individual contributor" and "people manager".

This requirement of build-a-big-team-to-get-promoted breeds danger, because managers are given an incentive to have more people of any nature in their groups so they can progress in their careers, grow their team's influence, and theoretically get more work done (reality tends to the opposite).  This means they're apt to lower the bar for hiring, keep bad hires around longer than necessary, and/or do too many projects, which together have a compounding negative effect that slow things down immensely.  And anyone who has worked in software engineering can tell you what adding more people to a team does for velocity (hint: no bueno).

I have to believe that this was the downfall of some large organization somewhere, and perhaps even many downfalls (one of my favorite books on the topic would probably describe this as "undisciplined pursuit of more").  I'm a fan of keeping teams lean and focused, and saying "no" to unnecessary scope-increasing projects, at the expense of ladder-climbing.  Personally, if I get to be an "individual contributor" forever, I'll consider myself lucky :)

What does this mean for organizations that hire really rare types of people?  It means limits to growth, and even increasing the hiring bar, to keep quality high and speed fast.  It also means finding other ways to promote and retain managers other than by size of their organizations -- like, perhaps, velocity and quality of their teams' work, which would push them to keep their teams small and focused.  The alternative tends to look like what most other really large companies look like: big, slow, unfocused and out-innovated by smaller and nimbler rivals.

Saturday, February 22, 2014

Windows 8 Pricing Cuts Are a Product Problem

There's a story going around that Microsoft is cutting the price of Windows by 70% to counter rivals in the lower-end of the notebook market, all the way to $15.  If true, it signals that they feel threatened by competitors in lower-end devices, as also signaled by their 'Scroogled' campaign.  (Disclosure: I used to work on Chromebooks years ago, but haven't for a long time, so these opinions are mine.)

It looks like an aggressive price cut, even if you take the fact that larger OEMs are really only paying $30 today, when you include marketing funds and so forth.  But it's going to cause more heartburn for Microsoft in the long run, because it's not just a pricing problem:

1.  $15 is still not free

Cut the costs all you want, charging $15 is still $15 more expensive than free alternatives.  Also, it's admitting that $50 was too much and they extracted a bit too much value, leaving a bad taste in partners' mouths.  They'll have to still offer significant additional incentives, like marketing funds, to bring the cost to $0.

2.  Windows 8 still sucks

It doesn't matter what you charge for it, consumers (and enterprises?) still don't want Windows 8.  It's not going to change the game in the lower-end notebook market where none of the devices have touchscreens and Windows 8 is designed around touch.  And even if Windows 8.1 fixes all of the problems that Windows 8 had, all you'll have a different flavor of Windows 7 on the device, which isn't much of a change from what they were selling years ago.  Not only that, but low-end Windows notebooks have far more overhead than other options and aren't powerful enough to run the industrial-strength Windows apps.

3.  Windows 9 now can't charge more

Now that they're charging a measly $15 per copy, what kind of deal do you think OEMs are going to want when Windows 9 (or Blue, or whatever it is) comes out?   You guessed it - $15!  Which means that the economics of their next generation of OS and devices have degraded significantly.  This could also build pressure to drop the price of Windows 8 on higher-end notebooks as well.

4.  The bigger cash cow is everything else that runs on the platform.  Why charge at all?

The Windows game is platform control: if Microsoft can control the platform on which developers write apps, and control the platform on which enterprise users use Word and Excel, they have a continuous stream of revenue forever.  However, it's becoming clearer that they have less faith in their platform, and will have to compete on someone else's platform to win.  By charging for the platform that they want to control, they will not achieve the same underlying protection for their real cash cow that they could if it were free.  If the price is a meager $15, why not bite the bullet and make it free to try to keep their platform in place?

5.  Mobile/tablet is the growth game now

As interesting and competitive as the low-end notebook market is now, the higher-end notebook market is really being eroded by mobile devices & iPads.  Cutting prices for Windows 8 on notebooks is not going to help Windows Mobile's position.  And cutting Windows 8 prices is not going to help Surface sales, since Microsoft makes them.

All that said, I'm not sure there's much else Microsoft could do to defend this part of the market -- it's not a pricing problem, per se, it's a product-market-fit problem.  I'm sure $50 would be an easy price for OEMs to stomach if Windows 8 were really stellar on low-end notebooks, but even at free, Windows 8 is still unattractive for someone who isn't stuck with learning how to use it.

A compelling offering for the lower-end of the market has to get rid of the usual Windows clutter, and it either has to be free, or has to be special and differentiated enough to warrant the price.  The product has to have several features:

  • It has to be easy to maintain;  the majority of cost of an OS is the maintenance time
  • It has to be low cost; the appeal of low-end notebooks is value
  • It needs to be non-touch;  low-end notebooks don't have touch screens and probably won't for years (when that time comes, you can update back to live tiles)
  • It has to be x86-based;  Windows on ARM got torched because it couldn't run anything

I'd shoot for a slimmed-down, non-touch-focused flavor of Windows that is free.  Less is more, so it doesn't have to have all the features of a full desktop OS.  It is far more strategic to own the platform market share on which developers build apps and continue to milk the Office cash cow for years to come.

Friday, February 21, 2014

Tasty IPA Results

I got to try my Pliny the Elder clone that I bottled last weekend, and it turned out pretty well.  It's an estimated ~9% alcohol and has a strong hoppy taste:


The color is about right, and the taste is just about there -- just a little bitter.  I'm pretty sure that it was the hop schedule that made the flavor right -- I've been impressed by the mellowness of the Centennial and Simcoe hops, which I haven't used before...excellent dry hopping varietals.  Anything with two rounds of dry hopping has to have some kick to it.


I did unfortunately manage to get a tiny bit of hops leftovers in the bottom of each bottle, so I have to pour them carefully, but it's a small price to pay for one of the best Imperial IPAs on the planet.  If you are an IPA fan, I highly encourage you to grab a bottle of Pliny the next time you can.

I'm not sure what I'd like to brew next.  Recently, I've done a Pale Ale, a Hefeweizen, and now an Imperial IPA, so maybe I should do a Brown or maybe a Blonde Ale... but with a twist -- maybe like a Honey Brown Ale?

Cheers!

Thursday, February 20, 2014

Laptop for Coding

I haven't had a lot of free time to work on my own personal engineering projects because I haven't had a really good laptop to work on.  Most of my free time is on a couch away from a desk or table to work on, so I need something that's mobile and light.

Right now, my Windows laptop is one of these 17" beasts.  It's about 2000 pounds and generates enough heat to heat my house in the winter.  It's pretty powerful, so it can actually run Eclipse without exploding, but it's just too massive.


My other laptop is an early-model Chrome OS laptop (I'm writing on it right now!), which is dual-booted with Linux.  It has 2 GB of RAM, so it slows to a crawl when I try to run anything of note on it.  Even the Web IDEs that I've tried are slow on it.



So I have a Goldilocks problem -- I need a laptop that is small and light enough to work on a couch (with preferably little heat) but powerful enough to run an IDE (preferably a free one).  Would also be a nice bonus to be able to play some games.

Most people would instantly point me to a Macbook Air / Pro, which is fine, except they cost like fifteen hundred f'ing dollars for an entry-level version, probably closer to $2000 for something with some meat on the bones.  I'd rather stab my eyes out with a stick than use a Windows 8 laptop, and others would say to just wipe it and install Windows 7, which sounds like yet another eight hours down the drain.

At this point, I can hope for dual-booting a beefier Chromebook, or shelling out a couple grand for a Macbook.  Not sure what would be a better idea.

Wednesday, February 19, 2014

The Importance of Lottery Tickets

Today, WhatsApp was acquired by Facebook for $16 billion, with another $3 billion of RSUs going to retain the employees.  That's an unreal amount of money, for sure, and the price will be debated to death for the next few days/weeks/months.  Cost-per-user, Snapchat, bubble, messaging is the wave of the future, they did it for international presence, blah blah blah.  There are several dozen engineers who now have more money than they know what to do with -- in other words, they can now afford a house in the bay area.  Maybe.

The more interesting story, in my humble opinion, is the effect that this kind of deal has on every other engineer / would-be entrepreneur / hacker outside of the deal.  They see this $16 billion price tag and think -- "if I had just gotten in on that, I'd never have to worry about money again."   (Perhaps that's just me)  Or on an even more basic level, "should I be doing something different with my time?"

There are plenty of regular people who buy lottery tickets when the jackpot gets large enough.  Admittedly, I'm one of them.  Despite the incredibly unlikely odds of ever winning, I convince myself with the "expected value" argument to buy Powerball tickets when the jackpot is like $400 million and up.  For those who haven't spent too much time in probability and statistics classes, expected value is the probability-weighted value of a choice.

The expected value of not playing the lottery is $0.  However, if you do play, there is a very high likelihood you will lose, and an infinitesimal chance of winning.  So, the expected value of playing powerball when the jackpot is $400M, assuming no other prizes, is positive given a 1 in 175 million chance:

(1-(1/175,000,000)) * -$2 +  (1/175,000,000) * $400,000,000 = $0.285.

By playing the lottery, you are expected to make $0.285.  Even if we get really nitty-gritty and say 50% of that money goes to taxes, the next expected value is still fourteen cents.  I understand that I'm more likely to be attacked by a shark than win, but I can have a shot at it (just as if I started swimming in seal blood in shark-infested waters).   If it doesn't work out, and I don't win, I go to work the next day.   Some non-players would call me stupid for playing a game so obviously rigged, and "throwing my money away", but I have a better shot of winning than they do, don't I?  What happens in a black swan event?

So what do lottery tickets have to do with WhatsApp?  It's really, really important to have proverbial lottery tickets for innovation to thrive.

Most jobs at typical 'large' companies don't have a lottery-ticket scenario.  You do your job, you get an X% raise/bonus.  If you really work hard and do well, you get a little more.  And if you invent the next iPhone and make billions of dollars and change people's lives forever, you get even more and perhaps a promotion (if you got credit for it).  And that's at a good company that rewards its employees -- how many would simply not give raises or bonuses at all?  Maybe you get a small plaque with your name on it and a pat on the back...but you still have to show up on Monday.

But shouldn't the intrepid, visionary, hard-working innovator in the shoot-the-moon scenario get a lottery ticket level of reward?  You took the risk, endured unspeakable politics by those who want to shoot your idea down, made the company billions, shouldn't you take more share of the reward?    Typically, the answer in almost every company is no -- innovation is an expected job function that never happens at all.   Throw in that in most companies, failure is punished not rewarded, and the third scenario will never happen because the expected value of doing so is negative.

Large companies can't really support the lottery ticket scenario either.  If they give an enormous payout to a select group of people, anyone outside it will be completely demotivated ("they care about that project and not my project!").  Moreover, those people who 'won' have few reasons to hang around anymore, and possibly be paid more than the CEO and likely just piss off shareholders.

Instead, if you really have a bee in your bonnet to do this world-changing project, you have to start something entrepreneurial.  You have a low chance of success, since 90%+ of startups fail, but you have a shot, and that shot has a better chance of success than a remote lottery ticket.  In almost every working-9-to-5-for-the-man scenario, you have to buy your 'lottery ticket' somewhere else because of the big company problems above.

The massive WhatsApp acquisition is important, because it's a grinning average Joe with an oversized $16 billion check with confetti falling all around it.  It reminds us, sitting in our cubicles and unproductive staff meetings, that there is a lottery, and only those who play it have a chance to win it.   And for most people, to buy their lottery ticket, they have to walk away from what they're doing now.

Tuesday, February 18, 2014

Memory lane of work

My wife and I were talking about old jobs we used to have as kids, and it got me to thinking about places I've worked in my life.  I've worked at some crazy places.  Here they are, in order of when I did them, and my personal pros and cons (names of employers omitted to protect the innocent):

Corn De-tasseling  (Pulling the reproductive parts out of corn)
Pros:  You can do this job before you're 16, since farm work is legal for minors to do.
Cons:  The leaves of the plants are very sharp and so they can slice you as you walk through them.  Plus, it's wet early in the morning.

Cook at a well-known fast food chain
Pros:  Free food.  Also, when you flip pickles against the refrigerator doors, they stick...hours of entertainment.
Cons:  People want customized shit.  Like a burger with exactly 3 pickles and one dot of mustard but no ketchup.  Really? What does this look like, a Chili's?  It's a fifty cent burger, eat the kind that we normally make instead of holding up the line for everyone.

Cook at Pretzel store in the mall
Pros:  Can't think of any.
Cons:  Working the mall on weekends as a teenager is hell on earth.  The stuff they cook pretzels in is caustic and will burn your face off.  And everyone who recognizes you wants free pretzels.

Temp - "Light industrial work" (Looked at cardboard boxes and put them in two different piles if they were ripped)
Pros:  Didn't require a lot of thinking.
Cons:  Some creepy people do light industrial temp work.  Like, ask you if you like Star Trek and then walk away say nothing else to you again.

Lawn Mower - Self Employed
Pros:  Set my own hours, worked when I wanted.  Listened to The Offsping's Smash while I mowed -- I mowed angry.
Cons:  It's a lot of work finding people who want their lawns mowed, since I was not a good salesman.  Plus, if you mow after it rains, you're going to have a bad time.

Dishwasher / Bus Boy at Diner
Pros:  Not many.
Cons:  Paid less than minimum wage, everyone chain-smoked, had to both clean tables and then clean the dishes.

Dishwasher at a Chinese Restaurant
Pros:  Ahhhh-mazing Crab Rangoon.  I ate 10 by myself once.  One of my friends worked with me, which was cool.
Cons:  Getting the sweet & sour sauce off of some of the dishes was impossible.  Sometimes there was this fish dish which was an entire fish, and it smelled horrible and was hard to clean.

Carpet Cleaner, Duct Cleaner, Water Damage Restoration Part 1
Pros:  Paid pretty well for a teenager.  Got to work some cool dude who happened to be felons (for realz).  It made me really, really want to go to college.
Cons:  Ever clean up a basement with 2 feet of water and a hundred suitcases at midnight?

Convenience Store Clerk
Pros:  Can buy pretty much whatever you want.    This is appealing, say, if you are 20 years old.  Also, the pattern of winning scratch-off lotto tickets seemed to be in "bunches" (all the winning tickets were bunched together)
Cons:  Threats to your life, underage kids trying to buy cigarettes, scooping ice cream.  Watching some poor souls buy a fifth of cheap vodka at 8 AM every day.

Carpet Cleaner, Duct Cleaner, Water Damage Restoration Part 2 (same place)
Pros:  Learned to never buy berber carpet -- it doesn't clean, it just gets matted down and looks terrible.  I know it looks amazing when you first get it, but believe me, in like 4 years you'll regret it.
Cons:  Literally no one who was working there a year earlier was around.  I didn't appreciate this at the time, but this is profound -- what an incredible loss of accumulated knowledge, and high cost of replacing people.  I got to crawl around in the ducts of a university cleaning them by hand because no one else fit in them....OSHA would be proud.

Carpet Cleaner, Duct Cleaner, Water Damage Restoration Part 3 (same place)
Pros:  All they wanted me to do this time was show them how to dial into the interwebs.
Cons:  After I showed them how to do it, there was literally nothing else for me to do.  But they made me sit there while they browsed pictures of Chyna.  Also, literally no one who was working there six months prior was still there.  Seriously!

Student Intern in an IT department
Pros:  No one expects interns to do anything.  Got to learn Perl from some really cool old Perl hacker dude, and work in an office!  See above for why this was a very good thing.
Cons:  Not many, it was pretty cool.  Limited opportunities in an old-school IT department.

Software Development Intern at a Startup
Pros:  Too many to count.  Played video games & soccer, invented games crashing office chairs into each other, ate an entire box of cereal, drank 5 free mountain dews per day, found out that the innards of those gummy computer wrist rests are the same as those "sticky grabber hands" we had as kids.  Got paid an unreal amount because we wrote code.  Also, got to write code.
Cons:  None?  The stuff we were building was sort of boring, but evidently made lots of money.

Software Engineer
Pros:  Paid well, good benefits, smart co-workers, sometimes cool projects.
Cons:  See all of Dilbert.  It's all true.

... there's more, but since it's all software engineering / product management stuff, it's not as interesting or life-threatening.

I wish I could summarize all the learnings in one place (another post for another time).  Having done so many different things, I built an appreciation of people.  Most of all, it helped me recognize what jobs suck beyond words, so that when I see someone else having to do them, I'm as nice to them as I can be.

Monday, February 17, 2014

In and Out of Sync

In yesterday's post, I talked about some of the work I had to do in adapting the spoofer extension to use a different type of storage.  This got me inspired to "polish" the functionality to make it a better experience, so I did a bit of hacking on it.

So with the chrome extension API for storing data, you can either store it in the "chrome.storage.local" storage (on the device) or "chrome.storage.sync" storage, which saves the data on Google servers so you can sync your settings across computers.  But these are pretty different in their constraints: "local" has a lot more space available to it, and it doesn't stop you from writing a lot of stuff really fast.   But "sync" has more limitations: it limits how much you can store there, and limits how fast you can write there.  And it's pretty logical: Chrome doesn't want some evil extension to just start writing tons and tons of bad data and take down Chrome Sync or break other extensions (or Chrome itself?)

This turns out to be a big problem in the extension, because the full set of user-agents that others have amassed online are larger than what sync will store.   Also, importing all of them at once hits its max writes-per-hour limit, so the user cannot edit any settings for an hour(!!!)  Couple this with the fact that a lot of users don't want to have Sync on at all, so it's logical to have the sync functionality to be opt-in.

But I still need to solve the space problem when a user has lots of "local" data and suddenly wants to turn on sync.  I have to warn the user that not all of that data is going to get sync'ed -- or that they cannot import the mega-list of user-agents, which is a common use case.

So what I hacked on yesterday was the ability to move data to and from chrome.storage.local and chrome.storage.sync, but it does it "unintelligently", so if chrome.storage.sync runs out of space, it just dies.  The next step is to alert the user that there is not enough space to import or turn on Sync (and what they can do about it).


Sunday, February 16, 2014

Latest Version

I work on a Chrome extension for spoofing the browser's user-agent string to websites, which comes in handy with testing web applications, getting around sites that roadblock certain browsers, etc.  I initially wrote it when I was a Product Manager for Chrome, and site compatibility was terrible -- I wanted to be able to automatically detect it and spoof the user-agent to be able to use normal websites that blocked Chrome for no reason.

Anyways, I used to work on the extension more actively pre-kidlet, but I get a few minutes here and there to work on it still.  The latest version you can get on the Chrome webstore is actually pretty old (six months or more?), and I have a much newer version that I've had ready for a while.  It's still not released because the current version is a pretty massive refactoring from what it was previously.

Specifically, the way that Chrome extensions used to have to save data "back in the day" is by using naive localstorage in the context of the extension.  So, simply:

localStorage[key] = JSON.stringify(value);

But this has some limitations, and when people started asking me for new features, this didn't quite work anymore.  For instance, localStorage limited me to only storing string data...but I needed to store more complex structures.  It was slow and serial, but nice that it has a big storage limit, so you could save as many settings as you wanted without realistically running out of allowed storage.

So when Chrome finally introduced a data storage mechanism specifically for extensions, I had to rewrite all of the storage to use the new method:

chrome.storage.sync.set(object, function callback() {...});

This seems innocuous, but it requires a lot of work:

  • I have to migrate all the existing localstorage values into this structure.  If I mess it up, everyone's settings are borked
  • It has a callback, which means I can't just 'fire and forget' -- I have to handle the callback and update caches, etc.
  • It has a callback, so I have to change all of the functions that would call to save settings to also be structured as callbacks.  So now I get some calls that are 4-5 nested callbacks deep -- other JS folks know what I mean when they see function() { function() { function() { ... 
  • It has a much smaller size limit on individual objects than localStorage, so I can't just cram everything into the same object to be saved.  I have to break them up.  Which means what I really have to do is:


chrome.storage.sync.set(object1, function callback() {...});
chrome.storage.sync.set(object2, function callback() {...});
...
chrome.storage.sync.set([array of pointers to objects], function callback() {...});

Barf.

As you can imagine, this forced me to rewrite massive sections of the extension.  This gives the ability to use Chrome Sync to save your settings across browsers.  However, it also means that the extension has been changed significantly, so it could have broken in subtle ways.  So I've been holding onto the current version (with other new features) out of fear of breaking my users terribly and little time to roll back / fix immediate issues.

What do others think, should I just suck it up and release it, and deal with the brokenness?  I don't want to piss off people who rely on this thing working every day.  However, not releasing it means they don't get improvements / features / fixes.

Saturday, February 15, 2014

Bottling Day

I've had a batch of homebrew beer that I've been fermenting for nearly a month (brewed on the 20th of January) that I got a chance to bottle today.  For those who are beer-savvy, it's a Pliny the Elder clone, and for everyone else, it's one of the more famous very hoppy, 8-9% alcohol IPAs in California.  (For the homebrewers out there, I used this recipe)



The materials for five gallons, roughly ~50 12 ounce beers, were $75, which is pretty exorbitant as homebrews go -- it's usually $30 or so.   If you were to buy that much Pliny in the store, it would be $150 - $175, so I'm obviously making money!

That's all Pliny the Elder

So you may notice that there are four gallons there instead of five, and that's right -- it turns out that this recipe requires a step in the fermentation process that filters out part of the beer, and with this recipe, there's a bunch (a gallon) of gunk that gets filtered out in that process.  With these kinds of beers, you actually have to brew more than your target 5 gallons, which I didn't do.

I'm sure double IPAs are nowhere near healthy, but I can't wait to try this in a week.

Also: Season 2 of House of Cards.  Sooo good.  'Nuff said.

Valentine's Handstand Day

(I'm posting this one day late because I had it written yesterday and Valentie's day going-out shenanigans prevented me from posting...)

I've never found a good way to get cut roses / flowers home in the car from the store.  If you're lucky, the store wraps them up and you get a top-heavy cone-object that rolls around and falls over when you turn.  The whole package is too big to fit into the cup holder, and if its in the back seat, you can't move it if it falls.  I just end up having to hold them into the passenger seat with one hand while driving with the other.  I've found my next product problem to solve, obviously...

Anyways, in my morning workout today, the programming had us doing handstand pushups, which beyond being the most f'ing impossible thing to do, I find to be one of my personal weaknesses in Crossfit.  And the workout prescribed 60 of them!  Ugh.

So it's supposed to look kind of like this:

   _  |       _ |
    |  |        / |
__|  |        | |
|   o |      o| |

I've had shoulder mobility issues in the past, so putting my arms over and behind my head is pretty tough.  My 'overhead position' looks like my arms are out in front of my face and not back behind my ears, which if you are trying to support your own weight, can be a killer.  So, instead, I have to put multiple pads under my head, and kip my legs straight up in the air, which pulls me off the wall.  Not to mention I can't really kick up onto the wall into a handstand, so I have to kick up into a headstand instead.

All in all, it looks like I kick up into headstand, bring my knees to my chest, and kick straight up, which pushes me off the wall and I fall on my face.  It looks kind of like this:

   _  |    _    |                     |
    |  |      \   |                     |
__|  |      |   |                     |
|   o |      |o |      |--------o |

So I cut the number down to 30 to limit the injury to my pride.  Mixed with heavy deadlifts, it was a blast of a workout :)

I think I'm held back quite a bit by flexibility, and not easily putting my arms back behind my ears in a full locked-out position, which also holds back jerks, overhead squats, etc.  Anyone have good shoulder mobility recommendations?


Thursday, February 13, 2014

Trying something new for 30 days

Matt Cutts famously gave a talk at TED about trying something new for 30 days.  It's a great idea for all of the reasons he gives in the talk, but it's an utterly terrifying prospect for the uninitiated.

I'm going to try writing something on this blog -- which, obviously, I haven't written on for years -- every day for 30 days.  And this is scary because I'm sure I'm going to either run out of interesting things to say or my poor skill in writing will shine through.  But I want to improve myself, both in my written communication, and having a presence online that consists of more than a photo.

Anyways, since this is a new exercise, and I have to write no matter what, there are going to be some days over the next thirty that I wander off topic and sound like a rambling idiot.  Lucky you!  So I'm going to spill my opinions on things, talk about tech, the user-agent switching Chrome extension that I work on, Crossfit, beer brewing, etc., so maybe that will keep it spicy.

Here's to 30 days.  Cheers!