做者:餘果 | 騰訊社交用戶體驗設計部高級UI工程師,前端開發組負責人,UI開發通道評委,騰訊雲特邀佈道師,《Web全棧工程師的自我修養》做者。前端
此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/developer/article/1004498?fromSource=waituivue
在上一篇文章中,咱們定義了「將來」的時間段,也描述瞭如何「面向將來」去學習。簡單的總結下,沒有實踐場景,學不到真正的技術。若是不動手去作,讀再多書也不會學到新技術。node
在本文中,咱們繼續聊聊如何「跨界開發」。程序員
我在騰訊的社交用戶體驗設計部工做,在這不長不短的6年多工做經驗中,跟不少設計師打交道,也跟不少工程師打交道。我學到的一個寶貴知識是,設計不等於藝術,工程不等於科研。web
設計不等於藝術。用文藝的話說就是「藝術發現問題,設計解決問題」。也便是說,設計爲商業服務。做爲上市公司的設計部門,須要清晰地展示產品,構建用戶的渴望。在某種程度上,須要隱藏我的的「術」,而構建一個系統性的體驗給用戶。設計的創做雖然也依賴靈感,但總體上是科學的、可推導的。算法
工程不等於科研。科研須要在一個專精的技術點上達到一百分,甚至突破人類知識的最外層,達到101分。可是在工程的場景下,更重要的是投入恰到好處的技能點去實現現階段的目標。數據庫
所以,當我想要獨自建立一個本身的產品的時候,我天然而然在設計、前端、後端、APP客戶端等都投入了恰到好處的技能點。編程
再強調一下,我並非想要作全棧工程師,因此學了這些技能,而是由於想要獨自作一些產品,在這個過程當中,持續學習,不自覺領悟到了全棧工程師的一些心法。json
我把這些心法都記錄在個人新書《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.json
的dependencies
里加入新的依賴庫名稱和版本號,保存,服務器會自動下載好對應的庫到你的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正在提供愈來愈多的組件,可是要注意的是,有一些組件比其餘組件性能更好。好比Navigator
和NavigatorIOS
都能實現應用內導航,但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),第一時間獲取更多海量技術實踐乾貨哦~