framework實作 – front controller pattern & template engine

以前在用Python的Django、Rails或是PHP其他framework的時候,總覺得很難想像,要怎麼寫一個framework出來。

連最入門的這兩件事我都覺得難以想像:

  • 網址輸入’user/create’ 要如何執行controller資料夾內user class的create method?
  • 要如何讓controller去讀取view資料夾底下的html 然後render出去?

也就是說,所謂MVC pattern要從何開始實作?

最近試著親自動手做,發現其實沒那麼難,也從中學到不少。上述兩件事,100行內就可以作到。

提供我嘗試實作的source code給各位參考。

那100行程式碼長這樣

https://github.com/howtomakeaturn/PigFramework/blob/super_light/index.php

資料夾結構長這樣
https://github.com/howtomakeaturn/PigFramework/tree/super_light

(Photo via   Glyn Lowe Photoworks, 2 Million Views, Thanks, CC License)

替Model寫單元測試可以幹嘛?

單元測試( Unit Test)應用在軟體開發各個領域,本文僅討論MVC架構中的Model。

在web的MVC架構中,我們開發時本來就不斷在test。

  • 你一直對網頁按重新整理就是在test
  • 你在剛寫好的頁面上輸入一些測資然後按確定,也是在test你的controller或model

也就是testing的工作你其實一直都在做。

而MVC架構中的Model特別難處理,因為Model的行為很難測。

在資料到達Model之前,會先經過View、Controller,所以你會來回狂測,想確定bug到底在哪。

是jQuery在抓網頁元素的value時抓錯?是JavaScript相關的code有bug?是html的某個form name打錯?是Controller拿到form POST的值時做了變數型態轉換?是Controller裡面變數名稱打錯?是丟變數給Model時順序丟錯?還是Model裡面有bug?

反覆跑完以上流程抓出bug就算了,偏偏並非每個功能都是直接在網頁上key完資料就丟給Model。

結果光是想丟測資給Model就很麻煩。尤其你修好一個method常會想確認其他method有沒有因此壞掉。

行為單純的Model就算了,以上過程還不會花掉太多時間。複雜一點的 Model真的是debug到我會在電腦前大罵髒話。針對Model寫單元測試等於在開發Controller跟View前,先把Model弄得很強壯。

為了搞清楚自己的Model有多健康,你會寫好幾個test、丟好幾筆測資。加上為了要讓model能被test,你會來回去修改、把model寫的更模組化、更testable 、讓使用Model的人用得更愉快。

然後使用Model的人就是你自己。

所以unit test寫完、測完,你再寫controller跟view的時候就快樂到爆。

因為你知道寫Model的那傢伙很猛、把它寫得很強悍(亂丟資料也不會怎樣,那個Model會丟Exception、會丟error、會吐訊息, 反正Model會強力守住最後一道關卡,資料庫絕對不會爛掉。)

所以你Controller跟View就可以輕鬆寫,寫超快、超隨便也沒差,頂多就是使用者key錯資料會看到exception或是一些怪怪的錯誤訊息,絕對不會有資料庫存到壞掉的資料或是資料一致性的問題出現。

開發上出現bug時,你也可以確定是controller或是view的資料處理出錯,千錯萬錯絕不是Model的錯。(那真的是Model有bug怎麼辦?回去再寫幾個test抓bug,然後修好就行囉)

然後我認為,單元測試也不需要把所有可能的測資、全部使用情境都測過。

每個method隨便寫幾個最笨的testing就很夠了,通常有bug就是return value完全跟預期不一樣。寫幾個笨testing就夠抓出一堆麻煩了。

像是:

  • 資料庫某table在新增完有沒有多一筆
  • 各欄位金額加總有沒有等於總金額欄位
  • 那個要抓10筆資料的method最後抓到的是不是10筆
  • 亂丟變數給某method有沒有吐Exception

只測試這些夠混吧?夠不嚴謹吧?但是你最常搞出來的bug就是這麼單純而已。

當這些testing都跑過了,你的Model已經非常頭好壯壯了,超健康。眼看自己動手去挑戰自己的Model,最後還全部過關,絕對會信心UP、UP。處理複雜的Model時,將省下很多時間。(就算不寫單元測試,你也是用瀏覽器東測西測、花時間抓bug不是嗎?)

好,做個整理。

時機

某Model光用想就覺得頭痛,開發起來你覺得很沒安全感

