1. 程式人生 > >別學框架,學架構!

別學框架,學架構!

前段時間,我有過一次非常有趣的談話。有個同事站出來支援Angular,他說Angular加快了Web開發的速度。我已經開發複雜的web服務超過10年了,曾經在Microsoft工作,也曾在Cyprus為Spotware工作。目前,我為矽谷的一個初創公司編寫應用程式。總的來說,我會順應潮流。但我感覺自己像只恐龍,因為在我看來使用前端框架沒有什麼意義,但它被證明是主流。在2014年,我投入到Angular、Knockout和Backbone的世界中。如果你想弄清楚我從中得到了什麼,為什麼停止使用它們並且推薦你們也這樣做,那麼歡迎繼續往下看。

我們都知道Angular有很多問題,除錯是其中一個主要的問題。當發生一個沒有文件化的錯誤時,只有stackoverflow能夠救我們。但是我們也應該找出發生了什麼,以及最重要的找到哪裡發生的。Backbone和Knockout也有缺點。然而,很多人在使用它們,因為它們的優點更加重要。說實話,他們沒有看到別的選擇。但是,我們是有選擇的,只是我們忘記它了。

每個模組都應該只執行一個功能,還記得這條古老的原則嗎?如果一個模組執行了兩個或者更多的功能,我們應該將其拆分為不同的部分。我們可以找到大量的理由來說明為什麼這麼做以及為什麼我們應該堅持這樣做。無論如何,所有已有的框架都違背了這條原則。而且,“框架”這種方法本身就違背了這條原則。框架給我們帶來一定限制,它讓我們遵循最佳實踐。最佳實踐也在不斷髮展,對於一個小規模的開發人員團隊來說,他們可能不會知道哪些實踐更適合一個小頁面,一個包含了資料管理的複雜邏輯的管理面板,或者具有高效能需求的多媒體網站。只有當你是一個新手程式設計師的時候,使用框架可以約束和規範你的程式碼。我的建議是使用最佳實踐,但是不要使用框架。讓我來解釋為什麼是這樣。

框架看起來像是一些非常大並且很難重現的東西。但是它只是一些標準模式的集合。例如,Backbone模型中使用了觀察者模式,同樣在Angular和Knockout資料繫結中也使用了它,這帶來了非常好的效果。但觀察者模式只是一個很著名的模式,我們可以用30行JavaScript程式碼來實現它,或者從成千上萬的現成的實現中下載一個(順便說一下,它們除了方法名字,其它都是一樣的,因為模式的原則是相同的)。框架的其它組建也是通過類似的方式實現的。在理解這些原則之後,我們在很多時候可以不用寫任何程式碼。例如,當我們在一個小元件中實現MVP時,我們可以在頭腦裡將這些方法分為控制器,將屬性分為模型等等。

從實踐中得到的一個示例:我參加一個西班牙公司的工作面試,在那裡我必須通過線上編碼的形式,在一個小時以內完成一個測試。這個任務是針對文件建立一個單頁面應用程式。我使用JavaScript來完成這個任務,其中只使用了libraries模組。我甚至有時間去寫一些測試。他們不能理解我是怎麼在不使用框架的情況下實現路由的,以及複雜的互動元素和其它很多事情。他們都是在這個行業中混跡了10年以上的資深人士,但是他們只是學習了特定的解決方案,而非原則。

學習框架,你不得不重新學習,學習那些不斷出現的新的解決方案,而且你的部分經驗會最終變得毫無價值。但是當你學習原則——原則是不會變的。為了建立類,我使用一個五年前編寫的類庫,觀察者模式的實現一直沒有變化。每一個類庫都只執行一個功能,並且執行的很好。我從來沒有想過像框架那樣,將一個元件替換成另外一個。因為觀察者就是觀察者,它是一個模式,而不是程式碼。我們可能會根據任務來組合不同的模式,但模式不會改變。另外一個原則是我們可以擴充套件程式碼,但不能修改程式碼。我們可以在網上,或者“四人幫”的書中找到對應的根據。在這個原則下,如果你哥框架或者類庫有第二個,第三個或者第十個版本,一些功能會被刪除,其它功能會被修改,這會造成一些產品bug。對於修改程式碼來說,唯一的好原因就是適配新的瀏覽器,但是公開方法無論在任何情況下都不應該被修改。

程式設計成為了市場的受害者。它們為我們提供一個“魔法”按鈕,承諾可以解決我們所有的問題。但是結果呢,我們逐漸習慣去使用它,但並不能分解複雜的問題,將小麥從麥殼中分離出來。我會去使用框架嗎?只有當編寫一個將來無需維護的產品時,我才會用框架。但如果要在一個會持續至少一兩年的服務中使用框架的話,則完全是一種自殺行為。在此期間,你將會編寫更多的程式碼,比整個框架的程式碼還要多,並且不止一次面對框架帶來的各種限制。你花費在編寫各種變通方法的時間,可能會比不使用框架而去實現大量必要元件的時間更多。

