コネヒト開発者ブログ

コネヒト開発者ブログ

コネヒトはiOSDC Japan 2023に協賛いたします!

こんにちは、iOSアプリエンジニアの@yanamura_です!

本日は、iOSアプリ開発者の祭典iOSDC Japan 2023に協賛するお知らせです。

コネヒトはiOSDC Japan 2023に協賛いたします!

iOSDC Japan 2023に、シルバースポンサーとして協賛いたします。

iosdc.jp

スポンサーするにあたって、コネヒトは「人の生活になくてはならないものをつくる」というミッションを掲げているので、技術コミュニティについても同様に、サポートして一緒に盛り上げていくことができたら、と思っております。

イベント概要

  • 開催 2023年9月1日(金)~ 9月3日(日)
  • 場所 早稲田大学理工学部 西早稲田キャンパス + ニコニコ生放送
  • 対象 iOS関連技術およびすべてのソフトウェア技術者
  • タイムテーブル https://fortee.jp/iosdc-japan-2023/timetable
  • 主催 iOSDC Japan 2023 実行委員会 (実行委員長 長谷川智希)
  • 共催 早稲田大学 理工学術院, 早稲田大学グローバル科学知融合研究所
  • 協力 WASEDA-EDGE人材育成プログラム, Beyond 2020 NEXT PROJECT, NEW

iOSDCトークンはこちら!

#mamari-swiftui

これはiOSDCチャレンジで使うトークンです!

今年もオンラインだけではなく、オフラインでも開催される予定です。私も会場に足を運びたいと思っています!会場でお会いした際にはぜひお話しましょう!

オペレーションズ・リサーチ 機関誌に弊社コネヒトの事例を寄稿しました

みなさんこんにちは。MLエンジニアのたかぱいです。

この度、OR学会(オペレーションズ・リサーチ学会)が発刊する機関誌68巻8号にて「出産育児に関する女性向けコミュニティサービスにおける機械学習の活用事例」というタイトルで、弊社の事例が掲載されました!

株式会社エルデシュ代表取締役の岩永 二郎さん、筑波大学の武井 柊悟さんとの共著になります。

オペレーションズ・リサーチ機関誌68巻8号の表紙

記事の中では、弊社が運営する「ママリ」というサービスに蓄積された行動履歴や検索履歴、投稿データに対して、機械学習を用いて課題解決をした以下二つの事例について、アプローチ方法や取り組みがもたらした結果などを解説しています。

  • Word2Vecとニューラルネットを用いたユーザへのQ&A推薦
  • BERTと勾配ブースティング決定木を用いたキーワード辞書作成

詳細な内容に関してはOR学会の機関誌をご覧ください。
会員の方は、以下よりPDFを閲覧することができます。

orsj.org

また、この度の寄稿に際して、岩永 二郎さん、武井 柊悟さんに多大なるご協力とサポートをいただきました。
この場を借りて心より感謝申し上げます。


今後も弊社は「あなたの家族像が実現できる社会をつくる」というビジョンのもと、事業活動だけにとどまらず、産学連携によるデータ活用の可能性を広げていく取り組みを続けて参ります!

産学連携の具体的な取り組みに関しましては、弊社HPのプレスリリースをご覧ください

connehito.com

コネヒトデータの活用にご興味のある大学や研究機関、研究者の方は下記からお問い合わせください。

産学連携プロジェクトお問い合わせフォーム

1児のママとして、ユーザーや仲間が喜ぶことを実現する | エンジニアインタビュー vol.2 Web エンジニア 高橋さん

こんにちは!コネヒトのプラットフォームグループでインフラエンジニアをしている @sasashuuu です。

本日の記事はコネヒトで働くエンジニアへのインタビュー企画第二弾です!

