はんなりと、ゆるやかに

アジャイル、スクラムが好きなITエンジニアが日々から学んだことをアウトプット

エクストリームプログラミングで見える開発風景 - TechBase vol.1 で学んだこと

エクストリームプログラミングで見える開発風景 - TechBase vol.1 に参加しました。

uzabase-tech.connpass.com

エクストリームプログラミングは下記の書籍を読むと良いでしょう。

また、発表の中で合わせてClean Agile も紹介されていました。

はじめに

エクストリームプログラミング(XP)はその名の通りプログラミングに関することなのですが、本書の中で「ソーシャルチェンジ」という単語が登場するように人と人の関係も注目する技術です。開発を通じて社会を良くしようという感じが良いですよね。今回はエクストリームプログラミング』翻訳者の角さんとXPを実践されている野口さんによる発表でした。

イベントレポートとアーカイブ動画は公式ページで書かれているのでそちらを見てください。このブログでは発表を聞いて感じたこと思ったことを残しておきます。
tech.uzabase.com

対話が重要

ケント・ベック氏とウォード・カニンガム氏は同じチームで開発をしていたときに対話していて、その時感じた「対話による理解、スキル向上」という経験がXPの5つの価値の「コミュニケーション」「フィードバック」に繋がっているんじゃないかというお話がありました。また、角さん自身の対話による成長経験の話も聞いて、改めて気軽に真面目な雑談をすることは重要だと感じました

これは1on1のような改まった場ではなく、廊下ですれ違ったときとか、隣の席の人で話しかけたり、日常的に「最近知ったんだけど、○○という技術についてどう思う?」ということが話せると良いと思いました。

ただこのようなちょっとした雑談はオンライン中心になってから起きにくいと言われていますよね。それを解消するのに野口さんが発表されていたGatherは面白そうですね。

エクストリームである

XPとはあなたが自分の理想について考え、その理想にもとづいて行動するための方法だ。

角さんの発表で紹介された一文です。まずはエクストリームプログラミングに書かれた価値、原則、プラクティスを理解し、実践するのが良いと思います。そして、その先は自分の理想を持ってアップデートすることも大切なのだと理解しました。

どうやって実践するのか?については野口さんが紹介された「プラクティスから価値を理解する」、「価値からプラクティスを実践する」方法が良いと思いました。

その先のアップデートするのか?は対話から生まれる気がしています。XPを実践している人たちと意見や信念を共有し、対話しあって更新すると良さそうです。そういった意味でもこのイベントはとても良いなと思いました。

その他1

本発表の中で紹介されていたThe Agile Leaderの発売が楽しみなんですよねー。同じ著者が書かれたSCRUMMASTER THE BOOKも良かったので楽しみです!

その他2

NVC(Non-Violent-Communication)に興味を持ったのもXPに引用されていたからです。プログラミングと関係なさそうなコミュニケーションの書籍が引用されていることに驚きました。
iucstscui.hatenablog.com

さいごに

XPの良さを再確認できるイベントでした。XPの本を読み返してみようと思います。

今回も参加してよかった!運営の皆さん、参加者の皆さん、ありがとうございました!

ちいとぽ with Scrum - Techmee vol.1に参加した

ちいとぽ with Scrum - Techmee vol.1に参加しました。

timeedev.connpass.com

ちいとぽをテーマに実践されていることや、Scrum@Scaleとちいとぽとの関係についてお話されていました。気になったこと、心に残ったことをまとめます。ちなみにちいとぽとはチームトポロジーの書籍のことを指します。

節理面(チームを分ける境界)

亀田さん発表でチームトポロジーの節理面(チームを分ける境界)の話をされました。分ける軸は「事業価値、課題内在性認知負荷、技術的要求」の3つの軸で整理されていました。
「事業価値、課題内在性認知負荷、技術的要求」という切り口でチームを整理するのは分かりやすくて良いと思いました。チームの特徴を考える時、1つの基準(たとえば技術的要求)だけで決めるのではなく、3、4つの基準で整理するのは良さそうです。

