Web 开发技术栈

Web 是什么?

  • 简单地说,网络是一个遍布全球的网络,它连接大量设备并允许它们相互通信
  • Internet 上的网站托管在称为服务器的设备上,当与 Internet 上的网页交互时,实际上是在与托管该网站的服务器交换数据
  • 访问网页所使用的设备在网络上下文中称为客户端
  • 简而言之,Web 可以通过多种精心设计的机制在客户端和服务器之间交换数据

由于 Web 是一个极其复杂且分布广泛的网络,因此网络中的机器通常被划分为抽象层,每个抽象层执行有助于整个通信过程的特​​定任务:

  • 应用层

    • 应用层负责跨 Internet 的进程到进程通信。
    • 它是层次结构中的最顶层,应用程序本身构建于此之上。
    • 应用层为应用程序与单个进程进行通信提供通信接口和最终用户服务。
  • 传输层

    • 传输层负责连接互联网上的应用程序。
    • 它对来自单一来源的数据进行多路分解,并将其传输到预期的应用程序。
    • Web 上下文中传输层的基本目的是它提供进程到进程的通信;它允许同一台机器或不同机器上的两个单独的进程相互发送消息。
    • 它使用 Sockets,它本质上只是一个进程的网关。换句话说,套接字是进程接收和发送消息的方式。
  • 网络层

    • 网络层的基本目的是它提供主机到主机的通信;它允许连接互联网上的任意两台机器。
    • 它提供全球连接,并允许终端系统在数据链路层无法提供的范围内进行大规模的相互通信。
  • 数据链路层

    • 数据链路层负责将数据从任何给定机器传输到恰好一个链路之外的设备或机器。
    • 它提供了一种将数据从一个设备传输到另一个设备的方法,而不需要知道两个设备之间的物理连接。
  • 物理层

    • 机器的物理层是指使机器在网络上可用的物理布线和电路。
    • 它是网络层次结构中的最底层。

Web 是如何工作的?

Internet 结构连通性的关键是交换机路由器。这些设备允许互联网上的任意两个终端系统之间的通信。

  • 交换机 (Switch)

    • 互联网由称为交换机的设备组成,这些设备有助于将每个设备连接到网络上的每个其他设备【这些设备本身被称为终端系统】。
    • 终端系统通过链路连接到交换机,而所有交换机依次相互连接,从而确保互联网上的每个终端系统都隐含地连接到每个其他终端系统。
    • 交换机还通过沿着它们知道存在于数据包源和目的地之间的路径转发数据包,促进任意两个端系统之间的通信。
  • 路由器 (Router)

    • 路由器本身具有与交换机相同的功能,因为它们还将终端系统连接到网络的其余部分。
    • 路由器实际上与交换机有很大不同,因为它们具有允许查找目标地址并确定从数据包源到其目标的最短或最不繁忙路径的附加功能。
    • 路由器是更强大的交换机版本,互联网由路由器和交换机组成,可促进终端系统之间的数据传输。

现在我们已经确定了 Internet 的结构是如何确保连通性的,让我们来谈谈数据实际上是如何通过网络传输的

  • 数据包 (Data packet)

    • 通过将数据(只是一组位)进行划分来完成的,这些数据需要传输到几个更小的位块(称为数据包),然后将每个数据包独立地发送到其目的地。
    • 这样做的原因是不能总是在单个数据包中发送大量数据,因为大数据包中的数据很可能由于传输过程中的位翻转而在从源到目的地的路径上被破坏。
    • 发送多个较小的数据包更加有效和可靠。

