Skip to content

How to do a tech startup, for the non-technical

June 7, 2012
This is a topic that comes up a lot with non-technical friends, so here is my quick take on how to start a technical company when you have no technical experience.
  1. Meet someone technical, convince them that this is a good idea and let them build it. There are co-founder mixers in most major cities. The problem with this route is that we techies don’t see non-technical co-founders as adding a lot of value (no, a business plan doesn’t count), so the key is to dispel that by doing some actual work. I suggest writing / researching a lot of content, if that’s appropriate to your ideal business model. Otherwise, business development (partnerships, for example) and product development (a strong understanding of the customer’s needs) are very valuable for a new startup. The more tangible your accomplishments, the more luck you will have recruiting technical talent.
  2. The corollary to #1 is to hire a web developer on Craigslist or something. This is not recommended, as it’s very hard to manage a technical person if you don’t understand the technology.
  3. Learn to code, for example with codeacademy, or CS106A. This is probably the least efficient route.
  4. My suggested route, start it yourself. This can range in complexity from starting a blog/tumblr/facebook/G+/twitter, to using a DIY website builder like Weebly, or an easy-to-use CMS like DrupalDolphin, WordPress or others. (I haven’t investigated this stuff in about five years, so I’d imagine that there are new and better alternatives, but basically they allow you to launch and customize a social website without any code.) I’m pretty sure that GoDaddy and other sites will give you an easy way to install Drupal et. al. when you buy a domain and hosting, which again means that you get up and running without code. When (if) the thing takes off, it will be much easier to hire a programmer / recruit a technical co-founder to completely revamp your site (either within the CMS or with a totally new site).

On Finishing College

June 6, 2012

I just finished my last class at Stanford. Obviously there’s a lot that needs to be said about this, but for now let me say this:

This is not the summit. This is a monumental achievement, but it is just the beginning of the climb ahead. While there may not be more lectures, midterms, or problem sets where I’m going, there is much more learning ahead. Worse, although the path so far was paved and well-marked, this is where the sidewalk ends. The “right” or “best” way to go isn’t clear, and the paths are not well-defined. And it’s all going to be great.

Mining Google Voice, Part II: The Data

March 27, 2012

A few months ago, I got an interesting idea: what if I took all of the texts I’d sent in the last year and tried to analyze that data. Now that I’m on break again, I decided to pick up this project. Basically I’ve written a pretty basic parser (in Python!) for Google Voice’s XML format which allows me to pull some basic findings out of the massive (well, if 10 MB can be called massive) dataset.

But before I get into what I’ve learned about myself and my friends, I thought I’d present some issues I encountered in dealing with the data.

History Limitations

I had always thought that Google Voice was like Gmail – messages lived forever in your inbox. Turns out they don’t, the inbox is limited to 100 pages, so when I mined the inbox in the last post, I only got about 1000 conversations, about 15 months worth.

(Edit: After a little snooping, turns out GV has a history tab. Time to go mine that guy, all 5300 conversations.)

Conversations

GV has a notion of conversations, which is pretty cool. The thing is, unlike the iPhone, it chooses to cut the conversations according to some algorithm. So you might have a conversation that stops for a day or two and then picks back up. I’m not sure if there’s an arbitrary cut-off, or whether it scales with the number of texts or their frequency. It might be interesting to reverse-engineer the algorithm!

Timing

The conversations thing would’t be so annoying if not for the way that GV handles reporting the time. Specifically, each text is tagged with a timestamp but no date. Each conversation is tagged with a full datetime of the last message in the conversation. Thus, without more knowledge of the conversation algorithm, we can’t determine when a specific message was sent. Moreover, because we have the date for the last message, we can’t simply assign datestamps to individual messages in a single pass; a more complicated routine is needed. Until this is solved, I can’t get granularity beyond a single month, which isn’t all that problematic since there isn’t that much data on a daily/weekly level anyway, and what little data I do have is mostly noise.

Unusual characters

Finally, there are no limitations on the characters you can include in texts, including the ‘<‘ and ‘>’ characters (which are popular both in talking about HTML or other markup languages and as part of the ❤ heart). This makes parsing the XML non-trivial.

Quote

January 8, 2012

‎”If you want something bad enough, you will find a way; if you don’t, you will find an excuse.”

Nerd Alert: Mining Google Voice

January 8, 2012

I’ve been home on break for the past month. Most of my time has been spent in complete relaxation. I’ve read way too many books, watched all 140 episodes of How I Met Your Mother (true story), and slept a lot. This relaxation must have been good for me, however, since I’ve come up with a few interesting project ideas. One I decided to try was to visualize my texts over the past few years.

I use an amazing service called Google Voice for the majority of my texts. I figured it wouldn’t be too hard to pull all of my texts out of their website, parse it in Python, and create some pretty graphs:

  • Number of texts by person over time
  • Of my friends, who sends the most verbose texts?
  • With whom do I have the largest text deficit/surplus? (Who texts me more than I text them, or vice versa?)
  • Do I text differently in response to different people?

