高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

親愛的,我把 GitHub 拿來收作業了!

homework
photo by Patrick

時間過得很快,一轉眼今年秋天在台北商業大學開設的 Ruby on Rails 學程已經是第四年了。

不管是什麼技能,想要學會不太可能就只靠每週三小時的三學分課程就學得會,一定需要平日的練習或是實作專案才能有所成效。由於是學校的正式課程,需要有打分數的標準,於是除了期中、期末考外,所以每週會規定同學們要繳交作業。

在以往大多會使用 Email 或是開學校的 FTP 請同學自己上傳檔案,但 Email 有些不確定性(被歸進垃圾郵件或是寄往莫明的黑洞完全消失),而 FTP 雖然簡單,但我希望同學們還可以在學校再學到一些其它畢業之後還能用到的技能,於是我便選擇使用 Git/GitHub 來收同學們的作業。

Git 不是新技術,使用 GitHub 收作業也不是什麼新潮的做法,國外早就有學校是這樣做的,本文不是要介紹如何使用 Git 指令或教大家如何使用 GitHub,僅分享我自己這幾年來在學校授課時實際使用 GitHub 收作業的一些心得。

如果對 Git 有興趣,可參考最近寫的為你自己學 Git一書。(是業配來著沒錯,可...可惡!)

優缺點?

使用 GitHub 來收作業有什麼優點跟缺點呢?先說優點:

優點

1. 不用擔心收不到

「老師,我昨天有把作業寄出去了,請問有收到嗎?」由於 Email 有時會有些不確定性,偶爾會因為附件檔案太大被退件,或是被歸到垃圾信件,又或是莫名的消失在網路世界中,像這樣的對話我相信大家不會太陌生。(而且是不是真的有寄出有時候也是個問號)

由於同學們是使用 Git 把作業推上 GitHub 並以發送 Pull Request(以下簡稱 PR) 的方式繳交作業,就不用太擔心這個問題,同學們也不需要一直來問老師是不是有收到作業。

2. 不用特別花時間整理

如果是使用 Email 方式繳交,平常工作上的信件已經夠多了,還得從眾多信件中整理出同學們各式各樣標題的作業繳交信件,還不一定找得到。從信件中整理出同學們的作業會是很花時間的工作,生命就該浪費在美好的事物上才是!

3. 透明公開

作業繳交的時間很明確,一切公開透明,作業有沒有交、是不是在期限前繳交、寫得好不好,全部一目了然,不會因為跟老師比較熟或是跟老師有一腿(咦?)所以分數比較高。

Personal Folder

4. 有完整的紀錄

因為 Git 有 log 可以看,所以可以知道同學們是在什麼時間點完成作業的。有時我還會在作業裡指定每個 Commit 要做什麼事:

Commit

這不只是希望同學們練習控制 Commit 的顆粒度,而且如果是參考同學的作業能參考到這麼精準,至少也有練到 Git 的基本功了。

5. 方便 Code Review

GitHub 網站提供的功能,可以很容易的在同學繳交的作業上加建議:

GitHub Comment

有時候我會反過來,我寫一段 Code,請同學們閱讀後幫我加上註解或說明。之後也打算試著讓同學之間互相進行 Code Review,像這樣 不同程度之間的互相 Review,常可收到不錯的成效。

6. 順便學會新技能

Git 目前是業界版本控制工具的首選,就算原本課程的本體學得不怎麼樣也沒關係,至少可以提早在學校就讓同學學會這項技能也不是壞事。

7. 順便學會怎麼使用 Markdown

Markdown 是一款可以用來產生 HTML 文件的輕量級標記語言,容易寫、容易學,因為 GitHub 也支援 Markdown 顯示,所以我也會順便要求同學們使用 Markdown 來撰寫作業,同時順便多學一項技能也不錯。

8. 老師不總是對的

我常會跟同學們說,不要台上老師講什麼你們就聽進去,對很多事情都要抱著懷疑的態度,所以也曾發生作者或期中考的題目寫錯,或是教材有錯別字,同學就直接幫忙發 PR 修正(鼓掌)。

缺點

缺點其實不太多,我想到的就只有以下兩個:

  1. 老師得先花一點時間學會如何使用 Git & GitHub。
  2. 接著老師得花一點時間教同學們如何使用 Git & GitHub。

怎麼開始?