由于网络上的客户端和服务器能够理解相同的语言非常重要,因此有一些协议规定了 Internet 上设备之间的通信

  • TCP

    • TCP 是一种传输层协议,负责传输数据并确保通过 Web 在客户端和服务器之间可靠地传输数据

    • TCP 这样做的方法是通过向数据包添加附加信息以允许数据包身份验证,并允许在客户端和服务器之间交换确认消息以确认数据传输。

    • TCP 协议以 3 次握手过程:

      • 第一次握手:客户端向服务器发送一个 SYN 报文,请求建立连接。
      • 第二次握手:服务器收到 SYN 报文后,向客户端发送一个 SYN 报文和一个 ACK 报文,确认客户端的 SYN 报文。
      • 第三次握手:客户端收到 SYN 报文和 ACK 报文后,向服务器发送一个 ACK 报文,确认服务器的 SYN 报文。
  • HTTP/HTTPS

    • 超文本传输​​协议,通常称为 HTTP,是一种应用层协议,它规定了客户端和服务器在 Web 上交换的消息的结构以及它们的交换方式。客户端程序和服务器程序通过交换 HTTP 消息相互交谈,HTTP 的好处是它确保消息完整且及时地传递
    • HTTP 协议是一种无状态协议,这意味着它不会记住客户端和服务器之间的任何交互。因此,每个请求都是独立的,服务器不会记住客户端的任何信息。
    • 高层次的想法是 HTTP 建立在 TCP 之上,为的 Web 应用程序创建一个 HTTP 服务器基本上只是意味着正在创建一个服务器,客户端可以通过该服务器创建 TCP 连接以实现可靠的数据传输。
    • HTTP 是一种手段,通过它可以确保的应用程序使用 TCP 将消息从客户端传输到服务器,反之亦然。所以基本上,当你在浏览器中输入一个 URL 时,实际发生的是一个 HTTP 命令被发送到托管应用程序的服务器,以通过 TCP 获取和传输请求的网页。
    • HTTPS 代表什么?HTTPS 是 HyperText Transfer Protocol Secure 的缩写,基本上就是 HTTP 的安全版本。这意味着浏览器和托管服务器之间的通信是加密的,这样网络上的任何第三方都无法访问不打算共享的信息

到目前为止,我们已经讨论了传输层协议以及确保 Web 端系统之间高效通信的应用层协议。但是,这些协议允许终端系统将消息发送到哪里呢?

  • 端口 (Posts)

    • 端口是来自网络的消息到达终端系统的地方

    • 我们之前简要讨论了套接字,并讨论了它们如何成为进程的网关;在端口上打开套接字以允许进程发送和接收消息。

    • 端口由数字指定,默认情况下分类:

      • 0 到 1023 的端口是保留端口,只能由特定的进程使用,1024 以下的所有端口都与特定协议相关联
      • 1024 到 49151 的端口是动态端口,可以由任何进程使用,程序员用于他们想要与网络通信的任何进程
      • 49152 到 65535 的端口是注册端口,可以由任何进程使用,但是这些端口是由 IANA 分配的,因此只能由特定的进程使用

数据如何找到它的方式?

  • IP 协议

    • 互联网协议,通常称为 IP,是一种网络层协议,负责为设备分配地址,以便为它们提供唯一的身份,使它们可以访问和发现。
    • Internet 上的每个设备都有一个唯一的 IP 地址,其他设备使用该地址与其连接。
  • DNS (Domain Name System)

    • 如果通过 URL 访问网站,现在可能想知道 IP 地址从何而来,DNS 发挥了重要作用,它是一个分布式数据库,其中包含网站的 IP 地址,以及网站的域名。

    • 通过 DNS,可以通过域名访问网站,而不是通过 IP 地址,这使可以更轻松地记住网站的名称,而不是 IP 地址。

    • DNS 查询简要过程:

      浏览器缓存 --> 本地 hosts 文件 --> 本地 DNS 缓存 --> 路由器缓存 --> ISP DNS 缓存 --> 递归 DNS 查询
      
    • 递归 DNS 查询是指 DNS 服务器向其他 DNS 服务器查询域名的过程,直到找到 IP 地址为止。

    • DNS 服务器分类:

      • 根 DNS 服务器:根 DNS 服务器是顶级 DNS 服务器,它们知道顶级域名服务器的位置。
      • 顶级域名服务器:顶级域名服务器是二级 DNS 服务器,它们知道域名服务器的位置。
      • 域名服务器:域名服务器是三级 DNS 服务器,它们知道网站的 IP 地址。