好處

  • 讓你跳出開發者的角度,從使用者的角度去看這些method好不好用、 直不直覺,因此能寫出更出色(reusability, maintainability, scalability)的Model
  • 每次改完某method,都能立刻檢查其他的method有沒有被搞壞
  • 更好抓bug(寫testing時會在Model狂抓bug。之後寫controller/view時,你會知道bug都在controller/view裡面,不用跳來跳去檢查一堆code)

所以快找幾個能用的工具,試著寫單元測試看看吧。

還是不知道從何寫起的朋友可以在下方留言,我拿最近寫的程式碼寫一篇實作的範本。(我是以PHP/Codeigniter以及Codeigniter內建的單元測試函式庫當作工具)

(Photo via  Robert E. Kennedy Library at Cal Poly, CC License)

關於未來,我們一直在搞錯。

我常看到某些人發表他們特別的想法。 他們常發表一些很有啟發性的言論。當然,某些人只覺得那些是胡扯。

我發現這些人用各自的方式說出了同一件事,關於未來的事。

首先我想摘錄Seth Golding的一篇文章 — Our inability to see ahead

「兩百年以前,愛德華·拉特利奇(美國獨立初期政治家)簽署了獨立宣言。他現在的直系後代是凱特·哈德森(美國女演員)以及歌蒂·韓(美國女演員)。兩百年前他臨終時,若你在他身邊,你根本猜不到這樣的結果。」

接著我要摘錄Quora上對於一則提問「你希望自己21歲就知道什麼事情?」 的最佳回答。 得到最高票數的是這則。

「我們嚴重高估自己十個月內能有的成就,然後嚴重低估自己十年內能有的成就。」- Tim Scott

我要摘錄的第三段話,取自Rework(中譯:工作大解放)

「計畫是一種猜測」

「除非你是算命師,否則長期的商業計畫就只是幻想。…你以為寫計劃書就可掌控這一切,但其實你做不到。

我們何不把這些計畫正名為猜測。當你將猜測轉變成計畫,你就陷入險境。計畫是讓過去指引未來,讓你變得盲從。…這就是問題所在:計畫跟即興發揮並不一致。而你必須有能力隨機應變,以便抓住突然出現的機會,有時你必須說:我們得要轉進新方向,因為今天要這樣做才合理。…

停止猜測吧,決定這星期內你要做的事,而不是這一年。…即興而為沒關係。先上飛機吧,等你抵達目的地,再挑件好一點的襯衫、刮鬍膏和牙刷。」— Rework

從我大四、當兵到退伍後出社會,的確有每天都在改變想法的感覺。因為每一個明天我都不知道會有什麼新的機會出現,而我又會失去什麼。

所以不侷限下一步的走法,不要求自己遵循什麼金玉良言或是誰的經驗之談。於是變得很放任,做決定甚至以情緒為依歸,不顧後果、不替長遠的未來做準備。

說來放縱,卻也充分的感受到各種可能性,覺得下一步可以是各種可能,常常覺得充滿活力。

最後,我想以Seth Golding同一篇文章的結尾做結。

「你能擺出的最佳姿態只有一個: 認定你全部的計畫都是錯的。

如此去想,將發生令你意想不到的事情。」

 

reference:

(Photo via  Dr. Jaus, CC License)

你所有的理想,沒有一樣是不切實際的。

標題看起來很荒謬,不過我的確這麼認為。

那些理想之所以讓我們覺得沮喪,是因為它們真的有可能達成。

  • 你不會因為自己選不上總統而鬱鬱寡歡
  • 你不會因為自己拿不到諾貝爾獎而抱憾終生
  • 你不會因為自己沒辦法一夕致富而覺得很痛苦

這些你一點興趣也沒有,這些對你來說不切實際,你不會把這些當作自己的理想。

反過來說,那些不去做會讓你沮喪的事情,正是對你來說實際可行的事情。

正是這種沮喪感、這種不去做會覺得有遺憾的感覺,說明了你其實不相信自己做不到。

  • 你工作久了,想創業
  • 你想當眾挑戰你的主管
  • 你想把音樂當作生活的重心
  • 你想把工作辭了然後去旅行
  • 你想不顧別人期待去做自己想做的事

你會因為這些想做卻又沒有勇氣做的事情而沮喪,而這些沒有一件是你做不到的。

全都只要去做就行了。

當然會得到一些別人的嘲笑、一段挺窮的日子、一堆不祝福的眼光,但這年頭幾乎怎樣亂搞都生存得下去,何況是勤奮的實踐理想。

