技術變化那麼快,程式設計師如何做到不被淘汰?

java填坑路發表於2018-06-13

導讀:寫了這麼多年的程式碼,你是否曾經有過這樣的迷茫和困惑——技術發展日新月異,奮力追趕的我們,究竟是技術的主人還是技術的奴隸?今天,我們邀請到了螞蟻金服的技術專家空融,一起來聊聊技術人的軟體世界觀。

在浩大的軟體世界裡,作為一名普通程式設計師,顯得十分渺小,甚至會感到迷茫。我們內心崇拜技術,卻也對日新月異的技術抱有深深的恐懼。有時候我會思考難道在技術領域內不斷緊跟新潮,不斷提升技能就是我的價值所在?那麼我是技術的主人還是技術的奴隸?

人之所以迷茫往往是找不到工作生活的重心,感受不到工作或生活的價值。那麼什麼是價值呢?說的大一點就是我改變了世界,說的小一點就是我的所作所為改善了某些問題。如果不清楚自己的行為、目標、價值三者的關係,那麼又何來重心?又如何能分得清重要性與優先順序呢?

程式設計師的迷茫不僅僅是面對技術繁雜的無力感,更重要的是因為長期埋沒於軟體世界的浩大的分工體系中,無法看清從業務到軟體架構的價值鏈條,無法清楚定位自己在分工體系的位置,處理不好自身與技術、業務的關係所致。

很多程式設計師打心底不喜歡業務,這一點我曾經也經歷過,我更寧願從事框架工具、技術元件研究的相關事情。我有個朋友經常吐槽我說:”你們天天加班加點寫了那麼多程式碼,然後呢?有改變什麼嗎?還不是寫出了一堆垃圾。”仔細想想很多時候業務在我們腦海中存留的只是邏輯和流程,我們丟失的是對業務場景的感受,對使用者痛點的體會,對業務發展的思考。這些都是與價值緊密相關的部分。我們很自然的用戰術的勤快掩蓋戰略的懶惰!那麼這樣的後果就是我們把自己限死在流水線的工位上,閹割了自己能夠發現業務價值的能力,而過多關注新技術對職場競爭力的價值。這也就是我們面對繁雜技術,而產生技術學習焦慮症的根本原因。

業務、技術與軟體系統的價值鏈

那麼什麼是業務呢?就是指某種有目的的工作或工作專案,業務的目的就是解決人類社會與吃喝住行息息相關的領域問題,包括物質的需求和精神的需求,使開展業務活動的主體和受眾都能得到利益。通俗的講業務就是使用者的痛點,是業務提供方(比如公司)的盈利點。而技術則是解決問題的工具和手段。比如為了解決使用者隨時隨地購物的業務問題時,程式設計師利用web技術構建電子商務App,而當需求升級為幫助使用者快速選購商品時,程式設計師會利用資料演算法等技術手段構建推薦引擎。技術如果脫離了業務,那麼技術應用就無法很好的落地,技術的研究也將失去場景和方向。而業務脫離了技術,那麼業務的開展就變得極其昂貴和低效。

所以回過頭來我們想想自己沒日沒夜寫了那麼多的程式碼從而構建起來的軟體系統,它的價值何在呢?說白了就是為了解決業務問題,所以當你所從事的工作內容並不能為解決業務問題帶來多大幫助的時候,你應該要及時做出調整。那麼軟體系統又是如何體現它自身的價值呢?在我看來有如下幾個方面的體現:

業務領域與功能:比如支付寶立足支付領域而推出的轉賬、收款功能等,比如人工智慧自動駕駛系統等。

服務能力:這就好比火車站購票視窗,評判它的服務能力的標準就是它能夠同時處理多少使用者的購票業務,能不能在指定時間內完成購票業務,能不能7*8小時持續工作。對應到軟體系統領域,則表現為以下三個方面:

系統正確性(程式能夠正確表述業務流程,沒有Bug)

可用性(可以7*24小時*365不間歇工作)

大規模(高併發,高吞吐量)

網際網路公司正是藉助大規模的軟體系統承載著繁多的業務功能,使其擁有巨大的服務能力並藉助網際網路技術突破了空間限制,高效低廉解決了業務問題,創造了豐厚的利潤,這是人肉所不可比擬的。

