成为一名专业程序员

Learn to be a professional programmer

RED PRECIOUS STONE Series

Han Yi

2017.4

RED PRECIOUS STONE Series

Sully, 2016

"Professionalism"

RED PRECIOUS STONE Series

What is software professional?

"Software engineers shall commit themselves to making the analysis, specification, design, development, testing and maintenance of software a beneficial and respected profession. In accordance with their commitment to the health, safety and welfare of the public."

RED PRECIOUS STONE Series

What is software professional in your mind?

RED PRECIOUS STONE Series

Agenda

  • Defining Software Professional by Examples
  • Team work
  • Coding
  • Testing
  • Personal professional beyond software

RED PRECIOUS STONE Series

Don't do harm

  • 程序员应对自己造成的BUG感到愧疚,并且应当努力尽量避免BUG的产生。

  • 代码结构意味着可伸缩性,如果对结构妥协,那就是对未来妥协:

"软件工业的重要基础之一,即软件是变更的。如果这一假设被不可伸缩的代码结构打破,那么整个软件工业所赖以生存的经济模型也将被打破。"

RED PRECIOUS STONE Series

Work ethic

  • 程序员应把40小时/周用于解决雇主的问题,而不是解决自己的问题。

  • 程序员每周应至少工作60小时,其中20小时用于有助于自身职业发展的活动上。

"任何寄希望于把公司作为跳板以促进自身事业发展的程序员都是可悲的。"

RED PRECIOUS STONE Series

Pursue excellence

  • 程序员的领域,在最近几十年发生了巨变,产生了大量知识。尽管如此,大量知识仍然没发生太大变化。

  • 如果架构师停止写代码,会被边缘化。

  • 如果程序员停止学习,会被行业淘汰。

"无法记住过去的人将遭到令历史重演的责难。"

"无法紧追未来的人将面临被未来抛弃的窘迫。"

RED PRECIOUS STONE Series

Constant practice

  • 练习是指超过工作之外的以个人持续发展为目的的活动。

  • 持续练习的目的不是写出漂亮的代码,而是训练手指和大脑的协调性。

  • 持续练习的方法之一是Code kata:

"欲速则不达"

RED PRECIOUS STONE Series

Be good at mentoring

  • 令知识在大脑中更加稳固的一个重要方式就是持续交流,指导他人的意义在于让自己的知识体系更加稳固。

  • 专业程序员会以身作则指导新手,绝不会让新人在无监督条件下胡乱撞。

"学习的最佳方式是教会别人。"

RED PRECIOUS STONE Series

Know business

  • 每个程序员都应该了解自己所编写程序的领域知识。

  • 通过阅读、访问客户和用户以了解业务知识。尝试从领域专家出发理解业务原理和价值。

  • 尽量避免拿到AC直接开始写代码。相反,你应当非常熟悉其背后的业务含义,并且能经常挑战AC中的错误。

"程序员不用成为领域专家,但也至少应了解与所负责模块相关部分的领域知识。"

RED PRECIOUS STONE Series

Identify with employer & customer

"程序员们很容易在内部保持一致,但也很容易与雇主/客户保持一定的隔离。专业程序员应时刻避免这种情况。"

  • 雇主的问题就是程序员自己的问题,程序员有义务坦诚存在的问题。

  • 专业程序员有责任提出完备的解决方案。

  • 应当时刻与客户站在一起,保证所有开发的功能都可以解决客户的需求问题。

RED PRECIOUS STONE Series

Humility

  • 编程本质上是一项自负的行为。

  • 专业程序员承认自己的自负倾向,但也不会刻意谦虚。

  • 专业程序员明确知道自己不可能永远正确,因此时刻保证理性和倾听,从不强加于人。

"专业程序员对自己的能力有足够信心,且勇于承担经过计算的风险。"

RED PRECIOUS STONE Series

Agenda

  • Defining Software Professional by Examples
  • Team work (Part I)
  • Coding
  • Testing
  • Personal professional beyond software

RED PRECIOUS STONE Series

It happens everyday...

