WEB 前端菜鳥赏半,感覺很迷茫,該怎么做淆两?

如果身邊沒有一個(gè)能夠請(qǐng)教的人断箫,可以到這個(gè)WEB前端裙,里面有最新的學(xué)習(xí)路線和教程秋冰,可以跟著學(xué)仲义,有什么不懂的地方可以隨時(shí)在里面問,大家都會(huì)幫忙解答剑勾,下面就是這個(gè)WEB前端裙埃撵。

先是一個(gè)---518

中是一個(gè)---672

后是一個(gè)---693

NO.1

0x00 先說結(jié)論

我們可以把學(xué)習(xí)路線比作游戲中的段位上分,在不同的分段都有自己的定位和要鍛煉的事情:

青銅?-?從零開始小學(xué)生:懷著滿腔的熱血甥材,看到了這一個(gè)行業(yè)的希望和未來盯另,準(zhǔn)備開始學(xué)習(xí) Web 開發(fā)知識(shí)。

先通過 w3cschool 等免費(fèi)學(xué)習(xí)資源把 HTML洲赵、CSS 和 JavaScript 的基本操作學(xué)會(huì)了

寫一個(gè)簡(jiǎn)單的表白頁面送給你的女/男朋友,展示一下自己努力的成果商蕴,如果沒有就當(dāng)我沒說

白銀?- 懵懵懂懂初學(xué)者:懂得如何使用 HTML叠萍、CSS 和 JavaScript 三大件來實(shí)現(xiàn)基本頁面開發(fā)功能

選擇一個(gè)可以覆蓋多種場(chǎng)景、可以隨自己意愿調(diào)整難度的項(xiàng)目嘗試實(shí)現(xiàn)绪商,如博客系統(tǒng)苛谷、記賬本、Markdown 編輯器等

從 React 和 Vue 這兩個(gè)框架中選擇一個(gè)進(jìn)行學(xué)習(xí)

黃金?- 輕車熟路新玩家:懂得使用框架來實(shí)現(xiàn)上面所舉例項(xiàng)目

學(xué)習(xí) Redux格郁、Vuex 或者 MobX 等狀態(tài)管理工具腹殿,并將他們使用到前面的項(xiàng)目中

思考狀態(tài)管理工具為你的項(xiàng)目帶來了什么好處

鉑金 V?- 初出茅廬新司機(jī):?懂得如何使用腳手架創(chuàng)建項(xiàng)目,并且能將代碼結(jié)構(gòu)根據(jù)模塊化的思想進(jìn)行安排

學(xué)習(xí) TypeScript例书,對(duì)前面的項(xiàng)目進(jìn)行重寫锣尉,注重對(duì)數(shù)據(jù)結(jié)構(gòu)和類型的控制

學(xué)習(xí) Node.js,試著配合數(shù)據(jù)庫實(shí)現(xiàn)一個(gè)比博客系統(tǒng)更為復(fù)雜的 CMS(內(nèi)容管理系統(tǒng))决采,如 圖書館管理系統(tǒng)自沧、倉庫管理系統(tǒng)

鉑金 I?- 基本上手好司機(jī):如果是懂得如何利用 Node.js 或 TypeScript 編寫業(yè)務(wù)代碼的

思考在前面使用框架開發(fā)的項(xiàng)目中,有哪些代碼是重復(fù)冗余的树瞭,有哪些邏輯是可以在多個(gè)組件之間共用的

學(xué)習(xí)利用 ES2015 或更新的 JavaScript 標(biāo)準(zhǔn)拇厢,逐步替換使用框架所編寫的代碼

鉆石 V?- 淡定自然老司機(jī):如果是對(duì)邏輯抽象爱谁、模塊封裝有了一定的理解和經(jīng)驗(yàn)的

思考如何使用純 JavaScript 對(duì)業(yè)務(wù)組件中的非渲染、非 DOM 相關(guān)代碼進(jìn)行抽象

引入單元測(cè)試工具孝偎,對(duì)純邏輯代碼進(jìn)行測(cè)試访敌,爭(zhēng)取覆蓋率達(dá)到 80% 以上

鉆石 I?- 賽道新手初學(xué)者:如果上面的條件你都已經(jīng)滿足了

