一起玩轉微服務(3)——微服務架構設計模式

一、聚合器微服務設計模式

這是一種最常見也最簡單的設計模式,效果如下圖所示。
聚合器調用多個服務實現應用程序所需的功能。它可以是一個簡單的Web頁面,將檢索到的數據進行處理展示。它也可以是一個更高層次的組合微服務,對檢索到的數據增加業務邏輯後進一步發布成一個新的微服務,這符合DRY原則。另外,每個服務都有自己的緩存和數據庫。如果聚合器是一個組合服務,那麼它也有自己的緩存和數據庫。

二、代理微服務設計模式

這是聚合模式的一個變種,如下圖所示。
在這種情況下,客戶端並不聚合數據,但會根據業務需求的差別調用不同的微服務。代理可以僅僅委派請求,也可以進行數據轉換工作。每個微服務都有自己獨立的緩存和數據庫系統,彼此獨立。

三、鏈式微服務設計模式

這種模式在接收到請求後會產生一個經過合併的響應,如下圖所示:
在這種情況下,服務A接收到請求後會與服務B進行通信,類似地,服務B會同服務C進行通信。所有服務都使用同步消息傳遞。在整個鏈式調用完成之前,客戶端會一直阻塞。
因此,服務調用鏈不宜過長,以免客戶端長時間等待。

四、分支微服務設計模式

這種模式是聚合器模式的擴展,允許同時調用兩個微服務鏈,如下圖所示:
每個調用鏈分別調用自己的服務。當某個調用出現問題時,互相之間不會造成影響。

五、數據共享微服務設計模式

自治是微服務的設計原則之一,就是說微服務是全棧式服務。但在重構現有的“單體應用(monolithic application)”時,SQL數據庫反規範化可能會導致數據重複和不一致。
因此,在單體應用到微服務架構的過渡階段,可以使用這種設計模式,如下圖所示:
在這種情況下,部分微服務可能會共享緩存和數據庫存儲。不過,這隻有在兩個服務之間存在強耦合關係時才可以。對於基於微服務的新建應用程序而言,這是一種反模式。
 

六、異步消息傳遞微服務設計模式

雖然REST設計模式非常流行,但它是同步的,會造成阻塞。因此部分基於微服務的架構可能會選擇使用消息隊列代替REST請求/響應,如下圖所示:
各個服務之間通過異步的消息隊列進行交互,當服務出現問題時,不會造成阻塞,隊列會幫助緩存消息,直到消費服務開始工作。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

大數據篇:一文讀懂@數據倉庫

大數據篇:一文讀懂@數據倉庫

1 網絡詞彙總結

  • 人工智能層的:智慧地球、智慧城市、智慧社會
  • 企業層面的:数字互聯網,数字經濟、数字平台、数字城市、数字政府;
  • 平台層面的:物聯網,雲計算,大數據,5G,人工智能,機器智能,深度學習,知識圖譜
  • 技術層面的:數據倉庫、數據集市、大數據平台、數據湖、數據中台、業務中台、技術中台等等

挑重點簡介

1.1 數據中台

  1. 數據中台是聚合和治理跨域數據,將數據抽象封裝成服務,提供給前台以業務價值的邏輯概念。

  2. 數據中台是一套可持續“讓企業的數據用起來”的機制,一種戰略選擇和組織形式,是依據企業特有的業務模式和組織架構,通過有形的產品和實施方法論支撐,構建一套持續不斷把數據變成資產並服務於業務的機制。

  3. 數據中台連接數據前台和後台,突破數據局限,為企業提供更靈活、高效、低成本的數據分析挖掘服務,避免企業為滿足具體某部門某種數據分析需求而投放大量高成本、重複性的數據開發成本。

  4. 數據中台是指通過數據技術,對海量數據進行採集、計算、存儲、加工,同時統一標準和口徑。數據中台把數據統一之後,會形成標準數據,再進行存儲,形成大數據資產層,進而為客戶提供高效服務。

  5. 數據中台,包括平台、工具、數據、組織、流程、規範等一切與企業數據資產如何用起來所相關的。

可以看出,數據中台是解決如何用好數據的問題,目前還缺乏一個標準,而說到數據中台一定會提及大數據,而大數據又是由數據倉庫發展起來的。

1.1.1 數據倉庫(Data WareHouse)

  1. 數據倉庫,按照傳統的定義,數據倉庫是一個面向主題的、集成的、非易失的、反映歷史變化(隨時間變化),用來支持管理人員決策的數據集合。

為企業所有決策制定過程,提供所有系統數據支持的戰略集合

  • 面向主題

操作型數據庫的數據組織面向事務處理任務,各個業務系統之間各自分離,而數據倉庫中的數據是按照一定的主題域進行組織。

主題是一個抽象的概念,是數據歸類的標準,是指用戶使用數據倉庫進行決策時所關心的重點方面,一個主題通常與多個操作型信息系統相關。每一個主題基本對應一個宏觀的分析領域。

例如,銀行的數據倉庫的主題:客戶

客戶數據來源:從銀行儲蓄數據庫、信用卡數據庫、貸款數據庫等幾個數據庫中抽取的數據整理而成。這些客戶信息有可能是一致的,也可能是不一致的,這些信息需要統一整合才能完整體現客戶。

  • 集成

面向事務處理的操作型數據庫通常與某些特定的應用相關,數據庫之間相互獨立,並且往往是異構的。而數據倉庫中的數據是在對原有分散的數據庫數據抽取、清理的基礎上經過系統加工、匯總和整理得到的,必須消除源數據中的不一致性,以保證數據倉庫內的信息是關於整個企業的一致的全局信息。

具體如下:

1:數據進入數據倉庫后、使用之前,必須經過加工與集成。

2:對不同的數據來源進行統一數據結構和編碼。統一原始數 據中的所有矛盾之處,如字段的同名異義,異名同義,單位不統一,字長不一致等。

3:將原始數據結構做一個從面嚮應用到面向主題的大轉變。

  • 非易失即相對穩定的

操作型數據庫中的數據通常實時更新,數據根據需要及時發生變化。數據倉庫的數據主要供企業決策分析之用,所涉及的數據操作主要是數據查詢,一旦某個數據進入數據倉庫以後,一般情況下將被長期保留,也就是數據倉庫中一般有大量的查詢操作,但修改和刪除操作很少,通常只需要定期的加載、刷新。

數據倉庫中包括了大量的歷史數據。

數據經集成進入數據倉庫后是極少或根本不更新的。

  • 隨時間變化即反映歷史變化

操作型數據庫主要關心當前某一個時間段內的數據,而數據倉庫中的數據通常包含歷史信息,系統記錄了企業從過去某一時點(如開始應用數據倉庫的時點)到目前的各個階段的信息,通過這些信息,可以對企業的發展歷程和未來趨勢做出定量分析和預測。企業數據倉庫的建設,是以現有企業業務系統和大量業務數據的積累為基礎。數據倉庫不是靜態的概念,只有把信息及時交給需要這些信息的使用者,供他們做出改善其業務經營的決策,信息才能發揮作用,信息才有意義。而把信息加以整理歸納和重組,並及時提供給相應的管理決策人員,是數據倉庫的根本任務。因此,從產業界的角度看,數據倉庫建設是一個工程,是一個過程

數據倉庫內的數據時限一般在5-10年以上,甚至永不刪除,這些數據的鍵碼都包含時間項,標明數據的歷史時期,方便做時間趨勢分析。

  1. 數據倉庫,並不是數據最終目的地,而是為數據最終的目的地做好準備:清洗、轉義、分類、重組、合併、拆分、統計等等

通過對數據倉庫中數據的分析,可以幫助企業,改進業務流程、控制、成本、提高產品質量等

  1. 主要解決問題:數據報表,數據沉澱,數據計算Join過多,數據查詢過慢等問題。

防止煙囪式開發,減少重複開發,開發通用中間層數據,減少重複計算;

將複雜問題簡單化,將複雜任務的多個步驟分解到各個層次中,每一層只處理較少的步驟,使單個任務更容易理解;

可進行數據血緣追蹤,便於快速定位問題;

整個數據層次清晰,每個層次的數據都有職責定位,便於使用和理解。

  1. 主要價值體現:企業數據模型,這些模型隨着前端業務系統的發展變化,不斷變革,不斷追加,不斷豐富和完善,即使系統不再了,也可以在短期內快速重建起來,這也是大數據產品能夠快速迭代起來的一個重要原因

總結:數據倉庫,即為企業數據的模型沉澱,為了能更快的發展大數據應用,提供可靠的模型來快速迭代。本文也主要為了講解數據倉庫

  • 數倉硬件架構圖
  • 數倉功能架構圖
  • 數倉流程架構圖1
  • 數倉流程架構圖2
  • 實時數倉流程架構圖