首先,我會先在 GitHub 上開一個公開的 Repository,接著會請每位同學在上面建立自己的個人學號目錄(或是我幫同學們建立也可以),像這樣:

Personal Folder

接著,請同學們在自己的學號目錄裡放一個叫做 README.md 的檔案。由於在 GitHub 上 README.md 檔案會被當做是該目錄的預設展示頁面,所以第一堂課我會請他們編輯這個檔案,做個簡單的自我介紹。

怎麼收作業?

基本上就是使用 GitHub 上的 Pull Request(PR)方式來收作業。如果對 PR 流程不熟,我在這裡有錄了一段影片供大家參考。

除了第一堂課的自我介紹外,接下來每週的作業,我會開一個分支:

homework branch

然後請同學完成作業後,發送 PR 到該分支。在每週改完作業後,因為 PR 收下來的東西有點亂,所以我會使用 rebase 方式整理分支並合併到 master 分支:

rebase homework branch

如果對 rebase 不熟悉,我在這裡有放一段 rebase 的教學影片。

除此之外,還可搭配 GitHub 上的 issue 功能進行討論。

期中、期末考

期中、期末考一樣我也是使用類似方式進行,我會在考試前幾分鐘把題目推上某個分支,請大家完成後再發 PR 回來。

也許你會好奇,PR 都是公開的話,同學們作弊怎麼辦?因為題目是在考前才推上去,而且其實可以在每個人的學號目錄裡放不一樣的題目,還是可以做到一點防止作弊的效果。但對我來說,我的在意的不是同學們的分數,而是同學們有沒有真的學會。

打槍?

若有以下情況,PR 會被退回:

作業不是放在個人目錄裡,或 PR 未在指定的 Branch 裡

這沒辦法,沒有把作業放在對的位置,一定是打槍的。

GitHub 帳號尚未設定個人照片(Avatar)

這點算是我個人比較龜毛的偏好。沒設定大頭貼照片,表示你可能不怎麼重視這個帳號(同學們,你們的 FB、Line、IG 都會一直換大頭照了,為什麼這個不行?)。如果你自己都不重視的話,我應該也沒道理重視。

我們家面試新人的時候,如果履歷上附的 GitHub 是個使用預設圖片的帳號,基本上大概也不會太期待了。

單次 PR 的 Commit 次數過多

同學們一開始還不習慣 Commit 的手感,有可能一次 Commit 一大堆檔案,或是每次 Commit 只有一點點的修改,這些都會被我退回去整理後再重新發 PR,期望大家可以透過這個訓練提早養成正確的 Commit 習慣。

測試沒過

有些作業我會請同學們寫一段程式並串接上 CI(Continuous Integration) 來跑自動化測試:

CI

如果在 PR 後面出現紅色叉叉表示那個測試是有問題的,連看都不需要看就可直接關掉,有綠色勾勾才需要開始看。我使用的是 Travis CI,透過它的設定檔可以設定只針對特定的分支或是 PR 來進行測試:

Travis CI

當同學們發送 PR 的同時便會啟動 CI 流程,如果 CI 沒跑過同學們會自己收到通知。

Commit 或 PR 的訊息無意義

Commit 訊息很重要嗎? 對,很重要!很重要!很重要!(所以要說三次)

它最主要的目的就是告訴你自己以及其它人「這次的修改做了什麼」,所以不管是用中文或英文,如果訊息沒什麼意義的話我也會退回去修正重送。

PR 內含有未處理之 conflict。

這就不用說了,有衝突,當然是解掉之後再重送啦!

超過繳交期限,或是同一次 PR 裡有前次作業。

我這人比較難相處,不太喜歡超過期限的作業或是補交作業,所以有這個情況我也會把作業退回去。

常見問題

成效如何?

這我不好說,但就算課程本身學得不怎麼樣,至少還學到 Git 跟 GitHub 怎麼用,也算是有學到一技之長。

不怕學生抄嗎?

要抄就抄啊!大家都當過學生,我知道作業一定會抄來抄去,所以我會在開學第一週就跟同學們說:

我給大家的作業都不算太難,目的是希望大家回去後再多花一點時間練習,所以請盡量試著自己寫寫看。用抄的其實還是看得出來的,我大學時候也不喜歡寫作業所以我不會怪大家。重點是,各位的人生是你們自己的,想要變什麼樣的人,就要在年輕的時候做什麼樣的努力。

