Web前端需要熟悉大學裡[高大上]計算專業課嗎?

比如 演算法、數據結構、操作系統、編譯原理、線性結構、離散數學

我知道這些東西知道的比不知道的好得多,但是奈何沒有體驗過大學生活的我不知道這些東西

如果以後想從事前端開發的工作,那麼前面提到的大學課程是否需要有必要去了解呢?


我以自己的經歷告訴你:

非常重要,它決定了你能走到什麼高度

前端的發展非常快, 以至於你今天關注的新東西,明年再看可能就截然不同甚至被廢棄了。

所以保持高的學習力來應對這種變化非常重要。高的學習力在很大程度上和你的計算機基礎緊密相關(先拋開智力等不可抗因素), 樓上有些同學提到的WebGL、預處理語言 追溯到常規計算機領域,不過就是OpenGL(計算機圖形學)和 編譯原理等領域,

現在純前端範疇里還幾乎沒有出現新創的知識領域, 但是反過來說,從來沒有一個領域有Web前端這麼飛速發展,不斷的有在舊知識體系在它上面重演。

我記得有一句名言大概是這個意思:所有東西都會用js實現一遍。 我現在深以為然。

最後,我分享下之前在微博列出的書單,自從我意識到上面所說的一切之後,我就完全沒買過任何純前端範疇的書籍了,因為其實每天在微博或社區里得到的前端相關的知識已經快膨脹到我難以承受了。

當然,我的意思並不是前端的知識就不重要了。 如何平衡 你現在的價值未來的價值 其實也是門學問。

2015-04-21 更新

--------------------

有同學可能會說我雞湯,恰巧我發現@岳逢楽 同學在 Web前端需要熟悉大學裡[高大上]計算專業課嗎? - 岳逢楽的回答 和托一樣幫我列了幾個我嘗試過的點:

  • mcss(leeluolee/mcss · GitHub): css預處理語言,這個工具實現的比較重型,函數為first-class。但是常規使用與Sass無異。
  • regularjs (regularjs/regular · GitHub): 活動模板引擎,類似react/ractive/vuejs的組件級框架
  • clip3d(leeluolee/clip3d · GitHub): 打了計算機圖形學的擦邊球,不過很多圖形學基礎知識在源碼里都有涉及, 注意不是使用transform做出來的效果。

從整體的計算機領域來講,這些都不是什麼高深莫測的東西, 但是如果你自我受限於前端範疇的知識,而不去培養自己的計算機基礎,可能是無法寫出類似的東西的。

更重要的是領域之間的知識碰撞是可能產生不一樣的思維火花的,這種感覺很奇妙


學科素養決定你在技術上能達到的深度,在前端也一樣。


如果以後想從事前端開發的工作,那麼前面提到的大學課程是否需要有必要去了解呢?

我覺得這關鍵在「以後」到底有多後……如果只是兩三年,那麼並沒什麼必要。如果超過五年,甚至十年、二十年,首先你要考慮到時候還存不存在前端這個職位的問題,其次你要考慮即使前端依然存在,又會是什麼形態的問題。

十幾二十年前搞個網站很容易,寫個 HTML,可能連 CSS 都沒有就用些 & 之類的東西裝飾一下,然後放到一個靜態伺服器就好了,或許都不需要會編程,只要會些計算機基本操作就挺了不起了。

再看看今天的前端,還保留了多少當年的東西,又增加了多少東西呢?現在各大公司的前端招聘要求放到當年去看是不是完全無法想像?Gmail,Google Docs,Google Maps 之類的東西放到十幾二十年前看是不是也很無法想像?

然後你再想像一下十幾二十年以後大概就知道了……

Update:

最近又想起了當年我跟我爹說我想做程序員的時候,他給我舉的一個例子:70年代的時候,開車也是很吃香的一門技能。

同樣的道理,以後可能程序員就跟司機一樣,有了自動檔這類工具和更便捷的汽車設計之後,並不是多麼特別的工作。雖然現在DW看上去似乎是很low的技能,但我覺得這種圖形界面的開發工具在未來最終會取代現在的手工寫UI代碼的模式。當 Web 標準推廣,瀏覽器兼容性和各種開發工具的易用性跟上的時候,可能普通水平的小學生都能幹現在看上去很難的前端項目了。現在前端糾結的很多技術難題和熱點,很可能十幾年後就埋沒在歷史的塵埃了,如果完全撲在上面而不注重基礎的學習,得到的回報時效性會很低。或許現在看來這些似乎是很遠的事,但依照前端社區現在進步的速度,這樣的浪潮到來的時間很可能比你想像的要快得多。當然這個時候專業的前端可能進化成另一個樣子,但我相信不管怎麼進化,肯定都是朝著越來越需要這些基礎知識的方向的。


