讨论
什么是软件开发的核心?
小a: 数据结构 + 算法 = 程序
小b: 语言不重要, 重要的是思想
小c: 语言才重要, 思想没用
数据结构和算法, 语言/库/框架, 编译/图形/操作系统/网络, web/iOS/Android/数据挖掘;
这些是知识;
知识不是软件开发的核心, 知识看市场需要去学去实践去深入就是了;
软件开发的核心, 是通用的能力; 做任何业务都需要的能力;
软件开发的核心是分层和输入输出;
输入输出为了把不同的层连接一起;
分层是把事情合理的分开;
- 每个层面上的人只关心自己的工作, 事情变简单;
- 一个地方出问题, 只在自己层面出问题;
- 反例: 如果有一个全局变量每个层都在用, 那就死了;
分层为了什么
- 降低复杂度
- 能让不同水平的人都理解和加入进来
- 自己增加对这个事情的掌控度
- 提高良品率
核心能力
1. 能够把工作中用到的方方面面的东西搞明白
比如, 接触一个项目
1) 搞明白 → 知道数据流, 怎么从 a 到 b
2) 深入搞明白 → 知道怎么组织数据, 可以更好管理
再比如, 公司用 react, anglar
1) 搞明白 → 先把这些东西用熟
2) 深入搞明白 → 公司用这些技术为了降低复杂度, 是否可以降低, 是否有其他方案
总之, 能降低成本, 能力就更强
2. 分层, 降低复杂度的能力
- 一个程序 怎样构建得更合理
- 代码应该怎样组织
- 结构应该怎样拆分
工作流程的分层:
工作中的规范, 流程, 是如何设计的;
是否能降低复杂度, 有没有其他方式, 哪一种更好;
项目架构的分层:
见讨论
如何提高分层的能力
- 练习, 练得越多提升越多
- 思考可能的解法
- 然后每种解法都实现一遍, 实现过程中发现会有各自问题123
- 都实现了就会知道问题出现在什么地方, 该怎样去改, 哪一种更好
- 提高练习效率的方法
- DEBUG的方法
例子:
比如前端有很多框架, 为什么, 为了做网页
— 好, 我来实现个网页, 先实现个什么呢
各个框架都实现 TodoMVC
— 好, 我来实现个Todo, 思考我的和他们的有什么区别, 怎样才能把我的todo变得更好
框架: 你做得好没用, 再另一个场景下, ….
— 去想, 另一个场景该如何做, 才能实现它这个样子
重要的是: 要有自己的思考和练习
3. DEBUG能力
4. 解决工作中问题的能力
- 怎样发现和解决问题
- 怎样思考更好解决方案
比如, 有个sb后端, 天天改接口/数据结构/字段名, 改了还不告述我;
1) 要面对这个问题, 抱怨没用的;
2) 应该想办法如何解决这个问题;
解决了, 能力就提升了;
事实上也是可以解决的;
3) 有些问题就算不能解决它, 可以把它改好;
剩下不能改的就是规律;
工作中的事情才是最重要的;
遇到的问题才是真正的问题;
去解决它, 才是实打实的提升;
工作中或下班后, 去学下面这些知识是没用的:
- 小众语言 scale, haskell, 为了编程编程范式
- 数据结构和算法
- 图形学, 编译原理, 操作系统
- C++ 这些不是工作中需要的; 工作中的需要代表市场有一定的需求; 即使是工作需要的, 这些知识招个熟手, 1W/月就可以了, 核心的是能力; 而学这些并不能提升核心能力;
知识
知识有几类
1. 原理
2. 实践经验(填坑)
3. 配置(操作指引)
这些知识分领域的: 编译原理, 操作系统, 图形学, 网络, iOS;
举例
这些是原理:
- 编译: 编译的流程 实现编程语言虚拟机的流程
- 操作系统: 操作系统实现的文件系统的流程
- 图形学: 渲染的流程
- web: http报文格式、http客户端/服务端两者的通讯过程
- 其他: 爬虫的流程、RPC两端的通讯过程
这些是实践经验(填坑):
- iOS如何高效地在长列表中渲染的图片的圆角
- 基于RN的view实现原生UITableView主要功能
- Android 2.x 前端兼容问题
操作指引: 有些东西存份标准配置表就好
这类知识的特点是: 垃圾知识,一看就会
* linux服务器环境配置 (nginx, ufw, redis, supervisor)
* docker 制作, 运行, 部署配置
* 开发机环境配置
* SDL库的安装, 编译, 导入到XCode项目的环境配置 (包括其他平台和IDE)
* jsonrpc, xmlrpc, soap, restfulAPI
都有什么用
为什么学原理
1) 工作外的原理, 可以提高自信
* 自信, 只有自己觉得能行的时候, 才能把事情做好
* 领域知识, 指不定哪天就用上了, 到时不会有陌生敬畏感
2) 工作中的原理, 有实质的帮助
* 原理可以让我明白整个流程, 是DEBUG的前提, 是分层的基础
* 有些场景需要知道内部原理, 才可以优化程序, 把它变更好
为什么要总结实践经验, 存份配置
* 为了快速掏粪
如何获取
原理 → 领域专家
实践经验 → 丰富项目经验
操作指引 → 难度不高, 但是找资料和试错需要时间, 有一个人去搞定就好; 适合团队学习, 效率大于单兵;
如何掌握知识
先解决, 如何理解原理
1. 通过 有人教或文章 知道实现流程. <1>
2. 选合适的语言. <2>
3. 实现这个东西.
再解决, 如何深入掌握知识 (针对工作中)
1. 理解原理
2. 再理解原理为什么要这样做 <3>
3. 以及是否有其他方案, 哪一种方案更好
能在这个层面去理解, 去操纵的时候, 算是熟练了;
<1>
注意抓主干去枝末.
比如爬虫: 提高爬虫效率, 提高爬虫可扩展性, 对付反爬虫策略; 这些对学习原理来说是枝末.
这些地方要有实际应用才去做 → 实践过程中, 解决一个个实际问题提炼出<知识2>
<2>
语言的选择至关重要; (抓主要矛盾)
用c++写渲染器, 一半时间都在和c++ 打架;
用js写就不会, 跑的慢些没关系, 能理解原理就行;
要抓主要矛盾, 学习图形学的时候, 最重要的是图形学的 理论/模型/流程; 而不是和内存打架, 怎么怎么高效;
自己的项目, 无论何时都要用最方便的语言来写;
<3>
注意, 有时有些原理并没有为什么, 就是规定, 谁拳头大谁定;
有些是历史原因, 路径依赖;
为什么要分开看 知识与能力
知识与能力, 都有不同层次;
混在一起, 就看不清事实了;
比如有的人,
- 了解图形学原理 → 知识, 入门
- C++只会用类语法 → 知识, 没入门
- 实战经验丰富, 软件抽象分层能力强 → 能力, 强
这样不妨碍它写出一个结构良好的渲染器;
甚至他不懂图形学原理, 顾个懂的 1W/月, 再顾个C++ 1W/月, 自己把分层做好, 这样就可以把事情做好;
再比如有的人,
- 熟悉图形学原理 → 知识, 熟悉
- 熟悉C++ → 知识, 熟悉
- 软件抽象分层能力不行 → 能力, 弱
这样写出来的程序结构还是不行;
一个程序,最重要的不是语法多复杂,而是能实现功能, 能很好的实现功能;
不用纠结语言/库/框架 这些不重要的东西, 重要的东西永远是:
- 一个程序怎么写出来
- 一个业务该以怎样的结构展现出来
- 这两个东西搞定后, 用c, java, py 写都是一样的