到目前为止,我们已经涵盖了 Web 应用程序如何通过网络向最终用户传送数据的所有基础知识。从传输层发起TCP连接开始,一直到通过DNS服务器解析IP地址;我们已经概述了客户端和服务器之间的通信过程。为了使事情更清楚,我们现在将确切地查看任何给定的数据包如何通过网络传输到达其目的地。

数据包的生命周期:

  1. 数据包从源端系统发出

    • 数据包从源端系统发出,它包含源端系统的 IP 地址和目标端系统的 IP 地址,以及源端系统的端口和目标端系统的端口。
    • 数据包还包含一些其他信息,例如数据包的类型,例如 TCP 或 UDP,以及数据包的长度。
  2. 数据包通过路由器传输

    • 数据包通过路由器传输,路由器是网络中的设备,它们负责将数据包从一个网络传输到另一个网络。
    • 路由器使用 IP 地址来确定数据包的目的地,因此路由器可以将数据包传输到正确的网络。
    • 路由器还使用路由表来确定数据包的下一跳,路由表是路由器中的数据库,其中包含网络的 IP 地址和下一跳的 IP 地址。
  3. 数据包到达目标端系统

    • 数据包到达目标端系统,目标端系统使用 IP 地址和端口来确定数据包的目的地,因此它可以将数据包传输到正确的进程。
  4. 数据包被丢弃

    • 一旦数据包到达目标端系统,它就会被丢弃,因为它已经完成了它的使命。
    • 但是,如果数据包到达目标端系统,但是目标端系统的端口没有打开,那么数据包将被丢弃,因为没有进程可以接收它。
    • 如果数据包到达目标端系统,但是目标端系统的端口已打开,但是没有进程正在监听该端口,那么数据包将被丢弃,因为没有进程可以接收它。

当然这不是 Web 工作原理的全部内容,但是这是 Web 工作原理的基础。如果想了解更多关于 Web 工作原理的内容,那么可以阅读相关的经典书籍,例如《图解 HTTP》。

数据库

我们已经讨论了网页的基本结构和底层协议。现在,我们将开始研究构成网页的内容。首先,我们将讨论数据库和数据库管理系统 (DBMS)

网站可分为以下两种类型之一:

  • 静态网站

    • 静态网站是一种只包含 HTML 文件的网站,这些文件包含网站的内容。
    • 静态网站的内容不会随时间而改变,因此它们不需要数据库。
    • 静态网站的内容通常由网站的设计师创建,然后由开发人员将其转换为 HTML 文件。
  • 动态网站

    • 动态网站是一种包含 HTML 文件和数据库的网站,这些文件包含网站的内容。
    • 动态网站的内容通常由用户创建,然后由开发人员将其转换为 HTML 文件。

动态网站允许用户交互,这就是数据库发挥作用的地方。想一想今天访问过的任何网站。其中有多少需要登录或允许点击一个按钮来为检索一些信息,甚至可能是一个新网页?Web 应用程序能够向显示或处理以允许访问其他信息的这些信息需要存储在某个地方。某处是与 Web 应用程序关联的数据库。

  • 数据库管理系统 (DBMS)

    • DBMS 是数据库管理系统的缩写,本质上是一种添加到 Web 开发中的细微差别,它允许数据与应用程序的逻辑分离并单独存储,以便在需要时进行检索和处理。

    • 这意味着数据存储在一个数据库中,该数据库具有一个完全自治的系统来管理它。

    • 然后应用程序调用该数据库以获取任何所需数据,而无需在应用程序代码本身中集成大量处理代码。

    • 数据库管理系统可以分为以下两种类型:

      • 关系型数据库管理系统 (RDBMS)
      • 非关系型数据库管理系统 (NoSQL)

SQL 数据库,也称为关系数据库,使用结构化查询语言 (SQL) 来定义和操作数据:

  • 一方面,这非常有用,因为 SQL 是最通用和使用最广泛的可用选项之一,因此使其成为安全的选择,尤其适用于复杂查询
  • 另一方面,它也可能具有限制性,因为 SQL 要求在使用数据之前使用预定义的模式来确定数据的结构。
  • 数据在 SQL 数据库中总是以表的形式存储,这导致数据检索效率低下且复杂。
  • 的所有数据都必须遵循相同的结构。这可能需要大量工作,并可能导致高度复杂的数据处理代码,从而影响整个应用程序的质量。

