ANDPADのiOSアプリの設計について

iOSアプリの設計について

施工管理アプリANDPADのモバイルアプリ開発をしている山下です。

今回はANDPADで採用しているiOSアプリの設計について書こうと思います。

ANDPADはサービスリリースしてから4年ほど経過しており、ユーザー数も右肩上がりに伸び続けています。アプリもリリースしてから3年半ほど経過して設計を振り返る機会ができたので記事を書いている次第です。

基本的な設計方針としてはMVVMを採用しています。3年半ほど前は、アプリ界隈では比較的新しめの設計だったのですが、今では結構当たり前になっているのかなと思います。構成図はこのような感じです。

     f:id:oct88:20190529171816p:plain

使っている主なライブラリは、

  • RxSwift
  • Realm
  • Alamofire

などです。比較的今でもよく使われているライブラリなので選択は正解だったと思います。

MVVMの部分は、一般的な使い方と基本同じなので説明を割愛します。ApiManagerは、ローカルやサーバー側からのデータ取得を担っています。ScreenUpdateManagerは、複数画面をまたいだ場合のイベント伝搬の責務を担っています。 

建築系で特有の機能をライブラリ化

ANDPADは、iOSだけで5アプリリリースしています。ちなみにAndroidも4アプリリリースしています。Androidアプリの開発も私がやっているのでまた設計の話を別記事で書こうと思います。

 開発当初から、建築業界という広いドメインを扱うサービスなので用途毎に複数のアプリをリリースしようと決めていました。複数のアプリをリリースするにあたり、共通化できそうな機能は独自ライブラリとして切り出す手法を初期段階から行なっていました。同じような機能を実装する場合はOSSのライブラリと同じような感じでライブラリをインストールするとアプリから呼び出せるようになっています。ライブラリの管理はCocoaPodsを使っています。カメラ機能など、建築現場特有の機能などはよく要望を頂くのでライブラリ化することでだいぶ助かっています。

         f:id:oct88:20190530161018p:plain

設計を振り返って

 今回設計を振り返ろうと思ったきっかけは、あるアプリをリニューアルするにあたり現状の設計を見直して改善できる部分を洗い出そうと思ったからです。今までの設計の中で失敗だったなと思ったのは役割があいまいなManagerクラスを作ってしまったことや、色んな場所から呼び出したいモジュールを安易にシングルトンにしてしまったことなどです。次の設計では、このあたりを解決した構成を考えたいと思っています。形になった段階でまた記事を書こうと思います。おたのしみに!では 

積極採用中

弊社では、業務拡大中で最高の設計をしたいiOSアプリ開発者を積極採用しております。みなさまのご応募お待ちしております!!エンジニア採用サイトに募集職種や、会社の雰囲気の分かるインタビュー記事があります。是非ご覧ください。

5月の社員総会を行いました!!

今週の月曜日は月に1度の総会の日でした!

 

各部門より先月からの取り組みや達成率、データなどが全社員に共有されます。

 

「へぇー、そんなことしてるんだ」とか「そういうところにお客さんは喜ぶのかぁ」など、営業チームやCSチームから話を聞いてて、勉強になる所もたくさんあります。

 

さて、もちろん開発部にも発表のセクションがあります!

 

しかもいつもなぜかトップバッター。

 

CTOはこの雰囲気にまだ慣れないと言ってましたw

f:id:yohei-fujii:20190520204448p:plain

 

まずは、CTOから改めてビジョンの共有

 

f:id:yohei-fujii:20190520204603p:plain



日頃、対応に追われていて忘れがちになるものですが、やはり頭に入れておかなければならないことです。何のために今のプロダクトを開発しているのか、ただ単にレンガを積むことになっていないか。最終的にはここに繋がっていることを忘れてはなりません。

 

 

次のスライドの中で、4つのことを「行動」というパートで述べていました。

 

  1. 技術顧問の就任
  2. ミッション設定
  3. ロードマップづくり
  4. KPIの見える化

 

最近オクトでは、開発部それぞれのチームに技術顧問の方に来て頂いております。フロント、インフラ、自動化、etc... それぞれの分野で知見を持っていらっしゃる方々のお力を借りることで、より良いサービス開発に繋げています。

 

