C++最佳實(shí)踐 | 1. 工具

本系列是開源書C++ Best Practises的中文版赁遗,全書從工具爬坑、代碼風(fēng)格、安全性、可維護(hù)性淫僻、可移植性、多線程、性能、正確性等角度全面介紹了現(xiàn)代C++項(xiàng)目的最佳實(shí)踐饶囚。本文是該系列的第一篇。

C++最佳實(shí)踐:

  1. 工具(本文)
  2. 代碼風(fēng)格
  3. 安全性
  4. 可維護(hù)性
  5. 可移植性及多線程
  6. 性能
  7. 正確性和腳本

前言

C++最佳實(shí)踐: 支持Fork的編碼標(biāo)準(zhǔn)文檔

本文檔旨在收集對(duì)C++最佳實(shí)踐所進(jìn)行的協(xié)作性討論鸠补,是《Effective C++》(Meyers)《C++ Coding Standards》(Alexandrescu, Sutter) 等書籍的補(bǔ)充萝风。在討論如何確保整體代碼質(zhì)量的同時(shí),補(bǔ)充了一些沒有討論到的較低級(jí)別的細(xì)節(jié)紫岩,并提供了具體的風(fēng)格建議闹丐。

在任何情況下,簡(jiǎn)單明了都是首選被因。本文所舉示例是為了說明為什么一種選擇比另一種更受歡迎卿拴。在必要情況下,也會(huì)用文字說明梨与。

本文檔由Jason Turner編寫堕花,根據(jù)知識(shí)共享署名-非商業(yè)4.0國(guó)際許可協(xié)議授權(quán)。

免責(zé)聲明

本文檔的編寫基于個(gè)人經(jīng)驗(yàn)粥鞋,你不需要完全同意其中的觀點(diǎn)缘挽。本文檔保存于GitHub上,任何人都可以fork供自己使用呻粹,或者提交修改建議與大家分享壕曼。

本文檔啟發(fā)O'Reilly發(fā)布了視頻: Learning C++ Best Practices

工具

應(yīng)該在開發(fā)過程的早期建立用于執(zhí)行這些工具的自動(dòng)化框架,檢出源代碼等浊、構(gòu)建和執(zhí)行測(cè)試所使用的命令不應(yīng)超過2-3個(gè)腮郊,一旦測(cè)試完成,應(yīng)該對(duì)代碼的狀態(tài)和質(zhì)量有接近完整的了解筹燕。

源碼管理

對(duì)于任何軟件開發(fā)項(xiàng)目來說轧飞,源碼管理都是絕對(duì)必要的,如果還沒有撒踪,那就開始使用过咬。

  • GitHub —— 允許無(wú)限制的公共存儲(chǔ)庫(kù)和私有存儲(chǔ)庫(kù),支持最多3個(gè)協(xié)作者制妄。
  • Bitbucket —— 允許無(wú)限制的私人存儲(chǔ)庫(kù)掸绞,最多5個(gè)協(xié)作者,免費(fèi)耕捞。
  • SourceForge —— 僅支持托管開放源碼衔掸。
  • GitLab —— 免費(fèi)提供無(wú)限的公共和私有存儲(chǔ)庫(kù),包括無(wú)限的CI執(zhí)行器(CI Runner)砸脊。
  • Visual Studio Online (http://www.visualstudio.com/what-is-visual-studio-online-vs) —— 無(wú)限的公共存儲(chǔ)庫(kù)具篇,私有存儲(chǔ)庫(kù)收費(fèi),支持git或TFVC凌埂。另外提供: 問題跟蹤驱显、項(xiàng)目計(jì)劃(包括Scrum等多個(gè)敏捷模板)、集成托管構(gòu)建瞳抓,所有特性都可以集成到Microsoft Visual Studio中埃疫,僅支持Windows。

構(gòu)建工具

使用廣泛接受的行業(yè)標(biāo)準(zhǔn)構(gòu)建工具孩哑,可以防止在做探索栓霜、鏈接新庫(kù)、打包產(chǎn)品等等工作時(shí)重復(fù)發(fā)明輪子横蜒。例子包括:

請(qǐng)記住抚垄,這不僅是構(gòu)建工具蜕窿,也是編程語(yǔ)言。請(qǐng)盡量維護(hù)良好整潔的構(gòu)建腳本呆馁,并遵循正在使用的工具的推薦實(shí)踐桐经。

包管理器

包管理是C++的重要主題,目前還沒有明確的贏家浙滤。請(qǐng)考慮使用包管理器來幫助跟蹤項(xiàng)目的依賴關(guān)系阴挣,從而幫助新人更容易開始參與項(xiàng)目。

  • Conan —— 跨平臺(tái)C++依賴管理器
  • hunter —— CMake驅(qū)動(dòng)的跨平臺(tái)包管理器瓷叫,適用于C/C++
  • C++ Archive Network (CPPAN) —— 跨平臺(tái)C++依賴管理器
  • qpm —— Qt的包管理器
  • build2 —— 類Cargo的C++包管理器
  • Buckaroo —— 真正去中心化的跨平臺(tái)依賴管理器屯吊,適用于C/C++等等
  • Vcpkg —— 微軟C++庫(kù)管理器,支持Windows, Linux和MacOS

持續(xù)集成

選擇了構(gòu)建工具之后摹菠,接下來需要設(shè)置持續(xù)集成環(huán)境盒卸。

在更改被推送到存儲(chǔ)庫(kù)時(shí)會(huì)觸發(fā)持續(xù)集成(CI)工具自動(dòng)構(gòu)建源代碼,可以私有部署CI工具或使用托管的CI系統(tǒng)次氨。

  • Travis CI
    • 能很好的與C++一起工作
    • 設(shè)計(jì)與GitHub一起使用
    • GitHub公共存儲(chǔ)庫(kù)可以免費(fèi)使用
  • AppVeyor
    • 支持Windows蔽介、MSVC和MinGW
    • GitHub公共存儲(chǔ)庫(kù)可以免費(fèi)使用
  • Hudson CI / Jenkins CI
    • 需要Java應(yīng)用服務(wù)器
    • 支持Windows、OS X和Linux
    • 可以通過許多插件進(jìn)行擴(kuò)展
  • TeamCity
    • 對(duì)開源項(xiàng)目免費(fèi)
  • Decent CI
    • 簡(jiǎn)單持續(xù)集成煮寡,可以將結(jié)果發(fā)布到GitHub
    • 支持Windows虹蓄、OS X和Linux
    • 使用ChaiScript
  • Visual Studio Online (http://www.visualstudio.com/what-is-visual-studio-online-vs)
    • 與Visual Studio Online的源代碼庫(kù)緊密集成
    • 使用MSBuild (Visual Studio的構(gòu)建引擎),可在Windows幸撕、OS X和Linux上使用
    • 提供托管的構(gòu)建代理薇组,也允許用戶提供構(gòu)建代理
    • 可以在Microsoft Visual Studio中控制和監(jiān)控
    • 通過Microsoft Team Foundation Server進(jìn)行內(nèi)部安裝
  • GitLab
    • 使用自定義Docker鏡像,因此可用于C++
    • 有免費(fèi)的共享執(zhí)行器
    • 提供簡(jiǎn)單的覆蓋率結(jié)果分析

如果在GitHub上有開源坐儿、公開托管的項(xiàng)目:

這些工具都是免費(fèi)的貌矿,設(shè)置起來也相對(duì)容易炭菌。一旦把它們都設(shè)置好,就可以對(duì)項(xiàng)目進(jìn)行持續(xù)的構(gòu)建逛漫、測(cè)試黑低、分析和報(bào)告,并且免費(fèi)酌毡。

編譯器

啟用所有可用克握、合理的告警選項(xiàng)蕾管,有些告警選項(xiàng)只在啟用了優(yōu)化的情況下才有效,或者優(yōu)化級(jí)別越高菩暗,效果越好娇掏,例如GCC中的-Wnull-dereference

應(yīng)該使用盡可能多的編譯器勋眯,每個(gè)編譯器對(duì)標(biāo)準(zhǔn)的實(shí)現(xiàn)略有不同,支持多個(gè)編譯器將有助于確保實(shí)現(xiàn)最可移植下梢、最可靠的代碼客蹋。

GCC / Clang

-Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic

  • -Wall -Wextra 合理、標(biāo)準(zhǔn)
  • -Wshadow 如果變量聲明覆蓋了父上下文中的變量孽江,則警告用戶
  • -Wnon-virtual-dtor 如果帶有虛函數(shù)的類有非虛析構(gòu)函數(shù)讶坯,則警告用戶,有助于捕獲難以跟蹤的內(nèi)存錯(cuò)誤
  • -Wold-style-cast 對(duì)C風(fēng)格的類型轉(zhuǎn)換發(fā)出警告
  • -Wcast-align 警告有潛在性能問題的強(qiáng)制類型轉(zhuǎn)換
  • -Wunused 警告任何未使用的東西
  • -Woverloaded-virtual 如果重載(而不是覆蓋)虛函數(shù)岗屏,則發(fā)出警告
  • -Wpedantic 如果使用了非標(biāo)準(zhǔn)的C++則發(fā)出警告(所有版本的GCC, Clang >= 3.2)
  • -Wconversion 對(duì)可能丟失數(shù)據(jù)的類型轉(zhuǎn)換發(fā)出警告
  • -Wsign-conversion 對(duì)影響到符號(hào)的類型轉(zhuǎn)換發(fā)出警告(Clang所有版本辆琅,GCC >= 4.3)
  • -Wmisleading-indentation 如果代碼中有縮進(jìn),但沒有對(duì)應(yīng)的代碼塊这刷,則發(fā)出警告(僅在GCC >= 6.0中)
  • -Wduplicated-cond 如果if/else分支有重復(fù)條件婉烟,則發(fā)出警告(僅在GCC >= 6.0中)
  • -Wduplicated-branches 如果if/else分支有重復(fù)的代碼,則發(fā)出警告(僅在GCC >= 7.0中)
  • -Wlogical-op 在可能需要按位操作的地方使用邏輯操作時(shí)發(fā)出警告(僅在GCC中)
  • -Wnull-dereference 如果檢測(cè)到空解引用將發(fā)出警告(僅在GCC >= 6.0中)
  • -Wuseless-cast 如果執(zhí)行強(qiáng)制轉(zhuǎn)換到相同的類型暇屋,則會(huì)發(fā)出警告(僅在GCC >= 4.8中)
  • -Wdouble-promotion 如果float隱式提升為double則發(fā)出警告(GCC >= 4.6, Clang >= 3.8)
  • -Wformat=2 對(duì)輸出格式化函數(shù)(即printf)的安全問題發(fā)出警告
  • -Wlifetime 顯示對(duì)象生命周期問題(目前只有Clang的特殊分支)

考慮使用-Weverything似袁,并且只在需要的情況下禁用少數(shù)警告。

-Weffc++警告模式可能太吵了咐刨,但如果對(duì)項(xiàng)目適用昙衅,也可以使用。

MSVC

/permissive- —— 執(zhí)行標(biāo)準(zhǔn)一致性

/W4 /w14640 —— 使用并考慮以下內(nèi)容(參見下面的描述)

  • /W4 一切合理的警告
  • /w14242 'identifier': 從'type1'到'type1'的轉(zhuǎn)換定鸟,可能丟失數(shù)據(jù)
  • /w14254 'operator': 從“type1:field_bits”到“type2:field_bits”的轉(zhuǎn)換而涉,可能丟失數(shù)據(jù)
  • /w14263 'function': 成員函數(shù)不重寫任何基類虛成員函數(shù)
  • /w14265 'classname': 類有虛函數(shù),但析構(gòu)函數(shù)不是該類的虛實(shí)例联予,可能無(wú)法正確析構(gòu)
  • /w14287 'operator': 無(wú)符號(hào)/負(fù)常數(shù)不匹配
  • /we4289 nonstandard extension used: 'variable': 在for循環(huán)中聲明的循環(huán)控制變量在for循環(huán)作用域之外使用
  • /w14296 'operator': 表達(dá)式總是'布爾值(boolean_value)'
  • /w14311 'variable': 指針從'type1'轉(zhuǎn)換到'type2'時(shí)被截?cái)?/li>
  • /w14545 逗號(hào)前的表達(dá)式計(jì)算的是缺少參數(shù)列表的函數(shù)
  • /w14546 逗號(hào)前的函數(shù)調(diào)用缺少參數(shù)列表
  • /w14547 'operator': 逗號(hào)前的運(yùn)算符無(wú)效啼县,預(yù)期運(yùn)算符有副作用
  • /w14549 'operator': 逗號(hào)前的運(yùn)算符無(wú)效,想要“運(yùn)算符”嗎?
  • /w14555 表達(dá)式?jīng)]有效果躯泰,表達(dá)式預(yù)期帶有副作用
  • /w14619 pragma warning: 沒有警告號(hào)碼
  • /w14640 在線程不安全的靜態(tài)成員初始化時(shí)啟用警告
  • /w14826 從'type1'到'type_2'的轉(zhuǎn)換會(huì)擴(kuò)展符號(hào)谭羔,可能會(huì)導(dǎo)致意外的運(yùn)行時(shí)行為
  • /w14905 寬字符串字面量轉(zhuǎn)換為'LPSTR'
  • /w14906 字符串字面量轉(zhuǎn)換為'LPWSTR'
  • /w14928 非法的拷貝初始化,已隱式應(yīng)用多個(gè)用戶定義轉(zhuǎn)換