?思考不同的代碼哲學(xué)(OO、FP 等)衣盾、不同的代碼結(jié)構(gòu)(MVC捐顷、MVVM 等)的區(qū)別

思考不同的框架之間設(shè)計(jì)的初衷衅金,思考不同的編程語言中對(duì)同一類問題不同解法的區(qū)別

到這里我劃了一條從 0 到高級(jí)前端工程師級(jí)別的純技術(shù)路線襟衰。相信有不少有經(jīng)驗(yàn)的同學(xué)會(huì)發(fā)現(xiàn)中間我省略了不少內(nèi)容豺型,但也不難發(fā)現(xiàn)路線中從前半段的“學(xué)習(xí)”逐步變成后半段的“思考”特纤。優(yōu)秀的工程師除了需要有在純技術(shù)領(lǐng)域的沉淀以外墙贱,還需要更多對(duì)技術(shù)绩聘、團(tuán)隊(duì)镶摘、ROI(投資回報(bào)率)的思考砾脑,當(dāng)然這依然不足以支撐我們平穩(wěn)地渡過“程序員 35 歲危機(jī)”据悔,前面的路還有很長(zhǎng)传透,鉆石往上還有王者呢,誰說程序員就是青春飯碗的极颓?

回想起很多年前我也跟你一樣是一個(gè)完全的新手朱盐,從 0 開始慢慢自學(xué)摸索 Web 開發(fā),甚至后來我也沒有進(jìn)入科班學(xué)習(xí)計(jì)算機(jī)菠隆,那么來聽聽我作為一個(gè)“前人”是如何完全靠自學(xué)至今的故事吧兵琳。

NO.2

0x01 我的從 0 開始

我是一個(gè)完全從自學(xué)開始的前端工程師,想起來第一次接觸前端就是初中那會(huì)特別流行合租 VPS 然后注冊(cè)一個(gè) .tk 的免費(fèi)域名骇径。而作為一個(gè)剛?cè)腴T Web 開發(fā)不久的小屁孩來說躯肌,用這種方式一探“大人的世界”屬實(shí)讓人興奮。而當(dāng)時(shí)最流行的博客管理軟件就是用 PHP 寫的 WordPress破衔,作為一個(gè)十分成熟的 CMS 軟件來說 WordPress 當(dāng)時(shí)就有了非常豐富的社區(qū)資源清女,比如主題、模板晰筛、插件等等嫡丙。而作為一個(gè)十分注重個(gè)性化的小屁孩來說,當(dāng)然是要自己做一個(gè)主題的岸恋凇曙博!于是我就從此踏上了 Web 開發(fā)的不歸路,在此之前我所接觸的都是 Visual Basic 這樣的 Native 的語言卦方。

以 WordPress 主題作為切入點(diǎn)羊瘩,我開始學(xué)習(xí) PHP 用于調(diào)用 WordPress 的 API 并輸出內(nèi)容、學(xué)習(xí) HTML 用于寫主題的模板、學(xué)習(xí) CSS 用于“裝潢”我的博客尘吗、學(xué)習(xí)?jQuery?用于實(shí)現(xiàn)頁面動(dòng)態(tài)效果逝她。是的,那個(gè)時(shí)候基本上大部分人接觸的是 jQuery 而不是 JavaScript睬捶,一個(gè)$?函數(shù)就可以完成非常多的效果這讓我第一次感受到了“框架”所帶來的價(jià)值黔宛。于是便一步一步地發(fā)生了以下事情(不一定完全對(duì),畢竟時(shí)間過太久了):

我發(fā)現(xiàn)頁面上的一些樣式效果無法在 IE 瀏覽器上正常顯示擒贸,于是我就開始到網(wǎng)上學(xué)習(xí) CSS 在 IE 的各種特殊處理臀晃,包括 reset.css、normalize.css 等工具的使用介劫;

每次點(diǎn)擊鏈接都要刷新頁面徽惋,在那個(gè)網(wǎng)速不怎么好的年代體驗(yàn)非常糟糕,于是乎就開始研究怎么用 jQuery/JavaScript 實(shí)現(xiàn)不需要刷新頁面的情況下切換頁面的內(nèi)容座韵;