Scrum@Scale

だいくしーさんはScrum@Scaleの説明です。短い時間で特徴を説明されていて分かりやすかったです。
自分たちの開発の進め方とScrum@Scaleの進め方を比較して似ている部分もあるかもと思い、Scrum@Scaleに興味が出てきました。

ちいとぽ

ちいとぽの活用やScrum@Scaleとの関連性を説明されていました。ここで感じたことはちいとぽの応用力の高さです。
下記の記事に、「普遍的な公式ではなくパターン」と書かれているようにパターンであるがゆえ、応用して適応しやすい考え方なんだろうと思いました。
slide.meguro.ryuzee.com

まとめ

ちいとぽとScrum@Scaleを学べる回でした。

今回も参加してよかった!運営の皆さん、参加者の皆さん、ありがとうございました!

Unity コルーチンの一時停止と終了を調べる

前回、Unityのコルーチンとは何なのか調べてみました。
iucstscui.hatenablog.com

前回のコードを思い出すと、StartCoroutineが何度も呼べる状態になっており、コルーチンを複数スタートできるようになっていました。動作確認した結果が以下です。

ボタンを2回クリックすると2個のコルーチンが同時にテキストを更新してカウントアップが異常な状態です。

スタート後のクリックは一時停止させる

そこで、スタート後のクリックは一時停止にしようと決めました。コルーチンを一時停止させる方法はStopCoroutineがあると知ります。そこで書いてみたコードは以下です。

    public GameObject text = null;
    Coroutine coroutine = null;
    bool isStart = false;

    public void OnClick()
    {
        if (isStart == false)
        {
            isStart = true;
            coroutine = StartCoroutine(Count());
        }
        else 
        {
            StopCoroutine(coroutine);
            isStart = false;
        }
    }

    IEnumerator Count()
    {
        for(int i = 1; i <= 10; ++i)
        {
            text.GetComponent<Text>().text = i.ToString();
            yield return new WaitForSeconds(.5f);
        }

        yield break;
    }

一時停止ではなく再度先頭から再開されています。ミスです。StartCoroutineの引数に渡している「IEnumerator型」がStopで停止したコルーチンと一致しないため、新しくコルーチンが開始されているようです。

ということで、「IEnumerator型」をメンバ変数で定義して、Start関数で代入します。クリックされた際はメンバ変数を渡すことで、一時停止が完成しました。

   public GameObject text = null;
    IEnumerator enumerator = null;
    bool isStart = false;

    // Start is called before the first frame update
    void Start()
    {
        enumerator = Count();
    }

    public void OnClick()
    {
        if (isStart == false)
        {
            isStart = true;
            StartCoroutine(enumerator);
        }
        else
        {
            StopCoroutine(enumerator);
            isStart = false;
        }
    }

    IEnumerator Count()
    {
        for (int i = 1; i <= 10; ++i)
        {
            text.GetComponent<Text>().text = i.ToString();
            yield return new WaitForSeconds(.5f);
        }

        yield break;
    }

目的を達成しましたが、ここで欲が出てきます。10までカウントアップした後は1から再開したい。そのためにはコルーチンが終了したことを知りたいのですが、終了を知る直接的な方法はなさそうです。常套手段はActionもしくはUnityActionを使用するようです。

コルーチン終了後、再開させる

