Paul McKellar

WUT. SVAngel. Square founding team. Programmer.

YO Bits

Marc Andreessen recently posted that YO represent one bit of information sent to a user through an app.

But as Claude Shannon famously said, “Marc, if I’ve told you once, I’ve told you a thousand times: Information is the negative reciprocal value of probability.”

YO is at least two bytes.

I have 1000 friends on Facebook. So at minimum just the name of which friend sent me a YO is an index in to an array which has 1000. 2^10 is 1024, so 10 bits.

The day has 24 hours or 1500 minutes. Forget seconds. I can see down to the minute when you sent me a YO. Now 1:23 is pretty close to 1:24 but even if you only have a resolution of 20 minutes, you have 1500/20 => 75 chunks. Minimum 6 bits of information.

Some time slots are way more meaningful than others. If i YO you 5 minutes after a meeting starts, it means something. If I YO you at 1am, I’m probably thinking something else entirely.

Choosing not to send an email or text is information. I’m forcing you to do work to reply. And I’m suggesting I have no textual information to send. 2 more bits sounds about right.

And as Marc points out, the ABSENCE of a YO is also information. And the absence of a YO is different types of information throughout the day. Absence at 10am is different than absence at 8pm. So instead of being 1 bit, I’m going to put that at at least 3 bits. Because as anyone knows, waiting for an important phone call is a big deal.

Also, in the case of the people calling each other and hanging up. Being not willing to spend money on you via text messages or phone minutes is also more signal. 1 bit.

All in all, I figure YO is about 2 BYTES. Minimum.

Social actually has a lot of small details to it. Those details start to add up.

Claude Shannon was the father of information theory if you want to read more.

How to store your Bitcoins Locally

A lot of people advise against storing your bitcoins in a centralized service and I found the documentation around putting them on your computer to be pretty bad. Here is what I ended up doing based on Naval’s advice.

Security & Design goals

Security is a hard thing to guarantee. Many websites have been hacked and some individuals have been hacked. My goal is to be more secure that most, but still have my coins be reasonably easy to use.

Centralized services are large targets for being attacked. If they are good, they keep most of their coins in cold storage. But it is hard to verify that they do that. And, as it turns out, many of them are not secure.

As and individual, I’m also a target for being attacked. Someone could steal my (complicated) password and my phone and use them to steal my coins. As a computer user, a virus could take steal them.

On the otherside, Coinbase is a nice looking company and at least they have dedicated professionals who think about security at lot.

  • Not stored on a large central repository / website.
  • Not stored in a obvious file on my hard drive “wallet.dat”.
  • Able to set it up in a brief amount of time and send my bitcoins when I need to.

Wallet setup

I used Electrum to secure my bitcoins. It appears secure, is open source, and uses SPV to verify transactions. SPV allows you to start it up and use it without downloading the full bitcoin database (17 gigs at the time of writing).

Download Electrum

  1. Boot it
  2. Write down the seed.
  3. Write down the password.

If you lose your seed, you lose you bitcoins. FOREVER. Don’t be stupid and try and memorize it.

Trial Process

The goal of this section is to ensure you understand how the whole system works. That you can add money to your wallet, and recover it later using the seed.

  1. Take a look in the “Receive” section.
  2. Find an address.
  3. Send 5 dollars to it from Coinbase.
  4. Wait for Electrum to show that as received.

Delete your wallet

This is the scary part, we are going to delete your wallet.

  1. Close Electrum
  2. Open up terminal
  3. Remove the directory ~/.electrum

Recover your wallet

In this part, we recreate your wallet using the seed from before.

  1. Open Electrum up again.
  2. “Restore a wallet”
  3. Type in the pass seed from before. You wrote it down right?
  4. Wait, and verify your coins are there.

Conclusion (Warning!)

Full circle!

Be careful! If you make a mistake your coins may be gone forever. Don’t go too fast.

Folder test your icon.

Recently my cofounder had drinks with someone who works at apple in marketing. All credit belongs to them.

Designing an app icon? Want to have a memorable brand? Drag your app in to a folder with 3 other apps. Does you app icon still stand out? If no, redo the icon.

