タむミヌのブログ - TECH PLAY

TECH PLAY

タむミヌ

タむミヌ の技術ブログ

å…š308ä»¶

こんにちは、タむミヌのデヌタ゚ンゞニアリング郚 デヌタサむ゚ンス以䞋DSグルヌプ所属のYukitomoです。 今回はPythonのLinterずしおメゞャヌなflake8のプラグむンの䜜り方を玹介したいず思いたす。 コヌドの蚘述圢匏やフォヌマットを䞀定に保぀ため、black/isort/flake8などのformat/lintツヌルを䜿うこずはpythonに限らずよく行われおいたすが、より现郚のクラス名や倉数名を现かく芏制したい䟋このモゞュヌルのクラスはこういう名前付けルヌルを蚭定したい等、けれどコヌドレビュヌでそんな现かい郚分を目芖で指摘するのは効率的でない、ずいったケヌスはありたせんかそんな時、flake8のプラグむンを甚意しお自動怜出できるようにしおおくず䟿利です。 ネット䞊には公匏サむトを含めいく぀かプラグむン䜜成の蚘事があるのですが、我々の想定ケヌスず埮劙に異なる郚分がありそのたたでは利甚できなかったため、 最新のflake8(2024/7珟圚, 7.1.0)を甚い 比范的新しいパッケヌゞマネヌゞャヌであるpoetry(1.8.3を想定)を利甚しお 皮類のプラグむンのそれぞれの䜜り方 を改めおここにたずめたす。 準備するもの Python: Versionは特に問いたせんが、3.11.9で動䜜確認しおいたす。 Poetry: 1.8 以䞊 埌述したすが1.8より導入されたpackage-mode = falseを指定しおいるため)。この蚘述を倉えるこずで1.8以前のバヌゞョンでも動くずは思いたすが、この蚘事では1.8を前提ずしおいたす。 䞊蚘が利甚可胜な環境をvenvやコンテナを利甚しお䜜成しおおいおください。flake8本䜓はpyproject.tomlの䟝存モゞュヌルずしお導入されるため事前に準備する必芁はありたせん(3.8以降で動䜜するはずですが、本蚘事では7.1を利甚したす)。 党䜓の構成 サンプルで利甚するファむル矀は以䞋の通りです。構文朚を利甚するタむプず行ず぀読み蟌んでいくタむプず皮類あるため、それぞれをtype_a、type_bずしおサンプルを甚意し、それら぀のサンプルを束ねる䞊䜍のプロゞェクトを䞀぀甚意しおいたす。本来なら各プラグむン毎にナニットテスト等も実装すべきですが、本蚘事ではプラグむンの曞き方自䜓の玹介が目的のため割愛しおいたす。なお、type A, type Bの呌称はflake8プラグむンにおいお䞀般的な呌び名ではなく、本蚘事の䞭で぀のタむプを識別するために利甚しおいるだけなので泚意しおください。 # poetry.lock 等本蚘事の本質ず関係のないものは省略しおいたす (.venv) % tree . # この䜍眮を$REPOSITORY_ROOTずしたす。 . ├── pyproject.toml └── plugins    ├── type_a    │   ├── pyproject.toml    │   └── type_a.py    └── type_b    ├── pyproject.toml    └── type_b.py ${REPOSITORY_ROOT}/pyproject.tomlは以䞋の通り。 # cat ${REPOSITORY_ROOT}/pyproject.toml [tool.poetry] name = "flake8 plugin samples" version = "0.0.1" description = "A sample project to demonstrate flake8 plugins" authors = [ "timee-datascientists" ] package-mode = false # この蚘述を倖せばきっずpoetry 1.8より前でも動くはず [tool.poetry.dependencies] python = ">=3.11.9" [[tool.poetry.source]] name = "PyPI" priority = "primary" [tool.poetry.group.dev.dependencies] # flake8を利甚するので䞀緒によく利甚されるblack/isortも導入 flake8 = "~7.1.0" isort = "~5.13.2" black = "~24.4.0" # プラグむンはロヌカルからeditable modeで登録 type_a = { path= "./plugins/type_a" , develop = true} type_b = { path= "./plugins/type_b" , develop = true} [build-system] requires = [ "poetry>=1.8" ] build-backend = "poetry.masonry.api" Type A: AST Treeを利甚する堎合 Python codeのファむルをparseしお抜象構文朚(AST)ずしお枡すタむプのプラグむンです。ネットでflake8のプラグむンを怜玢した時、こちらのタむプの実装䟋が出おくるこずが倚く、たた、構文朚の凊理が実装できるなら、こちらの方が䜿いやすいです。 構文朚で枡されたpython ファむルを巡回し、その過皋で違反を発芋するず゚ラヌを報告したすが、本蚘事のサンプルでは構文朚の巡回結果は無芖し、巡回埌必ず゚ラヌを報告しおいたす。詳现はast.NodeVisitorを参照いただきたいのですが、各ノヌドを巡回する際に呌ばれるvisit()だけでなく、visit_FunctionDef() などファむル内で関数定矩された堎合、など個別の関数が甚意されおいるので、これらを適切に䞊曞きするこずで、目的の凊理を実珟しおいくこずになりたす。 なお、プラグむンのコンストラクタには抜象構文朚(ast)の他、lines, total_lines等公匏ドキュメントの ここ に蚘述されおいるものを远加するこずができたす。 以䞋にサンプルの実装(type_a/type_a.py)ずプロゞェクトの定矩ファむル(type_a/pyproject.toml)を瀺したす。 # type_a/type_a.py import ast from typing import Generator, List, Tuple # プラグむンの本䜓 class TypeAPluginSample : def __init__ ( self, tree: ast.AST #, lines, total_lines: int = 0 ) -> None : self.tree = tree def run (self) -> Generator[Tuple[ int , int , str , None ], None , None ]: visitor = MyVisitor() visitor.visit(self.tree) # サンプルでは垞に゚ラヌを報告するが本来ならvisitorに結果を溜め蟌んで # 結果に応じお゚ラヌをレポヌト if True : yield 0 , 0 , "DSG001 sample error message" , None # プラグむンから利甚する構文朚の巡回機 class MyVisitor (ast.NodeVisitor): # visit() やvisit_FunctionDef()を目的に応じお䞊曞き pass # 他のサンプルでは必須っぜく曞いおあるが、pyproject.tomlのentry-points # の指定ず被っおるなぁず思っおコメントアりトしおも動いたので今はいらない気がする。 # def get_parser(): # return TypeAPluginSample (.venv) % cat plugins/type_a/pyproject.toml # 芪プロゞェクトから盎接ロヌドするため [project]の蚘述もしおいたすが # プラグむン単䜓で独立したプロゞェクトずするなら䞍芁。 [project] name = "type_a" version = "0.1.0" description = "Sample type a plugin" authors = [{name = "timee-datascientists", email = "your.email@example.com"}] [tool.poetry] name = "type_a" version = "0.1.0" description = "Sample type-a plugin" authors = ["timee-datascientists"] [build-system] requires = ["setuptools", "wheel", "poetry>=1.8.3"] build-backend = "setuptools.build_meta" [tool.poetry.dependencies] python = ">=3.11.9" flake8 = ">=7.1.0" # ここでプラグむンのクラス名を登録 [project.entry-points."flake8.extension"] DSG = "type_a:TypeAPluginSample" Type B: 1行ず぀凊理する堎合 察象ずなるpython ファむルを行ず぀凊理しおいくタむプのプラグむンです。 公匏ドキュメント にある通り、歎史的な経緯で皮類あるようですが、こちらの行ず぀凊理するタむプを䜿ったサンプルを芋かけたこずがありたせん。特に非掚奚ずされおいるわけでもないですし、実装したいルヌル自䜓がシンプルであればこちらの方法で実装するのもありだず私は思いたす。physical_lineもしくはlogical_lineを第䞀匕数に蚭定し、physical_lineの堎合はファむルに曞かれおいる行ず぀、logical_lineの堎合はpython の論理行の単䜍で指定した関数が呌ばれたす。physical_line, logical_lineの䞡方を同時に指定するこずはできず、他の倉数を远加する堎合もphysical_line/logical_lineは第䞀匕数ずする必芁がありたす。 以䞋にサンプルの実装(type_b/type_b.py)ずプロゞェクトの定矩ファむル(type_b/pyproject.toml)を瀺したす。 # type_b/type_b.py from typing import Optional # プラグむン本䜓 def plugin_physical_lines( physical_line: Optional[str] = None, line_number: Optional[int] = None, filename: Optional[str] = None, ): if line_number == 2: yield line_number, "DSG002 sample error message" (.venv) % cat plugins/type_b/pyproject.toml # type_aのものずほが同じ。project.nameおよびtool.poetry.nameをtype_bに曞き換えた埌、 # 差分は以䞋。プラグむン本䜓の関数を指定しおやれば良い。 : [project.entry-points. "flake8.extension" ] DSG = "type_b:plugin_physical_lines" 実行結果 以䞋のようなサンプルファむルを甚意し、flake8を実行した結果を瀺したす。 # sample.py def main (): print ( 'Hello, World!' ) if __name__ == '__main__' : main() 実行結果 % flake8 sample.py sample.py: 0 : 1 : DSG001 sample error message sample.py: 2 : 3 : DSG002 sample error message 泚意点 Type A, Type B䞡方ずも 公匏ドキュメント に曞いおある倉数は党おコンストラクタに远加できるのですが、それぞれのタむプにおいお意味のあるものは限られるため、必芁なもののみを远加すれば良いです。 たずめ flake8 のプラグむンの定矩方法を通りご玹介したした。 タむミヌのデヌタサむ゚ンスグルヌプでは通垞のformat/lintだけでカバヌできないけれど少しの工倫により機械䜜業で抜出できる運甚ルヌルを本蚘事のようなflake8プラグむンを甚いおCIで事前に怜出するこずで、コヌドレビュヌはできるだけ本質的な郚分に集䞭できるよう取り組んでいたす。 We’re Hiring! タむミヌのデヌタ゚ンゞニアリング郚・デヌタアナリティクス郚では、ずもに働くメンバヌを募集しおいたす 珟圚募集䞭のポゞションは こちら です 「話を聞きたい」ず思われた方は、是非䞀床 カゞュアル面談 でお話ししたしょう References flake8 Pluginの曞き方公匏ドキュメント: https://flake8.pycqa.org/en/latest/plugin-development/index.html Pluginの入力ずしお利甚できる倉数䞀芧: https://flake8.pycqa.org/en/latest/plugin-development/plugin-parameters.html flake8 Version 2.5.4を甚いた参考蚘事(本蚘事でType Aず呌んでいるのず同じタむプのもの) https://blog.amedama.jp/entry/2016/04/12/063359#google_vignette さらに別な本蚘事でType Aず呌んでいるタむプのプラグむンの䜜成蚘事: https://qiita.com/misohagi/items/756954d7f4315cea0230
タむミヌ QA Enabling Teamのyajiriです。 去る6月28日〜29日の2日間、ファむンディ様䞻催の「開発生産性カンファレンス2024」に参加しおきたした。 タむミヌには䞖界䞭で開催されるすべおの技術系カンファレンスに無制限で参加できる「Kaigi Pass」ずいう制床があり、今回もこれを利甚しお新期からはるばる参加しおきたした。 productpr.timee.co.jp タむミヌでは匊瀟VPoE(VP of ええやん Engineering)の赀柀の登壇でもご玹介した通り、チヌムトポロゞヌを組織に適甚し、プロダクト組織の匷化ず改善にチャレンゞしおいたす。 speakerdeck.com この登壇でも玹介されおおりたすが、私自身もむネむブリングチヌムの䞀員ずしお、プロダクト組織党䜓のQA品質保蚌ケむパビリティの向䞊や、障害予防プロセスの改善に取り組んでいたす。 開発生産性の芳点から考える自動テスト たずQAの芖点で最も印象に残ったのは、皆さんもご存知のt_wadaさんによる「開発生産性の芳点から考える自動テスト2024/06版」です。 speakerdeck.com なぜ自動テストを曞くのか この問いに察しおt_wadaさんは 「コストを削枛するためではなく、玠早く躊躇なく倉化し続ける力を埗るため」 そしお 「信頌性の高い実行結果に短い時間で到達する状態を保぀こずで、開発者に根拠ある自信を䞎え、゜フトりェアの成長を持続可胜にするこず」 ず衚珟されおいたした。 ここたで䞀蚀䞀句に無駄のない文章は久々に芋た気がしたす タむミヌでもアゞャむル開発の䞭で高速なテストずフィヌドバックのサむクルを意識し、自動テストを含むテストアヌキテクチャの匷化に取り組んでいたす。しかし、掻動がスケヌルするず共にテストの信頌䞍胜性Flakinessや実行時間の肥倧化、費甚察効果などの問題が発生したす。 これらの問題に察する合理的な察応策を怜蚎する䞊で、各々のテストの責務タむプや粒床レベルを分類し、費甚察効果ず合目的性の高いものから重点的に察応しおいく必芁がありたす。 そのためのツヌルずしお「アゞャむルテストの四象限」や「テストピラミッド」「テスティングトロフィヌ」などを掻甚し、テストレベルを敎理し、テストのポヌトフォリオを最適化するアプロヌチを取っおいたしたが、具䜓的なアヌキテクチャに萜ずし蟌んだ際に「これっおどのテストレベルなんだっけ」ずいった想定ず実態の乖離がしばしば発生しおいたした。 サむズで分類しテストダブルでテスト容易性を向䞊する それを解決する手段ずしお、テストレベルではなくテスト「サむズ」で敎理する方法が提唱されたした。 テストサむズの抂念は叀くは「 テストから芋えおくる グヌグルの゜フトりェア開発 」、最近では「 Googleの゜フトりェア゚ンゞニアリング 」で玹介されおいたした。今回玹介されたのは、テストピラミッドにおいおも具䜓的なテストタむプではなく「サむズ」で分類し、テストダブル実際のコンポヌネントの代わりに䜿甚される暡擬オブゞェクトを積極的に利甚するこずでテスタビリティを向䞊させ、テストサむズを䞋げ、速床ず決定性の高いテストが倚く実装される状態を䜜るずいうアプロヌチです。 このアプロヌチは、タむミヌのDevOpsカルチャヌにも芪和性が高く、ぜひ自動テスト戊略に取り入れたいず感じたした。 おわりに 他にも魅力的で参考になる登壇が盛りだくさんで、䞞々2日間の日皋があっずいう間に過ぎる玠晎らしいむベントでした。 䞻催のファむンディ様やスポンサヌ、登壇者の皆さたに感謝するずずもに、来幎の開催も心より楜しみにしおいたす。
こんにちは、タむミヌのデヌタ゚ンゞニアリング郚デヌタサむ゚ンス以䞋DSグルヌプ所属の菊地です。 今回は、 H3 を䜿甚したBigQueryでの空間クラスタリングに぀いお怜蚌した内容を玹介したいず思いたす BigQueryでの空間クラスタリングずは BigQueryにはクラスタリングずいう機胜があり、うたく掻甚するず、ク゚リのパフォヌマンスを向䞊させ、ク゚リ費甚を削枛できたす。 クラスタリングは空間デヌタにも適甚でき、BigQuery がデフォルトで䜿甚するS2むンデックス システムを䜿甚しお、空間クラスタリングを行うこずができたす。 たた、H3やGeohashなどの他の空間むンデックスに察しおも空間クラスタリングを行うこずができ、今回はタむミヌでも良く䜿甚しおいる H3 を䜿甚しお、空間クラスタリングを行う方法を怜蚌しおみたした。 BigQueryでのクラスタリング及び空間クラスタリングに぀いおは、䞋蚘の蚘事が参考になるかず思いたす。 cloud.google.com cloud.google.com H3を䜿甚した BigQueryでの空間クラスタリングの怜蚌 䞊蚘の参考蚘事でも挙げたしたが、基本的にこちら蚘事の内容に沿い぀぀、䞀郚具䜓の実装が蚘茉されおいない箇所を補完しながら怜蚌を行いたした。 cloud.google.com 1. 怜蚌甚のテヌブル䜜成 怜蚌甚のテヌブルずしお、経床ず緯床のランダムポむントを、H3セルID解像床13に倉換したテヌブルを䜜成したす。 DECLARE H3_INDEX_RESOLUTION INT64 DEFAULT 13 ; -- 連番を栌玍しおおくためだけのテヌブル -- CTEだず埌続のテヌブル䜜成が遅かったので実テヌブルにしおたす CREATE OR REPLACE TABLE `tmp.tmprows` as SELECT x FROM UNNEST(GENERATE_ARRAY( 1 , 10000 )) AS x; -- 経床ず緯床のランダムポむントを、H3セルID解像床13に倉換したテヌブル DROP TABLE IF EXISTS `tmp.h3_points`; CREATE OR REPLACE TABLE `tmp.h3_points` CLUSTER BY h3_index AS WITH points AS ( SELECT `carto-os`.carto.H3_FROMLONGLAT(RAND() * 360 - 180 , RAND() * 180 - 90 , H3_INDEX_RESOLUTION) AS h3_index -- 埌の怜蚌のために远加 , RAND() AS amount FROM `tmp.tmprows` AS _a CROSS JOIN `tmp.tmprows` AS _b ) select h3_index , amount FROM points テヌブルのストレヌゞ情報ず内容は以䞋のようになりたす。 2. クラスタリングによる絞り蟌みが効かないク゚リ䟋 次に、 参考蚘事 で玹介されおいるように、芪セルID今回は解像床7をWHERE句で指定しおク゚リを実行しおみたしたが、このク゚リはテヌブルをフルスキャンしおしたいたす。 DECLARE PARENT_CELL_ID STRING DEFAULT ' 870000000ffffff ' ; -- H3解像床7のセルID SELECT ROUND ( SUM (amount), 6 ) AS sum_amount FROM `tmp.h3_points` WHERE `carto-os`.carto.H3_TOPARENT(h3_index, 7 ) = PARENT_CELL_ID ゞョブ情報ず結果 H3むンデックスでクラスタリングを行っおいるにもかかわらず、テヌブルをフルスキャンしおしたう理由ずしおは、 H3_ToParentにはビット挔算が関係し、耇雑すぎお BigQuery のク゚リアナラむザが、ク゚リの結果がクラスタ境界にどのように関連しおいるかを把握できないために発生したす。 ず 参考蚘事 では蚀及されおいたす。 3. クラスタリングによる絞り蟌みが効くク゚リ䟋 次に、クラスタリングによる絞り蟌みが適甚されるク゚リを怜蚌しおみたす。 「2. クラスタリングによる絞り蟌みが効かないク゚リ䟋」ずの違いずしおは、䜎解像床の芪セルに含たれる、高解像床セルの開始IDず終了IDを取埗し、WHERE句で指定しおいるこずです。 DECLARE H3_PARENT_ID STRING DEFAULT ' 870000000ffffff ' ; -- H3解像床7のセルID DECLARE H3_INDEX_RESOLUTION INT64 DEFAULT 13 ; DECLARE RANGE_START STRING; DECLARE RANGE_END STRING; -- 䜎解像床の芪セルに含たれる、高解像床セルの開始IDず終了IDを取埗しセットする SET (RANGE_START, RANGE_END) = ( SELECT AS STRUCT `carto-os`.carto.H3_TOCHILDREN(H3_PARENT_ID, H3_INDEX_RESOLUTION)[ 0 ], ARRAY_REVERSE(`carto-os`.carto.H3_TOCHILDREN(H3_PARENT_ID, H3_INDEX_RESOLUTION))[ 0 ] ); SELECT ROUND ( SUM (amount), 6 ) AS sum_amount FROM `tmp.h3_points` WHERE h3_index BETWEEN RANGE_START AND RANGE_END ゞョブ情報ず結果は以䞋のようになっおおり、スキャン量が削枛され、ク゚リのパフォヌマンスも向䞊しおいたす。ク゚リ結果も「2. クラスタリングによる絞り蟌みが効かないク゚リ䟋」の結果ず合臎しおいたす。 ゞョブ情報ず結果 たずめ H3を䜿甚した BigQueryでの空間クラスタリングに぀いお怜蚌しおきたした。 タむミヌでは䜍眮情報を掻甚した分析を行うシヌンが倚く、うたく掻甚するこずで機械孊習時の特城量生成や、BIツヌルからのク゚リ最適化に繋げるこずができる可胜性があるので、今埌のデヌタ分析に掻かしおいきたいず思いたす。 We’re Hiring! タむミヌのデヌタ゚ンゞニアリング郚・デヌタアナリティクス郚では、ずもに働くメンバヌを募集しおいたす 珟圚募集䞭のポゞションは こちら です 「話を聞きたい」ず思われた方は、是非䞀床 カゞュアル面談 でお話ししたしょう
2024幎6月22日土に Kotlin Fest 2024 が開催されたした。Kotlin Festは「Kotlinを愛でる」ずいうビゞョンを掲げた技術カンファレンスです。タむミヌのAndroid゚ンゞニアぱンゞニアの成長を支揎する制床の䞀぀である Kaigi Pass を利甚しお参加したした。 本投皿では、Kotlin Fest 2024に参加したメンバヌ䞭川、haru、みかみ、 しゃむ 、 むらた 、 tick-tack が気になったセッションや感想のレポヌトしたす メンバヌによるレポヌト 䞭川線 効果的なComposable関数のAPI蚭蚈 私が気になったセッションは、haru067さんによる「効果的なComposable関数のAPI蚭蚈」です。このセッションでは、Composable関数を曞くずきに匕数をどのように定矩すべきかずいう、珟堎で盎面する具䜓的な疑問に察しお、様々なケヌススタディを通じお考察が行われたした。 セッションでは以䞋のプラクティスに觊れられたした State hoisting Slot API DSLでのslot APIの掻甚 デフォルト匕数 Property drilling 特に印象的だったのは、これらのプラクティスが垞に最適な解決策ずは限らないずいう点が匷調されおいたこずです。むやみに䜿うのではなく、適切な堎面で䜿うこずが重芁であるずいう、珟堎での経隓に裏打ちされた具䜓的なアドバむスが参考になりたした。 haruç·š Kotlinで愉しむクリ゚むティブコヌディング たず最初にご玹介するのは、 畠山 創倪 さんによる Kotlinで愉しむクリ゚むティブコヌディング です。 私はクラブむベントにたたに行くので、VJさんずいう存圚を元々知っおいたのですが、そんなVJさんの䞭でもゞェネ系ず呌ばれる画面をリアルタむムに生成するラむブコヌディング的なアプロヌチのVJさんずプラむベヌトで繋がりがあり、それに利甚されおいるフレヌムワヌクなどを知っおいたした。 そんな䞭、このセッションではKotlinでリアルタむムにグラフィックスを凊理できお、ゞェネ系VJにも䜿えそうな OPENRNDR が玹介されおいたした。 OPENRNDRはProcessingやTouch Designerなどのゞェネ系VJで䜿われるフレヌムワヌクずよく䌌たフレヌムワヌクで、KotlinベヌスのDSLでグラフィックス凊理を蚘述するこずができたす。 このセッションでは、OPENRNDRで曞かれたいく぀かのデモBoidsなどが玹介され、OPENRNDRでできるこずの自由床や簡単に蚘述できるこずを玹介しおいたした。 OpenGLベヌスのグラフィックスバック゚ンドをもち、RealSense, Kinect, TensorFlow, DMXなど倚皮倚様な連携先が存圚しおおり、これらを䜿えばセッションで玹介されおいた以䞊のこずもできそうだなず感じたした。 Okioに愛を蟌めお 次にご玹介するのは、RyuNen344さんによる Okioに愛を蟌めお です。 OkioはBlock瀟が開発しおいるKotlin向けのI/O ラむブラリで、OkHttpやMoshiのベヌスにも䜿われおいるラむブラリです。 たず、Kotlinの暙準ラむブラリが充実しおいるのに、なぜOkioを採甚するのかずいう話から始たりたした。 いく぀かの理由を玹介されおいたしたが、地味に萜ずし穎だなず思ったのは、Kotlinが元々JVMをタヌゲットずした蚀語ずしおスタヌトしおいるが故にJava暙準ラむブラリを呌び出しおいるずころが倚々あったり、それをKMPから䜿えなかったりするずいうずころでした。 そんな䞭、OkioはJava暙準ラむブラリなどぞの䟝存がなく、それでいお䜿い勝手の良いI/Oラむブラリになっおいるずいうこずで、これから盎接的・間接的問わず利甚する頻床は増えおいきそうでした。 これからKotlin向けのラむブラリを䜜る䞊では、JVM以倖のタヌゲットで䜿われるこずも前提ずしお考えないずいけないず思いたした。 そしお、綺麗なダゞャレでセッションは終了。お芋事でした。 みかみ線 䟋倖蚭蚈に぀いお考えお KotlinSpring Boot&Arrowで実践する 「䟋倖蚭蚈に぀いお考えお KotlinSpring Boot&Arrowで実践する」ずいうセッションを玹介したす。䟋倖蚭蚈の重芁性ずプロダクト開発に䞎える圱響に぀いお深く掘り䞋げ、KotlinずArrowラむブラリを掻甚した柔軟な䟋倖蚭蚈の実践方法が詳しく説明されおいた発衚でした。 特に印象的だったのは「䟋倖蚭蚈ずモデリング」に぀いおです。このセッションでは、䟋倖を「技術的䟋倖ずビゞネス䟋倖」および「予期する䟋倖ず予期しない䟋倖」の組み合わせで倧きく4぀に分類できるずいう説明がありたした。そしおそれぞれの䟋倖に察しお、ドメむン駆動蚭蚈DDDの考え方を基に、具䜓的にどのようにコヌドに反映させるかが玹介されたした。䟋倖をドメむンに結び぀けお考えるこずにより、プロダクト開発に良い圱響を䞎える䟋倖蚭蚈を行うこずができるず感じたした。 䟋倖自䜓は普段の実装でも意識したすが、その耇雑さのため蚭蚈に関しおは深く意識できおいないこずが倚いず感じおいたす。本セッション内容を通しおプロダクト開発をより良くしおいくための䟋倖蚭蚈の考えた方ず実践に挑戊しおいきたいず感じたした。 しゃむ線 しゃむ @arus4869 です。FF16を最近ようやくクリアできたので、FFVIIリバヌスやり始めたした。最高ですね。 KotlinのLinterたなびなおし2024 私が気になったセッションは「 KotlinのLinterたなびなおし2024 」です。このセッションでは、各皮Lintツヌルの玹介だけでなく、Lintツヌルを効果的に掻甚するための実践的なアドバむスも倚数玹介されたした。 䞭でも特に気になったのはkonsistです。konsistは、暙準セットルヌルがなく、各プロゞェクトの特性に合わせたルヌル蚭定が可胜である点が魅力的でした。たた、テスト環境やナニットテストでの動䜜が䞻な特城で、アノテヌションを掻甚するこずで特定の甚途に応じたルヌル蚭定ができる点も興味深かったです。 たたセッションの䞭で、Lintルヌルを段階的に導入するこずでチヌムの負担を軜枛し぀぀、埐々にコヌド品質を向䞊させるアプロヌチも印象的でした。 このセッションを通じお、KotlinのLintの効果的な䜿い方に぀いお倚くの知芋を埗るこずができ、孊び盎しの良い機䌚になりたした。ありがずうございたした。 むらた線 むらた @orerus )です。最近倫婊でカむロ゜フトさんのアプリにハマっおいたす。 withContextっおスレッド切り替え以倖にも䜿えるっお知っおた さお、早速ですが私が気付きを埗たセッションずしおT45Kさんによる「withContextっおスレッド切り替え以倖にも䜿えるっお知っおた」 を玹介させおいただきたす。 スラむド も公開されおいたす。 Kotlin coroutinesを䜿っおいるず頻繁に登堎する withContext ですが、セッションタむトルでズバリ指摘されおいる通り、私もスレッドの切り替え甚関数であるかのように意識しおしたっおいたこずに気づきたした。 䜿い方が間違っおいるわけではありたせんが、セッションで玹介されおいる通り、withContextの挙動は正確にはスレッド切り替えではなく「CoroutineContextを切り替える」厳密には既存のCoroutineContextず匕数で枡されたCoroutineContextをマヌゞするこずにありたす。そのうえで、枡されたブロックをcoroutineContextで指定されおいるcoroutineDispatcherにお実行するずいう圢になりたす。詳现に぀いおは是非T45Kさんのスラむド資料を参照ください そのため、 withContext(Dispatchers.IO) のように切り替え先のスレッド (厳密には CoroutineDispatcher ) を指定するだけでなく、 withContext(Job() + Dispatchers.Default + CoroutineName("BackgroundCoroutine")) のように、耇数のCoroutineContextを合成する圢で匕数を指定するこずができるんですね。 CoroutineContextの芁玠に぀いおはこちらを参照ください  なお、 withContext 以倖のコルヌチンビルダヌ launch や async などに぀いおも、匕数で指定されたCoroutineContextず既存のCoroutineContextをマヌゞしお甚いる挙動は同じです。 今回のセッションを通じお、Kotlin coroutinesぞの理解がさらに深たりたした。ずおも良いセッションをありがずうございたした tick-tackç·š ただ JUnit を䜿っおるの kotest を䜿っお快適にテストを曞こう Kotest に぀いおの HowTo を熱く語っおおられるセッションで Kotest ぞの愛を感じたした。最近よく名前を聞くラむブラリな気がしたす。 タむミヌでも hamcrest を採甚しおいたすが Java 向けのテストラむブラリは Kotlin の予玄語が䜿われおいお゚スケヌプしないずずおも芋づらいこずがありたす。やっぱり Kotlin first に曞けるのは非垞に気持ちがいいですね。Kotest は Runner が JUnit で安定した環境で動かせるのもグッド。 個人的にセッション内で刺さったポむントずしおは Eventually ず Property Based Testing です。 Eventually 内郚で非同期凊理を実行するメ゜ッドのテストを曞くずきに実行しおも assertion のタむミングが倉曎前で倱敗するずいったケヌスはよくありたす。そういう時に eventually を䜿うず䞀定時間評䟡し぀づけ期埅する結果に倉わったら成功ず芋なしおルヌプを抜けおくれたす。めちゃめちゃかしこい。逆に䞀定時間倉曎がないこずを評䟡する continually もあるそうです。 Property Based Testing 郜床実行する床に自前で甚意しなくおも、ランダムに自動生成された property を利甚しお耇数回テストするずいったこずができたす。境界倀テストを甚意する堎合に圹立ちそうです。 さっそく assertion だけですが觊っおみたした。 蚘述方法だけでも inifix で name shouldBe "tick-taku" みたいに曞けお最高にワクワクしたす。楜しくテストが曞けそうですね。 觊っおみおいいなず思ったのが、䟋えばむンスタンスが別だけど䞭の property が同じな事だけ確認したい堎合はこんな感じに曞けたした。1぀ず぀取り出しお equals ずかしなくおもスッキリしおいいですね。 data class User( val id: Long , val name: String , val age: Int ) checkAll( iterations = 3 , Arb.long(), Arb.string( 1 .. 10 , Codepoint.katakana()), Arb.int( 1 .. 100 ) ) { id, name, age -> val user = User(id = id, name = name, age = age) repository.save(user) repository.getUser() shouldBeEqualToComparingFields user } 䞀応あたり有甚な䟋ではないですが䞊で玹介した property testing の checkAll や property のランダム生成もせっかくなので曞いおみたした。 個人的には Google の Truth が奜きでしたが掚し倉しそうです。Android プロゞェクトに導入するのもよさそうでした。 たずめ Kotlin Fest 2024はKotlinずいう蚀語の可胜性を改めお再認識するずずもに熱意ず掻気に満ちたむベントでした。たた、普段リモヌトワヌクで働くタむミヌの゚ンゞニアにずっおもチヌムメンバヌず察面で亀流する貎重な機䌚でした。今回埗られた知芋を掻かしお今埌のプロダクト開発にもさらに力を入れおいきたいず思いたす、次回のKotlin Festも楜しみにしおいたす
こんにちは、タむミヌでデヌタアナリストをしおいる yuzuka です。 䞻にプロダクトの分析に携わっおいたす。 ビゞネス職からデヌタアナリストに転向しお玄1幎経った私が、1幎前の自分に教えおあげたい、BigQueryや LookerStudioに関する萜ずし穎を、いく぀か挙げおみようず思いたす。 はじめに 匊瀟では、分析環境ずしお BigQueryを採甚しおいたす。LookerStudioを䜿っお、 BigQueryのデヌタを参照しおダッシュボヌドを䜜るこずもよくありたす。 BigQueryの SQLを䜿った分析を進めおいく䞭で、想定ず異なるデヌタが出おきおしたい、原因を特定するのに苊劎し、無駄な時間を費やしおしたった経隓が䜕床もありたす実際には、そんな過皋もきっず無駄ではないず信じたい。 こちらのブログを読んでいただいたみなさたには、同じ苊劎を味わっおいただきたくないので、私が今たでにハマっおきた萜ずし穎をいく぀か玹介したす。 1. BigQueryで䜿える䞀郚の蚘法は、LookerStudioでサポヌトされおおらず、接続゚ラヌになる BigQueryでは正垞に動いおいたク゚リが、LookerStudioを䜿った途端に謎の゚ラヌになるこずがありたす。 これは、䞀郚の蚘法が LookerStudioでサポヌトされおいないこずに起因しおいるようです。 私が遭遇した範囲では、以䞋の2぀の蚘法で゚ラヌになるこずが確認できおいたす。 DECLARE , CREATE DECLARE , CREATE を䜿うず、事前に倉数や関数の内容を宣蚀できたす。 DECLARE , CREATE を含むク゚リを曞くず、BigQueryでは正垞に動きたすが、LookerStudioでぱラヌになりたす。 これを回避するには、倧人しく LookerStudioのパラメヌタ機胜 を䜿うなどするのが良さそうです。 QUALIFY句 QUALIFY句は WHERE句ず異なり、Window関数の結果で絞り蟌めるずいう特城がありたす。 基本的に、QUALIFY句を䜿ったク゚リは、BigQueryでは正垞に動きたすが、LookerStudioでぱラヌになりたす。 これは QUALIFY句ず WHERE句を䜵甚するこずで回避できるようですなにゆえ・・・ 参考蚘事 BigQuery "QUALIFY" Function is not supported by data studio?  なので QUALIFY句を䜿うずきは、なるべく習慣的に WHERE句を぀けるようにしおいたす。 SELECT column1 ,ROW_NUMBER()OVER(PARTITION BY xx ORDER BY yy AS rank FROM table WHERE true -- ゚ラヌ回避のためだけに远加 QUALIFY rank = 1 2. LAST_VALUEは䜿い方を間違えるず、最埌の倀を返さないこずがある LAST_VALUEを䜿っおも、なぜか最埌の倀が返っおこないこずがありたす。 これは、LAST_VALUEの凊理範囲がデフォルトで「RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW最初から珟圚たでの行」になっおいるためです 公匏ドキュメント 。 ぀たり、以䞋のようなク゚リを曞いた堎合、 SELECT LAST_VALUE(aa)OVER(PARTITION BY bb ORDER BY ymd AS rank FROM table ① たずはymdが叀い順に䞊び替える ② 最初から珟圚の行たでで、ymdが最新の堎所を探す → 珟圚の行になる ③ 珟圚の行のaaが返っおきおしたう ずいうこずになっおいるようです。 これを回避するには、凊理範囲を「ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING最初から最埌の行たで」ず指定するか、以䞋のようにFIRST_VALUEずDESCを䜿う圢にするのが良さそうです。 SELECT FIRST_VALUE(aa)OVER(PARTITION BY bb ORDER BY ymd DESC  AS rank FROM table 3. 日付の衚瀺フォヌマットでYYYY を䜿うず、正しい西暊が返っおこないこずがある LookerStudioなどの日付の衚瀺フォヌマットで、西暊の衚瀺圢匏に「YYYY」を指定するず、正しい西暊が返っおこないこずがありたす。 これは、YYYYが単玔な西暊ではなく、「その暊週の基準幎」を返しおいるからでした。 簡単に蚀うず、「新幎床の1月1日ず同じ週に属する日に぀いおは、新幎床に属するこずにする」ずいう考え方になっおいるそうです。 単玔な西暊を出したい堎合は、倧文字の「YYYY」ではなく小文字の「yyyy」を䜿わなければならないようです。暊週の基準幎を出したいケヌスはそうないず思うので、ずりあえず「西暊は小文字」ず芚えおしたうのが良さそうです。 もはや SQLの話ではないですが、圓時こちらの答えに蟿り着くたでにちょっぎり苊劎しおおり、どうしおも玹介したかったので最埌にご玹介したした。 おわりに ここたで、私が経隓しおきた BigQuery・LookerStudio のニッチな萜ずし穎に぀いおたずめおみたした。 今回の蚘事が、少しでもみなさたの業務のお圹に立おれば幞いです。 「それはニッチな萜ずし穎でもなんでもないよ」「他にもこんなのがあるよ」など、ご意芋ご感想ありたしたら、圓ブログや X などでコメントいただけたすず幞いです 分析の正確性を担保するためには、このような萜ずし穎を知っおおくこずも倧事ですが、実際には、これらを理解したずころで、毎回1぀もミスをせず、䞀発で正しいク゚リを曞きあげるこずは難しいのではないかず思いたす。 垞に自分の曞いたク゚リを疑い぀぀、実際のデヌタを芋お怜蚌したり、別の指暙ず比范しお違和感がないか確かめたり、必芁に応じお他の人にク゚リのレビュヌをお願いしたり、ずいった工倫の方が、個人的には倧事なのかなず思っおいたす。 We’re Hiring! タむミヌでは、䞀緒に働くメンバヌを募集しおいたす。 https://hrmos.co/pages/timee/jobs カゞュアル面談も実斜しおいたすので、少しでも興味を持っおいただけたしたら気軜にお申し蟌みください 個人的にもアナリストやデヌタ関連職の方ず繋がりたいず思っおいるので、よければ X のフォロヌもよろしくお願いしたす。
株匏䌚瀟タむミヌのkatsumiです dbtのバヌゞョン1.8以䞊を利甚するこずで、unit testsが利甚可胜になりたす。今たでもSingular テスト単䞀テストやGeneric テスト汎甚テストは可胜でしたが、テストデヌタを利甚した単䜓テストも行うこずができたす。 導入準備 dbt-coreの堎合 dbt v1.8 以䞊を利甚しおください。 dbt-cloudの堎合 2024/06/12時点では dbt「Keep on latest version」を遞択するこずで利甚できたす。 匊瀟ではunit-test甚の環境のみlatest versionを利甚しおいたす。 Unit Testの基本 # run data and unit tests dbt test # run only data tests dbt test -- select test_type : data # run only unit tests dbt test -- select test_type : unit # run tests for one_specific_model dbt test -- select "one_specific_model" # run data tests limited to one_specific_model dbt test -- select "one_specific_model,test_type:data" # run unit tests limited to one_specific_model dbt test -- select "one_specific_model,test_type:unit" unit-testに関係する新しいコマンドが远加されたした。このコマンドは、以前のデヌタテストで䜿甚しおいたselect機胜ず同様に、特定のテストケヌスを遞択しお実行するこずができたす。 ymlによるテストレコヌドの曞き方 - name: test_name description : "テストの説明" model : my_model given : - input: ref ( 'users' ) rows : - { id : 1 , user_email : example@example . com } expect : rows : - { id : 1 , domain : example . com } name: test_name これはテストの名前です。この名前はテストケヌスを識別するために䜿甚したす。 description: “テストの説明” これはテストケヌスの説明です。この説明には、テストが䜕を意図しおいるのか、テストの目的や背景に぀いお蚘茉したす。 model: my_model これはテスト察象ずなるモデルの名前です。ここでは「my_model」がテスト察象のモデルずしお指定されおいたす。 given デヌタの内容です。ここでは「id: 1」で「user_email」「example@example.com」のナヌザヌを指定しおいたす。このデヌタがテストの入力ずしお䜿甚されたす。 expect これは期埅される結果を指定したす。テストが成功するためには、モデルが「id: 1」のナヌザヌに察しお「domain」が「example.com」ずしお返される必芁がありたす。期埅される結果ず実際の結果が䞀臎するかどうかを怜蚌したす。 ファむルによるテストレコヌドの曞き方 unit_tests : - name: test_my_model model : my_model given : - input: ref ( 'users' ) format : csv fixture : users プロゞェクトのtests/fixturesディレクトリにあるCSVファむル名を指定するこずで利甚できたす。test-pathsオプションを䜿甚するこずで、ディレクトリ構成を柔軟に指定するこずもできたす。 未定矩のカラムの挙動 未入力のカラムに関しおは、safe_cast(null as INT64)のように型が定矩されたnullのデヌタで補完されたす。リレヌションが必芁なものや、ロゞックに圱響を䞎えるカラムの蚘入が必芁になりたす。 実斜における知芋 倧芏暡なク゚リは”ephemeral”で现かいテスト行う。 with句が耇数ありテストケヌスが耇雑で芋通しが悪くなるケヌスがありたす。匊瀟ではSQLのテスト単䜍のロゞックを”ephemeral”で分けお個別のmodelにおテストを曞く実装を詊しおいたす。 通垞のモデルず同じ曞き方でテストを実斜するこずが可胜です。 WITH 凊理1_cte AS ( SELECT * FROM {{ ref( ' 凊理1のephemeral ' ) }} ) , 凊理2_cte AS ( SELECT * FROM {{ ref( ' 凊理2のephemeral ' ) }} ) , 凊理3_cte AS ( SELECT * FROM {{ ref( ' 凊理3のephemeral ' ) }} ) 時系列系の時間の停止をマクロで行う。 テストしたいケヌスにはcurrent_datetimeなど珟圚の時刻を利甚するものがありたす。その堎合、テストを曞く際に時間を固定する必芁がありたす。 dbtのナニットテストでは、YAMLファむル䞊でdbtのマクロを眮き換える機胜がありたす。この機胜を利甚しお、時間を固定する実装を行っおいたす。 - name: test_case model: my_model overrides: macros: current_datetime_jst: "date('2024-01-01')" {{ config ( materialized = 'ephemeral' ) }} SELECT --  ここにロゞックを曞く FROM {{ ref ( 'users' ) }} AS users WHERE DATETIME_TRUNC ( created_at , MONTH ) = DATE_TRUNC ({ { current_datetime_jst () } } , MONTH ) Testに関するSQLの確認ができる。 実際の仕組みずしおはテスト甚のSQLが生成され、フィクスチャテストデヌタも含めたSQLが実行されたす。debugコマンドやコンパむルされたSQLを確認するこずで、テストの挙動をチェックできたす。 テストケヌスの問題が起きた時にSQLにお芁因分析を行いたした。 たずめ 重芁指暙の蚈算や耇雑な時系列凊理、プロダクトのロゞックを再珟する箇所では、テストケヌスを甚意しおいこうず考えおいたす。たたテストケヌスを先に定矩したのちにク゚リを曞くこずも簡単にできるようになったように感じたす。信頌性の高いモデルにするために、重芁な機胜になっおいきそうです。 以䞊、unit-testsを詊した時に埗られた知芋のたずめでした。この情報が圹立おば幞いです We’re Hired タむミヌでは、䞀緒に働くメンバヌを募集しおいたす product-recruit.timee.co.jp 参考資料 Unit tests | dbt Developer Hub https://docs.getdbt.com/docs/build/unit-tests Unit Testing https://github.com/dbt-labs/dbt-core/discussions/8275
はじめに dbt snapshotずはざっくり 今回の䟋 党䜓の流れ snapshot内郚凊理の詳现 delete凊理宛先テヌブルに存圚するレコヌドが゜ヌステヌブルでdeleteされおいた堎合 update凊理宛先テヌブルず比范しお゜ヌステヌブルのレコヌドがupdateされおいた堎合 insert凊理宛先テヌブルに無いレコヌドが゜ヌステヌブル偎に新芏で䜜成されおいた堎合 check戊略の堎合 check戊略の詳现 たずめ We’re Hired はじめに こんにちは☀okodooooonです 最近、瀟内のdbt snapshotモデルでパフォヌマンスの問題が発生し、その解決に苊劎したした。dbt snapshotの内郚凊理が公匏ドキュメントなどで提瀺されおおらず、詳现なク゚リを理解しおいなかったためです。 そこで、今回、dbt snapshotの内郚ク゚リに぀いお解説しおみるこずにしたした。ただし、今回の解説内容は、ドキュメントで説明されおいる通りの挙動がどのようにSQLで衚珟されおいるのか確認したもので、新しい発芋やTipsみたいなものは特にないです 内郚凊理をしっかり理解するこずで、dbtによっお抜象化された凊理をより効果的に掻甚できるこずもあるかな〜ず思っおおりたすので、どなたかの参考になれば幞いです 今回解説するク゚リは、dbt-bigqueryで生成されるク゚リです dbt snapshotずはざっくり SCD Type2 Dimensionずいう思想に埓っお、過去時点の状態の遷移を蓄積できるような仕組みです。 ゜ヌスシステム偎ではステヌタス倉曎が行われるず、そのナチュラルキヌのレコヌドが䞊曞き凊理されたすが、その䞊曞き凊理前埌のレコヌドをそれぞれ有効期限付きで保存したす 公匏Doc: https://docs.getdbt.com/docs/build/snapshots 今回の䟋 以䞋のようなモデルを仮定しお、snapshotのク゚リを芋おいきたいず思いたす。 モデルファむル䞊の定矩はこんな感じです。 {% snapshot snapshotted_sample_table %} {{ config( target_schema= ' sample_dataset ' , strategy= ' timestamp ' , unique_key= ' id ' , updated_at= ' updated_at ' , invalidate_hard_deletes= True , ) }} select * from {{ source( ' sample_dataset ' , ' sample_data ' ) }} {% endsnapshot %} ゜ヌステヌブル偎で䞀意であるカラムをunique_key, レコヌド曎新日時を蚘録するカラムをupdated_atに指定しおいたす。 巊のテヌブルがsnapshot化されるこずで、右のように有効期限(dbt_valid_from, dbt_valid_to)ずsnapshot埌のレコヌドに察するナニヌクキヌ(dbt_scd_id)が付䞎されたす 党䜓の流れ dbt snapshotはBigQueryにおいお぀のク゚リを実行しおいたす。 ゜ヌステヌブルず宛先テヌブルからデヌタを抜出しお、snapshot先にmergeするためのtmpテヌブルを、update,delete,insertそれぞれの凊理ごずに分割しお䜜成する凊理 tmpテヌブルでラベリングされた凊理ごずにMERGEク゚リを実行する凊理 それぞれ実行されるク゚リの詳现は以䞋のようになりたす。 tmpテヌブル䜜成ク゚リ党文  クリックで展開 ```sql create or replace table `sample_project`.`sample_dataset`.`sample_table__dbt_tmp` OPTIONS( description="""""", expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 12 hour) ) as ( with snapshot_query as ( SELECT * FROM `sample_project`.`sample_dataset`.`sample_table` ), snapshotted_data as ( select *, id as dbt_unique_key from `sample_project`.`sample_dataset`.`snapshotted_sample_table` where dbt_valid_to is null ), insertions_source_data as ( select *, id as dbt_unique_key, updated_at as dbt_updated_at, updated_at as dbt_valid_from, nullif(updated_at, updated_at) as dbt_valid_to, to_hex(md5(concat(coalesce(cast(id as string), ''), '|',coalesce(cast(updated_at as string), '')))) as dbt_scd_id from snapshot_query ), updates_source_data as ( select *, id as dbt_unique_key, updated_at as dbt_updated_at, updated_at as dbt_valid_from, updated_at as dbt_valid_to from snapshot_query ), deletes_source_data as ( select *, id as dbt_unique_key from snapshot_query ), insertions as ( select 'insert' as dbt_change_type, source_data.* from insertions_source_data as source_data left outer join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key where snapshotted_data.dbt_unique_key is null or ( snapshotted_data.dbt_unique_key is not null and ( (snapshotted_data.dbt_valid_from < source_data.updated_at) ) ) ), updates as ( select 'update' as dbt_change_type, source_data.*, snapshotted_data.dbt_scd_id from updates_source_data as source_data join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key where ( (snapshotted_data.dbt_valid_from < source_data.updated_at) ) ), deletes as ( select 'delete' as dbt_change_type, source_data.*, current_timestamp() as dbt_valid_from, current_timestamp() as dbt_updated_at, current_timestamp() as dbt_valid_to, snapshotted_data.dbt_scd_id from snapshotted_data left join deletes_source_data as source_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key where source_data.dbt_unique_key is null ) select * from insertions union all select * from updates union all select * from deletes ); ``` merge実行ク゚リ党文  クリックで展開 ```sql merge into `sample-project`.`sample_dataset`.`sample_table` as DBT_INTERNAL_DEST using `sample-project`.`sample_dataset`.`sample_table__dbt_tmp` as DBT_INTERNAL_SOURCE on DBT_INTERNAL_SOURCE.dbt_scd_id = DBT_INTERNAL_DEST.dbt_scd_id when matched and DBT_INTERNAL_DEST.dbt_valid_to is null and DBT_INTERNAL_SOURCE.dbt_change_type in ('update', 'delete') then update set dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to when not matched and DBT_INTERNAL_SOURCE.dbt_change_type = 'insert' then insert (`id`, `foo`, `bar`, `created_at`, `updated_at`, `dbt_updated_at`, `dbt_valid_from`, `dbt_valid_to`, `dbt_scd_id`) values (`id`, `foo`, `bar`, `created_at`, `updated_at`, `dbt_updated_at`, `dbt_valid_from`, `dbt_valid_to`, `dbt_scd_id`) ``` 䞊蚘ク゚リ内の各CTEで行われる凊理をざっくりたずめるず以䞋のような凊理のフロヌになりたす。 凊理の詳现を詳しく芋おいきたいのですが、ク゚リ自䜓がちょっず長いので、insert, update, deleteそれぞれの凊理に分割しお詳现を芋おいこうず思いたす snapshot内郚凊理の詳现 delete凊理宛先テヌブルに存圚するレコヌドが゜ヌステヌブルでdeleteされおいた堎合 tmpテヌブル生成ク゚リのうち、゜ヌス偎でdeleteされたレコヌドをmerge甚レコヌドに倉換する凊理の抜粋 クリックで展開 -- 宛先履歎テヌブルから履歎が確定しおいないレコヌドを抜出 snapshotted_data as ( select *, -- unique_keyに指定したカラムをdbt_unique_keyずする id as dbt_unique_key from {{ 宛先テヌブル }} where dbt_valid_to is null ), deletes_source_data as ( select *, -- unique_keyに指定したカラムをdbt_unique_keyずする id as dbt_unique_key from {{ ゜ヌステヌブル }} ) deletes as ( select ' delete ' as dbt_change_type, source_data.*,                  current_timestamp ()  as dbt_valid_from,                  current_timestamp ()  as dbt_updated_at,                  current_timestamp ()  as dbt_valid_to, snapshotted_data.dbt_scd_id from snapshotted_data left join deletes_source_data as source_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key where source_data.dbt_unique_key is null ) tmpテヌブル生成の凊理の内蚳は以䞋のようになりたす。 【凊理の抂芁】 - 履歎が確定しおいない(valid_toに倀が入っおいない)レコヌド矀を宛先テヌブルから抜出 - 履歎が確定しおいないレコヌドのうち、゜ヌステヌブルに存圚しない(削陀された)レコヌドに絞り蟌み - dbt_valid_from, dbt_valid_toをク゚リの実行時刻に蚭定 - dbt_change_typeを’delete’に蚭定 ゜ヌステヌブル偎で削陀されたmerge甚レコヌドをmergeするク゚リ クリックで展開 merge into {{宛先テヌブル}} using {{マヌゞ甚tmpテヌブル}} on {{宛先テヌブル}}.dbt_scd_id = {{マヌゞ甚tmpテヌブル}}.dbt_scd_id when matched and {{宛先テヌブル}}.dbt_valid_to is null and {{マヌゞ甚tmpテヌブル}}.dbt_change_type in ( ' delete ' ) then update set dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to 【凊理の抂芁】 - dbt_scd_idをキヌにしお宛先テヌブルずマヌゞ甚tmpテヌブルを結合 - 宛先テヌブルの履歎が未確定で、tmpテヌブルのdbt_change_typeが’delete’の堎合 - 宛先テヌブルのdbt_valid_toをtmpテヌブルのdbt_valid_to(ク゚リ実行時刻)に䞊曞き 以䞋図に衚したような凊理の流れによっお、゜ヌステヌブル偎で削陀されたレコヌドdbt_valid_toにsnapshot時の時刻が入るようになりたす。 update凊理宛先テヌブルず比范しお゜ヌステヌブルのレコヌドがupdateされおいた堎合 tmpテヌブル生成ク゚リのうち、゜ヌス偎でupdateされたレコヌドをmerge甚レコヌドに倉換する凊理の抜粋 クリックで展開 -- 宛先履歎テヌブルから履歎が確定しおいないレコヌドを抜出 snapshotted_data as ( select *, -- unique_keyに指定したカラムをdbt_unique_keyずする id as dbt_unique_key from {{ 宛先テヌブル }} where dbt_valid_to is null ), updates_source_data as ( select *, -- unique_keyに指定したカラムをdbt_unique_keyずする id as dbt_unique_key, updated_at as dbt_updated_at, updated_at as dbt_valid_from, updated_at as dbt_valid_to from {{ ゜ヌステヌブル }} ), updates as ( select ' update ' as dbt_change_type, source_data.*, snapshotted_data.dbt_scd_id from updates_source_data as source_data join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key where ( (snapshotted_data.dbt_valid_from < source_data.updated_at) ) ) 【凊理の抂芁】 - 履歎が確定しおいないレコヌド矀を宛先テヌブルから抜出 - ゜ヌステヌブルから抜出したレコヌドのdbt_valid_from, dbt_valid_toを珟圚時刻に蚭定 - 履歎が確定しおいないレコヌドのうち、宛先のdbt_valid_fromより埌にupdated_atが゜ヌステヌブルに存圚するレコヌドに絞る - dbt_change_typeを’update’に蚭定 ゜ヌステヌブル偎でupdateされたmerge甚レコヌドをmergeするク゚リ クリックで展開 merge into {{宛先テヌブル}} using {{マヌゞ甚tmpテヌブル}} on {{宛先テヌブル}}.dbt_scd_id = {{マヌゞ甚tmpテヌブル}}.dbt_scd_id when matched and {{宛先テヌブル}}.dbt_valid_to is null and {{マヌゞ甚tmpテヌブル}}.dbt_change_type in ( ' update ' ) then update set dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to 【凊理の抂芁】 - dbt_scd_idをキヌにしお宛先テヌブルずマヌゞ甚tmpテヌブルを結合 - 宛先テヌブルの履歎が未確定で、tmpテヌブルのdbt_change_typeが’update’の堎合 - 宛先テヌブルのdbt_valid_toをtmpテヌブルのdbt_valid_to(珟圚時刻)に䞊曞き 以䞋図に衚したような凊理の流れによっお、宛先テヌブルの履歎が未確定のデヌタのうち、゜ヌスで曎新が走ったレコヌドのdbt_valid_toにスナップショット時の日時が入りたす。 insert凊理宛先テヌブルに無いレコヌドが゜ヌステヌブル偎に新芏で䜜成されおいた堎合 tmpテヌブル生成ク゚リのうち、insert察象のレコヌドをmerge甚レコヌドに倉換する凊理の抜粋 クリックで展開 -- 宛先履歎テヌブルから履歎が確定しおいないレコヌドを抜出 snapshotted_data as ( select *, -- unique_keyに指定したカラムをdbt_unique_keyずする id as dbt_unique_key from {{ 宛先テヌブル }} where dbt_valid_to is null ), insertions_source_data as ( select *, id as dbt_unique_key, updated_at as dbt_updated_at, updated_at as dbt_valid_from, nullif (updated_at, updated_at) as dbt_valid_to, to_hex(md5( concat ( coalesce ( cast (id as string), '' ), ' | ' , coalesce ( cast (updated_at as string), '' )))) as dbt_scd_id from {{ ゜ヌステヌブル }} ), insertions as ( select ' insert ' as dbt_change_type, source_data.* from insertions_source_data as source_data left outer join snapshotted_data on snapshotted_data.dbt_unique_key = source_data.dbt_unique_key where snapshotted_data.dbt_unique_key is null or ( snapshotted_data.dbt_unique_key is not null and ( (snapshotted_data.dbt_valid_from < source_data.updated_at) ) ) ), 【凊理の抂芁】 - ゜ヌステヌブルのunique_keyにしおいたカラムずupdated_atに指定しおいたカラムを組み合わせおsurrogate_keyを生成 - ゜ヌステヌブルに察しお履歎未確定の宛先テヌブルをLEFT JOINしお以䞋の条件に絞る - 宛先テヌブルに指定したunique_keyが存圚しないが、゜ヌステヌブルには存圚するレコヌド - 宛先テヌブルに指定したunique_keyのレコヌドが存圚しお、゜ヌステヌブル偎のupdated_atが宛先テヌブルのvalid_fromよりも埌のレコヌド - dbt_change_typeを’insert’に蚭定 ゜ヌステヌブル偎でinsertされたmerge甚レコヌドをmergeするク゚リ クリックで展開 merge into {{宛先テヌブル}} using {{マヌゞ甚tmpテヌブル}} on {{宛先テヌブル}}.dbt_scd_id = {{マヌゞ甚tmpテヌブル}}.dbt_scd_id when not matched and {{マヌゞ甚tmpテヌブル}}.dbt_change_type = ' insert ' then insert (`id`, `foo`, `bar`, `created_at`, `updated_at`, `dbt_updated_at`, `dbt_valid_from`, `dbt_valid_to`, `dbt_scd_id`) values (`id`, `foo`, `bar`, `created_at`, `updated_at`, `dbt_updated_at`, `dbt_valid_from`, `dbt_valid_to`, `dbt_scd_id`) 【凊理の抂芁】 - dbt_scd_idをキヌにしお宛先テヌブルずマヌゞ甚tmpテヌブルを結合 - dbt_scd_idがマッチしなくお、dbt_change_type=’update’の堎合にinsert凊理を実行 - 宛先テヌブルのdbt_valid_toをtmpテヌブルのdbt_valid_to(珟圚時刻)に䞊曞き 以䞋図に衚したような凊理の流れによっお、指定したナニヌクキヌが宛先に存圚しないか、履歎が未確定のレコヌドのうち゜ヌス偎で前回実行からupdateが走ったものがinsertされたす。 check戊略の堎合 䞊で玹介したのは snapshot_strategy=timestamp の堎合のスナップショットの挙動であり、゜ヌステヌブル偎で updated_at に指定したカラムが曎新された堎合に、すべおのプロパティの情報を履歎的に保持するものです。 dbtにはもう䞀぀のスナップショット戊略ずしお、 check 戊略がありたす。 {% snapshot snapshotted_sample_table %} {{ config( target_schema= ' sample_dataset ' , strategy= ' check ' , unique_key= ' id ' , invalidate_hard_deletes= True , check_cols=[ ' foo ' , ' bar ' , ' created_at ' , ' updated_at ' , ], ) }} select * from {{ source( ' sample_dataset ' , ' sample_data ' ) }} {% endsnapshot %} このモデルでは党カラムを遞択しおいたすが、特定のカラムの倉曎のみを履歎的にトラッキングする仕組みです。 strategy=check においおも、 strategy=timestamp の時ず同様に、snapshot凊理はtmpテヌブルを䜜成するク゚リずmerge凊理を実行するク゚リに分割されたす。 strategy=checkの堎合のtmpテヌブル䜜成ク゚リ クリックで展開 strategy=checkの堎合のmerge実行ク゚リ クリックで展開 merge実行ク゚リはstrategy=timestampの時ず倉わらず、tmpテヌブルの生成方法が異なっおいるので、詳しく芋おいこうず思いたす check戊略の詳现 insert 甚デヌタや update 甚デヌタを出力するCTEでは、以䞋のようなWHERE条件が䜿甚されたす。 (( snapshotted_data.`foo` != source_data.`foo` or ( ((snapshotted_data.`foo` is null ) and not (source_data.`foo` is null )) or (( not snapshotted_data.`foo` is null ) and (source_data.`foo` is null )) ) or snapshotted_data.`bar` != source_data.`bar` or ( ((snapshotted_data.`bar` is null ) and not (source_data.`bar` is null )) or (( not snapshotted_data.`bar` is null ) and (source_data.`bar` is null )) ) or snapshotted_data.`created_at` != source_data.`created_at` or ( ((snapshotted_data.`created_at` is null ) and not (source_data.`created_at` is null )) or (( not snapshotted_data.`created_at` is null ) and (source_data.`created_at` is null )) ) or snapshotted_data.`updated_at` != source_data.`updated_at` or ( ((snapshotted_data.`updated_at` is null ) and not (source_data.`updated_at` is null )) or (( not snapshotted_data.`updated_at` is null ) and (source_data.`updated_at` is null )) ) )) この条件により、insert ず update の察象ずなるレコヌドの抜出条件は次のようになりたす。 insert甚デヌタの抜出条件 ( 宛先にナニヌクキヌが存圚しない ) OR ( (宛先にナニヌクキヌが存圚する) AND (ナニヌクキヌ以倖のcheck_colsに指定したカラムが、宛先ず゜ヌスで䜕かしら倉化が発生しおいる) ) update甚デヌタの抜出条件 (宛先にナニヌクキヌが存圚する) AND (ナニヌクキヌ以倖のcheck_colsに指定したカラムが、宛先ず゜ヌスで䜕かしら倉化が発生しおいる) checkで指定されたカラムの倉曎をどのように远跡しおいるかを確認できたした。 たずめ 今回はdbt snapshotの内郚凊理をdelete, update, insertの凊理に分解しお説明しおみたした。 公匏ドキュメントで説明されおいる通りの凊理が生成されるSQLによっお行われおいるこずが確認できたした。 dbt snapshotを䜿甚しおいる際に、期埅した挙動が埗られない堎合や䜕かしら゚ラヌが発生したずきに、この情報が圹立おば幞いです We’re Hired タむミヌでは、䞀緒に働くメンバヌを募集しおいたす product-recruit.timee.co.jp
タむミヌの yorimitsu です。 䞖界䞭で開催されおいるDevOpsDaysカンファレンスは、゜フトりェア開発、ITむンフラ運甚を䞭心ずしたカンファレンスで、2024/4/16、17の2日間にわたっお開催されたした。 www.devopsdaystokyo.org 今回の参加はタむミヌのプロダクトおよび゚ンゞニア向けに甚意しおいる、技術系カンファレンスに無制限で参加できる「Kaigi Pass」ずいう制床を利甚しおいたす。この制床は䞖界䞭で開催されるカンファレンスを察象にしおいたす。 productpr.timee.co.jp 䟡倀貢献を意識したチヌムの䜜り方 タむミヌでも顧客に䟡倀を届けるこずを倧切に日々の開発運甚を行っおいたすが、それを担うチヌムをより良くする取り組みのノりハりが、「 Value-Driven DevOps Team〜䟡倀貢献を倧切にするチヌムがたどり着いたDevOpsベストプラクティス〜 」のセッションで玹介されおいたした。 仮説怜蚌を早く回すための開発環境の工倫や、チヌムのカルチャヌの䜜り方はずおも参考になる話でした。特にチヌムにメンバヌが増えた際に「チヌムの状態を理解しお各メンバヌのやりたいこずを共有しお、チヌムの型に萜ずし蟌んでいくか」ずいう郚分は参考にしたい考えが倚くありたした。 開発チヌムに限らず、チヌムを組成するず䜕を目的ずしおいるのか、䜕の䟡倀を提䟛するのかなど チヌムに属しおいるメンバヌの認識をある皋床合わせる必芁があり、その際にむンセプションデッキを利甚したり、ワヌキングアグリヌメントを䜜成するのは、改めお有効だなず感じたした。 How先行ではなくWhyを意識しなくおはいけない 「 君もテスト自動化の同志を増やすパタヌンで倧勝利 」のセッションでは、SETチヌムを立ち䞊げる際に経隓した問題に぀いお発衚されおいたした。SETチヌムなので圓然ながらテスト自動化を 掚進すべく、初手は自動E2Eテストに力を入れお取り組たれおいたそうですが、その取組みはSETがやりたいこずであり、開発チヌムがやりたいこずではなかったので、テスト自動化の掚進が止たっおしたったずのこず。 そしお掚進方法を芋盎す䞭で、自動E2Eテストを掚進するずいうHowが遞考しお、䜕のために実斜するのか、ニヌズが有るのかずいう郚分が欠けおいたこずに気が付き、改めお開発チヌムの困り事を把握しおから、取り組んだらテスト自動化の取り組みが進んだずのこずでした。 タむミヌでも各スクラムチヌムの困り事を把握しお、品質管理に関する支揎に取り組たなくおはいけないず孊んだセッションでした。 おわりに 今回はオンラむンでの参加になりたしたが、来幎は珟地で参加しお積極的な情報亀換を行っおみたいず思いたした。
こんにちはタむミヌのデヌタアナリストの @akki です。 タむミヌのデヌタアナリティクス郚では、様々な圢匏の勉匷䌚が盛んに行われおいたす。 アナリスト自身のスキルアップはもちろん、チヌム党䜓での知識の共有や実務ぞの応甚を目指し、垞に〜぀の勉匷䌚が開催され、有志が参加する圢匏をずっおいたす。 今回は『 効果怜蚌入門〜正しい比范のための因果掚論/蚈量経枈孊の基瀎 』(安井 翔倪)を題材にした茪読ず実践の勉匷䌚に぀いおお話ししたす。 この本は 以前も勉匷䌚で取り䞊げ たしたが、今回は新しいメンバヌずずもに再床実斜したした。 茪読パヌト 茪読パヌトでは、本曞を10に分けお担圓を蚭定したした。毎週、各自が自分の担圓分を芁玄し、Notionに蚘茉しお発衚したす。その埌、参加者からの質疑応答や、本曞の内容に基づいたディスカッションを行いたした。 今回の勉匷䌚での分担むメヌゞ 感想 すでに知っおいた手法に぀いおも、改めお理論的な背景や実践する䞊での泚意事項を孊ぶこずができ、理解が深たりたした。 同じチヌムで働いおいるメンバヌずの勉匷䌚なので、議論の䞭で「実務で䜿うためには」ずいう芳点の話が出やすいのもよかったです。 実践パヌト 茪読を終えた埌、本曞で觊れられた効果怜蚌の手法をタむミヌのデヌタに実際に適甚しおみたので、その芁点をお䌝えしたす。 やったこず タむミヌの営業領域の斜策で、斜策を実斜した効果に぀いお怜蚌したした。 分析手法 DiDDifference in Differencesを遞択したした。 勉匷䌚の題材ずいうこずもあり、事前に怜蚌蚭蚈に入るこずができなかったため、RCT等は実斜できたせんでした。 ただ介入矀・非介入矀ずもに介入前埌のデヌタが取埗できたため、DiDを採甚したした。 DiDによる効果怜蚌のむメヌゞ 結果 斜策による改善効果が具䜓的に把握できたした。 たたいろんな分析軞ずクロスしおみるこずで远加の知芋も埗られ、今埌の意思決定に぀ながりたした。 今回の分析の課題 特にDiDに぀いおは、「䜕をもっお平行トレンドずするか」が悩たしいポむントだなず改めお感じたした。 スタヌトアップのような倉化が激しい状況では、垞に平行トレンドを満たしおいる察照矀が蚭定しにくく、期間の切り方次第で平行トレンドを満たす察照矀が倉わるこずもありたす。 過去の目的倉数の倉化だけを芋おも、本来満たすべき「時間を通じた目的倉数の倉化が同䞀である」ずいう仮定が十分に満たせおいないケヌスも倚いです。 定量面だけでなく、実隓矀や察照矀の特性や、営業掻動のオペレヌションずいった定性情報も把握した䞊で、察照矀を決定するこずが重芁であるず感じたした。 察照矀の遞定むメヌゞ。目的倉数だけ芋るず、時期次第で平行トレンドの認識が倉わりうる。 たずめ 今回の勉匷䌚を通じお、手法を正しく理解するこずでより粟緻な怜蚌ができ、それが意思決定に぀ながるこずを改めお実感できたした。 これからも座孊ず実践のサむクルを回すこずで、より䌚瀟に貢献できるデヌタ分析をしおいきたいず思いたす We’re Hiring 私たちは、ずもに働くメンバヌを募集しおいたす カゞュアル面談 も行っおいたすので、少しでも興味がありたしたら、気軜にご連絡ください
タむミヌのyajiri、yorimitsu、seigiです。 アゞャむルずテストのコミュニティの祭兞に関する囜内最倧玚のカンファレンス「Scrum Fest Niigataスクフェス新期2024」が2024/05/10、11の2日間にわたっお開催されたした。 www.scrumfestniigata.org タむミヌからもQAコヌチ、マネヌゞャヌ、スクラムマスタヌの3名が参加。䞖界䞭で開催されるすべおの技術系カンファレンスに無制限で参加できる「Kaigi Pass」ずいう制床を利甚したした。 productpr.timee.co.jp 本レポヌトでは、印象に残ったセッションの内容を䞭心に、2日間の䌚の様子をお䌝えしたす。 タむミヌのQAコンセプトに圹立぀ノりハりを埗られた話 Yorimitsuです。私が参考になったセッションに぀いおお話させおください。 タむミヌではQAの仕組みを珟圚構築しおいる最䞭で、コンセプトずしおQAの掻動を2぀に分類しおプロダクト組織に導入しようず考えおいたす。コンセプトの1぀目は、QA Enablingずしおおり 各スクラムチヌムが行っおいる品質管理掻動の支揎、䟋えばテスト芳点の䜜成支揎や、テスト蚭蚈の手法支揎、自動テストの支揎などを考えおいたす。そしお2぀目のコンセプトはQA Platformずしお、品質分析、自動テストのむンフラ敎備、スクラムチヌムを暪断するリグレッションテストの運営自動テストなどを蚈画しおいたす。 このコンセプトを実珟するにあたり、今回の発衚セッションにあった「 スクラムチヌムが䞀䜓になるために行ったQAプロセス倉革の道のり 」は倧倉参考になる内容でした。 各スクラムチヌムぞのQAの入り方や、その埌に起こる課題、そしお課題の敎理方法など、実䟋が 倚く玹介されおいたした。 そしお改めお、QAマニフェストの必芁性にも泚目したした。QAが䜕を担うのか、QAを担圓する人及び、QAに䜕かを期埅する人にずっお、同じ方向性を向いお䌚話するために非垞に有効な取り組みだず受け止め、タむミヌでの策定を怜蚎しおみよう思いたした。 ベむビヌステップで䞍確実性を乗り越えるQA゚ンゞニアの挑戊に感銘を受けた話 駆け出しQAコヌチのYajiriです。 私はこの春にCSM研修を受講し、晎れおスクラムマスタヌに認定されたこずもあり、初めおスクラムフェスに参加したした。 珟圚の圹割がQAコヌチずいうこずもあり、スクラムチヌムにおける品質保蚌に関するプログラムを䞭心に芖聎したした。どれも有意矩なものでしたが、特に印象に残ったセッションは「 受け入れテスト駆動開発によっお䞍確実性を段階的に解消するアプロヌチ 」です。 今回玹介された事䟋は、ビゞネスや経枈のむンテリゞェンスを軞にサヌビスを展開するWebシステムの開発チヌムで、XP゚クストリヌム・プログラミング開発プロセスの䞭でATDD受け入れテスト駆動開発をどのように実践しおいるかが玹介されたした。 Web開発で厳栌にXPを取り入れるには様々な困難がある䞭、「ベむビヌステップよちよち歩き」を培底するこずで、䞍確実性をコントロヌル可胜な粒床に萜ずし蟌み、結果的に䞍確実性を䜎枛させながら倧きな成果を成し遂げるずいうものでした。 このベむビヌステップは、Gaugeで実装される受け入れテストのコヌドでも培底されおおり、䞀぀のステップに察しお倚くの期埅結果を盛り蟌むこずを「ベむビヌステップ違反」ずしお統制するカルチャヌが根付いおいるずのこずでした。 これらの取り組みは、開発手法が倉わっおも䞍確実性をコントロヌルする手法ずしお非垞に参考になり、私たちの自動テストでもこの考え方を取り入れおいきたいず感じたした。 スクラムフェスはやっぱり楜しいそしおオフラむンで参加したい スクラムマスタヌの正矩です アゞャむル/スクラムに関するコミュニティ掻動が奜きで、いく぀かのカンファレンスに参加したり、自身でもスクラムフェス神奈川を運営したりしおいたす。 今回、スクラムフェス新期ぞオンラむンで参加したした。 (家庭の郜合でどうしおも珟地参加できず 泣) スクフェス新期では珟地参加した時の䜓隓が玠晎らしいらしく、是非ずも次回は珟地で参加したいず思いたすネットワヌキングパヌティでは、新期ならではのご飯やお酒を堪胜できるんだずか・・・ 今回、私はスクラムフェス新期ずいうアゞャむルコミュニティむベントで「玠敵だなヌ」ず思った点に぀いおレポヌトさせおいただきたす スクフェス新期の趣旚に぀いお 䞻催者のじゅんぺヌさんによる、むベントの趣旚が説明されおいたした ただただ、アゞャむルのコミュニティずテストのコミュニティはそれぞれが別のゞャンルずしお開催されおいたすが、スクラムフェス新期ではその2぀を合わせお開催する流れを䜜るこずが目指されおいたした テストずアゞャむルに察しお熱い想いがあるからこそのビゞョンだず思いたす 行動芏範を培底したむベント むベントを最高の圢で終えるためには、参加者の行動がずおも倧切になりたす。 特に、ギャザリングを倧切にするアゞャむル/スクラムのコミュニティむベントでは、特に意識したい事項ずなりたす。 どのようなこずを自分たちは倧切にしおいるのか、具䜓的な楜しみ方、困った時にどうすれば良いのかに぀いお、しっかり時間をずっお説明されおいたした。 (運営の方によるハラスメントの寞劇たでありたした) 今埌、むベントを開催しお業界を盛り䞊げおいく人たち、コミュニティ、䌁業は是非ずも参考にしたい点だず思いたす。 コミュニティむベントの楜しみ方を最初に玹介 Keynoteの前に、菩薩さんによる最初のセッションがありたした セッション名は「いかにしおオンラむンで知り合いを増やすか」 珟地に参加されおいる方だけではなく、オンラむンに参加されおいる方もギャザリングで楜しめるように、どういうこずを考えおおくず良いかを経隓を亀えお玹介されおいたした。 芖聎し぀぀チャットを楜しむコツずしお、いく぀かピックアップするず  わからないこずをはわからない、ず正盎に蚀おう テクニックずしおは 「぀たり〇〇 .っおこず!?」ず蚀えば、なんずかなる チャットの流れが早くお぀いおいけなくおも、気にせず喋ろう 勇気を出しお発蚀しおも、誰も反応しない でもそんなこず気にしなくお良いずにかく接觊回数を増やしおいこう ずのこずでした 今たで幟぀かのスクラムフェスに参加しおきた䞭で、個人的に気になっおいたこずでしたがあらためお気にしなくおいいんだずいう安心感をえられたした。 たた、盞手の発蚀に察しお、リアクションを぀けたり、反応をしおみるだけで䞀緒にワむワむできおいいよねずいう話は䞋蚘スラむドでクスッずきたしたw 今たでは「さしすせそ」を䜿っおきたしたが、今埌は「はひふぞほ」も掻甚しようず思いたす 最埌に スクラムフェス新期は、セッションで埗られる情報だけに䟡倀を眮くわけではなく、オンラむン/オフラむンでのギャザリングや、パヌティで玠敵な料理を食べられるなどセッション以倖でのコンテンツでも参加者が埗られる䜓隓がずおも玠敵なむベントだず感じたした 次回は 絶察に新期の珟地䌚堎に行きたいです  䞀番印象的だった蚀葉は 「新期のお酒は氎」でした 以䞊ですmm おわりに 次回以降はなんらかの圢でコミュニティを盛り䞊げるこずに貢献できたらず思いたす。
はじめに はじめたしお、タむミヌでモバむルアプリ゚ンゞニアをやっおいる tick-taku です。 5/15 - 5/17 の䞉日間にわたっお沖瞄で RubyKaigi 2024 が開催されたした。党囜から Rubyist が集結するむベントで匊瀟からもたくさんのメンバヌが参加しおおり、自分も初めお参加しおきたした。 今回はそんな RubyKaigi に参加しお感じたこずや気になったポむントを玹介したす。 rubykaigi.org タむミヌメンバヌの参加レポヌトはこちら。 みなさん各セッションを解像床深く解説されおいおずおも勉匷になりたした。 tech.timee.co.jp tech.timee.co.jp tech.timee.co.jp なぜ参加しようず思ったか 冒頭で自己玹介した通り、僕はモバむルアプリ゚ンゞニアで普段は Android や iOS アプリ開発がメむンです。 そんな自分がなぜ RubyKaigi に参加しようず思ったか。それはこれから Ruby (rails) の開発ができるようになりたいず考えおいるからです。 そこで、たずは蚀語やコミュニティの雰囲気を掎むため Ruby の䞭で倧芏暡なカンファレンスに参加しおみようず思ったのがきっかけでした。 タむミヌでは開発組織においおチヌムトポロゞヌをベヌスずしたストリヌムアラむンドチヌムを運営しおいたす。 その䞭で僕が所属しおいるチヌムはクラむアント様に向けた機胜開発を目的ずしおおり、クラむアント様が䜿う管理画面の改善などが倚いです。そのため、皀にワヌカヌ様向けであるモバむルアプリの開発タスクが垌薄になるこずがありたす。 逆にバック゚ンドタスクがただただ手が足りおいないので、モバむルにクロヌズせずにケむパビリティを発揮しおいきたいず考えたした。 たた僕は専門領域特化型ではないず昔から感じおいるため、党䜓を満遍なくできるようになるこずでゎヌル達成のためにどこか人が足りおいない郚分を補う動き方をしおいきたいず考えおいたす。 チヌムの方向性ずもマッチしおいるためバック゚ンドで採甚しおいる Ruby を勉匷しおいこうず思いたした。 埌は沖瞄で開催ず蚀うのもかなり魅力でした。沖瞄ですよ、沖瞄。こんなに聞くだけで胞躍るキヌワヌドなかなかありたせん。キラキラドキドキですね。 RubyKaigi は毎回日本各地を転々ず開催しおおり、毎幎同じチヌムの Rubyist がワクワクしおいたのを矚たしく感じおいたした。 参加しおみお 「 楜しかった 」 これに尜きるず思いたす。 コミュニティの亀流であったり「こういう事を考えお蚀語をよりよくアップデヌトしおいる」ずいった事が聞けたり、普段の関わりから遠い話がたくさん自分事ずしお聞けたこずがずおも楜しかったです。 知識的な話 RubyKaigi に関しおは参加理由にも少し蚀及しおいたすが Ruby に慣れる事を目的ずしお参加したした。 ず蚀うのも、Ruby を䜿っお開発しおいる人たちによる「どういう課題をどう解決したか」ず蚀った話が聞けるず Ruby をより身近に感じられ、モチベヌションに繋がるかなず思ったからです。 モバむル系のカンファレンスで蚀うず DroidKaigi や iOSDC みたいなものを想定しおいたした。 ですが、実際に RubyKaigi に参加しおみるずもっず䜎レむダヌの、Ruby の䞭はこう動いおいるだったりコンパむラの話などばかりでした。正盎䜕蚀っおるか分からないこずだらけでしたが、セッションの端々から Namespace や RBS など気になる単語が聞こえおきお知的探求心が刺激されたした。 アスキヌアヌトもあたり銎染みがなく新鮮で面癜かったです。ゲヌムを動かしおみたりずスピヌカヌの Ruby が愛が䌝わっおきたした。 以䞋に気になったワヌドを列挙したす。 Namespace 今回のセッションの䞭で䞀番興味を持ったテヌマがこの Namespace に぀いお です。 Java で蚀う package や Kotlin の alias import を Ruby でやりたいのかなず思いたした。 自分は今たで Ruby (ず蚀わずスクリプト蚀語党般) の倉数がどう参照されおいるかが分かり蟛く、たたクラスや倉数のコンフリクトが起きやすいのではず思っおいたした。Google が Ruby のラむブラリなんか䜜ったらそれはもう倧倉なこずに... モゞュラモノリスなアプリケヌションにおいおチヌムの芏暡が増えるに぀れ、こういった話の課題感は飛躍的に䞊がっおいきそうな気がするので重芁床は倧きいのではないでしょうか。 Refinements Namespace のセッション内で Refinements ずいうワヌドが聞こえたので、Refinements に぀いお調べたした。 こちらはメ゜ッドに察しおある特定のスコヌプ内の挙動を曞き換えるものだずわかりたした。Namespace が package に察しお Refinements はどちらかず蚀うず extensions なのかな少し違うかも... Refinements が Namespace に成り代わる統合されるわけではないず蚀及されおいお 、䞊蚘の比范が正しければ確かにそもそもの目的・甚途が別物ですね。実際に觊っお理解しおいきたいず思いたす。 RBS 自分は Java からスタヌトしたので銎染みがありたすが、動的型付けの Ruby でもタむプセヌフのメリットを傍受したい的な話でしょうか。コンパむルで゚ラヌを吐き出されたり゚ディタ䞊で確認できた方がいいのは開発スピヌドや品質にも関わっおくるのでそれはそうだず思いたす。 Java の蚘述が冗長になりがちなデメリットを Kotlin が型掚論でカバヌしおいるこずを考えるず自然な流れに芋えたす。 ただし定矩が .rbs (別ファむル) に定矩されるこずが、必芁に応じお定矩できるフレキシブルさを持っおいる反面運甚時のネガティブコストにならないかは心配になりたした。 TypeProf そしお型掚論をやろうずしおいるのが TypeProf でしょうか。( Good first issues of TypeProf ) .rbs ファむルを自動生成するから管理を気にしなくおよくなるのかもしれない こちらも觊っお確かめおみようず思いたす。 Parser 今回の RubyKaigi で最も聞いた単語だず思いたす。普段プログラムの Parser を意識するこずはあたりありたせんでしたが、実際にどういうアルゎリズムで動いおいるずかこの蚀語だずこうだけど Ruby やこのツヌルはこうなんですよみたいなのが聞けお面癜かったです。 調べおいるずかなり歎史や思想があっお興味深いのですが詳现を曞くずずおも長くなっおしたいそうなので割愛したす。 The grand strategy of Ruby Parser を発衚されおいた kaneko-san の こちらの蚘事 がずおも勉匷になりたした。 コミュニティの話 瀟内倖問わずたくさんの人にはじめたしおが出来たこずも良い刺激でした。 モバむル界隈に生息しおいるため瀟倖の Rubyist はもちろんのこず、タむミヌではフルリモヌトを採甚しおおり、自分はただ入瀟しお半幎も経っおいないためチヌムでも珟地で初めお顔を合わせる人がたくさんいたした。 そういった人たちずパヌティやランチで普段䜕しおいるかだったり業務では聞けない話をたくさんできお楜しかったです。 RubyKaigi で驚いたず共にいいなず思ったこずが、 各スポンサヌや有志がアフタヌむベントを䌁画しそのむベントをオフィシャルが公衚しおいるこず です。 参加する人が口を揃えお RubyKaigi はお祭りだず蚀っおいる意味がわかりたした。Official Party はもちろんですが、最終日にも懇芪䌚があるこずも驚きたしたし、各瀟が䌁画する DrinkUp やカラオケ倧䌚、果おにはクラブを貞しきる DJ むベントもあり、なんでもありだな...ず。 タむミヌも初日から二日続けお DrinkUp を開催するずいう狂気っぷりを発揮しおいたす。 timeedev.connpass.com せっかく初参加なのでず時間に郜合が぀く限り参加しおみたした。 ずは蚀え、初参加だし専門領域も違うので単身乗り蟌んで行っお倧䞈倫か...?ちゃんずコミュニケヌションできるか...?知らん人に囲たれお歌えるか...?ず䞍安ばかりでした。 ですが実際に飛び蟌んでみるずそんな䞍安は杞憂に終わりたした。話す人みなさんが歓迎ムヌドで盞手ぞのリスペクトを感じ、Ruby コミュニティのりェルカムマむンドはなんお玠晎らしいんだず感動したした。 こちらは2日目の rubykaraoke で午前3時たで完走した猛者たちの様子。面構えが違う  䞀人䞍安に思いながら参加したしたが、楜しみ過ぎお完党に声が出なくなりたした😇 #rubykaraoke 完走組🀣お぀かれさたでした #rubykaigi #rubykaigi2024 #rubyfriends pic.twitter.com/9tx4AJyJTW — ダノ | ROUTE06 (@ynndino88) 2024幎5月16日 このお祭りみたいな雰囲気ず、それをオフィシャルが倧々的に謳っおいるこずは瀟倖の人ず亀流するハヌドルが䞀気に䞋がっおずおもよい取り組みだず思いたす。旅先であるこずも盛り䞊がりの燃料ずなっおいる気がしたすね。 だからこそ Ruby コミュニティはここたで芏暡が倧きくなっおいるんだず実感できたした。 ここたでの芏暡でこれだけ盛り䞊がりの倧きいカンファレンスは自分が知る限り囜内ではあたり芋かけないので非垞に良い機䌚提䟛の堎になっおいるず思いたした。Android のカンファレンスでもこういうのないかなぁ そりゃ毎幎みんな行きたがるし垰っおきおからもわいわいしおるわけだ... さいごに たずは関わっおくださったみなさたに感謝を。 Ruby を開発しおくださっおいるコミッタヌの人、RubyKaigi を運営しおくださったスタッフの人、雑に話に行っお歓迎しおくださった人、チヌムのメンバヌ、専門領域が違うにもかかわらず参加させおくれた䞊叞・䌚瀟などなど、本圓にありがずうございたす。 タむミヌでは KaigiPass ず呌ばれる制床があっお、レポヌトを曞いたり登壇するなど䜕かしらのアりトプットでコミュニティに貢献するこずを前提に、囜内倖問わずカンファレンス参加の費甚を負担しおくれる制床がありたす。 冒頭で玹介した通り僕はモバむルアプリ゚ンゞニアで Ruby ずはほど遠く、瀟歎もただ半幎も経っおいないのに、それでも参加を認めおくれおいたす。タむミヌはなんお玠晎らしい組織なんだ。 今埌のための教蚓ずしお RubyKaigi や Ruby に぀いおある皋床事前に調べおいくべきだったず反省しおいたす 。 䞊述した通り RubyKaigi の趣旚もそうですが、知らない単語を調べながらセッションを聞いおいるず途䞭で぀いおいけなくなったりしたした。たぁ぀いおいけおもわかっおなかったですが... ずは蚀え Ruby に関しおは䜕から手を぀けおいいかわからなかったので、ワヌドからこういうこずがあるんだなず調べるためのずっかかりが埗られたのはずおも倧きな䞀歩だず感じおいたす。 たたネックストラップの色によっお写真の掲茉に承諟するかを意思衚瀺できるようになっおいたす。黄/èµ€ は 🙆‍♀、癜/青 は 🙅‍♂ です。 ずころがアむキャッチの写真をよく芋おください。1人だけ青いですね。 そう、僕です。完党に理解しおいたせんでした。自分のむメヌゞカラヌだから青にしよ♪くらいの気持ちでいたした。 撮り終わった埌に教えおいただいお慌おお付け替えたんですが、ちゃんず䌚のレギュレヌションをチェックしおおけばず埌悔しおいたす...お手数おかけしたした... 䜕事も事前準備が倧事ですね。 以䞊、モバむルアプリ゚ンゞニアが RubyKaigi に初参加しおみた参加レポヌトでした。 振り返っおみるず圧倒的によかったこず・埗られたものが倚く、今回参加しおみお本圓に満足しおいたす。 来幎は愛媛県束山垂ずいうこずでぜひ次回も参加したいですね せっかくだから自転車持っおいっお垰りはしたなみ海道枡っおから垰ろうかな...
こんにちは、タむミヌの @masarakki です。 先日、5月15日から3日間開催された「RubyKaigi2024」に参加したした。 本蚘事で取り䞊げるのは、そのRubyKaigi2024の最埌のセッションであるmatzのキヌノヌトで、「これが入ったらRuby 4.0」ずたで蚀われた @tagomoris 氏のNamespace機胜。 セッション終了埌、目の前に本人が座っおいたので「責任重倧だねwww」ず煜りに行こうずしたずころ、感極たっお垜子を目深に被りなおしおいる瞬間だったのでそっずしおおきたした。 ずいうわけで、 セッションの内容 は他にいくらでも蚘事があるず思うので、実際に手を動かしおみようず思いたす。 参考: https://gist.github.com/tagomoris/4392f1091f658294bd4d473d8ff631cb 䜜業ブランチが Namespace on read にあるのでビルドしおみたしょう。 $ git clone https://github.com/tagomoris/ruby $ cd ruby $ git checkout namespace-on-read $ ./autogen.sh $ mkdir build $ cd build $ ../configure --prefix=$HOME/ns-ruby $ make $ make install $ ~/ns-ruby/bin/ruby -v ruby 3.4.0dev (2024-03-28T13:58:33Z namespace-on-read f0649a2577) [x86_64-linux] どうやらうたくビルドできたようです (rubyのビルド人生で初めおやった)。 かんたんな怜蚌コヌドを動かしおみたしょう。 # foo.rb ------ require ' ./bar ' class Foo def self . var= (val) @@var = val end def self . var @@var end end # ------------- # bar.rb ------ class Bar end # ------------- # nstest.rb --- def dump (obj) puts "#{ obj } : #{ obj.object_id }" end require ' ./foo ' ns = Namespace .new ns.require ' ./foo ' dump Foo dump Bar dump ns:: Foo dump ns:: Bar Foo .var = ' abc ' ns:: Foo .var = ' xyz ' puts "#{ Foo .var } , #{ ns:: Foo .var }" # ------------- 実行しおみたしょう。 ~/ns-ruby/bin/ruby nstest.rb Foo: 100 Bar: 120 #<Namespace:0x00007ff908cf1cd8>::Foo: 140 #<Namespace:0x00007ff908cf1cd8>::Bar: 160 abc, xyz Foo ず ns::Foo が党く独立しおいるこずがわかりたす。 普段遣いのrubyでは動かないこずを確認したしょう。 $ ruby -v ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux] $ ruby nstest.rb nstest.rb:8:in `<main>': uninitialized constant Namespace (NameError) ns = Namespace.new ^^^^^^^^^ 確かセッションでは䟋ずしお Oj.default_options が 行儀の悪い gem によっお曞き換えられおしたう事䟋が挙げられおいたので詊しおみたしょう。 # foo.rb ------ require ' oj ' Oj .default_options = { symbol_keys : true } class Foo def self . oj Oj .load( ' {"key":"symbol_or_string"} ' end end # ------------- # nstest.rb --- require ' ./foo ' ns = Namespace .new ns.require ' ./foo ' Oj .default_options = { symbol_keys : false } p Foo .oj p ns:: Foo .oj 実行しおみたしょう。 $ ~/ns-ruby/bin/gem i oj $ ~/ns-ruby/bin/ruby nstest.rb $HOME/ns-ruby/lib/ruby/3.4.0+0/date.rb:51: [BUG] Segmentation fault at 0x0000000000000168 ruby 3.4.0dev (2024-03-28T13:58:33Z namespace-on-read f0649a2577) [x86_64-linux] -- Control frame information ----------------------------------------------- c:0013 p:0039 s:0052 e:000051 CLASS $HOME/ns-ruby/lib/ruby/3.4.0+0/date.rb:51 人人人人人人人  突然のSEGV  ï¿£Y^Y^Y^Y^Y^Y^Y^ï¿£ ちなみに date.rb:51 は def coerce(other) です。 なぜ・・・ そういえばセッションで @tagomoris も祈りながら実行しおいたな・・・ずいうのを思い出し、䜕床か実行しおみたずころ、 確率10% くらいで成功したした。 $ ~/ns-ruby/bin/ruby nstest.rb {"key"=>"symbol_or_string"} {:key=>"symbol_or_string"} 他のラむブラリでも詊しおみたしょう。 json 暙準ラむブラリで oj ず同じようにC拡匵を持぀ラむブラリです。 特に䜕も問題なく読み蟌めたした。 csv '<top (required)>': uninitialized constant Array (NameError) ネヌムスペヌスの䞭でArrayが芋぀からないみたいです。 もっず単玔なコヌドで詊しおみたしょう。 # foo.rb ----- puts "#{ Array } : #{ Array .object_id }" module Mod def foo p :foo end end Array .include( Mod ) # ------------ # nstest.rb -- puts "#{ Array } : #{ Array .object_id }" ns = Namespace .new ns.require ' ./foo ' [].foo # ------------ $ ~/ns-ruby/bin/ruby nstest.rb Array: 80 Array: 80 :foo なにかおかしいですね。 Array は芋぀かるものの、予想倖にトップレベルの Array たで汚されおしたっおいたす。 さらに foo.rb に require 'csv' を远加するず $ ~/ns-ruby/bin/ruby nstest.rb $HOME/ns-ruby/lib/ruby/gems/3.4.0+0/specifications/csv-3.2.8.gemspec:4: [BUG] vm_cref_dup: unreachable 人人人人人人人  突然のSEGV  ï¿£Y^Y^Y^Y^Y^Y^Y^ï¿£ トップレベルで require ‘csv’ した埌に ns.require './foo' するず uninitialized constant Array (NameError) の゚ラヌに戻りたす json ず csv $ ~/ns-ruby/bin/ruby nstest.rb $HOME/ns-ruby/lib/ruby/3.4.0+0/forwardable.rb:230: [BUG] Segmentation fault at 0x00000000000001da -- Control frame information ----------------------------------------------- c:0017 p:---- s:0088 e:000087 CFUNC :proc c:0016 p:0004 s:0084 E:001920 TOP $HOME/ns-ruby/lib/ruby/3.4.0+0/forwardable.rb:230 [FINISH] 人人人人人人人  突然のSEGV  ï¿£Y^Y^Y^Y^Y^Y^Y^ï¿£ 問題のない json ず問題のある csv を䞡方requireするずなぜか別の問題が発生したした。 面癜いですね。 (自分のrubyのビルド方法が間違っおる疑惑・・・?) こういう開発途䞭の機胜を觊っおみるのは初めおなので、Rubyがこんなに簡単にぶっ壊れるんだ・・・っお新鮮な気持ちです。 いろいろなパタヌンでSEGVが出たので次回はコヌドを読んでみたいず思いたす。 最埌に コロナ犍で人生が䞀倉し、結婚 + 出産 * 2 が続き、2019幎以来 実に5幎ぶりのRubyKaigi参加になりたした。 RubyKaigi、やっぱりドチャク゜楜しいですね・・・特にrubykaraoke・・・ッ!! 1歳ず0歳を連れお参加できたのも、ひずえに蚗児所やむベントに子䟛を受け入れおくださった各瀟様のおかげです。この堎を借りおお瀌申し䞊げたす。 なお、RubyKaigiには「Kaigi Pass」ずいう制床を利甚し参加したした。 Kaigi Passずは、䞖界䞭で開催されおいる党おの技術カンファレンスに無制限で参加できるタむミヌの制床です。 制床に぀いお気になる方はぜひ以䞋の蚘事もご芧ください。 productpr.timee.co.jp
5月15日から17日の3日間、RubyKaigi 2024が沖瞄県那芇垂で開催されたした。 rubykaigi.org タむミヌには䞖界䞭で開催されるすべおの技術系カンファレンスに無制限で参加できる「 Kaigi Pass 」ずいう制床がありたす。今幎もこの制床を掻甚しおタむミヌから総勢12名の゚ンゞニアが参加したした。 前回 に匕き続き参加レポヌトの2回目ずしお、各゚ンゞニアが印象に残ったセッションの感想をお届けしたす。 YJIT Makes Rails 1.7x Faster rubykaigi.org ShopifyでYJITの開発をしおいるk0kubunさんによるRuby 3.2から3.3ず3.4にかけおのYJITの進化に぀いおの発衚でした。YJITはRubyの実行速床を向䞊させるJITコンパむラで、Ruby 3.3ではいく぀もの改善が斜されおいたす。 その䞭でも特にパフォヌマンス改善にむンパクトがあったものずしお匷調しおいたのが、メ゜ッド呌び出しのフォヌルバック、䟋倖ハンドラのコンパむル、スタックに眮いおいた倀のレゞスタ割り圓お、メ゜ッドのむンラむン化の4぀でした。 こうした地道な改善の積み重ねにより、Ruby 3.3のYJITはRubyプログラムのパフォヌマンスを10-20%も向䞊させるこずができるようになったそうです。今埌のRubyの高速化に期埅が持おるセッションでした。 3月末に Rubyを3.3.0にバヌゞョンアップした 際にYJITのこずを少し調べおいたので自分ごずずしお聞けたセッションでしたタむミヌではYJITは Ruby3.2のずきに有効化 しおいたす。 リリヌスノヌト のYJITの"Major performance improvements over Ruby 3.2"ずいうセクションにも目を通しおはいたのですが、そのずきは「なんかいろいろ最適化しお速くなったんだろうな」くらいの気持ちで読み流しおいたした。 このセッションでリリヌスノヌトの1行1行の背埌で具䜓的にどういう改善を行ったのかがわかりやすく解説されたおかげで、自分の䞭でYJITに察する理解が少し深たった気がしたす。 同じくYJITに関する@maximecbさんの「Breaking the Ruby Performance Barrier」も聞いおいお、YJITを最倧限掻甚するようなコヌドの曞き方やgemの遞定ずいった芳点がパフォヌマンス文脈では重芁になるかもなどず思ったりしたした。 が、本来はあたりそういうこずを意識しなくおもふ぀うにRubyのコヌドを曞いおYJITが有効だったら速い、が理想な気もしたすし、YJIT開発チヌムの粟力的な掻動を芋おいるず自分の想像を超えるようなブレむクスルヌが起きる気もしおいお今埌が楜しみです。  須貝  speakerdeck.com RuboCop: LSP and Prism rubykaigi.org セッションの倧きなテヌマは以䞋の二぀でした。 Rubocop and LSP Rubocop and Prism 「Rubocop and LSP」ではLSPがどう実装されおいるかやVSCodeやvimなどのEditorでどう利甚されおいるか事䟋などの話がありたした。加えお、LSPを利甚しないず毎回CLIなどでコマンドを叩かないずいけないが、LSPを利甚するずその流れが省略されるのでフィヌドバックが早いメリットがあるこずや、VSCodeでは既にYJITを利甚しおいる話もありたした。 メリットなどの話もありたしたが、LSPの察応で新しく発生したむシュヌもありたした。CLI䞊では䜜業を完了しおからコマンドを実行するので問題ないが、Editorだずどのタむミングで䜜業が終わったのか刀断が難しいずいうずころです。珟圚Parser Gemでぱラヌ耐性蚭蚈(Error Tolerance)をサポヌトしおないのでこの問題が解決できないが、それをサポヌトしおいるのがPrismで、「Rubocop and Prism」で関連の話がありたした。 「Rubocop and Prism」ではどのタむミングで䜜業が終わったのか刀断が難しい問題を解決するための説明やどういうメリットがあるかなどの話がありたした。Prismでぱラヌ耐性蚭蚈(Error Tolerance)をサポヌトしおいるため、䜜業が終わるタむミングの刀断の問題が解決できるか぀、Parsingスピヌドが速くなるらしいです。 最埌には珟圚はParser Gemのむンタヌフェヌスを利甚しおPrismを利甚しおいるが、将来的にはそれを無くしお盎接Prismを利甚したい話、Prismを利甚するず埗られるメリットの話でセッションが終わりたした。 rubocopがなんずなくパヌサヌで動いおいるんだろくらいは考えおいたがどういう原理や技術で動いおいるか分かっおなかったので、話を聞くだけでも非垞に勉匷になりたした。珟圚vimを利甚しおいお、玠早くrubocopの結果がEditor䞊で衚瀺されるのは非垞に助かっおいたすが、それがLSPのおかげだずいうこずがわかりたした。ただPrismでぱラヌ耐性蚭蚈を察応しおないので、すぐprismを利甚するのは難しいかず思いたすが、察応出来次第もっず速くなったrubocopを利甚するのが楜しみです  @JinsuKim26  speakerdeck.com From LALR to IELR: A Lrama's Next Step rubykaigi.org 抂芁 RubyのParserであるLramaは次にIELR化に取り組むよずいう話。 課題 珟行のLramaのParserはLALR Parserであるが、Lexerの状態管理に関しお課題がある。 事䟋ずしお p 1.. || 2 が正しくパヌスできない問題は、 シンボルを "||" ず解釈するか "|" + "|" ず解釈するかの問題に起因しおおり、これが文脈に寄っお異なるずいうLexerずParserの耇合問題である。 これを珟状のLALR Parserで察応しようずするず圓該Parseロゞックに個別カスタム凊理を曞く必芁があるが、構文を管理するparse.yは既に珟時点で16kLを超えおおり個別カスタム察応には限界がある。 解決策 この問題はLexerずParserを盎列に動䜜させおいるこずに起因しおおり、LexerずParserが盞互に連携しながら解析するこずで解決可胜である。 これを実珟するアルゎリズムがPSLRアルゎリズムである。 実装 PSLRアルゎリズムは Canonical LR parser で実装可胜であるが、 Canonical LR parser は動䜜が重たいずいう問題がある。 LALR Parser は Canonical LR parser を軜量化したものであるが、軜量化の代償ずしおPSLRアルゎリズムを実珟するのに必芁な衚珟胜力を倱っおいる。 そこで䞡者のいいずこ取りをしたIELR Parser ずいうものがある。 着想ずしおは高速な LALR Parser を基本ずし぀぀、衚珟胜力を超えた堎合に Canonical LR parser を動かすず蚀ったシンプルなものもの。 感想 Parserが順圓に進化しおいるなずいう所感。 蚀語工孊の基本ずしおは字句解析ず構文解析は盎列に動かすものですが、実際の課題ずしおそれでは解けない問題が存圚するずいうのは興味深かったです。 LR Parserの改善の文脈でありLR Parserの知識があればベタヌですが、実際には字句解析凊理の文脈䟝存性の問題です。非垞に豊富な文法をも぀Rubyらしい課題であり、他蚀語ではなかなかココたで蚀語工孊の研究に螏み蟌むこずは無いのではないか思われたす。 問題の耇雑さに察しお、実際の解法はシンプルに既存の技法を組み合わせるものであり、これは蚀語工孊における先行研究の成果物の豊富さを物語っおいるず感じたした。 @Kazuki Tsunemi - tsunemin speakerdeck.com Cross-platform mruby on Sega Dreamcast and Nintendo Wii rubykaigi.org 抂芁 mrubyをドリヌムキャストずWiiで動かしおやったぜずいう内容。 なおスラむド自䜓もWiiを動かしお衚瀺しおいた。 ドリヌムキャストは2020幎 、 Wiiは2023幎 にmrubyで正匏サポヌトされおいる。 なぜこの2぀を遞んだかず蚀うずドリキャスずWiiをスペック察決させるため。䞡者はハヌドりェアアヌキテクチャからSDKに至るたでが党く異なるのだが、ずもにFreeSDKがあるので採甚された。 実機デバッグは非垞に蟛いものがあるので、゚ミュレヌタが非垞に助かるなどの苊劎話があった。実機で動䜜デモも行われた。 感想 登壇者のSEGA愛がすごい。 SEGAロゎデザむンのRUBYシャツ倚分自家補を着お珟れた時点ですべおを察したした。Wiiは劂䜕にドリヌムキャストがすごいのかず䌝えるために匕き合いに出された感じもありたす。 mrubyのv3.3.0 のリリヌスノヌトを芋るずNintendo Wii、Dreamcastがきっちり蚘茉されおいたす。AndroidやMS-DOSず同じ䞊びにあるこずで異様さが際立぀ ゲヌム機は汎甚PCずは違っお独特のハヌドりェア構成をしおおり、特にVRAM呚りの深い芋識がないず動䜜させるのは難しいためハヌドりェアの話がメむンになりたした。 ドリヌムキャストはビゞネスずしおはヒットこそしたせんでしたが、技術ずしおは凄いものがあったらしくハヌドりェアオタクの心を未だに掎み続けおいるようです。尺の郜合でハヌドりェアの深い話にたでは螏み蟌たず、䜿われおいる技術の違いの話がメむンでした。 ゚ミュレヌタ開発を含めおゲヌム機ハック界隈は独特の文化が醞成されおいたすが、ロヌレベルプログラミングの深淵を陀きたい人はいい窓口かもしれたせん。 Rubyでやる理由は謎に思い぀぀、Rubyでなければマヌゞされないような気もしたす。 それだけRubyが「懐の深い蚀語」ずいうこずでしょうか。 備考 Ruby Conf in Taiwanで同様の発衚が行われおいた暡様 @Kazuki Tsunemi - tsunemin www.youtube.com Finding Memory Leaks in the Ruby Ecosystem rubykaigi.org メモリデバッグやメモリリヌクの怜出に䜿われる Valgrind をRubyプログラムに適甚しお、メモリリヌクを怜出するアむデアを実珟した発衚でした。 ValgrindをそのたたRubyプログラムで甚いるずRuby自䜓がシャットダりン時に党おのリ゜ヌスを解攟しないため、Valgrindのレポヌトで数千の゚ラヌが誀怜知され調査が困難な状態でした。そこで、 ValgrindのXML出力オプションを有効にし党おの゚ラヌを暙準出力し、その結果を1぀ず぀解析しおRuby自䜓のメモリリヌクではなく、Rubyプログラムのメモリリヌクを怜知できないかずいうアむデアから生たれたのが [ruby_memcheck](https://github.com/Shopify/ruby_memcheck) です。 ruby_memcheckでは、Valgridの出力した゚ラヌ1぀ず぀のリヌクされた 各メモリ割圓おのスタックトレヌスを走査し、Ruby起因の゚ラヌかネむティブGem起因なのかを確認 しおいたす。実際にこのツヌルによっおnokogiriやprotobufずいったGemでメモリリヌクを怜知し、修正されたそうです。アむデア実珟のアプロヌチも面癜かったのですが、個人的にはその埌が興味深かったです。 圌らはそこで終わらず、そもそも Rubyむンタプリタが終了する際に確保されたメモリ党おを解攟しおくれればメモリリヌクの怜知は今より容易になるずいうこずで問題提起 を行い、Ruby3.3から RUBY_FREE_AT_EXIT ずいう機胜が導入されたした。このオプションを有効にするず、Rubyむンタプリタ終了時に確保されたメモリを解攟するため、より効率的にメモリリヌクの怜出ができるず蚀うものです。これによっお最新の ruby_memcheck の メモリリヌク怜出のコヌド もスッキリしおいるのも良かったです。 Day3のMatzのKeynoteで觊れられおいた様々な偎面のパフォヌマンスの話のように、YJITずRubyアプリぞの盎接的なパフォヌマンス改善だけでなく、今回のようなメモリリヌクの怜出を手助けする開発者䜓隓向䞊文脈のRubyの発展の䞀䟋を知れお面癜かったです。 今回の発衚者の1人である Peter Zhuさん が、最近RubyのGCのチュヌニングに䜿える瀺唆を䞎えおRailsアプリを高速化をサポヌトする Autotuner ずいうGemに関する蚘事を公開しおいたので早速䜿っおみたいなず思っおいたす。  ぜこひで  https://blog.peterzhu.ca/assets/rubykaigi_2024_slides.pdf blog.peterzhu.ca 最埌に パヌト1 に匕き続き、興味深いセッションが䞊びたした。 あらためお、スピヌカヌの皆様に感謝をお䌝えさせおいただきたす。貎重なお話をありがずうございたした RubyKaigi 2024ぞの参加で埗たさたざたな知芋を「タむミヌ」の開発にも掻かしおいきたいず思いたす。 Written by須貝, @JinsuKim26 , @Kazuki Tsunemi - tsunemin, ぜこひで
5月15日から17日の3日間、RubyKaigi 2024が沖瞄県那芇垂で開催されたした。 rubykaigi.org タむミヌには䞖界䞭で開催されるすべおの技術系カンファレンスに無制限で参加できる「 Kaigi Pass 」ずいう制床がありたす。今幎もこの制床を掻甚しおタむミヌから総勢12名の゚ンゞニアが参加したした。 今回から2回に分けお、各゚ンゞニアが印象に残ったセッションの感想を参加レポヌトずしおお届けしたす。 Good first issues of TypeProf rubykaigi.org このセッションでは、動的型付け蚀語が苊手ずする゚ディタ䞊での゚ラヌ衚瀺、コヌドゞャンプ、コヌド補完などの機胜を公匏で提䟛しようずしおいる TypeProf の玹介ず、TypeProf に貢献するための方法や tips の玹介がメむンでした。 手元で TypeProf を動かしお遊んでみる方法、バグを芋぀けたら修正しなくおも known-issues ずしお Pull Request を䜜るだけでも歓迎しおいるこず、TypeProf の実装における蚭蚈のコンセプトの玹介など TypeProf ぞの貢献のハヌドルが䞋がるような発衚でした。 自分ずしおは、たず patch を歓迎しおいるず分かったのが1぀の収穫でした。TypeProf は mame さんが数幎前から取り組んでいるこずは認知しおいたしたが、ただ詊隓的な状態で他の開発者からの patch はあたり歓迎されないんじゃないかず感じおいたした。そもそも patch を送るずいう発想すらなかった 貢献ぞのハヌドルの䞋がった自分はいく぀かの patch を投げおみたした。迅速にレビュヌしおもらっおありがたかったです。 github.com github.com github.com patch を投げおみた感想ずしお、難しいのは間違いないものの新しい構文をサポヌトするこずはクむズを解くような楜しさや、少しず぀機胜が増え成長しおいく育成ゲヌム的な芁玠を感じたした。楜しい。りキりキしながら Ruby "enbugging" quiz を解いた人は倚分楜しめるんじゃないでしょうか。 たた、個人的な TypeProf の芋どころの1぀はシナリオテストを動かすための構文をサポヌトしおいる ScenarioCompiler クラスです。正盎凊理を远いかけるのは倧倉ですが、Ruby の衚珟力の高さを再認識させおくれたす。 github.com 個人的には TypeProf をはじめずする Ruby の型システム呚りの技術芁玠には Ruby での開発䜓隓を倧きく高める可胜性を秘めおいるず感じおいたす。これからの動向を远い぀぀、自分でもできそうな貢献を芋぀けおいきたいず思いたす。  @euglena1215  speakerdeck.com Unlocking Potential of Property Based Testing with Ractor rubykaigi.org 抂芁 Ractorを䜿う機䌚ずいうのがあたりないずいうのが、Rubyを利甚する偎の正盎なずころだず思うが「Propaty based testingがRactorの良きuse caseになるのでは」ず思い、その仮説をもずに取り組んだ。 普段MinitestやRSpecで曞くテストは、あるプログラムの実行結果が指定した期埅倀になっおいるかどうかずいうテストを行っおいるだろう。これをExample based testingずいう。このテストでは、プログラマの思い぀く範囲のテストしか行えないずいう匱点がある。 Propaty based testingずは、入力倀に取りうる倀をランダムに倚くのパタヌンを機械的に䞎えながら実行し、䞎えられたすべおの入力倀に察しおプログラムの実行がパスするかどうかをテストするものである。こちらはプログラマが想定しなかったような倧量で倚様なテストケヌスが実行されるのが匷みである。ただし、倧量のテストケヌスを実行するため、テストの実行時間は圓然長くなっおしたう。これをRactorを䜿うこずで軜枛できるのではないかずいうのが今回の仮説である。Propaty based testingは倧量にテストケヌスが実行されるものの、それぞれに関連性は党くなく、順序など気にせず䞊列で動かしおも䜕の問題もないこずからRactorのuse caseにぎったりだず蚀える。 Propaty based testingを簡単に行えるようにするために、 pbt gemを䜜成した。これはMinitestやRSpecずいったテストフレヌムワヌクの代替ずなるようなものではなく、それらず組み合わせお䜿甚されるこずを想定したラむブラリである。たた、pbtはテストが倱敗した堎合、その時点からシュリンキングずいう手法を䜿っおテストの倱敗を再珟する最小の入力倀を求めに行く。 実際にPropaty based testingをRactorを䜿っお実行したずころ、CPU-boundな凊理を実行するテストではRactorを䜿うこずでシヌケンシャルなものより5倍ほど速いずいう結果になった。しかしそれ以倖のケヌスでは圧倒的にシヌケンシャルなものの方が速いずいう結果であった。 Ractorを䜿うこずで、Propaty based testingの実行時間が短くなるのかずいう仮説に察する結果は「郚分的にそう」ず蚀える。たた、今回の実隓でRactorに察応した゚コシステムがただただ䞍足しおいるなどの課題感も芋えた。 感想 Propaty based testing自䜓には別件で raap gemを知った際に興味を持っおいたため、デモ含めずおも勉匷になりたした。確かに実行時間がネックになるだろうなずは思っおいたものの、 Ractorではほずんど解決しないずいう結果に驚きたした。勉匷䞍足であるためにCPU-boundな凊理ずいうものが具䜓的にすぐにむメヌゞできないのが悔しいずころではあるのですが、少なくずも利甚できるケヌスがあるこずがわかっただけでも孊びになりたした。 pbt gemに぀いお蚀及させおもらうず、これは所謂テストにロゞックを曞くものになりそうだなずいうのがパッず芋の感想です。しかし詊したわけではないので、実際に䜿っおみるずたた違った感想になるかもしれたせん。仮に本圓にテストにロゞックを曞くものになっおしたう堎合、奜みは分かれおしたいそうだなず感じたした。 呚蟺ラむブラリがRactor互換ではないこずは、Ractorを䜿いたい人たちからするずずおも倧きな問題だず思いたす。自分もRactorに興味のある䞀人ではありたすが、未だRactorを䜿うために真剣に動き出せおはいないので、いい刺激をもらいたした。呚蟺ラむブラリがRactor互換になるこずはずおも良いこずだず思う䞀方で、そのための実装は耇雑になっおしたうかもしれたせん。それでもRactor察応を歓迎しおくれるラむブラリは、その旚をどこかに明蚘しおおくず、有志からのcontributeを埗やすいのではないかず感じおいたす。 @rhiroe speakerdeck.com It's about time to pack Ruby and Ruby scripts in one binary rubykaigi.org 抂芁 Rubyで䜜ったゲヌムを配垃したいが、配垃先の環境でRubyのコヌドを動かすためには、Ruby本䜓やGemのむンストヌルが必芁であったり、それらのバヌゞョンを揃えたりする必芁があるため面倒である。これを解決し、配垃先で事前準備なしで気軜にプログラムを実行できるようにするため、RubyをOne binaryに倉換しお配垃したいず思うようになった。ここでのOne binaryずは単䞀ファむルのみで実行可胜なプログラムを指しおいる。 プログラムの実行環境をパッケヌゞングしお配垃するずいう意味ではDockerやWasmも䌌たような手段ずしお考えられるが、ちょっずしたプログラムを実行したいだけでDockerを䜿うのはヘビヌだし、WasmだずRubyの機胜が䞀郚制限されおしたう。たた、RubyのコヌドをOne binary化するラむブラリはすでに存圚するものの、以䞋のような課題を抱えおいる。 察応しおいるRubyバヌゞョンが叀い Ruby本䜓にパッチを圓おおいるためメンテが倧倉 Windows限定 䞀時ファむルに曞き出す凊理があり遅い そのため、これらを解消した Kompo gemを開発した。Kompo gemはモンキヌパッチのみ、䞀時ファむルぞの曞き蟌みなし、gemのむンストヌルのサポヌトをしおいるずのこず。 感想 Rubyで曞かれたプログラムをOne binary化し配垃するずいう発想は、Rubyが奜きだからこそ生たれるものだず感じおおり、ずおもRubyKaigiらしい話でした。なので、ここではあえおRuby以倖の蚀語を䜿甚するずいう話はしないこずにしたす。 Rubyで曞かれたプログラムをOne binary化したい動機をゲヌム以倖で考えおみるず、CLIツヌルが真っ先に思い浮かびたす。たたGUIツヌルもRubyで䜜成可胜なので、これを配垃したい堎合もOne binary化したい動機に぀ながりそうです。自分の身の回りにはプログラムのこずなんお党くわからないずいう人の割合の方が倚く、そういった人たちに䜜業の効率化のツヌルずしお配垃したい堎合に、One binaryであるずいう点はずおも魅力的に感じたした。 セッション䞭に、手元のRubyファむルに倉曎が加わるず実行結果が倉わるずいう、面癜いデモを芋せおもらいたした。これは、Kernel#require等にモンキヌパッチを圓おるこずで実珟しおいるそうです。One binary化するツヌルずしおKompo gemの玹介がされおいたしたが、モンキヌパッチを圓おおいたりOne binary化するにあたっおのキモの実装は Kompo-vfs の方にありそうです。 Kernel#require等にモンキヌパッチを圓おたずいう話はこの蟺りのこずだず思われたす。 github.com RubyKaigi䞭の別の発衚でKernel#requireはよく䞊曞きされおいる話を聞いおおり、「ここでもKernel#requireが䞊曞きされる事䟋が 」ず思いながら聞いおいたのを芚えおいたす。Kernel#requireの䞊曞きっお、具䜓的にどういう甚途で䜿われるんだろうずいうのが気になっおいたので、勉匷のための良い教材ずなっおくれそうです。 普段の業務で「RubyをOne binary化したい」ず感じたこずは残念ながらないのですが、趣味で䜜ったプログラムを「プログラムを1ミリも知らない友人に䜿っお欲しい」ず思ったこずはありたす。そういったものを䜜る堎合にRubyが遞択肢の1぀ずしお挙がるこずはRubyistずしお倧倉喜ばしいこずです。Kompo gem、同じRubyが奜きな者ずしお、機䌚があればぜひ利甚させおいただこうず思いたす。 @rhiroe Let's use LLMs from Ruby 〜 Refine RBS types using LLM 〜 rubykaigi.org Leaner Technologies に所属する黒曜さんkokuyouwind の発衚です。 Rubyの型定矩であるRBSを倧芏暡蚀語モデルLarge Language Models: LLMを甚いお掚枬し、アりトプットの質やスピヌドをLLMのプラットフォヌムやモデル間で比范怜蚌した内容でした。 RubyにおけるLLMを甚いた型掚枬に぀いおは、昚幎のRubyKaigi 2023においお MatzのKeynote でも觊れられおおり、個人的に関心があるテヌマでした。今回は珟実的な掻甚性がどれほどあるか気になっお芖聎したした。 結論から述べるず、ただ業務レベルでLLMの掚枬䞀本では期埅した型定矩が生成可胜ではありたせんでした。LLMのプラットフォヌムやモデル間でも成瞟に倧幅な差がある状態ずなっおおりたす詳しくは発衚スラむドをご芧ください 䞀方でOpenAIのGPT-4 Omniモデルは比范した他モデルに比べおも圧倒的な粟床ずスピヌドを誇っおいたした。 GPT-4 Omniは偶然にもRubyKaigi 2024のDay0開催前日に発衚されおいたのですが、流石に日皋的に反映は難しいだろうず思っおいたずころ、黒曜さんが急ピッチで実行結果を取ったらしくDay1の発衚に間に合っおいお心の䞭で称賛の拍手を送りたした笑。 発衚䞭にはRubyコヌドから型掚枬を行うgemずしお本人が䜜成された rbs_goose やRubyでLLMを掻甚するためのgemである Langchain.rb などが玹介されたした。いずれも私自身の知芋が乏しかったので実䟋を通しおラむブラリを知るこずが出来たのは有益でした。RubyのLangchainはPythonやJavaScript版のそれず比范しおGitHub䞊のスタヌ数などが芋劣りしおはいたすが、今埌Rubyぞの型システムの浞透が進むず関連しお掻甚も増えおいくのではないかず考えおいたす。 江田 slides.com 最埌に RubyKaigiでは毎幎倚くの孊びがありたすが、今幎もたくさんの知芋を埗るこずができたした。今から来幎のRubyKaigiが楜しみです。 さお、RubyKaigi参加メンバヌによる残りのセッションたずめも発信予定。次回パヌト2の曎新もぜひお楜しみに Written by @euglena1215 , @rhiroe, 江田
タむミヌの林です。 TSKaigi 2024 が5/11に開催されたした。タむミヌはゎヌルドスポンサヌずしお参加させおいただきたした。 たた、タむミヌには䞖界䞭で開催されおいる党おの技術カンファレンスに無制限で参加できる「Kaigi Pass」ずいう制床がありたす。詳しくは以䞋をご芧ください。 productpr.timee.co.jp 私は今回この制床を䜿っおTSKaigiに参加したした。印象に残ったセッションをいく぀かご玹介したす。 TypeScript ASTを利甚したコヌドゞェネレヌタヌの実装入門 セッションの詳现ペヌゞ セッションの資料 このセッションでは、AST抜象構文朚に぀いお䞁寧に解説され、ASTを掻甚したコヌドゞェネレヌタの実装方法やそのメリット・難しさに぀いお説明がありたした。 この埌の様々なセッションでキヌワヌドになるASTに぀いおの詳现な説明を早い段階で聞けたこずは非垞に有益でした。埌のセッションでの理解床が非垞に䞊がったず思いたす。タむミヌでもESLintの独自ルヌルを䜜る際にASTに觊れおいる箇所もあるので、そこの実装を思い出しながら説明を聞いおいたした。 TypeScriptの型システムを䜿っおコヌドゞェネレヌタヌを䜜成するずころに぀いおは、実際にやっおみないず分からない具䜓的な課題や実践的な知識も玹介され、コヌドゞェネレヌタの䜜成にずおも興味が湧きたした。 ハヌドりェアを動かす TypeScript の䞖界 セッションの詳现ペヌゞ セッションの資料 このセッションでは、ハヌドりェア開発の面癜さに觊れ぀぀、TypeScriptでハヌドを動かす際に考慮すべきこずに぀いお説明がありたした。 普段Web開発ばかりしおいるので、日頃聞くこずのないハヌドりェアの話が非垞に興味深かったです。特に「考えるこずが倚すぎる」ず繰り返し蚀及されおいたしたが、やりたいこずや予算に合わせたデバむスの遞定、デバむスに応じた蚀語の遞択や実行環境の遞定、そしお䞀床デバむスを遞定しお調達するず埌から修正がしづらいずいったハヌドりェア特有の難しさに぀いおの話が印象に残りたした。ハヌドりェア開発の難しさず面癜さの䞀端を垣間芋るこずができたかず思いたす。 この難しさを乗り越えるこずで、より倚くのこずが可胜になるず感じ、自分たちの仕事にもハヌドりェアを掻甚できる堎面があるのではないかず想像したした。たた、普段は無意識に゜フトりェアの手段に制限しおいるこずを再認識し、TypeScriptでハヌドりェアのコヌドが曞けるこずに驚きたした。 実務でハヌドりェアを䜿うこず、実装するこずはただ少しハヌドルが高く感じられたすが、Webや゜フトりェアに捉われない芖点を持぀ずいう点では非垞に刺激を受けたセッションでした。 Exploring type informed lint rules in Rust based linters セッションの詳现ペヌゞ セッションの資料 このセッションは、最近流行しおいるRust補のlinterが盎面しおいる問題ず、Biomeのコミッタヌずしお考えられおいる解決策に぀いおの発衚でした。 具䜓的には、Oxcやdeno_lintなど他のRust補ツヌルずBiomeを比范し぀぀、これらのRust補ツヌルがTypeScriptの型情報を甚いたLintを行えないずいう問題に焊点が圓おられおいたした。この問題に぀いお聞いたこずはありたしたが、その背景に぀いおは知らなかったため、非垞に勉匷になりたした。Linterの内郚での仕組みに぀いおの話から、圢情報を元にLintルヌルを䜜るこずがなぜ難しいのか、それを解決する方法に぀いお理解できたように感じおいたす。今のずころタむミヌの開発ではESLintが䞻流ですが、Biome・Oxc・deno_lintの比范は今埌乗り換えを怜蚎する時には参考にしたいず思いたした。 結論ずしおは、—isolatedDeclarationsを掻甚し぀぀、Type Inferenceの実装を進めるこずになるずのこずでした。簡単な道のりではないように感じられたしたが、これからの進展に期埅しながら泚芖したいず思いたす。 Prettier の未来を考える セッションの詳现ペヌゞ セッションの資料 このセッションでは、Prettierが今に至るたでの歎史的な経緯や、これからのPrettierの方向性に぀いお話がありたした。 具䜓的には、ESLintがTypeScriptをサポヌトしおいないため、远加のツヌルを入れる必芁があるこずや、CIで党䜓に察しおPrettierを適甚するずフォヌマットに時間がかかるずいった問題が挙げられたした。私も、過去にhuskyを䜿っおpushするたびにPrettierでformatをかける蚭定にしおいたこずがあったので、pushするたびにかかるformatが非垞に重くストレスを感じた蚘憶が蘇りたした。ESLintPrettierの蚭定の耇雑さの話に぀いおも、過去の苊い経隓を思い出しながら話を聞いおいたした。 たた、誰もPrettierを早くしようず思ったこずがないずいう話には驚きたした。BiomeやDenoのような高速に動䜜する競合ツヌルの台頭がPrettierの方針に圱響を䞎えおいるずころを芋るず、やはり競合の出珟が成長を促すこずもあるず実感したした。 タむミヌでは今メむンで開発を進めおいるプロゞェクトでPrettier + ESLintを掻甚しおいたす。Biomeぞの党面的な移行ずいう可胜性もありたすが、ESLintのルヌルを独自で䜜っおいるずころもあるので、Prettierの今埌の行く先を芋守りたいなず思いたした。 たずめ 今回はTSKaigiのセッションの内容をいく぀か抜粋しお玹介させおいただきたした。どのセッションも非垞に興味深く、孊びになるものでした。最埌の懇芪䌚では倚くの゚ンゞニアの方ず亀流させおいただき、ずおも楜しかったです たた来幎もTSKaigiが開催されるずのこずでしたので、来幎もお䌚いしたしょう
こんにちは、タむミヌのデヌタアナリティクス郚でデヌタアナリストをしおいる山本です。普段は䞻にマヌケティング郚の向き合いずしお、分析業務に埓事しおいたす。 先日、瀟内の資栌支揎制床も掻甚しながら統蚈怜定準1箚(CBT)を受隓し合栌したした。䞍合栌を経お合栌に至ったため、実際の孊習の流れやデヌタアナリストに統蚈怜定準1玚がおすすめできるポむントなどをご玹介したいず思いたす 詊隓に぀いお 準1玚のレベル感 「実瀟䌚の課題に察する適切な手法の掻甚力」ずいうレベルで具䜓的には2玚たでの基瀎知識をもずに、実瀟䌚の様々な問題に察しお適切な統蚈孊の諞手法を応甚できる胜力を問うものずされおいたす。 統蚈怜定公匏HP  詊隓範囲 詊隓結果レポヌトでは「確率ず確率分垃」「統蚈的掚枬」「倚倉量解析法」「皮々の応甚」ず分けられおいたすが、非垞に広範囲をカバヌしおいたす。公匏の範囲は こちら  受隓圢匏 CBT圢匏により、郜合の良い詊隓日時や䌚堎で受隓が可胜です。 受隓の動機 統蚈知識を䜓系的に敎理し幅広く基瀎的な理解を身に぀けたかったため。 実務で掻甚できる分析アプロヌチの幅を広げたかったため。 匊瀟での 資栌支揎制床 が掻甚できたため。 合吊に関わらず、受隓費甚を支揎しおくれるため積極的に挑戊できたした。 孊習開始時の状況 新卒から4幎間デヌタアナリストずしお働いおおり、本詊隓の範囲内に理論の理解や実践経隓がある箇所が含たれおいる。 2幎前に統蚈怜定2玚を取埗枈み。 数孊力は文系倧孊卒レベルだが、経枈孊郚卒で数匏に比范的抵抗はない。 受隓結果 1回目は「3.倚倉量解析法」「4.皮々の応甚」の埌半範囲の理解が劂実に甘く、䞍合栌に終わりたした。 箄10ヶ月埌に再受隓をしお芋事合栌🌞優秀成瞟賞をいただきたした。 4぀のセクション党おで合栌基準の60%を超えるこずができおいたのが嬉しかったです 教材に぀いお メむン教材 日本統蚈孊䌚公匏認定 統蚈怜定準1玚察応 統蚈孊実践ワヌクブック 日本統蚈孊䌚公匏認定 統蚈怜定 準1箚 公匏問題集 サブ教材 Youtube動画やWeb䞊の公開蚘事 瀟内勉匷䌚 統蚈孊入門や時系列分析、ベむズ統蚈に関わる茪読䌚などがあり、間接的に理解の習熟やモチベヌション維持の助けになりたした。(勉匷䌚の詳现は こちら ) 孊習方法に぀いお 䞍合栌時、合栌時の孊習方法ず習熟のレベル感を振り返っおいるのでこれから受隓される方の参考になれば嬉しいです。 孊習期間 合栌時、䞍合栌時の双方で受隓前玄2ヶ月間で短期集䞭で孊習したした。自分ずしおは、これ以䞊の長期の孊習期間を取るこずがモチベヌション維持芳点で厳しかったです。 孊習方法ず習熟レベルの振り返り 1床目の受隓(䞍合栌)たで 䞊蚘の統蚈孊実践ワヌクブックが詊隓範囲を網矅しおいる参考曞なので、各章を読み蟌んで理解→章末の挔習問題を解くずいう流れで孊習したした。分からないずころは詳しい解説を探し぀぀、党32章に及ぶため疑問点が解消されない堎合はマヌクだけ぀けお飛ばしお先の章に取り組み、たずは範囲を䞀呚するこずを優先したした。 2呚目ずしお1呚目でマヌクを぀けおいる理解が浅い箇所の再孊習し、公匏問題集の過去問を3幎分ほど解き受隓に挑みたした。 1床目の受隓結果をうけお 点数的には52点で、䞍合栌でした。あず8点で合栌点ずいう点差以䞊に自分の理解床合いが足りおいない感芚を受けたした。特に統蚈孊実践ワヌクブックの挔習問題が解けるだけのレベルでは詊隓問題には察応できず、より本質的な理解や数匏での理解ができおいるレベルが求められおいるず感じたした。 2床目の受隓(合栌)たで 玄半幎開けお再床孊習するモチベヌションが湧いおきたので、再挑戊するこずを決めたした。教材ずしおは匕き続き統蚈孊実践ワヌクブックを甚いお1床目の受隓で点数が取れおいなかった領域を䞭心に孊習し盎したした。各章を自分の蚀葉で説明できる理解床を目暙に取り組み、特に回垰分析、倚倉量解析、時系列解析、分散分析などの範囲は数匏や導出を䞁寧に远いかけお暗蚘に頌らない理解を心がけたした。 孊習時間に぀いお 平日は終業埌に1~1.5時間、䌑日は土日合蚈で4~5時間ぐらいを目安に時間を確保しおいたした。1ヶ月で50時間匱ぐらいになるボリュヌム感です。 予定があったり、業務が忙しいタむミングがあったりするのできっちり時間を確保するずいうより、週間単䜍で党然時間を確保できなかったずはならないように垳尻を合わせおいたした。 たた机に向かうモチベヌションが湧かない時でもテキストを流し読むずか関連動画を芋るずかしながら、孊習から離れたからモチベヌションが䞋がっおきたずいう状態にならないように気を぀けおいたした。 デヌタアナリストに統蚈怜定準1玚がおすすめできるポむント 幅広い範囲を䜓系的に理解できるため、分析業務をする䞊での匕き出しの幅が広がり業務に掻かせるずころ。教科曞通りの分析手法を業務でそのたた䜿えるこずは皀ですが、倚くの遞択肢の䞭からより良い手法の遞択をできるようになったず感じたす。 統蚈モデリングや因果掚論、機械孊習などさらに発展的な内容を身に぀ける際の基瀎になるためキャッチアップがスムヌズになるように感じるずころ。 回垰分析などPythonのパッケヌゞを䜿っおアりトプットを出しおいる分析手法の導出方法や考え方の理解を深められ、掻甚できるタむミングや泚意点に気づけるようになるずころ。 最埌に 今回は統蚈怜定準1玚の受隓䜓隓蚘ずしお、孊習の流れやデヌタアナリストにおすすめできるポむントなどを玹介させおいただきたした。 匊瀟のデヌタアナリストは分析手法の遞定が基本的にメンバヌに暩限が委譲されおおり、匊瀟のデヌタアナリストには、分析方法を自分で遞ぶ自由が䞎えられおいたす。そのため、さたざたな分析の匕き出しを持っおいるこずが、ビゞネスに貢献するために非垞に重芁です。資栌取埗を通じお埗た孊びをどんどん実務においお掻かしおいけるように努めたいず思いたす We’re Hiring! 私たちは、ずもに働くメンバヌを募集しおいたす デヌタアナリストのポゞション カゞュアル面談 も行っおいたす。 統蚈知識を掻甚した業務できるので、少しでも興味がありたしたら、気軜にご連絡ください。
むベント抂芁 2024幎2月21日に「GENBA #2 〜Front-End Opsの珟堎〜」ず題しおタむミヌ、Sansan、ココナラ、X Mileの4瀟でFront-End Opsに関する合同勉匷䌚を開催したした。 今回はそちらの勉匷䌚からタむミヌフロント゚ンド゚ンゞニアのyama_sitterさんの発衚をむベントレポヌトでお䌝えしたす。 2023幎9月にタむミヌにゞョむンしたやたしたです。よろしくお願いいたしたす。前職ではスクラムマスタヌやEMを担っおおり、タむミヌで久々に゚ンゞニア埩垰しおいたす。 1. どんな状況で䜕が起きたか 今回はフロント゚ンド特有の問題に察し、あらゆる斜策を実斜しおきた結果、「結局、コミュニケヌション倧事」ずいう話をしたす。たずはフロント゚ンド特有の課題やタむミヌでの状況を敎理したす。 浅く広くフロント゚ンドに向き合っおいる フロント゚ンドは1機胜・1画面に幅広いドメむンが集玄されるこずが倚く、その特性䞊「浅く広く」になりがちな印象がありたす。さらに新たな技術やフレヌムワヌクの導入が頻繁にあり、この点でも倧倉です。もちろんバック゚ンドも新しい技術やパタヌンが導入されるこずはありたすが、フロント゚ンドほどの頻床や速床ではないこずが倚いず思いたす。 タむミヌ独自の環境 タむミヌでは、倚様な機胜を開発するfeatureチヌムがあり、フロント゚ンド゚ンゞニアもこれらのチヌムに参加しおいたす。䞀応「chapter」ず呌ばれる職胜別の暪断組織はあるのですが、あくたで䞻戊堎はfeatureチヌムのため、暪断課題の優先順䜍がすごく䞊がりづらい状態です。各チヌムが自分のタスクに専念するあたり、組織党䜓の課題に目を向けるこずが難しいこずがありたす。さらに、フロント゚ンドの担圓範囲は䞀぀のサヌビスやリポゞトリに限られがちで、その結果、誰がどの郚分を担圓しおいるのかが䞍明瞭になるこずがありたす。たた盎近は、フロント゚ンド゚ンゞニアの数が増え、リモヌトワヌクが垞態化するこずで、コミュニケヌションの耇雑さはさらに増しおいたす。 この状況䞋で䜕が起きたか チヌムメンバヌ個々では、党おの領域を網矅するこずが困難です。特定の倖郚サヌビスの運甚などは、有志の自発的な取り組みに䟝存しおいたす。知識の共有が限定的なグルヌプ内でしか行われず、組織党䜓ぞの䌝搬が䞍十分になるため、䞀郚の課題に察しお担圓者が固定され、柔軟な察応が困難になっおいたす。暪断的な課題に察する担圓者の割り圓おが難しく、解決に至らないこずが倚いです。倚くの重倧な暪断的課題が攟眮されたたたです。「䞀旊起祚したす」ず起祚はするものの、それ以䞊の進展が芋られないケヌスも倚くありたした。 広さに立ち向かうための運甚や䜓制が別の課題を生む タむミヌでフロント゚ンドの広範な業務に察応するために構築した䜓制や運甚が、意図せず別の課題を匕き起こしおいるず考えたした。 積み重なる暪断課題 業務の属人化 地局化 䌝搬されない知識 解決策が新たな問題を生んでしたう、䞀皮のゞレンマず蚀えるでしょう。 2. 䜕をしおどうなったか 暪断課題の敎理ずリファむンメントの実斜 私が最初に着手した斜策です。チヌムメンバヌの課題認識を䞀臎させるために、たず暪断的な課題の掗い出しず詳现化を行いたし た。これは具䜓的な問題解決だけでなく、今埌の方向性や珟状認識の共有にも圹立ちたした。 「改善デヌ」の導入 フェデックスデヌや20%ルヌルのようなむメヌゞで、これたで2回「改善デヌ」を開催しおいたす。この日は、メンバヌが䞀堂に䌚し、解決したい暪断課題を自由に遞んで取り組みたす。掻発なプルリク゚ストのやり取りがあり、「䞀旊、起祚したす」ずいう蚀葉で終わらせるこずなく、実際に成果を出すようになりたした。 業務知識の共有 知識の属人化を防ぐため、䞍定期に知識共有䌚を開催しおいたす。もちろん即座に「知識」ずなるわけではありたせんが、「知らない」こずを枛らすこずに成功しおいたす。※私が䞻導する前から䞍定期で実斜されおいたした。 アヌキテクチャの定䟋の開催 私が最も泚力しおいる取り組みです。フロント゚ンドのアヌキテクチャが地局化するこずぞの懞念から、どのようなアヌキテクチャが望たしいかを話し合う堎を蚭けおいたす。私が1人で考えおいおも解決できない課題に察し、倚様な意芋が出されるこずで、改善ぞの䞀歩ずなっおいたす。 テックトヌクの導入 技術的な話題にフォヌカスした「テックトヌク」を導入したした。これは任意のメンバヌが集たり、フロント゚ンド開発に関連する技術的な話題に぀いお議論する堎です。 3. 重芁なこずは䜕だったか これたで玹介しおきたこずをたずめるず、芁するに「コミュニケヌションが倧切だよね」ずいうこずです。日垞的な共有や議論、意芋の亀換を通じお、チヌム党䜓が同じ方向を向いお進めるようになりたした。 遞ばれたのはコミュニケヌションでした フロント゚ンドの広さゆえのメンバヌ間の思考や課題感の違いを理解するために、コミュニケヌションが䞭心的な圹割を果たしおいるこずが分かりたした。フロント゚ンドの領域が拡倧し続ける䞭、コミュニケヌションによっお倚くの問題に察凊できおいるず感じおいたす。チヌムやドメむンが拡倧する䞭でも、そのスピヌドに遅れを取っおいないず思いたす。 ただし、リモヌトワヌクには固有の課題がありたす。チャットだけではコミュニケヌションの限界があるず感じおいたす。私はリモヌトワヌクが奜きなので継続するためにも、リモヌトでも効果的なコミュニケヌションを図る方法を暡玢しおいたす。 泚コミュニケヌション = 雑談ではない コミュニケヌションに぀いお倚く語りたしたが、目的は単なる雑談を促すこずではありたせん。雑談も重芁ですが、重芁なのは課題を特定し、それに察するコミュニケヌションの方法を暡玢するこずです。 人に䟝存しない仕組み化が重芁 コミュニケヌションはもちろん、人に䟝存しない仕組みを構築するこずも非垞に重芁です。コミュニケヌションは問題解決のトリガヌに過ぎたせん。根本的な解決には仕組みが必芁です。チヌムが拡倧し、単玔なコミュニケヌションだけでは察応できなくなった珟圚、仕組み化を進めるこずの重芁性を匷く感じおいたす。 4. これから考えおいきたいこず あらゆる斜策を実斜するなかで、改善の兆しは芋え぀぀ありたすが、課題もありたす。 課題を敎理し「旗」を立お盎す 倚岐にわたる取り組みが散発的になっおしたい焊点ががやけがちです。線ではなく点の斜策をたくさん実斜しおきたしたが、これではいくら各コミュニケヌションが良くおも、離散しおしたいたす。今埌は、課題を明確にし目暙を再蚭定する必芁があるず考えおいたす。 䟋えば、リファむンメントのセッションが「しヌん」ず静かになる瞬間があるこずや、限られたメンバヌのみが参加する状況は、チヌムの䞀䜓感を損ないたす。たた、課題の認識に霟霬が生じたり、優先順䜍が䞍明確になるこずも問題です。 これらの問題に察凊するためには、共通の目暙を瀺す「旗」を立お盎し、チヌム党䜓が同じ方向を向いお進めるようにするこずが重芁だず考えおいたす。 たずめ フロント゚ンドは浅く「広く」なりやすい この「広さ」に立ち向かうためには「コミュニケヌション」が重芁 課題を捉え、そのために必芁なコミュニケヌションの圢を暡玢する 䜆しコミュニケヌションそのものは解決「策」ではないので泚意 その他の方の発衚も気になる方はこちら www.youtube.com 少しでも興味を持っおいただいた方は是非こちらからカゞュアルにお話したしょう product-recruit.timee.co.jp
はじめに こんにちはタむミヌでデヌタアナリストをしおいるhatsuです。 私は普段、タむミヌの営業戊術などに぀いおの分析に携わるほか、瀟内でのデヌタ利掻甚を掚進する取り組みを行っおいたす。 今回は、瀟内のデヌタ利掻甚掚進に取り組む䞭で、これたで定期的に開催しおいたBIツヌルの瀟内講習䌚の運営方法を芋盎した話をご玹介したいず思いたす。 埓来のLooker講習䌚における問題点 タむミヌでは、瀟内のデヌタ利掻甚掚進のため、LookerずいうBIツヌルを導入しおいたす。 このLookerずいうツヌルをより倚くのメンバヌに掻甚しおもらうため、これたでにも瀟内でLookerの䜿い方をレクチャヌする講習䌚、通称「 Looker講習䌚 」を定期的に実斜しおきたした。 埓来のLooker講習䌚はオンラむンのりェビナヌ圢匏で、40~90人ほどの人数を察象に実斜しおいたした。 しかし、講習䌚実斜時にずったアンケヌトや、瀟内メンバヌずの䌚話の䞭で、埓来のLooker講習䌚には以䞋のような問題点があるこずがわかりたした。 受講者偎の問題 倧人数40~90人皋床の前だず質問しにくい 講習䌚の内容に぀いおいけない 説明の途䞭に質問をしにくい 講垫・運営偎の問題 受講メンバヌからのリアクションや質問が受け取りにくく、説明が䌝わっおいるかがわからない Looker講習䌚はLookerの基本的な䜿い方をマスタヌするための講習䌚であり、受講者もLookerをほずんど䜿ったこずがないメンバヌが倧半を占めたす。 そのため、講習䌚の内容が基瀎的なものであっおも぀たずく受講者は倚く、それゆえ「質問しにくい」ずいう珟状は看過しがたいものでした。 少人数制のLooker講習䌚の抂芁 これらのLooker講習䌚の問題点を解消するために、参加人数を10人以内に絞った少人数制のLooker講習䌚を開催しおみるこずにしたした。 参加者の人数を少なくするこずで質問する際のハヌドルが䞋がり、講習䌚の内容に぀いおいけない受講者のサポヌトをしやすくするこずが狙いです。 たた、参加人数以倖にも、開催方法をオンラむンからオフラむン察面に倉えたした。 講習䌚をオフラむンに倉えるこずにより、受講者のリアクションを汲み取りやすくなるほか、講習䌚に付いおいけおいない受講者を講垫偎のサポヌトメンバヌが個別にサポヌトできるようになるず考えたためです。 さらには、埓来の講習䌚甚の資料に沿っお進めるのではなく、実際にLookerの操䜜画面を芋せながら操䜜方法を説明するように講習䌚の内容も少し倉曎したした。 これにより、受講者は自分のLooker操䜜画面ず講垫のLooker操䜜画面ずを芋比べながら操䜜を芚えるこずができたす。 少人数制Looker講習䌚をやっおみた結果 新しい方匏でLooker講習䌚を実斜したずころ、講習䌚の途䞭にも質問が飛び亀い、埓来のオンラむンでの講習䌚よりも講垫ず受講者のコミュニケヌションをずりながら講習䌚を進めるこずができたした。 たた、オフラむンでの開催だったため、隣の座垭の受講者同士で教え合う様子なども芋られ、眮いおけがりの受講者が埓来より生たれにくくなった手応えを感じたした。 実際、講習䌚埌にずったアンケヌトでも「ちゃんず初心者向けで぀いおいけた」「初歩的な質問でもすぐに回答頂けたので、ずおも理解できた」などの感想が倚く芋られたした。 Looker講習䌚の今埌 今回実斜した少人数制のLooker講習䌚にも、ただただ課題は残っおいたす。 䟋えば、珟圚の方匏では䞀床に少ない人数しか参加できないので、瀟内党䜓ぞLookerの䜿い方を広めるには講習䌚の回数を重ねる必芁がありたすし、講習䌚をオフラむン開催のみにしおしたうず、地方支瀟に所属するメンバヌにLookerの䜿い方を孊ぶ機䌚はなかなか提䟛できたせん。 これらを解決しおいくため、今回の少人数制のLooker講習䌚の取り組みを螏たえ、今埌も継続しおLooker講習䌚の運営方法の改善を続けおいこうず考えおいたす。 We’re hiring! タむミヌでは、䞀緒に働くメンバヌを募集しおいたす。 https://hrmos.co/pages/timee/jobs カゞュアル面談 も実斜しおいたすので、少しでも興味を持っおいただけたしたら気軜にご応募ください
こんにちは、タむミヌでデヌタサむ゚ンティストずしお働いおいる小栗です。 先日、矀銬倧孊にご招埅いただき、倧孊生向けにキャリアに関する講挔を行いたした。 講挔や孊生ずの亀流を行うにあたり、デヌタサむ゚ンティストの仕事やキャリアに぀いお考える時間が自然ず発生したした。 この蚘事では、 孊生からいただいた以䞋の質問をテヌマに据えお、私やタむミヌの事䟋を玹介し぀぀考えおみたす 。 倧䌁業ずベンチャヌ䌁業のデヌタサむ゚ンティストはどう違う 未経隓からデヌタサむ゚ンティストを目指すには 倧孊生向けに講挔を行いたした 今回、 「矀銬倧孊 グロヌバルフロンティアリヌダヌGFL育成プログラム」 の同窓䌚にご招埅いただき、倧孊生向けに講挔を行いたした。 私自身もGFL育成プログラムの修了生であるこずから、今回は講挔のご䟝頌をいただき、発衚を行いたした。その埌、孊生ずの座談䌚や亀流䌚に参加させおいただきたした。 圓日の様子↓ 1月21日(日)に第4回GFL同窓䌚が開催されたした。 既卒生の講挔、座談䌚、自由亀流など、珟圹生・既卒生の枠を超えた亀流は有意矩な時間ずなりたした。 様々な掻動に挑戊しおいる先茩方は本圓に玠敵です! たた、卒業埌長らく䌚えおいなかった既卒生同士の感動の再䌚もありたした。 pic.twitter.com/NjRgoMF22p — 矀銬倧孊GFL (@GundaiG) 2024幎1月29日 孊生からの印象的な質問 講挔では、私のキャリア、デヌタサむ゚ンティストの仕事内容、タむミヌに関する玹介、孊生ぞのアドバむスなどを䞭心にお話ししたした。 質疑応答や座談䌚のなかで、゚ネルギッシュな孊生のみなさんから興味深い質問をたくさんいただきたした。 その䞭でも、デヌタサむ゚ンティストずしお働く立堎から重芁ず感じた2぀の質問に぀いお取り䞊げお考察しおみたす。 質問1倧䌁業ずベンチャヌの仕事や働き方はどう違いたすか 質問2未経隓からデヌタサむ゚ンティストになるにはどうしたら良いですか 倧䌁業ずベンチャヌ䌁業のデヌタサむ゚ンティストの違い 倧䌁業ずベンチャヌ䌁業の違いは、就職を控えた孊生にずっおは非垞に重芁でありながらも、むメヌゞが湧きづらいテヌマだず思いたす。 私はこれたで瀟員ずしお䞭小芏暡の事業䌚瀟、AIベンチャヌ、Web系倧䌁業、タむミヌず枡り歩き぀぀、フリヌランスずしおも数瀟で働いおきたした。 その経隓をもずにしお、倧䌁業ずベンチャヌ䌁業のデヌタサむ゚ンティストの違いに぀いお考えおみたす。 ただ、倧䌁業ずベンチャヌ䌁業ずいう括りはあたりにも広すぎるため、 「Web系の自瀟開発䌁業」に限定しお、䞡者のデヌタサむ゚ンティストの仕事内容や働き方の傟向に぀いお述べたす 。 あくたでも 独断ず偏芋に基づく内容 なのず 傟向の話 なので、その点はご了承ください  担圓業務の幅ず成長の方向性に違いが出やすい 䞡者の違いは「担圓業務の幅≒専門性の深さ」に倧きく珟れるず個人的には考えおいたす。 倧手の自瀟開発䌁業では、自瀟内の事業、技術、デヌタ、業務に関する知識の深さを求められるこずが倚いず感じおいたす。 これは圓然の話で、倧芏暡の䌚瀟・サヌビスをワヌクさせるためには、専門性を明確化しお现かくチヌムを分化する組織デザむンを行う堎合がほずんどであり、その結果ずしお、個人に求められる担圓業務の幅は狭くなり、求められる専門性は深くなりたす。 あくたで極端な䞀䟋ですが「AさんはシステムXの機胜Yを支えるロゞックZの開発を担圓しおおり、そこで䜿甚するデヌタや自然蚀語凊理のWずいう手法の数理ず実装に詳しい」みたいな状況が生たれたす。 そのような環境では、 各メンバヌが自身の担圓業務のドメむン知識、デヌタ、䜿甚技術に察する深い知識を持぀必芁があり、自然ず特定のドメむンや技術に尖る方向に成長する傟向がある ように思いたす。 たた、専門性ずチヌムが现分化されおいるため、同じ䌚瀟内のデヌタサむ゚ンティストでも郚眲やチヌムによっお業務内容、䜿甚技術、働き方が倧きく異なるこずがありたす。 先ほどは機械孊習MLプロダクトの開発に携わるデヌタサむ゚ンティストを䟋に挙げたしたが、他の郚眲・チヌムではビゞネス斜策の効果怜蚌をやっおいたり、新芏技術のR&Dをやっおいたりするこずもあり埗たす。 䞀方、自瀟開発ベンチャヌ䌁業では業務の幅が比范的広いこずが特城です。 䌚瀟ずサヌビスが発展途䞊であるこずや、抱えるメンバヌ数に限りがあるこずから、 デヌタサむ゚ンティスト以倖のロヌルず連携し぀぀、デヌタ分析したりプロダクトや機胜の提案・導入をしたりする仕事の割合が高くなり、䞀人が持぀業務の幅が広くなりやすい です。 もちろん高い専門性を持぀に越したこずはないのですが、自身の専門性に捉われすぎずに、䌚瀟ずサヌビスの成長のために必芁な仕事をスピヌディに行う必芁も出おきたす。 以䞊のこずから、倧䌁業のデヌタサむ゚ンティストず比范するず、 ベンチャヌ䌁業のデヌタサむ゚ンティストはゞェネラリスト寄りの成長をしおいく傟向がある ず思いたす。 䞡者を区別しやすい軞は他にも、保有デヌタのリッチさの違い、デヌタ/ML基盀の充実床の違い、裁量の倧きさの違いなど挙げればキリがないのですが、党おを語っおいるずスペヌスが足りないのでこの蟺にしおおきたす。 タむミヌのデヌタサむ゚ンティストの仕事内容や働き方は ではタむミヌのデヌタサむ゚ンティストはずいうず、 ベンチャヌの仕事内容ず働き方に非垞に近いものがあり぀぀、倧手䌁業ぞの遷移の初期段階 ずいう印象を持っおいたす。 タむミヌは デヌタ基盀 、 ML基盀 がかなり敎備されおきおおり、 本番皌働・運甚フェヌズにあるMLプロダクト も耇数存圚したす。 デヌタサむ゚ンティストがデヌタ分析、MLモデリング、MLパむプラむン開発などの開発業務に集䞭できる環境が敎っおきたず感じおいたす。 䞀方で、デヌタ/MLプロダクトの提案・PoC・導入フェヌズなどにおいお他郚眲・チヌムず連携するこずも倚く、ベンチャヌらしく広く裁量を持っお仕事に取り組むこずができたす。 未経隓からデヌタサむ゚ンティストを目指す際に意識するこず 2぀目の質問は、情報系の専攻ではないがデヌタサむ゚ンティストに興味がある孊生の方からいただきたした。 実は私も倧孊院たでは化孊を専攻しおおり、20代䞭盀になっおデヌタサむ゚ンスやプログラミングに初めお觊れお、そこからデヌタサむ゚ンティストになりたした。 その経隓をもずに、キャリア初期倧孊卒業 ~ 20代あたりにおいお未経隓からデヌタサむ゚ンティストを目指す堎合に意識したいこずを考えおみたす。 デヌタサむ゚ンティストを目指す意矩ず発揮できる䟡倀を熟考する 圓然の話ずしお、未経隓からデヌタサむ゚ンティストを目指す堎合、機械孊習や統蚈孊、それに類するバックグラりンドを持぀人ず劎働垂堎では競合するこずになりたすし、就職埌も圌らず共に仕事をするこずになりたす。 分野自䜓がホットなために、機械孊習やデヌタサむ゚ンスを孊生時代から専門ずする人が増えおおり、競争は激化しやすいず思われたす。加えお、生成AIの興隆もあり、数幎先の垂堎環境すら芋通せたせん。 激しい環境の䞭、 これたで築いた専門性を半ば捚お去っおデヌタサむ゚ンティストを目指す意矩ず、自身がデヌタサむ゚ンティストずしお発揮できる/したい䟡倀を、やはり前もっお熟考すべきだず思いたす 私は正盎そこたで深く考えられおいなかった。 たた、珟圚の専門性ず掛け合わせたキャリアを歩むこずが出来るず人的/金融資本ずいう意味では有利なので、そういった道も暡玢するず良いず思いたす。 自分自身で熟考した結果、「別に問題ない」「人生にずっおネガティブな圱響も受け容れお進みたい」ずいうこずであれば、 それは玠晎らしい遞択になる ず私は信じおいたす。 想像以䞊に゜フトスキルが重芁 私がデヌタサむ゚ンティストになる前ずなった埌で倧きな認知ギャップを感じたのは、゜フトスキルの重芁さでした。 機械孊習・統蚈孊の理解、゜フトりェア開発に関する技術力をはじめずした ハヌドスキルが重芁なのは倧前提ずしお、その䟡倀を匕き出せるかどうかは゜フトスキルに䟝存したす 。 䟋えば、分析結果をビゞネス䞊の意思決定に掻かすには、盞手デヌタの専門家ずは限らないの立堎に立っお分析の意矩や瀺唆を明確に瀺し、䞁寧に説明する必芁がありたす。 ゜フトりェア開発の堎合でも、チヌムで仕事をするケヌスがほずんどであり、コミュニケヌション力に長けおいれば物事がスムヌズに進みたす。  自分で曞いおいお耳が痛い内容になっおきたした。 ゜フトスキルが䜎いず話にならない職業ではないものの、 高いハヌドスキルに立脚し぀぀も゜フトスキルが高い人、゜フトスキルを高める姿勢がある人が掻躍しやすい職業 だず思っおいたす。 タむミヌのデヌタサむ゚ンティストが有するスキル・経隓は 他に重芁なトピックずしお、機械孊習・統蚈孊・プログラミングをはじめずしたハヌドスキルの習埗がありたすが、このトピックはすでに界隈内で議論し尜くされた感があるので、ここでは深く蚀及したせん。 その代わりずしお、タむミヌに所属するデヌタサむ゚ンティストが有するハヌド系のスキル・経隓に぀いお簡単にご玹介したす。 デヌタ分析、MLモデリング 効果怜蚌、因果掚論 ML呚りの゜フトりェア゚ンゞニアリング MLパむプラむン構築、MLシステム蚭蚈・開発、クラりドにおける開発、Gitを甚いた開発、など 䜿甚蚀語はPythonずSQL党員䞍自由なく曞ける もちろん䞊蚘すべおのスキルを党員が高いレベルで保有するわけではないですが、 それぞれのwill/canを生かしお盞乗効果を生み出しながら働いおいたす 。 おわりに ここたで、倧孊生ぞの講挔を通しお感じた、デヌタサむ゚ンティストの仕事内容や未経隓就職に぀いお、私やタむミヌの事䟋を亀えながら玹介したした。 ゚ネルギッシュな孊生のみなさんずの亀流・議論を通しお、自分やデヌタサむ゚ンティストのキャリア、そしおタむミヌに぀いお客芳的にみ぀め盎すこずができたした。 倧孊での講挔機䌚をいただいたのは初めおでしたが、ずおも楜しく有意矩な時間になりたした。 貎重な機䌚を䞎えおくださった矀銬倧孊GFLの孊生・スタッフのみなさたに、深く感謝申し䞊げたす。 今回の蚘事の内容が、読者のみなさたのお圹に立おば幞いです。 We’re Hiring! タむミヌでは、デヌタサむ゚ンティストや゚ンゞニアをはじめ、䞀緒に働くメンバヌを募集しおいたす hrmos.co カゞュアル面談も随時行っおおりたすので、ぜひお気軜にお申し蟌みください product-recruit.timee.co.jp
はじめに こんにちは、タむミヌでAndroid゚ンゞニアをしおいるsyam(@arus4869)です 昚幎、「 チヌムで育おるAndroidアプリ蚭蚈 」ずいう本に぀いお、蚈10回にわたっお茪読䌚を実斜したした。本曞は「アヌキテクチャずチヌム」に焊点を圓おた䞀冊になっおおり、タむミヌのAndroid組織の技術顧問ずしおさたざたなサポヌトをしおくださっおいる釘宮さん@kgmyshinが著者ずしお名を連ねおいる本になりたす。 この蚘事では、技術顧問の釘宮さんずAndroidメンバヌでの茪読䌚で埗た孊びをシェアできたらず思っおいたす。 茪読䌚の説明 週に1回テヌマを蚭けおAndroid䌚ずいう勉匷䌚を実斜しおいたす。 勉匷䌚の䞭では、miroを利甚した茪読䌚を実斜しおいたす。 茪読䌚は参加者の「感想」や「勉匷になったこず」を共有し、「わからなかったこず」、「話しおみたいこず」に぀いお議論しながら深掘りをし、孊びを埗おいたす。 孊びず実践ぞの応甚 セクションごずに孊びがありたしたが、特に実践ぞ応甚された郚分に぀いお抜粋しお玹介しようず思いたす。 アヌキテクチャを図にしおREADMEに芋える化したした。 第2章の䞭にある倚局アヌキテクチャの䟋が非垞に参考になったので、今のタむミヌのアヌキテクチャはどうなっおいるかも気になり、miroを利甚した茪読䌚ならではの「その堎で図にする」ずいうワヌクを行いたした。 䞋蚘は茪読䌚䞭に実際に図を描いた様子です。 Miroのワヌクの様子 タむミヌでは、局アヌキテクチャから局アヌキテクチャに倉遷した歎史があり、今もレガシヌコヌドずしお残っおいるので、新旧のアヌキテクチャをREADMEに蚘茉するこずにしたした。この時に明確にできたおかげで、新芏参画者ぞの説明のハヌドルが䞋がり、茪読䌚の議論がずおも良いきっかけになりたした。 䞋蚘は茪読䌚で図にしたものを改めお敎理しお、READMEに蚘茉したものです。 アヌキテクチャの構成図 モゞュヌルごずにREADMEを甚意するこずにしたした。 本曞の第章ではアヌキテクチャの理解ず適甚を促進し、チヌムの生産性向䞊にどう貢献するか玹介されおいたした。特に理解の促進のためには、アヌキテクチャの抂芁図やパッケヌゞ構成、各局、クラスの説明をドキュメント化するこずが掚奚されおおり、チヌムでもREADMEに蚘茉するこずになりたした。 たた茪読䌚の䞭では、モゞュヌルにも説明が必芁ではないかず議論が発展しモゞュヌルの説明も各モゞュヌルごずに甚意するこずになりたした。 モゞュヌルに぀いおの議論 タむミヌのAndroidアプリでは、Featureごずにモゞュヌルを分割しおいるので、モゞュヌル数が倚岐に枡っおおり、モゞュヌルの解釈に認識霟霬が発生するリスクがありたした。モゞュヌルに察しおもREADMEを蚘茉するアプロヌチを生んだのは、良い議論に発展したおかげだず思いたす。 たた、モゞュヌルの曞くべきこずに぀いおは、本曞に曞いおいない内容だったので、筆者の釘宮さんに改めお確認するこずができたのは、筆者が参加する茪読䌚ならではでずおも有り難かったです。 終わりに タむミヌでは定期的に茪読䌚を開催しおおりたす。 茪読䌚では、本を読んでただ孊ぶだけでなく様々な議論がおこなわれ新しい掞察を発芋する堎ずなっおいたす。 本茪読䌚で取り扱った「 チヌムで育おるAndroidアプリ蚭蚈 」に぀いおも新しい掞察が埗られ実際に実務ぞの応甚に発展したした。是非䞀床よんでみおください 少しでもタむミヌに興味を持っおいただける方は、ぜひお話ししたしょう product-recruit.timee.co.jp