為什么我要寫自己的框架?
我覺得編程的框架應(yīng)該分為:直接用->拋棄->重拾
框架(framework)是一個基本概念上的結(jié)構(gòu),用于去解決或者處理復(fù)雜的問題。這個廣泛的定義使用的十分流行,尤其在軟件概念??蚣芤材苡糜跈C械結(jié)構(gòu)。
其實說白了框架就是使用別人造好的輪子。在軟件開發(fā)里面就是command+C/command+V。
先自我介紹一下,我是一名信管專業(yè)的大學(xué)生,從我的專業(yè)可以看出我就是以后大家嘴里的程序員。洋洋灑灑寫了一些代碼,用了一些主流的框架,現(xiàn)在有一些體會分享給大家。
作為一個程序員學(xué)習(xí)一門新技術(shù)是讓人感到興奮的,隨之而來的問題就是如何快速的掌握語言吶?很多技術(shù)的過來人都不約而同的說:用別人已經(jīng)造好的輪子 唄,你看,多省力,在很久以前我也是他們的一員,也喜歡使用大量的框架(js有jQuery、Express、socket.io.js等;PHP有 phpword、Yii、laravel;html里面有Bootstrap、bootcss、normal)。曾幾何時,我覺得很興奮,在如此短的時間內(nèi)就可以做到這樣的高度,讓我十分的開心。開發(fā)出的內(nèi)容也完全符合校內(nèi)應(yīng)用的需求。我變成了一個別人眼中的“大師”。
但事情并沒有往想象的地方發(fā)展??蚣苡玫臅r間久了之后就發(fā)現(xiàn)了一個問題:我真的有學(xué)習(xí)過嗎?我學(xué)的內(nèi)容真的有用嘛,這些框架內(nèi)的東西能對我今后有幫助嗎,當(dāng)然,這種想法不是一天形成的,還有一個小的故事。
在使用PHP開發(fā)網(wǎng)頁應(yīng)用的時候,作為著名的Yii框架,網(wǎng)頁有大量代碼可以供我復(fù)制黏貼,我用的很爽,能在短時間內(nèi)開發(fā)出項 目,bootstrap也可以幫助我在短時間內(nèi)拼接出一個像樣的網(wǎng)站,也當(dāng)上了校內(nèi)某組織軟件開發(fā)部的負(fù)責(zé)人。但當(dāng)有一天在講授開發(fā)經(jīng)驗的時候,當(dāng)我當(dāng)著 大家的面真的靜下心來寫我需要展示的一個類的時候,以前用了這么多的框架,我發(fā)現(xiàn)在這么多人面前的我已經(jīng)幾乎寫不出來一個正確的類了??!運行的時候不是這 邊有問題就是那邊出現(xiàn)了錯誤。原來在以前我只想著如何使用它,如何整合別人的代碼,卻忘了一個最最本真的東西:創(chuàng)造!我?guī)缀跏チ司幊痰哪芰Γ兂闪穗娔X 面前的代碼復(fù)制員。
結(jié)果是令人沮喪的,當(dāng)天我都在思考這個問題:我今后到底能干嘛?是繼續(xù)做一個代碼復(fù)制員,還是打起精神,看看這些框架的背后有什么內(nèi)容吧!
于是我就投入了看源碼的行列:我打開了bootstrap,打開了Yii框架的vender文件夾,打開了jquery,試圖去打開那個封裝起來的黑盒子,了解這些框架背后的智慧。
結(jié)局可想而知,作為css的bootstrap還可以理解,但是其他大型框架的代碼幾乎就是一座不可逾越的大山,讓人望塵莫及。難道就這樣放棄,繼續(xù)用下去,不觸碰那個永遠(yuǎn)神秘的盒子了嗎?
答案顯然不是這個,電影《火星救援》的***有一句話說的很好:
你要么認(rèn)命放棄,要么繼續(xù)投入工作,把它們都解決了。
然后我就睡了一覺!哈哈開個玩笑啦,沒有!我清醒了,喝了口水,跑了個步,馬上投入了工作,開始閱讀!然后發(fā)現(xiàn)我還是看不懂它!怎么辦吶,誒!我看 不懂,我可以按照自己對框架的理解編寫一個框架呀!于是我馬上投入了工作,大量的Google之后發(fā)現(xiàn)行不通,怎么辦!聰明的我馬上想到我不編寫整個框 架,那我寫部分功能也是可以的呀,于是就有了我的***個框架的擴展:DbFactory.php文件。
我很興奮,因為我終于開始創(chuàng)造點東西出來了,雖然他很基本,連接了數(shù)據(jù)庫,封裝了幾個方法,但是我覺得這距離大師又近了那么一丟丟,每天都是一丟丟,那我還得了哈哈!
當(dāng)你真正的開始想讓你的代碼變的更好,你會去掌握和了解到更加多的知識,時間久了以后會在有一天瞬間茅塞頓開。
這就是開發(fā)里的量變引起質(zhì)變。
當(dāng)寫出這個文件的時候,我是很興奮的,馬上分享了出去,結(jié)果就是啥都沒有發(fā)生,世界還是那樣,我也沒有變帥,說明我在成為大師的路上只進步了一點 點,或者干脆沒有進步,只是知道的多了點。于是我又開始新的一輪學(xué)習(xí),看大量的書籍,有一天我重新打開Yii框架在我當(dāng)時看起來很難理解的代碼的時候我發(fā) 現(xiàn):我居然有點明白它的工作原理,知道整體的架構(gòu)了!
這個發(fā)現(xiàn)了這個的我很興奮,一個想法油然而生:為何我不開始編寫自己的框架吶!
說干就干,花了一天的時間就完成了基礎(chǔ)類和代碼的編寫,包括路由、模型類、控制類、一些基本的方法都封裝在里面,我覺得自己簡直太厲害了,居然在我 看來可以***的運行!我覺得已經(jīng)可以了,于是就把它推了上去(ps:沒有加上自動require,只是在每個文件的最上面加上了),在不斷的測試之后就發(fā) 現(xiàn),這邊有bug,那邊也有!require不使用絕對路徑簡直難用,整個框架想一盤散沙,一點都不好用,可擴展性幾乎沒有,我又陷入了沉思。錯在哪里 了!
真正的頓悟是在最近一次打開Yii框架源碼,看到了autoload之后頓悟:其實可以根據(jù)需求自動加載文件,很多問題也就解決了,當(dāng)然,這篇文章也就列舉這一個問題,其實我碰到的問題不止這些,很多以前理解錯誤的地方也隨著編寫這個框架變的正確了✅。
下圖是我現(xiàn)在框架的架構(gòu)。代碼太多,就不做展示了。
之后的工作就是讓框架更加的豐滿,不敢說比得上一些主流的框架,說實話根本不能夠和他們相比,無論從結(jié)構(gòu)、思考還是思考上,編出主流框架的他們才是 真正的大師。但我通過這個至少有了自己的思考,尋找回了自己的創(chuàng)造力,讓自己距離真正的大師進了一點,不得不說這種進步是讓人興奮的。下圖是我早上剛剛啟 動的js框架。
***說一下我認(rèn)為的好處:
1、對整體架構(gòu)的思考
2、提高自己的創(chuàng)造力
3、提高自己獨立思考的能力
4、提高自己閱讀別人代碼的能力
5、用到和認(rèn)識了大量的編程語言內(nèi)置函數(shù)下面是我的一點小建議:如果是在公司,肯定有大量的業(yè)務(wù)和需求需要實現(xiàn),那就直接拿來用,如果你是學(xué)生,那你很幸運,你有大量的時間學(xué)習(xí),那就從現(xiàn)在開始動起你的鍵盤開始編寫吧!無論多么困難,時間長了你就會發(fā)現(xiàn),對整體的思考就越來越清晰,明確了!