2014年3月28日星期五

How to measure the "Next Big Thing"

The definition of the next big thing various a lot,  I will define it in the following way:

The next big thing is a product that will have hundreds of millions of users, in a business worth billions of dollars.

From the internet history, big things such as Microsoft, Google, Facebook are too big :) For other businesses I want to borrow to discuss today, contains big things such as OpenTable, Yelp, and one startup I just noticed called shyp, and another YC startup Strikingly.

When I started my own startup, one thing I thought about is what makes these product so popular and the business so big. I am also very curious on how good investors such as Paul Graham select and measure these small businesses. I figured out:

A candidate of the next big thing product must resolve people's pain point.
The market size is the size of the group which is feeling the pain, i mean, the real pain. 

Think about the product such as Draw Something. You can say it is a big product, however I do not think it is the "next big thing". It makes you feel happy when you play with it, but it does not resolve any of your pain point. I will list out my thoughts on why "next big thing" must resolve pain point in the followings.

Let's define the concept of pain point, and how to measure whether the startup idea is actually solving a real pain point. But before that, lets first define the followings: pain scenario frequency; pain ratio and the pain market.

pain scenario: the situation which could potentially induce pain.
pain scenario frequency: the count of situations which could potentially induce pain.
pain ratio: the count of feeling real pain / pain scenario frequency.
pain market: the customer group that is feeling the pain.

Lets do some rough and estimated calculations on OpenTable, Yelp, shyp and Strinkingly:

OpenTable:
pain scenario: after you made some reservation, you found yourself cannot make it to arrive in time, and then you want to change your reservation.
pain scenario frequency:  sometimes.
pain ratio:  you need to find the number, and call it yourself, and you will spend 10 minutes talking with restaurant client to figure out a the next best time. This is real pain, therefore the pain ratio could be estimated as 1
pain market: generically applied to most people who eat outside often.

Yelp:
pain scenario: I want to find a restaurant nearby to eat, but has no idea of the surrounding restaurants.
pain scenario frequency:  often
pain ratio: have no idea on surrounding restaurant, you feel uncomfortable and you have the uncertainty to eat something really bad. This is real pain, therefore pain ratio can be estimated as 1.
pain market: generically applied to most people.

Shyp:
pain scenario: every time I went to postal office
pain scenario frequency: often
pain ratio: I am in line, I have to prepare my own packaging box, I have to figure out a non-working day and time to drive to postal office. I feel not comfortable and pain. Therefore the pain ratio could be really high.
pain market: generically applied to most people, since most people have the need to send packages.

Strikingly:
pain scenario: people want to build a landing page for my mom, my girlfriend, etc.
pain scenario frequency: sometimes.
pain ratio: I have no knowledge of css, javascript, html. I feel real pain. So the pain ratio is 1.
pain market: people with no coding background who wants to build a landing page, but not generically applied to most people.

From the above calculation, I found one common pattern, they are hitting the real pain point, and more importantly, the pain ratio is high in these products.The market size is big although not in the same scale.

To measure whether a startup is promising, yes, people are saying founders are the most important, which is easy to understand. They should be determinant, and smart. But when comes to the product and the market size, I am guessing what they measure is the followings(the order really matters here):

1, pain ratio number
2, pain market size
3, competitor number

A promising startup must have a high pain ratio number, if not, the product cannot be organically spread out by users. The second thing is that the size of the pain market, the bigger the better, but at least somehow big enough. Third, they will measure the competitor numbers, if there are a ton, then they will pay much more attention on user acquisition.

Therefore, that's why we saw some YC companies do not have any user acquisition, but still get into the program (reason lies on they got 1 and 2, and the competitor number is small); and we saw other YC companies struggled a lot to get users, do the user acquisition such as Strikingly, since there are already a lot of competitors there, and the market size is big enough, but not huge.

To sum up, when you thought about whether you are building the "next big thing", ask yourself the pain ration number and the pain market size first before you say a yes.



2012年10月1日星期一

Set up Django, Python, MySQL-db

For MAC OS snowleopard, it is really a headache on resolving django, python MySQL-python, MySQL, and make them work.

I resolved the issue using the reference:
http://stackoverflow.com/questions/4730787/python-import-mysqldb-error-mac-10-6

It would be better to use 3rd party tools such as MacPorts to get these tools, I did:
sudo port install py26-mysql
sudo port install py26-django