And so on. (Suggestions definitely appreciated!)

But first, there’s a little problem of grabbing the data out of the internet.

First attempt: Search for an API

It exists, but doesn’t look to friendly. Someone on the internet suggests just forwarding all texts to your email and grabbing them from there. Sure, that’s a much better forward-looking solution, but I am much more interested in historical data.

Second attempt: Basic cURL

cURL is a great tool for grabbing pages off the internet. Surely I can just grab some nicely-numbered pages and I’ll be all done with this. Right?

Not so fast. Looks like Google isn’t too eager to get mined. Just hitting them up with a
curl -A Mozilla https://www.google.com/voice/
gives a pretty bland “Moved Temporarily” page. Not helpful.

Third attempt: Advanced cURL

After some more Googling, I came across a link that suggested the following: go to the login page, let it leave a cookie. Then submit a fake form using all of the hidden and non-hidden fields (and the cookie) to the form’s action URL and pray. I ended up with this monstrosity of a command:
curl -b cjar -c cjar --cookie cjar --cookie-jar cjar --data 'continue=https://www.google.com/voice/' --data 'followup=https://www.google.com/voice/' --data 'service=grandcentral' --data 'dsh=...' --data 'ltmpl=open' --data 'GALX=...-npE' --data 'pstMsg=0' --data 'Email=...@gmail.com' --data 'Passwd=...' --data 'signIn=Sign in' --location --output ~/Documents/page.html -A Mozilla https://accounts.google.com/ServiceLoginAuth
And, what do you know, it didn’t work. Apparently my browser’s cookie functionality is turned off. (Who would’ve guessed.) That was enough to get me to take a nice, long break.

Fourth attempt: Basic Apple Automator

Automator is an often-forgotten but fairly powerful piece of macro software that ships with Mac OS X. It’s designed to allow non-programmers to automate their repetitive tasks, either by recording macros or by dragging boxes to build workflows in which data flows from block to block. I figured that using Google Voice’s keyboard shortcuts would be the best way to go here, so I created a new “Watch Me Do” macro by hitting the record button in Automator. I switched to Chrome, grabbed the source of the page using alt-command-U, selected it all with command-A, copied it with command-C, switched to TextEdit, opened a new file with command-N, pasted with command-V, then switched back to Chrome and hit my right arrow to bring up the next page of my inbox. Needless to say, it didn’t work, instead giving me an obscure and indecipherable error message.

Fifth attempt: Java Robot

I love the Java Robot class. (java.awt.robot) Since what I was trying to do in Automator was just pounding some keys on the keyboard, I figured I would fire up IntelliJ and use a Robot. On a PC, no problem. On a Mac, however, this gets interesting. How the heck do you get Java to hit the command/apple/squiggle key? Googling this issue just led me to some insensitive forum posters / PC users explaining how you can hit the command keys just like any others. Of course they were referring to the F1-F12 keys, which aren’t a problem. Checking out the Wikipedia article, I saw that Macs recognize the Windows key as the command key, but a quick test showed that not to work.

Sixth attempt: Brute force & Epiphany

Dejected, I decided to download a bit of the data and then start mining it. If the results were interesting, I could invest some more time in gathering data or automating that process down the line.

After copying off the source for about ten pages, I realized I might as well check out what I had. Specifically, I was wondering whether Google Voice’s “14 more messages” links were polling the server or just revealing some hidden divs. Well, it turns out that it was… nothing. In fact, there was no content at all in the source I had been downloading (except for the names and phone numbers of each one of my contacts). Dejected, I hopped into the ‘Network’ tab of Chrome’s Inspect interface. Goldmine.

It turned out that every time I hit the next or previous buttons, it was doing an AJAX request, and the server was returning a beautiful XML document with everything I could ever want. Moreover, it was a GET request, which meant that I could just ping the server at that URL

Seventh attempt: Ain’t pretty, but it works

Here’s the final solution that worked for me:

From the Network tab in Chrome’s Inspect interface, I found a URL: https://www.google.com/voice/inbox/recent/?page=p3&v=something (not sure what the v field does or whether I should keep it confidential, but it’s important that it be there and it’s important that it be right). Using a for loop, I generated an html file that contained links to all of those pages from p1 to p165. I then opened this page in Safari, and used Automator to 1. Get the open URL in Safari; 2. Get Link URLs from that page; and 3. Display webpages. Running that workflow opened up 165 tabs (in Chrome, interestingly enough), which then downloaded the corresponding XML file. All that was left was for me to manually approve each download. I ended up with about 90 files, a lot fewer than the 165 I expected, but understandable since Chrome can’t necessarily download 165 files at once (and I might have hit Discard a few times in the chaos). Certainly I could go back in smaller slices and get all of them if the analysis turns out to be interesting.

Next up, parsing, analysis, and visualization!

Part II of this series is now live: data issues.

Edit: I just found the History tab in GV, which means I can grab all of the data, not just the last 1000 conversations.

