Thursday, May 15, 2014

Coders at work 1

Fitzpatrick 提到他為LiveJournal/Google招聘程式設計師時提到

"我總是找這種型別的人,他們會做很多別人沒要求他做的事,不僅是學校的專案或者前僱主要求他做的,他們對某些事情充滿熱情,有額外的專案。”

”HR的經驗中有這麼一條--- 一些人只會做讓他們做的事,沒有那種追求極致的熱情。他們會說:做好了,接下來幹什麼? 他們甚至不告訴你,自己就上網玩去了。“

他們在面試你時問了什麼? “任意長度的十進位數字字串相乘”
many solutions!
#!/usr/bin/env python
 
def digits(x):
    return [int(c) for c in str(x)]
 
def mult_table(xs, ys):
    return [[x * y for x in xs] for y in ys]
 
def polymul(xs, ys):
    return map(lambda *vs: sum(filter(None, vs)),
               *[[0] * i + zs for i, zs in enumerate(mult_table(xs, ys))])
 
def longmult(x, y):
    result = 0
    for v in polymul(digits(x), digits(y)):
        result = result * 10 + v
    return result
 
if __name__ == "__main__":
    print longmult(2**64, 2**64)

“Callgrind"
Profile你的程式,哪些function用去了最多的instruction
670,486  src/lcthw/bstrlib.c:bstrcmp [tests/bstree_tests]
  194,377  src/lcthw/bstree.c:BSTree_get [tests/bstree_tests]
   65,580  src/lcthw/bstree.c:default_compare [tests/bstree_tests]
   16,338  src/lcthw/bstree.c:BSTree_delete [tests/bstree_tests]
   13,000  src/lcthw/bstrlib.c:bformat [tests/bstree_tests]
   11,000  src/lcthw/bstrlib.c:bfromcstralloc [tests/bstree_tests]
    7,774  src/lcthw/bstree.c:BSTree_set [tests/bstree_tests]
    5,800  src/lcthw/bstrlib.c:bdestroy [tests/bstree_tests]
    2,323  src/lcthw/bstree.c:BSTreeNode_create [tests/bstree_tests]
    1,183  /private/tmp/pkg-build/coregrind//vg_preloaded.c:vg_cleanup_env [/usr/local/lib/valgrind/vgpreload_core-amd64-darwin.so]
,甚至清楚地指出哪一行的程式碼呢!
2,453  static inline BSTreeNode *BSTree_getnode(BSTree *map, BSTreeNode *node, void *key)
     .  {
61,853      int cmp = map->compare(node->key, key);
663,908  => src/lcthw/bstree.c:default_compare (14850x)
     .
14,850      if(cmp == 0) {
     .          return node;
24,794      } else if(cmp < 0) {
30,623          if(node->left) {
     .              return BSTree_getnode(map, node->left, key);
     .          } else {
     .              return NULL;
     .          }
     .      } else {
13,146          if(node->right) {
     .              return BSTree_getnode(map, node->right, key);
     .          } else {
     .              return NULL;
     .          }
     .      }
     .  }
”我覺得有些人只是在工作,而不是享受城市設計帶來的樂趣,這沒什麼問題。但把他們和那些核心程式師做比較就不行了,當一個人花的時間多十倍,不停地考慮怎麼寫好這程式,另一個人只為了工作而工作,那兩者的生產力上的差距又豈止十倍呢?“
你是因為覺得有趣才設計程式的? “是的,我還是會繼續做些小玩意,我的手機上有個無聊的棋類遊戲,我對她有點厭煩了,所以就寫了一個求解程式,其中試用了一些動態程式設計,處理不同的棋盤大小,還有很多隨機棋盤,解決棋局所需步數的長條圖。我把它發給作者..這是剪很有意思的事情,我想我可以退休後整天做這些事。”
src: 
http://c.learncodethehardway.org/book/ex41.html
http://rosettacode.org/wiki/Long_multiplication#Python