「IEnumerator型」オブジェクトのインスタンスがStopCoroutineと違う場合、先頭から開始されます。その仕様とUnityActionを組み合わせて、実現してみましょう。コルーチン終了後にメンバ変数のenumerator はnullにします。クリック時にenumeratorがnullの場合は新しいインスタンスを作る方法でコルーチン終了後、再開させる仕組みを実現しました。

   public GameObject text = null;
    IEnumerator enumerator = null;
    bool isStart = false;

    public void OnClick()
    {
        if (enumerator == null)
        {
            isStart = false;
            enumerator = Count((result) => enumerator = result);
        }

        if (isStart == false)
        {
            isStart = true;
            StartCoroutine(enumerator);
        }
        else 
        {
            StopCoroutine(enumerator);
            isStart = false;
        }
    }

    IEnumerator Count(UnityEngine.Events.UnityAction<IEnumerator> callback)
    {
        for(int i = 1; i <= 10; ++i)
        {
            text.GetComponent<Text>().text = i.ToString();
            yield return new WaitForSeconds(.5f);
        }

        callback(null);
        yield break;
    }


まとめ

  • StopCoroutine でコルーチンを一時停止できる
  • StopCoroutineと同じ引数でStartCoroutineを呼ぶと停止位置から再開できる
  • Coroutineの終了を知るにはActionもしくはUnityActionを使用する。

Unityのコルーチンについて調べた

Unityのコルーチンが分かりそうで分からなかったのでコード書いて体感してみました。
コード書いて理解したことを一言でいうと

yield return と書いたところ処理が一時停止し、次のフレームで再開する仕組み。

です。

サンプルプログラムです。ボタンを押すとテキストに書かれた数値が1から10までカウントアップします。

    public GameObject text = null;

    public void OnClick()
    {
        if (text == null)
        {
            return;
        }

        StartCoroutine(Count());
    }

    IEnumerator Count()
    {
        for(int i = 1; i <= 10; ++i)
        {
            text.GetComponent<Text>().text = i.ToString();
            // yield return null;
            yield return new WaitForSeconds(.1f);
        }
    }

コードの説明

重要な部分以外は端折っていますが、画面上のボタンが押されたらOnClickが実行され、Countのコルーチンが実行されます。Countのfor文は10ループしますが、テキストの文字を1にした後、yield return の部分で処理が止まります。0.1秒後に再開されテキストの文字を2にした後、やはりyield return の部分で処理が止まります。10回繰り返せば終わりです。

yield return null; と書けば次のフレームで再開されます。
yield return new WaitForSeconds(.1f); と書けば0.1秒後に再開されます。

補足

StartCoroutineではなく、普通に関数呼び出しするとボタンを押したあといきなり10になります。コルーチンだからこそカウントアップが確認できます。
(関数呼び出しにするときは、yield returnとか使えないので微修正は必要です。)

何が嬉しいか

似たようなことはUpdate関数でも実現できます(Update関数はフレームごとに呼ばれる関数です)。しかしコルーチンを使うと無駄な処理をスキップできたり、負荷が軽減できます。

無駄な処理をスキップ

Update関数で実現する場合、ローカル変数は毎回初期化されるため、カウントを記憶するメンバ変数が必要です。また、毎フレームごとに関数の先頭から処理するため、不要な処理も実行されます。

コルーチンの場合は、一時停止した場所から再開できるため、ローカル変数は一時提出した値から再開できます。また、関数の途中から再開されるため、関数のはじめの方に書いたコードはスキップされます。

コルーチンを使うメリットは以下だと感じました。

  • 変数のスコープを小さく出来るため、可読性が良い
  • 関数の途中から再開できるため、同じ処理は省略できる

負荷を軽減できる

Update関数はフレームごとに呼ばれるため、60FPSだった場合は0.015秒ごとに処理が実行されます。頻度を下げても問題ない場合はyield return new WaitForSeconds(.1f);と書くことで、0.1秒ごとに処理が再開されるため、処理負荷が軽減されます。

定期的な処理をUpdate関数で実行することもできますが、フレームよりも遅い頻度で処理しても良い場合はコルーチンを使うことで処理負荷が軽減できます。

コルーチンを使うメリットは以下だと感じました。

  • 処理頻度を制御しやすい

まとめ