(前回のインタビュー記事:エンジニアインタビュー vol.1 iOSエンジニア 田中さん

Web エンジニアとしてママリの開発に従事するほみちゃんへのインタビューした際の内容をお届けしたいと思います!

  • sasashuuu(画像右)
  • ほみちゃん(画像左)

120名の総合職採用の中から選ばれ、思わぬ形でスタートしたエンジニアのキャリア!

sasashuuu:では早速インタビューしていきたいと思いますので、ほみちゃん、今日はよろしくお願いします!まずは簡単な自己紹介をお願いできればと思うので、名前やニックネーム、簡単なキャリアなどをお願いします。

ほみちゃん:高橋奈穂美です。社内では「ほみちゃん」というあだ名をつけてもらいました。エンジニア歴は多分6年ぐらいです。途中産休・育休もあったので実質何年かは覚えてないんですけど。新卒では広告の会社に総合職で入社しました。特にエンジニアを希望していた訳ではないのですが、その年だけ120名くらいの総合職採用の新卒の中から2名だけエンジニアに配属する枠があり、それに選ばれてエンジニアになりました。大学はシステム系だったんですけど。そこから育休・産休を3年目で取り、仕事の価値観が変わることがあって、もう少しエンジニア組織で働きたいなと思うようになり、転職をしました。コネヒトに入る前に一つ会社を挟んでいるんですけど、そこでより事業会社で働きたいという気持ちが強くなり、去年の6月くらいから転職活動をし、(同年)8月頃にコネヒトに入社しました。

sasashuuu:ファーストキャリアは全然エンジニアになるつもりはなかったんですね。(社内向けのプロフィールを見ながら)プロフィールに「エンジニアは向いていないと思ったので総合職採用で入社した」とあって気になったのですが、なんでそう思ったんですか?

ほみちゃん:大学が理工学部で授業でプログラミングがあったんですね。1回生の時に C 言語とかあったんですけど、単位落としていたんですよね(笑)その時はプログラムもちんぷんかんぷんで、「プログラムなんて自分は無理だ」と思い…。周りは SE へ就職する友達とかが多いかったんですが、広告代理店を選んだという感じですね。なので、入社初日にシステム開発部への配属と言われ時は、ぽかーんという感じでした(笑)

sasashuuu:(笑)そこでいきなり告げられて、「これからどうなるんだろう…」みたいなのはあったと思うんですが、(社内向けのプロフィールを見ながら)プロフィールに「優秀なトレーナーが丁寧に教えてくれたためなんとかエンジニアになることができた」とありますね。

ほみちゃん:そうなんです、付きっきりで教えてくれて教え方も上手だったので。業務交えて開発ができるようになっていったという感じですね。

sasashuuu:なるほど、すごい。僕もぜひ会ってみたいな。その後もエンジニアとしてキャリア歩み続けられているのには何かモチベーションとかあったりしますか?

ほみちゃん:最初は苦手意識がありつつ、今までも自信があるとはいえないですが、なんだかんだで、コード書いてるのが好きで。MTG 嫌だって訳じゃないんですけど(笑)

コードを真剣に3時間4時間ぐらいずっと書いているのが好きで、2年目ぐらいから意外と合っているかもなと思うようになって、そうなったからにはちゃんと頑張らないとなと思って。モチベーションは単純に「コード書くのが楽しいから」なのかなあ。

sasashuuu:エンジニアの鑑のような回答ですね。めっちゃ良いと思いました。最初挫折したもののそこから時間をかけ、結果向いてたんじゃないかと思い、今もエンジニアの道を歩み続けているということでよかったです。

チームのメンバーがとにかく面白い!to C の開発が楽しい!

sasashuuu:所属チームや仕事内容にも触れていきたいと思います。普段どんなチームでどのような仕事をしているんですか?

ほみちゃん:所属チームは Red チームというママリアプリの開発チームでバックエンド開発をしています。

sasashuuu:まさに主力サービスの最前線の開発現場でエンジニアをしている感じですかね。所属チームの魅力や仕事の面白さについても聞かせてもらえますか?

ほみちゃん:Red チームの魅力は色々あるんですが、1つのMTGで笑わないことがないくらい誰かしらが笑いを起こして、雰囲気がすっごい良いところ。もちろんふざけてるだけではなくて議論するところは時間が押すくらい。みんなそれぞれ考えを持っていて。意見を言わない人があまりいなくて。雰囲気がいいことで新入社員の方も早い段階で意見を言ってくれます。

sasashuuu:(社内の zoom 視聴者からのコメントを見ながら)「誰が一番笑わせてくれますか?」というコメントがきてますね(笑)

それに通ずる話にもなるかもしれないのですが、どうやってそんな雰囲気づくりが生まれているのかとかって感じることはありますか?

ほみちゃん:ゆりこ *1 がきっかけになることが多いかもしれないですね。翌週からタイへワーケーションをしに行くメンバーがいたんですが、「じゃあその週は挨拶をコップンカー *2 にしましょう」といきなりぶっ込んできたり(笑)

まあでもチーム全員が面白いからじゃないですかね。

sasashuuu:(笑)

ほみちゃん:仕事の面白さは、ずっとやりたかった to C の開発をユーザーの一番近くでやれていることで、特に印象に残っているのは「ママリ抽選会」です。短期間での開発というのもあり、追われる状況だったり、シニアエンジニアの方に鬼のレビューを受けたり、やってるときはしんどかったですが、終わってみるとユーザーの声なども聞いて自分の開発したものが世に出ていくのがやっぱ楽しいなと思いました。

sasashuuu:ふむふむ、なるほど。今出てきたママリ抽選会の内容について聞かせてもらえますか?

ほみちゃん:ママリは質問とか回答をするとポイントをもらえるのですが、今まで使えるところが用意できてなかったんですね。それを PdM などと試行錯誤して、そのポイントを使って抽選を行い、抽選を回すと、1等、2等、3等で Amazon ギフト券をもらえる機能を提供し始めていて、それがママリ抽選会ですね。

sasashuuu:ポイントの有効活用として生まれた感じなんですね。そのママリ抽選会で開発目線で苦労した点や身になったこと・良かったことなどはありますか?

ほみちゃん:苦労した点は、大きな開発だったので、抽選会が何なのかというドメインをしっかり理解して、コードに落とすということが難しかったですね。ロジック自体はみんなで考えていくことが多かったのですが、設計が一番苦労したと思います。

sasashuuu:なるほど。先ほどコード書くのが好きと言ってましたが、そういった設計などコードを書く以外の部分への興味とか関心もあるんですか?

ほみちゃん:設計も好きです。いいアーキテクチャで書いていくっていうのは好きで。型にハマった時に快感があるなと思います。

まあでもこの時は時間がなく、楽しいよりは焦りの方が強かったので楽しんで開発できたかというとそうじゃないですね(笑)

sasashuuu:振り返って見れば楽しかったな、という感じですかね。

ほみちゃん:そうです、そうです。

sasashuuu:抽選会って結構イベント感が強いと思うのですが、リリースした後の反響や手応えはありましたか?

ほみちゃん:お問い合わせで「抽選会楽しい」や「当たって嬉しい」といった感想が寄せられていました。「ママリポイントって何に使うの?」という問い合わせも(以前)多かったので、そういったところ含めてよかったかなと。

sasashuuu:なるほど。ありがとうございます。いい話だ〜。

ラフで面白い&技術好きな人達が集まるコネヒト

sasashuuu:次の質問に移っていければと思うんですが、コネヒトのエンジニアの印象について(どんな人が集まる印象かみたいなところとか)あればラフに教えてもらえますか。

ほみちゃん:エンジニアも面白い人が多いなと思います。あと、昨日(社内の)飲み会してて思ったのが短パン履いてる人めっちゃ多いのででラフな環境なんだなーと(笑)

あとはやっぱ技術的なことが好きな人が多いのかなって思います。輪読会も定期的にやってるし、技術を手段として捉えるだけじゃなくて、ちゃんと楽しんでやっている人達が多い印象ですね。

sasashuuu:つまり最高ってことですね!(笑)

ほみちゃん:そうですね、最高ってことですね(笑)

sasashuuu:たしかにユニークな発想を持った方とかが多く、それで技術も好きという感じなので、エンジニアとしても強みのある方が多いかなと思ったりしています。

働くママとして感じるコネヒトへの魅力

sasashuuu:色々聞いて来たんですが、世の中のママの味方になるママリを開発しているほみちゃんですが、ほみちゃん自身もご結婚されていてお子さんもいるということなので、働きながらお仕事されているという感じかと思います。そんな中で働くママエンジニアとして感じているコネヒトの魅力みたいなものもあれば聞いてみたいなと思ったのですが、この辺ってどうでしょう?

ほみちゃん:エンジニアだからっていうのはあまり関係ないかもしれないですが、子育てしやすい環境かなと思っています。こういう会社が当たり前になるのがいいんだろうなと。チームでいろいろ話している時、ママ目線は考えつつも、ママは人によって違うので自分の目線を捨てるというのも考えながらやってますね。

sasashuuu:子育てしやすい環境の話、僕自身結婚してなくて子供もいないんですけど、(社内の)ちょっとした勤怠連絡で「子供の体調が悪くて、一旦抜けます」みたいなことがあっても、みんなの(Slackの)リアクションやスタンプの付け方・コメントをみても理解がある人達でみんなあたたく見守っているんだなと感じたりしています。あと(ママ目線の話の)俯瞰してみる、みたいなのもいいなと思いました。

AmazonインセンティブAPI を使った実装で PdM の仕事を自動化し、社内の業務改善に貢献!

sasashuuu:最近、Amazon API の導入をリード *3 されていたそうですが、どういう経緯で進めたのかや良かったこと・困ったこととかも聞いていけたらと思います。よろしくお願いします。

ほみちゃん:チームの出社日が金曜日なのですが、その際に PdM が ママリ抽選会の賞品の Amazon ギフト券を手作業でひいひい言いながらユーザーにメール送信している現場を見て…。

API とかないの?というところから調査した感じです。

あるんだなーということは確認して、できそうなのはできそうという軽い気持ちで見て、大体こういうのって(実践導入が)流れるかなーと思っていたところ、同じチームメンバーのエンジニアから背中を押されてやっていった感じです。他のタスクは巻き取るから頑張ってという感じで。

良かったことは、社内の業務改善ができたことです。ママリアプリを開発していると社内の改善みたいなのってだんだん忘れていっちゃいがちだなと思うので、そこができたのが良かったかなーと思います。

あと、1人で外部の API を調査から連携をする開発を1からやったことはなかったので、単純にいい経験でした。

困ったことは、Amazon API のドキュメントが一見分かりやすそうで、分かりにくかったのがありました。(笑)ただドキュメント読んでるだけでは実装できなさそうで、色々調べて。とにかく(出回っている)情報が少なかったので。1件だけあった Qiita の記事が役に立ち、Amazon が用意している sample コードの存在なども知り、それを使うとスムーズに上手くいって。API 利用の実装はそんなに大変ではなかったんですが、エラーハンドリングや設計の部分は時間がかかったなと思います。あと、モックのテストとかもやったことがなかったので。

sasashuuu:ありがとうございます、とても内容の濃い Amazon API を使った開発裏話を聞けました。誰かの困りごとを技術で解決するみたいなところはエンジニアの醍醐味の1つでもあると思うので、めちゃめちゃナイスな価値を生み出されたと思いました。あと情報量が少ない中、頑張って奮闘したんだなという苦労が伝わりました。何かを実現したい時に参考になる情報がない、選考事例がないみたいなのはめちゃ大変だと思うので、そんな中やり遂げたのはすごいなあと思いました。

バッチ処理成功の際の歓喜の瞬間

改善ムーブの姿勢は育休中に感じた仕事に対する価値観の変化がきっかけ

sasashuuu:(社内の zoom 視聴者からのコメントを見ながら)「ほみちゃんの改善に対する姿勢はナチュラルな振る舞いなんですか?」という質問が来ていますね。

ほみちゃん:キャリアのところでも話したかもしれないのですが、育休・産休に入ってから結構仕事の価値観が変わったところがあってその辺からかな。社会人1年目、2年目などは目の前のことに取り組んでいたのですが、子供ができて子育てが大変で…。子育てって誰も褒めてくれないですが、仕事ってお金になったりとか何かしらの形で返してくれるじゃないですか。そこが仕事やっているのが楽しいなって思って。別に子育てが嫌なわけではないんですけど。そこから業務のこととかで気になったこととか何でも言うようにになったのかなと。

sasashuuu:改善とか仕事が楽しいと思えるサイクルが回せるのは理想ですよね、めちゃ良いなと思いました。それでは時間になったので、(質問などの)駆け込みがなければ今日のインタビューはこのくらいにさせていただこうと思いますが…。

katsutomu *4:次この人のインタビュー聞きたいとかあります?

ほみちゃん:よっしー *5 とか。私がバディ *6 をしている。

katsutomu:よっしーのここが聞きたいとかあります?

ほみちゃん:よっしーさんのキャリアはもともとエンジニアじゃなかったと思うので、そこら辺何が大変だったかなとか気になります。

katsutomu:よし、じゃあ次はよっしーということでみなさんお楽しみにしておいてください!

sasashuuu:今日はインタビューありがとうございました!

ほみちゃん:ありがとうございました!

*1:前回インタビューでインタビュイーをつとめた iOS エンジニアの田中さん。記事は エンジニアインタビュー vol.1 iOSエンジニア 田中さん を参照

*2:タイ語で「ありがとう」の意味を持つ言葉

*3:詳細は過去のブログ記事 ママリ抽選会にAmazonインセンティブAPIを導入してみました を参照

*4:前回インタビュー企画 エンジニアインタビュー vol.1 iOSエンジニア 田中さん でインタビュアーを務めた Android エンジニア

*5:プラットフォームグループのインフラエンジニア(「よっしー」というニックネームで呼ばれている)

*6:コネヒトでは入社したメンバーの立ち上がりをサポートしてくれる制度があり、その担当メンバーのことを指す

エンジニア発信でLLMを用いた機能のリリースまでの工夫とユーザーの反応

こんにちは。Androidエンジニアの @katsutomuです。

最近、狩野英孝さんのマイクラ配信にハマっています。 リスナーとのやり取りや、配信時に起きるトラブルに和ませてもらっています。みなさんもオススメのマイクラ動画があれば教えてください。

さて本日は、LLM(大規模言語モデル)であるOpenAI社のChat Completion APIを用いた機能をプロダクトにリリースしたので、そこに至るまでにどのようにプロジェクトを進めていったのかを中心に、2記事に分けてお話ししていこうと思います。

今日は、導入の進め方とリリース後のユーザーさんの反応を、katsutomuとPdMのおりちゃんの共著として、お伝えできればと思います!

モチベーション

今回の施策はエンジニア発で、価値ある機能を作りたいという想いで施策の実行を進めました。 昨今、コネヒトが組織として成長する一方で、役割分担が進みエンジニアからアイデアを出して施策を進める事例が少しずつ減ってきており、歯痒さを感じておりました。

ユーザーを深掘り、アイデアの段階から技術的アプローチでの解決策を考え、課題解決をすることがプロダクト開発の面白みの1つと考えているので、小さくても事例を作ることを目指し、実行に至りました。

ユーザーの課題を元にアイデアをブレストする

とはいえ、何も制約がないと進めづらくなると思い、機械学習×ネイティブアプリで制約をつけることを決めて、iOSエンジニアのゆりこと、MLエンジニアのたかぱいに声をかけて、アイデアの検討をはじめました。最低限決めたことは以下の通りです。

  • DAU(1日あたりのアクティブユーザー)に変化がありそうなアイデアを考える
  • 30min/weekのもくもくタイムで同期する

この段階から、PdMのおりちゃんに参加してもらうことも考えましたが、まずはたたき台になるアイデアを用意した方が意思決定がしやすいと考えて、まずはエンジニアだけで進めることにしました。

おりちゃんが、プロダクトの現状のサマリーや過去のユーザーインタビューなど、ユーザーの課題感の判断材料になるドキュメントを作ってくれていたので、そこから課題をピックアップして、解決策をそれぞれが考えてくることから始め、LLMの活用やFirebase 向け ML Kitでのスマートリプライを活用する案があがりました。

回答文を書く補助機能としてあげたスマートリプライ機能のアイデアは、LLMを用いてユーザーの補助をすると良いのではないか?というフィードバックもあり、社内で活用しているチャットボットで感触を掴みながら進めました。

LangChainとOpenAI APIを組み合わせて、文脈を考慮して会話できるSlack Botを作った話 - コネヒト開発者ブログ

このように施策候補を作り、スクラムチームの開発フローに乗せるために、以下の3つの施策をリファインメントの場に持ち込むことにしました。

チームを巻き込み、より良いアイデアを具体化する

リファインメント内でチームで会話し、実験していく価値があると判断できたので、PdMにもミーティングに参加してもらい、具体的な施策化を進めていきました。

結果的には、当初のアイデアとは違う、質問本文の最初に質問内容の要約を挿入する施策を進めることにはなりましたが、LLMをユーザーの補助機能として活用するというアイデアは引き継ぎ、実現方法をより具体化することを進めていきました。

いくつか抜粋して紹介すると、以下のような議題があがりました。

  • LLMのAPIをNativeアプリから直接叩くか、社内のAPIを経由するか
  • 要約文は、どのタイミングでユーザーに使ってもらうか。その場合ボタンを押してもらうか
  • 施策分析のためには、どのようなデータが必要か

毎回、図を見ながらワイワイと意見交換して、施策を詰めていけていたと思います。

キックオフからリリースまでのスケジュールをまとめると以下の通りでした。

  • キックオフ: 2023/04/21
  • アイデア検討・実装施策の決定: 04/27 ~ 05/24
  • 実装や社内PoC:05/24 ~ 06/18
  • リリース:06/19

実装を開始してからは、約3weekでリリースまで進めることができました。新しい機能の導入事例としてはまずまずといったスピード感と思いますが、今後はもっとリリースを早めて、より早くにユーザーに使ってもらいフィードバックをもらう方法を模索していきたいと思います。

このあとは、PdMのおりちゃんからユーザーからの反応を紹介してもらいます!

リリース後のユーザーからの反応

ママリアプリのPdMをやっています、おりです。

私からは、リリース後の反応について紹介します!

ママリ内での投稿

リリースして、早速ママリ内でこの機能に対する反応のお声がありました!

※ママリアプリでは、妊娠・出産・子育てのお悩み以外でも、ママリ機能に対する率直なお声を含む雑談やつぶやき投稿も日々盛り上がっており、主にCSのメンバーがママリに対してのフィードバックやご要望の投稿を即座にキャッチしてくださるので助かっています!

例えば以下のようなお声が上がってきました。

自動で要約を作成して挿入できる、って… ママリ機能すごい✨ たしかにめちゃくちゃ長文で、途中で読むの断念することよくあるから 助かる😂

要約機能が面白くて遊んでしまう!

ママリの要約を挿入するを使ってみました!

AI搭載なんかな??今すごいよね。

実際に色々な投稿文を打ち込み、どんな要約がされるのかを楽しんでいる様子も見られました。

本機能で期待していた使用方法とは正直異なるのですが、楽しんでもらえているのは素直に嬉しいですね!

利用データ

一方で、利用するユーザーの数は期待値よりも少ない状態でした。

「質問文に要約が挿入されることで、閲覧者(回答する側)が一覧の中から自分が答えられる質問を探しやすくなるようにしたい」という本来の目的を達成するためには、利用率を上げる必要がありました。

そこで

  • そもそも気づかれていないのか?
  • 気づいているけど使わないのか?
  • 仮にこれがデフォルトで挿入された場合印象としてマイナスになることはあるか?

といったことを深ぼるためにユーザーインタビューを行いました。

ユーザーインタビューでのお声

ユーザーインタビューでは、以下のような気づきがありました。

  • 投稿に慣れていない人にとっては、そもそも気づかれづらい
  • 投稿に慣れているユーザーにとっては、自分で文章の冒頭に要約を挿入することが負担ではないため、わざわざ使わない
  • ただし、ボタンをタップせずに自動的に挿入されることに対してネガティブに思わない
  • 一覧で要約が閲覧できることは便利だと感じてもらえる

これらの気づきを踏まえ、今度は「ユーザーに能動的に動いてもらうのではなく、いかに体験の中で自然と、でも強制感はなく要約を挿入できるか?」という問いに向き合っています!

この問いに対しても早速エンジニアのみんなが動くものを作り、それを見ながら議論ができているので、最速で仮説検証を回し、ユーザーにとっての価値を高めたいと思っています!

最後に

今回は、エンジニア発信の機能をリリースした時の工夫とその後の反応について紹介させてもらいました!具体的な実装内容やその他の工夫点は、近日中にMLエンジニアのたかぱいとiOSエンジニアのゆりこからもブログで紹介してもらう予定です。ぜひお読みください!

コネヒトでは一緒に働く仲間を募集しています! そして興味持っていただけた方は気軽にご連絡ください!

www.wantedly.com

ママリ抽選会にAmazonインセンティブAPIを導入してみました

こんにちは。サーバーサイドエンジニアをしている高橋です。 今回はAmazonAPIの導入に至って同じように導入したいと思っている方へ少しでも参考になったらと思いブログを書いてみました。

導入背景

コネヒトでは3月にリリースされたママリ抽選会という機能があります。 ママリ抽選会については以前ブログで紹介しているのでこちらをどうぞ↓

tech.connehito.com

そこで当選者に対してAmazonギフトコードを送付しているのですが、今まではPdMが自らAmazonの管理画面に入り手動でギフトコードを送付しておりました。 毎月の作業であり、ヒューマンエラーが起こる危険性もあるため、自動化をするに至りました。

調査

調べてみるとAmazonインセンティブAPI が公開されていることはすぐに分かりました。 ですがコネヒトでは導入実績がないため少し不安な気持ちがありました。開発者ガイドを読んでみると、丁寧に書かれていて理解しやすかったため、大きな抵抗なく導入ができそうだと感じました。

検証

Amazonがサンドボックス環境を提供してくれるため、ローカル環境でギフトコードが発行できるところまで実装してみました。しかし、ドキュメントに記載しているリクエストだけではダメだということが分かりました。 そんな時に元々目を通していたAmazonインセンティブAPI実装(Amazonギフト券/giftcode) - Qiitaの記事を思い出し、サンプルコードを使用すれば実装が楽ということを思い出しそちらを使って実装しました。 多少リファクタリングは必要でしたが、簡単に実装することができました。

導入手順

こちらのAmazonインセンティブAPIとの統合プロセスについてと被る部分はありますが、私が実際に行った導入手順を紹介します。

  1. アカウントの作成
  2. アカウントのアクセスキー情報をAmazonにメールで知らせる
    1. サンドボックス環境を構築してくれる。
  3. 管理画面からサンドボックスのアクセスキーとシークレットキーを発行
  4. サンプルコードhtmlSDKv2_php_cr⁩/htmlSDKv2_php/rollups⁩/function.phpをアプリケーションコードにおく。
    1. 今回はギフトコード発行なので利用したのはCreateGiftCardというエンドポイント。
  5. 使いたいクラスでサンプルコードのinvokeRequestを呼び出して実装
    1. エラーハンドリングについてはこちらのエラーとモックエラーに記載されております。
  6. Dev環境(ステージング環境)でテスト
  7. 管理画面から本番のアクセスキーとシークレットキーを発行
  8. 本番でテスト

このような手順で行いました。エラーハンドリングやDB保存をしていたのでテーブル設計などに時間がかかり検証から約1ヶ月半くらいで完了しました。

ハマった点

AmazonギフトコードはDBに保存しない

当初のDB設計ではギフトコードを管理しようと試みていました。しかしAmazonギフト件の取り扱いを読んでみると機密データということと同じRequestIDで再度リクエストすることでギフトコードの再取得が可能だと分かり、RequestIDのみをDBに保存することにしました。ただし同じRequestIDで再取得する場合は同じamountでないと以前の金額と違うよ〜と以下のようなエラーが出るので注意です。

Pre Denomination Mismatch - The Card was created with a different pre-denominated value. Check the specific denominated value in the request matches the pre-denominated value

リクエストは1秒間に10リクエストまで

スロットルレートを事前に見ていたのでsleepを使うように実装しました。PHPのsleepでは秒単位でしか時間を指定できません。そのため今回は理論上0.1秒以上間遅延させればいいのでusleepを使用し以下のように0.15秒遅延させて実装しました。

foreach ($sends as $send) {
    $request = $this->createAmazonApiRequest($send);
    $response = $this->AmazonApi->invokeRequest($request);
    // AmazonApiの使用上10リクエスト/秒の制限があるのでusleep関数を使って0.15秒(150,000マイクロ秒)だけ待つ
    usleep(150000);
}

正常系と異常系でレスポンスオブジェクトが違う

エラーハンドリングをしようとした際に正常系と異常系のレスポンスオブジェクトが異なるため少しハマりました。

<CreateGiftCardResponse>
  <creationRequestId>AwssbTSpecTest001</creationRequestId>
  <cardInfo>
    <value>
      <amount>1.0</amount>
      <currencyCode>USD</currencyCode>
    </value>
    <cardStatus>Fulfilled</cardStatus>
  </cardInfo>
  <status>SUCCESS</status>
  <gcId>A2GCN9BRX5QS76</gcId>
  <gcClaimCode>Z7NV-LBBG39-75MU</gcClaimCode>
</CreateGiftCardResponse>
<AGCODValidationException>
  <Message>Currency Code can't be null or empty</Message>
  <errorType>InvalidCurrencyCodeInput</errorType>
  <errorCode>F200</errorCode>
  <agcodResponse>
    <status>FAILURE</status>
  </agcodResponse>
</AGCODValidationException>

このようにstatusの階層が違うのでエラーかどうか判断するためにはまずオブジェクトの型チェックを先にしなければなりません。 これが最適な方法かはわからないですが今回はエラーコードクラスを参考に、起こり得る確率の高い資金不足エラー以外は同一エラーとしてログに出すことにして以下のように実装しました。

private function checkResponse(array $response)
{
    if (array_key_exists('gcClaimCode', $response)) {
        // 正常系
        return;
    }
    if (array_key_exists('errorType', $response)) {
        if ($response['errorType'] === 'InsufficientFunds') {
            // 資金不足のエラー処理
        }
        // 資金不足以外のエラー処理
    }
    // amazonAPIからそもそもレスポンスがない場合のエラー処理
}

最後に

以下のように大幅なフロー改善に成功しました。

最初はドキュメントを見てスムーズに開発できそうだろうと思い進めましたが、実際アプリケーションに実装していくとなるとエラーになった場合どのような振る舞いをするのかなど考える要素が多く大変でした。何よりドキュメント以外での情報が少なかったので地道にドキュメントを読んでいきました。 社内のフロー改善だけでなく、ユーザーの方にも毎月決まった日時に送れるようになりUXにもいい影響がある開発だったのではないでしょうか。 1からの外部API導入はとてもいい経験になリました。Amazonギフトコード送付はママリ抽選以外でも行っているので、今後ぜひ活用していきたいです!

参考記事: qiita.com

コネヒトでは一緒に働く仲間を募集しています! そして興味持っていただけた方は気軽にご連絡ください!

www.wantedly.com

エンジニアインタビュー vol.1 iOSエンジニア 田中さん

こんにちは。Androidエンジニアの @katsutomuです。

コネヒトで働くエンジニアに、社内LTイベントの枠で公開インタビューする企画をスタートしました。他の参加者からの質問を拾いながら進めています。初回はiOSエンジニアの、田中祥貴(ゆりこ)さんです。 *1

  • katsutomu(画像右)
  • 田中祥貴(画像左)

海外の生活をきっかけに、エンジニアを目指し始めた!

katsutomu: 今日はよろしくです!まずは簡単な自己紹介をお願いします

ゆりこ: 33歳でエンジニアとしては3年目です。 元々別の業種で働いていて、エンジニアに転身したキャリアです。 大学で水処理の分野を学んでいたので、その延長で水処理プラントのエンジニアリング会社で働いていました。 プライベートは子供が一人いて、ママリアプリを見て質問を見て助けてもらっています。

katsutomu: ありがとうございます。異業種からエンジニアを目指した経緯が気になったのですが、どういうきっかけがあったんですか?

ゆりこ: 育児に専念している時期があって、その時に学び直しをしてエンジニアになりました。 その時は海外に在住していたのですが、子供が保育園に入ったタイミングで勉強する時間を取れるようになり、いい機会だったのでエンジニアの勉強を始めたのがきっかけです。

katsutomu: おお!なかなかにレアな経歴ですね。そんな生活の中で、なぜエンジニアに興味を持つようになったんですか?

ゆりこ: 現地で就職先を探すことを視野に入れていたのですが、これまでのキャリアでは見つけることは厳しく・・・。もしもエンジニアだったら見つかったのでは?という考えが浮かんだので、試しにUdemyのオンラインの講座をいくつか学び始めました。 そこでiOS開発に没頭するようになりました。アプリを0から作ってApp Storeに公開して、ユーザーに使ってもらう経験を通じて、これを仕事にしたいと思うようになり、帰国時の再就職でエンジニアに転職しました。

コネヒトのカルチャーが、プライベートの意識も変えた

katsutomu: 海外で勉強して、個人開発までやり切るのはホントすごいと思います!コネヒトに入社してからは、どんな仕事をしてますか?

ゆりこ: 入社してからは、iOSアプリの機能追加と不具合修正を担当しています。その他に、開発をしやすくするためにフォルダ構成の見直しをしています。MVVMのレイヤーでフォルダが分かれていたので、機能修正するときにどのファイルを修正すればいいかがわかりづらく、機能単位で分けるようにフォルダ構成をリプレイスをしています。

@コーポレート統括部メンバー GoogleDriveのフォルダ構成整理と、同じようなことですか?

ゆりこ: 似ていると思います。機能とか画面ごとに分かれてなかったので、ホーム画面に関係するものはホーム画面にまとめてたりしています ・・・・わかりやすく伝えようとしたけど、逆にわかりづらくなったかも。ごめんなさい(笑)

katsutomu: 入社前と入社後で感じたギャップはありますか?

ゆりこ: いい意味のギャップでは「肯定から始めよう」というバリューが浸透していることに驚きました。何かやりたいことがあった時に、否定されることはなく、いいねと受け入れて貰えます。ただ受け入れるだけでなく、懸念点などを議論して並走してくれるので、仕事が進めやすいなと感じています。実は、最初は肯定されすぎて戸惑うこともあったのですが、今は自分も実践できるように心がけていて、最近は家庭内での振る舞いも変えるようにしています。

katsutomu: 会社のバリューが、ご家庭に影響が出ているのは驚きですね。何か変化がでていたりしますか?

ゆりこ: 家庭内で無意識に肯定していなかったことに気づいたので、肯定すること始めるようにしています。 まだ具体的にどういう変化があったとは言えないですが、ちょっと良くなった感覚はありますね。

アウトプットを大事にして、コネヒトのカルチャーとのつながりを作っていきたい

katsutomu: おお。すごくいい話ですね。そういえば、最近はiOSDC Japan 2023にプロポーザルを出してましたが、それもテックビジョンを意識してたりしますか?*2

ゆりこ: テックビジョンを明確に意識していたかというと、そうでもないというのが正直なところです。ただ結果的に、そこにつながっているという実感はあります。これからはテックビジョンとのつながりも意識して増やしていきたいですね。

katsutomu: 入社当初からアウトプットを大事にしてる印象を持ってるのですが、これという理由があれば教えてください!

ゆりこ: 周りを見るとスキルが高かったり有名な方は、しっかりとアウトプットしているので、まずは真似て同じように取り組んでいます。それとやったことや学んだことをすぐ忘れてしまうので、自分の備忘録としてやっている部分もあります。最近はpotatotipsのLT登壇に申し込んだりしてるので、今後も登壇やブログなど、アウトプットは増やしていきたいと思っています。

katsutomu: いいですね!アウトプットすることで、経験や学びが深まることも多いので、ぜひ続けていってほしいと思ってます。登壇したらスマイル申請をしてください!!*3

ママリアプリは、SwiftUIに置き換えていくタイミング!

katsutomu: 他にコネヒトでやりたいことはありますか?

ゆりこ: 業務では、完全SwiftUI化をやりきりたいなと思っています。 iOS16以上から画面遷移周りの実装がしやすくなることもあり、それを利用できるのがベストです。アプリがサポートするバージョンを踏まえると、完全に置き換えるのは少し先になりそうだなと考えています。iOS15のユニークユーザーを考慮して、計画していく必要があると思います。

katsutomu: 確かに、OSバージョンの利用率を考慮して進めるのは、大事ですね!そもそもどういうモチベーションでやってるんでしょうか?

ゆりこ: 変化の激しいiOS開発ではトレンドの機能を追いかけていくことは、エンジニアとして意義を感じていますし、外部のイベントでもテーマとしてSwiftUIの話題は増えていると感じています。サービスを継続的に開発する上で、重要度なことだと思うので、しっかりやりきりたいと思っています。

katsutomu: :AndroidもJetpack Composeへのリプレイスを同じようにチャレンジしていきたいと思っているので、共感です。これからも一緒に頑張っていきましょう!では、最後に皆さんから質問ありますか?

@開発部メンバー Vision Proのママリアプリは作れそうですか?

ゆりこ: :最近発表されたばかりなので、ちょっとまだわからないですね。今度キャッチアップしておきます!

katsutomu: :流石にまだわからんって感じですよね。でも新しいプロダクトでもTryはしていきたいですね。それでは今日はありがとうございました!!

*1:チーム内でゆりこというニックネームで呼ばれています

*2:コネヒトのテックビジョンにはアウトプットを支援するManifestや制度があります:https://tech-vision.connehito.com/

*3:アウトプットをすると、チームで使えるマイルが貯まる制度があります:https://tech-vision.connehito.com/program/smile.html

VS CodeからPhpStormに移行した時に知りたかったこと18選【Mac】

はじめまして。6月よりコネヒトに入社しました、バックエンドエンジニアのおかだです。

みなさんはエディタに何を使っているでしょうか?

もともと自分はVS Code使いで、一度PhpStormに乗り換えようとした事があったんですが、使い方が分からずちょっと触って諦めてしまいました。(言い訳するとPhpStormのもっさり感が気に入らなかった笑)

今回コネヒトでは開発にPhpStormが支給され、チームでもPhpStormを使っている人が多く、せっかくなら教えながらサポートするよというメンバーの声もあったので、再度PhpStormでの開発に挑戦してみました!

今はM1 Macもありますし、PhpStormを触ったことがない人も、PhpStormを使うことを諦めてしまった人も、この記事が参考になれば幸いです。

確認バージョン

PhpStorm 2023.1.2
Build #PS-231.9011.38, built on May 17, 2023

最初に確認しておきたい設定

PhpStorm本体のフォントサイズ変更

Settings > Appearance & Behavior > Appearance

のZoomから変更できる

コードのデフォルトの折りたたみ設定

Settings > Editor > General > Code Folding

各言語からコードの折りたたみ設定のデフォルトを変更できる。最初は全部のチェックを外すと分かりやすいです。

「Show code folding outline」はソースの行番号と同じ箇所に、折りたたみのアイコンを表示するかの設定。これはチェックを付けておくのがおすすめです

開いているファイルが保存済みかどうかをタブに表示する

Settings > Editor > General > Editor Tabs

Mark Modified(*)にチェック

開いているファイルをデフォルトで選択状態にする

左のProjectフォルダの設定(歯車アイコン)から「Always Select Opend File」にチェック

Gitのcommit操作(ファイル変更を確認)

左端のタブのProjectの下に「Commit」がある。最初すごく探しました

便利系ショートカット

設定を開く

PhpStorm:command + ,
VS Code:command + ,

コマンドパレットを開く

PhpStorm:shiftを2回
VS Code:command + shift + P

grep検索

PhpStorm:command + shift + F
VS Code:command + shift + F

ファイル名から検索

PhpStorm:command + shift + O
VS Code:command + P

新規ファイル作成

PhpStorm:command + N(Projectフォルダで作成したい場所のフォルダを選択して)
VS Code:command + N

コーディング系ショートカット

コード整形

PhpStorm:command + option + L
VS Code:shift + option + F

定義元へジャンプ

PhpStorm:command + クリック
VS Code:command + クリック

一つ前の操作に戻る

PhpStorm:command + option + ←
VS Code:ctrl + -

一つ前の操作に進む

PhpStorm:command + option + →
VS Code:ctrl + +

単語の複数選択

PhpStorm:ctrl + G
VS Code:command + D

行コピー

PhpStorm:command + D
VS Code:shift + option + ↓

行移動

PhpStorm:shift + option + ↑↓
VS Code:option + ↑↓

行削除

PhpStorm:command + delete
VS Code:command + shift + K

PhpStormを一ヶ月使ってみての所感

  • 補完が強い気がする・・!(typoをさりげなく指摘してくれるところとか?)
  • 一つ前の操作に戻る・進むのコマンドが地味にしやすい(PhpStormの方が直感的)
  • ペアプロ機能(Code With Me)がとても便利
  • ファイルやクラスのリファクタ機能がめちゃくちゃ便利
  • VS Codeと比べるとやっぱり動作がもっさりする(Readmeのプレビューとか特に感じる)

総評としてはPhpStormのリファクタ機能が非常に便利ですし、使い込んでいけばかなり開発効率上がるのでは?と感じたので、今後の開発はPhpStormを使っていく事にしました!

ただテキストエディタとしてはVS Codeの方がやはり便利だと思うので、メモ書きや記事の作成時なんかはVS Codeを使っていきたいと思います。

ということで最終的にはどちらのエディタも使っていく事になりました!