Follow up to The most pleasant job interview I have ever had

May 23 2013

“Hey mum, I’m going to Canada in September to work for Shopify.”

“Yeah I know, why did you take a month to realize that?”

Just over a month ago I described my experience interviewing with Shopify as the most pleasant job interview I have ever had.

Just three days after the interview I got an offer, but fussed over the decision for a month. Originally, to give some other opportunities a fair chance, later because some new opportunities showed up …

Seriously, what are the chances for a client to sell his company to a huge investment bank and wanting to bring you on board juuust as you’re thinking about moving to Canada? Crazy. I didn’t take that one because, you know, bank. Huge corporation. Not really my style … at least not for that kind of money.

Remember kids, if you’re going to sell your soul, sell it well.

I loved Shopify when I was there, it was the most fun and enjoyable looking environment I have ever seen. If I had to decide there and then, I’d go for it at the drop of a hat. But the more I thought about it, the more my fear of commitment acted up.

The main reason I freelance is the pace of switching whole technology stacks every few months. But I also have a lot of free time to pursue my own stuff. Deadlines for a book you say? No problem, ten billable days in a month is enough.

Think I won’t be able to do that anymore.

Oh, you like waking up at 9am, taking an hour to exercise and then two hours for writing and an hour for lunch and then get to work work? No problem, you’re more productive coding-wise in the afternoon/evening anyway.

I have a suspicion I won’t be able to do that anymore either.

In the end, that’s why I decided to work at Shopify. Because it scares me shitless. That which scares you the most is usually the best way forward. It’s your inner comfy coward screaming from the top of his wee lungs that way lies change.

Change is good. I like change.

At least I’ll still have the freedom to work on my own stuff – yes, I asked – and following Ramit Sethi‘s advice to ask for a few extra $k/year, I’m going to have plenty of financial independence as well. Important things those two.

I can’t weave this smoothly into the story so I’m just going to say it. Subscribe to Ramit’s mailing list. Do it. Read it. It will change the way you think in ever so subtle ways. I mean, when was the last time casually reading a free mailing list made you a few thousand dollars? Exactly.

But yeah, in September I start working for Shopify and that will be the end of my relatively short-lived full-time freelancing career. For now.

Now how the hell do I write a resume that will impress a government clerk deciding whether I’m good enough for a visa?

Enhanced by Zemanta

No responses yet

How Draft got me to pay for a free product

May 21 2013

Draft is a marvelous new webservice for writing. A bit like iA Writer, but for the browser.

I love distraction-free writing and I’ve recently come to rely on Draft for writing my blog posts. It’s simply the best writing tool out there that I can use with my fancy keyboard (linux, no iA Writer, bad wrists).

But I’m not here today to talk about the marvelous version control features, the fact I can click the equivalent of “Save back to WordPress” when I’m done writing, or even the “Get feedback from an expert” feature.

No, today I want to tell you about the brilliant trick Nathan Kontny used to convert me from a freeloader to the proud owner of a $4 monthly subscription.

I login one day, right from the WordPress dashboard (Chrome extension), and what do I see if not a big pop up sort of thing saying “Hey, you should totally subscribe!”. As a geek and a nerd I find these things tacky, overdone, and rather pushy.

But this was different. There was no blackout, no flashing colours, just a friendly message from the founder saying “Hey, I’m making this thing and I need your help to keep it awesome.”. More importantly, he started a conversation!

Draft asks me to sign up

Sidenote: Wow, I was just delighted by how easy inserting an image is. Shift+Ctrl+I, drag image into browser. Beautiful.

khem

See, it’s not a pushy sales thing, it’s an honest ask. If you don’t want to, that’s fine too, but please tell me why.

I was instantly convinced.

Left a message saying how awesome I find the service and how infinitely brilliant is the fact I can reply to a “please subscribe message”. Later that day I kept my promise and subscribed.

Better still, later that day I got a reply.

Draft replies

You have no idea how delighted I am by this little exchange. And now I’m spending $4 a month on something I use maybe twice a week for maybe an hour to indulge in what is a glorified hobby.