通過查看文檔發(fā)現(xiàn)瀏覽器支持一種叫做 XMLHTTPRequest 的技術(shù)险绘,可以讓我們不需要通過跳轉(zhuǎn)的方式從服務(wù)器獲取到信息,從這里開始了解到 HTML誉碴、XML 和 JSON 三種不同格式的區(qū)別宦棺;

第一次知道了可以通過服務(wù)器傳遞 JSON 格式的純數(shù)據(jù),然后前端通過 JavaScript 對(duì)數(shù)據(jù)進(jìn)行解析黔帕,并且結(jié)合前端的模板引擎渲染成完整的 HTML代咸;

從這里又可以學(xué)習(xí)到如何通過 URL 中的 path、query成黄、hash 以及 POST 和 PUT 請(qǐng)求正文等信息向服務(wù)器傳遞信息呐芥,服務(wù)器通過這些信息動(dòng)態(tài)地對(duì)各種數(shù)據(jù)進(jìn)行處理并返回結(jié)果;

SPA(Single Page Application)開發(fā)習(xí)慣初見雛形慨默;

這樣我就來到了“白銀”階段了贩耐。

NO.3

0x02 接觸 Node.js

當(dāng)我正在愉快地設(shè)計(jì)著 WordPress 的自定義主題時(shí),偶然間我在某前端網(wǎng)站上了解到了一個(gè)新的技術(shù) —— Node.js厦取。與它的相遇改變了我以后的學(xué)習(xí)路徑,影響至今管搪。2009 年 Ryan Dahl 發(fā)布了一個(gè)基于 Chrome JavaScript V8 引擎開發(fā)的程序運(yùn)行環(huán)境 Node.js虾攻,它允許開發(fā)者在除了瀏覽器以外的地方運(yùn)行 JavaScript 語言,并且提供一些標(biāo)準(zhǔn)庫允許 JavaScript 腳本啟動(dòng)進(jìn)行啟動(dòng)一個(gè) HTTP 服務(wù)端應(yīng)用這種以前在瀏覽器無法完成的事情更鲁。

這一份代碼是 2010 年寫在 Node.js 官網(wǎng)的一段實(shí)例代碼霎箍,機(jī)緣巧合之下我被這么一段簡(jiǎn)單的代碼深深地吸引住了,雖然當(dāng)時(shí)安裝它仍需要從 GitHub 上克隆整個(gè)項(xiàng)目代碼到本地并依次運(yùn)行以下指令:

這一次編譯就得花上至少十分鐘澡为,但完成安裝后運(yùn)行上面的一段代碼漂坏,并在瀏覽器中打開http://127.0.0.1:8124/,然后在瀏覽器上看到Hello World?字樣時(shí)仿佛新世界的門打開了。因?yàn)楫?dāng)時(shí)我所接觸過的服務(wù)端程序只有 PHP顶别,而 PHP 本質(zhì)上就是一個(gè)模板引擎谷徙,它并不能很直觀地處理請(qǐng)求本身而是借助 CGI 進(jìn)行響應(yīng)。能做更多的事情驯绎,這件事情對(duì)剛學(xué)習(xí)編程不久的新手來說是具有很大誘惑力的完慧。

從這里開始,Node.js 配合 npm 便開始了長(zhǎng)達(dá) 10 年的快速發(fā)展剩失。從純服務(wù)端應(yīng)用開發(fā)屈尼,到開發(fā)工具、工程工具拴孤,再到如今的 FaaS(Function as a Service脾歧,Serverless)開發(fā)方式。Node.js 已經(jīng)成為 Web 工程師不可或缺的一項(xiàng)技能演熟,不管是用來開發(fā)服務(wù)端應(yīng)用還是開發(fā)工具類應(yīng)用鞭执,甚至是使用 Electron 開發(fā)桌面端應(yīng)用還是配合 React Native 開發(fā)移動(dòng)端 App,Node.js 能讓前端工程師了解更多系統(tǒng)級(jí)別的概念绽媒,如網(wǎng)絡(luò)蚕冬、I/O、內(nèi)存是辕、文件系統(tǒng)等等囤热,這些很多都是原本在瀏覽器端上看不到的。而學(xué)習(xí)這些知識(shí)對(duì)你理解前端開發(fā)背后的一些原理有非常好的價(jià)值获三,就跟學(xué)習(xí)算法一樣旁蔼。

結(jié)論:請(qǐng)學(xué)習(xí) Node.js 和其中涉及到的一些基本計(jì)算機(jī)原理。

NO.4

0x03 框架時(shí)代

當(dāng)我在做 WordPress 主題的時(shí)候疙教,絕大部分的主題開發(fā)者都會(huì)在前端做一些簡(jiǎn)單的效果棺聊,甚至有甚者會(huì)通過 JavaScript 實(shí)現(xiàn)一些原本只能通過后端來完成的事情,比如文章列表贞谓、文章內(nèi)容的加載和渲染限佩。而當(dāng)年這些主題開發(fā)者基本上都會(huì)使用 jQuery 來進(jìn)行這些 JavaScript 的操作,因?yàn)榧兪謱?JavaScript 在當(dāng)時(shí)來說非常的繁瑣(ES4時(shí)代裸弦,很多現(xiàn)在被廣泛使用的原生 API 都仍未具備)所以當(dāng)時(shí) jQuery 就是大家的首選方案祟同。

從非常早的 PrototypeJS、后來的 jQuery理疙、進(jìn)入 MVC 時(shí)代的 Backbone晕城,AngularJS 開啟 MVVM 模式,React 引入 FP 的概念窖贤,Vue 成功開啟了漸進(jìn)式開發(fā)體驗(yàn)的道路砖顷。一路下來一地的雞毛贰锁,被各路人馬詬病前端領(lǐng)域一個(gè)月開發(fā)一個(gè)新框架,“學(xué)不動(dòng)了”滤蝠。然而作為一個(gè)也寫過框架豌熄、寫過工具類庫的開發(fā)者,我很喜歡用一個(gè)經(jīng)常用于泛科技領(lǐng)域的例子來類比前端領(lǐng)域:

科技的終極目標(biāo)几睛,就是讓人民感覺不到科技房轿。

jQuery 時(shí)代,前端開發(fā)者使用 JavaScript 的模式是從頁面中獲取 DOM 元素所森,添加事件囱持,然后通過class?和style?對(duì)頁面進(jìn)行動(dòng)態(tài)地變更,以完成對(duì)用戶行為的響應(yīng)焕济;

Backbone 時(shí)代纷妆,原本用在桌面端軟件開發(fā)中的 MVC 模式被引入到了前端開發(fā)中,前端開發(fā)者們發(fā)現(xiàn) Web 開發(fā)的復(fù)雜度已經(jīng)需要用這些更成熟的開發(fā)模式進(jìn)行管理了晴弃;

AngularJS 時(shí)代掩幢,從這里開始 Google 把數(shù)據(jù)雙向綁定模式帶到前端開發(fā)中,將原本需要通過 JavaScript 控制 DOM 元素這一繁瑣的操作變成了只需要關(guān)心 Model 層需要改動(dòng)什么內(nèi)容即可上鞠。而?Vue?則將這種模式的開發(fā)成本降低到了一種相當(dāng)可觀的程度际邻,讓很多新手開發(fā)者也能很簡(jiǎn)單地入手這種便捷的開發(fā)模式。React 時(shí)代芍阎,F(xiàn)acebook 的科學(xué)家們把函數(shù)式編程的思想引入到前端開發(fā)中世曾,注重的是數(shù)據(jù)鏈路的可跟蹤、可回溯谴咸、可管理轮听,讓整個(gè)數(shù)據(jù)鏈路是盡可能以單鏈路流轉(zhuǎn)。

雖然前端領(lǐng)域常被說“一個(gè)月一個(gè)新框架”岭佳,但實(shí)際上每一個(gè)框架在迭代的過程中都是解決了它們所在業(yè)務(wù)場(chǎng)景的實(shí)際需求的血巍,并不是“拍腦袋”地想要把每一個(gè)技術(shù)細(xì)節(jié)做出一個(gè) break change。

