个人软件开发知识体系梳理

分类 内容
编程语言
数据结构
算法
1. 编程语言原理,编译原理,语言范式
2. 编程规范,最佳实践
3. 程序调试工具与技巧
4. 单元测试
5. 数据结构与算法
6. 数据,数据模型,与数据建模
7. 高等数学,微积分,离散数学,概率论与数理统计,线性代数
系统与设计 1. 操作系统:Unix/Windows/Linux 高级编程,嵌入式系统,内存管理/进程调度/IO,系统配置与管理
2. 网络系统:TCP/IP 协议,HTTP 与 Web,路由器/交换机/网管,网络配置与管理,Linux 内核网络协议栈,Socket 与 网络编程;
3. 应用系统:数据库系统,电商系统,游戏…
4. 什么是系统,系统的基本特征与结构,冯诺依曼架构对软件系统的影响
5. 系统架构
6. 设计的原则,设计模式,
7. 虚拟机与 jvm 的原理与特性
软件工程 1. 软件开发过程,敏捷,
2. 项目构建与持续集成
3. 需求分析
4. 从 devops 到 aiops

1. 系统

  • 多个模块,在相互联系、相互作用之中形成的具有确定功能的整体,谓之系统

  • 系统论

  • 计算机系统:冯诺依曼结构(输入,输出,控制,计算,存储),数据与指令

  • 操作系统:进程管理,内存管理,存储管理,网络通讯,交互界面,系统安全

  • 软件系统

    1. 存储系统:文件系统,数据库系统
    2. 调度系统:异步,协程,netty,gevent,…
    3. web 服务器: apache,nginx,jetty …
    4. 开发框架
    5. IO 框架
    6. 图形显示
    7. 网络/通信系统

。。。


2. 编程语言

  • 语言就是一个人全部的宇宙观!
  • 源码,模块、库、包,依赖管理,编译/加载/链接
  • 线程,进程,协程,
  • 同步,异步,阻塞,非阻塞
  • socket与tcp/ip
  • io
  • math
  • 开发框架
  • 各种库

3. 设计

  • 设计是为了解决特定问题(需求)而进行的艺术创作

     1. 发现并定义问题(需求)
     2. 通过调查、研究、思考,深入理解问题(需求)
     3. 创造性的提出构想(发散)
     4. 确定设计方案(收敛),并付诸实施
     5. 迭代优化
    
  • 分解/关系:将问题域的复杂系统分解再分解为单元模块,然后在解决域(编程技术)对模块建模并模块间的关系

  • 编程思想

  • 面向过程、面向对象

  • 数据驱动,事件驱动,测试驱动

  • 编程范式

         1. Don't repeat yourself: 代码复用、功能复用、模块/库/框架复用、系统复用
    

纵观整个软件开发的历史,“增强代码复用”几乎可以说是所有编程及软件设计人员追逐的核心目标。从语言方面来说,汇编到高级语言,函数的出现,面向对象语言的出现,封装、继承、多态这些语言特性,无一不与“代码复用”这一目标相关。静态链接库,动态链接库,这是从编译机制层面的DRY原则。从设计层面来说,丰富多样、层出不穷的框架,STL,Boost等C++相关的库,Java相关的各种框架就更多了,开发框架Spring,线程管理库,网络开发库,等等都是为了功能复用。

    2. Open-Close Principle: 可扩展,抽象,面向接口编程,高内聚、低耦合
  • 设计模式
  • 系统架构

知识、理论、经验、学习


4. 软件与数据

  • 信息论
  • 软件的本质是信息处理:定义、传输、转换、存储、检索,展示
  • 软件开发的本质是通过“计算机语言”控制计算机以实现“信息处理”的目的
  • 计算机语言是人与计算机传递信息的媒介,其本质是对计算机指令的高层次抽象和建模

对于软件开发来说,有三个核心概念:信息 --> 语言 --> 计算机!软件开发过程中涉及的所有技术,都是围绕着这三个核心概念产生并演化的。所谓纲举目张、提纲挈领,知识一定要依附于清晰而系统的框架上,才会深刻而持久。程序员最开始接触的是计算机语言,最熟悉的也是计算机语言,因此也习惯于站在计算机语言的角度上去思考软件开发,往往会走很多的弯路。

  • 数据模型(data model),数据库模型(database model),
  • xml, yaml, json
  • key/value 键值对
  • 树形结构: dom,ldap,文件系统

  程序员接触的数据模型,可以明显的拆分为语言层面和非语言层面两个大类,所谓的语言层面就是计算机语言中提供的数据模型,而非语言层面则可以理解为业务相关的数据模型。

  编程语言中的数据模型,简单的说就是变量,变量的本质是这样一个六元组:(名称,类型,地址,数值,生存期,作用域)。

  当然,细说的化又可以分为全局变量、局部变量、静态变量、共享内存、引用… 在c语言中有结构体变量,面向对象语言中有对象变量,类变量,而几乎所有的语言中都会提供一些结构化的变量类型,如数组、列表、集合、哈希等等。在理解变量时,要知道它们的差异是在“生存期或作用域”方面,还是在类型和寻址方面。不同的编程语言,变量名称也各有讲究,perl里@name,%name,$name用于区分变量结构是列表,哈希,标量,ruby中@,@@则用于区分作用域是全局的还是局部的。

  除了语言自身提供的基础数据模型,还有一些基于语言而设计的高层次数据模型,比如JAX-WS与JAX-RS等等,本质上也是数据模型。

  在非语言层面,数据模型就更是层出不穷,百花齐放了,比如常见的json,xml,yaml,本质上就是数据模型,而在通信协议领域,协议头描述了控制信息的结构,本质上就是一种数据模型。更上层一点,日志数据的模型,配置数据的模型,运维数据的模型,接口数据模型,存储数据的模型,以及各种业务领域模型,比如物流,金融,电商…