またそれだけではなく、個人のミッション設定、チームとしてのロードマップづくり、そしてそこから得られる結果としてのKPIの見える化に取り組むことで、「組織として動くための構造づくり」に繋げています。

 

 

さて、CTOからのお話の後は、各プロダクトそしてエンジニア部門からの発表タイムです。

 

施工管理チーム、ERPチーム、新規開発チームからそれぞれプロジェクトの進捗が発表されます。そしてその後にそれぞれ、フロントエンド、SRE(改善)、インフラ、デザインと発表の時間が取られました。

 

  • 新たな取り組みや挑戦
  • ここ1ヶ月で達成したこと
  • 新メンバーの紹介
  • 導入ツールの説明
  • セキュリティ面での取り組み
  • etc...

 

この総会は開発部だけでなく、営業部やCSなど、他部署の人たちも参加しています。普段開発がどんなことに取り組んでいるのかを知ってもらういい機会でもあります。

 

個人的にはフロントエンドのセクションで話させてもらいましたが、Rails + AngularのプロジェクトにVueを組み込んで、サクサク動いた動画をお見せした時の会場の盛り上がりは気持ちよかったですww 

 

開発部の後は、CS、営業部、人事・総務、マーケティングそしてCEOとお話が続きました。ワクワクするようなお話も多々。

 

 

 

どんな話かって?

 

 

それは近々発表されるかも♪

もしくは入ってみてのお楽しみです♪

 

 

 

総会が終わったら普段はそれで解散なのですが、今回は懇親会が催されました。

 

お酒とお料理が振舞われ、部署を超えての交流タイム〜〜

 

f:id:yohei-fujii:20190520203700p:plain

 

東京だけじゃなく、各支社からも集まっているし、新しくジョインしたメンバーも多いので、オフィスのフリースペースはもうパンパン。

 

 

f:id:yohei-fujii:20190520214051p:plain

 

美味しそうなお食事が並びます!!

みんなテンションUP!

 

f:id:yohei-fujii:20190520203702p:plain

 

 

美味しいつまみに行列

 

 

f:id:yohei-fujii:20190520203703p:plain

 

最後にみんなで集合写真。パシャり!

総会は多くの社員が顔を合わせる日でもあり、交流も多く生まれます。

 

こんな感じで社会変革に取り組みながらもワイワイと楽しく仕事をしています!一緒にANDPADを盛り上げてみませんか?

 

開発メンバー絶賛募集中です!

 

NuxtMeetUp#8 登壇レポート

NuxtMeetUp#8 に参加&登壇してきました!

オクト プロダクトチームの藤井です。普段はフロントエンド機能開発や改善を担当しています。

 

先日、永田町GRIDで開催されたNuxtMeetUp#8に参加してきました!

nuxt-meetup.connpass.com

 

このイベントは会を追うごとに大きくなっており、今回初めて登壇側で出させてもらうことに。知り合いも多くいましたので、あまり緊張することなく楽しめたかなぁと思います。

 

f:id:yohei-fujii:20190509143548j:plain

 

さて、今回発表させてもらいました内容ですが、こちらになります!

 

speakerdeck.com

 

今回の発表目的は、技術説明というよりかは、知見共有になります。

 

入社してから2ヶ月半ほどは、別のNuxtプロジェクトに携わっておりました。しかし、3月ごろから、「本体」と呼ばれるメインのサービスのある機能のフロント部分を担当することになり、その際にNuxtに切り出せないかと「1日検証」した際のお話です。

 

1日で移行なんて無理があると思われた方、全くその通りだと思います。ただ今回の目的は、「移行のための調査」であるので、ざっくりと、どういったところに懸念点等があるのかを探るためでしたので、短時間で良いと判断しました。

 

(詳しくはスライドをご覧下さい)

 

今回ですが、3月の時点でのいきなりの移行は難しいと判断しましたが、諦めた訳ではありません。移行を見据えた開発や修正を引き続き行なっていきます。適宜進捗はこちらのブログで更新していきますので、よろしくお願いします。

 

最後に

こちら弊社のエンジニア採用サイトになります。どんな会社なのか雰囲気を感じて頂ければ幸いです。

 

 

 

 

 

 

 

RubyKaigi2019 3日目レポート