不建議

  • /Wall 會(huì)對(duì)標(biāo)準(zhǔn)庫(kù)中包含的文件發(fā)出警告麦向,有太多額外的警告瘟裸,因此沒什么用。
通用

一開始就設(shè)置非常嚴(yán)格的警告诵竭,在項(xiàng)目開始后試圖提高警告級(jí)別可能會(huì)很痛苦话告。

考慮使用將警告視為錯(cuò)誤的設(shè)置兼搏,例如MSVC中的/Wx,以及GCC/Clang中的-Werror沙郭。

基于LLVM的工具

基于LLVM的工具與能夠輸出編譯命令數(shù)據(jù)庫(kù)的構(gòu)建系統(tǒng)(例如cmake)配合得最好佛呻,例如:

$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .

如果沒用這樣的構(gòu)建系統(tǒng),可以考慮Build EAR病线,它可以與現(xiàn)有構(gòu)建系統(tǒng)掛鉤吓著,并生成編譯命令數(shù)據(jù)庫(kù)。

CMake現(xiàn)在也提供了在正常編譯期間調(diào)用clang-tidy的內(nèi)置支持送挑。

靜態(tài)檢查

最好的選擇是將靜態(tài)分析器作為自動(dòng)化構(gòu)建系統(tǒng)的一部分運(yùn)行绑莺,cppcheck和clang可以滿足免費(fèi)選項(xiàng)的要求。

Coverity Scan

Coverity提供免費(fèi)(開源)靜態(tài)分析工具包惕耕,可以用于與Travis CIAppVeyor集成的每個(gè)提交纺裁。

PVS-Studio

PVS-Studio是用于檢測(cè)用C、C++和C#編寫的程序源代碼中的bug的工具司澎,對(duì)個(gè)人學(xué)術(shù)項(xiàng)目欺缘、開源非商業(yè)項(xiàng)目和個(gè)人開發(fā)者的獨(dú)立項(xiàng)目都是免費(fèi)的,可以在Windows和Linux環(huán)境下工作挤安。

Cppcheck

Cppcheck是免費(fèi)谚殊、開源的。它努力爭(zhēng)取零誤報(bào)漱受,并且做得很好络凿。因此,應(yīng)該啟用所有警告: --enable=all昂羡。

備注:

  • 為了正確工作絮记,需要格式完整的頭文件路徑,所以在使用前不要忘記傳遞: --check-config虐先。
  • 查找未使用的頭文件時(shí)-j不能大于1怨愤。
  • 如果需要檢查所有的代碼,請(qǐng)記住為帶有大量#ifdef的代碼添加--force蛹批。
cppclean

cppclean是開源靜態(tài)分析器撰洗,專注于發(fā)現(xiàn)C++源代碼中導(dǎo)致大型代碼庫(kù)開發(fā)緩慢的問題。

