关于编程
我的职业是 Software Engineer ,日常工作是通过编程来解决问题。我不是科班出身(本科是数学系),大二下学期开始接触编程,一路走来磕磕绊绊,中间也绕了很多弯路,最终还是选择了从事计算机编程作为职业。这篇 wiki 总结一些学习编程/写代码过程中的建议。
程序员如何学习与成长
关于程序员:
- 35 岁以上写不动代码?
- 程序员的出路是转管理?
- 因人而异。找自己 核心竞争力 。
阅读 是重要的学习渠道,书籍是高质量信息的重要来源和载体。
结构化信息的阅读,更有利于思考能力的提升:
- 只接受被动的信息流,会使大脑的思考能力退化
- 阅读是一种“主动”的信息获取方式
- 要有读后感,明确阅读的目的性
要保持批判性思维:
- It is the practice and experience gained through that practice that cause us to evolve those principles
- If we were to examine the set of software engineering principles from 1964, they would look downright silly today.
- Today’s principles will look equally silly in thirty years. (《201 principles of software development》,1995)
软件工程师 != 码农
- RD:research & development,研究 & 开发,不能忽视研究。
- Coding:无序 -> 有序;实际问题 -> 数学模型
- Coding 能力:问题分析,建模,沟通,编码
区分好代码与坏代码
好的代码:
- 高效、鲁棒、简洁;
- 简短、共享(re-usable)、可测试、可移植、可监控、可扩展
坏的代码:
- 函数名、变量名意义不明;
- 无注释
- 函数目的不单一
- 排版差
- 无测试用例
写代码 -- 需求分析、系统设计
- 编码前:需求分析,系统设计
- 编码中:代码实现,单元测试
- 编码后:集成测试,上线,持续迭代
编写代码只占软件开发的 10%。
写代码前明确目的。写代码前更多投入,收益往往更大。沿着错误的思路,走到后面再想回头改就困难了
需求分析与系统设计的区别:
- 需求分析:定义系统/软件黑盒的行为(external, what)
- 系统设计:设计系统/软件白盒的机制(internal, how)
需求分析:
系统设计:
- 系统要完成哪些功能
- 系统如何组成
- 功能在这些组成之间如何划分
- 系统设计的约束:计算、存储、IO
需求是系统设计决策的来源。
系统设计的风格与哲学:
- 每个组件的功能应该足够专注与单一
- 组件之间的关系应该简单、清晰
- 好的系统是在合适假设下的精准平衡。
- 系统对外的接口,比系统实现本身还重要
- 接口定义了功能:如果功能都不正确,系统就无用
- 相对于内部,外部关系确定后非常难修改,对外接口包括:函数接口、协议、API 等
写代码 -- 表达
代码是写给人看的。
模块(Module)化,高内聚、低耦合。
切分模块的一种角度:
数据类模块:
过程类模块:
- 如果一个函数和类的成员变量无关,不要实现为类的成员函数,这样更便于未来的复用
关于 OOP
- 一种观点:面向对象的本质是数据封装,多从 Data 角度开始考虑
- 不要太纠结于编程范式
写代码 -- 编码
graph LR
id1(系统)-->id2(子系统/程序)
id2-->id3(模块)
id3-->id4(函数)
函数描述:
- 传入参数描述,含义、限制条件
- 返回值描述,各种可能性
控制函数规模。
函数返回值:
- 逻辑判断型,true/false
- 操作型, ok/error
- 获取数据型, 有数据/无数据/获取失败
划分代码块,理清逻辑。
先写注释,再写代码。
关注可监控性,互联网时代,系统是运营出来的
如何成为优秀的软件工程师
成为一个优秀的软件工程师,和写了多少年/多少行代码,曾经在哪里上学/工作是没有必然联系的
- 学习:看书、看代码
- 思考:why
- 实践:写代码、感想
知识 -> 方法 -> 精神
夯实基础:软件工程师基础,至少要 5 到 8 年的沉淀。
求木之长者,必固其根本;欲流之远者,必浚其泉源。 -- 魏征《谏太宗十思疏》
参考:
百度技术学院--代码的艺术