每個人都多少知道自己的天命,背棄了它,它就像詛咒一樣來找你,讓你朝思暮想,朝思暮想那個心目中想成為的自己,又可惜自己沒有勇氣。

我總相信試過是最幸福的。也許試了會發現它其實不切實際、發現它其實很幼稚、發現它根本不是自己要的,而本來的生活其實很不錯。甚至發現本來的生活才是你的天命。

於是你回到原本的位置,然後在原本的位置過得比以前快樂多了。你也許會很滿足,不再朝思暮想。又也許,會找到新的理想。

所以動手幹吧,可以先從幹一點點開始。
然後不要問幹一點點是什麼意思了,你早就知道了。
那可是你想了好久好久,早就想試著去幹看看的,你的天命啊。

(Photo via @Doug88888, CC License)

新創公司跟大企業,哪個高尚?

還在唸書的時候,跟一些身邊的朋友對新創公司、網路創業充滿了憧憬。

覺得startup(新創公司)試著解決人們還沒被解決的問題,少少的幾個人聚在一起,試著用自己的力量去創造價值、做不一樣事情。

特別在網路火熱的這幾年,web領域根本充滿了機會,像一片大海。只要敢出海,就可能得到超乎想像的回報–startup根本超有趣又高尚。

退伍一陣子之後,對此有了全然不同的見解。

大企業正是因為解決了人們很大的問題,所以才一路成長為大企業。正是因為創造了很大的價值,所以才有巨大的報酬。

為了要找到更好的解決辦法,所以需要徵招更多人、更多優秀的人。所以進大公司也是用自己的力量創造價值,更重要的是,是在解決”已經確定存在的問題”。

因為問題確定存在,所以努力會直接有回報-也就是高薪、福利、年資等等。

反觀startup,大家充滿幹勁的在打拼,很大的機會卻只是在瞎闖、想解決根本不存在的問題。說是想用自己的力量去創造價值,實際上可能什麼價值都沒創造出來。

一心渴望在幾年內功成名就,簡直可以說startup是汲汲營營的一種終極形式。

startup跟所謂大公司、大企業 根本沒有高尚與否以及好壞的區別,不過就是不同的屬性、不同的選擇而已,都在各自的位置創造些什麼。

既然如此,那大家都好好努力吧,一起加油囉。

(筆者在新創公司工作)

(Photo via Paladin27, CC License)

年紀越大,路是越寬還是越窄?

我常在想,隨著年紀的增長

從小學、國中、到高中、大學乃至於出社會

人的見識、能力越來越成熟,一個人的可能性越來越多

也就是眼前的道路不斷的寬闊了起來

到了離開學校的時候,更是路最寬廣的時候

可以做本科系的專業、可以做相關產業、可以從事只應用到一點專業的產業。本身就對食品、服飾有興趣的,可以從事餐飲業、服飾業。可以賣雞排、可以到處打工,可以參與非營利組織、可以打工旅遊、可以回家鄉種田種菜種花、可以邊旅遊邊接案…等等。甚至要出世成為僧侶或是神職人員也可以。

不論你是學什麼畢業的,要生存下去的方式有太多太多。

回過頭來,看看周遭卻覺得恰恰相反,路越來越窄,到了離開學校的時候,看起來能走得路就那麼窄而已。

當然這不是事實。事實是沒有選擇的勇氣。

每件事都需要練習,反抗也是,選擇也是。

教育過程中沒有讓大家練習到如何做選擇、沒有訓練選擇的勇氣、也沒有教學生什麼叫做替自己的選擇負責。

關心你的人反對,嘲笑你的人也反對。你做出選擇,哪怕全世界都反對,你只知道反正你會替自己負責。

我剛出社會開始找工作的時候,覺得做選擇的壓力很大。

“我的生涯規劃開始了,第一份工作(薪水、資歷…等等)會影響第二份工作,要小心選擇”

“我如果第一份工作只做一陣子就辭職,之後會被認定是沒抗壓性的人”

就這樣不愉快了好一陣子。接著我想到一件事。

我開始唸國中的時候並不怎麼擔心我的高中生活,唸高中的時候不怎麼擔心大學生活,唸大學的時候也不怎麼擔心在社會生存的事情。怎麼一出社會,就擔心出社會幾年後、接近30歲時候的事情?

想了想,覺得那些不愉快與擔心全是狗屁。不過就是個嘗試與學習的過程而已。

所以想怎樣就怎樣吧。反正替自己的下場負責。

(Photo via mkrigsman, CC License)

by 阿川先生