作者:余果 | 騰訊社交用戶體驗設計部高級UI工程師,前端開發組負責人,UI開發通道評委,騰訊雲特邀佈道師,《Web全棧工程師的自我修養》作者。

此文已由作者授權騰訊雲+社區發布,原文鏈接:cloud.tencent.com/devel

在上一篇文章中,我們定義了「未來」的時間段,也描述了如何「面向未來」去學習。簡單的總結下,沒有實踐場景,學不到真正的技術。如果不動手去做,讀再多書也不會學到新技術。

在本文中,我們繼續聊聊如何「跨界開發」。

我在騰訊的社交用戶體驗設計部工作,在這不長不短的6年多工作經驗中,跟很多設計師打交道,也跟很多工程師打交道。我學到的一個寶貴知識是,設計不等於藝術,工程不等於科研。

設計不等於藝術。用文藝的話說就是「藝術發現問題,設計解決問題」。也即是說,設計為商業服務。作為上市公司的設計部門,需要清晰地展現產品,構建用戶的渴望。在某種程度上,需要隱藏個人的「術」,而構建一個系統性的體驗給用戶。設計的創作雖然也依賴靈感,但整體上是科學的、可推導的。

工程不等於科研。科研需要在一個專精的技術點上達到一百分,甚至突破人類知識的最外層,達到101分。但是在工程的場景下,更重要的是投入恰到好處的技能點去實現現階段的目標。

因此,當我想要獨自創建一個自己的產品的時候,我自然而然在設計、前端、後端、APP客戶端等都投入了恰到好處的技能點。

再強調一下,我並不是想要做全棧工程師,所以學了這些技能,而是因為想要獨自做一些產品,在這個過程中,持續學習,不自覺領悟到了全棧工程師的一些心法。

我把這些心法都記錄在我的新書《Web全棧工程師的自我修養》中。

我有一個假說,那就是「好的前端工程師一定是好的全棧工程師,反之不一定」。

因為沒有數據證明,所以我必須老實承認,這只是我個人的一個假說。

以下是我的推導過程。

首先,如果我們都同意全棧工程師的定義是「能夠獨自完成一個產品的人」(而不是「精通一切技術的人」)。那麼一般的Web產品或者App產品會需要的能力,大體上分為「技術」、「學習」和「產品感」三個方面。

技術是實現一個產品需要的「工程能力」,包括下圖列出的前後端語言,數據結構和演算法,系統設計能力,資料庫,移動客戶端。

學習體現了持續學習和解決新問題的能力。除了圖中列出的技術,還有持續增長中的新技術,所以有效的學習能力必不可少。

產品感包括對用戶體驗的理解,以及根據產品數據來持續迭代產品的能力。為什麼產品感很重要?App Store有一些優秀的App,是由個人開發者獨立開發的,他們完成了從構思到設計、從開發到發布的整個過程。如果沒有良好的產品感,是無法實現從「程序員」到「工程師」的轉變的。

前端工程師在學習和產品感上都有天然的優勢。

因為國內即使是最優秀的大學,也沒有「前端」這門專業。vue.js的作者Evan本科學的是藝術史,Node大神TJ是學設計,都不是計算機專業。最終進入到前端領域,靠的是愛好、勤奮和學習能力。所以我想「前端工程師學習能力強」這一點應該沒有人能反駁。

在產品感上,因為前端經常跟用戶界面打交道,所以在工作中就會思考怎樣的用戶界面會吸引用戶。用戶可能使用多種多樣的瀏覽器和設備訪問網站,因此也需要同理心來感受用戶的實際訪問情況。再次強調,「沒有實踐場景,就不會有陣子的成長」,前端會在「產品感」上有更多實踐場景。

當然,不是所有的前端都有這樣的想法,但是對於走心的前端來說,提升整體能力的機會有很多很多。

對於前端工程師而言,比較熟練的自然是前端技術(HTML/CSS/JavaScript),而熟練使用前端技術的前提,就是對系統有所理解。