某日站会......

 

领导A:小P,这张story卡今天能完成吗?

小P:啊?这么急......不过我想应该可以?

领导A:太好了!感谢!

RED PRECIOUS STONE Series

Perhaps you want to say...

某日站会......

 

领导A:小P,这张story卡今天能完成吗?

小P:啊?这么急......我觉得今天不可能。

领导A:那么你预计什么时候能完成?

小P:最快也要下周吧?

领导A:好吧。

RED PRECIOUS STONE Series

May be more reality if you say...

领导A:小P,这张story卡今天能完成吗?

小P:啊?这么急......我觉得今天不可能。

领导A:啥?这张卡不是才一个点吗,都已经做了3天?

小P:估点时没考虑到某些边界条件,也没有讨论过细节样式,而且现有代码坏味道需要重构......

领导A:你说的这些任务可以新建story卡做吗?客户明确说了明天showcase需要看到这个功能。

小P:当然,基本功能已经完成了,我可以直接push。

领导A:好的,十分感谢!

RED PRECIOUS STONE Series

Say 'No'

  • 团队中的某些角色之间具有天然的敌对关系,例如程序员和管理者。

  • 正常的团队软件开发活动,各个角色应明确自己的工作职责,并且力争实现本职责目标

  • 当不同角色的职责目标间出现冲突时,各个角色应该从自身职责出发进行“谈判”,目的是实现快速“妥协”,且能满足各方的基本诉求

RED PRECIOUS STONE Series

How about this conversation?

领导A:小P,这张story卡今天能完成吗?

小P:啊?这么急......我觉得今天不可能。

领导A:啥?这张卡不是才一个点吗,都已经做了3天?

小P:估点时没考虑到的某些边界条件,也没有讨论过细节样式,而且现有代码坏味道需要重构......

领导A:什么样的边界条件?具体样式能不能找UX简化一下?给我看看现在代码长什么样?

小P:好吧。

RED PRECIOUS STONE Series

How about this conversation?

数小时后......

 

领导A:你看,这么写就没问题了。

小P:好吧,那样式咋办?

领导A:我刚问UX了,他觉得现在的实现可以接受。你把代码重构一下就可以直接push了。

小P:好的,感谢!

RED PRECIOUS STONE Series

We won't discuss about micro-management or even the art of management today

RED PRECIOUS STONE Series

Encourage saying 'No'

  • 团队精神表现为成员间沟通频繁、互相关注、相互承担职责等行为。

  • 尽量不要使用“尝试”一词,因为“尝试”意味着可能存在的意外付出,导致不确定性风险,“尝试者”也会面临很大压力。

  • 运行良好的团队拥有一致的目标,但总是通过角色间的不断谈判保持一致,软件开发团队应鼓励成员说“不”。

RED PRECIOUS STONE Series

Agenda

  • Defining Software Professional by Examples
  • Team work (Part II)
  • Coding
  • Testing
  • Personal professional beyond software

RED PRECIOUS STONE Series

It happens everyday...

某日站会......

 

领导A:小P,这张story卡今天能完成吗?

小P:啊?这么急......不过我想应该可以?

领导A:太好了!感谢!

RED PRECIOUS STONE Series

It will be better if you say...

某日站会......

 

领导A:小P,这张story卡今天能完成吗?

小P:啊?这么急......这张卡在估点时没考虑到某些边界条件,也没有讨论过细节样式,而且需要重构现有代码......如果今天是deadline我们只能提交基本功能和对应的单元测试。

RED PRECIOUS STONE Series

领导A:好吧,那其余的部分预计什么时候能完成呢?

小P:修改代码部分需要今天一天;最后的样式部分,如果明天之前UX能和客户最终确认的话,明天下午之前就能完成,否则肯定会延迟。

领导A:好的,感谢!

It will be better if you say...

RED PRECIOUS STONE Series

How to make commitment

  • 承诺的“三要素”

    • “说”,只是口头上

    • “想”,自己的意图是愿意做

    • “做”,自己意图做,且该承诺一定会发生

