這是我第一次參加 Ruby Kaigi,Ruby Kaigi 是一個 Ruby 的大型研討會,參加者約 1000 人左右,在日本仙台國際中心舉辦。
我們公司(五倍紅寶石)免費提供了機票、住宿、研討會門票和生活津貼等資源給想要參加 Ruby Kaigi 的員工,目的是避免員工成為邊緣人、促進員工多參與社群,我們的員工福利真的hen好,感恩五倍、讚嘆五倍。
我們搭乘虎航的飛機,從桃園機場前往日本仙台。
抵達仙台後再搭從仙台空港站 to 仙台站的鐵路交通,類似台灣的捷運,但不確定要怎麼稱呼。
出仙台站後發現我們的飯店竟然就直接蓋在車站旁邊大約 50 公尺的距離。
後來發現我們甚至可以從車站內直接走到飯店,不需要走出車站。
抵達飯店後,同事就直接在大廳擺出了一個帥爆的姿勢。
為了之後的 Party 做準備,第一天的晚餐就是燒肉喝到飽。在日本,似乎很盛行喝酒交朋友的文化。
燒肉喝到飽是指飲料(包含酒類)可以無限點(如果你喝得夠快的話,就可以趨近於無限),但是燒肉的部分是類似套餐,是固定的份量。
飲料的 Menu 上可以看見各種酒名以日文表示。因為我比較喜歡喝調酒,所以我的策略就是在調酒的分類按照順序點。點餐時基本上我就是隨便指一個,即使 Google 加上翻譯,還是很難知道自己喝到的是什麼,畢竟調酒名稱本來就都很詭異。
第二天是 Remote 工作日,據說是因為發現早一天到達仙台可以獲得比較便宜的總支出。
第二天的晚上,也就是 Ruby Kaigi 的前一天晚上,有一個由 Speee 主辦的 Preparty。
Speee 是 Ruby Kaigi 的贊助廠商之一,由於 Ruby Kaigi 的 Party 之多,我無法判斷到底哪些 party 才是所謂「官方」所舉辦。
現場看起來大概像這樣:
中間有一整條的食物區,旁邊則是大型方桌提供酒類。
壽司是主食,只可惜我不吃壽司。
旁邊有一個調酒區,可以跟 NPC 點酒,這一罐紫色的酒(Crème de cassis)是我有興趣的酒,所以特地拍了一張。
在這個會場有個舞台,Party 中途有一些活動,其中一個活動是清酒盲測。這一罐看起來很高級的清酒會被倒在A杯或B杯中,而另一個杯子就會是普通清酒。
主持人在現場尋找自願參加者,有興趣的人就可以上去玩。
參加者需要戴上眼罩,隨後工作人員就會開始倒酒,此時只有參加者不知道哪一杯酒是高級清酒,現場所有的旁觀者都看得一清二楚。
參加者喝完之後需要舉牌表示意見,主持人也會詢問他們為何選擇這樣的答案,這是一個還蠻有趣的環節。
這是在遊戲說明時介紹高級清酒的部分。
在這個場合,我們需要多嘗試接觸其他人。這對我來說難度很高,因為即使是台灣人我都不知道該跟對方說什麼,更何況是外國人。
我覺得我就像是一隻被動怪,如果有人來跟我對話的話,我是OK的。但是我不會主動攻擊。
所以我後來就發展出一個策略:跟著一個主動怪同事(以下簡稱主動怪),由他發動攻擊,其他人就圍上去這樣。
主動怪教我們如何發動攻擊:「你眼睛就四處看,有時候會剛好跟某人四目相對,這時候就直接走過去打招呼就行惹。」
我是覺得這就像神奇寶貝遊戲裡的路人訓練師,當你路過他面前時,他就會走過來找你PK。
在 Party 結束回到飯店後,一群人休息後移動到主動怪的房間聽同事試講,因為我們同行的同事包含兩位講者。
第三天,Kaigi 終於開始。
午餐
他們提供了多樣性的便當選擇,但因為我不吃素,不吃壽司,也不吃醃漬類食物,所以我三天都拿同一款便當,也就是這款。
我們帶著便當到附近的公園(似乎是古蹟)野餐,看起來像這樣:
下午茶
下午茶提供各式日本茶點,有銅鑼燒和各種我講不出名字的當地名產還有一些水果拼盤。水果的部分還是台灣的比較多樣化一點。
若要論好吃程度的話,在每種都已經吃過的情況下,如果現場有鳳梨酥,我會選擇吃鳳梨酥。
各種 Party
除了官方辦的 Party 之外,其他 Party 都是免費的,但我認為免費的 Party 都表現得比較好。我想應該是因為免費,所以感覺比較好吧。
所有的 Party 都提供無限量的啤酒跟清酒,我比較喜歡清酒,因為啤酒有氣泡,而我不太能喝含有氣泡的飲料。
贊助商
我在贊助商區發現了一個很有趣的攤位。
使用不同顏色的樂高來區分,可以即時生成對應的室內設計圖。
他們的贊助商區提供了各式各樣的小禮物,藉此吸引你過去他們的攤位。有些則是會要求你在 Twitter 上發文或者要求你做一些事情才會送。
有手提袋、資料夾、貼紙、扇子、徽章、入浴劑、香皂、溜溜球、杯墊、包包掛環、筷子、眼鏡布、pokey、筆記本、詐神筆記本等。
古蹟
趁中午吃完飯去看了一下博物館和仙台城跡,因為博物館不能拍照,所以就給大家看看仙台城跡上有什麼。
議程
Matz 的開場 Keynote
命名很重要
命名會給予概念,而人們使用概念來進行交流。
當你覺得命名很難,表示你還沒正確理解那些概念。
命名專案的時候,可被 Google 很重要
不要使用已經存在的單字,像是 Go、Swift,而是使用兩個單字的組合,像是 TensorFlow,或者是修改單字中的幾個字母,藉此獲得可被 Google 的特性
時間很重要
時間就是錢,時間就是價值,但是人類經常浪費時間
如何增加開發者的產能很重要
Ruby 超棒
Ruby 有很強大的內建函數
Ruby 有很強大的套件和框架
Ruby 有友善的社群
Ruby 很簡潔
Ruby 目前著重於效能和 Concurrency 的優化。
時間就是錢:如果效能變成3倍,就等於可以使用1/3的雲端平台成本支撐目前的使用量
Ruby 已死!? Ruby 每年都在死
Hijacking Ruby Syntax in Ruby
做了一些套件可以用來強迫檢查繼承後的 class 有沒有好好寫
Finalist:override 同名方法時會 raise
Overrider:當父類別沒有同名方法時會 raise
Abstriker:當繼承的 class 沒有實作抽象方法時會 raise
With Resource:確保資源只會在block 內使用,結束後會被安全釋放
Deferred:With Resource 有多重資源使用時的波動拳問題,考慮 Go 語言的 defer,所以在 Ruby 也幹一個
很多東西是使用神奇 der TracePoint 來實作
提到 Ruby 的 undef_method:直接跳 NoMethodError 不問父類別
提到 Ruby 的 remove_method:會檢查父類別有沒有同名方法
Fast Numerical Computing and Deep Learning in Ruby with Cumo
他做了一個叫 Cumo 的套件,可以使用 CUDA 在 NVidia 顯示卡上做計算的加速。
介紹了 Ruby 跟機器學習有關的套件
DNN : Red-chainer
Tensor : Numo/NArray, Cumo
CUDA binding : RbCUDA
PyCall : binding to python
tool : Rubyx
CUDA 的記憶體配置很慢,所以 Cumo 有實作 Memory Pool 避免重複配置
目前在顯卡記憶體管理上還未完善,無法有效利用
未來想串接 cuDNN,cuDNN 是 NVidia 的針對 DNN (深度類神經網路)計算加速的另一款 Lib。
Scaling Teams using Tests for Productivity and Education
我們無法要求所有員工都能夠在「事前」記住所有該注意的事項,但「事後」才發現就已經太遲,最佳的教育時機就是在當下
提出 JIT 教育的概念
將 Rubocop 視為一種自動進行的 JIT 教育
上圖說明了這樣的教育方式也能實踐到環境架設上
在其他的場次中沒有獲得值得寫下來的內容,或者大多數內容是聽不懂的。
會場周邊活動
在會場有一個小區域做了 Pair Programming 的直播,主題是使用 Ruby 寫出一個 Game of Life
在這個活動進行的同時,議程也在進行中,所以在這邊看他們 Pair Programming 就無法看議程。
Game of Life 是假設這個世界就像棋盤,而每一個格子裡面可能有生物或沒有生物。
如果一個格子的周圍 8 格有其他生物,稱為鄰居,而鄰居的數量會影響生物出生或者死亡。設定不同的出生和死亡條件會讓結果不同。
本次實作的出生條件:某個空格剛好有 3 個鄰居,就會在某格生成 1 個生物
本次實作的死亡條件:某個生物的鄰居 < 2 或者 > 3,就會死亡
如果不屬於出生或死亡條件,格子的狀態就維持原樣。
看著看著覺得他們實作得很慢,於是就在旁邊也實作了個:https://gist.github.com/etrex/9999836faa433046d44ab5af9e7c01fe
結果自己實作也很慢。
三角棋(Triangular Nim)
在會場寫了 Game of Life 之後,找到了一些小時候寫 Console 小遊戲的手感,於是想要嘗試把小時候沒作完整的三角棋 AI,趁在聽不懂的議程中和回到飯店時。用 Ruby 再實作一次。
這次考慮了強化學習的世界觀,把遊戲分成 Environment 和 Agent,Environment 代表遊戲以及遊戲的主持人,而 Agent 則代表玩家。
目標是實作出強化學習的 AI,希望可以做到像 AlphaGo Zero,不提供人類的知識,而是讓 AI 透過自己跟自己玩,在遊戲經驗中變強。
目前實作了三角棋的 Environment 以及亂選的傻逼 AI 和人類玩家這兩個 Agent。
這是程式碼:https://github.com/etrex/ai/tree/master/triangular_nim
整體心得
在某些議程中也許不能獲得什麼,但是可以引發自己的想法。因為它提供了一些時間和環境,讓你去思考一些平常不會去思考的問題。
我跟主動怪討論了為什麼 Ruby Kaigi 的議程選題都是這麼硬的主題之類的問題,我得到了一個結論。
網路效應不只發生在應用程式或服務上,同時也發生在程式語言上,也就是說強勢語言可以獲得較多的使用者,導致該語言更強勢。
Ruby 的優點是快速建置服務,從 Ruby 圈的人努力的方向來看,目前的主要發展是效能、Concurrency 和機器學習來看,主要的假想敵應該是有 TensorFlow 可以用的 Python。
如果在 Ruby 這邊搞一個 Gem,讓你只需要實作問題以及演算法,就能夠直接變成一個網路服務的形式存在的話,我認為應該會很有搞頭。