但印象中還是有回同學抄了某位同學的作業,最後我是給「比較晚 Commit」的那位同學的那次作業零分,因為如果作業借同學抄還比別人晚交就是你的錯了。

想試試看嗎?我很樂意跟大家分享

各位學校的教授、老師們想試試看嗎?我知道老師們大多很忙,如果您是現職學校教職員,貴校只要集滿五名以上教職員,台北市/新北市我可免費前往貴校與老師們分享;若是外縣市的話只要幫我處理車資就行了 :)

歡迎直接來信給我 eddie@5xruby.tw

Git 小說連載系列之「可以刪掉全部的分支嗎?」

Git 小說連載系列」系列主要是針對在大家學習或使用 Git 的過程遇到的的一些有趣或微妙的情境而寫的短文,希望可以藉由這一系列的短文幫大家更容易的了解到底 Git 是怎麼回事。

曾經使用過 Git 的朋友,應該大多聽說過在 Git 裡面使用分支(Branch)很方便。不知道大家對於分支的觀念是否正確,下面有三個關於刪除分支的(蠢)問題,大家可以先想想看:

  1. 預設的 master 分支可以刪嗎?
  2. 所有的分支都可以刪嗎?
  3. 那可以把全部的分支都刪光光嗎?

分支是什麼?

即然講到要刪分支,那就要先了解一下什麼是分支。有些人以為分支像是另外複製一個子目錄出來,所以在修改的時候才不會影響到原本分支的內容。事實上分支就只是一個小小的檔案,或者你可把一個分支想像成是一張貼紙,它會在某顆 Commit 上面。

Git Branches

以這個例子來說,目前有 dogcat 跟預設的 master 這三個分支,它們分別是貼在 053fb21b174a5a 以及 e12d8ef 這三顆 Commit 上。

關於更多分支的使用,可參閱開始使用分支章節介紹。

刪掉分支的話會…?

因為分支就只像是一張貼在某顆 Commit 上的貼紙,所以刪除分支這件事差不多就只是把那張貼紙撕掉而已。貼紙雖然是撕掉了,但原本被它貼著的那顆 Commit 並不會因此而消失。它沒有不見,它只是在茫茫的 Git 海中漂浮,因為你把它的名牌撕掉了,它變得不容易被你找到而已。

如果想救回刪掉的分支,可參閱「【狀況題】不小心把還沒合併的分支砍掉了,救得回來嗎?」章節說明。

如果你對分支的觀念正確的話,「救回刪掉的分支」這樣的說法其實也不太正確,應該說「找回原本貼著分支貼紙的那個 Commit」會更精準一些。

預設的分支

master 分支是 Git 預設的分支,其實它也只是一個普通的分支,只是它剛好叫做 master 而已,除此之外並沒什麼特別的,所以如果想換個名字甚至是刪掉它也是沒問題的。

所以,什麼分支都能刪嗎?

這個嘛…這要看狀況,有些情況是沒辦法刪掉某些分支,像是你不能刪掉你目前所在的那個分支:

$ git branch
  cat
  dog
* master

因為現在剛好處在 master 分支,所以硬是要刪掉的話會出現這個錯誤訊息:

$ git branch -D master
error: Cannot delete branch 'master' checked out at '/tmp/git-practice'

因為現在就剛好踩在 master 上,你把 master 抽走它就無立足之地啦。但這並不表示 master 這個分支不能刪,只要先切換到別的分支就可以了:

$ git checkout cat
Switched to branch 'cat'

$ git branch
* cat
  dog
  master

$ git branch -D master
Deleted branch master (was e12d8ef).

先切到別的分支後,轉頭打個回馬槍,搞定!

全部刪光光!

大概對分支有點概念後,知道所有的分支都可刪,再回到原本這個有點微妙的主題「可以刪掉全部的分支嗎?」

嗯…答案是可以的,但在刪最後一個的時候會遇到「不能刪除目前所在的分支」的狀況,所以只要先 Checkout 到任意一個 沒有分支的 Commit 就行(這時候會變成「detached HEAD」狀態),例如我直接切到 053fb21 這個 Commit(就是原本 dog 分支貼著的那顆 Commit):

$ git checkout 053fb21
Note: checking out '053fb21'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 053fb21... add dog 2

變成這個狀態並不是錯誤訊息,所以不要太害怕。關於 detached HEAD 狀態,請參閱「【冷知識】斷頭(detached HEAD)是怎麼一回事?」章節介紹。

