研發十年-成長之路

序言:

還記得十年前,口袋裏揣着1000塊錢與同學一起坐着硬座綠皮火車,用了20多個小時從青島來到上海,8個人合租着潮溼透風的房間,每天吃着街邊蒼蠅小館中的蛋炒飯,拿着一個月不到2000塊錢的實習工資,夢的起點總是辛酸並快樂着。

        十年後的今天,我又要離開這個充滿挑戰和機遇的城市,去另一個夢的起點。我用生命中最有活力的十年換來了車房妻孩,我不認爲自己是成功的,因爲以我現在的視野回首這十年如果再讓我重新來過,我應該能走的更好。一個只懂Java開發的小夥子,缺少了指路人爲我領航,雖然每份工作都做的很努力,同事和領導對我的評價都很高,但是到現在我仍然覺得自己不應該只是這個高度。

        選擇比努力更重要!埋頭幹活只是爲企業創造價值,但是自己的價值要靠自己額外的時間去補充和提高,選擇的前提是要有足夠的視野,要知道自己處在領域的哪個位置,最新的技術進展是怎麼樣的,給自己一個合理的職業規劃,剩下的就是利用業餘時間去努力吧。

        本文寫給10年前的自己,也寫給跟我一樣曾經迷茫過和迷茫着的程序員們,如果大家覺得有收穫,幫忙多多傳播。

        

 

產品鳥瞰:

從層次上分,我把它拆分爲4層,這種分層結構大家都不會太陌生了。

1最底層爲基礎層;

2上面運行着HaddopDB、內存、MQ等劃分爲一層作爲組件層(組件可能是運行在容器上的,也可能直接運行在虛擬機上的);

3核心產品這一層就代表着企業軟件開發人員基於自己擅長的語言進行開發實現的產品了;

4產品做大做強後就會出現最上面一層,首先爲了與其它企業或產品對接要做一些列的安全機制並暴露在公網中,基於現有的數據可以做人工智能方面的文章來提高產品的“逼格”,甚至推出Daas服務。

下面我會一層層的進行更詳細的描述,不過順序會變一下,我會站在軟件開發人員的視角,以自己的職業發展曲線來逐層分析。

 

 

開發語言:

掌握一種語言是遠遠不夠的。作爲軟件開發人員,語言就是生命。或者說語言的生命週期就是程序員的生命週期。我們很幸運,也很迷惑。

 

我們很慶幸,作爲IT從業者趕上中國的這波互聯網高潮,而且我們選擇的Java語言經過了10個大版本依舊屹立不倒,這口飯讓我們吃了很久。但是隨着各種新語言的興起,可以預料Java語言已經不再具備絕對優勢,現在是多足鼎立、百花齊放。作爲軟件從業人員還是要多爲自己準備些退路,多掌握一門語言,多一條腿走路,就會走的更穩。我推薦除Java外要掌握PythonCor C++),因爲有了這三種獨立風格的語言基礎就可以涵蓋IT界的所有熱門技術的學習。

Java,無需多說,強類型語法的面向對象編程,在客戶後端產品自研發領域獨一份,從JDK1.4開始嶄露頭角,JDK5.0 Tiger奠定老大地位,到現在已經是JDK10,經歷過這麼多年這麼多版本的迭代,可謂是後端開發的常青樹。但從JDK8開始逐漸向腳本語言傾斜,漸漸拋棄了Java初期的一些原則,可見新技術對Java的衝擊很大,Java爲了生存不得不做一些妥協。

 

Python,目前版本還不是太穩定,3.X2.X之間的向下兼容做的可以說是慘不忍睹,但是它憑迷人的語法與豐富的擴展包現如今已經讓人癡迷,伴隨着AI領域近期的興起,python被推向了一個前所未有的高度,可以說按這種步伐發展下去擠掉Java老大的地位也就是時間問題。當然了,python也存在致命的缺陷GIL,因爲GIL的存在使python在處理CPU密集型運算時基本是個廢物,這個處理不好在後端開發中很難與Java抗衡。

 