Try this test with Path, Threes, or 4sq. You will realize that each has an extremely simple and memorable icon.

Designers already know this

They are already testing their designs under the worst case scenarios. Facebook blogged that they didn’t do a new newsfeed because they have users with small screens and no contrast. Artists and Photographers will often flip their painting upside down in order to see the shapes and reset their brain

Back up from your work, and you’ll do better work.

Decisions

There are only four decisions regarding the UX of WUT. It is an incredibly simple application.

Most of my friends who looked at it asked for new features. Comments, favs, a newsfeed. One of my friends asked me to take away one of the features.

It took me off guard.

Here is an app that barely has any interaction at all, and he was suggesting that we reduce it further. Maybe one of the four decisions we had made could be improved? Maybe adding things to the app wasn’t going to work out, maybe we had to alter one of the decisions we had already made.

Changing decisions

Humans have a hard time changing decisions they make. It take cognitive effort to make decisions and we run out of it as the day goes by. Also, once we make a decision, we have a bias that says we want to stay consistent to that decision. (consistency bias and sunk cost)

Easy and hard

Looking at a product and saying what you should add, when you have a list of features you know about from other apps is easy.

Realizing that some of the features might need to be removed is hard. Re-analyzing decisions made is a process of forcing yourself to assume you are wrong.

Discussion on HN

"Steve Jobs wouldn’t have done that."

In the last two years I think we have all seen this line from time to time. Everytime Apple does anything, they have a large number of people who disagree with them. Almost every article following Steve’s death talked about the possibility of the death of Apple’s design roots or ability to design amazing products.

I read these articles and they exhaust me.

When someone uses that sentence, I don’t think they are aware of how it comes off. It sounds like they are trying to brag about their sense of style. By invoking what Steve Jobs would have done, it sounds like they are saying “I have as much taste as Steve Jobs and I represent him after death by complaining about the same things he would have complained about.”

You don’t represent Steve Jobs. That isn’t how it works.

If you don’t think something is well designed, say so and back it up with a better design. Do not drag a dead person into the conversation as support and speak for them. That is just bad taste.

Winston Churchill would have loved this blog post.

Originally posted here

Shell Gamification.

Today I gamified my shell.

Ok, stop laughing, I only spent 2 hours working on it.

I wanted to actually learn the aliases I’ve carefully setup. I always think up new aliases, but immediately forget them, and continue on exactly as before.

Feature spec.

I want feedback every time I should use an alias. The feedback needs to be immediate. More important than that, I don’t want to be distracted by anything flashy. The notification must be small and persistent.

I boiled down the feature set to this:

  • look at the aliases defined
  • look at the last command executed
  • provide information about what should have written

I chose to use the right hand side of my terminal prompt to display the information. The nice thing about it is that it runs every time I finish executing a command. It is persistent and updated. And the code is fast enough that it gets out of my way.

Alternatives I choose not to do.

  • Growl: too splashy and flashy for how often I execute commands.
  • Sounds: would have driven me nuts when playing music.

Gamification

The notifications worked, but why do something reasonable when you have the opportunity to do something ridiculous.

I assigned points to successful habits and mistakes. As a first stab, I incremented my score every time I wrote a correctly formatted command and lost 50 points when I made a mistake.

It also keeps my high score, the last command I typed, and the last command I got wrong.

Code

You can get the code here

Realiaser

Update: After a weekend.

I’ve only had it for the weekend and my high score never goes above about 50-70 points.

I have an alias for git status which is the death of me.

alias gs='git status'

I keep loosing all my points because of it.

Update: After a week

I’ve learned 5 new aliases which I now use daily. Mostly around Git. I haven’t estimated my benefits yet but my score is about to break 1000.

I’m going to add a bunch more aliases.

Update: After 1 week + 1 day.

After creating 10 new aliases, my score dropped almost 700 points in 1 hour. But I’m noticing and remembering.

Adding too many aliases at once was a mistake.

You probably type too much.

I had a feeling I type too much. But I wasn’t sure how. So like any programmer, I got a computer to figure it out for me.

