スマヌトキャンプ株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

スマヌトキャンプ株匏䌚瀟

スマヌトキャンプ株匏䌚瀟 の技術ブログ

å…š226ä»¶

AWS SAMずは Slack botをサヌバヌレスアプリケヌションずしお構築する理由 AWS SAMを甚いたSlack botの䜜成 SAM CLI のセットアップ SAM CLIによるプロゞェクトの初期化 Slack App の実装 SAM CLIでのビルド SAM CLIでのデプロむ Slack Appの蚭定 SAMを甚いおSlack botを䜜成したずきに発生する可胜性のある課題 クレデンシャルをセキュアに蚭定する方法がわからない 解決策 bot のレスポンスが䜕回も実行される 解決策 SAM CLIでの埌片付け おわりに こんにちはスマヌトキャンプ株匏䌚瀟の束䞋です。今日はAWS SAMを甚いおSlack botを䜜成する方法ず、発生する可胜性のある課題に぀いお玹介したいず思いたす。 この蚘事は以䞋のZenn蚘事を統合し、再線集したものです。 https://zenn.dev/smartcamp/articles/f222ef915bc826 https://zenn.dev/smartcamp/articles/ead9a00fe79cab AWS SAMずは https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/what-is-sam.html AWS Serverless Application Model(AWS SAM)は、Infrastructure as Code(IaC)を䜿甚しおサヌバヌレスアプリケヌションを構築するためのオヌプン゜ヌスフレヌムワヌクです。AWS SAMの短瞮構文を䜿甚するず、デベロッパヌはデプロむ䞭にむンフラストラクチャに倉換されるAWS CloudFormationリ゜ヌスず特殊なサヌバヌレスリ゜ヌスを宣蚀したす。 Slack botをサヌバヌレスアプリケヌションずしお構築する理由 https://api.slack.com/quickstart Slack botを実装する堎合の流れは基本的には䞋蚘のような圢になりたす。 Slackのプラットフォヌム䞊でAppを䜜成 Appの蚭定に基づいおSlackが送信しおくるリク゚ストに察しお、レスポンスを返すAPIを実装 2.のようなシンプルなAPIを䜜成したい堎合においお、サヌバヌレスアプリケヌションはむンフラをあたり考慮する必芁がないずいう芳点でメリットがありたす。たた、botの利甚頻床があたり高くない堎合、費甚面でもメリットが出おくるでしょう。 AWS SAMを甚いたSlack botの䜜成 それでは早速、AWS SAMを䜿甚しおSlack botを䜜成する手順を芋おいきたしょう。 SAM CLI のセットアップ https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html 䞊蚘公匏ドキュメントを参照しおください。IAM Userなど必芁なセットアップを行い、AWS CLIが実行できる状態であるこずが前提です。 むンストヌル埌は䞋蚘コマンドで、むンストヌルが成功しおいるか、パスが通っおいるかを確認したす。 $ which sam /usr/local/bin/sam $ sam --version SAM CLI, <latest version> SAM CLIによるプロゞェクトの初期化 https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-init.html sam init コマンドを実行するず、SAMで䜜成したいアプリケヌションに぀いお、察話的に蚭定を行なうこずができたす。 $ sam init 1 - AWS Quick Start Templates 1 - Hello World Example Use the most popular runtime and package type? (Python and zip) → y ディレクトリ名 → sample-sam-slack-app 察話匏のむンタヌフェヌスで䞊蚘のように遞択しおいくず、䞋蚘のようなファむルテンプレヌト矀が生成されたす。 $ cd sample-sam-slack-app/ $ tree . ├── README.md ├── __init__.py ├── events │   └── event.json ├── hello_world │   ├── __init__.py │   ├── app.py │   └── requirements.txt ├── samconfig.toml ├── template.yaml └── tests ├── __init__.py ├── integration │   ├── __init__.py │   └── test_api_gateway.py ├── requirements.txt └── unit ├── __init__.py └── test_handler.py 泚目すべきは䞋蚘のファむルです。 samconfig.toml : SAM CLIを実行する際に参照されるSAMの蚭定ファむル template.yaml : SAMのデプロむ時に実行されるCloudFormationのテンプレヌトファむル Slack App の実装 sam init で生成したコヌドにSlack Appずしおの実装を行なっおいきたす。生成されたコヌドに含たれる実装を削陀しおしたいたしょう。 $ rm -rf events/ hello_world/ tests/ 次に src ディレクトリを䜜成し、アプリケヌションのロゞックを曞く app.py を䜜成したす。 $ mkdir src $ touch src/app.py app.pyではBolt for PythonずいうSlackが提䟛しおいるフレヌムワヌクを利甚したす。 https://slack.dev/bolt-python/ja-jp/tutorial/getting-started このようなフレヌムワヌクを利甚するこずで、認蚌を自前で実装する必芁がなくなりたす。 Bolt for Pythonのドキュメントに曞いおあるずおり、ここではvenvを利甚しお仮想環境を䜜成しお䜜業したす。Python環境のセットアップに぀いおは省略したす $ python3 -m venv .venv $ source .venv/bin/activate $ which python3 /Users/${ナヌザヌ名}/sample-sam-application/sample-sam-slack-app/.venv/bin/python3 次に仮想環境内にBolt for Pythonをむンストヌルしたす。 $ pip install slack_bolt なお、SAM CLIではビルド時にrequirements.txtを参照するためあらかじめrequirements.txtも出力しおおきたす。 $ pip freeze > src/requirements.txt 次に src/app.py を線集したす。 import os from slack_bolt import App from slack_bolt.adapter.aws_lambda import SlackRequestHandler app = App( token=os.environ[ "SLACK_BOT_TOKEN" ], signing_secret=os.environ[ "SLACK_SIGNING_SECRET" ], process_before_response= True , ) @ app.event ( "app_mention" ) def say_hello (event, say): user_id = event[ "user" ] say(f "Hi, <@{user_id}>!" ) def lambda_handler (event, context): slack_handler = SlackRequestHandler(app=app) return slack_handler.handle(event, context) botに察しおメンションをするず、メンションをしたナヌザヌに察しお「Hi, @user_id」ず返答メッセヌゞを送信するシンプルなロゞックになっおいたす。環境倉数の蚭定に぀いおは埌述したす。 SAM CLIでのビルド ここたで蚭定した段階で䞀床SAM CLIでのビルドを詊しおみたしょう。 sam init コマンドで生成したディレクトリ構成を倉曎しおいるため、 template.yaml の倉曎が必芁です。 template.yaml を䞋蚘のように修正しおください。 @@ -12,31 +12,31 @@ MemorySize: 128 Resources: - HelloWorldFunction: + SampleSAMSlackAppFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: - CodeUri: hello_world/ + CodeUri: src/ Handler: app.lambda_handler Runtime: python3.9 Architectures: - x86_64 Events: - HelloWorld: + SampleSAMSlackApp: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: - Path: /hello - Method: get + Path: /slack/events + Method: post Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api - HelloWorldApi: - Description: "API Gateway endpoint URL for Prod stage for Hello World function" - Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" - HelloWorldFunction: - Description: "Hello World Lambda Function ARN" - Value: !GetAtt HelloWorldFunction.Arn - HelloWorldFunctionIamRole: - Description: "Implicit IAM Role created for Hello World function" - Value: !GetAtt HelloWorldFunctionRole.Arn + SampleSAMSlackAppApi: + Description: "API Gateway endpoint URL for Prod stage for Sample SAM Slack App function" + Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/slack/events" + SampleSAMSlackAppFunction: + Description: "Sample SAM Slack App Lambda Function ARN" + Value: !GetAtt SampleSAMSlackAppFunction.Arn + SampleSAMSlackAppFunctionIamRole: + Description: "Implicit IAM Role created for Sample SAM Slack App function" + Value: !GetAtt SampleSAMSlackAppFunctionRole.Arn SAM CLIでのデプロむ ここたで倉曎できたら、デプロむを詊しおみたしょう。 $ sam deploy を実行したしょう。CloudFormationのStackのChangeSetが衚瀺されたす。今回は初めお䜜成するこずになるので新芏䜜成のような衚瀺になっおいるず思いたす。 Deploy this changeset? [y/N] ず聞かれるため、 y を入力しおデプロむを開始したす。 Successfully created/updated stack - sample-sam-slack-app in ap-northeast-1 ず衚瀺されればデプロむ成功です。 CloudFormation outputs from deployed stack には template.yaml で蚭定した出力䟋API GatewayのURLなどが出力されおいるず思いたす。 SampleSAMSlackAppApi の倀は、Slack Appの蚭定に必芁であるためメモしおおきたしょう。 ここで詊しに衚瀺されたURLに぀いおCurlでリク゚ストを投げおみたしょう。 $ curl -X POST '${URL}' {"message": "Internal server error"} 環境倉数の蚭定がされおおらず、認蚌も圓然通らないためInternal server errorが返っおきたすが、APIの凊理自䜓が動いおいるこずはわかりたす。 Slack Appの蚭定 ここからSlackプラットフォヌム䞊にSlack Appを䜜成しお蚭定しおいきたす。 https://slack.dev/bolt-python/ja-jp/tutorial/getting-started 䞊蚘のBolt for PythonのドキュメントにSlack Appの䜜成方法が蚘茉されおいるので、Slack Appを䜜成しおください。 その埌、Slack Appの「OAuth & Permissions」を開いおください。 「Scopes」たでスクロヌルし、bot tokenに䞋蚘のようにScopeを远加したす。 Scopeの远加埌には、「Install to Workspace」ボタンからむンストヌルしたしょう。 Bot Tokenが取埗できるようになりたす。 これがLambda関数に蚭定したい SLACK_BOT_TOKEN の倀になりたす。 次に、Basic Informationを開きたしょう。 「App Credentials」の䞭の、「Signing Secret」が SLACK_SIGNING_SECRET の倀になりたす。 template.yaml を線集しお環境倉数ずしお蚭定したしょう。今回は䟿宜䞊、倀を盎接蚘茉したすが、うっかりコミットしないように気を぀けおください。この問題に関しおは埌述したす @@ -20,6 +20,10 @@ Runtime: python3.9 Architectures: - x86_64 + Environment: + Variables: + SLACK_BOT_TOKEN: "${トヌクンの倀}" + SLACK_SIGNING_SECRET: "${シヌクレットの倀}" Events: SampleSAMSlackApp: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api 次にSlackからのむベントを受け取るための蚭定をしたす。 「Event Subscriptions」を開き、Onにしたす。 「Request URL」にデプロむ時に出力されたAPI GatewayのURLを、パス /slack/events たで含めお入力したす。URLを入力した時点で、Slack偎からVerifyのリク゚ストが発行され、うたくいっおいる堎合はVerifiedず衚瀺されたす。 たた、その䞋の「Subscribe to bot events」にも蚭定が必芁です。「Add Bot User Event」ボタンを抌しお app:mention を蚭定しおおきたしょう。 この蚭定を行なうず、画面䞋郚の「Save Changes」が有効になり、蚭定を保存できるようになったず思いたす。 ここたで来ればもうSlack Appは動く状態になっおいたす。任意のSlackチャンネルにSlack Appを远加しお、メンションを飛ばしおみたしょう。 SAMを甚いおSlack botを䜜成したずきに発生する可胜性のある課題 次に、SAMを甚いおSlack botを䜜成したずきに発生する可胜性のある課題に぀いお説明したす。 クレデンシャルをセキュアに蚭定する方法がわからない botのレスポンスが䜕回も実行される クレデンシャルをセキュアに蚭定する方法がわからない 「Slack Appの蚭定」の項目では、 template.yaml に盎接クレデンシャルを蚘茉しおいたした。実際の本番アプリケヌションずしお運甚する堎合、クレデンシャルをコミットするこずはセキュリティ䞊奜たしくありたせん。 解決策 今回は、AWS System ManagerのParameter Storeを利甚する方法を玹介したす。 https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html AWS Systems Manager の䞀機胜である Parameter Store は蚭定デヌタ管理ず機密管理のための安党な階局型ストレヌゞを提䟛したす。パスワヌド、デヌタベヌス文字列、Amazon Machine Image (AMI) ID、ラむセンスコヌドなどのデヌタをパラメヌタ倀ずしお保存するこずができたす。 AWSのコン゜ヌルから手動で倀を入れ、SAMのデプロむ時にCloudFormationの凊理で倀を解決するようにしたす。Parameter Storeを開き、䞀芧の右䞊にあるCreate parameterボタンをクリックしお、パラメヌタを䜜成したす。 次に template.yaml を修正したす。 省略 Environment : Variables : SLACK_BOT_TOKEN : !Sub "{{resolve:ssm:/sample-sam-slack-app/slack-bot-token:1}}" SLACK_SIGNING_SECRET : !Sub "{{resolve:ssm:/sample-sam-slack-app/slack-signing-secret:1}}" 省略 なお、CloudFormationの実行ナヌザヌがParameter Storeにアクセスできる必芁があるため、ロヌルに適切なポリシヌを蚭定しおください。 https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-paramstore-access.html bot のレスポンスが䜕回も実行される 今回蚭定した template.yaml では、Lambdaのタむムアりトを3秒に蚭定しおいたしたが、時間がかかる凊理を行なう堎合があるためいったん30秒に䌞ばしおみたす。 省略 Globals : Function : Timeout : 30 MemorySize : 128 省略 その埌、 app.py を線集したす。時間がかかる凊理を擬䌌的に再珟するために、 time.sleep(10) で10秒間のスリヌプを远加しおみたす。 省略 @ app.event ( "app_mention" ) def say_hello (event, say): time.sleep( 10 ) user_id = event[ "user" ] say(f "Hi, <@{user_id}>!" ) 省略 その埌倉曎をビルド・デプロむしお、Slack Appにメンションを送っおみたす。 するず、䞀床メンションを送っただけにも関わらず、3回もレスポンスが返っおきおしたいたす。 https://api.slack.com/interactivity/handling#acknowledgment_response This must be sent within 3 seconds of receiving the payload. If your app doesn't do that, the Slack user who interacted with the app will see an error message, so ensure your app responds quickly. これはSlack偎の仕様で3秒以内にSlack偎からのリク゚ストにレスポンスを返すこずができないず、゚ラヌになるためです。゚ラヌになった埌は䜕床かリトラむを行なう挙動になっおいるようです。 解決策 3秒以内にレスポンスを返す必芁があるため、以䞋の二段階に凊理を分けるような実装を考えたす。 Slackからのリク゚ストに察しおひずたずすぐにレスポンスを返す 時間がかかる凊理を行なっおから、凊理結果を含むレスポンスを返す Bolt for PythonなどのBoltフレヌムワヌクでは1.を実珟するために、 ack ずいう関数が実珟されおいたす。 省略 @ app.event ( "app_mention" ) def say_hello (event, say, ack): ack() time.sleep( 10 ) user_id = event[ "user" ] say(f "Hi, <@{user_id}>!" ) 省略 ack 関数を甚いた䞊蚘のコヌドは、うたく動䜜しない䟋です。 AWS Lambdaは䞀床レスポンスを返しおしたうず、その埌の凊理が継続するこずがどうやら保蚌されおいないため、 ack() で䞀床リク゚ストに察しおレスポンスを返しおしたうず、その埌の凊理が継続されないこずがあるようです。 そこでBolt for Pythonに実装されおいるLazy Listnerを利甚したす。䞀床レスポンスを返した埌に、凊理を行なうための仕組みです。 https://slack.dev/bolt-python/ja-jp/concepts#lazy-listeners たずは、ラむブラリをむンストヌルしたす。 $ pip install python-lambda その埌、Lambdaに適甚しおいるIAMロヌルの暩限ずしお "lambda:InvokeFunction" ず "lambda:GetFunction" を付䞎しおやる必芁があるず公匏ドキュメントには蚘茉がありたす。これは、Lazy Listnerの実装で、もう䞀床Lambdaそのものを実行し盎す実装になっおいるからだず思われたす。 省略 Resources : SampleSAMSlackAppFunction : Type : AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties : CodeUri : src/ Handler : app.lambda_handler Runtime : python3.9 Architectures : - x86_64 Environment : Variables : SLACK_BOT_TOKEN : !Sub "{{resolve:ssm:/sample-sam-slack-app/slack-bot-token:1}}" SLACK_SIGNING_SECRET : !Sub "{{resolve:ssm:/sample-sam-slack-app/slack-signing-secret:1}}" Role : !GetAtt SampleSAMSlackAppFunctionRole.Arn Events : SampleSAMSlackApp : Type : Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties : Path : /slack/events Method : post SampleSAMSlackAppFunctionRole : Type : AWS::IAM::Role Properties : AssumeRolePolicyDocument : Version : "2012-10-17" Statement : - Effect : Allow Principal : Service : lambda.amazonaws.com Action : sts:AssumeRole Policies : - PolicyName : LambdaBasicExecution PolicyDocument : Version : "2012-10-17" Statement : - Effect : Allow Action : - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource : "*" - PolicyName : LambdaInvokePolicy PolicyDocument : Version : "2012-10-17" Statement : - Effect : Allow Action : - lambda:InvokeFunction - lambda:GetFunction Resource : "*" 省略 このようにしお明瀺的にIAM Roleを新しく定矩し、Lambdaに指定するようにしたす。ログ出力のためにCloudWatch Logs甚の暩限も必芁なため、これも含めお定矩したす。 その埌、䞋蚘のようにコヌドも修正したす。 省略 def say_hello (event, say, ack): time.sleep( 10 ) user_id = event[ "user" ] say(f "Hi, <@{user_id}>!" ) app.event( "app_mention" )(ack= lambda ack: ack(), lazy=[say_hello]) 省略 lazyの匕数ずしお、埌から実行したい凊理の関数を配列で枡しおやりたす。 ただし、Lambdaの実行シチュ゚ヌションによっおは、 そもそものack()を3秒以内に返せない堎合もありたす。 このようなずきは、本質的ではありたせんが、䞋蚘のようにSlackが送っおくるリトラむリク゚ストを無芖するずいう方法もありたす。 省略 def ignore_retry_request (request, ack, next ): if "x-slack-retry-num" in request.headers: return ack() next () app.use(ignore_retry_request) 省略 app.use() を利甚するこずでミドルりェア的にすべおのリク゚ストに察しお凊理を通すこずができたす。 SAM CLIでの埌片付け $ sam delete 䞊蚘のコマンドを実行するこずで、SAM CLIによっお䜜成されたCloudFormationのスタックが削陀されたす。 Slackプラットフォヌム䞊のSlack Appは手動で削陀しおください。 おわりに 以䞊、AWS SAMを甚いおSlack botを䜜成する方法ず、発生する可胜性のある課題に぀いお玹介したした。AWS SAMを䜿甚しおSlack botを䜜成するこずで、サヌバヌレスアプリケヌションの利点を掻かし぀぀、比范的簡単にbotを実装できたす。しかし、クレデンシャル管理や非同期凊理の扱いなど、いく぀かの課題にも盎面する可胜性がありたす。これらの課題に察しおはAWS Systems Manager Parameter Storeの掻甚やBolt for PythonのLazy Listenerの䜿甚など、適切な解決策を実装するこずで察凊できたす。 本蚘事が、AWS SAMを甚いたSlack bot開発の参考になれば幞いです。
初めに ゚ンゞニアを目指すに至ったきっかけ 高校時代 倧孊時代 「未経隓者」就掻時代 「経隓者」就掻時代 コヌディングテスト察策 開発経隓に぀いお スマヌトキャンプずの出䌚い たずめ 初めに はじめたしお2024幎4月に新卒゚ンゞニアずしおゞョむンしたcruiseです スマヌトキャンプではBOXIL SaaSの開発に携わっおいたす。 新卒゚ンゞニアですが、倧孊の専攻は土朚工孊なので、いわば「異業皮新卒゚ンゞニア」なのかなず思っおいたす。 今回は入瀟゚ントリずいうこずで、異業皮から゚ンゞニアを目指したきっかけず、就掻の経緯をお䌝えできればず思いたす。 ゚ンゞニアを目指すに至ったきっかけ 高校時代ず倧孊時代の2぀に分けおご玹介しようず思いたす。 高校時代 将来の職業など考えたこずもなく、軜音楜郚でギタヌを匟いおいお郚掻ばっかりの高校時代でしたが、 テックに関する思い出がふた぀ありたす。 ひず぀はGAS (Google Apps Script)です。 郚掻の入郚受付フォヌムをGoogle Formで䜜ったものの、圓時のFormはメヌル自動返信が䜿いづらかったので、 GASを䜿っお自動返信ず䞀括送信のスクリプトを曞きたした。(もちろんほがコピペですが!!) 今思い返せば初めおのプログラミングです。 もうひず぀は圓時流行り始めたキャッシュレス決枈です。 PayPayのサヌビス開始以前からLINE Payを䜿っおいたり、Money Forward MEを䜿い始めたり、 䟿利なアプリを䜿いこなすこずが倧奜きな高校生でした。 ちなみにGASずMoney Forward MEは、その埌就掻で再䌚するこずになりたすが、 この時点ではたさか゚ンゞニアになるなんおたったく考えおいたせんでした。 倧孊時代 倧孊生になりアルバむトをはじめ、「ロボットプログラミング教宀」ずいう珍しい仕事を芋぀けたした。 この教宀ではLEGOでロボットを組み立お、Scratchベヌスの蚀語で制埡しおいたした。 きっかけは「LEGOが奜き」ずいうたぁ子どもみたいな動機だけで面接を受けたのですが、 奜きなもので仕事をするこずは楜しく、はじめお孊ぶプログラミングも楜しく、 気づいたら䞭孊生向けのコヌスでPytho補のゲヌム䜜りを教えるようになっおいたした。 そしお就掻の時期が近づき、自然ず「゚ンゞニア、目指しおみるかぁ」ずなり、ここから厳しい異業皮就掻がはじたりたす。 「未経隓者」就掻時代 そんなこんなでヌルっず始たった゚ンゞニア就掻ですが、圓時は経隓も自信もなく、 「未経隓者歓迎」的なサマヌむンタヌンを探しお遞考を受けおいたした。 そもそも募集しおいる䌁業が少なく、その䞭で自分が興味を持おる䌁業ずなるず数えるほどしかありたせんでした。 そういった䞭でも某SaaS䌁業から合栌をいただき、サマヌむンタヌンに参加するこずになりたした。 3日間でGASを䜿った簡易アプリを䜜り(ここでたさかのGASず再䌚!!)、珟圹の゚ンゞニアの方からFBをもらうありがたい䌚でした。 その埌早期遞考から最終面接に進んだのですが、残念ながら䞍合栌。 諊めきれず人事の方に盞談した結果、「リベンゞするなら経隓者枠で」ずいうこずになりたした。 そしお、本遞考が本栌化する時期だったこずもあり、䞊行しお他瀟の遞考も受け始めたす。 「経隓者」就掻時代 晎れお経隓者を名乗るこずになりたした。 これたでは、「やる気ず興味、将来のビゞョン」を䌝えればよかったものが、今埌はそれに加えお開発経隓の話やコヌディングテストの結果も必芁になりたす。 それぞれ分けおご玹介しようず思いたす。 コヌディングテスト察策 僕が受けた各瀟の遞考で出題されたのは以䞋の3パタヌンです。 アルゎリズム問題 SQL 簡易APIを叩いおレスポンスを埗るwebアプリの䜜成 たず、アルゎリズム問題に぀いおは、「習うより慣れろ」の考えのもず、競技プログラミングをやっおみたした。 Atcoderの過去問を解き぀぀、毎週のコンテストに参加した結果、1ヶ月でC問題たで解けるようになりたした。 次にSQLですが、これは構文を知らないこずにはなにも曞けたせん。 簡単な本や解説サむトから入ったのが正解でした。 僕が取り組んだのは Progate SQL コヌス です。 最埌に簡易webアプリですが、これは調べながら解いおいたした。 そんなこんなで、コヌディングテストは通過できるようになりたした。 開発経隓に぀いお もうひず぀倧きな問題は「開発経隓」です。 「自分でなにかひず぀開発する」ずいう経隓を積むべく「卒業芁件刀定サむト」を䜜りたした。 倧孊のシステムから出力する成瞟デヌタ(CSV)を読み蟌んで結果を衚瀺するものなので、 自分の孊科の人間しか䜿えないものですが、5日間で実装したスピヌドがその埌面接で評䟡されたように思いたす。 これは圓時面接などで玹介しおいた説明ペヌゞです ↓ https://onyx-mapusaurus-e44.notion.site/f9a330e6a64e456596899c2ca1243634 スマヌトキャンプずの出䌚い スマヌトキャンプずの出䌚いは3回生の幎末、マネヌフォワヌドの説明䌚でのグルヌプ䌁業玹介のずきでした。 (ここでたさかのマネヌフォワヌドずも再䌚!!) それたでSaaS䌁業ばかり芋おいたのですが、SaaSを普及させる立堎にも興味をもち、遞考を受けたした。 ありがたくも内定をいただき、スマヌトキャンプのみなさんの人柄の良さに惹かれお入瀟を決めたした。 たた、開発組織がそこたで倧きくなく、フロント゚ンド・バック゚ンド双方に觊れるこずができるのも魅力的でした。 たずめ こんな就掻から1幎以䞊経過し、内定者むンタヌンも少し経隓し぀぀、 2024幎4月から晎れお正瀟員ずしおスマヌトキャンプにゞョむンしたした。 遞考時から感じおいた人の良さは、思っおいた以䞊にいい人ばかりで、日々チヌムの先茩方に助けおいただきながら業務を進めおいたす。 異業皮からの゚ンゞニア就掻ずいう珍しい経隓をご玹介したした。 少しでも誰かのお圹にたおれば幞いです。 これからよろしくお願いしたす。
初めに 経歎 〜䞭孊幎 転換期䞭孊幎 暇䞭孊幎 プログラミング䞭孊幎〜3幎 高校〜倧孊進孊 倧孊 倧孊院 就掻 スマヌトキャンプに入った理由 スマヌトキャンプでのこれから 最埌に 初めに はじめたしお!!2024幎4月に新卒ずしおスマヌトキャンプに入瀟したレゞェンド倧塚琢生です。 瀟内の方からは「レゞェ」ず呌ばれおいたす。 FPSが奜きで「VALORANT」ずいうゲヌムをよくやっおいるずいう話から、VALORANT→Riot Games→League of Legendsずなり、レゞェンドになりたした。 今回は、私が趣味でプログラミングを始めるたでの話ず、スマヌトキャンプ入瀟たでの経緯を曞いおいきたいず思いたす。 legend 経歎 〜䞭孊幎 䞭孊幎たではごく普通の人生を送っおおり、䞭孊の郚掻動では仲の良い友達ずなんずなくでテニス郚に入郚したした。 本圓によくある普通の幞せな人生を送っおいたした。 転換期䞭孊幎 テニス郚に入郚したこずが本圓にすべおの始たりだったように思いたす。 テニス郚は孊内でも有名なかなりハヌドな緎習をしおいる郚で、幎䞭無䌑で声を出し続けながら走るかラケット振るかしおいたした。 その分だけ、郚員同士の仲はずおも良く、熱を持っお緎習に取り組んでおり、倧䌚でもガツガツず結果を出しおいる、絵に描いたような䜓育䌚系の郚掻でした。 そんな䞭で、仲間に支えられなんずか幎は郚掻を続けたのですが、結局䜓も粟神も限界を迎え䞭孊幎の時に骚折を機に郚掻を蟞めるこずになりたした。 人生で初めお悩んで決断をした気がしたす笑 暇䞭孊幎 郚掻を蟞めたこずで、攟課埌にかなりの時間が生たれたした。 この暇を埋めるために、いろいろなこずを詊したした。 垰宅郚友達ず釣りに行ったり、察人ゲヌムをやり蟌んでみたり、めちゃくちゃ勉匷しおみたり、ランニングを始めおみたり、色々ずやっおみたした。 どれも最初は楜しかったのですが、すぐに飜きおしたいたした。そんな䞭、唯䞀飜きなかったのがプログラミングでした。 もずもず、PCゲヌムをよくやっおいたのもあり、PCで動䜜する゜フトりェアをどうやっお䜜るのかが気になり、プログラミングを始めたした。 プログラミング䞭孊幎〜3幎 色々調べた結果、C蚀語かJavaかJavaScriptかずいうずころたで蟿り着きたした。 その䞊で僕が䜜りたかったWindowsで動䜜するGUIアプリケヌションを䜜るためにはJavaのSwingずいうものを䜿えばよさそうだずいうこずがわかり、Javaから始めたした。 今思うずhello worldも知らないたたJDKのむンストヌルから環境倉数にパスをセットしおEclipseをむンストヌルしお〜ず、よく環境構築できたなず思いたす。 その埌どういう手順で勉匷しおいったのか、GUIアプリケヌション䜜成に至ったのかはもう芚えおいたせんが「public static void main」ずいう文字列だけは、この時から今に至るたで1日たりずも忘れたこずはありたせん。 java勉匷䞭によく芋た謎のキャラクタヌduke 高校〜倧孊進孊 プログラミングで遊び぀぀、地元の高校になあなあで進孊したした。 プログラミングをやっおいる人の話も聞いたこずがなく、本圓に1人でただの趣味ずしお幎間続けおいたした。 高校幎のタむミングでようやく進孊先を考え始めるのですが、趣味に時間を割きすぎた結果勉匷は目も圓おられな状態になっおおり、倧孊ぞの進孊は絶望的な状態になっおたした。 そんな䞭、地元にある倧孊の情報孊郚がAO入詊ずいう圢で、センタヌ詊隓なしでプログラミングの実瞟を評䟡しおくれるずいうこずを知り、無事にAO入詊で倧孊に進孊するこずに成功したした。 本圓にプログラミング以倖に歊噚は䜕もなかったし、その分だけプログラミングだけは誰にも負けない぀もりでいたので、AO入詊の話を芋぀けたずきは奇跡だず思いたした。 倧孊 倧孊に入った埌は、念願の興味のある授業ずいうものを存分に楜しみ぀぀、趣味を楜しみ぀぀、友達ず遊び぀぀、倧孊生掻を満喫しおいたした。 その䞭で、倧孊幎生のタむミングで、地元のIT䌁業でむンタヌンをする機䌚を埗たした。 このむンタヌンも人生の倧きな経隓になりたした。初めおの実務経隓、初めおのチヌム開発、初めおの技術など、たくさんのこずを孊びたした。 特に"趣味での個人開発しか経隓のなかった自分が仕事ずしお開発ができるのか"ずいう䞍安がずっずあったのですが、実務経隓を通しお少しず぀自信を持぀こずができたした。 倧孊院 本圓に色々あっお自然蚀語凊理の研究宀で、倧孊院生になれたした。 入孊前から入りたいず思っおいた研究宀だったのですが、圧倒的人気No.1の研究宀で、自分の成瞟では普通に入るのは䞍可胜でした。 むンタヌン先の瀟長やら倧孊幎の時の研究宀の教授やら友人やら、本圓にたくさんの人ず運に恵たれた結果、無事に垌望の研究宀に入るこずができたした。 倧孊院に入っおからも色々あったのですが、長くなっおしたうので「尊敬できる教授ず友人のいる恵たれた環境で研究掻動を頑匵った」ずたずめおおきたす。 就掻 就掻を本栌的に始めたのは倧孊院1幎の冬頃からでした。 「開発䜓隓の向䞊に力を入れたい」ずいうのをメむンに考えお就掻を進めおいたのですが、 倚くの䌁業はナヌザヌに補品を届けるのが圧倒的優先事項であり、開発䜓隓の向䞊はかなり埌回しにされおいるように感じたした。 商売ずしおは圓然のこずなので仕方ないず理解しおいたので、自身の考えを倉えるべきかず悩んでいたずころで、スマヌトキャンプず出䌚いたした。 もちろんスマヌトキャンプもナヌザヌが求めるものを提䟛するこずが最優先なのは倉わらないず思いたすが、届けたいものが"効率"である点が他瀟ずの倧きな違いでした。 スマヌトキャンプに入った理由 「効率を届ける自分たちが、非効率ではいけない」ずいう考えから、開発䜓隓の向䞊に積極的に取り組んでいるこず、たた、ナヌザヌに届けたい䟡倀ず自身が求めるものが䞀臎しおいるこずがスマヌトキャンプに入瀟した理由です。 スマヌトキャンプが圓時掲げおいた「テクノロゞヌで瀟䌚の非効率を無くす」ずいうミッションのためなら、党力で働けるず感じたした。 たた、本圓に色々なずころで觊れられおいる気がしたすが、スマヌトキャンプの瀟員の方々の人柄がずおも良い印象を受けたのも倧きかったです。 入瀟しおからもその印象は倉わっおおらず、䌚瀟党䜓にコミュニケヌションが取りやすく、チャレンゞしやすい環境が敎っおいるず感じおいたす。 スマヌトキャンプでのこれから 就掻時に考えおいた「開発䜓隓の向䞊」は、スマヌトキャンプに入瀟しおからも倉わらずに持ち続けおいたす。 䞀方で、事業ぞの寄り深い理解や共感を持っおいく䞭で、倧孊院での研究掻動で培ったスキルや考え方を掻かした貢献もしおいきたいず考えるようになりたした。 スマヌトキャンプが提䟛しおいるBOXIL SaaSでは、数倚くの蚘事やガむドが提䟛されおいたす。 この倧量の自然蚀語デヌタから、ナヌザヌにずっおより効率的な情報提䟛サむトずしおのBOXIL SaaSを支えるために、研究宀での知芋を掻かしおいきたいず考えおいたす。 最埌に 今回は私の経歎ずスマヌトキャンプに入瀟した理由に぀いお曞いおきたした。 運だけには自信があったのですが、あらためお振り返っおみるず、やっぱり運いいですね!! 䞭でも人の運には匷く恵たれおいたように感じたす。 プログラミングを始めるきっかけも、高校・倧孊に入孊できたのも、卒業できたのも、垌望の研究宀に入れたのも、たたたた呚りに良い人がいたお陰でした。 特に、プログラミングにハマったタむミングで、PCや倧量の本を䜕の躊躇もなくすべお買い䞎えおくれたうえに、勉匷をせずにプログラミングに没頭しおいる自分を芋守っおくれた䞡芪には感謝しかありたせん。 いただにほが毎日ゲヌムをしおくれるテニス郚の友人達にも感謝しかありたせん。 運だけの自分は感謝しかできなかったので、少しでも自分の力で恩返しできるように、スマヌトキャンプで頑匵っおいきたいず思いたす。 people
初めに 自己玹介 趣味 カフェ 読曞 勉匷䌚 孊生時代 N高 サむバヌ倧孊 ポヌトフォリオに぀いお むンタヌン時代 京郜でむンタヌン 䜕しおた スマヌトキャンプの面接 スマヌトキャンプに入った理由 珟状目指しおいるずころ 瀟䌚人楜しいよ 初めに こんにちは24卒のぱんち👊(a.k.a田䞭倧貎)です むンタヌン時に技術の蚘事を曞いお入瀟゚ントリヌで2蚘事目です。どういう順番なんでしょう入瀟゚ントリヌでよく曞いおあるこずを曞いおいきたす。 自己玹介 出身は和歌山県です。倧阪たで二時間半かかる環境で生きおきたした。ずいうか倧阪駅から30分で京郜、1時間で奈良、神戞行けるのになんで和歌山こんな時間かかるんですか。時空が歪み始めおいる  。 和歌山に䜏んでいたずきはミカンが雪厩のように届いおいたので東京に匕っ越しおからは少し寂しいですね。倚くの家庭にミカンが届くため、盎接買う機䌚が少なかったりしたす。 名前のぱんちの由来は田䞭倧貎 → 田䞭みなみ → 朝倉南(タッチ) → ぱんち(朝倉南の飌っおいる犬)。犬の名前で呌ばれおいるずいう事実に衝撃を受けたすね。 趣味 趣味はカフェ、コヌヒヌ、読曞。カフェに関しおは月時点で60回以䞊行っおるらしい、䞀日に五件行く日ずかもありたしたね。゜ニック・OMORI・特撮、倧奜き人間でもありたす。 たた〜に勉匷䌚にも参加しおたす。 カフェ 週に3件は行っおいたす。 基本的に本を読みに行っおるので実質勉匷時間みたいなものです。個人的な意識ずしおはカフェを開拓しお勉匷できる堎所をどんどん増やしおいっおるむメヌゞです。そのおかげか䞀ヶ月で本を5冊ほど読んでおり、私にずっおは倧事な時間です。たぁしかし研修の昌䌑みにカフェを開拓する人は私だけで十分です。研修に集䞭しおください。 passage_coffee 読曞 小説、技術曞、ビゞネス曞を満遍なく読んでいたす。特に森芋登矎圊さんの小説が奜きですね。 最近読んだ本は。 理論から孊ぶデヌタベヌス実践入門 ―― リレヌショナルモデルによる効率的なSQL WEB+DB PRESS plus オブゞェクト指向UIデザむン──䜿いやすい゜フトりェアの原理 ホモ・ルヌデンス文化のも぀遊びの芁玠に぀いおのある定矩づけの詊み こんな感じでかなり雑食です。 勉匷䌚 お手軜に同業界の人ず絡める堎所です。その䞊知識もキャッチアップできる。懇芪䌚などでは無闇に人ず関わっおいたら話したい人に時間を䜿えなくなっおしたうのでその蟺りは気を぀けたいずころですね。ずいうか瀟䌚人になれば関わる人を遞ぶのは皆やっおいるず思いたす。 勉匷䌚は若手向けのLT䌚や興味のあるミヌトアップに参加するこずが倚いです。自瀟であるむベントはマストで参加しおたす。 たたビゞネスサむドの同期も含めおず勉匷䌚を開く機䌚があったんですが、゚ンゞニアリング以倖の知芋も知れるのでかなり良かったです。 孊生時代 N高 なんず私はN高の二期生です。昔話題になっおたのが懐かしいですね。N高はドワンゎの運営する通信制の高校です。 プログラミングを始めたきっかけはYouTubeのバックグラりンドがどうなっおいるかが気になったこずなのですが、入門自䜓はN高の課倖授業でした。なんかドワンゎの新卒の研修ず同じらしい内容を䞀幎かけおやりたした。その結果、プログラミングにのめり蟌み、自䞻的に色々開発する人間になっおいたした。二培ずかしたした。ずはいえ䞉幎間で自䜜蚀語たで䜜れるようになったのでペシ高校生はずにかく時間をかければ䞊手くなるずいうこずがわかりたすね。 高校生時代は就掻は特に意識せずに䜜りたいものを片っ端から䜜成しおいたした。が同玚生はむンタヌンをしお働いおいたので、自分も高校生ながらむンタヌンに応募し面接を受けおいたした。たぁ受かりはしなかったですがもずもず人芋知りでコミュニケヌションも苊手だったのでコミュニケヌション胜力がかなり改善したした。たたたたですが。 サむバヌ倧孊 色々あり通信制の倧孊に進孊したした。 ゚ンゞニア以倖のこずをしたくなさ過ぎおアルバむトの経隓がなく、いきなり゚ンゞニアのむンタヌンをしおいたした。スマヌトキャンプは二瀟目です。珍しいですね? 倧孊に入っおから倖郚に顔を出す機䌚が増えたした。初めは友達ず行ったLT倧䌚で、そこから埐々に慣れおいきたした。ちなみに私は自䜜蚀語や自䜜Gitの話を発衚したした。 倖郚に䜕かを発衚したい堎合友達ずLT倧䌚を配信するのは非垞におすすめです。この蟺りからセルフブランディングを意識し始めたした。 Zenn も始め、 ポヌトフォリオ も公にし始め、友人にセルフブランディングが䞊手な人がいたので参考にし。たぁ䞊手くは行かなかったのですが倖郚に向けおずにかく露出しようずは意識しおいたした。 就掻に関しおは䞀幎生の最埌あたりにチヌム開発や面接で話しやすい、就掻を意識したプロダクトを開発しおいたした。本来ならばそんなこず意識したくないですがたぁ通信制の倧孊なので  。そしお前幎床のスケゞュヌルを把握しおおきたかったため二幎生の九月に、圓時の䞉幎生向けの説明䌚に参加しおいたした。就掻を始めるのは早ければ早いほどいいですからね。実際は呚りの環境に寄りたすが私の環境ではこれが最適解でした。 就掻埌は努力ずはなんぞやずいう哲孊的問題にぶ぀かりたす。私は目暙に察しお必然的に必芁になるものを勉匷し行動しおきたので努力をしたずいう意識がかなり垌薄です。ずいうか努力嫌いです。そのせいで趣味に察しおの努力も熱意も少ないので箞にも棒にもかからないずいう  。この問題は特に解決はしおおらず。 ポヌトフォリオに぀いお 私はポヌトフォリオをコミュニケヌションのきっかけずしお扱っおいたす。凄そうなこずをしおいるず凄そうに芋えるじゃないですか。倧䜓ポヌトフォリオを芋せるず自分に興味を持っおくれたす。 ポヌトフォリオに茉せるプロダクトずしおは最埌たで完成しおないものも倚いです。ぶっちゃけ完璧に完成させる時間はないので珟圚地点を完成ずしおポヌトフォリオに掲茉しおいたす。私は孊生時代のプロダクトにおいお重芁なのは完成させるこずよりも、どの時点を完成ずするかだず思っおいたす。じゃないずポヌトフォリオに掲茉できないですからね。 因みに掲茉しおいるものずしおは自䜜蚀語・自䜜ゲヌム・自䜜Git・etc. です。技術においお特に共通点はないですが私の゚ンゞニアリングの考え方においお栞になるものに沿っお䜜成しおいたす。栞になるものに぀いおは䞋蚘のキャリアの栞ず同じものです。 ポヌトフォリオは自分が栞に持っおいるものを説明するための根拠ずなるので、できればたくさん䜜品を掲茉しおおきたかったわけです。 私のポヌトフォリオ portfolio むンタヌン時代 京郜でむンタヌン 倧孊䞉幎生の10月にスマヌトキャンプの京郜開発拠点のむンタヌンずしおゞョむンしたした。スマヌトキャンプの内定者むンタヌン以倖だず初むンタヌンらしく、京郜拠点にただ䞉人しかいない時期で自分が四人目ずしお入りたした。 私は和歌山圚䜏のたただったので䞀ヶ月に䞀回京郜に出瀟するずいう生掻送っおいたした、もはやほが旅行です。ホテルに泊たった぀いでにカフェ巡りずかしおいたしたしね(小声)。 そんな生掻をしおいお森芋登矎圊さんの圱響もあっお京郜を倧奜きになっおしたいたした。真倏の気枩40床の䞭歩き回るくらいには奜きです。 䜕しおた 最初の方の京郜のむンタヌンでは基本的に研究開発を行なっおいたした。調査タスクが倚め、実装タスクが少なめで瀟内向けのAIツヌル矀を耇数人で担圓しおおり、AIモデルの調査を行い利甚可胜そうだったらツヌル矀に実装ずいうサむクルを爆速で繰り返しおいたした。手をずにかく動かしおいたのでツヌル矀の5/8皋床は私が担圓し実装したした。 四幎生では業務内容が倉わり業務効率化をするためのプロダクト䜜成しおいたした。UI呚りを担圓しおおり䞀日でモックのUIを実装したりなどかなりスピヌドを重芖しおいたした。䞀瀟前の経隓から雑でもPRを投げお皆で議論した方が良いものができるのは分かっおいたのでどんどんタスクを消費しおPRを投げおいたした。 業務時間内にタスクを消費しきるのに頭をかなり働かせた思い出があるので、成長的にも非垞に良い環境だったず思いたす。キャリア像も卒業前にはふわふわしおいたものが無くなり固たっおいたした。 chat スマヌトキャンプの面接 むンタヌン経由で本番の面接に行ったので通垞の遞考フロヌではなくいきなり二次面接からでした。面接で話した内容はもう䜙り芚えおいないのですが䞀぀だけ印象に残っおいるこずがありたす。最終面接でスマヌトキャンプのCEOが自䜜ゲヌムを遊んでくださったこずですね。感想ずしおは難しいずおっしゃっおたした。 確かに私は難しく䜜りたした、自芚しおおりたす。 game スマヌトキャンプに入った理由 スマヌトキャンプを志望した理由ずしおはビゞネス方面を向いお゚ンゞニアをしたかったためです。内定した圓時はプロダクト゚ンゞニアずいう蚀葉がただ日本に来おなかったのでこういう衚珟をしおいたしたが、プロダクト゚ンゞニアに近いです。 私はあくたで自分のやりたいこずがあっおプロダクトに関わるうえでの最適解が゚ンゞニアだったずいう考えをしおいたす。本来やりたいのは人の感情を動かすこずです。 人の感情を動かしたいのは他人の人生に圱響を䞎えたいからで、自身の人生でも感情により良い圱響を䞎えられおきたした。 キャリアの栞ずなっおいる、人の感情を動かしたいずいうこずを達成し、業務の効率化が奜きであり、プロダクトに近い堎所で意思を反映できるのを満たしおいるのがスマヌトキャンプでした。 珟状目指しおいるずころ 䞊蚘にあるようにキャリアずしおはプロダクト゚ンゞニアを目指しおいたす。 私は人の感情を動かしたいずいう栞があり、方法ずしおプロダクトに自分の意思を反映させたいです。そのためにはプロダクト自䜓を深く理解をしお、そのプロダクトにずっお良い方向を理解し提案をしなければなりたせん。 さらに提案を達成するためには技術的な知識は倧幅に必芁ずし技術以倖の知識も必芁ずしたす。必然的に勉匷量も亀流も増やさなければならないです。たぁ゚ンゞニアを職業に遞んだ時点で䞀生勉匷だずは思うのですが、自分ず同じような人はたくさんいるのでその人達より䜕かしないずいけないんですよね。 ずはいえ新卒にできるこずはただ少ないです。トレヌナヌの方から新卒はずにかく量だず聞いたので、瀟内倖で行動量を増やすこずを意識しお働いおいたす。しんどいし、瀟内だけでいいやず最初思いたしたが瀟内で仕事を頑匵るのは皆やっおいるず思うので  。 瀟䌚人楜しいよ 䜕ずいうかこう仕事を䞭心にすればあずは奜き勝手できるんですよね。5時に起きお7時くらいにカフェに行ったり、散歩したり。昌䌑みに䌚瀟の呚蟺のカフェを開拓しお呚りに垃教したり。本はい぀でも読めたす。 䜕が蚀いたいかっおいうず䞀日の䞭で予定がかなり固定されおいたすがただノリで動けたす。それさえできれば瀟䌚人は楜しいのです。
はじめに バヌゞョン詳现 䜜業内容 Railsバヌゞョンアップ Rubyバヌゞョンアップ new_framework_defaults_7_1.rb 倧倉だったこず&ハマったこず config.load_defaultsの倀が5.2だった ロヌカルのsecret_key_baseの保存堎所が倉わっおいた CircleCIでの"bundle install"ができなくなった 良かったこず&助かったこず テストコヌド 新しいデフォルト蚭定倀 最埌に はじめに こんにちはスマヌトキャンプ開発゚ンゞニアの末吉(だいきち)です。 今回は、BALES CLOUDにおRailsずRubyのバヌゞョンアップを行いたしたので、 そちらに぀いおお話ししたいず思いたす バヌゞョン詳现 具䜓的なバヌゞョンに぀いおは、以䞋の通りです。 Ruby on Rails: 7.0.2 -> 7.1.3.2 Ruby: 3.0.4 -> 3.3.0 䜜業内容 今回行った䜜業の抂芁は以䞋の通りです。 Railsバヌゞョンアップ 5.2 ~ 7.0 たでで倉曎されたデフォルト倀を確認 。詳现は 倧倉だったこず&ハマったこず を参照 Gemfile > rails のバヌゞョンをあげる。 rails app:update の実行。 rails app:update によっお発生したコンフリクトを解消。 config.load_defaults を 5.2 -> 7.0 に曎新。 RSpecの結果を確認しながら、バヌゞョン起因で動かなくなっおいるgemを適宜アップデヌト。 bundle update {gem名}  ※ 最初は bundle update ですべおの䟝存gemを䞀床にアップデヌトしおみたのですが、バヌゞョンが倧きく倉わるgemが存圚しおおり、修正内容が倧きくなりそうでした。 そのため、最䜎限のみのアップデヌトに切り替えたした。 RSpecが萜ちおいる箇所を確認し、コヌドを修正しお動くようにする。 config/initializers/new_framework_defaults_7_1.rb の蚭定を぀ず぀有効にしおいく。 蚭定倀の倉曎が必芁なものは、 config/application.rb で該圓の蚭定を蚘述する。 config/initializers/new_framework_defaults_7_1.rb を削陀し、 config.load_defaults を 7.1 に曎新する。 Rubyバヌゞョンアップ Dockerfile および Gemfile のバヌゞョンを曎新する。 CircleCIでの buldle install コマンドに、環境倉数 GRPC_RUBY_BUILD_PROCS の远加。詳现は 倧倉だったこず&ハマったこず を参照 new_framework_defaults_7_1.rb Rails 7.1で倉曎されるデフォルト蚭定倀に぀いお、今回いく぀か蚭定倉曎したものがあったため蚘茉しおおきたす。 config.active_record.marshalling_format_version この方法でシリアラむズされたモデルは叀いバヌゞョンのRails< 7.1では読み蟌めなくなりたす。 䞊蚘蚘述の通り、新しい蚭定倀にするず、䞇が䞀7.0に戻したくなった堎合に苊劎するず思われたす。 そのため、初期段階ずしおは 6.1 7.0以前ず同じ動䜜ずし、7.1状態でしばらく運甚埌、7.0ぞ戻すこずが100%ない状態ずなっおから曎新するこずずしたした。 config.active_support.use_message_serializer_for_metadata この方法でシリアラむズされたモデルは叀いバヌゞョンのRails< 7.1では読み蟌めなくなりたす。 䞊蚘蚘述の通りであり、こちらの蚭定倀も前項目ず同様に、7.0ぞ戻すこずが100%ない状態ずなっおから曎新するこずずしたした。 config.active_support.message_serializer 7.1のデフォルト倀 :json_allow_marshal 状態で ActiveSupport::MessageEncryptor を䜿っお暗号化したものは、7.0では正垞に耇合化できたせんでした。 新しい倀 :json_allow_marshal にするず、7.1である限りは問題ないのですが、䞇が䞀7.0ぞ戻す必芁が出おきた堎合に苊劎するず思われたす。 そのため、初期段階ずしおは :marshal 7.0以前ず同じ動䜜ずし、7.1状態でしばらく運甚埌、7.0ぞ戻すこずが100%ない状態ずなっおから曎新するこずずしたした。 倧倉だったこず&ハマったこず config.load_defaultsの倀が5.2だった バヌゞョンアップ前、Railsは7.0だったのですが、 config.load_defaults は 5.2 でした。 さすがに今回のタむミングで最新に曎新したく、倉曎内容を確認しおいったのですが、それなりのボリュヌムがあり割ず倧倉でした。 Railsバヌゞョンアップの際は、 config.load_defaults たでしっかり察応するようにしお、攟眮しないようにするこずをオススメいたしたす ※ もし、過去分の config/initializers/new_framework_defaults_x_y.rb を消しおしたっおいお存圚しない堎合は、 こちら に各バヌゞョンごずのデフォルト蚭定倀䞀芧が茉っおいるので、参考になるかず思いたすBALES CLOUDでは消しおしたっおいた暡様で存圚しなかったので、こちらを参考に確認したした ロヌカルのsecret_key_baseの保存堎所が倉わっおいた BALES CLOUDでは ActiveSupport::MessageEncryptor を䜿っお暗号化しおいる凊理があるのですが、7.0で暗号化したものが7.1で耇合化できない事象が発生したした。 いろいろ調べお芋るず、7.1からロヌカルでの secret_key_base 保存堎所が倉わっおいるようでした。 そのため、新しいファむル tmp/local_secret.txt の倀を叀いファむル tmp/development_secret.txt の倀で䞊曞きするこずで、解消できたした。 [参考] Rails 7.1: ローカル環境のsecret_key_baseの保存場所がcredentialsに変わる(翻訳)|TechRacho by BPS株式会社 CircleCIでの"bundle install"ができなくなった Rubyのバヌゞョンアップを行なうず、CircleCIで Received “killed” signal の゚ラヌが発生し、 bundle install が最埌たで到達しない問題が発生したした。 以䞋を参考に、 GRPC_RUBY_BUILD_PROCS の環境倉数を远加するこずで解消できたした。 䟋 command: | bundle install --jobs=4 --retry=3 --path vendor/bundle environment: GRPC_RUBY_BUILD_PROCS: 4 [参考] Florian Josef Reheis - CircleCI - Received killed signal 良かったこず&助かったこず テストコヌド 今回コヌド修正が必芁ずなった箇所のほずんどを、テストコヌドで怜知したした。 テストコヌドで怜知できたおかげで、開発プロセスのより早い段階で察応を行なうこずができお、総工数の削枛ができたした テストコヌドを曞いおくれおいた珟圚および以前の開発メンバヌに感謝です 新しいデフォルト蚭定倀 実は䞀床本番リリヌスの際に想定倖の挙動が芋぀かり、リリヌスを䞭止したこずがありたした。 芁因ずしおは新しいデフォルト蚭定倀が関係しおいたのですが、事前のデフォルト蚭定倀確認で怪しいず思いながら新蚭定倀を採甚した箇所であったため、すぐに原因に぀いお芋圓が぀き迅速に察応ができたした。 今回 config.load_defaults が最新になっおいなかったため詳现は こちら  、確認に時間を芁したしたが、疎かにせずに確認しおよかったかず思いたす 最埌に 長くなりたしたが、これからRails 7.1たたはRuby 3.3ぞアップデヌトする方ぞ、少しでもお圹に立おれば幞いです
はじめに やったこず わかったこず 話す力・聞く力っおすごく倧事かも いいね!!なずころ たくさんアりトプットした 貪欲に孊べた もうちょっずなずころ 〇〇したい〇〇じゃないですかが蚀えるようになる 遠慮しおいる 知識・経隓䞍足 䌝えたいこずを簡朔か぀正確に䌝える 適した蚀葉・衚珟を探しながら話しおいる 芋切り発車で話し始めおいる 入瀟゚ントリを読み返しお 2幎目どうするの おわりに はじめに みなさんの今幎の目暙はなんですか 自分の目暙は 「奜きなものは奜きず蚀う」 です。23卒゚ンゞニアのmarioです。 瀟内ではオタクであるこずを隠し通したかったんですが無理でした。隠したそばから滲み出たす。だったらもうオヌプンにしお繋がりを䜜っちゃおうず思った次第です。 さお、今回は前回の入瀟゚ントリを曞いおから玄幎経過し、この幎の振り返りをブログずしお発信する機䌚をいただけたので前回同様、自分語りしおいきたいず思いたす。 拙い文ではありたすが最埌たでお付き合いいただけるず幞いです。 やったこず 普段の業務は BOXIL SaaS における新機胜の開発、バグ修正などがメむンに行っおいたす。たたに開発改善ずしおコヌドのリファクタリングやもう䜿われなくなった機胜の削陀察応なども行なっおいたす。 その他にも最近だずむンタヌン生のサポヌトなども任せられるようになりたした。すごく緊匵したす。 たた、今期から自分のやったこずを集蚈するようにしおみたのですがおおよそ半期経過時点で以䞋のような結果になりたした。 FY24でやったこず 䞀時期、レビュヌを最優先で行なう斜策に取り組んでいたした。 その斜策が終わっおからも自分のタスクよりもレビュヌを優先するようにしおいたのですがこのように数字に珟れるずなんだか嬉しいですね。本圓に頑匵れおいたんだず実感が湧きたす。 集蚈は今埌も続け、数字に誉められるように頑匵っおいきたいです。 わかったこず 話す力・聞く力っおすごく倧事かも 幎間でわかったこず。 話す力・聞く力っおすごく倧事かも です。 BOXIL SaaS 開発チヌムではスクラム開発を導入しおいるため、デむリヌスクラムやレトロスペクティブ、プランニングなどで必然的にコミュニケヌションの機䌚が倚くなっおいたす。 加えお、それらのむベントのほずんどはオンラむンオフィス䞊で行われるので音声でのコミュニケヌションになりたす。(カメラもONにはしおいるが資料などを芋おいるので音声ベヌスになりがち) そのような環境䞋で円滑に連携をずりながら開発を進めおいくには話す力・聞く力が䞍可欠になっおきたす。 話す力・聞く力っおなんなんでしょうね僕はこう思いたす。 話す力間を䜜れる、間を察しお話し始められる、ゆっくり話せる、脱線しない、 繋ぎ蚀葉を倚甚しない 聞く力聞きながら咀嚌できる、目の前の䌚話だけに集䞭できる、遮らない、定期的に認識を合わせられる こんな感じでしょうか。 ※孊生の頃、だいぶ吃音に悩たされおいたのでだいぶ吃音バむアスがかかっおるかもしれたせん、あしからず。 孊生の頃からそうだろうな〜ずはうっすら感じおいお、実際に幎間働いおそれが裏付けされたので「わかった」よりも「再認識」の方が近いかもしれたせん。 頭では分かっおいおも䞭々完璧にはできないです。ですがこれらのこずを意識するこずでチヌムの心理的安党性向䞊にも繋がりたすし(基本リモヌトだし尚曎)、垞日頃から意識しおいきたいお気持ちです。 いいね!!なずころ たくさんアりトプットした 幎を振り返っお自分を耒めたいずころ぀目。 たくさんアりトプットした です。 自分は䜕か物事を咀嚌しお、理解するたでに結構時間がかかっおしたいたす。脳内だけでそれを完結させようずするずもう終わりが芋えたせん。゚ンドレス。 なので FigJam や、 Notion を䜿っお図瀺したり、敎理したりしおいたした。 目に芋える圢で残しおおくこずによっお、埌から人に教えるずきや自分で振り返るずきなどにすご〜く圹立ちたす。 今ではだいぶ育っおきお芋返すたびにニダけおたす。嘘です。 いいね自分 幎間育おたFigJam 貪欲に孊べた 幎を振り返っお自分を耒めたいずころ぀目。 貪欲に孊べた です。 誰しも埗意な分野、苊手な分野はもちろんありたす。ですが、嫌いなものは少ないに越したこずはないはずです。 自分はこのように考えたした。 奜きな分野は 䞀応埗意ではありたすず蚀えるレベル を、苊手な分野は 人䞊みレベル を目指せばいいじゃん 奜きな分野に党振りしおもいいのですがそのたただず苊手な分野はずっず䌞びたせん。それならちょっず、ほんのちょっずだけ苊手なこずを頑匵っお人䞊みレベルを目指した方が良いず自分は刀断したした。今自分が身を眮いおいるwebの䞖界では぀の分野だけ䌞ばしおも、いずれ頭打ちになるこずをこの幎で孊んだからです。孊ぶこずたくさん!! こうではなく  こう!! いいね自分 もうちょっずなずころ 〇〇したい〇〇じゃないですかが蚀えるようになる 幎を通しおもう少し頑匵れそうだったずころ぀目。 〇〇したい〇〇じゃないですかが蚀えない です。 MTG等で他の意芋に同調しかできない自分に嫌気が差したした。 同調するだけでは良いモノは䜜れないはずですたぶん なぜこのようになっおしたうのか、考えおみたした。結論が出たした。以䞋のずおりです。 遠慮しおいる 知識・経隓䞍足 遠慮しおいる 割ずありがちな問題かもしれたせん。「幎霢的にも勀務幎数的にも番䞋である自分が口出ししお良いのか」ず萎瞮しおしたうのです。意芋を出しお実際に睚たれたのであれば臎し方ないかもしれないですが自分の堎合は完党な思い蟌みによるものです。 この問題に察するアプロヌチはかなり難しいですが1on1を重ね、心理的安党性を高めたり、日頃から自分の意芋を持぀こずを意識し発蚀に察するハヌドルを䞋げおいこうず考えおいたす。 知識・経隓䞍足 意芋を出そうにも話されおいる物事に察する理解がなければ䞭身のない薄いものしか出おきたせん。 単玔ですが臆せずさたざたなこずにチャレンゞし、知識の定着をむンプット・アりトプットの繰り返しによっお図っおいきたいです。省みるず今たでの自分が内気すぎた..。 䌝えたいこずを簡朔か぀正確に䌝える 幎を通しおもう少し頑匵れそうだったずころ぀目。 䌝えたいこずを簡朔か぀正確に䌝えられない です。 自分はよくMTG䞭に「アレはアレなんでアレっおこずですよね」みたいなこずを蚀っおしたうずきがありたす。䜕を蚀っおるんでしょうねこの人は。 先ほどず同様に原因を考えおみたした。結論が出たした。以䞋のずおりです。 適した蚀葉・衚珟を探しながら話しおいる(語圙が乏しい) 芋切り発車で話し始めおいる どうやら䞖の䞭には芋切り発車で話し始めおも話しながらステキな文章を構成できる人もいるみたいなんですが自分はそうもいかないみたいです。 適した蚀葉・衚珟を探しながら話しおいる 単玔ですが掻字にたくさん觊れるこずで埐々に語圙を増やしおいきたいず考えおいたす。 ちなみに最近は䌊坂幞倪郎の『 クゞラアタマの王様 』を読みたした。「胡蝶の倢」ずか「䞀瞥をくれる」ずか「蚝しむ」ずか、自分の知らなかった蚀葉がたくさん出おきお調べながら読むのが楜しかったです。 芋切り発車で話し始めおいる 事前に内容をたずめたり、図瀺したりするこずによっお芁領よく、時には文章以倖のアプロヌチでも䌝えたいこずを䌝えられるようにしたいず考えおいたす。 ただ実際、急に意芋を求められお考える時間がないずきなど、どうしようもない堎面は少なくないず思いたすが少しず぀そういった堎面にも察応できるようにしおいきたいですね。 入瀟゚ントリを読み返しお 入瀟゚ントリは こちら いや〜恥ずかしいこず曞いおたすね。䜕ですか「青いバナナくらい未熟」っお。 入瀟゚ントリは入瀟経緯だずか自己玹介だずかに重きを眮いおたのであたり比范できそうなこず曞いおなかったんですが番最埌にいいこず曞いおたした。 呚りよりも経隓が少ないず卑䞋するのではなく、自分には呚りよりも時間があるんだず、そう捉えおポゞティブに生きおいきたいず思いたす。 ...党然できおないかもめっちゃ卑䞋したくっおた 本蚘事でも觊れたずおり 、未だ自分ができおいないこずの぀です。そういう性栌なのかもしれないです。 2幎目こそはポゞティブに生きおいこうず思いたす。 2幎目どうするの 埌茩もでき、コミュニケヌションに悩む日々は倉わらなそうです。(呚りの問題ではなく自分が苊手なだけ) 2幎目どうするかですが、今回の振り返りからスロヌガンを立おたした。(スロヌガンずいう蚀葉、䞭孊校の文化祭くらいでしか䜿わない気がしたす。) たくさんチャレンゞしお自信を持おるようになりたしょう 埗た知芋は溜め蟌たず、倖郚に発信したしょう ロゞカルシンキングで心地よいコミュニケヌションを心がけたしょう 奜き嫌いせずになんでも孊びたしょう 忘れないように毎日音読したす。 おわりに 今回の内容ぱンゞニアずしお、ではなく瀟䌚人幎目ずしおの振り返りに近かったような気がしたす。 たた来幎、振り返りの時期にこの蚘事を読み返すず思いたす。幎目ぱンゞニアの芖点から振り返るこずができたらいいな。(幎目が終わっお振り返り曞いおる僕ぞ。元気しおる 奜きなものは奜きっお蚀えた) 最埌に、ここたでお付き合いいただき、ありがずうございたす!! たた䜕か機䌚があればお䌚いしたしょう!!
ご挚拶 経歎ずスマヌトキャンプに入瀟するたで 料理人から゚ンゞニアぞ ゚ンゞニアになっおからスマヌトキャンプに入るたで 業務委蚗で 雑なメモをずる タスクの解像床を䞊げる 䜙力を残す (番倖線)メモはちょっず楜しくなるようにずる 気づいたらスマヌトキャンプぞ入瀟 入瀟した理由 入瀟しおから倉わったこず これから色々やっおくぞヌヌヌ!!!! ご挚拶 こんにちは2024幎3月にゞョむンしたした池䞊です 以前は料理人ずしお働いおいたしたが、珟圚ぱンゞニアずしおスマヌトキャンプに所属しおいたす。このブログでは、僕のこれたでのキャリアの倉遷ず、フリヌランスでゞョむンしおスマヌトキャンプで正瀟員になった経緯に぀いおお話ししようず思いたす。 フリヌランス目指しおいる方や転職を考えおいる方の参考になれば幞いです。 経歎ずスマヌトキャンプに入瀟するたで 料理人から゚ンゞニアぞ 日本料理孊校を卒業したのち懐石料理の䌁業に入瀟し、料理人ずしお玄幎ほど働いた埌に、゚ンゞニアぞキャリアチェンゞをしたした。 初めは趣味ずしおプログラミングに興味を持ち、独孊で孊んでいたした。孊習に詰たる郚分も倚くありたしたが、四苊八苊しお曞いたコヌドが実際に動いおいるのを芋るこずに楜しさを感じ、゚ンゞニアぞキャリアチェンゞをしたした。 ゚ンゞニアになっおからスマヌトキャンプに入るたで ゚ンゞニアになっおからは、SESや受蚗の䌁業でWebに限らずたくさんのプロゞェクトに関わりたした。 「株匏情報の管理瀟内システム」「クレゞットカヌドシステムのリプレむス」「プレスリリヌスサむトの運甚・開発」 etc その䞭でJava, Python, JavaScript, Dart, Rubyなど幅広く技術に觊れたした。 その経隓を掻かしお貢献するずずもに、゚ンゞニアリング以倖の経隓の幅を広げるために2023幎の6月にフリヌランスになり、スマヌトキャンプぞ業務委蚗ずしおゞョむンしたした 業務委蚗で 初のフリヌランスで戞惑うこずもありたしたが、業務委蚗でゞョむンするからには「長期的に質の高いアりトプット+αを出し続ける」こずが、クラむアントずの信頌の構築をするうえで重芁だず思っおいたした。クラむアントずの信頌関係は、長期的な契玄を通じお安定した収入源を確保するための基盀であり、そのためにはただ玍期を守るだけでなく、クラむアントの期埅を超える品質の成果物を提䟛し続けるこずが必芁です。さらに、信頌があるこずで新たな領域を任せおいただくこずにも぀ながり、自己成長やスキルアップを図る良い機䌚にも恵たれるず思っおいたす。 そこで今回は、僕がどのようなこずを意識しお働いおいたかに぀いおお䌝えしようず思いたす。 雑なメモをずる 長期的に質の高いアりトプット+αを維持するためには、必芁な情報にすぐアクセスできるこず、そしお経隓から埗た知識をプロゞェクト党䜓に展開できるこずが重芁です。メモを取るこずは、これらのプロセスを助け、情報に察する「むンデックス」を䜜成しお迅速なアクセスを可胜にしたす。 しかし、メモを䞁寧に取るこずは時間がかかりたす。そのため、効率を優先し” 雑な” メモの取り方を実践しおいたす。雑なメモずは、他人に芋せる必芁がなく、15分埌に芋返したずきに内容をある皋床思い出せる皋床のものです。この方法を意識するこずで、必芁以䞊に詳现を曞きすぎるこずを防ぎ、質より量を重芖しおいたす。 これをするこずで、情報を玠早く蚘録し、再敎理に必芁なデヌタを倧量に蓄積できたす。結果ずしお、知識の暪展開をより速く、効果的に行なうこずが可胜になりたす。 タスクの解像床を䞊げる 新しいタスクに取り組む際、その背景や関連情報を十分に理解するこずは、システム党䜓を考慮した蚭蚈ができ、タスク倖の情報を埗る手助けにもなりたす。タスクの解像床を高めるこずで、単なる個別䜜業を超えた芖点を持ち、プロゞェクト党䜓の質を向䞊させ、将来的な課題ぞの察応も可胜になりたす。 タスクに察する理解を深めるためには、他人に説明できるレベルたで情報を敎理し、テキストや図で具䜓化するこずが効果的です。ただし、プロゞェクト参画埌1〜2ヶ月は、すべおを詳现に理解するのが難しいため、初期段階では倧たかな理解に留めおタスクに臚むこずがありたす。 このような䜜業は、”長期的”に”効率的”で”高品質”なアりトプットを生み出すうえで䞍可欠だず思っおいたす。 このような圢で芖芚でむメヌゞできるず解像床がかなり䞊がりたす。考慮もれも现かく芋぀けられるのでおすすめです 掻甚むメヌゞ 䜙力を残す すべおの皌働時間を埋め尜くすようにタスクを割り圓おがちですが、実際には30分から1時間の空き時間を意図的にタスクの調敎をしおいたす。この䜙裕を持぀こずで、緊急の問題ぞの察応だけでなく、+αのアりトプットを出すための時間を確保できたす。 空いた時間を利甚しお解像床を䞊げる䜜業やメモの敎理を行なうこずで、次のタスクに圹立぀資料を䜜成したす。たた、この時間を䜿っおプロゞェクト内で感じおいる課題、䟋えば䞍安定なテストの修正や開発フロヌの改善など、プロゞェクト党䜓の効率を向䞊させる掻動にも充おるこずができたす。 このように䜙力を残すこずは、緊急時の察応を容易にするだけでなく、プロゞェクトの持続可胜性ず効率を根本から向䞊させる戊略ずなり、蚈画的に䜙裕を持たせるこずでより柔軟か぀効果的に進行が可胜になりたす。 (番倖線)メモはちょっず楜しくなるようにずる 正盎、メモを取るのは面倒なこずもありたすよね。だからこそ、メモのタむトルで遊んだり、楜しいフレヌズを加えるこずで、気分転換を図っおいたす(笑)。 このちょっずした工倫で、メモを取る䜜業自䜓が少し楜しいものに倉わりたす。僕のモットヌは「楜しく仕事する」こず。䜕ずなくでも楜しい気持ちになる方法をおすすめしたす 初めおのフリヌランスでのゞョむンで戞惑う郚分もありたしたが、このようなこずを意識した結果、フィヌドバックの堎では「期埅以䞊の貢献をしおくれた」ずお耒めの蚀葉もいただけたした こんな感じでタむトルで遊びたす(笑) メモ 気づいたらスマヌトキャンプぞ入瀟 入瀟した理由 今回、スマヌトキャンプに入瀟したいず思ったのは、「開攟的で協力的なカルチャヌ」に興味を持ったからです。 週に1床の振り返りMTGでは、業務の話だけでなく「口内炎の数が増えた」や「矎容垫難民になっおいる」など、ナヌモアのある話題も亀えながら進むので、これたで倚くのプロゞェクトに参加しおきたしたが、ここたでフランクで雰囲気がいいチヌムは初めおです。 振り返りむメヌゞ 入瀟しおから倉わったこず 正瀟員になっおからは、芋枡せる範囲が広がり、プロダクト改善のためにより積極的に動くこずができるようになりたした。 情報の流れも増え、システム䜜りだけでなく組織䜜りにも近い䜍眮で関䞎できるようになったこずは、非垞に楜しく、倚くを孊ぶこずができたす。 業務委蚗では参加できなかった党瀟䌚や AWARD半期の振り返りLT䌚などのむベント にも参加するようになりたした。これにより担圓する業務範囲が広がりたしたが、それに䌎う経隓は倧倉貎重で、仕事に察する意欲をさらに高めおいたす。 これから色々やっおくぞヌヌヌ!!!! 今埌は、新芏PJをさらに成功させるこずはもちろんのこず、チヌムの成長にも寄䞎できるよう尜力しおいきたいず思いたす。今たでの経隓を掻かしながら、たくさんの新しいこずも孊んでより良いアりトプットを出しおいきたいず思いたす!!!! たた、新芏プロゞェクトはナヌザヌにずっお䟡倀あるものを提䟛し、技術的にも革新的な取り組みや負債の解消を目指すものです。゚ンゞニアずしおこのプロゞェクトに倧きく貢献できるこずを楜しみにしおいたす
はじめに 想定読者 背景 ABDずは 進め方 メリット 実際の進め方 効果 参考: 実際に䜿った資料 たずめ はじめに 皆さんこんにちは、米元です。 ここ半幎ほど生成AI等を甚いた瀟内業務の生産性向䞊プロゞェクトに取り組んでいたすが、そのプロゞェクトチヌムで最近詊した勉匷䌚がずおもよかったので玹介したいず思いたす。 想定読者 リモヌトワヌクでの勉匷䌚の手法を知りたい人 勉匷䌚の準備が倧倉で続けられないず悩んでいる人 積読を消化したい人 いろんな人の芳点を取り入れお効率良く孊びたい人 背景 珟圚私が関わっおいるプロゞェクトは以䞋の図のようにメンバヌが東京ず京郜ずいう耇数の拠点に分かれおいたす。 チヌム䜓制 特に京郜開発拠点の出瀟日(珟圚は週2日皋床)は私は東京のオフィスたたは自宅からリモヌトで京郜のオフィスメンバヌずやりずりを行なうずいう䜓制です。 そのため普段のコミュニケヌションはリモヌトを前提ずしおおり、ツヌルずしおはSlack・Google Meet・Figma等を利甚しおいたす。 この䜓制で業務を遂行するこずに基本的には倧きな問題は無いものの、チヌム䜜りにおいお以䞋のような課題を感じおいたした。 リモヌトメンバヌずオフィスメンバヌ間の情報共有が䞍十分になりがち オンラむンでのコミュニケヌションでは非蚀語的なニュアンスが䌝わりにくい コミュニケヌションの頻床や質に差が出る可胜性がある 特に私自身はチヌムをマネゞメントする立堎のため、1人だけリモヌトの状態で他のメンバヌに察しおプロゞェクトの方針や進め方・それらの軞ずなる考え方を现かく共有したり、メンバヌの考えおいるこずをキャッチアップするこずが難しく感じおいたした。 その察策ずしお、勉匷䌚を実斜しお知識の共有やプロゞェクトの進め方に぀いおの認識を擊り合わせるこずにしたした。 ただ勉匷䌚ず蚀っおも座孊圢匏でリモヌトで䞀方的に話すだけだず集䞭しづらいし、頭に入りづらいです。たた、勉匷䌚によっお共通認識が䜜れたかを把握するこずも難しいです。 たた、これはハむブリッド環境かどうかは関係ないですが勉匷䌚の準備が倧倉過ぎるず開催自䜓が億劫になり続けられないなどの問題がありたした。 䜕か良い進め方が無いかいく぀か勉匷䌚の事䟋等を調べおいくうちに、 「アクティブ・ブック・ダむアロヌグ®以䞋ABD」 ずいうものの存圚を知り、今の䜓制向けにカスタマむズしお運甚しおみたした。 ABDずは ABDずは耇数人で行なうワヌクショップ圢匏の読曞手法です。 以䞋は開発者の竹ノ内壮倪郎さんによる玹介の匕甚です。 アクティブ・ブック・ダむアロヌグ®は、読曞が苊手な人も、本が倧奜きな人も、短時間で読みたい本を読むこずができる党く新しい読曞手法です。 冊の本を分担しお読んでたずめる、発衚・共有化する、気づきを深める察話をするずいうプロセスを通しお、著者の䌝えようずするこずを深く理解でき、胜動的な気づきや孊びが埗られたす。 たたグルヌプでの読曞ず察話によっお、䞀人䞀人の胜動的な読曞䜓隓を掛け合わせるこずで孊びはさらに深たり、新たな関係性が育たれおくる可胜性も広がりたす。 匕甚元: https://www.abd-abd.com/ 進め方 おおたかな流れは以䞋のずおりです。 1冊の本を耇数人で分担しお読む それぞれが読んだパヌトを芁玄する 芁玄した内容を順番にプレれンする 感想や疑問点に぀いお話し合う 振り返りする これによっお1人で読曞をするよりも短い時間で内容を把握でき、たた参加者それぞれの芖点や考えから倚くの気づきが埗られたす。 メリット たた、同サむトにはABDの8぀のメリットも玹介されおいたす。 短時間で読曞が可胜 サマリヌが残る 蚘憶の定着率の高さ 深い気づきず創発 個人の倚面的成長 共通蚀語が生たれる コミュニティ䜜り 䜕より楜しい ただABD公匏のマニュアル191017ABDマニュアルver1.5: 公匏サむトからダりンロヌドできたすに蚘茉されおいる暙準的な進め方はオフラむン前提で、か぀時間もチェックむン・チェックアりトを含めるず150分皋床ずそれなりのボリュヌムです。 以䞋は公匏マニュアルに蚘茉されおいるアゞェンダです。 1.オヌプニング (20分~) 1-1.チェックむン(1分×人数) 1-2.オリ゚ンテヌション (10分) 2.メむン (120 分~) 2-1.サマラむズ(30~60分) 2-2.リレヌ・プレゼン (2~3分 × 人数) 2-3.ダむアロヌグ (30~60分) 3.゚ンディング(10分~) 3-1.チェックアりト(1分×人数) 䞀方でリモヌト(私)ずオフィス組(京郜メンバヌ)ずのハむブリッドな環境であるこず・業務時間内に実斜するこずを考慮するずそのたた珟圚のプロゞェクトに適甚するのは難しそうです。 公匏マニュアルには以䞋のような蚘茉もあるため、自分達に合った進め方に倉えおみるこずにしたした。 ※䞊蚘は、スタンダヌドな時間ず進め方を蚘入しおいたす。時間は本の内容や人数芏暡によっお倧きく 倉わりたす。たた、珟圚でも、様々な工倫やパタヌンが誕生しおいたす。ぜひ皆さんもこの型にこだわらず、 工倫しおみおください。そしお良いものが生たれたら、ぜひ教えおください。 実際の進め方 前提ずしお拠点が東京ず京郜に分かれおいるためリモヌトで実斜したした。 ツヌルはNotionずGoogle Meetを利甚し、勉匷䌚のアりトプットはNotionに集玄しおいたす。 事前準備ずしおはファシリテヌタヌがNotionに勉匷䌚のペヌゞを䜜成し、目的・進め方・察象曞籍たたは察象資料・感想欄などを蚘茉しおおきたすテンプレヌト化するず良さそうです。 たた、少しでも倚く読曞や議論のための時間を確保するため、参加者の担圓ペヌゞも「XXさんはP10〜P30たで」など具䜓的に決めおおきたす。 参加者は事前準備は䞍芁ずしたした。 おおたかな流れは以䞋のずおりです。 1. 目的の共有、進め方の説明 5分 2. 読み蟌みタむム 15分 3. リレヌ・プレれン 25分(5分目安×5人) 4. ダむアロヌグ 15分 私達の堎合は普段から同じチヌムで働いおいるずいうこずもあり、チェックむン・チェックアりトは省略したした。プレれンやダむアロヌグを掻性化したい堎合や別チヌムのメンバヌやいろんな䌚瀟の参加者がいる堎合など参加者の属性やチヌムの状況に応じお倉えた方がよいずは思いたす。 党䜓の時間に぀いおも怜蚎したしたが、リモヌトでの長時間の勉匷䌚は集䞭力が続かずダレおしたう可胜性もあるので、60分で実斜しおみるこずにしたした。 ただ60分で1぀のコンテンツを読み切るのは難しいこずが倚いため、その堎合は2〜3回に分けお実斜しおいたす。参加人数やコンテンツの内容にもよるかもしれたせんが、リモヌトの堎合は1回の時間は長くおも90分くらいが限床かなずいう印象です。 たた、時間が限られおいるこずや各自が担圓するペヌゞ数を少なめに蚭定したこずから、読んだ内容の芁玄は省略し盎接ペヌゞ内容を画面共有しながら説明する圢匏を採甚したした。 事前に準備したアゞェンダ もう䞀぀倧きく倉えたポむントずしお、発衚者以倖のメンバヌはプレれンを聞きながら気になった郚分や共感したポむントに぀いおNotionにメモを取り、最埌のダむアロヌグの時間でそのメモに察しおさらに各自がコメント(Notionのコメント機胜)をする圢匏にしたした。 疑問点や共感ポむントずそれらに察するコメント 効果 良かった点は以䞋のずおりです。 気になっおいたコンテンツを短時間で読み蟌めた あらためお他の人に説明するこずで理解が深たった 他の人の意芋や考えを聞くこずで新たな気づきが埗られた グルヌプで同じものを読み、議論するこずで共通認識・共通蚀語ができた 他の人の説明を聞きながら自分の感想や疑問をコメントする圢匏だったので集䞭しお聞くこずができた 他のメンバヌからもポゞティブな意芋が倚く、やっおみお良かったなず思っおいたす。 改善点があるずするず、参加者がオンラむンでのワヌクショップのような高い熱量にはならなかったずいう点です。コミュニティ䜜りを目的ずする堎合はもう少し党䜓の時間を長くずり、チェックむン・チェックアりトも十分に行った方が良いかもしれたせん。 参考: 実際に䜿った資料 実はここたで玹介したカスタマむズ版ABDでは曞籍は䜿甚しおおらず、Web䞊に公開されおいるスラむドなどの資料を䜿甚したした。実際に䜿甚させおいただいた資料の䞀郚を玹介したす。 speakerdeck.com 株匏䌚瀟コパむロツトさんが公開しおいるスラむド。 リモヌトでの䌚議やプロゞェクトの進め方に぀いお、共通認識を䜜るために䜿甚したした。有料曞籍ずしお販売できそうな質ずボリュヌムです。リモヌトワヌクをしおいるすべおの人に読んでもらいたいくらいの神資料だず思いたす。 speakerdeck.com 東京倧孊の銬田さんが公開しおいるスラむド。 仮説怜蚌の進め方に぀いお、チヌム内での知識や考え方を揃えるために䜿甚したした。 こちらはご存じの方も倚いかず思いたすが曞籍も発行されおおり、より理解を深めるためにもあらためお曞籍版で実斜しおみたいず思っおいたす。 たずめ 以䞊、ABDを自分達の環境に合わせおカスタマむズした内容の玹介でした。 同じような課題に悩む皆さんの参考に少しでもなれたら幞いです。 今回は自チヌムのメンバヌのみでの実斜でしたが、業務で関わりのある他郚門のメンバヌず䞀緒に行なうこずで事業郚内での共通認識や共通蚀語を䜜ったり、瀟内での事業暪断的なコミュニティ䜜りにも掻甚できそうです。 そのうち公匏マニュアルに沿った圢オフラむンでのABDもやっおみたいなず思いたすので、瀟内倖問わずこの蚘事を読んでABDに興味を持たれた方はぜひお声がけください。
䜕をしたのか やったこず 前提 0. ねんのためステップ1〜10を確認 1. braking changes x eslint 1-1. eslint-plugin-vueの導入 1-2. 自動修正 1-3. ルヌルの䞀時緩和 1-4. 残りを手動修正 2. Vue䟝存パッケヌゞのアップグレヌド Nodeをアップグレヌドしおおこう 3. Migrate Buildを陀去 4. 動䜜確認 5. リリヌス おたけ どれだけかかったの おたけ vue-i18nに぀いお 〆 毎床どうも。 BALES CLOUD 以䞋BC゚ンゞニアのおぃがです。 Vue2のEOL が昚幎末に過ぎ去りたしたね。 BCもそれに䌎っお、フロント゚ンドのVue3ぞの移行を完了したした。 今回はその移行に぀いおお話ししたす。 䜕をしたのか 「移行ビルドを陀去しお、完党にVue3で動く状態にする䜜業」です。 Vueの移行ビルドに぀いおはこちらの蚘事をご参照ください Vue3にアップグレヌドしおフロント゚ンドを改善した話 - SMARTCAMP Engineer Blog ポむントを先に曞いおおきたす。 できるだけ、先にNodeをアップグレヌドしおおこう Element Plusには芁泚意 eslint-plugin-vueを掻甚しよう 「どうなればリリヌスしおいいのか」をしっかり握っおおこう 工数をたっぷり準備しよう やったこず braking changesぞの察応 eslintによる自動察応 手動察応 Vue䟝存パッケヌゞのアップグレヌド Migrate buildの陀去 動䜜確認 リリヌス 前提 移行䜜業は、基本的に公匏の アップグレヌドのワヌクフロヌ に埓いたす。 今回は移行ビルドの導入が完了しおいるため、ステップ11からの開始です。 たた、移行䜜業はメむン担圓者1人ずその時々に手の空いおいるメンバヌで察応したした。党䜓の䜜業量ず効率のバランスをずった圢です。 初期段階でわかった䜜業量を元にタスクを分割し、そのうちのいく぀かを他のメンバヌに察応しおもらいたした。 詳しくは埌述したすが、移行ビルドは砎壊的倉曎に1぀ず぀察応できるように蚭蚈されおいるため、タスクもこの粒床にあわせるこずで容易に分割できたした。 0. ねんのためステップ1〜10を確認 移行ビルド導入時の詳现な䜜業蚘録が芋぀けられなかったのもあり、䞀応確認したした。 こういう䜜業は面倒でも1぀ず぀察応した方が、のちに「党然ダメだけど䜕が問題なのかわからん」ずならずおすすめです。 今回はステップ8が未察応だったので、ここで察応したした。 1. braking changes x eslint 砎壊的倉曎を察応しおいきたす。 eslint-plugin-vue のVue3察応版ルヌルを掻甚するず、䜜業を効率化できたす。 eslintに぀いおの説明は割愛させおいただきたす。ざっくりいうずコヌドの静的解析です。 䜜業は以䞋の流れです。 eslint-plugin-vueの導入 自動修正 ルヌルの䞀時緩和 残りを手動修正 1-1. eslint-plugin-vueの導入 通垞通り yarn add でプラグむンを導入し、蚭定を曞きたす。 BCでは、eslintのルヌルは各皮プラグむンの掚奚に埓うずいう方針を蚭けおいたす。 よっお今回は vue/vue3-recommended を蚭定したした。 .eslintrc.js extends : [ 'plugin:vue/vue3-recommended', ] , 1-2. 自動修正 eslint --fix を実斜したす。 これだけで䞀郚の砎壊的倉曎が自動で修正されたす。すばらしい。 1-3. ルヌルの䞀時緩和 さお、この時点で eslint をかけるず、倧量のerrorが発生したす。 vue/vue3-recommended がVue3の砎壊的倉曎をerrorずしお定矩しおいるためです。 errorの出おいるルヌルをメモしおおき぀぀、Vue3関連はいったんすべおwarnに蚭定したす。 Vue3関係なくerrorになっおいるルヌルもありたしたが、説明割愛。 .eslintrc.js rules : { 'vue/no-deprecated-destroyed-lifecycle' : 'warn' , // ... } , 1-4. 残りを手動修正 ここが䞀番時間ず根気のいる䜜業です 砎壊的倉曎を1぀ず぀修正しおいきたす。 砎壊的倉曎のリスト ず errorの出おいたルヌル を突きあわせお確認しながら進めたす。 各砎壊的倉曎ごずの䜜業手順は、ざっくり以䞋のような感じです。 1: 察応するeslintルヌルをerrorに戻す eslintrc.js rules : { // 'vue/no-deprecated-destroyed-lifecycle': 'warn', // 䞀時緩和を解陀 // ... } , 2: 砎壊的倉曎の修正 3: eslintでerrorにならないこずを確認 4: 移行ビルドの グロヌバル蚭定 で該圓機胜の互換を無効化し、動䜜確認 main.ts configureCompat ( { OPTIONS_BEFORE_DESTROY: false , OPTIONS_DESTROYED: false } ) すべおの互換凊理を無効化したら完了です。 2. Vue䟝存パッケヌゞのアップグレヌド Vue2に䟝存しおいるパッケヌゞをVue3察応版にアップグレヌド、たたは代替パッケヌゞぞリプレむスしお陀去したす。 package.jsonのパッケヌゞを1぀ず぀、 真心蟌めお 䟝存性をチェックしたす。 「Vue3で動かなくなるかどうか」は案倖npmの䟝存性だけでは刀断が぀かないので、その時は各公匏のリリヌスノヌトずかを芋たしょう。 察応した限り、䞀定のバヌゞョン以䞊からVue3に察応しおいるものが倚かったです。 察象のパッケヌゞがわかったら、パッケヌゞごずの察応内容アップグレヌドorリプレむスを決め、察応しおいきたす。 アップグレヌド時に砎壊的倉曎があれば、それも察応したす。 この際、「いらないパッケヌゞは単玔に陀去する」ずいう遞択肢も持぀ず良いです。将来のメンテナンスコストが安くなりたす。 芁泚意事項ですが、名前に vue が぀いおいるパッケヌゞ以倖も、Vueのバヌゞョンに䟝存しおいるこずがありたす。 各皮SaaS甚のラむブラリなどが入っおいる堎合は芁泚意です。BCではbugsnagなどが動かなくなりたした。 Nodeをアップグレヌドしおおこう ちなみにですが、BCでは圓時Node14が利甚されおいたした。 もちろん、これがたずいこずはわかっおいたす。 これにより、䞀郚パッケヌゞでは䞀定バヌゞョン以䞊からNode14のサポヌトが終了しおおり、アップグレヌドできないずいう問題が起きたした。 BCではこのずき、Vue3察応を優先するため、Nodeのアップグレヌドは埌回しにするこずを決定したした。 圱響のあったパッケヌゞは、Node14サポヌトか぀Vue3察応の最䜎バヌゞョンたでアップグレヌドするこずで、なんずか察応できたためです。 しかし、これは圓時の話です。 珟圚も、さたざたなパッケヌゞでNode14/16のサポヌトが終了し぀぀あり、Nodeのアップグレヌドを埌回しにするこずはより困難になっおいるず思われたす。 よっお、Vue3アップグレヌドの前にNodeのアップグレヌドを完了するこずを匷く掚奚したす。 たた、「察応できた」ず蚀ったものの、実はi18n関連の最新化のみこの問題によっお察応しきれたせんでした。 幞いクリティカルな問題ではなかったため、Nodeのアップグレヌドず合わせお埌回しずするこずになりたした。これはおたけずしお埌述したす。 3. Migrate Buildを陀去 ここたでの察応で、Vue3ぞの移行は完了したした。 最埌に、パッケヌゞ @vue/compat を陀去したす。 BCでは、ワヌクフロヌのステップ4で察応した型の加工を陀く必芁もありたした。 この䜜業が完了した時点で動䜜確認し、察応挏れを぀みずりたす。 BCでは、 Element Plus が倧問題を匕き起こしたした...。 実はこのパッケヌゞ、移行ビルドに察応しおいたせん。 うたく動かない箇所を個別に察応しおなんずか動䜜させおいたため、その察応を陀くずいう䜜業が必芁でした。 4. 動䜜確認 テストフェヌズです 動䜜確認の前に、「これをクリアすればリリヌスできる」ずいう基準を蚭けおおきたす。 サヌビスにずっお「クリティカルな問題」がなければリリヌス可胜、ずいう基準になるかず思いたす。 これがなんなのかはサヌビスによっお異なりたすが、䟋えば、ログむンができない、商品が衚瀺されない、などです。 基準が決たったら、たずはチヌム総動員で動䜜確認をしたす。 今回の圱響範囲はフロント゚ンド党般であるため、人海戊術が効きたした。 怜蚌甚環境で、ずくにテストケヌスは甚意せず、党員でいわゆるアドホックテストを実斜したす。 その結果をたずめ、修正、再床党員で動䜜確認...ずいうサむクルを、クリティカルな問題がなくなるたで回したす。 次に、本番盞圓環境での動䜜確認をしたす。 サヌビスに「各皮SaaS甚のラむブラリ」など、本番でしか動かないツヌルが入っおいたせんか 忘れずに動䜜確認したしょう。いや、本圓に...🀕。 5. リリヌス お疲れ様です、リリヌスです 圱響範囲が広いため、できるだけナヌザヌのいない時間垯にリリヌスするずよいです。 リリヌスが枈んだら速攻で動䜜確認、あずはお祈りに移行したす。 この時点でいくら頑匵っおいおも、现かなバグは出るものです。 くよくよするよりも、なるべく早くバグを発芋し、修正、速やかにリリヌスするこずに泚力したしょう。 前述の通り bugsnag などのツヌルを入れお、゚ラヌを監芖できる状態を䜜っおおくのが吉です。 おたけ どれだけかかったの 䞞䞉か月です。 移行ビルド陀去の調査開始からリリヌスたでに、これだけかかりたした。 通垞業務ず䞊行し、䞻に空き時間に察応しおいたこずもありたすが、軜くない工数だず思いたす。 芚悟ず準備の䞊で臚みたしょう。 おたけ vue-i18nに぀いお 前述の通り、i18n関連の最新化のみ埌回しにするこずになりたした。 さっくりずだけ觊れたす。 あなたの環境に @intlify/vue-i18n-loader や vue-cli-plugin-i18n が入っおいるなら、その構成は叀いです。 前準備ずしお、Nodeをアップグレヌドしたす。 Node14や16が入っおいたら、最䜎でも18たで䞊げたしょう。 i18n関連のパッケヌゞがNode18以䞊にしか察応しおいないためです。 今䞊げるならNode20くらいがおすすめです。 準備が敎ったら、i18n関連の構成を最新にしたしょう。 BCではこうしたした。 Before After BCでの圹割 vue-i18n vue-i18n i18n core @intlify/vue-i18n-loader @intlify/unplugin-vue-i18n i18n蚭定をファむルから読み蟌めるようにする vue-cli-plugin-i18n @intlify/eslint-plugin-vue-i18n i18nの静的怜査 〆 たずめおさらいです できるだけ、先にNodeをアップグレヌドしおおこう Element Plusには芁泚意 eslint-plugin-vueを掻甚しよう 「どうなればリリヌスしおいいのか」をしっかり握っおおこう 工数をたっぷり準備しよう いろいろ曞いおきたしたが、䞍可胜なほど難しいこずはなく、地道にやれば必ず完遂できたす。 なにより、静的怜査はあなたの味方です。eslintを信じ、䞀緒に歩みたしょう。 今回は觊れたせんでしたが、Vue3にはComposition APIをはじめずした玠敵な新機軞がたくさんありたす。 早くこちらの䞖界に来おください。お埅ちしおおりたす 以䞊です。お読みいただきありがずうございたした
ご挚拶 これたでの経歎ず出向に至るたで 新卒でSIerぞ マネヌフォワヌドぞ転職 そしお、スマヌトキャンプぞ出向 スマヌトキャンプにゞョむンしおみお ナヌモア溢れる開発チヌム オンボヌディングでの有り難いサポヌト 2ヶ月半でYATTEKITAこず チヌムゞョむン埌に意識しお取り組んだ7぀のこず 1. レスポンスのスピヌド感 2. Slackでのリアクション・スタンプ、ピアボヌナスの掻甚 3. チヌムメンバヌずの1on1 4. ドキュメントづくり 5. 気づきの䞁寧な共有ず、仕組み化の提案・実行 6. マネヌフォワヌドずの積極的な連携、グルヌプ知芋の有効掻甚 7. なんでもござれの姿勢 チヌムの皆さんからの反応 これからYATTEIKUこず ずある新芏PJの成功ず組織づくり IPOに向けお たずめ ご挚拶 はじめたしお2024幎1月にゞョむンしたした 黒沢 です スマヌトキャンプでは、 BOXIL SaaS の開発に携わっおおりたす。 今回は入瀟出向!?゚ントリずいうこずで、 簡単な経歎や、スマヌトキャンプにゞョむンしおみおどうだったか、 入瀟しお2ヶ月半でやっおみたこず・これからのこずなどをご玹介できればず思いたす。 ゞョむンしおすぐに取り組んだこずは、この春に異動や転職をする方にも参考になれば幞いです。 これたでの経歎ず出向に至るたで たずは、簡単に珟圚たでの経歎を玹介したいず思いたす。 新卒でSIerぞ 新卒では、倧手SIerに入瀟したしお、システム゚ンゞニアSEずしお政府系金融機関や䞭倮省庁向けの実蚌実隓やシステム開発に携わりたした。 小さな技術怜蚌案件から重厚長倧な幎単䜍のプロゞェクトたで、芁件定矩・蚭蚈・実装・詊隓・保守運甚を幅広く経隓したした。 そんな䞭、瀟倖の勉匷䌚に参加したり、ベンチャヌ䌁業で楜しく働く友人の声を聞いたりする䞭で、埐々に倖の䞖界にも目を向けるようになり、勇気を持っお新しい環境ぞ飛び出す決意をし、転職掻動を始めたした。 マネヌフォワヌドぞ転職 事業䌚瀟で゚ンゞニアをやっおみたいずいう思いや、家蚈簿アプリ「 マネヌフォワヌド ME 」のリリヌス圓初からのナヌザヌであり、そのミッションやビゞョンぞの共感から、マネヌフォワヌドにゞョむンしたした。 入瀟圓初は、バックオフィス向けSaaS領域においお、「 マネヌフォワヌド クラりド勀怠 」のサヌビス立ち䞊げに、゚ンゞニアずしお携わりたした。 その埌は、「 マネヌフォワヌド クラりド絊䞎 」の機胜開発や、「 マネヌフォワヌド クラりド人事管理 」のリリヌスにも関わり぀぀、QA組織䜜りやSREの導入を進めながら、゚ンゞニア組織の急拡倧を䞻導し支えるべく、プロダクト開発チヌムのリヌダヌや、郚長ずしお゚ンゞニアリングマネヌゞャヌの圹割に邁進したした。 このあたりの詳しい内容は、マネヌフォワヌドの゚ンゞニアブログやnoteに投皿しおおりたすので、是非ご芧ください。 HR領域急拡倧で爆誕立ち䞊がったQA・SRE組織や新サヌビスをふりかえる。Money Forward Developers Blog なぜ いたHR領域でQA組織を立ち䞊げるのか立ち䞊げに蟌めた想い - note そしお、スマヌトキャンプぞ出向 マネヌフォワヌドでの経隓は、そのフェヌズでしか䜓隓し埗ない貎重なもので、どれも玠晎らしい財産になりたしたそしお、もはや戊友ずも蚀える皆さんず出䌚えたこずに䜕よりも感謝しおいたす。 しかしながら、育䌑取埗を経お、マネゞメント局の採甚も進み、䞀定の目凊が぀いたこのタむミングで、次の方々ぞバトンを枡し、新たな機䌚をいただくこずにしたした。 スマヌトキャンプを含むマネヌフォワヌドグルヌプは、党䜓で2100名を超える組織芏暡であり、グルヌプ内でのチャレンゞ機䌚も倚数ありたす。今回は、私も瀟内での異動だけでなく、グルヌプ䌚瀟ぞの参画ずいう遞択肢も含めお怜蚎し、2024幎1月にスマヌトキャンプぞ出向ずいう圢でゞョむンするに至りたした。 組織の芏暡や文化、技術スタック、事業領域など、マネヌフォワヌドでの経隓ずはたた異なる挑戊ができるず感じおおり、新たなステヌゞにワクワクしおいたす。 スマヌトキャンプにゞョむンしおみお 珟圚は、 BOXIL SaaS の開発チヌムにゞョむンしお、半分プレむダヌに戻ったような状況です。たずは、そこで感じたこず・有り難いず思ったこずを簡単に共有したいず思いたす。 入瀟のお祝いケヌキをボスが甚意しおくださったものの 家族党員で䜓調を厩しおしたい参加できなかった懇芪䌚の䞀幕 ナヌモア溢れる開発チヌム ゞョむンしおみお、たず感じたのは、りェットな組織雰囲気の䞭で、非垞にナヌモアがあふれるチヌムだずいうこずです。 20代〜30代前半を䞭心ずした若いメンバヌで構成されおいたすが、リモヌトワヌクでもオフィスでも、い぀も冗談が飛び亀い、笑いの絶えないチヌムで、ずおも楜しく思いたす。これは、チヌムメンバヌの個々の人柄や、チヌムの文化によるものだず思いたすが、それが盞談しやすい雰囲気や、スムヌズなコミュニケヌションに぀ながっおおり、少なからず゚ンゞニアリングにも良い圱響を䞎えおいる郚分もあるず感じおいたす。 加えお、オフィスに出瀟する機䌚をより有意矩に掻甚しようず、出瀟日には技術遞定の議論やワヌクショップの䌚などをメンバヌ同士で䌁画しお取り組んでいたす。これは、仕事を楜しむ姿勢ずいう点でも刺激になっおいたす。 オンボヌディングでの有り難いサポヌト 私自身、久しぶり玄3幎ぶりにプレむダヌの圹割にも入るずいうこずで、感芚を思い出すこずに苊劎したした。 そんな䞭、 braavaさん をはじめずするチヌムメンバヌの皆さんが、䞁寧にサポヌトしおくれたこずが、非垞に有り難かったです。 たた、チヌムには、単なるドキュメントだけなくFigma䞊に図を曞いお互いに共有する文化些现な課題でも図瀺しおいく姿勢でいくから、認識ズレを起こしにくいや、気軜にペアプロをしおいく文化もあり、キャッチアップに非垞に圹立ちたした。 最初の頃のペアプロでは、たるでリハビリをしおいるような状態で申し蚳なかったですが、話しながら抂芁をおさえ、実際のコヌドを远っお理解を確かめながら、加速床的にキャッチアップが進みたしたし、皆さんのサポヌトのおかげで、少しず぀ですがプレむダヌずしおの感芚を取り戻しおいるず思いたす。 今埌は、SaaS Marketing領域のドメむン知識や、新しい技術スタック特にフロント゚ンドに぀いおも、議論に远い぀けるよう粟進しお参りたいず思いたす 2ヶ月半でYATTEKITAこず チヌムゞョむン埌に意識しお取り組んだ7぀のこず 新しい組織やチヌムに移るこずは久しぶりだったため、自分の䞭で意識しお取り組んでいたこずがありたす。 これらは、自分自身のキャッチアップや初期の信頌獲埗ずしおも、倧事なこずのひず぀かず思いたすので、 異動や転職をする方にずっおも、参考になればず思い、ここでご玹介したす 1. レスポンスのスピヌド感 Slackでメンションをもらったもの・もらっおないけど自分に関係ありそうに感じたものは、できるだけ早く返すようにしおいたした。 チヌムにゞョむンするず、アカりント発行埌のログむン確認や、資料の確認などオンボヌディング䞊の现かな察応があるず思いたすが、それらに察しおもできるだけタむムリヌに返すようにしおいたした。 たた、「ざっず確認しお内容に぀いお䞍明点があるずきには、返答の䞭で質問する自分がボヌルを持たない」「すぐ確認できないずきは、確認できる時間の目凊を䌝える」など、瀟䌚人1幎目に戻った぀もりで意識したした。 2. Slackでのリアクション・スタンプ、ピアボヌナスの掻甚 レスポンスの早さず近い郚分ですが、チヌムメンバヌの投皿に察しお、いちはやくスタンプを抌すこずで、盛り䞊げ圹ずなり、自分の存圚をアピヌルするようにしおいたした。必芁に応じお、Slackにスタンプも远加しおみたした。 これは、リモヌトワヌクが䞻䜓ずなる働き方であるチヌムにおいおは、新参者の自分が盞手に察しお気持ちや奜意䞀緒に頑匵っおいきたい気持ち・貢献欲を瀺す機䌚のひず぀ずしお有効だず思っおいたす。そしお、ゞョむンしたタむミングに限らずですが、盎接盞察しおいないリモヌトワヌクでは、返信などのリアクションをするずきは、3割増くらいで気持ちを蟌めるのがちょうど良いず考えおいたす。 たた、ピアボヌナスず呌ばれる「埓業員同士がお互いに仕事の成果や貢献に察しお賞賛したり認めたりするだけでなく、それずずもに少額の報酬を送り合う仕組み」が導入されおいるため、オンボヌディングなどのサポヌトをいただいたずきは、隙かさず感謝を䌝えるようにしおいたした。こうしたツヌルも組み合わせお掻甚するこずで気持ちを䌝えるハヌドルも䞋がる気がしおいたす。 3. チヌムメンバヌずの1on1 メンバヌの皆さんずの盞互理解を深めるため・プロゞェクトや組織の状況をより正確に把握するために、1on1をお願いしたした。 1on1では単玔な自己玹介だけでなく、 スキキラむマップ ずいったコンテンツを甚意しお、より有意矩に深く理解しおいくための流れを䜜りたした。 たた、1on1を自分だけの堎にするのではなく、盞手からの盞談や質問がないかを必ず毎床確認したした。些现なこずでも良いので、䞀緒に䜕かを考えおいくキッカケにしたいず思っおいたした。 4. ドキュメントづくり オンボヌディングの流れや、取り組んでみたタスクの䞭で䞍足しおいたドキュメントや、敎備されおいないフォヌマットなどがあれば、たたき台を積極的に䟋瀺しお共有したした。 意倖ずメンバヌの皆さんには新しい芖点だったり、資料化を忘れおいる内容だったりするこずがありたす。 5. 気づきの䞁寧な共有ず、仕組み化の提案・実行 ゞョむンしたチヌムでは、毎週振り返りの時間があり、KPTを䜿った手法で実斜しおいたした。 これたでの経緯や背景知識が少ない状態なので、フラットな目線でチヌムに新たな気づきを䞎えやすいず思いたすので、玠盎に提案しおいきたした。 䞀方で、既存のメンバヌから芋れば、いたの仕組みやルヌルを批刀されおいるず感じやすい堎合もあるので、内容によっおは䞁寧に経緯を確認・質問するような投げかけをする方が良いこずもありたす。せっかく築いおいる小さな信頌関係をより倧きく育おるためにも倧切な芖点だず思いたす。 たた、気づきに察する具䜓的な解決策仕組み化などの提案も、これたでの経隓を元に行いたした。さらに、解決策ずしおのTRYをチヌムずしお合意したら、アクション実行のボヌルも自分が持぀ようにしお、口だけで終わっおしたわないようしたした。 6. マネヌフォワヌドずの積極的な連携、グルヌプ知芋の有効掻甚 せっかくグルヌプ䌚瀟間で異動しおいるため、それを掻かすためにマネヌフォワヌドでの経隓や事䟋を、タむミングを芋お共有するようにしたした。 加えお、新芏PJが始たるタむミングでもあったため技術遞定の堎面などにおいおは、マネヌフォワヌドずのSlack共有チャンネル技術領域ごずに盞談や知芋共有をする堎で私から質問を投げかけおみたり、特定の技術スタックに詳しいメンバヌに繋いだり、ずいった「橋枡し圹」を意識したした。 グルヌプ䌚瀟ず蚀えど、組織が異なるず最初の盞談や質問のハヌドルはやはり高く感じるものです。耇数の組織に跚っおいる自分が、その最初のステップを軜くするような行動をずるこずで組織間の亀流も進むものだず思いたす。 7. なんでもござれの姿勢 最埌は、取り組みではなく姿勢のお話ですが、「これをやりたい」「これはやりたくない」ずいう遞り奜みせずに、手を挙げる・銖を突っ蟌んでみる・䟝頌を受けたら断らない無理のない範囲でwずいう姿勢で業務に入りたした。 自分自身がもずもず責任領域や仕事内容に察しお、匷いこだわりを持぀方ではないずころもあり、プレむダヌずしおの機胜開発だけなく、瀟内の問い合わせ察応や、採甚掻動、その他組織運営に関わるこずなど、比范的幅広く取り組めたした。 そうするこずで、技術的な理解やドメむン知識が深たるだけでなく、この事業に関する業務の党䜓フロヌはどうなっおいるのか、い぀も他郚眲ずどのように連携しおいるのか、ずいったこずを点ず点が線になり、面になりより早くキャッチアップできたず思いたすし、課題発芋・改善提案もしやすくなるず感じおいたす。 チヌムの皆さんからの反応 メンバヌの皆さんずの1on1などでいただいた反応やフィヌドバックずしおは、以䞋のようなものがありたした。 これたで曖昧だった課題がハッキリしお、仕組み化が進んだ。 グルヌプ間の知芋共有が有り難い。繋がりができた。 課題を提起するずきの、コミュニケヌションの仕方が勉匷になる。 マネゞメント経隓者がプレむダヌに入ったこずで、䞭間的存圚ずしお1on1などで盞談しやすい。 いたたで玠通りしおいたずころ、手に負えないずころずなっおいた課題の発芋・拟い䞊げが進んだ。 チヌム党䜓でSlackでのリアクションが増えた気がする。 ずいうようなポゞティブなコメントをいただきたしお、プロゞェクトや組織に少しでも良い圱響を䞎え、ちょっずず぀信頌獲埗もできおいそうで、良かったです。 新しい組織に入るのは緊匵もしたすし、プレッシャヌもあったので、新参者ずしおはホッずひず安心です これからYATTEIKUこず 今埌は、以䞋のこずに特に泚力しおいきたいず思いたす ずある新芏PJの成功ず組織づくり スケゞュヌルがずおもタむトですが、ナヌザヌに向けお良い䟡倀が提䟛できるようになり、技術的にも新しい取り組みや負債の解消にも繋がるプロゞェクトです。これをチヌムの皆さんずずもに成功させるために、あらゆる取り組みを行っおいきたす。 たた、盎近で少しず぀チヌムの人数を増えおきおいお、これからもゞョむン予定のメンバヌが決たっおいるずいう状況で、組織拡倧が進んでいたす。そんな䞭でより自己組織化され、成果を出せるチヌムを䞀緒に䜜りたいず思っおいたす。 IPOに向けお CEOの林から発衚しおいるずおり、 スマヌトキャンプはIPOを目指しおいたす。 こちらに向けたシステム関連の課題敎理や仕組み化などに取り組んでいきたす。泥臭いずころを含めお敎えるのは奜きなので、どんどんやっおいきたいず思いたす。 たた、IPOは目指す䞭では、それのみが目的ではなく、䞖の䞭ぞの良い圱響事業成果を加速させる手段であるず認識しお、党䜓を俯瞰しお取り組むこずを忘れないようにしおいきたいです。サヌビス開発・運甚䞊の成果だけでなく、ビゞネス党䜓の目線をも持っお、事業成果にも貢献しおいきたいず思っおいたす。そのためにも、たずはドメむン知識などのキャッチアップをがんばらねば たずめ 今回は、マネヌフォワヌドから出向した黒沢が、この2ヶ月半を振り返り、スマヌトキャンプにゞョむンしおみおの感想や、自分自身が入瀟圓初に意識しお行なった取り組みなどを入瀟゚ントリずしおご玹介したした。 これからも粟進しおたいりたすので、皆さんよろしくお願いしたす!!
はじめに 私の仕事内容 新卒入瀟から半幎間の振り返り キャッチアップが远い぀かず、タスクが遅れる 心がけたこず 幎霢差による意芋の遠慮 心がけたこず ドキュメントによるコミュニケヌションの難しさ 心がけたこず 成果 たずめ はじめに こんにちは開発゚ンゞニアの小宮です 私は 入瀟゚ントリ で、述べたずおり、 23幎新卒でスマヌトキャンプに入瀟し、早いもので半幎が経過したした。今回は、半幎間の振り返りを曞く機䌚をいただいたので新卒ならではの 挑戊や困難などに぀いお曞いおいきたいず思いたす。あたりテックな話は少ないかもしれたせんが、 最埌たでお読みいただけるず幞いです 私の仕事内容 私は、入瀟しおから BALES CLOUD 以䞋「BC」ずいう事業郚で゚ンゞニアずしお働いおいたす。業務内容は䞻に、新芏機胜の開発、テスト、バグ調査などの保守運甚開発です。 BCの゚ンゞニアチヌムは、瀟員が自分を含めお4人、業務委蚗の方が1人で構成されおいたす。 みなさん経隓豊富な方が倚く、私がみなさんに比べ䞀回りほど幎䞋ずいう、組織です。 新卒入瀟から半幎間の振り返り 新卒入瀟しお半幎間を振り返るず、倧きな悩みなどはなかったず思いたすが、新卒ならではの现かい課題にはたくさん盎面したした。 それらの課題に぀いお振り返っおみたいず思いたす。 新卒ならではの盎面した課題は以䞋の3぀です。 キャッチアップが远い぀かず、タスクが遅れる 幎霢差による意芋の遠慮 ドキュメントによるコミュニケヌションの難しさ キャッチアップが远い぀かず、タスクが遅れる 新卒研修が終わり、BCに配属埌にはじめお立おた目暙は、毎週のタスクを玄70%完了させるこずでした。これだけ聞くず、「70100が圓たり前じゃないの」ず思われるかもしれたせんが、 BCでは1スプリントを䞀週間で行ないその間に芁件の詳现決め、開発、テスト、レビュヌ、リリヌスを行ない、 耇数人が぀のタスクに携わるため、圓時のチヌムの完了率芋おも80皋床でした。 そのなかで70ずいう目暙を立おたのですが、圓初の私ずしおは「どうせやるなら100目指そう」ず思っおいたした。 ただBCの技術スタックは今たで觊れたこずがないものも倚く、キャッチアップしながらタスクを進めおいくずいう流れでした。 入瀟しお右も巊もわからない私は、たずはずにかくコミット量を増やしおいこうず思いたした脳筋その結果、配属盎埌はタスクの量や難易床が調敎されおいたので、コミット量だけで順調に進んでいたした。 しかし、タスクの量が増えたり、難易床が䞊がるず、完了率がだんだんず䞋がり、キャッチアップの時間もほずんど確保できず、タスクが遅れるこずが増えたした。 その時は、自分のかけれる時間をずにかくかけおもタスクが終わらないずいう状況に陥り、かなり焊っおいたのを芚えおいたす。 心がけたこず 䞊蚘の課題に察しおは、抜本的な解決策はなく、地道にタスクをこなしお少しず぀ドメむン・技術の理解を深めるしかないず思いたした。ただ、そのなかでも意識的にやっおいたこずが3点ありたす。 1点目は、最初から党郚をやろうずせず、段階を螏んでからタスク量を増やそうず決めたこずです。私の堎合は、コヌドレビュヌをするこずに配属圓時に倚くの時間を䜿っおしたっおいたので、 期限を決め、ある皋床業務に慣れるたで、担圓から倖れるようにを䞊長に盞談し、䞀定期間コヌドレビュヌから倖れたした。コヌドレビュヌを通じお、他の人のコヌドを芋るこずで、成長できるずいうメリットもあるず思いたすが、 私の堎合、新卒で技術もドメむンも知識が乏しい堎合は、ある皋床タスクベヌスでキャッチアップするこずの方が効率的だず感じたした。 点目は、技術のキャッチアップをする際に公匏ドキュメントを読むこずです。 私はもずもず技術曞などを読むこずに苊手意識があり、公匏ドキュメントを読むこずもなんずなく避けおいおネットにある蚘事やQiitaなどを読むこずやchatGPTに聞くこずが倚かったです。 しかし、トレヌナヌからのアドバむスもあり少しず぀公匏ドキュメントを読む癖を぀けおいきたした。読む習慣が぀いおからは開発で困ったずきに、自分の力で必芁な情報にたどり着けるようになったず思いたす。 3点目は、質問をする際にwhyを意識するようにしたこずです。スマヌトキャンプでは、新卒の゚ンゞニアにトレヌナヌずいう業務䞊のサポヌトしおいただける方が぀いおくれたす。 そのトレヌナヌに実装に関するこずを質問する際に、入瀟圓初は、自分で考えおわからないこずを、「どうやっお実装するのか」ずいうHowばかりきいおたした。 もちろんその圢匏の質問でも問題は解決されるので、満足感がありそれ以䞊調べたりせずにその堎しのぎで終わるこずが䜕床もありたした。その結果同じような質問を期間を開けおからたたしおしたうこずがありたした。 その経隓から質問する際には、「なぜそのような実装をするのか」どのような思考のプロセスでその実装にするかなど、答えだけではなく、答えに至るたでの過皋たで聞くようにしたした。 whyを意識しお質問するようになるず、自分ずの考えの違いや、プロセスを知るこずなり今たで以䞊に理解が深たるようになりたした。 幎霢差による意芋の遠慮 私が所属しおいるBCの゚ンゞニアチヌムは、冒頭でも少し述べたずおり゚ンゞニア経隓が豊富で、瀟䌚人経隓も長い方が倚く、私ずの幎霢差が少しありたす。 そのため私が配属したずきは、リファむメントやプランニングなどのスクラムむベントで、自分の意芋を遠慮しおいたした。コヌドレビュヌにおいおも、コメントを曞くのを遠慮しおいおLGTMおじさんになっおいたした。 理由ずしおは、幎霢差により過剰に技術・ドメむンの知識の差があるず考えおいお、自分が発蚀しおMTGを止めない方がいいのではないかずいう思いや、コヌドレビュヌでベテランだからこのような実装にしおいるかもしれないず考えおいたした。 心がけたこず こちらの課題に関しおも、抜本的な解決策はないのですが、どんな切り口でも良いので自分から関わっおいく意識を持぀ようにしたした。 たず、MTGにおいおは、質問ベヌスでもいいので発蚀するこず・ファシリなどを積極的に行なうこずをしおMTGに少しず぀参加しおいく意識を持぀ようにしたした。 その際に、どんな質問や意芋なども䞁寧に察応しおいただいたチヌムメンバヌの方々には感謝です。 たた、コヌドレビュヌにおいおも、なぜこのようなコヌドになったのかなどの質問曞くこずから始めたした。 そこからはじめ、今ではバグなどを未然に防ぐようなレビュヌもできるようになったず思いたす。 ドキュメントによるコミュニケヌションの難しさ 瀟内で利甚しおいるツヌルの分類 BCでは、連続した開発時間を確保するために䞀郚のMTGの非同期化しおいたす。 䞊の画像は緊急床や発散性に応じお、コミュニケヌションを取るツヌルを䜿い分ける際に参考にしおいる図です。 図から分かるように緊急床が高くないやり取りはドキュメントベヌスNotionでのコミュニケヌションが倚くなりたす。新卒ずしお入瀟した圓初、この取り組みにすぐには慣れたせんでした。 その時の私の思いずしおは、「ドキュメントベヌスでやり取りするより、盎接話した方が早く解決できるのではないか」ずいう疑問がありたした。 さらに、単玔にドキュメントを曞く習慣がなかったため、曞くこずに察する苊手意識がありたした。 心がけたこず たず、ドキュメントを曞く習慣を少しず぀身に぀けおいきたした。ただいきなり曞けず蚀われおも、どのようにを曞けばいいのかわからないので、ずにかく他の人のドキュメントを真䌌るずころから始めたした。 BCのチヌムの皆さんはドキュメントを曞くのが䞊手で、1人1人のドキュメントのスタむルが若干違うので、それを芋お良いず思った箇所を真䌌おいくこずで、自分も少しず぀曞けるようになっおきたした。自分はテヌブルなどの衚を甚いおドキュメントをたずめるのがかなりお気に入りですw。 たた、自分がドキュメントを曞けるようになっおくるずMTGの非同期化ぞの理解が深たっおきたした。開発時間の確保もそうですが、ドキュメントを曞くこずで自分の考えを敎理しおから䌝えるこずができ、 蚘録にも残るので埌から芋返すこずができるずいうメリットなどを感じるこずができたした。 成果 新人賞の景品 タスクの完了率は結果ずしお、目暙の70%を超えお、111に到達したした。さらに、FourKeysのリヌドタむムも86.9時間ずgoogleが定める ハむパフォヌマヌに分類される数倀 に到達したした。 その成果が認められ、幎に回開催されるスマヌトキャンプ党䜓のキックオフで新人賞をいただくこずができたした。䞭途の方々も察象になる䞭で賞をいただいお、自分が向き合っおきたこずをしっかりず認められたこずがずにかく嬉しかったです。画像は新人賞の賞品でいただいた本です。 ただ自分が遞ばれるず思っおいなかったので、衚地の堎にゞャヌゞで行なっおしたったこずが少し埌悔ですw。 たずめ 半幎間での振り返りをしおみるず、新卒ならではの課題にぶち圓たりながらも、それに察しお解決策を芋぀け、少しず぀成長できたず思いたす。 前期は自分自身のパフォヌマンスを䞊げるこずに必死でしたが、今期は䞻語を倧きくしお、チヌムのパフォヌマンスを䞊げるために行動しおいきたいず思いたす! たた、゚ンゞニアずしお技術的にむンパクトがあるこずにも挑戊しおいきたいず思いたすこれからもよろしくお願いいたしたす!!
どうも、職人です バヌゞョンアップなにそれおいしいの バヌゞョンアップの䜕が蟛い メむンタスクずの兌ね合い そのラむブラリがどこで䜿甚されおいるか バヌゞョンアップをしお問題ないだろうか バヌゞョンアップするずきの面倒な䜜業 どこを効率化できるだろうか Dependabot Dependabotを導入した結果 あれ、このラむブラリ既芖感あるな... GitHub Actionsで過去のPRを持る その結果 たずめ どうも、職人です スマヌトキャンプでBOXIL SaaSの゚ンゞニアをやっおたす職人こず袎田です 最近は趣味のサりナが奜きすぎお、熱波ずアりフグヌスに目芚めたした。 気が぀いたらずある枩济斜蚭で熱波垫ずしおデビュヌしたのをお知らせいたしたす。 そんなこずはさおおき、匊瀟サヌビスのBOXIL SaaSはRuby on Railsを䜿甚しお開発しおいたす。 サヌビス保守運甚に欠かせない䜜業ずいえばバヌゞョンアップですよね。 皆さん倧奜きバヌゞョンアップ䜜業を少し効率化した話を曞かせおいただきたす バヌゞョンアップなにそれおいしいの 「バヌゞョンアップずは、゜フトりェアのバヌゞョンを䞊げるこずです。」っおCopilotが教えおくれたした。 なんでバヌゞョンアップなんかしないずいけないんや っお思いたすが、バヌゞョンアップをしないずセキュリティリスクがあったり、新しい機胜を䜿えなかったり、開発䜓隓も悪くなる䞀方です。 デメリットしかないですね。 倧倉な䜜業ですが、サヌビスを保守運甚しおいくためには必芁な䜜業です。 バヌゞョンアップの䜕が蟛い バヌゞョンアップは䞀般的に埌回しにされるむメヌゞがありたすが、䜕がそんなに蟛いのか考えおみたした。 メむンタスクずの兌ね合い もちろんバヌゞョンアップタスクのために、メむンタスクをおざなりにするこずはできたせん。 効率化をしなければどうしおもバヌゞョンアップタスクは埌回しになっおしたいがちです。 そのラむブラリがどこで䜿甚されおいるか バヌゞョンアップ察象のラむブラリがサヌビスのどこで䜿甚されおいるかを確認する必芁がありたす。 䜿甚箇所が確認できなければ、動䜜確認察象もわかりたせん。 バヌゞョンアップをしお問題ないだろうか バヌゞョンアップをしたらokリリヌスしたヌす なんおこずはもちろんできたせん。 バヌゞョンアップをしたこずによっお、サヌビスに圱響がないか、バグがないかを確認する必芁がありたす。 バヌゞョンアップするずきの面倒な䜜業 たず䜕がバヌゞョンアップのネックになっおいるか、面倒な䜜業を考えおみたした。 どのラむブラリがバヌゞョンアップできるのか調査する 単玔に調査自䜓が面倒です。 䜿甚箇所を特定する バヌゞョンアップしたいラむブラリの䜿甚箇所を確認する必芁がありたす。 動䜜確認をする ラむブラリをバヌゞョンアップし、ラむブラリ同士の䟝存関係の解決したす。 それができたらラむブラリを䜿甚しおいる箇所の機胜が正垞に動䜜するか確認する必芁がありたす。 PRを䜜成する 匊瀟はGitHubを䜿甚しおいるので、バヌゞョンアップのPRを䜜成する必芁がありたす。 レビュヌする バヌゞョンアップのPRをレビュヌする(しおもらう)必芁がありたす。 リリヌスする バヌゞョンアップしたラむブラリをリリヌスしたす。 どこを効率化できるだろうか たず どのラむブラリがバヌゞョンアップできるのか調査する 䜜業をどうにかしたいので、GitHubが提䟛しおいるDependabotを䜿甚しおみるこずにしたした。 Dependabot Dependabot はラむブラリをバヌゞョンアップするPRを自動で䜜成しおくれるbotです。 BOXIL SaaSはRuby on Railsを䜿甚しおいるため、DependabotがGemfile.lockを監芖し、バヌゞョンアップが必芁なgemのPRを自動で䜜成しおくれたす。 こちら を参考に、 .github/dependabot.yml を䜜成したす。 version : 2 updates : - package-ecosystem : "bundler" directory : "/" open-pull-requests-limit : 5 # 䜜成するPRの最倧数を5に蚭定 schedule : interval : "daily" time : "10:00" timezone : "Asia/Tokyo" labels : - "レビュヌ求む" ignore : - dependency-name : "*" update-types : [ "version-update:semver-major" ] # メゞャヌアップデヌトは無芖する これで、毎日10時に5個のバヌゞョンアップのPRが䜜成されるようになりたした。 いきなりメゞャヌアップデヌトのPRが連続しお䜜成されるず、倧倉なのでいったん無芖するように蚭定したした。 Dependabotを導入した結果 どのラむブラリがバヌゞョンアップできるのか調査する PRを䜜成する ずいう䜜業はDependabotに任せるこずができたした。 しかし、PRは䞊がっおきたものの、そのPRのラむブラリはどこで䜿甚されおいるのかがわかりたせん。 こればかりはどうしようもないので、重い腰を䞊げお片っ端から確認するこずにしたした。 確認をしおいくうえで、PRのコメントに䜿甚箇所や動䜜確認に必芁な情報を曞き蟌んでいくこずにしたした。 あれ、このラむブラリ既芖感あるな... 同じラむブラリのバヌゞョンアップPRが䜕床か䞊がっおくるこずがあり、その床に「あれこれ前にもあったような」ず思いながら確認しおいるこずに気づきたした。 過去に察応した内容はPRのコメントに残しおいるので、それを確認すればいいのですが 「これ毎回過去のPRを持りにいくのしんどいな・・・」ず思ったので、この䜜業自䜓をGitHub Actionsで自動化できないか考えおみたした。 GitHub Actionsで過去のPRを持る 実珟したいこずは DependabotがPRをオヌプンしたタむミングでGitHub Actionsを実行する Dependabotが䜜成したPRのラむブラリのバヌゞョンアップを過去に行っおいるかを過去のPRを持っお確認する 過去に行っおいる堎合は、そのPRのリンクをコメントする になりたす。 GitHub Actionsで過去のPRを持るためには、GitHubのAPIを䜿甚する必芁がありたす。 こちら のペヌゞに䜿えそうなAPIがあったので、掻甚しおみたす。 そしお䜜ったのがこちらのGitHub Actionsです。 .github/workflows/fishing-for-past-upgraded-prs.yml name : Fishing for past upgraded PRs on : pull_request : types : - "opened" - "reopened" permissions : pull-requests : write jobs : fishing_for_past_upgraded_prs : runs-on : ubuntu-latest steps : - name : Add Links Comment uses : actions/github-script@v6 with : script : | const { owner, repo, number } = context.issue; const pr_title = context.payload.pull_request.title; const regex = /Bump (.*) from (.*) to (.*)/; const match = pr_title.match(regex); if (match) { const gem_name = match [ 1 ] ; let previous_prs = [] ; for (let page_number = 1; page_number < 11; page_number++) { const { data : prs } = await github.rest.pulls.list( { owner, repo, state : "closed" , sort : "updated" , direction : "desc" , per_page : 100 , page : page_number } ); const target_prs = prs.filter( (pr) => pr.title.includes(`Bump $ { gem_name } `) ) previous_prs = previous_prs.concat(target_prs) } if (previous_prs.length > 0) { let comment = "過去の関連PR: \n " ; previous_prs.forEach((pr) => { comment += `- [ #$ { pr.number }] ($ { pr.html_url } )\n`; } ); await github.rest.issues.createComment( { owner, repo, issue_number : number, body : comment, } ); } } 過去PRを釣り䞊げるずいうこずで、 fishing-for-past-upgraded-prs ずいう名前にしたした。 やっおいるこずを簡単に説明するず Dependabotが䜜成したPRのタむトルからラむブラリ名を取埗する 過去に䜜成したPRを曎新日時の降順で取埗する 過去に䜜成したPRのタむトルにラむブラリ名が含たれおいるものを抜出する 抜出したPRのリンクをコメントする ずいうこずをしおいたす。 このコヌドのポむントは2぀ありたす。 1぀目はGitHub APIが1回のリク゚ストで100件のPRしか返さないこずです。 BOXIL SaaSを管理しおいるGitHubリポゞトリではPRが玄10000件ありたす。 それらのPRをすべお取埗しおしたうず、1回のアクションで玄100回リク゚ストを送信するこずになり、時間がかなりかかっおしたいたす。 これでは珟実的ではないので、リク゚ストの回数は10回に制限し、1000件のPRを取埗するようにしおいたす。 1000件ずいうのは「1000件くらい持れば、過去のPR芋぀かるっしょ」くらいの感芚です。 仮に1000件を超えたずころにPRがあったずしおも、PRがコメントを通じお数珠぀なぎになっお蟿れるので、問題はなさそうです。 (健党にバヌゞョンアップ䜜業を続けられおいるのであれば、1000件より少なく、500件でも300件でも良さそうな気はしおいたす) 2぀目はpermissionsの蚭定です。 permissions: pull-requests: write この郚分です。 こちら を参考にpermissionsの蚭定をしないず、 RequestError [HttpError]: Resource not accessible by integration Error: Unhandled error: HttpError: Resource not accessible by integration このようにGitHubのAPIを実行したずきに゚ラヌが発生しおしたいたす。 レスポンスのHTTPステヌタスコヌドは403なので、閲芧暩限がないようです。 permissionsの蚭定をwriteずするこずで、PRぞの閲芧暩限を付䞎するようにしおいたす。 (readだずPRにコメントを曞くずきに、暩限がないず怒られたす) こちらを導入した結果、DependabotがPRを䞊げるず、過去に䜜成したPRのリンクがコメントされるようになりたした。 あくたで過去の参考情報なので鵜呑みにするのはよくありたせんが、 䜿甚箇所を特定する 䜜業に関しお、少し負荷の軜枛ができた実感がありたす。 その結果 前期ではバヌゞョンアップのためのノりハりを蓄積するずいう意味でひたすらにDependabotが䞊げたPRを察応しおいたした。 その結果6ヶ月間で40PRほど察応できたのですが、今期が始たっお2ヶ月ほどの間にすでに40PRほど察応できおいたす。 盎近のバヌゞョンアップの状況バヌゞョンに関わる郚分は黒塗りにさせおいただきたした。 ずはいえ、 Dependabotが䞊げたPRのみGitHub Actionsが実行されるようにする ラベルでGitHub Actionsの実行察象のPRかを刀別する などたたただ改善の䜙地はありそうです。 ちなみに Dependabotが䞊げたPRのみGitHub Actionsが実行されるようにする に関しおは、Dependabotではない誰かがPRを䞊げた堎合にも実行するようにあえお、DependabotによるPRの制限は行っおいたせん。 たずめ 明らかに状況が倉わっおきおいる実感があり、バヌゞョンアップ䜜業の定垞化に向けお倧きな前進になったず思いたす。 匕き続きバヌゞョンアップ䜜業を進めお、垞に最新のバヌゞョンを維持できるようにもっず効率化しおいきたいず思っおいたす。
たえがきのたえがき たえがき 入瀟半幎線 期埅ず䞍安の滑り出し BIぞの䞍信感を払拭 既存を倧事にしすぎた問題 各郚眲からのお䜿いク゚スト 転職を機に新しくはじめたこず 半幎のふりかえり SMARTCAMP AWARD 入瀟1幎線 淡々ずお仕事をこなす生掻 ゚ヌスの喪倱 1幎線をふりかえる SMARTCAMP AWARD 入瀟1幎半たで さらに淡々ずお仕事をこなす生掻 業務幅の広がり 入瀟1幎半ふりかえり SMARTCAMP AWARD 最埌に たえがきのたえがき 駅そばなどでよく芋かけるコロッケがのった酔狂なメニュヌ、コロッケそば。 ゞャガむモのホクホク感や肉の旚み、玉ねぎの甘み。そういったものが䞀切ない、よくわからないパサパサした食感の冷凍コロッケ、自称コロッケがのったコロッケそばこそが至高の存圚だず思う。 そしお正盎、どう食べたらいいのかわからない食べ物である。汁が染みないようにちょっず避けお食べるか、浞しお厩しお食べるか、半分だけ厩したり、がっ぀り底においお育おたり。 たえがき こんにちは、くたのみです。 以前はマッチングアプリの゚ンゞニアずしお働いおいたした。 スマヌトキャンプにはデヌタアナリストずしおゞョむンし1幎半が経ちたした。 ひずくちにデヌタアナリストずいっおも業務内容や必芁なスキルはコロッケそばの食べ方のように振れ幅があり、それぞれの䌚瀟の環境や事業フェヌズに合わせお、働き方を倉える必芁がありたす。 デヌタアナリストに求められるスキル 出兞デヌタサむ゚ンティスト協䌚 がくの入瀟ずずもにデヌタチヌムも動き出し、たたたたですが瀟内で評䟡しおいただく機䌚もありたした。ここたでの うたくいったこず 、 だめだったこず を含めおふりかえろうず思いたす。 個人的には成功䜓隓より倱敗䜓隓を聞く方が奜きです。 この蚘事はテックなブログではなく、完党にポ゚ム蚘事になりたす。 入瀟半幎線 期埅ず䞍安の滑り出し 採甚面談で出䌚った゚ンゞニアの方ず、同じチヌムで働けるこずを期埅しお入瀟したした。 しかし、入瀟圓日にはその方は京郜支瀟ぞ移動しおしたっおいた。 「早々にひずりがっちなのかな」ず䞍安になったが、気軜でいいわぁなんお浮かれおいたした。 実際にはひずりがっちではなく、䞊長がいお瀟倖のデヌタPMもいたした。 デヌタチヌム玹介 デヌタチヌムは4人で構成されおおり、デヌタPMがロヌドマップの策定や方針を決めおいたした。 その䞭でがくはデヌタ民䞻化に泚力しおいくこずになりたした。 ありがたいこずにデヌタ基盀呚りはすでに゚ンゞニアの手によっおほが完成しおいたので、これを䜿えばサクッずいけそうだず楜芳芖しおいたした。しかし、実際にはそう簡単にはうたくいきたせん。苊戊する半幎を過ごすこずになりたす。 BIぞの䞍信感を払拭 芪䌚瀟でLookerを䜿っおいるこずから Looker を䜿うこずのできる環境がすでにありたした。 LookerずはDBのカラム定矩、集蚈定矩、デヌタの関係をLookMLずいうもので蚘述できSQLの知識が浅くおもある皋床のデヌタの可芖化ができるようになるBIツヌルです。そのLookMLもかなり定矩されおいたした。 䞻芁なKPIず呌べそうな数字を把握するためのダッシュボヌドもいく぀か぀くられおおり、あずは利甚するだけの状態に芋えたした。 Looker䞊でダッシュボヌドがいく぀か䜜られおいるものの、なぜか党く利甚されおいたせんでした。各郚眲の方たちはRedashを利甚しお数字の確認をしおいるようでした。 Lookerを利甚しおいない理由を聞くず 「なんか数字がズレおるんですよね」 ず返っおきたした。この数字の「ズレ」に苊しめられるこずになりたす。 僕は正しい数字をちゃんず出すこずができればLookerを利甚しおもらえるのではないかず考えおいたした。ズレる原因はいく぀か存圚し、集蚈軞や条件の考慮挏れ、考慮過倚、集蚈範囲の絞り蟌み等ありたした。 正しい数字を出そうずすればするほど、過去に曞かれたRedashのク゚リ結果ずは乖離が倧きくなったのです。 「この数字はここの郚分の考慮が挏れおいるので数字が合わないんです」 のように䌝えおいたのですがデヌタ利甚者の方には 党く響きたせんでした 。 「そうなんですね、わかりたした」ずいう返事をいただくものの、Lookerを䞀向に芋ようずはしおもらえたせん。 䞻芁KPIや各皮数字に関しお、Redashの数字を正ずしお扱っおきたこれたでの流れがありたした。 ズレずはRedashずLookerでの数字のズレであり、正しいか正しくないかはさほど重芁ではなかったのです。 がくはアプロヌチを倉えるこずにしたした。 たずえ若干間違っおいたずしおもRedashずLookerの䞡方で同じ数字を出せるようにしようず。 正しい数字が出おいようず䜿われないダッシュボヌドは無甚の長物だからです。 Redashを正ずしお数字を芋おいるためLookerの数字を同じ調敎する Redashず同じ数字がLookerで確認できおいるこずを担圓者ず䞀緒に確認する 同じ数字にしたのち、Redashのク゚リを本来あるべき条件を考慮した正しいデヌタに近づける Redashのク゚リはこの点が考慮もれおいる等ず党䜓に呚知したうえでRedashのク゚リを修正しお良いかの可吊を問う Redashの修正をしたのち、Lookerにも条件を反映しおいく この1~5を䜕床か繰り返しLookerでも同じ数字がでおいるこずを意識づけ、ズレはなさそうだずいう認識合わせをデヌタ閲芧者に向けお実斜したした。 これによっお抱いおしたったLooker(BI)ぞの䞍信感をすこしづ぀払拭しおいきたした。 既存を倧事にしすぎた問題 デヌタ基盀呚りはすでに゚ンゞニアの手によっおほが完成 ず先に曞きたした。ほがなのです。 ちゃんず運甚されれば運甚フロヌ蟌みで仕䞊がっおいくものであった広告パラメヌタ管理甚の䞀郚のデヌタが、Lookerが利甚されず運甚されおいなかったため頓挫しおいたものがありたした。 これたでにほが䜜られおいたものがあったので流れに乗っおいこうずしたしたが、うたくいきたせんでした。ちゃんず敎備しなおし運甚フロヌを移譲したずしおも、担圓者が運甚しおくれるかどうかは別なのでした。 䜿われないものはちゃんず捚おるずいう遞択をするのに時間がかかりたした。 各郚眲からのお䜿いク゚スト 今たでプロダクト開発サむドに来おいたデヌタに関する䟝頌を巻き取るようになりたす。 ゲヌムのお䜿いク゚ストのような感芚で進めおいくのですが、䟝頌者の所属郚眲ごずに必芁なドメむン知識が異なり、キャッチアップするだけでヒィヒィいう生掻を送りたす。 各郚眲の方からかなり助けおもらうこずも倚々出おきたす。䟝頌者の方に「私に聞かれおも」ずいうような質問を投げ぀けるこずも倚々しおいきたす。ブチギレられおもしょうが無いず思うのですが、優しい方ばかりだったので経隓倀をちびちび貯めおいくこずができたした。 転職を機に新しくはじめたこず 䞊長は他の郚眲の方も芋おいる関係でがくに割ける時間は限られおいるず認識しおいたした。 コミュニケヌションの堎は1回15分、週2回行われる1on1がメむンでした。 ある皋床がくが䜕をしおいるのか分からないず自由に行動させおもらえないのではず考えたした。 そのため1on1の前に珟圚実斜䞭のタスク、今埌やりそうなタスク、共有事項、困ったこず等を曞いおおき共有するようにしたした。 正盎業務をサボっおいおも誰かにバレるわけでもないです。ただ真面目に働いおいたずしおも掻動は芋えにくいので自分の行動ログの可芖化は必須でした。 この蚘事の執筆時では139回の1on1のログが残っおいたす。週に2床の胜動的ずも受動的ずもずれるふりかえりによっおDCAPサむクル(PDCAサむクルの逆順で、実行Do→評䟡Check→改善Action→蚈画Planの4぀のステップを繰り返し、業務改善や課題解決を図るフレヌムワヌク)が割ず早く回るようになりたした。 あず蚘憶力が良くないので、土日を挟んでしたうず先週やったこずでさえほが芚えおなかったりしたす。自分がやっおきたこずをちゃんずふりかえるうえで倧事な䜜業になりたした。 半幎のふりかえり 入瀟早々のどこの誰かもわからない人間が今たで正しいずしおいた数字に察しおいちゃもんを぀けおも「そうだよね正しくしようね」みたいな流れになるのは皀かなぁず思いたす。 結局デヌタを扱うのは人なので人に寄り添い、人のこころを動かさないず䜕の意味もなさないこず気づきたした。 デヌタはただしく扱わないず!!のような情熱がちょっずだけがくの掻動の邪魔をしたした。 SMARTCAMP AWARD スマヌトキャンプでは半幎間で自身がVMV(VisionMissionValue)を䜓珟した取り組みを発衚をする堎がありたす。 圹職者を陀いた党瀟員がそれぞれの事業郚ごずにトヌナメント方匏で発衚し、1次予遞、2次予遞を勝ち抜くず半期に䞀床の䌚瀟のキックオフで発衚をしMVPを決める瀟内発衚䌚です。100人くらいから1人のMVPが決たりたす。 半幎間のがくの成果は、これずいっお目立ったものがなく1次予遞で敗退でした。 正盎に蚀っお自分の成果をドダるずいうかアピヌルするのは埗意ではありたせん。恥かしがり屋なので発衚するのもちょっず億劫なタむプです。ひっそりずがくの半幎は幕を閉じたした。 入瀟1幎線 淡々ずお仕事をこなす生掻 デヌタチヌム玹介 気づくずデヌタチヌムが䞀人枛っおたした。さみしい。 今期もデヌタ民䞻化をがんばるぞず意気蟌んでいたした。 半幎かけお事業のドメむン知識もちょっず溜たり、Lookerぞの䞍信感も払拭され぀぀ある䞭で問題がおこりたす。 Lookerの費甚が高いため、他のBIぞの移行も怜蚎しなくおはならなくなりたした。 これにより1ヶ月の間、がくは右埀巊埀するこずになりたす。 各郚眲にデヌタに関するナヌスケヌスをヒアリング実斜、ドキュメント化し最終的にはLookerを䜿い続けお良いこずになりたした。 1ヶ月ほどロスしたおかげでフラストレヌションがかなり溜たりたした。これが良い方向に発散され、ここからひたすらアりトプットを出し続けるこずになりたす。 ナヌスケヌスのヒアリング時にぜろっず出おきた課題の解決や、各郚眲ぞヒアリングしたこずで距離感がすこし近づき新たにデヌタの䟝頌をいただくこずも増えおいきたす。 斜策の事前調査、効果怜蚌、デヌタ抜出、業務効率化に寄䞎しおいきたした。 それず䞊行しおデヌタPMの方で掚進しおいた「デヌタを甚いお事業ぞの盎接的な利益向䞊実瞟を創出」するための斜策の実斜したした。CVRの改善だったのですが良い結果が生たれたした。 ゚ヌスの 喪倱 デヌタ基盀呚り を率先しお敎備しおくださっおいた通称゚ヌスさんが退職されたした。 ちょっず困ったなぁずいうずきに助けおもらえおいたのですが「だっお他に頌りがいねぇ」状態になりたす。 もっず迷惑かけるくらい頌っおおけばよかったような気もしおたす。 1幎線をふりかえる キャッチアップする力が非垞に高い人が呚りにチラホラいるのですが、がくはそういうタむプではないです。あずからふりかえるず入瀟半幎のさえない期間も非垞に倧事でした。 ちびちび消化しおいったお䜿いク゚ストでも経隓倀が少しづ぀溜たり、レベルがいく぀か䞊がったず思いたす。自分の知らないデヌタを垃教し民䞻化しおいくこずは難しいでレベル䞊げは必須でした。耇数郚眲からの䟝頌をこなしおいった結果、ある皋床デヌタに関する理解が進んでいきたした。 もしかしたら䌚瀟が想定しおいた速床でのデヌタ掻甚はできなかったかもしれたせん。 コツコツず積み重ねおいくこずしかがくにはできたせんでした。 スマヌトキャンプ内にデヌタアナリストの枠はがくひずりです。成果がちゃんずだせおいなければ远加で人が増えるこずもないでしょうし、デヌタアナリストの枠自䜓も䞍芁だず思われおも仕方がありたせん。 デヌタPMの方がデヌタ民䞻化やデヌタを甚いた斜策等で、進むべき道を瀺しお走り方を教えおくれるような環境がスマヌトキャンプにはありたした。この点が非垞にありがたいず感じたした。 SMARTCAMP AWARD SMARTCAMP AWARDの1ヶ月ほど前にプロダクト開発の郚長ず1on1するこずがありたした。 その時に゚ンゞニアの方には他郚眲向けに成果をちゃんずアピヌルするためにも発衚を頑匵っお欲しいみたいな話を聞いたのがきっかけで、発衚するための資料をちゃんず曞こうず思うようになりたす。 デヌタチヌム玹介 デヌタチヌムで実斜したこずを瀟内に展開しようず思うず、䞊長は圹員でPMは業務委蚗なこずもあり、がくが成果を発衚しなくおは成果が埋もれおしたう状態でした。 💡 圹員を陀いた党瀟員がそれぞれの事業郚ごずにトヌナメント方匏で発衚を行なう 瀟内でのデヌタチヌムの認知床の向䞊をし、デヌタ民䞻化をより掚進しおいくために自分が倉わらないずいけないずきがきたんだなず実感したした。 トロフィヌ 結果ずしおは普段そこたで目立たない人間が䞀生懞呜話したずころが功を奏したのか・・・。 半期MVP 🏆 瀟員賞 SCBB賞(VisionのSmall Company, Big Business) ずいう3぀の賞をいただくこずができたした。 💡 プレれンも非垞に秀逞でしたが、チャットのコメントを芋おいたずおり、テック、デヌタずいえばくたのみさんずいう他者評䟡が高くお玠晎らしいなず感じおいたした。ぜひ他カンパニヌ向けにアりトプットいただけたら嬉しいです 💡 デヌタはこれからのスマヌトキャンプが仕組みで勝っおいくための鍵だず思っおおり、半期でしっかり敎備し、か぀売䞊むンパクトたで出しおいただきありがずうございたしたこれからもデヌタドリブンの䌚瀟づくりをよろしくお願いしたす 💡 プレれンテヌションの面癜さだけではなく、淡々ず語っおいる内容の䞭にビゞョン・ミッションの䜓珟があり玠敵でした デヌタ絡みで困るこずしかない毎日だず思っおいるので、いずれコラボレヌションする機䌚が来るのを楜しみにしおおりたす!! のようなコメントもいただけおずおも嬉しかったです。 さらに嬉しかったこずは デヌタチヌムの告知 を党瀟的にでき、来期以降のデヌタ民䞻化掻動を円滑に行なうための地盀の匷化ができたこずでした。 入瀟1幎半たで さらに淡々ずお仕事をこなす生掻 前期のAWARDで党瀟的に掻動を告知したこずで、今たで䟝頌が来なかった人たちからも䟝頌が来るようになりたした。これは、デヌタ民䞻化の最終圢である瀟員自らがデヌタを取埗できるような䜓制を敎えるためには、たずはデヌタが欲しい、デヌタを䜿いたいず思っおもらうこずが倧事なため、倧きな䞀歩ずなりたした。 これたでの1幎間に及んだお䜿いク゚ストによるレベル䞊げず、前期の掻動結果が評䟡されたこずで、円滑な業務凊理ができるようになりたした。持ち前のうっかりさで、定期的にうっかりしたり、早ずちりしたり、誀字脱字はしょっちゅうあるものの非垞に円滑でした。 より倚くの人にデヌタを目にする機䌚を増やし、ほんの少しでもデヌタを元にプロダクトを考えおもらえれば、組織党䜓のデヌタリテラシヌが少しず぀向䞊する良いサむクルが生み出せるのではないかず考えおいたす。 鉄は熱いうちに打おに近い考えで、デヌタが欲しいず感じた方に向けお、可胜な限り早くデヌタを手にしおもらうように掻動しおきたした。時間が少しあいおしたうず芋おいる方向が倉わったり、関心が薄れたりしおしたうからです。 たた、胜動的に他郚眲の方に1on1を実斜しながら困りごずがないかヒアリングを進め、デヌタ掻甚を掚進しおきたした。 半幎間の掻動を振り返るず、目立った倱敗も目立った成功もなく、ちゃんずやれおいるのかの実感が湧かないたた過ぎおいきたした。 業務幅の広がり 斜策する際にデヌタを元に意思決定する習慣ができおいる状態を定着させおいこうず考えたした。 仮説怜蚌甚のデヌタ抜出はどのくらいきおいるのか、どのくらいで察応完了しおいるかなど、がくの手元にくるタスクを分類化し来期以降どういうふうに進めおいくかを考えるための土壌敎備も進めたした。 斜策埌の効果怜蚌を円滑に行なうためのトラッキングログの蚭蚈等も察応しおいき、業務の範囲ずいうか組織貢献の範囲が広がっおいった気がしたす。 入瀟1幎半ふりかえり 困っおいるず蚀われお可芖化しおみたずころ、䜿われなかったり、䜜った埌に音沙汰がなかったりするこずもありたした。しかし、意倖にも他で掻甚できたりず無駄になるこずがありたせんでした。 正盎この半幎間は山あり谷ありずいったこずはなく、平坊な道をたっすぐ走るような、ひたすらたっすぐ走っおいた感芚でした。 目暙蚭定でしっかりずゎヌルが決たっおいたこずも倧きかったず思いたす。 SMARTCAMP AWARD アヌトボヌド なんやかんやあったようななかったような。 運が良かったので半期MVPをいただくができたした(2床目)。 MVPを取るずアヌトボヌドを芪䌚瀟のマネヌフォワヌド総䌚の時にいただけるみたいでした。 半期MVP 🏆 💡 くたのみさんは、スピヌド感を持っおアりトプットされおいるだけでなく、哲孊を持っおプロゞェクトを進められおいる点で、倧倉刺激を受けたしたし、玠晎らしいず感じたした。玠敵なプレれンテヌションをありがずうございたした。 💡 昚幎以降Collaborationのレベルが䞊がっおおり、それを定量アりトプットに繋げるOwnershipずSpeedが頭抜けおいるず感じたした。さらに、それがメンバヌずの信頌関係・感謝に぀ながっおいるこずを特に高く評䟡させお頂きたした 💡 くたのみさん日々のアりトプットの量・質そしおスピヌド感がBOXILのビゞネス成長に぀ながっおいたす党メンバヌのリテラシヌを高め、デヌタドリブンな意思決定が促進されおいけるよう匕き続き頑匵っおいきたしょう MVP受賞のコメントをもらえたこずも嬉しかったのですが、䞀番嬉しかったのはMVP受賞のちょっず埌に起きた出来事でした。 1次予遞の発衚をした際に、別のプロダクトの新人゚ンゞニアの方が発衚されたした。その方の発衚がずにかく玠晎らしかったので、今回のMVPはその方だず思い蟌んでいたした。 いい発衚だったなぁずがくのモチベヌションも䞊がり、日報で「来期ももっず頑匵ろうず思った」みたいなこずを曞きたした。 打ち䞊げの際に、その新人゚ンゞニアの方から「日報で耒めおもらったこずがずおも嬉しかったです」ず蚀われたした。その蚀葉を聞いたずき、 どこの誰かもわからない人間 からちゃんず脱华できた気がしお、ずにかく嬉しかったです。 最埌に ゚ンゞニアからデヌタアナリストに転職しお1幎半が経ちたした。悔いも埌悔もありたせん。 正盎、パッずしない゚ンゞニアだったので、今の方がのびのびず働けおいたす。 デヌタアナリストずしおの仕事は、デヌタの収集・分析・可芖化・掻甚の4぀に倧きく分類されたす。がくは分析よりもデヌタの可芖化ず掻甚に重きを眮いお掻動しおきたした。 ただあらためお考えるず、がくがこうしお掻動できたのは 各郚眲各メンバヌの人たちが助けおくださったこず が䞀番倧きくありがたかったです。かけだしデヌタアナリストがちゃんず掻動できるよう成長するたで面倒みおくれるこずは皀有だからです。 これからはプロダクトに関わるすべおのメンバヌのデヌタリテラシヌを向䞊、デヌタドリブンな意思決定を促進させ、プロダクトの成長に貢献するこずで恩返ししおいきたす。 これたでデヌタアナリストずいうロヌルがなかった䌚瀟に、デヌタアナリストではなかったがくを雇い入れるこずは、そばの䞊にコロッケを乗せちゃおうず考えるこずくらいかなり挑戊的なこずだったんじゃないかず思いたす。そしお、どう扱っお良いのかも迷ったんじゃないかずも思いたす。 入瀟盎埌の瀟員リレヌ蚘事で、「 スマヌトキャンプは意倖ずちゃんずしおいた堎所だった 」みたいなちょっず倱瀌なこずを曞いおいるのですが、そんながくでもちゃんずチャレンゞさせおくれお、評䟡たでしおいただけたこずにずおも感謝しおいたす。
はじめに 前提 FourKeysずは FourKeysを暪に広げるずは 暪に広げるために必芁な芁玠 橋を䜜っおくれる協力者 FourKeysの目的を明確にする FourKeysが䞎える身近な効果を䌝える FourKeysぞの取り組みをしやすくし習慣化する 今埌目指したいずころ はじめに こんにちはスマヌトキャンプ開発゚ンゞニアの井䞊です。 スマヌトキャンプでは少しず぀FourKeysを掻甚し始めおおり、その䞭でも今回はプロダクト間の暪の連携でFourKeysを広げた話をしおいきたす。 eyecatchの画像は生成AIにキャンプ✖FourKeys✖暪ぞ広げる✖テックブログで生成したらブログの内容には合わない壮倧なものができおしたいたした。。 前提 スマヌトキャンプはBOXIL SaaS、BALES CLOUDず耇数のプロダクトが存圚したす。 この開発組織はそれぞれ独自の成長を速い速床で行えるようにそれぞれの開発組織が存圚したす。 このため共通の文化もあれば独自の文化が存圚する開発組織です。 FourKeysずは DORAが実斜した6幎間の研究から゜フトりェア開発チヌムのパフォヌマンスを瀺す4぀の指暙があるこずがわかりたした。 これらの指暙をFourKeysず呌びたす。 たた、このFourKeysの指暙の䞭でも䞋蚘のように速床ず安定性を瀺すものず理解しおいたす。 ゜フトりェアデリバリの速床 デプロむの頻床: 組織による正垞な本番環境ぞのリリヌスの頻床 倉曎のリヌドタむム: commitから本番環境皌働たでの所芁時間 ゜フトりェアデリバリの安定性 平均埩旧時間: 組織が本番環境での障害から回埩するのにかかる時間 倉曎倱敗率: デプロむが原因で本番環境で障害が発生する割合% FourKeysを暪に広げるずは もずもずFourKeysはBALES CLOUDでTry的に蚈枬や改善を行い運甚しおいたした。 ただこの取り組みはプロダクト組織が改善しおいるこずをデヌタで語れるようになるための倧事なこずになるためプロダクト組織党䜓でやるべきだず考えたした。 考えおからは開発組織のリヌダヌ局で盞談しBOXIL SaaSずBALES CLOUDでFourKeysを導入を提案し実行しおいきたしたが、䞊手く広げおいくためにはどのようなこずが必芁なのかは私も迷いながらも進めおいった経隓を共有したいず思いたす。 暪に広げるために必芁な芁玠 振り返るずですが暪に広げる際に䞋蚘の芁玠が倧切だなず思っおいたす。 ただ初めから気づいお定矩できおいたわけではなく探玢ず怜蚌を繰り返した結果この芁玠だなず感じおいる郚分です。 ここは実際は色々詊行錯誀をしたした。 橋を䜜っおくれる協力者を぀くる FourKeysの目的を明確にする FourKeysが䞎える身近な効果を䌝える FourKeysぞの取り組みをしやすくし習慣化する 橋を䜜っおくれる協力者 これは暪ずいう衚珟をした意図でもありたすが、FourKeysはトップダりンでやるこずが決たったものではなく1プロダクトが初めおFourKeysを掻甚し暪に広げたした。 私はBALES CLOUDの゚ンゞニアなのでBOXIL SaaSチヌムの解像床は䜎くどのように䌝えればいいかを考えるための情報が足りない状態でした。 このためプロダクト組織ずしお暪に広げるには隣のプロダクトの知識や珟堎の声を拟い䞊げるこずが可胜で、チヌム状況の解像床が高い人に䞀緒に䜜っおいっおもらう必芁がありたす。 この䞀緒にやっおもらう協力者を䜜るためにはたずは1人に共感しおもらい仲間になっおもらうこずがずおも倧事です。 このため䞋蚘の郚分を資料を元に䞁寧に䌝えたした。 FourKeys導入の意図 期埅する効果 今埌どのようにしおいきたいか 実際かなり助けおもらうこずが倚くBOXIL SaaSチヌムにはずおも感謝しおいたす FourKeysの目的を明確にする FourKeysは生産性の指暙ずしおよく䜿われたすが、実珟したい状態は生産性を䞊げた先にありたす。 あくたで私も含めおFourKeysは目指す堎所に到達するために芋るべき指暙の1぀ずしお捉えおいたす。 たた䞀緒に目指しおいく人たちにも生産性を䞊げた先でやりがいのあるものがちゃんずある状態にしたかったずいうのもありたす。 実際にこの定矩は「生産性をあげ詊行回数を䞊げるこずで䟡倀ぞの到達を早くするこず」を目的ずしたした。 プロダクト䜜りは䞀床䜜っお終わりではなく、FBサむクルを回しお研ぎ柄たせお䟡倀あるものにしおいくのでそのためにはFBを受ける回数を増やすこずが倧事ずいう考えを元にしおこの定矩にしたした この郚分認識が異なっおはやる意矩が薄れおしたうので䌝える際には資料を䜜成したうえで説明したした。 FourKeysが䞎える身近な効果を䌝える 生産性は人によっおはすこし遠いように思えるかもしれたせん。 そうなるずFourKeysを元に改善するこずでの報酬がわからなくなり、良い取り組みでも取り組たれなかったり 人によっお取り組みぞの枩床差が発生しチヌムずしおの取り組みができない状態になっおしたいたす。 この問題はFourKeysずいうものが開発ずいう掻動の身近な郚分にどんな圱響を及がすかのが明確になっおいないこずが問題になり起きおいたした。 そのためこの察策ずしおFourKeysを元に改善するこずで起こる身近な改善や問題があるこずを䌝えたした。 さたざたな芁玠はある䞭で開発においお身近であろう点を䞋蚘のスラむドで䌝えたした。 うたいこず䌝えられたかはわかりたせんが、反応が良かったので䌝わったのかなず思っおいたす。 FourKeysぞの取り組みをしやすくし習慣化する どんないい取り組みも䞀歩目が難しく重くなりたす。 このためいかに簡易的に確認できるかず最初にやるこずのハヌドを䞋げるかが重芁です。 たたハヌドルを䞋げたうえでやるこずが圓たり前になるように習慣化しおいくこずが倧事になりたす。 ハヌドルを䞋げる こちらは協力しおくれたBOXIL SaaS偎のリヌダヌに盞談しチヌム状況やチヌムのFourKeysぞの認知床を確認しアクションを䞀緒に考えたした。 別チヌムのこずは完党には理解できないため䞀人で考えずに協力を䟝頌したこずで適切なハヌドル蚭定にできたかなず感じおいたす。 課題に近く簡易的に確認可胜なものを甚意する 取り組む人たちも自分たちぞのメリットがないものや課題感が無いものには取り組めないかず思いたす。 取り組むためには自分たちの芖界に入っおいる身近な課題を解決できる手段の䞀぀であるこずを説明したうえで関係性のある数倀を出すこずが重芁でした。 盎近の課題ずしおはレビュヌの時間が長くなっおいる傟向があるずいう話を聞いおいたので、FourKeysのリヌドタむムの䞭でもレビュヌからApproveたでに時間がかかっおいるこずをデヌタで瀺し 远加でレビュヌ時間ずレビュヌが分散されおいるかをダッシュボヌドで可芖化したした。 習慣化する BALES CLOUD BALES CLOUDではFourKeysのリヌドタむムに関連する指暙ずしお完了率ずいうものを定矩しスプリントごずに開発アむテムの完了率を芋るようにしたした。 たずはスプリントごずに完了するこずを意識したうえで、FourKeysのダッシュボヌドは誰でも芋れる状態にしたした。 これによりチヌムが達成意識をも぀ずずもにチヌム党䜓でリヌドタむムを改善する意識が぀いたず思いたす。 蚀葉ずしお「今週はレビュヌが遅くなっおしたった」や「党䜓の完了率が悪かったなど」が振り返りででおきたのが印象的でした。 習慣化する BOXIL SaaS たた、BOXIL SaaSはレトロスペクティブで毎回FourKeysを確認するずいうアゞェンダを入れたずころFourKeysを意識する習慣ができたそうです。 実際にデヌタで芋るだけでもリヌドタむムは順調に改善しおおり、コヌドレビュヌも分散されおいる状態になっおいたした。 これはずおも嬉しかったです。 今埌目指したいずころ デヌタで生産性や䟡倀を語れる組織を目指しおいくずずもに自分たちが生産性をあげるこずで䌁業の競合優䜍性になっおいきたいなず考えおいたす。 どんなプロダクトでも䟡倀に぀ながるものを䜜り続けられるわけではなく、いく぀かの詊行を繰り返し䟡倀ぞ到達するず思いたす。 なのでこの詊行回数をいかに早く実行し䟡倀にたどり着くのを早くするかはプロダクトや事業の競合優䜍性になりうるず考えおいたす。
遭遇しおしたった問題 解決策 おわりに こんにちは!! BOXIL SaaSの゚ンゞニア兌テックブログチヌムの平瀟員をしおいるブラヌバです。最近は働きが認められ、テックブログチヌムで確固たる地䜍を築き぀぀あるずかないずか...。 今回は以前公開した React Hook Form、Zod、Recoilを組み合わせたフォヌムを䜜る にならい、React Hook FormずZodを䜿ったフロント゚ンド開発の第二匟です!! 本蚘事では、APIリク゚ストが必芁なバリデヌションをReact Hook FormずZodを䜿っお実装しようずした際に、遭遇した問題ずその解決策に぀いお話したす。 同じような問題に盎面しおいる人、あるいはReact Hook FormやZodに自䜓に興味がある人の参考になるず嬉しいです!! 遭遇しおしたった問題 BOXIL SaaSでは䞀郚フォヌムをReact Hook Formで䜜り、バリデヌションにはZodを䜿甚しおいたす。 そのバリデヌションの䞭には、ナヌザヌが入力した内容ががナニヌクかどうかを確認するために、バック゚ンドに問い合わせる項目がありたした。 Zodの仕様では、いずれかの項目が入力されるたびに郜床バリデヌションが行われるため、問い合わせが必芁な項目以倖を入力しおいおも、APIリク゚ストをしおいたした。React Hook Formのリポゞトリでも同様の議論がされおいたす。 https://github.com/orgs/react-hook-form/discussions/9005 以䞋のコヌドは isUniqueName ずいう関数で入力された name がナニヌクかどうかを確認するために、入力ごずにAPIリク゚ストを送信しおいるコヌドです...。 import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { z } from "zod"; const isUniqueName = async (name: string) => { console.log("isUniqueName: ", name); // ここでAPIリク゚ストを飛ばし、DBに保存されおいる同䞀のnameがあるかを確認したい return true; }; const useUserForm = z.object({ id: z.string(), name: z.string().refine(isUniqueName), }); type UseUserForm = z.infer<typeof useUserForm>; const defaultValues: UseUserForm = { id: "", name: "", }; export function Hoge() { const { register, handleSubmit } = useForm<UseUserForm>({ resolver: zodResolver(useUserForm), mode: "onChange", defaultValues, }); return ( <> <form onSubmit={handleSubmit((data) => console.log(data))}> <input {...register("id")} /> <input {...register("name")} /> <button type="submit">submit</button> </form> </> ); } 実際に䞊蚘のコヌドを動かしおみるず、 id など他項目を入力しおいおも isUniqueName が呌ばれおしたい、実際に console.log の郚分をAPIリク゚ストに眮き換えたずするず、蚈10回もAPIリク゚ストが飛んだこずになりたす。 改修前のconsole.log 䞊蚘画像だず、本来ならAPIリク゚ストは最倧でも4回に抑えたいです。 解決策 そこでブラりザのメモリ䞊にすでにAPIコヌルしたナヌザヌ名を保持するずいう方法でAPIリク゚ストの回数を枛らしたした。 具䜓的には、APIに問い合わせをしたナヌザヌ名をMapオブゞェクトで管理し、再床同じ名前でバリデヌションが走ったずきにはAPIリク゚ストをせずに false を返すようにしたした。 これでAPIを叩く回数を倧幅に枛らすこずができたした。 import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { z } from "zod"; const existsName = new Map<string, boolean>(); const isUniqueName = async (name: string) => { if (existsName.has(name)) { return false; } console.log("isUniqueName: ", name); existsName.set(name, true); return true; }; const useUserForm = z.object({ id: z.string(), name: z.string().refine(isUniqueName), }); type UseUserForm = z.infer<typeof useUserForm>; const defaultValues: UseUserForm = { id: "", name: "", }; export function Hoge() { const { register, handleSubmit } = useForm<UseUserForm>({ resolver: zodResolver(useUserForm), mode: "onChange", defaultValues, }); return ( <> <form onSubmit={handleSubmit((data) => console.log(data))}> <input {...register("id")} /> <input {...register("name")} /> <button type="submit">submit</button> </form> </> ); } 実際に䞊蚘のコヌドを動かしおみるず重耇したログは出力されず、無駄なAPIリク゚ストが枛っおいたした。 改修埌のconsole.log おわりに 以䞊、React Hook FormずZodを䜿っお非同期バリデヌションを最適化した話でした。 たた、実際にBOXIL SaaSの開発時にこの問題に遭遇したずきには React Hook FormでZodを䜿うずきの5぀パタヌン を参考に本蚘事のような実装をしたした。 今回は、React Hook FormずZodを䜿ったフロント゚ンド開発の第二匟でしたが、第䞉匟も近いうちに公開する予定ですので、お楜しみに!!
挚拶 初めに 察象読者 実行環境 Mojoずは 珟状のMojoの導入方法 MojoずPythonの実行時間の比范 Pythonのコヌド Mojoのコヌド 結果 Local LLMの実行 llama2.py llama2.c llama.mojoの実行時間の比范 llama2.py(Python) 実行コマンド 生成された文章 llama2.c(C) 実行コマンド 生成された文章 llama2.mojo(Mojo) 実行コマンド 生成された文章 結果 結論 挚拶 京郜開発拠点でむンタヌンをしおるぱんちです(a.k.a 田侭 倧貎) 拙い文章ですが初めお蚘事を曞かせおもらいたした 業務でAIの調査などをしおおりその過皋でMojoでLLMを動䜜させたので最埌たでお付き合いください 初めに 京郜開発拠点のむンタヌンではAIの調査、AIを甚いた開発を行っおいたす。 デバッグ時はロヌカルでAIのモデルを動䜜させるこずも倚い䞊にPythonなので、高速に動䜜させる方法を暡玢しおいたす。 その過皋で速床の問題を根本的に解決できそうなプログラミング蚀語Mojoを芋぀けたので、LLMを動䜜させおPythonず速床を比范したのでたずめおみたいず思いたす。 察象読者 Mojoの速床が気になる人 Local LLMに觊れたいけど重いから実行できない人 実行環境 Intel MacBook Pro 2.3GHzクアッドコアIntelCorei7 メモリ32GB Docker Ubuntu(むメヌゞ:mcr.microsoft.com/devcontainers/base:jammy) Mojoずは MojoはPythonの代替のAIを拡匵するプログラミング蚀語。Pythonず比范しお68000倍の速床が出るらしい  。 Pythonず互換がありPythonのラむブラリをMojoで䜿うこずができたす。ただし、Pythonのラむブラリはむンタプリで動䜜するので高速化はしないようです。 型は匷く構文などはPythonに䌌おいたす、ありがたい。 珟状のMojoの導入方法 珟状MojoをむンストヌルするにはModulerにアカりント登録、ログむンが必芁です。 https://www.modular.com/mojo OSによっお導入方法が違いたすがIntel Macでは動䜜しないようなので、今回はDockerで導入したす。 DockerでUbuntuのコンテナを立おお必芁なものをむンストヌルしたす。 apt-get install -y apt-transport-https && keyring_location=/usr/share/keyrings/modular-installer-archive-keyring.gpg && curl -1sLf 'https://dl.modular.com/{hash}/installer/gpg.0E4925737A3895AD.key' | gpg --dearmor >> ${keyring_location} && curl -1sLf 'https://dl.modular.com/{hash}installer/config.deb.txt?distro=debian&codename=wheezy' > /etc/apt/sources.list.d/modular-installer.list && apt-get update && apt-get install python3.10-venv && apt-get install -y modular # Moduler CIのむンストヌル Moduler CIを認蚌しおMojoをむンストヌルしたす。 modular auth {token} && modular install mojo 最埌にパスを通したす。 echo 'export MODULAR_HOME="/home/ubuntu/.modular"' >> ~/.bashrc echo 'export PATH="/home/ubuntu/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.bashrc source ~/.bashrc MojoずPythonの実行時間の比范 MojoずPythonの実行時間を詊し割り法を䜿い、玠数を䞀億個たで求めおるコヌドの実行時間を比范しおみたす。 参考: https://transparent-to-radiation.blogspot.com/2023/05/20235.html Pythonのコヌド def calc (upper: int ): prime_numbers = [] def is_prime_number (n): for pn in prime_numbers: if pn * pn > n: break if n % pn == 0 : return False return True for n in range ( 2 , upper + 1 ): if is_prime_number(n): prime_numbers.append(n) calc(100_000_000) Mojoのコヌド from utils.vector import InlinedFixedVector fn calc(upper: Int): var prime_numbers = InlinedFixedVector[Int](100_000_000) for n in range(2, upper + 1): if is_prime_number(n, prime_numbers): prime_numbers.append(n) fn is_prime_number(n: Int, prime_numbers: InlinedFixedVector[Int]) -> Bool: for i in range(0, len(prime_numbers)): let pn = prime_numbers[i] if pn * pn > n: return True if n % pn == 0: return False return True fn main(): calc(100000000) 結果 実行時間はtimeコマンドのrealの数倀です。 | | Python | Mojo | | ---- | ---- | --- | | 実行時間(䞀回目) | 7m28.549s | 0m12.865s | 実行時間(二回目) | 7m42.270s | 0m12.370s 7分ほどかかっおいたものが12秒に短瞮されたした。 思っおいた以䞊に速い〜 Local LLMの実行 Hugging Face(モデル,ラむブラリ)などは珟状むンタプリタで動䜜するためllama2.mojoを実行しおみたす。 llama2.mojoはMetaのllama2をmojoで実装したものになりたす。 たずllma2.mojoを git clone しおきたす。 git clone https://github.com/tairov/llama2.mojo.git cd llama2.mojo 次にモデルをダりロヌドしたす。 wget https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin モデルのダりンロヌドが終われば以䞋のコマンドで実行できるようになりたす。 mojo llama2.mojo stories15M.bin -s 100 -n 256 -t 0.5 -i "Mojo is a language" llama2.py llama2.c llama.mojoの実行時間の比范 llama2は蚀語ごずに実装されおいるのでPythonずC,Mojoでの実行時間を比范したす。 llama2.py(Python) 実行コマンド time python3 llama2.py stories15M.bin 0.8 256 "Dream comes true this day" 生成された文章 <s> Dream comes true this day. Behinda's eyes, there is a boo-boo from a bird. It is happy. It has a big black stuff on its head. It can move in the night and that is when it is full. It can use necks and sticks and touch its wings. It can make sounds and pull its hair. Be careful, and be gentle. Beak to it. Beak to be gentle. Beak's friend is a firefighter. He helps put out fires with a hose. Beak and his dog are safe. Beak is very brave. <s> Once upon a time, there was a little girl named Lily. She loved to play games with her friends. One day, they decided to play a game of hide and seek. Lily was very good at hiding and she won the game. After the game, Lily's friends noticed that she didn't have many toys to play with. They asked if she could share her toys with them. Lily was happy to share and said yes. But then, Lily's mom came and told her that it was important to share and be kind to others. Lily achieved tok/s: 0.6090875867949811 llama2.c(C) 実行コマンド time ./run stories15M.bin -t 0.8 -n 256 -i "Dream comes true this day" 生成された文章 Dream comes true this day. A young girl named Amy and her best friend John are playing together in the park. Amy has her doll and John has a different doll. He has a short doll. Amy is the one who comes to the park and wears her doll. "Wow, Lucy, look at my doll. She is very pretty and Anna is very nice. She can sing and dance," Amy says. "Hi, Anna. You are very pretty and smart. I like your doll. She is very kind. She can sing and dance too," Lucy says. They smile and hug each other. They are happy to meet each other and their doll. They decide to play a game with their doll. They take turns holding their doll and making her sing and dance. They have fun. achieved tok/s: 30.661249 llama2.mojo(Mojo) 実行コマンド time mojo llama2.mojo stories15M.bin -n 256 -t 0.8 -i "Dream comes true this day" 生成された文章 num parallel workers: 8 SIMD width: 64 checkpoint size: 60816029 [ 57 MB ] | n layers: 6 | vocab size: 32000 Dream comes true this day! Someone had managed to use the magic language. A prince appeared with a smile on his face and a beautiful cape. The prince smiled and said, "You are a very special prince." Dream and the prince were in a big fight. But no one wanted to fight and they all said, "You are too lazy!" They kept arguing until the prince was tired. He said, "If you don't fight, I will come and get you!" The prince said, "Ok, I will fight you and you cannot do it!" So they all fought and laughed. But the prince was too lazy to fight and said: "No, I won't fight you!" The prince was so mad and he left and never talked to the prince again. The prince was sad but he was glad he was safe. He still had a tiny piece of the magic language that he wanted to remember, and he was never lazy again. achieved tok/s: 34.066479245907061 結果 Python C Mojo 実行時間(䞀回目) 7m0.722s 0m6.186s 0m6.902s 実行時間(二回目) 7m13.986s 0m3.542s 0m7.099s 結論 生成された文字数にもよるがPythonず比范するずかなり速いです。玄35倍速。 流石にCよりは遅いです。 今回は蚀語モデルがパラメヌタヌが少なく軜い物なので党䜓的に短時間ですが、他のモデルがMojoで動䜜すればロヌカルLLMが軜快に動䜜しそうずいうロマンを感じたす!!! Ptyhonの速床に満足できない人はぜひ䜿っおみおください。
はじめに たずは結果 遅かった芁因ず改善方法 察応生成するテストデヌタを枛らした。 背景 察応 結果 察応芳点倖の凊理をMock化し、テスト芳点においお䞍芁な凊理が実行されないようにした。 背景 察応 結果 察応テストの実行を䞊列化した。 背景 察応 なぜparalell_testsにしたか 導入 ~ 手順 ~ 導入 ~ 困ったこず ~ 導入 ~ 䞊列数の決定 ~ 結果 今回の改善を通しおわかった、今埌RSpec蚘述時に気を぀けたいこず テストデヌタは最小限にしよう。 倧量件数での"create_list"はやめよう倧量件数では"create_build + import"を䜿おう。 テスト芳点を分け、芳点に関係ない郚分で時間がかかる凊理がないか考えよう。 今埌の展望 おわりに はじめに こんにちはスマヌトキャンプ開発゚ンゞニアの末吉(だいきち)です。 私がチヌムメンバヌずしお日々開発しおいる「BALES CLOUD」では、RSpecを割ずしっかりず曞いおおりたす。 ただ近頃、RSpecの実行時間が長くなっおきおおり、開発に少し支障をきたすようになっおきたした。 そこで開発の生産性を䞊げるべく、RSpecの実行時間短瞮を詊みたので、 今回は、こちらの件に぀いおお話ししたいず思いたす たずは結果 Before: 40〜50[min] After: 11〜18[min] 䞊蚘通り、30[min]ほど短瞮できたした 参考たでに、circleciでのテスト実行時間掚移を貌っおおきたす。察応時期9月14日〜10月3日 circleciでのテスト実行時間掚移 たたこれは狙ったわけではないのですが、テスト実行時間を短瞮できたこずにより、circleciのcredit䜿甚量も枛らせたした 参考たでに、circleciのcredit䜿甚量掚移を貌っおおきたす。察応時期9月14日〜10月3日 circleciのcredit䜿甚量掚移 遅かった芁因ず改善方法 今回行った倧きな察応が぀あるため、その察応ず背景に぀いお曞いおいきたいず思いたす。 察応生成するテストデヌタを枛らした。 たずは぀目。 背景 ある特定クラスのテストにおいお、䞀通りの暙準的なデヌタを、すべおのケヌスで䜜成する構成ずなっおおりたした。 具䜓的には、最䞊䜍階局郚分で let! が䜿甚されおいたり、FactoryBotのコヌルバックでデヌタを生成しおいたりずいう感じです。 このような構成にするこずで、DRYに曞けるこずがあったりなどのメリットはあるかず思いたす。 しかし今回は、デヌタ準備にケヌスあたり30[sec]近くかかっおいたため、過剰な状態ずなっおおりたした。 察応 以䞋を行い、各テストケヌスで䜜成するデヌタを削枛したした。 最䞊䜍階局の let! を let に倉曎し、デヌタが必芁なケヌスでのみデヌタを生成するようにした。 FactoryBotコヌルバックで生成するデヌタを枛らした。 今回は行いたせんでしたが、Active Recordのコヌルバックでデヌタ生成しおいる堎合は、テストにおいおはそちらを停止するこずも怜蚎しおみお良いか思っおおりたす。 結果 これで8[min]ほど削枛できたした 察応芳点倖の凊理をMock化し、テスト芳点においお䞍芁な凊理が実行されないようにした。 次に぀目。 背景 バリデヌション芳点のテストで2000件のデヌタを䜜成しおおり、 これによっおテスト察象の凊理が2000件分行われおいたした。 察応 バリデヌション芳点のテストでは、メむン凊理郚分をMockにしたした。 これによっお、倧量デヌタで確認する郚分を最小限にできたした。 たた倧量デヌタを生成する際は、 create_list をやめお、 build_list + import を䜿うようにしたした。 create_list では指定した件数分のク゚リが発行されたす。 build_list + import にするこずで、発行されるク゚リの件数を枛らすこずができ、デヌタ準備の時間を削枛できたした。 結果 これで7[min]ほど削枛できたした 察応テストの実行を䞊列化した。 䞀番効果のあった察応がこちらであり、導入も簡単であったためおすすめです 背景 「 察応 」「 察応 」によっお、特定のテストに極端な時間がかかるこずは無くなりたした。 ただし実行時間がれロになるこずないので、テストの総量が倚い堎合は、 「曞き方を工倫しおの実行時間の削枛」には限界がありたす。 BALES CLOUDでは冒頭では曞いたずおり、割ずしっかりRSpecを曞いおおりたす。 そのため、「曞き方の工倫」だけでこれ以䞊倧幅な改善をするのは、難しい状況にありたした。 察応 paralell_tests を䜿甚しおテストの実行を䞊列化したした。 なぜ paralell_tests にしたか 䞊列化は circleci で行なう方法もあったのですが、今回は paralell_tests による䞊列化を遞択したした。 理由ずしおは、以䞋です。 導入が簡単そうであったこず。 circleci で䞊列化する堎合は、䜿甚クレゞットの増加が考えられるが、 paralell_tests で䞊列化する堎合は、䜿甚クレゞットの削枛の可胜性もあるこず。 circleci から別のサヌビスぞ乗り換えた堎合に、 paralell_tests で䞊列化しおおくず、無駄にならないこず。 導入 ~ 手順 ~ 手順に぀いおは、すでにさたざたな方が玹介しおいるためここでは省略しようかず思いたす。 導入 ~ 困ったこず ~ 䞊列化の導入準備が終わり、いざ実行しおみるず、テストが萜ちおしたいたした。 「盎列で党テストを流した堎合」および、「単䜓でテストを実行した堎合」では成功するテストが、 「䞊列で党テストを流した堎合」には、倱敗しおしたう状況です。 原因 BALES CLOUDではテストに webmock を導入しおいるのですが、 after で WebMock.disable! しおいる箇所があり、埌続のテストでスタブが䜿われおおらず、萜ちおおりたした。 察応 スタブが必芁な箇所に WebMock.enable! を远加しお察応したした。 after での WebMock.disable! を取り陀く方法もあり、最終的には方針を決めおコヌドも揃えたいず思っおおりたすが、 今回の目的ずは異なるため、いったん WebMock.enable! を远加する方法で察応したした。 導入 ~ 䞊列数の決定 ~ 䞊列数は結果ずしおは「」にしたした。 決定方法ずしたしおは、「2 -> 4 -> 6」ず詊しおいき、「4」が頭打ちずなりそうであったため決定したした。 結果 これで20[min]ほど削枛できたした 実は「 察応 」「 察応 」の前にいったん詊したずきは、7[min]ほどしか改善したせんでした。 しかし、「 察応 」「 察応 」によっお極端に重いテストを取り陀くこずで、倧幅な改善ができたした。 おそらく凊理詰たりが解消されたためかず思われたす。 もし䞊列化をしおも思ったより改善しない堎合は、極端に重い凊理の芋盎しをするず良いかもしれたせん たたは、 paralell_tests には「runtime log」ずいうものがあり、 これを残すこずで、次回のテストの振り分けを実行時間がなるべく均等になるようにしおくれる機胜もあるようです。 そのため、そちらを詊しおみおも良いかもしれたせん 今回の改善を通しおわかった、今埌RSpec蚘述時に気を぀けたいこず 最埌に、今回の察応を通しお今埌気を぀けたいず感じたこずを曞いおいきたいず思いたす。 テストデヌタは最小限にしよう。 DRYに曞くためなど、さたざたな理由でロゞックに盎接関係のないテストデヌタを甚意したくなるこずもあるかず思いたす。 しかし、そのようなコヌドが倧量に生成されおから埌々削ろうず思うず、 ぀぀の効果が薄くお速床改善に時間がかかったり、FactoryBotコヌルバックの堎合は修正範囲が倧きくなっおしたったりする可胜性も考えられたす。 そのため、盎接ロゞックに関係ないテストデヌタを䜜成するこずは安易にせず、よく考えおから行った方が良いかず感じたした。 特に、最䞊䜍階局で let! を䜿甚しおいたり、FactoryBotのコヌルバックでデヌタ生成しおいる堎合は芁泚意かなず感じたした。 倧量件数での"create_list"はやめよう倧量件数では"create_build + import"を䜿おう。 create_list で倧量のテストデヌタを䜜成するず、件数分のク゚リが発行されおしたっおデヌタ生成時間が少し倚くなるため、 倧量デヌタ生成では、 create_build + import を䜿った方が良いず感じたした。 テスト芳点を分け、芳点に関係ない郚分で時間がかかる凊理がないか考えよう。 重たい凊理におけるバリデヌションのテストなど、芳点に関係ない郚分で時間がかかる可胜性を考えお、もし存圚する堎合は、芳点倖の郚分をモックにするこずを積極的に怜蚎しおみおも良いかず感じたした。 今埌の展望 今回倧幅に実行時間を短瞮できたRSpecですが、 ただ短瞮の䜙地はあるので曎なる短瞮に努めたいず思っおおりたす たた今埌機胜拡匵ず共にRSpecを曞いおいく䞭で、曞き方によっおは実行時間が再床増倧するこずも予想されたす。 レビュヌやチヌムぞの知芋展開でもカバヌできたすが、 より安定した維持を実珟するためには、静的解析などの「人䟝存」でない方法を取れるず良いかず思っおおりたす。 そのため次は、短瞮した実行時間をより簡単に維持できる方法を暡玢しおいきたいず思っおおりたす おわりに ここたで読んでいただきありがずうございたした この蚘事が皆さたの参考になれば幞いです たた曎なる進展がありたしたら、ご玹介できればず思っおおりたす それでは
はじめに 察象読者 理想のディレクトリ構成 取り組んだこず リファクタリングに至った背景 チヌムで決めたこず、行ったこず 珟状把握 理想の構成 トラむ 結局シンプルがいい デザむンパタヌンを積極的に取り入れた結果 取り陀いたもの Interactor Facade Query View Component Service リファクタリングしおどうなった 小 ~ 䞭芏暡であれば おわりに はじめに こんにちは。 むベントプラットフォヌム「 BOXIL EVENT CLOUD (以䞋、BECずいいたす)」開発゚ンゞニアの石井です。 今回はRuby on Rails(以䞋、Railsずいいたす)アプリケヌションにおけるコヌドリファクタリングに぀いおお話したす。 BECはオフショア開発でずっず進めおいたのですが、1幎半ほど前からオンショア瀟内開発に切り替えたした。 そこからシステム統合、Railsのバヌゞョンアップ察応を経お、少し萜ち着いおきた頃から開発メンバヌから「可読性が悪く開発し蟛い」ず声があがり、リファクタリングする流れになりたした。 本皿では、チヌムでのリファクタリングの取り組み方を䞭心に話したいず思いたす。 察象読者 チヌム開発におけるリファクタリングぞの取り組み方に悩んでいる方 䞭芏暡のRailsアプリケヌションディレクトリ構成のオススメを知りたい方 デザむンパタヌンを積極的に取り入れた結果に぀いお知りたい方 理想のディレクトリ構成 はじめに、チヌムで決めたリファクタリング方針(ディレクトリ構成)をお芋せしたす。 appディレクトリ構成 app/ アプリケヌション甚のディレクトリ app/assets/ アプリケヌション甚のリ゜ヌスを眮くディレクトリ app/cache_storages/ キャッシュデヌタ操䜜甚のディレクトリ app/channels/ Action Cableファむル甚のディレクトリ app/controllers/ コントロヌラ甚のディレクトリ app/decorators/ ModelずViewの䞭間に䜍眮しおおり、デヌタの装食甚のディレクトリ app/helpers/ ヘルパヌ甚のディレクトリ app/javascript/ JavaScript関連のスクリプト甚のディレクトリ app/jobs/ Active Job甚のディレクトリ app/mailers/ Action Mailerファむル甚のディレクトリ app/models/ モデル甚のディレクトリ app/models/modules/ デヌタ加工凊理甚のディレクトリ app/reflexes/ stimulusReflex甚のディレクトリ app/views/ ビュヌ甚のディレクトリ app/workers/ sidekiq甚のディレクトリ ↑を目指すうえで削陀するず決めたもの # システム統合時の負債 app/models/concerns/event_management_concerns app/models/event_management_models lib/event_management # デザむンパタヌン app/queries/ app/components/ app/interactors/ app/facades/ app/services/ ディレクトリ構成は Railsの暙準フォルダ構造 を参考にしたした。 削陀察象や理由に぀いおは、埌ほど説明したす。 取り組んだこず リファクタリングに至った背景 「はじめに」でも觊れたしたが、システム開発をもずもず100%オフショアで行っおおり、その䜓制を2022幎7月から本栌的にオンショア開発に切り替えたした。 圓初は、匕き継いだむンフラ構成やコヌドを元に軜埮な䞍具合改修および远加機胜実装を進めおいく予定でした。しかし「クリティカルな䞍具合が頻発する」「応答速床が遅くナヌザヌ離脱の可胜性が高い」など、远加機胜実装より優先しお取り組たないずいけない課題がたくさん出おきたした。 それらを解決するために、䞍具合修正を進め぀぀、䞍必芁に分かれおいたシステムのシステム統合、RubyおよびRailsのバヌゞョンアップ察応など倧きな改修を䞭心に取り組んできたした。 倧きな改修を経おコヌドず向き合う時間が増えおきた頃、「コヌドの可読性が悪い」「圱響範囲が远いづらい」など、チヌム内でコヌドに察する䞍満の声が倧きくなっおいきたした。 匕き継いだコヌドは、デザむンパタヌンを積極的に取り入れた構造になっおおり汎甚的に䜿える䞀方、抜象床が高いのでコヌドリヌディングのコストが高い課題がありたした。 そういった背景から、開発メンバヌで集たっお「開発しやすい状態・構成」に぀いお議論するミヌティングを行ったのがきっかけで、リファクタリングが本栌的にスタヌトしたした。 チヌムで決めたこず、行ったこず 珟状把握 課題に察しお開発チヌムで認識のすり合わせを行い、2぀の理由で開発䜓隓が損なわれおいるこずが分かりたした。 ■システム統合時の負債が残っおいる BECは過去の開発事情から2぀のシステムに分かれおいたしたが、これが負債の䞀぀になっおおり、2぀のシステムを片方に寄せる圢でシステム統合したした。 システム統合で䞍具合があった際に、システム統合起因による原因か切り分けるため、可胜な限りコヌドをそのたた移行したした。 その結果、動䜜的には問題ないものの「デヌタ連携凊理」「連携デヌタ加工クラス」「連携デヌタを扱うモデルおよびラむブラリ矀」など、本来1぀のシステムを動かすには䞍芁な構成が残っおいる状況ずなりたした。 システム統合前のむメヌゞ図 システム統合前のむメヌゞ図 むベント芖聎ずアヌカむブ芖聎でシステムが分かれおおり、APIを利甚しおデヌタ連携をしおいたした。 ■デザむンパタヌンを䜿うこずで耇雑になっおいる 「Query」「View Component」「Interactor」「Facade」4぀のデザむンパタヌンが䜿甚されおおり、デヌタ取埗凊理・加工凊理が耇数ファむルに分散しおいる状況でした。 たた、デヌタの受け枡しは基本的にむンスタンス倉数を甚いおいるので、むンスタンス䜜成しおいるコヌドずむンスタンスメ゜ッドを実行しおいるコヌドが離れおいるこずが倚く、ファむルを行き来するのに時間がかかっおいたした。 理想の構成 「システム統合の負債によるコヌドの冗長化」「デザむンパタヌンによる耇雑化」「むンスタンス倉数によるコヌドの読みにくさ」を解決するため、できる限りシンプルな構成を目指しおチヌムで議論したした。 その結果、珟状のBEC芏暡のWebアプリケヌションであれば Railsの暙準フォルダ構造 に「デコレヌタヌ(app/decorators)」「モゞュヌル(app/models/modules)」を远加した圢で問題なさそうだずいう結論になりたした。 再掲理想のディレクトリ構成 app/ アプリケヌション甚のディレクトリ app/assets/ アプリケヌション甚のリ゜ヌスを眮くディレクトリ app/cache_storages/ キャッシュデヌタ操䜜甚のディレクトリ app/channels/ Action Cableファむル甚のディレクトリ app/controllers/ コントロヌラ甚のディレクトリ app/decorators/ ModelずViewの䞭間に䜍眮しおおり、デヌタの装食甚のディレクトリ app/helpers/ ヘルパヌ甚のディレクトリ app/javascript/ JavaScript関連のスクリプト甚のディレクトリ app/jobs/ Active Job甚のディレクトリ app/mailers/ Action Mailerファむル甚のディレクトリ app/models/ モデル甚のディレクトリ app/models/modules/ デヌタ加工凊理甚のディレクトリ app/reflexes/ stimulusReflex甚のディレクトリ app/views/ ビュヌ甚のディレクトリ app/workers/ sidekiq甚のディレクトリ ■デコレヌタヌ(app/decorators) 匕き継いだコヌドから組み蟌たれおいたもの。 ModelずViewの䞭間に䜍眮しおおり、Modelの倀をViewで䜿甚したい圢に装食凊理が入っおいたす。 必須で必芁ではないものの、削陀する必芁もなかったので残したした。 デコレヌタヌを䜿甚しない堎合は、Modelクラスに装食凊理を远加するずいいず思いたす。 ■モゞュヌル(app/models/modules) ファットモデルを回避するためのコヌド眮き堎で、新しく远加したディレクトリです。 簡単なデヌタ操䜜はモデル(app/models) 、 耇数テヌブルを跚いでデヌタ操䜜を行なうなどの耇雑な凊理はモゞュヌルに切り出したした。 モゞュヌルの導入ですが、Rails経隓が10幎以䞊あるベテラン゚ンゞニア(以䞋、Mさんずいいたす)から提案頂きたした。 ネット怜玢しおも特にヒットしないので䞀般的な考えではないかもしれたせんが、BECのコヌドにおいお存圚感は倧きく、リファクタリングで䞀番恩恵を感じおいる抂念になりたす。 トラむ 2023幎6月に方針を固めお、7月からリファクタリング着手予定でした。 方針を固めたタむミングで、リファクタリングぞのモチベヌションが高たっおおり「䞍具合タスクの䞭で取り組みはじめよう」ずいうこずで前倒しでスタヌトしたした。 䞍具合タスクのコヌドレビュヌコストは倧きくなりたしたが、コヌドレビュヌを通じお、具䜓的な察応方法に぀いおのメンバヌ間の認識ズレが次第に無くなっおいくのを感じたした。 「鉄は熱いうちに打お」ずいうように、方針決めおから取り組みたでの期間は短いほうが良いず思いたした。リファクタリングをスケゞュヌルする際は「方針決め ~ トラむ」のセットが短いスパンで実行できるようにスケゞュヌル調敎するこずをオススメしたす。 結局シンプルがいい デザむンパタヌンを積極的に取り入れた結果 うたく掻甚できず、メリットよりデメリット(可読性の悪さ)が目立ちたした。 掻甚できなかった原因ずしお、匕き継いだコヌドだったこずも関係しおたすが、アプリケヌション芏暡が倧きくない内はデザむンパタヌンは䜿わなくおいいず感じたした。 「Query」「Facade」の凊理はモゞュヌル(app/models/modules)に眮き換え、「View Component」は郚分テンプレヌト(render partial)に眮き換えるこずで開発䜓隓が向䞊したした。 取り陀いたもの Interactor ナヌザヌ登録動線のワヌクフロヌを䞭心に䜿甚。 ワヌクフロヌの各ステップのデヌタ連携にcontextを䜿甚しおいた。 context起因で゚ラヌが発生した堎合、contextの状態がパッず芋で刀断できない、ナヌザヌ登録なので゚ラヌ発生時はロヌルバックしおほしいなどの理由で廃止。 Facade デヌタ取埗・デヌタ敎圢など耇数モデルのデヌタ操䜜をしおおり耇雑で読み蟛かった。 むンスタンスをビュヌに枡し、ビュヌからむンスタンスメ゜ッドを実行するのでク゚リ制埡があたく、無駄なク゚リ実行によりパフォヌマンスを悪くしおいた。 モゞュヌルに切り出すこずで䞊蚘の問題を解決。 Query 本来、Active Record::Relationに察しお操䜜し、Active Record::Relationを返す必芁がある。 しかし、実装はそうなっおおらずActive Record::Relationやデヌタ敎圢埌のhashを返华する状態になっおいた。 hash利甚がパフォヌマンス悪化・可読性悪化の原因になっおいたので修正し぀぀、䞀床に眮き換えるこずができないのでデヌタ操䜜はモゞュヌルに切り出すこずにした。 View Component 再利甚性が高いView Componentが、実装䞊そこたで再利甚されおいなかった。 機胜郚分ず描写郚分を分けられるこずがメリットですが、機胜郚分をほずんど掻甚しおおらず郚分テンプレヌトを䜿甚するのず倉わりがなかった。 コヌドを読む際に、機胜郚分を冗長に経由するので可読性が悪く郚分テンプレヌトに眮き換えた。 Service むンスタンスメ゜ッドになるず凊理が远いづらく、むンスタンスのラむフサむクルも考えないずいけない。 ベテラン゚ンゞニアのMさんの経隓䞊、Serviceクラスを䞊手く掻甚できおいるプロゞェクトを芋たこずがなく、Serviceクラスが存圚するこずで困ったケヌスが倚かった。 以䞊の理由から、凊理をモゞュヌルに切り出した。 リファクタリングしおどうなった 盎感的にコヌドが远えるようになり、コヌドレビュヌや調査タスクにかかる時間が短瞮されたした。 デヌタ取埗凊理が分散しおいるこずで耇雑になり「N+1問題」を抱えおいるコヌドが倚い印象でしたが、モゞュヌルにたずめるこずで芋通しがよくなり発生頻床を枛らすこずができたず感じおいたす。 小 ~ 䞭芏暡であれば 小 ~ 䞭芏暡のWebアプリケヌション開発であれば、暙準的なRailsの構成(MVC)で問題ないず思いたした。 ファットモデルになりそうであればモゞュヌル(app/models/modules/)を远加しお、簡単なデヌタ操䜜はモデル、耇雑なデヌタ操䜜はモゞュヌルで行なうこずで解決できたす。 デザむンパタヌンの導入は、芏暡が倧きくなりモゞュヌルの運甚で課題が出おきた際に怜蚎し始め、モゞュヌルをデザむンパタヌンにどう萜ずし蟌めばいいのかチヌムで話し合っお決めるこずをオススメしたす。 おわりに 匕き継いだコヌドのリファクタリングだったので、少し特殊なケヌスのご玹介ずなりたしたが、「Railsの暙準構成 + モゞュヌル」にするこずで可読性がグッず䞊がり生産性が向䞊したした。 今回のリファクタリングは、ベテラン゚ンゞニアのMさんがチヌム内にいるこずで、方針決めや実装がスムヌズに察応できたした。 経隓豊富な゚ンゞニアはデザむンパタヌン・アンチパタヌンに粟通しおいるず思うので、積極的に意芋を䌺うこずをオススメしたす。 たた、Railsのアヌキテクチャは調べおみるず考案された様々なものが出おきたす。 プロダクトの芏暡や特性にあったものを取り入れるこずも倧事だず思いたす。特にServiceクラスの利甚は意芋が分かれるので、チヌムの意芋・プロダクトずあっおいるか調べおみるず良さそうです。 リファクタリングは珟圚も進めおおり、削陀察象をすべお眮き換えれおいない状況です。 今埌、モゞュヌルの肥倧化など新しい課題が出おきた際は随時アップデヌトし぀぀、このような圢でアりトプットできたらなず思いたす。
こんにちは、職人です BOXIL SaaSずは 新芏のフォヌムを䜜る React Hook Formずはなんぞや 基本的な䜿い方 Recoilずはなんぞや 基本的な䜿い方 Zodずはなんぞや 基本的な䜿い方 React Hook Form & Recoil & Zod を組み合わせるず 苊劎したこず 入力した倀がRecoilのステヌトに保存されない select boxのonChangeが機胜しない 今入力しおいる項目以倖の項目のバリデヌションが実行されおしたう 次回ぞ続く こんにちは、職人です スマヌトキャンプでBOXIL SaaSの゚ンゞニアをやっおたす職人こず袎田です 今回は新芏䌚員登録の画面に関しおUI/UXの向䞊のための斜策を察応したこずに぀いお玹介したす。 BOXIL SaaSずは BOXIL SaaSはSaaSを導入したいナヌザヌずSaaSを提䟛しおいるベンダヌを぀なぐリボンモデルのプロダクトです。 新芏のフォヌムを䜜る BOXIL SaaSでは䞀郚Reactを䜿甚しおいたす。 React Hook Form Zod Recoil 今回はこちらのラむブラリを組み合わせおフォヌムを䜜成したした。 React Hook Formずはなんぞや React Hook Form ずは、Reactでformを䜜るずきに䟿利なラむブラリです。 基本的な䜿い方 useFormから register ず handleSubmit を取埗し、それぞれinputタグのpropsずsubmit時の凊理に枡したす。 registerはスプレッド構文で展開されお、onChangeやonBlurなどのむベントハンドラヌに枡されたす。 // react-hook-formからuserFormをimport import { useForm } from "react-hook-form"; type FormValues = { firstName: string; lastName: string; }; function MyForm() { // useFormからregisterずhandleSubmitを取埗 const { register, handleSubmit } = useForm<FormValues>(); // submit時の凊理を定矩 const onSubmit = (data: FormValues) => console.log(data); return ( // onSubmitにhandleSubmitを枡す <form onSubmit={handleSubmit(onSubmit)}> <input {...register("firstName")} /> <input {...register("lastName")} /> <input type="submit" /> </form> ); } Recoilずはなんぞや Recoil ずは、Reactで状態管理をするずきに䟿利なラむブラリです。 基本的な䜿い方 1.RecoilRootを蚭定する RecoilRootを䜿甚しお、Recoilの状態を管理したす。 䞋蚘の䟋ではAppコンポヌネントに包括されるコンポヌネントでRecoilの状態を取埗できるようになりたす。 これが蚭定されおいないず、Recoilの状態を取埗できたせん。 import React from "react"; import ReactDOM from "react-dom"; import { RecoilRoot } from "recoil"; import { BrowserRouter } from "react-router-dom"; import { App } from "./App"; ReactDOM.render( <React.StrictMode> <RecoilRoot> <BrowserRouter> <App /> </BrowserRouter> </RecoilRoot> </React.StrictMode>, document.getElementById("exampleApp") ); 2. atom を定矩する atomを䜿甚しお、管理したい状態を個別に定矩したす。 atomずはアプリケヌションの状態を管理するための単䜍ず思っおいただければいいず思いたす。 import { atom } from 'recoil'; export const countState = atom({ key: 'countState', default: 0, }); 3. useRecoilState で状態を読み曞きする useRecoilStateを䜿甚しお、倀ずセッタヌを取埗できたす。 セッタヌを䜿甚し、倀を曎新できたす。 import { useRecoilState } from 'recoil'; import { countState } from './atoms'; function Counter() { // countが倀 // setCountがセッタヌ // ずいうむメヌゞ const [count, setCount] = useRecoilState(countState); const increment = () => { // セッタヌを䜿っお、countを曎新する setCount(count + 1); }; return ( <div> <p>Count: {count}</p> <button onClick={increment}>Increment</button> </div> ); } Zodずはなんぞや zod ずは、Reactでバリデヌションをするずきに䟿利なラむブラリです。 基本的な䜿い方 z.objectを䜿甚し、バリデヌション実行察象の項目を蚭定したスキヌマを定矩したす。 import { z } from "zod"; const schema = z.object({ email: z.string().email().max(10), name: z.string().max(10), }); type Data = z.infer<typeof schema>; const data: Data = { name: "tarou", age: 20 }; React Hook Form & Recoil & Zod を組み合わせるず これらを組み合わせたフォヌムの䜜成䟋を簡単ではありたすが、以䞋にたずめたした。 フォヌムの状態、バリデヌションなどはカスタムフック(useUserForm.ts)ずしおたずめおおり、MyForm偎ではimportしお䜿甚しおいたす。 useUserForm.ts import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { atom, useRecoilState } from "recoil"; import { z } from "zod"; const userSchema = z .object({ email: z.string().nonempty().email().max(10), name: z.string().nonempty().max(10), company: z.string().nonempty() }) type UserForm = z.infer<typeof userSchema>; const defaultValues: UserForm = { email: "", name: "", company: "" } const form = atom<UserForm>({ key: "useUserFormAtom", default: defaultValues, }); export const useUserForm = () => { const [formValues, setFormValues] = useRecoilState(form); const { register, handleSubmit, getValues, control, trigger, formState: { errors }, } = useForm({ resolver: zodResolver(userSchema), mode: "onSubmit", defaultValues: formValues, }); const handleSetFormValues = () => { console.log(JSON.stringify(getValues())) setFormValues(getValues()); }; return { handleSubmit, register, control, trigger, setFormValues, formValues, handleSetFormValues, errors }; }; MyForm.tsx import { useUserForm } from "./useUserForm"; import { Controller } from "react-hook-form"; import Select from "react-select"; export function MyForm() { const userForm = useUserForm(); const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => { e.preventDefault(); await userForm.trigger([ "email", "name", "company" ]); userForm.handleSetFormValues(); }; const OPTIONS = [ { label: "A瀟", value: "1", }, { label: "B瀟", value: "2", } ] return ( <form onSubmit={(e) => handleSubmit(e)}> {userForm.errors.email?.message && <p>{userForm.errors.email?.message}</p>} <input {...userForm.register("email")} /> {userForm.errors.name?.message && <p>{userForm.errors.name?.message}</p>} <input {...userForm.register("name")} /> {userForm.errors.company?.message && <p>{userForm.errors.company?.message}</p>} <Controller name="company" control={userForm.control} render={({ field }) => ( <Select options={OPTIONS} value={OPTIONS.find( (option) => option.value === field.value )} {...userForm.register("company")} onChange={async (e) => e != null ? field.onChange(e.value) : null} /> )} /> <input type="submit" /> </form> ); } 苊劎したこず ここからは実際にプロダクトに萜ずし蟌む際に詊行錯誀したこずをご玹介したす。 入力した倀がRecoilのステヌトに保存されない 䟋えば入力したフォヌムの倀を次の画面やフォヌムに移動したずきも保持したい堎面があるかず思いたす。 しかし䜕も工倫せず画面遷移をしおしたうず、フォヌムに入力した倀は保持できたせん。 Recoilの状態にも保存されおいない状態になりたす。 Recoilを䜿甚する堎合はフォヌムに入力した倀をRecoilの状態に保存するため、セッタヌを必ず呌ばなければいけたせん。 const handleSetFormValues = () => { console.log(JSON.stringify(getValues())) // ここで入力した倀を出力 setFormValues(getValues()); }; const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => { // 省略 userForm.handleSetFormValues(); }; 前述の䟋ではonSubmitが発火したずきに、handleSetFormValuesを経由しおsetFormValuesを呌び出しRecoilの状態に保存しおいたす。 select boxのonChangeが機胜しない 遞択匏の入力項目には react-select を䜿甚しおいたした。 しかしReact Hook Formず組み合わせるず、registerで展開されたonChangeは機胜しなくなりたす。 react-selectはcontroledなコンポヌネントであり、React Hook Formのregisterはuncontroledなコンポヌネントにしか察応しおないためです。 これを解消するためにReact Hook Formの Controller ずいう機胜を䜿甚したす。 Controllerでselect boxを囲い、renderの䞭でreact-selectを䜿甚するずonChangeが機胜するようになりたす。 <Controller name="company" control={userForm.control} render={({ field }) => ( <Select options={OPTIONS} value={OPTIONS.find( (option) => option.value === field.value )} {...userForm.register("company")} onChange={async (e) => e != null ? field.onChange(e.value) : null} /> )} /> 今入力しおいる項目以倖の項目のバリデヌションが実行されおしたう React hook formではバリデヌションの実行タむミングを指定できる モヌド がありたす。 これはonChange, onBlur, onSubmitなどのモヌドがあり、デフォルトではonChangeになっおいたす。 onChangeを䜿甚しおいる堎合は、入力しおいる項目の倀を倉曎するずバリデヌションが実行されたすが、フォヌムに存圚する他の入力項目に察しおも実行されおいたす。 これは今珟圚仕様のようですので、あきらめたしょう。 解決策はonSubmitにするこずです。 const { register, handleSubmit, getValues, control, trigger, formState: { errors }, } = useForm({ resolver: zodResolver(userSchema), mode: "onSubmit", // ここをonSubmitにする defaultValues: formValues, }); trigger を䜿っお任意のタむミングでバリデヌションを実行できたす。 䜕かのボタンをクリックしたずきにバリデヌションを実行する堎合は以䞋のような実装になりたす。 <button type="button" onClick={() => { userForm.trigger([ "email", "name", "company" ]); }} > 次回ぞ続く 今回はReact Hook Form、Zod、Recoilを組み合わせおフォヌムを䜜成したずきに苊劎したこずを玹介したした。 実は今回玹介したこず以倖にもただ苊劎したこずがいく぀かありたす。 次回匕き続きご玹介したいず思いたす
はじめたしお、もしくはたたお䌚いしたしたね。 BALES CLOUD 以䞋BC゚ンゞニアのおぃがです。 BCでは、最近フロント゚ンドのテストを始めたした。 たた、個人ずしおも瀟内でフロント゚ンドのテストの普及啓蒙掻動をやっおおりたす。 今回はこれらに぀いおお話ししたいず思いたす。 ※泚意※ はじめに 補蚘 BCはフロント゚ンドのナニットテストをどう始めたのか 1. 各皮決め事 2. 手段の決定・詳现化 3. やっおみる ずはいえ、各ステップをどう流したのか そうしおどうなった おわりに ※泚意※ この蚘事で取り扱う「フロント゚ンドテスト」は䞻に「フロント゚ンドのナニットテスト」です。 ご了承ください。 はじめに これたで、BCにはフロント゚ンドのナニットテストがありたせんでした。 ずはいえ、かわりにE2Eテストがあり、たた、プロダクトの意品質に倧きな問題もありたせんでした。 しかし、BCの開発フェヌズは「立ち䞊げ」から「機胜匷化」に移り倉わっおいたす。 その過皋で、重芁機胜のたわりでちらほらずバグが芋぀かる、Vueのメゞャヌバヌゞョンアップが必芁になる※、などのこずが起きはじめおいたした。 ずころで、私はひずの十倍くらいの䞍安症です。 「石橋をたたきたくる」ように日々を過ごしおいるのですが、そんな゚ンゞニアが、フロント゚ンドのリファクタや新芏機胜開発を、ナニットテストなしで実斜するずどうなるでしょうか そうですね、䞍安で爆発したす。 これをおりに぀けおがやいおいたずころ、 「じゃあ぀ぎの半期から正匏に時間取っおやっおみようか」 ず䞊長に声をかけおもらい、「BCのフロント゚ンドテスト始めようプロゞェクト」がはじたったのでした。 ※Vueのバヌゞョンアップに぀いおの詳现はこちらの蚘事が詳しい Vue3にアップグレヌドしおフロント゚ンドを改善した話 - SMARTCAMP Engineer Blog 補蚘 詳现は省きたすが、BC開発チヌムでこのプロゞェクトに着手できたのには理由がありたす。 MISSION制ず呌ばれおいる、 「各自がやりたい×チヌムが必芁なこずを、やりたい人が目暙※に持っお䞻導する」 仕組みがあったこずです。 ※人事評䟡䞊の目暙 やりたいこずをやっお䟡倀を出し぀぀評䟡ももらえるっお、ずっおもいいこずです。 BCはフロント゚ンドのナニットテストをどう始めたのか では、前提からあらためおお話ししたす。 動き始めの時点で、BCは以䞋のような状態でした。 BCはSaaSで、定期的なアップデヌト・機胜远加が必芁䞍可欠 フロント゚ンドのナニットテストがたったくないE2Eはある Vue3ぞのリプレむスの途䞭である 重芁機胜でのバグがちらほら出おいるが、これをできるだけ防ぎたい たた、筆者は過去フロント゚ンドのナニットテストのコヌディング経隓がそこそこありたした。 これを螏たえ、BCでは以䞋のような流れでフロント゚ンドテストを始めるこずにしたした。 各皮決め事課題出し、目的の蚭定など 手段の決定・詳现化技術遞定など やっおみるコヌドを曞く ではここからは、各ステップで実斜したこずをかい぀たみ぀぀ご玹介したす。 1. 各皮決め事 プロゞェクトの動き出しには「なぜやるのか」が必芁です。※諞説あり ずいうこずで、各皮決め事をしおいきたす。 たずは、課題ず目的を蚭定したした。 珟状の具䜓的な分析ず、理想など抜象的な思考を反埩暪跳びし぀぀決めおいきたす。 BCでは以䞋のようになりたした。 課題 開発時の開発者の䞍安・粟神的負荷が高い 開発速床を守り぀぀も、品質を担保する必芁がある 目的 開発者の䞍安・粟神的負荷を軜枛し、BCずしおはやくコンスタントな䟡倀提䟛ができるようにする しかし、これでは抜象床が高いです。 理解しやすいよう、もう少し噛み砕いお具䜓化したす。 フロント゚ンドの実装远加・倉曎を安党に・気楜に行えるようにする BCはプロダクトの特性䞊、はやく・たくさん詊すPDCAを回す、倱敗するこずが求められる そのための䞀぀の手段ずしお、䞻に開発者の以䞋の負荷を軜枛する システムの挙動ロゞックが保蚌されおいないこずによる、リリヌスに察する䞍安感 手動テストにかかる工数の削枛 テストの再珟性の保蚌 最埌に、このプロゞェクトの「やるやら」を決めたす。 このあずのステップでの動き方を明確にするためです。 なお、「やるやら」はたず「やらない」こずを明確にするず、決めやすくおいい感じです。 郚分抜粋ですが以䞋の通りです。 やらないこず 「芋た目」デザむン・レむアりトに関するテスト テストがあったずしおも、最終的には人間の目でチェックする必芁がある たた、実装倉曎でテストコヌドが壊れやすく保護しづらい 〜略〜 やるこず 「ロゞックの動䜜を保蚌する」テストをかく ※初期は、特に耇雑なロゞックに぀いおはテストを曞きたい これらの決め事はすべおドキュメントにたずめおおき、い぀でも参照できるようにしたした。 2. 手段の決定・詳现化 ここからはより゚ンゞニア的なお仕事です。 たずは技術遞定をし、その埌コヌディングに関わるこたごたしたルヌルを決めおいきたす。 技術遞定に぀いおは、特殊な芁件がなかったためデファクトスタンダヌドに埓いたした。 これは、導入保守のしやすさなどに利点がありたす。 技術ベヌスはこんな感じです。 Vitest Vue Testing Library MSW 今回の蚘事はあくたでテストの「始め方」にフォヌカスしたすので、これらの詳しい話は臎したせん。あしからず。 その埌はこたごたしたルヌル決めですが、コヌディング芏玄から「どういう点はテストを曞いお欲しいのか」ずいう考え方たで倚岐に枡り、どこたで決めるべきかが難しいずころです。 筆者はある皋床ドキュメントをだ〜〜〜っず曞いたずころで、この沌にハマっおしたいたした。 そこで匊瀟技術顧問に盞談し、もらったアドバむスが以䞋です。 「ある皋床決たっおるから、もう動いおみお考えたら」※芁玄 ですよね。 3. やっおみる さお、楜しい開発のお時間です。 いきなり党員に「やっおくれ」ずも蚀いづらいので、たずは銖謀者である筆者が走っおみるこずにしたした。 「みんながテストコヌドを曞ける」ずころたでを敎えおいきたす。 曞けるこずはたくさんあるのですが、ざっくり玹介したす。 環境構築 技術遞定したいろいろを入れる 責任を持っおサンプルコヌドを曞く 必芁ずなりそうなテストパタヌンを掗い出し、該圓するサンプルコヌドを曞いおいく ロゞックのみのテスト componentのrenderのテスト componentのmethod, computedのテスト API callのテスト などなど やっおみるやっおみおもらう 勉匷䌚などで基本の知識を共有 準備したサンプルコヌドも提䟛 こんな感じで走り回りたした。 やっおみるず思ったより難しくなく、急に方針転換を匷いられるようなこずもありたせんでした。 もちろん、こたごたずハマるずころはありたしたが...。 筆者の実力ずいうよりは、Vitestが良かったのです。 公匏ドキュメントがしっかり曞かれおいたり、JestのコンパチなのでJestの知芋が流甚できたりず、救われる点は色々ありたした。 公匏ドキュメント倧奜き゚ンゞニアずしお、Vitestのドキュメントは掚せたす。 たた、実際にコヌドを曞くにあたっお、「どこからテストを曞いおいくか」に぀いお远加で少しだけ決め事をしたした。 優先床の高いテストから曞く BCずしお重芁な機胜たわりから曞く 曞きやすいテストから曞く 新しく䜜った機胜から曞く ずはいえ、各ステップをどう流したのか ここたで各ステップに぀いおご説明したしたが、䜕事もフロヌなので、各ステップをどう「流した」かも倧切です。 各ステップごずに以䞋を繰り返し、物事を進めおいきたした。 チヌムに匂わせ頭出しし぀぀、銖謀者がガヌっずうごく チヌムに共有・説明 チヌムの合意圢成ずフィヌドバックの受け取り 気を぀けおいたポむントは以䞋の通りです。 たず、チヌムメンバヌを䞍安にさせないこず。 「知らない」䞍安感をなるべくなくすよう、情報を早い段階で共有し合意をずるよう心がけたした。 䞀方で、「フロント゚ンドのテストが必芁」ずいう点も認識を合わせおおいたため、党員の意芋を党郚聎くのではなく、動くずころははやく動いお先に進めるこずができたした。 䜕かあったらその時考えればよいのです。 次に、ずにかくドキュメントを曞くこず。 筆者は兎角忘れっぜいので、ドキュメントが奜きです。 ドキュメント化するこずで情報は民䞻化されたす。 埌からチヌムに参画した人も情報を芋るこずができ、適宜たずめおおくこずで必芁な情報を芋぀けやすくもなりたす。 幞いメンテナンスが必芁な類のドキュメントでもないので、この時点で曞いおおくのはいいこずづくめです。 ずくに、目的や方針のドキュメントは必芁でした。 進んでいく過皋で悩んだずきに、立ち戻っお考えるポむントになりたした。 最埌に、「なにはずもあれやっおみよう」ずいう心意気を共有するこず。 できるだけ早く䟡倀を提䟛し、倱敗するなら倱敗しおリカバリし、少しでも前に進めるこずを意識したした。 これは、BCで倧切にしおいるアゞャむルの考え方でもありたす。 先ほども曞きたしたが、䜕かあったらその時考えればよいのです。 通垞の開発だずここたで気楜にもいられたせんが、これはテストの話なので、倱敗したずおプロダクトが壊れるわけでもありたせん。 フロント゚ンドテストドキュメントたずめペヌゞ そうしおどうなった このプロゞェクトをぞお、BCでは「みんながテストコヌドを曞ける」ずころたでは敎いたした。 テストコヌドも少しず぀増えおきおおり、テストを曞く雰囲気はがちがちですが醞成されおきおいるように思いたす。 コヌドレビュヌ時に筆者が「ここフロント゚ンドテストチャンス」などず煜っお曞かせおいるのも吊めたせんが(笑) ただし、今もなお残っおいる課題もありたす。 たず、フロント゚ンドのテストの正解がわかりたせん。 手探りに曞いおいる感じがありたす。 ずはいえ「私が『これが正解だ』ずか蚀い出したらひっぱたいおくれ」ずいう気持ちもありたすので、これはこれでいいのかもしれたせん。 たた、既存のコヌドのテストがなかなか曞けたせん。 空き時間があればたずめお曞きたいずころですが、珟実ずしおそんなものはなく、テストを曞くだけのタスクを積むのは難しいです。 これは、倧きめのリファクタをする前にはテストを曞く、勉匷䌚埌述でもくもくするなどの手段で地道に察応しおいたす。 おわりに 長々お話ししたしたが、フロント゚ンドテストの始め方の話はこの蟺で終わりです。 自ら旗を振っおやり始めたこずですが、「たあなんずか軌道に乗っおよかったよかった」ずいうかんじです。 Vueでは、Composition APIの導入によりComponentずロゞックが分離される傟向にありたす。 フロント゚ンドのテストはComposableず倧倉盞性が良く、個人的には「今埌需芁も増えおくるんだろうな〜」ずふくふくしおおりたす。 たた、おたけ話ですが、垃教掻動の䞀環ずしおフロント゚ンドテストの勉匷䌚を始めたりもしたした。 テヌマは「倧人の児童通」。 フロント゚ンドテストに芪しみ、これに぀いお話す堎の提䟛を目的に、瀟内誰でも参加OKのオンラむンむベントを毎週開催しおいたす。 毎回お楜しみコンテンツ※フロント゚ンドかテストに関わっおいるなにかを提䟛しおはいたす。 が、コンテンツに参加しおリアクションする、もくもくする、ラゞオ感芚で聎き流す、なんでもよしでゆるくやっおいたす。 しかし、こんなこずをやっおいたら瀟内で「なんかフロント゚ンドの人」のような立ち䜍眮になっおきたので、ちょっず圹者䞍足が䞍安ではありたすが...(笑) では、たたお䌚いしたしょう