1.1.2 大數據平台(DATA Platform)

  1. 大數據平台則是指以處理海量數據存儲、計算及流數據實時計算等場景為主的一套基礎設施,包括了統一的數據採集中心、數據計算和存儲中心、數據治理中心、運維管控中心、開放共享中心和應用中心。

  2. 大數據平台的建設出發點是節約投資降低成本,但實際上無論從硬件投資還是從軟件開發上都遠遠超過數據倉庫的建設,大量的硬件和各種開源技術的組合,增加了研發的難度、調測部署的周期、運維的複雜度,人力上的投入已是最初的幾倍;還有很多技術上的困難也非一朝一夕能夠突破。

  3. 首先是數據的應用問題,無論是數據倉庫還是大數據平台,裡面包含了接口層數據、存儲層數據、輕度匯總層、重度匯總層、模型層數據、報表層數據等等,各種各樣的表有成千上萬,這些表有的是中間處理過程,有些是一次性的報表,不同表之間的數據一致性和口徑也會不同,而且不同的表不同的字段對數據安全要求級別也不同。

  4. 此外還要考慮多租戶的資源安全管理,如何讓內部開發者快速獲取所需的數據資產目錄,如何閱讀相關數據的來龍去脈,如何快速的實現開發,這些在大數據平台建設初期沒有考慮周全。

  5. 另外一個問題是對外應用,隨着大數據平台的應用建設,每一個對外應用都採用單一的數據庫加單一應用建設模式,獨立考慮網絡安全、數據安全、共享安全,逐漸又走向了煙囪似的開發道路。

總結:大數據平台,即為數據一站式服務,提供可視化的數據展示,提取,計算任務安排,資源管理,數據治理,安全措施,共享應用等等。

  • 平台數據流向圖
  • 平台流程架構圖

1.1.3 數據中台(Data Middle Platform)

  1. 數據中台要解決什麼?數據如何安全的、快速的、最小權限的、且能夠溯源的被探測和快速應用的問題。

  2. 數據中台不應該被過度的承載平台的計算、存儲、加工任務,而是應該放在解決企業邏輯模型的搭建和存儲、數據標準的建立、數據目錄的梳理、數據安全的界定、數據資產的開放,知識圖譜的構建。

  3. 通過一系列工具、組織、流程、規範,實現數據前台和後台的連接,突破數據局限,為企業提供更靈活、高效、低成本的數據分析挖掘服務,避免企業為滿足具體某部門某種數據分析需求而投放大量高成本、重複性的數據開發成本。

總結:厚平台,大中台,小前台;沒有基礎厚實笨重的大數據平台,是不可能構建數據能力強大、功能強大的數據中台的;沒有大數據中台,要迅速搭建小快靈的小前台也只是理想化的。

  • 中台架構圖
  • 阿里數據中台架構圖

2 數據庫的”分家”

隨着關係數據庫理論的提出,誕生了一系列經典的RDBMS,如Oracle,MySQL,SQL Server等。這些RDBMS被成功推向市場,併為社會信息化的發展做出的重大貢獻。然而隨着數據庫使用範圍的不斷擴大,它被逐步劃分為兩大基本類型:

  1. 操作型數據庫(OLTP)

主要用於業務支撐。一個公司往往會使用並維護若干個數據庫,這些數據庫保存着公司的日常操作數據,比如商品購買、酒店預訂、打車下單、外賣訂購等;

  1. 分析型數據庫(OLAP)

主要用於歷史數據分析。這類數據庫作為公司的單獨數據存儲,負責利用歷史數據對公司各主題域進行統計分析;

  • 總結

那麼為什麼要”分家”?在一起不合適嗎?能不能構建一個同樣適用於操作和分析的統一數據庫?

答案是NO。一個顯然的原因是它們會”打架”……如果操作型任務和分析型任務搶資源怎麼辦呢?再者,它們有太多不同,以致於早已”貌合神離”。接下來看看它們到底有哪些不同吧。

因為主導功能的不同(面向操作/面向分析),兩類數據庫就產生了很多細節上的差異。就好像玩LOL一个中單一個ADC,肯定有很多行為/觀念上的不同

2.1 OLAP 和 OLTP簡介

數據處理大致可以分成兩大類:

聯機事務處理OLTP(on-line transaction processing):是傳統的關係型數據庫的主要應用,主要是基本的、日常的事務處理,例如銀行交易。系統強調數據庫內存效率,強調內存各種指標的命令率,強調綁定變量,強調併發操作。

聯機分析處理OLAP(On-Line Analytical Processing):是數據倉庫系統的主要應用,支持複雜的分析操作,側重決策支持,並且提供直觀易懂的查詢結果。 系統則強調數據分析,強調SQL執行市場,強調磁盤I/O,強調分區等。

2.2 定義差別

對比內容 操作型數據庫(OLTP) 分析型數據庫(OLAP)
數據內容 當前值 歷史的、存檔的、歸納的、計算的數據
數據目標 面向業務操作程序,重複處理 面向主題域,分析應用,支持決策
數據特性 動態變化,按字段更新 靜態、不能直接更新,只能定時添加、刷新
數據結構 高度結構化、複雜,適合操作計算 簡單,適合分析
使用頻率 中到低
數據訪問量 每個事務只訪問少量記錄 有的事務可能需要訪問大量記錄
對響應時間的要求 以秒為單位計算 以秒、分鐘、甚至小時為計算單位

2.3 定位差別

對比屬性 OLTP OLAP
代表 Mysql Hive
讀特性 每次查詢只返回少量數據 對大量數據進行匯總
寫特性 隨機、低延遲寫入用戶的操作 批量導入
用戶 操作人員 決策人員
DB設計 面嚮應用 面向主題
數據 當前的,最新的細節,二維表 歷史的,聚集的,多維表
工作單位 事務性保證 複雜查詢
用戶數 上千個 上百萬個
DB大小 100MB-GB 100GB-TB以上
時間要求 具有實時性 對時間的要求不嚴格
主要應用 數據庫:WEB項目 數據倉庫:分析師,挖掘師

2.4 組成差別

對比內容 操作型數據庫(OLTP) 分析型數據庫(OLAP)
數據時間範圍差別 只會存放一定天數的數據 存放的則是數年內的數據
數據細節層次差別 存放的主要是細節數據 也有匯總需求,但匯總數據本身不存儲而只存儲其生成公式。
這是因為操作型數據是動態變化的,因此匯總數據會在每次查詢時動態生成。
存放的既有細節數據,又有匯總數據,對於用戶來說,重點關注的是匯總數據部分。
因為匯總數據比較穩定不會發生改變,而且其計算量也比較大(因為時間跨度大),因此它的匯總數據可考慮事先計算好,以避免重複計算。
數據時間表示差別 通常反映的是現實世界的當前狀態 既有當前狀態,還有過去各時刻的快照。
可以綜合所有快照對各個歷史階段進行統計分析

2.5 技術差別

對比內容 操作型數據庫(OLTP) 分析型數據庫(OLAP)
數據更新差別 允許用戶進行增,刪,改,查 規範是只能進行查詢
數據冗餘差別 減少數據冗餘,避免更新異常 沒有更新操作。因此,減少數據冗餘也就沒那麼重要了

2.6 功能差別

對比內容 操作型數據庫(OLTP) 分析型數據庫(OLAP)
數據讀者差別 使用者是業務環境內的各個角色,如用戶,商家,進貨商等 只被少量用戶(高級管理者)用來做綜合性決策
數據定位差別 是為了支撐具體業務創建的,因此也被稱為”面嚮應用型數據庫” 是針對各特定業務主題域的分析任務創建的,因此也被稱為”面向主題型數據庫”

2.7 OLTP數據庫三範式介紹

  • 定義:範式可以理解為設計一張數據表的表結構,符合的標準級別。 規範和要求
  • 優點:關係型數據庫設計時,遵照一定的規範要求,目的在於降低數據的冗餘性。
    • 十幾年前,磁盤很貴,為了減少磁盤存儲。
    • 以前沒有分佈式系統,都是單機,只能增加磁盤,磁盤個數也是有限的
    • 一次修改,需要修改多個表,很難保證數據一致性
  • 缺點:範式的缺點是獲取數據時,需要通過 Join 拼接出最後的數據。

目前業界範式有:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式 (BCNF)、第四範式(4NF)、第五範式(5NF)。

2.7.1 函數依賴

學號 姓名 系名 班主任 課名 分數
001 張三 古文系 李白 文言文 89
001 張三 古文系 李白 古詩詞 78
001 張三 古文系 李白 現代漢語 65
002 李四 古文系 李白 文言文 45
002 李四 古文系 李白 古詩詞 78
002 李四 古文系 李白 甲骨文 98
003 王五 數學系 牛頓 高等數學 88
003 王五 數學系 牛頓 數學基礎 88
  1. 完全函數依賴:

通過 AB 能推出 C,但是 AB 單獨得不到 C,那麼可以說:C 完全依賴於 AB

(學號,課名)推出 分數,但是 單獨用學號 推不出 分數,那麼可以說:分數 完全依賴於(學號,課名)

  1. 部分函數依賴:

通過 AB 能推出 C,通過 單獨的A 或者 單獨的B 也能推出 C,那麼可以說:C 部分依賴於 AB

(學號,課名)推出 姓名,而還可以通過 學號 直接推出 姓名,那麼可以說:姓名 部分依賴於(學號,課名)

  1. 傳遞函數依賴:

通過 A 得到 B,通過 B 得到 C,但是通過 C 不能得到 A,那麼可以說:C 傳遞依賴於 A

通過 學號 推出 系名,系名 推出 系主任,但是 系主任 不能推出 學號,那麼可以說:系主任 專遞依賴於 學號

2.7.2 三範式區分

2.7.2.1 第一範式:屬性不可切割
  • 不符合第一範式表設計
ID 商品 商家ID 用戶ID
001 5台電腦 小米_001 00001

如上表格不符合第一範式,商品列中的數據不是原子數據項,是可以進行分割的。

  • 符合第一範式表設計
ID 商品 數量 商家ID 用戶ID
001 電腦 5 小米_001 00001