CppDepend

CppDepend通過分析和可視化代碼依賴關(guān)系腐芍、定義設(shè)計(jì)規(guī)則差导、進(jìn)行影響分析以及比較不同版本的代碼,簡(jiǎn)化了對(duì)復(fù)雜C/C++代碼庫(kù)的管理猪勇,對(duì)開源貢獻(xiàn)者是免費(fèi)的设褐。

Clang的靜態(tài)分析器

Clang的分析程序的默認(rèn)選項(xiàng)適用于各個(gè)平臺(tái),可以直接通過CMake使用,也可以通過基于llvm的工具中的clang-checkclang-tidy調(diào)用助析。

此外犀被,CodeChecker可以作為clang的靜態(tài)分析前端。

clang-tidy可以通過Clang Power Tools擴(kuò)展輕松的和Visual Studio一起使用外冀。

MSVC的靜態(tài)分析器

可以通過/analyze命令行選項(xiàng)啟用寡键,可以使用默認(rèn)選項(xiàng)。

Flint / Flint++

FlintFlint++是根據(jù)Facebook編碼標(biāo)準(zhǔn)分析C++代碼的linter雪隧。

OCLint

OCLint是免費(fèi)西轩、自由、開源的靜態(tài)代碼分析工具脑沿,可以通過許多不同的方式提高C++代碼的質(zhì)量遭商。

ReSharper C++ / CLion

這兩種來自JetBrains的工具都提供了一定程度的靜態(tài)分析和自動(dòng)修復(fù)功能,為開源項(xiàng)目負(fù)責(zé)人提供了免費(fèi)許可證選項(xiàng)捅伤。

Cevelop

基于Eclipse的Cevelop IDE提供了各種靜態(tài)分析和重構(gòu)/代碼修復(fù)工具。例如巫玻,可以用C++的constexprs替換宏丛忆,重構(gòu)命名空間(提取/內(nèi)聯(lián)using,限定名稱)仍秤,并將代碼重構(gòu)為C++11的統(tǒng)一初始化語(yǔ)法熄诡。Cevelop是免費(fèi)的。

Qt Creator

Qt Creator可以插入clang靜態(tài)分析器诗力。

clazy

clazy是基于clang的分析Qt使用情況的工具凰浮。

IKOS

IKOS是開源靜態(tài)分析器,由NASA開發(fā)苇本。它以抽象解釋為基礎(chǔ)袜茧,用C++編寫,使用LLVM為C和C++提供了分析器瓣窄。源代碼可以在Github上找到笛厦。

運(yùn)行時(shí)檢查

代碼覆蓋率分析

覆蓋率分析工具應(yīng)該在測(cè)試執(zhí)行時(shí)運(yùn)行,以確保整個(gè)應(yīng)用程序都被測(cè)到俺夕。不幸的是裳凸,覆蓋率分析需要禁用編譯器優(yōu)化,這將導(dǎo)致測(cè)試執(zhí)行時(shí)間大大延長(zhǎng)劝贸。

  • Codecov
    • 與Travis CI和AppVeyor集成
    • 對(duì)于開源項(xiàng)目免費(fèi)
  • Coveralls
    • 與Travis CI和AppVeyor集成
    • 對(duì)于開源項(xiàng)目免費(fèi)
  • LCOV
    • 有很多配置項(xiàng)
  • Gcovr
  • kcov
    • 可與codecov和coveralls集成
    • 不需要特殊的編譯器flag姨谷,只需要debug符號(hào),就可以輸出代碼覆蓋率報(bào)告
  • OpenCppCoverage
    • Windows上的開源代碼覆蓋率工具
