2018/6/13

Ruby Kaigi 2018 會後心得

markdown 這是我第一次參加 Ruby Kaigi,Ruby Kaigi 是一個 Ruby 的大型研討會,參加者約 1000 人左右,在日本仙台國際中心舉辦。 我們公司([五倍紅寶石](https://5xruby.tw/))免費提供了機票、住宿、研討會門票和生活津貼等資源給想要參加 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](https://rubykaigi.org/2018/presentations/yukihiro_matz.html#may31) - 命名很重要 - 命名會給予概念,而人們使用概念來進行交流。 - 當你覺得命名很難,表示你還沒正確理解那些概念。 - 命名專案的時候,可被 Google 很重要 - 不要使用已經存在的單字,像是 Go、Swift,而是使用兩個單字的組合,像是 TensorFlow,或者是修改單字中的幾個字母,藉此獲得可被 Google 的特性 - 時間很重要 - 時間就是錢,時間就是價值,但是人類經常浪費時間 - 如何增加開發者的產能很重要 - Ruby 超棒 - Ruby 有很強大的內建函數 - Ruby 有很強大的套件和框架 - Ruby 有友善的社群 - Ruby 很簡潔 - Ruby 目前著重於效能和 Concurrency 的優化。 - 時間就是錢:如果效能變成3倍,就等於可以使用1/3的雲端平台成本支撐目前的使用量 - Ruby 已死!? Ruby 每年都在死 ## [Hijacking Ruby Syntax in Ruby](https://rubykaigi.org/2018/presentations/joker1007.html#may31) - 做了一些套件可以用來強迫檢查繼承後的 class 有沒有好好寫 - [Finalist](https://github.com/joker1007/finalist):override 同名方法時會 raise - [Overrider](https://github.com/joker1007/overrider):當父類別沒有同名方法時會 raise - [Abstriker](https://github.com/joker1007/Abstriker):當繼承的 class 沒有實作抽象方法時會 raise - [ImplicitParameter](https://github.com/joker1007/implicit_parameter) - [With Resource](https://github.com/tagomoris/with_resources):確保資源只會在block 內使用,結束後會被安全釋放 - [Deferred](https://github.com/tagomoris/deferral):With Resource 有多重資源使用時的波動拳問題,考慮 Go 語言的 defer,所以在 Ruby 也幹一個 - 很多東西是使用神奇 der [TracePoint](https://ruby-doc.org/core-2.5.0/TracePoint.html) 來實作 - 提到 Ruby 的 undef_method:直接跳 NoMethodError 不問父類別 - 提到 Ruby 的 remove_method:會檢查父類別有沒有同名方法 ## [Fast Numerical Computing and Deep Learning in Ruby with Cumo](https://rubykaigi.org/2018/presentations/sonots.html#may31) - 他做了一個叫 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](https://rubykaigi.org/2018/presentations/jules2689.html#jun01) - 我們無法要求所有員工都能夠在「事前」記住所有該注意的事項,但「事後」才發現就已經太遲,最佳的教育時機就是在當下 - 提出 JIT 教育的概念 - 將 Rubocop 視為一種自動進行的 JIT 教育
上圖說明了這樣的教育方式也能實踐到環境架設上 在其他的場次中沒有獲得值得寫下來的內容,或者大多數內容是聽不懂的。 # 會場周邊活動 在會場有一個小區域做了 Pair Programming 的直播,主題是使用 Ruby 寫出一個 [Game of Life](https://en.wikipedia.org/wiki/Conway's_Game_of_Life) 在這個活動進行的同時,議程也在進行中,所以在這邊看他們 Pair Programming 就無法看議程。 Game of Life 是假設這個世界就像棋盤,而每一個格子裡面可能有生物或沒有生物。 如果一個格子的周圍 8 格有其他生物,稱為鄰居,而鄰居的數量會影響生物出生或者死亡。設定不同的出生和死亡條件會讓結果不同。 本次實作的出生條件:某個空格剛好有 3 個鄰居,就會在某格生成 1 個生物 本次實作的死亡條件:某個生物的鄰居 < 2 或者 > 3,就會死亡 如果不屬於出生或死亡條件,格子的狀態就維持原樣。 看著看著覺得他們實作得很慢,於是就在旁邊也實作了個:[https://gist.github.com/etrex/9999836faa433046d44ab5af9e7c01fe](https://gist.github.com/etrex/9999836faa433046d44ab5af9e7c01fe) 結果自己實作也很慢。 # [三角棋(Triangular Nim)](https://zh.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E6%A3%8B) 在會場寫了 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](https://github.com/etrex/ai/tree/master/triangular_nim) # 整體心得 在某些議程中也許不能獲得什麼,但是可以引發自己的想法。因為它提供了一些時間和環境,讓你去思考一些平常不會去思考的問題。 我跟主動怪討論了為什麼 Ruby Kaigi 的議程選題都是這麼硬的主題之類的問題,我得到了一個結論。 網路效應不只發生在應用程式或服務上,同時也發生在程式語言上,也就是說強勢語言可以獲得較多的使用者,導致該語言更強勢。 Ruby 的優點是快速建置服務,從 Ruby 圈的人努力的方向來看,目前的主要發展是效能、Concurrency 和機器學習來看,主要的假想敵應該是有 TensorFlow 可以用的 Python。 如果在 Ruby 這邊搞一個 Gem,讓你只需要實作問題以及演算法,就能夠直接變成一個網路服務的形式存在的話,我認為應該會很有搞頭。