理解了這一層面的概念,你就可以清楚這個價值鏈條:公司依靠軟體系統提供業務服務而創造價值,程式設計師則是通過構建並持續演進軟體系統服務能力以及業務功能以支撐公司業務發展從而創造價值。

有了這個價值鏈條,我們就可以反思自己的工作學習對軟體系統的服務能力提升起到了多大的推動作用?可以反思自己的工作學習是否切實在解決領域的業務問題,還是隻是做一些意義不大的重複性工作。

前兩天面試了一個候選人,他的工作是從事票務系統開發,他說自己在研究linux核心與組合語言,我就問他linux核心和組合語言的學習對你的工作產生了哪些幫助?能否舉一個例子?他啞口無言,我內心就覺得這樣一個熱愛學習的好苗子正迷茫找不到重心,正在做一件浪費精力的事情。正確的學習方式應該是將學習與具體業務場景結合起來,和公司通過軟體系統開展業務服務而創造價值,程式設計師通過提升軟體系統服務能力創造價值這一鏈條串接起來,從對這些價值產生幫助的程度去思考優先順序。學習本身沒有錯,錯的往往就是那顆初心。

現在你再來看高併發分散式相關的知識,你會發現並不是因為這些知識比較高深、比較時髦,很多公司有需求才值得學習,而是他們對價值鏈條有著實實在在的貢獻。

價值驅動的架構

一談到軟體系統,人們免不了想起架構這件事來。之所以此處去談及架構是因為每一個程式設計師本質都是軟體架構體系中的一分子,我們可能深埋於體系流水線之中,感受不到位置和價值。但如果站在架構這一高度去看這些問題則將會非常透徹。那麼架構究竟是什麼?和上述的價值鏈又有什麼關係呢?

什麼是架構?

在我看來軟體架構就是將人員、技術等資源組織起來以解決業務問題,支撐業務增長的一種活動。可能比較抽象,我想我們可以從架構師的一些具體工作任務來理解這句話含義:

組織業務:架構師通過探索和研究業務領域的知識,構建自身看待業務的”世界觀”。他會基於這種認識拆分業務生命週期,確立業務邊界,構建出了一套解決特定業務問題的領域模型,並且確認模型之間、領域之間的關係與協作方式,完成了對業務領域內的要素的組織工作。

組織技術:為了能在計算機世界中運作人類社會的業務模型,架構師需要選用計算機世界中合適的框架、中介軟體、程式語言、網路協議等技術工具依據之前設計方案組織起來形成一套軟體系統方案,在我看來軟體系統就像是一種技術組織,即技術元件、技術手段依據某種邏輯被組織起來了,這些技術工具被確定了職責,有了明確分工,並以實現業務功能為目標集合在了一起。比如RPC框架或訊息佇列被用於內部系統之間的通訊服務就如同信使一般,而資料庫則負責記錄結果,它更像是一名書記員。

組織人員:為了能夠實現利用軟體系統解決業務問題的目標,架構師還需要關注軟體系統的構建過程,他以實現軟體系統為號召,從公司組織中聚集一批軟體工程師,並將這些人員按不同工種、不同職責、不同系統進行組織,確定這些人員之間的協作方式,並關注這個組織系統是否運作良好比如溝通是否順暢、產出是否達到要求、能否按時間完成等。

組織全域性,對外輸出:架構師的首要目標是解決業務問題,推動業務增長。所以他非常關心軟體的執行狀況。因為只有在軟體系統執行起來後,才能對外提供服務,才能在使用者訪問的過程中,解決業務問題。架構師需要關注執行過程中產生的資料比如業務成功率,系統執行資源佔用資料、使用者反饋資訊、業務增長情況等,這些資訊將會幫助架構師制定下一步架構目標和方向。

所以軟體架構不僅僅只是選用什麼框架、選用什麼技術元件這麼簡單。它貫穿了對人的組織、對技術的組織、對業務的組織,並將這三種組織以解決業務問題這一目標有機的結合在了一起。

很多面試的候選人在被問及他所開發的系統採用什麼架構的問題時,只會羅列出一些技術元件、技術框架等技術要素,這樣看來其根本沒有理清架構的深層含義。也有一些架構師只專注對底層技術的研究,以為打造一個卓越的系統是非常牛逼的事情,可是他忽略了軟體系統的價值是以解決業務問題的能力、支撐業務增長的能力為衡量標準,所以最後生產出了很多對組織,對業務沒有幫助的系統。