After that, we need to set the default python to the version that macports downloaded. The location would be /opt/local/bin/python2.7.

The default python would be /usr/bin/python.

In order to create a symlink from /usr/bin/python to /opt/local/bin/python2.7, we need to do the following:
http://stackoverflow.com/questions/6943812/macports-select-default-python-interpreter-for-executing-scripts


mv /usr/bin/python /usr/bin/python.orig
ln -s /opt/local/bin/python /usr/bin/python
port select --set python python26


We may encounter errors:
Selecting 'python26' for 'python' failed: symlink: /opt/local/etc/select/python/current -> python26: file already exists
Way to resolve this is to go to the /opt/local/etc/select/python/ directory, and do 'mv current wasCurrent', then redo the 3rd step of port select

After that, we have updated the default python to the port macports installed, and we have django installed also. We could do:


Python 2.6.8 (unknown, Apr 14 2012, 04:15:37)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> import MySQLdb
>>>



to test whether we have made them successfully installed.


2012年8月17日星期五

写在实习最后一天

最近零零散散看了很多被大家炒得很热的话题, 刘翔的奥运, 周克华的被抓, 面试难度的浮夸, 批判看待公司, 以及各种网上的言论, 我发现自己忽然好像要丧失掉对这些问题自己的一个看法, 是不是看得太多, 反而忘掉了自己去思考的时间. 我记得有个朋友说过, 大学教会我们的不应该只是那些知识, 而是看待问题的看法, 是否有自己的立场和一个准确的判断力.

看完王垠对谷歌和康奈尔的看法, 虽然感觉他比较偏激的在陈述自己的观点, 但能听到这么多直接的反面的声音, 我猛然发现如果要自己真正去想这些事情的时候, 自己却说不出来一个所以然, 或者应该这么说, 能想到的也只是一些浮夸, 连自己也去吹嘘的一些浮夸.

我一直在考虑自己的未来,甚至有段时间居然能够忘记享受现在的生活. 我在需要做出选择的时候我会犹豫, 我在给自己理由选A或者选B的时候, 那些声音好像不是从我自己内心来, 那些浮夸就像如期而至的到来, 而自己好像还不清楚自己适合不适合. 或许自己从未认真的去想过这些问题.

微软的实习时间过得很快, 今天和朋友聊天还在笑三个月前胆怯的跑去陆奇办公室的事情, 今天就要这样结束了, 有点不舍. 我不太想说实习有多么多么的好, 害怕自己一说就容易夸大, 害怕别人说这是在炫耀. 如果要说实习有多么多么的不好, 那人就会说, 你有听过陈奕迅的红玫瑰没, 得不到的永远在骚动. 是阿,我发现我现在有很多东西都不敢去表达了. 来美国4年,我想4年前的我肯定是有什么说什么的.

说到面试, 我会去看mitbbs待字闺中板块, 一亩三分地的打工求职板块, 里面很多信息都是说如今facebook, google有多难多难进去, 这俩公司有如何如何好, 微软现在都没人去什么的, 微软的政策有多么多么差. 我想说,很多东西看看就好, 不一定就要去相信而把自己的信心丢了. 说面试不难并不是牛, 而是没有被这些过分浮夸所吓倒. 去一个公司, 公司名气, 面试难度怎么样没那么重要, 重要的是你在那个团队能不能得到应该有的赏识和尊重, 你自己才是最重要的嘛.

看一个朋友的校内, 他说我们都活在别人的幸福定义里面, 有些人会认为你现在的生活已经非常幸福, 而你总在想去追求比你更幸福的人的生活而忘记现在的自己. 享受生活, 我能做到吗? 我想我如果今后在失业的情况下还能有心情去旅游一年的时候, 那便是能够算得上是享受. 生活的奴隶有点可怕, 我不希望我今后是为生活而生活.

困了, 还是睡了.




2012年4月3日星期二

纯技术帖-说一些自己想了蛮久的题

1. How to determine whether a binary tree is left-complete? 就是每一层的node都fill满,最后一层的从左到右fill满.

此题看上去蛮简单,想了好一会, 附上code:


bool isPerfect(BT *root){
  if (root == NULL)
    return true;
  int height = maxHeight(root);
  //int numOfNodes = 2 ^ (height+1) - 1;
  int numOfNodes = pow(2, height) - 1;  //edited in 4/4/2012
  int count = 0;
  queue<BT *> q;
  q.push(root);
  count += 1;
  while(!q.empty()){
    BT *cur = q.front();
    q.pop();
    if (cur -> left != NULL){
      q.push(cur -> left);
      count += 1;
    }
    if (cur -> right != NULL){
      q.push(cur -> right);
      count += 1;
    }
  }
  if (count == numOfNodes)
    return true;
  else
    return false;
}//takes O(n) get height and O(n) to do the count



bool isLeftComplete(BT *root){
  if (root == NULL)
    return true;
  if (isPerfect(root))
    return true;
  if (!isPerfect(root -> left) && !isPerfect(root -> right))
    return false;
  if (isPerfect(root -> left) && !isPerfect(root -> right)){
    if (maxHeight(root -> left) - maxHeight(root -> right) == 0){
      return isComplete(root -> right);
    }else{
      return false;
    }
  }
  if (!isPerfect(root -> left) && isPerfect(root -> right)){
    if (maxHeight(root -> left) - maxHeight(root -> right) == 1){
      return isComplete(root -> left);
    }else{
      return false;
    }
  }
  //another case -- edited 4/4/2012
 if (isPerfect(root -> left) && isPerfect(root -> right)){
    if(maxHeight(root -> left) - maxHeight(root -> right) == 1)
      return true;
    else
      return false;
  }
}

关于 isLeftComplete的时间复杂度,觉得是nlogn, 不知道只用BFS能否直接O(n)搞定.尝试了几种O(n)bfs办法,比较复杂.用到的空间比较多.

持续更新..
对isLeftComplete作了几处修改. 需要判断,root是不是perfect, 然后判断root的left right是不是perfect, 总共有5个判断.

2. 实现了如何copy一个linkedlist, 这个list除了有next node,还有一个random node pointer, 也就是:

typedef struct list{
  int data;
  struct list *next;
  struct list *random;
}Node;
random可以随便指向其他node.
要求: copy完整的list, 还要求不影响原来的list, 时间要求O( n). 附上code, 实现起来没觉得那么容易,还是花了点时间. 已经test.


//copy a linkedlist without the random next pointer
Node *copyList(Node *n){
  if (n == NULL)
    return NULL;
  Node *sub_copy = copyList(n -> next);
  Node *newNode = (Node *)malloc(sizeof(Node));
  if (newNode != NULL){
    newNode -> data = n -> data;
    newNode -> next = sub_copy;
    return newNode;
  }
}

//copy a linkedlist with the random pointer
//O(n) way
Node *altMergeList(Node *n1, Node *n2){
  if (n1 == NULL)
    return n2;
  if (n2 == NULL)
    return n1;
  Node *sub = altMergeList(n1 -> next, n2 -> next);
  n2 -> next = sub;
  n1 -> next = n2;
  return n1;
}

Node *addRandomLink(Node *n){
  if (n == NULL)
    return NULL;
  int count = 0;
  Node *prev = NULL;
  Node *cur = n;
  while (cur != NULL){
    if (count % 2 == 1){
      cur -> random = prev -> random -> next;  //add the link
    }
    prev = cur;
    cur = cur -> next;
    count += 1;
  }
  return n; //
}

Node *getTheCopy(Node *n){
  if (n == NULL)
    return NULL;
 
  vector<Node *> v;
  //get original list back
  Node *or_head = n;
  Node *or_cur = n;
  while(or_cur != NULL){
    v.push_back(or_cur -> next);
    Node *tt = or_cur -> next -> next;
    or_cur -> next = tt;
    or_cur = tt;
  }
  //get our copied list
  if(v.empty()){
    return NULL;
  }
  Node *head = v[0];
  int index;
  for(index = 0; index < v.size() - 1; index++){
    v[index] -> next = v[index+1];
  }
  v[index] -> next = NULL;

  return head;
}

Node *copyListWithRandom(Node *n){
  //to get a copy of n
  Node *n_cp = copyList(n);
  Node *n_alt = altMergeList(n,n_cp);
  Node *n_r = addRandomLink(n_alt);
  Node *n_result = getTheCopy(n_r);
  return n_result;
}




2012年3月4日星期日

纪念下第一次Delaware Poker Tournament

