なになれ

IT系のことを記録していきます

2022年で学んだ技術

2022年を何を学んだかで振り返ります。仕事としてはエンジニアリングマネージャー業や各種ソフトウェア開発などを行いました。

マネージャー業

1on1を通じてメンバーへのサポート方法を学びました。人によってやり方を変えるなど効果的に行うために工夫しました。

hi1280.hatenablog.com

プロジェクトを進めるにあたってのマネジメントに取り組みました。プロジェクトの範囲でどこまでを権限委譲するかなどを考えながらマネジメントしました。

hi1280.hatenablog.com

組織づくりの一環として、採用活動に取り組みました。世の中的に採用は大変だと言われていますが、それを身をもって実感しました。また、社員採用だけでなく、フリーランスエンジニアやオフショア開発など開発者を確保するための様々な方法を理解・経験しました。

マネージャーの勉強として以下の本を読みました。マネジメントと一言でいっても様々な領域があり、マネジメントの奥深さを知りました。

AWS

AWS IAM Identity Center(旧AWS SSO)を会社のAWS環境に導入し、継続的に運用しました。便利さを実感しました。これ無しではAWSを運用できないレベルです。

hi1280.hatenablog.com

EKS1.22へのアップデートを実施しました。アップデート作業はなかなかシンドイと思い始めてきています。

hi1280.hatenablog.com

データエンジニアリング

データ基盤を運用していくにあたり便利になる改善を行いました。運用改善にあたってはGitHub Actionsが様々なところで活用できることを学びました。Slackへの通知などが簡単にできて便利です。
hi1280.hatenablog.com

ここ数年やってきたデータエンジニアリングの取り組みについて発表を行いました。発表を通して自分の学びの整理になりました。

speakerdeck.com

その他ソフトウェア開発技術

Flutterを勉強しました。最近ではモバイルアプリ開発で使われてきているので良い勉強になりました。WidgetなどFlutter独自の要素を学ぶのに苦労しました。

hi1280.hatenablog.com

NestJSを勉強しました。NestJSはフルに機能が揃っているので、Expressでいろいろセットアップするよりも楽でよかったです。最初からTypeScript前提なのも良いです。
Vue 3を勉強しました。2系からどういった点が変わっているのか理解しました。

ソフトウェア開発関連の勉強として、以下の本を読みました。どれもソフトウェア開発をするにあたっての土台になる良い本でした。

その他ソフトスキル

英会話の勉強として6月からレアジョブを始めました。現時点でレッスン時間70時間ほどです。まだ頻繁に会話に詰まってしまうレベルです。引き続き勉強していきたいです。

まとめと来年に向けて

マネージャー業を中心にソフトウェア開発も並行で行うといった感じで一年が過ぎました。マネージャー業は身近にお手本がないので手探りな状態で始めて改善中です。
世の中の本や情報を読んでマネジメントは成果に貢献することであると感じています。来年はその点を意識して取り組んでいきたいです。
また、英会話を上達して社内の海外メンバーとも会話でまともにコミュニケーションが取れるようにしていきたいです。

スタートアップにおけるモメンタムを実感した話

スタートアップ界隈の端くれにいるのでスタートアップにまつわる情報を目にします。一例としてスタートアップ界隈ではモメンタムという言葉があります。

モメンタムから生まれる社内の活力は「きっと次のチャレンジでも勝てる」という思いを生み、更なる大きな挑戦と成長を促してくれます。逆に、モメンタムを失ったら負のスパイラルに落ちていき、スタートアップは死んでしまいます。

tumada.medium.com

モメンタムはスタートアップにとって重要な要素であると理解できます。こういった話を印象付ける体験をしましたので、その話について書きます。

体験談

筆者はスタートアップ企業のソフトウェア開発組織に所属し、マネージャーとして活動しています。マネージャーになったのは2022年4月ごろの話です。
組織体制の変更により、空いたマネージャーのポジションにスライドしたというのが経緯です。
周りの雰囲気としても人の変化が多い時期で、今後どうなるのか不安になるタイミングであったと思います。そんな変化からモメンタムが徐々に失われていくことを感じました。
マネージャーとして取り組んだ1on1では各メンバーから以下のようなコメントを聞きました。

  • 仕事をこなしていても何かうまく行っていない
  • 仕事をやっている実感が持てない
  • チームの雰囲気が何か良くない

今まで各メンバーが心のうちに秘めていたことが雰囲気の悪化によって表面化したように思います。こういった状況を経て辞めていくメンバーが出てきてしまいました。

どうすると良かったか