NoSQL 数据库,也称为非关系数据库,具有非结构化数据的动态模式:

  • 数据以多种方式存储,包括键值对、文档甚至图形。这种灵活性意味着不必明确定义数据的结构,并且每个数据集都可以拥有自己独特的结构,而不必担心编写额外的代码行来处理此数据以匹配特定的预定义结构。
  • 这些数据库可以动态增长,数据结构因数据库而异。
  • 这些数据库的查询语言也不同,但是大多数都是基于键值对的,因此查询速度更快。
  • NoSQL 数据库的主要缺点是它们的查询语言不如 SQL 通用,因此可能需要学习新的查询语言。

速度是影响 Web 应用程序用户体验的最重要因素之一。依赖不必要的数据库调用通常会降低用户的速度,数据库调用本身在 SQL 数据库中比在 NoSQL 数据库中效率更低。这是因为 SQL 数据库以表格形式存储数据,查询需要对表格进行全面迭代。另一方面,NoSQL 数据库使用数据结构来存储条目,这意味着查找始终得到优化并且数据库调用更加高效。因此,随着现代 Web 应用程序越来越需要快速响应时间来实现预期功能,最近转向使用 NoSQL 数据库的趋势很明显。

我们讨论了频繁的数据库调用在 Web 应用程序中引入的延迟。现在,我们将研究 Web 缓存作为消除这种延迟的一种方法。

  • 网页缓存

    • Web 缓存是 HTTP 协议的一项设计功能,旨在最大限度地减少应用程序在任何给定点处理的流量,以提高 Web 应用程序的响应能力,正如用户所感知的那样,作为一个整体。
  • Web 缓存有多种好处,下面列举了每一种好处:

    • 数据可以缓存在客户端和服务器之间路径中的几个不同点。当所需数据缓存在靠近客户端时,请求不会增加太多网络流量,因为它们在路径上更早地被解析。
    • 扩展第一点,由于请求在路径上较早地得到解决,响应也被更快地发回,从而提高了 Web 应用程序的响应能力。
    • 网络上的积极缓存还可以让应用程序承受更高的数据负载,因为很大一部分数据可以存储在缓存中。
    • 如果服务器由于某种原因无法访问数据库,存储在缓存中的数据仍然可以提供给最终用户。

这里并没有讲解 SQL 与 NoSQL 的具体内容,想要真正学习 SQL 与 NoSQL,可以参考 w3schools 文档:SQLNoSQL

前端 Front-end

服务器端和客户端 C/S 架构

  • 客户端 Client

    • 客户端是指用户使用的设备,如 PC、手机、平板电脑等。
    • 客户端的主要功能是向服务器端发送请求,接收服务器端返回的数据,并将数据展示给用户。
  • 服务器端 Server

    • 服务器端是指 Web 应用程序的服务器,如 Apache、Nginx 等。
    • 服务器端的主要功能是接收客户端的请求,处理请求,返回数据给客户端。

HCJDemo 是指原生的 HTML、CSS、JavaScript,没有使用任何框架或库:

  • HTML(超文本标记语言)不是一种编程语言,而是一种标记语言,用于定义网页的内容。

  • CSS (层叠样式表) 不是一种编程语言,它是一种用于 HTML 的样式语言,用于定义 HTML 的外观。

    • SASS & LESS 是 CSS 的扩展,它们是 CSS 的超集,可以扩展 CSS 的功能。
  • JavaScript 是由 Netscape 开发的网络脚本语言,它是当今世界上最流行的编程语言。该语言被标准化为 ECMAScript,作为脚本的跨平台互联网标准。

后端 Back-end