这周周5跑到Delaware Poker Park去玩了一次tex holden的tournament. 之前完全不知道有这种tournament, 只知道有cash game. 看到沈祖良的校内日志, 询问一番后, 由于自己有浓厚兴趣, 而且玩一次也没那么贵, 便驱车前往.

这种tournament一般是65-150刀不等买进, 也就是花65刀到150刀的价钱进入比赛. 当然, 大一点的比赛, 比如WSOP这种估计是要贵得飞起的, 我也不可能玩得起, 也没那个实力. 我看准了周5晚上7点的一场比赛, 有7500 guarantee, 需要100的入场费. 这个7500 guarantee的意思就是不管比赛有多少人参加, 至少会有7500刀的奖励给前10-13名, 比起没有guarantee的tournament, 这个更有吸引力.  花100刀, 去体验一下, 还是可以的. 于是, 我和白杨在赌场转了转后, 我欣然前往, 花了100刀, 买进了一开始的10k.


这个是票据和player card, 纪念一下. 我被分到了第9桌, 第8个座位. 

先说说自己玩poker经验: 新手, 有两次cash game经验, 平时和朋友就玩玩20买进500或者赢了的请输了的吃饭这种; 网上只玩过虚拟货币的poker游戏. 但自我感觉还比较良好, 能果断出手以及bluff, all-in.

拿着10k到了第9桌, 观望一下, 玩的人中年人还是偏多, 也有20多岁的, 也不少, 总共有13,4桌的人在玩, 也就是总共可能有140个人. 要进到前10才能到final table. 刚上场, 由于完全没经验阿, 我扔了两个黄色的chip, 牌面是草花6和草花7. 当big blind是200, 轮到我, 我想玩这盘, 但扔错了, 扔了2000, 恶心的dealer说扔了就不能收回, 2000...玩6,7草花...我当时觉得疯了...有一个人看我叹气,来了个all-in, 3.2K, 看样子此人已经玩了会,输到3200了, 反正只要加1.2k, 我果断call了, 那人A, K, 一个方片,一个红桃, flop 草花Q,5,10, 有三张草花, 我直接flush了...真是真心运气好, 第一盘歪打正着, 赢3.2k. 看样子确实有个好的开头. 现在想想还蛮有趣.

tournament耗时很久, 每过20-30分钟就会上升一个level, 表示blind更高, ante(每个人每盘都要出的)也更高. 说说几盘我自己觉得有意思的吧, 可能有点忘记具体的牌面或者顺序了.

1. 我一方片3, 一红桃10, 我是big blind, 当时是1600的blind, 一人raise到3.2K, 我call了. flop: 方片2, 5, 6. 我bet 3k, 他想了很久, 拿chip手都在抖, 他call, 第4张是草花K还是10, 我先bet, 我说all-in, 他想了一会然后fold了. 此牌我觉得他明显没东西, 小bluff一下成功.

2. big blind, 8K, 我big blind, 一个人raise到16k, 我手牌一对3, 最后到我只有我俩, 我call, 我觉得对方可能有A, 从玩的经验看出来. flop: K K J, 两草花, 一黑桃. 我check, 他bet12K, 看着很虚, 当时我手上有个22K的样子, 他比我多个10K, 我all-in, 只是希望他能fold, 但我感觉他一直看我不爽, call了. 果然, 一张红桃A, 一张方片Q, 我一对3, 后面出来的两张是8,9, 我运气比较好, double了我的chips, 维持到了45K的样子. 

3. 说一把有牌的. 手牌一对J, blind是400-800, 我raise到1.6K, 然后两外两个人all in. 当时我有个20多K, 他们all-in是7,8K的样子, 我对J, 不差, call一把. 他们一个是A K, 一个是10 K, 当时flop出来是J A K, 确实很紧张, 最后两张是小牌. 这把真是纯运气,但我觉得我不会give up pocket of Jacks. 其实也是感觉他们all-in得比较虚.

玩了有快6个小时, 终于熬到了进final table, 进去的时候我的chip在中间的样子, 大概有60,70K, 但玩完第一个4K 8K, ante 2k 的session, 我成了chip leader. 有一盘很好玩: 我是对3, 很小, 当时是big blind, 已经bet了10K, 8K blind + 2K ante, 有个中年人raise到20K, 他后面那个人call了, 我毫不犹豫阿, call了下. 想看看flop. flop出来是10 7 9, 都是草花.我有张3是草花,lol, 我想了想, check了. 那个中年人raise了5K, 另外那个想了很久也call了, 我一开始就觉得那中年人没牌, 于是我raise到15K, 中年人想了想, fold了. 但另外那个call了. turn出来是红桃8, 好牌, 正好可以bluff一下, 当时也没多想, 很快就all in, 另外那个人有点虚, 想了很久, 还是fold了,还说i hate this card. lol.