Valgrind

Valgrind是運(yùn)行時(shí)代碼分析器映九,可以檢測(cè)內(nèi)存泄漏梦湘、競(jìng)爭(zhēng)條件和其他相關(guān)問題,支持各種Unix平臺(tái)。

Dr Memory

和Valgrind類似践叠。http://www.drmemory.org

GCC / Clang Sanitizers

這些工具提供了許多與Valgrind相同的特性言缤,但內(nèi)置在編譯器中,易于使用禁灼,并提供問題報(bào)告管挟。

  • AddressSanitizer
  • MemorySanitizer
  • ThreadSanitizer
  • UndefinedBehaviorSanitizer

注意可用的sanitizer選項(xiàng),包括運(yùn)行時(shí)選項(xiàng)弄捕。https://kristerw.blogspot.com/2018/06/useful-gcc-address-sanitizer-checks-not.html

Fuzzy分析器

如果項(xiàng)目接受用戶定義的輸入僻孝,可以考慮運(yùn)行模糊輸入測(cè)試。

這些工具都使用覆蓋率報(bào)告來尋找新的代碼執(zhí)行路徑守谓,并嘗試為代碼提供新的輸入穿铆。它們可以發(fā)現(xiàn)崩潰、掛起以及一些沒有被考慮到的輸入斋荞。

變異測(cè)試

這些工具獲取在單元測(cè)試運(yùn)行期間執(zhí)行的代碼荞雏,并改變執(zhí)行的代碼。如果測(cè)試在有突變的情況下仍然通過平酿,那可能意味著在測(cè)試套件中存在有缺陷的測(cè)試凤优。

控制流保護(hù)

MSVC的控制流保護(hù)(Control Flow Guard)增加了高性能的運(yùn)行時(shí)安全檢查。

檢查STL實(shí)現(xiàn)
堆分析
忽略警告

如果團(tuán)隊(duì)一致認(rèn)為編譯器或分析器對(duì)不正確或不可避免的錯(cuò)誤發(fā)出警告,則團(tuán)隊(duì)需要盡可能只在最小的范圍內(nèi)禁用特定的錯(cuò)誤警告幸逆。

在對(duì)一段代碼禁用該警告后棍辕,請(qǐng)確保重新啟用該警告,沒人希望禁用的警告被泄露到其他代碼中还绘。

測(cè)試

上面提到的CMake有一個(gè)用于執(zhí)行測(cè)試的內(nèi)置框架楚昭,請(qǐng)確保使用的任何構(gòu)建系統(tǒng)都能夠執(zhí)行內(nèi)置測(cè)試。

為了進(jìn)一步幫助執(zhí)行測(cè)試拍顷,請(qǐng)考慮使用某個(gè)單元測(cè)試庫(kù)哪替,如Google TestCatch菇怀、CppUTestBoost.Test凭舶,以幫助組織測(cè)試。

單元測(cè)試

單元測(cè)試針對(duì)的是可以獨(dú)立測(cè)試的小代碼塊和獨(dú)立功能爱沟。

集成測(cè)試

對(duì)于提交的每個(gè)特性或bug修復(fù)帅霜,都應(yīng)該啟用測(cè)試。參見上文介紹的代碼覆蓋率分析呼伸。這些測(cè)試比單元測(cè)試級(jí)別更高身冀,但仍然應(yīng)該被限制在單個(gè)特性的范圍內(nèi)钝尸。

逆向測(cè)試

不要忘記確保測(cè)試代碼中的錯(cuò)誤處理,并且確保其能夠正常工作搂根。如果目標(biāo)是100%的代碼覆蓋率珍促,很明顯這些錯(cuò)誤場(chǎng)景也需要被覆蓋的。