什么是网络服务器?

  • 网络服务器是一台计算机,它运行着 Web 服务器软件,用于响应客户端的请求。
  • Web 托管公司在服务器上提供空间,供客户拥有或租用,并通常在数据中心提供 Internet 连接。他们通常会为此服务收取月费。数据中心是容纳多台服务器的建筑物。

微服务架构

  • 微服务架构是一种软件开发方法,它将应用程序作为一组小型服务进行开发和部署。每个服务都运行在其自己的进程中,并且服务之间通过轻量级机制进行通信,通常是 HTTP API。这些服务可以使用不同的编程语言和数据存储技术进行开发。

  • 它将应用程序构建为服务的集合,参考资料:https://microservices.io/

  • 微服务架构优点

    • 高度可维护性
    • 解耦合
    • 可独立部署
    • 围绕业务能力进行组织

后端编程工作内容

  • 信息的高效存储和传递
  • 定制的用户体验
  • 控制对内容的访问
  • 存储会话/状态信息
  • 通知(通过网站本身或通过电子邮件、短信、即时消息、视频对话或其他通信服务)
  • 数据分析

开发框架 Framework

Web 框架被定义为由标准化代码(HTML、CSS、JS文档等)的文件和文件夹结构组成的包,可用于支持网站的开发,作为开始构建站点的基础. 本质上,框架提供了一些基本的、标准的起始代码,允许开发人员在其上构建他们网站的内容。

大多数网站共享一个非常相似的结构,框架的目的是提供这个通用结构作为起点,这样开发人员就不必从头开始重做,可以重用提供的代码。因此,框架用于简化 Web 开发过程。

MVC 架构

MVC 架构是一种软件设计模式,它将应用程序分为三个基本部分:模型、视图和控制器。

  • Model(模型):模型是应用程序中用于处理应用程序数据逻辑的部分。模型对象负责在数据库中存储数据。
  • View(视图):视图是应用程序中处理数据显示的部分。视图是依据模型数据创建的。
  • Controller(控制器):控制器是应用程序中处理用户交互的部分。控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