In comparison, I pay $5 a month for Toggl – the basis of thousands of dollars worth of invoices, I use Github daily and don’t pay a dime … actually I don’t pay for most things I spend my whole days on.

Good job Draft, you’re doing something right. This is probably the biggest bang for buck a service has ever gotten out of me.

Enhanced by Zemanta

One response so far

An English pet peeve

May 14 2013

A pet peeve by anyjazz65

Remember that experiment I wrote about last week? Where I say it’s better to stand up when editing?

It works! Only problem is I get kicked out of the kitchen around 4pm, just about an hour after I really properly get to work.

Today I want to talk about a little pet peeve I’ve developed with English over the past few days.

Since my d3.js book is supposed to be very inclusive and inviting I use the first person plural a lot. It just sounds better when going through examples to say “Here we do X” instead of a preachy “You should do X” or a self-absorbed “I did X” … you know, like this post.

As such there are a lot of instances where I write “Let’s do something or another”. Let’s being a contraction of let us.

Now let is a funny little verb in the English language. It’s got no fewer than eight meanings, adding some verb phrases and idioms the number goes all the way up to nine-teen.

Talk about overloading operators, Scala can hide in shame before the might of English.

Let’s – see how I sneakily used the possessive form and not a contraction of let us – primary meaning is roughly “to allow”, so when you say “Let’s go!” you are pretty much saying “Allow us to go!”. But with slightly less imperative in your voice.

All fine and good.

But in the book I also talk about third parties a lot. It’s not just me and the reader that are having fun, behind the scenes d3.js’s functions are working hard to keep us happy. I often write “This or that function lets us do this or that”

lets us

Using “lets us” feels more appropriate than saying “allows us to” or even “enables us to”, especially when I’m supposed to be shortening my manuscript by 60 pages before publication. And it just feels snappier and better paced than the alternatives.

Here’s the dilemma: “lets us” works in some cases, “let’s” in others and “let’s us” is far out. Laughably wrong.

And one of those appears almost in every other paragraph. Paragraph after paragraph, page after page, for 180 pages.

Every single time I see those six letters I have to stop, take a deep breath, and make sure they are correct. Every. Single. Time.

Enhanced by Zemanta

No responses yet

Write sitting down, edit standing up

May 09 2013

On March 26th I giddily said it takes about two months to write a technical book. Still high from the recent success it seemed like the thing to do.

Hemingway writing

Hemingway writing

It is now May 9th. I am editing.

Well, sort of. I had thought my writing was awesome, that there will be hardly any editing needed and on 9th of April, just two weeks later, there was a reality check in my inbox.

It was the editor: “Hey this is really great, solid writing, I just fixed some spelling and markup for ya.”

And truly, all the fixes were either typos or British English – they want American. Something about markets.

“Oh and shorten the book by 60 pages. We said 100, you wrote 180, we can do 120 tops.”

*gulp*

It is now May 9th. I am editing.

The stickler is that my beta readers said they’d like even more content in the book, definitely not less. Obviously I can’t cut any content out of the book and I can’t make the code examples shorter either. People have already complained the examples are a bit terse and hard to understand at moments.

I could take out some screenshots, but this is a book about creating shiny visualisations for the internet. Screenshots must stay.

Only thing left is the writing. I have to go through the whole book and use less words to say more.

*gulp*

Facing such a monumental task it is therefore not a surprise I’ve only spent about 30 hours editing my book in the last month. That’s averaging just an hour per day – the average for writing was two and a half.

And editing time isn’t even half as efficient as writing time. For every two minutes of staring bleary eyed at the screen, dragging the words through my mind like so much barbed wire, I spend five minutes prancing about on the internet feeling like I’m riding a unicorn in comparison.

Editing really is sheer drudgery. There is no flow. There is no inspiration. Just a constant ruthless cutting and rewording. All those little things you thought added a special flair to the writing, let your personality shine through, entertained the reader.

Waste. Plain old waste. Vomit of a writer who’s been staring at the screen too long.

It all has to go.