コルーチンについて調べてみました。
コルーチンはyield return と書いたところ処理が一時停止し、次のフレームで再開する仕組みでした。コルーチンを使うことでコードがシンプルになり保守性が上がったり、負荷を分散できる書き方だと思いました。

参考サイト

公式サイトの説明は分かりやすいです。はじめはピンとこなかったのですが、コードを書いてから読み直すと理解できました。
docs.unity3d.com

【2022年】プロダクト開発に携わる方にお勧めのPodcast 10選

タイトルを見てクリックしてくださったのでPodcastを改めて説明する必要はなさそうですが、簡単に説明するとPodcastはインターネットで公開されているラジオです。

Podcastを聴くためのプラットフォーム

Podcastを聴く方法はいくつかあって、SpotifyApple PodcastAmazon music、Webサイト、Google Podcast と並ぶようです。https://prtimes.jp/main/html/rd/p/000000035.000035509.html

僕はこの中のGoogle Podcastをメインで使っています。たまにSpotifyでしか聞けないコンテンツがあるので、そのときはSpotifyで聞いています。

いつ聴くのか

過去にPodcastについて記事を書いたことがあります。聴くタイミングは変わらず何かしながら聴くことが多いです。草むしりとか「何も考えず出来ること×Podcast」の組み合わせは相性がいいと思います。効率的に時間を使えて得した気分にもなります笑
iucstscui.hatenablog.com

おすすめPodcast

上記ブログでもお勧めPodcastを紹介していたのですが、あれから2年以上たちました。残念なことに更新が止まっているPodcastもあります。新たに聞き始めたPodcastもあります。ということで、2022年度版、お勧めPodcastです。新しい発見があれば幸いです。

FREE AGENDA

open.spotify.com
雰囲気はゆるいが内容は深い。仕事に関して自分の考えを持っているお二人(Hikaruさん、Yamottyさん)の哲学を聞けるのが好きで聞いています。プロダクトマネージャーに興味のある方は面白いと思います。

Zero Topic

open.spotify.com
FREE AGENDAのパーソナリティーをしているYamottyさんの個人のPodcastです。最近はYamottyさんが経営されている株式会社10Xについてのお話が多いです。こちらもビジネスに対する哲学を聞けるのが楽しいです。プロダクトマネージャーに興味のある方は面白いと思います。

CULTIBASE Radio

open.spotify.com
マネジメント系の話題が多いPodcastです。こちらも雰囲気はゆるいが内容は深い。アジャイル×マネジメントについて話されることもありますよ。ワークショップ、ファシリテート、マネジメント、育成、に興味のある方は面白いと思います。
パーソナリティの安斎さんは「問いのデザイン」「問いかけの作法」の著者です。「問いのデザイン」は読みましたが、とても良い本です。

EM.FM

open.spotify.com
その名の通り、エンジニアリングマネージャーに関する話題がメインのPodcastです。一時期配信が止まっていましたが、2022年3月から再開されました。この方々はなんと知識が広く深いんだろうと感心ばかりです。
パーソナリティの広木さんはエンジニアリング組織論への招待の著者です。この本も良い本ですね。

fukabori.fm

open.spotify.com
ゲストの方の得意な技術について詳しく深ぼるPodcastです。登場されるゲストの方は第一線で活躍されている方々ばかりです。その方に対して聞きたいことを聞いていただけるのでとても参考になります。多様なゲストの方が参加されるので気になる会をピックアップして聞くのも良いです。ソフトウェアの技術からマネジメントまで幅広く開発に関連するお話が聞けます。

resize.fm

open.spotify.com
デザイン系のPodcastです。UI、UXを中心にその時の時事ネタを話されています。わたしはデザインが出来るわけではないのに、デザイン系の話や書籍を読むのが好きです。

Takram

open.spotify.com
最近、意味のイノベーションを調べたときに知ったPodcastです。まだ数回しか聞けてませんが、イノベーションというテーマについて話されていることが多そうです。イノベーションについて深く深く話されるので勉強になります。プロダクトマネージャーに興味のある方は面白いと思います。

といらじ by THE COACH

open.spotify.com
コーチングのプロお二人が話されるPodcastです。話される内容も面白いのですが、お二人の会話自体がコーチングの要素が詰まっていて良いです。相手への質問方法とか雰囲気づくりとか参考になります。

COTEN RADIO

open.spotify.com
歴史を楽しく学べるPodcastです。学生時代は歴史に興味なかったのですが、このPodcastを聞くと歴史を知る面白さに気付かされます。学生時代に聞いていたらもっと興味を持てたかもなーと思います。

個人的にすごく好きなエピソードがあって、色んな方にも勧めるほど気に入っていました。自分にない視点をたくさん知れたこのエピソードが好きです。
【番外編 #45】エール株式会社 篠田真貴子さんと語る「聴く力」(後編)【COTEN RADIO】 - 歴史を面白く学ぶコテンラジオ (COTEN RADIO) | Podcast on Spotify

ドングリFM

open.spotify.com
教養が得られるような番組を紹介してきましたが、こちらは違います。ゆるーくお話される番組で、最近の話題や面白いネタが話されます。ただの雑談といえばそうなのですが、テーマのセンスが良くて常に面白いです。テーマもポップで手軽に聞けるので一番聞いているかもです。

まとめ

なにか一つでも新しいPodcastを知る機会になっていれば幸いです。

意味のイノベーションを概要が分かるレベルで調べてみた

意味のイノベーションという言葉を知ったのは CULTIBASE Radio(旧 idearium cast)の「おにぎりに学ぶ意味のイノベーション」でした。
おにぎりに学ぶ意味のイノベーション|idearium cast #19 | idearium | 組織イノベーションの方法論を問い直す
創り手の想いはなぜ大切なのか?「悪魔のおにぎり」から学ぶ、意味のイノベーション|Hirokazu Oda (Dan)|note

当時(CULTIBASE Radio の公開は2020年)、初めて聞いた言葉だったので気になっていましたが、特に調べず、いつの間にか忘れていました。ところが最近、新しいものを作ることに興味を持ち、改めて意味のイノベーションが気になったので調べてみました。今後、本なども読んで学んでいきたいと思っていますが、今回はwebで手に入る情報から調べてみました。

意味のイノベーションとは

意味を再定義する

意味のイノベーションは「意味」を再定義することでイノベーションを起こすことです。
「意味のイノベーション」 TEDxプレゼンの日本語訳|渡邉康太郎 / Takram @『コンテクストデザイン』刊行しました|note

TEDで話されているロウソクの例を簡単に説明すると、ロウソクは明るさを得るために使われてきました。時代が変わり明るさは電気が主流になりました。それでもロウソクの売り上げが上がっている。それは、ロウソクの以前の意味ーー明るさを得るためーーから居心地を良くする意味ーー暗くしてリラックスするためーーに変わったからだということです。

このように意味を再定義することがイノベーションだという考えとそれを実行するためのプロセスが意味のイノベーションです。

インサイドアウト

意味のイノベーションインサイドアウト、要はユーザーリサーチ結果からではなく、自分の内部から沸き起こる届けたい価値(意味)からはじめるようです。

感じたこと

何を届けたいかが重要

ここが一番難しそう。ロウソクの例もわかるけど、同じ状況で明るさじゃなく、雰囲気をつくるロウソクを作ろう!って考えられるかどうか。。。もっと明るいロウソク、もっと長持ちするロウソクと考えてしまいそう。

「○○を△△にしたい!」という強い思いが大切で、それは大切な人のプレゼントを選ぶような気持ちが必要なのかなー。

SECIモデルと似てる部分がある

Scrum Fest Osaka 2019で平鍋さんはSECIモデルについて話されていました。その時の感じたことは以下です。
Scrum Fest Osaka 2019 で学んだ話(1日目) - はんなりと、ゆるやかに