成本與收益

正如之前所說軟體系統只有在執行的時候才能創造價值,也就是說軟體系統能否7*24小時*365天穩定的工作關係到公司的收益水平。所以開發團隊對生產環境的釋出總是小心翼翼,對解決生產環境的問題總是加班加點。而軟體系統的成本則體現在軟體構建過程,這時候我們就能理解那些工程技術如專案管理、敏捷開發、單元測試、持續整合、持續構建,版本管理等的價值了,他們有的是保證軟體系統正確性,有的是為了降低溝通成本,有的是為了提升開發效率等但總的來說就是為了降低軟體的構建成本。所以在提升系統服務能力,創造更多業務收益的同時,降低構建成本也是一種提升收益的有效手段。

作為一名軟體工程師而言,我們往往處在軟體構建過程體系中的某個環節,我們可以基於成本與收益的關係去思考自己每一項技能的價值,學習新的有價值的技能,甚至在工作中基於成本與收益的考量選擇合適的技術。比如在邏輯不大發生變化的地方,沒有必要去做過多的設計,應用各種花俏的設計模式等浪費時間。這樣我們才能成為技術的主人。

架構目標需要適應業務的發展

架構的目標就是為了支撐業務增長,就是提升軟體系統的服務能力。可是話雖說如此,但真實卻要做很多取捨。比如對初創團隊而言,其產品是否解決業務問題這一設想還沒得到確認,就立即去構造一個高效能、高可用的分散式系統,這樣的架構目標遠超出業務發展的需求,最後的結果就是浪費大量人力物力,卻得不到任何起色。架構師需要審時度勢,仔細衡量正確性、大規模、可用性三者的關係,比如今年業務蓬勃發展日均訂單300萬,基於對未來的可能預測,明年可能有3000萬的訂單,那麼架構師應該要著重考慮大規模和可用性。而且每一點提升的程度,也需要架構師衡量把握,比如可用性要達到2個9還是3個9。

回顧自己以往的工作很多時候就是因為沒有確立架構目標導致浪費了組織很多資源,比如在之前的創業團隊中,由於本人有一定的程式碼潔癖,經常會花費很多時間和同事計較程式碼質量,這樣本可以更快上線的功能卻需要被延遲,當時過度追求正確性的行為是與創業團隊快速驗證想法的業務需求不匹配的。

另外一點比較深刻的案例則是在本人擔任一個技術團隊負責人的時候,在一次述職報告的時候,leader問我對接下來團隊工作有什麼計劃?我當時說了一堆什麼改進程式碼質量,每天晨會,任務透明化,建立迭代機制等等,然後就被各種批駁一通。當時團隊基本以外包人員為主,人員水平較差,開發出來的金融系統也是千瘡百孔而這條業務線最重要的業務價值則是按計劃實現潛在投資方的需求,爭取拉到投資。所以不久leader就召集測試架構的相關人員與我這邊一同梳理對核心功能的測試工作,將研發、測試、上線的流程自動化。

當時並不理解這樣做核心價值是什麼。但回過頭來看這樣的工作方式恰好符合了業務發展的需求,即確保系統是符合設計需求的,保證系統達到可接受的正確性,為後續能過快速前進打下基礎,最重要的是為企業降低了構建成本。所以程式設計師想要工作出業績,必須認清楚系統背後的業務價值,按價值去梳理工作優先順序,而不是像我一般過度糾結細節,追求技術理想化。

成也分工,敗也分工

正如在程式設計師的迷茫那一章節提到的:程式設計師的迷茫因為長期埋沒於軟體世界的浩大的分工體系中,無法看清從業務到軟體架構的價值鏈條,無法清楚定位自己在分工體系的位置,處理不好自身與技術、業務的關係所致,所以在這裡我想談談分工。架構師為了使軟體系統更好的服務業務,必然將軟體系統生命週期進行拆分,比如分出開發生命週期、測試生命週期、使用者訪問生命週期、軟體運維生命週期,並根據不同的生命週期劃分出不同的職責與角色。