你不是在發明輪子。實際上,你確實是在使用類庫,但是你是根據真實的場景而非預定義的方式來組合它們。有人可能會說,框架也可以進行擴充套件。但是如果我想要根據我的API來獲取Backbone模型,或者根本不獲取它們,會怎樣呢?或者我想從本地儲存中獲取它們?如果我們有複雜的更新邏輯,它依賴時間和標記,而我們應該在獲取之後向另外一個伺服器傳送同一個模型池,又會怎樣呢?你永遠不會知道。我們應該在這種情況下使用Backbone嗎?我們只會使用它的5%的功能,其餘的都是各種變通方法和自定義邏輯。與此同時,在理解架構原則後,我們去建立一個解決方案來適應每一個任務,並讓它可以應對需求變更,並不是一件很難的事情。

眾所周知,程式設計師在大部分時間並沒有在打字,而是在思考,在設計模式方面進行思考有助於提高效率。當我尋找一些有趣的架構解決方案時,我經常會閱讀一些新的類庫的公開方法。如果它的實現不是很清楚,我會檢視程式碼,但是這裡有一條原則,想法是最重要的。例如,我們可以在10分鐘之內完成promises,但是它的效果如何,那就是我告訴你不要學習框架而要學習架構的確切的原因。

P.S.:這篇文章就是希望能引起爭論。當然,框架有一定的優勢,但是它會讓人變成“傻瓜”。如果不使用框架,你不能解決問題,並且因此耽擱數天甚至數週,這就是一件很丟人的事情。事實上,如果我們集中注意力在正確的事情上,在架構解決方案上,就會變得非常簡單。這就是我試著告訴你的事情。希望這篇文章能給新手帶來幫助,也希望這裡描述的方法能夠讓他們將來變成非常酷的程式設計師。

相關推薦

框架架構

前段時間,我有過一次非常有趣的談話。有個同事站出來支援Angular,他說Angular加快了Web開發的速度。我已經開發複雜的web服務超過10年了,曾經在Microsoft工作,也曾在Cyprus為Spotware工作。目前,我為矽谷的一個初創公司編寫應用程式。總的來

噠噠在線少兒英語好嗎?孩子過後家長分享

pro 輔助 發現 是什麽 term water 考過 -o 質量 我說想給孩子報一個英語培訓班,但是大家都說,這麽小真的有必要花這麽多錢去學英語嗎?到上學的時候該學英語了再讓孩子學英語不行嗎?其實我也思考過這個問題,但是我覺得從小學英語並不是什麽壞事,我們是從小給孩子創造

Python Web框架快速掌握

rst req first register 一個 print art html 時間 Web框架環境請求數/S平均時間 Sanic Python 3.5 & uvloop 31 3ms Wheezy gunicorn & mein

GitHub中最強大的iOS Notifications和AlertView框架沒有之一

FFToast是一個非常強大的iOS message notifications和AlertView擴充套件。它可以很容易實現從螢幕頂部、螢幕底部和螢幕中間彈出一個通知。你可以很容易的自定義彈出的View. GitHub連結:https://github.com/imlifengfeng/F

0基礎轉行Python到什麼地步能拿到月薪15k+?

