软件工程之知识架构
Posted carroll18
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件工程之知识架构相关的知识,希望对你有一定的参考价值。
文章目录
软件工程知识架构全景图
- 由图可见,“质量焦点”在最底层,这不难理解软件工程是为了应对软件危机诞生的学科,其目标就是为了要聚焦于质量,构建和维护高质量的软件。可以说,聚焦于质量就是软件工程的基石。
那“过程”指的是什么呢?
- 要构建高质量软件,则要解决软件过程中的混乱,将软件开发过程中的沟通、计划、建模、构建和部署等活动有效地组织起来。而软件过程,就是在软件项目的生命周期内,也就是软件从诞生到结束这期间,在开发与构建系统时要遵循的步骤。
- 有两种过程框架你一定经常听到,那就是瀑布模型和敏捷开发。这是在软件工程多年的发展中,逐步形成的两种主流的软件过程指导框架。
那么,何为“方法”?
- 方法是指在整个过程中,如何构建系统的方法学。比如说,如何分析用户需求;如何对产品进行测试验收;如何进行系统架构设计等。
知道了过程,掌握了方法,那么具体落到操作层面,就会涉及到工具的使用。
- 我们需要工具来辅助方法的执行,提高效率。通过工具,可以把一些手动的工作自动化,比如自动化测试工具,自动构建部署工具;通过工具,可以帮助把一些流程规范起来,比如 Bug 跟踪、源代码管理;还可以通过工具,帮助提高编码效率,比如各种编辑器 IDE、各种高级语言。
如果现在再回头总结一下,软件工程的核心知识点,就是围绕软件开发过程,产生的方法学和工具。
- 用一个简单的公式来理解软件工程,那就是:软件工程 = 工具 + 方法 + 过程。
软件工程的知识结构
如何学习软件工程?
学习软件工程的四重境界
- 第一重:用器
- “器”就是工具,工具规则简单,上手就可以用,也很快就能看到效果。比如,原型设计工具可以帮助你确定需求,持续集成工具可以帮助你简化测试和部署的流程。对工具的学习是最为简单的,也是最基础的。
- 第二重:学术
- “术”就是方法,学会方法,你就能应用方法去完成一个任务,例如用需求分析的方法,你去搞清楚用户想要什么,用 Scrum 去组织项目开发过程。
掌握了术,甚至是可以脱离器的,例如你没用原型设计工具,你用纸和笔,用白板,一样可以去沟通确认需求。
- 第三重:悟道
- “道”就是本源,软件工程知识的核心思想和本质规律。就像敏捷开发,本身并不是一种方法,而是一套价值观和原则,领悟了这个道,就可以成为你在处理项目过程中各种问题决策的依据。道是可以产生术的,你掌握了敏捷开发的道,你就可以领悟出 Scrum、极限编程这样的术。
- 第四重: 传道
- 当你能把复杂的知识通过浅显易懂的方式传授给别人,那就说明你对知识的领悟已经到了更高的境界。同时,教学也是最好的学习方式,通过传授别人知识,可以让你对知识本身有更深入的理解。
学习软件工程参考书目
- 《构建之法》
- 作者邹欣是微软的研发总监,同时在多所高校进行了软件工程的教学实践,在此基础上对软件工程的各个知识点和技能要求进行了系统性整理,形成教材。也是本专栏很多很好的补充。
- 《人月神话》
- 这是软件工程历史上的经典著作,内容发人深省,40 年来一直畅销不衰,里面的观点即使到现在也不过时。这本书即使你以前看过,隔一段时间再翻看一遍,可能都会有新的感悟。
- 《人件》
- 如果说《人月神话》关注“软件开发”本身,《人件》则关注软件开发中的“人”。作者指出知识型企业的核心是人,而不是技术。
- 《知行合一: 实现价值驱动的敏捷和精益开发》
- 作者丛斌有二十多年从事软件工程教学、咨询和研究的经验,所以书写的特别接地气,文章有很多真实案例,对敏捷开发和 CMMI 都有很深入描述。
- 《软件工程——实践者的研究方法》
- 这是大部分高校采用的软件工程标准教材,可以作为一个参考。
- 《持续交付》
- 讲述如何实现更快、更可靠、低成本的自动化软件交付,描述了如何通过增加反馈,并改进开发人员、测试人员、运维人员和项目经理之间的协作来达到这个目标。
- 《走出软件作坊》
- 这本书生动的描述了国内小型 IT 企业在发展过程中遇到的一系列项目管理问题,以及作者是如何去解决这些问题的。
你知道的越多,你不知道的越多。
区块链知识整理之系统架构及各层功能
前言
本篇笔记是阅读区块链综述论文
[1] 代闯闯,栾海晶,杨雪莹,等. 区块链技术研究综述[J]. 计算机科学, 2021(S2).
[2] 刘敖迪,杜学绘,王娜,等. 区块链技术及其在信息安全领域的研究进展_刘敖迪[J]. 软件学报, 2018, 29(7): 2092-2115.
[3] 袁勇,王飞跃. 区块链技术发展现状与展望_袁勇[J]. 自动化学报, 2016, 42(4): 481-494.
和查阅一些网络资料所作整理。
一、区块链技术基础模型和关键技术
比特币是由交易、共识协议和通信网络等技术组件所构成的一种去中心化的电子交易系统,其涵盖的技术组件形成了整个比特币系统的3个渐进的层次:交易、区块和区块链。
1.1系统架构
区块链技术的基础架构模型如图 2 所示. 一般说来, 区块链系统由数据层、网络层、共识层、激励层、合约层和应用层组成。
1.1.1数据层
比特币系统中的交易记录类似于物理系统中的交易记录,每一条交易记录中均包括交易信息的输入、输出地址以及转让的数目等信息。
数据层封装了底层数据区块以及相关的数据加密和时间戳等技术。每个分布式节点都可以通过特定的哈希算法和 Merkle 树数据结构, 将一段时间内接收到的交易数据和代码封装到一个带有时间戳的数据区块中, 并链接到当前最长的主区块链上, 形成最新的区块. 该过程涉及区块、链式结构、哈希算法、Merkle树和时间戳等技术要素。
-
哈希函数
区块链通常并不直接保存原始数据或交易记录, 而是保存其哈希函数值, 即将原始数据编码为特定长度的由数字和字母组成的字符串后记入区块链。特点:通过哈希输出几乎不能反推输入值 (单向性), 不同长度输入的哈希过程消耗大约相同的时间 (定时性) 且产生固定长度的输出 (定长性), 即使输入仅相差一个字节也会产生显著不同的输出值 (随机性) 。
比特币区块链通常采用双 SHA256 哈希函数, 即将任意长度的原始数据经过两次 SHA256 哈希运算后转换为长度为 256 位 (32 字节) 的二进制数字来统一存储和识别. 除上述特点外, SHA256 算法还具有巨大的散列空间 (2的256次方大的散列空间 ) 和抗碰撞 (避免不同输入值产生相同哈希值) 等特性, 可满足比特币的任何相关标记需要而不会出现冲突。
-
数据区块
如图 3 所示, 每个数据区块一般包含区块头 (Header) 和区块体 (Body) 两部分。
区块头封装了当前版本号 (Version)、前一区块地址(Prev-block)、当前区块的目标哈希值 (Bits)、当前区块 PoW 共识过程的解随机数 (Nonce)、Merkle根 (Merkle-root) 以及时间戳 (Timestamp) 等信息。
区块体则包括当前区块的交易数量以及经过验证的、区块创建过程中生成的所有交易记录。 这些记录通过 Merkle 树的哈希过程生成唯一的 Merkle 根并记入区块头。
-
Merkle树
结构: 如图 3 所示, Merkle 树通常包含区块体的底层 (交易)数据库, 区块头的根哈希值 (即Merkle 根) 以及所有沿底层区块数据到根哈希的分支。作用:快速归纳和校验区块数据的存在性和完整性,即进行SPV(简单支付验证)。
优点:①是极大地提高了区块链的运行效率和可扩展性,使得区块头只需包含根哈希值而不必封装所有底层数据, 这使得哈希运算可以高效地运行在智能手机甚至物联网设备上;②可持 “简化支付验证”协议, 即在不运行完整区块链网络节点的情况下, 也能够对 (交易) 数据进行检验。
支付验证过程:假设我们要验证区块中存在Hash值为9Dog:64(绿色框)的交易,我们仅需要知道1FXq:18、ec20、8f74(黄色框)即可计算出781a、5c71与Root节点(藕粉色框)的哈希,如果最终计算得到的Root节点哈希与区块头中记录的哈希(6c0a)一致,即代表该交易在区块中存在。(依据:①默克尔树是从下往上逐层计算的,所以只要知道相邻的另一个节点的hash值就可以一直往上计算直到根节点,②根节点的hash值可以准确的作为一组交易的唯一摘要,依据这两点就可以来验证一笔交易是否存在。)
算法复杂度:O(log2N)。 这将极宽和验证时间, 并使得仅保存部分相关区块链数据的轻量级客户端成为可能。
简单支付验证(Simplified Payment Verification, SPV)和交易验证:简单支付验证是一种无须维护完整的区块链信息,只需要保存所有的区块头部信息即可进行支付验证的技术,简单的说就是支付验证只需验证该笔交易是否被确认过了;交易验证的过程较为复杂,包括余额验证、双重支付判断等,通常由保存区块链完整信息的区块链验证节点来完成。验证节点虽然可以精准无误地验证任何一笔交易,但需要拥有巨大的数据量。(更详细见:区块链交易验证和支付验证)
-
时间戳
区块链技术要求获得记账权的节点必须在当前数据区块头中加盖时间戳, 表明区块数据的写入时间。主链上各区块是按照时间顺序依次排列的。
意义:①可以作为区块数据的存在性证明 (Proof of existence),有助于形成不可篡改和不可伪造的区块链数据库,从而为区块链应用于公证、知识产权注册等时间敏感的领域奠定了基础。②更为重要的是, 时间戳为未来基于区块链的互联网和大数据增加了时间维度, 使得通过区块数据和时间戳来重现历史成为可能。
-
链式结构
取得记账权的矿工将当前区块链接到前一区块, 形成最新的区块主链。 各个区块依次环环相接, 形成从创世区块到当前区块的一条最长主链, 从而记录了区块链数据的完整历史, 能够提供区块链数据的溯源和定位功能, 任意数据都可以通过此链式结构顺藤摸瓜、追本溯源。分叉及解决方式:两个矿工同时 “挖出” 两个新的区块加以链接的话, 区块主链可能会出现暂时的 “分叉”现象。其解决方法是约定矿工总是选择延长累计工作量证明最大的区块链. 因此, 当主链分叉后, 后续区块的矿工将通过计算和比较, 将其区块链接到当前累计工作量证明最大化的备选链上, 形成更长的新主链。
-
非对称加密
非对称加密通常在加密和解密过程中使用两个非对称的密码, 分别称为公钥和私钥。特点:①用其中一个密钥 (公钥或私钥) 加密信息后, 只有另一个对应的密钥才能解开; ②是公钥可向其他人公开、私钥则保密, 其他人无法通过该公钥推算出相应的私钥。
应用场景:①信息加密场景主要是由信息发送者 (记为 A) 使用接受者 (记为 B) 的公钥对信息加密后再发送给 B, B 利用自己的私钥对信息解密. 比特币交易的加密即属于此场景; ②数字签名场景则是由发送者 A 采用自己的私钥加密信息后发送给 B, B 使用 A 的公钥对信息解密、从而可确保信息是由 A 发送的; ③登录认证场景则是由客户端使用私钥加密登录信息后发送给服务器, 后者接收后采用该客户端的公钥解密并认证登录信息。
比特币中非对称加密机制:
比特币系统一般通过调用操作系统底层的随机数生成器来生成 256 位随机数作为私钥。比特币私钥的总量可达2的256次方, 极难通过遍历全部私钥空间来获得存有比特币的私钥, 因而是密码学安全的。为便于识别, 256 位二进制形式的比特币私钥将通过 SHA256 哈希算法和 Base58 转换, 形成 50 个字符长度的易识别和书写的私钥提供给用户; 比特币的公钥是由私钥首先经过 Secp256k1 椭圆曲线算法生成 65 字节长度的随机数。该公钥可用于产生比特币交易时使用的地址, 其生成过程为首先将公钥进行 SHA256 和 RIPEMD160 双哈希运算并生成20 字节长度的摘要结果 (即 hash160 结果), 再经过SHA256 哈希算法和 Base58 转换形成 33 字符长度的比特币地址。公钥生成过程是不可逆的, 即不能通过公钥反推出私钥。
比特币的公钥和私钥通常保存于比特币钱包文件。
私钥最为重要,丢失私钥就意味着丢失了对应地址的全部比特币资产。
1.1.2 网络层
网络层封装了区块链系统的组网方式、消息传播协议和数据验证机制等要素. 结合实际应用需求,通过设计特定的传播协议和数据验证机制, 可使得区块链系统中每一个节点都能参与区块数据的校验和记账过程, 仅当区块数据通过全网大部分节点验证后, 才能记入区块链。
-
组网方式
区块链系统的节点一般具有分布式、自治性、开放可自由进出等特性, 因而一般采用对等式网络 (Peer-to-peer network, P2P 网络) 来组织散布全球的参与数据验证和记账的节点.。P2P:P2P网络中的每个节点均地位对等且以扁平式拓扑结构相互连通和交互, 不存在任何中心化的特殊节点和层级结构。
如图 4 所示,每个节点均会承担网络路由任务,把其他节点传递来的交易信息转发给更多的相邻节点,网络中有些节点还具有钱包和挖矿功能。同时,节点具有验证区块数据的能力,但不必所有节点都存储完整的区块链数据, 按照节点存储数据量的不同, 可以分为全节点和轻量级节点。
全节点保存有从创世区块到当前最新区块为止的完整区块链数据, 并通过实时参与区块数据的校验和记账来动态更新主链。其优势在于不依赖任何其他节点而能够独立地实现任意区块数据的校验、查询和更新, 劣势则是维护全节点的空间成本较高; 轻量级节点则仅保存一部分区块链数据, 节点具有验证区块数据的能力,节点间可以通过基于 Merkle 树的SPV向相邻节点请求所需数据以验证交易的合法性,并对交易数据进行更新。 -
数据传播协议
任一区块数据生成后, 将由生成该数据的节点广播到全网其他所有的节点来加以验证。根据中本聪的设计, 比特币系统的交易数据传播协议包括如下步骤:
① 比特币交易节点将新生成的交易数据向全网所有节点进行广播;
② 每个节点都将收集到的交易数据存储到一个区块中;
③ 每个节点基于自身算力在区块中找到一个具有足够难度的工作量证明;
④ 当节点找到区块的工作量证明后, 就向全网所有节点广播此区块;
⑤ 仅当包含在区块中的所有交易都是有效的且之前未存在过的, 其他节点才认同该区块的有效性;
⑥ 其他节点接受该数据区块, 并在该区块的末尾制造新的区块以延长该链条, 而将被接受区块的随机哈希值视为先于新区块的随机哈希值。需要说明的是, ① 如果交易节点是与其他节点无连接的新节点, 比特币系统通常会将一组长期稳定运行的 “种子节点” 推荐给新节点建立连接, 或者推荐至少一个节点连接到新节点.。② 交易数据广播时, 并不需要全部节点均接收到, 而是只要足够多的节点做出响应即可整合进入区块账本中. 未接收到特定交易数据的节点则可向邻近节点请求下载该缺失的交易数据。
-
数据验证机制
节点接收到邻近节点发来的数据后, 将首先验证该数据的有效性。如果数据有效, 则按照接收顺序为新数据建立存储池以暂存尚未记入区块的有效数据, 同时继续向邻近节点转发; 如果数据无效, 则立即废弃该数据, 从而保证无效数据不会在区块链网络继续传播。在比特币中, 比特币的矿工节点会收集和验证P2P 网络中广播的尚未确认的交易数据, 并对照预定义的标准清单, 从数据结构、语法规范性、输入输出和数字签名等各方面校验交易数据的有效性, 并将有效交易数据整合到当前区块中;同理,当矿工节点“挖” 到新区块后, 其他矿工节点也会按照预定义标准来校验该区块是否包含足够工作量证明, 时间戳是否有效等; 如确认有效, 其他矿工节点会将该区块链接到主区块链上, 并开始竞争下一个新区块。
区块链全网数据同时存储于去中心化系统的所有节点上, 即使部分节点失效, 只要仍存在一个正常运行的节点, 区块链主链数据就可完全恢复而不会影响后续区块数据的记录与更新。这种完全的“去中心化”模式,具有更高的安全性。
1.1.3 共识层
区块链技术的核心优势之一就是能够在决策权高度分散的去中心化系统中使得各节点高效地针对区块数据的有效性达成共识。
共识机制是分布式节点间根据某一事先协商好的规则来确定分布式账本(即区块)的记账权归属的方法,以此使不同节点对交易数据达成共识,保障分布式账本数据的一致性和真实性。.共识机制主要用来解决拜占庭将军问题,常见的共识机制按照数据一致性可进行如下划分.
-
PoW共识:其核心思想是通过引入分布式节点的算力竞争来保证数据一致性和共识的安全性.比特币系统中, 各节点 (即矿工)
基于各自的计算机算力相互竞争来共同解决一个求解复杂但验证容易的 SHA256 数学难题 (即挖矿),
最快解决该难题的节点将获得区块记账权和系统自动生成的比特币奖励.符合要求的区块头哈希值通常由多个前导零构成, 目标哈希值越小, 区块头哈希值的前导零越多,成功找到合适的随机数并 “挖”
出新区块的难度越大.比特币区块链系统的安全性和不可篡改性是由PoW 共识机制的强大算力所保证的,
任何对于区块数据的攻击或篡改都必须重新计算该区块以及其后所有区块的 SHA256 难题, 并且计算速度必须使得伪造链长度超过主链,
这种攻击难度导致的成本将远超其收益.优点:PoW 共识机制是具有重要意义的创新, 其近乎完美地整合了比特币系统的货币发行、交易支付和验证等功能,
并通过算力竞争保障系统的安全性和去中心性; 缺陷:其强大算力造成的资源浪费 (如电力) 历来为研究者所诟病, 而且长达
10 分钟的交易确认时间使其相对不适合小额交易的商业应用. -
PoS共识:本质上是采用权益证明来代替 PoW中的基于哈希算力的工作量证明, 是由系统中具有最高权益而非最高算力的节点获得区块记账权. 权益体现为节点对特定数量货币的所有权, 称为币龄或币天数 (Coin days).
PoS 共识过程中的难度与交易输入的币龄成反比, 消耗币龄越多则挖矿难度越低.
优点:PoS将算力竞争转化为权益竞争,不仅节约算力,权益的引入也能够防止节点发动恶意攻击;同时促使所有节点有责任维护区块链的安全稳定运行以保障自身权益.PoS中需要拥有超全网一半的权益发动51%攻击,但其成本高于拥有超全网一半的算力,另外创建区块需要消耗权益,使得PoS持续进行51%攻击的难度增加,一定程度上降低了安全风险.
缺点:没有解决中心化程度增强的问题,新区块的生成趋向于权益高的节点. -
DPoS 共识机制:授权股份证明(Delegated Proof of Stake, DPo S)共识算法尝试解决Po W和Po S存在的问题,通过实施去中心化的民主方式,每个币相当于一张选票,持有币的人可以根据自己持有币的数量来将自己的若干选票投给自己信任的受托人。系统会选出获得投票数量最多的N个人作为系统受托人,他们的工作是签署(生产)区块,且在每个区块被签署之前,必须先验证前一个区块已经被受信任节点签署。
优点:通过基于权益的民主投票产生信任节点集合,每个节点都可以参与到信任节点的选择上,避免了主节点的产生趋向于高权益节点的问题.区块的产生不需要消耗算力,相对于PoS更加节省能耗.
缺点:但选举的信任节点全权负责创建区块,这在一定程度上降低了去中心化程度.
1.1.4 合约层
合约层封装区块链系统的各类脚本代码、算法以及由此生成的更为复杂的智能合约. 如果说数据、网络和共识三个层次作为区块链底层 “虚拟机” 分别承担数据表示、数据传播和数据验证功能的话, 合约层则是建立在区块链虚拟机之上的商业逻辑和算法, 是实现区块链系统灵活编程和操作数据的基础.
-
智能合约
区块链技术的出现重新定义了智能合约. 智能合约是区块链的核心构成要素 (合约层), 是由事件驱动的、具有状态的、运行在可复制的共享区块链数据账本上的计算机程序, 能够实现主动或被动的处理数据, 接受、储存和发送价值, 以及控制和管理各类链上智能资产等功能.智能合约同样具有区块链数据的一般特征, 如分布式记录、存储和验证, 不可篡改和伪造等.
智能合约的运作机理如图 5 所示: 通常情况下,智能合约经各方签署后, 以程序代码的形式附着在区块链数据 (例如一笔比特币交易) 上, 经 P2P 网络传播和节点验证后记入区块链的特定区块中. 智能合约封装了预定义的若干状态及转换规则、触发合约执行的情景 (如到达特定时间或发生特定事件等)、特定情景下的应对行动等. 区块链可实时监控智能合约的状态, 并通过核查外部数据源、确认满足特定触发条件后激活并执行合约.
参考文献资料汇总
[1] 代闯闯,栾海晶,杨雪莹,等. 区块链技术研究综述[J]. 计算机科学, 2021(S2).
[2] 刘敖迪,杜学绘,王娜,等. 区块链技术及其在信息安全领域的研究进展_刘敖迪[J]. 软件学报, 2018, 29(7): 2092-2115.
[3] 袁勇,王飞跃. 区块链技术发展现状与展望_袁勇[J]. 自动化学报, 2016, 42(4): 481-494.
[4] 郑敏,王虹,刘洪,等. 区块链共识算法研究综述[J]. 信息网络安全, 2019(7): 8-24.
[5] 靳世雄,张潇丹,葛敬国,等. 区块链共识算法研究综述[J]. 信息安全学报, 2021, 6(2): 85-100.
[4] 简单支付验证-SPV
[5] 区块链100篇之第九篇–默克尔树(Merkle Tree)
以上是关于软件工程之知识架构的主要内容,如果未能解决你的问题,请参考以下文章
IT:后端进阶技术路线图(初级→中级→高级)后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略