RubyKaigi2019に参加してきました!

4/18(木)〜4/20(土)に福岡で開催されたRubyKaigi2019 3日目レポートです。 最終日も引き続き、rjgeがお送りします。 1日目・2日目のレポートはそれぞれ下記からご覧いただけます。 1日目レポート 2日目レポート

セッション

ということで、拝見したセッションのレポートです! もしニュアンスや意味を取り違えている箇所等あればご指摘いただけますと幸いです🙇‍♂️

Ruby Committers vs the World

10:00 - 11:10 / Main Hall (3F) @ rubykaigiA

f:id:oct88:20190421003943j:plain

最終日の幕開けは恒例のRubyコミッターのみなさんによる質疑応答と公開開発会議です。 質疑応答もですが、開発会議を直接見られる貴重な機会です!

RubyGems.orgからのお願い

最終日もRubyGems.orgのマルチファクター認証実施またはパスワード変更(強固なものに!)のお願いがありました。 大事なことは何度でも!ということで、認証の設定方法は下記のページで説明されています。 Setting up multi-factor authentication

質疑応答

事前に寄せられた質問の中から3つが取り上げられ、コミッターの方々がざっくばらんに回答または討論するという形式です。 取り上げられた質問は下記の3つです。(質問内容は要約しています)

・ 最近のRubyは非互換の変更に対して慎重な姿勢を取っているが、その方針についてはどう思っているか?(もっと攻めてもよいのでは?)

Ruby/C以外で最近使っている言語は?

・ 担当メンテナがいると嬉しい分野やライブラリは?

3つ目の質問では、JsonライブラリやDateライブラリが取り上げられたのですが、そこから現在行なっているDateをTimeに統合していく作業についてかなり話が盛り上がりました。 特に、Ruby2.6で追加された`Time.parse(123)`(※`Date.parse(123)`のTime版)にまつわる議論ではDateの闇がバンバン伝わってきましたね! 個人的には`Time.parse(123)`をレビューで見かけたら差し戻したくなりそうな気がします笑

公開開発会議

主にMatzさんからの2つの提案について議論が交わされました。

・ 提案1. Rangeを括弧で囲まずに利用できるようにしたい

・ 提案2. Numberd parameters

今回の内容では、その機能を入れるか入れないかよりも、入れるとして記号をどうするかというのがどちらも議論の中心となっていました。

f:id:oct88:20190421003955j:plain

白熱する議論の様子

Cleaning up a huge ruby application

11:20 - 12:00 / International Conference Room (5F) @ rubykaigiD

@riseshiaさんの発表です。 クックパッドさんにてワンタイムカバレッジを本番導入し、7万行以上(!)の不要コードを削除したという内容でした。

https://speakerdeck.com/riseshia/cleaning-up-a-huge-ruby-application

何故消すかや実行に移すことの難しさについては同意しかなかったです。 目に見えた即効性のある改善ではなく、遅効性の毒を取り除くための作業というのはどこでも難しいものなんですね…。 ワンショットカバレッジ、かなり良さげという印象でしたが、今回の発表を聞いてよりその思いを強めました。 弊社もガンガン改善進めていきたい💪

Best practices in web API client development

13:30 - 14:10 / International Conference Room (5F) @ rubykaigiD 

@sue445さんの発表です。 多くのAPI clientを作成されてきた経験から得られたベストプラクティスについてでした。

https://speakerdeck.com/sue445/best-practices-in-web-api-client-development-number-rubykaigi

API clientの責務とすべきではない事項は標語にして貼っておきたくなるレベルでした。 Good patternsについても知見の塊で、こういったお話を聴くことができるRubyKaigi最高ですね!

The future of the Bundled Bundler with RubyGems

14:20 - 15:40 / Main Hall (3F) @ rubykaigiA

@hsbtさんの発表です。 BundlerをRuby本体に含めるための活動についてのお話でした。

https://www.slideshare.net/hsbt/the-future-of-bundled-bundler

動機についての、最初に入れるGemがBundlerである率の高さについて聴きながら、確かに自分も最初に入れたのはBundlerだなと納得していました。 Bundlerが最初から入っているのはものすごく便利ですが、そのために実施された内容が思っていた以上に大変そうでただただ感謝でした。 今後、Gelとどのように肩を並べていくのかもかなり気になりますね!