What did I type? Is there a history of everything I’ve typed? Something I can mine for interesting data?

~ wc ~/.zsh_history
17185   85023  723154 /Users/paul/.zsh_history

That is a bunch of data. And once I turned off de-duplication, for this experiment, it became a bunch more.

What do I type?

What shouldn’t I type? As it turns out, the answer is ‘git’. I’ve typed ‘git’ 6642 times, which is 6642 too many. A lot more than any other command.

git 6642
cd 988
gap 524
rm 487
ruby 452
ls 427
rails 407
rake 315
gem 268
mate 262

Here is the frequency graph of how I used my commands.

583 commands appear > 1 times
217 commands appear > 2 times
110 commands appear > 5 times
78 commands appear > 10 times
58 commands appear > 20 times
32 commands appear > 50 times
23 commands appear > 100 times
11 commands appear > 250 times

There are 32 commands which I’ve typed more than 50 times, many of which could use a great alias. The other 500+ commands, not so worried about those because I don’t use them very much.

How do I do this?

Huffshell is a gem which will looks at your history and generate a command tree based on what you type. It will also make basic suggestions for improvements.

Surprises Patterns

Huffshell even shows me there are patterns in my commit messages. I think about my changes primarily in terms of adding features or code and secondarily in terms of removing.

git 5141
  commit 3734
    -m 3726
      "add 538
      "remove 259
      "can 161
      "fix 128
      "change 110
      "bump 104
      "move 102
      "make 100
      "show 84

ctrl caps lock

I don’t learn or relearn unless I’m forced to. Today I’m forcing myself to relearn my control key. I’ve turned it off completely. It does nothing.

Hopefully, in a couple weeks I’ll be completely reliant on the Caps Lock key, as a replacement. I’ve had it mapped for years, but never trained myself to use it.

3 Reasons I Joined Square

1. The Business

Credit card processing is one of the most frustrating parts of starting a company. To simply accept a credit card, hardware can cost anywhere from 800 dollars to 13 thousand, but the data sent is trivially small. Square, or “squirrel” at the time, gave merchants an alternative that used the phone they already had, and a low cost card reader.

1 year in, we’ve changed the payment market. We see Square in the wild all the time. We have a product which people can touch and use to make money. Solving a problem for millions with a clever hack and commodity hardware.

2. The Tech

Square’s card reader uses the actual motion of the card swipe to generate a sound, which is decoded through a microphone, and processed in real time using the phones internet connection.

1 year in, we have:

  • A cheap reader that works on a wide variety of hardware
  • A web infrastructure to log transactions securely and persistently
  • An interface that makes credit card payments simple

We’ve seen a lot of hard puzzles come and go, but the amount of data and opportunities we have with it are just starting to show. Also, more than a couple geeks give our hardware the highest compliment possible “it reminds them of Woz’s work”.

3. The Chance to Work With Jack

Jack, our CEO, is absurdly good at what he does. He is an incredibly steady leader, relentlessly revising things to create simple products, and pushing the people around him to do the same. It isn’t a fluke that both Twitter and Square are incredibly simple technologies in every aspect. I knew the opportunity to work with Jack was rare when it came up.

1 year in, Jack has not only lead the product out of the banking world, but he’s also created a flat culture of product oriented engineers. In addition to that, we’ve managed to increase our execution speed as the team has grown and given people control over more aspects of the product.

The Many Forms Of Procrastination

When you’re in a startup, you need to be constantly doing the most effective thing for the startup.  Your startup is small, you have limited resources, and you need to use them wisely.

There are a million things to do every day and choosing which ones to do is important.  Making good decisions move your company forward, bad ones leave you in the same place, or worse move you backwards.

Whenever you choose what you want to do each day, there are temptations to procrastinate.  In this case, I’m defining procrastination as whenever you do something you’d like to do, something you find pleasant to do instead of doing something where you can produce lot of benefit to yourself or others.  For example, playing soccer instead of studying, or watching tv instead of playing soccer, or doing nothing at all, instead of watching tv?