1NF是所有關係數據庫的最基本要求

2.7.2.2 第二範式:不能存在”部分函數依賴”
  • 不符合第二範式表設計
學號 姓名 系名 班主任 課名 分數
001 張三 古文系 李白 文言文 89
001 張三 古文系 李白 古詩詞 78
001 張三 古文系 李白 現代漢語 65
002 李四 古文系 李白 文言文 45
002 李四 古文系 李白 古詩詞 78
002 李四 古文系 李白 甲骨文 98
003 王五 數學系 牛頓 高等數學 88
003 王五 數學系 牛頓 數學基礎 88

如上表格不符合第二範式,比如:這張表主鍵(學號,課名),分數完全依賴於(學號和課名),但是姓名並不完全依賴於(學號和課名)

  • 符合第二範式表設計
學號 課名 分數
001 文言文 89
001 古詩詞 78
001 現代漢語 65
002 文言文 45
002 古詩詞 78
002 甲骨文 98
003 高等數學 88
003 數學基礎 88
學號 姓名 系名 班主任
001 張三 古文系 李白
002 李四 古文系 李白
003 王五 數學系 牛頓
2.7.2.3 第三範式:不能存在”傳遞函數依賴”
  • 不符合第三範式表設計
學號 姓名 系名 班主任
001 張三 古文系 李白
002 李四 古文系 李白
003 王五 數學系 牛頓

如上表格不符合第三範式,比如:學號–>系名–>系主任,但是系主任推不出學號

  • 符合第三範式表設計
學號 姓名 系名
001 張三 古文系
002 李四 古文系
003 王五 數學系
系名 班主任
古文系 李白
古文系 李白
數學系 牛頓

2.8 OLAP典型架構

OLAP有多種實現方法,根據存儲數據的方式不同可以分為ROLAP、MOLAP、HOLAP

名稱 描述 細節數據存儲位置 聚合后的數據存儲位置
ROLAP(Relational OLAP) 基於關係數據庫的OLAP實現 關係型數據庫 關係型數據庫
MOLAP(Multidimensional OLAP) 基於多維數據組織的OLAP實現 數據立方體 數據立方體
HOLAP(Hybrid OLAP) 基於混合數據組織的OLAP實現 關係型數據庫 數據立方體
  1. ROLAP(Relational Online Analytical Processing)

ROLAP架構並不會生成實際的多維數據集,而是使用雪花模式以及多個關係表對數據立方體進行模擬,它的OLAP引擎就是將用戶的OLAP操作,如上鑽下鑽過濾合併等,轉換成SQL語句提交到數據庫中執行,並且提供聚集導航功能,根據用戶操作的維度和度量將SQL查詢定位到最粗粒度的事實表上去

這種架構下的查詢沒有MOLAP快速。因為ROLAP中,所有的查詢都是被轉換為SQL語句執行的。而這些SQL語句的執行會涉及到多個表之間的JOIN操作,沒有MOLAP速度快,往往都是通過內存計算實現。(內存的昂貴大家是知道的)

  1. MOLAP(Multidimensional Online Analytical Processing)

MOLAP架構會生成一個新的多維數據集,也可以說是構建了一個實際數據立方體。事先將匯總數據計算好,存放在自己特定的多維數據庫中,用戶的OLAP操作可以直接映射到多維數據庫的訪問,不通過SQL訪問。(空間換時間,典型代表Kylin)

在該立方體中,每一格對應一個直接地址,且常用的查詢已被預先計算好。因此每次的查詢都是非常快速的,但是由於立方體的更新比較慢,所以是否使用這種架構得具體問題具體分析。

  1. HOLAP(Hybrid Online Analytical Processing)

這種架構綜合參考MOLAP和ROLAP而採用一種混合解決方案,將某些需要特別提速的查詢放到MOLAP引擎,其他查詢則調用ROLAP引擎。上述MOLAP和ROLAP的結合。它提供了更大的靈活度,MOLAP提供提供了更加快速的響應速度。但是帶來的問題是,數據裝載的效率非常低,因為其實就是將多維的數據預先填好,但是隨着數據量過大維度成本越高,容易引起“數據爆炸”。

2.9 OLAP數據立方體(Data Cube)

OLAP(online analytical processing)是一種軟件技術,它使分析人員能夠迅速、一致、交互地從各個方面觀察信息,以達到深入理解數據的目的。從各方面觀察信息,也就是從不同的維度分析數據,因此OLAP也稱為多維分析

很多年前,當我們要手工從一堆數據中提取信息時,我們會分析一堆數據報告。通常這些數據報告採用二維表示,是行與列組成的二維表格。但在真實世界里我們分析數據的角度很可能有多個,數據立方體可以理解為就是維度擴展后的二維表格。下圖展示了一個三維數據立方體:

更多時候數據立方體是N維的。它的實現有兩種方式。其中星形模式就是其中一種,該模式其實是一種連接關係表與數據立方體的橋樑。但對於大多數純OLAP使用者來講,數據分析的對象就是這個邏輯概念上的數據立方體,其具體實現不用深究。對於這些OLAP工具的使用者來講,基本用法是首先配置好維表、事實表,然後在每次查詢的時候告訴OLAP需要展示的維度和事實字段和操作類型即可。

最常見的五大操作:切片,切塊,旋轉,上卷,下鑽。

2.9.1 切片和切塊(Slice and Dice)

在數據立方體的某一維度上選定一個維成員的操作叫切片,而對兩個或多個維執行選擇則叫做切塊。下圖邏輯上展示了切片和切塊操作:

2.9.2 旋轉(Pivot)

旋轉就是指改變報表或頁面的展示方向。對於使用者來說,就是個視圖操作,而從SQL模擬語句的角度來說,就是改變SELECT後面字段的順序而已。下圖邏輯上展示了旋轉操作:

2.9.3 上卷和下鑽(Rol-up and Drill-down)

上卷可以理解為”無視”某些維度;下鑽則是指將某些維度進行細分。下圖邏輯上展示了上卷和下鑽操作:

2.9.4 Cube 和 Cuboid

Cube(或 Data Cube),即數據立方體,是一種常用於數據分析與索引的技術;它可以對原始數據建立多維度索引。通過 Cube 對數據進行分析,可以大大加快數據的查詢效率。

Cuboid 特指在某一種維度組合下所計算的數據。 給定一個數據模型,我們可以對其上的所有維度進行組合。對於 N 個維度來說,組合的所有可能性共有 2 的 N 次方種。對於每一種維度的組合,將度量做 聚合運算,然後將運算的結果保存為一個物化視圖,稱為 Cuboid。

所有維度組合的 Cuboid 作為一個整體,被稱為 Cube。所以簡單來說,一個 Cube 就是許多按維度聚合的物化視圖的集合。

下面來列舉一個具體的例子:

假定有一個電商的銷售數據集,其中維度包括 時間(Time)、商品(Item)、地點(Location)和供應商(Supplier),度量為銷售額(GMV)。

  • 那麼所有維度的組合就有 2 的 4 次方 =16 種
    • 一維度(1D) 的組合有[Time]、[Item]、[Location]、[Supplier]4 種
    • 二維度(2D)的組合 有[Time,Item]、[Time,Location]、[Time、Supplier]、[Item,Location]、 [Item,Supplier]、[Location,Supplier]6 種
    • 三維度(3D)的組合也有 4 種
    • 零維度(0D)的組合有 1 種
    • 四維度(4D)的組合有 1 種

3 數據倉庫的演進

4 數據倉庫主要用途

大家應該已經意識到這個問題:既然分析型數據庫中的操作都是查詢,因此也就不需要嚴格滿足完整性/參照性約束以及範式設計要求,而這些卻正是分析型數據庫精華所在。這樣的情況下再將它歸為數據庫會很容易引起大家混淆,畢竟在絕大多數人心裏數據庫是可以關係型數據庫畫上等號的。

  • 那麼為什麼不幹脆叫”面向分析的存儲系統”呢?

這就是關於數據倉庫最貼切的定義了。事實上數據倉庫不應讓傳統關係數據庫來實現,因為關係數據庫最少也要求滿足第1範式,而數據倉庫里的關係表可以不滿足第1範式。也就是說,同樣的記錄在一個關係表裡可以出現N次。但由於大多數數據倉庫內的表的統計分析還是用SQL,因此很多人把它和關係數據庫搞混了。

4.1 支持數據提取

數據提取可以支撐來自企業各業務部門的數據需求。

由之前的不同業務部門給不同業務系統提需求轉變為不同業務系統統一給數據倉庫提需求,避免煙囪式開發

4.2 支持報表系統

基於企業的數據倉庫,向上支撐企業的各部門的統計報表需求,輔助支撐企業日常運營決策。

4.3 支持數據分析

從許多來自不同的企業業務系統的數據中提取出有用的數據並進行清理,以保證數據的正確性,然後經過抽取、轉換和裝載,即ETL過程,合併到一個企業級的數據倉庫里,從而得到企業數據的一個全局視圖;

在此基礎上利用合適的查詢和分析工具、數據挖掘工具、OLAP工具等對其進行分析和處理(這時信息變為輔助決策的知識);

最後將知識呈現給管理者,為管理者的決策過程提供支持 。

4.4 支持數據挖掘

數據挖掘也稱為數據庫知識發現(Knowledge Discovery in Databases, KDD),就是將高級智能計算技術應用於大量數據中,讓計算機在有人或無人指導的情況下從海量數據中發現潛在的,有用的模式(也叫知識)。