系統設計是指使用軟體工程的方式架構一個軟體系統,能夠對應解決現實生活中的實際問題。我的感覺是,在軟體系統中經常會用到HTTP協議,來進行客戶端和伺服器端的通信,甚至伺服器和伺服器之間的通信。對於必須掌握HTTP的前端工程師來說,往往已經有大概的了解。

說到後端,語言其實並不構成很高的技術門檻。在伺服器端,如果不是用戶量特別大的系統,數據量都可以通過一台伺服器來處理完成的話,前端工程師也經常會跟後台API和簡單的模板型語言打交道。

只要投入時間,應用層的後端語言很快就能上手,你需要的只是一個使用後端語言的機會。

在學習後端語言時,我的建議是,專註項目,精簡需要的技能列表。

也就是說,如果你已經精通JavaScript,就直接使用Node開始搭建後端吧,不要去學PHP或Java了。除了增加複雜度,並沒有太大意義。

人類的大腦並不是為了處理複雜項目而設計。人類從原始村落進步到現代化都市,不是因為發生了基因或生理上的進化,而是協作方式發生了改變(分解複雜項目,每人都遵循共同介面,只完成分解後的工作)。所以全棧工程師在學習技能時也應認識到自己大腦的極限。

當然,如果團隊對後端語言有要求,那必須遵循團隊已有的技術能力。

總之,不要在某一特定時間同時學習多門語言,除了增加技術複雜度,沒有任何意義。

說到Node,推薦一個網站。它是《軟體隨想錄》作者Joel最新的革命性產品,能夠讓開發者以最快方式開發Node程序,而無需購買伺服器和搭建開發環境。

如圖,在package.jsondependencies里加入新的依賴庫名稱和版本號,保存,伺服器會自動下載好對應的庫到你的node_modules目錄中。

還提供庫名補全功能。

接下來你就可以直接在代碼中使用這個庫了,因為這個庫已經安裝在雲端的「本地了」,太方便了!

說說移動客戶端開發吧,具體而言是指iOS和Android客戶端。

客戶端原生開發與前端開發的相似之處是,本質上都只對數據進渲染,生成用戶界面,以及對用戶行為做出響應。從2015年開始,客戶端開發和前端開發有越來越多的相似點,比如使用MVC的架構方式來把界面、邏輯和數據分開,比如都可以用React技術棧來實現。

當前端工程師接觸到客戶端原生開發,絕對會有一種「打開新天地」的感覺!原本依賴客戶端提供的設備介面,現在全都可以通過原生介面直接操作;原本超過幾千行就崩潰的圖文表單,使用原生UITableView可以如黃油般順滑。

如果希望復用已有的技能,而不是從頭開始學習原生語言開始學習,可以考慮Hybrid(混合式)和React-Native兩種方案。

對於Hybrid無需多言,實際上就是Web頁面在WebView中的渲染,只要你熟悉移動站點開發,就能直接上手Hybrid開發。這種方式優點是足夠簡單,缺點是載入會比較慢,而且無法渲染大量數據。

對於React-Native而言,雖然跟Hybrid一樣使用JavaScript作為編程語言,但是另一種解決思路。React重新定義了一種渲染界面、處理數據和處理交互的編程方法,然後在各個平台中都能渲染成原生界面。通過這種方式,React宣稱實現了「Learn once, write everywhere」。

因為React-Native實際上會編譯成原生界面,所以性能一般比Hybrid好。React-Native正在提供越來越多的組件,但是要注意的是,有一些組件比其他組件性能更好。比如NavigatorNavigatorIOS都能實現應用內導航,但NavigatorIOS是直接封裝了iOS的Navigator,所以性能更好。

在選擇組件時,我們需要根據性能和開發方便做權衡。如果對性能要求不高,那麼使用Navigator即可,如果對性能要求很高,就應該針對iOS平台使用NavigatorIOS,對Android平台使用其他技術或者Navigator。

演算法和數據結構,在大學計算機課程中佔了很大比重。各種ACM競賽也主要考察演算法和數據結構,讓一些學生認為這就是軟體工程中最重要的部分。

