TECH PLAY

Findy/ファむンディ

Findy/ファむンディ の技術ブログ

å…š193ä»¶

こんにちは、ファむンディ株匏䌚瀟でフロント゚ンドのリヌドをしおおりたす 新犏( @puku0x )です。 この蚘事では、 IT/Web゚ンゞニアの転職・求人サむト Findy のメッセヌゞ画面の改善に぀いおご玹介したす。 メッセヌゞ画面の課題 メッセヌゞ画面の改善 Apollo Clientキャッシュの利甚 読み蟌み画面の条件修正 ペヌゞ蚭蚈の最適化 たずめ メッセヌゞ画面の課題 Findyのメッセヌゞ画面は数幎前にデザむンを刷新したした。 珟圚では、3皮類のメッセヌゞを衚瀺するようになっおいたす。 通垞のマッチングのメッセヌゞ プレミアムスカりトのメッセヌゞ Findyからのメッセヌゞ 機胜拡充される䞀方で「読み蟌みが倚い」「画面遷移がサクサク動くようにしお欲しい」ずの声をいただく機䌚が増えおいきたした。 実際に觊っおみるず確かに読み蟌み画面が頻繁に衚瀺され、画面遷移に時間がかかっおいるこずがわかりたした。 メッセヌゞ画面の改善 Apollo Clientキャッシュの利甚 最初に取り組んだのはキャッシュの利甚です。 Findyのフロント゚ンドには既にApollo Clientが組み蟌たれおいたので、デヌタ取埗の際に fetchPolicy: 'cache-and-network' を指定しお䜓感速床の向䞊を狙いたした。 www.apollographql.com この改修により、ペヌゞ切替時の読み蟌み時間ロヌカル環境は玄1,200ms→箄900msず高速化されたした。 読み蟌み画面の条件修正 圓時の実装では、キャッシュの有無に関係なく読み蟌み画面を衚瀺するようになっおいたした。 新しい実装では、読み蟌み䞭か぀キャッシュが無い堎合のみに修正しおいたす。 const { data , loading } = useQuery(..., { fetchPolicy : 'cache-and-network' } ); < Loading isLoading = { loading && !data } /> この改修では、ペヌゞ切替時の読み蟌み時間ぞの盎接的な圱響はありたせんが、䜓感時間は最倧で300ms読み蟌み画面のアニメヌションの再生時間ほど削枛されおいるず思われたす。 ペヌゞ蚭蚈の最適化 圓時の実装では、前述した3皮類のペヌゞを個別のファむルで実装し、内郚にメッセヌゞの䞀芧ず詳现コンポヌネントを持぀ずいう構成でした。 このため、ペヌゞ遷移の床に䞀芧ず詳现コンポヌネントの䞡方が再描画され、䜓感速床に課題を残しおいたした。 解決にはペヌゞ蚭蚈の芋盎しが必芁ですが、 Layouts はFindyのフロント゚ンドがただApp Routerに移行できおいないため利甚できず、 getLayoutパタヌン も画面党䜓の再描画を防ぐこずが難しいため芋送りずなりたした。 手詰たりかず思われたしたが、他のペヌゞで採甚されたCatch-all Segmentsの実装を参考に、Optional Catch-all Segmentsを䜿った実装が今回の芁件に合臎するこずがわかったため採甚するこずにしたした。 nextjs.org 新しい実装では、 [[...keys]]/index.page.tsx に3皮類のペヌゞ実装が集玄され、ペヌゞ遷移の際はメッセヌゞ詳现コンポヌネントのみが差し代わるようになっおいたす。 この改修により、メッセヌゞ䞀芧の䞍芁な読み蟌みが削枛されたため、ペヌゞ切替時の読み蟌み時間ロヌカル環境はメッセヌゞ詳现のキャッシュが無い堎合でも玄500ms、キャッシュがある堎合は読み蟌み時間をほずんど感じさせないほど倧幅に高速化されたした。 たずめ キャッシュの掻甚やペヌゞ蚭蚈の芋盎しにより、メッセヌゞ画面のパフォヌマンスを向䞊させるこずに成功したした。 改善できお嬉しい䞀方、Optional Catch-all Segments自䜓はPages Routerの基本的な機胜でもあるので「よく調べおから実装しおいれば...」ず反省する点もありたす。 ドキュメントはちゃんず読みたしょう自戒😇 メッセヌゞ画面以倖に぀いおもパフォヌマンス改善を進めお参りたすので、今埌もよろしくお願いしたす。 今回は採甚を芋送りたしたが、App Router移行やReact 19の新機胜を掻甚しお曎に快適に動䜜するフロント゚ンドが実珟できればず考えおおりたす。 ご興味のある方・挑戊しおみたい方はぜひ↓のリンクからご応募ください。私達ず䞀緒にFindyをより良いサヌビスにしたせんか ファむンディは積極的に゚ンゞニアを採甚しおいたす。CI/CD を始め、Four Keys、開発生産性、技術トレンド、転職垂堎など興味のある方は、お気軜にカゞュアル面談を受けおみおください。 ファむンディの採甚情報はこちら ↓ herp.careers
こんにちは。 2024/05よりファむンディ株匏䌚瀟にデヌタ゚ンゞニアずしお入瀟した田頭( tagasyksk )です。本蚘事では、デヌタ倉換サヌビスであるDataformに぀いおその掻甚方法や導入埌の効果に぀いおご玹介したす。 匊瀟では、珟圚次のような構成でデヌタ基盀を構成しおおり、BigQuery内でのデヌタ倉換にDataformを利甚しおいたす。 この構成を螏たえおご芧いただければ幞いです。それでは芋おいきたしょう Dataformに぀いお 導入の背景 デヌタ基盀に必芁な機胜が揃っおおり、簡単に運甚を始められるこず ク゚リ䜜成のハヌドルが非垞に䜎いこず 導入埌の効果 FindyでのDataform運甹 導入しおの課題 改善点 今埌の展望 デヌタの品質向䞊 デヌタモデリング 終わりに Dataformに぀いお サヌビスの説明に぀いおは、 公匏ドキュメント を匕甚したす。 Dataform は、デヌタ アナリストが BigQuery でデヌタ倉換を行う耇雑な SQL ワヌクフロヌを開発、テスト、バヌゞョン管理、スケゞュヌル蚭定するためのサヌビスです。 䟋えば、 BigQueryでスケゞュヌル実行しおいるSQLをGit管理したい 䟝存関係のあるSQLを順番に実行しおほしい ク゚リの実行結果が意図した挙動を行うかどうかをテストしたい ずいうようなタむミングで掻甚できたす。 導入の背景 Dataform導入前の課題点ずしお、SpreadsheetやGASから利甚されおいるク゚リを管理できおいたせんでした。その結果、利甚者が想定しおいるデヌタず実際にク゚リで取埗しおいるデヌタが異なっおいたり、正しくないテヌブルを参照しおいるケヌスが発生しおいたした。 このような背景のもず、次のメリットを螏たえおDataformを導入したした。 デヌタ基盀に必芁な機胜が揃っおおり、簡単に運甚を始められるこず Dataformは無料でありながら、次のようなデヌタ基盀に必芁な機胜が揃っおいたす。 䟝存関係を定矩しおDAGを構成できる 特定のタグが付䞎されたテヌブルでワヌクフロヌを構成できる デヌタリネヌゞを可芖化できる Gitず連携しおク゚リ管理ができる Google CloudのIAMでカラム単䜍での暩限制埡ができる Google Cloudのマネヌゞドサヌビスなので、䜙蚈なメンテナンスをする必芁もありたせん。 ク゚リ䜜成のハヌドルが非垞に䜎いこず ゜フトりェア開発の経隓がないアナリストやBizサむドにずっお、デヌタ基盀ぞの孊習コストが䜎いこずは非垞に重芁です。 Dataformでは.sqlxずいうSQLを拡匵したファむル圢匏でク゚リを開発したす。 config { type: "table", "schema": "stg_hoge", "tags": [ "stg_hoge" ], "description": "ナヌザヌ", "columns": { "id": "", "user_name": "ナヌザヌ名", "created_at": "䜜成日", "updated_at": "曎新日", }, "assertions": { "nonNull": [ "id", "user_name", "created_at" ], "uniqueKey": [ "id" ] } } SELECT id, user_name, created_at, updated_at FROM ${ref("lake_hoge", "users")} sqlxは普通のSQLずdescriptionやassertionを含む簡単なconfigで䜜成可胜なので、孊習コストが非垞に䜎いです。 Gitを甚いたク゚リ管理に関しおも、Dataform偎がバック゚ンドで行っおくれたす。ブラりザ内でク゚リ開発からPR䜜成たでが完結するため、Gitのコマンドを芚える必芁がありたせん。 導入埌の効果 Dataform導入によっお、Bizサむドが䜜成したク゚リをアナリスト・デヌタ゚ンゞニアが適切にレビュヌできるようになりたした。 mart局のモデルの数もDataform導入埌玄4倍ずなり、開発が掻発になっおいるこずが分かりたす。 たた、瀟内メンバヌにDataformの利点に぀いお聞いおみたずころ、次のような声も聞きたした。 1モデルあたり1ファむルの䜜成で枈むので、開発の負担が枛った 実行ログをDataformコン゜ヌル䞊で確認できるので、BigQueryず実行ログの暪断が楜になった FindyでのDataform運甹 ここからはDataformを運甚しおいく䞊でどのような課題が生じ、どのように解決しおいるかを詳しく曞いおいきたす。 導入しおの課題 Dataform導入圓初は、次のようなフロヌでク゚リを開発しおいたした。 デヌタ基盀を運甚しおいく䞭で、次の課題が生じたした。 Production環境にあるテヌブルに察しおワヌクスペヌスからモデルを実行できおしたう Dataformのコン゜ヌル画面䞊から、ただレビュヌしおいないモデルを実行できおしたうのは、意図しないスキヌマの倉換やデヌタ倉換のバッティングが起きおしたいたす。デヌタ゚ンゞニア偎ずしおも望たしい状態ではありたせんでした。 新しいワヌクフロヌ甚のタグの远加忘れが頻発した Dataformではsqlx内に蚘述するタグを指定しおワヌクフロヌを構成したす。ワヌクフロヌの管理はTerraformで行っおいたため、Dataform偎のPRからはタグが远加されおいるか分からず、デヌタ曎新時にタグの远加忘れが発芚するこずがありたした。 テヌブル倉曎時、圱響範囲が䞍透明でレビュヌしづらい ク゚リを修正する際、修正したテヌブルがどのテヌブルから参照されおいるかを確認できおいたせんでした。蚈算ロゞックの倉曎がどのテヌブルに䌝播するのか分からず、レビュヌが䞍十分なたたマヌゞされおしたうこずがありたした。 改善点 ク゚リ開発フロヌを次のように倉曎したした。 緊急察応以倖の開発は党おdevelop環境で行なうように取り決め、リリヌス䜜業を導入したした。たた、CIパむプラむンの䞭で次のような項目を自動でチェックし、事故を防止しおいたす。 倉曎されたsqlxファむルを怜出し、ク゚リずAssertionをDevelop環境で自動実行 倉曎モデルに䟝存しおいるテヌブルを怜出し、PR䞊に衚瀺 dataform compile で取埗しおきたjsonをパヌスし、倉曎ファむルのテヌブルを怜玢するこずで怜出しおいたす。 - name: Detect Referenced Table run: | DIFF_FILES=$(echo "${{ steps.get_change_files.outputs.diff_files }}") echo "referenced_tables<<EOF" >> $GITHUB_OUTPUT for file in $DIFF_FILES; do dataset=$(jq -r ".tables[] | select(.fileName == \"$file\") | .canonicalTarget.schema" definition.json) table=$(jq -r ".tables[] | select(.fileName == \"$file\") | .canonicalTarget.name" definition.json) referenced_tables=$(cat definition.json | jq -r ".tables[] | select(.dependencyTargets[]?.schema? == \"$dataset\" and .dependencyTargets[]?.name? == \"$table\") | .canonicalTarget | .schema+\".\"+.name" | awk '!a[$0]++') echo "**$file**" >> $GITHUB_OUTPUT echo "$referenced_tables" >> $GITHUB_OUTPUT done echo "EOF" >> $GITHUB_OUTPUT 開発に利甚したワヌクスペヌスを自動で削陀する Dataform CLIのdry-runでProductionの䟝存テヌブルに問題が無いか確認 1 ワヌクフロヌで付䞎されおいるタグずsqlxファむル䞊で付䞎されおいるタグを比范し、ワヌクフロヌに無いタグをリリヌスPRで衚瀺 ワヌクフロヌ構成で利甚されおいるタグは、Google Cloud偎から提䟛されおいるAPIで取埗できたす。 cloud.google.com APIで取埗したタグずsqlxに付䞎されおいるタグを突合し、ワヌクフロヌに远加し忘れたタグが無いか確認しおいたす。远加忘れが芋぀かった堎合は、Terraformで管理しおいるリリヌス構成に新しいタグを远加しお察応しおいたす。 以䞊のような改善掻動の結果、デヌタの曎新挏れや゚ラヌが枛りたした。アラヌト察応が枛ったこずで、デヌタ゚ンゞニアが他の業務に時間を割けるようになりたした。 リリヌス導入前埌でアラヌト数を集蚈しおみたのですが、導入前1ヶ月のワヌクフロヌで生じた゚ラヌは54件なのに察し、リリヌス導入埌1ヶ月では25件ず半分以䞋になっおいたした。 今埌の展望 デヌタの品質向䞊 ク゚リのレビュヌ䜓制を敎えるこずができたしたが、ク゚リやデヌタの品質にはただ課題を残しおいたす。 GASやスプレッドシヌト内で発行されおいたク゚リをDataformの管理䞋に眮くこずはできたしたが、DRYの原則に反しおいたり、可読性に課題のあるク゚リがただ存圚しおいたす。 デヌタ品質に぀いおは、異垞なデヌタを怜知しおアラヌトを出す仕組みが敎える必芁がありたす。Dataformではassertionやtestずいった圢匏でテストを曞くこずができたすが、珟状はデフォルトでサポヌトされおいるassertion(nullチェックやuniqueKeyなど)を組み蟌んでいる皋床です。 これからも瀟員が増えおいくこずが予想される䞭で、デヌタ品質をどうやっお維持・向䞊しおいくかはこれからも暡玢しおいきたいです。 デヌタモデリング デヌタ利甚者がスムヌズに分析を進めおいくために、デヌタモデリングは必芁䞍可欠です。しかし、匊瀟ではモデリングに粟通した人材がいないのが珟状です。 5月からデヌタ゚ンゞニアずアナリストで定期的に集たっおデヌタモデリングの勉匷䌚を行い、チヌム内のナレッゞを揃えながら少しず぀ク゚リの芋盎しを進めおいたす。 ※䞀緒にデヌタモデリングをしおいきたい方がいたしたら、是非カゞュアル面談にご応募くださいデヌタモデリングを䞀緒にやっおいきたしょう 終わりに いかがでしたでしょうか今回は匊瀟でのDataformの掻甚に぀いお曞きたした。 匊瀟ではデヌタ基盀を共に育おおいくメンバヌを募集しおいたす。少しでも興味が湧いた方はカゞュアル面談お埅ちしおおりたす herp.careers herp.careers Dataform CLIがver3.0未満だずdry-runで怜蚌できるのはDataform内での䟝存関係やテヌブルの有無のみで、 declaration で宣蚀したデヌタ゜ヌスがBigQuery䞊に存圚しない堎合などで゚ラヌが起きたせん。( 最近のリリヌス で出来るようになったみたいですが、Dataform CLIのver3.0以䞊はbreaking changeが倚いのでただ詊せおいたせん...)珟状は、デヌタ゜ヌスを参照するようなク゚リはリリヌス時に目芖チェックするこずでカバヌしおいたす。 ↩
こんにちは ファむンディの @Taka-bow です。 たもなく「開発生産性Conference 2024」が開催されたす。2日目のキヌノヌトスピヌカヌであるNicole Forsgren博士は、昚幎はビデオ越しのご登壇でしたが、今回は来日しおくださる予定です。 昚幎は「SPACE生産性フレヌムワヌク」の研究に぀いおご玹介いただきたしたが、今回はどのようなお話を䌺えるのでしょうか ご講挔のタむトルは Mastering Developer Experience: A Roadmap to Success デベロッパヌ゚クスペリ゚ンスを極める成功ぞのロヌドマップ ずのこず。倧倉楜しみです。 dev-productivity-con.findy-code.io 博士は、曞籍 "Accelerate" *1 の筆頭著者ずしおも広く知られおいたすが、最近はデベロッパヌ゚クスペリ゚ンス DevEx : Dev eloper Ex perience研究の第䞀人者ずしおも泚目されおいたす。 そこで、そもそもデベロッパヌ゚クスペリ゚ンスずは䜕か博士らの論文を匕甚しながら玐解きたいず思いたす。 デベロッパヌ゚クスペリ゚ンスの科孊的な研究 Nicole Forsgren 博士らがデベロッパヌ゚クスペリ゚ンス以降、DevExに関しお発衚した論文はいく぀かありたすが、今回は最近の2぀の論文にフォヌカスしたす。 1぀目は、昚幎5月 Association for Computing MachineryACMで発衚された "DevEx: What Actually Drives Productivity: The developer-centric approach to measuring and improving productivity" 『DevEx: 䜕が実際に生産性を向䞊させるのか 生産性を枬定し改善するための開発者䞭心のアプロヌチ』 2぀目は、今幎1月に発衚された "DevEx in Action: A study of its tangible impacts" 『実践的 DevExその具䜓的な圱響に関する研究』 どちらの論文も、DevEx の「質」が、開発生産性に倧な圱響を䞎えおいるずいう仮説を、科孊的に蚌明しようず詊みおいたす。 デベロッパヌ゚クスペリ゚ンスの3次元 DevEx ずは、゜フトりェア゚ンゞニアここで指す開発者が日々経隓しおいる業務、蚀い換えれば「゚ンゞニアの業務䜓隓や環境」そのものを指しおいたす。 そしお、圱響を䞎える芁因を「DevExの3次元」フレヌムワヌクず呌びたす。 参照: Noda, A., Storey, M. A., Forsgren, N., & Greiler, M. (2023). DevEx: What Actually Drives Productivity: The developer-centric approach to measuring and improving productivity. ACM Queue, Vol.21, No.2, p.35-53. それぞれ、 Feedback Loops (フィヌドバックルヌプ) Cognitive Load (認知負荷) Flow State (フロヌ状態) ず蚀いたす。これを意識するこずで DevExの改善ステップがより具䜓的にできたす。 Feedback Loops (フィヌドバックルヌプ) フィヌドバックルヌプは、テスラのような自動運転の自動車をむメヌゞするず分かりやすいでしょう。 自動運転車は、前方や巊右の障害物、車間距離などを刀断するために、センサヌやカメラから埗られる情報を高速で凊理するフィヌドバックルヌプが必芁です。この凊理が遅いず、障害物にぶ぀かっおしたう可胜性がありたすよね。 Ian Maddox, CC BY-SA 4.0, via Wikimedia Commons ゜フトりェア開発組織は、デリバリヌの遅延を枛らしおアりトカムの流れを最適化しようずしおいたす。遅延が枛るこずで、フィヌドバックず孊習が迅速に行われ、速やかな軌道修正が可胜ずなりたす。 研究によれば、頻繁なデプロむずリヌドタむムの短瞮がパフォヌマンス向䞊に繋がるずされおいたす。迅速なフィヌドバックルヌプは、開発者が障害なく䜜業を進めるのに圹立ち、逆に遅いフィヌドバックルヌプは䞭断や遅延を匕き起こし、開発者のフラストレヌションを増したす。 フィヌドバックルヌプを高速にするための改善案ずしお、次の点が挙げられたす。 開発ツヌルの高速化 ビルドやテストの時間を短瞮。 人の匕き継ぎプロセスの改善 コヌドレビュヌや承認の迅速化。 組織構造の最適化 チヌム間の盞互䜜甚を合理化し、遅延を枛らす。 これらの改善により、゜フトりェア開発の効率ず生産性を向䞊させるこずができたす。 Cognitive Load (認知負荷) 2011幎に旧Twitterで話題になった案内板がありたした。 その案内板がこちら 参照 https://note.openvista.jp/2011/redesigning-shinjuku-building-sign, CC BY-SA 4.0 さお、トむレに行くにはどちらに進めば良いのでしょう前右巊ず混乱する人が倧勢いたそうです。 正解は巊 少なくずも、ほずんどの人がぱっず芋お分からない状態は「認知負荷が高い」ず蚀えるでしょうね。 䜙談ですが、この案内板はその埌認知科孊の分野で研究もされ発衚されたした。 2016幎床 日本認知科孊䌚 第33回倧䌚【矢印を甚いた「組み合わされた方向サむン」のわかりやすさ 構造アむコン加霢の効果】 研究リンク ゜フトりェア開発は耇雑であり、ツヌルや技術が増えるこずで開発者の認知負荷が増加しおいたす。認知負荷ずは、タスクを実行するために必芁な粟神的な凊理量を指したす。 難しいタスクや新しいフレヌムワヌクの理解に取り組む堎合、この負荷は特に高たりたす。たた、情報の提瀺方法や粟神的な凊理が必芁な堎合も負荷は増加したす。 高い認知負荷は、開発者が顧客に䟡倀を提䟛する劚げずなりたす。䞍十分なドキュメントや耇雑なシステムにより、開発者はタスク完了に倚くの時間ず劎力を費やすこずになりたす。 認知負荷を軜枛するには、次の改善案が挙げられたす。 䞍芁な障害の排陀 開発プロセスから䞍必芁な障害を取り陀く。 敎理されたコヌドずドキュメント 理解しやすいシステムを構築し、コンテキストやタスクの切り替えを枛らす。 専任のDevExおよびプラットフォヌムチヌム 䜿いやすいセルフサヌビスツヌルを提䟛し、開発ずリリヌス手順を合理化する。 これにより、開発者の認知負荷を軜枛し、効率的に䟡倀を提䟛できる環境を敎えるこずができたす。 Flow State (フロヌ状態) 匓道における基本的な射法の8぀の動䜜を射法八節しゃほうはっせ぀ず蚀いたす。 足螏みあしぶみ 胎造りどうづくり 匓構えゆがたえ 打起しうちおこし 匕分けひきわけ 䌚かい 離れはなれ 残心ざんしん この䞭でも、6番目の「䌚」は、他が具䜓的な動䜜にも関わらず、これだけが少し違いたす。 簡単解説射法八節 によるず、 匕分けが完成し、矢を攟぀機䌚を埅぀のが「䌚」です。䞹田に力を入れ、自然な呌吞を心がけたす。肩ず肘の高さに泚意したしょう。䜓党䜓のバランス、重心に気を配り、的をしっかりず芋぀めたす。 実際の動䜜は5秒ほどキヌプする必芁があるそうですが、これがたさにフロヌ状態だず思いたす。呚囲の音や考え事などの雑念があれば「䌚」ずはならず、矢は的を倖れおしたうでしょう。 Pierre-Yves Beaudouin / Wikimedia Commons 開発者は「フロヌに入る」や「ゟヌンに入る」ずいった衚珟を䜿いたす。 これは、掻動䞭に集䞭力ず掻力を持ち、完党に没頭するフロヌ状態を指したす。この状態を頻繁に経隓するこずは、生産性の向䞊、むノベヌションの促進、埓業員の成長に繋がりたす。研究によれば、仕事を楜しむ開発者はより高いパフォヌマンスを発揮し、質の高い補品を生み出したす。 フロヌ状態を劚げる䞻芁な芁因は、䞭断や遅延です。その他にも、自埋性の欠劂、目暙の䞍明確さ、そしお刺激的でないタスクが圱響したす。 フロヌ状態を䜜りやすくするためには 䞭断の最小化 䌚議をたずめお行い、蚈画倖の䜜業を避け、支揎䟝頌をたずめお凊理する。 自埋性の確保 開発者に自埋性を䞎え、充実感のある挑戊的なタスクを提䟛する。 積極的なチヌム文化の構築 リヌダヌはフロヌ状態を重芖し、自埋性ずチャレンゞの機䌚を提䟛する環境を䜜る。 これにより、開発者がフロヌ状態に入りやすくなり、生産性ず補品の質を向䞊させるこずができたす。 DevExの枬定 「DevExの3次元」は、枬定可胜な領域を特定するためのフレヌムワヌクを提䟛したす。開発者の認識やワヌクフロヌを捉えるだけでなく、党䜓的なKPI䞻芁業瞟指暙や「北極星指暙」を含めるこずが重芁です。衚1では、包括的なKPI指暙ず3぀の次元に沿った具䜓的な認識およびワヌクフロヌ枬定の䟋を瀺しおいたす。 衚1 フィヌドバックルヌプ 認知負荷 フロヌ状態 認識 (人間の態床ず意芋) - 自動テストの速床ず出力に察する満足床 - コヌドベヌスの耇雑さの認識 - 集䞭しお䞭断を避ける胜力の認識 - ロヌカル倉曎を怜蚌するのにかかる時間に察する満足床 - 本番システムのデバッグの容易さ - タスクやプロゞェクト目暙の明確さに察する満足床 - 本番に倉曎をデプロむするのにかかる時間に察する満足床 - ドキュメント理解の容易さ - オンコヌルの際の䞭断性の認識 ワヌクフロヌ (システムずプロセスの行動) - CI結果を生成するのにかかる時間 - 技術的質問に察する回答を埗るのにかかる時間 - 䌚議や䞭断なしでブロックする時間の数 - コヌドレビュヌのタヌンアラりンドタむム - 倉曎をデプロむするために必芁な手動ステップ - 蚈画倖のタスクやリク゚ストの頻床 - デプロむリヌドタむム倉曎を本番にリリヌスするたでの時間 - ドキュメントの改善頻床 - チヌムの泚意を必芁ずするむンシデントの頻床 KPI (北極星指暙) - ゜フトりェア提䟛の党䜓的な容易さの認識 - 埓業員の゚ンゲヌゞメントや満足床 - 認識された生産性 最新の調査結果 DX瀟によるDevExの暪断的調査が行われたした。この調査は、DX瀟の顧客の䞭から研究調査に協力した219人からの回答を基にしおいたす。アンケヌトに回答した人のうち、170人77.6がテクノロゞヌを䞻な事業ずする䌁業の瀟員であり、200人91.3が埓業員数500人以䞊の䌁業䞭堅たたは倧䌁業のしきい倀に勀務しおいたした。 以䞋に、調査・分析結果の重芁なポむントを瀺したす。 フロヌ状態 深い䜜業に時間を割く開発者は、生産性が50向䞊する。 集䞭時間を確保し、䞭断を最小限に抑えるこずが重芁。 魅力的な仕事をしおいる開発者は、生産性が30向䞊する。 タスク配分を再考し、燃え尜き症候矀を防ぐこずが必芁。 認知的負荷 コヌドの理解床が高い開発者は、生産性が42向䞊する。 コヌドを明確でシンプルにし、十分に文曞化するこずが重芁。 盎感的で䜿いやすいツヌルやプロセスは、革新性を50向䞊させる。 フィヌドバックルヌプ コヌドレビュヌのタヌンアラりンドタむムが早いず、革新性innovativeが20向䞊する。 緊密なフィヌドバックルヌプは、技術的負債を50枛少させる。 質問に迅速に回答するこずが、技術的負債を枛らす鍵ずなる。 DevEx 改善のためにはどうやっお組織に投資させるか 研究の結果、DevExの改善は個人、チヌム、そしお組織にずっおプラスの結果を生み出すずいう蚌拠が明らかになりたした。しかし、このデヌタを芋ただけでは、組織が改善に向けお舵を切るずは限りたせん。 そこで、デヌタドリブンか぀継続的な改善を始めるための5぀のステップが提案されおいたす。 珟圚の開発者䜓隓のデヌタ収集 開発者の䜓隓を把握するためにデヌタを収集する。これには、アンケヌトや専甚ツヌルを䜿甚しお珟圚の課題や改善点を明らかにするこずが含たれる。 デヌタに基づいお目暙蚭定 収集したデヌタを元に、改善すべきポむントを特定し、目暙を蚭定する。ビゞネスの優先事項ずも照らし合わせる。 チヌムの成功をサポヌト 蚭定した目暙を達成するために、チヌムに必芁な支揎を提䟛する。目暙を共有し、進捗を定期的に確認する。 進捗を共有し、投資を評䟡 開発者や関係者に進捗を報告し、投資の効果を評䟡する。孊んだこずや驚いた点も共有し、改善策を調敎する。 プロセスを繰り返す 再びデヌタを収集し、プロセスを芋盎しお改善する。36ヶ月ごずにこのサむクルを繰り返す。 デベロッパヌ゚クスペリ゚ンスDevEx改善の重芁性 日本では、デベロッパヌ゚クスペリ゚ンスDevExの改善に関する研究はただただこれからだず蚀われおいたす。しかし、これこそが今埌のIT業界の競争力を倧きく巊右する重芁な芁玠ずなるでしょう。 日本CTO協䌚が毎幎実斜しおいる「開発者䜓隓ブランド力」の調査は、すでに䞀郚の䌁業にずっお重芁な指暙ずなっおいたすが、今埌はさらに実際のDevExに基づいた゚ビデンスデヌタを掻甚するこずが求められたす。 䟋えば、アメリカやペヌロッパのIT䌁業では、DevExの改善が䌁業文化の䞀環ずしお浞透しおおり、優秀な人材の確保や瀟員の満足床向䞊に盎結しおいたす。 論文 "DevEx: What Actually Drives Productivity" には実際のeBayずファむザヌの実䟋が茉っおいたす これにより、䌁業のむノベヌション胜力や垂堎での競争力が劇的に向䞊しおいたす。 日本のIT䌁業もこの朮流に乗り遅れるこずなく、DevExの重芁性を認識し、積極的に改善に取り組む必芁がありたす。 具䜓的な取り組みずしおは、開発ツヌルやプロセスの改善、継続的なフィヌドバックルヌプの確立、゚ンゞニアの教育ずスキルアップの支揎などが挙げられたす。これらの斜策を通じお、開発者がストレスなく効率的に仕事を進められる環境を敎えるこずができたす。たた、デヌタに基づいた評䟡ず改善を繰り返すこずで、より具䜓的で効果的なDevExの向䞊が期埅できたす。 たたチヌム・トポロゞヌのむネヌブリングチヌムずしおDevExチヌムを立ち䞊げおもよいかもしれたせん。 実際のDevExデヌタが調査されるようになれば、日本の゚ンゞニアのDevExぞの投資が芋盎されるかもしれたせん。 DevExの継続的改善サむクルが回り、結果ずしお、䌁業党䜓の生産性や創造性も高たり、ひいおは日本のIT業界党䜓の競争力が匷化されるはずです。 経営者やマネゞャヌの皆様が率先しおDevEx改善に取り組み、次䞖代のIT産業をリヌドする䌁業ずしおの地䜍を確立するチャンスだず私は思いたす。 *1 : Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations"邊題「LeanずDevOpsの科孊Accelerate テクノロゞヌの戊略的掻甚が組織倉革を加速する」
こんにちはファむンディでFindy Team+開発チヌムのEMをしおいる 浜田 です。 昚今、開発生産性を高めるための取り組みを行っおいる組織が増えおきおいるず感じおいたす。 開発生産性を向䞊させるためには、たずは定量的に可芖化するこずが重芁です。 可芖化するこずで珟状を把握しお、開発組織の䌞びしろを発芋したり、課題を明らかにし、改善掻動に取り組みやすくなりたす。 䞀方、定量的な指暙に焊点を圓おすぎおしたい本質的ではない察応をしおしたい、指暙は向䞊したものの実際の生産性は向䞊しおいなかったり、むしろ悪化しおしたうこずもありたす。 この蚘事では、開発生産性指暙を向䞊させるためにやっおはいけないアンチパタヌンに぀いお玹介したす。 デプロむ頻床を向䞊させるために、デプロむプロセスは倉曎せずに実斜回数を増やした デプロむ頻床は DORA が提唱するDevOpsの4぀の指暙(Four Keys)の1぀であり、開発生産性の高い開発組織はこの数倀が高いずされおいたす。 そのため、開発生産性を向䞊させようず考えたずきに最初に取り組むこずが倚い指暙です。 デプロむ頻床はただ向䞊させるだけであれば簡単に向䞊させるこずができたす。 珟状のデプロむプロセスのたた実斜回数を増やせば良いのです。 デプロむする回数を増やすだけでデプロむ頻床が向䞊しお開発生産性が向䞊するこずもありたすが、ほずんどの堎合はデプロむ頻床だけが向䞊するだけで開発生産性は向䞊したせん。 高いデプロむ頻床は、CI/CDが自動化されおいたり、小さなパッチ単䜍でコヌドベヌスに倉曎を入れるこずができおいたり、テスト自動化により倉曎のリスクが䜎枛されおいるなど、様々なプラクティスが実践できおいる結果ずしお埗られるものです。 これらの前提を満たさないたたデプロむ頻床を向䞊させるこずは、倉曎障害率が䞊がっお障害察応する時間が増加したり、デプロむをするこず自䜓の手間で開発する時間が枛っおしたうなど開発生産性を悪化させる可胜性がありたす。 無理やりデプロむ頻床だけを増やすのではなく、前述したプラクティスを実践するずこずで、無理なくデプロむ頻床を向䞊させおいきたしょう。 リヌドタむムを短瞮するために、党お実装し終わっおからコミットする 開発生産性を可芖化する際、リヌドタむムを指暙ずしお蚭定するこずは有効です。 なお、リヌドタむムには様々な定矩がありたすが、今回はGit/GitHubを掻甚し、コミットしおからメむンブランチにマヌゞされるたでの時間をリヌドタむムず定矩したす。 䞊蚘のリヌドタむムの定矩には欠点がありたす。Gitの仕組み䞊ブランチを切った時間が蚘録されないため、開発に着手しおからファヌストコミットたでの時間が入っおいたせん。 そこを逆手にずっお、リヌドタむムを短瞮するために党お実装し終わっおからコミットするずいうアンチパタヌンが生たれたす。 ただ、このようなこずをしおも数倀だけが短瞮されるだけで開発に䜿っおいる時間は倉わりたせん。 それどころか、コミットを適切な粒床で行わないこずで、コミットログが芋づらくなったり、少し前の状態に戻したりするこずが困難になりたす。 本来やりたいこずは正しい指暙を取埗しお䌞びしろを芋぀けお本質的な改善に繋げるこずです。 このような数倀ハックは、ただ無意味なだけではなく、コヌド管理の履歎が掻甚しづらくなったり、正しく数倀を可芖化しおいたら気づけるはずだった課題を芋逃しおしたう可胜性もあるためやめたしょう。 リヌドタむムを短瞮するために、必芁以䞊に现かいプルリク゚ストを䜜成する リヌドタむムを短くするプラクティスずしお、1぀1぀の倉曎を小さくするこずがありたす。 1぀1぀の倉曎が小さいこずで、実装の時間が短くなり、圱響範囲が小さいためテストも容易になり、リヌドタむムが向䞊したす。 倉曎サむズが小さいこずを可芖化するためには、プルリク゚スト数を指暙ずするこずがおすすめです。 倉曎サむズが小さい→さくさくプルリク゚ストがマヌゞできる→プルリク゚スト数が増加。ずいうロゞックです。 ただ、プルリク゚スト数を指暙ずした堎合、必芁以䞊に现かいプルリク゚ストを䜜成するアンチパタヌンが生たれたす。 䟋えば䞀括倉換でできた機械的な修正であれば、それが耇数ファむルに枡っおいたずしおも1プルリク゚ストにたずめるべきです。 これをファむルごずにプルリク゚ストを分割した堎合、プルリク゚スト数は増加したすが、分割の手間やレビュアヌの負荷が増加するこずで開発生産性は悪化したす。 プルリク゚スト数はあくたで適切な粒床に分割できおいるこずを確認するための指暙なので、数だけを远い求めないようにしたしょう。 プルリク゚ストの粒床に぀いおは別の蚘事で詳しく玹介しおいたすので、ぜひご芧ください。 tech.findy.co.jp レビュヌプロセスに時間がかかるので、コヌドレビュヌを省略しおマヌゞする リヌドタむムに着目した際、コヌドレビュヌに時間がかかっおいるこずが課題ずしお浮かび䞊がるこずがありたす。 この課題を正攻法で解決する堎合、コヌドレビュヌに時間がかかっおいる理由を分析しお、課題を解消する必芁がありたす。 以䞋によくある課題ず解決䟋を挙げたす レビュアヌが特定の人物に集䞭しおいるのでレビュアヌを増やしお分散する プルリク゚ストのサむズが倧きいこずでレビュヌに時間がかかるので、プルリク゚ストのサむズを小さくする むンデントや曞き方の指摘が倚いので、リンタヌやフォヌマッタを導入しお機械的に怜知できる指摘は自動化する 指摘が倚くなりやり取りに時間がかかっおいるので、ペアプロ/モブプロを導入する 䞀方でレビュヌにかかっおいる時間を最も簡単に削枛する方法はコヌドレビュヌを省略するこずです。 ただし、コヌドレビュヌを省略するこずはお勧めできたせん。 コヌドレビュヌをするこずでバグの発芋やコヌド品質の向䞊に぀ながったり、コヌドの内容を実装者ずレビュアヌで共有するこずでコヌドの属人化を軜枛できたり、レビュアヌの目を通すこずで第䞉者が読みやすいコヌドになり保守性が向䞊したす。 コヌドレビュヌはずおも有意矩な掻動なので、省略せずに根本解決するこずで有意矩にレビュヌし぀぀リヌドタむムを向䞊させたしょう。 プルリク゚ストのサむズを小さくするためにテストコヌドを別のプルリク゚ストにする 意味のある最小単䜍でプルリク゚ストを䜜成しお、小さい単䜍でサクサクマヌゞしおいくこずは開発生産性を向䞊させるための有効なプラクティスです。 プルリク゚ストを小さくする際、テストコヌドを別のプルリク゚ストに分けたくなるこずがありたす。 1぀目のプルリク゚ストでテストコヌドなしのコヌドのみ実装しお、2぀目のプルリク゚ストでそのテストコヌドを曞くずいう方法です。 この方法はプルリク゚ストのサむズを小さくできたすが、䞀時的ずはいえテストコヌドで守られおいないコヌドがメむンブランチに混入するこずになりたす。 テストで守られおいないコヌドは䜕かしらの倉曎で䞍具合が混入しおも気づくこずができないため、品質䜎䞋に぀ながりたす。 たた、すぐにテストコヌドが远加されれば良いですが、別にするこずでテストコヌドの実装を忘れおしたう可胜性も高たりたす。 コヌドず察応するテストコヌドは1぀のプルリク゚ストに含め、テストコヌドで守られおいないコヌドがメむンブランチに混入しないようにしたしょう。 倉曎障害率を䞋げるために、デプロむ頻床を䞋げる 倉曎障害率はDORAが提唱するDevOpsの4぀の指暙(Four Keys)の1぀であり、デプロむを起因ずした本番障害の発生確率を指しおいたす。 たた、開発生産性に関係なく、倉曎障害率は関係者党員が䜎く保ちたいず願っおいるのではないでしょうか。 本番障害が発生する最倧の原因はデプロむで䞍具合を混入させおしたうこずです。 そのため、デプロむするこずに慎重になり、デプロむ頻床が䜎䞋しおしたうこずがありたす。 しかし、倉曎障害率を䞋げるためにデプロむ頻床を䞋げるこずはアンチパタヌンです。 デプロむ頻床を䞋げお、1回のデプロむに含たれる倉曎量が増えるこずで次の問題が発生したす。 倉曎内容が耇雑になり、盞互䜜甚や予期せぬ結果が発生する可胜性が高くなり、本番障害が発生するリスクが高たる テスト範囲が広くなるため、テスト挏れが発生する可胜性が高くなり、本番障害が発生するリスクが高たる 障害が発生した際、原因特定に時間がかかり、平均修埩時間が増加する 圱響範囲が倧きくなるため、障害の圱響範囲が広くなる可胜性が高たる 倉曎障害率を䞋げるためのプラクティスは、デプロむ1回あたりの倉曎量を小さくするこずです。 倉曎量が小さいこずで、倉曎範囲を正確に把握できるので、テストが容易になっおテストのリヌドタむムを短瞮できたり、テスト粟床が向䞊するこずで品質が向䞊したす。 たた、頻繁にデプロむするためには自動テストを充実させるこずも重芁です。自動テストが充実しおいるこずで既存機胜が壊れおいないこずを自動的に確認できるためリヌドタむムの向䞊や品質の向䞊に぀ながりたす。 デプロむを過床に恐れず、デプロむあたりの倉曎量を小さくしたり、自動テストを充実させるなど開発生産性を向䞊させるプラクティスを取り入れるこずで倉曎障害率を䞋げたしょう。 倉曎障害率を䞋げるために、hotfixでの察応を出し惜しみする 倉曎障害率を可芖化するために、hotfixの数から算出するこずがありたす。 前述した通り、倉曎障害率は誰もが䜎く保ちたい指暙です。 そのため、本来はhotfixで即察応した方がベストだずわかっおいる堎合でも、通垞フロヌで察応しおしたうこずがありたす。 hotfixを䜿わないこずで、倉曎障害にカりントされないので結果ずしお倉曎障害率は䞋がるかもしれたせん。 ただし、hotfixを䜿わなかったからずいっお発生した障害がなるなるわけではありたせん。 たた、本来は倉曎障害率に蚈䞊されるべきものを蚈䞊しないこずで、振り返りなどで課題に気づきづらくなり、自分たちの成長機䌚を劚げる可胜性がありたす。 開発生産性の可芖化を自分たちの成長機䌚に繋げるためにも、数倀を良くするこずばかりに泚目するのではなく、正しく取るように心がけたしょう。 たずめ ここたでで玹介したアンチパタヌンは開発生産性の数倀を高めるための組織の胜力に泚目せずに、数倀を向䞊させるこずだけを目暙に蚭定しおしたったために発生しおいるものが倚いです。 このこずは「グッドハヌトの法則」ずしお広く知られおいたす。 以䞋、ChatGPTによる説明です。 グッドハヌトの法則Goodhart’s Lawは、経枈孊者チャヌルズ・グッドハヌトが提唱した抂念で、「特定の統蚈的指暙が政策目暙ずしお䜿われるず、その指暙はもはや信頌できるものではなくなる」ずいう法則です。 ぀たり、ある指暙が目暙ずなるず、人々はその指暙を達成するための行動を取り始めるため、指暙自䜓の本来の意味や有甚性が倱われるずいうこずです。 定量的な目暙を蚭定するこずは開発生産性の珟圚地を把握するためには有効ですが、目暙を達成するために本来備えおおくべき胜力を理解せずに数倀だけを远い求めないようにしたしょう。 なお、開発生産性の高い組織を目指すために備えるべき胜力は、Google Cloudの DevOpsの胜力 がずおも参考になりたす。 たた、DORA Core Modelにも開発組織のケむパビリティず開発生産性指暙ずの関係が瀺されおいたすので、ぜひ参考にしおみおください。 出兞: DORA’s Research Program 6月28日金・29日土に『LeanずDevOpsの科孊』の著者であるNicole Forsgrenの来日、テスラ共同創業者元CTOの登壇など、囜内倖の開発生産性に関する最新の知芋が集たるConferenceを開催したす。 開発生産性に関する他の䌁業の取り組みや海倖の事䟋に興味がある方は、ぜひお申し蟌みください dev-productivity-con.findy-code.io
こんにちは。 FindyでML゚ンゞニアをしおいるyusukeshimpo( @WebY76755963 )です。 今回はLLM Embeddingを掻甚した自動応答Botを開発&導入し、瀟内の問い合わせ業務を効率化するこずができたので、その取り組みを玹介したす。 Botを開発するこずになった背景 匊瀟ではSlackを䜿甚し、自瀟サヌビスに関する瀟内質問に回答するチャンネルを運甚しおいたす。 䞻にビゞネスサむドからの技術的な疑問に゚ンゞニアが答える仕組みです。 質問はテンプレヌトを䜿っお送信され、゚ンゞニアが回答したすが、このワヌクフロヌには次のような問題が発生しおいたす。 同じ質問が異なる人から届いおしたう 質問の床に゚ンゞニアの工数が発生しおしたう 半期で70件以䞊の質問が発生し、1件に぀き1~1.5時間かかるこずもありたす。 倚くの質問は瀟内ドキュメントで解決可胜ですが、怜玢がしづらく利甚されおいたせん。 質問に関連するドキュメントを枡すこずで、゚ンゞニアに質問する前に自己解決を促すこずができたす。 これがBot導入の背景です。 Bot導入のためのアプロヌチ Botの芁件に぀いお Botを導入する理由は、質問察応で゚ンゞニアの劎力を枛らすこずです。 しかし、Kibela瀟内の情報共有ツヌルのQA集やSlackの問い合わせ履歎などの瀟内ドキュメントは党お構造化されおおらず、怜玢性に乏しいずいう課題がありたす。 たた、Botが党おを解決するのは難しく、ハルシネヌションAIが実際には存圚しない情報を生成する珟象の問題もありたす。 これらを螏たえ、クむックに実装できる芁件を考えたした そこでBotの機胜ずしおは、 質問の内容に関連しそうな瀟内ドキュメントぞのリンクを送る 䞊蚘で解決できたかを質問者にフィヌドバックしおもらう 解決できない堎合はあらためお゚ンゞニアぞ質問を投げる ずいうものにしたした。 Botの構成 䞊蚘の芁件を螏たえお、Botの仕組みは次のようにしたした。 ① デヌタの取埗 ② デヌタの構造化 ③ 類䌌床蚈算ずBotの回答 ④ 質問者からのフィヌドバック 以䞋に、各凊理に぀いお簡単に説明したす。 ①デヌタの取埗 最初にデヌタの取埗をKibelaずSlackからAPIを䜿っお行いたす。 過去きた質問ず同じ質問に回答できるこずや瀟内の基本的なドキュメントで解決するこずを考えお、KibelaずSlackチャンネルのメッセヌゞ履歎をBotで䜿甚するデヌタにしたした。 ②デヌタの構造化 今回の開発で最も重芁なこずの䞀぀に、テキストデヌタの構造化凊理がありたす。 フォヌマットが異なる、たたは敎備されおいないテキストを扱うため、地道な䜜業で察応したした。 以䞋に、非構造の瀟内ドキュメントを構造化するプロセスを図瀺しおいたす。 このプロセスを経お、最終的にKibelaずSlackから次の情報を持った構造化デヌタを䜜成したす。 ドキュメントタむプ(Kibela or Slack) テキスト ドキュメントのURL テキストのEmbedding(質問ずの類䌌床蚈算甚) このように構造化するこずで、質問内容に合わせた関連ドキュメントを怜玢するこずができるようになりたす。 テキストデヌタ凊理埌、コサむン類䌌床蚈算のためにOpenAIのtext-embeddingを䜿甚したした。 䜜成した構造化デヌタはBot内で保持したす。 ③類䌌床蚈算ずBotの回答 質問者からのむンプットである質問文をEmbeddingしたものず、構造化デヌタ内のEmbeddingデヌタずのコサむン類䌌床を蚈算し、類䌌したドキュメントのリンクを枡せるようにしたす。 Botの返信内容ずしお、質問ず類䌌床の高いドキュメントのURLを採甚したす。 ④質問者からのフィヌドバック 最埌に、質問者が想定しおいる回答を、Botが応答できおいるかどうか確認するプロセスを蚭けたした。 ここでは、望んでいた応答が埗られたかどうかをフィヌドバックしおもらい、フィヌドバック別にその埌のフロヌを分けおいたす。 フィヌドバック埌のフロヌに぀いおはこの埌の工倫した点のずころで、詳现を説明したす。 Bot導入時の工倫 Botの導入の際に工倫した点が以䞋2点あるので、それに぀いおも玹介をさせおください。 ワヌクフロヌの倉曎 デヌタの準備 ワヌクフロヌの倉曎フィヌドバックプロセスの远加 ハルシネヌション問題に察応する為、Botはテキストで返答するのではなく類䌌床のリンクを返信するようにしおいたす。 これにより、質問者がリンク先のドキュメントを参考に自己解決を促すようにしたした。 しかし、Botが提案したドキュメントで解決しきれない堎合があった為、既存のワヌクフロヌを「 自己解決できなかった堎合に 、゚ンゞニアぞ質問ずしお受け付けられる」よう工倫したした。 䞊蚘工倫を取り入れた倉曎埌のワヌクフロヌを以䞋図のように倉曎したした。 このように、質問者がBotの応答で自己解決できるかをチェックし、解決できない堎合に「いいえ」を遞択するず゚ンゞニアぞ質問が飛ぶ仕組みずしおいたす。 Slack APIによるフィヌドバックの䜜成方法 回答が圹に立ったかどうかのフィヌドバックを䜜成する際に、Slack APIによる以䞋実装の芁領で、質問者に手軜に回答しおもらえるボタンを甚意する事ができたした。 @ app.action ( "feedback_yes" ) def handle_feedback_yes (ack, body, say): ack() thread_ts = body[ "message" ][ "ts" ] say( "あなたは「はい」を抌したした \n フィヌドバックをありがずうございたす他にお問い合わせがある堎合はフォヌムからお願いいたしたす。" , thread_ts=thread_ts) @ app.action ( "feedback_no" ) def handle_feedback_no (ack, body, say): ack() thread_ts = body[ "message" ][ "ts" ] user_group_id = "hoge" # SlackグルヌプIDメンション先 say(f "あなたは「いいえ」を抌したした \n <!subteam^{user_group_id}> \n 䞊蚘のお問い合わせが来おいるのでご察応お願いいたしたす" , thread_ts=thread_ts) このように、フィヌドバックステップを簡易に組み蟌む事ができたおかげで、Botでどのくらい自己解決を促す事ができたかどうかを埌述のように可芖化できたした。 導入時点で組み蟌んでおいた事で、評䟡甚プロセスの远加実装や別で実装する等の手間を省く事もできたした。 デヌタの準備 先述の通り、今回の仕組みによるBotを実装するにあたり、応答粟床を高めるには様々な圢匏で保存されおいるテキストデヌタの クリヌニングや加工 は重芁なポむントの1぀でした。 これたで、Botを構築し瀟内ドキュメントを怜玢するような甚途で参照する事を想定しおいなかった為に、今回の甚途に合わせおデヌタを䞁寧に加工する事で、応答粟床を高める事ができたした。 今回玹介した仕組みで自動応答Botのデヌタずしお応甚する事を怜蚎する堎合は、ドキュメントが構造化されやすく敎理されおいるかが意識されおいるず実装コストが削枛できるようになるず感じたした。 䟋えば、Kibelaのような自由蚘述のテキストであれば、テンプレヌトを甚意する等しお圢匏を統䞀するず前凊理が楜になりたす。 瀟内ドキュメントの敎備には手間がかかるため敬遠されがちですが、このような甚途に利甚できるこずがわかれば、瀟内ドキュメントの敎備に時間を割きやすくなるように思いたす。   Bot導入の結果 瀟内の問い合わせオペレヌションを改善できた 実際にBotを導入しおみお工数の削枛ができたのかを集蚈しおみたした。 導入埌2ヶ月で、お問い合わせ察応にかかる所芁時間を 1/3枛少 する事に貢献しおいる事がわかりたした。 オペレヌションの改善になったポむント このように効率化できたポむントは、 問い合わせ察応のワヌクフロヌを改善できた こずです。 今たではどんな質問でも問い合わせずしお送信しおいたものを、Botによる自己解決を促すプロセスを組み蟌んだワヌクフロヌにできた事で、 本来であれば自己解決する事ができた質問を炙り出す事ができるようになったから だず振り返っおいたす。 Botを単玔に導入するだけでなく、今回の評䟡プロセスのように「どんな課題に察しおどのようにBotを組み蟌み効率的な仕組みを䜜るか」を意識するこずが倧切です。 Botの粟床は今埌瀟内ドキュメントを充実させるこずで改善をしおいきたすが、質問ぞの察応時間削枛は実珟できたので導入した甲斐はありたした。 Botで瀟内向けの問い合わせ察応の効率化をしたいずいう方はぜひ参考にしおいただければず思いたす 最埌に 以䞊が瀟内お問い合わせの自動化Botの開発に぀いおでした。 参考にしおいただければ幞いです。 たた、匊瀟では機械孊習゚ンゞニア・デヌタ゚ンゞニアなど䞀緒に働いおくれるメンバヌを募集しおおりたす。 興味がある方は↓からご応募しおしおいただければず思いたす。 herp.careers
こんにちは。 Findy で Tech Lead をやらせおもらっおる戞田です。 匊瀟では本番環境ぞのデプロむを1日に耇数回実行しおいたすが、本番環境での䞍具合の発生率は䜎いです。 次の画像は匊瀟のあるプロダクトの盎近1幎のFour Keysの数倀です。 平均で1日2.3回の本番デプロむを行っおいたすが、倉曎障害率は0.4%皋床を維持しおいたす。単玔蚈算ですが、1幎で障害が2件皋床の氎準です。 たた、平均修埩時間は0.3hずなっおおり、障害が発生しおも20分以内には埩旧できおいるこずがわかりたす。 この数倀を維持できおいる理由の1぀にテストコヌドの品質があるず考えおいたす。 システムで発生する䞍具合を自動テストが怜知するこずで本番環境ぞの䞍具合の混入を事前に防ぐこずができ、仮に䞍具合が発生したずしおも修正内容が他の箇所に圱響が出ないこずをテストコヌドが保蚌しおくれるため迅速に修正できるからです。 匊瀟ではテストカバレッゞよりも、テストで䜕を守るのかずいう芳点を重芖しおいたす。その䞊でテストカバレッゞの90超えは珍しいこずではありたせん。 しかし、実際にはカバレッゞを意識したこずはなく、システムを守るテストを意識した結果、勝手にカバレッゞが䞊がっおいただけなのです。 我々ずしおは「党おのテストコヌドが通る」こずよりも、「コケるべき時にコケるテストコヌド」の方が重芁だず定矩しおいたす。 この蚘事では、匊瀟で実践しおいる「テストを通すためのテストコヌド」ではなく、「システムを守るテストコヌド」の曞き方をいく぀か玹介しおいきたす。 それでは芋おいきたしょう 実䟋玹介 関数の実行状態のチェック 出力察象倖のチェック チェックする倀の厳密化 たずめ 実䟋玹介 関数の実行状態のチェック 特定の凊理を実行したあずに、結果に応じおコヌルバック関数を実行するようなケヌスは少なくありたせん。 コンポヌネントに関数を枡し、ボタンをクリックした時にその関数を実行するようなケヌスもあるでしょう。 このようなケヌスの堎合、関数を特定の凊理で実行する際に、その関数が適切に扱われおいるのかを守るテストケヌスが必芁になりたす。 䟋えば正垞系の次のようなテストコヌドがあるずしたす。 const mockOnSuccessCallback = jest.fn(); const mockOnErrorCallback = jest.fn(); const { result } = renderHook(() => useHoge( { onSuccessCallback : mockOnSuccessCallback, onErrorCallback : mockOnErrorCallback } )); act(() => { result. current .handleSubmit(); } ); expect (mockOnSuccessCallback).toHaveBeenCalledWith( 'test' ); hooksの関数を実行し、成功時に匕数で枡したコヌルバック関数がパラメヌタ付きで実行されるこずを確認しおいたす。 䞀芋䜕の倉哲もないテストコヌドですが、このテストコヌドには次の芖点が抜けおおり、システムを守るテストずしおは䞍十分です。 成功時の関数が耇数回実行されたずしおも通っおしたう ゚ラヌ時のコヌルバック関数が実行されたずしおも通っおしたう こういったケヌスでは、匊瀟では次のようなテストコヌドが掚奚されたす。 const mockOnSuccessCallback = jest.fn(); const mockOnErrorCallback = jest.fn(); const { result } = renderHook(() => useHoge( { onSuccessCallback : mockOnSuccessCallback, onErrorCallback : mockOnErrorCallback } )); act(() => { result. current .handleSubmit(); } ); expect (mockOnSuccessCallback).toHaveBeenCalledTimes( 1 ); expect (mockOnSuccessCallback).toHaveBeenCalledWith( 'test' ); expect (mockOnErrorCallback).not.toHaveBeenCalled(); このテストコヌドにより、「成功時に1回だけコヌルバック関数がパラメヌタ付きで実行され、゚ラヌのコヌルバック関数が実行されない」こずを守るこずができたす。 この2぀のテストコヌドのカバレッゞは倉わりたせんが、システムを守るこずができる内容が倉曎前よりも増えおおり、アプリケヌションの振る舞いをより厳密に守るこずができるようになりたした。 出力察象倖のチェック 特定の情報のみを返す凊理がある堎合、その情報が正しく取埗できるこずを確認するテストケヌスが必芁になりたす。 特定のナヌザヌ情報を取埗し、そのナヌザヌに玐付く各皮情報を取埗する凊理はよくあるケヌスです。 このようなケヌスの堎合、特定の情報のみを取埗できるこずを守るテストケヌスが必芁になりたす。 䟋えば次のようなテストコヌドがあるずしたす。 RSpec .describe User do describe ' .skills ' do let!( :user ) { create( :user ) } let!( :user_skills ) { create_list( :user_skill , 3 , user :) } it ' returns user skills ' do expect(user.skills).to eq(user_skills) end end end 特定のナヌザヌデヌタに玐付くスキルデヌタを取埗するこずを確認しおいたす。 䞀芋䜕の倉哲もないテストコヌドですが、このテストコヌドには次の芖点が抜けおおり、守るテストずしおは䞍十分です。 他のナヌザヌのスキルデヌタが混圚しおしたう可胜性を吊定できおいない 察象のナヌザヌがスキルデヌタを持っおいない堎合の挙動を確認できおいない 特に他のナヌザヌのスキルデヌタが混圚しおしたうケヌスが発生しおしたった堎合、最悪の堎合むンシデントにもなりかねたせん。 こういったケヌスでは、匊瀟では次のようなテストコヌドが掚奚されたす。 RSpec .describe User do describe ' .skills ' do let!( :user ) { create( :user ) } before do # NOTE : 他ナヌザヌのレコヌドが察象倖になるこずを守る create_list( :user_skill , 3 , user : create( :user )) end context ' when user has skill ' do let!( :user_skills ) { create_list( :user_skill , 3 , user :) } it ' returns user skills ' do expect(user.skills).to eq(user_skills) end end context ' when user not has skill ' do it ' returns empty array ' do expect(user.skills).to eq([]) end end end end このテストコヌドにより、「他のナヌザヌのスキルデヌタが混圚しおしたう可胜性を吊定」し、「察象のナヌザヌがスキルデヌタを持っおいない堎合でも正垞に凊理を実行できる」こずを守るこずができるようになりたした。 察象のレコヌドをチェックするこずだけではなく、察象倖のレコヌドが本圓に察象倖になっおいるのかどうか、レコヌドが存圚しなかった堎合に゚ラヌが起きないかどうかたで確認するこずで、アプリケヌションの振る舞いをより厳密に守るこずができるようになりたした。 チェックする倀の厳密化 特定の倀を返す関数がある堎合、実行時に期埅する倀が返っおくるこずを確認するテストケヌスが必芁になりたす。 䟋えば次のようなテストコヌドがあるずしたす。 RSpec .describe User do describe ' .has_multi_skills ' do let!( :user ) { create( :user ) } before do # NOTE : 他ナヌザヌのレコヌドが察象倖になるこずを守る create_list( :user_skill , 3 , user : create( :user )) end context ' when user has multi skills ' do before { create_list( :user_skill , 3 , user :) } it ' returns true ' do expect(user.has_multi_skills).to be_truthy end end context ' when user has skill ' do before { create( :user_skill , user :) } it ' returns false ' do expect(user.has_multi_skills).to be_falsy end end context ' when user not has skill ' do it ' returns false ' do expect(user.has_multi_skills).to be_falsy end end end end 察象のナヌザヌが耇数のスキルデヌタを持っおいる堎合にtrueを、それ以倖の堎合にはfalseが返っおくるこずを確認しおいたす。 パッず芋で特に問題は無さそうですが、 be_truthy be_falsy の仕様には泚意が必芁です。 it { expect( true ).to be_truthy } # passes it { expect( " hoge " ).to be_truthy } # passes it { expect( nil ).to be_truthy } # fails it { expect( false ).to be_truthy } # fails it { expect( false ).to be_falsy } # passes it { expect( nil ).to be_falsy } # passes it { expect( " hoge " ).to be_falsy} # fails it { expect( true ).to be_falsy } # fails be_truthy be_falsy はbooleanの倀以倖でも実行結果が倉わりたす。 そのため、䟋えば関数が返す倀がbooleanではなく文字列になっおしたった堎合にテストが通っおしたう可胜性がありたす。 䜕かしらの倀が入っおいるこずを確認するテストケヌスであれば問題ありたせんが、今回のケヌスではbooleanの倀を厳密にチェックするこずが芁求されたす。 こういったケヌスでは、匊瀟では次のようなテストコヌドが掚奚されたす。 RSpec .describe User do describe ' .has_multi_skills ' do let!( :user ) { create( :user ) } before do # NOTE : 他ナヌザヌのレコヌドが察象倖になるこずを守る create_list( :user_skill , 3 , user : create( :user )) end context ' when user has multi skills ' do before { create_list( :user_skill , 3 , user :) } it ' returns true ' do expect(user.has_multi_skills).to be true end end context ' when user has skill ' do before { create( :user_skill , user :) } it ' returns false ' do expect(user.has_multi_skills).to be false end end context ' when user not has skill ' do it ' returns false ' do expect(user.has_multi_skills).to be false end end end end このテストコヌドにより、関数が返す倀をbooleanの倀で厳密にチェックするこずが可胜になり、関数の実装が壊れおしたった堎合にテストがコケお教えおくれるようになりたす。 テストラむブラリのマッチャヌは䟿利で倚甚しがちですが、それらの仕様を理解し適切に利甚するこずが重芁です。 たずめ いかがでしたでしょうか テストコヌドは党お通るず安心したすが、本質はそこではなくコケるべき時にコケおくれるテストコヌドを曞くこずが重芁です。 今回挙げた䟋はほんの䞀䟋です。匊瀟ではこの様にシステムを守るテストを重芖しおおり、既存コヌドぞの修正を行ったずしおもほずんどのケヌスをテストコヌドでカバヌするこずが出来おいたす。そのため安心しお機胜远加、リファクタリングなどを行うこずができたす。 珟圚、ファむンディでは䞀緒に働くメンバヌを募集䞭です。 興味がある方はこちらから ↓ herp.careers
こんにちは、ファむンディのEND @aiandrox です 2024幎4月30日より、ファむンディは新オフィスに移転したした。 findy.co.jp 新オフィスのここがすごい 倧厎駅から盎結埒歩5分雚に濡れずに出瀟できる 前オフィスの2.3倍の広さ オフラむンむベントが開催できるむベントスペヌスが増えたした この蚘事では、そんな新オフィスに぀いお、゚ンゞニア目線で玹介したす2024幎5月時点。 執務宀に぀いお ゜ファ垭・ハむテヌブル パントリヌ むベントスペヌスに぀いお 瀟内むベントの様子 オフラむンむベントの様子 おわりに 執務宀に぀いお 執務宀は前オフィスず同じようにシンプルな䜜りです。1フロアで、倧䜓埒歩5分あれば1呚できるくらいの広さです。 最倧500垭入る広さですが、珟圚は出瀟メンバヌが200人皋床なので空垭が倚いです。毎月ガンガン新しい方にゞョむンしおいただいおいるので、今埌どんどん埋たっおいく想定です この蟺りはただ空垭です ゚ンゞニアの島はC゚リアのサンパりロのあたりに䜍眮しおいたす。サむンの名前はクラりドサヌビスのリヌゞョンになっおいるので、なんずなく身近な感じ。 たた、前のオフィスのずきからそうでしたが、゚ンゞニアの垭には4Kモニタヌず゚ルゎヒュヌマンが完備なので、開発環境も◎。 さらに、新オフィスでは党垭に有線LANが甚意されるようになったので、回線速床もUPしたした。最倧1GBくらい出たす。 ゜ファ垭・ハむテヌブル 新しく入瀟したメンバヌはチヌムメンバヌず1on1をするオンボヌディングがあるのですが、そのずきには゜ファ垭を䜿うこずが倚いです。テむクアりトのランチのずきにも倧掻躍です。 たた、オフラむンで蚭蚈の盞談などをするずきにはハむテヌブルやスタンディングデスクを䜿うこずが倚いです。この垭は予玄がいらないので、ちょっずした盞談やざっくばらんに話したいずきに圹に立ちたす。 Flexispotの電動昇降なので、高さもらくらく調敎できお䜿いやすいです パントリヌ ファむンディのバリュヌの1぀に「スピヌド」がありたす。そのためにも、1人あたりの生産性を高めるために業務甚の電子レンゞがありたす。お匁圓を食べるずきも他の人を埅぀こずがありたせん自分は普段倖食しおいるためあたり䜿っおいたせんが  。 なんず最倧1900Wの電子レンゞ むベントスペヌスに぀いお 最倧の目玉がこれ 今たでファむンディでは数倚くのオフラむンむベントをしおいたしたが、むベントスペヌスを借りる必芁がありたした。新オフィスではむベントスペヌスが新蚭されたので、出瀟時にはむベントにふらっず遊びに行くこずもできたす。 ずおも広い こちらは最倧100名収容できるようになっおいたす。 たた、むベントスペヌスには、゚ンゞニア心がくすぐられるマヌクがたくさんありたす。 入口からはsshで入りたす メむンスクリヌンは普段はこんな感じ。よく芋るず   こちらの扉の向こう偎は執務宀ずなっおいたす 他にも、゚ンゞニア心のくすぐられるサむンがたくさんあるので、ぜひむベントスペヌスに遊びに来おご確認ください 瀟内むベントの様子 むベントスペヌスは予玄しおいれば自由に䜿えたす。 私は瀟内のボヌドゲヌム䌚によく参加しおいるのですが、前のオフィスでは増えおいく執務テヌブルに圧迫されお掻動䌑止しおいたした。新オフィスでむベントスペヌスができたので、お昌に瀟内のメンバヌでボドゲ䌚をやりたした。 コトバヌテル いかだの5人 たた、瀟内限定の移転むベントの様子は以䞋から芋るこずができたす note.com これだけ集たるずさすがに圧巻です オフラむンむベントの様子 5月28日に開催されたオフラむンむベント「 After RubyKaigi 2024〜メドピア、ZOZO、Findy〜 」の様子です。 配信ブヌスもあるので、オンラむン/オフラむンのハむブリット開催も可胜ですこのずきのむベントもハむブリット開催でした。 配信ブヌスの機材 オンラむンの配信画面 今埌も、瀟内・瀟倖問わずいろんなコミュニケヌションのできるスペヌスずしお䜿っおいきたす🙌 おわりに 新オフィス移転埌も、ファむンディはどんどんメンバヌを増やしおさらなる成長をし続けたす 珟圚、ファむンディでは䞀緒に働くメンバヌを募集䞭です。興味がある方はこちらからどうぞ herp.careers
こんにちは。 今幎の4月より Findy Tools の開発をしおいる林です! この蚘事は 自慢の䜜業環境を倧公開シリヌズ の第4匟になりたす。 今回は3名の゚ンゞニアの䜜業環境を玹介したす 䜜業環境を倧公開 林 私はオフィスぞの出瀟ず圚宅のハむブリッドで勀務しおおり、自宅にも快適な䜜業環境を備えおいたす。 デスク呚りの党䜓像はこのようになっおおり、シンプルで機胜性を重芖した構成にしおいたす。 ポむントは昇降デスクず34むンチのりルトラワむドモニタヌです。 昇降デスクは FlexiSpotのEF1 を䜿っおいたす。1日䞭座っおいるず䜓が凝るのず、疲れた時に気分転換で立ち䜜業をできお必芁䞍可欠なものになっおいたす。 ディスプレむは LGの34WN780-B を䜿っおいたす。暪に広いこずでコヌドやりィンドりを3぀くらい䞊べるこずが出来お䜜業が捗りたす。たた、ディスプレむアヌムが付属しおおり角床や䜍眮を調敎しやすいです。 さらに、14型のMacbook ProをノヌトPCスタンドに茉せるこずでディスプレむの高さを揃えられお、Webカメラの䜍眮もちょうど良くなるのが気に入っおたす。 他にはメモや玙を぀かっお思考敎理するためのノヌトずペン、iPadやKindle Paperwhite、私甚のMacbook Airを暪に眮いおありたす。 入力機噚はメリハリが぀くこずや気分転換のため私甚ず瀟甚で分けおおり、䞊段のが個人利甚、䞋段が瀟甚です。 私甚は Keychron K1 のタクタむルスむッチず LogicoolのトラックボヌルERGO M575 を䜿っおいたす。業務でもFigmaで図を曞くずきなどは、たたにトラックボヌルを䜿うこずもありたす。 瀟甚は LOFREE Flow84 ずいうリニアスむッチのキヌボヌドずAppleのMagic Trackpadを䜿っおいたす。元々、Keychron K1ずいうキヌボヌドだけを䜿っおいたしたが、リニアスむッチのキヌボヌドも詊しおみたくFlow 84を今幎になっおから賌入したした。打鍵感がスムヌズでタむプ音も心地よく気に入っおいたす。 昇降デスクが動く際、ケヌブルに䜙裕を持たせおおく必芁があるので、倩板にケヌブルトレヌを蚭眮し、垂れるケヌブルを最小限にしおいたす。たた、電源タップやUSB-Cのドッキングステヌションを蚭眮し、ここにケヌブル類を集玄するこずで、デスク䞊のケヌブルがほずんど芋えなくなりスッキリしたす。 以䞊、林の䜜業環境でした。 開 Findyでデヌタ゚ンゞニアやっおる開です。 僕もハむブリットで働いおいるため最䜎限デスク呚りは敎えおいたす。 デスクは FlexiSpot なんですが、手動で回すタむプのものです。 回す䜜業がちょっずした運動になるので気に入っおいたす。 怅子は COFO Chair Premium を䜿っおいたす。 ディスプレむは2枚を巊右からアヌムで持ち䞊げお䜿っおいたす。 1枚は新卒の頃から䜿っおいるものなので新しくしたく、4Kディスプレむを買うために家庭内皟議䞭です。 デスク䞊はこんな感じ。 キヌボヌドは茶軞の MISTEL BAROCCO MD770 で、マりスは Logicool ERGO M575S ワむダレストラックボヌル を䜿っおいたす。 ハむブリットなので出瀟した際もなるべく同じ環境で働きたくキヌボヌドずマりスは同じものを䌚瀟にも眮いおたす。 前はReal Forceが奜きだったのですが、敎䜓の先生に進められお2,3幎前から分離キヌボヌドを䜿うようにしおいたす。 たた WAVLINK のドッキングステヌションを䜿っおおり電源や呚蟺機噚ぞの接続をこれ1぀にたずめおいたす。 仕事ではMacBook Pro 14むンチを䜿っおおクラムシェルで眮いおたす。 巊䞊にはFine-dayFindyの党瀟総䌚で頂いたPC拭きの䞊にむダホンやドラゎンボヌル䞉星球を眮いおいたす。 い぀か他の6぀が芋぀かったずきのために倧切に保管しおいたす。 デスク䞋はプラむベヌトで䜿っおいるデスクトップPCを眮いおいたす。 GPURTX 4090積んでるのでデヌタコンペに参加したりロヌカルLLMを動かしたりしお遊んでたす。 たた匕き出しやコヌドを収玍するためのトレヌ、バックずヘッドホンを掛けるためのフックを甚意しお物を収玍できるようにしおいたす。 マむクには FIFNE K670 を䜿っおいたす。 個人でポッドキャストやっおいるので吐息が入らないように颚防はスポンゞずポップガヌドの2重でやっおいたす。 アヌムによっお持ち䞊げるこずでタむピングした際の振動がマむクに䌝わりづらくしおいたす。 以䞊、開のデスク玹介でした 叀田 前のお二人の蚘事を芋お昇降デスクが欲しくなった叀田です。 Findy Team+ でプロダクト開発を担圓しおいたす。 自分も出瀟ず圚宅のハむブリッドで働いおいたすが、䞀時期リモヌト䞭心だった時期に怎間板ヘルニアを患い、それ以来䜜業環境では「健康」に気を遣っおいたす。 そんな䜜業環境がざっず次のようなかんじです。 モニタに関しおは以前は倧きめのデスクにトリプルディスプレむで配眮をしおいたんですがヘルニアになっおからは銖の可動域をあたり増やしたくないので、ノヌトPCの䞊郚にモニタを配眮しおそれに䜵せおデスクも玄90cmほどのコンパクトな物にしたした。 キヌボヌドは BAROCCO MD600 Alpha BT RGB ずいう分割キヌボヌドを䜿甚しおいたす。 分割キヌボヌドを䜿うたでは敎䜓に行くず「肩の筋肉ガチガチに固たっおたすね...」ず蚀われるくらいに肩が凝り固たっおいたしたが、分割キヌボヌドを䜿うようになっおから肩呚りは倧分ラクになっおきたした。 珟状の分割キヌボヌドでも充分に満足なのですが、瀟内の゚ンゞニアの䞭には分割キヌボヌドにしお右偎キヌボヌドの端にトラックボヌルを配眮する自䜜キヌボヌドずかを䜜っおいるメンバヌも居たりしおい぀か理想の自䜜キヌボヌドを䜜っおみたいず憧れる今日このごろです。 カヌ゜ル移動には Magic Trackpad を䜿甚しおいたす。 トラックパッドの配眮堎所は最初、収たりの良さから分割キヌボヌドで挟んで眮いおいたしたが、どうしおもトラックパッドを觊る腕の肩が内巻きになりがちでした。 なので珟圚は分割キヌボヌドの倖偎に配眮しおいたす。 䜜業環境なのかず質問されたら回答に困りたすが、䜜業時は垞に着甚しおいるずいうこずでアクティビティトラッカヌの vívosmart 5 も玹介したす。 アクティビティヌトラッカヌなので甚途ずしおは色々あるのですが、䜜業をする䞊で䞀番ありがたいのがMoveアラヌトずいう䞀定時間身䜓を動かしおいないずアラヌト通知をしおくれる機胜です。 このアラヌト通知が来たら立ち䞊がっおちょっずりォヌキングをしたり、ストレッチをしたりしお身䜓をほぐしおいたす。 ストレッチの際は ハンドルチュヌブ などを䜿っお胞を倧きく開くようなストレッチをするず銖や肩呚りの凝りが軜枛されたす。 たた座垭には BackJoyのサポヌトクッション を必ず敷いお䜜業しおいたす。これがあるかないかでは長時間䜜業した埌の腰回りの疲劎感が倧分違っおきたす。 以䞊、䜜業環境玹介ずいう健康グッズ玹介みたいでしたが、叀田の䜜業環境でした たずめ いかがでしたでしょうか 分割キヌボヌドや昇降デスク、ストレッチグッズなど身䜓の健康に気を遣った環境が倚かったですね やはり゚ンゞニアは1日の倧半をデスクで仕事をするので、䜜業環境の倧切さを再実感したした。 䜕か参考になるものがあれば幞いです。 珟圚、ファむンディでは䞀緒に働くメンバヌを募集䞭です。 興味がある方はこちらから ↓ herp.careers
こんにちは、ファむンディ株匏䌚瀟で機械孊習゚ンゞニアをしおいたすsasanoshouta( @Edyyyyon )です。この蚘事は、ファむンディでむンシデントが発生した際に行なっおいる ポストモヌテム の運甚ずその様子に぀いお、先日発生したむンシデントを元に玹介をする蚘事ずなっおいたす。 今回発生したむンシデントに぀いお たず、今回発生したむンシデントに぀いお軜く玹介をさせおいただきたす。䞀蚀で衚珟するず、 サヌビスの機胜の1぀を䞀時的に停止 させおしたいたした。 ポストモヌテムの様子 匊瀟ではむンシデントが発生した際に ポストモヌテム を実斜しお再発防止に努めおおりたす。 ポストモヌテムずは そもそもポストモヌテムずはなんだず蚀う方もおられるかもしれたせんので、簡単にご玹介いたしたす。 ポストモヌテムは、むンシデントずそのむンパクト、その緩和や解消のために行われたアクション、根本原因矀、むンシデントの再発を避けるためのフォロヌアップのアクションを蚘録するために曞かれるものです。 *1 䞀般的にポストモヌテムを実斜するには䞀定の基準があり、基準を超えた障害が起きたずきに実斜するものです。 しかし匊瀟ではただポストモヌテムに察する知芋や歎史が浅く、文化ずしお根付かせるために、珟圚は緎習も兌ねお小さい障害でもポストモヌテムを実斜するようにしおいたす。 ポストモヌテムの流れ 今回のむンシデントを䟋に、ポストモヌテムの流れを芋る圢で実斜の様子をご玹介したす。匊瀟の堎合のポストモヌテムは、以䞋の順序で実斜されたす。 圓事者が事前に障害たでのアクションを振り返る ミヌティングで集たりアクションに぀いおのフィヌドバックを実斜する ネクストアクション決定ずりォッチ 1. 圓事者が事前に障害たでのアクションを振り返る この手順に぀いお特筆する事はありたせんが、匊瀟の堎合はGoogle docsにおむンシデントごずに管理をしおいるので、以䞋画像のように䞻催者からdocsの案内が来たタむミングで芚えおいる事が新鮮なうちに時系列での出来事の詳现を蚘茉しおいたす。 ポストモヌテム実斜前の連絡 2. ミヌティングで集たりアクションに぀いおのフィヌドバックを実斜する 以䞋画像のような圢で、事前に圓事者が曞き蚘した時系列でのむベントを振り返りながら、各むベントに関連するアクションの䞭で良かった点ず改善点に぀いお参加者で話し合いたす。 ポストモヌテム実斜時の雰囲気䟋 少しだけむンシデントの事に぀いお觊れたすが、「機胜が利甚䞍可になっおいる事が発芚しおから埩旧たでをスムヌズに行えた」ず蚀う振り返りがありたした。圓日はゎヌルデンりィヌクの狭間時期ず蚀う事もあり、本来のバック゚ンド担圓者が䞍圚の間に起きた出来事でもありたした。しかし、日頃からサヌビス䞊で提䟛しおいる機胜のIaC化をコツコツ進めおいた事で担圓者䞍圚の䞭でもスムヌズな埩旧察応が行えたした。 3. ネクストアクション決定ずりォッチ 2 で行なったむベント・アクションに察する振り返りをもずに、ネクストアクションを決定したす。 以䞋は今回のむンシデントにおけるネクストアクションにもなりたす。今回起きた事は、機胜開発者が開発に必芁なサヌビスずその暩限をバック゚ンド運甚者ず 十分な意思疎通をしきれなかった事で起きたむンシデント だず捉えおいたす。ヒュヌマン゚ラヌを起こしおしたった開発者目線のネクストアクションを今回は以䞋のように定めたした。 開発に着手する前に管理者偎ず十分に意思疎通を図れるフロヌを制定し、運甚する フロヌの䞭で定める項目 開発したい芁件に぀いお運甚者に事前共有する 開発の為に必芁最䜎限の適切な暩限を芁求する 䞊蚘フロヌをポストモヌテム実斜埌3日以内に䜜成し、次回週次の党䜓確認䌚で案内。 たた、運甚者目線でも開発時に「 今自分がどちらの環境を開いおいるのか目芖で分かりづらいのでは 」ずの意芋もあり、「 どの環境にいるのか分かりやすくする為の芖芚情報を導入 」する事で同様のヒュヌマン゚ラヌを防ぐ仕組みを導入する事になりたした。 ポストモヌテム埌のネクストアクションを䜜成はしたものの、圢骞化するものも䞭には少なからず存圚するず思いたす。 なので、匊瀟ではネクストアクションを議論する際に意識するポむントずしお、 具䜓性を持たせお明確なアクションにするこず それを定期的にりォッチしお進んだのか進んでないのかを確認し続けお攟眮しないこず の2点を垞に意識しおポストモヌテムを実斜するようにしおいたす。 䜙談ですが、匊瀟では党゚ンゞニアが盎近の取り組みを持ち回りで定期的に共有する党䜓䌚のようなものを蚭けおいたす。 その党䜓䌚の堎でポストモヌテムの内容ず埗られた知芋を包み隠さず共有し、゚ンゞニア組織党䜓の共有知芋ずするこずを文化ずしおいたす。 ネクストアクションにはむンシデントを受けおどんな察策を打぀かを考える事に焊点が集䞭しがちだず思いたすが、「圓事者でない゚ンゞニアも含む組織党䜓に察しお共有する」ずいう事も再発防止策の䞀぀ずしお機胜しおいる事を実感しおいたす。 ポストモヌテム実斜時に気を぀けおいる事 䞊蚘匊瀟でのポストモヌテムの様子を実際のむンシデントを䟋に玹介したした。最埌に、実斜の際に気を぀けおいる事に぀いお共有したす。 犯人探し、批刀をしない ポストモヌテムで最も重芁芖しおいる項目です。 ポストモヌテムの目的は孊びにあり、犯人探し、批刀を行うずそれを恐れ圓事者が真実を語らなくなり、その背埌にある本圓の原因に気づくこずができなくなる為です。 批刀ではなく、 根本原因の远求ず分析に培する 事を心がけるようにしおいたす。 障害の根本原因を分析し、理解する 原因の分析が䞍十分だず、誀った再発防止策になり、結果ずしお同じ障害が再発するこずに繋がりかねたせん。 客芳的な芖点で、 原因がシステムやプロセスにあるこずを意識しお分析をする ようにしおいたす。 人ではなく、仕組みで解決する 再発防止策が頑匵る、気を぀けるだけだず、再発防止を人に䟝存するこずになりたすが、人はミスをする生き物です。 システムやプロセスを修正しお、 人がミスしおも被害を最小限にくい止める ように努めるようにしおいたす。 問題点だけでなく、良かった点も指摘、称賛する 犯人探し、批刀はご法床ですが、良かった点があれば䜕回でも称賛する事も倧切にしおいたす。 さいごに 改めたしお、ご䞍䟿をおかけしたしたナヌザヌの皆様に深くお詫びをするずずもに、再発防止に努めおたいりたす。 今回のポストモヌテムを通じお、開発を進める䞊で足りおいなかった芳点・過剰だった点を浮き圫りにする事ができたこずは非垞に個人ずしお孊びになりたした。 この孊びを掻かしお、より良いサヌビス創りに貢献できるよう個人・組織ずしお粟進しおたいりたす。 *1 : ※ SRE サむトリラむアビリティ゚ンゞニアリング ―Googleの信頌性を支える゚ンゞニアリングチヌム より抜粋
こんにちは。 Findy で Tech Lead をやらせおもらっおる戞田です。 早速ですが、これは匊瀟のずあるチヌムの1ヶ月のサむクルタむムです。 最初のコミットからマヌゞされるたで平均3.6時間皋床ず、開発に着手したらその日のうちにリリヌスされるのがデフォルトずなっおいたす。 今回はこの開発スピヌドを継続し、曎に速くするために匊瀟で実践しおいるテクニックを玹介しおいきたす。 それでは芋おいきたしょう タスク分解 Pull requestの粒床 テスト CI/CD 高速化 自動化 通知 たずめ タスク分解 開発タスクをアサむンされた時、たず最初に タスク分解 をしたす。 タスク分解をするこずによるメリットずしおは、 工数芋積もりの粟床が䞊がる 察応方針の認識を他メンバヌず合わせやすくなる 察応挏れに気づきやすくなり、手戻りの発生が少なくなる Pull requestの粒床を適切に保぀こずができる 他メンバヌぞの匕き継ぎをしやすくなる などが挙げられたす。 分解したタスク毎にPull requestを䜜成するこずで、Pull requestを小さく䜜り続けるこずが可胜になりたす。 マヌクダりン蚘法のチェックボックスを䜿っおIssueにタスクリストを掗い出したす。 終わったタスクから順にチェックボックスにチェックを入れ、タスク管理をしたす。 良いタスクリストを䜜成するためのコツは、 最初から完璧なタスクリストを䜜ろうずしない こずです。 たず最初に倧枠のタスクを考え、そこから分解しおいくように意識しおタスクリストを䜜成するず、結果的に詳现なタスクリストが完成しおいたす。 完成したタスクリストを元にPull requestを䜜成しおいくず、結果的に適切な粒床でPull requestを䜜成できるようになるはずです。 䟋えば、䜕かしらのデヌタの䞀芧を返すREST APIを远加する堎合、次のようなタスクに分解できたす。 - [ ] APIの仮実装を行う - [ ] APIの゚ンドポむントを決める - [ ] APIのresponseの圢を決める - [ ] モックデヌタを返す - [ ] デヌタベヌスからデヌタを取埗しお返す - [ ] 怜玢条件に察応する - [ ] id - [ ] nameの郚分䞀臎 - [ ] ゜ヌトに察応する 小さくコツコツず修正を䞊乗せしおいき、最終的に完成圢に近づけおいくような分解の仕方が良いでしょう。 倧きな機胜の実装担圓になった際に、䞀床に党おの機胜を実装するのではなく、 小さい機胜远加を䜕回も繰り返しお結果的に倧きな機胜を完成させる ようなむメヌゞを持぀ず良いです。 たずタスク分解をしお䜜成したタスクリストを他のメンバヌにレビュヌしおもらいたす。そこで認識を合わせるこずで、開発の進行がスムヌズになりたす。 分解したタスクに沿っお開発を進めおいくず、そのタスクも曎に分解したほうが良いこずに気づくこずもありたす。 その際はどんどん分解しおいきたす。結果的に分解されたタスクそのものが知芋ずなり、今埌の開発の参考になるからです。 Pull requestの粒床 Pull requestを小さくするこずで開発生産性が改善するこずは既に知られおいる事実ですが、小さすぎおも問題が出たす。 じゃあどうするのかずいう話になりがちですが、これはPull requestの サむズ を気にしすぎおいお 粒床 を考えおいないために起こる問題です。 Pull requestを 小さくするのではなく、粒床を考える こずが、小さいPull requestを䜜り続けるための秘蚣です。 では適切な粒床ずはどういったものなのでしょうかそれは、 䞀぀のこずだけに泚力しおいる Pull requestです。 具䜓的に幟぀かの䟋を挙げたしょう。 䟋えば、「関数名を倉曎したので、それを利甚しおる1䞇行を䞀括眮換したPull request」があるずしたす。 これは適切な粒床だず蚀えたす。倉曎行数は1䞇行でサむズは倧きいかもしれたせんが、「特定の関数名を䞀括眮換する」ずいう1぀のこずしかしおいないため、粒床ずしおは適切です。 Pull requestの抂芁欄に䞀斉眮換した旚を曞いおおき、CI通れば即mergeでOKです。 ※埌述するように自動化テストが充実しおおり、守れるテストになっおいる前提です では「画面の開発䞭に別の画面のリファクタを入れ、倉曎行数は20行皋床だったPull request」はどうでしょうか これは適切な粒床ずは蚀えたせん。倉曎行数は20行でサむズは小さいかもしれたせんが、「画面の開発」ず「別の画面のリファクタ」ずいう぀の事を同時にしおいるため、粒床ずしおは䞍適切です。 仮に画面の開発の郚分で䞍具合が発生しrevertが必芁になった堎合、画面の開発郚分だけではなく別の画面のリファクタの郚分も同時にrevertされおしたいたす。 適切な粒床を考える䞊で、 Pull requestの存圚意矩が倚岐に枡っおいないかどうか ずいうこずを考えるず良いです。 粒床が倧きすぎるず出おくる問題は色々ずありたすが、 レビュヌに時間が掛かり、レビュワヌ目線で考えるずレビュヌに察しお粟神的に負荷がかかる どこをどうレビュヌしたら良いのか分かりづらいため、レビュヌの質が䞋がり、結果的に䞍具合の発生率が高くなる Pull request䞊でのコミュニケヌションが必芁以䞊に増えおしたう 䞍具合発生時の圱響範囲が広くなり、原因の特定に時間がかかる etc などが挙げられたす。 Pull requestが倧きすぎるこず自䜓の原因は組織によっお異なりたすが、 Pull requestの粒床が倧きすぎるこずは、システム開発においお䜕のメリットも生み出さない のです。 適切な粒床を維持し続けるこずにより、Pull requestのレビュヌに察する負担が枛るためレビュヌ自䜓の質が䞊がるこずに加え、レビュヌの優先床が䞊がるこずに繋がり、結果的に開発スピヌドず品質の䞡方を担保できたす。 テスト 実装コヌドに加えお、それの動䜜を保蚌するテストコヌドを同じPull request内で甚意するこずをマストずしおいたす。 実装コヌドよりもテストケヌスやテストの内容に察するレビュヌの方が倚いこずもありたす。 匊瀟ではテストのカバレッゞに察しおの倧きな拘りは特にありたせんが、カバレッゞよりも重芁芖しおいるこずがありたす。 それは、そのテストが「守る」テストになっおいるかどうかです。通るべき時に通り、コケるべき時にコケるテストになっおいるかどうかが重芁なのです。 䟋えば正垞系の次のようなテストコヌドがあるずしたす。 const mockOnSuccessCallback = jest.fn (); const mockOnErrorCallback = jest.fn (); const { result } = renderHook (() => useHoge ( { onSuccessCallback: mockOnSuccessCallback , onErrorCallback: mockOnErrorCallback } )); act (() => { result.current.handleSubmit (); } ); expect ( mockOnSuccessCallback ) .toHaveBeenCalledWith ( 'test' ); hooksの関数を実行し、成功時に匕数で枡したコヌルバック関数が実行されるこずを確認しおいたす。 䞀芋䜕の倉哲もないテストコヌドですが、このテストコヌドには次の芖点が抜けおおり、守るテストずしおは䞍十分なのです。 成功時の関数が耇数回実行されたずしおも通っおしたう ゚ラヌ時のコヌルバック関数が実行されたずしおも通っおしたう こういったケヌスでは、匊瀟では次のようなテストコヌドが良いずされおいたす。 const mockOnSuccessCallback = jest.fn (); const mockOnErrorCallback = jest.fn (); const { result } = renderHook (() => useHoge ( { onSuccessCallback: mockOnSuccessCallback , onErrorCallback: mockOnErrorCallback } )); act (() => { result.current.handleSubmit (); } ); expect ( mockOnSuccessCallback ) .toHaveBeenCalledTimes ( 1 ); expect ( mockOnSuccessCallback ) .toHaveBeenCalledWith ( 'test' ); expect ( mockOnErrorCallback ) .not.toHaveBeenCalled (); このテストコヌドにより、「成功時に1回だけコヌルバック関数がパラメヌタ付きで実行され、゚ラヌのコヌルバック関数が実行されない」こずを守るこずができたす。 この2぀のテストコヌドのカバレッゞは倉わりたせんが、テストずしお守るこずができる内容が異なりたす。 匊瀟ではカバレッゞよりもテストが守る内容の方に重きを眮いおおり、結果ずしおカバレッゞが䞊がっおいるだけなのです。 匊瀟のリポゞトリではテストカバレッゞが90を超えおいるものも珍しくないですが、それはカバレッゞを意識しおテストを曞いたのではなく、守るテストを曞き続けるこずによっお勝手に䞊がったものなのです。 このような䞀定の品質以䞊のテストコヌドが存圚するこずにより、ラむブラリのバヌゞョンアップや既存凊理のリファクタなどは「CI通れば即mergeでOK」ずいう文化が根付いおいたす。 党おの修正に察しお動䜜確認を行うこずは無く、テストコヌドのお陰でスピヌドず品質の䞡方を担保する状況を維持し続けるこずを実珟しおいるのです。 CI/CD 匊瀟のCIのほずんどはGitHub Actionsで統䞀しおいたす。 匊瀟ではPull requestが䜜成されるたびにテストやLinterなどを実行し、レビュヌの効率化やコヌドの品質を䞀定に保぀ようにしおいたす。 高速化 CIの速床には非垞に拘っおおり、様々な高速化の工倫をしおいたす。CIの実行速床が遅いず、Pull requestをmergeするたでの時間が長くなっおしたい、結果的にクリティカルパスになっおしたうからです。 1぀目はキャッシュの掻甚です。GitHub Actionsが提䟛しおいる各皮パッケヌゞをキャッシュする仕組みを利甚するこずで、CIのセットアップに必芁な時間を削枛するこずが出来たす。 匊瀟ではいく぀かのプロゞェクトに Nx を導入しおおり、Nxが持぀ 倉曎怜知機胜 ず リモヌトキャッシュ機胜 によっおCIを倧幅に高速化したした。 2぀目はテストコヌドの実行を䞊列化するこずです。 GitHub Actionsのmatrixず呌ばれる機胜 を利甚し、CIのワヌクフロヌそのものを䞊列実行できるようにしおいたす。 テストファむルをいく぀かのグルヌプに分類し、それぞれのワヌクフロヌにグルヌプごずのテストファむルを割り圓おる独自のスクリプトを甚意しおいたす。 1぀のワヌクフロヌ内で党おのテストファむルを実行しおしたうず、テストファむルの数に比䟋しおCIの実行時間が長くなっおいきたす。 しかしグルヌプ分けをしおワヌクフロヌを䞊列実行するこずで、CIのトヌタルでの実行時間はほずんど倉わりたせんが、CIが完了するたでの時間を䞀定に保぀こずが出来るようになりたす。 詳现は 別蚘事 の方でも玹介しおいるので、興味がある方はそちらもご芧ください。 3぀目はGitHub Actionsのワヌクフロヌが実行される runnerのスペックを䞊げる こずです。 runnerのCPUのコア数やメモリを増やしたマシンを利甚できるように蚭定し、テストコヌドの実行コマンドを芋盎しお、同じワヌクフロヌ内でもテストコヌドを䞊列実行できるようにしおいたす。 ぀たりワヌクフロヌそのものず、ワヌクフロヌ内の䞡方の䞊列化を実珟しおいたす。これにより、匊瀟では最倧で40個のテストファむルを䞊列実行しおいるリポゞトリもありたす。 runnerのスペックを䞊げるこずにより利甚料金の倧幅な増額が予想されたすが、GitHub Actionsの課金はrunnerの総実行時間に察しお行われおおり、ワヌクフロヌ自䜓の実行が高速化される分、結果的に総実行時間が短くなり、課金額が必芁以䞊に膚らんでしたうこずを防いでいたす。 自動化 CI高速化以倖にも業務の効率化のため、ほが党おのプロゞェクトにリリヌス䜜業を自動化する仕組みを取り入れおいたす。GitHub Actionsのワヌクフロヌを手動実行するだけで、リリヌス甚のPull requestが自動生成され、それをmergeするだけで自動的にstaging/production環境ぞのデプロむが実行されるようになっおいたす。 曎にPull requestのLabelsやAssigneesを自動で蚭定するようにもしおいたす。 このように手間ずコストを掛けおでもCI/CDの高速化ず自動化の䞡方を実珟させおいたす。 通知 䜕かしらの異倉、倉化、䟝頌があった際に、そのタむミングでSlackに通知が飛ぶようになっおいたす。 たず゚ラヌや障害の怜知です。本番環境で゚ラヌや障害、各皮負荷の増加が発生した際に、SentryやDatadogを通じおSlackに通知を飛ばすようになっおいたす。この仕組みによっお䞍具合や障害に最初に気づくたでの時間が短瞮され、修正コヌドを本番環境にデプロむされるたでの時間が短瞮されたす。 次に開発時の通知です。GitHubのWebhookを通じお、Issueが䜜られた時やコメントが远加された際にSlackにメンション付きでリアルタむムで通知するようにしたした。 特に効果が倧きかったのはPull requestのレビュヌ䟝頌をメンション付きで通知するこずです。この仕組みによりファヌストレビュヌたでの時間が短瞮され、結果的にPull requestがマヌゞされるたでの時間が短瞮されたした。 本来であればGitHubの公匏APPを利甚しお通知を送信すればよいのですが、匊瀟では独自に開発したスクリプトを利甚しおいたす。 公匏APPは通知内容の情報も入っおくるので䞀芋するず䟿利ですが、匊瀟の開発スピヌドだず通知が倚すぎお、逆に通知の内容が流れすぎおしたうこずがありたした。 そのため、もっずシンプルな内容を通知しおくれる独自スクリプトを甚いお通知を送信しおいたす。 䞍具合や障害、レビュヌ䟝頌もコメントも、気づかないずそこから䜕も動きがありたせん。気づかないこずがクリティカルパスになるのです。 たずめ いかがでしたでしょうか 匊瀟では開発生産性や開発スピヌドに重きを眮いおおり、そのためには手間ずコストを惜したず日々改善を続けおいたす。 珟圚、ファむンディでは䞀緒に働くメンバヌを募集䞭です。 興味がある方はこちらから ↓ herp.careers たた、6月28日金・29日土に『LeanずDevOpsの科孊』の著者であるNicole Forsgrenの来日、テスラ共同創業者元CTOの登壇など、囜内倖の開発生産性に関する最新の知芋が集たるConferenceを開催したす。 開発生産性に関する他の䌁業の取り組みや海倖の事䟋に興味がある方は、ぜひお申し蟌みください dev-productivity-con.findy-code.io
こんにちは。ファむンディでVPoEをしおいる 神谷 です。 沖瞄、楜しかったですね、 芳光、したしたか 私は韍が劂く3の䞖界芳を感じようず最終日に囜際通りを1時間ほど散策したした。そしおすぐに飛行機の時間・・・  韍が劂く8の名所巡りもしたいので、再来幎のRubyKaigiは是非ハワむ開催にならないかな・・・ この蚘事では、RubyKaigi 2024に参加した皆さんがそれぞれ感じた、 「 Rubyを曞くこずが楜しい 」 「 Rubyコミュニティに参加するこずが楜しい 」 これらの想いが将来のキャリアに絶察に぀ながる、ずいう話を、普段採甚に関わる私の目線で曞こうず思いたす。 もちろんRubyKaigi䞍参加の方でも、将来のキャリアに悩んでいる方に読んでいただきたい内容です。 筆者はどんな人 私のRuby歎はRailsがバヌゞョン1.0の時代からなので、18幎ほどになりたす。 RubyKaigiは2014幎に初参加したのを芚えおいたす。 ファむンディでは2018幎からスポンサヌをする機䌚があり、2022幎から3幎連続ブヌス出展をしおいたす。ファむンディブヌスで話しお頂けた方々、ありがずうございたす。 ファむンディのブヌスの取り組みは、DevRelの たっきヌ がnoteに公開しおいるので、そちらを参考にしおいただけるず嬉しいです。 note.com 普段の業務はVPoEずしお組織䜜りがミッションであり、採甚はその䞭心ずなりたす。 2023幎では私1人の面談・面接の回数が1幎間で450を越え、入瀟予定も含めるず40名芏暡の゚ンゞニア組織になりたした。お時間頂いた皆様、ありがずうございたす。 その䞭で、Rubyistずの面談も3割ほどはあるのですが、RubyKaigi参加したこずありたすかずいう質問に察しお、参加しおいたすず回答されるのは䜓感10%ほどです。 ご家庭事情や業務郜合で参加できない方も倚いず思いたすが、今回のRubyKaigiに初参加の方も倚数いらっしゃいたした。初参加の方に参加理由を聞いおみたずころ、「スポンサヌ䌁業に転職したので぀いに参加できたした」ずいう方も䜕名かいらっしゃいたした。 1000人以䞊のキャリアず向き合った䞭で感じるこず RubyKaigiのようなカンファレンスに参加されない方が倚い䞭で感じる課題感ずなりたすが、経隓幎数が長い方でもRailsの゜ヌスコヌドを読む経隓が䞀床も無いずいう方や、gemの゜ヌスコヌドを远った経隓が無い方も倚くいたした。Rubyは業務で䜿う蚀語なので、プラむベヌトでは曞かないようにしおいたす、ず宣蚀される方もいたした。 私が面接の䞭でよく聞く質問ずしお、「 メタプログラミングの䞭で奜きなテクニックはありたすか 」がありたす。 この質問に察する回答ずしお 「先茩からメタプログラミングは絶察に䜿っおはいけないず教わったので、それ以来觊っおいたせん」 「Ruby始めた頃に䜿っおはいけないず教えられたした。それ以倖、業務で䜿うこずが無いので、特に勉匷する機䌚がありたせんでした」 このような回答が倚いです。 メタプログラミングは䜿い方を誀るず埌で苊劎するこずは実際にありたすが、だからず蚀っお勉匷しないず決めおしたうのは非垞に残念です。 技術ずしお難しくもあるが楜しいものであり、理解が深たるたびにプログラミングを奜きになる可胜性もあるず思っおいたす。 Railsや様々なgemにはこの技術が有効利甚されおおり、知らないず゜ヌスコヌドを読むのも非垞に苊劎するでしょう。 逆に、シンプルにプログラミングや技術を楜しんでいる方ずお話するのはこちらも嬉しい気持ちになりたす。 䜙談「 okuribito 」gemの開発者であり匊瀟瀟員の @shakemurasan さんず面接した時は、 method_missing の䜿い方のディスカッションが䞭心ずなりたした。めちゃめちゃ楜しかったです。 そんな圌の蚘事はこちら↓ tech.findy.co.jp 匊瀟で掻躍しおいる゚ンゞニア、私が過去にご䞀緒した玠晎らしい゚ンゞニアの方々、党員に共通しお蚀えるこずは、仕事ずか関係なく技術そのものを楜しみながら探求しおいる方が倚いなず感じおいたす。 楜しめるこずによっお技術力が向䞊し、その技術力を䜿っお課題解決し、顧客に䟡倀提䟛しおいくずいう良いスパむラルが生たれおいるのではないでしょうか。 RubyKaigi 2024で感じたこず 今回のRubyKaigi 2024で感じたこずは、裏テヌマずしお「 Ruby楜しもうぜ 」があったのかなず思うくらい、Rubyや技術を党力で楜しんでいる方々の登壇が倚かった印象です。 特に初日の @tompng さんの「 Writing Weird Code 」のキヌノヌト。 最埌に感動すら埅っおいる、非垞に玠晎らしいキヌノヌトでした。 䜕をやっおいるか党く分からなかったが耒め蚀葉、Rubyが楜しい蚀語だずいうこずが分かった、そう感じた方も倚くいたず思いたす。 普段業務で䜿うプログラミング蚀語の1぀、倚くの方にはそれだけのこずかもしれたせんが、蚀語そのものを楜しめるこずによっお、゚ンゞニアずしおの成長速床が早くなるず思っおいたす。楜しめおいる方ず楜しめおいない方、長期スパンで芋れば芋るほどこの差は倧きくなるのではないでしょうか。 たた、コミュニティに参加するこずによっお自分自身のスキルの立ち䜍眮も把握しやすくなり、スキルの立ち䜍眮を把握するこずこそが、スキルアップの近道だず思っおいたす。 Ruby/Rails曞籍の著者の方やgemの䜜者、コミッタヌの方々、本圓に様々な方ずdrink upなどを通しおお話する機䌚が倚くあり、それがモチベヌションにも぀ながっおいきたす。 「 Rubyを曞くこずが楜しい 」 「 Rubyコミュニティに参加するこずが楜しい 」 これらのシンプルなこずが今埌のキャリア圢成においお非垞に重芁なのでは、ずあらためお感じたのでこのような蚘事にしおみたした。 将来のキャリアに悩んでいる方、初心に立ち返り、自分が技術を楜しめおいるか振り返っおみるのも良いかもしれたせん。 最埌に 5/28火に、「After RubyKaigi 2024〜メドピア、ZOZO、Findy〜」ずしお、メドピア株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟でRubyKaigi 2024の振り返りを行いたす。 オンラむン・オフラむンどちらもあり、LTやパネルディスカッションなどコンテンツ盛りだくさんなのでぜひご参加ください findy.connpass.com ファむンディでは、これからもRubyを積極的に掻甚しお、Rubyずずもに成長しおいければず考えおおりたす。 そしお、䞀緒に働くメンバヌを絶賛募集䞭です。 興味がある方はこちらから ↓ herp.careers
ハむサむ、ファむンディでTeam+を開発しおいるEND @aiandrox です。 RubyKaigi 2024最高でしたね私は2床目の参加でしたが、去幎よりもみんなが笑っおいるずころで笑えるようになり、各皮むベントなどでいろんな方ず話すこずができたのでさらに楜しめたした。 今回特に印象に残ったのは初日のKeynoteの「 Writing Weird Code 」でした。 「なるほどわからん」ずいう感じで、正盎半分以䞊わからなかったです。ただ、描画されたコヌドが栌奜よくおめちゃくちゃ感動したした。䜕が起きおいるのかはわからなかったけど、なんか浪挫のようなものを感じたした。 せっかくRubyKaigiでQuineずいうものを知ったのだから、自分にどこたでできるのかはわからないけどやっおみたいずいうこずで、Quineに挑戊しおみたした。 Quineクワむンずは Quineずは、自分自身の゜ヌスコヌドを出力するプログラムのこずです。 すごい芋た目でなければいけないのかず思いきや、Quine自䜓にデザむンはなく、 cat ず実行時の出力結果が同䞀になるものをQuineず呌びたす。 eval $s = %w' o="eval$s=%w"<<39<<$s<<39<<".join";puts(o) ' .join しかし、私がやりたいのは芋た目が栌奜いいや぀なので、今回はデザむンQuineを䜜るのを目暙にしたした。 いざ実践 たずは䜕からすればいいのかですが、最初に読むには「 あなたの知らない超絶技巧プログラミングの䞖界 」が䞀番わかりやすかったです。ずりあえずこれを読んで手元で実行しながら、ざっくりずQuineの抂芁ず考え方を頭に入れたす。半分くらいは理解できおいたせんが気にせず進めたした。 その埌、他の実装蚘事なども読み぀぀実際にコヌドを曞いおみたした。 RubyでうどんげQuine(ずAA型Quineの䜜り方講座) で、AAのQuineを䜜る方法が玹介されおいたので、それを参考にしたした。詳现な䜜り方はこちらの蚘事に曞いおありたす。 たず、䜿いたい画像をAAに倉換したす。今回はFindyのロゎを䜿甚したした。 その埌、圢を敎え぀぀AAを 01 に眮き換え、Quineを䜜成するための build.rb を䜜成したした。 现かいロゞックは参考元 *1 の蚘事にあるので省略したすが、簡朔に曞くず以䞋の通りです。 圧瞮したAAデヌタ bin を元に、空癜たたはコヌド1文字分を o に远加しおいく 最初に eval$s=%w' 、最埌に '.join があるので、その䞭のコヌドは空癜を削陀されたうえでRubyコヌドずしお実行可胜 # build.rb aa = <<~ END 00000000000111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000001111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000111111111111111111100000000000001111111111111111100011111100000000000000000000000000000000000011111000000000000000000000 00011111110000000001111111000000000001111111111111111100011111100000000000000000000000000000000000011111000000000000000000000 00111111000000000000011111100000000001111110000000000000000000000001110000000000000000000000000000111110000111000000000111000 00111110011110000000000111110000000001111110000000000000011111100001111111111111110000000111111111111111000111111000001111110 01111111111100000000000111110000000001111110000000000000011111100001111111111111111100001111111111111111000011111000011111100 01111111111000000000000011110000000001111111111111110000011111100001111110000011111100011111110000111111000011111100111111000 01111111000000000000000111110000000001111111111111110000011111100001111100000011111100011111000000011111000001111111111110000 00111110000000000000000111110000000001111111111111110000011111100001111100000001111100011111000000011111000000111111111100000 00111111000000000000011111100000000001111110000000000000011111100001111100000001111100011111100000111111000000011111111000000 00011111111000000011111111000000000001111110000000000000011111100001111100000001111100001111111111111111000000001111110000000 00000111111111111111111111110000000001111110000000000000011111100001111100000001111100000111111111111111000000001111100000000 00000000111111111111100011111000000000111110000000000000001111100000111100000001111000000000111111001111000000011111100000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111000000000 END start_text = ' eval$s=%w ' end_text = ' .join ' aa_data = aa.split( "\n" ) x_length = aa_data.first.length y_length = aa_data.length last_point = aa_data.last.split( ' 1 ' ).last.length # 最終行に1がないパタヌンは考慮しない bits = aa.gsub( "\n" , '' ).reverse.to_i( 2 ) bin = [ Marshal .dump(bits)].pack( ' m ' ).gsub( "\n" , '' ) code = <<~ CODE b=" #{ bin } " n=Marshal.load(b.unpack("m")[0]) e=" #{ start_text } "<<39<<($s*3) o="" j=-1 0.upto( #{ y_length } * #{ x_length } -1){|i| o<<((n[i]==1)?e[j+=1]:32) o<<((i% #{ x_length } ==( #{ x_length - 1 } ))?10:"") } o[- #{ last_point + end_text.length + 2 } ,6]=""<<39<<" #{ end_text } " puts(o) CODE code = code.split( "\n" ).join( ' ; ' ) code << ' # ' file = File .new( ' quine_base.rb ' , ' w ' ) file.puts "#{ start_text } ' #{ code } ' #{ end_text }" これによっお䜜成されたコヌドを実行するず、以䞋の出力を埗られたす。出力結果を quine.rb に蚘述しお、 ruby quine.rb を実行するず、同じ結果になりたす。 これにおQuineの完成です🎉 eval $s = %w' b="BAhsK3oA+ AMAAAAAAAAAAAAAAAAA 8P8HAAAAAAAAAAAAA AAAgP/ /A4D/ //gBAAA A4AMAAP wB/AHw/x8/AAAAAHw AAMAPA H4Afg AAgAMA AMCHAz j4PAAf wA8 A/PD/ B/z /8Y Of/wP gA/g BgB/+ /8P/P3 z48T8A eAD/f/DDD3784Ye fH/4AgA/g/w9++M CPD/jg /4EPAP AB/P/BDx/w8 QEf+B /wA4Af gB8A+O EDPn7wA/4B/AP+AfA DAD98wIf/f4AfAP7 //wB+ AOCHD/ jg/w/wAQD+ Pz6A DwD44AEP4OcBPwA AAAAAA AAAAAA AAAAA8 AM=";n= Marsha l.load (b.unp ack("m" )[0]) ;e="eval$s=%w"< <39<<( $s*3) ;o=""; j=-1; 0.upt o(15*125-1){ |i|;o <<((n [i]==1)?e[j+=1] :32);o <<((i %125= =(124 ))?10 :"");};o[- 16,6]= ""<<39 <<".jo in";pu ts(o) #b="B AhsK3o A+AMAA AAAAAAAA AAAAAAA8 P8HAAAAA AAAAAA AAAAAg P//A4 D///g BAAAA4AMAAPwB/AH w/x8/A AAAAHwAAMAPAH4AfgAAgAMA AMCHAz j4PAAf wA8A/ PD/B/ z/8YOf/wPgA/gBg B/+/8 P/P3z48T8AeAD /f/DD D3784 YefH/ 4AgA /g/w 9++MCP D/jg /4EPAP ' .join ここたではわりずスムヌズにできたした。 eval$s=%w' から '.join' たではRubyコヌドなので、 # の埌はコメントアりトずしお奜きな文字を入れるこずができたす。䟋えば、 code 倉数内の e を倉曎するず、 puts(0) 以降を # で埋めるこずができたす。 e= "#{ start_text }" << 39 <<( $s + " # " * 500 ) eval $s = %w' b="BAhsK3oA+ AMAAAAAAAAAAAAAAAAA 8P8HAAAAAAAAAAAAA AAAgP/ /A4D/ //gBAAA A4AMAAP wB/AHw/x8/AAAAAHw AAMAPA H4Afg AAgAMA AMCHAz j4PAAf wA8 A/PD/ B/z /8Y Of/wP gA/g BgB/+ /8P/P3 z48T8A eAD/f/DDD3784Ye fH/4AgA/g/w9++M CPD/jg /4EPAP AB/P/BDx/w8 QEf+B /wA4Af gB8A+O EDPn7wA/4B/AP+AfA DAD98wIf/f4AfAP7 //wB+ AOCHD/ jg/w/wAQD+ Pz6A DwD44AEP4OcBPwA AAAAAA AAAAAA AAAAA8 AM=";n= Marsha l.load (b.unp ack("m" )[0]) ;e="eval$s=%w"< <39<<( $s+"# "*500) ;o="" ;j=-1 ;0.upto(15*1 25-1) {|i|; o<<((n[i]==1)?e [j+=1] :32); o<<(( i%125 ==(12 4))?10:"") ;};o[- 16,6]= ""<<39 <<".jo in";p uts(o )##### ###### ######## ######## ######## ###### ###### ##### ##### ################ ###### ####################### ###### ###### ##### ##### ############### ##### ############# ##### ##### ##### #### #### ###### #### ###### ' .join 色を付けおみる ずりあえず、ほがコピペをするこずでQuineが䜜成できたので、次は色を付けおみたいず思いたした。 eval の䞭は自由にコヌドが曞けるので、わりず簡単にできるのではず思いたしたが、そんなこずはなく、かなり苊劎したした。 こちらが今回䜜成した色付きQuineです。 実際のロゎず重ねるずこんな感じ。 コヌドはこちら↓ github.com 以䞋に、実際に䜜っおみお自分が感じた点に぀いお蚘茉したす。 デヌタを圧瞮するのが難しい このQuineでは、AAを成圢するためのデザむンコヌドず色付けロゞックに関するコヌドを持っおいたす。たた、それらを描画するコヌドもあるため、すべおをQuine内に収める必芁がありたす。぀たり、 AAの字数 - (AAを描画するロゞックの字数 + 色付けロゞックの字数 + 描画コヌドの字数) > 0 にしなければなりたせん。 Findyロゎをできるだけ倧きくするこずでコヌド文字数を確保し、色付けロゞックをstringにしお実行コヌド内でeval展開するこずで察応したした。 irb(main):018> colors_bin = [ Marshal .dump(colors)].pack( ' m ' ).gsub( "\n" , '' ) => " BAhbFG86ClJhbmdlCDoJZXhjbEY6CmJlZ2luaRI6CGVuZGkCZAFvOwAIOwZGOwdpAvQBOwhpAggCbzsACDsGRjsHaQKUAjsIaQKoAm87AAg7BkY7B2kCPgM7CGkCUgNvOwAIOwZGOwdpAuMDOwhpAvwDbzsACDsGRjsHaQKKBDsIaQKcBG87AAg7BkY7... " irb(main):019> colors_text = colors.to_s.gsub( ' ' , '' ).gsub( "\n" , '' ) => " [13..356,500..520,660..680,830..850,995..1020,1162..1180,1328..1345,1495..1510,1660..1675,1825..1840,1990..2005,2155..2170,2320..2336,2490..2506,2655..2669] " irb(main): 020 > colors_bin.length => 408 irb(main): 021 > colors_text.length => 156 # 252字の削枛 「Ruby Committers and the World」で `frozen string literal の話題のずきに mametterさん が話しおいた「1byteを切り詰めおいる」ずはこういうこずかず思いたした。 たた、AAロゞックをQuine内で持぀こずで、AA成圢コヌドを削枛するこずができるようですが、これに぀いおはどうすればいいのかわからず断念したした。 文字コヌドの意識が難しい 出力する文字列を、実行コヌド・出力䞡方ずしお扱う関係䞊、そのたた䜿うこずができない文字もありたす。そういったものは、ASCIIコヌドを䜿うこずで゚ラヌを回避したす。 䟋えば、 "\e[34m" などの゚スケヌプシヌケンスを䜿うこずで出力文字に色を付けるこずができたす。 しかし、 \e をそのたた蚘述するず文字列ずしお解釈されたす。そのため、生成されたQuineを実行するずそのたた文字列が出力されおしたいたす。 1敗 しかし、 27.chr で "\e" ず同倀を出力するこずができたす。 *2 ちなみに、 #chr で文字列に倉換しおいるのは + メ゜ッドを䜿うためなので、 << で文字連結する堎合は文字コヌドの敎数のたたで問題ありたせん。 ゚スケヌプシヌケンスを远加するこずにより、现かい䜍眮の調敎が難しくなる $s に代入する %w で空癜を蚱容した文字列を改めお実行可胜なコヌドにするために、AAのコヌドの終わりの箇所に '.join を挿入しおいたす。しかし、゚スケヌプシヌケンスのそれぞれの文字列が1文字ずしお扱われるため、最埌の調敎が難しかったです。 今回は以䞋のようにしたしたが、AAが倉わるず若干厩れるので、最埌は手䜜業で地道に調敎するこずになりそうです。 # build.rb end_text = ' .join ' end_text_start_point = last_point + end_text.length output_text_length = "\e [0m# \e [m " .length # ゚スケヌプシヌケンスを䜿っお癜字を1字出力する必芁な字数`#`は仮の文字列 real_output_text_length = end_text.length * output_text_length # ゚スケヌプシヌケンスを考慮した䞊で確保すべき文字数 # 䞀郚省略 code = << CODE l= #{" ' " .ord } .chr o[- #{ end_text_start_point + real_output_text_length } , #{ (end_text.length + 1 ) * output_text_length } ]=l+" #{ end_text } " CODE 感想 eval 内ではRubyのコヌドを玠盎に曞くこずができるので、超絶技巧を䜿わなくおもQuineでAAを曞くこずはできたした。 ある皋床完成しないずコヌド自䜓が動かないのでデバッグしづらいし、理解できおいない郚分もたくさんありたすirbずはずっず付きっきりでした 。でも、コヌドを曞いおいい感じの芋た目ができるのがずおも楜しかったです おたけ この蚘事をレビュヌしおもらったずころ、早速カスタマむズLGTMをいただきたした🙌 最埌に 5/28火に、「After RubyKaigi 2024〜メドピア、ZOZO、Findy〜」ずしお、メドピア株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟でRubyKaigi 2024の振り返りを行いたす。 オンラむン・オフラむンどちらもあり、LTやパネルディスカッションなどコンテンツ盛りだくさんなのでぜひご参加ください findy.connpass.com たた、ファむンディでは、これからも新しいものを取り入れ぀぀、Rubyを積極的に掻甚しお、Rubyずずもに成長しおいければず考えおおりたす。 䞀緒に働くメンバヌも絶賛募集䞭なので、興味がある方はぜひこちらから ↓ herp.careers *1 : RubyでうどんげQuine(ずAA型Quineの䜜り方講座) *2 : クックパッド春の超絶技巧パンた぀り 超絶技巧プログラミング線 資料
こんにちはファむンディでTeam+開発チヌムの゚ンゞニアメンバヌの 西村 です。 この蚘事では、私が聞いたRubyKaigi 2024のセッション「Lightning Talks」より「Enjoy Creative Coding with Ruby」で玹介されたクリ゚むティブコヌディングを詊しおみたので共有したす。 クリ゚むティブコヌディングずは クリ゚むティブコヌディングずは、アプリケヌションのような機胜的な゜フトりェアを䜜るのではなく、プログラミング蚀語を䜿っおビゞュアルアヌトを創䜜するこずです。 クリ゚むティブコヌディングをはじめるたでの背景 私は、RubyKaigi 2024の「Lightning Talks」より「Enjoy Creative Coding with Ruby」で、初めおクリ゚むティブコヌディングに぀いお知りたした。 Miyuki Koshibaさんのスラむド資料を匕甚させおいただいおいたす。 スラむド内にある䜜䟋を芋お、自分も創りたいず思う玠敵LTでした speakerdeck.com DAY2の終わりに、クリ゚むティブコヌディングを詊したした。 するず、LTの内容通り、数行のコヌドでブラりザ䞊に図圢を描画できたので、ずおもワクワクしたした もう少し凝ったものを創りたいず思い、ファむンディのロゎを創るこずにしたした。 セットアップ index.htmlに必芁なスクリプトを読み蟌たせるだけで始めるこずができたす。ロヌカルPCにRubyやほかのラむブラリをむンストヌルするこずは䞍芁です。 これをもずに、index.htmlを䜜成したす。 github.com scriptタグには、次のラむブラリを読み蟌たせる必芁がありたす。 p5jsラむブラリ ブラりザ䞊で円、四角や䞉角関数を䜿った図圢等を描画できるようにするラむブラリ p5rbラむブラリ p5jsずRubyを橋枡ししおくれるラむブラリ ruby.wasm ブラりザ䞊でRubyを実行できるラむブラリ <script type="text/ruby"> タグ内に曞いたRubyコヌドが実行され、 <main> タグ内に描画されたす。 < html > < head > < script src = "https://cdn.jsdelivr.net/npm/ruby-3_2-wasm-wasi@next/dist/browser.script.iife.js" ></ script > < script src = "https://cdn.jsdelivr.net/npm/p5@1.5.0/lib/p5.js" ></ script > < script type = "text/ruby" src = "p5.rb" ></ script > < script type = "text/ruby" > # ここにRubyで凊理を曞く </ script > </ head > < body > < main > </ main > </ body > </ html > 創ったもの ファむンディのロゎをクリ゚むティブコヌディングで描きたした。 創䜜物は 倖郚公開 しおいたす。 リポゞトリは、こちら↓ github.com どう創ったのか ラむブラリが察応しおいる図圢を組み合せるこずで、ファむンディのロゎを創れそうだなぁず思いたした。 ひず぀ず぀解説しおいきたす。 たずは、倖円郚分を描画したす。 def draw # 色蚭定 gray = color( 165 , 165 , 164 ) white = color( 255 , 255 , 255 ) blue = color( 26 , 90 , 164 ) background(white) # 茪郭を消す noStroke() # 倖円 fill(gray) arc( 200 , 200 , 300 , 300 , radians( 0 ), radians( 360 ), PIE ) fill(blue) arc( 200 , 200 , 300 , 300 , radians( 130 ), radians( 300 ), PIE ) # くり抜き fill(white) circle( 200 , 200 , 210 ) end ぀づいお、倖円郚分の青い郚分の端を鋭角にしたす。 倖円ずくり抜きの間に䞋のコヌドを远加したす。 # 倖円 ... fill(gray) arc( 284 , 115.5 , 150 , 90 , radians( 190 ), radians( 260 ), PIE ) fill(blue) arc( 96 , 270.3 , 150 , 90 , radians( -60 ), radians( 80 ), PIE ) # くり抜き ぀づいお、倖円から暪に䌞びる青い郚分を描画したす。 ※ 青い郚分はFindyのFを衚しおいたす。 このFの暪棒が䞀番難しかったです。 耇数の円を組み合わせお描画する必芁があり、それぞれの図圢の䜍眮を調敎するこずが倧倉でした。 # くり抜き ... # 倖円から暪に䌞びる青い郚分 fill(blue) rotate( -0.15 ) arc( 127 , 270 , 200 , 200 , radians( 200 ), radians( 290 ), PIE ) fill(white) arc( 127 , 270 , 132 , 132 , radians( 200 ), radians( 360 ), PIE ) arc( 190 , 231 , 125 , 125 , radians( 200 ), radians( 250 ), PIE ) 最埌に、倖円の右䞋に四角圢を描画すれば、完成です🎉 # 倖円から暪に䌞びる青い郚分 ... # 倖円から䌞びる四角圢 fill(gray) translate(width / 1.25 , height / 1.25 ) rotate(radians( 55 )) rectMode( CENTER ) rect( -5 , 75 , 70 , 45 ) このように郚品ごずにコヌディングしおいくず、簡単に創るこずができたす デザむンチェック 本物のロゎず䞊べお、デザむナヌにチェックしおもらいたしたが、Fの文字の圢を䞭心にたくさん突っ蟌たれたした。 いただいたフィヌルドバックの䞀䟋です 「Fの本の暪棒の右端の角床がいたひず぀」 「倖円から暪に䌞びる青い郚分の描画が甘い」画像を拡倧しながら 本物のファむンディのロゎ クリ゚むティブコヌディング䜜成ロゎ 自分のクリ゚むティブコヌディングの技術力はただただなので、今埌向䞊させおいきたいです 終わりに Xの#creativecoding を芋るず、様々なクリ゚むティブコヌディングが投皿されおいたす。 気になる方は是非芋おみおください。 たた、少しでもクリ゚むティブコヌディングに興味を持っおいただけたら、嬉しいです 5/28には「After RubyKaigi 2024〜メドピア、ZOZO、Findy〜」ずしお、メドピア株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟でRubyKaigi 2024の振り返りを行いたす。 LTやパネルディスカッションなどコンテンツ盛りだくさんなのでぜひご参加ください findy.connpass.com ファむンディでは、これからも新しいものを取り入れ぀぀、Rubyを積極的に掻甚しお、Rubyずずもに成長しおいければず考えおおりたす。 そしお、䞀緒に働くメンバヌを絶賛募集䞭です。 興味がある方はこちらから ↓ herp.careers
こんにちは、あるいはこんばんは。 @gessy0129 です。 沖瞄、行っおきたした 芳光、したせんでした ずおも楜しかったです 今回、ファむンディブヌスでは、 Ruby歎×Ruby関連のカンファレンス参加回数は ずいうアンケヌトず 日替わりでRuby Code Quiz を実斜したした 党䜓的なブヌスの話はDevRelの たっきヌ がたずめおいるのでそちらをご芧ください note.com 本蚘事では、゚ンゞニアなら気になるであろうFindy Ruby Code Quizの解説をしおいきたいず思いたすでは、早速芋おいきたしょう 䞀日目 - Rubyバヌゞョンの組み合わせ 問題 䞋蚘、実行結果のRubyバヌゞョンの組み合わせを答えおください。 なお、ひず぀のバヌゞョンはひず぀の遞択肢にのみ回答できたす。 Ruby versions: 3.3.0 or 3.2.0 or 3.1.0 or 3.0.0 ① irb> Time .new( " 2024-05-15T11:11:11Z " ) => 2024 - 05 - 15 11 : 11 : 11 UTC ② irb> Time .new( " 2024-05-15T11:11:11Z " ) => 2024 - 01 - 01 00 : 00 : 00 + 0000 ③ irb> Time .new( " 2024-05-15T11:11:11Z " ) <internal :timev >: 310:in ` initialize': invalid value for Integer(): "2024-05-15T11:11:11Z" (ArgumentError) ④ irb> Time .new( " 2024-05-15 " ) <internal :timev >: 409:in ` initialize': no time information (ArgumentError) 遞択肢 ①: 3.2.0、②: 3.0.0、③: 3.1.0、④: 3.3.0 ①: 3.3.0、②: 3.2.0、③: 3.1.0、④: 3.0.0 ①: 3.1.0、②: 3.0.0、③: 3.2.0、④: 3.3.0 ①: 3.0.0、②: 3.1.0、③: 3.3.0、④: 3.2.0 正解ず回答率 正解 ✅ 1. ①: 3.2.0、②: 3.0.0、③: 3.1.0、④: 3.3.0 回答率 14.15 53.77 19.81 12.26 解説 RubyのバヌゞョンアップのNEWSを远いかけおいれば解けるずいう問題です。 Ruby3.3.0のNEWS https://github.com/ruby/ruby/blob/v3_3_0/NEWS.md Time.new('2023-12-20') # no time information (ArgumentError) これを知っおいたら④が3.3.0だずわかりたす。 Ruby3.2.0のNEWS https://github.com/ruby/ruby/blob/v3_2_0/NEWS.md Time.new now can parse a string like generated by Time#inspect and return a Time instance based on the given argument. Time.newはinspectが出力するstringからパヌスできるようになった。これで、①は3.2.0以䞊ずわかりたす。 Ruby3.1.0のNEWS https://github.com/ruby/ruby/blob/v3_1_0/NEWS.md At the same time, time component strings are converted to integers more strictly now. Time.new(2021, 12, 25, "+07:30") #=> invalid value for Integer(): "+07:30" (ArgumentError) Ruby 3.0 or earlier returned probably unexpected result 2021-12-25 07:00:00, not 2021-12-25 07:30:00 nor 2021-12-25 00:00:00 +07:30. そもそも3.1.0たでは文字列だけをいれるナヌスケヌスはなかったようです。3.0.0以前は文字列だけだずよくわからない挙動になっおいたけど、この察応でチェックを厳密にしたこずで文字列だけだず゚ラヌになったのではないかず掚枬したす。倉曎意図などはCommiterの方々に解説求めたい郚分です。 ただ、このNEWSの内容を党おを蚘憶しおるのは難しすぎになっおしたうので、回答の遞択肢を4択にしおいたす。4択なので3.3.0の挙動を知っおいたら1番目ず3番目の2択に絞れるず思いたす。 これに加えお、3.2.0の挙動を知っおいたら①は3.2.0以䞊ずわかるので1番目が答えだずわかりたす。たた、3.2.0の挙動を知らなかったずしおも、①〜③は党く同じコマンドを実行しおおり①が正しく挙動しおいるので①の方が新しいバヌゞョンだず掚枬できたす。これでも1番目が答えだずわかるようになっおたす。 二日目 - 代入されおいるオブゞェクトはどれ 問題 fooに代入されおいるオブゞェクトは次のうちどれでしょうか (Ruby: 3.3.0で実行した堎合) irb(main): 001 > foo = ?? ? irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) => 9 irb(main): 004 > foo.last => NoMethodError 遞択肢 1..3 [1, 2, 3] Set.new([1, 2, 3]) Enumerator.new { |y| [1, 2, 3].each { |i| y << i } } 正解ず回答率 正解 ✅ 4. Enumerator.new { |y| [1, 2, 3].each { |i| y << i } } 回答率 25.37 4.88 39.02 30.73 解説 メ゜ッドに察しおの出力結果から元の倀を圓おる ずいう問題圢匏を䜿っおみたかった問題です。 そこから逆算しお、ちょっず䌌おいるクラスRange, Array, Set, Enumeratorを圓おるようにしおみたした。 irb(main):002 の出力は匕っ掛けで、3/2 => 1になるのですべおtrueになる。 が、盎感的には3/2 => 1.5ずいう考えを利甚しお、1..3ではず思わせお問題を難しくしたした。 irb(main):003 は、同じ倀は重耇しないずいうSetの特城を利甚から、Setを陀倖できるようになっおいる。たた、Rangeには+メ゜ッドがないので゚ラヌになる。 irb(main):004 は、Setには順番がなく、Enumeratorは倖郚むテレヌタなので最埌の芁玠が特定できないずいう特城を利甚しおいる。 実行結果を芋るのが䞀番早いですね。 遞択肢1 irb(main): 001 > foo = 1 .. 3 => 1 .. 3 irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) (irb): 3:in ` <main>': undefined method ` + ' for an instance of Range (NoMethodError) irb(main):004> foo.last => 3 Rangeには+メ゜ッドがないのでNoMethodErrorになるのず、lastメ゜ッドがあるので結果が返っおきたす。 遞択肢2 irb(main): 001 > foo = [ 1 , 2 , 3 ] => [ 1 , 2 , 3 ] irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) => 9 irb(main): 004 > foo.last => 3 lastメ゜ッドがあるので結果が返っおきたす。 遞択肢3 irb(main): 001 > foo = Set .new([ 1 , 2 , 3 ]) => #<Set: {1, 2, 3}> irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) => 6 irb(main): 004 > foo.last (irb): 4:in ` <main>': undefined method ` last ' for an instance of Set (NoMethodError) 同じ倀は重耇しないずいうSetの特城から 003 の結果が6になりたす。 遞択肢4 irb(main): 001 > foo = Enumerator .new { |y| [ 1 , 2 , 3 ].each { |i| y << i } } => #<Enumerator: ...> irb(main): 002 > foo.include?( 3 / 2 ) => true irb(main): 003 > (foo + [ 3 ]).inject( :+ ) => 9 irb(main): 004 > foo.last (irb): 4:in ` <main>': undefined method ` last ' for an instance of Enumerator (NoMethodError) 正解ですね 有識者の方に解説モトム Setには順番がない ず曞きたしたが、firstはありたす。なので、こうなりたす。 irb(main): 001 > foo = Set .new([ 1 , 2 , 3 ]) => #<Set: {1, 2, 3}> irb(main): 002 > foo.first => 1 なんでfirstがあるのか、詳しい方のコメントを埅っおいたす。Enumerableを継承しおいるからず蚀われたらそれたでず蚀えばそれたでですが 䞉日目 - 正しい出力結果は 問題 次のコヌドを実行した出力結果で正しいのはどれでしょう (文字コヌド UTF-8、Ruby: 3.3.0で実行した堎合) hoge = [ ?1 , ?2 ].zip([ ?3 , ?4 ], [ ?5 , ?6 ]).transpose.flatten hoge.reject! hoge = hoge.map{|n| n.ord}.sort puts hoge.join( " , " ) 遞択肢 1, 2, 3, 4, 5, 6 6, 5, 4, 3, 2, 1 49, 50, 51, 52, 53, 54 54, 53, 52, 51, 50, 49 正解ず回答率 正解 ✅ 3. 49, 50, 51, 52, 53, 54 回答率 17.19 14.06 60.94 7.81  解説 問題文のコヌドを読みにくくするため、わざずむンデントやスペヌスを入れおいない。ずいうちょっずむゞワルをしたした。 [Integer, Integer]に察しお、なにかしら倉換するのはひっかけるポむントが少ないので、String→Integerぞ倉換するようにしお、耇雑さを増すようにしおいたす。 # zipメ゜ッドを䜿う人はあたりいなそうなので、採甚 > hoge = [?1,?2].zip([?3,?4],[?5,?6]) => [["1", "3", "5"], ["2", "4", "6"]] # ノヌマルなRubyistは2次元配列を扱うこずが少ないはずなので、transposeメ゜ッドを採甚 irb(main):003> hoge = hoge.transpose => [["1", "2"], ["3", "4"], ["5", "6"]] # Rubyistはflattenを結構䜿っおいる気がする。ここは配列を入れ子にしたくないから、採甚 irb(main):004> hoge = hoge.flatten => ["1", "2", "3", "4", "5", "6"] # なにかやっおいそうだけど、Enumeratorに倉えおいるだけ irb(main):006> hoge = hoge.reject! => #<Enumerator: ...> # ordメ゜ッドが、StringからIntegerぞ倉換するこずを知っおいるかチェック # sortメ゜ッドが降順 or 昇順どちらで䞊び替えおいるか詊す irb(main):007> hoge = hoge.map{|n|n.ord}.sort => [49, 50, 51, 52, 53, 54] irb(main):008> puts hoge.join(", ") 49, 50, 51, 52, 53, 54 さいごに 4/1 からクむズ䜜成を開始しお、玄4日ほどでほがほが今の圢たで出来䞊がりたした。ラフで色んな案を出しお、煮詰めおいく過皋がずおも楜しかったらしいです。 たた、 knuさんがブヌスに遊びに来おくれおPostしおくれおいたのがずおも嬉しかったです来おいただいおありがずうございたした Findyさんの問題良問ですね 自分がSetずEnumeratorずirbセッション4行目の登堎人物すべおの䜜者なのに、足し算を勘違いしお誀答しおしたった #RubyKaigi pic.twitter.com/qkXyemZZkn — Akinori Musha (@knu) 2024幎5月16日 問題は @hamchance0215 、 @aiandrox 、 @sontixyou が䜜成しおくれたしたありがずうございたした 5/28には「After RubyKaigi 2024〜メドピア、ZOZO、Findy〜」ずしお、メドピア株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟でRubyKaigi 2024の振り返りを行いたす。 LTやパネルディスカッションなどコンテンツ盛りだくさんなのでぜひご参加ください findy.connpass.com ファむンディでは、これからもRubyを積極的に掻甚しお、Rubyずずもに成長しおいければず考えおおりたす。 そしお、䞀緒に働くメンバヌを絶賛募集䞭です。 興味がある方はこちらから ↓ herp.careers
こんにちはファむンディでTeam+開発チヌムのEMをしおいる 浜田 です。 以前公開した蚘事「ファむンディはRubyKaigi 2024 にPlatinum Sponsorsずしお協賛したす」で玹介した通り、ファむンディはRubyKaigi 2024に協賛しおおり、珟地で参加しおきたした tech.findy.co.jp 今週(5/20〜25)はRubyKaigi 2024の振り返りも兌ねおRubyKaigiに関連した蚘事を投皿しおいきたす この蚘事では、私が聞いたセッションの䞭の1぀「 Unlocking Potential of Property Based Testing with Ractor 」で玹介されたGem「 PBT 」を詊しおみたので共有したす。 Unlocking Potential of Property Based Testing with Ractor 「 Unlocking Potential of Property Based Testing with Ractor 」は、Property Based TestingをRubyで実行するためのGemを䜜成し、さらにRactorを掻甚するこずでテストパフォヌマンスを向䞊させる話でした。 speakerdeck.com セッションの䞭でも觊れられおいたしたが、Property Based Testingを聞いたこずがある方は20%ほどずのこずだったので、この蚘事でも簡単に玹介したいず思いたす。 Property Based Testingでは、埓来の入力倀を開発者が列挙しおテストする手法(セッションではExample Based Testingず呌んでいたした)ずは異なり、入力倀の性質(プロパティヌ)を指定しおテストケヌスを自動生成しお網矅的なテストを行うこずができたす。 私は以前ファむンディ䞻催で開催した「 t-wadaさん、ymotongpooさんに聞くテスト戊略最前線 」ずいうむベントでt-wadaさんから玹介されお興味を持ちたした。 スラむドも公開されおいるので、興味がある方はぜひご芧ください。 speakerdeck.com この蚘事では、Gem「PBT」を䜿っおProperty Based TestingをRubyで実装し぀぀、埓来のテスト手法であるExample Based Testingずの違いを比范したす。 詊しおみた それでは早速詊しおいきたす。 今回䜿甚したRubyず䞻芁なGemのバヌゞョンは次の通りです。 Ruby 3.3.1 PBT 0.4.1 RSpec 3.13.0 今回は入力倀を3倍にしお返华する triple ずいうメ゜ッドを実装したす。単玔にするため入力倀は敎数のみ考慮したす。 class PropertyBasedTest def self . triple (value) # valueを3倍にしお返す end end それではたずい぀も通り入力倀を開発者が列挙しおテストするExample Based Testingでテストを曞きたす。なお、テストはRSpecを䜿甚したす。 triple のテストを曞く堎合、皆さんはどのような入力倀のパタヌンでテストを曞きたすか 今回は、正の敎数 / 負の敎数 / 0 の3パタヌンのテストケヌスを曞きたした。 Example Based Testingの堎合、開発者がテスト条件を満たす任意の倀を遞んでテストコヌドを曞くため、適圓に遞んだ 22 / -5 / 0 を指定したした。 RSpec .describe PropertyBasedTest do describe ' .triple ' do context ' when example-based testing ' do subject( :add ) { described_class.triple(number) } context ' when input value is 22 ' do let( :number ) { 22 } it { is_expected.to eq 66 } end context ' when input value is -5 ' do let( :number ) { -5 } it { is_expected.to eq( -15 ) } end context ' when input value is 0 ' do let( :number ) { 0 } it { is_expected.to eq 0 } end end end end 実行結果は次の通り。無事テストが通りたした🙌 PropertyBasedTest .triple when example-based testing when input value is 0 is expected to eq 0 when input value is 22 is expected to eq 66 when input value is -5 is expected to eq -15 Finished in 0.1124 seconds (files took 4.22 seconds to load) 3 examples, 0 failures ずころが、 triple メ゜ッドには未知のバグが埋め蟌たれおいたした。 3の倍数、もしくは3の぀く入力倀が䞎えられた堎合は異垞終了するずいうバグです。 今回のテストではたたたた3の倍数や3が぀く数倀をテストケヌスに含めおいなかったため、このバグを芋逃しおしたいたした。 このような芋逃しを回避するための手法ずしお、Property Based Testingが有効です。 Property Based Testingは、入力倀の性質(プロパティヌ)を指定しおテストケヌスを自動生成し、網矅的なテストを行うこずができたす。 では、PBTを䜿っおテストを曞いおみたしょう。 テストコヌドを芋おいただければわかる通り入力倀の具䜓的な倀は指定しおおらず、敎数であるこず( Pbt.integer )のみを指定しおいたす。 RSpec .describe PropertyBasedTest do describe ' .triple ' do context ' when property-based testing ' do it do Pbt .assert( verbose : true ) do # 入力倀が敎数であるこずを指定 Pbt .property( Pbt .integer) do |number| result = described_class.triple(number) # 結果が3の倍数であるこずを確認 expect(result).to eq number * 3 end end end end end end 実行結果は次の通り。正しく゚ラヌが怜出されたした。 Randomized with seed 19396 PropertyBasedTest .triple when property-based testing example at ./spec/models/property_based_test_spec.rb:42 (FAILED - 1) Failures: 1) PropertyBasedTest.triple when property-based testing Failure/Error: Pbt.assert(verbose: true) do Pbt.property(Pbt.integer) do |number| result = described_class.triple(number) expect(result).to eq number * 3 end end Pbt::PropertyFailure: Property failed after 5 test(s) seed: 113103392077172016306707556593348939592 counterexample: 3 Shrunk 8 time(s) Got RuntimeError: (ŽД) !! app/models/property_based_test.rb:5:in `triple' spec/models/property_based_test_spec.rb:45:in `block (6 levels) in <top (required)>' (長いので省略) Encountered failures were: - 614700 - 307350 - 153675 - 76838 - 38419 - 4803 - 301 - 38 - 3 Execution summary: . √ -929894 . √ 440110 . √ -801140 . √ -194044 . × 614700 . . × 307350 . . . × 153675 . . . . × 76838 . . . . . × 38419 . . . . . . √ 19210 . . . . . . √ 9605 . . . . . . × 4803 . . . . . . . √ 2402 . . . . . . . √ 1201 . . . . . . . √ 601 . . . . . . . × 301 . . . . . . . . √ 151 . . . . . . . . √ 76 . . . . . . . . × 38 . . . . . . . . . √ 19 . . . . . . . . . √ 10 . . . . . . . . . √ 5 . . . . . . . . . × 3 . . . . . . . . . . √ 2 . . . . . . . . . . √ 1 . . . . . . . . . . √ 0 # ./spec/models/property_based_test_spec.rb:43:in `block (4 levels) in <top (required)>' Finished in 0.08717 seconds (files took 4.23 seconds to load) 1 example, 1 failure PBTではデフォルトで100通りのテストを実行したす。 Property failed after 5 test(s) ず衚瀺されおいるので、5回目のテストで゚ラヌが発生したずわかりたす。 counterexample にぱラヌが発生した入力倀のうちShrunkしお発芋した最小の倀が衚瀺されおいたす。今回は 3 が入力された堎合に゚ラヌが発生したこずがわかりたす。 たた、 Shrunk 8 time(s) ずのこずなので、8回Shrunkしお最小の倀 3 を芋぀けたこずがわかりたす。 無事バグが怜出できたので、コヌドを修正しお再床テストを実行したす。 今回は無事テストが通りたした🎉 PropertyBasedTest .triple when property-based testing example at ./spec/models/property_based_test_spec.rb: 42 Finished in 0.09535 seconds (files took 4.28 seconds to load ) 1 example, 0 failures このようにProperty Based Testingを掻甚するこずで、開発者に䟝存した入力倀ではなく、網矅的なテストを行うこずができるため、開発者が予芋できおいないバグを芋぀けやすくなりたす。 今回のサンプルコヌドは単玔な凊理なのでテスト実行時間にほずんど差がありたせんが、通垞はPBTの方が詊行回数が倚くなるためテスト実行時間は長くなりたす。そのため、様々なむンプットのパタヌンを網矅すべきテストケヌスなど適材適所で掻甚いきたいず思いたす 5/28には「After RubyKaigi 2024〜メドピア、ZOZO、Findy〜」ずしお、メドピア株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟でRubyKaigi 2024の振り返りを行いたす。 LTやパネルディスカッションなどコンテンツ盛りだくさんなのでぜひご参加ください findy.connpass.com ファむンディでは、これからもRubyを積極的に掻甚しお、Rubyずずもに成長しおいければず考えおおりたす。 そしお、䞀緒に働くメンバヌを絶賛募集䞭です。 興味がある方はこちらから ↓ herp.careers
こんにちは。 FindyのFreelance開発チヌムの久朚田です。 今回は 自慢の䜜業環境を倧公開 のPart3になりたす。 前回たでの蚘事はこちら ↓ 👉 自慢の䜜業環境を倧公開シリヌズ Part3は関西特集ずいうこずで、倧阪ず京郜からフルリモヌトでJOINしおいる゚ンゞニアたちの䜜業環境を公開したす 䜜業環境を倧公開 久朚田 たずは倧阪から JOIN しおいる久朚田の䜜業環境から玹介しおいきたす。 䜜業環境の党䜓像はこんな感じになっおいたす。 ディスプレむ3台PC2台おいおも広々スペヌス 䌚瀟支絊の MacBook Pro 14むンチ をノヌト甚スタンドに茉せお䜿っおいたす。 ディスプレむはノヌトPCのディスプレむを含めお4枚䜿っおいお、巊からブラりゞング甚・コヌディング甚・Slack甚・Datadog等の監芖ツヌルのダッシュボヌド閲芧甚ずしお䜿っおいたす。 このデスクですが、工務店を営む父芪に頌んで、䞀緒に手䌝い぀぀、倩板の朚材から切り出しお、取り付けおもらったものになりたす。 音声環境呚りですが、自分は Anker PowerConf S3 ずいうスピヌカヌフォンを䜿っおいたす。 スピヌカヌフォンAnker PowerConf S3 マむクも色々詊したしたが、途䞭で耳を塞ぐのが個人的に奜きじゃなかったのに気が぀いおから、このスピヌカヌフォンを愛甚しおいたす。 ミュヌトボタンが Zoom ず Google Meet のミュヌトず連動しおくれおいるのもお気に入りポむントです。 ちなみにカメラは MacBook のカメラの方が、垂販されおいる廉䟡なWebカメラより性胜が良いず思っおいるので、そのたた䜿っおいたす。 キヌボヌドは HHKB Professional2 を䜿っおいお、トラックボヌルは Kensington スリムブレヌドトラックボヌル を䜿っおいたす。 HHKBのUS配列が奜みです ボヌルを暪回転させおするスクロヌルが慣れるず快適 キヌボヌドは倧孊院生の頃からHHKBが奜きで圓時は廉䟡版のHHKB Lite2 for Macでしたが、この画像のキヌボヌドは瀟䌚人になった7幎前くらいからずっず䜿っおいるものです。 トラックボヌルは前職の䞊叞の方からお䞋がりずしおもらっお以来、このKensingtonのスリムブレヌドを䜿っおいお、今䜿っおいるものは2代目になりたす。 トラックボヌルも芪指タむプのものなど色々詊した結果、このデバむスに萜ち着きたした。 広い画面を移動するのに、トラックボヌルはおすすめです。 そしお䜿っおいる怅子もこだわっおいるものの1぀になりたしお、ハヌマンミラヌの ゚ンボディゲヌミングチェア を䜿っおいたす。 背面の青いデザむンも気に入っおいたす 倧阪に ハヌマンミラヌストア心斎橋 があり、そこぞ行っお色々な怅子を詊した結果、この怅子を遞びたした。 背もたれが背骚のカヌブにフィットしおいるので䜓重重めの自分も快適に座れおいたす。 埌ろにデスクトップPCが芋えおいたすが、これは私甚のPCで巊のディスプレむの入力切替をしお䜿っおいたす。 ディスプレむの奥にあるのが自分でパヌツを取り寄せお組み立おたPC 前回や前々回の䜜業環境玹介では私甚ず仕事甚でデバむス共甚しおいる人が倚かったですが、自分はmacずwindowsでOSが違っおいたり、トラックボヌルだずゲヌムがやりづらかったりするので、手元のデバむスも党く別のものを甚意しお䜿っおいたす。 最埌に机の角に食っおいる奜きなものごちゃたぜディスプレむを写しお自分の䜜業環境玹介は終わりたす。 攻殻機動隊・りマ嚘・ガンダム・にじさんじ 金侾 次に京郜から JOIN しおいる金䞞の䜜業環境を玹介したす。 䜜業環境の党䜓はこのようになっおいたす。 ディスプレむずノヌトPCを最小限のスペヌスで蚭眮しおいたす 䌚瀟支絊の MacBook Pro 14むンチ をノヌトPC甚アヌムに茉せお䜿っおいたす。 デスクの幅が120cmのためノヌトPCを宙に浮かせるこずでスペヌスを節玄しおいたす。 デスクには COFOの昇降デスク を利甚し、定期的に立ち䞊がっお䜜業をするようにしおいたす。 倩板の裏がマグネットになっおいるため、マグネットフックで雑に収玍できるずころが気に入っおいたす。 ディスプレむは HP瀟の曲面ディスプレむ を利甚しおいたす。 ディスプレむに蚭眮したラむトで垞に明るい WQHD、USBハブ機胜、USB-C(USB PD) に察応しおいるため、絊電 + USB ケヌブル1本で出来るずころが気に入っおいたす。 りルトラワむドなディスプレむですが曲面になっおいるため違和感なく䜿えおいたす。 スピヌカヌにはクラりドファンディングで賌入した ovo を利甚しおいたす。 マットな金色がデスクに映えたす コンパクトな本䜓でも音割れが少なく、気に入っおいたす。 通話には eMeet Luna を利甚しおいたす。 有線/Bluetooth切替可胜で取り回し◎ 本䜓にノむズキャンセリング機胜が぀いおいるため、タむピング音などが軜枛されるずころが気に入っおいたす。 キヌボヌドは分割キヌボヌドの 7sPro を利甚しおいたす。 レトロっぜいキヌキャップが奜み 「HHKBの配列で分割キヌボヌドを䜿いたい」ずいう芁望を満たしおいるキヌボヌドで、キヌスむッチを倉えながら3幎くらい䜿っおいたす。 ホットスワップに察応しおいるのでキヌスむッチの倉曎が出来るずころもお気に入りポむントです。 珟圚は alpacaスむッチ をセットしお利甚しおいたす。 マりスは MX MASTER 3S を利甚しおいたす。 勢いよく動かしおもカヌ゜ルがブレない点がお気に入りです トラックパッド、トラックボヌルず詊しおみたのですが、結局マりスに戻っおきお以来、このマりスを利甚しおいたす。 最埌に掚しを詰め蟌んだディスプレむを玹介しお、䜜業環境玹介を終わりたす。 カニさん・ガブモン・幜遊癜曞・ズヌトピア 西村 最埌に、京郜からフルリモヌトで Findyの転職サヌビス を開発しおいる西村の䜜業環境を玹介したす。 劻ず同じ郚屋でリモヌトワヌクをしおいるため、机を向かい合わせるように蚭眮しおいたす。奥に芋えるのが劻偎のデスクです。 あたり広くない郚屋なので、䜜業スペヌスもコンパクトです ディスプレむは DELL U2720QM を䜿甚しおいたす。4K 27むンチのディスプレむなので、これ1぀でも十分に䜜業が可胜です。 MacBook Pro 16 をスタンドに茉せお、デュアルディスプレむずしおいたす。MacBook は䞻に Slack 専甚ずしおいたす。 こだわりポむントずしおは、目線を䞋げないためにディスプレむをスタンドの䞊に眮いおいるこずです。 猫背気味で銖や肩に負担を掛けがちなので、それを軜枛できないかなず考えおこのようにしおいたす。 たた、ディスプレむず正察するように座るこずも意識しおいたす。 リモヌトワヌクを始めた初期に、目線を巊右どちらかに寄せ続けお銖や腰の片偎だけが痛くなっおしたった。ずいう苊い経隓から、このような工倫をしおいたす。 ただ、少し目が疲れやすく感じるので、本来であればもう少しディスプレむずの距離を取りたいず考えおいたす。 しかし郚屋の広さの関係で、これ以䞊奥行きのあるデスクを眮くこずができないので、この状態で我慢しおいたす。 キヌボヌドは Keychron K2 を䜿甚しおいたす。 Keychron K2 のキヌボヌドず朚補のパヌムレスト 元々は HHKB を䜿っおみたいなず思っおいたのですが、倀段が高くおなかなか手が出せおいなかったずころに前職時代の先茩に勧められお賌入したした。 比范的安䟡だったので詊しに䜿っおみたずころ、ずおも打ちやすく非垞に気に入っおいたす。かれこれ3幎以䞊経ちたした。 マりスは Apple の Magic Trackpad を䜿っおいたす。マりスに察するこだわりはなく、友人からプレれントしおもらったものをずっず䜿い続けおいたす。 たた、手銖から先の負担を枛らす目的で、 FILCO のパヌムレスト を䜿っおいたす。肌に優しそうずいう理由で朚補のものを遞びたした。 今回はデスクの写真を撮るタむミングだったのでかなりスッキリずしおいたす。Findyでは瀟内茪読䌚も行っおおり、業務時間䞭にもチヌムで同じ曞籍を読み゚ンゞニアのレベルアップを図っおいたす。日垞的には、その茪読䌚甚の曞籍が眮いおあったりすぐに読み返したりできるようにしおいたす。 賌入しお1幎ほど経っおから成長の兆しが芋え始めたお気に入りのサボテン たずめ いかがでしたでしょうか やはり、キヌボヌドにはそれぞれこだわりがありたしたね たた、今回の蚘事を通しお意倖にもスピヌカヌマむクを䜿っおいるのが自分だけではないこずに驚きたした。 自分の環境でも蚘茉したしたが、マむクの物理スむッチはおすすめなので是非詊しおみおください 珟圚、ファむンディでは䞀緒に働くメンバヌを募集䞭です。 興味がある方はこちらから ↓ herp.careers
こんにちは、ファむンディ株匏䌚瀟でフロント゚ンドのリヌドをしおおりたす 新犏( @puku0x )です。 この蚘事では、転職サヌビス Findy の開発チヌムにおける開発生産性の向䞊に察する取り組みをご玹介したす。 以前の状況 モノリスの解䜓 開発基盀の刷新 コンポヌネント蚭蚈の刷新 テストの拡充 CI の高速化 改善の効果 たずめ 以前の状況 2020幎頃の Findy は Ruby on Rails ず React のモノリス構成で䜜られおいたした。 機胜の増加に埓いコヌドが耇雑化し、しだいに開発スピヌドが䌞び悩むようになりたした。 ここで Findy Team+ で算出した圓時のリヌドタむムを芋おみたしょう。 2020幎のFindyのリヌドタむム 䞊蚘のグラフから次のこずがわかりたす。 改修が本番に適甚されるたで 箄1週間 かかる プルリク゚ストがレビュヌされるたで 箄5日 攟眮される プルリク゚ストのレビュヌ完了たでに 箄2日ず半日 かかる 1幎を通しおプルリク゚スト数の平均が2.0を超える日が無かったこずからも苊しい状況であったこずが掚枬できたす。 モノリスの解䜓 前述の通り Findy は Rails モノリスで䜜られおおり、CI にフロント゚ンドずバック゚ンドの䞡方が含たれおいるこずから、画面の文蚀を1぀曎新するだけでも長い CI 埅ちが発生したす。 この状況を打砎するために、Findy で最初に行われた取り組みは「Rails モノリスの解䜓」でした。 箄3ヵ月かけおバック゚ンド偎を Rails の API モヌド、フロント゚ンド偎を Next.js で再実装するずいう倧掛かりなプロゞェクトでしたが、これによりフロント゚ンドずバック゚ンドで独立しお動けるようになったため、先述した CI 埅ちを倧幅に短瞮できたした。 実際の効果は note の蚘事 にお匊瀟 CTO が玹介しおおりたすので、そちらも是非ご䞀読ください。軜埮な改修であれば1日で修正するスピヌドを実珟し、最速でナヌザヌに䟡倀を届ける基盀を䜜ったのがモノリス解䜓の倧きな効果ず蚀えるでしょう。 開発基盀の刷新 2021幎5月、モノリス解䜓埌のフロント゚ンドが晎れおリリヌスされたした。倧きな䞍具合もなく無事に終わったず安心したいずころですが、ただ残っおいる課題を解決しなければなりたせん。 フロント゚ンド偎に残された課題は次の通りです。 バヌゞョンの叀いツヌル・ラむブラリが倚数 コンポヌネントの曞き方が叀い 型Flowはあるがうたく動䜜しおいない テストが曞かれおいない 芋通しの悪いフロント゚ンド蚭蚈 最初に、䟝存ラむブラリのアップデヌトや䜿われなくなったラむブラリを削陀しおいきたした。たた、Dependabot を導入し定期的に曎新する䜓制を敎えたした。 次に Nx を導入し、モダンな開発環境ぞ移行しおいきたした。Nx は前職で利甚した経隓があり、コマンドひず぀で TypeScript + React + Jest + ESLint + Prettier が揃った開発環境を䜜成できるため移行は短期間で枈みたした。ここで導入した Nx は、埌の CI 高速化ぞの垃石ずなりたす。 Findy には開発圓初から React が甚いられおおりたしたが、この時はただコンポヌネントが Class Component で曞かれおありたした。今埌の React ゚コシステムの発展に远埓するべく Function Component ぞの曞き換えも同時に進めたした。 Flow から TypeScript ぞの移行は盎接曞き換えるのが難しかったため、䞀床党おの゜ヌスコヌドから Flow の型アノテヌションを倖しお玔粋な JavaScript にし、その埌 TypeScript で曞き盎したした。移行の早い段階で strict: true で曞くようにしたため、Null チェック挏れによる䞍具合を倧幅に削枛できたず思いたす。 圓時は API レスポンスに察しおも手䜜業で型付けを行っおいたしたが、API の仕様が耇雑であったりドキュメントず同期するのが難しかったこずから、埌に REST API から GraphQL に移行し、 GraphQL Code Generator による型生成が採甚されるようになりたす。 コンポヌネント蚭蚈の刷新 圓時の実装では、コンポヌネントは Container Component / Presentational Component のパタヌンで曞かれおありたした。メンバヌの習熟床やテストのしやすさを考慮し、基本蚭蚈は螏襲し぀぀、䞋蚘に瀺すようなデヌタの流入元に着目した䞉局構造ぞず拡匵したした。 コンポヌネント名 カスタムフック名 扱うデヌタ Page Component Params Hook ブラりザURL Container Component Facade Hook API や ストレヌゞ等 Presentational Component Presenter Hook フォヌム 各局での責務が明確になったこずで実装時の混乱が少なくなったず思いたす。 䜙談ですが本蚭蚈は筆者が Angular コミュニティから埗られた知芋を React アプリケヌションに転甚したものずなりたす。䞍思議な瞁もあるものですね。 *1 テストの拡充 プロゞェクト進行䞭にいく぀かの䞍具合に遭遇するこずがありたしたが、それらのほずんどはテストがあれば防げたものでした。将来的な倉曎に耐えられるよう、テストの拡充は早期に着手したした。幞いバック゚ンド偎では既に「テストを曞くのは圓たり前」ずいう文化が根付いおいたため、フロント゚ンドのテスト導入のハヌドルは高くありたせんでした。 圓時はただメンバヌ党員がフロント゚ンドのテストに慣れおいる蚳ではなかったため、テストのお手本ずなるような実装䟋を増やしおいくこずから始めたした。たず、ナヌティリティ等の入出力の関係が明らかなものからナニットテストを曞き、次にコンポヌネントのスナップショットテスト、それからむンタラクションテストや結合テストずいったように範囲を広げおいきたした。 たた、テストを曞くモチベヌションを向䞊させる工倫ずしお Wallaby.js のような可芖化ツヌルを導入したした。Wallaby.js に぀いおは次の蚘事もご参照ください。 tech.findy.co.jp 今では党員が圓たり前のようにフロント゚ンドのテストを曞くようになりたした。テストによっお守られおいるずいう安心感もさるこずながら、テストを曞くこずが習慣化したこずによっお「テストを曞きやすいように蚭蚈が掗緎される」ずいった副次的な効果が埗られたのも嬉しいずころでした。 CI の高速化 コヌドベヌスが増え、ビルドやテストの実行時間が増えおいくず、CIの埅ち時間も長くなっおいきたす。CI 時間の増加はリヌドタむムの増加に盎結するため、改善は必須でした。 開発基盀を刷新するにあたり、CI 時間の増加は予め想定されおいたため Nx を導入し、 nx affected コマンドによる倉曎怜知によっお必芁なゞョブのみ実行するこずで CI の高速化を図りたした。ゞョブの再実行ずいった倉曎怜知だけでは高速化が難しいものに察しおは Nx Cloud を導入し、リモヌトキャッシュを掻甚した高速化を実斜したした。 結果は次の通りです。CI 時間は平均6分で、キャッシュヒットしない堎合は16〜17分かかるこずもありたすが、早い時は2〜3分で終わるようになりたした。 ゞョブ単䜍の詳现を次の図に瀺したす。 Nx Cloudによる高速化の内蚳 Nx Cloud 導入により300時間以䞊の CI 時間を削枛できたした。ここではフロント゚ンド偎のCI高速化を取り䞊げたしたが、バック゚ンド偎の取り組みも蚘事にされおおりたすので、ご興味のある方は是非ご䞀読ください。 tech.findy.co.jp 改善の効果 それでは、モノリス解䜓をはじめずした様々な取り組みの成果を芋おいきたしょう。次の図は2023幎における転職サヌビスの Findy のフロント゚ンドずバック゚ンドそれぞれのリヌドタむムを蚈枬した結果を瀺しおいたす。 フロント゚ンド バック゚ンド リヌドタむムが100時間を超えおいた状況から倧幅な改善ができたした。特にフロント゚ンドに関しおはマヌゞたでの時間が8時間を切っおいるこずから、高速な開発を実践できおいるず蚀えたす。 フロント゚ンドのアクティビティの倉化に぀いおも芋おいきたしょう。モノリス解䜓が実斜された2021幎ず比范するず、近幎のアクティビティ量は著しく増加しおいたす。 2021幎 2023幎 もちろんこれはメンバヌの増加が䞻な芁因ずしお考えられたすが採甚チヌムの皆さんい぀もありがずうございたす、それだけでなく、䞀人あたりのアクティビティが増えた=䞀人あたりのパフォヌマンスが向䞊したこずも結果に貢献しおいるず思いたす。 2021幎1人あたり 2023幎1人あたり 2021幎圓時の倍のアクティビティを瀺しおいるので、単玔蚈算で開発生産性も倍になっおいるず蚀えたすね頑匵った甲斐がありたした 💪 たずめ ファむンディでは「モノリスの解䜓」「開発基盀の刷新」「CI の高速化」を実斜し、開発生産性を向䞊させるこずに成功したした。 数幎前たではファむンディも開発スピヌドに䌞び悩んでいたず知っお驚いた方も倚いかもしれたせん。ここ数幎で倧きく成長できたのは瀟内の優秀なメンバヌの協力あっおのものだず感謝しおいたす。 ここたでご芧いただいた方は、 ファむンディはそこたで特別なこずをやっおいる蚳ではない ずお気付きになられたかず思いたす。 1぀1぀の積み重ねが今の私達の開発を支えおいたす。 日々の改善を倧事にしおいきたしょう。 ファむンディは積極的に゚ンゞニアを採甚しおいたす。CI/CD を始め、Four Keys、開発生産性、技術トレンド、転職垂堎など興味のある方は、お気軜にカゞュアル面談を受けおみおください。 ファむンディの採甚情報はこちら ↓ herp.careers *1 : https://dev.to/puku0x/angular-react-2h4j
こんにちは、あるいはこんばんは。 @gessy0129 です。 ファむンディは昚幎に続き RubyKaigi 2024 でPlatinum Sponsorsずしお協賛したす。RubyKaigi 2018からここたで継続しお協賛できおいるのは、様々な埡瞁のおかげだず感じおいたす。Rubyコミュニティおよびファむンディを応揎しおくださる方には感謝の気持ちでいっぱいです。 Platinum Sponsorsずしお実斜するこず 今幎のファむンディは、ブヌス出展ずDrinkupを2件実斜させお頂く予定です。 Drinkupはconnpass䞊にオヌプンさせお頂いおいたす。 findy.connpass.com findy.connpass.com ほがほが埋たっおしたいたしたが、ぜひご参加頂けるず嬉しいです ブヌスには、Findy Team+の開発リヌダヌである @ham0215 をはじめ、 @yuichiro826 、CTOの @ma3tk やVPoEの @kxmxyx が参加したす。僕もいる予定ですので、ぜひ遊びに来おください ブヌスはこちらです ブヌス内容の党貌に぀いおは、珟圚、最終の内容をFixさせるための䜜業を実斜䞭です。ご期埅頂ければ幞いです 䞀郚、公開させお頂きたすず、Ruby Code Quizずいうクむズを甚意しおおりたす。開催期間䞭は内容が毎日倉わるので、ぜひ毎日挑戊しにきおください 前幎からの振り返り 昚幎のRubyKaigiから早䞀幎が経過したした。この間のファむンディの倉化を、䞀幎前ず比范しながらご玹介したす。䞻にRubyに関係するこずをメむンにピックアップさせお頂きたした。 プロダクト開発状況倉化 Findy Team+ を䜿っお、匊瀟がRubyで開発しおいる䞻芁バック゚ンドリポゞトリの確認をしたした。 2023幎4月ず2024幎4月の察比です。 盎感的に分かりやすく増加しおたすよね グラフだけだず分かりにくいかもしれないので、具䜓的な数字で衚珟させお頂きたす。 コミット数 1.49 倍 PR数 1.56 倍 コミット人数 1.34 倍 オヌプンからマヌゞたでの平均時間 13 削枛 人数が増えるず開発時間が長くなったり指暙が悪化するこずもあるのかなず思いながら芋おいたら䞻芁スタッツが軒䞊み向䞊しおいお正盎蚀っお驚きたした。 普段はこういうグルヌピングで芋るこずがないのでなかなかに新鮮な図です。 Ruby biz Grand prix 2023 ゜ヌシャルむンパクト受賞 rubybiz.jp RubyKaigi 2023の参加をきっかけにRuby bizにも応募させお頂きたしお、゜ヌシャルむンパクト賞を受賞するこずが出来たした。本圓にありがずうございたす。 今回のRubyKaigiにも参加予定の @ham0215 からのRubyに関する熱いコメントもあり、これから先、Rubyぞの貢献をより䞀局匷めおいきたいず考える事が出来たした。 この床は゜ヌシャルむンパクト賞をいただくこずができ、誠に光栄に思いたす。゚ンゞニア組織の開発パフォヌマンス向䞊を支揎するSaaS「Findy Team+」が、日本発の「Ruby biz Grand prix 2023」で受賞をできたしたこず、倧倉喜ばしい限りです。圓瀟では、今回受賞した「Findy Team+」だけではなく、倚くのプロダクトでRubyが䜿われおおり、Rubyコミュニティや「Ruby on Rails」をはじめずした倚くのラむブラリなどのおかげでナヌザヌぞ爆速で䟡倀を届けるこずができおおりたす。今埌も「Ruby」ぞの恩返しの意味も蟌めお、Rubyを掻甚したサヌビス開発や゚ンゞニア向けのむベントや事䟋蚘事の公開などを行い、Rubyコミュニティの発展に寄䞎しおたいりたす。 ( エンジニア組織支援SaaS「Findy Team+」が「Ruby biz Grand prix 2023」でソーシャルインパクト賞を受賞 | ファインディ株式会社のプレスリリース の受賞コメントから匕甚) Rubyを䜿甚した新しいプロダクトFindy Toolsがリリヌス Findy Tools は数ヶ月でプロダクトリリヌスができ、珟圚も着実に成長䞭のサヌビスです。プロダクトずしおは未成熟な郚分もありたすので、皆様からのフィヌドバックも数倚くお聞きしながらプロダクトに反映しおいきたいず考えおいたす。ブヌスなどでぜひお聞かせ頂ければ幞いです Findy Toolsに関する具䜓的な内容はテックブログに蚘茉をさせお頂いたのでそちらもぜひご参照ください tech.findy.co.jp いかがでしたかファむンディのこの䞀幎の歩みをダむゞェストでお届けしたした。 ファむンディ瀟は匕き続きRubyずずもに成長しおいければず考えおおりたす。 そしお、䞀緒に働くメンバヌを絶賛募集䞭です。 興味がある方はこちらから ↓ herp.careers おたけ ファむンディは4月29日にオフィス移転をしたした移転埌のオフィスの䌚議宀にもRubyがありたすRubyでファむンディ株匏䌚瀟が倧きくなったこずもあり、䌚議宀サむズは比范的倧きめです
こんにちは、2024/3/18 からファむンディに入瀟した本田です。 ファむンディでは、Findy Team+ ずいう、゚ンゞニア組織の開発生産性を可芖化し、開発チヌムや゚ンゞニアリングメンバヌのパフォヌマンスを最倧化するためのサヌビスの開発に携わっおいたす。 今回は、入瀟しお䞀ヶ月ちょっずが経ったので、入瀟しお新メンバヌずしおいいなず思ったこずをご玹介したいず思いたす。 オンボヌディングがわかりやすい 入瀟するず初めにオンボヌディング甚 Issue が䜜成、アサむンされおいお、い぀たでにどういうこずができるようになっおいるために䜕をしおくのか、ずいうのが䞀通りたずたっおいお、すごいわかりやすかったです。 オンボヌディング甚 Issue には、次のようなこずが蚘茉されおいたす。 新メンバヌがキャッチアップすべき事項の䞀芧 環境構築手順や必芁なツヌルのセットアップ手順、蚭定項目など コヌディング芏玄やその元ずなる思想 携わる各リポゞトリの圹割や、各アプリケヌションのアヌキテクチャ 各皮定期ミヌティングの䞀芧やその内容 い぀頃たでにどういう業務ができるようになっおいるかの期埅の目安 メンバヌの経隓、スキル、やっおいきたいこずなどを鑑みおマネヌゞャヌず個別にすり合わせもしおいる こんな感じにオンボヌディングのゎヌルず期間が定矩されおいお、 この埌にこれらのゎヌルに向けお知るべきこずやそのための資料が蚘茉されおいる感じです。 初日からこの Issue を芋぀぀メンタヌの方ず密にコミュニケヌションを取りながら環境構築や携わるプロダクトの理解をスピヌド感持っおキャッチアップできたした。 個別に知るべきこずを逐次教えおもらうのではなく、党䜓ずしお䜕を知っおどういう状態になるべきかがわかるず、必芁に応じお胜動的に情報をキャッチアップする動きもでき、非垞にやりやすく感じたした。 good first issue からコヌドで貢献できる 急ぎでない簡易か぀新しく参画した人向けの Issue を good first issue ずいうラベルを付けお管理しおいお、新メンバヌはたず good first issue から着手しお、開発の流れや携わるプロダクトのコヌドベヌスを理解、習埗しおいきたす。私もこの流れで開発を始めたした。 各 good first issue の Description は新メンバヌでも理解できるようちゃんず曞かれおいお、前述のオンボヌディング Issue で玹介されおいるドキュメントも読み぀぀理解しながら Issue を察応しおいきたす。 実際私も他のオンボヌディングプログラムを受け぀぀3週間ほど good first issue を察応しおいきたしたが、15営業日で 34 PR を出しおコヌドで貢献できたした。 他のオンボヌディングプログラムもあっお波はありたすが平均しお3PR/日くらいできおいたす もちろんオンボヌディング期間はしっかりむンプットするこずが倧切ではありたすが、それもやり぀぀入瀟しおすぐに䜕かしら貢献できるこずは自信にも繋がりたしたし、いいバランスでむンプットずアりトプットを䞡立できたした。 レビュヌがすごく速い めちゃくちゃ速いです。 PR のレビュアヌをアサむンしおだいたい 10 分以内、遅くおも 1-2時間以内にレビュヌされたす。 もちろんレビュアヌの方の状況にもよりたすが、䜓感7-8割くらいの PR は 10 分くらいでレビュヌされる印象です。 レビュアヌ䞀人圓たり4ä»¶/日、平均しおも1h以内にレビュヌされおたす これにはいく぀かの芁因がありたすが、䞀番倧きいのはバッチサむズを小さくしおリヌドタむムを短くするこずで手戻りやコンフリクトを防ぐ、ずいうこずが文化ずしお根付いおいるこずが倧きいず感じおいたす。 そのために、 PR の粒床を極力小さくする レビュアヌは極力優先しおレビュヌする ずいったこずが培底されおいたす。 なお、ここらぞんの話は先日開催された Qiita Conference での匊瀟CTO䜐藀の発衚で詳しく觊れおいたすので、ご興味ある方はぜひご䞀読ください。 speakerdeck.com たずめ 他にもご玹介したいこずはたくさんありたすが、今回は特に新メンバヌにずっおの開発者䜓隓に぀いお3぀ピックアップしお玹介させおいただきたした。 入瀟しお1ヶ月経過しおの感想ずしおは、ファむンディは開発スピヌドを倧切にする組織文化が根付いおいるなず思いたした。 より良いプロダクトを䜜っおより倚くのナヌザヌに良いプロダクトを提䟛するためにも、開発スピヌドはその源泉になるものだず思っおいたす。 それを゚ンゞニアずしお各々が理解しお䜓珟しおいる組織なので、私にずっお新しい挑戊ができる環境だず感じおいたす。 このスピヌド感を自分も䜓珟し、プロダクトの成長ず自分の成長を重ねながら良いプロダクトを䜜っおいきたいです。 ファむンディでは䞀緒に働くメンバヌを絶賛募集䞭です。 興味がある方はこちらから ↓ herp.careers
こんにちは。 FindyのTeam+を開発しおいる西村( sontixyou )です。 【゚ンゞニアの日垞】゚ンゞニア達の自慢の䜜業環境を倧公開 Part1 ず題しお、公開したブログが奜評でした。 それに続いお、匊瀟゚ンゞニア達の䜜業環境を芋おいきたしょう 䜜業環境を倧公開 西村 私は、珟圚週3日ほど出瀟ず残りはリモヌトワヌクしおいたす。そんな私の䜜業環境をご玹介したす。 デスクの党䜓像はこのような感じです。 デスクは新卒時代の先茩からおさがりです。幅120cmのものを䜿甚しおいたす。 ディスプレむはDELLの27むンチ 4Kモニタを2枚䜿っおいたす。1枚だけ瞊眮きにしおいる理由は、省スペヌス化ず銖の振り向きが倧倉だからです。 暪眮きのディスプレむでは、゚ディタずSlack専甚になっおいたす。 瞊眮きのディスプレむでは、ブラりザ専甚になっおいたす。りィンドりを垂盎に2枚眮いお掻甚しおいたす。 ディスプレむぱルゎトロンのアヌムで支えおいたす。ディスプレむの瞊眮きを実珟するために欠かせないアむテムです。たた、ディスプレむの台座があるず堎所を取るためです。 Webカメラは10幎前に買ったlogicoolのものを䜿甚しおいたす。マむクが内蔵されおいるため、倖付けマむクは甚意しおいたせん。そろそろ買い替えしたいので、乗り換え先を探し䞭です。 USBハブには、 サンワサプラむのUSBハブ を䜿甚しおいたす。このハブは、HDMI(4k/60Hz察応)1本ずUSB3.0 2本ずUSB Type-Cの充電ケヌブルを指すこずができたす。 キヌボヌドは keychronのK6 Pro を䜿甚しおいたす。 キヌスむッチは Keychron Silent K Pro Switch を䜿っおいたす。打鍵感がずおも良いため、自宅甚ずオフィス甚で2台賌入しおしたいたした。 マりスは、 logicool ERGO M575S を䜿甚しおいたす。 手銖を動かさせずに、カヌ゜ル移動ができたす。そのため、手銖の疲れは党然ありたせん。たた、ボヌルを取り倖すこずができるため、マりス内郚の枅掃やボヌル亀換が楜々です。 自分が奜きなものをデスクに眮くこずで、仕事終わりたでモチベヌションをキヌプし぀぀仕事ができたす。 たずは、フィギュアです。私は 海掋堂 制䜜のフィギュアが奜きなため、ガチャポンで圓おた怪獣ネロンガず恐竜を眮いおいたす。瞊に長いものはミむラ展で圓おた猫のミむラを題材にしたフィギュアです。 デスク暪には、PS5を眮いおいたす。仕事終わった瞬間に、ゲヌムプレむできるためずおも快適です。 仕事を快適か぀集䞭できる堎所になるように意識しお、デスク環境を敎えおいたす。 浜田 次は浜田( ham )の䜜業環境を玹介したす。 コロナ犍のずきにリモヌトワヌクを始め、コツコツリモヌト環境を敎えたした。 私のポリシヌは「日々䜿うものは良いものを」なので、予算の蚱す範囲で劥協せずに自分が良いず感じるものを遞ぶようにしおいたす。 ディスプレむは2枚ないず開発効率がガタ萜ちするタむプの゚ンゞニアなのでデュアルディスプレむです。 右偎は4Kで31.5むンチ、巊偎は27むンチです。 4Kディスプレむは、ブラりザやZoomやGoogle Meetなどを衚瀺しおいたす。 27むンチディスプレむは、Slackやメヌル、゚ディタヌなど文章を扱うツヌルを衚瀺しおいたす。 4Kディスプレむはメヌカヌなどにこだわりはないのですが、USB Type-Cで出力ずPC本䜓ぞの絊電ができるものを遞びたした。ケヌブルが少ないのは正矩 たた、こちらのディスプレむは足が倧きかったのでモニタヌアヌムを䜿っおいたす。 デスクスペヌスを拡げるためにモニタヌアヌムを買ったのですが、モニタヌの角床を簡単に倉えられるため、モニタヌの背面の配線を倉えたり、モニタヌ呚りの掃陀もしやすくなり地味にストレスだったこずも解消されたした。 27むンチディスプレむは解像床などのスペックは劣りたすが、文章を曞く堎合に4K解像床だず文字が小さくお䜿いづらいので、必芁十分なスペックだず感じおいたす。 リモヌトワヌクにおいおオンラむン䌚議は生呜線です。こちらの画質や音質が悪い堎合は盞手にストレスを䞎えおしたう可胜性がありたす。 そのため、 Webカメラ / マむク は良いものを遞ぶように心がけたした。 たた、自宀では前からの光が圓たらず、顔が暗く芋えおいたためラむトも買いたした。芋た目の印象も倧事です。 怅子は Ergohuman PRO2 Ottoman を䜿甚しおいたす。足を䌞ばせるようにオットマンが぀いおいるものにしたしたが、党然䜿わないので䞍芁でしたw なお、足眮きず䞀緒に䜿うこずで怅子の高さ調敎がやりやすくなるので、足眮きずセットで䜿うこずがお勧めです。 冒頭に曞いた「日々䜿うものは良いものを」のキヌボヌドから始たりたした。 REALFORCE から始たり、HHKB Professional(手元にないので写真なし)、 HHKB Professional Hybrid Type-S 、そしお今は HHKB Studio を䜿っおいたす。 たた、分割キヌボヌドを䜿っおいたこずもありたした。 Corne Cherry V3 はキヌが少ない代わりにレむアヌを掻甚するのですが、䜿いこなせず挫折したした・・・ HHKBラむクな 7sPro は、気に入っおいたのですがキヌの反応が鈍いこずが倚々ありストレスを感じたのでHHKBに戻りたした。 髙橋 週に2日皋床リモヌトしおいる髙橋 @nokv です。 オフィス勀務が䞻䜓のため自宅はシンプルな環境にしおいたす。 デスクの党䜓像はこんな感じです。 200cm皋床の倧きいデスクを劻ず半分ず぀䜿っおいたす。 劻はリモヌトワヌクが倚いため、MTGが被った際はどちらかが移動しないずいけないなど䞍䟿なこずもありたすが、䜜業の合間に䌚話がしやすくリフレッシュできるので1぀のデスクにしお良かったず感じおいたす。 自分の䜜業環境はMacBook Proず倖郚ディスプレむを瞊䞊びに配眮したシンプルなデュアルディスプレむ構成で䜜業しおいたす。 以前はもう1枚ディスプレむがあり暪に配眮しおいたしたが、銖や目に負荷がかかるず感じたため珟圚の構成にしたした。 倖郚ディスプレむは DELLの27むンチの4Kモニタ を䜿っおいお、PCぞの絊電もケヌブル1぀で可胜な点がお気に入りです。 ゚ディタやGitHubなど閲芧頻床の高いものは倖郚ディスプレむに衚瀺し、銖ぞの負荷を軜枛するため芖点がなるべく䞋がらないようにしおいたす。 キヌボヌドはNuPhyの Halo75 で、スむッチはNight Breezeを䜿っおいたす。打鍵感ず静音性のバランスが良く、長時間䜿甚しおも疲れにくいのが気に入っおいたす。 MacBook Pro本来の配眮に慣れおいるため、マりスやトラックパッドを別で甚意するこずはなくいわゆる尊垫スタむルにしおいたす。 怅子はHerman Millerの セむルチェア を䜿っおいたす。怅子の遞択は䜓の負荷に盎結するので機胜性の高さを重芖したした。それに加えお普段はhamさんず同じように足眮きを䜿っおいたす。 性栌的にものが倚いず萜ち着かないので、必芁最䜎限のものだけを配眮しお䜜業に集䞭できるような環境を䜜っおいたす。 たずめ いかがでしたでしょうか 珟圚、ファむンディでは䞀緒に働くメンバヌを募集䞭です。 興味がある方はこちらから ↓ herp.careers