這個問題比較老了,不過我看著覺得還蠻有意思的,自己回答一下看看。

先說結論。

如果你只希望做一個普通的碼頁面的前端,一點一點的積累一些經驗和技巧以謀求生活,那麼是不需要的。

如果你熱愛代碼,熱愛前端,希望讓自己的工作越來越有趣,越來越有意義,那麼非常有用的。

隨著時代的變革,前端的職能已經不僅僅只是簡單的切圖製作頁面了。前端工程師的職能也開始越大越全越深入,而且前端技術的發展也迫使我們需要有更高的職業素養。這個時候的前端工程師,首先,是一名工程師。

我覺得需要學習這些基礎課程的原因有三點:

  1. 前端的職能在發生轉變,我們需要應對桌面端web,桌面端應用,移動端web,hybrid,node應用等等不同的挑戰。雖然說這些可能是可以繼續細分下去的,但是我覺得作為一個稱職的前端,理應有可以自己掌控這些知識的能力。
  2. 前端的技術,工具發展速度極快。例如我們現在常用的babel,eslint,如果你想自己寫一些loader,plugin,是不是需要一些編譯原理相關的知識?常用的node,如果不了解伺服器端開發,那麼寫出來的代碼一定非常糟糕。至於webgl之類的就更不用說了。
  3. 高新技術的門檻的不斷下降。在過去,圖像識別,機器學習等的門檻都相對較高,但是在現在,完善的工具庫已經給了普羅大眾一個非常低的使用門檻。而隨之而來的,就是別的技術對於這些技術的低成本應用。你是否有考慮過用圖像識別來做一定程度的界面生成或者測試?或者機器學習對於前端的應用。這些都是令人興奮的場景。

在上學的時候,我也覺得前端學這些是沒意義的。不過在上這些課的時候,也仍然會根據自己的興趣去做一定的了解或者深入,說實話,知識大多是非常有趣的。而現在工作了,結果這些知識就馬上開始用上了。現在我在工作中已經使用到了一部分圖像識別和編譯原理的知識。

不過需要學的東西那麼多,也沒必要說需要將每一門都去做深做透,畢竟人的時間是有限的。除了陪可愛的女朋友,陪可愛的女朋友,陪可愛的女朋友之外,畢竟時間還是不多的。但是對於這些知識有一定程度的了解是有意義的,可以讓你有更強的決斷力來考慮一些更好的方案,並且做出一個些更有趣的東西。

PS:突然想起來還有一個原因,那就是這樣很開心啊。寫代碼,不就是圖個開心嗎,不開心還寫什麼代碼啊。我們生在一個技術不斷迅猛發展的時代,我們執掌著代碼的權柄,可以去用盡全力,用各種工具去描繪屬於自己的世界,這真的是太棒了。


短線:還不如刷JS面試題,做幾個私活頁面。

長線:太有用了,現在要是回到那時候我一定更努力地學。


首先,關於「前端」的理解,有兩種方式:

    • 狹義地講:切頁面就是了(通常專指網頁)。
    • 廣義地講:是全平台上交互邏輯和表現後台數據邏輯之間的技術中間層。

如果你的目標只是切頁面、切更多的頁面,你可以找知乎上某當老師掏錢拜師,想必你也不會來這裡問。

稍微舉點例子:

  • 比如想要做數據可視化的頁面,如果你不會數據結構,怕是連D3.js的API都用不好。

  • 比如想要做消息通知,就要處理長連接,就需要知道TCP里長連接或者WebSocket是怎麼回事。
  • 比如想要做在線聊天的前端(或者是這種模型下的消息轉發),為了承載大並發,極有可能會自行定製HTTP Header,這個跟上面一樣,是屬於計算機網路的知識。
  • 反正我是在前端處理過最小子串的演算法,網頁遊戲里實現A*演算法也是很常見的,這是演算法吧。
  • 簡單的AJAX、複雜的交互效果,很大程度上依賴「非同步」,這個是操作系統裡面的概念。
  • 還有JavaScript這個東西,我想說的不是ES6,而是ES背後的程序設計語言這個領域。儘管寫前端的完全不需要成為PL專家,但從這個角度看,學習一下程序設計語言編譯原理函數式編程完全不過分;更何況有時候還需要生成並處理JSON-Format AST呢。
  • 還有更多的複雜的前端應用,比如FM電台、音樂播放器、Terminal、富文本編輯器等等,以及一些前端開發框架,你猜這些都用到了哪些「高大上的專業課」?

然而僅僅是切圖及常規的開發,也需要懂:

  • 瀏覽器內核
  • HTML、CSS的規範標準
  • HTTP協議
  • JavaScript語言