Timezone API

15:40 - 16:20 / International Conference Room (5F) @ rubykaigiD

@n0kadaさんの発表です。

Ruby 2.6からTimeがタイムゾーンをサポートするようになったことに関連した内容でした。 Timeがタイムゾーンをサポートしていない点については割と日々悩まれてきたので、Date含め、その辺りがいい感じになっていくのはすごく嬉しいですね!

ちなみに、発表の締め括りは "Timezone support has landed in Ruby 2.6!" ということでしたが、質疑応答でコミッターの方々の討論が始まって面白かったです。

今日一日で名前つけるの難しい問題に片手分くらいは遭遇したので、名前をつけることの難しさを痛感しました。

The send-pop optimisation

16:30 - 17:10 / Main Hall (3F) @ rubykaigiA

@shyouheiさんの発表です。 Rubyでは"send-pop"(メソッドをオブジェクトに送信しその戻り値を破棄する)という処理は頻繁に発生するので、その処理を最適化することによってRubyの実行を速くするアプローチについてでした。

https://speakerdeck.com/shyouhei/the-send-pop-optimisation

Keynote : Optimization Techniques Used by the Benchmark Winners

17:20 - 18:30 / Main Hall (3F) @ rubykaigiA

最終日のKeynote@jeremyevans0さんでした。 @jeremyevans0さんはSequelのリードデベロッパーなのですが、今回の発表はSequelとRodaで行なっている最適化や独自のパフォーマンス向上のアプローチに関するものでした。

コード例を挙げて解説を行われたのですが、パフォーマンス向上への情熱がヒシヒシと伝わってくる内容でした。 悔やまれるのは私の英語力が低く、所々聞き落としてしまったことです…。

スポンサートーク

弊社エンジニアの彌冨より、Keynote前にスポンサートークを行わせていただきました! お伝えしたい内容が盛りだくさんで少々駆け足気味のトークとなっておりましたが、発表内容について気になった方は是非お気軽にお問い合わせください。

業界のお話や弊社についてなど、カジュアルミーティングやランチミーティングでざっくばらんにお話ししましょう!

f:id:oct88:20190421004028j:plain

Closing & Next

次回のRubyKaigiはMatsumoto ! 2020/4/09(木)〜2020/4/11(土)に長野県松本市で開催とのことです🎉 2020年、楽しみですね!

f:id:oct88:20190421004037j:plain

f:id:oct88:20190421004047j:plain
また、素晴らしい時間を支えてくださったスタッフの皆さんには心から感謝しております。本当にありがとうございます!

f:id:oct88:20190421004056j:plain
ということで、RubyKaigi 最終日のレポートでした。 セッションもブースも盛りだくさんの大変充実した3日間でしたね! 私はセッション参加がメインであまりブースのほうは入っていなかったのですが、かなり盛況だったようで、お立ち寄りくださった皆さんありがとうございました。

ノベルティやステッカー等、使っていただけると嬉しいです! また、他社さんのノベルティやスタンプ等、お役立ちグッズやセンスの光るものが多く、弊社ももっと攻めていこう!という話になりました。

そういった意味でも今から来年が楽しみです。

f:id:oct88:20190421004008j:plain

f:id:oct88:20190421004018j:plain

f:id:oct88:20190421004106j:plain

積極採用中

弊社では、業務拡大中でソフトウェアエンジニアを積極採用しております。みなさまのご応募お待ちしております!!エンジニア採用サイトに募集職種や、会社の雰囲気の分かるインタビュー記事があります。是非ご覧ください。

engineer.88oct.co.jp

RubyKaigi2019 2日目レポート

RubyKaigi2019(2日目) に参加してきました!

4/18(木)〜4/20(土)に開催されているRubyKaigi2019 2日目のレポートです。 1日目に引き続き、rjgeがお送りします。

1日目のレポートは下記からご覧いただけます。 https://tech.88oct.co.jp/entry/2019/04/19/011058

 

セッション

私が拝見したセッションのレポートです!

2日目は英語のセッションが多めだったのですが、かなり自分の英語力の低さを痛感したので、来年のRubyKaigiまでに少しでも鍛えたいと思いました…。