C/C++,這頭遠古神獸可以算是PythonJava的爺爺輩和太爺爺輩了,而且存活到現在因爲其效率上的優勢依然在軟件開發行業佔據不可替代的地位。它可以作爲孫子們的虛擬機實現語言,它也有自己很多例如Redis之類的明星產品,其它嵌入式、Linux方向的應用幾乎是壟斷的,而且過去幾年雲計算、虛擬化、容器化的發展,又讓這遠古老怪的地位得到了飛昇。

 

多學習一種語言,就相當於多了一門手藝,這門手藝不僅用來寫程序,更重要的是用來讀程序,有了語言基礎才能看得懂新技術的源碼,否則永遠是個埋頭苦幹的碼農,不知道利用自己的已經有技能去pick up新的能力。

 

如果你實在不想去學習其它語言,就抱死Java一棵大樹,那麼以下是你必須要掌握的:

Java+Spring Framework+DB+MQ+Redis+Docker,這套組合構成了核心產品。必須要學好Hadoop,按順序必學的有MapReduceYARNHDFSSparkHadoop生態圈的其它模塊根據需要和興趣自己選學。Spark利用緩存解決了Hadoop性能慢的問題,在數據挖掘和機器學習領域有舉足輕重的地位,所以一定要掌握Spark,核心思想是RDD+DAG


 

 

網絡安全:

網絡安全的出現是好事情,代表着你的產品已經做大做強,吸引到更大的流量,尋找到更多的合作企業和產品,你只有強到足夠亮眼纔會被bad guy盯上,要獲取更多的數據必先解決安全問題。

Http協議是基礎,因爲只有弄明白Http協議才能明白這種設計有什麼漏洞,也才能明白解決手段是什麼原理。

先看幾個沒有安全機制時http的漏洞:


爲了解決上述問題,最有利的武器就是Http+TLS

Https就是爲了解決上面4張圖片中的漏洞而生的。前提需要掌握對稱加密和非對稱加密,以及其各自的優缺點。還需要了解散列和加密方式。握手生成密鑰的過程是重點。


我寫過一篇更詳細解釋Https的請參考《https://blog.csdn.net/yejingtao703/article/details/78723276

 

解決好安全問題後,產品進一步做大,同一個企業會產生很多子產品,而這些子產品之間需要做統一的用戶管理,這就需要引入SSO單點登錄了。

 

企業繼續做大,要與其它合作伙伴分享服務,就會出現OAuth2.0了。OAuth2.0是平臺與平臺之間暫時性的獲取部分能力的解決方案。

 

無論是SSO還是OAuth2.0都大量使用Token這個概念,因爲沒有不透風的牆,再嚴密的安全設計也有被攻克的可能,Token代替賬戶本身的鑑權在網絡中傳輸,就算Token被破解也是暫時性的,因爲Token是有生命週期的,可以將危害降到最低。

 

 

人工智能:

產品並不是核心價值,數據纔是核心價值,基於數據的分析纔是核心競爭力!

語言:python/C++/matlab/R語言

好的基礎層à好的核心產品à更多的數據à更精準更智能à更好的客戶體驗à更多的數據à良性循環

機器學習與神經網絡就是理論派與經驗派的對決。

機器學習是根據場景套算法,修改參數進行調優,可以在較少數據時獲取很高的實用性;

神經網絡是根據經驗數據每個網元用最簡單的算法來反向優化網絡參數,數據越多越精確。

PS:數據越多對機器學習效果的提高也很明顯,神經網絡更依賴數據。

 

機器學習:

機器學習的步驟:

1收集數據

        砸錢、傳感器採集、資料買賣等,搞到原始的數據資料。

2數據處理

        原始的數據不能直接使用,需要轉化成數學模型,並對缺省值做基本處理

3訓練算法

        根據場景選擇合適的機器學習算法,並調整因子做優化,直到達到滿意的精準度

4測試算法

        只針對監督學習纔有該環節,利用數據集對訓練算法的產出做準確率校驗

5學習結果產出

        機器學習結果封裝成可以直接投入實際應用的產出。

 

機器學習屬於低級別的AI,拆分方式很多,我們這裏還是按是否可測試驗證來將其拆分爲監督學習和非監督學習(按目的可以拆分爲迴歸、聚合、概率等)