RED PRECIOUS STONE Series

How to make commitment

  • 不包含任何承诺的无谓表达

    • 我需要做XXX

    • 我应该做XXX

    • 应该有人做XXX

    • 我希望做XXX

    • 让我们做XXX

RED PRECIOUS STONE Series

How to make commitment

  • 正确承诺的表达方式

    • 我会在XXX前做完XXX

    • 需要说明:

      • 你会在确定时间内完成

      • 你亲自会做而不是别人

      • 你一定会做而不是可能会做

RED PRECIOUS STONE Series

Don't be forced to make commitment

  • 承诺之重,一诺千金

  • 做出承诺前需要全面考虑阻碍因素

    • 某项工作对他人的工作有依赖,可能导致无法按时完成。(进行任务分解,并就其中部分内容做出承诺)

    • 实在不清楚是否能完成某项工作。(至少应该承诺下一步是确定该工作是否能够完成,或者对分解任务做出承诺。)

    • 其它事项。(意外事由无法避免,当承诺无法履行时,应尽早向团队亮红灯,或者换人实现该承诺,或者调整目标和承诺内容)

RED PRECIOUS STONE Series

Say 'Yes'

  • 使用承诺的语言说“是”,能够帮助解决程序员日常存在的许多沟通问题,包括估算、截止期限、面对面交流等。
  • 专业程序员并非在任何场景下都说“是”(做出承诺),应尽可能指出目标存在的风险,并给出后续解决方案。当真正需要说“是”时,应使用明确的承诺语言,并努力使“是”变成可能。

RED PRECIOUS STONE Series

Agenda

  • Defining Software Professional by Examples
  • Team work
  • Coding
  • Testing
  • Personal professional beyond software

RED PRECIOUS STONE Series

Well Prepared

  • 集中精力保持专注因为你需要立即在不同的因素中做出反应

  • 不要尝试在分心的情况下编程,如果确实有其它事务需要处理,可以尝试把时间分片,部分片用于处理其它事务,部分片用于编码,并且保证这部分时间能够专注在代码上

RED PRECIOUS STONE Series

Before start

  • 专业程序员需要考虑以下问题

    • 代码必须可工作

    • 代码必须解决客户的问题

    • 代码必须适应现有系统

    • 代码必须是可读

  • 需要在上述要素中随时权衡利弊

  • 专业性体现在规范化上,而非花费的时间。花费更多的时间并不能体现更好的专业性

RED PRECIOUS STONE Series

During coding

  • 工作时应避免心流区(Flow Zone)

    • 心流导致程序员感到生产力极高

    • 心流导致程序员失去应有的判断力

    • 心流对日常练习非常有益

  • 为什么不同水平的程序员都要结对编程?

RED PRECIOUS STONE Series

Debugging

  • 调试本质上降低生产效率

  • 专业程序员理应避免调试,也就是说在写代码的阶段尽早发现问题

  • TDD是一个有效减少调试频次的方式

RED PRECIOUS STONE Series

Pacing yourself

  • 写代码不是冲刺跑,而是马拉松

  • 马拉松运动员更加懂得在赛前赛中照顾自己

  • 欲速则不达

RED PRECIOUS STONE Series

Delaying

  • 延迟的可能总会发生

  • 最坏的情况是直到延迟发生前所有人还都以为能按时完成

  • 确认进度的有效方法

    • 周期性基于事实分别给出最好正常最坏的情况报告

  • 当团队利用各种捷径、加班来满足估算,也就使整个团队丧失了直面问题、艰难争论的机会,也就使得团队无法有效成长

RED PRECIOUS STONE Series

Definition of Done

  • “完成”的定义不仅仅是提交代码

  • 程序员的“完成”应该是当BA、QA和客户的验收测试都得到通过

  • 程序员有义务及时跟踪所有“未完成”的任务

RED PRECIOUS STONE Series