而目前我目前推薦的學(xué)習(xí)的框架是 React 和 Vue:

同樣都是目前最流行的框架之一珊随,而且可以預(yù)見未來 3~5 年內(nèi)都是能滿足找工作的需求的述寡;

React:引入函數(shù)式編程(Functional Programming)的概念,使得寫代碼的思路更加嚴(yán)謹(jǐn)叶洞,更具有可維護(hù)性和邏輯可導(dǎo)性辨赐;

Vue:將 MVVM 模式變得非常簡(jiǎn)單易于入手,把 Progressive JavaScript Framework 的定位實(shí)踐得非常到位京办。且如今 Vue 3.0 的 Composition API 更是在某種程度上將 Hooks 的玩法實(shí)現(xiàn)得比 React Hooks 更優(yōu);

結(jié)論:請(qǐng)不要害怕學(xué)習(xí)帆焕!不要懼怕新技術(shù)惭婿!

NO.5

0x04 工程之路

雖然我在接觸了框架和 Node.js 之后不恭,發(fā)現(xiàn) JavaScript 除了能實(shí)現(xiàn)一般只用于展示內(nèi)容和呈現(xiàn)簡(jiǎn)單交互以外還能做更多的事情。但本質(zhì)上還是圍繞著多個(gè)頁面進(jìn)行頁面上 DOM 元素的控制财饥,而直到我打開了 Google 的一些網(wǎng)站時(shí)换吧,我才發(fā)現(xiàn)原來網(wǎng)站除了能叫頁面以外,還能稱之為“應(yīng)用”钥星。自從 Google 上線了一個(gè)完全不需要刷新頁面就能完成所有事情而且體驗(yàn)很不錯(cuò)的 GMail 之后沾瓦,我們發(fā)現(xiàn)網(wǎng)頁原來也是可以承載那么復(fù)雜的邏輯和應(yīng)用場(chǎng)景的。大家的熱情異常地高漲谦炒,想著能不能讓自己所負(fù)責(zé)的項(xiàng)目也有這么厲害高級(jí)的樣子贯莺。但隨著項(xiàng)目不斷地復(fù)雜,代碼規(guī)模也變得非常難以管理宁改,而這個(gè)時(shí)候就需要工程化的引入缕探。工程化協(xié)作

對(duì)于企業(yè)來說除了研發(fā)效率要足夠高以外,研發(fā)鏈路的安全还蹲、合規(guī)也是同樣重要的爹耗。什么叫安全合規(guī)?可管理的代碼版本谜喊、可控制的發(fā)布流程潭兽、可管控的灰度機(jī)制,都是大廠用于保證項(xiàng)目流程穩(wěn)定進(jìn)行的必要工具斗遏。有很多初學(xué)者或者還沒有大公司經(jīng)驗(yàn)的同學(xué)在寫項(xiàng)目時(shí)都是單打獨(dú)斗的山卦,但更多的一線項(xiàng)目都需要至少 2~3 個(gè)甚至更多的人員一同參與開發(fā)的。而這種時(shí)候最易,因?yàn)槊總€(gè)人的水平和開發(fā)習(xí)慣都是不一致的怒坯,而這些不一致就直接導(dǎo)致整體研發(fā)效率和項(xiàng)目進(jìn)度受到極大的影響。所以就需要一種能夠讓大家在一個(gè)水平線上進(jìn)行開發(fā)的模式藻懒,工程化需求便應(yīng)運(yùn)而生剔猿。

版本控制

Git:GitHub、GitLab嬉荆、Coding……

SVN:BitBucket归敬、Google Code……

代碼樣式檢查工具 JavaScript/TypeScript:ESLint

測(cè)試工具

單元測(cè)試:Karma、Jest鄙早、Mocha……

持續(xù)集成:CI

……

工程化開發(fā)工具

從直接將 JavaScript 代碼用<script>?標(biāo)簽汪茧,到需要將 jQuery 文件和主要程序文件分別引入,再到 Node.js 出現(xiàn)后使用 npm 進(jìn)行依賴庫管理并使用 webpack 進(jìn)行打包和壓縮限番。工程類工具的發(fā)展見證著前端工程近十年的發(fā)展歷史舱污,對(duì)目前我們所常用的工程工具有更好的了解和實(shí)踐,絕對(duì)是通往優(yōu)秀路上不可或缺的一步弥虐。