Jiawei Han在《數據挖掘概念與技術》一書中對數據挖掘的定義:數據挖掘是從大量數據中挖掘有趣模式和知識的過程,數據源包括數據庫、數據倉庫、Web、其他信息存儲庫或動態地流入系統的數據。

4.5 支持數據應用

物聯網基於位置數據的旅遊客流分析及人群畫像

通信基於位置數據的人流監控和預警

銀行基於用戶交易數據的金融畫像應用

電商根據用戶瀏覽和購買行為的用戶標籤體系及推薦系統

徵信機構根據用戶信用記錄的信用評估

出行基於位置數據的車流量分析,調度預測

5 數據集市

數據集市可以理解為是一種”小型數據倉庫”,它只包含單個主題,且關注範圍也非全局。

數據集市可以分為兩種,一種是獨立數據集市(independent data mart),這類數據集市有自己的源數據庫和ETL架構;另一種是非獨立數據集市(dependent data mart),這種數據集市沒有自己的源系統,它的數據來自數據倉庫。當用戶或者應用程序不需要/不必要/不允許用到整個數據倉庫的數據時,非獨立數據集市就可以簡單為用戶提供一個數據倉庫的”子集”。

  • 簡單理解:
    • 數據集市:部門級別的數據倉庫,能為某個局部範圍內的管理人員提供服務。
    • 數據倉庫:企業級別的數據倉庫,能為企業各個部門的運行提供決策支持。

6 建模的基本概念

6.1 關係建模

上圖為web應用中的一個建模片段,遵循三範式建模,可以看出,較為鬆散、零碎, 物理表數量多,而數據冗餘程度低。由於數據分佈於眾多的表中,這些數據可以更為靈活地 被應用,功能性較強。關係模型主要應用與 OLTP 系統中,為了保證數據的一致性以及避免 冗餘,所以大部分業務系統的表都是遵循第三範式的。

6.2 維度建模

維度建模(dimensional modeling)是專門用於分析型數據庫、數據倉庫、數據集市建模的方法

上圖為維度模型建模片段,主要應用於 OLAP 系統中,通常以某一個事實表為中心進行表的 組織,主要面向業務,特徵是可能存在數據的冗餘,但是能方便的得到數據。

關係模型雖然冗餘少,但是在大規模數據,跨表分析統計查詢過程中,會造成多表關聯,這會大大降低執行效率。所以通常我們採用維度模型建模,把相關各種表整理成兩種: 事實表和維度表兩種

6.3 維度建模的三種模式

  1. 星形模式

星形模式(Star Schema)是最常用的維度建模方式

可以看出,星形模式的維度建模由一個事實表和一組維表成,且具有以下特點:

  1. 維表只和事實表關聯,維表之間沒有關聯;
  2. 每個維表的主碼為單列,且該主碼放置在事實表中,作為兩邊連接的邏輯外鍵;
  3. 以事實表為核心,維表圍繞核心呈星形分佈;
  1. 雪花模式

雪花模式(Snowflake Schema)是對星形模式的擴展,每個維表可繼續向外連接多個子維表。(三範式代表作)

星形模式中的維表相對雪花模式來說要大,而且不滿足規範化設計。雪花模型相當於將星形模式的大維表拆分成小維表,滿足了規範化設計。然而這種模式在實際應用中很少見,因為這樣做會導致開發難度增大,而數據冗餘問題在數據倉庫里並不嚴重。

  1. 星座模式

星座模式(Fact Constellations Schema)也是星型模式的擴展。

前面兩種維度建模方法都是多維表對應單事實表,但在很多時候維度空間內的事實表不止一個,而一個維表也可能被多個事實表用到。在業務發展後期,星座模式將作為最主要的維度建模。

6.4 維度表和事實表

  1. 維度表(dimension)

表示對分析主題所屬類型的描述。比如”昨天早上張三在京東花費200元購買了一個皮包”。那麼以購買為主題進行分析,可從這段信息中提取三個維度:時間維度(昨天早上),地點維度(京東), 商品維度(皮包)。通常來說維度表信息比較固定,且數據量小。

  1. 事實表(fact table)

表示對分析主題的度量。比如上面那個例子中,200元就是事實信息。事實表包含了與各維度表相關聯的邏輯外鍵,並通過JOIN方式與維度表關聯。事實表的度量通常是數值類型,且記錄數會不斷增加,表規模迅速增長。

  1. 事實維度舉例

昨天我去菜市場買了一隻蝙蝠,然後我就被隔離了。

  • 事實:訂單==>買蝙蝠這個事

  • 維度:

    • 時間==>昨天
    • 用戶==>我
    • 商品==>蝙蝠
    • 地理==>菜市場

6.4.1 維度表

維度表:一般是對事實的描述信息。每一張維表對應現實世界中的一個對象或者概念。 例如:用戶、商品、日期、地區等。

常用於一個客觀世界的維度描述,往往列比較多。

審視數據的角度

  • 維表的特徵:
    • 維表的範圍很寬(具有多個屬性、列比較多)
    • 跟事實表相比,行數相對較小:通常< 10 萬條
    • 靜態表示的,名詞性質的表

6.4.2 事實表

事實表用於正確的記錄既定的已經發生的事實,常用於存儲ID和度量值,各種維度外鍵

事實表中的每行數據代表一個業務事件(下單、支付、退款、評價等)。“事實”這 個術語表示的是業務事件的度量值(可統計次數、個數、件數、金額等),例如,訂單事件中的下單金額。

每一個事實表的行包括:具有可加性的數值型的度量值、與維表相連接的外鍵、通常具 有兩個和兩個以上的外鍵、外鍵之間表示維表之間多對多的關係。

  • 事實表的特徵:
    • 非常的大
    • 內容相對的窄:列數較少
    • 經常發生變化,每天會新增加很多
    • 動態表示的,動詞性質的表
  1. 事務型事實表(每天導入新增)
    • 以每個事務或事件為單位,例如一個銷售訂單記錄,一筆支付記錄等,作為事實表裡的 一行數據。一旦事務被提交,事實表數據被插入,數據就不再進行更改,其更新方式為增量 更新
  2. 周期型快照事實表(每日全量)
    • 周期型快照事實表中不會保留所有數據,只保留固定時間間隔的數據,例如每天或者 每月的銷售額,或每月的賬戶餘額等
  3. 累積型快照事實表(每天導入新增及變化)
    • 累計快照事實表用於跟蹤業務事實的變化。例如,數據倉庫中可能需要累積或者存儲 訂單從下訂單開始,到訂單商品被打包、運輸、和簽收的各個業務階段的時間點數據來跟蹤 訂單聲明周期的進展情況。當這個業務過程進行時,事實表的記錄也要不斷更新。

6.5 數據分層

  • 為什麼分層:
    • 簡單化:把複雜的任務分解為多層來完成,每層處理各自的任務,方便定位問題。
    • 減少重複開發:規範數據分層,通過中間層數據,能夠極大的減少重複計算,增加結果復用性。
    • 隔離數據:不論是數據異常還是數據敏感性,使真實數據和統計數據解耦。

下面列舉常見電商表的分層結構

6.5.1 ODS層

  • 保持數據原貌不做任何修改,起到備份數據的作用。
  • 數據採用壓縮,減少磁盤存儲空間(例如:原始數據 100G,可以壓縮到 10G 左 右)
  • 創建分區表,防止後續的全表掃描

6.5.2 DWD層

DWD 層需構建維度模型,一般採用星型模型,呈現的狀態一般為星座模型。

  • 維度建模一般按照四個步驟: 選擇業務過程→聲明粒度→確認維度→確認事實

  • 選擇業務過程

    • 在業務系統中,挑選我們感興趣的業務線,比如下單業務,支付業務,退款業務,物流 業務,一條業務線對應一張事實表。
  • 聲明粒度

    • 數據粒度指數據倉庫的數據中保存數據的細化程度或綜合程度的級別。

    • 聲明粒度意味着精確定義事實表中的一行數據表示什麼,應該盡可能選擇最小粒度,以 此來應各種各樣的需求。

    • 典型的粒度聲明如下:

      • 訂單中,每個商品項作為下單事實表中的一行,粒度為每次下單
      • 每周的訂單次數作為一行,粒度就是每周下單。
      • 每月的訂單次數作為一行,粒度就是每月下單
  • 確定維度

    • 維度的主要作用是描述業務是事實,主要表示的是“誰,何處,何時”等信息。
  • 確定事實

    • 此處的“事實”一詞,指的是業務中的度量值,例如訂單金額、下單次數等。
    • 在 DWD 層,以業務過程為建模驅動,基於每個具體業務過程的特點,構建最細粒度的 明細層事實表。事實表可做適當的寬表化處理。
事實/維度 時間 用戶 地區 商品 優惠卷 活動 編碼 度量
訂單 件數/金額
訂單詳情 件數/金額
支付 次數/金額
加入購物車 件數/金額
收藏 個數
評價 個數
退款 件數/金額
優惠卷領用 個數

6.5.3 DWS層

  • 統計各個主題對象的當天行為,服務於 DWT 層的主題寬表,以及一些業務明細數據, 應對特殊需求(例如,購買行為,統計商品復購率)。

6.5.4 DWT層

  • 以分析的主題對象為建模驅動,基於上層的應用和產品的指標需求,構建主題對象的全 量寬表。(就是按照維度來決定分析者的角度,如用戶->什麼時間->下了什麼單,支付了什麼,加入購物車了什麼)