全てが順調にいくことはあり得ないため、スタートアップという環境下でモメンタムが失われていくタイミングはあるはずです。
モメンタムが失われていく時にやるべきことは、私たちは成果を出すことができているという実感の可視化だったと思います。自分たちが何かに貢献しているという実感なくしてモチベーションを保つことはできないというのは自分の身を振り返っても感じるところです。
僕自身は1on1での話からどういう打ち手がよいのか、その時点では効果的な手段をとることができませんでした。

まとめ

モメンタムの変化は急に起こります。メンバーの雰囲気を察することで気づくことができます。モメンタムを取り戻すには自分たちの成果を可視化することです。

ちなみに

現状はある程度モメンタムを取り戻すことができていて、心穏やかにマネージャー業に従事しています。これは周りの人たちからのサポートがあったからだと思います。周りの人に頼っていくことも大事だと思います。

AWS CDKでLambdaをいい感じにIaC化する

AWS Lambdaに対してのIaCのやり方を模索していて、AWS CDKが今のところ一番いい感じだと思ったので試してみた記録です。

各種方法との比較

AWS LambdaをIaC化するやり方は主に以下のやり方があると思います。
他にもいろいろあると思いますが、自分が経験したものの範囲になります。

  • AWS SAM
  • Serverless Framework
  • Terraform
  • AWS CDK

AWS SAMは割と以前から存在するLambdaをIaC化するためのAWS公式の方法です。AWS CDKと比較するとAWS SAMテンプレートと呼ばれるAWS CloudFormationテンプレートを拡張した長大なYAMLを利用しなければいけないところが辛いところです。

Serverless Frameworkは公式ではないところの不安やLambdaのみのIaCの仕組みなので学習コストが気になるところです。AWS CDKと比較しても優位がない感じがします。

Terraformは公式ではないものの広くAWSのIaCで使われていて安心感があります。ただLambdaを管理するには手間がかかります。Terraformの場合、基本的にAWSAPIをHCLでそのまま利用する形です。Lambda関数を作成する場合、zipファイルを用意するか、コンテナイメージを用意するかがあり面倒です。

こういったことを踏まえるとAWS CDKでのやり方は面倒なことがなく、公式で提供されている仕組みということもあり一番良いと考えました。AWS CDKではコンストラクトという要素でCloudFormationのリソースを利用可能ですが、それらを抽象化した高度なコンストラクトも用意されています。AWS Lambdaにおいては楽にリソースを作成する体験が得られます。

以下でどのようになるかを紹介します。

AWS CDKによるLambda関数の作成方法

以下のAWS CDK Workshopの通りにcdk deployができていることを前提としています。

cdkworkshop.com

aws_lambda.FunctionでLambda関数を作成できます。

lib/main.ts

import { aws_lambda, Duration, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';

...

export class AwsLambdaCicdExampleStack extends Stack {
  constructor(scope: Construct, id: string, props: LambdaFunctionConfig) {
    super(scope, id);

    new aws_lambda.Function(this, `HelloFunction`, {
      functionName: `hello-function-${props.environmentValues.NODE_ENV}`,
      runtime: props.runtime,
      code: aws_lambda.Code.fromAsset(props.path),
      handler: props.handler,
      timeout: Duration.minutes(15),
      environment: props.environmentValues
    });
  }
}

Lambdaのコードを指定するにはcodeのパラメータにaws_lambda.Code.fromAssetメソッドでLambdaのコードが配置してあるディレクトリパスを指定するだけです。zipファイル化が不要なので楽です。

AWS CDKではTypeScriptのLambda関数も扱えます。aws_lambda_nodejs.NodejsFunctionを使います。

lib/main.ts

import { aws_lambda, aws_lambda_nodejs, Duration, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';

...

export class AwsLambdaCicdExampleStack extends Stack {
  constructor(scope: Construct, id: string, props: LambdaFunctionConfig) {
    super(scope, id);

    new aws_lambda_nodejs.NodejsFunction(this, `HelloFunction`, {
      functionName: `hello-function-${props.environmentValues.NODE_ENV}`,
      runtime: props.runtime,
      entry: props.path,
      handler: props.handler,
      timeout: Duration.minutes(15),
      environment: props.environmentValues
    });
  }
}

TypeScriptのLambdaのコードを指定するにはentryのパラメータにTypeScriptのエントリーファイルのパスを指定するだけです。
NodejsFunctionでは内部的にTypeScriptのトランスパイルなどを実行してLambda関数を作成してくれます。

まとめ

LambdaをIaC化する場合、主要な要素がコードになるのでアプリケーション開発者がIaCできると良さそうです。
その場合、AWS CDKのように汎用プログラミング言語を利用できるのは、アプリケーション開発者にとって取り組みやすいのではないかと思います。
また、AWS CDKでは今回紹介したように簡単にLambdaをIaC化できる仕組みになっているのも良いです。

参考

JavaScriptgithub.com

TypeScript版

github.com

cdkworkshop.com