依賴包管理工具:npm扩灯、yarn

打包工具:webpack媚赖、rollup

腳手架工具:create-react-app……

工程化開發(fā)語言

相信很多同學(xué)都聽說過 JavaScript 誕生之初的一些軼事,比如根本沒有特別多的嚴(yán)謹(jǐn)思考珠插,或者在非常多的場(chǎng)景中十分地晦澀惧磺,比如隱性轉(zhuǎn)換等。有人認(rèn)為 JavaScript 能發(fā)展到如今的地位跟它的這種“靈活度”或者“松散度”有關(guān)聯(lián)捻撑,雖然在某種程度上確實(shí)因?yàn)檫@種特性造成的 JavaScript 學(xué)習(xí)門檻比較低而間接導(dǎo)致磨隘。但就如我上面所說,當(dāng)項(xiàng)目規(guī)模和人員規(guī)模不斷發(fā)展乃至膨脹過后顾患,這些特性會(huì)逐漸表現(xiàn)出來非常糟糕的體驗(yàn):

團(tuán)隊(duì)之間因?yàn)闆]有良好的技術(shù)文檔沉淀番捂,信息不對(duì)等的情況直接導(dǎo)致代碼在沒有良好的單元測(cè)試時(shí)出現(xiàn)邏輯沖突;

第三方依賴庫的 API 在設(shè)計(jì)上大量使用了 JavaScript 松散的特性描验,導(dǎo)致使用方在引用時(shí)頻繁出現(xiàn)“迷惑”的狀態(tài)白嘁;

當(dāng)需要使用 JavaScript 與其他語言(特別是強(qiáng)類型語言)進(jìn)行交互時(shí),JS 過于松散的習(xí)慣會(huì)讓對(duì)接方感到非常迷惑膘流,對(duì)于雙方的實(shí)際接入成本會(huì)比前期預(yù)估的大得多絮缅;

為了解決這種情況,來自不同編程領(lǐng)域的大牛們都紛紛開始想辦法呼股,于是乎便誕生了非常多的“輪子”:

Java 系:Scala.js耕魄、ClojureScript

Go 系:GopherJS

Microsoft:TypeScript

Facebook:Flow、Reason

目前?TypeScript?已經(jīng)影響了前端乃至整個(gè) Web 領(lǐng)域的開發(fā)生態(tài)彭谁,TypeScript 之父 Anders Hejlsberg 創(chuàng)造過 Turbo Pascal吸奴、Delphi、C# 等在整個(gè)計(jì)算機(jī)科學(xué)領(lǐng)域都舉足輕重的語言缠局,而 TypeScript 又再次創(chuàng)造出翻天覆地的變化:

強(qiáng)類型的引入能讓我們?cè)趯懘a的時(shí)候從值優(yōu)先的思維轉(zhuǎn)變成類型優(yōu)先则奥;

強(qiáng)類型的引入能幫助開發(fā)工具(IDE 等)更好地為開發(fā)者提供便利性能力,如智能補(bǔ)全狭园、類型檢測(cè)读处、編譯時(shí)檢查等等;

TypeScript 可以讓 JavaScript 更好地與其他語言進(jìn)行交互唱矛,甚至轉(zhuǎn)換為其他語言罚舱;

工程化通用組件

當(dāng)需求不斷變多后,“愛偷懶”的工程師們就會(huì)把經(jīng)常用到的內(nèi)容進(jìn)行抽象绎谦,比如從很早以前就有的 ExtJS管闷、Twitter 工程師發(fā)布的 Bootstrap 再到今天的 Ant Design、Element UI 等窃肠,都幫助我們更快更好更穩(wěn)定地完成一些通用頁面能力的開發(fā)包个。

React:Ant Design、Fusion Design

Vue:Element UI冤留、iView赃蛛、Ant Design of Vue

NO.6

0x05 邏輯抽象能力