6.5.5 ADS層

對系統各大主題指標分別進行分析。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

印度學者:中國築壩正破壞喜馬拉雅生態

摘錄自2018年8月27日中央社報導

印度新德里政策研究中心戰略研究教授切拉尼(Brahma Chellaney)表示,喜馬拉雅生態系統日漸脆弱,雖然在這一地區大規模資源濫採的國家都應受到譴責,「但沒有一個國家像中國,對喜馬拉雅造成如此嚴重的破壞」。

切拉尼撰文寫道,亞洲的未來與喜馬拉雅山的關係緊密,但人類卻大規模建設水壩且肆無忌憚地開採資源,破壞當地生態系統,其中中國透過築壩改造天然河流,卻有愈來愈多工程引水項目集中在國外,而非內部河流。以喜馬拉雅冰川地區來說,目前中國造壩已覆蓋近3/4的青藏高原。

針對中國行徑,切拉尼還指出2點,一是中國想在青藏高原乾旱的北部和西北部製造人造雨,外界擔心此舉會吸走喜馬拉雅其他地區(西藏的降雨集中地)的水分;另一是中國大肆開發礦產資源,如開發銅礦的行動已汙染藏族的Pemako(隱藏的蓮花地)地區。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

載不動聖誕老人 瑞典夏季乾旱 部分馴鹿餓死

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

德鐵挑戰氣候目標 2030年減碳50%、使用70%綠電

環境資訊中心記者 陳文姿報導

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

世界水資源週上談淹水 WWF:自由流動的河很重要

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

大力發展再生能源,希臘渡假勝地蒂洛斯將成地中海首座綠能島

摘錄自2018年8月21日科技新報報導

希臘小島蒂洛斯(Tilos)可說是愛琴海著名渡假勝地,擁有豐富環境生態與優美的海洋景致,而近期該島將透過裝置量達 200KW 太陽光電與 800KW 風能,進一步成為地中海首座 100% 再生能源供電的綠能島嶼。

蒂洛斯島希望能透過綠能達成電力自給自足。目前技術人員則正最終測試再生能源系統,預計將在 2018 年下旬全面上路,屆時該渡假小島將可透過裝置量達 200KW 太陽能、800KW 風力發電與儲存容量(storage capacity)為 2.4MWh 的儲能系統達到 100% 綠能供電。

該島將採用 NaNiCl2 熔鹽儲能系統,可在日照強和風大情況下儲存綠能多餘電力,並於夜間與旅遊旺季等需求量大、發電量較低時釋出電力並維持電網供電,而為提升微電網管理系統,住家與企業也會安裝智慧電錶來計算用電尖峰的時間。

歐盟執行執委會表示,蒂洛斯將成為地中海第一個電力自主的再生能源島嶼,且由於大多海島都難以跟歐洲大陸電網相連,歐盟也打算將蒂洛斯再生能源計畫應用於其他島嶼。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

法英漁船 英吉利海峽爆發大規模衝突

摘錄自2018年8月29日中廣新聞報導

法國和英國漁民為了扇貝捕撈,累積已久的怨恨,瞬間爆發,總共幾十艘漁船,在英吉利海峽上,先是叫罵,丟擲物品,接著彼此衝撞,英國漁船因為數量不敵法國,落荒而逃。英國漁民現在要求政府派軍艦護漁。

英國與法國漁民在英吉利海峽因為扇貝捕撈,引發衝突,導致關係緊張,由來已久,五年前,雙方達成協議,英國同意不使用大型漁船作業,來換取更多的漁權。不過法國有休漁政策,英國沒有,法國漁船每年5月中到10月不能捕撈,英國漁船則全年都可以作業,法國漁民覺得不公平,更讓他們火大的是,英國捕獲的扇貝,大約三分之一出口,其中多數銷到法國。 

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

如果你對自己有要求 | “回顧,再出發”——記2020軟工提問回顧與個人總結

回顧,再出發

項目 內容
這個作業屬於哪個課程 2020春季計算機學院軟件工程(羅傑 任建)
這個作業的要求在哪裡 提問回顧與個人總結
我在這個課程的目標是 完成一次完整的軟件開發經歷
並以博客的方式記錄開發過程的心得
掌握團隊協作的技巧
做出一個優秀的、持久的、具有實際意義的產品
這個作業在哪個具體方面幫助我實現目標 為自己一學期的努力畫上句號
對下一個階段的展望

作業要求:

  • 鏈接到以前提問題的博客
  • 請嘗試對自己曾經提出的問題進行解答,並闡明,是如何通過看書,實踐,或者討論弄清楚的。
  • 是否原來的問題還不明白?如果有,請分析。
  • 是否產生了新的問題?如果有,請提出。
  • 軟件工程這門學問有很多 “知識點”, 這門課強調 “做中學” – 在實踐中學習知識點。
    • 請問你們在項目的 需求/設計/實現/測試/發布/維護階段(一共6 個階段)中都學到了什麼“知識點”,每個階段只要說明一個知識點即可。
  • 結合自己在個人項目/結對編程/團隊項目的經歷,談談自己的理解或心得。

​ 2020年3月3日下午16:48,在博客園發表了本學期軟件工程的第零篇博客——停下來,回頭看 ——記2020BUAA軟工第一次作業-熱身! ,1萬5千字的長文收穫了1256次閱讀和6個評論,其中ScalersTalk作者Scalers專門註冊了博客園在我的評論下方留言回復2500字,令我備受鼓舞,還有鄒欣老師和寶玉老師的建議我牢記在心,mio4學長的經驗之談也對我很大啟發。懷着對所有閱讀過我的文章和評論我的文章的人的感激,踏上了軟件工程的學習道路。

​ 2020年3月8日臨晨2點56分,發出了軟件工程這門課正式的第一篇博客——初窺構建之法——記2020BUAA軟工個人博客作業 ,這片博客中都是在閱讀完鄒欣老師的《構建之法》后,對書中存疑的地方提出的問題,並加入自己的思考和理解。這片博客收穫了594次閱讀9條評論,有其他學校的軟件工程老師,還有仰慕已久的SivilTaram學長在我的博客下留言。最令我沒有想到的是,負責鄒欣老師的《構建之法》和吳軍博士的《浪潮之巔》出版的周筠老師聯繫了我,加了我的微信,帶我走進了大神們的世界,周筠老師的群聊中有吳軍博士,有輪子哥,還有各行各業的優秀人士,看着他們在群里的討論愈發能夠感受到自己所學和認識的狹隘,除了自己的學習之外,還需要更多的與優秀的人的交流,在交流中增長自己的眼界。為了完成這篇博客,我將《構建之法》每一個章節都進行了閱讀,書中還有很多博客的鏈接我也大多點開來看,對於提出的問題也事先在網上做了充分的調查和搜尋,給出了自己的理解和嘗試性的解答。雖然一周的閱讀時間很短,但是這個過程真的十分漫長,看完《構建之法》感覺自己在理論上已經開始嘗試着從軟件工程的思維去思考問題。特別是對PM的章節,除了書之外還搜索了很多地方關於Program Manager和Product Manager的區別,並嘗試着將自己代入體驗。

​ 2020年3月10日下午18:59,發布了“深度評測官”——記2020BUAA軟工軟件案例分析作業,對候選素材中最難啃的OCR識別表單的開源工作進行了測評,做第一個吃螃蟹的人,後面總結了經驗推廣開來,陸續也出現了幾篇OCR的測評,收穫了1754次閱讀,成為了後面團隊開發時的產品介紹。在這次作業中,開始體會軟件之間的差異,開發軟件需要側重什麼,什麼樣的軟件是一款優秀的軟件。

​ 2020年03月21日,我和我的組員拼裝成了一個團隊,並給我們的團隊發布了第一篇博客——“介紹一下自己吧”——記2020BUAA軟工團隊介紹和採訪:

我們是 BUAA軟軟軟件工程小隊 ,簡稱 軟軟軟,但是大家也可以看到我們的博客的 TITLE 是 HARD_CORE_SE,指的是 “硬核的軟件工程” ,軟軟軟其實是希望我們遇到硬核的軟件工程也可以 化硬為軟,直面困難,在我們的眼裡沒有 硬核 二字,一切困難在團隊面前都是紙老虎!
雖然我們都沒有大型的工程經驗,是一直拼裝起來的軍隊,但是我們相信通過我們團隊的配合一定能夠在軟件工程這門課中發揮出色,不只是取得成績,而且能做出像樣的、能流傳的、實用的項目出來。

​ 雖然當時我們還沒有選好題目,但是我們核心的目標已經確定——做出像樣的、能流傳的、實用的項目出來。

​ 2020年4月1日,我們團隊發布了項目選擇博客——“媽媽再也不用擔心我忘交作業了!”——記2020BUAA軟工團隊項目選擇,結合本學期的疫情分析了同學們的痛點,決定開發一款幫助同學規劃提醒日程的Web應用,而我作為想出這個點子的人,對這個應用有什麼頁面,有什麼功能,能夠實現什麼最為清楚,因此成為了團隊的負責人。

​ 2020年5月5日,修復完所有的Bug、走過不知道多少次流程,我們確定首次公開發布我們的產品——DDLKiller,一款專門面向北航本科生設計的日程提醒助手,並在朋友圈,班級微信群,QQ群等小範圍內進行推廣:

​ 從後台統計數據來看,發布第一天註冊用戶達到77人,第二天達到148人,僅僅使用两天的時間就已經超額完成預期的100人,並且從反饋來看,同學們對這一款簡潔美觀、功能強大的日程管理助手非常滿意,並且积極給我們提供反饋意見,幫助我們在Beta階段做的更好。

​ 第一次發布說實話是非常忐忑的,我們熬了無數個夜晚,開了無數的視頻會議,做了無數次測試的軟件,突然開放給大家,不知道大家是喜愛,還是無感,我們當天晚上守在後台,看着註冊登錄的日誌,看着註冊的人數一個一個往上漲,一個一個開始新建事項,使用我們的功能,守到過了午夜1點仍然沒有異常,我們的心才放了下來,大家相互鼓勵,洗洗睡了。

​ 2020年6月2日,又經過一輪的迭代,我們發布了Beta版本的DDLKiller,雖然是6月2日發布,但是用戶們早已體驗過新的功能,結合很多人性化的新功能進行二次推廣,用戶量達到240人,相比Alpha階段增長90人。後來經過最後一次項目展示答辯,我們的軟件工程這門課程,結束了。

​ 但DDLKiller還沒有結束,就像我們UltraSoft – Beta – Postmortem事後分析中所說的:

BUAA – UltraSoft – 軟軟軟小組 2020春大三下學期的軟件工程, 全劇終。

但我們DDLKiller的故事還在繼續,不要走開,馬上回來

​ 我們還留了兩個功能沒有實現,我們感受到了大家對客戶端和小程序的呼聲,我們希望在自己的大學生涯中,甚至在未來的生活中,依然繼續使用這款我們親手打磨,親手建設的產品,說實在的,我們還挺不捨得的。雖然在專業人士的眼中看來這個實現非常簡單,可能一個前端大神两天就能做完的事情,一個後端大神一天就能寫完的東西,我們卻花了整整一個學期。

​ 可是,我們在這個學期裏面不是學習的如何寫前端,如何使用Vue,不是學習如何寫後端,如何使用Django,我們團隊的賬號發表了39篇博客,技術博客都是在我們的個人賬號中發表,這說明什麼,團隊博客中所記錄的,是實實在在的軟件工程。那一篇篇設計與規劃、Scurm Meeting、發布說明、測試報告、項目展示、事後分析,是DDLKiller像一個新生兒一樣,成長的記錄。

​ 我們學會了團隊成員之間如何高效合作,我們學會了如何使用Github、Gitee管理團隊項目,我們學會了使用MockPlus設計產品原型,我們學會了如何權衡需求和實際。確實專業的工程師照着我們的網站實現一個是很快,但是他可能很難做到從0到1的過程。他沒有進行痛點的分析,他不知道用戶真正需要什麼,他沒有一個需求和實際使用之間的權衡,他的開發確實了團隊協作的樂趣。

​ 說實話剛開始團隊開發的時候我還是不習慣多人協作,覺得一個人做完了事就可以省去交流的時間,後來我才發現不是我不會開發,是我不會交流。我們團隊後期自研創新的交流方式非常高效,一個石墨文檔把鍋和坑明確到人,每個人不需要問自己需要干什麼,還可以干什麼;一天十幾個小時在線的騰訊會議,有問題直接進來說,語音來的總比打字快,共享屏幕來的總比截圖直接。大家高效交流之後整個難度就下來了,只要說好了誰負責開發什麼模塊,最晚什麼時候需要驗收,還有不懂的我們共享屏幕聊,幾乎不會產生歧義或者推鍋的情況出現。作為一個PM我的體會最深:在Alpha階段的前期由於缺乏有效的溝通,PM和組員都很累,每個人都有點不清楚自己要干什麼,我知道大家要干什麼卻不能很好布置下去,每天群里的提問和回答帶來的卻只有效率的低下,我也想着自己一個人做好就算了,要那麼多人干什麼,但也發現自己越是想全部做完做好越是什麼都做不完做不好。這是一段非常難忘的經歷,是軟件工程這門課提供給我的,給了我一個在步入社會前體驗社會毒打的經歷,幸好是在課內體會到的,不至於“死”得太慘。

​ 回首望去,覺得這學期很長,也不知道是不是疫情在家的緣故,還是無窮無盡的騰訊會議的緣故,雖然只過了3個月,但是感覺自己做了很多事情一樣。3個月後再看自己的第一篇博文,確實有了些不一樣的體會。

回答自己

​ 在初窺構建之法——記2020BUAA軟工個人博客作業中,我提出了七個小問題,其實在當時已經回答的差不多了,但現在有了一定的軟件工程經驗之後,又有了一點小的看法。

問題一:是否真的沒有銀彈

​ “把重點放在質量上,生產力將隨之而來”,這是Jones的觀點。基於這個觀點我當時提出了這樣的觀點:

我之所以對銀彈是否存在持有懷疑態度是因為在大環境下,有一些本可以提高的生產力沒有提高,還有很多團隊會出現文檔與實現分離的情況,出現進度卡在某一個人負責的環節的情況,這些情況都是我們會在後續的團隊編程中可能會遇到的,所以我覺得現在就應該思考,如何在團隊中破除沒有銀彈的詛咒,提升團隊的整體水平和能力。

​ 我們團隊的生產力就有一個拐點,從一開始的效率低下到後來的慢慢摸索再到後來形成體系之後組員們心照不宣。是否真的沒有銀彈?我們組可能找到了自我協作的方式,充分將每個人的能力在其崗位上發揮,做到了效率的最大化和能力發揮的最大程度,整體生產力得到了提高,是否一定程度上找到了銀彈?

​ 其實大家都在尋找屬於自己的“銀彈”,我看到每個小組都有自己組內的成熟的管理機制和協作方法,大部分是Github的Issue和Pull Request,還有一個Github的看板,還有一些在線文檔。並沒有說Github上面使用的管理方式就比石墨文檔更有技術,我們團隊覺得上Github的速度太慢,石墨文檔就能很好的解決我們的問題,也可以定位到人,還有具體的任務細節:

Beta階段開發明顯更加得心應手一些,外加Gitee上面的清晰的Issue和Pull Requests:

無論是對內的石墨文檔還是對外的Gitee,都對我們的實際開發極大提高了生產力。

問題二:如何選擇合適的團隊模式

當時鄒欣老師給到我的回答是:

想請教老師和助教,業餘劇團模式的具體形式能夠結合助教的經歷或是老師的觀察給一個更加清晰的講述嗎?

就是大家可以選擇各種角色來扮演, 在下一個項目中,又可以有全新的分配方式。
你們就是用‘業餘’ 時間來開發的, 比較適合這樣的模式。

​ 在實際的開發中,我們確實也是業餘劇團的模式,大家先分好了大方向,前端和後端,然後分配一個模塊的任務吧,如日曆視圖、課程視圖等,如數據庫、爬蟲等,在實際的開發中,主體上不太發生改變,在細分的任務上比較靈活自由。特別是在Alpha發布之後,項目已經成型,大家已經不再限制於模塊的開發,細化到功能的開發,比如要實現一個快速創建的功能,可以在日曆中,也可以在日程列表中,兩個都進行添加。甚至前端的同學可以來優化一下後端的代碼,後端的同學學習一下前端的實現,都是“互通有無”的。

問題三:每日例會的效果如何?

在這個問題下面我當時又提出了一個問題:

敏捷開始是否是一個偽命題?

當時找到了Vczh輪子哥的回答:

敏捷不是一群開發者對着甲方的第一版需求猛做幾天,而是在做的過程中始終和甲方進行有效的、不間斷的溝通,來幫助甲方更加清晰地認清自己的需求,也幫助整個團隊確定一個當前的完成進度,也就是一個迭代中的需求分析和驗收

​ 經過兩輪的迭代和20餘次的Scrum Meeting,感受到了一些敏捷開發的意義:雖然我們沒有甲方,但是我們自己就是自己的甲方,我們不斷反省和思考着自己需要什麼功能,自己不需要什麼功能,認清自己的需求,掌握團隊的進度,不斷驗收。

​ 每日例會一開始是拒絕的,我們在Alpha階段還弄錯了例會的時間,導致缺少兩篇,覺得這些東西在Github上都有,為什麼還要記錄呢?後來其實發現每日例會重要並不在於記錄,其一在於每日隱隱地督促着每一個成員,“今晚要彙報,自己做了什麼?”;其二在例會,一個常規的,團隊的固定“節目”,有例會才像是一個成熟的團隊而不是一個個散兵,在例會中大家可以找到歸屬感,大家可以有問題在例會中大膽提出來,有什麼想法提出來大家一起實現,有什麼功能其實沒有什麼用大膽刪去,例會還是一個平台,提供給大家自由說話、表達意見和想法的平台,在例會中每個人都有說話的權利,每個人的話都能被所有人所聽見,這是我理解的每日例會的意義。至於效果,見仁見智吧,我們團隊的例會效果我還是比較滿意的,大家都有準時參与,都敢說,都是為了我們DDLKiller更好的發展去說。

問題四:為什麼除了微軟很少見到Program Manager

​ 當時我其實沒有找到這個問題合適的答案,也是遺留了下來,自己作為這個學期軟軟軟團隊的PM,無論是Product Manager也好還是Program Manager也好,談一下自己的看法。

