2023年の振り返り

# はじめに

[クラウドワークス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/crowdworks) の22日目の記事です。

株式会社クラウドワークスの@keshiwoです。

エンジニアとして「クラウドログ」という工数管理システムの主にアプリケーション部分(Backend,Frontend)の開発を行なっています。

今回は私の2023年を振り返えりつつ、「クラウドログのエンジニアの働き方」や「どのような課題に取り組んでいるか」が少しでも伝われば幸いです。

# 開発したもの/技術的な取り組み

## 外部勤怠システム連携

2023年は外部サービスとの連携に力を入れた年でした。
主に工数管理を行う上で必要な勤怠情報に関して外部から取り込む勤怠連携機能をリリースし下記3つのシステムと連携を完了させました。

- [ジョブカン勤怠管理](https://jobcan.ne.jp/?campaign&gad_source=1&gclid=CjwKCAiA-P-rBhBEEiwAQEXhH85K1efDNXh-SYowgereZ7C2ikfoXbv2mUHUgIAoVpZ-jgK1DcHY7hoCujQQAvD_BwE#)
- [KING OF TIME](https://www.kingoftime.jp/?utm_source=google&utm_medium=cpc&utm_campaign=name&utm_term=name_eng&gad_source=1&gclid=CjwKCAiA-P-rBhBEEiwAQEXhHz3M1nsN3rI_mewc85P19Rh1hWvaYR_9MYddXESXyTXFNBsd_CrAJhoCnzgQAvD_BwE)
- [勤革時](https://jpn.nec.com/king-of-time/index.html)

また勤怠システムとの連携強化にあたり、バッチ処理の仕組みを見直し
バックグラウンドで実行される機能について統一的に処理できる仕組みを構築しました。
下記の図のように「機能の呼び出し」と「実行」をSQSとLambdaを利用して分割する仕組みを採用しました。
バッチ処理に関してはk8sのCronJobを利用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872140/6d67e7be-f8a6-7b19-41e3-472f340bbe68.png)




## フルスクラッチUI開発

クラウドログとしては初めてのフルスクラッチでのUI開発を行いました。
(普段はReactを用いてReact bootstrapをカスタマイズする形で多くのUIを作成しています。)
クラウドログでは誰でも簡単に素早く工数入力ができることに拘っており
今年はさらなるUX向上のため工数入力部分をリニューアルしました。

下記が作成したUIです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872140/aaef8320-4cec-0568-9d1c-bd9ac9559f84.png)



一見シンプルに見えますが、「お客さまによって工数の取り方が違う」というクラウドログの複雑な要件に対応するために内部は複雑な実装となっています。

こちらの開発ではuseReducerをうまく利用することで状態管理の複雑さを効果的に低減し、コードの可読性と保守性を向上させることができました。

下記は工数入力用のSelectboxのアクションの一例です。

```tsx
export type SetActions =
  | SetProjectAction
  | SetProcess1Action
  | SetProcess2Action
  | SetProcess3Action
  | SetTaskAction
  | SetWorkAction;
export type ActionType =
  | GetFocusAction
  | CloseDropdownAction
  | InputKeywordAction
  | DownDeleteKeyAction
  | DeleteBadgeAction
  | OutFocusAction
  | ClearValueAction
  | SetMypatternAction
  | ChangeDropdown
  | SetActions;

export const createGetFocusAction = (): ActionType => ({ type: 'get_focus' });

const r = React.useCallback(
    (state: WorkSelectState, action: ActionType): WorkSelectState => {
      switch (action.type) {
        case 'get_focus': {
          // ドロップダウンの選択
          // ドロップダウンを開く
          // 表示名を計算
          // etc...
          return {
            ...state,
            // 更新する値
          };
        }
......................................................
```

例えばコンポーネントのinput部分にフォーカスがあったった場合を示すGetFocusActionの例です。

- 表示すべきドロップダウンを判定(6種類の中から)
- ドロップダウンを開く
- 開かれるドロップダウンに応じて表示名を計算

上記のような処理が走るのですが、これをuseReducerを利用せずにコンポーネントが処理すべき入力ごとに個別にuseStateなどで管理するとかなり複雑な実装になってくるかと思います。(useEffectがいっぱい出てきたり)
その他キーボードでのドロップダウン内の移動制御にIntersection Observer APIを利用するなどチームとしても多数の知見が溜まった開発となりました。

## メール通知機能

クラウドログとして初となる一斉送信メールの機能の実装にも取り組みました。
内容としては工数入力が完了していないユーザーに対してのリマインド通知機能です。
工数管理を行う上で、まずはユーザーに工数の入力をしてもらわなければ何も始まりません。
工数の管理者に負担をかけずにできる限りユーザーに工数入力を促し入力率を上げるための機能です。
こちらについても「外部勤怠システム連携」で紹介したバックグラウンド処理の実行の仕組みを利用して実装しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872140/0c4b316b-d886-1789-7bd3-4d94c1ac5476.png)



# その他取り組み

## 社内勉強会

クラウドログ開発内でおこなっている勉強会「LogStudy」にも力を入れて取り組みました。

