IPOs, 101

When a friend IM’d me and told me she saw an article saying that MongoDB had filed for IPO, I embarked on a months-long journey of discovering that I knew nothing about IPOs. I found it a bit difficult to get information about them, so I figured I’d write up what I learned. This is mostly from other people/things I read online, so please leave a comment if I got anything wrong/missed anything.

An IPO is a chance for the company to raise funds. Being a publicly-traded company also forces them to have more transparency in accounting and other good things, but the IPO itself is mostly a fundraising event: the company is selling X shares for $Y.

The first thing a company does is find some underwriters, which are large banks who try to sell the offering. Then the company files a confidential S-1 (probably). The confidential version lets them go back and forth with the SEC and iron out any details. Apparently there have been some embarrassing S-1s in the past where companies gave out trade secrets, had blatantly bad accounting, etc. Generally this stage will last a while, as the SEC tends to have suggestions. The SEC could come back with major issues and the company might decide not to file after all. Basically, at this point, you know nothing about anything. But there’s hope.

If all goes well with the SEC, the company will publicly file their S-1. You can find public S-1s on Edgar, the SEC database, but this will still give you approximately no information. Okay, it has profits and losses and risks and all sorts of information that you’re probably interested in if you’re an investor, but if you’re a techie you’re probably looking for the opening price and that probably won’t be there yet. This is because the company will keep amending the S-1 as the IPO approaches. I recommend subscribing: you can ask Edgar to alert you every time there’s activity for a given company.

At a certain point, the IPO date will be announced. You can find a calendar of upcoming IPOs on the stock exchange’s website (e.g., NASDAQ’s calendar). One thing I found confusing was that the day listed was actually the day before what I’d think of as the IPO: the day listed is the “pricing day” when they decide on the price to open at. About a week before this date, a possible opening price will be announced (i.e., the S-1 filing will be amended). This is subject to change, MongoDB’s original projection was $18-$20, then $22, then ended up opening at $24.

Some companies will do a “road show,” where they present what the company does to investors. Honestly, if MongoDB did one of these, I totally missed it. Of course, I’m not the target audience, so maybe it happened.

Around this time, the underwriters will find institutional investors to buy the initial offering. At the point the stock goes on sale, hopefully a large portion of offering has already been spoken for. However, the company doesn’t want the entire offering to be spoken for, so they can take advantage if the price “pops” on the opening day.

Another thing underwriters do is gauge excitement and try to choose a good opening price. A good opening price is as high as possible (to raise the maximum amount for the company) while still allowing it to “pop” sufficiently the first day. There is a psychological factor here (investors like it when the stock jumps the first day) and a practical one: the investors the underwriters convinced to invest in the IPO want to get a 20-30% return. In one day. This blows my mind: if you want to make money off of a startup, obviously the best way isn’t to be involved in one at all. Just work on Wall St. Sigh.

The next morning, at least for NASDAQ, you can look at the NASDAQ Facebook page to get a livestream of the event. It happened at ~10:30, although I thought the market opened at 9:30. So that was a little confusing. Some stock market guy will go up, say a couple of words, and introduce the company president. That guy will get up, say some stuff about the company (MongoDB’s the first DB company to go public in 27 years!). Then they get a bunch of people from the company onstage, there will be a countdown, the company president gets to “ring the bell” (which, AFAICT, is now touching a button on a touchscreen, which was a little sad) and then trading starts.

But not for you.

Remember the option agreements you signed? Me neither, but there’s a clause that’s called a “lock out period.” This is to prevent current/former employees (and investors) from dumping their stock and driving the overall price down. Since a main goal of an IPO is to raise money for the company (and, apparently, fat cats, grr), they don’t want a free-for-all when trading opens. Thus, you have to wait 6 months to start selling your equity. If you do not, the SEC will hunt you down and fine the crap out of you.

10 days after the IPO, the “quiet period” will end. This is when “insiders” (AFAICT, anyone on Wall St) will publish what they think of the company: buy/sell/hold recommendations. This is interesting and will give you an idea about what large banks think the price should be, but again, there are no guarantees.

At 6 months, the lock out period will expire. Generally around this time the stock will dip, as everyone’s expecting a lot of noobs to be dumping their equity.

All in all, it’s a very slow process. I expected it to be more fast-paced and dramatic, but it’s basically several months of speculation and then a few days of activity.