調(diào)試

uftrace

uftrace可以用來生成程序執(zhí)行的函數(shù)調(diào)用圖剩愧。

rr

rr是一個(gè)免費(fèi)猪叙、開源的反向調(diào)試器,支持C++仁卷。

其他工具

Lizard

Lizard提供了針對(duì)C++代碼庫(kù)運(yùn)行復(fù)雜性分析的非常簡(jiǎn)單的接口穴翩。

Metrix++

Metrix++可以識(shí)別并報(bào)告代碼中最復(fù)雜的部分,從而幫助我們減少?gòu)?fù)雜代碼锦积,幫助編譯器更好的理解和優(yōu)化代碼芒帕。

ABI Compliance Checker

ABI Compliance Checker (ACC)可以分析兩個(gè)庫(kù)版本,并生成關(guān)于API和C++ ABI變化的詳細(xì)兼容性報(bào)告丰介,可以幫助庫(kù)開發(fā)人員發(fā)現(xiàn)無(wú)意的破壞性更改背蟆,以確保向后兼容性。

CNCC

Customizable Naming Convention Checker(可自定義的命名約定檢查器)可以報(bào)告代碼中不遵循特定命名約定的標(biāo)識(shí)符哮幢。

ClangFormat

ClangFormat可以自動(dòng)檢查并糾正代碼格式淆储,以匹配組織約定〖医剑可以參考關(guān)于clang-format的系列文章

SourceMeter

SourceMeter提供了免費(fèi)版本碴裙,可以為代碼提供許多不同的度量钢悲,也可以調(diào)用cppcheck。

Bloaty McBloatface

Bloaty McBloatface是用于類unix平臺(tái)的二進(jìn)制大小分析器舔株。

你好莺琳,我是俞凡,在Motorola做過研發(fā)载慈,現(xiàn)在在Mavenir做技術(shù)工作惭等,對(duì)通信、網(wǎng)絡(luò)办铡、后端架構(gòu)辞做、云原生、DevOps寡具、CICD秤茅、區(qū)塊鏈、AI等技術(shù)始終保持著濃厚的興趣童叠,平時(shí)喜歡閱讀框喳、思考,相信持續(xù)學(xué)習(xí)、終身成長(zhǎng)五垮,歡迎一起交流學(xué)習(xí)乍惊。
微信公眾號(hào):DeepNoMind

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市放仗,隨后出現(xiàn)的幾起案子润绎,更是在濱河造成了極大的恐慌,老刑警劉巖匙监,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凡橱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡亭姥,警方通過查閱死者的電腦和手機(jī)稼钩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來达罗,“玉大人坝撑,你說我怎么就攤上這事×溉啵” “怎么了巡李?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)扶认。 經(jīng)常有香客問我侨拦,道長(zhǎng),這世上最難降的妖魔是什么辐宾? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任狱从,我火速辦了婚禮,結(jié)果婚禮上叠纹,老公的妹妹穿的比我還像新娘季研。我一直安慰自己,他們只是感情好誉察,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布与涡。 她就那樣靜靜地躺著,像睡著了一般持偏。 火紅的嫁衣襯著肌膚如雪驼卖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天鸿秆,我揣著相機(jī)與錄音款慨,去河邊找鬼。 笑死谬莹,一個(gè)胖子當(dāng)著我的面吹牛檩奠,可吹牛的內(nèi)容都是我干的桩了。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼埠戳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼井誉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起整胃,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颗圣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后屁使,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體在岂,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年蛮寂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔽午。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酬蹋,死狀恐怖及老,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情范抓,我是刑警寧澤骄恶,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站匕垫,受9級(jí)特大地震影響僧鲁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜象泵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一寞秃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧单芜,春花似錦、人聲如沸犁柜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馋缅。三九已至扒腕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萤悴,已是汗流浹背瘾腰。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留覆履,地道東北人蹋盆。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓费薄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親栖雾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子楞抡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容