隨著我對(duì) JavaScript 應(yīng)用的編寫經(jīng)驗(yàn)不斷增加恃锉,我所嘗試的技術(shù)和場(chǎng)景也在不斷地變得更加復(fù)雜。而當(dāng)邏輯代碼變得越來越復(fù)雜時(shí)我也漸漸發(fā)現(xiàn)一個(gè)新的問題呕臂,很多時(shí)候我所編寫的邏輯代碼是相似的,但相似之余其中的一些細(xì)節(jié)不盡相同肪跋,而這些代碼往往是后期維護(hù)成本最高的歧蒋。這就讓我感到十分困惑,如何讓我的代碼寫起來沒有那么繁瑣的同時(shí)州既,又不丟失原本代碼的應(yīng)有邏輯呢谜洽?這就讓我想起了之前學(xué)習(xí)的框架,它們的實(shí)現(xiàn)原理不就是把原本我們寫得非常繁瑣的邏輯代碼進(jìn)行壓縮吴叶,讓我們寫起來更加簡(jiǎn)潔直觀嗎阐虚?

這是我曾經(jīng)面試過的一位校招候選人寫的代碼,其背景是用于快速判斷自走棋類游戲中不同的增益能力(Buff)的成立狀態(tài)蚌卤。但顯然這樣的代碼在實(shí)際開發(fā)中是絕對(duì)不允許存在的:

代碼邏輯過于冗余实束;

一旦通用判斷邏輯出現(xiàn)變動(dòng),需要每一個(gè)都進(jìn)行手動(dòng)維護(hù)逊彭;

沒有良好的可維護(hù)性咸灿;

所以我便提出如何讓這些代碼寫得更加“優(yōu)雅”和利于維護(hù)。

我們不難發(fā)現(xiàn)這幾個(gè)xxxBuff?函數(shù)中的邏輯都非常接近侮叮,但也各有不同避矢。那么如何能將這段代碼進(jìn)行優(yōu)化和抽象呢?我當(dāng)時(shí)給 TA 提出了一份示例代碼:

這份代碼中的每一個(gè)數(shù)字在上面的beastBuff?函數(shù)中都可以一一找到囊榜,那么要怎么將它們復(fù)用到邏輯代碼中审胸,實(shí)現(xiàn)與原本的代碼一樣的功能呢?

我同樣給他寫了一份參考答案:

原本代碼里面通過 hard code 實(shí)現(xiàn)的判斷邏輯卸勺,通過觀察其中的共同點(diǎn)砂沛,并思考能否通轉(zhuǎn)換為可抽象部分,這同樣也是一名優(yōu)秀的工程師所必須具備的能力孔庭。Be D.R.Y.! (Don't repeat yourself)

NO.7

0x06 更高層次的思考能力

隨著我對(duì)不同業(yè)務(wù)尺上、不同場(chǎng)景和不同代碼難度的不斷探索和研究,我發(fā)現(xiàn)在前端領(lǐng)域乃至整個(gè)編程領(lǐng)域里圆到,不同的框架和架構(gòu)層出不窮地發(fā)展怎抛,其實(shí)在根本上就是各種實(shí)際業(yè)務(wù)場(chǎng)景在尋找更合適的 Better Practice(更好實(shí)踐)。就如前面的所說的那樣芽淡,不同的框架作者在開發(fā)的時(shí)候會(huì)采取不同的代碼結(jié)構(gòu)甚至代碼哲學(xué)马绝,這些不同的思維角度可能在框架的源碼中并不會(huì)直接表現(xiàn)出來。但我不會(huì)說研讀源碼完全沒有用挣菲!因?yàn)檠凶x源碼最起碼可以學(xué)習(xí)其中的一些 trick 或者代碼習(xí)慣富稻。

但更重要的是理解從 API掷邦、系統(tǒng)架構(gòu)上進(jìn)行思考,因?yàn)橹挥卸嗨伎剂送指常悴拍苤饾u變得比其他人更加對(duì)不同的技術(shù)游刃有余抚岗。

NO.8

EOF