Resources:

  • I found Seeking Alpha had good financial analysis before the event.

A magic trick

I was standing on the street corner with Domino and a group of schoolkids came up. “Hey, can I show you a magic trick?” one of them asked.

“Uh…”

“Think of a number,” he said.

“Ok.”

“Now add 4 to it.”

“Ok.”

“Now add 5 to it.”

“Ok.”

“Now add 1 to it.”

“Ok.”

“Now subtract your original number from it.”

“Ok.”

“Did you get 10?”

“Nope!”

“What? What number did you choose?”

“I was using a different base. If you’re using base 16, then 4, 5, and 1 don’t add up to 10. Don’t kid a kidder, kid.” Then I flipped him a nickel and his head exploded with the power of math.

Well, not really. I wish I had the presence of mind to do that. But next time an elementary school kid tries that, I’m so ready.

R&R

Andrew and I just took a month off to relax in a cabin in the woods. We are extremely fortunate to have jobs and lives that allow us to take off this kind of time, because boy did I need it. At the beginning of our trip, I was hoping to get so much done: programming, writing, art, and probably 42 other things. However, once we were settled it, my brain said:

Ron from Parks and Recreation saying,

And so we relaxed. We cooked at home:

Breakfast on our porch. Looks like a mess, but let me interpret: that’s homemade buttermilk biscuits topped with a poached egg smothered in bacon gravy topped with a homemade salsa. It was so good.

Slightly more picturesque spaghetti carbonara.

We hiked almost every day:

This was an incredible scenic lookout at the top of a mountain where the rock just fell away and you got an incredible view of the valley. We took turns dangling our feet off the edge of the abyss.

Andrew and Domino sharing an apple on a Mohonk Preserve trail.

We went apple picking:

Domino carrying an groundfall apple. He loved chasing them.

Went spelunking, which I had never done before:

Andrew in a Tyvek suit, ready to crawl through “Fat Man’s Misery,” a 3-foot-high tunnel with a stream at the bottom. We were entirely covered in mud when we were done. It was a blast.

Another part of the cave. I’d never seen anything like it before.

At the beginning of the month, I felt broken and depressed and it took a few weeks before I felt normal. The day I started feeling like, “Yeah, I’m myself again,” Andrew actually noticed (I hadn’t said anything) and pointed out at dinner that I had started talking about the future for the first time. The third week, I started feeling energetic again. I suddenly wanted to take a pastry class (we’ve been watching a lot of The Great British Baking Show), learn woodworking, pick up sewing again to make a Halloween costume, do a hackathon, and write a cookbook.

It also renewed my appreciation of NYC. As I had gotten burned out, the city had stopped being the “magical city on a hill” that I’ve always seen it as. I missed seeing our friends, but until week #3, I didn’t miss anything about the city itself. However, once my groove started to come back, so did my love for NYC. I couldn’t wait to get back, there’s a bubble tea festival and a documentary at the Film Forum about the NYC library system. And where else could I take classes on French pastry from some of the best chefs in the world, and turn around and have the world’s most extensive collection of fabric stores and access to a real-estate-related hackathon two weeks after I get back? (And, most importantly, nachos delivered to my door in 10 minutes.)

Sitting on the porch, sipping my coffee, and looking out into the woods is very peaceful. I’ll miss that feeling, and Andrew and I agreed that we should do something like this every 3-5 years from now on. But I can’t wait to get back to the city. I need my own kitchen where I’m going to try making some Genoise sponge cake…

P.T. Barnum on salary vs. equity

I’ve been reading P.T. Barnum’s autobiography and came across an interesting passage about when he was employed at Mr. Taylor’s (maybe of Lord & Taylor’s? Not sure) shop:

My employer manifested great interest in me, and treated me with the upmost kindness, but the situation did not suit me. The fact is, there are some persons so constituted that they can never be satisfied with labor for a fixed salary, let it be never so great. I am one of that sort. My disposition is, and ever was, of a speculative character, and I am never content to engage in any business unless it is of such a nature that my profits may be greatly enhanced by an increase of energy, perseverance, attention to business, tact, etc.

He also sounds like quite an ass and a racist, but it’s an interesting read.

Barnum & Bailey show poster

My favorite benefits that more companies should offer

Google is famous for its perks, but the ones that ended up being my favorite were not the free food:

Peer bonuses
Anyone at Google can nominate a coworker for a peer bonus. They write a couple sentences about what the person did and send it to their manager for approval. It’s a really nice way of getting quick recognition for going above and beyond for someone. I feel bad that I didn’t give more of these out, but it was a terrifically nice feeling to get them.
Anonymous mailing list for woman engineers
During my tenure, someone started an anonymous mailing list for woman engineers, where people discussed everything from robotics to travel to birth control. There was also, of course, lots of discussions about how to deal with the unpleasant situations women in tech invariably find themselves in. Having this platform was like having a place you could breathe free.

I am also proud of my contributions: when I was having a rough week a while ago, I started a thread about “tell me about a cool thing you’re doing” (I gave the example of having just regrouted my bathroom tile) and it became one of the most popular threads on the list. During the recent issues with The Document That Shall Not Be Named, someone revived this thread and people decided to make it a monthly topic, so I’m happy to have that as my (unattributable) legacy.

As part of regrouting: I was so proud of getting the caulk out from the bathtub in one long strip that I took a “I caught a fish”-style selfie with it.

Mail room
I hate going to the post office and I always feel like I’m doing it “wrong” (I’ll stand in the wrong line, use the wrong box, something). Google’s mail room had all sorts of envelopes and boxes and, most importantly, would let you drop off any envelope or package and they’d put on the right stamps on for free. They also had a hilarious wall of portraits of “famous postal workers” (Newman of Seinfeld, the guy from Cheers, and so on).

BizSpark

Many years ago, I was speaking at a PHP meetup and got talking to a guy who worked at Microsoft. He told me about Microsoft’s BizSpark program, which lets startups use Microsoft’s software for free. As MongoDB was about a dozen people at the time, I filled out the application and started using PowerPoint for my presentations (which was a vast improvement over Open Office).

One of my friends just asked on Facebook how they could get a cheap license for Microsoft Word, so I looked up the BizSpark program page and saw:

BizSpark homepage

MongoDB went from being one of the startups that BizSpark was aimed at to being one of the features of BizSpark. Pretty cool.

What’s next?

I joined Google for three main reasons:

  1. To prove I could. They rejected me when I was a college senior, so I got a lot of personal satisfaction from just getting an offer.
  2. To learn what “good programming” was.  A startup isn’t the best place to learn how to write readable, maintainable code.  Google was superb for this: I learned so much about how you should program.
  3. To get promoted.  A personal goal of mine, which I finally accomplished last year.

However, once I got promoted, there was nothing left that was really driving me.  I began looking around for alternatives.

I thought it might be interesting for people to see my process here: I think of myself as pretty successful, but when you drill down I actually fail ~99% of the time, I just try a lot of crap.  For instance, this process of finding something else to do began early this year, when I:

  • March:
    • Considered becoming a general contractor. Dissuaded by Andrew (for now).
  • April:
    • Talked to a friend about founding a startup, but haven’t gotten a MVP together (yet).
    • Released a side project (which I was hoping would make me a bazillion dollars: it did not).
    • Applied for a transfer to Google Ventures (interviewed with every member of the team and didn’t hear back).
  • June:
    • Applied to a “startup within Google” program (rejected).
    • Talked to a manager in Google that I knew was good, who had no headcount.
    • Emailed TravisCI about job (rejected pre-interview, although I took forever to get back to them, so I’m going to blame it on that).
    • Emailed GitHub, they emailed me back, I lost track of things and never follow up.  Whoops.
    • Applied to Compass (tech-focused real estate company in NYC), didn’t hear anything.
    • Got an email inviting me to WhiteTruffle, which looked interesting. None of the jobs I was matched with were right, though.

Keep in mind that, at this point, I have been job searching (casually, but still) for a couple of months with 0% success rate. Then July rolled around.

  • July
    • Saw the AVC article on Flip, realized that tied in very well with my real estate interests*, applied through AngelList. I didn’t hear anything from them for a while, which made me sad.  It turns out that they tried to contact me through AngelList, but I never got the message and they ended up tracking down my blog and finding my email and contacting me directly.  Cool!  Met with one of the founders for coffee.
    • Compass emailed me back! Turned out the recruiter was on vacation.  Came back and set up a call.
    • AngelList contacted me about their A-List program for top candidates and I opted in.  I got 16 requests in the first 24 hours, very awesomely tailored to my interests.  Interesting requests continued to trickle in over the next week, until I got overwhelmed and asked them to take me off.
    • AngelList asked me if I wanted to apply to AngelList itself (very flattering). I was pretty impressed by the experience so far so I agreed to talk to them.

