軟件工程的第一性原理丨SmartIDE

40d3873e94151db453191955971fae65.gif

作者:徐磊

原文地址:https://smartide.cn/zh/blog/2022-1022-software-engineering/

f80cc10444540f32376582d6b2e87c6b.jpeg

徐磊

英捷創軟科技(北京)有限公司創始?/?席架構師 / CEO / SmartIDE開源項?創始?。微軟最有價值專家MVP,微軟區域技術總監,華為云MVP,認證Scrum Master,EXIN DevOps Master/Professional 認證講師,中國最?的敏捷精益社區IDCF創始?。專注于軟件?程,敏捷精益商業創新??的管理咨詢。客?涵蓋從電信,能源,傳統?產制造,?融和電商等各?業,從2005年?今已經為超過100家企業提供過軟件?程?案的咨詢和服務,包括:華為、中國農業銀?、招商銀?、興業銀?、中國銀?、斯倫?謝、中國聯通、中國??保險、京東商城、通?汽?等。

一直都想寫這樣一篇文章來聊一聊我對軟件工程的看法,粗略算來我從事軟件工程這件事情已經有將近18個年頭。很多人并不理解軟件工程和軟件開發的區別,用一個簡單的類比來說明一下:如果說軟件開發人員是淘金者,那么從事軟件工程的人員就是賣牛仔褲的。是的,軟件工程就是為軟件開發人員提供最好的方法,工具和實踐的學科。要做好軟件工程這件事情首先要做的就是要理解到底什么是軟件開發,必須對自己所服務的對象有正確理解,才能摸清其中的規律,從而為軟件開發人員提供符合自然規律的方法,工具和實踐 — 這個所謂的規律就是我今天想跟大家聊的內容:軟件工程的第一性原理。

第一性原理這個詞被埃隆馬斯克帶火了,其基本含義就是事物的根本性規律,馬斯克經常說自己對物理學很癡迷就是因為物理其實研究的就是世間萬物的根本性規律,從這個規律出發所做出的判斷和決策就是符合規律的,也是一定可以實現的。相反,如果做不符合規律的事情,那么結果就是被各種困境纏繞,無法脫身。所謂的適者生存,就是這樣一個簡單的道理。

但是,符合規律的做法不一定就是簡單方便的做法,事實上一般的情況恰恰相反,符合自然規律的做法往往都更加困難,違背基本的人性。舉個簡單例子,我們都知道要獲得健康的身體就要堅持規律的作息,持續的鍛煉身體并且科學的飲食;而實際的情況是我們總有理由去熬夜,總會在計劃好的鍛煉時間偷懶,高糖高碳水的冰淇淋和蛋糕也永遠比蔬菜沙拉更加吸引我們,這就是人性。

軟件第一性原理第一定律:

? ? ? ? ? 軟件是虛擬的

3b0c8747754c01b61a1a96c6916b3a02.png

軟件是一個虛擬物品,這就是軟件工程的第一性原理,認識到這一點你才能正確理解精益敏捷、理解DevOps和持續交付,理解研發效能,理解平臺工程,理解任何為了軟件而存在的方法,工具和實踐。等等,軟件是一個虛擬物品,這不是廢話嗎?是的,只有符合自然規律的描述才能被稱之為廢話,因為這個第一性原理本來就不神秘,本來就在你的身邊。這就好像牛頓的力學定律一樣,說出來你也會覺得是廢話,但是真的要把它解釋清楚,那么你就成為牛頓了。是的,你和牛頓的距離就是一句廢話。

地下室的故事

話說一家知名的房地產大廠有一位具備500年房地產從業經驗的設計師,他設計大樓的經驗年頭甚至都比大樓存在的時間要長那么幾十年。有一次這位設計師來到一座將要竣工的大樓面前,這座樓有50多層,已經進入到內裝修階段了。設計師在仔細檢查了大樓的各項設施之后提出了自己專業的意見,這個大樓需要增加2層地下室。

3480fe36f1331537f150d28f0a69c1f3.jpeg

你一定可以想象在場的項目經理,施工方和工人們驚嚇的目光,感覺自己遇到了一個瘋子。不過,類似的場景其實只是各個軟件/互聯網大廠的日常而已吧,這樣的瘋子每天都見,早就習慣了。

瘋子錯了嗎?

當然沒有,他只是發現了一個“底層”問題,但是并沒有意識到這是個“底層”問題,因為他根本看不到這棟大樓。這就是軟件,一個虛擬的大樓。

作為程序員,大家都懂軟件的分層,數據/邏輯/界面這是基本的三層架構;實際中的軟件往往比這要復雜的多。但是如果你嘗試去給普通人解釋,這將是一件非常有挑戰的工作,恐怕要從Hello World講起。