​ 很多地方都在吐槽產品經理,說產品經理不管需求是否能夠實現,產品經理是程序員的天敵諸如此類,無非就是在說產品經理不動技術,只懂調研和分析需求。作為我們團隊的PM,我也參与了調研,我也確定了產品的需求,但我也在我的崗位——後端、部署、測試上工作,所以當我有新的需求的時候,作為一名程序員,我也會要麼憑藉自己的經驗對需求的實現難度進行預估,要麼根據已經實現了的功能對需求進行預估。比如臨時加入一個消息中心,我其實也是從前端小白到了解了一點前端的知識,我知道這個功能並不麻煩,前後接口一設置分別實現就行了,所以大膽的安排了下去這個臨時的任務,我得力的組員也很快完成了,經過我的連接和測試,一天內用我們的“業餘”時間就上線了這個功能,提供了極大的便捷。

​ 至於為什麼除了微軟很少見到Program Manager,希望我能夠親身去微軟和其他公司體驗一下吧。

問題五:對於小團隊而言小強地獄是否可行?

​ “小強地獄”聽着特別可怕,但其實在我們的實際開發中沒有太多遇到,首先是代碼總量不大,經過幾次定位就可以找到問題所在;其次是我們保證了合併進入主分支錢經過“充分”的測試,這裏的充分之所以打上引號是因為100%的充分並不存在,就像我們的同步課程中心的爬蟲核心功能,在我們團隊的幾個人的賬戶上測試都沒有出現問題,結果小範圍的內測立刻炸鍋,趕忙修復然後加大內測的範圍,在幾輪的測試都無誤之後我們才正式上線功能,這也是為什麼我們發布比較晚的原因。

​ 我們團隊也並沒有測試這個職位,大家前端和後端自己先測試自己的代碼,然後連接的時候再測試連接的代碼,不需要不參与開發的人去讀代碼,只要提供充分的測試樣例就行了。小團隊連開發都人數有些不夠,在項目的尾期設置專門進行覆蓋性測試的測試人員即可,這種開發方式在我們的項目中並沒有出現什麼大礙,所以小強地獄這種東西,只是一個提出來的權衡feature和bug的模式,每個團隊可以根據自己的實際情況進行調整。

問題六:迷思之六:技術的創新是關鍵?

​ 我們的項目有創新嗎?可以說有:我們使用郵件給用戶進行提醒,只要有網就能收到提醒;也可以說沒有,有一部分的用戶是被我們的美觀的界面吸引過來的,可能並沒有使用郵件的功能,而且其實我們的產品有類型的原型——Microsoft的ToDo。但是我們創新性地將同學們的所需以一個更好的形式呈現了出來,進行了高度集成再展現的過程,這也不失為一種創新。

​ 我們在開發的時候想過創新嗎?說實話我沒有。用戶在使用到這樣一款產品的時候會主動想到有什麼創新嗎?可能也沒有。無論是開發者還是使用者,大家都在關注一樣東西——是否解決痛點。我們可能從來沒有想過郵件提醒是一種創新,靈感來源於博客園的作業提醒,我們想的是如何解決用戶沒有在日程的DDL前被提醒的痛點,郵件只是解決這個痛點的一個可行方式罷了。

​ 我不是在否認創新的重要性,只是在說有的軟件可能目的不在於創新,也能夠贏得大家的喜愛。新鮮感固然是好東西,但是新鮮感不能持久,當新鮮感褪去,用戶是否還會對我們的產品滿意?是否會選擇其他更具有新鮮感的東西?這些是根據用戶的需求是否被解決所決定的,也是一個產品的核心部分,真正被考量的部分。

問題七:最難的問題——排座次

​ 當時提出這個問題時,還是太嫩了,其實排座次在實際執行起來是整個開發中最簡單的事情,就像鄒欣老師說的,有的人想得60分有的人想得90分,根據大家的Pull Requests和實現的功能的工作量就可以看出來。我們團隊的成員大家都非常积極,甚至主動找我領取任務,所以在最後的打分大家都差不多;其他組比如NAG2020就可以看到,其中有一名成員就是想拿60分的,兩個階段的貢獻分都是最低,代碼貢獻也是最少,自然就給了最少的分數。

​ 使用Gitee、Github等項目管理軟件之後,每個人的积極程度、活躍程度、項目的貢獻量都一目瞭然,所以排座次的問題,客觀公平公正得到了解決。

新的問題

​ 疫情之下,我們體驗到了全新的軟件工程,可能我們是唯一一屆在線上開展軟件工程這門課的學生,我們線上開會,線上協作,線上發布,線上展示。Work From Home 成了疫情中主流的工作方式。之前看到Vue的開發團隊就是分佈在世界的各個角落,線上交流和協作維護,他們已經形成了一種十分成熟的WFH的工作方式。

​ 試想,在WFH是否會成為未來的發展方向?特別是對於程序員而言,WFH其實可以在不影響開發的前提下能節省很多的時間,如通勤等等,很多大公司已經或者開始嘗試WFH,包括美國的巨頭Google、Facebook、Twitter等等,請問老師和助教覺得,本學期的WFH與之前學期的線下軟工有什麼區別,有意料之外的提高嗎?

“做中學”

需求階段

學會取捨:衝刺只有兩周,而且我們是業餘開發,所以不可能將所有的功能都實現,甚至在Alpha階段我們僅有的反饋中有一項是希望在課程列表中加入測試模塊,這個想法在Beta設計與規劃前是列入到了Todo List中的,然而在Beta設計與計劃實際的權衡中我們將其丟棄了,替換為了課程的通知,因為通知使用的更多,幾乎每門課都有,而測試只有少量的一兩門課有。

設計階段

顏值即正義:一款顏值高的產品不一定是最好的但一定是最吸引用戶的,我們的Web程序也是因高顏值吸引了不少用戶,大家對於課程中心陳舊的排版感到視覺疲勞的時候看到我們的產品會眼前一亮從而想要體驗,這是在推廣階段特別重要的一點。

實現階段

考慮可擴展性、注意代碼風格:以我負責的後端爬蟲來說,從開始時的只爬取課程作業和課程資源到迭代中加入爬取課程通知再到期末季中爬取考試日程安排,這幾樣東西應該做到合理歸類與分離,以免造成代碼太過臃腫接手的人難以及時上手。

測試階段

回歸測試和覆蓋測試的重要性:在發布新功能時,要一併考慮到舊有功能是否正常運行,我們在迭代中就遇到這樣的問題,比如在Beta階段我們支持了重複日程的提醒,向日程中加入了字段 repeat,然而我們只測試了常規的添加日程,沒有考慮下方的快速添加日程和模板添加日程,導致發布之後出現內部錯誤,檢查日誌才發現錯誤所在然後緊急修復。如果每個新功能在發布的時候都能夠有回歸測試則可以避免這一問題。

發布階段

漸進式發布:當一個應用的新功能準備發布的時候,會進行一些測試,比如灰度測試,即選取一小部分用戶可以體驗到該功能,其他用戶維持原來的功能不變,以查看新功能的運行效果和用戶反饋意見,在我們的開發中,我們有多台主機可以進行訪問,所以會先使用其他主機的ip訪問使用“內測版本”的DDLKiller,然後過一段時間再發布。在Alpha的正式發布前我們也做了小範圍的內測,讓一些自己的舍友和朋友先使用,看看有沒有問題,還有么改進的地方,確實內測找出了一些問題,幫助我們在正式發布的時候減少很多事情。

維護階段

文檔文檔文檔:經驗教訓是有心東西一定要以文字的形式在文檔中呈現,首先是提高了團隊內部的溝通效率,大家不用反覆詢問可以直接查閱文檔,其次是積少成多,為後面接手的同學做充足的準備。特別是前後端分離的團隊開發,只要文檔維護得好,直接事半功倍,反之事倍功半。

理解、心得

​ 個人項目->結對項目->團隊項目,是一個課程組有意設計的一個遞進的關係,在這一點上我覺得羅老師和任老師班級的軟工做的最好,相比於歐陽老師班級的個人項目直接到團隊項目,我們中間有一個過渡期,很多人其實在過渡期的時候就知道自己想要干什麼了,大致可以分為前端和後端了,這樣一來在團隊中的項目分工也簡便了很多。

​ 在個人項目中,我們實現了一個求交點的程序,沒有頁面显示,只有命令行的交互;在結對項目中,我們加大了求解交點的難度,同時用圖形化的界面將交點的位置呈現在了眼前;在兩個衝刺,前後兩個月的團隊項目中,我們分工更加細緻,實現了一個軟件。一步步走來,感覺越來越難了,但是也越來越簡單了。難在項目確實更大,從技術上來說難度確實增大了;簡單在我們不是一個人在戰鬥了,我們身邊從沒有人到一個人再到一群人,集體的力量是不容小覷的,每個人都有自己擅長的部分,這一點感觸特別深。在團隊中,一個人花了很久不能解決的事情,丟出來大家都积極主動伸出援手,一起將困難啃下來;在這個學期學習是在很累的時候,也是我們團隊的成員陪伴着我,在此感謝陪我熬夜最多的Kkkk,有時候大家就算不需要說話,只要會議室裏面有人,心靈就能得到慰藉——“我背後還有一個團隊”。

