内容简介:清华大学计算机博士;百度云前端技术负责人;百度对比 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年时间磨炼。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 金三银四讲座笔记
- Michael Feathers重构讲座的笔记
- 2018UC-ENVI讲座分享:Web遥感前端开发与项目应用
- 2018UC-ENVI讲座分享:SARscape雷达图像处理软件实践
- 2018UC-ENVI讲座分享:应用、感悟遥感图像处理软件技术
- 低代码、无代码、零代码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java从入门到精通
李钟尉、马文强、陈丹丹 / 清华大学出版社 / 2008-9 / 59.80元
《Java从入门到精通》(软件开发视频大讲堂)从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发应该掌握的各方面技术。全书共分28章,包括:初识Java,熟悉Eclipse开发工具,Java语言基础,流程控制,字符串,数组,类和对象,包装类,数字处理类,接口、继承与多态,类的高级特性,异常处理,Swing程序设计,集合类,I/O输入输出,反射,枚举类型与泛......一起来看看 《Java从入门到精通》 这本书的介绍吧!
RGB转16进制工具
RGB HEX 互转工具
HTML 编码/解码
HTML 编码/解码