Helping and being helped

  • 在团队中,是否乐于助人有关一个程序员的职业道德素质

  • 学习如何寻求别人的帮助,并且利用一切可以利用的资源

  • 大多数程序员都有自负倾向,其中很多程序员拒绝协作

  • 由于协作对编程活动至关重要,因此专业程序员通常采用规范化要求催促自己坚持协作

  • 专业程序员成长的两大因素:自驱力资深同业指导

RED PRECIOUS STONE Series

Agenda

  • Defining Software Professional by Examples
  • Team work
  • Coding
  • Testing
  • Personal professional beyond software

RED PRECIOUS STONE Series

TDD does work

  • 如果不能确认代码正确工作,程序员如何保证自身专业性
  • 如果修改代码时不进行测试,程序员如何确认代码正确工作?
  • 如果不能保证高覆盖率的自动化测试,程序员如何保证修改代码时一定进行测试?
  • 如果不TDD,程序员如何保证高覆盖率的自动化测试?

RED PRECIOUS STONE Series

Three laws of TDD

  • 在写出一条失败的测试前,不应该写一行生产代码
  • 在写一条恰好失败的测试前,不应该写更多测试代码(编译失败也算)
  • 在恰好通过当前失败的测试前,不应该写更多生产代码
  • 注:Kent Beck的test-code-test-code单次循环在30秒左右,依对问题的熟悉程度而定

RED PRECIOUS STONE Series

Benefits of TDD

  • 确定保证代码质量
  • 减少缺陷发生
  • 提供重构信心
  • 代替文档,提供代码示例
  • 帮助设计具有良好测试性的代码

RED PRECIOUS STONE Series

What TDD is not

  • TDD不是宗教或秘方
  • 实行TDD不保证前述的所有好处都能得到
    • 测试代码质量不足
    • 某些场景下TDD的“三法则”可能并不合适
  • 专业程序员应为自己制定更加合适的规范

RED PRECIOUS STONE Series

QA should find nothing

  • 敏捷团队中的QA角色:Specifier/Characterizer
  • Specifier
    • 制定需求规约(功能/非功能需求规约)
    • 完成AC的自动化验收测试(包括边界测试、失败测试),并且在kick off前和Dev沟通
  • Characterizer
    • 描述现有系统的功能​特性
    • 通过探索性测试,记录、描述和报告现有系统的功能特性

RED PRECIOUS STONE Series

Why acceptance test is so important

  • 验收标准:最强大的客户沟通工具
  • 验收测试:最完备的需求测试说明
  • 自动化验收测试:最高效的持续性验收测试
  • 以上工作均应在kick off前完成,如果可能因此影响迭代计划,须考虑由程序员协助BA、QA工作,同时考虑给团队配备更多BA、QA

RED PRECIOUS STONE Series

Automated acceptance test

  • 由BA、QA共同维护
  • 在kick off前完成
  • GUI验收测试的困境
    • 聚焦业务,而非控件(使用测试专用的业务名称指向控件)
    • 大部分业务验收测试可以通过API验收测试完成
    • 良好隔离GUI和业务逻辑是进行GUI验收测试的重要前提
    • GUI验收测试只测GUI,即业务相关的部分应当被stub

RED PRECIOUS STONE Series

Agenda

  • Defining Software Professional by Examples
  • Team work
  • Coding
  • Testing
  • Personal professional beyond software

RED PRECIOUS STONE Series

Continuous Practicing 

  • 效率体现专业
  • 熟能生巧
  • 工作不是练习
  • 解决问题的能力能否通过练习获得?
  • DOJO/道场
    • KATA/
    • WASA/WAZA/技
    • RANDORI/乱取り

RED PRECIOUS STONE Series

Time Management

  • 学会说“不”
  • 保存精力
  • 时间盒的缺点
  • 备选方案
  • 远离混沌

RED PRECIOUS STONE Series

Estimation

  • 估算的价值:承诺?猜测?
  • 数字?
  • ONP概率估算法
  • 伯努利大数定律

RED PRECIOUS STONE Series

Craftsmanship

  • 工匠和工匠精神
  • 软件匠艺的过去、现在、未来
Made with Slides.com