B-Teck!

お仕事からゲームまで幅広く

【雑記】良いチームであるために

「良いチームである」とは

今自分が働いているチームは非常に良いチームだと思っている。
これは、自身が感じる「良いチーム」のどういう状態なのか、を改めて言語化する試み。
理由について大別すると以下の3つに分けられる気がする。

  • 認識の共有
  • 心理的安全性
  • トラックナンバーの高さ

それぞれ、掘り下げて考えてみる。

認識の共有

1つ目は認識の共有。
「我々はなぜここにいるのか」とか、「何を目指すのか」という部分。
つまり、向かうべき場所と現在地のギャップの意識が大まかに揃っている必要がある。
この前提が揃っていると、議論が発生しても結論がちゃんと導かれる。
また、チームがコミットしたことに対しての意識が発生するため、相互扶助が機能しやすい。

心理的安全性

2つ目は心理的安全性。
メンバーがHRT(謙虚/尊敬/信頼)の精神を持っていることと言い換えても良い。
失敗を批難せず、問題点を敬意を持って議論できる状態。
心理的安全性が保たれている場合、メンバーが意見や懸念を表明しやすくなる。
結果、より積極性が高く、挑戦し、自ら改善できるチームへと成長できる。

トラックナンバーが高い

3つ目。これだけ粒度が違う気もするけど、「トラックナンバーが高い」というのを上げてみる。
トラックナンバー ‐ 通信用語の基礎知識

つまり、業務状況や認識の共有が適切に行われている状態。
メンバーが自律的に状況や優先度を判断して動くことができるので、業務が止まらない。
それぞれが状況を把握し、小さい助け合いを重ねることで連帯感を高められる。

「良いチーム」になるために

こういうチームってどうしたら作れるんだろうと考えたときに、2つの選択肢が浮かんだ。
1つはメンバー全員で高い壁にぶつかって苦しみ、乗り越えた連帯感を得ること。
もう1つは組成から丁寧にカルチャーを作っていくこと。
いずれにせよ、空気というものは一度醸成されれば壊れにくい。
最初に良い文化を形成できれば、メンバー増減があっても継承されやすい。

一度みんなで苦しむ

これは正直書いててむちゃくちゃだなとも思うけど、同時に確実に効果があるな、とも思う。
全員が状態を把握しないと終わるような極限状態で、全力で目の前のことを終わらせるために協力する。
そういう体験は、急ごしらえのチームに一体感を持たせる効力がある。
ただし、HRTの精神を持ったメンバーが少ない場合は単純に苦しかっただけで終わる。

最初に方向性を規定し、改善していく

一般的にはこの戦略が取られると思う。
チームのビジョン、ミッション、バリューや行動規範を最初に定め、認識を共有する。
定めたものは継続してメンテし、チームとしての在り方を常に改善していく。
規範を外れるメンバーに対しては是正、あるいはチームから抜けてもらうなどの必要があるかもしれない。

おわり

最高のチームに出会えて最高になれました。
正直全然関連書籍読んでないし調べてもないのでだいぶ適当言ってます。
最高のチームの作り方の本とか、事例とか、うちはこうやってるぜ!みたいなのがあったらなんかいい感じに教えて下さい。

【振り返り】現職に入社して1年ちょっと経ったのでなんか書く

現職2年目に突入したので、今思ってることや学んだことを書き出しておきたかった。
転職時に書いたのはこれ↓
【雑記】31歳になりました/転職します - B-Teck!

業務的な部分の変化や学んだこと

大規模サービスの開発・運用

前職は小規模なBFFを複数面倒見るのが主だった。
関係者も比較的少なく、チーム外とは自分が会話していたので、起こる変化は一通り把握していた。
現職は複数のチームがコード量もDBも巨大なアプリケーションを開発している関係で、新たな仕様や機能が生えていても把握しきれないことがある。
特に入社直後は認知負荷がハチャメチャに高く、疲労感で退勤後毎日そのまま自室の床で数時間寝ていた。
この時期に詰め込んだおかげで、現状はある程度追随できるようになった気はする。

こういう規模の開発に携わったことはあまりなかったので、情報の集め方や初期段階で集める情報の詳細度の違い、知っておくべきラインという判断基準がある程度自分の中に生まれたのは大きい。

Scala

これまでのキャリアではJava、Kotlinしか触ったことがなかったのでScalaは新しい挑戦だった。
見た目はKotlinに似ているものの、Functionalな部分の理解に躓き、最初は既存のコードを読み解くのに非常に苦労したように思う。
何冊か本を読んだり、別の言語で書かれた本を脳内で翻訳しながら写経したりして多少は手に馴染むようになってきた。今度はKotlinを忘れてきてしまったけど…。

AngularとSPA開発

たまにjQueryで書くようなHTMLの改修はしていたものの、SPAやモダンなWeb開発はほぼ未経験の状態。しかもTSは書いたことないみたいな状態で入社したので、これも最初は半泣きで学習していた。
Udemyの講座いくつかとサバイバルTypeScriptみたいな入門ページを読み漁り、最低限困らない知識は得た、はず。