比如開發人員負責開發週期負責完成軟體研發,測試人員負責對開發人員交付的成果進行測試等,於是就形成了分工。一旦分工形成,每一個分工組織都會有自己的價值追求,架構師關注的頂層的價值即軟體系統能否支撐業務增長被分工的形式打碎到各個組織中。分工是有其價值的,他使得複雜昂貴的任務可以被簡單、並行、可替換的流水線方式解決。但久而久之,價值碎片化的問題就出現了,比如測試人員只關注找出更多問題,開發人員只關注快速開發更多的系統,運維人員只關注保障系統穩定。

三者之間常常都只站在自己的立場去要求對方怎麼做,沒有人再關注整體價值,產生諸多矛盾增加軟體實施成本。而身處流水線中的一員,又因為困擾於重複性工作,迷茫於工作的意義,甚至感覺自己做為了人的創意與靈感都被扼殺了。所以我的朋友吐槽我說你寫了那麼多程式碼然後並沒有怎麼樣是非常有道理的,那是因為我只關注著做為流水工人的價值要求,看不到生態鏈最頂端的價值。

我們仔細想想那些團隊領導,精英領袖哪一個不是為著更廣大的價值所負責,比如專案經理只需要關心自身專案的商業價值,而公司CEO則關心公司範疇內所有業務的總體商業價值。所以關注的價值越大且職位也就越高。這些高層領導者們把控著整體的價值鏈條,及時糾正底層分工組織的價值目標與整體價值目標出現偏差的問題。

從價值出發-找尋學習與工作的新思路

迷茫能引發思考,架構則塑造了視野,而價值則是我們之所以存活,之所以工作的邏輯起點。基於這樣一種價值思維,對我們的學習和工作又可以有哪些改啟示呢?

明確自身的業務相關主體:找出你工作的協作關係網內的業務方和客戶方,這樣你就可以從客戶方中找到離你最近的業務價值點,從你的業務方中挖掘更多的資源。甚至你可以按這個思路順著網路向上或向下挖掘價值鏈條,整合更多的上下游資源以實現更大的價值。

向前一步,為更大的價值負責:不要因為自己是開發人員就不去關注軟體運維,不要因為只是測試就不關注軟體開發,因為你關注的越多你越能看清全域性的價值目標。如果只關注一畝三分地,那麼註定這輩子只能困守在這一畝三分地裡,成為一名流水線上焦慮至死的碼農。試著轉變思維,從架構師的角度思考價值問題,看看能否將技術貫穿到業務、到使用者、到最終的價值去。之前我的朋友說過要把產品經理踢到運營位置去,把程式設計師踢到產品經理位置去,這樣才是正確做事方式。這句話也是類似的意思,向前一步才能懂得怎麼做的更好。

像架構師一樣思考,用價值找尋重心:人的迷茫是因為找不到重心,而價值的意義在於引導我們思考做哪些事情才能實現價值,先做哪些事情會比後做哪些事情更能創造收益。像架構師那樣全域性性思考,把遇到問題進行拆分,把學習到的事物串聯起來,努力構成完整的價值鏈條。

學會連線,構建體系:前幾天看到一篇文章對今日頭條的產品形態極盡批判之詞,指責它的智慧演算法將人類封死在自己的喜好之中,將人類社會進一步碎片化。這似乎很有道理,有趣的是網際網路將我們連線至廣袤的世界,卻也把我們封閉在獨屬於自己的小世界裡。依舊是我的那位朋友,他說他的最大價值在於連線,將不同的人連線在一起,有趣的事情可能就會即將發生。

或許演算法的天性就是順從與迎合,但人最終想理解這個世界還是需要依靠自身的行動與不同人之間建立聯絡,這也是一種擺脫流水線限制的有效方式。另外,我們自身也是某種事物連線的產物,比如架構師,他是業務、技術、管理連線在一起的一種產物。所以我們應當樹立自身的知識體系以吸收融合新知識,將孤立的概念連線起來,形成自身的價值鏈條。比如這篇文章將我從事技術開發經驗、與對架構的理解以及自身過往經歷結合起來,這也是一種內在的體系梳理。

歡迎工作一到五年的Java程式設計師朋友們加入Java架構開發:744677563

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導


相關文章