機器學習的算法都是來自線性代數、微積分、矩陣運算、概率論等高數內容,算法相對比較公開,誰擁有的數據集更多誰的的學習效果就更好。同時不能把機器學習理解爲簡單的算法問題,還涉及到數據收集、數據預處理、算法測試、學習結果產品級應用等範疇。

 

機器學習的常用算法需要參考具體的博文,有如下算法:

1 k-近鄰算法,用於分類,尋找距離目標數據歐氏距離最近的k個樣本中權重最大的那個結果爲算法結果.

優點:容易理解,精度高,

缺點:空間和時間的複雜度高,計算量大.

2 ID3決策樹,利用信息增益決定每一次的最優分路.

優點:可以將訓練結果保存文檔直接使用,可以直觀的給出數據的含義.

缺點:過程不易理解,特性衰減過於迅速

3樸素貝葉斯,利用概率之間的關係對結果進行分類概率上的判斷

優點:對數據較少時任然有效,可以處理多類別問題

缺點:對輸入數據的準備方式較爲敏感

4 Logistic迴歸,

優點:計算代價不高,易於理解和實現。

缺點:容易欠擬合,分類精度不高

5支持向量機SVM,利用支持向量求出超平面對數據進行二選一分類

優點:可以通過核函數解決線性不可分的數據,訓練結論可以保存起來使用時節省時間。

缺點:設計理論太強非常難理解,核函數的因子、鬆弛度等參數需要人爲干預。

6 AdaBoots元算法,利用串行的弱分類器組成精準度更高的強分類器。

優點:泛化錯誤率低,易編碼,可以應用在大部分分類器上,無參數調整。

缺點:對離羣點敏感

7線性迴歸,用線性找到最佳擬合直線,預測數值型目標

優點:原理易理解

缺點:容易欠擬合或過擬合,需要選擇適當的擬合參數 

8分類迴歸樹CART,對數據先分叉直到葉子節點再求預測值。

優點:原理易理解,可以對複雜和非線性的數據建模

缺點:訓練產出不易理解,數修剪對預設值或者算法上要求比較高

9 k-均值聚類算法,將相似的對象歸到同一個簇中

優點:容易實現,也容易理解

缺點:可能收斂到局部最小值,在大規模數據集上收斂較慢,需要優化

10 Apriori關聯分析,通過支持度和可信度分析數據間的關聯關係

優點:精度高,適合與數據間可信度的計算

缺點:儘管Apriori原理減少計算量,但是計算量還是較大,對大數據處理速度不理想

11 FP-growth構建FP,FP樹中挖掘頻繁項集,多用於搜索引擎的關鍵字關聯

優點:性能要比Apriori好兩個數量級以上,可以高效地發現頻繁項集。

缺點:不能用於發現關聯規則

除此之外還有數據預處理降維技術:主要的降維技術有主成分分析PCA和奇異值分析SVD

 

神經網絡:

神經網絡理論上是與機器學習是平行的關係,都是人工智能領域的一種實現方式,而且在歷史上兩者此消彼長各自獨領風騷數十年。

神經網絡和機器學習所用的數學知識幾乎是一樣的,甚至神經網絡更簡單些,但是兩者在原理上完全不同。機器學習是人類根據場景提前干預預置了精妙的算法,經過對算法中參數不斷的調優來達到滿意的效果;神經網絡是是人類只負責搭建每一層的神經網絡的網元節點同時告知網絡正確的結果,節點上是Sigmoid等很簡單的算法,通過網絡規模來提高精度,同時通過預測值與真實值之間的cost function來向前Back Process網絡上網元的參數,不斷循環,直到訓練出滿意效果。

從原理上可以看得出機器學習需要複雜的算法,屬於CPU密集型;而神經網絡是大量簡單運算,屬於GPU密集型。GPU的發展使神經網絡如魚得水,而神經網絡的發展又讓GPU的價格水漲船高(遊戲高玩勿噴)


神經網絡按隱藏層數目是否大於等於3層,分爲淺層網絡和深度網絡。

根據算法的優化由衍生出卷積網絡,解決梯度消失的問題。

 