這一個(gè)流程并不是嚴(yán)謹(jǐn)?shù)膶W(xué)習(xí)路線,更多的是我個(gè)人的一些經(jīng)驗(yàn)總結(jié)哪怔。當(dāng)然除了我所提到的學(xué)習(xí)知識(shí)點(diǎn)以外宣蔚,還有很多不同的分支對(duì)應(yīng)著不同的實(shí)際業(yè)務(wù)和場(chǎng)景,比如配合 Electron 開發(fā)桌面端應(yīng)用认境、配合 React Native/Flutter 開發(fā)移動(dòng)端應(yīng)用胚委、配合 Node.js/QuickJS/FibJS 開發(fā)嵌入式應(yīng)用、配合 TensorFlow.js 開發(fā)適用于前端甚至適用于邊緣計(jì)算的機(jī)器學(xué)習(xí)應(yīng)用叉信、配合 WebAssembly 將 Web 應(yīng)用的使用體驗(yàn)提升到接近原生應(yīng)用的境界……

關(guān)于 JavaScript 有一個(gè)很有名的預(yù)言:

凡是能用 JavaScript 重寫的亩冬,終將會(huì)使用 JavaScript 重寫

無論這句話會(huì)不會(huì)最終完全實(shí)現(xiàn),但目前我們已經(jīng)能看到很多應(yīng)用逐漸通過 Web 應(yīng)用的形式云端化硼身,比如 Photoshop硅急、音視頻編輯軟件、代碼編輯器甚至是大型游戲等等原本我們完全沒想到可以運(yùn)行在瀏覽器中鸠姨。前端開發(fā)困難嗎铜秆?不困難、門檻相對(duì)比較低讶迁。簡(jiǎn)單嗎连茧?不簡(jiǎn)單,通過相信看到這里的你也已經(jīng)有所體會(huì)了巍糯。當(dāng)然實(shí)際要如何選擇路線和方向啸驯,還是你自己所遇到的經(jīng)歷和機(jī)遇來決定的。

打算深入了解這個(gè)行業(yè)的朋友祟峦,可以領(lǐng)取2020年最新前端基礎(chǔ)精講視頻教程分享罚斗!我們的前端學(xué)習(xí)Q裙:(518672693)?,里面都是學(xué)習(xí)前端的宅楞,從最基礎(chǔ)的HTML+CSS+JS【炫酷特效针姿,游戲,插件封裝厌衙,設(shè)計(jì)模式】到移動(dòng)端HTML5的項(xiàng)目實(shí)戰(zhàn)的學(xué)習(xí)資料都有整理距淫,送給每一位前端小伙伴。2020最新技術(shù)婶希,從企業(yè)招聘人才需求 到怎么學(xué)習(xí)前端開發(fā)榕暇,和學(xué)習(xí)什么內(nèi)容都有免費(fèi)系統(tǒng)分享。好友都在里面學(xué)習(xí)交流,每天都會(huì)有大牛定時(shí)講解前端技術(shù)! 希望可以幫助你快速了解前端彤枢,學(xué)習(xí)前端

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狰晚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缴啡,更是在濱河造成了極大的恐慌壁晒,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盟猖,死亡現(xiàn)場(chǎng)離奇詭異讨衣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)式镐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來固蚤,“玉大人娘汞,你說我怎么就攤上這事∠ν妫” “怎么了你弦?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)燎孟。 經(jīng)常有香客問我禽作,道長(zhǎng),這世上最難降的妖魔是什么揩页? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任旷偿,我火速辦了婚禮,結(jié)果婚禮上爆侣,老公的妹妹穿的比我還像新娘萍程。我一直安慰自己,他們只是感情好兔仰,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布茫负。 她就那樣靜靜地躺著,像睡著了一般乎赴。 火紅的嫁衣襯著肌膚如雪忍法。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天榕吼,我揣著相機(jī)與錄音饿序,去河邊找鬼。 笑死友题,一個(gè)胖子當(dāng)著我的面吹牛嗤堰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼踢匣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼告匠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起离唬,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤后专,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后输莺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戚哎,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年嫂用,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了型凳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘱函,死狀恐怖甘畅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情往弓,我是刑警寧澤疏唾,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站函似,受9級(jí)特大地震影響槐脏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撇寞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一顿天、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧重抖,春花似錦露氮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恨统,卻和暖如春叁扫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畜埋。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工莫绣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悠鞍。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓对室,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掩宜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361