38 Matching Annotations
  1. Jun 2017
    1. 他的数据分析的思路是将一段时间内所有完成了三个引导页的用户都筛选出来,然后再计算他们在这之后持续回访产品的比例,同时也将这段时间里未完成三个引导页的用户筛选出来,将这些用户的留存率与完成的引导页的用户留存率做对比。

      首先用时间作为一个分类,然后将是否完成引导页作为一个用户行为的抽象,最后使用这个抽象在时间分类上做对比,以确定该行为对用户留存率是否有意义

    2. 用户留存分析的第一步是按照不同的(时间/渠道/行为等)维度进行用户分组。

      建立一个基础的对比模型,为后面的对比做好准备

  2. May 2017
    1. 也就是说,我的每一次重构,每一次拆分,目的都是为提高“可测试性”(我把它们都标红了)

      同时也将代码划分为了原子单元

    2. 我为每个字段定义了一种转化器(而在实际开发过程中,我们可能也会为“每种类型”定义一个)。

      再次重构,将功能独立成原子模块

    3. 拆分字符串的逻辑比较复杂,因此我将其提取到一个独立的Tokenize方法中去。

      这里就应该拆分为一个单独的模块并使用 Developer TDD 了

    1. 与传统TDD的开发方式不同,我的TTD方式还是先写代码,后写测试。只不过,我会时刻关注自己的代码是否容易测试,并不断重构产品代码和测试代码。基本上它的步骤是: 写产品代码 为产品代码写测试 发现测试不容易写,于是重构产品代码 重构测试 ……

      其实就是缺少一个最开始的 Acceptance TDD

    2. 我难以接受正统TDD方式的原因,在于我总是过于习惯在拿到一个需求的时候,在脑海里率先出现设计。

      一般程序员都是这样思考问题的,或者说正常人都是这样的思路。

    1. 所以,你怎么能保证你一开始的Test Case是适合于你后面的代码的?

      The first test is the Acceptance TDD, then developer TDD in specific case.

    2. 管理和维护这些Mock和Stub也成了一种负担

      Seriously, I don't think we need to maintain Stub, unless the interface itself changed. In that case, I don't think it's a big deal to maintain Stub when maintain the interface.

    3. 另外,如果写得太Low Level,根据Agile的迭代开发来说,你的需求是易变的,很多时候,我们的需求都是开发人员自己做的Assumption。所以,你把Test Case 写得越细,将来,一旦需求或Assumption发生变化,你的维护成本也是成级数增加的。

      Developer TDD is for the basic functionalities only, if the requirement changes, most likely the functionalities need to be rewriten at all, so does the test case.

    4. 如果写的太过Low Level,那么,带来的问题是,你需要花两倍的时间来维护你的代码,一份给test case,一份给实现的功能代码。

      Developer TDD does cost more time on testing, but saves time on debugging after code.

    5. 如果写的太过High Level,那么,当你的Test Case 失败的时候,你不知道哪里出问题了,你得要花很多精力去debug代码。而我们希望的是其能够告诉我是哪个模块出的问题。只有High Level的Test Case,岂不就是Waterfall中的Test环节?

      Acceptance TDD is used to test the overall requirement

  3. Apr 2017
    1. 45岁以下的年轻观众电视消费时长逐年下降,这类观众在远离传统电视,而新媒体在这类观众群中不断扩大着自己的影响力。

      年轻人越来越不看电视了