进化 - 从孤胆极客到高效团队

  1. 天才程序员神话
    1. 程序员行为模式
      1. 请帮我隐藏代码
        1. 缺乏安全感。人们担心别人看到并评论自己未完成的工作
      2. 天才神话
        1. 天才神话只是我们缺乏安全感的另一个表现。
    2. 隐藏是有害的
      1. 如果总是独自工作,失败的风险就会增加,你也会错失成长的机会。
      2. 尽早与他人分享想法不仅可以避免个人失误,验证想法的正确性, 而且可以增加所谓的项目的巴士因子(bus factor)。
        1. 巴士因子:项目中有多少人被巴士撞死会导致项目完全无法进行下去
      3. 还需要考虑项目的整体进度
        1. 快速反馈循环
        2. 独自工作一定比多人合作更具有风险
    3. 团队为王
      1. HRT:Heart
        1. 谦虚 Humility
        2. 尊重 Respect
        3. 信任 Trust
      2. 几乎每种社交冲突的源头最终都可归结为谦虚、尊重或信任的缺失
      3. HRT 实战
        1. 放下自我
          1. 就是告诉那些不够谦虚的人别摆架子
          2. 态度谦虚并不是说应该完全任人摆布
        2. 批评与自我批评
          1. 你的自尊不应该和你写的代码(或创建的任何创新项目)有任何联系。 也就是说,你的代码并不代表你。
        3. 快速失败和迭代
          1. 一份完备的事后分析报告应包含以下内容:
            1. 概述
            2. 从发现问题,调查问题,到解决问题的时间线,事件发生的主要原因
            3. 影响和损失估计
            4. 立即解决问题的一系列措施
            5. 预防事件再次发生的一系列措施
            6. 吸取的经验教训
        4. 留出学习的时间
        5. 学会忍耐
        6. 接受改变
  2. 打造团队文化
    1. 团队文化不仅仅是团队成员完成工作、编写代码或彼此相处的方式, 而且是成员共享的经验、价值观和目标。
    2. 元素
      1. 工作流程
      2. 人际
      3. 行为模式等
    3. 团队文化的重要性
      1. 如果不花费精力打造和维护团队文化,最终会出现具有很强个性的人, 在团队中培养他们的文化,接管你的团队。
      2. 团队成员应该重视并愿意维护团队文化,这一点也很重要。
      3. 虽然创始人和领导者通常会关注团队文化的健康, 但团队的每个成员都应参与其中,担负起定义、维护、保护团队文化的责任。
      4. “强大的文化”能够接受提升自己的改变,而抵御带来伤害的巨变。
        1. 团队契合度面试
    4. 成功团队文化的沟通模式
      1. 人少时使用同步沟通(如会议和电话会议),人多时使用异步沟通(如邮件、 问题跟踪系统、文档注释)。
      2. 确保所有的信息都存在项目文档中
    5. 高层同步
      1. 任务说明书
        1. 在一个实干、高效的团队中,编写任务说明书是为了简明地定义工作方向, 限定产品范围。
        2. 随着项目推进,任务说明书可以确保事情沿既定方向发展。但是, 项目说明书不应成为阻碍变化的不可逾越的障碍。
    6. 高效会议
      1. 主持会议的五条简单准则:
        1. 只邀请必需人员参加
        2. 草拟议程并在会议开始前尽早发出
        3. 完成会议目标即可散会
        4. 保持会议按议程进行
        5. 尽量将会议安排在中断点附近(如午餐或下班时间)
    7. 分布式团队
      1. Subversion 项目组有一句格言:如果讨论不在邮件列表中进行, 就没有真的发生过。
      2. 面对面沟通的重要性
    8. 设计文档
      1. 设计文档不仅是未来产品的概念蓝图,而且也是与大团队沟通的低成本方式, 可以传达你的设计目标及实现方法。
    9. 日常讨论
      1. 邮件列表
      2. 在线聊天
      3. 使用问题跟踪系统
      4. 工程中的沟通
        1. 代码注释
        2. 署名:不建议
        3. 每次提交必有审阅
        4. 测试与发布流程
    10. 一切为了产品
      1. 打造一种强大、有效的团队文化,花时间注意团队的沟通, 创建出的团队会将更多的时间花在编写和提交产品上, 而花费更少的时间争论提交什么样的产品。
  3. 群龙不可无首
    1. 自然界里无真空
    2. 经理是个贬义词
      1. 胡萝卜加大棒”的管理方法
    3. 新时代的“经理”是“领导者”
      1. 传统的经理关心如何做事,而领导者关心做什么事 (并相信团队知道如何将其实现)......
    4. 唯一需要担心的是,所有事
      1. 好像你多年来一直按每天摘的苹果计算工作量,工作变成摘香蕉之后, 你收工时对自己说“我今天一个苹果也没摘”,却对身边的一大堆香蕉视而不见。
        1. 对管理工作进行量化比计算组装好的工具要困难得多。
      2. “彼得原理”:“任何层级组织里,每个人都将晋升到他不能胜任的阶层。”
    5. 服务型领导
      1. “首先,不要急于管理。”
      2. 反模式
        1. 雇用软弱者
        2. 忽视表现不佳者
        3. 忽视人际问题
        4. 与所有人为友
        5. 放宽招人标准
        6. 把团队当孩子管
      3. 领导模式
        1. 放下自尊
        2. 成为禅意大师
        3. 成为催化剂
        4. 失败是一个选项
        5. 成为老师和导师
        6. 设定清晰的目标
        7. 以诚相待
        8. 关注幸福度
          1. 你有什么需要?
        9. 其他提示和技巧
          1. 放权,但也要做具体工作。
          2. 寻找接替自己的人。
          3. 知道何时出手。
          4. 给团队一方净土
          5. 保护团队
          6. 肯定团队的成就
          7. 同意尝试容易恢复的事情
      4. 人同植物
        1. 团队成员也和植物一样:有些需要更多阳光,有些更需要灌溉 (有些需要更多的牛粪,呃,肥料)。作为团队领导者, 你的责任就是发现谁需要什么,然后满足他们的需求。
      5. 内在激励和外在激励
  4. 应对有害之人
    1. 定义“有害”
      1. 某些不好的行为会使项目进度变慢,效率降低, 而且使公司工作环境变差——最终破坏团队的凝聚力
      2. 实际工作中,最好避免在日常谈话中用这个词
    2. 巩固团队
      1. 有效的最佳实践和流程
        1. 发布任务说明书,明确目标和非目标。
        2. 为邮件讨论建立适当的礼节规范。保存归档,请新成员阅读归档邮件, 防止少数人干扰讨论。
        3. 记录所有历史:不仅是代码历史,还包括设计决策、重要缺陷修复, 以及以往的错误历史。
        4. 有效合作。使用版本控制软件,保持代码少改动,可审阅, 增大“巴士因子”,防止知识集中在少数人手中。
        5. 明确缺陷修复、测试、软件发布的政策和流程。
        6. 降低新成员的磨合障碍。
        7. 依赖基于共识的决策方法,但也要制定备用流程, 以解决无法达成共识的冲突。
    3. 发现威胁
      1. 最可能受到影响的是团队的注意力和专注力
      2. 不尊重他人的时间
        1. 不肯花几分钟读一下基础的项目文档、任务说明书、FAQ, 或最新的邮件讨论内容,而是不断地提出自己本可以轻松找到答案的问题, 打扰整个团队。
      3. 自大
      4. 颐指气使
      5. 沟通幼稚或混乱
      6. 疑神疑鬼
      7. 完美主义
    4. 去除毒素
      1. 不建议仅仅因为某些人不擅社交或行为粗鲁就将其踢出社区
      2. 引导完美主义者的能量
        1. 不要让“完美成为良好的敌人”
      3. 不要喂食能量生物
      4. 不要过于情绪化
      5. 在愤怒中寻找事实
      6. 以德报怨
      7. 适时放手
      8. 放眼未来
        1. 基于 HRT 的强大团队文化是不可替代的,但技术能力绝对是可以替代的
        2. 为了短期效益而损害团队文化是不值得的
    5. 组织操控的艺术
      1. 好公司、坏公司,以及策略
        1. 理想情况
          1. 理想的工作体验
            1. 完成本职工作后寻求更多职责
            2. 承担风险而且不惧失败
              1. 通过失败发现自己的能力和不足,并逐渐拓展自己的极限
              2. 如果一年一次失败都没有发生过,就说明你没有承担足够的风险
              3. 如果在工作中不承担风险,你会少经受一些失败, 但也会少获得一些大的成功
              4. 表现得像成年人一样
              5. 对不确定的东西提出疑问
              6. 经理不是透视眼
          2. 通常情况
            1. 幸福的家庭总是相似的,不幸的家庭却各有各的不幸
            2. 不称职的经理
              1. 害怕失败是不称职的经理最常见的一个特征
              2. 缺乏安全感的经理会坚持插手你与团队以外人员的交互
              3. 藏匿信息使经理自己成为信息传达和沟通的渠道, 不称职的经理还会在你成功时夺取功劳, 在你失败时撇清干系(有时还将他们的失败归罪在你头上)
            3. 办公室政治家
              1. 整天作出有影响的样子,而不是实际产生影响
              2. 建议你避开办公室政治家:如有可能,尽量绕行, 但不要对他的上级说他的坏话
            4. 管理不当的组织
              1. 工程师是完成商业目标的手段,但这些目标通常是非技术的
                1. 意味着管理公司的人很可能不理解系统底层的技术细节, 只知道业务需求,因此会对工程师提出不切实际的要求
                2. 直接表现通常是不切实际的工期, 缺少称职的技术人员按时完成项目
              2. 在特别糟糕的公司里,指挥和控制结构僵化有如割据
              3. 很多公司充满了极力维护组织层级的人
              4. 公司是否像对待调皮孩子一样对待过你
          3. 操控组织
            1. 如果你只注意公司中应该如何做事,通常只会得到挫败和失望。 相反,你应当承认事情的现状,专注于探索公司结构, 寻找可以用来完成工作的机制, 在公司中为自己打造出一个安逸的位置。
            2. “取得原谅比获取许可更容易” - 可能消耗政治资本
              1. 首先也是最重要的是,要了解公司允许什么行为
              2. 即使你准备好事后寻求原谅,也还是要谨慎行事
              3. 如果你决定要走“请求原谅”这条路, 可以在公司里寻找一些同事和朋友, 听听他们对你的想法的意见——特别是比较冒险的那些想法。
            3. 另辟蹊径
              1. 在公司内作出改变的另一个策略是想办法使你的想法被底层接受。
              2. 停止一个坏习惯是不可能的,你需要将其替换为一个好习惯。”
            4. 学会向上管理
              1. 将推出产品放在首位
              2. 将大多数时间花在这种防御性工作上, 很难得到团队外的人(包括你的上级)的欣赏
                1. 进攻性工作通常是新用户可见的功能
                2. 防御性工作针对的是产品的长期健康
                3. 简单准则:不管欠了多少技术债, 团队花在防御性工作上的时间不应超过全部工作时间的 三分之一到二分之一。
            5. 运气和人情经济
              1. 运气好的人“善于创造和捕捉偶然机会”
            6. 政治银行账户
            7. 晋升到一个安全职位
            8. 寻找有影响力的朋友
            9. 如何写信找忙碌的高管帮忙
              1. 三条要点和一个行为召唤
              2. 最多包含三条要点说明当前的问题
              3. 以及一个——只有一个——行为召唤
              4. 如果你实在忍不住,非得加上更多的背景和信息, 那就放在邮件最后(甚至在签名之后), 并清楚标明是“更多细节”或“背景信息”。
            10. 备用计划:撤退
              1. 做正确的事,等着被炒
            11. 希望尚存
              1. 首要目标应当是作出所需的改变,使自己开心,完成工作目标
    6. 用户也是人
      1. 用户参与的三个阶段
        1. 首先需要唤起用户对产品的注意 — 他们知道这个产品的存在吗?在使用前他们对产品有何看法?
        2. 然后需要考虑用户在开始使用后的体验。产品是否达到预期? 产品可用度如何?是否帮助了用户?
        3. 最后,我们要讨论如何与忠实用户进行高效互动。 所有这些交互都是产品开发循环中的一部分。
      2. 管理公众认知
        1. 程序员看来,营销人员代表着工程文化的反面;
        2. 将市场营销视为扭曲事实的行为, 因此其与创新者对精英文化的直觉需求相悖
        3. 更严重的是,我们认为营销人员总是向客户作出过多承诺, 导致工程师交付的产品好像总是不够好
        4. 坏消息是:你不能忽视市场营销。市场营销确实很重要, 你必须做好这方面的工作。好消息是:积极与市场营销合作是可能的。
      3. 注意第一印象
        1. 不要低估精心设计的产品体验的感性影响
      4. 少许诺多提交
      5. 与工业分析师谦恭合作
      6. 你的软件可用性如何
        1. 关注用户,其他便都将水到渠成。
        2. 选择听众
          1. 好产品开发的目标是将这条竖线尽量向左侧移。
        3. 考虑进入的壁垒
        4. 衡量使用量,而非用户数
        5. 设计很重要
        6. 以用户为先
        7. 速度不容忽视
        8. 切勿求全
        9. 隐藏复杂性
          1. 人们使用你的软件是因为他们愿意这么做,而不是因为他们没法离开。 这种做法可以使用户对你产生信任,而用户的信任是你最宝贵的资源
        10. 管理与用户的关系
        11. 尊重用户的智商
        12. 耐心
        13. 创造信任和愉快
      7. 记住用户
        1. 市场营销
          1. 了解人们对软件的看法;这决定了他们会不会愿意尝试
        2. 产品设计
          1. 如果软件做不到容易尝试、速度快、友好,而且用户面广, 用户就会流失。
        3. 客户服务
          1. 主动与用户建立长期的良好关系能影响软件的演化和用户保持率。