Showing posts with label Ruby. Show all posts
Showing posts with label Ruby. Show all posts

Sunday, December 28, 2014

Owning Rails masterclass

這是 四月底在 Rubyflow 上看到的一堂神奇課程「Owning Rails」masterclass.,收費 399 USD。(第二次上課就 $479 USD)了。
課程介紹講的還蠻神奇的,上完保證「Owning Rails」!
價格始終是個讓我有點下不了手的原因…。最主要還是網站本身透漏的資訊很少,而我本身已經是蠻 advanced 的 Rails developer 了。萬一付了 $399 結果上的是 Rails 101,這樣會搥心肝….
不過考慮到作者 Marc-André Cournoyer 是還蠻威的人物,也出版了一本 Creating your first programming language 教你怎樣造自己的程式語言,而 CoffeeScript 的作者更是看完了這本書之後,發明了 CoffeeScript。因此這個課程應該有點相當的難度吧?
考慮了一個小時,終於有勇氣按下 paypal 結帳,沒想到….SOLD OUT… 晴天霹靂!只好登記了「下次開課我有興趣上」!
過了漫長的一個月,作者終於寄信宣布他要開第二次課了,然後這堂課漲價了!漲到 $479 USD!不過上次有登記的人他會發一張 $80 的 Coupon,如果你在時限內使用,讓你還是可以以 $399 的價格報名。收到這封信的我當然是衝了!
上禮拜終於開始上課了,時間是台灣的 6/16 與 6/17 凌晨 00:00 – 04:00,所以我為此還特地請了兩天早上的假。因為課程上完大概就累掛了….
簡單說說這堂課在上什麼,讓有興趣報的人可以踮踮自己的斤兩再去報:
1. 這堂課頗硬,「完全不適合新手」去報名。後來我看到老師在第三次開課前的意見調查,猜想到可能是有新手跑去上課,踢到大鐵板結果抱怨吧….(開課就是可能這樣,雙方對於程度有很大的期望落差 :/)
2. 這門課適合怎樣的人去報呢?我猜想應該適合開發過 Rails production sites 2-3 年以上的人去上,Ruby 不錯熟,想開始自造 MiddleWare、Engine、Plugin、Gems 的人去上。如果你的程度不夠,去上這門課有極大的可能是鴨子聽雷。
3. 課程的內容是什麼呢?坦白說我不知道第一次開課和第二次開課的差別是什麼,而我是報第二次開課的人。
第一天的課程是:
造出自己的 mini Rails
帶你如何寫出精簡版 ActiveRecord、寫 rack app、用 rack app 改出精簡版 ActionController、自己 implement 出 before_, after_, around_ filter、自己 implement 出 view。然後最後再用你自己刻出來的這套 mini Rails 寫 web application。
第二天的課程則是:
Refactor 昨天寫的 mini Rails,教你如何 trace Rails core。利用 Rails internal API 客製化出你想要的特殊 function、library。作業有 custom validator、custom finder、create responder、create form builder、使用 Railtie 客制 Engine、造 plugin。
4. 為這樣的課付這樣的學費值得嗎?坦白說,非常值得!這門課剛好適合我的程度。上完課之後我也有任督二脈被打通的感覺。學到非常多東西,也少走了很多冤枉路。如果這個課調到 $599,我想我還是會買單…
只不過有點為老師擔心,這樣的課程(已經到造 Framework 的程度)還會有多少人報?另外老師似乎也有打算開怎樣造 Compiler 的課的樣子,只不過他自己也覺得有點瘋狂,不知道多少人會買單…
5. 有附(贈送)什麼東西?
(1) 這堂課的全程錄影
(2) 這堂課的整份 slide
(3) 這堂課的整份 code
(4) 這堂課互動的 chat logs。(這門課是 live demo 直播,老師會在聊天室回答所有問題)
(5) Creating your first programming language 這本書
(6) 老師自己寫的一些 TextMate bundle
整體來說,如果你是功夫深厚的 Advanced Rails Developer,這堂課 C/P 值非常高。但如果你不是,我會勸你別浪費時間,多回去讀讀 The Rails3 Way 和 The Well-Grounded Rubyist 比較實際….
以上。

http://wp.xdite.net/?p=2407

Friday, December 21, 2012

被迫才是進步的原動力