赌场不让拍照, 但还是拍了几张final table我的chips的照片:

5000的chip



当时有个120多K, 可能不止, 不记得了, 在4号座位. 


最后赢的钱的一部分, 拍照的时候final table的有个人还说: I have done that before, 看来他不是第一次进final table了.哈哈. 拿着赢的钱, 挺开心的, 虽然耗时了快7个小时, 但至少体验了下这个过程. 很感谢白杨阿,哈哈, 一个人坐着等了我6,7个小时, 把我手机都玩没电了, 还端茶送水,哈哈. 我真没想到能玩这么久,以为一会就会出来. 

写个博客纪念一下. 以后偶尔去玩一玩, 过程还是很不错的. 值得去尝试一下, 只要不addicted就行了. 

Good night
Life is good!











2012年3月1日星期四

一些散想

想想以前没有互联网的日子,大多时候写东西都习惯用日记本. 现在有了互联网,苹果本子,连拿起笔的勇气都淡然全无. 今天读到一篇文章, 是说互联网时代让我们这一代丧失了对想做事情的专注,形成拖沓的习性. 的确, 很多人现在都在说, 必须关了电脑才能专注于自己的事情.

开个博客, 聊以记录下自己每天流逝的青春. 发现校内不是个太好的地方,有点儿浮,微薄如过眼云烟, 每个消息的信息量太少, 博客这个东西, 关注的人没那么多,反而是个好地方.

时间过得快得飞起,以前在学校看到的大1的新生,现在都已经大3大4忙碌着在找工作. 我曾经也加入过找工作的队伍, 天时地利人和让我找到了以前自己想都没想过的实习机会. 本应该兴高采烈一把, 但却没有那么的兴高采烈. 可能觉得这工作就应该给自己,毕竟我努力得不留遗憾过, 而不是不劳而获, 不是只靠运气. 拿到工作机会后, 想法变轻松了, 活得照理也应该轻松多了. 也的确如此. 学校没什么课, 压力也不大, 每天校内微博facebook, 沉浸在互联网, 研究研究poker, 独处的时间变少了, 读的书也少了, 也很少写点东西. 偶尔坚持去学校游游泳, 偶尔学学iOS开发. 这就是每天的生活. 

人都是"贪婪"的, 尤其是在没有一个明确想要的东西的时候, 但这种贪婪不一定就不好. 因为你会想尝试各种东西. 举个简单的例子, 学计算机出生的, 应该有过想把所有程序语言都弄个明白的时候, 因为不知道自己今后工作会之用到哪门语言, java还是C.  对于找工作也是, 在找到工作前, 发现这个公司不错,是个大公司,拿到offer后, 自己就会想我到底喜不喜欢这个公司的这个部门, 我更喜欢做哪一块, 哪一个方向. 拿我自己做个例子, 找工作前我想去微软的Bing, 原因比较简单, 有发展前景, 和我学的东西也能match上. 拿到后, 在这段沉浸在互联网的日子里, 我发现自己很喜欢做苹果开发, 而且对poker也有浓厚兴趣. 于是乎我又开始找找和苹果有关的机会, 投了个zynga poker, 投了个apple.com. 本以为拿到一个理想的工作就很开心了, 但正因为有了这段放松的时期, 才使得自己有更多的时间去发掘兴趣到底在哪里, 然后去贪婪的尝试. 但这种贪婪的状态不要太久, 因为当真正找到了自己想要的东西, settle down专心去做还是更为重要.

兴趣这东西真是很重要. 大学苦逼了4年, 研究生再苦逼两年, 为的就是去找一份工作. 如果能找到自己有浓厚兴趣的工作, 公司也不错, 那苦逼也没白苦逼. 写这些东西的时候, 今天我身边有三个人都在面试, 希望他们能有好运.

天气不错, 蓝天白云. 明天准备去delaware搞一个poker tournament, 也让自己多一份经历.

Life is good.