因為軟件本身是一件虛擬物品,普通人很難通過常識判斷軟件的復雜性以及內部關系,造成嚴重的信息不對稱,這是軟件工程領域的各種問題的原罪!

軟件第一性原理第二定律:

? ? ?軟件只能被制造一次

bb2ea253418348a62e168eb2a02a7b28.png

復制一款軟件和復制一輛汽車的成本是完全不同的,這也是基于第一定律延續。復制一輛汽車需要重新投入原材料,人工和各種生產資料,但是復制一款軟件只需要Ctrl-C加Ctrl-V就夠了。軟件開發團隊所做的事情嚴格來說不是生產制造軟件,而是在設計軟件,因為生產制造是指重復產出同樣的產品,而軟件開發團隊每次產出的都是不一樣的產品。

5d7440f3e6e630c0b6fc2ea0bf3df67f.png

瀑布模式就是個錯誤

設計是一項創造性活動,創造性活動的目標是無法被預先定義的,其最大的風險是創造了無用的產品,如果方向錯了,所有的努力都只會加速死亡。既然生死未知,計劃的意義何在,你在計劃更好的生,還是計劃更快的死?現實中的表現是軟件經常延期,工作量估算不準確,開發過程經常遇到不可見問題,輕則延期重則推翻重做。這也是瀑布式開發模式為什么從根本上就是錯的,瀑布式開發的一個基本假設就是目標是確定的。

既然瀑布本身就是錯誤,為什么有那么多組織和團隊在使用這種模式呢?其實在本文一開始已經解釋了原因,這就是蔬菜沙拉和奶油蛋糕的區別。瀑布模式雖然不符合軟件工程的基本規律,但是它更加符合懶惰和規避變化的人性特點,因此大家會不自覺的選擇奶油蛋糕。如果再考慮組織中僵化的流程,官僚的氛圍以及各種利益的驅使因素,那么瀑布這種更加容易管理,更省心輕松的方式自然會受到歡迎,至于產出的軟件是否有用,是否浪費了資源,開發人員是否痛苦不堪,這些都不重要。當然,前提是這個組織本身不依賴軟件生存,對于一個數字化的組織或者強烈依賴軟件運作的組織而言,產出無用的軟件這一點就已經足夠驅動他們選擇蔬菜沙拉了。那些選擇了奶油蛋糕的組織早就死于高血脂引發的心血管和腦梗了。

敏捷只是個標簽

倡導迭代式的敏捷開發模式為什么現在被大多數開發團隊認可,原因就是敏捷從根本上承認了軟件開發目標的不確定性,而不像瀑布模式那樣非要去定義一個無法被定義的東西。精益思想里面的核心Build-Measure-Learn強調的也是在目標不確定的前提下,怎樣通過不斷的檢視來識別問題,調整方向,最終達到目標。DevOps的三步工作法 1)建立流和系統化思維 2)建立反饋 3)建立持續實驗和學習的文化,看上去是不是也異曲同工?這些方法和實踐都誕生于軟件工程領域,現在已經在很多非軟件行業使用,其思想根基都是以上所述的軟件第一性原理,都是為了應對客觀規律而被總結出來,又在實際工作中被驗證的方法。

軟件工程的基本工作思路 -?

? ? ? ? ? ? 粒度和解耦

74bc4a3bf65ad27095cac0bed826dfc4.png

軟件這件事情,現在變得越來越重要。現在火熱的所謂數字化,研發效能,平臺工程,其根本都是在尋找最大化軟件價值的方法而已,只不過關注的層面有所不同。數字化更加關注用戶側和業務價值,研發效能更加關注開發過程,而平臺工程則強調用一個內部開發者平臺(Internal Developer Platform, IDP)來承載具體的方法和實踐。1993年,被稱為是互聯網點火人的馬克安德森(Marc Andreessen)開發出了Mosaic瀏覽器,后來加入網景(Netscape)公司,開創了互聯網時代。可以說,軟件這件事情只有到了互聯網出現以后才真正開始進入普通人的生活。2011年,馬克安德森提出了 軟件正在吞噬世界(software is eating the world) 的說法,同一年的1月21日騰訊推出了一款為智能終端提供的即時通訊軟件,叫做微信。

ccf8a332c63b4603436d1767f2174267.jpeg

隨著軟件規模的不斷擴大,早期幾個人就可以搞定的軟件現在需要幾百上千人協同完成,軟件開發過程本身的問題也被放大,變成了影響組織生存發展的大問題。從研發效能的層面,從軟件第一性原理出發,我們需要確保在目標不確定,方法不確定,系統越來越復雜的前提下幫助企業取得成功,其基本思路只有2個:就是粒度和解耦。面對不確定目標最簡單的應對方式就是將復雜問題簡單化,對問題進行拆解,然后逐個攻克。但是在拆解的過程中會帶來一個副作用就是拆解后的單個問題確實簡單了,但是問題的數量增加了,同時不同問題之間的依賴會造成副作用。因此我們需要解耦,采用各種管理和技術手段,讓拆解后的問題可以被獨立解決,而不是依賴其他問題。有關粒度和解耦的話題,請參考我的另外一篇文章 DevOps實施落地的2大法寶——粒度&解耦(點擊查看)