只是切個圖,想要切好也不是那麼容易的事情。

綜上,Web前端的綜合實力是非常硬的,絕不是花拳繡腿;而這種硬實力的背後就是那些「基礎課」。


現在我反正覺得越來越有必要,甚至十分重要。


拿親身經驗來說吧

《計算機網路基礎》讓我了解了TCP/IP協議,至少讓我知道了互聯網上的計算機之間是如何聯繫起來如何通信的;讓我知道了把DNS伺服器設置成8.8.8.8就可以在校內伺服器癱瘓的時候正常訪問網路;把DNS伺服器設置成114.114.114.114就可以讓App Store下載速度如飛一般,至少不光會裝Win7/Win8還會裝Win Server

《Web程序設計》讓我會用了Visual Studio,知道了什麼是C#,會用控制項做個簡單的交互,也是從此開始我迷上了Web開發,不過我還是在一位大神而不是老師的帶領下毅然決然跳入了PHP的坑,學會了用Wordpress建站,學會了寫爬蟲…

《網路系統管理》讓我知道了誰是Linus,知道了Ubuntu是Linux,Red Hat也是Linux,雖然在這之前就會用Bash了,不過課程介紹的一些背景知識讓我了解了我用的這些技術到底叫什麼名字,是誰創造出來的,我覺得這對我也很重要。

《信息檢索》讓我學會了。。。反正現在是什麼都能搜到了,不管…什麼…都能…搜到,有需要的可以和我交換資源

《資料庫編程與應用》讓我知道了資料庫原來就是一張表(不包括非關),老師教我們用一款幾十年前的名叫VFP的軟體做程序,後來我學會了MySQL就和幾個同學一起教老師MySQL.

《數據結構》不好意思這門課我差點掛了,一直對數據結構抱有敬畏之心,對演算法神充滿敬仰,我除了二叉樹和快速排序其他的啥也不會,所以只要遇到演算法神就會跪倒在地膜拜,這個有啥用?BAT面試基本都會問有關演算法的腦筋急轉彎,要是你答不上來就呵呵呵呵呵呵呵…

===========================

大學的課程能夠教會我們什麼?

老師掌握的知識可能都是上個世紀的

其實很多時候我們學習的知識都是舊的,我們學的都是古典數學和經典物理之類的東西

但這些課程的意義是

它們給我們創造了一個環境,提供了一個契機,發掘我們內心深處對知識的渴望

我敢說如果沒有學習過這個課程

我永遠都不會有今天


程序 = 演算法 + 數據結構

前端工程師也是程序員,演算法和數據結構是沒法逃得開的。

當然,如果你是一個聰明的同學,就算基礎不好,工作兩三年之後也會有很多自己的總結收穫,甚至有了一些自己覺得獨到的經驗。

直到有一天你會發現,你的經驗都已經寫在二十年前的計算機教材中了。

給你們舉個例子:http://www.zhihu.com/question/46255158/answer/100665901

p.s. 這些都是基礎課啊,怎麼就高大上了... 人工智慧,計算機圖形學,還能貼點高大上的邊...


我記得以前我的學長說,

School of Computing(計算機學院)里大多數的課上的內容你平時是用不到的。但是他們教給你的不是死板的知識,而是靈活的思想

我大一學離散數學,講到數論、圖論。我當時其實挺不屑的。因為我覺得寫代碼哪裡用的到這個。後來學演算法和數據結構,各種各樣的排序演算法、千奇百怪的數據結構,我當時很失望,也很絕望。因為我覺得這些東西學了似乎真的沒什麼用。

可是後來我明白,這些課的重點不是內容,而是思想。計算機科學,如果用一個字概括,就是Abstraction(抽象化)。你要學會把大的問題,簡化成小的問題。把複雜的現實,抽象成簡單的模型。

當客戶交給你一個頁面讓你實現的時候,你如何梳理出網頁的框架結構,進而寫成HTML?怎樣把一個複雜的結構變成簡單小結構的組合?很多演算法的核心思想就是這個——Divide and Conquer。

在前端領域中,

寫js的時候怎樣寫才簡潔高效?

toggle a的值的時候是用

a = (a + 1) % 2;

還是

if (a === 1) {
a = 0;
} else {
a = 1;
}

HTML怎樣結構、CSS的selector如何寫才能保證代碼重用率最高?

寫AJAX的時候用GET還是POST?

如果進入後端,

資料庫怎樣配置更經濟?

要不要API伺服器和內容伺服器獨立分開?

……

這些問題,學好了上述的課,自然就有了答案。現在回想起來,如果那些課好好學,或許我現在寫的代碼會更簡練,會更高效。他們之所以是基礎,是有原因的。

另外,如果對圖形有興趣,線性代數、微積分和統計都會很有用。