「SECIモデル」はかっこいい。信念や想いが暗黙知の形で伝わり、形式知になり、また暗黙知になり成長していく。知と知が積み重なって成長していく感じはワクワクしますね。

SECIモデルも一人の想いからはじまります。その想いが経験を通じ熟成され、人と人のコミュニケーションで形式知になり、また暗黙知になり成長していくサイクルでした。

意味のイノベーションもSECIモデルも一人の情熱🔥から始まる点と、人と人の関わりで成長する点が似ています。

さいごに

意味のイノベーションを実践できるように書籍を読んだり、調べたりしていきます!

「リーダーシップを発揮しよう」という資料は簡潔にリーダーシップの全体像がわかって良かった

リーダーシップについて調べていると厚生労働省リーダーシップを発揮しようというPDFを見つけて分かりやすかった。

どんな資料か

「リーダーの概要」と「リーダーシップ研究の歴史」がまとめられています。そのあとは、リーダーが活用できる「行動心理学と動機付けの心理学」「積極的傾聴・ティーチング・コーチング」の知識やスキルがまとめられています。歴史は「リーダーシップの特性理論(1940 年代)」~「オーセンティック・リーダーシップ(2003 年)」の期間がまとめられていました。

表紙もいれて36ページと短く、簡潔に分かりやすくまとめられているので、ちょっとリーダーシップの全体像を知りたいという方にはぴったりな資料です。

リーダーシップの歴史をざっと知れて良かった

オーセンティック・リーダーシップやサーバント・リーダーシップ、など色々なリーダーシップの考え方があります。じゃあ、他にどのようなリーダーシップがあるのか知りたい!という動機から調べ始めたので、それを簡潔に網羅する資料があり良かったです。

本資料の歴史を読んで、その時代で良いと思われる行動を分類して研究した結果に名前が付いているということに気づきました。当然、時代や環境や文化が違えば「良いとされる行動」も変わると思います。一般的な知識は身につけつつも、いま目の前の状況に対して何が良いかは考える方が良さそうですね。外にヒントはあるけど、答えは内にあるように思いました。

補足:本資料にはシェアドリーダーシップは書かれていませんでした。シェアドリーダーシップは全員参加・全員貢献で生み出すリーダーシップということです。
シャバのリーダーシップは「二刀流」!? | 立教大学 経営学部 中原淳研究室 - 大人の学びを科学する | NAKAHARA-LAB.net

リーダーとマネジメントは違う

マネージャーはリーダーは明確に違う。
本資料に「ヒト・モノ・カネの管理はマネジャーが、リーダーは組織の変化や改革を担います」と書かれていました。また、リーダーは変化を求める、マネージャーは組織の保全を求めると書かれており、正反対の概念なのだと知りました。

とはいいつつも、マネージャーは組織の成長も求められることが多いため、リーダーの要素とマネージャーの要素のバランスを取りながら進めるんでしょうね。

行動心理学は心理的安全性のつくりかたにも出てきた

動機・刺激・行動・結果を明らかにして、その行動を増やしたければ強化(例えば、ほめる)することが紹介されていました。似た話が心理的安全性のつくりかた
iucstscui.hatenablog.comにも登場していました。

シンプルで分かりやすい理論だけど、効果はありそうな考え方で意識しています。

理論だけでなく、具体的なことも書かれている

積極的傾聴には「繰り返す(オウム返し)」やティーチングには「ティーチングの 4 ステップ」など具体的なことが書かれています。

その中でも成程と思った部分はティーチングの初めの2ポイントに「部下の把握をする」「信頼関係の形成 」がきていることです。知識がある人とない人という関係がはっきりしている状態でも信頼関係の形成から始まる点は気づきになりました。

まとめ

リーダーシップの全体像を把握するには良い資料だと思いました。