These examples might all be easy to recognize, but I think there are more examples of procrastination that are less easy to recognize.  Some of which I do everyday to my chagrin, and some of which I watch other people do.

Solving the big problem instead of doing the minimum viable solution: writing a new abstraction or toolset for an abstract problem (sometimes a real problem) but in the meantime leave the customer without any solution.  Procrastination by solving a fun problem instead doing the minimum thing required to help the customer.  Sometimes, making a tool is absolutely required to your startup, it might be your actual startup, sometimes it is just more fun than doing real work.

Researching new technology, new key value store, NOSQL, eventual consistency.  people love to read about them. reading about it feels like work, but unless you actually need them that day it is more like practice for possible work.  there is value in constantly learning, constantly being a better programmer, but it is investing is a distant future.  we became programers and entrepreneurs because we liked to learn, but, it is procrastination because it doesn’t often doesn’t immediately benefit your users.

Stats procrastination.  I love doing this one.  just paging through page after page of stats.  correct pattern is picking the stats that matter, and work towards them.  just building random stats, or reading a million google analytics pages, it not going to make your company strong.  especially if they don’t change very often.  it is superficial. 

Reinvention procrastination, Recreating a 3rd party library, because you want the functionality you see, but don’t like the number of spaces they use for indentation in their code base.  Do your customers know you rewrote something?

Refactor procrastination. the customer wants their life made easier, not your life made easier.  refactoring is a way of making your programming life easier, or making yourself smart (i’m using anonymous functions!).  when you need to refactor to give users a benefit (we can’t do this until we have some better caching in place).  

Productivity p0rn procrastination.  kinda like what you are reading right now. go fix the biggest problem for your customers, right now. make something they will want to email you about and say “OMG THANKS!”


30 minute post. 

Writing Is Thinking

That is about it.  Explaining something forces you to understand it.  Things sound 10x worse when you try and convince someone else about them.  I’ve found the same thing about writing execsums, selling, pitching, lecturing.

It is hard but worth it.  You’ll force yourself to level up, because that is the only way you will be able to do what you need to get by.

I Still Love Forums

I still love forums.

A lot.

Like, i think about how much time people can spend in forums, and how devoted they get to forums, and it blows my mind.

I love it.

Watching 4square Game Mecahnics

standard social network friend stuff first time you do anything you get a ‘badge” call newbie

  • gets you initiated to badges
  • confirms your action first time out in the night you get another 1st stop badge, encourages more activity throughout the night?

get points for combos? or just every badge thing you get? more to come.

Content

I decided that blog posts about stuff I’ve done in the past are probably more interesting, concrete, and thought out than things in the future. Going to focus on the observations and decisions from the past and not the future. Maybe : )

Hello Lisp

i think lisp gets this crazy reputation, like you must be awesome to have touched it. so lets make everyone awesome.

step 1. get that thing!

Sinatra Vs Ruby Expectations

In ruby, the LAST definition of a function is the one that executes.

def test;
puts "first";
end

def test;
puts "last";
end

test # => last

In Sinatra, the first defined route executes

get "/test" do;
puts "first";
end

get "/test" do;
puts "last";
end
GET /test # => first

Rails kinda does the same thing regarding routes (first declared executes). But because of rails’ terse-ness regarding routes I expected it. I see everything on one page for routes, and assume top executes first. With Sinatra, and ruby in general, I expected the last definition to override the first.

(Sinatra wins in terseness in every other regard vs rails and I understand why Sinatra does this, now)

Sinatra Rb

Sinatra turns out to be very useful and amazingly effective at doing simple things quickly. I am enjoying it a lot.

New Small And Missing Vs Old Established And Complete

This blog is written in Sinatra, it is like Rails but without a ton of stuff I’m used to. I’m forced to work without migrations, view helpers, form builders. The good stuff.

But every time I hear myself complaining, I hear the way people have talked about Java to me. Connection Pools, JVM, massive scaling, byte code, and other crud that has been in java forever but only recently got in to rails.

Is every successive generation of technology a re-implementation of the smallest cell of useful functionality? Is Sinatra growing towards rails, rails growing towards java, java towards oblivion.

I Love Programming

I love programming