Python 可用的地方非常多。無論是從入門級選手(爬蟲、前端、後端、自動化運維)到專業級資料探勘、科學計算、影象處理、人工智慧,Python 都可以勝任。或許是因為這種萬能屬性,周圍好更多的小夥伴都開始學習 Python。 眾所周知,由於搭上 AI 的專車,Python 薪酬和需求也是高出其他語言很多(資

致傳統企業朋友:不夠痛就微服務有坑

微服務落地是一個複雜問題,牽扯到IT架構,應用架構,組織架構多個方面 在多家傳統行業的企業走訪和落地了微服務之後,發現落地微服務是一個非常複雜的問題,甚至都不完全是技術問題。 當時想微服務既然是改造應用,做微服務治理,類似註冊,發現,熔斷,限流,降級等,當然應該從應用開發

30歲開始程式設計什麼語言比較好?

以下是2018年最大的開發者調查/總結的程式語言。想必對你選擇程式語言會有很大的參考價值!   1. JavaScript   它是幹什麼用的?雖然JavaScript起源於一種網路指令碼語言,但今天它通過Node-RED用於從node.js後端伺服器到物聯網裝置的所有內容。也就是

百行程式碼python爬取小姐姐網100G套圖流鼻血身體重要

    前言 最近在做監控相關的配套設施,發現很多指令碼都是基於Python的。很早之前就聽說其大名,人生苦短,我學Python,這並非一句戲言。隨著人工智慧、機器學習、深度學習的崛起,目前市面上大部分的人工智慧的程式碼 大多使用Python 來編寫。所以人工智

《一頭扎進》系列之Python+Selenium框架設計篇5 - 價值好幾K的框架哎呦這個框架還真有點料啊

1. 簡介   其實,到前面這一篇文章,簡單的Python+Selenium自動化測試框架就已經算實現了。接下來的主要是介紹,unittest管理指令碼,如何如何載入執行指令碼,再就是採用第三方外掛,實現輸出html的測試報告。本文來介紹下,在同一個類中,多個測試函式時候,測試韌體如何寫和進一步實現POM和可

Python最實用的五大框架你值的學習

框架的出現不僅讓程式設計師能夠以更少的程式碼實現自定義功能,同時還能讓他們更集中在業務邏輯上,所有幾乎所有的程式設計師都會樂於使用框架。 開發一個Web應用程式,除了編寫應用程式之外,還有很多其它事情需要做,例如瞭解伺服器端架構、讓應用程式在使用JavaScript的使用者瀏覽器上執行等等。所以

網際網路時代盲目東西請先打造自己強大的知識體系

        網際網路時代,我們每天都在接受各種平臺的知識的轟炸。每天看一些最新的知識,心靈雞湯,乾貨,但是,我們卻沒有坐下來思考一下,我們看這些東西自己學習到了什麼?   現在網際網路時代,各個區域進行了細分,我們想學習什麼資料,都可以去尋找,去找到最專業的資料去學習,

表妹想Django框架在我整理出教程後表妹露出滿眼的小星星

最近表妹學習遇到了一點難題,她向我透露到想學Django,但是不知道怎麼學,為了幫助她更好的學習好Python,理解透Django,我絞盡腦汁用圖片將步驟細化。表妹看後欣喜若狂,廢寢忘食的敲起了鍵盤。 一段程式碼配一段文字,外加9張圖片,輕輕鬆鬆Django入門! ​   下面我們開始吧~

面試京東Java架構竟然被問這些題到了

使用 代理 代碼 2個 服務 說我 master slaves 說了 前言 其實收到jd的面試邀請的時候,我真心有點小激動。因為在地理位置上,jd應該是最合適我也是最想去的。但是我在看到方向的時候其實心裏有很多的問題,也做好了被拒的準備。 面試過程及感受 因為是開車去,所以

掌握下面常用函數PHP不再難

空白 ont span 加密 第一個字符 ans mtime 字符 格式化 掌握下面常用函數,學PHP不再難! 一、寫入文件1.打開資源(文件)fopen($filename,$mode)2.寫文件fwrite($handle,$str)3.關閉文件fclose($hand

Java架構的路上必知識點你又知道多少?(轉)

主從復制 高可用 技術架構 讀寫 actuator git flow io緩沖區 生成 應用 我把它分為了五大專題 工程化專題 工程化專題 git git安裝使用 git日常使用:fetc

【我的Linux我做主】技術大牛告訴你Linux網絡原理就該這麽

TCP/IP Linux網絡基礎 Linux屬於網絡操作系統,所以網絡功能是Linux的重要核心功能。我們知道網絡模型包含總線型網絡、星型網絡、令牌環狀網絡等。數據在網絡上傳輸是以電磁信號進行傳輸的,例如在總線型網絡中,在同一時刻只能有一個信號在傳輸介質中傳送,如果有多個主機同時發送信息,那麽就會產生

或不知識就在那裏只增不減

最後一天 內心 完全 要去 一起 job 主任 時間 迷茫 此時此刻,我的內心依然是糾結的。為什麽?因為我只要一寫東西就容易發呆,神遊他處。一篇沒幾百字的文章可以寫上幾個小時。幾個小時啊!!對我這種上了年紀的人而言,浪費幾個小時的時間簡直就是一種天大的罪過。但是,因為答應了

CSS一些常用的屬性到你就賺到了

erl oat play red int inline line flow one ****CSS一些常用屬性*** 0.去掉下劃線 :text-decoration:none ; 1.加上下劃線: text-decoration: underline; 2.調整文本和圖片

[轉]磨嘰完這篇你也是圖像識別專家了

and 擴展 函數 概率 好的 tuning 辦公 執行 維護 圖像識別是當今深度學習的主流應用,而Keras是入門最容易、使用最便捷的深度學習框架,所以搞圖像識別,你也得強調速度,不能磨嘰。本文讓你在最短時間內突破五個流行網絡結構,迅速達到圖像識別技術前沿。 作者 |

python這5本書你必看

python是一種美麗的語言 ,應用範圍也很廣,有很多的人開始學習python開發,對於初學者,這裡有5本經典的書籍,如果你打算用看書來學習python,這5本書無疑是很好的選擇。   1.python基礎教程 很適合初學者,簡單明瞭,對字串,列表,字典等講解詳細,