讓我們檢視一下目前的分支:

$ git branch
* (HEAD detached at 053fb21)
  cat
  dog

現在不在 cat 分支也不在 dog 分支了,剛剛的 master 也先被刪掉了,所以接下來就可以放大絕:

$ git branch -D cat dog
Deleted branch cat (was b174a5a).
Deleted branch dog (was 053fb21).

來檢視一下成果:

$ git branch
* (HEAD detached at 053fb21)

這樣就刪光光了!

為什麼要把全部的分支刪光光啊?這樣有什麼意義嗎?

意義是三小其實沒什麼意義啊,就好玩而已!

歡迎來聊聊

有任何跟 Git 有關的疑難雜症或是應用情境,都歡迎來信或留言,如果討論的篇幅夠多就會另外整理一篇文章供大家參考 :)

Git 小說連載系列

image photo by Chad Horwedel

我常會比喻 Git 就像一台電腦檔案的時光機,它保存了這些電腦檔案過去發生的種種狀態。只要你知道怎麼駕馭這台時光機,你可以回到過去任何一個時間點,找回當時的檔案。

Git 是個易學難精的工具,雖然像是 addcommitpushpullclone 這些常用的指令已足以應付平日工作需求,但對於要精準的找到過去某個時間點的檔案、整理太過雜亂的 Commit,或是想復原剛剛不小心幹的蠢事,在不清楚 Git 運作原理的情況下,很容易會越弄越糟,最後放棄而使用傳統的複製、貼上大法。

雖然在「為你自己學 Git」一書中有提到一些常見的狀況題以及該怎麼解決,但還是常有朋友會遇到一些更有趣的情境。所以這個專欄的目的就是除了寫一些我自己亂試、亂玩 Git 的主題外,也希望可以幫朋友們解決他們遇到的問題或是釐清觀念。

連載列表(將會持續更新):

  1. 可以刪掉全部的分支嗎?

暫定主題:

  1. 怎麼刪除第一個 Commit?
  2. Git 裡面的 Git?
  3. git rerere 是什麼神奇的指令?

如果各位還有想到什麼主題,都歡迎直接在底下留言,或是丟我 FB 訊息或 Email 都可以。希望透過這些例子,可以讓大家更清楚 Git 是怎麼一回事。

為你自己學 Git

好陣子沒寫 Blog 文章,其實又是在忙別的事(藉口)。雖然網路上 Git 的學習資源向來不少,但看了一下坊間這方面中文書並算不多,特別是用新手看得懂的白話文寫的更少。今年暑假剛好要準備公司的 Git 線上課程,趁著這次機會,把之前的課程的投影片跟教學內容文字化,最後就不知不覺變成 300 多頁,於是就順勢交給出版社了。

是的,這本書的封面又是貓!

book

購買連結

本著開源的精神,HTML 版本大部份的內容將會在網路上供大家閱讀,不會收費。

網址:http://gitbook.tw

「為你自己學 Git」,如其標題,學習不需要為公司、長官或同事,不需要為別人,只為你自己。若發現內容有誤或有任何問題,歡迎直接來信跟我說(eddie@5xruby.tw),或是在該章節頁面下方留言 :)

希望這本書的內容對大家有幫助。當然,如果您對我們的培訓課程有興趣,歡迎您參考這個連結

你看過 Elixir 嗎?如果沒有,現在讓你看看!

Purple Crystal

圖片來源:Patrick Wallace

你看過 Elixir 嗎?如果沒有,現在讓你看看!

Elixir 這個名字,對女生朋友來說也許比較熟悉一些,因為它是一款知名化妝品廠商所推出的某一種保養品的品牌,但我並沒有接廠商的業配而且自己也沒在用保養品,所以今天也不是要介紹這款保養品。

我第一次認識 Elixir 這個單字,其實是因為當年玩 Final Fantasy 這款遊戲時候,遊戲裡有一款叫做「エリクサー」的道具,使用後會恢復全部的 HP 跟 MP,而這個「エリクサー」其實就是從 Elixir 這個英文字轉變來的日文外來語。

這篇文章要介紹的,是一款名為 Elixir 的電腦程式語言。本文的目的並不是要告訴你 Elixir 有多好多棒、效能有多好多棒(雖然是事實),而僅介紹一些我認為這個程式語言讓我覺得寫起來很開心的地方,特別是對一個喜歡 Ruby 的人來說。

