株匏䌚瀟LIFULLのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟LIFULL

株匏䌚瀟LIFULL の技術ブログ

å…š664ä»¶

LIFULLプロダクト゚ンゞニアリング郚の堀です。具䜓的にはLIFULL HOME'Sの開発を行っおいたす。私はその䞭でも賃貞領域の開発を担圓するグルヌプに所属しおいたす。 今回は、゚ンゞニア・䌁画・デザむナヌ3職皮混合チヌムで、少し今たでずは違った圢でスクラム開発に取り組んだのでその話をしたいず思いたす。 テヌマは「3職皮䞊流」 です。 前提 本蚘事の立ち䜍眮 これたでの課題感 3職皮䞊流で効率良い開発 3職皮䞊流ずは 半期の目暙蚭定 斜策怜蚎 斜策ブレスト䌚 UTナヌザヌテスト実斜 デむリヌスクラム 開発効率の向䞊 スプリントスケゞュヌル たずめ 前提 開発䜓制などはチヌムの構成や仕組みによっお倧きく倉わるので、たず前提ずしお私が所属しおいるチヌムの説明を行いたす。 我々の郚門はLIFULL HOME'Sの賃貞開発を担圓しおおり、今期は5぀のチヌムに分かれおいたす。その䞭でも私はプロダクトのグロヌスチヌムに所属しおいたす。 チヌムのメンバヌぱンゞニア4人、䌁画2人、デザむナヌ1人ずいう構成になっおいお、゚ンゞニアの1人がSMスクラムマスタヌを兌任しおいたす。 プロダクトオヌナヌず呌ばれる存圚はチヌム内には存圚せず、プロダクトの方向性やバックログ斜策の劥圓性は䌁画䌚議で刀断されたす。 グロヌスチヌムはずあるプロダクトに察しおKPI目暙を持っおおり、我々はその目暙を期を通しお達成するこずを䜿呜ずしお動いおいたす。 たた、各スプリントは2週間単䜍で蚭定されおいたす。 本蚘事の立ち䜍眮 本蚘事は私が所属しおいる1チヌムの動き方にフォヌカスを圓おお曞いおおりたすが、今期はチヌム間の調敎や党䜓でのバックログの運甚などにも郚門を䞊げお取り組んでいたので、そちらの内容は以䞋の蚘事を参考にしおみおください。 www.lifull.blog たた、ここではスクラム䞭の具䜓的な動き方を説明しおいたすが、「他職皮に期埅しおいるこず」をチヌム内で擊り合わせお職皮間の連携を匷める取り組みを別郚門の方が最近蚘事にしおいたので、そちらも是非ご芧ください。 www.lifull.blog これたでの課題感 これたでのスクラム開発でも、メンバヌ構成や目暙の持ち方はほが同じでした。 我々が感じおいた課題感は、特に各斜策の仕様調敎に関しおです。基本的にバックログに远加する斜策は䌁画の方が斜策案を出し、䌁画党䜓の䌚議で決定し、仕様䜜成埌に優先順䜍付けを行った状態でバックログに远加しおいたした。そしお蚈画MTGで各゚ンゞニアにアサむンを行いたす。 開発を始めるず、仕様に関しお疑問を持ったりもっず良い方法を思い぀いたりするこずが良くありたした。たた仕様決定埌にデザむンをデザむナヌが行うのですが、その時に「䌝わりにくさ」などUX芳点での課題点を発芋されるこずもあり、その床に仕様調敎が生じおいたので少し効率悪さを感じおいたした。 3職皮䞊流で効率良い開発 3職皮䞊流ずは これたでの課題を解決するために、斜策立案から仕様決定たでを゚ンゞニア・䌁画・デザむナヌ3職皮党員で行おうずいう取り組みを我々は3職皮䞊流ず呌んでいたす。 半期の目暙蚭定 埓来はリヌダヌ達が各チヌムの远う目暙を蚭定し、メンバヌはそれを自分の䞭に萜ずし蟌んで期の始たりを迎えおいたした。それに察しお今期は3職皮䞊流を実珟するために、たずチヌムが結成された期初に、各チヌム毎に半幎で远うアりトカムの蚭定を行いたした。目的ずしおは 同じ方向を向いお走り出すこずができる状態にする それぞれで自埋しお目暙のために動ける状態にする 以䞊2点です。 今、期が終わろうずしおいるずころですが振り返っおみるず、この目暙蚭定はずおも倧事だったなず改めお感じたした。匊瀟はKPIマネゞメントに取り組んでいるので、郚ずしお倧きなKPIは持っおいるのですが、そのKPIを達成するための方法は各チヌムに委ねられおいたす。これをメンバヌで決めるこずで、期を通しお3職皮党員でしっかりず目暙を芋据えお動けたなず思いたす。 斜策怜蚎 斜策ブレスト䌚 目暙を達成するための斜策怜蚎は、これたで䌁画職がメむンで行っおいたした。しかし䞊に挙げた課題感があったので、職皮関係なく斜策案出しから入るようにしたした。倧䜓、週1時間のペヌスで斜策ブレスト䌚を開催し、次以降のスプリントで実斜する斜策の倧たかな仕様決定たで行いたした。 ゚ンゞニアが䞊流から入るこずで、より工数の少ない方法や別の実珟方法などアむデアの幅が広がったり、デザむナヌが入るこずで 斜策そのものに察しナヌザヌの芖点を反映させるこずができたりしたす。たた仕様䜜成の時点でデザむナヌがビュゞュアル的に可芖化できるので、他職皮もより仕様を理解しやすくなり3職皮䞊流を加速させるこずができたす。 UTナヌザヌテスト実斜 UXプロダクトを䜜っおいるず数倀分析は行っおいるので課題ずなっおいる郚分は分かるのですが、「なぜナヌザヌは離脱するのか」「䜕が迷わせおいるのか」等の原因が䜜っおいる偎の目線だず分からない事が倚々ありたす。それでは3職皮集たっおも有意矩な斜策ブレストは行えたせん。 そこで我々のチヌムはUTをチヌム内で行い、課題の原因を探るようにしたした。UT分析から芋えおきた原因をブレスト䌚に持ち蟌むこずで斜策の案出しの材料ずする事ができたした。 匊瀟にはUTを専門にしおいる郚眲もあるのですが、様々なプロダクトを芋おいるので実斜回数に限界がありたす。そこをチヌム内で行うこずでPDCAを早く回せるようになりたした。UTを行うこずで課題感が芋えるだけでなく、斜策の効果も実際の動きを芋ながら確認できるのでモチベヌションにも繋がりたす。ただ、チヌム内で実斜するずメンバヌの工数が嵩むので、UTチヌムず連携を取っお臚機応倉に担圓範囲を決めたりなど工倫するず良いず思いたす。 チヌムで蚭蚈や分析の参考にした曞籍を参考に眮いおおきたす。 http://www.amazon.co.jp/dp/4274226719 www.amazon.co.jp デむリヌスクラム 斜策ブレスト䌚で実斜が決たった斜策は、䌁画が现かい仕様決定を行い、デザむナヌがデザむンを䜜成したす。途䞭で悩むポむントが出おきた堎合や盞談が必芁な堎合は、チヌムメンバヌが揃っおいるデむリヌスクラムで盞談を行いたす。 そこでの盞談ではfigmaやXDなどのツヌルを䜿っお可芖化されたものをベヌスに党員で議論するので、芖芚的にも想像しやすく深い議論が可胜です。必芁に応じお゚ンゞニアがプロトタむプを䜜成し持ち蟌むこずもありたす。 開発効率の向䞊 埓来は課題の発芋から仕様に萜ずし蟌む郚分たでを䌁画職が行い、その埌にデザむン・実装・リリヌスず続く圢が取られおいたした。この堎合だず䞊流工皋はりォヌタヌフォヌルのようになっおおり、結果が出るたでに時間がかかりたす。 しかし、䞊に述べたようなUT・斜策ブレストを通しお3職皮党員で課題発芋からアむデア出したでを行い、党員の認識が揃った状態で仕様䜜成・実装・デザむンなどを同時䞊行で行うこずによっお、リリヌスたでの工皋が短くなり効率よく開発を進めるこずが可胜になりたす。 たた、党員の認識が揃っおいる状態なので、盞談や議論が必芁な際はそれぞれの職皮の芳点でスムヌズに意芋を蚀い合うこずが可胜です。 開発効率の向䞊 スプリントスケゞュヌル 参考になるかも知れないので、スプリントのスケゞュヌル䟋を蚘茉したす。 スプリントスケゞュヌル リリヌススケゞュヌルの関係で、朚曜日がスプリント区切りになっおいお、蚈画MTGず振り返りMTGを行いたす。 蚈画MTGでは䞻に斜策アサむンずストヌリヌポむントの蚭定を行いたす。 斜策の優先順䜍付やバックログの敎理は基本的にSMず䌁画職で氎曜日のバックログリファむメントの時間に行いたす。 䞊で述べた斜策ブレスト䌚は月曜日に行うようにしおいたした。 たずめ 今回、3職皮䞊流でスクラムを戊っおみお、゚ンゞニア目線で開発のやりやすさは勿論、目暙にコミットしようず思う意欲や぀぀の斜策に察する思い入れも以前より増えたかなず思いたした。 実際のナヌザヌの動きを芋お、チヌム内で打ち手を考えるこずでなぜその斜策をやるのか、ナヌザヌにどうなっお欲しいのかが自分の䞭にもチヌムの䞭にもしっかりず萜ずし蟌めたず思っおいたす。 3職皮䞊流はどの職皮であっおも、チヌムの目暙や各斜策によりコミットしおいく動きの䞀぀だず思っおいるので、今埌もより良い開発䜓制を目指しおいきたいず思いたす。 LIFULLでは共に成長できるような仲間を募っおいたす。 よろしければこちらのペヌゞもご芧ください。 hrmos.co hrmos.co
こんにちは。LIFULLでiOSアプリケヌションの開発を担圓しおいる山手です。 LIFULL HOME'S iOSアプリは2009幎12月にリリヌスされお以来、玄12幎ほどサヌビスを継続しおおりプロゞェクト芏暡は幎々倧きくなっおいたす。 新機胜導入や既存機胜の改修などを重ねるに぀れおアプリのビルド時間が延び、 ゚ンゞニアの䜜業時間が圧迫、開発効率が䞋っおしたい満足した状態で開発を行うこずが難しくなりたす。 そんな状況を回避すべく、自動化しお任せられる郚分は任せお゚ンゞニアは開発に専念できる環境を䜜るために、CI/CDサヌビスのBitriseを2018幎6月頃から導入し玄3幎ほど利甚しおいたす。 今回は、芏暡の倧きくなったLIFULL HOME'S iOSアプリでBitriseを利甚する際に盎面した問題や事䟋などをご玹介臎したす。 Bitriseずは Bitriseはモバむルアプリ開発に特化したCI/CDプラットフォヌムを提䟛しおくれるサヌビスです。 ビルドの䞀連の流れを「ワヌクフロヌ」ずいう圢で䜜成できたす。 䜜成したワヌクフロヌに察しおトリガヌを蚭定するこずで、トリガヌタむミングで自動的にワヌクフロヌが走り始めたす。 たた、これらの䜜成はGUI䞊で蚭定するこずができ、簡単にCI/CD環境を構築するこずができたす。 HOME'S iOSアプリにおけるBitrise(CI/CD)の圹割 テスト、及びLint Checkの実行 Pull Requestを立ち䞊げたタむミング、たたはPRにコヌドをPushしたタむミングでテストずLint Checkを実斜し、結果をPRにコメントしたす。 テスト甚アプリの䜜成、及び配垃 テスト甚アプリを䜜成し、むンストヌル甚リンク(Bitrise.io)のQRコヌドをSlackに通知したす。 App Store Connectぞのデリバリヌ masterブランチからReleaseブランチぞPRを出した時に、App Store Connectぞのアプリのデリバリヌを実斜したす。 CIを止めるビルド時間 最新の料金プランでは、ビルド時間の䞊限は蚭けられおいたせんが、以前の料金プランでは45分たたは90分のビルド時間の䞊限が蚭けられおおり、ビルドに時間がかかるプロゞェクトの堎合はCIが完了する前に匷制終了されおしたうこずがありたした。 画像は以前のBitriseの管理画面のスクリヌンショットです。 ※䞀郚画像を加工しおいたす 珟圚は契玄プランを芋盎し䞊限時間が90分になっおいたすが圓時は45分のプランであったためある時期を境にすべおのPull RequestのUTが通らないずいう問題が生じたした。 䞻な原因ずしおは、モバむルデヌタベヌスのRealmのビルド時間が圱響しおいたす。 45分のビルド時間の内、玄14分がRealmのビルド時間に専有されおしたいUTが走る前に匷制終了されおしたっおいたのです。 圓時はCocoaPods経由で、Realmを利甚しおいたした。CocoaPods経由で利甚しおいた理由は、Realm Framework自䜓のサむズです。 Carthageを甚いればビルド枈みのFrameworkをリポゞトリに含めるこずもできるのでビルド時間を短瞮するこずが出来たすが、Realm Frameworkのビルド埌に埗られるFrameworkのファむルサむズが100MBを超えおしたいGitHubにPush出来たせんでした。 䞀方CocoaPodsは、郜床ビルドしおFrameworkを生成したす。リポゞトリにはPodfileのみ含めるこずで、開発者が耇数人いおもPod installを実行するだけで利甚しおいるFrameworkを手元に導入するこずが可胜です。 これ以倖にもCarthage + Git LFSを甚いお、ビルド枈みのFrameworkをGit LFS偎に眮くなどの案もありたしたが費甚などの問題から圓時の開発チヌムではCocoaPodsでRealmを扱うこずずしたした。 Realm導入から時が流れ、利甚するFrameworkなども増え次第にビルド時間が肥倧化し続けたこずで、぀いに契玄プランの䞊限時間を超えるようになっおしたいたした。 倧きな芁因ずしおは、Apple Watch向けの新機胜でもRealm Frameworkを利甚したこずが圱響しおいたす。埓来iOS向けのビルドだけだったものがwatchOS向けのビルドも必芁になったこずでビルド時間が倧幅に䌞びおしたいたした。 このたたCIが回らない状況が続くずBitriseの月額費甚が無駄になっおしたうこずからiOSチヌムずしおはCI環境䞊でのビルド時間短瞮が急務でした。 か぀远加のコストを倧きく掛けずに問題を解消するずいうこずも求められたした。 Carthageを掻甚する CarthageにはGitHub䞊にアップロヌドされおいるビルド枈みのFrameworkを利甚する機胜が備わっおいたす。 この機胜を利甚するにはFrameworkをビルドしたXcodeのVersionを揃える必芁がありたす。 今回はこの機胜に着目しCI環境䞊でのビルド時間を短瞮しおみるこずにしたした。 賛吊䞡論ある問題ですが、今回問題になっおいるRealm関連のCarthageでのビルド埌埗られるファむルを.gitignoreでgitの远跡察象から陀倖したす。 Realm以倖のCarthage経由で導入したFrameworkは、リポゞトリに含めるように倉曎しおいたす。 # Realmはbinaryを再利甚させるため、远跡から陀倖する */Carthage/Build/iOS/**Realm**.framework/ */Carthage/Build/iOS/**Realm**.framework.dSYM/ */Carthage/Build/iOS/**Realm**.framework/ */Carthage/Build/iOS/**Realm**.framework.dSYM/ この倉曎によりリポゞトリをクロヌンした盎埌、Realm以倖の必芁なFrameworkは埗られる環境が出来䞊がりたす。 リポゞトリクロヌン埌、䞋蚘のコマンドを実行しRealmのみ取埗したす。 $ carthage update --platform " iOS, watchOS " realm-cocoa 実行時、Cartfileで指定したRealm Frameworkのバヌゞョンに玐づくビルド枈みのFrameworkをビルドしたXcodeのバヌゞョンがCI環境で利甚しおいるバヌゞョンず䞀臎する堎合は、ビルド䞍芁でFrameworkを利甚するこずができたす。 これによっおCI環境䞊で玄14分ほどかかっおいたビルド時間を玄2分たで短瞮するこずに成功したした。 導入埌のデメリット ビルド枈みのFrameworkをビルドしたXcodeバヌゞョンでないバヌゞョンで、アプリをフルビルドするずFrameworkも再ビルドの必芁が生たれおしたいビルド時間が延びおしたいたす。 そのため、チヌム内で利甚するXcodeのバヌゞョンを䞊げる際にはRealmのバヌゞョンも芋盎す必芁が生たれおしたいたした。 通垞の機胜改修や新機胜远加では倧きな支障にはならないものの、毎幎9月頃に行われるXcodeのメゞャヌアップデヌトの際は、Framework偎が最新のXcodeに察応するこずを埅たないずCIが利甚できないずいう点が難点です。 このようなデメリットも䌎うので、こんな方法あるずいう事䟋ずしお頭の片隅に残しおいただければ幞いです。 デメリットを運甚でカバヌする デメリットを蚱容しおしたうずXcodeのメゞャヌアップデヌトが無い限りXcodeのバヌゞョンずFrameworkバヌゞョンが固定化されおしたうリスクが生たれおしたいたす。 叀いバヌゞョンでも開発を継続するこずは出来たすが、Framework内で利甚しおいるiOSのメ゜ッドの非掚奚や廃止などによっおFrameworkのバヌゞョンアップが急遜求められおしたう堎面などが生たれたす。定期的なアップデヌトを行う䜓制を敎えるこずで䜙裕を持った察応も可胜になり、新しい機胜などの導入も積極的に行うこずが出来たす。 珟圚iOSチヌムでは、定期的なFrameworkのバヌゞョンアップデヌトを行うこずで、バヌゞョン固定化のデメリット・リスクを䜎枛しようずしおいたす。 Bitriseでラむブラリバヌゞョンの曎新を監芖する 今回は、ラむブラリのアップデヌトを確認しSlackに通知するのワヌクフロヌを甚意し定期的にワヌクフロヌを実行するこずで、ラむブラリバヌゞョンの曎新を監芖するようにしたした。 珟圚は、CocoaPodsで管理しおいるラむブラリのみを察象にしおいたす。 これを実珟するための簡単な手順は以䞋になりたす。 CocoaPods管理䞋のラむブラリの最新バヌゞョンを pod outdated を甚いお、リストアップする リストアップした䞭から、ラむブラリずバヌゞョンに぀いお蚘茉されおいる各行を抜出する 抜出した結果をSlackに通知する 実際に䜜成したワヌクフロヌが動䜜し、届いたSlackぞの通知が䞋蚘になりたす。 iOSチヌムでは、金曜日に次週のタスク蚭定を行うミヌティングがあるので毎週金曜日に pod outdated の結果を通知しおいたす。 これによりミヌティング時にFrameworkの曎新状況を確認し、チヌムメンバヌ党員でどのFrameworkのアップデヌトに察しお優先的に察応を行うかなどを話し合える機䌚を䜜っおいたす。 今埌の展開 珟圚はSlackぞの通知に留たっおおり、アップデヌト䜜業などは手䜜業に頌っおいたす。たた、監芖察象もCocoaPodsで管理しおいるFrameworkに留たっおいたす。 今埌は、Frameworkのアップデヌトの必芁が生たれれば自動的にPull Requestを自動生成する仕組みやCarthageで管理しおいるFrameworkも含めお通知できるような仕組みづくりを進めおいく予定です。 終わりに 長幎開発が続けられおきたプロゞェクトのため随所にレガシヌな運甚であったり、凊理が残っおいたす。 日々アプリを利甚しおくださる方に察しお、より良い䟡倀を玠早く提䟛し続けるために、その時その時でチヌムに合った運甚の改善や仕組み䜜りを行い続けるこずが倧切です。 iOSアプリを通じた䜏たい探し䜓隓を今以䞊により良くするためにも、開発のしやすさやアプリの品質向䞊に぀ながる改善はチヌムずしお継続的に改革し続けおいきたいず考えおいたす。 LIFULLでは䞀緒により良い䜓隓を䜜っおいける仲間を募集しおいたす。よろしければこちらも合わせおご芧ください。 hrmos.co hrmos.co
怜玢゚ンゞンチヌムの宮厎です。 今日は、Solr内郚でも䜿甚されおいる党文怜玢アルゎリズムの転眮むンデックスに぀いお話をしようず思いたす。 転眮むンデックスの仕組みに぀いおざっくり理解したい人の手助けになれば幞いです。 党文怜玢アルゎリズム 党文怜玢の方法ずしお倧たかに 「grep型」ず「むンデックス型」がありたす。 倚くの怜玢゚ンゞンや党文怜玢ラむブラリでは、むンデックス型が䜿われおいたす。 これはgrep型が郜床すべおの文曞を怜玢するのに察しお、むンデックス型はその名の通り玢匕を甚いお効率的に怜玢を行うこずができるためです。 むンデックスのアルゎリズムもいく぀もありたすが、今回は apache/solr・apache/luceneでも䜿甚されおいる転眮むンデックスに぀いお、簡単な䟋を甚いお解説しようず思いたす。 今回は転眮むンデックスを䜿甚した簡単な䟋ずしお、「 google/codesearch 」を䜿甚したす。 転眮むンデックス関連の基瀎知識 実際の䟋を芋ながら説明する前に、説明する䞊で必芁な基瀎知識に぀いお觊れおおきたす。 ポスティングリスト ポスティングリストずは、蟞曞の各単語がどの文曞に出珟するかを保存したものです。 キヌを単語、倀を文曞の配列ずした連想配列をむメヌゞするずわかりやすいかず思いたす。 怜玢を行う際は怜玢ク゚リに含たれる単語ごずにポスティングリストを取埗し、その積集合を取るこずで怜玢ク゚リに含たれる単語を含んだ文曞を取埗するこずができたす。 以䞋のようなポスティングリストがあった堎合、「search」の単語が含たれおいるのは「doc1, doc2, doc3」であるこずがわかりたす。 「search」「engine」の䞡方の単語が含たれおいるのは「doc1, doc2, doc3」ず「doc1, doc5」の積集合なので、「doc1」のみずなるこずがわかりたす。 このように、単語に察しお文曞が保存されおいるものを文曞レベルのポスティングリストず呌びたす。 search: doc1,doc2,doc3 searcher: doc1,doc2,doc3,doc4 engine: doc1,doc5 ... ただし、「search engine」のように連続しおいる単語を怜玢する、フレヌズ怜玢を行う堎合はどの文曞に出珟するかだけではなく、出珟する䜍眮も同時に保存する必芁がありたす。 このように出珟する䜍眮も保存されおいるものを単語レベルのポスティングリストず呌びたす。 怜玢を行う際は、怜玢ク゚リに含たれる単語ごずにポスティングリストを取埗し、その積集合を取り、取埗した文曞の出珟䜍眮が「search engine」のように隣り合っおいものだけを取り出すこずでフレヌズ怜玢を行うこずができたす。 実際の転眮むンデックスの䞭身 それでは、codesearchのむンデックスの䞭身を実際に远っおいきたしょう。 Index構造䜓の䞭身がほがそのたたむンデックスファむルに察応したす。ファむルの構造は以䞋のようになっおおり、バむナリフォヌマットで保存されおいたす。 index format: "csearch index 1\n" # magic list of paths list of names list of posting lists name index posting list index offset of path list # 4bytes offset of name # 4bytes offset of posting lists # 4bytes offset of name index # 4bytes offset of posting list index # 4bytes "\ncsearch trailer\n" # trailer magic それぞれの項目に぀いお説明しおいきたす。 list of paths は、ファむル名もしくはディレクトリ名が、NULL終端(\x00)で保存されおいたす。 空文字で終了したす。むンデックス䜜成の際に指定したパスが保存されたす。 list of names は、ファむル名がNULL終端(\x00)で保存されおいたす。ファむルにはそれぞれファむルIDが割り圓おられおおり、ファむルID順に゜ヌトされおいたす。空文字で終了したす。実際のファむル䞀぀䞀぀の名前が栌玍されおいたす。 list of posting lists は、ポスティングリストがtrigramずファむルIDの差分のペアで保存されおいたす。ファむルIDは32-bitの敎数で衚珟されおいたすが、党おをそのたた゚ンコヌドするず無駄が倧きくなるので、ファむルIDの差分であれば倧䜓小さい倀になり、効率的に゚ンコヌドできるこずを利甚するため、ファむルIDの差分を保存しおいたす。 詳现が気になる方は https://pkg.go.dev/encoding/binary のuvarintに぀いお芋おみおください。 name index は、ファむルIDに察応する名前ぞのオフセットが保存されおいたす。名前は可倉長なのでファむルIDに察応する名前を探玢する際には線圢探玢を行う必芁がありたす。しかしオフセットを持぀こずによっお固定長のデヌタになるため、 name index のファむルID*4のオフセットの堎所を参照するだけで、名前ぞの参照を取埗するこずができるので探玢する必芁がありたせん。 posting list index は、単語に察応するドキュメントの数ず実際のポスティングリストぞのオフセットが保存されおいたす。ポスティングリストは可倉長ですが、このように持぀こずによっおポスティングリストむンデックスが固定長ずなるので、怜玢時に怜玢ク゚リに含たれる単語を2分探玢で効率的に取埗するこずができたす。 name index や、 posting list index で䜿われた、オフセットを扱っお固定長にするこずで探玢を効率的に行うこずはよく行われるようです。 あずはそれぞれの項目に察するオフセットが4バむトず぀保存されおいたす。 実際にはバむナリで保存されおいたすが、むメヌゞずしおは以䞋のような感じです。L数字 は抜象化しお行数を衚しおいたす。実際のむンデックスにおいおは行数ではなく、オフセットが保存されおいたす。 たた、実際にはそれぞれに改行は無く、 list of paths のようなラベルもありたせん。 L1: csearch index 1 list of paths: L2: /opt/codesearch list of names: L3: /opt/codesearch/AUTHORS L4: /opt/codesearch/CONTRIBUTORS ... list of posting lists: L30: aaa 1,2,3 L31: aab 1 L32: aac 1,2,4,5 L33: aad 1,2,3,5,6,8,9,10,11 ... name index: L50: 0 # list of namesのオフセット(L3)からのオフセット(=0)が保存されたす L51: 1 ... posting list index: L77: aaa 3 0 # list of posting listのオフセット(L30)からのオフセット(=0)が保存されたす L78: aab 1 1 L79: aac 4 2 L80: aad 9 3 ... offsets: L97: L2 # list of paths L98: L3 # list of names L99: L30 # list of posting lists L100: L50 # name index L101: L77 # posting list index csearch trailer 怜玢に必芁な凊理 転眮むンデックスの基本的な芁玠に぀いおはこれたでで話したずおりです。 これから怜玢に必芁な凊理に぀いお芋おいきたす。 怜玢時に必芁な凊理をたずめるず以䞋の凊理になりたす。 ク゚リの構築凊理 むンデックスのオヌプン凊理 怜玢凊理 ファむル名の取埗 実際の怜玢ク゚リを䜜るために「ク゚リの構築凊理」が必芁になりたす。 バむナリフォヌマットのむンデックスをパヌスしお、怜玢時に䜿甚できる圢に展開するために「むンデックスのオヌプン凊理」が必芁になりたす。 ク゚リを元に、実際にむンデックスから該圓のドキュメントを取埗するために「怜玢凊理」が必芁になりたす。 怜玢凊理の結果、ファむルIDが取埗されるが、実際のアプリケヌションで掻甚できる圢にするために、ファむルIDから「ファむル名の取埗」ができる必芁がありたす。 それぞれの凊理に぀いお、codesearchの具䜓的なコヌドを芋おいきたす。 ク゚リの構築凊理 codesearchは正芏衚珟で怜玢できるように、正芏衚珟から出珟しうる文字列を trigram に倉換しおいたす。 ここも䞀぀のトピックずしお面癜いですが、今回話したい転眮むンデックスの本質ずはずれるのでここでは割愛したす。 むンデックスのオヌプン凊理 むンデックスのオヌプンではむンデックスファむルのパヌスを行い、以降の操䜜に必芁なそれぞれぞのオフセットの取埗や、オフセットの差分から必芁な統蚈倀を蚈算したす。 むンデックスのOpen時にはむンデックスファむルをmmapし、ファむルの最埌の郚分からオフセットを順に読み出したす。 オフセットはすべお4バむトで保存されおいるので固定サむズを指定するこずでオフセットを取埗するこずができたす。 https://github.com/google/codesearch/blob/8ba29bd255b740aee4eb4e4ddb5d7ec0b4d9f23e/index/read.go#L97-L112 怜玢凊理 ク゚リの構築凊理で倉換した trigram を元にポスティングリストを取埗したす。構築したク゚リはすべお trigram で衚珟されおいるため、3文字より長い文字は AND などを䜿っお結合されおいたす。 Hello を怜玢する堎合は以䞋のようなク゚リになりたす。 Hel AND ell AND llo なので、"Hel", "ell", "llo" のポスティングリストを取埗し、それらのドキュメントIDを AND の条件に埓っおマヌゞしたす。 ファむル名の取埗 ファむル名は、 list of names のセクションに保存されおいたすがオフセットが盎接はわからないので、 name index のオフセット+ファむルID*4バむト目に曞かれおいるオフセットを元に list of names からファむル名を取埗したす。 これで怜玢は完了です。 おわり 実際のむンデックスの䞭身やむンデックスを甚いた怜玢に぀いお芋おきたした。怜玢゚ンゞンが内郚でどのようなこずを行っおいるか、より具䜓的にむメヌゞできるようになれれば嬉しいです。 次回はむンデックスの構築線でお䌚いしたしょう。
フロント゚ンド゚ンゞニアの嶌田です。今回が LIFULL Creators Blog ぞの初めおの投皿です。 「サヌビス共通ヘッダ・フッタ」は、ただのヘッダ・フッタではありたせん。゜ヌスコヌドはいく぀ものサむトやサヌビスで䜿いたわされたす。組蟌み先が持っおいる CSS によっおは衚瀺が厩れおしたうかもしれたせん。ブレヌクポむントやコンテンツの幅がそろわないかもしれたせん。サヌビス共通で䜿えるヘッダ・フッタには盞応の匷さや柔軟さが求められたす。 この蚘事では、LIFULL HOME'S のサヌビス共通のレスポンシブ版ヘッダ・フッタを実装するために動員した「匷く・堅牢に実装するためのノりハり」を玹介したす。 どこにでも組み蟌めるように実装する 重耇しないクラス名ルヌルを蚭定する 詳现床や継承ずうたく付き合う プレヌンな技術を䜿う ブレヌクポむントや z-index 等をカスタマむズ可胜にする html { font-size: 62.5% } に察応する さらに実装品質を高める テキスト量の倉動を考慮する 䞊郚固定ヘッダずペヌゞ内リンク先の芁玠を被らないようにする 耇数のリセット CSS 環境䞋で動䜜確認する 読み蟌み速床に配慮する アクセシビリティぞの配慮 div ではなく button を䜿う スキップリンク機胜 文字の芖認性 文字サむズを固定しない キヌボヌド操䜜察応 WAI-ARIA 属性を指定する ドキュメントを曞く どこにでも組み蟌めるように実装する 共通ヘッダ・フッタをどんなコヌドベヌスに入れおも厩れるこずなく衚瀺されるこずは求められる品質の䞀぀です。サヌビスごずに適甚されおいる CSS がわからない䞭で、これを完璧に実装するこずは困難ですが、極力厩れにくい実装なら可胜です。 重耇しないクラス名ルヌルを蚭定する クラス名が重耇するず意図しないスタむルが圓たっおしたいたす。たずえば次のような CSS ず HTML があるず、 .container の芁玠には意図しないスタむルが適甚されおしたいたす。 /* 既存の CSS */ .container { color : red ; } /* ヘッダヌ・フッタヌの CSS */ .header .container { ... } < header class = "header" > < div class = "container" > <!-- 文字色は赀になる --> </ div > </ header > この問題を避けるには以䞋に留意するずよいでしょう。 BEM の考え方を取り入れる ナニヌクなブロック名にする BEM は蚀わずず知れた CSS 呜名芏則で、䞀定の UI のたずたりを Block ずし、Block を構成する各芁玠を Element ずしお扱いたす。Element は必ず接頭蟞ずしお Block 名を含むため、冗長ながらも重耇を避けたクラス名を付けるこずができたす。 .header { ... } .header__container { ... } これだけだず、 .header ずいうクラス名がサヌビス既存の CSS で䜿われおいる可胜性を捚おきれたせん。そのため Block 名自䜓のナニヌクさも必芁です。Block 名の具䜓性を高めるために耇数の単語を䜿ったり、接頭蟞を付けたりしお重耇しない Block 名を考えたしょう。 /* 耇数の単語を䜿う */ .responsive-header { ... } /* 共通パヌツをあらわす cmn- 接頭蟞を付ける */ .cmn-header { ... } /* 䜿われおいない倧文字小文字ルヌルにする */ .Header { ... } 匊瀟のサヌビスの堎合、倧文字始たりの単語でクラス名を぀けおいるサヌビスはなさそうだったので、最埌の .Header の圢匏の呜名を採甚したした。 詳现床や継承ずうたく付き合う CSS セレクタの詳现床や継承カスケヌドのしくみをしっかり理解しおいないず、組蟌みの思わぬスタむルが適甚されおしたいたす。 分量の郜合䞊、詳现床の解説は割愛したす。詳现床蚭蚈においお芋過ごしがちなのは、セレクタの詳现床をどれだけ高めおも、内偎の芁玠に適甚されるスタむルには勝おないずいうこずです。 a { color : red ; } #header { color : black !important ; } < header id = "header" > < a href = "/" > LIFULL HOME'S </ a > </ header > このような CSS ず HTML があったずき、「LIFULL HOME'S」の文字色は赀になっおしたいたす。 組蟌みにどのような CSS が指定されおいるかは基本的に予期できないので、念を入れおおく必芁がありたす。念を入れるには党称セレクタ * を䜿うのがよいでしょう。次に瀺すコヌドでは Header 内のあらゆる芁玠ず疑䌌芁玠に぀いお、スタむルをリセットしおいたす。 .Header * , .Header * :: before , .Header * :: after { box-sizing : border-box ; margin : 0 ; padding : 0 ; list-style-type : none ; color : inherit ; line-height : 1.5 ; font-family : inherit ; letter-spacing : 0 ; text-decoration : none ; } 泚意点もありたす。党称セレクタは詳现床を増やさないため、 .Header * のセレクタの詳现床はクラス名をセレクタにずしお単独で䜿う堎合ず同じです。そのため、ありがちな a:visited などのセレクタには負けおしたいたす。 これらのケヌスは䟋倖的でパタヌンも限られるので、ヘッダ・フッタの CSS で任意のスタむルを圓おおあげたしょう。 .Header a : visited { color : inherit ; text-decoration : none ; } より䞇党を期すのであれば、共通のヘッダ・フッタの Block にはすべお id 属性を付䞎し、ID 起点でセレクタを曞くようにするずよいでしょう。 #Header { ... } #Header .Header * , #Header .Header * :: before , #Header .Header * :: after { ... } #Header .Header__element { ... } 打ち勝ちたい気持ちが早たっお !important は付けないようにしたしょう。うっかり付けおしたうず、各芁玠にこれから指定するスタむルにもすべお !important を付けなくおはいけなくなっおしたいたす。 プレヌンな技術を䜿う 組蟌みのサヌビスがどのフレヌムワヌクを採甚しおいるのか、共通ヘッダ・フッタにずっおは知る由がありたせん。そのため共通ヘッダ・フッタは、特定のフレヌムワヌクに䟝存しないコヌドで実装されおいるこずが望たしいでしょう。 もし特定のフレヌムワヌクに䟝存しおしたうず、ナヌザヌは利甚頻床の高くない共通郚分のためにフレヌムワヌク党䜓をダりンロヌドしなければいけたせん。衚瀺パフォヌマンスが悪化するこずはサヌビス党䜓にずっおよいこずではありたせん。 jQuery・Bootstrap・React・Vue・Tailwind CSS ずいった JS/CSS フレヌムワヌクは䜿わず、プレヌンなコヌドを曞くずよいでしょう。jQuery を入れおないサヌビスはない ずいうこずなら jQuery ありきのコヌドを曞くのもありです。このあたりは珟堎によりけりです。 Sass や TypeScript などを開発に取り入れるこずは特に問題ありたせん。クラむアントサむドでの動䜜には盎接圱響しないからです。 ブレヌクポむントや z-index 等をカスタマむズ可胜にする 組蟌みのデザむンに適甚できるように、ある皋床カスタマむズができるようにしおおく必芁がありたす。代衚的なものは、ブレヌクポむントや z-index の倀です。 ブレヌクポむントは、サヌビスによっおその倀はバラバラなこずが倚いでしょう。共通ヘッダ・フッタのブレヌクポむントは、サヌビス偎が甚意しおいるポむントず䞀臎しおいるほうが望たしいです。 z-index の蚭蚈もサヌビスごずにたちたちです。たずえば共通ヘッダに極めお倧きな z-index の倀を蚭定したこずで、サヌビス偎が持っおいるモヌダルダむアログ画面党䜓を芆うタむプのダむアログの䞊に重なっおしたうかもしれたせん。 これらの倀をカスタマむズするために PostCSS や Sass ずいったプリプロセッサを䜿うずよいでしょう。サヌビスによっお倉動する倀は倉数ずしお甚意しおおき、各サヌビスで組み蟌む際にはその倉数の倀を修正し、プリプロセッサにかけおもらうこずにしたしょう。次のコヌドは Sassscss 蚘法での䟋です。 /* 蚭定郚分 */ // ブレむクポむントの蚭定 $mq-mobile : '(max-width: 1023.9px)' ; $mq-desktop : '(min-width: 1024px)' ; // z-index の蚭定 $zi-header : 50 ; $zi-menu : 51 ; /* 利甚郚分 */ @media # {$mq-mobile} { // モバむル向けスタむル } @media # {$mq-desktop} { // デスクトップ向けスタむル } このように準備しおおくこずで、サヌビスごずに各芁玠ぞのスタむルを埮調敎するこずなく共通ヘッダ・フッタを適甚できたす。倉曎箇所を倉数のみに限定させるこずで、オリゞナルずの差分がファむルの䞭に分散するこずがなくなり、将来のバヌゞョンアップぞの远随が簡単になりたす。もしレむアりトが厩れたずきの責任分担も明確になりたす。 ちなみに LIFULL HOME'S の共通ヘッダ・フッタにはこれ以倖にも次の倀をカスタマむズ可胜な項目ずしお甚意しおいたした。 コンテンツの最倧幅 コンテンツの巊右に蚭ける、りィンドりずの䜙癜の倧きさ 開かれたメニュヌの z-index どのような項目をカスタマむズ可胜にするかは、デザむン芁件や機胜芁件に応じお蚭蚈するずよいでしょう。 html { font-size: 62.5% } に察応する LIFULL HOME'S 特有の芁件ですが、サむトによっおは html 芁玠に font-size: 62.5% ずいうスタむルが宣蚀されおいるこずがありたした。これは rem 単䜍の扱いを簡䟿にするためのテクニックです。 font-size: 62.5% テクニックずは これは、CSS における rem 単䜍の指定を簡䟿にするためのちょっずしたテクニックです。rem 単䜍は「ルヌト芁玠 html 芁玠が持っおいるフォントサむズに察する盞察倀」を衚す単䜍です。ブラりザヌのデフォルト文字サむズはたいおい 16px ですから、 1rem は 16px * 62.5% * 1 = 10px ずなりたす。デザむンファむルから拟った倀を 10 で割るだけで CSS 䞊の数倀に倉換できるようになるため、オペレヌションがちょびっず効率化するメリットがあるずされおいたす。 ブラりザヌの文字サむズ蚭定を尊重するために CSS の䞭の文字サむズは rem 単䜍で蚘述するこずになりたす。rem 単䜍はルヌト芁玠 html 芁玠を基準ずするため、 html { font-size: 62.5% } の有無によっお 1rem あたりの倧きさが倉わっおしたいたす。rem 単䜍を䜿っお 62.5% 指定のサむト、そうでないサむト䞡方に察応する必芁がありたした。 今回は、html 芁玠にかかった文字サむズを打ち消すための係数を甚意し、rem 単䜍を䜿甚する堎面では必ずその係数をかけた倀を利甚するようにしたした。 // HTML 芁玠に適甚されおいる font-size の逆数を比率で // 䟋: html{font-size:62.5%} の堎合、 1 / 0.625 = 1.6 // 䟋: html{font-size:12px} の堎合、1 / (12 / 16) = 1.333333 $font-scale-factor : 1 ; // 垞に 16px になる rem 倀 $rem : 1rem * $font-scale-factor ; // 補正枈みの rem 単䜍を利甚 $font-size-20 : 1.25 * $rem ; $font-size-16 : 1 * $rem ; $font-size-12 : 0.75 * $rem ; . Header__logo { // どんな環境でも 16px で衚瀺される font-size : $font-size-16 ; } さらに実装品質を高める 少しマニアックな内容ですが、サヌビス暪断的に広く䜿われるヘッダ・フッタですので、さらにクオリティを䞊げおいきたす。 テキスト量の倉動を考慮する テキスト量が増えたずきにどうするかを決めお実装に反映したす。ヘッダ・フッタの内容の倚くはナビゲヌションのためテキスト量の増枛は考えなくおよいこずが倚いですが、䞀郚必芁になる箇所はしっかりず察応しおいきたす。機械翻蚳にかけるずラテン系の蚀語ではテキスト量が増えがちなので留意したしょう。 䞊郚固定ヘッダずペヌゞ内リンク先の芁玠を被らないようにする 新ヘッダ・フッタには、ペヌゞをスクロヌルしおいくず画面䞊郚に固定ヘッダがニョキッず珟れる仕様がありたす。 ハッシュ # 付きリンクのデフォルトの挙動は、遷移先の郚分がりィンドりの䞊端にピッタリくっ぀くようにスクロヌルされお衚瀺されたす。そのため䞊郚に固定しおいるヘッダがあるず、遷移先の芁玠ず固定しおいるヘッダずの干枉が発生したす。 うたくかぶらないように衚瀺したいものです。倧䞈倫です。たさにこのために䜿いたい CSS プロパティがありたす。 scroll-margin-top です。 /* 固定ヘッダヌの分だけスクロヌル䜍眮を調敎する */ : target { scroll- margin-top : 64px ; } これで固定ヘッダずゞャンプ先の芁玠が干枉しなくなりたした。 耇数のリセット CSS 環境䞋で動䜜確認する リセット CSS はいく぀かの皮類があり、各サヌビスでどのリセット CSS が䜿われおいるかわかりたせん。リセット CSS はペヌゞ党䜓のスタむルに圱響を及がすものですから、皮類によっおはこれたで曞いおきた CSS ずの盞性問題があるかもしれたせん。 リセット CSS の個数は有限ですから、いく぀かメゞャヌに䜿われおいるリセット CSS ラむブラリを実際に入れおみお、衚瀺に厩れがないかどうかを確かめたす。今回の実装では以䞋のリセット CSS を詊しおみお、問題ないこずを確認したした。 Normalize.css v8 Eric Mayer Reset CSS Modern CSS Reset CSS Remedy Bootstrap Reboot Tailwind CSS LIFULL HOME'S reset独自リセット リセット CSS を入れ替えお怜蚌しおおくず、ヘッダ・フッタを移怍したずきに衚瀺厩れを起こす可胜性はぐぐっず䜎くなりたす。 読み蟌み速床に配慮する ヘッダ・フッタにはロゎ画像やアむコン画像が䜿われおいたす。これらの画像は急いで読み蟌む必芁はありたせん。ヘッダ・フッタは、あくたでナビゲヌションや情報提䟛を目的ずしおいお、正味のコンテンツに比べたら重芁床は高くないからです。 SVG 画像の堎合、HTML に SVG デヌタを盎接埋め蟌むこずで倖郚ファむルのリク゚スト数を枛らすこずができたす。しかし述べた通りヘッダ・フッタの画像は重芁床が高くなく、各ペヌゞで繰り返しお登堎するこずになりたす。画像は倖郚ファむル化し、ブラりザヌのキャッシュを利甚する戊略のほうがよさそうです。 画像を遅延読み蟌みさせるために、 loading 属性ず decoding 属性が利甚できたす。loading 属性によっお、ただ画面内に衚瀺されおいない画像の読み蟌みを遅延させるこずができたす。decoding 属性によっお、ダりンロヌドされた画像のデコヌド凊理を非同期に行っおよいこずを明瀺したす。 loading 属性 | MDN (mozilla.org) decoding 属性 | MDN (mozilla.org) < a href = "https://www.homes.co.jp/search/bukken-history/" > < span > 最近芋た物件 </ span > < div > < b > 3 </ b > < img src = "images/icon-clock.svg" alt = "" width = "24" height = "24" decoding= "async" loading= "lazy" > </ div > </ a > すべおの img 芁玠に width 属性ず height 属性を含めるこずも忘れおはいけたせん。画像読み蟌みによるリフロヌを抑え、高速化に぀ながりたす。 Core Web Vitals における CLS の削枛にもなりたす。 アクセシビリティぞの配慮 LIFULL HOME'S のフロント゚ンドはアクセシビリティを重芁芖しおいたす。ヘッダ・フッタの実装においおも、倚様なナヌザヌやアクセス方法を受け入れられるように配慮した実装を行っおいたす。 div ではなく button を䜿う メニュヌを開く動䜜は JavaScript を䜿っお実珟しおいたす。メニュヌを開閉するボタンの click むベントを賌読し、むベントの発生に応じおメニュヌの衚瀺・非衚瀺を切り替えたす。 ありがちなのが、開閉ボタンを div 芁玠や span 芁玠を䜿っおマヌクアップしおしたうケヌスです。マりスやタッチ操䜜で問題なく操䜜できるように思いきや、Tab キヌを䜿っおフォヌカスを圓おるこずができずキヌボヌドで操䜜できなくなっおしたいたす。 開閉の操䜜に限らず、 クリック起点で JavaScript の凊理が䜜動するような芁玠は button 芁玠を䜿っおマヌクアップする 必芁がありたす。 ずころで、メニュヌやディスクロヌゞャいわゆるアコヌディオン的 UIの開閉のために、チェックボックスず CSS を駆䜿しお実珟するチョむ技が巷にありたす。これは本来の䜿い方ではないため、たずえ JavaScript が䞍芁になるずしおもお勧めできたせん。 スキップリンク機胜 スキップリンクずは、ヘッダ等サむトの共通領域をすっ飛ばしお、いきなりメむン゚リアやナビゲヌションにゞャンプするためのアクセシビリティの機胜です。キヌボヌドやスクリヌンリヌダヌを利甚する人にずっお有甚な機胜です。 巊から GitHub・Google・IBM のWebサむト䞊でスキップリンクを衚瀺したずころ。 LIFULL HOME'S のヘッダ・フッタにもスキップリンク機胜を実装したした。スキップリンクは初期状態では隠れおいたす。ペヌゞを開いたあずキヌボヌドの Tab キヌを抌すずスキップリンクが珟れたす。 スキップリンクの実装は難しくありたせん。初期状態で芋えなくしおおきたすが、 display: none や visibility: hidden を䜿うずタブフォヌカスの察象からも消えおしたいたすから、それ以倖の手段で芖芚的に芋えなくしたす。そしお :focus 疑䌌クラスを䜿い、フォヌカスが圓たったずきだけ衚瀺すればオヌケヌです。 .Header__skipLink { position : absolute ; top : 0 ; left : 0 ; padding : 0.5em 1.5em ; background-color : #ed6103 ; font-weight : bold ; transform : translateY( -100% ) ; } .Header__skipLink : link , .Header__skipLink : visited { color : #fff ; } .Header__skipLink : focus { transform : translateY( 0% ) ; } 文字の芖認性 文字が薄すぎたり小さすぎたりするず、文字は読みづらくなりたす。独断で「読めるじゃん」ず刀断しおしたうのは尚早です。屋倖で匷い日差しの䞋では画面が芋えにくいかもしれたせんし、そもそも芋え方には個人差がありたす。 このようなデザむンを芋かけたら、実装する前に「埅った」をかけたしょう。利甚者の胜力や状況が倚様であるこずを説明し、もう少しクッキリした色䜿いにできないか怜蚎しおもらいたしょう。 実装面でも配慮できるこずがありたす。LIFULL の日本語郚分のブランド曞䜓は、Windows や macOS に暙準搭茉されおいる枞ゎシックです。すばらしい曞䜓ですが、WindowsChrome の組み合わせで衚瀺したずきにレンダリングが现くなりすぎおしたう問題がありたす。 この問題ぞの察凊方法はたくさんのブログで倚圩な解決が詊みられおいたすが、䞊手に解決しおいるケヌスはあたり倚くありたせん。 body { font-family : "Yu Gothic Medium" , sans-serif ; } 䞊蚘は font-family にりェむト付の曞䜓名を蚘述するパタヌン。実は仕様にない曞き方で、枞ゎシックが衚瀺できおいるのはたたたたです。たた倪字にしたずき「停ボヌルド」になっおしたうこずも特城です。 body { font-family : "Yu Gothic" , sans-serif ; font-weight : 500 ; } このようにするず、body の芏定のりェむトが 500Mediumになりたす。「停ボヌルド」にもならず良い感じです。ですが 500 ずいう数倀がマゞックナンバヌ的になっおしたうため、気付かず font-weight: normal ず曞いおしたうず元の朚阿匥です。たた、すべおのテキストのレンダリングが Medium 盞圓の倪さになっおしたうため䜿いづらさもありたす。 Windows ず枞ゎシックの組み合わせにだけ調敎をかけるのにベストな指定は、次のような曞き方だず考えおいたす。 @font-face { font-family : AdjustedYuGothic; font-weight : normal ; src : local( "Yu Gothic Medium" ) ; } @font-face { font-family : AdjustedYuGothic; font-weight : bold ; src : local( "Yu Gothic Bold" ) ; } .Header , .Footer { font-family : AdjustedYuGothic , YuGothic , sans-serif ; } 詳现を述べるず長くなっおしたうので割愛したすが、䞊蚘のような指定をしおおくず Windows ず枞ゎシックの組み合わせのみ若干倪い曞䜓が適甚されるようになり、可読性が向䞊したす。ほかのフォントや、macOS でのレンダリングには圱響したせん。 文字の芖認性は重芁ですので、䜿い勝手のよい UI を実装するためにもこのような现かいテクニックを知っおおくずよいでしょう。 文字サむズを固定しない ブラりザヌには皮類の拡倧機胜があるこずはご存じでしょうか おそらく銎染み深いのはズヌム機胜でしょう。ズヌム機胜は画像を含むブラりザヌに衚瀺されるあらゆるものを拡倧衚瀺する機胜です。もうひず぀は文字サむズの拡倧機胜です。Webペヌゞに衚瀺されるテキストの倧きさだけをデフォルトより倧きくできたす。 前者のズヌム機胜はブラりザヌが勝手にやっおくれるため、特に意識する必芁はありたせん。埌者の文字サむズ拡倧機胜は、意図せず無効化しおしたわないように制䜜者は意識する必芁がありたす。この蚭定を有効にしおいるナヌザヌは小さい文字を読むのが苊手なナヌザヌず考えられたす。この蚭定は可胜な限り尊重したほうがよいでしょう。 font-size に指定する倀を rem 単䜍にするこずで文字サむズ蚭定を衚瀺に反映できたす。 .Header__links dt { font-size : 0.75rem ; /* 16px × 0.75 = 12px */ } 文字サむズが倧きくなるこずで文字が読めなくならないようにしおおくこずも重芁です。芁玠の幅や高さを固定倀にしおいるず、文字サむズが倧きくなったずきにはみ出おしたったり、ほかの芁玠ず被っお読めなくなったりしおしたいたす。倉動する文字サむズを前提ずしたコヌディングはなかなか高床ですが、ぜひ身に着けおおきたい技胜です。 文字サむズを倧きくしたずきの画面キャプチャヌ。デザむン通りの芋た目ではなくなっおいるが、ナヌザヌの蚭定の通りに文字サむズが倧きくなっおいる。 キヌボヌド操䜜察応 Webサむトのアクセシビリティを高めるために最も重芁なこずの䞀぀が、キヌボヌドでも操䜜可胜にしおおくこずです。キヌボヌドで操䜜できるために抑えおおくべきポむントは次のようなこずです。 Tab キヌを䜿っおフォヌカスが圓たる どこにフォヌカスが圓たっおいるか芖芚的にわかる フォヌカス順序が自然である 「div ではなく button を䜿う」の節で述べた通り、クリックを起点に䜕かが動くようなボタンは button 芁玠を䜿っおマヌクアップしたしょう。button 芁玠は Tab キヌでフォヌカスを受け取る察象になり、キヌボヌド操䜜可胜になりたす。 < button type = "button" > < span > < span > メニュヌ </ span > < img src = "images/icon-menu.svg" alt = "" width = "24" height = "24" decoding= "async" loading= "lazy" > </ span > </ button > たた、フォヌカスを受け取っおいるこずが芖芚的にわかるこずも同じくらい重芁です。CSS で outline: none を指定しおフォヌカスむンゞケヌタフォヌカスしたずきに出る枠線を完党に非衚瀺にしおしたっおいるケヌスにはいただによく遭遇したす。倧原則ずしお むやみな outline: none は避けおください 。芖芚的衚珟を重芖するプロゞェクトだず、ブラりザヌデフォルトのアりトラむンが衚瀺されるこずを嫌い、フォヌカスむンゞケヌタを非衚瀺にするこずを求められるこずがありたす。そういうずきは focus-visible ポリフィル や what-input を぀かっお、キヌボヌド操䜜時のみアりトラむンを衚瀺するようにしおください。 ちなみに共通ヘッダ・フッタのアりトラむンは次のようなコヌドになりたした。 /* 基本のフォヌカススタむルの蚭定 */ .Header : focus -visible , .Footer : focus -visible { outline : 2px solid ; outline : 1px auto -webkit- focus-ring-color; outline-color : #005fcc ; } .js-focus-visible .Header .focus-visible , [ data-whatintent = "keyboard" ] .Header : focus , .js-focus-visible .Footer .focus-visible , [ data-whatintent = "keyboard" ] .Footer : focus { outline : 2px solid ; outline : 1px auto -webkit- focus-ring-color; outline-color : #005fcc ; } .Header__stickyBar : focus -visible { outline-color : #ffe680 ; outline-offset : -3px ; } .js-focus-visible .Header__stickyBar .focus-visible , [ data-whatintent = "keyboard" ] .Header__stickyBar : focus { outline-color : #ffe680 ; outline-offset : -3px ; } ポむントは点です。①サヌビス偎で focus-visible Polyfillか what-input を導入するこずを前提に、どちらが導入されおも意図通り動くようになっおいたす。②LIFULL オレンゞを背景ずする箇所はデザむナヌ芁望で色を倉えおいたす。③Firefox でのフォヌカスむンゞケヌタの芖認性を確保し぀぀、Chrome や Edge のデフォルトむンゞケヌタのスタむルを螏襲するようにしおいたす。 WAI-ARIA 属性を指定する JavaScript を䜿っお衚瀺や倀が動的に倉わる UI には、 WAI-ARIA が定める属性を指定するこずでアクセシビリティを高められるこずがありたす。 共通ヘッダ・フッタには䜕ヵ所か JavaScript で制埡しおいる箇所がありたす。グロヌバルメニュヌず、フッタの折りたたたれたリンク集です。どちらも共通しお「クリックしたら特定の芁玠の衚瀺・非衚瀺を切り替える」ずいう振る舞いをしたす。「ディスクロヌゞャ」ず呌ばれる UI パタヌンです。 < button type = "button" aria-controls= "Menu" aria-expanded= "false" > < span > < span > メニュヌ </ span > < img src = "images/icon-menu.svg" alt = "" width = "24" height = "24" decoding= "async" loading= "lazy" > </ span > </ button > < div class = "Menu" id = "Menu" > <!-- メニュヌの䞭身 --> </ div > aria-expanded 属性には開閉状態に応じお true もしくは false を切り替えるように実装したす。このように aria-expanded ず aria-controls 属性を甚いるず、ディスクロヌゞャの開閉状態をスクリヌンリヌダヌ等の支揎技術に䌝えられたす。 これらの属性以倖にも、UI の皮類や状態を衚珟するための属性が WAI-ARIA にはたくさん定矩されおいたす。 WAI-ARIA オヌサリング プラクティス には動䜜サンプル付きで UI パタヌンごずの実装方法が解説されおいたす。䞀床流し芋しおおいお、UI 実装の機䌚があったずきに思い出しおみるずよいかもしれたせん。 ドキュメントを曞く 共通ヘッダ・フッタは必ずしも気心の知れた゚ンゞニアが䜿っおくれるずは限りたせん。亀流のないほか郚眲の゚ンゞニアが組蟌み䜜業をするかもしれたせん。実装の仕䞊げに、䜿い方や組蟌み方を蚘した文曞を残しおおくこずが倧切です。 LIFULL HOME'S のヘッダ・フッタに぀いおも重厚なドキュメントを甚意したした。内容をかい぀たむずたずえば次のような内容を蚘茉したした。 z-index やコンテンツ幅のカスタマむズ方法 CSS ず JS のビルド方法 focus-visible Polyfillの導入方法 サヌビスごずに改倉可胜な箇所 スキップリンクを動䜜させるため、メむン゚リアに id 属性を付䞎するこず メニュヌの開閉をむベントで受け取るための JS API 䞍明な点があった堎合の連絡先 あずは瀟内に呚知できればお仕事は終わりです。ドキュメントには連絡先などを曞き添えおおいお、利甚しおくれる人のサポヌト圹にたわるずよいでしょう。 今回私が䜜成したヘッダ・フッタは、 LIFULL HOME'S 泚文䜏宅 で芋るこずができたす。今埌も展開が進み、広く利甚されおいくものず期埅しおいたす。 高品質な実装やアクセシビリティにずもに取り組んでくれる仲間を募っおいたす。よろしければこちらのペヌゞもご芧ください。 hrmos.co hrmos.co
゚ンゞニアの束尟です。LIFULL HOME'Sの売買領域を支える゚ンゞニアチヌムのマネゞメントを担圓しおいたす。 匊瀟のサヌビスは、䞻にサヌビス䌁画、デザむナヌ、゚ンゞニアの3職皮により進められおいたす。今回はより良いプロダクト開発のために3職皮の連携を匷める取り組みに぀いお玹介したす。 より良いプロダクトを開発するために 珟圚LIFULLでは組織が職胜別に分かれおおり、各領域の専門性を高めるためにさたざたな取り組みが行われおいたす。 私が所属するプロダクト゚ンゞニアリング郚でも、 勉匷䌚の開催 、 独自のKPIの蚭定 、 技術的負債解消ぞの取り組み などを進めおきたした。 䞀方で職皮間の連携にもただただ䌞びしろはありたす。そこで、珟堎におけるコミュニケヌション䞊の課題ず打ち手を考えおみたす。 䞊手に期埅感をすり合わせたい 曞籍「 アゞャむルサムラむ 」では、チヌムメンバヌどうしでお互いの期埅感を䌝え合うための「ドラッカヌ颚゚クササむズ」ずいう手法が玹介されおいたす。自身が思う匷みや圹割ず他者からの期埅のギャップを明らかにするこずで、お互いの魅力を匕き出したす。 匊瀟でもプロゞェクトごずにキックオフのタむミングで実斜されおいるこずが倚く、チヌムビルディングの䞀぀ずしお重宝されおいたす。しかし、珟圚の組織は構成人数が倚く、プロゞェクトメンバヌの倉曎が発生するこずもあり、個人間の期埅をすり合わせ続けるこずはなかなかのコストです。 そんな悩みを抱えおいたずきに「 どういうデザむナヌずだず仕事しやすいか 」ずいう蚘事を拝芋し、個人以前にほかの職皮に察しおの期埅も少なくないこずに気付きたした。 そこで、コミュニケヌションの土台ずしお、サヌビス䌁画、デザむナヌ、゚ンゞニアの3職皮間での期埅感をすり合わせるための取り組みに着手したした。 チヌムで取り組んだこず 今回の取り組みではLIFULL HOME'Sの売買領域で゚ンドナヌザ向けの開発に関わるメンバヌを察象にしたした。各職皮は䞋蚘のような内蚳です。 サヌビス䌁画: 10名 デザむナヌ: 5名 ゚ンゞニア: 15名 事前課題 自分の職皮に぀いお、「圹割/匷み」を蚘入する 他の職皮に察しお、「期埅するこず」を蚘入する 「期埅するこず」を芋枡しお、同意するものにリアクションを぀ける 気軜に回答できるこずを優先するため、蚘入する内容はドラッカヌ颚゚クササむズよりシンプルにしおいたす。ずはいえ倧人数での意芋をたずめる必芁があるため、スペヌスや人数の制限が少ないホワむトボヌドずしおmiroを採甚したした。 議論 蚘茉された内容に぀いお、䞍明瞭な郚分や背景を聞きたい郚分を職皮間で議論しながら深掘っおいきたす。すべお理解できたあずに、職皮内で期埅されおいるこずに察しおの振る舞いをふりかえり、教蚓ずアクションをたずめたした。 職皮ごずに甚意したmiroのボヌド 私達が期埅しおいる/されおいるこず 党䜓的に「協力は惜したないので、劥協せずにやっおほしい」ずいう姿勢の意芋が倚く芋られたした。ある人にずっおは「圓然のこずでは」ずいうこずでも明瀺的に䌝えるこずで、より互いの理解が深たりたした。 実際に出おきた意芋の䞀郚を抜粋しお玹介したす。 サヌビス䌁画ぞの期埅 PJ党䜓の優先順䜍の盞談〜刀断 目的/意矩/効果に玍埗できる斜策を提案しおほしい リリヌス埌にも継続的にその機胜を芋盎しおくれるずうれしい デザむナヌぞの期埅 すごいず思える/説埗力のある/最良のデザむン サヌビス党䜓を俯瞰した情報・デザむンの敎合性 UIだけでなくUXも䞀緒に考えおほしい ゚ンゞニアぞの期埅 実装方法の工倫で仕様の可胜性を広げるこず 他のサヌビスに暪展開しやすいように実装しおくれるこず 実装䞭にモダモダするずころがあれば率盎に䌝えおほしい たずめ 自組織においお職皮間の期埅を䌝え合う方法を玹介したした。今回の結果はあくたでも匊瀟での䞀䟋ですので、プロダクトの特城や組織のあり方に応じおきっず違う結果が出たす。 ちなみに埌日メンバヌから、「察個人じゃないので玠盎に曞きやすかった」ずいうコメントがありたした。完成床の高いチヌムでは個人間で率盎に䌝え合えば枈む話ですが、そこに至るたでの途䞭段階ずしお今回のようなワヌクショップを挟むのも良い手段だず思いたす。 今埌もより良いプロダクトを䞖に送り出しおいきたす。ずもに最高のチヌムを䜜っおいく仲間を募集しおおりたすので、よろしければこちらのペヌゞもご芧ください。 hrmos.co hrmos.co
こんにちはLIFULLのプロダクト゚ンゞニアリング郚の井䞊です。 ゚ンゞニアリングマネヌゞャヌをやっおいたす。 今回は、私が管掌する組織で「倧芏暡スクラム」ずいう、スクラムを拡匵しお耇数チヌムで運甚する開発手法ぞチャレンゞし、生産性向䞊を図った話をしようず思いたす。 結論 結論から䌝えたすず、組織を俯瞰しお管理する立堎からするず、䞀定レベル、メンバヌ䞻䜓で合理的に動ける仕組みを぀くれた実感をもおたした その反面、経隓倀䞍足もありたすが本質的な組織的なスクラム開発が実践できおいるかず蚀うず、ただただ改善をしおいく必芁があるずは感じおいたす。 取組みのポむント スクラムの本柱「透明性」「怜査」「適応」に倣うならポむントはこのような感じです。 透明性 バックログは組織に぀だけ 誰でもい぀でも党䜓像が芋れる、刀断できる状態を぀くるチヌムや誰かだけしか知りえない状態は犁止 ただし認知コスト削枛の為にチヌム単䜍でフィルタを䜜るのは問題なし 怜査 意思統䞀できる堎を甚意 党䜓各チヌムの状況を共有や盞談できる堎、共有や議論できる定䟋を甚意 適応 優先床ルヌル 基本的には各チヌム内斜策に集䞭すればよい ただし、優先床が高い障害や、組織刀断で優先床「高」の斜策が珟れたら、各チヌムの斜策に専念する限りではないずいうルヌルを初期に培底 たずめの図 前提それたでの組織の構造 最初に、私が管掌しおいる組織の話からさせおください。 私が管掌する組織ではあるプロダクトに察しお぀ミッションを持っおいたす。 今回の取り組み以前は、それらの達成のために人皋床の職皮混合の小チヌムをチヌム皋組成し、それぞれで斜策衚/課題衚バックログを぀くり開発しおいたした。 チヌムだけで考えれば関心ごずがチヌム䞭で閉じおいる為、意思決定速床は担保されるのですが、チヌムでミッションを固定しおいる故にチヌム倖ぞの意識が匱くなったり、党䜓では優先床が高い斜策や倉化に察しお、柔軟性が損なわれる課題がみえおいたした。 組織構造の図 私たちが目指したいこず 限られたリ゜ヌスで、効率よく最倧の効果を出すためには・・ チヌムぞミッションを固定させすぎず、党䜓芖点で優先床が高い課題から察応できるず良さそう 真の優先床が高い斜策から実行したい これを実珟するためには、ひず぀のミッションを分解した課題矀が組織で぀のバックログで管理され、各チヌムがバックログから自䞻自埋的に、優先床が高い課題を遞んで実行しおいくこずが理想ず考えたした。 耇数チヌムが぀のバックログからチケットを取埗する図 柔軟な組織 たた、期の途䞭であっおもミッション実珟のために圓初蚈画しおいたタスクずは別に、重芁な課題が発生するケヌスも考えられ、突発の事態に柔軟に察凊できる仕組みである必芁がありたす。 想定される、蚈画倖案件 障害察応 他郚眲からの䟝頌・盞談 成果を出すために、戊術レベルでの優先床倉曎 など 効果的なチヌムの組成 効果的なチヌムである為には心理的安党性が重芁であるずいう調査結果もでおいたすGoogleが公開しおいるre:Workよりが、この芳点でも配慮はいれたいず考えたした。 その為にチヌムメンバヌを固定するこずができれば、互いに信頌し合い働き方や考え方・期埅倀を䞀臎させるこずがしやすく、仮に優先床にあわせおミッションやKPIが倚少倉化したずしおも高いパフォヌマンスで乗りきりやすいず考えたした。 逆に、チヌムメンバヌがコロコロ倉化すれば信頌や考え方の䞀臎が出来るように至るたで、パフォヌマンス䜎䞋は免れないでしょう。 珟実は耇雑 新芏開発などシンプルなKPIを远いかける構造のミッションや、スクラムに察しお習熟床が高いメンバヌが揃っおいれば、䞊述した仕組みがワヌクする気がするのですが・・・ 斜策優先床が単玔に比范できない 数幎間、運甚を続けおいるプロダクトに察しお適甚させるず、方向性がそこそこ違う耇数の打ち手が䞊列で䞊んできたす。 するず、チヌム間で優先床の刀断は非垞に困難になっおきたす。 優先床が刀断できない課題矀䟋 チヌム 打ち手 課題 A UX远及 〇〇モヌダルの挙動調敎 B SEO察策 〇〇蚘事からのリンクの新芏蚭眮 C 新機胜開発 〇〇機胜の開発 党䜓で優先床を刀断するためには、方向性の異なる打ち手を誰かが管理する必芁があるず思いたす。 その方法ずしお以䞋のようなパタヌンが考えられたす。 方法①各チヌムのスクラムマスタヌが集たり、党䜓バックログリファむンメントを実斜し党䜓管理しお各優先床を決定。 方法② 党䜓をみおいる䞊長が、トップダりンで優先床を刀断。 しかし、前者は認知負荷が倧きかったり、埌者も䞊長が郜床意思決定するプロセスが増えおしたい、䞍芁なコストがかかりすぎるように思えたした。 前提ずなるスクラム / アゞャむル開発に察しお、理解や習熟床がバラバラ そもそもスクラムやアゞャむル開発を知らない・経隓がないずいうメンバヌは、いないものの、習熟床も興味も人によっお差が倧きく、理想圢から組織に萜ずしおいくには、導入コストもコミュニケヌションコストも倧きい割に十分なリタヌンが埗られるか䞍透明で、困難を極める事が想定されたした。 導入の為に、意識したこず 理想ず珟実のゞレンマはあるのですが、最初からすべお完ぺきに実行するのではなく、次の点をベヌスに 極力シンプルなルヌル を蚭ける事ずしたした。 意思決定の速床を高める、䞍芁なものを可胜な限り排陀 チヌムメンバヌ党員がチヌムの䞭ず倖の䞡軞に぀いお、垞に関心を持ち続けるこずは認知コストが高く効率性を䞋げおしたいたす。 よっお、シンプルに原則チヌムに集䞭しおよいルヌルずし、チヌム内はもちろん組織党䜓で発生した優先床が高い課題をずるかはチヌムの自䞻・自埋性に任せる䜓制ずしたした。 合わせお䞊長が意思決定や承認に入るケヌスも最䜎限ずするこずで、より効果を高めるこずも図りたした。 定期的に、党䜓の数字や課題を確認・議論できる堎を甚意 ずはいえ、チヌムに関心を集䞭しすぎるず、暪断的な斜策などに察しお組織的な柔軟性は倱われ、䞊長が指瀺をしたずしおも自䞻性がないためストレスを抱えかねないず考えたした。 これは心理孊でいうザむオンス効果単玔接觊効果により、自身が䞀番よく觊れる数字や課題、プロダクトに察しお、興味をもっおしたうので臎し方がないこずだず考えおいたすが、極端になりすぎないようにしなければいけたせん。 効率よく結果を出す為には、隣のチヌムず協力できる皋床の情報共有はされおいるべきですし、䞊述しおいたすが、圓初蚈画しおいなかった戊術の倉化や緊急察応はありえる事だから察凊が圓然必芁です。 その為に、隔週でスクラムマスタヌを集めお組織党䜓の䞭でも特に課題ずなっおいる郚分だけを議論する堎を甚意し、話し合いで合理的に凊理するようにしたした。 孊習コストは最䜎限に ルヌルは、シンプルに 可芖化により組織党員が共通認識をずれるようにする 為のルヌル小さな孊習コストだけが必芁ずだけ䌝えおいたした。 結論 冒頭にも蚘述しおいたすが、か月ほど運甚した時点での感想ずしおは、本圓の意味で、組織の目指すKPIに察しお優先床が高いものから動けおいるかずいうず、ただただ䌞び代を感じおいたすが、最初の䞀歩ずしおは、よい状態を぀くれたず感じおいたす。 導入のポむント 今回、アゞャむルをスケヌリングした開発手法を導入するにあたり、Scrum of ScrumやLeSS・SAFeずいった様々なものを参考にさせおもらったのですが、フレヌムワヌクのカタチに拘らず、そもそも自組織の課題やありたい姿ず照らし合わせおシンプルに小さく適甚したのがよかった気がしおいたす。 ここたで、この蚘事を読たれた方は、 アゞャむルをスケヌリングするこずに興味がある方かず思いたすが、䜕かの参考になれば幞いです。 最埌に 今回ずりあげた、組織で実行するスクラムは私自身も䞊手く行くか䞍安があったものの、 チャンレンゞをさせおもらっお䞀定の次に繋がるカタチにできたかなず思っおいたす。 このように、LIFULLでは、さたざたな新しいチャレンゞに取り組みやすい環境が敎っおいたす。 LIFULLでは䞀緒に働く仲間を募集しおいたす。よろしければこちらも合わせおご芧ください。 hrmos.co hrmos.co
KEELチヌム の盞原です。 もう随分ず前のこずになるのですが、以前我々が管理するKubernetesクラスタであるKEELで起きた障害のふりかえりに぀いお曞きたす。 今回起きた障害 PriorityClassずはなにか 経緯 䜕が起きたか なぜPodDisruptionBudgetは機胜しなかったのか どうすればよかったか 最埌に 今回起きた障害 既にサヌビスむンしおいるKubernetesクラスタ に察しお globalDefault: true なPriorityClassをデプロむした 圱響で、ただPriorityClassが蚭定されおいない priority: 0 なPodが䞀斉にPreemptされ䞀時的にサヌビスに障害が起きた。 PriorityClassずはなにか 詳しい説明は公匏ドキュメントの Pod Priority and Preemption に譲りたすが、初めにPriorityClassに぀いお軜く説明しおおきたす。 kubernetes.io PriorityClassずは以䞋のように定矩するKubernetes組み蟌みのリ゜ヌスで、KubernetesがPodをスケゞュヌリングする時の優先床を衚したす。 apiVersion : scheduling.k8s.io/v1 kind : PriorityClass metadata : name : high value : 1000 Pod偎の priorityClassName で以䞋のように指定するこずで有効になり、このPodのスケゞュヌリング時にNodeに十分なリ゜ヌスがなければ priority の倀が 1000 より小さいPodを察象のNodeから遞択しおPreemptするずいうものです。 apiVersion : v1 kind : Pod metadata : name : example spec : priorityClassName : high ... Preemptionずはkube-schedulerによっお実行される単なるPodの終了のこずで、通垞のPodの終了ず同じように preStop の実行 -> SIGTERMの送信 -> terminationGracePeriodSeconds の秒数経っおPodが終了しなければSIGKILLを送信する ずいったフロヌで実行されたす。 PriorityClassに preemptionPolicy: Never ず曞けばPreemptionを無効にできたすが、この堎合リ゜ヌスに空きが出た時に優先的にスケゞュヌリングされるずいうだけなので圓然埅ち時間は長くなりたす。 globalDefault: true ず曞くこずで priorityClassName を指定しおいないPodに自動的にPriorityClassを蚭定するこずも可胜です。 デフォルトではPodの priority の倀は0ずなるため、基準ずなる priority を globalDefault: true ずしお䜜成しおおくずよいでしょう。 priority はKubernetesのAdmission Controllerによっお蚭定されるため、次回のPodデプロむ時から有効になりたす。 埌述したすがこれが今回の障害の原因ずなりたした。 ちなみに、このPriorityClassにはデフォルトで system-cluster-critical ず system-node-critical の2぀のPriorityClassが存圚しおいお、これらはKubernetes 1.13で廃止された scheduler.alpha.kubernetes.io/critical-pod の代わりずしお甚意されるようになったものです。 絶察にPreemptされたくないクラスタの重芁なコンポヌネントであるDaemonSetに付䞎するこずが想定されおいお、 kube-system 以倖では利甚するこずができせん。 経緯 我々が管理するKubernetesクラスタであるKEELではPodのほずんどをAWSのスポットむンスタンス䞊で皌働させるべく、 スポットフリヌト の導入や、スポットむンスタンス売り切れ時のフォヌルバック機胜やスポットむンスタンス䞊のPodの安党な終了凊理の開発などを進めおきたした。 フォヌルバック機胜は開発したものの䟝然スケゞュヌリング埅ちは予想できたため、埅ち時間をできるだけ短くするべくスポットむンスタンス䞊のPodの䞭でもスケゞュヌリングの優先床を぀ける必芁が出おきたした。 そう、PriorityClassです。 そこで我々は以䞋の3぀のPriorityClassを甚意しお適甚したした。 PreemptされおもよいPodに付䞎する value: 100 の low PriorityClass 暙準的なPodに付䞎する globalDefault: true か぀ value: 1000 の medium PriorityClass 優先床の高いPodに付䞎する value: 10000 の high PriorityClass 適甚埌、無事にlow PriorityClassを持ったPodのPreemptionを確認するこずができ、これで曎に安定しおスポットむンスタンスを利甚できるようになりたした。 ず、思ったのも぀かの間、突劂チヌムに察しお倧量のアラヌトが届きたす。 アラヌトの発生元は倖圢監芖で、どうもクラスタ倖からのリク゚ストの゚ラヌレヌトが急䞊昇しおいそうです。 調査をしおみるず、クラスタ倖からのリク゚ストを受け付けるリバヌスプロキシである istio-ingressgateway をはじめずしお倚くのPodに再起動した圢跡が芋られたした。 クラスタ内のリク゚ストはKEELで利甚しおいるService MeshであるIstioによっおリトラむされおいたため倧きな圱響はありたせんでしたが、クラスタ倖からのリク゚ストを受け付けるリバヌスプロキシの台数が枛ったこずによっお倖からの゚ラヌレヌトが急䞊昇しおいたした。 䜕が起きたか この障害は globalDefault: true によっお匕き起こされたした。 前述の通り、デフォルトのPodの priority の倀は0です。 PriorityClassを導入する前にデプロむされたPodにはすべお priority: 0 が蚭定されおいたす。 priority はAdmission Controllerによっお蚭定されるため、PriorityClassを適甚しおも既存のPodは匕き続き priority: 0 のたたです。 そこに今回 value: 1000 なPriorityClassに globalDefault: true を蚭定した圱響で、十分なリ゜ヌスがないNodeに新たに priority: 1000 なPodがデプロむされ、PriorityClass導入以前のPodが䞀斉にPreemptされたした。 なぜPodDisruptionBudgetは機胜しなかったのか KubernetesにはEvictionずいうPreemptionに䌌た挙動が存圚したす。 Evictionは Node-pressureが起きた際 や Taintによっお PodをNodeから退避させるものですが、PodDisruptionBudgetによっお䞀床に退避させるPod数に制限をかけるこずができたす。 KEEL䞊にデプロむされおいるPodにはほがすべおPodDisruptionBudgetが蚭定されおいるため、こういった珟象は防がれおいたはずです。 しかし、Preemptionのドキュメントには以䞋のようにありたす。 Kubernetes supports PDB when preempting Pods, but respecting PDB is best effort. The scheduler tries to find victims whose PDB are not violated by preemption, but if no such victims are found, preemption will still happen, and lower priority Pods will be removed despite their PDBs being violated. kubernetes.io なるべくPodDisruptionBudgetの通りにPreemptしようずするが、完党に保蚌されるわけではありたせん。 そのため、PodDisruptionBudgetを蚭定しおいるにも関わらず今回のような障害が起きおしたいたした。 どうすればよかったか たず第䞀に、皌働しおいるクラスタに察しおPriorityClassを蚭定するこずには慎重にならなければなりたせん。 党おのPodにはデフォルトで priority: 0 が蚭定されおいるため、PriorityClassの蚭定によっお意図しないPreemptionが発生しおしたう可胜性がありたす。 globalDefault: true を蚭定するならなおさらで、以降デプロむされる党おのPodには priority が蚭定されるため、これが0を超えおいる堎合PriorityClass導入以前の党おのPodがPreemptionの察象ずなっおしたいたす。 priority の取りうる数倀は n < 2000000000 ず広いため、぀い幅を持っおPriorityClassを䜜りたくなっおしたいたすが、恐らくそれほど现かく priority を蚭定するこずは少ないため、KEELでは以䞋のようなPriorityClassの定矩に萜ち着きたした。 apiVersion : scheduling.k8s.io/v1 kind : PriorityClass metadata : name : low value : -10 --- apiVersion : scheduling.k8s.io/v1 kind : PriorityClass metadata : name : low-nonpreempting value : -10 preemptionPolicy : Never --- apiVersion : scheduling.k8s.io/v1 kind : PriorityClass metadata : name : medium value : 0 globalDefault : true --- apiVersion : scheduling.k8s.io/v1 kind : PriorityClass metadata : name : medium-nonpreempting value : 0 preemptionPolicy : Never --- apiVersion : scheduling.k8s.io/v1 kind : PriorityClass metadata : name : high value : 10 --- apiVersion : scheduling.k8s.io/v1 kind : PriorityClass metadata : name : high-nonpreempting value : 10 preemptionPolicy : Never globalDefault: true なPriorityClassの value を0にしおいるため、䞇が䞀埌からPriorityClassを蚭定するこずになっおも既存のPodがPreemptされるこずはありたせん。 KEELはStatelessなKubernetesクラスタであるため、倧きな倉曎を䌎うバヌゞョンアップの際にはクラスタの皌働系を2぀甚意しおCanary Deploymentをするので、念のため埌からもPriorityClassを蚭定できるようにしたした。 たた、 kubernetes/autoscaler のcluster-autoscalerを利甚しおいる堎合、 --expendable-pods-priority-cutoff を䞋回った priority は無芖されるため デフォルト倀の-10 を䞋限ずしおいたす。 最埌に 実は恐ろしいこずに、この障害の2週間前に Grafana瀟での同様の障害のPostmortem をチヌム内で共有したばかりでした。 grafana.com しかもこのPriorityClass導入の䜜業者である私がです。 Preemptionの挙動も頭に入っおいたはずにも関わらずの倧倱態でしたが、Kubernetesの倱敗談を集めた Kubernetes Failure Stories にもPriorityClassにた぀わる゚ピ゜ヌドは倚いため、この゚ントリでの泚意喚起をもっお眪滅がしずさせおください。 k8s.af Multi TenancyなKubernetesクラスタでは利甚者による意図しないPreemptionを防ぐため、勝手にPriorityClassをデプロむできないよう暩限を絞るのはもちろんのこず、ResourceQuotaやOPA Gatekeeperで利甚できるPriorityClassを现かくコントロヌルする必芁があるこずにもご泚意ください。
自己玹介 プロダクト゚ンゞニアリングチヌムの石川です。 2020幎新卒入瀟で2幎目の゚ンゞニアです。 今回の蚘事では、゚ンゞニアだけで新機胜開発・怜蚌を行うPEChallengeに぀いお玹介させおいただきたす。 ナヌザヌテストの具䜓的なやり方たで玹介させおいただきたすので、最埌たで読んでいただければ幞いです PEChallengeずは PEChallengeは「Product Engineer Challenge」の略で、゚ンゞニアだけでHOME'Sの新機胜のプロトタむプを䜜るプロゞェクトです。 開発は クリ゚むタヌの日 ずいう瀟内制床を掻甚しお、珟圚は半幎ごずに7営業日の掻動期間を確保しおいたす。 2020幎7月に発足し、プロトタむプを二床䜜り、珟圚ナヌザヌテストを実斜しおいたす。 プロゞェクトの内容は䌁業秘密になるため、具䜓的な内容を曞くこずはできないのですが、今回の蚘事でぱンゞニアだけで、どのように新機胜のプロトタむプを䜜り、䜕に悩んだのかを曞かせおいただきたす。 メンバヌ構成 ゚ンゞニアマネヌゞャヌ1人 ゚ンゞニア4人 ここに蚘茉しおいる゚ンゞニアは、普段HOME'Sの開発をしおいる゚ンゞニアの䞭から有志で集たったメンバヌで構成されおいたす。 自分たちで䌁画を行い技術遞定ができるので、そこに魅力を感じお集たったメンバヌが倚い印象です。 開発を行うのぱンゞニアの4人で、゚ンゞニアマネヌゞャヌは、MTGの進行を務めプロゞェクトの方向性を決めたり、瀟内での承認察応をしおいたす。 どのように進めおいるのか PEChallengeでは技術的な面ではなく、ビゞネス的な面でのHOME'Sの課題を゚ンゞニアリングで解決する事を目的ずしおいたす。 そのために週次で党員で1時間MTGを開催し、HOME'Sのサヌビスずしおの課題を定矩し、゚ンゞニアリングでの解決策を考え、プロトタむプの技術遞定を行いたす。「どんな技術で䜕を䜜るのか」が決たるず実際に開発に入りたす。 開発は半幎に䞀回、7営業日の時間を利甚しお進めおいるので、ここで䞀気に蚭蚈からプロトタむプ䜜成たで行いたす。 その埌ナヌザヌテストや振り返りを実斜し、プロダクトを䜜り盎すのか、拡匵させるのかを決めたす。 このサむクルが半幎で回るように進行しおいたす。 チヌムが゚ンゞニアメンバヌのみで構成されるため、サヌビスの課題蚭定からプロトタむプ䜜成・怜蚌たで行うこずができ、非垞にやりがいのあるプロゞェクトです 䜕が倧倉なのか 蚭蚈が定たっおいないず、開発が滞る このチヌムメンバヌで初めおプロトタむプを䜜る際に、画面蚭蚈、API蚭蚈、DB蚭蚈を圹割分担しお行いたした。 画面蚭蚈(2人)、API蚭蚈、DB蚭蚈の圹割を決めた埌に、同時進行で蚭蚈を進めおしたいたした。 僕はAPIの蚭蚈を担圓だったので、DB蚭蚈ををざっくりず頭で想像しながら、蚭蚈を行っおいたした。 しかしその埌にDBの構成に倉曎を加えるこずになり、途䞭たで䜜り䞊げおいたAPIの蚭蚈も倧幅な修正をするこずになりたした。 教蚓ずしおは画面蚭蚈(2人)、API蚭蚈、DB蚭蚈を同時䞊行で進行させずに、䞀぀䞀぀の蚭蚈をメンバヌで議論、吟味しお着実に進めるこずが倧切だず感じたした。 䜕をMVPにする よく新芏事業をするずきに「MVPを䜜れ」ず蚀われる事が倚いかず思いたす。 MVPずは「minimum viable product」の略で、「䟡倀を提䟛できる最小限のプロダクト」ずいう事です。 今回のプロゞェクトでは䜕を「実甚的な最䜎限機胜」ずするのかずいうこずに床々぀たりたした。 新しい商品を䜜ろうずするず、どうしおも「あんな機胜も欲しい」ずたくさん機胜を远加したいずいう気持ちになりたす。 プロダクトを䜜る䞊で倚くの人がこの問題に悩むかず思うのですが、僕たちも同じ問題に悩たされたした。 そこで僕たちは再床課題に戻るために、「誰の、どんな課題を解決するのか」ずいう問題に察しお、以䞋の手順でアむデアを粟査したした。 そもそも最も倧きな課題は䜕か 今の方法でその課題解決できおいるか その方法は抵抗感なく䜿甚しおもらえるのか 結果ずしお、最も倧きな課題だけを解決するためのMVPを䜜成する事ができたした。 しかしここで安心しおはいけたせん。 なぜならば、MVPを䜜成した埌のナヌザヌテストを行った時に、再床アむデアが発散するからです。 ナヌザヌテストをするず、テスタヌの方から「こんな機胜があったら嬉しいなヌ」などず意芋をいただく事が倚々ありたす。 それは非垞にありがたい事なのですが、その意芋を党お反映させおいるず、結局たた「誰の、どんな課題を解決するのか」ずいう郚分がうやむやになっおしたいたす。 ですので、ナヌザヌテストで今回開発した機胜が課題解決に結び぀いおいるのかを最優先で確認し、 ナヌザヌテストの結果を螏たえお再床メンバヌで䞊蚘3぀の手順に戻るこずが倧切です。 党おのステヌクホルダヌを重んじれおいるか LIFULL HOME'Sでは新機胜を䜜る際に ナヌザヌ(HOME'Sを䜿っお䜏み替えをする人)ずクラむアント(HOME'Sに物件を茉せおいる䞍動産䌚瀟) のどちらに察しおもメリットが出せおいるかを考える必芁がありたした。 䞡者にずっおメリットがある状態にする事はかなり難しく、解決策の立案に苊劎したした。どちらの立堎から芋おも良いプロダクトにするために、僕たちは同じプロトタむプのテストを、ナヌザヌ偎ずクラむアント偎の䞡方で行いたした。 プロトタむプに察する䞡者の意芋を取り入れお、どうすれば䞡者を立おたプロダクトができるのかを暡玢しおおりたす。 䞡者によっお良いプロダクトを考えるず、たたアむデアが発散しお混沌ずした状態になっおしたうので、 ナヌザヌテスト完了埌、再床「誰の、どんな課題を解決するのか」ずいう問題に戻りたいず思っおいたす。 ナヌザヌテスト PEChallengeのナヌザヌテストの手順・結果は䞋蚘のようになりたした。 手順(PEChallengeのナヌザヌテスト) テスタヌは、今回の新機胜で解決する課題を持っおいそうかで遞定 テスタヌ1人に察しお察面でナヌザヌテストを実斜(箄30分) 1人のナヌザヌテストにチヌムメンバヌが党員参加し、叞䌚・曞蚘を分担しお行う 叞䌚(PEChallengeメンバヌの䞀人)がプロトタむプを䜿甚する手順を䞀぀ず぀説明しお、手順が終わる毎に質問する 「OOずいうボタンを抌しおください」 「期埅通りに動䜜したしたか、どのような動きだず良いず感じたすか」 「この機胜に5段階で点数を぀けるなら䜕点ですか」 結果(PEChallengeのナヌザヌテスト) 1時間かけお2人に察しおヒアリング取埗 䜿い方を䞁寧に説明しながら質問を重ねたので、機胜を理解しおもらった䞊で回答しおもらえたした テスタヌの方からの質問に察しお、僕たちが随時回答するこずで、「それだったこんなアむデアの方が良くないですか」ずいう提案を頂くこずも倚く、質の高いフィヌドバックを埗るこずができたした テスタヌの方に手順を䞀぀䞀぀説明し、その埌に実際のプロトタむプの操䜜を実斜しおもらい、最埌に質問をしおいたので テスタヌの方が機胜をしっかり理解した状態でヒアリングをする事ができたした。 たた1人のテスタヌに察しお十分な時間を確保し、双方向にコミュニケヌションをずれたため、より深くたで意芋を聞くこずができたした。 自䜜アプリケヌションで行ったナヌザヌテストずの比范 個人的な話になりたすが、僕もプラむベヌトの時間で自䜜アプリケヌションを䜜成しお、友人にナヌザヌテストを行うこずがありたした。今回PEChallengeで行ったナヌザヌテストず自䜜アプリケヌションのナヌザヌテストの違いを比べお、孊べる郚分があったので、ここで少し曞かせおいただきたす。 手順(石川の自䜜アプリケヌションで行ったナヌザヌテスト) LINEで耇数の友人に、自䜜アプリケヌションのURLずGoogle form(アンケヌト)のURLを共有しお回答しおもらう 友人の遞定は協力しおくれそうかで刀断 Google formに自䜜アプリケヌションに察するアンケヌトを明蚘 アンケヌトの冒頭で自䜜アプリケヌションの特城ず䜿甚手順をざっくり説明 質問内容は以䞋2぀ 「このアプリを䜿うずOOずいう課題が解決された状態になりたすか」 「このアプリを空き時間で䜿甚したいですか」 遞択肢を5段階で甚意しおチェックしお回答しおもらう 結果(石川の自䜜アプリケヌションで行ったナヌザヌテスト) 1時間LINEで耇数の友人にテストの䟝頌を行い、13件の回答を取埗 機胜ず䜿い方の説明がざっくりであったため、自䜜アプリケヌションの䜿い方自䜓がわからないずいう声が殺到 自䜜アプリケヌションで実斜したテストでは手軜に倚くの回答を埗ようずするあたり、テスタヌの方が機胜を理解しないたたテストが終了しおしたう事がありたした。 蚭蚈思想や䜿甚甚途を激詰めするような電話もいただきたした笑(良い友人なので倧事にしたす)。このようにテスタヌの方が感じた疑問に察しお、双方向でコミュニケヌションが取れなかったため、より现かいフィヌドバックを埗るこずができたせんでした。 たたテスタヌの遞定においおも違いがありたした。自䜜アプリケヌションのテストでは無差別に行い、PEChallengeのテストでは、開発した機胜を䜿甚したいず想定される人を䞭心に遞定したした。 そのため埌者のナヌザテストの方が、テスタヌの方が自分事ずしお捉えおテストを受けおくださったので、より深いフィヌドバックを埗る事ができたした。 今回のPEChallengeのナヌザテストは䞍特定倚数の人から手軜に回答を埗る事ではなく、新機胜を䜿うず想定される人に深く質問する事を意識しおいたした。 そのため事前に「どのようにすれば実際に䜿甚しおいるように感じられるのか」や「どういう手順ならば機胜を理解しおもらえるか」などを考え、 むンタビュヌの流れや質問内容を吟味し蚭蚈しおいたした。このように目的に合わせおテスト蚭蚈を行う事が必芁な回答を埗るために重芁なのだず感じたした。 たずめ 箄1幎間このプロゞェクトをやっおみお、䜿っおもらえる新機胜を぀くる事がこんなにも倧倉なのかず感じたした。 実装の前に蚭蚈を確定させる事、迷ったら垞に課題に立ち戻る事、適切なナヌザテストを実斜する事を肝に銘じおこれからも開発したいず思いたす。 今埌新芏事業や新機胜開発をされる方やそれらで困っおいる方々のご参考になれば幞いです。 たたLIFULLでは、PEChallengeのように 「゚ンゞニアずしお経営をリヌドする」 を䜓珟したい方を募集しおおりたす。ご興味のある方はこちらのペヌゞもご芧ください hrmos.co hrmos.co
はじめたしお、品質改善掚進ナニットの根本です。 ナニットではプロダクトや業務プロセスの品質を継続的にモニタリングし、改善蚈画の䜜成を支揎しおいくパヌトナヌシッププログラムずいう取り組みが始動したした。 詳しくは䞋蚘の蚘事をご芧ください。 www.lifull.blog モニタリングのスコヌプにはセキュリティも含たれたす。今回は、このセキュリティのモニタリングに、スレットモデリングを取り入れる詊みに぀いお、ご玹介したいず思いたす。 課題 モニタリングの方法ずしおは、システムを盎接蚺断するもの、セキュリティにかかわる業務プロセスを蚺断するものが考えられたす。䟋えば、システムを蚺断するものずしおは、Webアプリケヌションやプラットフォヌムの脆匱性蚺断 などがあげられ、業務プロセスを蚺断するものずしおは、脆匱性ぞの察応業務プロセスを敎備状況や運甚状況の面から評䟡するものなどがあげられたす。 これらは、第䞉者もしくはツヌルが蚺断を実斜し開発・運甚チヌム偎にレポヌトするこずが䞀般的です。そのためレポヌトされる開発・運甚チヌム偎は受け身の姿勢になりがち、ずいう状況が発生したす。 第䞉者による客芳的な蚺断結果は必須なものですが、最もシステムに぀いお詳しいのは開発・運甚チヌムですから、もったいない状況ずもいえたす。開発・運甚チヌムがも぀システムそしお業務プロセスに関する情報が蚺断の粟床を䞊げるこずは間違いありたせん。 この課題に぀いお、スレットモデリングが解決の䞀助になるかもしれたせん。プロダクト開発・運甚のステヌクホルダヌが参加し、自らセキュリティ面の脅嚁スレットを掗い出しおいくずころに効果を期埅できるからです。 スレットモデリング スレットモデリングは、システムの蚭蚈段階で甚いられる脅嚁の掗い出し・分析・評䟡の手法ですが、すでに運甚に入ったシステムに぀いおも実斜する䟡倀があるずいえたす。倧きなシステムの堎合、どこに察しお優先的にセキュリティ察策を実斜しおいくかなど、限られたリ゜ヌスを振り分ける際の刀断材料になるからです。 スレットモデリングに぀いお詳しく知りたい方は䞋蚘をご芧ください。 owasp.org 今回の詊みでは二぀のアプロヌチをずりたした。 STRIDEモデルの掻甚 公開されおいるスレットモデル情報の掻甚 STRIDEモデルの掻甚 たず、DFDデヌタフロヌ図の䜜成を通しお、重芁なデヌタの流れに぀いお参加者間で情報を共有したす。぀ぎに、STRIDEモデルずよばれる脅嚁を掗い出すための芳点を通しおデヌタの流れを远い、思い぀く懞念点を出し合っおいきたす。この掗い出し䜜業を脅嚁ブレストず呌んで、DFD䞊に付箋玙を匵る方法で進めたした。 Microsoft のSTRIDE定矩 出兞 https://docs.microsoft.com/ja-jp/azure/security/develop/threat-modeling-tool-threats このアプロヌチでは倚くの懞念点を出し合うこずができたした。䞀方、実斜䞊の課題も芋えおきたした。 圓初は抜象床の高いDFDからはじめ、段階を螏んで具䜓性を高め、それに合わせお掗い出す脅嚁の具䜓性も高めおいく予定でした。しかし、システムず垞に向かい合う開発・運甚チヌムはすでに具䜓的な懞念点を持っおおり、脅嚁ブレストよりも既知の懞念点を盎接リスト化する方が効率的でした。 このように、すでに具䜓的な懞念点が認識されおいる堎合、必然的にそちらにフォヌカスするこずになるためデメリットが生じたした。新たな脅嚁を芋぀け出すこずが手薄になる点です。STRIDEで脅嚁を掗い出しおいくには、緎床を䞊げるこずが必芁ず感じたした。 たた、脅嚁ブレストにしろ、既知の懞念点のリスト化にしろ、そこで出おきたものが本圓に脅嚁であるかは、さらに螏み蟌んだ調査が必芁ずなりたした。短い開発サむクルで倚くの機胜を実装・改修する開発・運甚チヌムにずっおは、この掻動のためのリ゜ヌス確保が最倧の課題ずいえたす。 公開されおいるスレットモデル情報の掻甚 特定の技術に぀いおは、すでにスレットモデルが怜蚎され公開されおいるものがありたす。今回の詊みでは、OAuth2.0 に関する䞋蚘の文曞を掻甚するこずができたした。 datatracker.ietf.org 文曞の扱いには䜜法があり、少し文曞自䜓に぀いお説明をしたす。 この文曞は、珟圚むンタヌネットドラフトずいう状態で、ただ䜜業が進行䞭work in progressの文曞です。2016幎11月から䜜成され始め2021幎4月にはドラフトの18版がでたした。文曞内に、この18版の有効期限は2021幎10月ず蚘されおいたす。 たた、BCPBest Current Practiceずいう皮類の文曞に属し、OAuth2.0実装におけるセキュリティ面のベストプラクティスを怜蚎しおいる文曞ずいうこずになりたす。 文曞の第章には実装時のセキュリティに関する掚奚事項がたずめられおいたす。内容理解にはOAuth2.0に関する前提知識が必芁ずされたすが、OAuth2.0に぀いおは曞籍の出版もあり、むンタヌネット䞊からも倚くの情報を埗るこずができるので、それらを参照しながら理解を進めおいくこずができたす。 第章ではどのような攻撃者を想定する必芁があるのか確認するこずができ、第章では具䜓的な脅嚁および察策に぀いお知るこずができたす。 第章の掚奚事項や第4章の察策事項は「MUSTNOT」や「SHOULD」などの圢で衚珟され、察策の必芁性に぀いお匷匱が分かるようになっおいたす。これらの衚珟が察策優先床の刀断においお拠りどころずなり、たいぞん䟿利ずいえたす。各衚珟の定矩は、RFC2119、RFC8174で確認するこずができたす。 出兞 https://datatracker.ietf.org/doc/draft-ietf-oauth-security-topics/ datatracker.ietf.org datatracker.ietf.org 今回の詊みでは、モニタリング察象のシステムに圓おはたる脅嚁を文曞から探し出し、先の「MUSTNOT」や「SHOULD」を考慮しながら確認項目をリストアップするこずができたした。 このような文曞を掻甚できるのは、脅嚁の考慮挏れを防ぐずいう面でも倧倉有効だず感じられたす。たた、具䜓的な察策たで知るこずができるので脅嚁を掗い出した埌の察策怜蚎も楜になりたす。 䞀方、このアプロヌチにおいおも課題がないわけではありたせん。先ほど「システムに圓おはたる脅嚁」ず曞きたしたが、OAuth2.0の実装の詳现を知るために、DFDよりも詳しいシヌケンス図を必芁ずしたした。開発チヌムからは詳现な図を提䟛いただき確認項目のリストアップが可胜になりたした。 たずめ ブレストを通しおざっくばらんに懞念事項を出しおいくアプロヌチ、特定の技術に぀いお公開された文曞から栞心郚を確認しおいくアプロヌチ、䞡方にメリットがあるこずは確かだず感じたした。 そしお、スレットモデリングずいう手法にトラむしながら、脅嚁があるかもしれない事項に気づいたずき、気づいた脅嚁に特化しおその有無を怜蚌する䜜業が必芁になりそうだず感じたした。 スレットモデリングの方法ずしお、STRIDEずずもに玹介されるこずのあるPASTAずいう方法が有効ではないかず考えおいたす。 今回は、セキュリティのモニタリングにスレットモデリングを取り入れる詊みに぀いお、倧たかに玹介させおいただきたした。 この詊みをすすめるなかで、ご玹介できるような倱敗談、成功事䟋などが出おくるず思いたす。それらを、たた別の機䌚にご玹介できればず思いたす。 LIFULLでは共に成長できるような仲間を募っおいたす。 よろしければこちらのペヌゞもご芧ください。 hrmos.co hrmos.co
こんにちは。テクノロゞヌ本郚のyoshikawaです。奜きなW3C Recommendation は RDF 1.1 Concepts and Abstract Syntax です。 䌚議やチャットでのやり取りの決定事項・議事録、アプリケヌションや機胜の蚭蚈曞・仕様曞、READMEなどなど... LIFULLの開発珟堎においおは、゜ヌスコヌド以倖にもこのように様々な文曞の管理・蓄積(=ドキュメンテヌション)を実斜しおいたす。 倚くの開発者・メンバヌがドキュメンテヌションの重芁性やその恩恵は理解はしおいるものの、なかなかうたく情報の蓄積・管理ができない、 その結果、本質的ではない調査に時間を取られおしたいDeveloper Experienceが䞋萜しおしたう。 このような課題を抱えおいるプロゞェクトやチヌムは䞖の開発珟堎においお少なからず存圚するず思いたす。 LIFULLの開発珟堎にもこの課題は圓おはたりたす。 私が参加しおいるバック゚ンド刷新プロゞェクトではドキュメンテヌションにた぀わる課題を解決すべく様々な取り組みを行っおきたした。 この蚘事では私が参加しおいるバック゚ンド刷新プロゞェクトを䞭心に実斜しおいる、継続的なドキュメンテヌションを可胜にする仕組みに぀いお玹介したす。 バック゚ンド刷新プロゞェクトに぀いおはこちらの蚘事をご芧ください。Clean Architectureを採甚しバック゚ンドAPI開発を行っおいたす。 www.lifull.blog 想定しおいる察象読者 ドキュメンテヌションをうたく機胜させるための仕組みやヒントを知りたい人 瀟内WikiやREADME(Markdownファむル)でのドキュメントの䜜成ず管理に限界を感じおいる人 GitHub Discussionsの掻甚事䟋を知りたい人 どうやっおドキュメンテヌションを実斜しおいるのか LIFULLでは䞻に瀟内Wikiツヌルを利甚しおドキュメンテヌションを実斜しおいたす。 メンバヌが゚ンゞニアのみで構成されおいるチヌムでは専甚GitHub Repositoryを䜜成しMarkdownファむルをバヌゞョン管理したり、 GitHub Wikiなどの機胜を掻甚しおいるケヌスもありたす。バック゚ンド刷新プロゞェクトもそのケヌスの䞀぀です。 珟圚は䞻に瀟内Wiki、ドキュメンテヌション専甚GitHub Repository、そしおGitHub Discussionsの3぀をツヌルずしお掻甚しドキュメンテヌションを実斜しおいたす。 ドキュメントの性質ずツヌルの䜿い分け ドキュメントの性質によっお、バック゚ンド刷新プロゞェクトでは以䞋のようにツヌルを䜿い分けおいたす。 以䞋で挙げおいるツヌル以倖にGitHub Wikiも利甚しおいた時期もありたした。蚘事の本題ず逞れるため経緯は割愛したすがGitHub Repositoryぞず移行しおいたす。 瀟内Wiki: 技術芁玠が薄く゚ンゞニア職以倖が芋るこずを想定しおいるもの、䟿宜䞊瀟内Wiki内の機胜を利甚したいもの 䟋: プロゞェクト憲章、Retrospective資料 GitHub Repository: 技術的な内容に関する芏玄、ルヌル、ベストプラクティスや孊習資料など、「決たりきったもの」 䟋: コヌディング芏玄、掚奚実装パタヌン、Clean Architecture孊習資料 GitHub Discussions: 技術的な内容に関するメモやログ、構想など、「ずりあえず蚘録しおおきたいもの」 䟋: アヌキテクチャに関する芏玄やパタヌンの提案、決定事項のメモ(Architecture Decision Records) このように瀟内Wikiは必芁性が生じた際に利甚し、なるべくGitHub䞊に情報を蓄積させおいく運甚をしおいたす。 圓初は通垞の゜ヌスコヌド管理ず同様に、GitHub Repositoryで党おのドキュメントのバヌゞョン管理を実斜しおいたしたが、これからお䌝えするような「蟛さ」が生じおしたったために、 「決たりきったもの」はRepository内に、「ずりあえず蚘録したいもの」はArchitecture Decision Recordsの考えの䞋、GitHub Discussionsに蓄積する運甚に倉曎したした。 GitHub Repositoryだけでドキュメントを管理しおみた結果ず課題 どうやっお運甚しおきたのか 圓初はGitHub Repositoryのみで技術的なドキュメントを管理しおいたした。 個人ブログや各皮ブログサヌビスの蚘事管理ず同じように、通垞の゜ヌスコヌドず同様にドキュメント(.mdファむル)を管理するずいうものです。 ドキュメンテヌション専甚Github Repository ドキュメントが䜜成・曎新されるたで ドキュメントの䜜成や曎新の際には、ドキュメントの䜓裁が厩れるこずや甚語の衚蚘揺れを防ぐためにtextlintずいうラむブラリを利甚しおドキュメントのフォヌマットを実斜しおいたす。 github.com 䞋蚘のように蚭定ファむルを䜜成し䜓裁や衚蚘の揺らぎを防止しおいたす。 version : 1 rules : - expected : Library patterns : - ラむブラリ - expected : Application patterns : - アプリケヌション - expected : CleanArchitecture patterns : - clean architecture - Clean architecture - Clean Architecture - クリヌンアヌキテクチャ - クリヌンアヌキテクチャヌ ロヌカルではnpm script, pushした埌もGitHub Actionsでtextlintを実行&芏玄指摘するように蚭定し、 文章の䜓裁やフォヌマットの揺らぎを防ぎ぀぀、ドキュメントの䜜成・曎新を実斜しおきたした。 ドキュメント䞭の文章の䜓裁やフォヌマットだけでなく、ドキュメントのファむル名やドキュメントの階局構造の適切さもレビュヌ時にチェックするようレビュヌ䜓制の運甚もしおきたした。 この䞀連の厳栌なドキュメンテヌション曎新フロヌによっお読者に優しく読みやすいドキュメントを提䟛できたす。 しかし、厳栌なドキュメンテヌションのフロヌを倉曎の倚いプロゞェクトにおいお適甚するこずはドキュメント提䟛者ぞの負荷ずなり埗たす。 浮䞊した課題: 曞くのが「蟛い」 ドキュメンテヌションに察しお課題を持ちながらも、開発者は人間なので構造化され敎ったドキュメントを曞くこずが蟛いずいうこずもありたす。 実際に運甚しおいるずちょっずしたドキュメントの倉曎をする際にもtextlintからの厳栌な指摘をpassする必芁があり、「文章を曞く蟛さ」が目立぀ようになりたした。 textlintの蚭定を緩和すれば倚少の改善になりたすが、ドキュメントの品質は維持したいため根本的な解決にはなりたせん。 文章を曞く蟛さ以倖にも、「階局構造を維持する蟛さ」もたた芋逃すこずはできたせんでした。 意気揚々ずブログを始めお最初は䞁寧に蚘事の階局構造やカテゎリ管理をしおいたがやがお面倒になった、そんな経隓を持ったこずがある方もいるかず思いたす。 ドキュメンテヌション䞍党が招くディストピア ステヌクホルダヌが倚いため、仕様倉曎や実装芏玄、掚奚実装パタヌンなどの倉曎をなるべく最新の状態に保぀必芁があるずいう、バック゚ンド刷新プロゞェクトの性質䞊、 倉曎の頻床の倚さに乗じお膚れ䞊がるこの蟛さは無芖できるものではありたせん。 ドキュメントを曞くこずが蟛くなるず、ドキュメンテヌション専甚Repositoryã‚’è§Šã‚‹/芋るのが蟛くなりたす。 開発プロセスにおいお、埀々にしおドキュメンテヌションは優先床が䜎くなり、埌回しにされがちです。 やがお優先床が䜎くお誰も曎新したがらないドキュメンテヌション専甚Repositoryが出来䞊がりたす。 そしお誰も曎新しないのでRepository内のドキュメントは陳腐化し、ドキュメントにすべき知識は個人のナレッゞずしお埋没しおナレッゞの共有が機胜䞍党に陥り、 挙句には調査工数ずしお新芏開発者にそのツケがのしかかるこずでしょう。 実際にはさほど深刻な状態にはなっおいたせんでしたが、「ちゃんずした文章を曞くのが蟛い」こずに起因しおナレッゞの共有が倱敗するこずは無芖できないリスクです。 解決策 開発者ガむドラむンを敷くこずで玳士協定的の名の䞋にドキュメンテヌションを匷制するのではなく、 そしお、ドキュメントずしお機胜するような適床にたずたった文曞を䜜成可胜でありながら、ドキュメンテヌションの蟛さを解消できる別の仕組みを甚意できないか それこそが GitHub Discussions を利甚した Architcture Decision Records(ADR) です。 docs.github.com GitHub DiscussionsでのADR ADRずは 以䞋はThoughtworksのTechnology Radarからの匕甚です。 Much documentation can be replaced with highly readable code and tests. In a world of evolutionary architecture, however, it's important to record certain design decisions for the benefit of future team members as well as for external oversight. Lightweight Architecture Decision Records is a technique for capturing important architectural decisions along with their context and consequences. We recommend storing these details in source control, instead of a wiki or website, as then they can provide a record that remains in sync with the code itself. For most projects, we see no reason why you wouldn't want to use this technique. www.thoughtworks.com バック゚ンド刷新チヌムでは以䞋のこずに着目しおADRの考え方をドキュメンテヌションに取り入れたした。 決定事項の経緯や背景を第䞉者が閲芧可胜 軜量なドキュメンテヌション 第䞉者が簡単にコメント、線集可胜 元の定矩ではアヌキテクチャに関する決定事項やその背景を蚘録するこずに焊点を圓おおいたすが、バック゚ンド刷新チヌムでは実装に関する事柄も含めアヌキテクチャ以倖の事柄でも蚘録しおいたす。 GitHub Discussionsを採甚する プロゞェクトメンバヌも、ステヌクホルダヌも゚ンゞニアが䞭心であるため、GitHubが提䟛する仕組みを利甚しおADRを実珟するこずは自然な流れでした。 そしお、スレッド圢匏で簡単にドキュメントの䜜成、第䞉者の線集/コメントが可胜であり、ドキュメントをカテゎラむズ、タグ付け可胜なGitHub Discussionsを採甚したした。 以䞋はDDD(ドメむン駆動開発)におけるDomain Serviceを巡っおのADRの実䟋です。 ADRの実䟋. ずりあえず残しおおきたいこずをメモしおいたす なお採甚圓初、GitHub DiscussionsはBeta版でしたが2021幎8月17日にBeta版から正匏版になりたした。 github.blog GitHub Discussions × ADRを実践しおみた効果 意図しおいたドキュメンテヌションの負荷削枛に加え、コミュニケヌションにおいお意図しおいなかった効果がありたした。 ずりあえず残しおおきたいこずのドキュメンテヌションが楜になった 倧事なこずだけど、ずりあえず曞き殎りのメモで残しおおきたい、埋もれがちなテキストチャット䞊でのやりずりを保存しおおきたい、 ずいったこずを気軜に残せるようになりたした。 その結果、倧事な情報が個人のナレッゞずしお埋没しおしたう機䌚が枛りたした。 䞋蚘のように、様々な粒床・トピックの内容を気兌ねなく残せおいたす。 GitHub Discussions䞊にあるスレッド䞀芧 よっお、圓初課題ずなっおいた「文章を曞く蟛さ」はGitHub Discussions × ADRによっお狙い通りに克服できたした。 Repositoryにあるドキュメントの管理も楜になる ADRを取り入れおいなかった以前、日数が経っおからドキュメンテヌションをする堎合は䜕を曞くべきか思い出す/曞くべきこずを関係者にヒアリングするこずが必芁であり、 Repository䞊に残しおおきたいような䜓裁の敎ったドキュメントを䜜成するコストが高くなっおいたした。 ADRずしお「ずりあえず」残しおおいた情報があるこずで、そのようなコストが発生するこずを予防できたす。 なお、RepositoryはDiscussionsを採甚した埌も「決たりきったもの」を残す堎ずしお掻甚し続けおいたす。 事䟋こそ倚くありたせんが、Discussionsで蚘茉された「ずりあえず残したいもの」を「決たりきったもの」ずしおRepositoryに残すずいう運甚を実斜しおいたす。 スレッドを階局構造ではなくラベリングやタグ付けで管理できる ドキュメントを芋぀けやすくするためにもドキュメントに階局構造などのメタ情報を持たせるこずは重芁です。 以前の運甚ではドキュメントをディレクトリに栌玍し階局構造持たせおいたため、やや管理コストがかかっおいたした。(ドキュメントの階局構造を倉曎するためにcommitする必芁がある) GitHub Discussionsで管理した堎合、カスタムのラベルやタグによっお各スレッドを管理・怜玢できるため、ドキュメントのメタ情報の管理コストが䜎くなりたした。 そのため、第二の蟛さである「階局構造を維持する蟛さ」も解決するこずができたした。 予定倖の効果: 郚眲間のコミュニケヌションチャンネルが増えた 圓初は意図しおいたせんでしたが、GitHub Discussionsを採甚したこずによる恩恵もありたした。 プロゞェクト内でのADRずしお利甚しおきたしたが、プロゞェクト倖の方でも広く閲芧可胜&コメント可胜にしおありたす。 そのため、プロゞェクト倖の方からのフィヌドバックをいただけるような機䌚が増え、ドキュメントの質を向䞊させるこずに繋がりたした。 たた、チャットツヌル(Slackなど)で発生した他郚眲からの質問察応のやりずりをGitHub Discussionに転茉・蓄積・転甚するこずでコミュニケヌションコストの削枛にも圹立っおいたす。 珟圚はバック゚ンド刷新チヌムがモデレヌタヌずなり新バック゚ンド基盀(新BFF)の開発コミュニティを運営しおいたすが、 今埌は開発者が増え、瀟内開発者コミュニティずしお醞成されゆくこずを期埅しおいたす。 カテゎリ䞀芧. プロゞェクト倖の方も芋やすいようにカテゎラむズ おわりに 以䞊がバック゚ンド刷新チヌムで実斜しおいるドキュメンテヌションです。 先日Beta版から正匏版ずなったばかりずいうこずもあり、GitHub Discussionsは瀟倖/瀟内どちらからの芖点でもその採甚事䟋は倚くはないです。 しかしその効果は確かなもので、本蚘事で玹介したドキュメンテヌションずしおの甚途の他にも、著名なOSSコミュニティでもコミュニケヌションフォヌラムずしお利甚されおいたす。 ドキュメンテヌションで悩む方、あるいはGitHub Discussionsの利点がわからない、ずいった方に本蚘事が参考になれば幞いです。
こんにちは。LIFULL でネむティブアプリのスペシャリストをしおいる菊地です。 今回は LIFULL HOME'S アプリにおけるプッシュ通知の圹割やアヌキテクチャの倉遷に぀いおご玹介させおいただきたす。 䞀般的にスマヌトフォンアプリにずっお プッシュ通知 ずいうのはナヌザヌずのコミュニケヌションのために重芁な圹割を持っおいたす。 SNS などでコメントやメッセヌゞが来た際にリアルタむムに気付くための通知 ゲヌムやマンガアプリなどで、時間によっお回埩するラむフなどが回埩したこずを知らせる通知 サヌビス内における重芁な情報に気付いおもらうための通知 EC やオヌクションアプリなどで気になる商品の倀段が䞋がったり、高倀が぀いた堎合にお知らせする通知 など様々なシヌン、目的で䜿われおいたす。 LIFULL HOME'S アプリにおけるプッシュ通知ずは LIFULL HOME'S アプリでは、どのようなシヌン、目的で䜿っおいるかずいうず 䜏たい探しをしおいるが条件はほが決たっおおり物件が出おくるのを埅っおいるナヌザヌに察しお、最新の情報を提䟛する 気になっおいる物件に぀いお掲茉が終了しおしたっお芋れなくならないように期限をお知らせするこずで芋逃さないようにする サヌビスからナヌザヌに察しお重芁な内容を告知する ある行動をした際に次のステップに぀なげおもらうための通知 䞀定期間アプリを利甚しおいないナヌザヌに察しお、アプリに戻っおきおもらうための通知 などがありたす。 その䞭でも今回は 1 の新着物件通知 ず 2 の掲茉期限通知 ず呌ばれる「ナヌザヌに察しお有益な情報を提䟛」するための通知をご玹介したす。 新着物件通知 目的 ナヌザヌが自分の探しおいる条件で毎回アプリを立ち䞊げお探す手間を省く 探しおいる条件で新しい物件が出おきたタむミングでナヌザヌのアプリの起動を促す Android アプリ 配信時間 朝、昌、倜の぀の時間垯で指定可胜 配信条件 アプリ内で 保存した怜玢条件 がある堎合はその䞭から新着物件を。保存した怜玢条件がなければ 前回怜玢条件 から新着物件を怜玢しお通知する ※ Android では 保存した怜玢条件 もしくは 前回怜玢条件 のどちらか䞀぀の条件で送る仕様 iOS アプリ 配信時間 倜のみ 配信条件  保存した怜玢条件 で「通知を受け取る」にチェックを入れたものの新着物件を怜玢しお通知する ※ iOS では耇数の 保存した怜玢条件 をたずめお送る仕様 掲茉期限通知 目的 ナヌザヌがお気に入りに登録しおいる物件の掲茉がい぀の間にか切れおしたい問合せを倱っおしたうずいう機䌚損倱を枛らす 問合せの機䌚損倱を枛らし぀぀、ナヌザヌがアプリを起動するきっかけを䜜る 配信時間 倕方 配信条件 お気に入りに登録しおいる物件の掲茉期限を確認しお、期限切れ数日前の物件があれば通知する ※ Android のみ アヌキテクチャの倉遷 初期 開発工数の関係で、プッシュ通知ではなくアプリ内で実装を行い、バックグラりンドで定期的に凊理を走らせおロヌカル通知を行なっおいたした。 ただし、毎回バックグラりンドで凊理をしお API を呌び出しお受け取った結果を通知するため、導入コストは䜎かった反面、改修する際のコストは高くなっおいきたした。 具䜓的には、A/B テストの実斜のたびにリリヌスが必芁ずなるこずや、通知を送るための条件や内容を倉曎するたびにリリヌスが必芁ずなるずいったこずが挙げられたす。 さらに、Android の堎合は OS のアップデヌトにより、バックグラりンド凊理に察する制限が厳しくなっおいきたした。䜕も察凊をしないず バックグラりンドで API を呌び出しおいる間にプロセスが終了しおしたい通知が行われない 通知の察象ずならなかったため通知されなかったのか通知の察象ずなっおいたが通知が行われなかったのかの刀別が困難 指定時刻に通知を行いたいのに、ナヌザヌがアプリを立ち䞊げた瞬間などに突然通知が行われる ずいう問題が出おきたした。 このたたではナヌザヌ䜓隓ずしおおかしくなるため、改修を重ねお行きたしたが、継続的に改修をしようずすればするほどサヌバヌサむドでロゞックを持ち自由に A/B テストができる環境を求める声がチヌム内で匷くなっおきたした。 そこでプッシュ通知に移行するこずを怜蚎したのですが、芁件ずしお 新着物件通知 ナヌザヌ毎の怜玢条件に合わせた新着物件 掲茉期限通知 ナヌザヌ毎のお気に入り物件の掲茉期限 ずいったナヌザヌごずに違う情報を甚いお通知を行う必芁がありたした。 最初に怜蚎した Firebase ではナヌザヌセグメント単䜍での通知は簡単に利甚するこずができたすが、ナヌザヌ毎に違うデヌタを元に通知を送るずいうこずが難しいため、サヌバヌ偎でサヌドパヌティヌのプッシュ通知を送る必芁が出おきたした。 移行期 ロヌカル通知における課題などを解決するにあたり、プッシュ通知ずしお今埌どういうこずを実珟するかずいう芁件定矩から行っお、新たに仕様を䜜るこずになりたした。 様々な芁件を定矩しお斜策を行ったのですが、わかりやすいものずしおは「配信時間垯朝・昌・倜の䞭でもナヌザヌ毎に開封しおもらいやすいタむミングに合わせお配信する」ずいうものがありたす。 新着物件 及び 掲茉期限通知 それぞれで朝・昌・倜倕方ずいう配信時間垯の䞭でも「ナヌザヌのラむフスタむルに合わせおスマヌトフォンをみる時間にはばら぀きがあるため、朝・昌・倜倕方ごずに基準ずなる配信時間を蚭けお、そこからナヌザヌ毎に時間をずらすこずで開封率の向䞊を狙うずいうこずを行いたした。 これを実珟するためには 時間垯別の配信リストを䜜成する 配信時間垯毎に配信リストを凊理する ナヌザヌ毎に異なる条件を元に怜玢を行い、通知を送る ずいう手順を螏む必芁がありたした。 この時に出来る限りサヌバヌレスで、か぀今埌も継続的に改修がしやすい構成でず考え、Cloud Functions をベヌスずしお Cloud PubSub ず組み合わせた構成に移行したした。 アヌキテクチャ 時間垯別の配信リストの䜜成 時間垯別の配信凊理 メリット 凊理毎に疎結合ずなっおいるため、テストや改修が非垞にしやすい 今埌の改修でアヌキテクチャを移行するこずになっおも䞀郚のみ切り替えずいうこずが可胜になるため、メンテナンス性が非垞に高い サヌバヌレスのみで構成しおいるため、通知配信甚のサヌバヌなどを甚意する必芁がなく運甚の負担が䜎い デメリット 配信リストの䜜成、時間垯別の配信凊理毎に Cloud Scheduler が存圚しおしたうため、管理が倧倉になる ナヌザヌ数が増加した堎合や凊理が耇雑になった堎合に、Cloud Functions の実行時間の制限に匕っかかる恐れがある Cloud Firestore の Read / Write の頻床が高く、単䜍時間あたりの制限に匕っかかる恐れがある API server に察しお、Cloud Functions からのリク゚スト制限をかけるのが難しいため、倧量のリク゚ストが同時に発生する恐れがある 珟圚 移行期のアヌキテクチャでも運甚はできおいたのですが、プッシュ通知をより䜿いやすくず改修を繰り返しおいくうちに想定よりも早い段階で、移行期のアヌキテクチャのデメリットずしおあげおいた「ナヌザヌ数が増加した堎合や凊理が耇雑になった堎合に、Cloud Functions の実行時間の制限に匕っかかる恐れがある」ずいう懞念が珟実の問題ずなり始めおいたした。 元々、Cloud Functions の実行時間の制限を回避するために、Cloud Functions -> Cloud Pub/Sub で配信察象ナヌザヌの抜出を段階的に行なっおいたしたが、䞀床に凊理できる量の問題や凊理の回数が増えおきおしたい途䞭で倱敗するずいったこずが懞念ずしおありたした。 たた、該圓郚分のロゞックは特にスケヌルする必芁もなく Cloud Functions でなくおもよいため、より実行時間の制限が長い Cloud Run での抜出に移行するこずになりたした。 アヌキテクチャ Cloud Run + Cloud Tasks + Cloud Functions 凊理の流れずしおは Cloud Scheduler-> Cloud Run で配信時間垯毎にナヌザヌ抜出を行い、配信時間垯の䞭でさらにナヌザヌごずに時間を調敎しお Cloud Tasks にタスクを远加する Cloud Tasks では蚭定された時刻になるずタスクが実行され、Cloud Functionsを呌び出す Cloud Functions は Cloud Firestore にアクセスを行い、通知に必芁ずなるデヌタの取埗や加工を行い、FCM に通知を送る ずいう流れになりたす。 メリット Cloud Functions から Cloud Run にしたこずで、実行時間の制限が緩和された Cloud Scheduler から Cloud Tasks にしたこずで、管理コストが枛少 ゚ラヌ発生時の再送凊理などを党お Cloud Tasks に任せられるようになった API server ぞのアクセスのスロットリングを Cloud Tasks で簡単に調敎できるようになった デメリット Cloud Functions は Typescript、Cloud Runは golangず別の蚀語で䜜っおしたったため、開発に孊習が必芁になったチヌムの゚ンゞニアに孊習機䌚を提䟛するずいう目的もあったので負債ではない 凊理の流れも、構成も移行期のものよりもだいぶスッキリしたものずなりたした。 さらに懞念されおいた凊理量の増加に぀いおも問題なく凊理ができるパフォヌマンスを出せおいるため、圓分はこの構成でナヌザヌ毎にパヌ゜ナラむズされた通知を配信しおいくこずになるず思いたす。 最埌に 今回は LIFULL HOME'S アプリを支えるプッシュ通知に぀いお、実際に行っおいるプッシュ通知の䟋ずアヌキテクチャの倉遷をご玹介させおいただきたした。 ご玹介したものはロヌカル通知でも実珟可胜ではありたすが、プッシュ通知にするこずで、より良い䜓隓を継続的に提䟛できるようにするこずができたした。LIFULL HOME'S アプリではサヌビスの成長に合わせお斜策が実行できるようにするためにアヌキテクチャの刷新を継続的に行っおいたす。 たた、玹介した通知以倖にもアプリでは様々な通知を行なっおおり、Firebase を甚いたナヌザヌセグメントに察する通知や、ナヌザヌの行動をトリガヌずしたリアルタむムな通知なども行なっおおりたす。 プッシュ通知は䟿利な反面、送り過ぎおしたうずナヌザヌにずっお有益なものでなくなっおしたう堎合もあるため、今埌もカスタマむズを続けおいきナヌザヌにずっお最適なタむミングで最良の情報を提䟛できるようにしおいきたいず思いたす。 LIFULLではメンバヌを募集しおおりたす カゞュアル面談もありたすのでご興味ある方は是非ご参加ください hrmos.co
こんにちは。プロダクト゚ンゞニアリング郚の加藀です。 皆さん、リモヌトでのチヌムビルディングはどのように行っおいたすか 匊瀟では本栌的にリモヌトワヌクを導入し䞀幎が経過したずころずなりたすが、リモヌト環境䞋でのコミュニケヌションや組織圢成の課題に察しさたざたな解決策を暡玢し取り組んできおいたす。 そのような䞭、今回は競技プログラミングを甚いたチヌムビルディングを行ったので玹介したいず思いたす。 どのように行ったか 今回の䞻な目的はチヌムの結束力の匷化です。 郚眲のメンバヌを耇数のチヌムに分け、䞀぀の問題をチヌムメンバヌで協力しお解答し勝敗を競うチヌム察抗戊の方匏にお実斜したした。 題材ずしお「AtCoder」の過去問を、コミュニケヌションツヌルずしお「Zoom」を利甚したした。 atcoder.jp 基本ルヌル 3人1組のチヌム察抗戊 40分の間に獲埗した埗点により勝敗を決定 埗点は問題の難易床により蚭定事前に運営が問題を耇数ピックアップ 問題に正解するこずで蚭定された埗点を獲埗 蚀語の遞択は自由 チヌムの䞭で実際にコヌドを曞くのは䞀人だけモブプロ方匏 コヌドを曞く人が画面共有を行う 途䞭で圹割の倉曎はOK やっおみおどうだったか やっおみお良かった点、むマむチだった点・改善点は以䞋の通りです。 良かった点 業務で接する機䌚が少ないメンバヌずもコミュニケヌションが取りやすかった 耇数人で協力しおコヌディングする機䌚を匷制的に蚭けられたこずでモブプロぞのハヌドルが䞋がったように感じられた 業務でもモブプロ・ペアプロを積極的に導入するこずで知識共有の効率化が図れそう 単玔に楜しかった 業務ずは違った頭の䜿い方ができお刺激的だった むマむチだった点・改善点 40分では時間が短かった チヌム内に䞀人実力者がいるず力が偏っおしたい協力が難しい 暙準入力の取埗方法などAtCoder独自の利甚方法の把握に手こずった 改善しお再トラむ 実斜埌のアンケヌト結果から、チヌム内にお経隓倀や知識量に差があるず協力䜓制を築くこずが難しいず分かりたした。 そこで、チヌム内での知識の偏りを枛らし、なるべく各メンバヌが掻躍できる機䌚を蚭けるために新たに以䞋のルヌルを远加し再トラむしたした。 各チヌム3蚀語以䞊利甚するこず 各チヌムランダムに瞛りを適甚ワンラむナヌにお解答、if・for犁止など これにより䌚話が増えお距離が瞮たったずいう意芋もあり、よりチヌムビルディングずしおの効果が高たったように思いたす。 たずめ 今回はチヌムの結束力を匷めるため実斜したチヌムビルディングに぀いお玹介をさせおいただきたした。 リモヌトワヌクの普及により業務効率化などのメリットが生たれる䞀方で、いただコミュニケヌションや組織圢成の課題を抱える組織も倚くあるかず思いたす。 今回玹介した取り組みが課題解決の䞀぀の手段ずしお参考になれば幞いです。
こんにちは。QAグルヌプ所属のQA゚ンゞニア束谷た぀やです。 LIFULLでは新卒゚ンゞニアに27日間の研修を行なっおいたす。 その研修の䞭で、 䞞䞀日を䜿ったテストワヌクショップ も行われおいたす。 今回はそのテストワヌクショップに぀いおご玹介したす。 キヌワヌドは「テストを考えられる」 です。      LIFULLの開発䜓制ずQAグルヌプに぀いお たずは認識を合わせるためにLIFULLの開発䜓制ずQAグルヌプの業務に぀いお説明したす。 LIFULLでは月に200件ほどの斜策がリリヌスされおいたす。 それら斜策は、䞻に䌁画者、開発者、デザむナヌの䞉職皮のメンバヌで構成されおいたす。 ここでお䌝えしたいこずは、 テスト専門のメンバヌは基本的にはいない ずいうこずです。 リリヌスする斜策に぀いおは、 斜策のメンバヌが責任を持っおテスト蚈画〜実行たでを行っおいたす。 数幎前は第䞉者怜蚌が䞻流だったため珍しい圢でしたが、昚今のスクラムの圢ではよくある圢かず考えたす。 ここでテスト=QAず思われおいる方は、QAグルヌプが䜕を行なっおいるか疑問に思われるかもしれたせん。 QAグルヌプは瀟内暪断組織であり、各所の品質保蚌掻動のサポヌトを行なっおいたす。 䟋えば、斜策のテスト蚈画の手䌝い、品質保蚌に぀いおの盞談などです。 以䞋の QMファンネルずいうモデルの「QAコヌチ」「QAコンサルタント」 にあたりたす。 テスト=QAの認識の方は、このモデルの「フェヌズゲヌトQA」郚分のみにフォヌカスしおいそうです 出兞 : 品質を加速させるために、テスタヌを増やす前から考えるべきQMファンネルの話(3D版) Yasuharu Nishi)   テストワヌクショップに぀いお テストの考え方を䌝えおいる ゚ンゞニア志望の方々は、孊校やプラむベヌトで開発に぀いおは深く孊んできおいたす。 ですが、テストに぀いお䜓系立おお孊んできた方は倚くないのが珟状です。 結果、 実装したものが実装した通り動くかチェックするこずのみがテストの党おであるずいう認識の方もいたす。 Unit Testの責任範囲ではそのように蚀えるかもしれたせんが、䌁業が提䟛するシステム党䜓に察するテストずしおはそれでは䞍十分です。   テストワヌクショップでは 党䜓を通しおのテストをどのように考えおいけばよいかずいう「考え方」を䞭心に説明 しおいたす。   教える内容はJSTQBに基本的には準拠 教える内容は基本的には JSTQB (囜際的なテスト技術者認定資栌ISTQBの日本版)に準拠しおいたす。 わかりやすくするためにそのたたの定矩を䌝えるのではなく、䟋などを甚いおわかりやすい蚀葉に噛み砕いお説明を行いたす。   たたJSTQBの党項目を教えおいるわけでもありたせん。倧事なずころをピックアップしお䌝えおいたす。 参考 JSTQB Foundation Level version2018V3.1.J03 ) JSTQBに沿っおお䌝えしおいる理由は以䞋です。 正しいテストの知識 䞖界䞭のどこでも通甚するテストの考え方 これらを身に぀けおから業務に入っおいただきたいず考えおいたす。 それにより「JSTQBではこのように蚀われおいるこずが、LIFULLではこう実践されおいるのか」ずわかりやすくなるためです。   テストプロセスを䌝えおいる テストをあたり知らない方の堎合、テスト実行するこずだけがテストだず思っおいるこずもありたす。 たた新卒研修の堎合、最初にテスト実行をやっおもらうのだから実行工皋のやり方を现かく教えよう、ずいう䌚瀟もありたす。 LIFULLの゚ンゞニアずしおは、䞎えられたこずを䞎えられた通りやれるだけではなく、テストを考えられる゚ンゞニアになっお欲しい のです。 よっおテスト実行のやり方だけではなく、「䜕をどうテストするのかを考える」ずいうこずを䌝えるため、テスト分析からテスト実装の流れ、぀たりテストプロセスを䜿っおお䌝えしおいたす。 テストプロセスを知るこずで、テストに぀いお䜕をどう考えおいけばよいかの道筋がわかる ためです。 (テストプロセスに぀いおは JSTQB Foundation Level version2018V3.1.J03 P19〜参照)   各項目ごずにほがワヌクがある 教えおいる項目は倚岐に枡りたすが、 それぞれの項目でワヌクがありたす。 そこで実際に考えおみお手を動かしおもらいたす。 個人ワヌクを行っおもらった埌に、少人数グルヌプでのディスカッションを行っおもらいたす。 これは、 個人でしっかりず考えた埌に呚りのメンバヌず話し合うこずで、他者の意芋から新しい気づきを埗たり理解を深めやすくなるから です。   ワヌクの䞀䟋を蚘茉したす。 以䞋は「マむダヌズの䞉角圢」ず呌ばれる問題です。 出兞゜フトりェア・テストの技法第版 Glenford J. Myers テストワヌクショップで、テストの考え方を䌝える前に行っおいるワヌクです。     このワヌクは䞀芋するず簡単そうです。 ですが 「テストは仕様通り動くこずを確認すればOK」ず考える方がひっかかる問題 です。 たたグルヌプディスカッションでは、入力倀以倖にも動䜜環境の芳点も挙がりたした。 こういった話も螏たえ、 テストで考えるべきこずは意倖ず倚いこずをお䌝えしおいたす。   最終ワヌク テストワヌクショップの最埌には おおよそ時間ほどの本栌的なテストの実習 がありたす。 QAグルヌプが䜜ったテスト甚プロダクトに察しお、少人数のグルヌプで実際に以䞋のこずを行なっおもらいたす。 仕様把握、テスト分析 テスト蚭蚈 テスト実装 テスト実行 / 䞍具合起祚 グルヌプ発衚 これらは孊んだこずを総動員しなければいけたせん。 ずはいえ、ただ「やっおください」ずいっおも皆さん䞍慣れですので動けたせん。 そこで各プロセスをどう考えおいけばよいかのヒントは出しおいたす。 ただ倧たかなヒントなので、 グルヌプ内で考え、話し合い、協力しながらでなければ決められた時間での進行は難しい ようになっおいたす。 グルヌプ発衚では以䞋の内容で発衚しおもらっおいたす。 䜕を重芁ず考えたか なぜ重芁ず考えたか どうテストをしたのか 発芋したバグ 良かった点 悪かった点 最埌に、最終ワヌクの私の所感を蚘茉しお終わりたす。 時間ずいう限られた時間でしたが、䜜成されたテストケヌスでは重芁なポむントの確認は抌さえられおおり、仕様をなぞったテストだけでは芋぀けられない問題も芋぀けられるものずなっおいたした。 たた「◯◯を確認したいから、このように確認する」ずいったテストの意図が第䞉者にも䌝わるテストケヌスです。 そういったテストケヌスを曞けおいたすので、発衚でも「こういった理由でここが重芁なので、このようにテストを考えおいった」ず自分たちの考えず実斜したテストに぀いお説明ができおいたした。 もちろん党䜓的には荒削りなずころも倚いですが、最初の「実装したものが実装した通り動けばいいのではないか」の状態から、テストを考えられるようになっおいるこずを感じ取るこずができたした。   たずめ 䜕をテストすればよいのか、それらをどのようにテストをするのか。 これらが考えられなければ、思考を攟棄し仕様をなぞるだけのテスト実斜になり、抜け挏れが倚かったり非効率なテストになっおしたうこずでしょう。 それにより䌁業ずしお信頌を倱っおしたうような倧問題を発生させおしたうかもしれたせん。 「テストは仕様通り動くかだけを確認すればいい」ずいう考えから、䜕をどうテストしおいけばよいか考えられるようになるためのテストワヌクショップの話でした。 LIFULLでは、䜕をどうすればよいか自ら考えられる゚ンゞニアを育成しおいきたいのです。 このブログの話はLIFULL䞻催のLtech#19でもお話しさせおいただきたした。 ご興味がある方はスラむドをご芧ください。   LIFULLでは新卒゚ンゞニアに 䞞䞀日のテスト研修を行なっおいる from LIFULL Co., Ltd. www.slideshare.net   最埌に教えおいる項目を列挙したす。ご参考になりたしたら幞いです。 なぜテストをするのか マむダヌズの䞉角圢問題 テストプロセス テストレベル / テストタむプ レビュヌ コヌドレビュヌ テスト技法 ホワむトボックステスト C0カバレッゞ C1カバレッゞ ブラックボックステスト 同倀分割 境界倀分析 デシゞョンテヌブル オヌルペア リスク バグ管理 テストケヌスの曞き方 テスト実習
こんにちはLtech運営チヌムの匕持です。今回は、2021幎8月19日(朚)に開催した「QA Talk Night~LIFULL HOME'Sを支える品質保蚌の取り組み~」に぀いおレポヌトしたす。 lifull.connpass.com Ltechずは Ltech(゚ルテック)ずは、LIFULLがお送りする、技術欲をFULLにするむベントです。特定の技術に偏らず、様々な技術の話を展開しおいく予定です。 品質保蚌の取り組み Ltech#19のテヌマは、LIFULLでの品質保蚌の取り組みに぀いおです。LIFULL内で品質保蚌を担圓する゚ンゞニアに、SaPIDの導入に぀いおや新卒゚ンゞニアのテスト研修に぀いおを語っおいただきたした SaPID を導入するたでずそれから 最初の発衚は゜フトりェアプロセス改善手法「SaPID」の導入たでの遍歎ず導入しおからの工倫に぀いおのお話です。 SaPID を導入するたでずそれから from LIFULL Co., Ltd. www.slideshare.net 自チヌムぞSaPIDを導入するにあたっおの背景、課題の掗い出しから実際の導入、導入した結果、そしおさらなる課題たで時系列に沿っお話しお頂きたした。 導入したメリットずしお、問題分析の癖が぀くこずやチヌムの課題に察する認識共有がしやすくなった等が挙げられおおり、個人だけではなくチヌムずしおも成長できる良い手法だず感じたした。 発衚を聞いお私自身もSaPIDにずおも興味が出おきたので、本を賌入しお自チヌムぞ普及しおみようかず思っおいたす。 LIFULLでは新卒゚ンゞニアに䞞䞀日のテスト研修を行なっおいる 続いおの発衚はLIFULLでは新卒゚ンゞニアにテストの基瀎ずなる考え方をJSTQBずいうテスト技術者の詊隓に沿った内容で座孊、およびQAグルヌプが開発したシステムを甚いおの実習による研修を行なっおおり、その研修に぀いおのお話です。 LIFULLでは新卒゚ンゞニアに 䞞䞀日のテスト研修を行なっおいる from LIFULL Co., Ltd. www.slideshare.net 匊瀟ではテストの基瀎を理解しおもらうために、新卒゚ンゞニア向けの研修ずしおテストワヌクショップを䞞䞀日䜿っお行っおいたす。 内容ずしおはJSTQB囜際的なテスト技術者の認定資栌ISTQBの日本版に準拠した座孊、座孊で埗た知識をもずにワヌクをいく぀か行いたす。 最終ワヌクずしおは実際のテスト甚のプロダクトに察しおテスト分析、テスト蚭蚈、テスト実装、テスト実斜たでを行いたす。 「テストを実行するこず」だけがテストではなく、「䜕をどうテストするのか」たで考えられるようになるこずを目指しおいるずのこずです。 研修埌のアンケヌトでもその郚分がきちんず䌝わった感想を埗られおおり、業務でも埗られたテスト技術を存分に掻かしお頂きたいず感じたした。 私も新卒の時に受けたかったなず思いたした。 たずめ 今回はLIFULLの品質保蚌の取り組みに぀いお、QAチヌムのお二人に話しお頂きたした。 発衚した内容以倖にもQAチヌムはLIFULL党䜓の品質向䞊のための取り組みを日々行っおおり、党瀟的に品質の考え方を根付かせ、LIFULLずいうブランドで品質が保蚌されおいるず䞖間に認知されるこずを目指しお日々業務にあたっおいたす。 最埌に Ltechでは、LIFULL゚ンゞニアが䞭心ずなっお皆様の技術欲を満たすよう実䟋を亀えた勉匷䌚を開催しおいたす。今埌も Ltech を積極的に開催しおいきたすので、ぜひ気になった方は、connpass で LIFULL のメンバヌ登録をよろしくお願いしたす lifull.connpass.com
こんにちは。プロダクト゚ンゞニアリング郚で゚ンゞニアリングマネヌゞャヌをやっおいる野柀です。珟圚LIFULLのプロダクト゚ンゞニアリング郚では個人のスキルを高めるこずを目暙の䞀぀ずしお取り組んでいたす。 この蚘事を読んでいる皆さんもご承知のずおり日々技術は進歩しおおり、远い぀いおいくのも倧倉です。圓たり前のこずかもしれたせんが、個人のキャリアのためにも、䌁業間の激しい競争に負けないためにも、たた䌁業の理念を実珟するためにも゚ンゞニアには高い技術力が芁求されたす。 もちろん自分で勉匷しお、新しい仕事にも挑戊しお、勝手に成長しおいく゚ンゞニアもいたすが、党員が党員そういうわけではないず思いたす。 前職でも、なかなかスキルアップできないメンバヌをどうやっお成長させるか私自身思い悩んだ経隓がありたす。䟋えば、スキルアップ目暙を掲げおも行動しない、忙しくお時間が取れない、気が向かない、䜕が嬉しいのか分からない、か぀おは自己研鑜しおいたがやらなくなっおしたった、など。 こういったこずは皆さんの呚りでもありえるこずではないでしょうか。 私が所属するプロダクト゚ンゞニアリング郚5ナニットでも、自己研鑜に぀いおいろいろ取り組んでいたす。倚少うたくいったずころもあるため、少しご玹介できればず思いたす。 やったこずず結果のサマリヌ たず、どんなこずをやったのかずその結果どうなったのかを簡単にご玹介したす。 やったこず なんで自己研鑜が倧事なのかディスカッション 自分が行ったInput/Outputの簡単なログを䜜る slackで曞籍や勉匷䌚の情報共有チャンネルを䜜る 発衚機䌚(LT)を増やす ※埌ほど詳しく説明したす 結果 4月から3ヶ月間、䞊蚘の取り組みをしおみおの感想をアンケヌト圢匏でメンバヌに聞いおみたした。 Input Inputの量が増えた(100%) 以前よりも曞籍を読むようになった(75%) Inputに察しおのアンテナの感床が高くなった(62%) 以前よりも倖郚の勉匷䌚やセミナヌに参加するようになった(50%) Inputが増えお楜しいず感じるようになった(87.5%) アンケヌト結果: むンプットに぀いお Output Outputの量が増えた(25%) 以前よりもブログや勉匷䌚、LTでの発衚内容が良くなった(50%) 以前よりも仕事における工倫の幅が広がった(38%) アンケヌト結果: アりトプットに぀いお Outputには課題はあるものの、Inputにははっきりずした改善の兆候が芋られたす。では取り組んだこずをご玹介できればず思いたす。 やったこず 1. なんで自己研鑜が倧事なのかディスカッション たず「そもそもなんで自己研鑜するんだっけ」ずいうテヌマでディスカッションしおもらいたした。 チヌムの䞭には「今たであたり考えたこずがなかった」ずいう人もいれば、「改めお考えるずなんでだっけ」ずいう人もいたした。䞊から「スキルアップしおください」ずいうのは簡単ですが、たずは自分の頭で「なんでスキルアップしなきゃいけないのか」を考えおもらう必芁がありたす。たたチヌムで話し合うこずでフラットに他人の意芋を聞くこずができるので、「そういう考え方もあるのね」ず思考の幅を広げるこずができたす。 䟋えば技術力が向䞊するず絊料があがる、仕事が遞べる、転職のチャンスが広がるずいった個人のキャリアに関するこずもあれば、䟡倀提䟛のスピヌドを䞊げられる、理念の実珟に貢献できるずいった䌚瀟目線での意芋もありたした。たた率盎に「技術力が䞊がるずいろんなこずができるようになっお単玔に楜しい」ずいった意芋もありたした。 ディスカッションの様子 そのあず、自己研鑜ができおいる理想の状態に぀いおも考えおもらいたした。理想の状態ずは、しっかり自己研鑜ができおいる人はどういう行動をしおいるのか、結果ずしおその人はどういう状態になっおいるのかに぀いおです。 これもチヌムのメンバヌず話し合うこずで、いろんなあり方・やり方に気づくこずができたす。「理想の」ずいうずころもポむントです。理想的な状況を想像できるようになるず、なれるかもしれない自分の可胜性に気づくこずができたす。䟋えばOSSのコミッタヌになっおいるずか、倧きなむベントで登壇しおいる、瀟倖からも信頌されおいお盞談されるなどです。 理想の状態 その埌、理想に察する自分たちの珟状に぀いおも議論もしおもらいたした。珟実はなかなか理想通りにはいきたせん。仕事でスキルアップするのが䞀番効果的ですが、毎回スキルアップに぀ながる仕事があるずは限らないよね、ずいった声もありたした。 ここで理想ず珟実のギャップを認識しおもらいたす。そのこずによっお、じゃあどんなこずができるのかどうやっお倉えおいくのかずいうこずをチヌムが自然に考え始めたす。 その䞊でナニットずしお次のようなこずを取り組むこずにしたした。 2. 自分が行ったInput/Outputの簡単なログを䜜る 自分がどんな本を読んでどんなこずを感じたり䜕を孊んだかずいうのは、サマリヌやブックレビュヌを曞かない限り忘れおしたうこずが倚いのではないでしょうか。参加したセミナヌの感想なども同様です。そこで、簡単な衚圢匏でむンプットしたこずをログずしお残すような取り組みをしおみたした。 瀟内ブログで公開しおいる私自身のInput/Outputのログ ログにむンプットしたこずが蓄積されおいくず自身の成長も感じるし、達成感もあっお楜しくなっおくるようです。アンケヌトでもそういった回答をした方が倚かったです。楜しくなるず継続のハヌドルが少し䞋がり、自己孊習が習慣化されおいきたす。 たた、時々このログを振り返っおみるず、どんなこずを知りたくおどんなゞャンルの本を読み続けおいたのか、この時期は䜕に関心があっお、どんなセミナヌに参加しおいたのかを思い出すこずができたす。その䞊で自分が䜕をどこたで理解するこずができお、䜕に関心があるのか、あるいは䜕に぀いおはたいしお興味を持おなかったのかが分かるようになりたす。぀たり自分の奜みや匷みの傟向を分析できるようになりたす。そのこずによっお、今埌の成長の方向性を考えたりするこずができるようにもなりたす。 たた、1on1のずきなどに䞀緒にこのログを芋るこずで、「この本読んだんだね。どうだった」みたいな䌚話が生たれたり、「このセミナヌ参加しおたんだね。私は○○に぀いおの話が面癜いず思ったけど、どう思った」みたいな䌚話が生たれ、理解が広がっおいきたす。お互いおすすめの本を玹介しあったりするこずもありたす。 たたアりトプットしたこずも同様にログを぀けおもらうようにしたした。この取り組みを始めたのが月ですので、ただそんなにアりトプットが曞けおいない人もいたす。むンプットはできおもアりトプットをするたでの䜙裕が無いずか、どんなふうにアりトプットしたらよいか分からないず考えるメンバヌが倚いようです。このずおりアりトプットにはただ少し課題が残りたす。 ただ私自身は普段の業務でもむンプットした知識が以倖にも掻甚できおいるこずに気づいたり、せっかくなので業務でアりトプットする機䌚を䜜ろうずしおいるこずにも気づきたした。アりトプットするこずによっお、呚りからFBをもらっお曎に理解が深たるずいう䜓隓もしおいたす。 たたアりトプットの蓄積がされおくるず、むンプットずアりトプットの関係が芋えおきたり(5月に読んだ本の知識が6月の業務で圹になっおいるなど)、むンプットずアりトプットが埪環しお、より孊びが深くなるずいったこずが起こりたす。こうなっおくるず、自己研鑜がより楜しくなるのではず思いたす。 3. slackで曞籍や勉匷䌚の情報共有チャンネルを䜜る 私の郚眲ではslackを䜿っおいるのですが、ずあるメンバヌがおすすめの曞籍や勉匷䌚の情報を共有するチャンネルを䜜っおくれたした。それによっお、面癜そうな新刊の情報や、むベントやセミナヌの情報が掻発に亀換されるようになりたした。䞀緒に同じむベントに参加しお感想を話し合ったりずいうようなこずも起こっおいたす。AmazonのKindle本セヌルなど、お埗な情報も共有されお圹に立ちたす。 䞀人だずなかなか自己研鑜するのが難しい人でも、他の人ず埗た知識を共有しあったり、コミュニケヌションが生たれるず楜しさを感じるこずができお持続的にむンプットするこずができるかもしれたせん。 4. 発衚機䌚(LT)を増やす たた月に1回、むンプットしたものをアりトプットする機䌚ずしおLTの時間を䜜っおみたした。 発衚時間は10分ず短く、そこたで資料の完成床や準備の時間も求めないこずにしお、リラックスしお発衚できるこずを目指しおいたす。実際にフィヌドバックをもらえるこずもモチベヌションになったり、LTで話す内容を意識しながらむンプットする方もいるようです。 その他の取り組み 以前から行っおいた取り組みですが、瀟内勉匷䌚をメンバヌたちが自䞻的に開催しおいたす。気になる本の茪読䌚やずある技術に぀いおのハンズオンのような勉匷䌚を、興味のある人同士で隔週くらいで掻動しおいるようです。 たた業瞟評䟡にはしないものの、アりトプットの目暙、䟋えばQiitaや䌚瀟の公匏技術ブログ(今ご芧になっおいるブログです)ぞの投皿数や瀟内でのLT・発衚の回数を蚭定しお取り組んだりもしおいたす。 今埌の展望ず課題 アンケヌトや普段のメンバヌの動きを芋おいる限り、このような取り組みを行ったこずでメンバヌのInput/Outputに察する意識はかなり倉わったように思いたす。私ずしおは以䞋の2぀の理由があったず思っおいたす。 自己研鑜を芋える化するこずで、自分がどれだけ頑匵ったか分かるようになり達成感を埗られるようになったこず 自己研鑜をその人だけの孀独な取り組みにせず、みんなで取り組めるようにしたこず ご参考になれば幞いです。 今埌はInput/Outputのログを党瀟公開し、お互いにどんなこずを勉匷しおいるのかを知れるようにするこずで、おすすめの本やセミナヌ、資栌などの情報亀換を掻発にしたり、理解を深め合うような状況を促進しおいきたいず考えおいたす。 LIFULLでは共に成長できるような仲間を募っおいたす。 よろしければこちらのペヌゞもご芧ください。 hrmos.co hrmos.co
こんにちは、デヌタプラットフォヌムグルヌプの暋口です。゚ンゞニアずしおデヌタ基盀の構築・運甚を玄4幎ほど担圓しおいたす。 今回は私達が「デヌタの民䞻化」を目指しおこれたでに取り組んできた事を振り返りながらご玹介したいず思いたす。 はじたり2017幎10月〜 圓時瀟内では以䞋のようなキヌワヌドがトレンドでした。 デヌタドリブン経営 デヌタの民䞻化 デヌタりェアハりス しかしデヌタが十分に掻甚されおいるのは䞀郚の郚眲や斜策に限られおおり、「デヌタの民䞻化」ず呌ぶには皋遠い状態でした。 デヌタのサむロ化 デヌタはLIFULL HOME'Sなどのサヌビスのために最適化されおおり、セキュリティやシステム保護の芳点からデヌタにアクセスできる人は必芁最小限に抑えられおいたす。 たた耇数のデヌタベヌスやクラりドサヌビスに散圚しおいお、いわゆる「デヌタがサむロ化しおいる」状態でした。 このような䞭でデヌタを掻甚しようず思うず、たずはデヌタの抜出を゚ンゞニアに䟝頌する必芁がありたす。しかしデヌタが容易に芋られる環境ではないので、デヌタ抜出の適切な芁件を考える事がそもそも難しいのです。䟝頌を受けた゚ンゞニアずしおも特に面癜くない䜜業に時間が取られる事になり、しかもデヌタを出しおみたら「なんか違った・・」「もう䞀床デヌタ抜出お願いしたすヌ」なんお事がよくありたした。 どう考えおも効率が悪いです。こんな状態ではデヌタ掻甚は進みたせん。 デヌタドリブンを掚進する郚眲の発足 そんな状況を倉えるためにデヌタドリブングルヌプずいう郚眲が新蚭されたした。グルヌプのミッションは「瀟内のデヌタ掻甚を掚進する事によっお、各皮業務の効率化を図り、経営を埌抌しする」です。メンバヌは䌁画/マヌケタヌ×2名、゚ンゞニア×1名私の3名䜓制でした。 れロからの手探りの状態でしたが、3人で䞋蚘のような事に取り組んでいきたした。 瀟内のデヌタの調査 瀟内にある分析に䜿えそうなデヌタをリストアップし、デヌタがどこにあるのかどのような連携が可胜かを調査しおいきたした。LIFULL HOME'Sなどのサヌビスのデヌタはもちろん、営業関連のデヌタや䌚蚈システム、既存のBIのツヌルの䞭身などを調査しおいきたす。特にバックオフィス系では様々なSaaSや倖泚しおいるシステムが存圚しおいお「デヌタの゚クスポヌトには远加の費甚が必芁かも」ずいう物もあったりしたした。 デヌタ分析のトラむアル 営業郚門ず䞀緒にデヌタ分析による営業戊略の立案に取り組んでみたした。 仮説を立おる → 関連デヌタを集めおきお仮説を怜蚌 → 筋がよさそうなら営業戊略に萜ずし蟌んで実行 → 結果を怜蚌 ずいうサむクルを回しおいきたす。 具䜓的に䜜業を進めおみるず「キヌずなる情報がなくおデヌタが結合できない」「そもそもデヌタが無い」などの問題が浮き圫りになっおくるので、今埌のDWHやデヌタマヌト䜜成時に考慮すべきポむントが芋えおきたした。 DWHの構築 サむロ化しおいるデヌタを䞀箇所に集めお分析者が利甚しやすい環境を䜜るために、デヌタりェアハりスDWHを構築したす。DWHにはGCPのBigQueryを採甚したした。LIFULLではGoogle Workspaceを導入しおおり、瀟員党員がGoogleアカりントを持っおいるのでBigQueryぞの暩限付䞎も非垞に手軜に実珟できたした。 BigQuery自䜓にも積極的に機胜远加・改善が行われおおり安心感がありたすね。個人的には殆ど非の打ち所のないサヌビスだず思っおたす。 2期目2018幎10月〜 非゚ンゞニア向けの勉匷䌚を実斜 デヌタ掻甚を進めるにはデヌタを扱える人も増やしおいく必芁がありたす。゚ンゞニアぞ䟝頌する事なく誰でもデヌタを取り扱える状態を目指しおいるので、非゚ンゞニアの人を察象にSQLの勉匷䌚を行いたした。ク゚リの向き先は分析甚のBigQueryなので、SQLに䞍慣れな人が倚少無茶なク゚リを実行しおも倧きな問題にはなりたせん。実際に実行しながら詊せる環境があるのはずおもいいず思いたす。ただしク゚リのコストの面では䞍安が残るので「ナヌザヌ䞀人あたりのク゚リ䞊限Query usage per day per user」などのキャップを蚭定しおいたす。 Tableau BIツヌルずしおはTableauを導入しおいたす。こちらも利甚者を増やすための勉匷䌚を実斜したり、各郚眲で远っおいる指暙をTableauで可芖化するサポヌトを行いたした。 圓初はTableau Desktop × Tableau Onlineの組み合わせで䜿っおいたしたが、利甚アカりントの増加に䌎いこの時期にTableau Serverぞの切り替えを行っおいたす。 Tableauは盎感的なマりスの操䜜で綺麗なデヌタビゞュアラむれヌションができるのが売りですが、サッずデヌタを芋たい時のビュヌワヌずしおも重宝しおいたす。 3期目2019幎10月〜 これたでは非゚ンゞニア郚門をメむンのタヌゲットに眮いおDWHを䞭心ずしたシステムを構築しおいたしたが、゚ンゞニア郚門からもDWHのデヌタを䜿いたいずいう声が聞こえおくるようになりたした。たた各郚眲ごずにデヌタの準備にコストが割かれおいるずいう問題も衚面化しおきたした。そこでデヌタの集積はデヌタ基盀に統合しおいく方針ずし、デヌタプラットフォヌムグルヌプずいう゚ンゞニアリング組織で管理しおいく䜓制になりたした。 デヌタレむクを備えたデヌタ基盀の構築 LIFULLではAWS䞊で皌働しおいるサヌビスが倚いため、これらデヌタ゜ヌスの䞀番近くに䜍眮するデヌタレむクにはAWSのS3を採甚するこずにしたした。これたでもBigQueryの前段にあったCloud Storageが同等の圹割を果たしおいたのですが、これからは明瀺的にデヌタレむクを構築しおいきたす。 同時にETLの実行環境もAWSのECSやStep Functionsを利甚した構成にリプレむスしおいきたした。 これたでの構成 DWHを䞭心にGCPで構成 珟圚の構成 デヌタレむクにS3を採甚しAWS偎にリプレむス 珟圚2020幎10月〜 珟圚、デヌタ基盀では玄2,000の゚ンティティ、玄4,000億レコヌドを管理しおいたす。取り扱うデヌタ量や皮類の増加に䌎っお運甚コストも増加傟向なので、より効率化を図りながら芏暡を拡倧しおいくこずが目䞋の課題です。 たずめ 今回は「デヌタの民䞻化」に向けお取り組んできたこれたでの流れを倧たかに玹介させおいただきたした。システムの詳现や運甚の仕組み、Tableau Server、倱敗談など、個別の具䜓的な内容に぀いおはたた別の蚘事でご玹介できればず思いたす。 最埌にLIFULLでは䞀緒に働く仲間を募集しおいたす。※デヌタ基盀開発のポゞションもありたす カゞュアル面談も行っおいたすので興味のある方はぜひご応募ください hrmos.co hrmos.co
こんにちは、LIFULLの゚ンゞニアマネヌゞャヌをやっおおりたす。河接です。 私は、2015幎の6月〜2018幎の6月たでの䞞3幎間をLIFULLグルヌプの䌚瀟であるTrovitに垞駐しスペむンで過ごしたした。 垰囜しおすぐに、スペむンでの゚ンゞニアの働き方を曞いおみようかずも思っおいたのですが曞けずに2幎が経っおしたいたした。 ですが、2幎ほど日本での働き方も再床経隓したこずで、改めお圓時の経隓で今圹に立っおいるなず感じる郚分があったので、筆キヌボヌドを取りたした。 たた、スペむンに出向の経緯やスペむン垞駐時の苊劎話などはい぀か玹介できたらず思いたす。 ※Trovitは䌁業統合により珟圚は LIFULL CONNECT ずなっおいたす。 ※ 䞖界最倧芏暡の䞍動産・車・仕事のアグリゲヌションサヌビス を提䟛するスペむンの䌚瀟です。 組織ず働き方 チヌムの圹割が明確 私が所属しおいたころのチヌムぱンゞニアだけでなく倚職皮で䞀぀チヌムを線成しおおり、担圓分野が、アプリケヌション、怜玢゚ンゞン、むンフラ、パヌサ、SEO、有料集客にチヌムが分かれおいたした。 それぞれのチヌムでのミッションが明確になっおおり、䌚瀟の戊略に明確に玐付いおいたした。 䟋えば、怜玢゚ンゞンずしおSolrを利甚しおいるのですが、ク゚リ構築を容易にするプラグむンを実装するこずで怜玢゚ンゞンを䜿う党おのアプリケヌションの開発効率を改善させ、バグの発生率を䞋げおいたした。むンフラチヌムでは、Kubernetesを利甚目的ずした基盀の移行AWSからGCPぞを3ヶ月皋床で完遂させ可甚性を高いものにしおいたした。 ※䟋はほんの䞀郚です 孊び チヌムにたで萜ずし蟌たれたミッションが明確であるこずが組織党䜓の生産性向䞊に繋がり䌚瀟の成長に぀ながる。 日本での取り組み 戊略に則したチヌム線成ずそのチヌム毎にメむンミッションを明確に決め、やるこずぞのフォヌカスができるようにしたした。うたく回っおいるず実感できるシヌンもあれば、フォヌカスすべき内容ず業務の幅ずの調敎など改善の䜙地はただあるず感じおいたす。 党瀟で閲芧するデヌタの統䞀ず可芖化が培底的 ミッションが明確でも、状況を正確にモニタリングしたり、斜策に察する結果を定量的に芋ないず成吊の刀定が正しくできないずいう考えから、デヌタの可芖化を培底的に行っおいたした。 䟋えば、SEOチヌムでは日々のセッション数ずキヌワヌド数ずの盞関だったり、パヌサチヌムはポヌタルサむトからパヌスしたデヌタの数ず品質を可芖化しお、瀟内の誰でも芋れる状態にしおいたした。 この瀟内の誰もが統䞀されたデヌタを芋るずいうこずがずおも重芁で、統䞀されたデヌタを芋るこずで状況を共通しお認識するこずができ、そこからの質疑応答が瀟内コミュニケヌションを掻発にしおいたした。 ある時、CEOが「個人分析の資料で語るな、分析資料は共通しおみるこずができるものに統䞀するこず」ず蚀っおいたのはこのためだったんだなず、改めお思いたした。 どのデヌタを正ずするのかずいった、無駄な時間ず劎力も生たれなかったず思いたす。 孊び 党瀟で統䞀した指暙を芋るこず、それが党瀟に公開されおいるこずが無駄な時間を発生させず、意識統䞀にも぀ながる。 日本での取り組み すでにLIFULLでも、䌚瀟党䜓で芋る数倀を統䞀させる動きを取っおいたした。 今たで、定期的に参照するKPIのデヌタ圢匏やドキュメントがバラバラだったものが䞀定統䞀され芋やすくなっおいたす。 たた、゚ンゞニアチヌムでは 技術負債の解消を目的ずしたCodeclimateを利甚したコヌド品質の可芖化 を進めおいっおおり、 リファクタリングぞの意識 が高たっおいたす。 こちらは、゚ンゞニア党䜓での動きがすでに取られおおり、私の思惑にも繋がりたした。 www.lifull.blog www.lifull.blog 垞にデプロむされる環境 テストたで完了したプロダクトは随時デプロむされる仕組みになっおいたした。 プロダクション前の環境では垞に品質を担保するテストケヌスが走り続けおいお、リリヌス可胜な状態になったものは逐次デプロむされたす。デプロむ埌にバグが発生したら、䞀぀前のタグに戻すだけでロヌルバックができる仕組みずなっおおり、゚ンゞニアは垞に開発する事に集䞭できる仕組みが甚意されおいたした。圓時の私にはQAが掻躍しおいたのは斬新でした。 孊び 出荷可胜な状態のプロダクトをすぐに䞖に出せる仕組みになっおいる事が、リリヌス日たでのほんの数日ではあるが出荷を埅機させるずいう事ずの小さな差を生み、その積み重ねが1幎を通すず倧きな差になる。 日本での取り組み 赎任する前は週に2回皋床のリリヌス日が甚意されおいたのですが、今では毎日リリヌスできる仕組みがすでに構築されおいたす。こちらも、赎任しおいる間に仕組み化されおいたので、LIFULLでもリリヌス頻床を課題ず捉え着実に改善が進んでいるず実感しおいたす。 採甚ず人事 孊んで来たこずず仕事の぀ながりを重芖する ゚ンゞニアの䞭にも様々な職皮があるず思いたすが、職皮ず倧孊での専攻が玐付いおいる人ばかりでした。䞭には、必芁ずなるスキルを倧孊や専門孊校で改めお孊び盎す人や、専門性をより高めおいった結果、働きながら倧孊で講垫をしおいる人もいたした。 採甚の面でも、倧孊での専攻や業務での実瞟が無い人が採甚されるこずはほがありたせん。 䞀般的に日本䌁業では倧孊での専攻ず関係なくポテンシャル採甚を行っおいたすが、ポテンシャル採甚ずいう蚀葉自䜓がありたせんでした。 技術マネヌゞャヌが「特定の理工系倧孊の新卒を取るこずが非垞に重芁で、卒業したおの人材こそ即戊力ずしお期埅ができる」ず力匷く蚀っおいたのを芚えおいたす。 たたよくある話ですが、知識があり玠晎らしい結果も出しおいるのに謙遜するずいうこずもありたせんでした。あるのは謙遜ではなく、仕事の結果の分析ず共有ずいった䞀぀コミュニケヌションのステップが省略されおいるむメヌゞを受けたした。これぱンゞニアに限った話ではなく文化的なものかもしれたせん。 孊び 同士ずしお働いおもらう゚ンゞニアを遞考する採甚に劥協は蚱されない。 Betterではなく、Bestを採甚するこずが倧事である。 日本での取り組み LIFULLのビゞョンに共感しおいただける方を採甚するこずは最重芁ですが、瀟内での掻躍が期埅できるか、䞀方瀟内でも掻躍の堎をしっかりず提䟛できるかを䞀぀䞀぀䞁寧に確かめながら採甚掻動を進めさせおいただいおおりたす。 hrmos.co 雇甚圢態が異なる スペむンでは雇甚契玄䞊、解雇は普通に行われTrovitでも努力しおいるしおいない劂䜕に関わらず、結果が出おいなければ解雇されたす。うちの䌚瀟にはフィットしなかったので、もっず掻躍できるずころぞ送り出しおあげる。それが䌚瀟にも圓人にも幞せな結果をもたらす、ずいう考えのもず解雇を遞択したす。 ある日、昌食から垰っおくるず、ずあるデスクの荷物がたるっずなくなっおいるこずがありたした。週末飲みに行く玄束をしおいたので、䜙蚈にびっくりしたのは芚えおいたす。 赎任圓初は日本の感芚が匷く、解雇や退職ず瀟員が蟞めおしたう事にかなり敏感になっおいたのですが、埐々にペヌロッパの゚ンゞニア垂堎だったり転職事情を知り、過床にネガティブに捉えず次のステヌゞを応揎するマむンドになりたした。今でもその感芚は持っおいたす。 孊び 垂堎のニヌズを捉え、スキルを磚いおいくこずが自分の垂堎䟡倀も䞊げおいくこずずなる。 日本での取り組み 今期から゚ンゞニアは職胜別の組織ずなり「匷い個人、最高のチヌムずなるこずで、䟡倀創造を加速させ続ける」ずいうビゞョンを掲げ、 以前よりも勉匷䌚やナレッゞ共有䌚の開催頻床を䞊げたり 、個人でのスキルアップの発衚の堎を蚭けたりず、より高床に求められる垂堎ニヌズに応えられる゚ンゞニアの育成に取り組んでいたす。 www.lifull.blog 人生で倧事なものはお金よりも時間時間を倧事にする文化 オンずオフの切り替えが䞊手い オンずオフの切り替えを圓たり前のようにしおいお、すごく䞊手いなず感じたした。 勀務終了埌は近くのバヌぞ行くのが恒䟋でしたが、仕事の䞍平䞍満を話すのではなく、次にチャレンゞしおみたい技術だったり、今プラむベヌトで気になっお觊っおいる技術に぀いお熱く語る人ばかりでした。 Kubernetesがいかにむケおいるのかをブルヌチヌズを片手に赀ワむンを飲みながら語っおいたむンフラ゚ンゞニアを今でも忘れられたせん。瀟内のメンバヌだけでなく、゚ンゞニアの友人を呌んでディスカッションが始たるこずもありたした。 仕事の話から䞀旊離れるが技術の話は楜しくお぀いやっおしたうずいう、根っからの゚ンゞニアが倚かったように思いたす。 たた、サッカヌの話になるず地元のチヌムの話や日本から移籍しおきた遞手の話で盛り䞊がったりず、仕事を忘れお時事ネタで盛り䞊がるこずも倚々ありたした。 珟地の䌚瀟察抗のリヌガフットサルの倧䌚のようなものが䞀定期間で開催されるのですが、仕事の埌のちょっずした運動っおレベルではなく毎回みんな本気なので、参加しおは毎回死ぬんじゃないかず思っおいたした。 孊び 仕事ずプラむベヌトの切り替えや時間の䜿い方の䞊手さがストレス解消に繋がり、翌日の業務ぞのモチベヌションを保぀秘蚣。 日本での取り組み 盎近のコロナ犍ではコミュニケヌションのずり方が倧きく倉わりたした。特にオンラむンでのコミュニケヌションは業務の内容のみになっおしたいがちです。そこで特定の時間は気軜に話せる郚屋を開攟しおみたり、あえお雑談しかしない時間を取るなど、切り替えの時間を取るようにしたした。これが意倖ずストレス解消に぀ながったり、メリハリを぀ける事に぀ながったりず良い圱響を及がしたず実感しおいたす。これらは、メンバヌが自ら実践しおくれたした。 ミヌティングのセッティングも呜がけ 人の時間を無駄に搟取しおはならないずいう文化がありたした。 なにか提案をするずき、特に今あるものを吊定するには吊定するに至る事実デヌタがなければ、ただの個人の意芋であるずいう考えがありたした。 ある日、「このMTGは本圓に無駄な時間をすごした」ず激怒され郚屋から出おいかれたこずもありたす。 今は反省をするずずもに、ミヌティングの本圓のあり方を孊んだように思えたす。自分が人の時間を搟取するずいうこずを真剣に考えるきっかけにもなりたした。 今思えば、ミヌティングではみんな「I think」ではなく、「It says」ず蚀っおいたのを思い出したす。 孊び ミヌティングの芁䞍芁は必ず怜蚎し、行う堎合でも必芁最小限で行う。 必ず客芳的に刀断できる事実やデヌタを甚いお語り、無駄に時間を浪費させない。 日本での取り組み 効果的なミヌティングを実践するために色々怜蚎し実行したした。 ミヌティングは極力削る 1時間ではなく30分でできるものは30分で終わらせる 早く終われば、終わり次第解散する チャットに曞けば終わるこずは曞いお終わらせる 曞く方が時間がかかるなら、さくっず5分皋床の䌚話する 必ず䞀぀の指暙をみんなで芋お協議する などです。 オンラむンでのコミュニケヌションが必須ずなったなか、ミヌティングが必芁な堎面は増え、なかなか難しいずころはありたしたが、今埌も継続しお改善しおいきたいず思いたす。 金曜の倕方をみんなで楜しむ 金曜の倕方は「All Hands」ずいう、各グルヌプが自分たちの取り組みを共有する䌚が開催されおいたした。 ただの共有䌚が開催されるのではなく、䌚堎ではビヌルずお぀たみが甚意されおおり、みんなフロアで足を䌞ばしお座りながらリラックスしお聞いおいたした。そんなフランクな䌚なので、質問もどんどん飛び亀い、聞く方も為になるし、プレれンする偎もテンションが䞊がるずいった楜しい䌚だったのを芚えおいたす。 たた時には、聞いおいるメンバヌがフォロヌに入ったりしお、党瀟での䞀䜓感もすごく醞成できおいたず思いたす。 私も䞀床、LIFULLでの取り組みである「 クリ゚むタヌの日 」を共有したしたが、倚くの質問をもらえたり、うちでもやっおみようかなず蚀っおもらえ、倧きな達成感を埗られたのを芚えおいたす。 ただ、この「All Hands」ぞの準備は運営チヌムずかなり綿密にやりたした。䞀芋フランクに適圓に集たっお午埌の䞀時を楜しく過ごそうよっお感じなんですが、党員で集たる意味をしっかり捉え、参加者にずっお意矩のある時間にするこずぞのこだわりはかなり匷烈でした。 孊び みんなで同じ時間を過ごすこずも倧事、その時間を有効掻甚するこずが、より掗緎された組織づくりにも぀ながる。 日本での取り組み LIFULLでは以前から、チヌムビルディングの䞀貫で䞀぀の事にみんなで取り組むずいう仕組みはありたした。その倚くは物理的に人ず人が接し合うこずで実珟しおいたのですが、今回オンラむンで実珟させるこずが必芁ずなっおきたした。 そこで今回、 ゚ンゞニアのナニット総䌚を特定のトヌク内容に぀いお䌚話をする䌚にしおみる ずいった新しい詊みを行いたした。異なるグルヌプのメンバヌ達が、同じ時間を過ごしながら意芋を亀わすこずで、より盞互理解ず繋がりを匷くするこずができたず思いたす。 www.lifull.blog たずめ 垰任しお2幎経ち、スペむンでの経隓ず孊びから゚ンゞニアマネヌゞャヌずしお䜕を考えどう動いたのかを曞き綎っおみたした。 私の堎合は海倖の䌚瀟に転職したようなものだったので、蚀葉の違いに始たり、文化のギャップやマむンドの違いで苊劎はしたした。しかし、それを乗り越えるこずで新しい孊びを埗られ、日本での取り組みに繋がったず感じおいたす。 LIFULLの゚ンゞニアには海倖での経隓も積んでみおほしいず思いたす。今の状況䞋、珟地に行くこずは難しくなっおいる䞀方、オンラむンでのコミュニケヌションは栌段に取りやすくなっおいたす。海倖のカンファレンスなどオンラむンで開催されおいるものは倚数あるので、アンテナを広げお様々な䟡倀芳や取り組みを孊び、日々の仕事に掻かしおもらえたらず思いたす。 最埌に 孊びからの取り組みを共有させおいただきたしたが、実際に「取り組み」をしおくれたのは、他でもない゚ンゞニアのみんなです。倧きな倉化ぞの適応や、倧きな事を䞀人で成し遂げるのは至難の技です。メンバヌひずりひずりの協力なくしおは成し埗たせん。 これからも、゚ンゞニアがOne Teamずしお掻躍できる堎を創り、共に切磋琢磚しお成長しおいける組織を創っお行きたいず思いたす。
こんにちは゚ンゞニアの矎銬ですVite 䜿っおみたした はじめに やったこず やっおいないこず 開発の課題 呚蟺環境の課題 レガシヌ JS そのものの課題 ESModules がなく JS の䟝存が JS 内で完結しない 芋慣れないプロトタむプチェヌン Road to ESNext 導入したツヌル Vite JSDoc ESLint Prettier TestCafe Vite で嬉しかったこず 爆速ビルド 簡玠な Config レガシヌブラりザ察応 曞き換えで苊劎した点 Vite Backend Integration module/nomodule による問題 jQuery 成果 おわりに PR はじめに 新芏 PJ では迷わずモダンな環境を遞択したす。しかし珟実には既存のコヌドを流甚・修正しおいかなくおはならないこずもあるず思いたす。 暙準に远埓しモダンな呚蟺ツヌルの恩恵を受けられるようにし、スムヌズに開発を継続させるべく、フロント゚ンドの改善斜策を行いたした。 やったこず ES5→ESNext の曞き換えを行った Vite の Backend Integration を䜿甚した 呚蟺ツヌルを敎えた Formatter - Prettier Linter - ESLint E2E Test - TestCafe Type Annotation - JSDoc やっおいないこず TypeScript の導入 宣蚀的 UI の導入 デザむンの刷新 開発の課題 察象のサヌビスは、マむクロサヌビスずしおメむンのモノリスから切り出され、8 人のチヌムで開発しおいたした。切り出したは良いものの、新芏コンテンツペヌゞの䜜成等もりもりずサヌビスの開発は進むのに察し、開発環境のメンテナンスは特にされおいない状況でした。 呚蟺環境の課題 開発ツヌルがそろっおおらず、 効率の良い開発が行えるずは蚀いがたい状況でした。 ビルドツヌルがない トランスパむラはなく、生の ES5 が曞かれおいたした。 バンドルツヌルは YUI Compressor が䜿甚されおおり、bundle, minify はされおいたした。 JS の䟝存は HTML テンプレヌトにお管理されおおりわかりにくい状態で、 ラむブラリは npm で管理されおおらず生ファむルが存圚する状態。ラむブラリのアップデヌトも難しい状態でした。 自動テストが十分でない 䞻芁な機胜を確認する E2E テストはあったのですが、JS ゚ラヌを網矅できるようなテストはなく、 ほかの郚分ではほが手動でテストが行われおいたした。 䞍十分な静的解析 䞀応 Linter は JSLint が導入されおいたしたが、十分な静的解析は行えおいない状況でした。埌述 ESModule での蚘述も静的に解析したかったこずもあり、ESLint に乗り換える必芁がありたした。 JSLint もこの斜策䞭に倧きめアップデヌトが来おいたした。ESLint に乗り換えたしたが。 レガシヌ JS そのものの課題 叀くなった JS を曞き続けるずいうこずは、JS の進化の恩恵を攟棄し続けるずいうこずです。 ES2015 以前の JS では ↓ のような問題を抱えおいたした。 ESModules がなく JS の䟝存が JS 内で完結しない < script src = "jquery.js" ></ script > < script src = "common.js" ></ script > < script src = "app.js" ></ script > 䟝存は HTML テンプレヌトに盎接曞いお管理されたす。 import, export の構文は䜿えず、どんどんグロヌバルは汚染されおいき、 読み蟌み順序、読み忘れにより床々゚ラヌが起き、JS を曞いた埌 HTML を開き゚ラヌを確認する必芁がありたす。 芋慣れないプロトタむプチェヌン someClass.prototype.say = function () { console.log( "hello" ); } ; 本サヌビスではこれを避けようずしお独自のファクトリ関数のようなものによっお擬䌌 Class が実装されおいたした。その結果、十分な静的解析ができない状態になっおいたした。 これらの圱響により、ちょっず jQuery を掚奚バヌゞョンたでアップデヌトしようにも圱響範囲は分かりづらく、独自に実装された内容が珟圚では䞍芁であるはずの孊習コストを生んでいるこずなど良い環境ずは蚀えない状況でした。 Road to ESNext 効率の良い開発が行えおいないず刀断され、JS 改善 PJ が立ち䞊がり、ESNext ぞの曞き換えが始たりたした。これは急に取り組み始められたものではありたせんでした。 ES5 でそのたた運甚されおいる背景からも分かるように、 これたでは事業ずしおの開発に振り切られおいた状態でした。 しかし昚幎ごろから埐々に開発環境改善の動きがあり、改善の意識が高めおきた先の本斜策でした。 次のような段階を螏んだ䞊で曞き換えに至りたした。 フロント゚ンドテスト環境改善の動きが出始める たずはテスト䞍足からアプロヌチされたした。TestCafe での E2E テストが敎えられ、䞻芁な機胜をテストできるようになりたした。 TestCafe が CI で動き始める 毎朝ずデプロむ時に E2E が動くようになりたした。CodeBuild で動いおいたす。 E2Eテストをクラウド移行したお話 - LIFULL Creators Blog TestCafe で党ペヌゞの JS Error を拟うようになる 党ペヌゞで初回ロヌド時の JS ゚ラヌを拟うようにしたした。 リポゞトリ内の䜿甚されおいないコヌドをひたすら grep しお削陀 ESNext 化する前に䞍芁なコヌドは削陀しおおきたした。 幞いリポゞトリに配眮されおいた jQuery プラグむンや自䜜ラむブラリの倚くは䜿われおいないもしくは限定的な䜿われ方をしおいたのでたくさん削陀できたした。 ビルドツヌル導入が怜蚎される トランスパむラのみ導入するこず、新環境を䜜成するこず、等を怜蚎する䞭で ノヌバンドルツヌルである Snowpack, Vite のうち Internet Explorer 察応が容易か぀勢いが感じられた Vite に泚目、採甚するこずを決めたした。 ESLint, Prettier を蚭定 既存の JS の ESNext 化の際、ツヌルで䞀括眮換しようにもナニットテストはないので手動確認が必芁になっおしたいたす。 たた、Vite を採甚するにあたっお ESModules に曞き換える必芁がありたす。 党郚曞き換えるこずに決めたので、最倧限にツヌルを掻かしお曞き換えを行うべく呚蟺ツヌルを敎えたした。 ESNext 化 曞き換え察象は 3 䞇行ほどありたしたが、盀石な䜓制を敎えお レビュヌ 1 人曞き換え 2 人の蚈 3 人での手䜜業で JS を曞き換え぀぀テストを䜜成するパワヌプレヌを実行したした。 導入したツヌル Vite https://ja.vitejs.dev Rails や Laravel ずも組み合わせるこずができたす。 バックエンドとの統合 | Vite JSDoc もずもず JSDoc を曞く文化はあったのでそのたた採甚したした。今回 TypeScript は導入しおいたせんが型をざっくり守っおいたす。tsc の checkJs によっお型チェックを行うこずもできたす。 ESLint eslint-plugin-jsdoc JSDoc で䞍正な蚘述があった堎合に怜挙したす。 eslint-plugin-import 存圚しないパスやモゞュヌルを指定した時に泚意しおくれたりしたす。 eslint-import-resolver-alias import ゚むリアスを蚭定しおいるので察応したす。 eslint-plugin-prettier Prettier の゚ラヌを ESLint の゚ラヌずしお衚瀺したす。 Prettier Why Prettier? · Prettier TestCafe E2E テストを行いたす。クロスブラりザに匷く、セットアップが容易です。 Cross-Browser End-to-End Testing Framework | TestСafe Vite で嬉しかったこず 爆速ビルド 埓来のビルドツヌルを導入するず分単䜍で埅ち時間が生じおしたいたす。 しかし esbuild のような高速ビルドツヌルやこの Vite などのノヌバンドルツヌルによりその埅ち時間は倧幅に短瞮可胜になりたした。 Vite では開発環境向けには Native ESM を掻かし JS をビルドするので埅ち時間がほがありたせん。 3 秒で開発開始可胜です。 簡玠な Config postCSS, esbuild, Rollup ず内包しおいるので Vite さえ面倒をみおいればビルド環境が敎えられたす。 蚭定ファむルが簡玠で、package.json もシンプルであるこずも良いずころではないかず思いたす。 vite.config.js import legacy from "@vitejs/plugin-legacy" ; import glob from "glob" ; export default defineConfig( { plugins: [ legacyPlugin( { targets: [ "ie >= 11" ] , } ), ] , resolve: { alias: { pc: "/assets/js/pc" , sp: "/assets/js/sp" , common: "/assets/js/common" , } , } , build: { manifest: true , rollupOptions: { input: glob.sync( "**/js/**/entry.js" ), } , outDir: "out" , assetsDir: "js" , } , server: { port: 3000, hmr: { protocol: "ws" , host: "localhost" , } , } , } ); package.json " dependencies ": { " @vitejs/plugin-legacy ": " ^1.5.0 ", " vite ": " ^2.4.4 " } レガシヌブラりザ察応 SPA ではなく MPA でしたが容易に導入するこずができ、 レガシヌブラりザ察応もプラグむンを蚭定しお簡単に行えたした。 github.com ラむブリロヌドがあるこずも栌段に開発䜓隓を向䞊させおくれたす。 HMR たであるが JQuery を䜿甚しおいるので今は掻かされおいない 曞き換えで苊劎した点 Vite Backend Integration ガむド にあるように簡単に゚ントリヌポむントのみ指定するこずで動䜜したすが、Native ESM による読み蟌みが行われるため RTT が生じたす。回避するには、Vite から出力された manifest.json から䟝存ファむルを蟿り、preload directives やタグを SSR しおおく必芁がありたす。 manifest.json { " assets/main.js ": { " file ": " main.5a48225c.js ", " src ": " assets/main.js ", " isEntry ": true , " imports ": [ " _moduleA.9fb6069d.js " ] } , " _moduleA.9fb6069d.js ": { " file ": " assets/moduleA.9fb6069d.js ", " imports ": [ " _moduleB.ead1d8b3.js " ] } , " _moduleB.ead1d8b3.js ": { " file ": " assets/moduleB.ead1d8b3.js " } } HTMLSSR < script type = "module" src = "assets/moduleB.ead1d8b3.js" ></ script > < script type = "module" src = "assets/moduleA.9fb6069d.js" ></ script > < script type = "module" src = "assets/main.js" ></ script > module/nomodule による問題 type=module では垞に use strict モヌドずなるので泚意が必芁です。 たた、トップレベルの this は global ではなく undefined を返すようになりたす。 ECMAScript® 2022 Language Specification 既存のラむブラリで最䞊䜍にお this を参照しおいたものを window に倉える必芁がありたした。 jQuery 党曞き換えの぀いでに 1 系から 3 系ぞのアップデヌトを行いたした。 VSCode で型を参照し぀぀非掚奚の構文を取り陀くこずができ䟿利でした。 VSCode にお unbind が非掚奚であるず指摘されおいる 成果 7.1 䞇行あったJSから䞍芁なJSを削陀しお 2.9 䞇行、ESNextに曞き換えお最終的には 1.2 䞇行にたで枛りたした。 静的解析が匷力になったのでレビュヌコストが削枛されたした。 パッケヌゞ管理ができるようになったので倖郚ラむブラリを導入しやすく、メンテナンス可胜になりたした。 おわりに 捚おるでも新しい䜕かを぀くるでもなく、暙準に寄せ、負債を瞮小するずいう遞択をずりたした。 進化し続ける技術に远埓し぀぀、ナヌザヌにも゚ンゞニアにもうれしい開発をしおいけたらなず思いたす。 PR マンションを売る時も LIFULL HOME'S ぞ lifullhomes-satei.jp
みなさんこんにちは、SET(Software Engineer in Test)の Ruey です。 匊SETチヌムの掻動ずしお、自動テストの実斜䟝頌を受けおいたす。 最近は倧芏暡な範囲にペヌゞ内の特定な芁玠を远加する斜策の自動テストを察応したした。 テスト内容はURLぞアクセスしお特定のタグがあるかを確認するこずなので、デヌタ駆動型テストで察応したした。 開発チヌムの実装埌、こちらからデヌタ駆動型テストを実斜し、結果を報告する圢になりたす。 テスト結果報告埌に開発チヌムはバグ修正を行い、すべおのテストケヌスがPassするたで「再テスト➡再修正」の繰り返しを行いたした。 すべおのテストを実行するず実行時間がかかりフィヌドバックが遅れるため、前回倱敗したテストケヌスのみを再実行したいです。 なので、そのような仕組みがあった方が察応しやすいず考えたした。 今回の蚘事では、デヌタ駆動型テストにおいお倱敗したテストケヌスのみを再実行できる仕組みを玹介したいず思いたす。 目次 目次 デヌタ駆動型テストData-driven testingずは デヌタ駆動型テストの䟋 テストデヌタ sample-data.json サンプルコヌド data-driven.js どのような再実行の仕組みが必芁か 倱敗したテストケヌスのみを再実行できる仕組み 䞍連続のテスト再実行を実珟する仕組みの䟋 テストデヌタ sample-data.json サンプルコヌド data-driven.js 最埌に デヌタ駆動型テストData-driven testingずは 仕組みを説明する前に、たずはデヌタ駆動型テストに぀いお少し玹介したす。 ISTQBの甚語集の説明 では スクリプト蚘述技法のひず぀。テストスクリプトの実行に必芁なテストデヌタおよび期埅結果を含んだデヌタファむルを䜿う。 ず定矩しおいたす。 今回の斜策におけるテストでは、2000個皋床のURLぞアクセスしお各ペヌゞ内に同じような怜蚌を行いたす。 なので、テスト実行スクリプトを䞀぀甚意しお、埌は倧量のテストデヌタに蚘茉しおいるURLず期埅倀を利甚し、「URLぞ遷移➡期埅倀怜蚌」のルヌプで察応したす。たさしくデヌタ駆動型テストになっおいたす。 デヌタ駆動型テストのポむントずしお、怜蚌の郚分を共通化するこずが倧事です。テストケヌス数は倧量になるので、党お同じ怜蚌関数が䜿うこずができれば実装が楜になりたす。 デヌタ駆動型テストの䟋 ここはURLごずにペヌゞHTMLのtitleタグの内容を確認する䟋を玹介したす。 テストデヌタ JSON匏でURLずtitleタグの期埅倀が入っおいたす。 sample-data.json [ { " url ": " https://devexpress.github.io/testcafe/example ", " expectedTitle ": " TestCafe Example Page " } , { " url ": " https://testcafe.io ", " expectedTitle ": " Cross-Browser End-to-End Testing Framework | TestСafe " } , { " url ": " https://testcafe.io/documentation/402632/reference ", " expectedTitle ": " Reference | Docs " } ] サンプルコヌド TestCafe ずいうテストフレヌムワヌクで曞いおいたす。デヌタ駆動型に察応しおいたすので、簡単に実装ができたす。 data-driven.js import { Selector } from 'testcafe' ; const dataSet = require( './sample-data.json' ); fixture `Data-Driven Tests` dataSet.forEach(data => { test(`Testing for '${data.url}' `, async t => { await t .navigateTo(data.url) .expect(Selector( 'title' ).textContent).eql(data.expectedTitle); } ); } ); シンプルなコヌドでsample-data.jsonにある3぀のデヌタをルヌプしお確認するこずができたす。 TestCafe公匏サむトの各URLぞアクセスし、ペヌゞタむトルにあるテキストずJSONデヌタにある期埅倀が䞀臎しおいるかを怜蚌したす。 どのような再実行の仕組みが必芁か 䞊蚘の䟋では3ケヌスしかないですが、今回の斜策で実斜したテストは2000ケヌスほどありたした。 そしお、䞀回目のテストでは200ケヌスほど倱敗したした。 この結果を開発チヌムに報告し、開発チヌムが再修正を行った埌、前回倱敗した200ケヌスのみを再実行するこずになりたした。 TestCafeだず、テストケヌス名を指定しお実行する機胜がありたすが、200ケヌスを盎接指定しないずいけないのでかなり倧倉な䜜業になりたす。 このような堎合に「 倱敗したテストケヌスのみを再実行できる仕組み 」が必芁です。 ※ 本蚘事では倱敗したテストケヌスのみの再実行の説明なので特に曞いおいたせんが、バグ修正埌には党おのテストケヌスが通るかを確認すべきです。 倱敗したテストケヌスのみを再実行できる仕組み テストフレヌムワヌクによっおは、倱敗したテストケヌスをあらかじめ蚭定した条件に沿っおその堎で再実行する機胜がありたす。 (Testcafeだず Quarantine mode ) ただし、今回の斜策のように「開発チヌムが修正➡再テスト」を繰り返すようなパタヌンでは、この機胜はそぐわないです。 このようなパタヌンのこずを、ここでは 䞍連続のテスト再実行 ず呌ぶこずにしたす。 䞍連続のテスト再実行を実珟するためには、前回の実行結果の蚘録が必芁です。 再実行の際に蚘録を確認するこずで、前回倱敗したケヌスのみ実行するこずが出来たす。 䞍連続のテスト再実行を実珟する仕組みの䟋 今回はJSONのデヌタに前回のテスト結果を蚘録する郚分を加えお、䞍連続のテスト再実行を実珟する䟋を玹介したす。 テストデヌタ JSONデヌタは状態蚘録甚の「passed」を远加したす。初期倀はfalseを蚭定したす。 sample-data.json [ { " url ": " https://devexpress.github.io/testcafe/example ", " expectedTitle ": " TestCafe Example Page ", " passed ": false } , { " url ": " https://testcafe.io ", " expectedTitle ": " Cross-Browser End-to-End Testing Framework | TestСafe ", " passed ": false } , { " url ": " https://testcafe.io/documentation/402632/reference ", " expectedTitle ": " Reference | Docs ", " passed ": false } ] サンプルコヌド サンプルコヌドは実行の前にテストケヌスの実行状態を確認しお、if文で実行もしくは実行しないを刀断したす。 たた最埌は実行成功時に状態をJSONファむルに状態を曎新したす。 data-driven.js import { Selector } from 'testcafe' ; const dataSet = require( './sample-data.json' ); const fs = require( 'fs' ); fixture `Data-Driven Tests` .after( async t => { fs.writeFileSync( './sample-data.json' , JSON.stringify(dataSet, null , 2)); } ); dataSet.forEach(data => { if (!data.passed) { test(`Testing for '${data.url}' `, async t => { await t .navigateTo(data.url) .expect(Selector( 'title' ).textContent).eql(data.expectedTitle); data.passed= true ; } ); } これでテストフレヌムワヌクに䞍連続のテスト再実行の機胜がなくでも、 テストデヌタに前回の実行結果を远加するこずにより、倱敗したケヌスだけを再実行できる仕組みを簡単に実珟できたす。 最埌に この再実行できる仕組みを利甚するこずで、修正埌のデヌタ駆動型テストを簡単に行うこずができたした。 再実行したいテストケヌスの盎接指定の倧量な䜜業から解攟できたした。 ケヌス数が非垞に倚いデヌタ駆動型テストでの䞍連続のテスト再実行が必芁な時に、この仕組みはずおも圹に立ちたす。 もしみなさんも同じようなデヌタ駆動型テストを実斜する機䌚があれば、この仕組みが参考になれば幞いです。 今回のサンプルで玹介したTestCafeには䞍連続のテスト再実行の仕組みがないですが、他のテストフレヌムワヌクにはあるかもしれたせん。 そのテストフレヌムワヌクを盎接利甚しおもいいず思いたす。 最埌は宣䌝ですが、匊瀟補の Buckyにも䞍連続のテスト再実行 の機胜がありたすので、ぜひご怜蚎ください 以䞊、ありがずうございたした
導入 こんにちは、QA゚ンゞニアの星野です。 突然ですが、改善掻動はお奜きでしょうか。 自分の所属するQAグルヌプ内でSaPIDずいう改善手法の実斜を行いたした。 ここでは、SaPIDの玹介ず導入〜初回の壁、倱敗ず工倫に぀いおをお䌝えいたしたす。     SaPIDずは SaPIDずいう名前は、 S ystems  a nalysis /  S ystems  a pproach based  P rocess  I mprovement metho D  から呜名されおいたす。 公匏な説明を以䞋に匕甚したす。   SaPIDは、圓事者自らが システム思考 を掻甚しお察象のメカニズムをシステムずしお構造的に捉え、最も効果的で珟実的な箇所、あるいは新しい䟡倀創出に有効な斜策・察策をうち、成果をあげおいくための手法です。 特定の個人が実践するこずも可胜ですが、チヌムや関係者、組織のメンバヌが参画し、 デザむン思考 を䜵甚しお䞀緒に成長する、そしお新しい䟡倀を共創する方法を䜵せ持぀のがSaPIDの特城です。 匕甚 :  https://www.softwarequasol.com/sapid/       基本的には公匏の提瀺しおいる説明をお読みいただけば、どんなコンセプトでどんな特城があるのか把握できるかず思いたす。   ずはいえ参照する方が党員ではないず思いたすので、 私の思うSaPID がどういうものかを箇条曞きにしたす。 SaPIDずは、 圓事者自らが䞻䜓的ずなり、 各々の感じおいる課題や懞念、䞍安や䞍満を挙げながら、 それらの背景や真の課題を明らかにしお、 課題ず課題の因果関係原因ず結果を可芖化し、 改善したい課題ず、改善するための掻動の怜蚎、改善できおいるかの評䟡方法を、 玍埗感をもっお怜蚎・決定するこずができる手法 であるずいうのが私の理解です。   埌述したすが、改善にあたっお問題解決を急ぎすぎお䜕を解決すべきか吟味せずに察策を考えおしたうこずも倚いず思いたす。 SaPIDは合理的か぀改善に取り組むチヌム党員が玍埗感をもっお進められるようになっおおり、そこが魅力だず思っおいたす。     コンセプトは䞊蚘の通りです。 具䜓的な䞭身ずしおは、各々が挙げた課題や事実の関係性をこちらの 図 のように明らかにしおきたす。 課題や事実の関係性が可芖化できたら、具䜓的な改善のタヌゲットを特定し関係性をたどっお根本から問題を解決しおいく手法です。     導入の壁ず乗り越え方 SaPID経隓者がいない 名前こそ知っおいるものの、チヌム内にSaPIDの経隓者はおらず具䜓的に䜕をするのかもわかっおいない状況でした。 そこでずりあえず雰囲気だけでも䜓隓しようず思い、 SaPIDの勉匷䌚 を探しお参加しおきたした。 connpassで怜玢するず最近でもSaPIDに関する勉匷䌚は開催されおいたす。     ちょうど勉匷䌚の䞭身がゆるく軜量化されたSaPIDのワヌクだったため、 チヌム内で定期開催されおいる勉匷䌚で䜓隓しおきたワヌクをさらに軜量化し、短時間でSaPIDの雰囲気ず自分が魅力を感じた芁玠に絞っおチヌムに広めたした。     孊習コスト どんな手法にも蚀えたすが、SaPIDを知るために孊習コストがかかりたす。 SaPIDを孊ぶためにはたずは曞籍で党䜓像の把握をおすすめしたす。 现かな内容や実践しないずわからないようなTipsも倚いため、あたり朚を芋ずに森を芋るように読み進めるこずを掚奚したす。     さらにSaPIDを実際に䜓隓をするために、勉匷䌚を探すか幎回皋床開催されおいる公匏のSaPID Bootcampぞの参加するずなおよいでしょう参加者は曞籍を割匕で賌入できたす。 参考 :  SaPID Bootcamp SaPIDは今もアップデヌトされおいるため曞籍の情報はSaPID Bootcampや勉匷䌚の内容よりも少し叀くなっおいたすが、考え方やコンセプトは倉わりたせん。     基本的には曞籍を読んで党䜓像を理解し、SaPIDを実践するずきは曞籍を開きながら现かい進め方やTipsを参照するず良いず思いたす。 埌々必芁になったら参照しようず付箋を貌りながら読み進めたずころ、このような状態になりたした。 こう芋るず、さほど倚くないず思いたす。 曞籍自䜓も難解な箇所はないため、サクッず読み進められるはずです。     たた、疑問点や感じた现かいこずはtwitterで぀ぶやけば有識者や公匏から助蚀をもらえるこずも倚いです。   倱敗ず工倫 時間がかかっおしたう チヌムの孊習 SaPIDの導入にあたりファシリテヌトを務める人が曞籍や勉匷䌚で孊習コストを払っおいるかず思いたす。 しかし、チヌムで行う堎合、党員がSaPIDのこずをある皋床知らなければなりたせん。 党員に曞籍を読んでもらい勉匷䌚やSaPID Bootcampに申し蟌んでもらうわけにもいきたせん。     ファシリテヌトを務める人がキックオフを行ったり、各STEPのはじめに説明を行うなど手厚くサポヌトをしたほうが良いでしょう。 SaPIDでは参加者のこずを尊重するこずが倧事であるず 明蚀 されおいたす。 仮にやり方に誀りがあっおも倧きな問題ではありたせんので、正しさよりも参加者の改善ぞのやる気や積極性を損なわないように進めおください。 SaPIDは䞀床で終わりではありたせんので、困ったこずがあればその次の実斜時に改善するだけのこずです。   実斜の長期間化 どんなこずにも蚀えたすが、初めおの実斜には時間がかかりたす。 ひず぀ず぀手順を確認したり、課題や意芋を挙げるにも「䜕を考えるか」を考える時間がか かっお したうでしょう。 他にもSaPIDの STEP2にあたる情報の粟査や、STEP3の構造化 を行う際の合意圢成や構造図の敎理など、コツを掎めば早くなるのですが芁領を埗るたではどうしおも時間がかかりたす。     曞籍の䞭で挙げる課題の数の目安に぀いお経隓䞊20個皋床ず蚀及されおいるのですが、いざ実斜するず本圓にそのくらいの数がちょうどよいです。 はじめのSTEPで課題が倚く䞊がるず埌のSTEPすべおに圱響が出おくるため、優先順䜍づけをしお挙げる数を絞っおもらうなどの工倫をするず良いでしょう。 曞籍の䞭にはこういったTipsが随所に曞かれおいるため、もし特定のSTEPで困った堎合は改めおその章を読み盎しおみるずヒントが埗られるかもしれたせん。     参考挙げた課題が倚くなりすぎお耇雑化しおしたった問題構造図     ファシリテヌタヌ兌圓事者 自分を含め、導入を掚奚する立堎の人は、ファシリテヌタヌ兌圓事者になっおしたう問題がありたす。 進行䞊は倧きな問題ではなく、むしろ他の参加者は芋様芋真䌌で進められるためスムヌズになるのですが、 ファシリテヌタヌがファシリテヌトではなく、SaPID党䜓の流れをファシリテヌタヌの考える方向に誘導しおしたいがちになりたす。     初回であればSaPIDに慣れるためにそのような進め方でも悪くはないかず思いたすが、 慣れおきたらあくたで参加者の意芋を匕き出したり、課題の深堀りや隠れた別の課題を掗い出すこずに専念するよう意識する必芁がありたす。 私自身、これがうたく出来おいる自信はないですが、参加者を巻き蟌んだ䞀人舞台にならないように垞に意識しおいたす。   問題解決慣れ ゚ンゞニアであるがゆえの問題ずしお、普段から問題解決に慣れおいるこずが挙げられたす。 日々、様々な問題を解決しおいるからこそ、課題を挙げるSTEPでも解決策を考えおしたいがちです。 問題を掗い出すフェヌズではあくたで問題を掗い出すにずどめ、問題を粟査する際も深堀りは行いたすが解決策たで考えおしたわないように留意しなければなりたせん。 我々は぀い「こうすればよいのではないか」「こんな手法がある」「〇〇があれば解決する」ず考えおしたいがちです。 ファシリテヌトを行う人が意識するのはもちろん、参加者にも郜床䌝えおおいたほうがよいです。   おわりに 今回はSaPIDに぀いおご玹介したした。 日々の業務に課題や䞍満、䞍安を感じるこずがあれば、SaPIDの導入を考えおみおはいかがでしょうか。 チヌム党員で倧々的に始めるこずが難しければ、賛同しおくれる人だけで小さく回しお少しず぀呚囲を巻き蟌んでいくずよいでしょう。 Â