この勉強会は2年半ほど継続されており約80回実施されています(週一回程度実施)。

### 輪読会の実施

昨年までは単発のディスカッションやワークが多かったのですが、今年は輪読会を実施し1つのテーマで何週かにわたって参加者全員でテーマについての理解を深めていきました。

下記の輪読会を実施しました

- [達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-%E3%83%9F%E3%83%83%E3%82%AF-ebook/dp/B07GB4CNKP/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3HTKNRS4Y4IW0&keywords=%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6SQL&qid=1658837175&sprefix=%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6sq%2Caps%2C312&sr=8-1)
- [いいコード悪いコード](https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89-%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2/dp/4297127830/ref=sr_1_1?adgrpid=138543838711&hvadid=651761291406&hvdev=c&hvlocphy=1009461&hvnetw=g&hvqmt=e&hvrand=16844762521626425434&hvtargid=kwd-1653471947482&hydadcr=23098_13622534&jp-ad-ap=0&keywords=%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89&qid=1683531620&sr=8-1)
- [Go言語 100Tips ありがちなミスを把握し、実装を最適化する (impress top gear)](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E-100Tips-%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A1%E3%81%AA%E3%83%9F%E3%82%B9%E3%82%92%E6%8A%8A%E6%8F%A1%E3%81%97%E3%80%81%E5%AE%9F%E8%A3%85%E3%82%92%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%99%E3%82%8B-impress-gear/dp/4295017531)

1人だとどうしても積読になってしまいがちな技術書ですが、仲間と一緒に読み進めることで最後までモチベーションを維持し続けることができたのでとてもいい取り組みだったと感じています。

### スクラム勉強会

スクラム開発についての勉強会も行いました。

クラウドログではスクラム開発を取り入れているのですが、改めて関係者全員で理解を深めるためにエンジニアだけでなくPdMやデザイナーも合同で行いました。

それまでは、人によってスクラム開発への理解がまちまちでしたがこちらの勉強会の中で全員で理解を深め、自分達ができていること、できていないことを改めて確認した上で「クラウドログ開発でどのようにスクラム開発を行うか」を検討できたと感じています。

### コミットレポートの運用

「コミットレポート」と呼ばれる勉強会の成果を可視化するための取り組みも始めました。

これは、勉強会で学んだ知識が開発に活かされた場合にどのように活かされたのかを記録として残していく取り組みです。

まだ実験的ではありますが今後これを活用して「より効果的な勉強会の実施」や「社内外への発信」に役立てたいと考えています。

LogStudyに関しては以前エンジニアブログでも詳しく紹介しているので興味のある方はぜひご覧ください。

[LogStudyで進化するCrowdLog - クラウドワークス エンジニアブログ](https://engineer.crowdworks.jp/entry/2023/10/24/174812)

## 負債解消チーム発足

中長期的な視点で技術課題と向き合っていくためのチームを発足しました。

こちらはまだ始まったばかりの取り組みですが(2023年10月から)普段のロードマップ開発とは並行しながら徐々に「開発効率を上げるための取り組み」や「技術負債解消」に取り組んでいます。

### Unit test高速化

直近ではUnit testの高速化を行いました。

Mysqlのtmpfsを利用してデータの書き込みをディスクからメモリに変更して実行時間を4分の1程度に削減できました。

今後こちらのチームでの取り組みは「[クラウドワークス エンジニアブログ](https://engineer.crowdworks.jp/)」でも発信していこうかと検討中です。

# 個人的なハイライト

## エンジニアリングMVP

2024年9月期全体キックオフにてエンジニアリング部門のMVPに選んでいただきました。
こちらはでは「開発したもの/技術的な取り組み」でもご紹介した「フルスクラッチUI開発」の話や「オフショア開発メンバーとの開発」の話で登壇させていただきました。
人生で初めてこういった賞をいただけたのでとても誇らしかったです。
あがり症ということもあり当日緊張しないように自宅で100回くらい練習して臨みましたが
喋り出した瞬間マイクがうまく入っておらず頭が真っ白になりました。。。(笑)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1872140/d51704cb-9336-00f8-8fa0-62c2884fc679.png)


## EMへの挑戦

2023年の10月からマネージャー業務へも挑戦させていただいています。
お話しをいただいた時は「私がですか。。？」という想いでしたが
やってみると「チームメンバーのためにどんなことできるかな？」ということを日々考えたり、「目標達成への強い想い」が生まれていることを感じ、自分自身新たな発見でした。

まだまだわからないことだらけですが成果を出せるように精一杯頑張っていきます！


# 来年へ向けて

まずはロードマップに掲げた開発を期間内にしっかりと完了させ、さらに進化したクラウドログを皆んなに届けること。
そしてその上で開発組織として様々なことにチャレンジして、チームとしてできることを増やしていきたいと考えています。

個人としては、これまでアプリケーション側を担当することが多かったのでインフラ側の知見をより深められるように取り組んでいきたいと考えています。

(プライベートでは、ボイトレと家庭菜園にチャレンジしようと考えています。)

以上です！