発表言語関係なく、もしニュアンスや意味を取り違えている箇所等あればご指摘いただけますと幸いです🙇‍♂️

 

Keynote : All bugfixes are incompatibilities

10:00 - 11:10 / Main Hall (3F) @ rubykaigiA

2日目のKeynoteは、CRubyコミッターでRuby安定版のメンテナーである@nagachikaさんでした。
@nagachikaさんはみんな大好きruby trunk changesのブログオーナーでもあります!

まず、昨日もRuby 3 Progress Report内でアナウンスがあった、RubyGems.orgのマルチファクター認証実施のお願いがありました。
RubyGems.orgのマルチファクター認証の設定方法は下記のページで説明されています(大事なことなので弊ブログでも何度も記載させていただきます!)
Setting up multi-factor authentication

メインのお話は、@nagachikaさんが担当されているRuby安定版のメンテナー作業についてでした。
@nagachikaさんが担当されているのはRuby 2.6(安定版最新バージョン)です。
通常はリリース後にtrunkからstableへメンテナーの引き継ぎが行われるのですが、v2.6に関しては事前に令和対応が予定されていたため、v2.6.3のリリース後にメンテナーの変更が行われたとのことでした。(@nagachikaさんはv2.5からv2.6へ)

Rubyの開発はすべてtrunk(gitにおけるmaster branch)に対して行われます。
安定版メンテナーは、trunkに入った変更を監視し、それを安定版に取り込む作業(Backport)を行われています。
基本的にはRedmineでクローズされたチケットや修正を見て、取り込むべきかどうかの判断を行うとのことでした。

How can I become a Ruby stable maintainer?

・ 広いRubyの知識 : 局所的な深い知識よりもRuby全体の広い知識が必要

・ある程度の持続性 : 次のstableが出るまで(1年後まで)は最低でもメンテナーを続けられること

・メンテナンスポリシーを理解していること

Ruby's maintenance policy

bug-fixはBackportを行うが、原則、new featureやspecはBackportしないそうです。
ただ、specや完全に新規の実装は判断しやすいものの、bug-fixとnew featureを厳密に区別するのは難しいということでした。
その点については、IO.readやFile.readでコマンド実行できる問題を例にして説明がありました。
その後、@nagachikaさんが実際にやってしまった失敗談(The Lessons Leaned from failured)に続き、最後に「Be-Practical!」で締められました。

How RSpec works

11:20 - 12:00 / Main Hall (3F) @ rubykaigiA

RSpecリードメンテナーである@samphippenさんの発表です。
内容はタイトルの通り、RSpecがどのように動いているか実装を踏まえつつ解説されるというものでした。
RSpecは複数のgemで構成された**NOT**-Monolithicなgemであることを前提に、RSpecを構成するgemごとに解説が行われていきました。
ちなみに、初日のMatz Keynoteから、
`Matz Hates Tests`
`So RSpec is cancelled`
`Thanks`
(会場笑&拍手) というパフォーマンスもありました。

スライドはこちらで公開されています!

https://speakerdeck.com/samphippen/how-rspec-works

intimate Chat with Matz and mruby developers about mruby

13:30 - 14:10 / Main Hall (3F) @ rubykaigiA