And the writing is much better for it. But you’re still sad to see it all go.

Actually, not so much sad, as indifferent. You don’t feel anything but the monotonous drudgery of rewriting something you’ve already written and not coming up with anything new. You can’t, add something new and the word count goes up not down. Can’t have that!

It’s been fairly successful too. I’ve finished the first two chapters. One cut down from 14 to 9 pages, the other from 51 to 40. Just by improving the writing. No loss of content.

But it’s just so … it’s terrible.

This weekend I discovered a trick, though. I was at a friend’s place and as I was editing in the kitchen I realized that the chairs are terrible and the table is the wrong height.

Peeved, I moved to the counter. Editing standing next to the kitchen counter, shoulders slouched to stare at the screen …

… before I knew it, two hours had passed and I edited five pages of text. Amazing! I had fallen into flow. Editing! Flow!

I don’t actually know if this was because of my friend’s kitchen or because I was standing while writing. But I’m going to repeat the experiment today.

Fingers crossed it works!

Enhanced by Zemanta

No responses yet

Mouse movements in a day of coding

May 07 2013

A few weeks ago I bought a fancy new mouse to replace my fancy old mouse. Sure it’s nice and comfy, but how much do I actually use it? When you pay close to a hundred euro for something you want to make sure it’s doing its job.

Yesterday I tried.

For the whole day, when the freelancing clock was running, so was IOGraph – a handy tool for recording mouse movements.

A day of coding

I have dual screens, am running Ubuntu and use Emacs to write code. Certainly the sort of environment that favours using your keyboard over your mouse and yet, the mouse gets used quite a lot.

The image above shows paths my mouse has taken through the day, dots show where the mouse has been standing still for a while – the bigger the dot, the longer the time – and I am honestly not certain what the circles around small black dots are. Clicks perhaps?

Other than the fact I use my mouse more than I thought, three patterns emerge.

  1. There is a blank space roughly down the middle where I never place my mouse – the dividing line between two monitors. You can see the left is wider than the right.
  2. Despite being used a lot, the mouse spends most of its time standing still. Most of the image is taken up by relatively few very large black dots. The largest two are right where I had two terminal windows that I often switched between (one running a server instance, the other used for git). The rest are mostly on the far right where I have my browser. Apparently I like to click around, then leave the mouse there when I go back to coding? Or maybe page loads are slow?
  3. Emacs takes up the left half of the screen. I sometimes put my mouse here, but rarely for long because the cursor gets in the way.

You can also notice I spend a lot of time switching the last few tabs in Chrome, possibly opening and closing them as I browse the interwebs for help with Ruby? That’s all the lines going to the upper right corner.

Here’s a screenshot of the desktop as I left it last night. Most of the tabs already closed because I have to save memory, but you can still see the rough layout of the windows I worked with. Had I some photoshop skill I’d overlay IOgraph output over the screenshot.

Workspace

Workspace

Now I wonder if mouse patterns are different for other languages and technology stacks … I have experimenting to do!

Enhanced by Zemanta

No responses yet

Videos from first Javascript meetup in Ljubljana

May 03 2013

Full house at #jsmeet \o/

Tuesday evening saw the first JavaScript meetup in Ljubljana and I think it was a smashing success, if I do say so myself. Everyone who RSVP’d managed to make it despite the impending holidays next day.

Surprising how difficult it is to count people calmly sitting in place and not moving. I’d make a terrible guardian for children on a fieldtrip, but there were somewhere between 38 and 47 people based on my various counts.

All the speakers did a great job of presenting their topics and I was happy to see next to no smartphone and laptop navel gazing from the audience. Rare sight at these sorts of events.

We learned about writing performant JavaScript, where the biggest challenge is maintaining performance across browsers and devices. Apparently writing performant JavaScript for Chrome on a quad core desktop monster is much easier than a four year old smartphone running an outdated version of Android.

Then it was straight to an overview of using modern MV* libraries and the difference between frameworks and libraries – a library is fairly open-minded and a framework is smarter than you so you have to obey.

The talk about AngularJS deepened the subject by showing a few code examples with AngularJS. Looks like it’s very easy to magically connect things on the screen, but step out of what Angular knows is best and you will have a bad time and likely way too much work.

In the end, the talk about TypeScript explained what it looks like when you port Java to JavaScript. The most interesting part for me was observing the difference in style preferences. I honestly don’t think TypeScript looks better than just using JavaScript …

Either way, the videos are now online. Have a look.

Unfortunately the videos don’t convey the great job beer and cupcakes did of keeping everyone around for a nice geeky chat.

Javascript cupcakes

Javascript cupcakes

Enhanced by Zemanta

No responses yet

Writing a REST client in Haskell

Apr 25 2013

A few days ago I decided to buy some bitcoin. Then I noticed it fluctuates a lot despite a general upwards trend. Hmmm … if I just bought at the right moment and sold at a different right moment, I could make money fall out of the void!

I have since lost $5 by playing and gained $30 by leaving it alone. Obviously I suck at this …

I know! Let’s make a bot that does this! A low frequency trading bot, that sounds like fun. And let’s write it in Haskell, just to keep things interesting. Marrying the strictest of languages with the messiest of resources – the internet … what could possibly go wrong?

First order of business – a REST client.

REST client

Before my bot can do any trading and intricate algorithmic trading, it needs to talk to the marketplace of choice. I picked Bitstamp because they’re the only ones that let me do this without a US bank account.

Writing a REST client in most languages is simple. Reading Bitstamp’s ticker in Python looks like this:

import requests, json
 
r = requests.get("https://www.bitstamp.net/api/ticker")
print json.loads(r.content)
# prints: {u'volume': u'17179.28558844', u'last': u'159.49', u'bid': u'159.49', u'high': u'161.00', u'low': u'139.00', u'ask': u'159.64'}

That’s it. Everything you need for a set of values nicely accessible as a dictionary.

In Haskell, well in Haskell figuring out how to do that took me all night, then a bit of the morning and finally a helpful tweet from a stranger to tell me just how I was misusing monads.

First of all, we are going to need a bunch of imports. The ones we really care about are the http-conduit library and the Aeson parser of JSON strings. Everything else is there because … well I’m not sure actually, but it seems to be necessary, otherwise things don’t work.

{-# LANGUAGE OverloadedStrings #-}
 
import Network.HTTP.Conduit
import Control.Monad.IO.Class
import Data.ByteString.Lazy
import Data.Aeson
import Data.Attoparsec.Number
import Control.Applicative
import Control.Monad.Trans

I am not perfectly certain what the OverloadedStrings bit at the top does. It’s some sort of compiler directive and most haskell libraries I find in the wild tell me I will be a much happier man if I turn it on. Shrug.

All it takes now is making an HTTP request and parsing the response as JSON. Simple, right?

Well, Haskell is strict and you can’t just parse things all willy nilly. We need to tell the parser what we expect, what we want to do with the result and what type it’s going to be. Can’t just have a bag of stuff! Nope, needs to be a well defined bag of things.

data Ticker = Ticker
              { high :: Number,
                last :: Number,
                bid :: Number,
                volume :: Number,
                low :: Number,
                ask :: Number
              } deriving Show

Great. We have a Ticker type that has a bunch of numbers and some names. That Show part seems to say that we’ll be able to print this out to the console. Smashing!

That’s not enough though, it is time for some strange hieroglyphics that tell Aeson how exactly parsing works.

instance FromJSON Ticker where
  parseJSON (Object v) = Ticker 
                         v .: "high" 
                         v .: "last" 
                         v .: "bid" 
                         v .: "volume" 
                         v .: "low" 
                         v .: "ask"

If I understand this correctly, those strange symbols are applicatives. The .: does … something … and the <$> and <*> do something else. The whole bit is about defining how to convert a key in the JSON string into a value in the Ticker type. I think.

Right, let’s make a function that will talk to the server and return a Ticker object. Maybe. If all goes well.

ticker::(MonadIO m) => m (Maybe Ticker)
ticker = get "ticker" >>= return . decode

Fairly simple stuff. Take something from the internet carefully wrapped in MonadIO, unwrap it for a bit, feed it into decode, which magically uses all the stuff we defined earlier, and wrap it back into both a MonadIO and a Maybe. Parsing can fail you know.

get::(MonadIO m) => String -> m ByteString
get url = simpleHttp $ "https://www.bitstamp.net/api/"++url

This is the generalized get function that talks to Bitstamp using the simpleHttp function from http-conduit. It looks simple, but I’m sure a lot of hairy stuff is going on behind the scenes.

To make sure everything works, we run it.

main = do
  ticker >>= print

Nothing.

Yup, the output we get is Nothing. It is at this point you realize someone isn’t using JSON correctly and all those numbers are actually strings. Strings. Now how the hell do you tell Haskell to automagically transform those into Numbers before putting them in the Ticker object?

Messy messy internet.

But hey! Got Haskell to talk to a REST API. How cool is that!?

Enhanced by Zemanta

2 responses so far

I love being a geek

Apr 23 2013

Geek shelf by Aaron Bassett

I have always seen myself as a stereotypical geek. Kind of introverted, not very athletic, infinitely excitable about the strangest of things, spends more time with people on the internet than talking face-to-face, prefers it even.

And I love being that. The infinite freedom that comes with being a geek is intoxicating.

While normal people have to worry about keeping appearances, about maintaining a fine-knit web of social interaction through a series of carefully maintained half truths, I can just be myself. Because I’m a geek.

People pretending they like certain things, pretending they care about this or that issue, just to fit in. Just so they’ll be liked. As a geek I don’t have to do any of that.

As a geek I can shout at the top of my lungs “I don’t understand football” at the height of football fever during a world championship. Nobody minds, nobody laughs, they just explain the game. “Don’t mind him, he’s a geek you see, he doesn’t get normal people stuff”

When I was about ten years old I couldn’t get enough of The Famous Five series by Enid Blyton. Library copies were always tattered to bits and that just made them better. I don’t remember much, but I do remember one character clearly – The Scientist. He was George‘s dad or uncle and his defining characteristic was that he was always kind of grumpy and locked up in his room where he was “doing science”.

Not to be bothered. Not to be disturbed. Not to even be thought about too loudly. Lunch was often taken to his room because he would forget to eat.

Imagine that!

A guy who gets peace and quiet to work. All summer. In a house full of 12 year olds. That’s the power of being a geek.

Geeks – the only people who get to truly be themselves even as adults. I love it! (said with my best Tennant impersonation)

It’s all starting to unravel for me though. People are suggesting I might want to “grow up” … whatever that means.

Just the other day someone mentioned I do a lot of sports. Ironically this happened at boxing practice; she spends 5 days a week there. A person who goes to practice 5 days a week thinks I do a lot of sports … I have never been so confused.

A few days later I had a call with someone looking for “somebody older” to be a technical lead. An old sage to look over the rabble of Stanford grads he’s built a team out of. I’M TWENTY-FIVE!

I hope it’s not too late for me. Save yourselves! Be geeky!

Enhanced by Zemanta

No responses yet

First JavaScript meetup in Ljubljana is right around the corner

Apr 18 2013

Cupcakes by lamantin

A while ago I realized that whenever someone asks me if I know any javascript developers, I always come up empty. Shame on me! Using a technology heavily for many years and not really knowing anyone from the community.

That’s why I decided to organise a meetup! The first purely Javascript event in Ljubljana. Sure there have been barcamps and webcamps and mobilecamps … plenty of occasional Javascript users come to those, but that’s not what we’re on about here. This time we want to focus on people who use Javascript a lot.

Come join us on the 30th of April at 7pm in Kiberpipa! It’s gonna be fun!

People doing full stack Javascript, or writing fancy frontend apps in various MV* frameworks. That sort of stuff. It’s time the community gets to know each other, or at least for me to find the community. :)

I’m happy to announce that after weeks of effort (read: remembering to send an email or tweet a link once in a while) we finally have four presenters, free beer and plenty of people who promised they’d make it. Hooray!