昨天看到神人 vgod 寫了一篇 過早最佳化是萬惡的根源,這篇文章是不錯。但是,對於「職業」那邊實在有太多奇怪的假設。
想了一下,決定還是在 FB 寫了一下我的看法,然後再轉貼到這裡來。
===
簡單回一下好了。關於職業的部分。我本來也是覺得就如同跟 @vgod 一樣所說,在裡面可以全新鍛鍊和學習各種知識和技能。
我在大學裡面,就是抱著這樣的心態,學習各種知識。我在大學裡面最認真修的課,不是數學(唯一感興趣的是線性代數、離散數學、代數) ,而是….去修資科系基礎理論的課,什麼作業系統、計算機結構、演算法、資料結構、數位電路、etc…大概能修的我都修了。數學系最 重視的微積分、高等微積分,我沒有很喜歡。而且,我大概下課的時間都泡在系上的機房,弄網路、伺服器、寫寫簡單的網站。
而最後我也是抱著這樣的心態,選擇了第一份工作。因為我覺得大學的環境才能讓「自己有選擇想練什麼武功的自由」。 我希望一直這樣持續下去。
然而,接下來的事情。你們知道了,我被打臉了。狠狠的打了一巴掌。
那一天,我才發現我關在學校自己練的等級,跟職業的人是差上那麼多。這才是讓我選擇馬上離開那個環境的主因。
很多人以為「自己有選擇想練什麼武功的自由」,才能讓自己的 power 開到最大。我對這件事情有截然不同的感受。為什麼職業的環境會成長很快。因為上班領錢,才有限時被交出成果的壓力。而且那個壓力能造成的動力是遠比自己下定決心要練什麼技能的動力還要可怕的。上班,你會被迫限時學到跟這個領域所有「基礎」的工具。一個月「基礎的程度」,可能直接贏掉自己自由學「半年」以上的程度。
而且特別是,如果你的同事和老闆,都是佼佼者的話….。到現在我還是相當感謝曾經共事過的 @gugod, @ihower, @gslin, @hlb, @嬸嬸 XD
我學到的就是。如果你想把什麼東西學好,稍微深呼吸一下(當然就是自學一點皮毛,希望不要進去之後死太慘),就跳下去…。 害怕溺水的恐懼會被讓你瞬間就學會游泳。(如果你跳下去就死拜託不要怪我…orz)
如果你曾經看過我半年前寫過的為什麼我想創業 一文。 你就會知道,我在這四年裡面「被迫」學會了多少事。
職業工程師,並不是只有用 PHP 寫了一千個論壇和購物程式那麼無聊。老實說,寫到第二個第三個,你就會知道 Framework 的重要性。
當然,如果你之後玩到神兵級 Framework 如「Ruby on Rails」。那麼你還會更會知道,這世界不是只有 CRUD。(Ruby on Rails 本身 的架構採用了大量 Patterns of Enterprise Application Architecture 這本書裡面的實作,裡面也大量用了 Design Pattern 的技巧)。
不只如此,你還會從周遭的 ecosystem 的 plugin 中學到各種各式各樣的 pratical、theoretical 的佼佼實作。
當這些東西看多了以後你就更進一步的發現,語言根本不是重點,掌握這些「企業級理論」(註)的核心精隨,才是重點。
而當進一步又將 Ruby on Rails 玩的十分純熟之後。就會馬上意識到,用什麼語言寫,把 code 寫得多快已經完全不是重點了。
  • 如果專案控管能力不佳,需求一直在改變,那麼就算你的「架構理論」玩的再漂亮都是一樣的,結不了案就是結不了案。
  • 如果團隊協調能力不佳,那麼不管公司投再多人進來,累死的就是那幾個人而已。
  • 如果時間成本能力不佳,不是會造成公司大虧損賠本,甚至會專案進行到一半就被迫終止。
很多人以為我網站寫的很快,是因為 Framework 的關係。真的不是這麼簡單…,那是我身上擁有所有的技巧綜合出來的結果。
如果我沒有領錢「被迫」進行我很多「不喜歡」的事,我不會學到這一些東西。如果我沒有「被迫」去處在那一些環境,我能學到的東西就限於「我在學校時一開始能望過去的眼界」,而不是環繞在我周遭各個神人的眼界。
而這也是為什麼我會寫出那兩篇文章的初衷。我不是出來走這麼一遭,不會發現我當初那樣的假設,完全不堪一擊。
而再舉一個例子,曾經很多人一直對我,開口閉口就是 Ruby on Rails 值得學習,感到很不解。事實上,我也是從這個 Framework 的進化裡面, 才學到人不能把眼界只侷限在某一個端點。我個人的能力,很大的原因是跟隨這個 Framework 一起成長的。如果我當初不是碰這個 Framework 起來,我恐怕真的沒有這個能力成長的這麼迅速。因為台灣沒有太多「大型」Scale (PV 千萬以上) 的網站,可以逼迫一個工程師直接從最基礎的 Turtorial 中,自學到那麼多 optimze techniques、best practices(更何況這種等級公司的入場卷,也不是你說想要應徵就能應徵上)。
從這個 Framework ecosystem 裡面產生出來的 plugin 也是世界上各式各地的程式設計師貢獻出來的,這裡面融合了他們公司現在「最好」的 pratices,有些甚至是 future architecture。如果我在一間悶頭自幹工具的公司上班,我是沒有機會見識到這一切的。
我不認為自己一開始有多好的眼界,能有辦法看到多棒的未來,並且照著我所看到的事堅定的往前走。甚至,直到現在,我現在還是不認為自己還是具備這個能力。但我唯一知道的是,我不能把自己鎖在自己的眼界裡。
我想說的話,就只有這樣而已。
[註] :Deisgn Pattern、Agile、Testing、Scaling、Performace Tuning …
Reference:

Tuesday, December 4, 2012

如何閱讀 Rails 原始碼