On July 12, I had intro calls with Morty, Waverly Labs, Compass, and AngelList. Then Google Ventures emailed me: after three months, they were actually making a decision! And then I got an email from Flip: they wanted to make an offer!  It was a big day.

I decided that, with offers from Flip and Google Ventures I was excited about, I’d cancel the rest of my job search.  I was having a hard time deciding between the two, so I made a pros and cons list:

Staying at Google:

  • Pros:
    • Lunch/breakfast with Andrew
    • Money
    • Friends
    • Known evil
    • Short commute
    • Prestige
    • Pasta every day
    • Scurvy less likely
    • Boxing classes
  • Cons:
    • Corporate
    • Decisions take forever
    • People are slackers (certainly not everyone, but some)
    • Doesn’t matter what I do
    • MTV is always #1
    • Travel!
    • Port Authority building is depressing

Working at Flip:

  • Pros:
    • Tons of stock.
    • Awesome office that makes me happy.
    • Cool work
    • Can take Domino every day
  • Cons
    • Unknown evil
    • So much less money
    • What if I suck?
    • Unknown stability
    • Coworkers might suck
    • Founders might be asses
    • I might get scurvy

Through this process, I realized that I should probably be eating more fruits and vegetables.  But aside from that, looking down the list, I’m mostly staying at Google because I’m afraid of the unknown.  Considered that way, I’d rather do something I’m passionate about, even if it’s risky. So, I’ve given my notice and will be starting at Flip this fall. I’m so excited!

Although I will miss having pasta for lunch every day.

 

* After seeing the house, I got super into real estate and ended up getting licensed as a NY State real estate agent.

The next great frontier in ML: dogs in hats

I’ve been messing around with Keras, a ML library that makes it pretty easy to do AI experiments. I decided to try out image recognition, so I found a picture of Domino in a fez:

Then I wrote the following Python program which uses the existing ResNet50 image recognition library.

import numpy as np
from keras.preprocessing import image
from keras.applications import resnet50
 
# Load the image
img = image.load_img('fez.jpg', target_size=(224, 224))
input = image.img_to_array(img)
# Keras can process an array of images, but we're only passing one, so turn it into an array with one element.
input = np.expand_dims(input, axis=0)
# Normalize the RGB values into a 0-1 range, since ML algorithms get thrown off by big ranges.
input = resnet50.preprocess_input(input)
 
# Predict what's in the photo.
model = resnet50.ResNet50()
predictions = model.predict(input)
predicted_classes = resnet50.decode_predictions(predictions, top=10)
 
for _, name, liklihood in predicted_classes[0]:
    print("this is an image of {} {}".format(name, liklihood))

In addition to the obvious prereqs, you have to sudo apt-get install libhdf5-dev; pip install pillow certifi h5py.

This prints:

this is an image of Bouvier_des_Flandres 0.4082675576210022
this is an image of briard 0.3710797429084778
this is an image of Newfoundland 0.10781265050172806
this is an image of giant_schnauzer 0.04042242094874382
this is an image of Scotch_terrier 0.038422249257564545
this is an image of komondor 0.012891216203570366
this is an image of Tibetan_terrier 0.0026010528672486544
this is an image of affenpinscher 0.0024157813750207424
this is an image of standard_poodle 0.0021669857669621706
this is an image of Kerry_blue_terrier 0.002110496861860156

It’s pretty solid on “it’s a dog.” I’m disappointed in the lack of fez-related IDs. However, I like some of these as possible breeds for Domino:

Tibetan terrier is pretty close, they are relatives.

Newfies are adorable, but the size is a little off.

I have no idea where Komondor came from. They’re amazing looking, but pretty distinct.

So, still needs some work. But not bad for less than 30 lines of code.

Keeping your deps tidy

My coworker Carmi just published a blog post on the Bazel blog about how Java tracks dependencies. Bazel has some nice facilities built in to let you know when you need to add dependencies:

ERROR: /home/kchodorow/test/a/BUILD:24:1: Building libA.jar (1 source file) failed: Worker process sent response with exit code: 1.
A.java:6: error: [strict] Using type C from an indirect dependency (TOOL_INFO: "//:C"). See command below **  C getC() {
  ^
** Please add the following dependencies:
  //:C  to //:A

He mentioned unused_deps, a great tool to go the other way: what if your BUILD file declares dependencies you’re not using? unused_deps lets you quickly clean up your BUILD files.

To get unused_deps, clone the buildtools repository and build it:

$ git clone git@github.com:bazelbuild/buildtools.git
$ cd buildtools
$ bazel build //unused_deps

Now go to your project and run it:

$ cd ~/my-project
$ ~/gitroot/buildtools/bazel-bin/unused_deps/unused_deps //... > buildozer-cmds.sh

This will print a bunch of info to stderr as it runs but, when it’s done, you should have a list of buildozer commands in buildozer-cmds.sh. For example, running this on the Bazel codebase yields:

buildozer 'remove deps //src/main/java/com/google/devtools/build/lib:auth_and_tls_options' //src/tools/remote_worker/src/main/java/com/google/devtools/build/remote:remote
buildozer 'remove deps //src/main/java/com/google/devtools/build/lib:build-base' //src/tools/remote_worker/src/main/java/com/google/devtools/build/remote:remote
buildozer 'remove deps //src/main/java/com/google/devtools/build/lib:concurrent' //src/tools/remote_worker/src/main/java/com/google/devtools/build/remote:remote
buildozer 'remove deps //src/main/java/com/google/devtools/build/lib:events' //src/tools/remote_worker/src/main/java/com/google/devtools/build/remote:remote
...

This is a list of shell commands, so now you need to execute this file. The buildozer tool also lives in the buildtools repository, so you just have to build that and then add it to your path:

$ cd ~/gitroot/buildtools
$ bazel build //buildozer
$ cd ~/my-project
$ chmod +x buildozer-cmds.sh
$ PATH=$HOME/gitroot/buildtools/bazel-bin/buildozer:$PATH ./buildozer-cmds.sh

This will run all of the buildozer commands and then you can commit the changes, e.g.,

$ git diff
diff --git a/src/tools/benchmark/javatests/com/google/devtools/build/benchmark/codegenerator/BUILD b/src/tools/benchmark/javatests/com/google/devtools/build/benchmark/codegenerator/BUILD
index 022a4037d..5d5cdf8d0 100644
--- a/src/tools/benchmark/javatests/com/google/devtools/build/benchmark/codegenerator/BUILD
+++ b/src/tools/benchmark/javatests/com/google/devtools/build/benchmark/codegenerator/BUILD
@@ -6,7 +6,6 @@ java_test(
     deps = [
         "//src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator:codegenerator_lib",
         "//third_party:guava",
-        "//third_party:junit4",
         "//third_party:truth",
     ],
 )
@@ -17,7 +16,6 @@ java_test(
     deps = [
         "//src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator:codegenerator_lib",
         "//third_party:guava",
-        "//third_party:junit4",
         "//third_party:truth",
     ],
 )
@@ -39,7 +37,6 @@ java_test(
     deps = [
         "//src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator:codegenerator_lib",
         "//third_party:guava",
-        "//third_party:junit4",
         "//third_party:truth",
     ],
 )
@@ -50,7 +47,6 @@ java_test(
     deps = [
         "//src/main/java/com/google/devtools/common/options",
         "//src/tools/benchmark/java/com/google/devtools/build/benchmark/codegenerator:codegenerator_lib",
-        "//third_party:junit4",
         "//third_party:truth",
     ],
 )
...

It’s a good idea to run unused_deps regularly to keep things tidy. For example, the Bazel project does not run it automatically and has nearly 1000 unneeded deps (oops). You might want to add a git hook or something to your CI to run for every change.

Messy closet vs. clean closet

unused_deps: the Container Store of build tools.

GitHub notification… notifier

Here is what my inbox look like each morning:

All those pink-tagged messages are emails from GitHub. Gmail cannot figure out which ones are important and GitHub’s notification stream, in my experience, is useless. It’s noisy and doesn’t clear the way I’d expect. The problem is, people actually do mention me on bugs. And I often have no idea.

So, I made my own notification system. It’s a Chrome extension that is a little ear that sits next to your location bar. If you have an unread GitHub notification, it turns red. If you’re all caught up, it’s green.

If this would be useful to you, please give it a try!

Download the Chrome extension here.

Feedback and suggestions welcome!

kristina chodorow's blog