There’s even going to be a lady giving one of those talks! That one did actually take a lot of effort to find … I don’t know what is it with girls, but it sure is difficult to find some willing to give a talk about something cool in front of a bunch of dudes. We’re not that scary, are we?

Here’s the list of talks:

There are also going to be cupcakes!

What do you think a JavaScript Cupcake should look like? I really need your help with this one. Google doesn’t have a single idea. Imagine that, all these years and nobody’s tried to design a javascript cupcake before.

No responses yet

How CamelCase ruined my day and my dev environment

Apr 16 2013

Bitcoin Magazine

Bitcoin Magazine (Photo credit: zcopley)

Yesterday everything went so comically wrong I just have to share. This post might be more a confession than a tale of warning, you be the judge.

My objective, convert prices in USD to prices in bitcoin. Simple. Especially after I discovered someone’s already made a gem that talks to the MtGox exchange and tells me how much a single BTC is worth.

All I had to do was this:

Gemfile:
gem 'mtgox'
 
bundle install
 
Controller:
price/MtGox.ticker.sell

Simple, right?

Because I like to make sure I’m working from a sane state I first ran the test suite. Ruby core dump.

Right, I’ve been having these problems randomly for about a week now and they usually go away if you run the tests twice or thrice. This time, it just did not work. I got a ruby core dump, you have probably encountered a ruby bug every single time.

No wonder! My Ruby interpreter is going to be a year old in a few days! Let’s update. It all went downhill from that. And not in a pleasant adrenaline rush kind of way either.

After about an hour of fiddling with RVM and Ruby versions and aliasing things from ~/.rvm/bin/ to /usr/bin/ the tests are finally running and I can begin.

Mtgox is not defined.

Hmm … okay then. I thought Rails automagically loaded all gems specified in the Gemfile. A quick google later and I discovered that I can list all loaded gems with Gem.loaded_specs.keys.

Sure thing, the gem was loaded.

Right, let’s make a separate ruby file and make sure things are working.

require 'rubygems'
require 'mtgox'
 
puts Mtgox.ticker.sell

No such gem “mtgox”.

Grrrr, okay fine. gem install mtgox … already installed, wtf are you doing Swizec, you have that? Oh right, I did just update my Ruby stuff and maybe broke the environment and require paths are confused.

Let’s try this on my mac, I haven’t done any fiddling there.

The mtgox gem only works with Ruby 1.9.2+, you have 1.8.7 … that’s what you get for using your expensive laptop as a Skype and IRC machine. I can just update this, no problem!

Your Homebrew is out of date. Your XCode does not exist. I have no idea what you’re trying to do!

Grargh.

Fiddle fiddle fiddle and I eventually get Homebrew installed after at least an hour of effort. Let’s try that RVM thing once again.

After several fails with automake and sometimes just simply saying “Hey, an error happened” and the log looking perfectly fine I finally got it to start installing Ruby.

ruby-1.9.3-p392 - #configuring........
ruby-1.9.3-p392 - #compiling.
ruby-1.9.3-p392 - #installing .
ruby-1.9.3-p392 is not installed.
To install do: 'rvm install ruby-1.9.3-p392'

What?

Fine, I give up on you laptop, we will pick this fight another day. Back to the Ubuntu box.

After deleting all Ruby binaries from /usr/bin it finally decided to start using things in ~/.rvm/ and lo and behold, I can require the mtgox gem.

Mtgox is undefined.

God damn it! What now!? What could possibly be wrong now!?

Find the source. Add some puts. Yes, yes the gem is getting loaded. It’s printing to the console and I can … wait a minute. It says module MtGox, not module Mtgox

Oh for fuck’s sake! Capital G … All this time. All this effort. And I never, not once, noticed the module was CamelCase instead of just capital first letter.

Sigh.

Oh, now running bundle says bundler isn’t installed even though I just ran it! What now …

Enhanced by Zemanta

No responses yet

Older »

« The most pleasant job interview I... First JavaScript meetup in... »