@Hir0_ICさん、Matzさん、@yuri_at_earthさんによるmruby座談会です。
偶然(?)にも4/19はmrubyのお誕生日でした!🎂🎉
(※initial committed on Apr 19, 2012

mrubyについてざっくばらんな話題を3名で話されていくという形式で、事前に募集した質問等にも答えられていました。
mrubyは組み込み用に開発された言語のため、Rubyとは異なり、速度をあげることよりもメモリ量を抑えるほうが優先という話が印象的でした。

Actionable Code Coverage

14:20 - 15:00 / Multi-purpose Hall (2F) @ rubykaigiB

@grosserさんの発表です。
Coverageにおける課題や既存の3種類のCode Coverage(Line Coverage/Branch Coverage/Oneshot Coverage)に触れた上で、@grosserさんが開発されているSingleCovについて解説されました。

発表内容は下記で公開されています!
https://github.com/grosser/ruby-coverage-talk

Coverageが100%であること≠良いテストであることや、「Covered != tested」である点などのテストを書く際のジレンマについてもお話があり、とても興味深かったです。

The fastest way to bootstrap Ruby on Rails

15:40 - 16:20 / International Conference Room (5F) @ rubykaigiD

@udzuraさんの発表です。 発表自体は英語だったのですが、事前に日本語スクリプトが用意されていました。大変ありがたいです🙏
https://gist.github.com/udzura/9d21c4eaecf1c118268ea48c7974b62a
発表内容としてはCRIU(クリュー)を利用することでRoRの立ち上がりを最速(!)にするというものでした。 ここのところDocker環境の初期起動速度について悩んでいたので、CRUI最高では?と浮き足立っています。

日本語スクリプト内からもリンクされていますが、スライドは下記です!

https://speakerdeck.com/udzura/the-fastest-way-to-bootstrap-ruby-on-rails

What is Domain Specific Language?

16:30 - 17:10 / International Conference Room (5F) @ rubykaigiD

@tanaka_akrさんの発表です。
rakeは何故DSLと呼ばれているか?という疑問から始まり、DSLの定義やExternal DSL/Internal DSL等についてのトークでした。
また、上記に関連して、Dirty Techniques(≒黒魔術)とWritability/Readbilityについても最後に触れられており、二つの最大公約を選ぶことの大切さを話された際には力強く頷いてしまいました。
何事にもちょうどいいラインってありますよね!

Lightning Talks

17:20 - 18:30 / Main Hall (3F) @ rubykaigiA  

複数の方による5分間LTです。
5分間×12名に対して全体の時間が70分なので、進行はかなりスピーディでした。
こちらは厳密に5分の制限時間が設けられており、時間切れになるとドラが鳴らされて強制終了となります。
そのため、かなりの方がやや早口で話されるのでついていくこちらも必死です。
令和やDifferentiationに関する話題が複数のLTで出ていたのが印象的でした。

DrinkUp🍺

RubyKaigi 2日目にあたる4/19は磯ぎよし天神店さんで、DrinkUpを開催しました! DrinkUpでは特別な企画等はなかったのですが、美味しい魚と日本酒のおかげでかなり盛り上がっていただけたようでした。
ご参加いただいた皆さん、また、磯ぎよし天神店さんありがとうございました!

弊社代表の稲田から乾杯の挨拶をさせていただきました。

f:id:oct88:20190420103843j:plain 一品目はなんと踊り食い!

f:id:oct88:20190420103533j:plain

f:id:oct88:20190420103608j:plain

f:id:oct88:20190420103639j:plain

f:id:oct88:20190420103708j:plain

 締めの挨拶はモバイル開発責任者の山下から

f:id:oct88:20190420104013j:plain

ということで、RubyKaigi 2日目の速報でした。明日はいよいよ最終日です!
明日は弊社がKeynote前のスポンサートークにて登壇させていただきます。
5-11(5階D会場付近)にてブースも出しているので、よければ空き時間等に遊びにきてください!

積極採用中

弊社では、業務拡大中でソフトウェアエンジニアを積極採用しております。みなさまのご応募お待ちしております!!エンジニア採用サイトに募集職種や、会社の雰囲気の分かるインタビュー記事があります。是非ご覧ください。

engineer.88oct.co.jp

RubyKaigi2019 1日目レポート

RubyKaigi2019(1日目) に参加してきました!

オクト プロダクトチームのrjgeです。普段はパフォーマンスを始めとした性能改善やセキュリティに関する機能改善を担当しています。
4/18(木)〜4/20(土)に開催されているRubyKaigi2019の1日目レポートです。

オクトは今年初めて RubyKaigiRuby Sponsorsとして協賛させていただいています。
5-11(5階D会場付近)にてブースも出しているので、是非スタンプラリーを回りつつ遊びにきてください!
ブースではステッカーやスマホスタンドにもなるバッグハンガーをお配りしています✨
バッグハンガーは残数わずかとなっているため欲しい方はお早めに!

f:id:oct88:20190419005224j:plain

ブース

f:id:oct88:20190419005309j:plain

ノベルティ バッグハンガー

f:id:oct88:20190419005439j:plain

スタンプラリー

Matzさんにも立ち寄っていただきました!

f:id:oct88:20190419005545j:plain

Matzさんと

ということで、ここまで宣伝でした。ここからは1日目の参加レポートです。

今回の会場である福岡国際会議場ですが、各セクションごとに階が異なるという仕様のため、10分で階をまたいで移動!といったことも発生します。
特にセッション終わりは人の出入りでエスカレーター周辺が混み合うため、余裕を持った移動がおすすめです!
ref. 福岡国際会議場 施設案内en

セッション

ここからは私が拝見したセッションのレポートとなるのですが、今回は4会場でセッションが同時進行している
ため予定を組む段階でとても悩みました。というのも、どのセッションも面白そうで全部聞きたいんですよね。
(分身とか分裂とかして同時に4つのセッション聞ける体になりたい。)

Matz Keynote

10:00 - 11:10 / Main Hall (3F) @ rubykaigiA

f:id:oct88:20190419005636j:plain

Matz Keynote

1日目のKeynoteは、Rubyの生みの親であるMatzさんからです。
今回はRuby 3に関するお話がメインでした。Rubyの良い点・悪い点に触れた後、Ruby 3でのメイン変更点についてのお話がありました。

Static Typing

最近の言語では静的解析が利用できるものが多いという話題から始まり、何故今まで入れていなかった静的解析を入れることにしたのかという話に続きました。
本当はテストが嫌い(テストはDRYでないし、私たちはプログラムを書きたいのであってテストを書きたいわけではない)という発言では場内に笑い声が響きます。
できるだけテストの実装にかける時間を減らしたいし、それができるならそれに越したことはないということで静的解析を入れることを考え出したということでした。
普段テストを書くことにそれなりの時間を費やしている私としても、確かにそこが楽になるなら静的解析もありかなと思ってしまいました。
ただ、型宣言自体はできるだけ入れたくないとのこと。人間がわざわざ型宣言をする=コンピュータに働かされている感じがするので逆が良いというのは、言われてみると確かにという気もします。

f:id:oct88:20190419005909j:plain

静的解析導入に当たって検討している4点

ここで話されたType Profilerについては、個人的にはものすごくテンションが上がりました。
導入されるとある意味イコールテストを書くということにはなりますが、テストで想定挙動を先に定義するのは割と普段からやっているので、恩恵100%という感じでした。

Performance

こちらはRuby2.6から導入されたJITに関するお話がメインでした。
JITを入れるとエミュレーター等では速くなるものの、まだRailsを始めとしたWebアプリケーションでは遅くなってしまうので、ネックになっている点をいくつか取り上げられました。

Concurrency

Rubyはマルチコアのことを今まであまり取り上げてきませんでしたが、今後はそちらにも注力されていくということでした。
スレッドは色々と難しい(使うのが難しい、効果を出すのが難しい、極め付けに不具合を直すのも難しい)という後悔のお話も。

上記以外にも、Ruby 3で変更*されない*点や、パターンマッチングのような新たに入れることを検討している機能の紹介と盛りだくさんでした。
かなりワクワクする話題が多く、俄然Ruby 3が楽しみになりました。来年12月が待ち遠しいですね!

Ruby 3 Progress Report

11:20 - 12:00 / Main Hall (3F) @ rubykaigiA

Keynoteに続いて、MatzさんとRubyコアチームからRuby 3 の進捗発表がありました。
こちらはもRuby 3で加わる3大ポイントについての概要説明がメイン担当のコミッターの方からそれぞれありました。

上記以外では、RubyGemsとBundlerの話もありました。
こちらでは、BundlerがいずれRubyGemsにマージされるだろう点と、前日bootstrap-sassで発生したアカウント乗っ取りに関連した注意喚起がありました。
RubyGems.orgを利用されている方はマルチファクター認証を利用しましょう!
Setting up multi-factor authentication

また、Ruby 3でキーワード引数が変わる点についてもアナウンスがありました。
こちらは非互換の変更となり、Ruby 2.7から警告が出るようになるようです。
もともと動作が微妙な点(@mametterさん曰く「バグっている点」)を徐々に綺麗にしていく構想のようでした。
参考: Feature #14183

直近のリリース情報として、本日4/18に新元号(令和)で追加されたUnicodeの対応をRuby2.6.3としてリリースしたとのアナウンスもありました。

Performance Improvement of Ruby 2.7 JIT in Real World

13:30 - 14:10 / Main Hall (3F) @ rubykaigiA

@k0kubunさんの発表です。
こちらは、Ruby2.6から2.7でどのようにJITを改善しているかという内容でした。

スライドが上がっているので、是非そちらをチェックされてみてください!
https://speakerdeck.com/k0kubun/rubykaigi-2019

## Pragmatic Monadic Programing in Ruby
14:20 - 15:00 / International Conference Room (5F) @ rubykaigiD

@joker1007さんの発表です。
Proc楽しい!というところからMonadRubyで実装するにはどうするか?というトリッキーなセッションでした。

こちらも早速スライドが上がっています!
https://speakerdeck.com/joker1007/pragmatic-monadic-programming-in-ruby

また、発表にあったMonarのレポジトリも下記で公開されているようです。
https://github.com/joker1007/monar

A Type-level Ruby Interpreter for Testing and Understanding

15:40 - 16:20 / Main Hall (3F) @ rubykaigiA

@mametterさんの発表です。
Ruby 3に関する発表でもあったType Profilerに関する内容でした。
テストを含めてどこからも呼び出しがないメソッドは解析ができない(型情報が取得できない)等の問題もありましたが、そこはテスト書こうぜ!と言える理由が増えるのでありだなという感想でした。
※テストを書くのは特別好きではないですが、テストがないプロジェクトは精神衛生上好ましくないのでテスト書きたい派です。

スライドです!
https://www.slideshare.net/mametter/a-typelevel-ruby-interpreter-for-testing-and-understanding

ちなみに上記の発表に関する質疑応答を明日4/19にクックパッドさんのブースで行われるようです。

RMagick, migrate to ImageMagick 7

16:30 - 17:10 / International Conference Room (5F) @ rubykaigiD

@watson1978さんの発表です。
RMagickの最近の活動についての発表でした。
RMagick×Homebrewで悩まされたことがあるので、そちらのバグ修正に関する発表の際には心の中で拍手喝采でした👏

発表スライドです!
https://speakerdeck.com/watson/rmagick-migrate-to-imagemagick-7-number-rubykaigi-number-rubykaigi2019

Pattern matching - New feature in Ruby 2.7

17:20 - 18:00 / Main Hall (3F) @ rubykaigiA

@k_tsjさんの発表です。
Ruby2.7のパターンマッチングに関するお話でした。
`case/in`、色々なところで使えそうでしたね!パターンを網羅する必要がある(定義されていないパターンが来るとエラーが発生する)というのもセーフティでいいなと思いました。

サンプルケースが充実したスライドです(見直していたらまたテンションまた上がりました)
https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7

RubyKaigi 2019 Official Party

今年の公式アフターパーティはなんと商店街貸し切り!
中洲川端商店街は全長400mにも及ぶ規模の大きな商店街ということです。
今回はその商店街を貸し切りという何とも小粋なアフターパーティーでした。

f:id:oct88:20190419010005j:plain

f:id:oct88:20190419010038j:plain

f:id:oct88:20190419010100j:plain

f:id:oct88:20190419010121j:plain

ということで、RubyKaigi 1日目の速報でした。聞けなかったセッションのスライドや他の方のレポートを見るのが楽しみです。
明日明後日とRubyKaigiは続くので、みなさん引き続きenjoyしましょう!

最後にまた宣伝になるのですが、明日4/19(金)は弊社でもDrinkUpを企画しています!
場所は磯ぎよし 天神店さんで、セッション終了後、19:00開始予定です。
すでに参加登録いただいている方はもちろん、当日飛び入り参加したい!といった方がいらっしゃりましたら是非弊社ブーススタッフ or 会場内にいる「&ANDPAD」ロゴ入りの服を着た人間までお声がけください!
(お席に限りがあるため、もし満席になってしまった場合はすみません…!)

積極採用中

弊社では、業務拡大中でソフトウェアエンジニアを積極採用しております。みなさまのご応募お待ちしております!!エンジニア採用サイトに募集職種や、会社の雰囲気の分かるインタビュー記事があります。是非ご覧ください。

engineer.88oct.co.jp