数据的本质

  • 数据是信息的载体,是客观事物的抽象描述。
  • 软件的本质是信息处理,及过程自动化。
  • 数据的基本特征: 类型,大小,位置,名称,状态,生命周期。。。
  • 元数据
  • 关系本质上也是数据 数据模型:
  • 树形数据,关系型数据,网状数据

数据模型

元数据模型:
  json,xml,soap,buffer protocol,序列化

数据建模框架: e-r,json,xml,

  现实世界的数据模型是最复杂,最合理的模板,公司,学校,家庭,国家,对人这个对象,有不同的抽象,关注的特征不一样,模型也不一样。

  人,即是一个对象,也是一个系统,接口很清晰,人对关系的管理模型也很有意思。

  例如,父子,夫妻,这些都是强关系,前者为immutable,后者为mutable,关系变更需要遵循法律。朋友关系,则是弱关系,更可以细分,也不一定是双向的,比如微博的关注,我可以不知道谁关注了我,什么时候开始,什么时候结束。有时候,老同学还记得我,但我已经记不起来他了,等等。

  数据也应该如此,java中引用也有weak referrance。本质上涉及到了关系数据的生命周期/生存期,关系是需要被建立,维持,或结束的,每一段关系都处在特定的阶段。

  编程语言中的数据模型多种多样,各自都有其考量。c语言中的数据结构,更偏向于纯数据,更容易理解和设计,data flow很清晰。面相对象语言中的对象,更应该看作一个子系统。以对“人”来建模为例,java试图去扮演人,而c则是试图去描述人。学校在管理学生时不需要去扮演人,只需要管理学生信息就行了。

数据建模

  软件开发中的数据建模有时候被具象化为设计关系型数据库的数据表 schema,这是狭义上的数据建模。

  广义的数据建模,是指对现实世界各类数据的抽象、组织、描述、定义。我们的日常生活中,会接触形形色色的数据,人类有一个异常强大的数据模型,叫做“语言”,没错,语言就是人类对客观世界的抽象和描述。在语言中,早已经定义了各种各样的数据模型:人,动物,好,坏,婚姻,国家 …

  人脑就是一个信息系统,负责处理由”声色香味触“捕获的各种各样的信息。

  数据无处不在,只是大多数时候我们并没有主动去思考它,但是作为一个追求卓越的程序员,必须深入思考数据及其建模的相关知识。

程序员世界里的数据

  • 代码是一种数据,编程语言就是这类数据的模型;我们说的每一句话,都遵循着特定的语言模型,否则将无法有效的沟通;
  • 软件系统中的数据可分为:业务数据和非业务数据;
  • 程序员对数据建模,必然是在特定的框架之上进行的,程序中的数据模型依赖于开发语言的:变量(全局,局部,静态…);存储中的数据模型则依赖于数据库的存储模型,sql 与 nosql 就完全不一样,mysql 与 cassandra 在进行数据建模上,就遵循不同的思维方式。
  • 关系是很重的数据
  • 接口中的数据模型: 函数参数,共享内存,消息,协议 …

模型间的转换和映射

  数据在传输的过程中,涉及到的主要问题就是模型的转换,这在TCP/IP协议栈上体现的很明显;另外,数据在存入关系型数据库时,也要遵循数据库的数据模型进行映射,比如主键,外键,属性列,索引,约束…

  还比如,json 数据转换为开发语言中的数据模型(变量,数组,哈希,对象…)。


5. 管理

  • 软件工程
  • 软件过程管理: 需求、设计、开发、测试、运维
  • 软件开发模式:敏捷、极限、瀑布、迭代、统一过程
  • 软件开发的辅助领域: 配置管理、文档编写、质量管理、项目管理
  • devops
  • cmmi
  • 敏捷

你可能感兴趣的:(软件知识体系,知识体系)