政治正確的講,你只要沒法證明你未來用不到某種知識,那麼就應該學。

事實呢,對於90%以上的人來說,這些都是bullshit。

學習是要分層次的,先學會,能做一些有用的東西。尤其是先把你想參與的工作、項目中用到的知識學會。

如果你打算用js寫一個操作系統,當然需要熟悉操作系統原理啦;你想用js在瀏覽器實現一個3d遊戲,當然需要學圖形學啦。問題是我很感興趣這種人真的是「前端開發」嗎?占前端人員的百分之幾?

不分人,不分具體工作性質,動不動就拿出渲染器3D效果解釋器之類的,理論上說用得到不?還真用得到。用上的概率呢?實用程度呢?

說得難聽點,你TM頁面都畫不正呢,想那些高大上的東西有毛用?

淘寶騰訊百度訪問量最大的頁面里,我想請教各位高手,用到了哪些圖形學知識?哪些編譯原理知識?甚至,哪些數據結構和演算法知識?

當然啦,如果較真會說什麼列表啦,哈希表啦,演算法時間空間複雜度啦,dom其實是一顆樹啦,瀏覽器就是個大解釋器啦,dom解析也是要會寫tokenizer的啦。問題是:你是在用這些數據結構,而不是在實現這些數據結構。學會正確理解和使用這些數據結構,還真用不著刷爆一本算導。

你應該學什麼知識,會用到什麼知識,幾乎只和你做的工作有關。

如果你目的是成為基礎紮實,技能門檻很高(甚至無所不能)的工程師,那麼學那些沒什麼不好的,甚至是必須的。

但如果你就是想做個discuz、百度貼吧、淘寶、支付寶的前端,那麼投入那些就不一定真的划算了。

這世界上幾乎沒有廢物技能,但亂點技能點練廢了的人有的是

打魔獸世界的網吧擼管男都知道技能點不能橫著點,也不能豎著瞎點,要按照需求有針對性的點,想出什麼大招和組合要明確了,否則很容易練廢。

浮躁是很不好的,為了避免浮躁而啥都不分主次的學,其實是另一種浮躁。只是給自己一個「我很踏實」的錯覺而已。

另一方面,在學好目標技能,感覺很難進展的情況下,學習更深更廣的領域,不失為一條突破瓶頸的好辦法。前提是,你真屬於那10%甚至1%。


就日常搬磚而言,這些課程基本都用不上。

但一旦你需要嘗試突破,做一些有挑戰性的東西,就需要用到這些課程,舉幾個例子吧。

  • 前後端分離的概念一出來,需要模板渲染,你想要對其進行改進,可你不會編譯原理呀,就只能用別人寫的模板引擎搬磚
  • CSS是聲明式的語言,不具有編程特性,寫起來又繁瑣又累,你想要對其進行改進,可你不會編譯原理呀,就只能用別人寫的LESS/SASS/Stylus搬磚
  • WebGL一出來,直接用低層API寫業務多累,你想要對其進行改進,可你不會線性代數和圖形學知識呀,就只能用別人寫的物理引擎搬磚

編譯原理和圖形學真是我的心頭痛T_T。


這些技術決定了你的天花板高度


在你需要從後端取到數據然後根據非常多的條件進行排序分組顯示的時候,在你想實現一組簡單的輸入框,每個輸入框不同的輸入狀態都有不同的顯示狀態而不懂狀態機的時候,你可能會需要這些你所謂的【專業知識】。但是就算不懂這些,也可以用簡單的嵌套的for循環(插入排序)加if else來解決(大多數情況下基本不會影響效率,可能會影響到代碼可讀性)。但是我一直認為,不管是前端後端什麼端,首先都屬於【計算機科學】的一部分。一些搞android ios的也不一定對演算法數據結構之類的了如指掌,但是我認為了解必要的演算法數據結構數學知識和相關的計算機科學理論知識(操作系統,硬體軟體,網路),是我作為一個程序員的基本修養(只對我不對別人,其實很大多數情況下都沒什麼用),以及是寫出優雅代碼的基本保證。


從我的感覺來看,入門到找一份低端的前端工作,都不怎麼需要了解大學的計算機課程。但是如果學到javascript的進階實際上需要理解很多後端的思想,比如面向對象、設計模式等等,這個時候如果沒有大學課程的基礎會很迷茫,很難進步的。


不需要

阿里的最高前端P9 大人親口說

會了這個也不會用CSS畫機器貓

計算機基礎知識不牢的前端都是瞎扯淡嗎?為什麼?對於前端來說哪些計算機基礎知識很重要? - 玉伯的回答

P9的話你敢不聽

人家可是總監級的

甭自己耽誤功夫了


分頁阅读: 1 2