Edit II: I just found Google Takeout, which allows you to download all of your Google data (including Voice). Well that pretty much negates all of my work here, but I still think that my data is in a better format for parsing.

My Universal Startup Advice

May 17, 2011

Dear founder,

So, you’ve decided that you want to do a startup. Welcome to the game. You are the boss. It’s all on your shoulders now. The game is extremely lucrative and extremely risky. You will probably fail. (But that’s not a bad thing – see my previous post.) So what should you do now?

  1. Always test your assumptions.
  2. Always be moving.
  3. Always be pitching.

Assumptions: Maybe you’re an engineer, maybe you’re not. In either case, start thinking like one. You hopefully have a vision for a product or service, what it looks like, which features are important, who your customers are, how much they are willing to pay, etc. (If you don’t, we’ve got some bigger problems on our hands.) The first piece is to recognize that your vision is built on assumptions that you hold about the world. Since we’re thinking like engineers, let’s start testing our assumptions.

People will tell you to think outside the box. Well, it turns out that’s really hard. What we want to start doing here is exploring the box. By understanding its boundaries, how it’s built, what it’s made of, we can gain understanding about the environment in which you hope to operate. Remember what Mark Twain said:”It ain’t what you don’t know that gets you into trouble. It’s what you know for sure that just ain’t so.” By always questioning our assumptions, we hope we can avoid the trap of lying to ourselves.

Movement: The second key to a successful startup is to always be moving. No matter where you are in process, you must have milestones that you want to reach. Always remember, there is no market for startup ideas. You should constantly be fleshing out your idea, improving your proposal, and moving forward. Don’t ever get stuck on one step – getting stuck is the opposite of movement.

A lot of my colleagues at Stanford want to start internet companies but aren’t coders themselves. Sure, they could devote six months to finding a tech co-founder and building a complete website from scratch, but that is six months that wouldn’t be spent testing assumptions. Focus on hitting external milestones. Launch your site as quickly as possible, in whatever quick and dirty configuration you can. (As an aside, I know you want to control the platform, but build your prototype on top of Facebook, Twitter or WordPress. This is probably a whole post in and of itself.) Get out there, and start testing your assumptions in the real world. Do it fast and iterate quickly (see Lean startup and Steve Blank’s ferocious customer-centric rapid iteration for more information). The key takeaway is to remember that if you aren’t moving forward, you’re falling behind.

Pitching: Finally, always be pitching. Pitch to anyone who will listen, and maybe even to someone who won’t once in a while. Solicit feedback from everyone you meet. Negative feedback is especially important. Feedback can help you question your assumptions and give you ideas about how to achieve movement.

Everyone knows someone who is working on something stealthy. Resist the urge to do the same. If you’re worried about someone else catching on to what you’re doing, it means that you aren’t moving fast enough. If you haven’t progressed beyond the idea stage, then all you have to protect is your idea and you should be in stealth mode. Just don’t stay there too long. One of the cornerstones of the lean startup is that you should be moving so fast that you don’t have the time or the need to worry about competitors.

Welcome to the game. Good luck!

Do you fail enough?

May 9, 2011

Quick. When was the last time you failed? I recently read this blog post from Chris Dixon, and I’m giving it a shot.

Chris proposes a rather simple philosophy. “If you’re not getting rejected every day, your goals aren’t ambitious enough.” This reflects something I’ve thought a lot about. Let’s say you want to maximize your performance (not an unreasonable goal). Therefore you want to push yourself to the limit in every aspect of your life. But how can you know that you’ve achieved maximum performance? You have to fail.

I took an incredible class at Stanford last year from Professor Clough, the premise of which was that we have to learn from our failures if we want to be successful. Professor Clough pushed us through simulations and real-world activities to fail as frequently as possible. This allowed us to learn about our weaknesses and turn them into strengths. Chris Dixon is proposing that we do the same thing with our businesses and our lives.

Another one of my favorite classes at Stanford is the Lessons in Decision Making (MS&E 450) seminar from Professor Howard. He proposes that regret and fear are irrational and that we should erase those emotions from our vocabulary. Let’s say you’re pitching to potential investors. If you let fear of failure enter your decision calculus, you probably won’t even attempt to pitch to some VCs. By sitting out those pitches, you’re missing out on an opportunity to fail. First, every failure is an opportunity to learn and to improve. Second, you might even succeed every now and then.

The only line I remember from Fight Club is “How much can you really know about yourself if you’ve never been in a fight.” I feel the same way about failure. How do you know what you’re capable of unless you know what your limits are? How can your push yourself to succeed if you are not actively aware of your own limits?

I’ve tried getting rejected a bit more over the past few months, and I’ve got to say, it’s pretty challenging. According to Dixon, that means that my goals weren’t (and still aren’t) ambitious enough. So go out, make your own luck, and ask for what you want. Don’t let fear or regret dominate your emotions – go out and focus on getting rejected.

 

%d bloggers like this: