• #1楼 @hkliya 这是Thomas最初提出Code Kata概念时列出的一个。
    http://codekata.com/
    不得不说境界是有差距的,20个Kata有一小半都不是具体的编程练习。
    Thomas是真正软件工程师的级别,而我还在码农视角。
    列表如下
    1. 设计一个超市计费系统
    1. 用5种不同方式实现二分查找
    1. 快速估算若干个数值
    1. 写个程序从两个网站抓取数据,重构出共有部分
    1. 实现Bloom Filter
    1. 从一个字典中找出所有的构成字母相同的异位词
    1. 用三种视角读自己以前写的代码,好的,坏的,寻找bug
    1. 以三种目标写同一段程序,尽可能易读,运行的尽可能快,尽可能易于扩展
    1. 超市结帐题目
    1. 分析在处理大量业务数据时,采用Object和Hash两种方式各自的优缺点
    1. 实现一个排序算法
    1. 思考对于淘宝级别的电商网站,如何实现热卖榜
    1. 写一个统计代码行数的小工具
    1. 实现一个文本分析算法Trigram analysis
    1. 对于n位的二进制数,没有相邻两位都是1出现的数字有几个?
    1. 思考如何实现一个业务规则系统
    1. 更进一步的业务规则思考题
    1. 计算代码间的依赖
    1. 实现一个算法把单词A变为B,每次改变一个字母
    1. 实现纸牌游戏Klondike
    1. 写三种不同的list实现

  • #2楼 @1th 是啊,老板不给上班看书时间啊
    主要是上下班时间用电子书看。

  • #1楼 @hkliya 头条怎么玩,我还没玩过呢

  • 还是《从入门到放弃》系列更实用一些……

  • #3楼 @abbey 一下说到我的伤心处。我用MacType好几年了。前两天因为跟DockerToolbox 冲突,卸载了装新版本。
    结果发现公司IT policy 禁止写系统临时目录,导致装不上。
    现在逼得我都想要把工作机切换到Ubuntu了

  • 弄个中二之旅

  • Sure, it is evil. Sometime it is a necessary evil.

  • 同一个dojo session下又做了两次。
    使用fold

    factors_to_list t@(n, ps) p 
        | n `mod` p == 0 = (next_n, new_ps)
        | otherwise = t
        where (next_n, new_ps) = factors_to_list (n `div` p, ps ++ [p]) p
    
    factors :: Integer -> [Integer]
    factors n = snd (foldl factors_to_list (n, []) [2..n])

    缺点是数字较大时性能差,因为fold计算了整个小于n的数的列表。在这之前可能早已求出所有因子了。

    改为scanl 加 filter,利用Haskell惰性求值终止fold过程,性能与递归方式相当。

    no_more = ((==1) . fst)
    
    check_factor pair@(n, ps) p 
        | no_more pair = pair
        | p_is_factor = (new_n, more_ps)
        | n_is_prime = (1, ps ++ [n])
        | otherwise = pair
        where 
            (new_n, more_ps) = check_factor (n `div` p, ps ++ [p]) p
            p_is_factor = n `mod` p == 0
            n_is_prime = p * p > n 
    
    factors :: Integer -> [Integer]
    factors n = 
        let return_once_get_all_factors = snd . head . filter no_more
        in  return_once_get_all_factors (scanl check_factor (n, []) [2..])
  • 试试 quickrun

  • 我用 http://www.websequencediagrams.com/ 画时序图
    虽然不是Ascii的,手绘风格还是颇有Geek风的。
    如图:

    是用如下代码生成的:

    title Would you be my GF?
    Boy->Girl: Would U be my GF?
    note right of Girl: enigmatic and charming
    Girl->Boy: Guess
    note left of Boy: full of hope
    Boy->Girl: Yes!
    Girl->Boy: Try again
  • #3楼 @lvjian700 100%覆盖率,听起来就很可怕啊

  • #1楼 @abbey 私聊

  • Python 三脚猫的代码

    test case

    from number import numberName
    
    def test_one_word_names():
        '''less than 10 '''
        assert numberName(0) == 'zero'
        assert numberName(1) == 'one'
        assert numberName(2) == 'two'
        assert numberName(3) == 'three'
        assert numberName(4) == 'four'
        assert numberName(5) == 'five'
        assert numberName(6) == 'six'
        assert numberName(7) == 'seven'
        assert numberName(8) == 'eight'
        assert numberName(9) == 'nine'
        '''10 to 20'''
        assert numberName(10) == 'ten'
        assert numberName(11) == 'eleven'
        assert numberName(12) == 'twelve'
        assert numberName(13) == 'thirteen'
        assert numberName(14) == 'fourteen'
        assert numberName(15) == 'fifteen'
        assert numberName(16) == 'sixteen'
        assert numberName(17) == 'seventeen'
        assert numberName(18) == 'eighteen'
        assert numberName(19) == 'nineteen'
        assert numberName(20) == 'twenty'
        '''30 to 90'''
        assert numberName(30) == 'thirty'
        assert numberName(40) == 'forty'
        assert numberName(50) == 'fifty'
        assert numberName(60) == 'sixty'
        assert numberName(70) == 'seventy'
        assert numberName(80) == 'eighty'
        assert numberName(90) == 'ninety'
    
    def test_name_and_remaining_names():
        assert numberName(21) == 'twenty one'
        assert numberName(99) == 'ninety nine'
    
    def test_count_and_name_names():
        assert numberName(100) == 'one hundred'
        assert numberName(200) == 'two hundred'
    
    def test_count_and_remaining_names():
        assert numberName(570) == 'five hundred and seventy'
    
    def test_count_thousand_and_remaining_names():
        assert numberName(1000) == 'one thousand'
        assert numberName(1101) == 'one thousand, one hundred and one'
        assert numberName(51000) == 'fifty one thousand'
    
    def test_million():
        assert numberName(3000000) == 'three million'
    
    def test_raidom_big_number():
        assert numberName(512607) == 'five hundred and twelve thousand, six hundred and seven'
        assert numberName(43112603) == 'forty three million, '\
            + 'one hundred and twelve thousand, '\
            + 'six hundred and three'

    代码

    def numberName(value):
        names = {0:'zero',1:'one',2:'two',3:'three',4:'four',5:'five',6:'six',7:'seven',8:'eight',9:'nine'
            ,10:'ten',11:'eleven',12:'twelve',13:'thirteen',14:'fourteen',15:'fifteen',16:'sixteen',17:'seventeen',18:'eighteen',19:'nineteen'
            ,20:'twenty',30: 'thirty',40:'forty',50:'fifty',60:'sixty',70:'seventy',80:'eighty',90:'ninety'}
        countable_names = {100:'hundred', 1000:'thousand', 1000000:'million'}
        name = ''
        maxNameIndex = getMaxNoMoreThan(value, countable_names.keys())
        if maxNameIndex > 0:
            name = numberName(value//maxNameIndex) +' '+ countable_names.get(maxNameIndex)
            remaining = value % maxNameIndex
            separator = ' and '
            if maxNameIndex > 100:
                separator = ', '
            if remaining > 0:          
                name = name + separator + numberName(remaining)
        else:
            maxNameIndex = getMaxNoMoreThan(value, names.keys())
            name = names.get(maxNameIndex)
            remaining = value - maxNameIndex
            if remaining > 0:
                name = name +' '+ numberName(remaining)
        return name
    
    def getMaxNoMoreThan(value, list):
        indexes = filter(lambda key: key <= value, list)
        if indexes:
            return max(indexes)
        return 0
  • #3楼 @horance 如果说c++是给了程序员一把枪可以用来打自己的脚,Scala就是给了一颗导弹来射自己的脚。

  • #4楼 @lvjian700 前几天朋友圈有篇文章好像也是说这个的
    盗张图来给各位学习的码农共勉

  • private static Set<String> primitives = new HashSet<>(
      Arrays.asList(
        "boolean", "byte",  "char",
        "double",  "float", "int", 
        "long",    "short", "void"
      )
    );

    另外好奇为什么是个Set,如果是个不会变的常量的话,用list似乎就足够了

  • #3楼 @hkliya 我对团队大规模实用番茄还是有疑问的。
    有个笑话,一个当官去拜访另一个官。结果主人正在午睡,他就在客厅坐等。过了一阵主人醒来。出来看到客人已经等睡着了。不好打搅,只好坐在旁边等。然后客人醒来的时候主人又睡着了……,这样直到傍晚送客,两人一句话也没说。
    如果所有人都严格按照番茄,除非大家周期同步,不然的话交流恐怕会受影响。

  • #2楼 @dcscodelife 有帮助就好

  • #1楼 @hkliya 我喜欢不提前设计的由外而内

  • #22楼 @lvjian700
    我是只求统计,不求完成,这样心理没有焦虑。另外有时候不自觉小小打断了要是自己没意识到的话,也没放弃番茄,所以结果有点水分。