開始有計畫整理一些在 RubyConf China 大家線下問我的問題的答案。
挑選出來暫定的第一篇是大會期間詢問度最高的:「如何閱讀 Rails 原始碼」。
想要「閱讀 Rails 原始碼」的原因很多,不過多半的出發點都是想要能夠設計出更好的 Plugin (Gem)、或者是希望能在程式碼出錯時,能夠更快在 Rails 原始碼快速找到答案。
但擺在眼前的事實是, Rails 的原始碼已經成長大到成幾萬行的怪獸,如何「看懂」或者是有效率的找到答案,已經變成是一個很大的難題。
以下是我根據這幾年的經驗,能夠給各位的建議:

1. 從單純的部分切入,例如 Helper

最令大家頭疼的地方是,這麼多程式碼,要從哪部分開始讀起。
如果你是初心者,想要跳進這個池子裡,想找點簡單的東西讀,我會建議你先從「Helper」的部分開始讀。「Helper」是整個 Rails 程式碼裡面最獨立的部分(不牽扯到 request 呼叫),而且結構相對單純。

2. 從 request 開始,到 rack,到 routing,到 controller,最後再到 model

我真正開始有系統的讀懂 Rails code,是從一門線上 Owning Rails開始的。這門課的宗旨是,就是教你有效掌握搞懂 Rails 的核心與結構。相當有趣的是,他並不是教你讀任何 Rails 代碼,而是實際一步步帶你造出一個「mini Rails」。而造完這個 「mini Rails」之後,學員也能夠開始神奇的開始擁有快速找 code 的能力。
我在去年曾經寫過一篇 Owning Rails masterclass 介紹過這個課程。

第一天:造出自己的 mini Rails

帶你如何寫出精簡版 ActiveRecord、寫 rack app、用 rack app 改出精簡版 ActionController、自己 implement 出 before, after, around_ filter、自己 implement 出 view。然後最後再用你自己刻出來的這套 mini Rails 寫 web application。

第二天的課程

Refactor 昨天寫的 mini Rails,教你如何 trace Rails core。利用 Rails internal API 客製化出你想要的特殊 function、library。作業有 custom validator、custom finder、create responder、create form builder、使用 Railtie 客制 Engine、造 plugin。
宥於這是付費課程的關係,我也無法公開提供各位更進一步的教材內容。但是我能夠告訴各位這們課程為什麼會這樣設計,讓你可以也依循著這個軌道去自我進修。

rack

一個 request 進來,首先通過的是層層的 rack middleware。所以必須要先理解什麼是 rack,rack 的運作原理是什麼。可以試著自己先寫一個 rack app 玩看看。
如果想知道 Rails 裡面的 request 流程會經過哪些 middleware,被加過哪些工。可以在 Rails 專案裡面打 rake middleware,再去把 class 一個一個叫出來讀。

routing

request 通過 rack 層進來後,首先面對的是 dispatch 問題,Rails 透過 routes.rb 進行 dispatch。而如何 dispatch 到正確的 controller,中間靠的就是 regexp。

controller

開發者在 controller 會牽涉到兩個常用的相關機制:Filter 與 View Rendering。Filter 時怎麼運作的。method 應該是回傳「值」,怎麼做到自動回傳的是 render 出來的view。

model

ActiveRecord 的上一層就是一套 ActiveModel API。其實 Rails 不一定要靠 ActiveRecord,也可以透過實作一個 Class 加上部分機制做出自己的 ORM。其中 validation, finder 都是這方面的課題。

3. 搞懂 Rails 的啟動流程

RailsCast China 曾經 release 過一個很好的影片:The Rails Initialization Process By kenshin54
講解了整個 Rails 啟動流程。你也可以讀由 Ruby on Rails 官方釋出的這篇官方教學啟動流程去更加了解啟動過程中究竟會經過哪些檔案,如果要寫 plugin 可以 hook 在哪一些部分。

4. 實際簡單寫一個 Rails Plugin

最好的學習方法就是動手實作。在看過以上這一些資料之後,我建議你可以實際透過開發一個 Gem 去更加了解整個 Rails 內部的結構。
目前 Rails Plugin 幾乎都是以 Engine Gem 的形式釋出。所以透過撰寫一個 Gem,可以了解到:
  • 如何將自己的 Library 與現有 API 整合
  • 如何將自己的 Library / 不掛進啟動 process 中。
  • Engine 與 Railtie 的結構
  • 如果有相依檔案,如何撰寫 generator,把檔案放進去 project 裡面。
  • 如果有檔案操作和客製選項,如何透過 thor 這個工具去達到檔案修改的目的。
算是一個相當好的鍛鍊。

5. 讀別人(熱門)的 Rails Plugin

有時候,想要實作某一些功能不得其法。最好的方式就是去讀有類似功能的 Gem,去看看其他作者怎麼做的。有時候會翻到他們用了不少你根本不知道的 Rails API。
順著他們用這些 Rails API 的方法,可以更快的在 Rails 原始碼找到你要的答案…

小結

希望以上的方法能夠協助各位更快的上手讀通 Rails 的原始碼。有任何問題歡迎留言在底下討論。
Reference: