码迷,mamicode.com
首页 > 其他好文 > 详细

软件开发的核心

时间:2018-03-01 00:51:17      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:语言   配置   roi   api   解决   入门   环境   ble   xcode   

讨论

什么是软件开发的核心?
小a: 数据结构 + 算法 = 程序
小b: 语言不重要, 重要的是思想
小c: 语言才重要, 思想没用

数据结构和算法, 语言/库/框架, 编译/图形/操作系统/网络, web/iOS/Android/数据挖掘;
这些是知识;
知识不是软件开发的核心, 知识看市场需要去学去实践去深入就是了;
软件开发的核心, 是通用的能力; 做任何业务都需要的能力;
软件开发的核心是分层和输入输出;

输入输出为了把不同的层连接一起;
分层是把事情合理的分开;

  • 每个层面上的人只关心自己的工作, 事情变简单;
  • 一个地方出问题, 只在自己层面出问题;
  • 反例: 如果有一个全局变量每个层都在用, 那就死了;

分层为了什么

  1. 降低复杂度
    • 能让不同水平的人都理解和加入进来
    • 自己增加对这个事情的掌控度
  2. 提高良品率

核心能力

1. 能够把工作中用到的方方面面的东西搞明白

比如, 接触一个项目
1) 搞明白 → 知道数据流, 怎么从 a 到 b
2) 深入搞明白 → 知道怎么组织数据, 可以更好管理

再比如, 公司用 react, anglar
1) 搞明白 → 先把这些东西用熟
2) 深入搞明白 → 公司用这些技术为了降低复杂度, 是否可以降低, 是否有其他方案

总之, 能降低成本, 能力就更强

2. 分层, 降低复杂度的能力

  • 一个程序 怎样构建得更合理
  • 代码应该怎样组织
  • 结构应该怎样拆分

工作流程的分层:
工作中的规范, 流程, 是如何设计的;
是否能降低复杂度, 有没有其他方式, 哪一种更好;

项目架构的分层:
见讨论

如何提高分层的能力

  1. 练习, 练得越多提升越多
    • 思考可能的解法
    • 然后每种解法都实现一遍, 实现过程中发现会有各自问题123
    • 都实现了就会知道问题出现在什么地方, 该怎样去改, 哪一种更好
  2. 提高练习效率的方法
    • DEBUG的方法

例子:
比如前端有很多框架, 为什么, 为了做网页
— 好, 我来实现个网页, 先实现个什么呢
各个框架都实现 TodoMVC
— 好, 我来实现个Todo, 思考我的和他们的有什么区别, 怎样才能把我的todo变得更好
框架: 你做得好没用, 再另一个场景下, ….
— 去想, 另一个场景该如何做, 才能实现它这个样子

重要的是: 要有自己的思考和练习

3. DEBUG能力

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 写都是一样的

软件开发的核心

标签:语言   配置   roi   api   解决   入门   环境   ble   xcode   

原文地址:https://www.cnblogs.com/zcat/p/ruan-jian-kai-fa-de-he-xin.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!