在人工智能領域Hadoop+Spark也是很實用的技術。數據集太大、CPU和內存資源不夠等原因,在人工智能領域又用到了分佈式計算和分佈式存儲。

人工智能領域,得論文者得算法,得數據者得天下

要進入人工智能領域需要技術棧:

高等數學(矩陣、鏈式求導、微積分、概率論、線性代數)、英語、Haddop+SparkPythonC\C++,matlab,R

 

我所能理解和掌握人工智能領域,包括上面的機器學習和神經網絡,都是屬於後端智能,有高延時、低效率等缺點,更高端的AI領域是AI芯片,這個很遺憾已經超出了我的知識範疇,有興趣的朋友可以自己去研究下,本人確實沒有接觸過。

 

虛擬化:

在學習虛擬化之前必須要先掌握Linux,不止是Linux的常用命令,還要掌握KernelFile System、多租戶安全、網絡設置等,因爲不明白Linux這些前提知識,學習虛擬化將寸步難行。

虛擬化從模塊上來分,有CPU虛擬化、內存虛擬化、網絡虛擬化、存儲虛擬化等,從實現方式上來分有虛擬機和容器兩種方式。

 

OpenStack是個很好的虛擬機虛擬化平臺,模塊有:

OpenStack的模塊:

Nova:管理VM的生命週期,是OpenStack的最核心服務。

Neutron:負責創建L2L3網絡,爲VM提供虛擬網絡和物理網絡連接,是OpenStack最難的部分。

Glance:管理VM啓動鏡像,會被Nova調用。

Cinder:爲VM提供存儲服務,爲VM提供Volume

Swift:提供對象存儲服務,與Cinder看似功能上有重疊。

Keystone:爲OpenStack的各種服務提供認證和權限管理。

Ceilometer:爲OpenStack提供監控和計量服務,爲報警、統計或計費提供數據。

Horizon:以上組件大部分都是API調用的,HorizonOpenStack用戶提供了一個Web的自服務Portal,是OpenStack的控制檯。

其中Nova是核心,Neutron是難點,Driver設計是設計靈魂。

 

Kubernetes是容器化平臺:

容器平臺與虛擬機平臺在設計原理上有很多共同點,掌握了OpenStack再來學習K8s會有很大幫助。容器現在應用最多的就是Docker,學習Docker基本可以與學習容器掛等號。容器比虛擬機輕量、便捷、效率高,但本身也受到宿主機OS的制約,存在一定侷限性。

 

運維保障:

回到鳥瞰中的那張圖,其中所有細節已經都解釋到位了吧,但一個成熟穩定的產品在這張圖中還缺少一部分,就是運維保障。

運維保障一般包括:監控報警、故障處理、系統升級、應用發佈、安全防控、業務監督等模塊,整個保障體系不僅是單獨對IassPass、應用某一層的保障,而是多層的全方位的監控,並根據自己的業務定製行之有效的策略。

 

爲配合運維,也爲了產品長期穩定的發展,在做產品架構設計時需要堅持以下幾個原則:

1儘可能用成熟組件,被廣泛認可和業界證明過的組件纔是安全的組件。

2儘可能的拆分服務,粒度越細治理越靈活,產品伸縮性更好。

3儘可能的容錯,沒有無故障的產品,要在設計階段把故障點都考慮到並做好高可用性。

4儘可能的自動化,產品服務節點體量上去後可以更好的管理產品並降低運維成本。

5儘可能異步和緩存,削峯填谷,降低延時,提高客戶體驗。

6最終一致性,配合上面3容錯和5異步。

 

 

結束語:

本文強調的是視野,其中提到的技術細節在我個人博客中都有專欄在介紹,想進一步瞭解某一具體模塊的可以參考下,博客地址https://blog.csdn.net/yejingtao703,當然這麼廣的領域很多東西我掌握的並不是很深,日後抓緊一切時間努力學習吧。

最近寶寶出世,我也更換了新的工作環境,來到了新的平臺,想在智能運維領域發展下,爭取在這一方向能留下自己一個腳印。所以後面要專心學習和養娃,等沉澱一段事件後再回來把自己所學的與大家分享。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章