有非常流行的前端框架和后端框架,可能已经听说过它们

  • 前端框架

    • Angular JS:是 Google 开发的一个 JavaScript 框架,用于构建动态 Web 应用程序,主要用于实时更新用户界面并提供高度交互的网站。
    • Bootstrap:是 Twitter 开发的一个用于前端开发的开源工具包,主要用于简化将 CSS 添加到 HTML 的过程。它遵循响应式网页设计标准,因此允许用户开发各种复杂性和规模的响应式网站。
    • React.js:是 Facebook 开发的一个用于构建用户界面的 JavaScript 库,这样做的好处是,当数据发生变化时,React 确保只更新相关组件,而不是整个页面。尽管人们怀疑它是否是一个实际的框架,但它是一个非常流行的库,用于构建 MVC 应用程序的视图层。
    • Backbone:是一个 JavaScript 库,用于构建 Web 应用程序的模型-视图-控制器(MVC)架构。确保对这些模型的任何更改都会自动触发对显示这些模型的任何视图的更改。
    • Semantic-UI:这个特定框架的主要区别在于它的简单性,它不是一个框架,而是一个 UI 组件库,它提供了一组简单的 UI 组件,可以用来构建网站。
  • 后端框架

    • Express (JavaScript):是一个最小且高度灵活的 Node.js Web 应用程序框架,它为 Web 应用程序提供了一组强大的功能,用于构建单页、多页和混合 Web 应用程序。
    • Symfony (PHP):是一个开源的、全栈的 PHP 框架,背后的关键思想是它本质上是一组可重用的组件,用于构建动态 Web 应用程序和 Web 服务。
    • Django (Python):是一个开源的、高级的 Python Web 框架,用于快速开发、优雅和可维护的 Web 应用程序。
    • Ruby on Rails (Ruby):建立在我们之前研究过的 MVC 架构之上,它为进入每个组件的所有内容提供默认结构,包括数据库、几种常见的 Web 服务以及网页本身,因此开发人员可以专注于应用程序的核心功能。
    • ASP .NET (C#):是一种开源的服务器端 Web 开发框架,用于使用 .NET 或 .NET 支持的任何语言构建现代 Web 应用程序和服务。ASP .NET 由 Microsoft 开发,旨在促进动态网页的开发过程,因此大大简化了基于 HTML5、CSS 和 JavaScript 创建网站的过程。
  • 同构(客户端-服务器)框架

    • Meteor JS:是一个开源的、全栈的 JavaScript 框架,用于构建现代 Web 和移动应用程序。它是一个完整的平台,可用于开发、部署和运行应用程序。除此之外,Meteor 还生成可以跨多个平台(包括 Android、iOS 和 Web 本身)的代码。

      • 在服务器端,Meteor 与 MongoDB 集成并遵循协议创建数据库管理机制,使数据更改可以直接传播到客户端,而无需在两端显式编写任何同步代码。
      • 在客户端,Meteor 有自己的模板引擎 Blaze,允许用户从模板中选择用户界面进行定制,从而使前端开发更加容易。它可以与 Angular 或 React 框架集成,无缝生成不需要太多工作的用户界面。
    • Lazo.js:是一个基于 Node.js 的客户端-服务器 Web 开发框架,它的好处是为前端开发人员提供了一个简单且相对熟悉的语法结构,他们可以使用该结构来创建 MVC 结构化 Web 应用程序,这些应用程序被分离为多个复杂的组件组合在一起形成完整的前端。LazoJS 具有提供优化的首页加载的额外好处,这通常是用户体验的关键决定因素。这些好处是通过使用由 Backbone.js、RequireJS 和 jQuery 组成的工具组合来实现的。

    • Rendr:是一个小型库,允许根据正在开发的 Web 应用程序的特定需求在客户端和服务器上运行 Backbone.js 应用程序。这意味着 Rendr 为用户提供了在客户端或服务器端构建整个应用程序的机制,此外还能够在客户端和服务器端分发代码并在两端使用 Rendr。从本质上讲,Rendr 允许的 Web 服务器为应用程序中的任何链接提供完整格式的 HTML 页面,同时保留传统 Backbone.js 客户端 MVC 应用程序的感觉。

软件堆栈

  • 软件堆栈是一组软件组件,它们相互依赖以实现某种目标。软件堆栈通常包括操作系统、数据库、Web 服务器、编程语言和框架。软件堆栈的目标是使开发人员能够专注于应用程序的核心功能,而不是在不同的组件之间进行切换。
  • LAMP Stack 需要同时使用 Linux、Apache、MySQL 和 PHP 来构建应用程序。Linux 是操作系统,Apache 充当 HTTP 服务器,MySQL 提供关系数据库来保存应用程序的信息,而 PHP 是构建应用程序的编程语言。LAMP 是 Web 应用程序通常使用的最早的软件堆栈之一。
  • LNMP Stack 是另一种流行的软件堆栈,它使用 Linux、Nginx、MySQL 和 PHP 来构建应用程序。LNMP 是 LAMP 的替代品,因为它使用 Nginx 而不是 Apache,这是一个更快的 Web 服务器。
  • MEAN Stack 是一种基于 JavaScript 的软件堆栈,它由 MongoDB、Express、Angular 和 Node.js 组成。MEAN 是一种非常流行的软件堆栈,因为它允许开发人员使用 JavaScript 来构建整个 Web 应用程序,而不是使用多种语言。
  • MERN Stack 是另一种基于 JavaScript 的软件堆栈,它由 MongoDB、Express、React 和 Node.js 组成。MERN 是 MEAN 的替代品,因为它使用 React 而不是 Angular,这是一个更流行的框架。
  • ...

关于框架的讨论到此结束,它们如何组合以形成软件堆栈,以及这些堆栈与同构框架的比较。从我们目前的讨论可以明显看出,框架的选择在很大程度上取决于正在开发的应用程序的要求。

使用 Git 进行版本控制

什么是终端?命令行界面是什么?
参考:控制台shell

Git 基本概念:

  • 版本控制:是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
  • Git:是一个开源的分布式版本控制系统,Git 是世界上最流行的版本控制系统。Git 保留对任何项目所做更改的完整历史记录,它使协作更简单、更高效,并且允许同时处理多个功能。
  • 历史记录:是 Git 保存的所有更改的列表。历史记录作用是可以查看项目的历史版本,以及每个版本的更改,便于回溯。
  • 合作:是指多人同时对同一个项目进行开发,这时就需要使用 Git 来进行版本控制,以便保证项目的正常运行。Git 使团队协作变得非常容易并提高了工作效率。
  • 分支:是 Git 用于将项目分成多个独立的部分的工具。分支允许在不影响主项目的情况下进行开发。分支还允许将项目的不同部分分开,以便更容易地进行合并。
  • 仓库:是 Git 用于存储项目的地方。仓库可以是本地的,也可以是远程的。本地仓库是在本地计算机上的 Git 仓库。远程仓库是在其他计算机上的 Git 仓库,通常是 GitHub。

Git 基本操作:

  • 初始化仓库:在命令行界面到项目根目录下,输入命令 git init,即可初始化仓库。

  • 添加文件:输入命令 git add .,即可将项目中所有文件添加到仓库。

  • 提交文件:输入命令 git commit -m "提交信息",即可将项目中所有文件提交到仓库。

  • 查看状态:输入命令 git status,即可查看仓库中文件的状态。

  • 查看历史记录:输入命令 git log,即可查看仓库中文件的历史记录。

  • 恢复到以前的提交:输入命令 git checkout commit_id,即可恢复到以前的提交。

  • 分支操作

    • 创建分支:输入命令 git branch 分支名,即可创建分支。
    • 查看分支:输入命令 git branch,即可查看分支。
    • 切换分支:输入命令 git checkout 分支名,即可切换分支。
    • 合并分支:输入命令 git merge 分支名,即可将分支合并到当前分支。
    • 删除分支:输入命令 git branch -d 分支名,即可删除分支。
  • 远程仓库操作

    • 添加远程仓库:输入命令 git remote add origin 远程仓库地址,即可添加远程仓库。
    • 查看远程仓库:输入命令 git remote -v,即可查看远程仓库。
    • push 推送操作:输入命令 git push -u origin 分支名,即可将分支推送到远程仓库。
    • pull 拉取操作:输入命令 git pull origin 分支名,即可将远程仓库的分支拉取到本地仓库。

Git 基本操作到此结束,想要了解更多 Git 的操作,其他博客文章 Git 基础指令Git 的配置 config。最权威的是 Git 官方文档

软件工程原理

软件过程模型

  • 我们将首先概述所有这些活动都必须包含的四项基本软件工程活动:

    • 软件规范:定义软件的预期功能及其操作的潜在限制,这将是定义要在网站上实现的功能的阶段。
    • 软件设计和实施:将软件规范转换为可执行的软件,这是开发实际应用程序的阶段。
    • 软件验证:验证软件是否符合预期,这是测试应用程序的阶段。
    • 软件维护和迭代:软件维护是指对软件进行维护,以确保其正常运行,软件迭代是指对软件进行迭代,以确保其不断改进。

所有过程模型都可以归类为以下之一:

  • 计划驱动的过程模型 Plan-driven:计划驱动的流程是所有流程活动都预先计划好,并根据该计划衡量进度的流程。
  • 敏捷过程模型 Agile:敏捷流程是一种渐进式计划,更容易根据不断变化的客户需求更改流程。

瀑布模型 (Waterfall Model)

  • 瀑布模型是第一个被提出的软件开发模型,它是一种线性的、顺序的、分阶段的过程模型,它将软件开发过程划分为需求分析、系统设计、编码和测试等阶段,每个阶段都有明确的开始和结束时间,每个阶段的产出物都是下一个阶段的。
  • 瀑布模型主要优点:易于管理,易于理解,易于维护,易于控制,易于测试。这种模式在大型组织中效果最好,这些组织有几个人从事大型项目,这些项目需要详细的文书工作和记录来相互协调。
  • 瀑布模型主要缺点:瀑布模型的主要缺点是它不适合于快速变化的需求,因为它是一种线性的、顺序的、分阶段的过程模型,每个阶段都有明确的开始和结束时间,每个阶段的产出物都是下一个阶段的输入,所以在瀑布模型中,如果需求发生变化,那么就需要重新回到需求分析阶段,重新分析需求,然后再重新进行系统设计,重新进行编码,重新进行测试,这样就会造成大量的重复工作,所以瀑布模型不适合于快速变化的需求。在个人网站或小项目的情况下,这种方法可能会被证明是不必要的细致和无关紧要的,因为在这种情况下不需要保留详细的记录。

增量开发 (Incremental Development)

  • 增量开发方法是一个基本的敏捷过程,它需要交织规范、开发和验证活动。该系统随后被开发为一系列版本或增量,每个版本都向前一个版本添加功能。
  • 增量开发过程中的基本思想是开发网站的初始版本,将其开放给反馈,然后根据此反馈增量开发更新版本。
  • 增量开发的主要优点:它适合于快速变化的需求,增量软件开发比瀑布方法更适合大多数企业和个人系统。这是因为增量开发是一种更直观的解决问题的方式。它相当于通过一系列步骤朝着解决方案前进,在错误上回溯,并迭代地得出解决方案。
  • 增量开发的主要缺点:增量开发的主要缺点是它需要更多的时间来开发网站,因为它需要反复开发和测试,所以增量开发的时间要比瀑布模型长。
  • 增量开发模型是一种更简单的方法,易于实施,并允许进行小规模的高效软件开发。对于不复杂且不需要多组人来处理的网站,这种方法是最合适的,因为它可以同时实现系统的简单性和效率。

面向复用的软件工程 (Reuse-Oriented Software Engineering)

  • 正如我们在框架一章中已经看到的那样,当从事该项目的人员知道与所需内容相似的预先存在的设计或代码时,大多数软件项目都需要一些软件重用。
  • 面向重用的软件工程具有明显的优势,可以显着减少需要从头开始的实际开发,从而确保更快的产品交付。
  • 重用其他软件也意味着需求将不可避免地根据正在使用的软件的具体情况而改变,这些软件可能无法完美地满足正在开发的软件的需求。这也意味着,由于软件的演进取决于其第三方组件的演进方式,因此对软件的演进方式失去了控制。

测试驱动开发 (Test-Driven Development)

  • 测试驱动开发是一种程序开发方法,可以在其中交错进行测试和代码开发。本质上,以增量方式开发代码,同时为每个增量开发一个测试。在开发的代码通过测试之前,不会继续进行下一个增量。

  • 测试驱动开发的核心思想是开发自动化测试,并确保测试通过。测试是使用 API 自动化的,这些 API 可以使浏览器自动化并在无需人工干预的情况下执行测试用例。

  • 一些可能有用的流行测试工具:

    • Selenium:Selenium 是一个用于 Web 应用程序测试的工具。它驱动 Web 浏览器执行特定的动作,然后检查页面的内容以验证它是否按预期工作。
    • Jest:Jest 是一个集成的 JavaScript 测试工具,Facebook 经常使用它来测试其所有 JavaScript 代码,包括 React 应用程序。
    • PyUnit:PyUnit 是一个 Python 的单元测试框架,单元测试针对一小部分代码,例如实现特定功能的方法。PyUnit也称为unittest,支持测试自动化、共享测试设置和关闭代码的能力、将测试聚合到集合中以及使测试独立于报告框架的能力。
    • JUnit:JUnit 是一个 Java 的单元测试框架,它是 Java 的标准单元测试框架。JUnit 与 PyUnit 一样,在测试驱动开发的发展中一直很重要,并且是统称为 xUnit 的单元测试框架家族之一。

关于软件工程原理的讨论到此结束,这可能有助于开发的第一个网站。虽然这里讨论的许多方法可能看起来很直观,但在深入开发应用程序以保持系统性和可管理性之前,心中有一个计划和特定方法是非常重要的。推荐权威网站 MDN Web Docs 可以有助于实践开发 Web 应用程序。