d612895b4c6374dd3e6e022aca8e11ee.png

解耦是一個非常難的話題,在軟件工程領域,對這個問題的解決方式就是 基礎設施即代碼 (Infrastructure as Code, IaC),IaC本身看上去是一個純粹的工程方法/工具,實際其背后隱含了一個重要邏輯,就是如果要降低AB系統耦合,就要從他們依賴中提取共性,然后由第三方C來解決這個問題,如下圖:

9ab170de92272a22418c14147b910f93.png

如果想詳細了解IaC的概念以及落地方法,請參考我的另外一篇博客 沒有使用IaC的DevOps系統都是耍流氓(點擊查看) 。

軟件工程隨著軟件在我們生活中變得日益重要而開始引起了越來越多人的關注,這個行業也非常善于創造概念,因此你會聽到各種新鮮的詞匯,包括在本文中提到的敏捷,精益,DevOps,平臺工程,研發效能等等。但只要做的還是軟件,就無法背離軟件工程第一性原理的2條定律,記住粒度和解耦,落實IaC的工作方法,你就一定能找到適合自己的模式,應對好自己的問題,在自己的領域中取得成就。

最后還想說一句話:這些方法都會幫助你登上高峰,但一定不是別人的那座。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281342.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

排序算法之快速排序詳解

一、算法介紹 快速排序:快速排序的基本思想是通過一次排序將等待的記錄分成兩個獨立的部分,其中一部分記錄的關鍵字小于另一部分的關鍵字。C部分的快速排序一直持續到整個序列被排序。 任取一個元素 (如第一個) 為中心提出所有小于它的元素,并…

openstack 中國聯盟公開課參會總結

主流趨勢 1. openstack defcore 互操作性認證。打通不同的openstack 廠商之間的連接2. 首批OpenStack管理員認證(COA)將于2016年進行3. 混合云應用廣泛 Cloud Broker,cascading openstack 云連接器4. DevOps5. 虛擬桌面6. Storage 方面,Ceph和Glusterfs 7. Network…

bzoj1088[SCOI2005]掃雷Mine

1088: [SCOI2005]掃雷Mine Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4284 Solved: 2552[Submit][Status][Discuss]Description 相信大家都玩過掃雷的游戲。那是在一個n*m的矩陣里面有一些雷,要你根據一些信息找出雷來。萬圣節到了,“余”人國流…

Re:從零開始的Vue項目搭建

Re:從零開始的Vue項目搭建初始的終結與結束的開始Nodejs項目的簡單測試從零開始webpack開發模式webpack編譯打包后記初始的終結與結束的開始 最開始接觸vue項目搭建是從vue-cli開始,模板式操作,一鍵搞定,幾乎可以無縫進入代碼開發…

在數據庫插入帶小數點數據的問題

想在mysql插入以下數據設計表的時候沒有注意,之前都用的int,這次換成了double,但是插入第一條3.50的時候數據庫顯示為:查了之后知道是設計表的時候沒有注意小數點的設置轉載于:https://juejin.im/post/5c0f61bb6fb9a049ea38cbe9

oracle 11g 創建 job 20

15-10-19 23:48:04分類: Oracle--創建一次執行的匿名塊任務,成功調用一次后job消失BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name > my_new_job2, job_type > PLSQL_BLOCK, job_action &g…

Jzoj5317 Func

f(1)1 f(2x)f(x) f(2x1)f(x)f(x1) 給出n<10^6&#xff0c;求:所有的i滿足f(i)n 第一道類歐算法 我們考慮一個性質 f(2x1)f(x)f(x1)f(2x)f(2x2) 所以&#xff0c;顯然有f(2x1)>f(2x) f(2x1)>f(2x2) 那么現在我們知道了f(2x1),自然考慮枚舉一個f(2x) 可以按照以下形式…

C# WPF 用代碼畫一幅圖(*精品*)

概述有時候我們的程序界面中需要顯示一些簡單的示意圖&#xff0c;一般我們有原圖的話直接嵌入我們程序就可以&#xff0c;但有時候我們沒有原圖&#xff0c;這時候我們不妨用代碼自己畫出來.今天小編要給大家展示的是這樣一副圖片&#xff1a;接下來&#xff0c;我就用代碼純手…

礦難讓顯卡壓了那么多貨咋辦?NV如是說