​ 在團隊項目中,我既是PM又是後端開發,還負責部署,這個工作可能比有的團隊PM只負責文書麻煩一些,但也暴露出來了一人多職的缺點。由於Alpha階段對時間的理解錯誤外加新項目開發難度大,導致Scrum Meeting有一兩次開會了但是沒有及時記錄導致會議紀要缺失的情況,還有就是寫完代碼之後沒時間寫文字了於是產生拖延,這一部分應該專人來記錄會好一些。在團隊項目階段確實學習到了很多新知識,無論是Django開發還是NGINX部署,都需要啃官方文檔,特別是NGINX和Uwsgi的兩個官方文檔還有不清楚的地方需要自己解決,在五一的五天假期連肝五天才總算把前後端連接和服務器部署徹底啃下來,終於在五一假期的尾聲進行小面積的推廣。這也讓我對網絡與系統這一方面產生了興趣,在暑假期間我會嘗試涉獵一些分佈式和網絡編程相關的內容,如果感興趣的話希望有機會往這方面發展下去。若是因軟件工程這門課能夠找到我自己的真實興趣所在,也是太值得了。

​ 作為PM,特別感謝我的軟軟軟團隊的隊友們,包括Alpha階段結束之後轉走的Dz,一樣非常感謝。是你們一起幫助我完成了我的一個想法,讓他不再是一個想法,成為了一個真正能夠使用,大家都可以使用,甚至受到好評的一款軟件。其實DDLKiller是我實在找不到一款可以提醒我日程的軟件下的“被迫選擇”,想要一款DDLKiller這個念頭在我剛開學的時候就有了,當時和舍友嘗試了Tower協作也不好用,嘗試了Microsoft的Todo也不好用,自己又開發不了,但是居然在團隊開發中被我們做出來了,和我預想的完全一致,甚至某些功能超出預期。是你們讓我第一次體會到想法到實現的喜悅,第一次切身體會到代碼的魅力,第一次感受到團隊的強大,體會到1+1+1+1+1+1+1>7。DDLKiller就是我的軟軟軟團隊的孩子,離不開每一個人的付出。

​ 我們在第一篇自我介紹中說到:

雖然我們都沒有大型的工程經驗,是一直拼裝起來的軍隊,但是我們相信通過我們團隊的配合一定能夠在軟件工程這門課中發揮出色,不只是取得成績,而且能做出像樣的、能流傳的、實用的項目出來。

​ 至少在我自己看來,我們已經成功了。

最後想說的

​ 大概的都說的七七八八了,若是要用幾個詞語總結這學期的軟件工程課程的話:

魔幻、刺激、充實、欣慰

​ 在每次的個人作業前面老師都讓我們寫下這門課程的目標,我寫的是:

完成一次完整的軟件開發經歷
並以博客的方式記錄開發過程的心得
掌握團隊協作的技巧
做出一個優秀的、持久的、具有實際意義的產品

​ 現在看來,我都已經做到了:

  • 一次完整的軟件開發經歷:從使用MockPlus畫出草圖,到真正用網址就能訪問

  • 博客團隊的開發:39篇團隊博客就在BUAA軟軟軟件工程小隊中

  • 團隊協作的技巧:我們甚至自研了石墨文檔+騰訊會議的創新性協作方式

  • 優秀的、持久的、具有實際意義的產品:DDLKiller——懂你的日程管家

    從UltraSoft – Beta – Postmortem事後分析中摘取一段話出來:

如果下一年有學弟學妹問我:軟件工程哪個老師的課好?

我會如實回答:如果你對自己有要求,如果你想這個學期不碌碌無為,如果你想學期結束收穫滿滿,如果你想逼自己一把,選擇羅傑、任健老師的班級吧。過程會很痛苦,你會看到別人都在玩的時候你在寫博客,你會看到別人開發的時候你在寫博客,你會看到別人只開發一次就結束的時候你在寫博客,你在開例會,你在Beta階段開發,但是當你的博客得到了老師的認可,得到了助教的讚賞,得到了《構建之法》作者鄒欣老師的點評,得到了輪子哥Vczh對你的提問的親自回復,得到了《持續行動》《刻意學習》作者Scalers為你特地開賬號的留言,你會感覺,這一切都值了。

​ 慶幸當初的自己沒有聽到負面的評論就退縮,堅持選擇了羅老師和任老師的班級,做出了像樣的東西。我確實心裏吐槽過博客,用心寫真的很累,每次博客能花上3~5個小時,每次都是動輒上萬字,但是確實寫完之後獲得了有意義的評論和建議心裏特別舒服,讓我受寵若驚的是第一次的Scalers為我註冊博客園賬號留言7500字,讓我感覺到自己的博客沒有白費。自己也是北航面向對象課程的助教,也能夠一定程度上理解老師和助教的良苦用心,很多東西學生在做的時候是會不理解甚至罵出聲的,但是做完之後又是另一種感受了,老師和助教只能委屈成為暫時的惡人,逼着同學去思考,逼着去寫下文字,逼着做看不到短期利益的事情,等待着一切都結束時候的理解。

​ 軟件工程這門課雖然結束了,但我們的軟件開發依然在繼續,回顧,為的是更好的出發。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

聚甘新

Python 為什麼推薦蛇形命名法?

關於變量的命名,這又是一個容易引發程序員論戰的話題。如何命名才能更具有可讀性、易寫性與明義性呢?眾說紛紜。

本期“Python為什麼”欄目,我們將聚焦於變量命名中的連接方式,來切入這塊是非之地,想要回答的問題是——Python 為什麼要推薦蛇形命名法?

首先一點,對於單個字符或者單詞 (例如:a、A、PYTHON、Cat),當它們被用作變量名時,大致有全小寫、全大寫和首字母大寫這幾種情況。編程語言中出現這些情況時,它們基本上跟英語的表達習慣是相同的。

但是,編程語言為了令變量名表達出更豐富的含義,通常需要使用多個單詞或符號。 英語習慣使用空格來間隔開單詞,然而這種用法在編程語言中會帶來一些麻煩,所以程序員們就創造出了另外的方法:

  • 蛇形命名法(snake case)
  • 駝峰命名法(camel case)
  • 匈牙利命名法(HN case)
  • 帕斯卡命名法(Pascal case)
  • 脊柱命名法(spinal case)
  • 自由命名法(studly caps)
  • 駝峰蛇形命名法

總體而言,這些命名法都是要克服單詞間的空格,從而把不同單詞串連起來, 最終達到創造出一種新的“單詞”的效果。

我畫了一張思維導圖,大略區分了這幾種命名法:

如果按照受眾量與知名程度排名,毫無疑問排前兩位的是駝峰命名法和蛇形命名法。

我們可以簡單比較一下它們的優缺點:

  • 可讀性:蛇形命名法用下劃線拉大詞距,更清楚易讀;駝峰命名法的變量名緊湊,節省行寬
  • 易寫性:駝峰命名法以大小寫為區分,不引入額外的標識符;蛇形命名法統一小寫,輸入相對方便
  • 明義性:對於某些縮寫成的專有名詞,例如 HTTP、RGB、DNS等等,一般習慣全用大寫表示,但是如果嚴格遵循這兩種命名法的話,須得只留首字母大寫或者全小寫,這樣對原意都會造成一些“破壞”,有時候甚至讓人感覺到彆扭。如果保留全大寫,IDE 可能識別不準,反而會出現波浪提示

由此可見,它們各有優缺點,但哪一方都不具有壓倒性。我個人稍微偏好於蛇形命名法,但是在需要用駝峰命名的時候(比如寫 Java 時),也能無障礙切換。

需要指出的是,Python 也推薦使用駝峰式命名,那是在類名、Type 變量、異常 exception 名這些情況。而在包名、模塊名、方法名和普通變量名 等情況,則是推薦用蛇形命名(lower_case_with_underscores)。

那麼,為什麼 Python 會推薦用蛇形命名法呢?

最大的原因是歷史原因。 蛇形命名方式起源於 1960 年代,那時它甚至還沒有特定的名稱。Python 從 C 語言中借鑒過來后,給它起名為“lower_case_with_underscores”,即帶下劃線的小寫命名。

直到 21 世紀初的幾年,在 Intel 和 Ruby 社區中,才有人開始以“snake_case”即蛇形命名來稱呼它。

現今有不少編程語言在某些場景下會推薦使用蛇形命名法,而 Python 則是其中最早這麼做的之一,並且是使用場景最多的語言之一。

維基百科上統計了一份清單,可以看出 Python 對它的偏好:

其次,還有一個比較重要的原因,那就是 Python 對下劃線“_”的獨特偏愛。

比如類似於 _xx、__xx、xx_、__xx__ 等等的寫法就隨處可見,甚至還有孤零零一個下劃線 _ 作為變量的特殊情況。這樣看來,下劃線作為單詞間的連接,恰恰是這種傳統習慣的一部分。

最後,我還看到過一種解釋:因為 Python 是蟒蛇啊,理所當然是用蛇形命名……

對於這三個解釋,你們是如何感想的呢?對於蛇形命名法,大家是喜歡還是不喜歡呢?歡迎留言交流。

寫在最後:本文屬於“Python為什麼”系列(Python貓出品),該系列主要關注 Python 的語法、設計和發展等話題,以一個個“為什麼”式的問題為切入點,試着展現 Python 的迷人魅力。部分話題會推出視頻版,請在 B 站收看,觀看地址:視頻地址

公眾號【Python貓】, 本號連載優質的系列文章,有Python為什麼系列、喵星哲學貓系列、Python進階系列、好書推薦系列、技術寫作、優質英文推薦與翻譯等等,歡迎關注哦。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司“嚨底家”!

※推薦評價好的iphone維修中心

聚甘新