實際上,「演算法和數據結構」可以認為是和「系統設計」相反的技能樹。理論走的是深度,是在追問在給定的計算能力約束下如何把一個問題解決得更快更好。而系統走的是廣度,是在追問對於一個現實的需求如何在眾多的技術中設計出最多快好省的技術組合。

現代的編程語言有很高的抽象程度,程序員無需掌控到內存級別的分配和釋放,只要使用高級抽象的數據結構即可。JavaScript本身沒有複雜的數據結構,但是使用prototype和閉包可以模擬出任何數據結構(包括樹和鏈表),更有甚者,通過第三方庫(比如underscore)可以作為增強版的JavaScript來使用。

「演算法和數據結構」應該是基礎內功,沒有內功,只剩招數,無法成為絕世高手。很多自學成才的前端不理解演算法,可能會寫出渲染性能很糟糕的網站。

那麼如何提升演算法和數據結構能力呢?推薦一個網站

現在大部分題目已經支持JavaScript。

下面聊一下資料庫。

資料庫往往是網站發展到一定規模之後的最終瓶頸。

這並不是我的個人觀點,而是得到了大量網站證實。在用戶量激增、feeds數激增時,第一個扛不住的就是資料庫。所以當我們聊website scale,可能一半的時間都在聊資料庫的擴展。

MobgoDB 是一個面向文檔( document- oriented) 的 資料庫, 而不是關係型資料庫。面向文檔有這樣幾個好處:

1.易於使用:不再有行(row)的概念,取而代之是文檔(document),因此更加靈活,也更符合現代面向對象語言的開發者對數據的看法。此外,key跟value不再是固定的類型和大小,因此,添加和刪除欄位變得更加容易了,實驗可以很容易地進行。

2.易於擴展:資料庫的大小正在加速增長,這也是符合安迪-比爾定律的。既然資料庫的增長變成必然,那麼如何擴展?從技術上分為縱向擴展(scale up)和橫向擴展(scale out)兩種思路。縱向擴展是指增加單個計算機的性能,使用更大的內存、更快的CPU和更大的硬碟。但是縱向擴展畢竟會遭遇性價比評價,所以現在的大型互聯網系統都採用橫向擴展的思路,將多個普通的計算機連接成為集群。基於此,想要增加性能只需要添加一台普通的計算機到集群就好了。

不過,管理1000台計算機集群顯然比管理一台計算機困難的多。

MobgoDB採用橫向擴展的架構設計,面向文檔的數據類型時它能夠輕鬆地在多台伺服器之間進行數據分割。MobgoDB能夠自動處理跨級群的數據和負載,自動重新分配文檔,以及將用戶請求到正確的機器上。這樣,開發者能夠集中精力寫程序,而不用擔心擴展的問題。

安迪-比爾定律:Andy gives, Bill takes away.(安迪提供什麼,比爾拿走什麼。) 安迪指英特爾前CEO安迪·格魯夫,比爾指微軟前任CEO比爾·蓋茨,這句話的意思是,硬體提高的性能,很快被軟體消耗掉了。

3.卓越的性能:MobgoDB的一個主要目標是提供卓越的性能。在一些設計中,這一目標得以體現。比如MobgoDB能對文檔進行動態填充(dynamic padding),也能預先分配文件以利用額外的空間來換取穩定的性能。總之,MongoDB在各方面的設計都旨在保持它的高性能

關於橫向擴展,騰訊雲的雲伺服器支持彈性定價,當用戶達到一定級別時可以隨時擴展。此外,騰訊雲還支持各種關係型資料庫、文檔型資料庫和資料庫緩存機制。現在,騰訊雲有對學生的特別優惠活動,只要上傳學生證,就可以以1元低價獲得域名+伺服器。(參考地址)

好了,今天的分享就到這裡,謝謝大家。

涉及到的鏈接單獨放出一頁,大家可以拍照,字型大小很大,後排也能看到。這樣也許哪天在相冊翻出來也會想到吧(哈哈)。

歡迎大家前往騰訊雲+社區或關注云加社區微信公眾號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~

推薦閱讀:

相关文章