2019獨角獸企業重金招聘Python工程師標準>>> 在蘇州 GTC 開幕的幾天前&#xff0c;英偉達剛剛遭遇了一次股價的腰斬。 近來加密貨幣的熱度漸低&#xff0c;受到挖礦熱潮照顧許多的英偉達「礦機」銷量受到打擊&#xff0c;甚至出現了嚴重的庫存危機&#xff0c;加上近…

花式看超級碗 人工智能、大數據在碗里

“超級碗”可不是一個大碗!!!超級碗(Super Bowl)是美國國家美式足球聯盟(也稱為國家橄欖球聯盟)的年度冠軍賽&#xff0c;勝者被稱為“世界冠軍”。超級碗一般在每年1月最后一個或2月第一個星期天舉行&#xff0c;那一天稱為超級碗星期天(Super Bowl Sunday)。超級碗是比賽的名…

Git分支操作與遠程倉庫的使用

Git分支操作本地倉庫創建分支合并分支刪除分支遠程倉庫push 推送遠程分支pull 拉取遠程分支fetch 更新遠程分支本地分支與遠程分支的跟蹤關系本地倉庫 由于Git的分布式特性&#xff0c;所以沒有絕對的本地和遠程概念&#xff0c;一切都是相對的。對于分支的操作&#xff0c;個…

SimMechanics/Second Generation倒立擺模型建立及初步仿真學習

筆者最近搗鼓Simulink&#xff0c;發現MATLAB的仿真模塊真的十分強大&#xff0c;以前只是在命令窗口敲點代碼&#xff0c;直到不小心敲入simulink&#xff0c;就一發不可收拾。話說simulink的模塊化建模確實方便&#xff0c;只要拖拽框框然后雙擊設置屬性就可以慢慢堆建自己的…

10 行代碼提取復雜 Excel 數據

把 Excel 文件導入關系數據庫是數據分析業務中經常要做的事情&#xff0c;但許多 Excel 文件的格式并不規整&#xff0c;需要事先將其中的數據結構化后再用 SQL 語句寫入數據庫。而一般情況下&#xff0c;結構化的工作量會比較大&#xff0c;而且很難通用&#xff0c;每次都要針…

將一個數組拆分為若干個相等數組

var a [法國,澳大利亞,智利,新西蘭,西班牙,加拿大,阿根廷,美國,0,國產,波多黎各,英國,比利時,德國,意大利,意大利]; var b []; var result []; var k 0; for(var i 0; i<a.length; i){ if(i%3 0){ b []; for(var j 0; j<3; j){ if(a[ij] undefined){ continue; …

人工智能模型的網絡結構可視化

本文主要介紹人工智能模型的網絡結構可視化的常見方法。對于使用神經網絡模型來說&#xff0c;我們主要關注的是模型的輸入和輸出。在 ML.NET 中使用 ONNX 模型時&#xff0c;我們就需要了解這些信息&#xff0c;以便在構成神經網絡的所有層之間生成連接映射。下圖就是昨天 《Y…

Git 撤銷操作 / 回滾歷史

撤銷操作 git checkout -- <filename>&#xff0c;放棄文件的當前更改&#xff0c;回到最近一次的提交狀態git reset HEAD <filename>&#xff0c;取消暫存文件git commit --amend&#xff0c;覆蓋上一次的提交&#xff0c;雖然不是撤銷操作&#xff0c;但有類似的…

整理ASP.NET MVC 5各種錯誤請求[401,403,404,500]的攔截及自定義頁面處理實例

http://2sharings.com/2015/asp-net-mvc-5-custom-404-500-error-hanlde https://blog.csdn.net/yhyhyhy/article/details/51003683 ASP.NET MVC 5的開發中&#xff0c;服務器的各種錯誤[如&#xff1a;401&#xff08;登錄授權驗證&#xff09;&#xff0c;403&#xff08;禁止…

url字符轉義

作者在做短鏈接功能時&#xff0c;url參數里帶了&字符&#xff0c;結果無法轉換。后來查了一下&#xff0c;發現可以用其它符號代替。下面是對應表 URL 中號表示空格 %2B 空格 URL中的空格可以用號或者編碼 %20 / 分隔目…

編輯器領域正發生變革?從面試看 Visual Studio Code 的崛起

Visual Studio Code&#xff08;VS Code&#xff09;的使用率在迅速上升&#xff0c;現在已經成為大多數工程師的首選編輯器&#xff0c;并似乎正迅速搶占其他頂級編輯的市場份額。Triplebyte 每周都會面試數百名工程師。在每次面試中&#xff0c;我們都會記錄面試者使用的編輯…

C#7.0 ref引用傳遞

1.概要在工作中大家用到引用類型是非常多的&#xff0c;大家都知道引用類型在使用過程中傳遞的是對象引用并不會發生整個對象復制。而值類型在傳遞的過程中就不一樣了&#xff0c;我曾經在編寫代碼時希望通過值類型來壓低應用程序的內存占用&#xff0c;在高并發的情況大量的對…