代码的艺术 - 章淼讲座笔记

栏目: 编程工具 · 发布时间: 7年前

内容简介:清华大学计算机博士;百度云前端技术负责人;百度对比 Google 的工程师,国内的工程师写代码的占用时间显然过多了,而不太注重提前尽可能地

清华大学计算机博士;百度云前端技术负责人;百度 Golang & Python 技术委员会成员;

笔记

对比 Google 的工程师,国内的工程师写代码的占用时间显然过多了,而不太注重提前 设计 ;Google 工程师们在开始实现某一模块或功能时,会事先在代码库中搜索是否已经有可重用的代码,并且代码库中的代码具有完整的注释和文档。

提前设计的重要性

尽可能地 提前 完成两个 文档

  • 需求分析文档
  • 系统设计文档

原因:在未启动实现细节代码之前构思设计时发现问题的修改,对比后期真正已经开始 Coding 的时候,对比发现问题进行修改,成本要低很多。文档一般只写主要逻辑,而代码涉及更多细节。

笔者备注:但这不是绝对的,修改是正常的,不要惧怕修改,反复尝试积累经验。

  • 需求分析文档:主要是在定义黑盒状态,描述外在,描述 WHAT 要做什么?
  • 系统设计文档:主要实在定义白盒状态,描述内在,描述 HOW 怎么做?

两者要有区分,不要 混淆 ,也不要混在一起写!

  • 需求分析文档的误区
    不要过早提前构想实现细节,我们的大脑会下意识地在我们构想如何实现时遇到的各种难题,而将原本的需求分析的思考挂起;举例:导弹 vs 炸弹,两者都有摧毁目标的能力,但是很明显导弹的价值更高,重要的是制导的功能,而不是爆炸本身。
  • 系统设计文档的误区
    主要要写定义系统的架构、模块、接口、数据、关键算法、设计思路等等得过程记录。

系统架构要写什么以及方法

概念、模型、视图等等。

  • 静:系统静态的样子,功能模块如何划分等
  • 动:系统运转起来,各模块联动起来的样子
  • 细:不同角度,不同层次去描述

  • 每一个组件(模块、函数)保证单一性, Single purpose. 只做一件事!

  • 轻耦合,低内聚(避免全局变量(多处操作难以控制))
  • 当前系统设计所受到的约束(当前设计的瓶颈在哪?比如网络、吞吐量、占用 CPU 或文件位置资源等)
  • 需求分析是系统设计的来源
  • 模型和抽象的思维能力很重要(涉及概念:模型、数据结构、算法等等)

设计接口(Interface)要注意什么?

  • 接口定义系统外在的功能
  • 接口定义当前系统与外部系统之间的关系

接口 Interface 定义了系统对外的接口,往往比系统实现内部细节代码更重要,不要过于草率,因为一旦定义了接口,提供出去给调用方使用,想修改就太难了。所以设计接口有重要原则,站在使用者的角度考虑问题!

两点细节:

  • 向前兼容(尽量不要接口已升级,老接口全不能用,那就不是好的接口设计)
  • 使用方便(让调用者可以一目了然知道接口的作用,简化传参,说明返回值等等)

如何写代码?

代码是一种表达的方式。是写给人看的,要有 编程规范

拥有编程规范的理想状态:1. 看别人代码就像看自己代码一样易懂;2. 看代码主要看逻辑,不要过多注重细节;3. 代码尽可能地不要让人去多想。

Don’t make me think!

Moudle 模块

紧内聚,低耦合。单一功能。反例,定义一个 utils.py 内部包含诸多方法,不易懂。

模块一般可以分为两类:

  • 数据类的模块(1. 主要完成对数据的封装; 2. 对外提供的数据接口)
  • 过程类的模块(1. 不要包含数据,可以是调用数据类的模块或者调用其他过程类模块; 2. 具备操作性质的模块)

模块的重要性: 1. 降低维护成本; 2. 更好地复用

Class 类 和 Function 函数

两者是不同的模型,各自有各自适用的范围。

推荐方法: 和类的成员无关的函数,尽量独立出去单独一个函数,不建议作为类的成员函数。

面向对象思想的讨论:多态和继承,需要谨慎适用,作为 Python 的工程师,不太推崇 Java 中继承和多态,因为系统是逐渐长起来的,并不是从一开始就是一个成熟的样子,所以很难凭空去设计一个继承的关系。

模块的构成

文件头(注释)

  • 模块的说明,简要功能
  • 修改历史(时间、修改人,修改的内容)
  • 其他特殊细节的说明

函数(重要性仅次于模块)

  • 描述功能
  • 传入参数的描述(含义、类型、限制条件等等)
  • 返回值得描述(有足够明确的语义说明)
    • 逻辑判断型 check isXXX
    • 操作型(成功 or 失败)
    • 数据获取型(状态 + 数据)
  • 异常如何处理(是抛出?还是内部catch?要明确)
  • 明确单入口和单出口(多线程开发时尤为重要)

函数要尽可能的规模小,足够短(BUG 往往出现在非常长的一个函数里)

代码块的 分段 也很重要,分段背后是划分和逻辑表达。

代码是一种表达能力的体现,也算是文科的范畴! 注释不是补出来的!

命名的重要性:要准确、易懂、可读性强,尽量做到 望名生义

互联网时代的系统是 运营 出来的。

可检测性也是尤其重要的。(埋点、监控等等)

没有数据的收集,等于系统没有上线。

监控不单单只有传统意义上的内存、CPU、网络、崩溃率的监控,还应有线上真实数据监控,需要有足够多的状态记录。

日志是很有限的一种监控手段,并且采集日志也是一种资源耗费。推荐的手段:可以使用埋点,对外提供接口,有单独的系统调用接口进行有针对性的采集。

修身

好的程序员,与 工作年限 无关,与 学历 无关

学习-思考-实践

学习:主观意愿地学习,途径也有很多,例如书籍、开源代码、社区。忌讳夜郎自大、井底之蛙。注重培养自己学习吸收的能力,多读多看但是数量不是最终目的。

Stay Hungry, Stay Foolish. – Steve Jobs

思考:学习需要经过思考,形成自己的思维。

实践:《卓有成效的时间管理者 - 德鲁克》推荐阅读

知识-方法-精神

知识过时会非常快!

方法:分析问题、解决问题的能力尤其重要(定义问题、识别问题、定义关键问题)

精神:决定型,要做就要坚持做

前进的道路上不能永远都是鲜花和掌声。

基础乃治学之根本。

数据结构、软件工程、逻辑思维能力、研究能力,需要5-8年时间磨炼。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Building Social Web Applications

Building Social Web Applications

Gavin Bell / O'Reilly Media / 2009-10-1 / USD 34.99

Building a social web application that attracts and retains regular visitors, and gets them to interact, isn't easy to do. This book walks you through the tough questions you'll face if you're to crea......一起来看看 《Building Social Web Applications》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具