今どきのSPAはコンポーネント指向になってたり、状態遷移周りがMVVM的だったりで、スマートフォン向けのアプリとだいぶ考え方が似ているなあと感じた。でもコンポーネントにする粒度の単位の感覚が違うかも。
あとCSSはむずい。

スクラムとチーム開発

前職もスクラムっぽい雰囲気の動き方はしていたものの、そもそもバックエンドは俺一人だったので、担当タスクは割と好きなようにやっていたし、そんなにワークしていなかった気がする。
現職はバックエンドもフロントエンドも(場合によってはインフラも)チーム内で触る体制が主だったので、全員で見積もったり、プランニングをしたり、複数人でタスクを進めてその結果に対するレトロをやったりしてる。 これも最初はお作法的に何冊か本を読んだ。

精神的な推移

前職時代はだいぶ無茶ぶりをされることが多かったのもあって、転職時は満身創痍だった。
自信を喪失していたので、期待値調整がうまく行ったかもよくわからず、知らん技術が多かったので、とりあえず生き抜くことに必死だった気がする。

その後、諸般の事情があり、異動とそれによる残務を引き受けるイベントがあったんだけど、いくつかの要因が重なって非常に精神的な負荷が高かった。

  • 引き続いている自信の喪失
  • 単純なタスク量の多さ
  • 扱っているものに対する知識不足
  • 人に頼るのが苦手
    • キャリア上一人で始末をつけなきゃならないことが多かった

などが主な理由だと思う。かなり心が折れていて、周りで見ていた人が見かねて助けてくれたりした。
この経験は非常に大きくて、人に渡す・渡さないの判断や、どういう部分でどう人を巻き込むとよいのかを学べた気がする。
今同じことやったら絶対もっとうまくやれるんだけどな〜〜〜〜〜〜(当たり前)

その後はここで感じた足りない部分などを自分なりに補強しながら徐々に自信を取り戻し、春先くらいにはだいぶ元気な状態になってきたと思う。

一気にいろんなこと勉強してたら若干燃え尽き気味になってしまったので、最近はちょっと趣味とかの比重を増やしてまったりと生きています。

今後の話とか余談

エンジニアとしてどういうキャリアを描くと良いんだろうなあというのをぼんやり考えてる。
自分の能力的にスーパーエンジニアにはなれないので、何らかの付加価値をつける戦略が必要かもしれない。
なにかを創造するより、人の脳内を具体化するとか、そのために人の間で動くとかのほうが多分得意なので、PjM的な能力を伸ばしていくのか。
あるいは弱みとなっているPdM的な能力を伸ばしていくのか。ちょっと難しそうだけど。 つまり何も方向性は定まってないんだよなあ。

そんな感じで今すぐ転職のつもりはないんだけど、カジュアル面談はしていきたいな〜と思ってる。
これまでの転職は毎回2~3社話を聞いた段階で決まってしまって、市場感や求められている能力が全然わかってない状態なので、市場とのギャップとか足りない部分のキャッチアップをしたい。
実は今はそういうメールが来てもほとんどスルーしてしまってるんだけど…。
ブログを見たっていうと反応確率がたぶんあがります。

仕事関連で読んだり勉強したやつらのメモ

【Angular】Angular MaterialのDatePickerで日本語表示をする

Angular MaterialのDatePicker でカレンダーを日本語表示させるメモ。

環境

  • Angular 14
    • 試したのがこのバージョンなだけで、過去のバージョンでも対応方法は変わらなそう。

インストール

  1. Angularプロジェクト上で angular/material をインストールする
ng add @angular/material
  1. app/app.module.ts に必要なファイルのimportを追加する
import {MatFormFieldModule} from '@angular/material/form-field';
import {MatInputModule} from '@angular/material/input';
import {MatDatepickerModule} from '@angular/material/datepicker';
import {MatNativeDateModule} from '@angular/material/core';

@NgModule({
  imports: [
    (省略)
    MatFormFieldModule,
    MatInputModule,
    MatDatepickerModule,
    MatNativeDateModule
  ],
  (省略)
})
  1. 任意のComponentにサンプルの記述を貼り付ける(今回はapp/app.component.ts )
<input matInput [matDatepicker]="picker">
  <mat-hint>MM/DD/YYYY</mat-hint>
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>

デフォルトでは下記のように英語のカレンダーが表示される

ロケールを変更する

まずは対象のComponentのProviderを上書きしてカレンダーのロケールを変更する。

import { DateAdapter, NativeDateAdapter } from '@angular/material/core';
export class AppComponent {
  constructor(dateAdapter: DateAdapter<NativeDateAdapter>) {
    dateAdapter.setLocale('ja-JP');
  }
}

すべての日付に がつくものの、日本語表記になっている

日付表示を変更する

  1. 日付表示を変更するためにProviderで上書きするためのAdapterを作成
export class MyDateAdapter extends NativeDateAdapter {
    override getDateNames(): string[] {
        return [...Array(31).keys()].map(i => String(i + 1));
    }
}
  1. Adapterを適用する
providers: [{provide: DateAdapter, useClass: MyDateAdapter}],

日が取れて直感的な表記になった

サンプル

https://stackblitz.com/edit/angular-ivy-f6sxt1?file=src/app/app.component.ts