首先,學習一門新的程式語言,先不說別的,外表看得順眼是很重要的。Elixir 這款程式語言的 Logo 是一顆紫色的水滴:

Elixir Logo

好吧,我個人覺得 Logo 還不錯看(我的看法啦)。

Elixir 是一款函數型的程式語言,跟其它物件導向的程式語言比起來,Elixir 沒有類別、沒有物件、沒有所謂的實體方法、類別方法,只有一般平鋪直敘的函數(Function)。

什麼是函數?我們國、高中的數學都應該看過這樣的東西:

f(x) = 3x + 2

這個一元一次方程式,就是一個函數。函數通常會有輸入值也有輸出值,以上面這個為例,它的「輸入值」是 x,「輸出值」是 3x + 2

在 Elixir,函數是一等公民,甚至可以把函數傳給另一個函數當做一般的參數。不過少了我們平常習慣的物件導向的觀念,一開始真的有點不習慣,會不知道該把程式寫在哪邊比較好。

Elixir 這個程式語言可以介紹的內容很多,應該不是我這一篇文章就可以聊完的,更多關於這個程式語言的細節,請各位移駕至 Elixir 的官網,在這邊就一些我個人覺得有趣、好玩的語法跟大家分享。

好玩的語法

Pipe Operator

也許你曾看過這樣的程式碼:

1
func1(func2(func3(super_function(best_function("I love you")))))

先不管這個 func1func2 或是 super_function 是在幹嘛,像這樣洋蔥式或大腸包小腸式一層包一層的寫法,雖然仔細看還是能知道意思,但可讀性上就稍微沒那麼好。如果改成多行,可以變這樣:

1
2
3
4
5
tmp1 = best_function("I love you")
tmp2 = super_function(tmp1)
tmp3 = func3(tmp2)
tmp4 = func2(tmp3)
tmp5 = func1(tmp4)

老實說這樣寫也沒好多少,特別如果又像我這樣故意用一堆之後用不上的 temp 變數。

Elixir 可以直接這樣寫:

1
2
3
4
5
6
"I love you"
|> best_function
|> super_function
|> func3
|> func2
|> func1

Elixir 的 |> 這個 Operator,意思就是「把前一個 function 執行的結果,當做第一個參數傳入下一個 function」,所以下面這段 Elixir 範例:

1
2
3
4
5
6
"ruby is awesome!"
|> String.split
|> Enum.map(fn(x) -> String.capitalize(x) end)
|> Enum.join(" ")

# 得到 "Ruby Is Awesome!"

它做了「把字串接開」→「把每個元素的首字改大寫」→「把各個元素組回字串」。其中中間 Enum.map/2 那段可以再改成這樣:

1
2
3
4
"ruby is awesome!"
|> String.split
|> Enum.map(&(String.capitalize/1))
|> Enum.join(" ")

像這樣可以把前一個 function 執行的結果,一路往下一個 function 接下去,可以讓每個 function 的「任務」分得很清楚,隨時可以再增加或刪除,個人覺得這樣超有趣的!

Metaprogramming

習慣 Ruby 之後,程式語言有沒有直接支援 Metaprogramming 的功能對我來說就會變得很重要。Elixir 直接就有支援 Metaprogramming:

其實我不太確定 Metaprogramming 該怎麼翻成中文比較適當,不過請大家先看看這張截圖:

elixir

從帳面上的數字看起來,放在 GitHub 的 Elixir 程式語言專案,有 89.7% 的內容是用 Elixir 這個程式語言寫的。咦?有覺得哪裡怪怪的嗎?也就是說這個程式語言,有將近九成的組成都是 Elixir 這個程式語言本身。用自己寫自己,我覺得這超酷的!

在 Elixir 要使用 Metaprogramming 的技巧,主要都是使用 macro 搭配 quoteunquote 來撰寫:

再從 Metaprogramming Elixir 書上借個例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
defmodule Math do
  defmacro say({:+, _, [lhs, rhs]}) do
    quote do
      IO.puts "#{unquote(lhs)}#{unquote(rhs)} 等於 #{unquote(lhs + rhs)}"
    end
  end

  defmacro say({:*, _, [lhs, rhs]}) do
    quote do
      IO.puts "#{unquote(lhs)} 乘以 #{unquote(rhs)} 等於 #{unquote(lhs * rhs)}"
    end
  end
end

先不管其實這程式看起來怎麼樣(好啦,其實有點不太容易懂),但用起來的樣子像這樣:

$ iex math.exs
Erlang/OTP 20 [erts-9.1.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Interactive Elixir (1.5.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> require Math
Math
iex(2)> Math.say 1 + 2
1 加 2 等於 3
:ok
iex(3)> Math.say 2 * 3
2 乘以 3 等於 6
:ok

發生什麼事了? 我先把 1 + 2 透過 quote 拆解成這樣:

iex(1)> quote do: 1 + 2
{:+, [context: Elixir, import: Kernel], [1, 2]}

這等於是直接在操作 AST(Abstract Syntax Tree)了,這超酷的。可以做到這種層級的操作,我想大概什麼功能都能寫得出來了。

其實在 Macro 在 Elixir 的應用非常廣,甚至後來有次無聊去翻 Elixir 的原始碼才發現,原來在 Elixir 裡,連 if...elseunless 之類看起來像關鍵字的語法,就是用 Macro 的方式寫出來的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 檔案位置:lib/elixir/lib/kernel.ex
defmacro if(condition, clauses) do
  build_if(condition, clauses)
end

defp build_if(condition, do: do_clause) do
  build_if(condition, do: do_clause, else: nil)
end

defp build_if(condition, do: do_clause, else: else_clause) do
  optimize_boolean(
    quote do
      case unquote(condition) do
        x when x in [false, nil] -> unquote(else_clause)
        _ -> unquote(do_clause)
      end
    end
  )
end

defp build_if(_condition, _arguments) do
  raise ArgumentError,
        "invalid or duplicate keys for if, only \"do\" and an optional \"else\" are permitted"
end

如果你仔細看上面這段原始碼,就會發現在 Elixir 的 if ... else 其實就是 case ... when 而已,這真的太有趣了 :)

對 Macro 有興趣的話,可以再參考官網上的文件

其它我覺得有趣的…

可以省略小括號

這對別的程式語言的人來說可能沒什麼感覺,但對寫習慣 Ruby 的人來卻是一大福音。

有 REPL 可以用

REPL 是「Read-Eval-Print Loop」幾個字的縮寫,許多程式語言都有提供這樣的工具,以 Ruby 來說是 irb,而在 Elixir 則是 iex。在終端機環境下輸入 iex 指令後會進入互動式的環境,可以在這裡試驗或練習程式語法:

iex

跟 Ruby 的語法有像

這對已經習慣 Ruby 語法的人來說算是福音,但別誤會,即使從 Ruby 轉換到 Elixir 也不會是完全無痛,畢竟 Elixir 是一款函數式的程式語言,沒有物件導向的那些類別、物件的東西,這點需要花一點時間習慣。

小結

學 Elixir 可以幹嘛

學這個可以幹嘛喔?想幹嘛就幹嘛,學習本來就不需要為公司、不需要為長官、同事、不需要為別人,只為你自己,你自己覺得有趣最重要!

話是這樣說沒錯,但實際一點,你爸媽可能還是會想問你學這東西要幹嘛?學這個找得到工作嗎?

如果想要開發網站應用程式,有 Phoenix 這款 Web 開發框架可以用,Phoenix 較早版本跟 Ruby on Rails 有 87% 像,對現有的 Rails Developer 來說還算是滿友善的(但改版後長得有點不太一樣了);另外想玩硬體,也有 Nerves 可以研究一下。

聚會

目前 Elixir 在全世界的人口數還不算多,就我觀察,在台灣應該就只有一小群人在用。不過每個月都有聚會,目前也有自己專屬的 Facebook 粉絲專頁

AD 圖片來源:Shiseido 官網

借用該知名保養品品牌的宣傳台詞「遇見『水玉光』,遇見更好的自己」,小改一下變成:

遇見 Elixir,遇見更好的自己!

研討會

雖然在台灣的使用人口還不算多,但我們明年在辦 RubyConf Taiwan 的時候,會把 Elixir 也正式的納入議程(就說 Ruby 跟 Elixir 是好朋友了)

反正在國外的 RubyConf 也越來越多的 Elixir 議程,即然這樣,我們就光明正大把辦在一起吧!

RubyElixirConf Taiwan

除了 Ruby 程式語言的老爸松本行弘之外,也邀請到了 Elixir 的老爸 José Valim 來擔任主題演講。

咦?說到底這篇竟然是 Ruby X Elixir Conf 的業配文啊,可…可惡!