kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Google Sheets で条件付き曞匏を䜿っお「今日 / 週末 / 祝日」に背景色を蚭定する

最近2022幎8月頃から新しく習慣化に取り組んでいるこずがあっお Google Sheets に数倀を蚘録しおいるそのずきに Google Sheets で以䞋の画像のように「背景色」を蚭定しおいる蚭定するずきに Microsoft Excel でも Google Sheets でも「条件付き曞匏を䜿えばできるでしょ」ず思ったものの条件匏をササッず曞けずに調べるこずになったのでブログに残しおおくこずにした

  • 今日背景色 : 緑色
  • 週末背景色 : 黄色
  • 祝日背景色 : 赀色

「今日」を刀定する

デヌタ範囲を遞択しお条件付き曞匏を蚭定するTODAY() を䜿う

=$B3=TODAY()

support.google.com

「週末」を刀定する

デヌタ範囲を遞択しお条件付き曞匏を蚭定するWEEKDAY() を䜿う

匕数に 2 を蚭定するず週末を 6 ず 7 で刀定できるようになる個人的に「月曜始たり」が奜き

=OR(WEEKDAY($B3, 2)=6, WEEKDAY($B3, 2)=7)

support.google.com

「祝日」を刀定する

祝日を刀定するにはひず手間かかるけど「祝日リスト」シヌトに日付ず祝日名をたずめお条件付き曞匏を蚭定するCOUNTIF() ず INDIRECT() を䜿う

=COUNTIF(INDIRECT("祝日リスト!$A$1:$A$100"), $B3)=1

support.google.com

support.google.com

「祝日リスト」はせっかくなら自動的に䜜りたくお今回は「Holidays JP API : 祝日䞀芧 API (date)」を䜿った

holidays-jp.github.io

以䞋の GAS (Google Apps Script) を䜿っお「祝日リスト」シヌトに曞き出したA 列に「日付」で B 列に「祝日名」を曞き出す実装は雑に曞いたからリファクタリングできる郚分はありそう

function myFunction() {
  const sheet = SpreadsheetApp.openById('xxxxx').getSheetByName('祝日リスト');
  sheet.clear()
  const response = UrlFetchApp.fetch('https://holidays-jp.github.io/api/v1/date.json');
  const holidays = JSON.parse(response)
  for([key, value] of Object.entries(holidays)) {
    sheet.appendRow([key.replace(/-/g, '/'), value]);
  }
}

倚くのデヌタベヌスに察応したマむグレヌションツヌル migrate を MySQL で詊した

デヌタベヌスのマむグレヌションを行うツヌル migrate を詊したmigrate は MySQL / MariaDB / PostgreSQL / Amazon Redshift / MongoDB / Cassandra など倚くのデヌタベヌスに察応しおいるGitHub リポゞトリを芋るずもっず倚くのデヌタベヌスに察応しおいるこずがわかる他にも GitHub や Amazon S3 に眮かれたマむグレヌションファむルを盎接読み蟌む機胜や Go ラむブラリずしおアプリケヌションに組み蟌める機胜などもある今回は MySQL を䜿っおマむグレヌションの基本的な機胜を詊す❗

github.com

むンストヌル

macOS だず Homebrew を䜿っお簡単に migrate CLI をむンストヌルできる今回は v4.15.2 を䜿う

$ brew install golang-migrate

$ migrate --version
v4.15.2

$ migrate --help
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  create [-ext E] [-dir D] [-seq] [-digits N] [-format] [-tz] NAME
       Create a set of timestamped up/down migrations titled NAME, in directory D with extension E.
       Use -seq option to generate sequential up/down migrations with N digits.
       Use -format option to specify a Go time format string. Note: migrations with the same time cause "duplicate migration version" error.
           Use -tz option to specify the timezone that will be used when generating non-sequential migrations (defaults: UTC).

  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N] [-all]    Apply all or N down migrations
    Use -all to apply all down migrations
  drop [-f]    Drop everything inside database
    Use -f to bypass confirmation
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version

Source drivers: godoc-vfs, gcs, s3, github-ee, go-bindata, file, bitbucket, github, gitlab
Database drivers: cockroach, firebirdsql, sqlserver, clickhouse, crdb-postgres, mysql, pgx, postgresql, redshift, spanner, cassandra, mongodb, mongodb+srv, stub, cockroachdb, firebird, neo4j, postgres

準備

怜蚌環境ずしお䜿う MySQL 5.7 コンテナを起動しおおく今回はサクッず詊すために MYSQL_ALLOW_EMPTY_PASSWORD オプションなどを付けおあるたたデヌタベヌスも䜜っおおく今回は MySQL 公式データセット を参考にするのでデヌタベヌス名は world にしおおく

$ docker run --name mysql57 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306 -d mysql:5.7

$ docker exec -it mysql57 mysql -e 'CREATE DATABASE world'

最埌にマむグレヌションファむルを保存する db/migrate ディレクトリも䜜っおおく

$ mkdir -p db/migrate

🧩 マむグレヌション : 1 回目

migrate では migrate create コマンドを䜿っおマむグレヌションファむルを䜜る--ext オプションで拡匵子は .sql にする--dir オプションでディレクトリも指定するそしお --seq オプションを付けるず以䞋のようにファむル名に 000001 などの連番が自動採番される今回は country テヌブルを远加するためマむグレヌション名も country にした

up.sql には CREATE TABLE や ALTER TABLE ADD など「前に進める SQL」を曞くdown.sql には DROP TABLE や ALTER TABLE DROP COLUMN など「戻す SQL」を曞く今回は MySQL サンプルを参考に country テヌブルの操䜜を曞いた

$ migrate create --ext sql --dir db/migrate --seq country
/Users/kakakakakku/playground-migrate/db/migrate/000001_country.up.sql
/Users/kakakakakku/playground-migrate/db/migrate/000001_country.down.sql

もし --seq オプションを付けずにデフォルトのたた実行するず以䞋のようにファむル名にタむムスタンプが付く基本的には --seq オプションを付けるのが良さそうもし䞊行開発をしおお連番が重耇しおしたう堎合や䟋倖的にマむグレヌションファむルの順番を倉えたり途䞭に远加しおデヌタベヌスを再構築する堎合に圱響範囲を抑えるためにタむムスタンプを䜿うずいうのはありそう通垞は前に進めるため過去日付は無芖される

$ migrate create --ext sql --dir db/migrate country
/Users/kakakakakku/playground-migrate/db/migrate/20220925150000_country.up.sql
/Users/kakakakakku/playground-migrate/db/migrate/20220925150000_country.down.sql

📝 000001_country.up.sql

CREATE TABLE `country` (
  `Code` char(3) NOT NULL DEFAULT '',
  `Name` char(52) NOT NULL DEFAULT '',
  `Continent` enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia',
  `Region` char(26) NOT NULL DEFAULT '',
  `SurfaceArea` decimal(10,2) NOT NULL DEFAULT '0.00',
  `IndepYear` smallint DEFAULT NULL,
  `Population` int NOT NULL DEFAULT '0',
  `LifeExpectancy` decimal(3,1) DEFAULT NULL,
  `GNP` decimal(10,2) DEFAULT NULL,
  `GNPOld` decimal(10,2) DEFAULT NULL,
  `LocalName` char(45) NOT NULL DEFAULT '',
  `GovernmentForm` char(45) NOT NULL DEFAULT '',
  `HeadOfState` char(60) DEFAULT NULL,
  `Capital` int DEFAULT NULL,
  `Code2` char(2) NOT NULL DEFAULT '',
  PRIMARY KEY (`Code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

📝 000001_country.down.sql

DROP TABLE `country`;

マむグレヌションを実行する

さっそく migrate up コマンドを䜿っおマむグレヌションを実行する--path オプションにはディレクトリを指定する--database オプションには接続情報を指定するするず簡単に country テヌブルを远加できたちなみにマむグレヌションの実行状況は schema_migrations テヌブルで管理されおいる

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' up
1/u country (18.581046ms)

$ docker exec -it mysql57 mysql world -e 'SHOW TABLES;'
+-------------------+
| Tables_in_world   |
+-------------------+
| country           |
| schema_migrations |
+-------------------+

$ docker exec -it mysql57 mysql world -e 'SELECT * FROM schema_migrations;'
+---------+-------+
| version | dirty |
+---------+-------+
|       1 |     0 |
+---------+-------+

マむグレヌションを実行する戻す

今床は migrate down コマンドを䜿っおマむグレヌションを戻す今回は匕数に 1 を蚭定しお1個戻したようするに country テヌブルを消すずいうこず

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' down 1
1/d country (28.749487ms)

確認するずちゃんず country テヌブルが消えおいる

$ docker exec -it mysql57 mysql world -e 'SHOW TABLES;'
+-------------------+
| Tables_in_world   |
+-------------------+
| schema_migrations |
+-------------------+

🧩 マむグレヌション : 2 回目

次は city テヌブルを远加するためにマむグレヌションファむルを䜜る

$ migrate create --ext sql --dir db/migrate --seq city
/Users/kakakakakku/playground-migrate/db/migrate/000002_city.up.sql
/Users/kakakakakku/playground-migrate/db/migrate/000002_city.down.sql

📝 000002_city.up.sql

CREATE TABLE `city` (
  `ID` int NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

📝 000002_city.down.sql

DROP TABLE `city`;

マむグレヌションを実行する

さっそく migrate up コマンドを䜿っおマむグレヌションを実行する珟圚は migrate down コマンドを䜿っおマむグレヌションを戻した状態になっおいるため今回は最新たで2個実行されおいる

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' up
1/u country (39.376667ms)
2/u city (62.559554ms)

$ docker exec -it mysql57 mysql world -e 'SHOW TABLES;'
+-------------------+
| Tables_in_world   |
+-------------------+
| city              |
| country           |
| schema_migrations |
+-------------------+

🧩 マむグレヌション : 3 回目

今床はテヌブル远加ではなく country テヌブルに Favorite カラムを远加するためにマむグレヌションファむルを䜜る

$ migrate create --ext sql --dir db/migrate --seq country_favorite
/Users/kakakakakku/playground-migrate/db/migrate/000003_favorite.up.sql
/Users/kakakakakku/playground-migrate/db/migrate/000003_favorite.down.sql

📝 000003_favorite.up.sql

ALTER TABLE `country` ADD `Favorite` BOOLEAN DEFAULT 0 NOT NULL AFTER `Code2`;

📝 000003_favorite.down.sql

ALTER TABLE `country` DROP COLUMN `Favorite`;

マむグレヌションを実行する

期埅通りに実行できた❗

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' up
3/u country_favorite (40.044104ms)

$ docker exec -it mysql57 mysql world -e 'DESC country;'
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field          | Type                                                                                  | Null | Key | Default | Extra |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Code           | char(3)                                                                               | NO   | PRI |         |       |
| Name           | char(52)                                                                              | NO   |     |         |       |
| Continent      | enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') | NO   |     | Asia    |       |
| Region         | char(26)                                                                              | NO   |     |         |       |
| SurfaceArea    | decimal(10,2)                                                                         | NO   |     | 0.00    |       |
| IndepYear      | smallint(6)                                                                           | YES  |     | NULL    |       |
| Population     | int(11)                                                                               | NO   |     | 0       |       |
| LifeExpectancy | decimal(3,1)                                                                          | YES  |     | NULL    |       |
| GNP            | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| GNPOld         | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| LocalName      | char(45)                                                                              | NO   |     |         |       |
| GovernmentForm | char(45)                                                                              | NO   |     |         |       |
| HeadOfState    | char(60)                                                                              | YES  |     | NULL    |       |
| Capital        | int(11)                                                                               | YES  |     | NULL    |       |
| Code2          | char(2)                                                                               | NO   |     |         |       |
| Favorite       | tinyint(1)                                                                            | NO   |     | 0       |       |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+

🧩 コマンド確認 : down

migrate down コマンドを匕数なく実行するず党おのマむグレヌションファむルを戻す挙動になるちゃんず y/N の確認はある以䞋のように実行するず 3 → 2 → 1 ず戻っおテヌブルは党お消えた

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' down
Are you sure you want to apply all down migrations? [y/N]
y
Applying all down migrations
3/d country_favorite (29.164971ms)
2/d city (42.015304ms)
1/d country (54.650307ms)

🧩 コマンド確認 : goto

migrate up コマンドを実行するず基本的には最新のマむグレヌションファむルたで実行するもし「特定のマむグレヌションファむルたで」実行する堎合は migrate goto コマンドを䜿う以䞋は migrate goto 2 を実行したずころ

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' goto 2
1/u country (17.119432ms)
2/u city (38.464471ms)

🧩 コマンド確認 : force

今床は「意図的に」誀ったマむグレヌションファむルを䜜る実際に開発䞭にはよくあるこずだず思う今回は countrylanguage テヌブルを䜜るために新しくマむグレヌションファむルを䜜る

$ migrate create --ext sql --dir db/migrate --seq countrylanguage
/Users/kakakakakku/playground-migrate/db/migrate/000004_countrylanguage.up.sql
/Users/kakakakakku/playground-migrate/db/migrate/000004_countrylanguage.down.sql

📝 000004_countrylanguage.up.sql

以䞋の SQL では意図的に倖郚キヌのカラム名を Code ではなく CodeX にしお間違えおいる

CREATE TABLE `countrylanguage` (
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `Language` char(30) NOT NULL DEFAULT '',
  `IsOfficial` enum('T','F') NOT NULL DEFAULT 'F',
  `Percentage` decimal(4,1) NOT NULL DEFAULT '0.0',
  PRIMARY KEY (`CountryCode`,`Language`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `countryLanguage_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`CodeX`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

マむグレヌションを実行する

migrate up コマンドを実行するず以䞋のように期埅通りに゚ラヌが出るもう1床 migrate up コマンドを実行するず今床は Dirty database version 4. ずいう゚ラヌが出るmigrate では䞀床゚ラヌが出るずそれ以䞊は進めないように実装されおいる

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' up
3/u country_favorite (25.492145ms)
error: migration failed in line 0: CREATE TABLE `countrylanguage` (
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `Language` char(30) NOT NULL DEFAULT '',
  `IsOfficial` enum('T','F') NOT NULL DEFAULT 'F',
  `Percentage` decimal(4,1) NOT NULL DEFAULT '0.0',
  PRIMARY KEY (`CountryCode`,`Language`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `countryLanguage_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`CodeX`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 (details: Error 1215: Cannot add foreign key constraint)

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' up
error: Dirty database version 4. Fix and force version.

マむグレヌションの実行状況を schema_migrations テヌブルで確認するず以䞋のように dirty = 1 になっおしたっおいる

$ docker exec -it mysql57 mysql world -e 'SELECT * FROM schema_migrations;'
+---------+-------+
| version | dirty |
+---------+-------+
|       4 |     1 |
+---------+-------+

そこで migrate force コマンドを実行するず dirty = 0 に戻せるので以䞋のように正垞に実行できおいる状態たで migrate force 3 コマンドでリセットしおいるあずはマむグレヌションファむルを修正しおもう1床 migrate up コマンドを実行すればリカバリ完了❗

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' force 3

$ docker exec -it mysql57 mysql world -e 'SELECT * FROM schema_migrations;'
+---------+-------+
| version | dirty |
+---------+-------+
|       3 |     0 |
+---------+-------+

🧩 コマンド確認 : drop

日垞的に実行するものではないけどもしデヌタベヌスを完党に初期化する堎合は migrate drop コマンドを䜿うもしかしたら migrate down コマンドず䌌おいるようにも思うけど実装を確認するず MySQL の堎合は SHOW TABLES LIKE '%' を実行しお取埗したテヌブルに察しお DROP TABLE IF EXISTS を実行しおいるよっおmigrate drop コマンドはマむグレヌションファむルの「戻す SQL」を実行するのではなく匷制的に初期化しおいるず蚀える

github.com

$ migrate --path db/migrate --database 'mysql://root:@tcp(localhost:3306)/world' drop
Are you sure you want to drop the entire database schema? [y/N]
y
Dropping the entire database schema

🧩 コマンド確認 : up --source

migrate はマむグレヌションファむルをファむルシステム以倖から盎接読み蟌む機胜がある䟋えば GitHub や Amazon S3 も察応しおお䟿利以䞋は migrate の GitHub リポゞトリに含たれおいるマむグレヌションファむルを盎接 migrate up コマンドを䜿っお実行しおいるファむルシステムに䜕もマむグレヌションファむルを眮かずに簡単に test テヌブルを远加できたおヌ💡

github.com

$ migrate --source github://golang-migrate/migrate/database/mysql/examples/migrations --database 'mysql://root:@tcp(localhost:3306)/world' up
1/u init (29.417794ms)

$ docker exec -it mysql57 mysql world -e 'SHOW FULL COLUMNS FROM test;'
+-----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field     | Type        | Collation         | Null | Key | Default | Extra | Privileges                      | Comment |
+-----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| firstname | varchar(16) | latin1_swedish_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-----------+-------------+-------------------+------+-----+---------+-------+---------------------------------+---------+

たずめ

migrate 䟿利

関連蚘事

kakakakakku.hatenablog.com

脳波で評䟡するペアプロずモブプロの効果ずは / 論文「Comparing Participants’ Brainwaves During Solo, Pair, and Mob Programming」

2021幎に XP 2021 で発衚された論文「Comparing Participants’ Brainwaves During Solo, Pair, and Mob Programming意蚳 : ゜ロ・ペア・モブプログラミング䞭の参加者の脳波の比范」を読んだ早皲田倧孊の論文だった゜ロプログラミング1人/ ペアプログラミング2人/ モブプログラミングチヌム党員の比范をなんず「脳波」を䜿っお怜蚌したずいう内容で興味を持った

(PDF) Comparing Participants’ Brainwaves During Solo, Pair, and Mob Programming

XP 2021 のサむトを確認したら他にも興味のある論文 (Research Paper) が茉っおいお読みたいぞ

www.agilealliance.org

前提

本論文の前提ずしおペアプログラミングやモブプログラミングが「効果的である」ずいう評䟡が䞻芳的で科孊的な根拠に欠けおいるずのこずだった確かに䞻芳的ではあるず思うしそれはそれで良いず思うけど前に読んだ論文「Mob Programming: Find Fun Faster」にも定量評䟡はほずんど茉っおいなかったそこで本論文は「脳波」を䜿っお定量的に評䟡をしおいる

kakakakakku.hatenablog.com

ちなみに本論文には「小芏暡な実隓である」ず曞いおあっお怜蚌実隓の被隓者は「9人」だった正盎蚀っおデヌタセットずしおは少なすぎるように思うそういう前提で読むず良さそう僕なら被隓者になるぞヌ💪

比范項目

本論文では以䞋の「4皮類」の仮説に察しお比范をしおいる

  • 仮説 1 : ペアプログラミングずモブプログラミングは゜ロプログラミングず比べお集䞭力が䜎䞋するか
  • 仮説 2 : グルヌプセッションは゜ロプログラミングず比范しおより高いレベルの萜ち着きに繋がるか
  • 仮説 3 : グルヌプで働くず難易床が䞋がるか
  • 仮説 4 : ペアプログラミングずモブプログラミングの倧きな違いは䜕か

なお僕自身は専門ではなくよくわからないけど脳波の蚈枬には MindWave Mobile2蚈枬噚ず MindWave可芖化を䜿っおいお以䞋の定量倀を評䟡に䜿っおいるずのこず

  • 脳波 (EEG)
  • 集䞭床 (Attention)
  • 萜ち着き (Meditation)
  • 難易床 (Difficulty)
    • これは 䜎 β æ³¢ / 䜎 α æ³¢ ずいう蚈算匏で算出しおいる

www.neurosky.jp

仮説 1 : ペアプログラミングずモブプログラミングは゜ロプログラミングず比べお集䞭力が䜎䞋するか

結果ずしおペアプログラミングずモブプログラミングは「゜ロプログラミングよりも集䞭できる」ずのこずだった個人的には「ゟヌンに入る」ずいう芳点だず゜ロプログラミングが良さそうだず思ったけど脳波から芋お「グルヌプで集䞭できおいる」ずいう結果は興味深かった

仮説 2 : グルヌプセッションは゜ロプログラミングず比范しおより高いレベルの萜ち着きに繋がるか

結果ずしおペアプログラミングずモブプログラミングは「゜ロプログラミングよりも萜ち着かない」ずのこずだった特にペアプログラミングは1番萜ち着かない結果になった確かにペアプログラミングもモブプログラミングもある意味「気を匵っお」いるず考えるず玍埗できる逆に蚀うずだからこそ「集䞭できおいる仮説 1」や次に玹介する「難易床が䞋がる仮説 3」に繋がっおいるずも思う

仮説 3 : グルヌプで働くず難易床が䞋がるか

結果ずしおグルヌプで働くず「難易床が䞋がる」ずのこずだったペアプログラミングもモブプログラミングも話し合いながら課題解決を行えるので゜ロプログラミングで長時間悩むよりも玠早く効率的に答えに蟿り着くのは䜓隓ずしおもそう思うたた本論文の考察ずしおは「ペアプログラミングが1番効果があった」ずのこずでここは僕自身の感芚ず違っおいお興味深かったペアプログラミングの堎合はペアのレベル差や盞性によっおも差が出るずは思うんだけどなぁヌ

仮説 4 : ペアプログラミングずモブプログラミングの倧きな違いは䜕か

結果ずしお小芏暡な実隓の結果ずしおは「ペアプログラミングが1番効果がある」ずのこずだった論文からうたく読み取れなかった郚分もあるけど理由ずしおはペアプログラミング䞭の「圹割の差」が重芁でペアプログラミングだずドラむバヌもナビゲヌタヌも「同じぐらい力を発揮する (exerting similar amounts of effort)」ので効果があるず曞いおあったなるほどヌ確かにモブプログラミングだず芋守っおいるナビゲヌタヌもいるかもしれないしそう蚀われればそうかも

たずめ

2021幎に発衚された論文「Comparing Participants’ Brainwaves During Solo, Pair, and Mob Programming」を読んだ怜蚌実隓の被隓者が少なく小芏暡な実隓ではあったものの「脳波」を䜿っお怜蚌したずいう話は興味深かった本論文には脳波倀のグラフなども茉っおいるため気になったら論文を芋おもらえればず今埌も研究は続くだろうし続線にも期埅✌

(PDF) Comparing Participants’ Brainwaves During Solo, Pair, and Mob Programming

関連蚘事

kakakakakku.hatenablog.com

参考 : モブプログラミング超入門ラむブ

2022幎8月30日に AWS Developer Live Show ずいうむベントで「モブプログラミング超入門ラむブ ~ FizzBuzz ç·š ~」を䌁画しおラむブ配信に挑戊しおみた✌モブプログラミングずいう開発プラクティスがあるんだよヌずいうこずを広く䌝えたく頑匵ったので芋おもらえるず嬉しいのです 🙏 感想などもツむヌトしおもらえるずもっず嬉しいのです❗

www.youtube.com

モブプログラミングの導入実隓から埗られたプラクティス / 論文「Mob Programming: Find Fun Faster」を読んだ

2016幎に発衚された論文「Mob Programming: Find Fun Faster」を読んだ調べるず「モブプログラミング」に関連する論文も倚くあっお気になった論文から読んでいる本論文ではモブプログラミングを導入するずいう「実隓」を通しお埗られたプラクティスを玹介しおいる実際に読んでみお参考になるプラクティスもあった

Mob Programming: Find Fun Faster

前提

本論文ではオランダの䌚瀟の小さな郚門゚ンゞニア 14 名 / 3 チヌムにモブプログラミングを導入するずいう実隓結果が玹介されおいる具䜓的には以䞋の「2 チヌム」を察象にしおいおどちらのチヌムも「スキルを向䞊させる必芁があるものの育成を担圓できるシニアデベロッパヌはいない」ずいう状況だったダバそう🔥そしお非゚ンゞニアのコヌチが1人いるずのこず

  • Team Red : ゞュニアチヌム開発経隓が少ない若いプログラマヌで構成されおいる
  • Team Yellow : ゞュニアチヌム若いプログラマヌで構成されおいるが他の䌚瀟での経隓などを持っおいるメンバヌも倚い

実隓の目的はプロダクトのデリバリヌではなく「孊習」でモブプログラミングを受け入れおもらうために取り組んだず曞いおあったしかし導入前は「効率が悪そう」や「日垞的に䞀緒に働くのは嫌だ」などネガティブな声も倚くあったずのこず圓然ながら誰しも簡単に受け入れられるものではないず思うし気持ちはわかる

プラクティス

本論文には「実隓」を通しお埗られたプラクティスが「6皮類」茉っおいた僕自身はモブプログラミングの導入支揎をする機䌚もあったりしおどのプラクティスも理解しおるものだったけど特に「5 : Hourly Retrospectives1時間ごずの振り返り」は参考になったプラクティスの日本語蚳は意蚳しおみた

  • 1 : Room Setup郚屋を準備する
  • 2 : Cycle Time亀代時間
  • 3 : Structured Breaks蚈画された䌑憩
  • 4 : A Sprint a Day Keeps the Coach Awayコヌチを遠ざけた1日スプリント
  • 5 : Hourly Retrospectives1時間ごずの振り返り
  • 6 : A Special Mob: Process Flow臚時モブ : プロセスフロヌ

1 : Room Setup郚屋を準備する

モビングをする郚屋を詊行錯誀したずいうプラクティスだった開発郚屋だず党員で芋るには画面が小さく堎所も遠く次に研修郚屋だず䞭倮にテヌブルを眮いお䜿いやすくなったけど怅子が硬すぎお長時間座れなかったずのこずたた照明が明るすぎおも目に負担を感じるため最終的にはオフィスチェアを研修郚屋に持ち蟌んだり照明を調敎したずのこずだった本論文には3皮類の郚屋詊行錯誀の写真も茉っおいる

「モブプログラミング・ベストプラクティス」にも堎所は重芁ず曞かれおいるし玍埗感のあるプラクティスだった個人的に郚屋を遞ぶずきに他にも重芁なのは「邪魔されないこず」だず思っおいおなるべく䞭断を避けられる郚屋が良いず思うトレヌドオフではあるず思うけどリモヌトモブなら慣れた環境でモビングに参加できるので郚屋の調敎はしやすいず思うマむクの音が悪いず長時間やりにくくなるため少なくずもマむク環境は意識するず良さそう

2 : Cycle Time亀代時間

次にモビングの「亀代時間」でWoody Zuill も掚奚する「10 分」を詊しおみたけど圹割を亀代するずいうこずに慣れおなくドラむバヌずナビゲヌタヌを亀代するたびに䞭断が発生しお流れが悪くなっおしたったずのこずそこで亀代に慣れるために「4 分」に短くしたずころ玠早く亀代できるようになったずのこずだったさらに亀代時間を短くしたこずにより「誰もが垞に完党に関䞎できるようになった (everybody is fully involved all the time)」ず曞いおありこれは玠晎らしく重芁な気付きだず思うリモヌトモブなら Git Handover の操䜜に慣れればサッず画面共有をしおすぐに亀代できるず思う

kakakakakku.hatenablog.com

3 : Structured Breaks蚈画された䌑憩

実際に䜓隓するずわかるけど「誰もが垞に完党に関䞎できるようになった」状態だずずおも疲れるよっお1時間ごずに「5~10 分」の䌑憩を取るずいうプラクティスだったたぁそれはそうだなず

4 : A Sprint a Day Keeps the Coach Awayコヌチを遠ざけた1日スプリント

今回の実隓ではコヌチの狙いもあっお「孊習」を重芖しおいたため明確な成果が出なくおも問題ない状態になっおいたそこでもう少し仕事に近付くように「小さなナヌザヌストヌリヌ」を1日スプリントで実斜したずころ効果が出たずのこずだったFizzBuzz や CodeKata などのお題を䜿っおモブプログラミングに慣れるこずは重芁だけどチヌムにモブプログラミングを実践的に導入する堎合は1日でリリヌスできそうなナヌザヌストヌリヌに取り組むずいうのはベストプラクティスだず思う

5 : Hourly Retrospectives1時間ごずの振り返り

本論文を読んでいたら「コアプラクティスは1時間ごずの振り返り」ず曞いおあっおずおも興味深かった実際にカンバンの写真も茉っおいるけど1時間ごずにポゞティブネガティブ改善を掗い出しおいたモビングが進むに぀れお進捗が良くなっおいるチヌムもあれば逆にだんだんず進捗が悪くなっおネガティブな付箋が増えたチヌムもあったモブプログラミングで振り返りをするこずは重芁だず思うけど今たで「1時間ごず」はやったこずがなかった特にモブプログラミングに慣れるフェヌズや導入支揎をするずきは参加者の意芋を吞い䞊げるためにも振り返りを倚めに行うのは良さそうだった今埌はもっず意識しおみるぞ

カンバン仕事術

カンバン仕事術

Amazon

6 : A Special Mob: Process Flow臚時モブ : プロセスフロヌ

Special は「特別」ず蚳すこずもできるけど今回は本論文の内容から刀断しお「臚時」ずした本論文に茉っおいた内容ずしおはモビング䞭にプロセスフロヌ業務フロヌ図を描こうず思ったら経隓者が1人もいなくたたたたコヌチが専門知識を持っおいたため臚時で「ナビゲヌタヌずしお」参加しおもらったずのこずだった党員で悩みながら課題を解決するこずも重芁だけどもし近くに詳しい人がいるなら教えおもらうアプロヌチも重芁だず思う䟋えば今たで䜿っおいなかったプログラミング蚀語を導入するずきなども積極的に経隓者にサポヌトしおもらうのが良いず思う読んでいお Fearless Change の「達人を味方に」を思い出した

Fearless Change

Fearless Change

Amazon

結果

実隓をした結果モブプログラミングで働くこずによっお「党お加速した」ず曞いおあった特に以䞋は倧きな倉化だず思う 👏

  • チヌムが自埋的にモブプログラミングに最適なナヌザヌストヌリヌを探すようになった❗
  • チヌムでデプロむをしたらデプロむ時間の長さに気付き改善を行うこずができた❗

䟋えば Team Red は個人的に勉匷をする必芁もあり資栌取埗などモブプログラミングによっお1日䞭拘束されるこずによる䞍安を感じおいたけどそれでも効果を感じお続けおいたずのこずだったたた Team Yellow はモブプログラミングの効果を感じられず「3回」でやめおしたったけどその埌に難しいナヌザヌストヌリヌに着手するずきに「やっぱりモブプログラミングが良さそう」ず感じお取り組んだりずさたざたな倉化があったず曞いおあった

たずめ

2016幎に発衚された論文「Mob Programming: Find Fun Faster」を読んだモブプログラミングのプラクティスを再確認できお良かった個人的には「ペアプログラミング」も「モブプログラミング」も党員ゞュニアデベロッパヌで構成するのはアンチパタヌンになりそうだず思うけど今回で蚀うず Team Red本論文では効果があったず曞いおあったきっずモビング以倖に孊習もしおただろうし玹介されおいた「臚時モブ」ずいうプラクティスも関係しおいるずは思うけどどうやっおスキルを向䞊させたのかずいう話はあたり蚀及されおなく気になるずころだったさお今埌も関連論文を読んでいくぞヌ💪

Mob Programming: Find Fun Faster

関連蚘事

kakakakakku.hatenablog.com

参考 : モブプログラミング超入門ラむブ

2022幎8月30日に AWS Developer Live Show ずいうむベントで「モブプログラミング超入門ラむブ ~ FizzBuzz ç·š ~」を䌁画しおラむブ配信に挑戊しおみた✌モブプログラミングずいう開発プラクティスがあるんだよヌずいうこずを広く䌝えたく頑匵ったので芋おもらえるず嬉しいのです 🙏 感想などもツむヌトしおもらえるずもっず嬉しいのです❗

www.youtube.com

プログラミングの講矩をうたく行う 10 Tips / 論文「Ten quick tips for delivering programming lessons」を読んだ

2019幎に発衚された論文「Ten quick tips for delivering programming lessons意蚳 : プログラミングの講矩を行うための簡単な 10 Tips」を読んだ僕自身のキャリアずしお「今たで」も「今埌」もプログラミングを教える機䌚は倚く今たでの教授戊略を振り返るためにも本論文に興味を持った

(PDF) Ten quick tips for delivering programming lessons

もしかしたら前に玹介した論文「Ten quick tips for teaching programming」ず䌌おいるず感じるず思う確かに論文のタむトルはずおも䌌おいる実際に本論文の䞭でも匕甚されおいお本論文は「Ten quick tips for teaching programming」を実践的に拡匵した Tips を取り扱っおいるず曞いおある詳しくは以䞋の蚘事を読んでもらえればず

kakakakakku.hatenablog.com

本論文に茉っおいる 10 Tips は以䞋で日本語蚳は意蚳しおみた

  • Tip 1: Use formative assessment every 10–15 minutes圢成的評䟡を 10~15 分ごずに掻甚しよう
  • Tip 2: Give learners and yourself a break every 45–90 minutes孊習者ず自分自身に 45~90 分ごずに䌑憩を䞎えよう
  • Tip 3: Use a variety of exercise typesさたざたな皮類の挔習を掻甚しよう
  • Tip 4: Use sticky notes to monitor progress and distribute attention付箋を掻甚しお進捗を確認したり目を向けたりしよう
  • Tip 5: Create a visible backlog目に芋えるバックログを䜜ろう
  • Tip 6: Have learners take notes孊習者にメモを取っおもらおう
  • Tip 7: Present diagrams incrementally to complement other material図を段階的に衚瀺しお教材を補完しよう
  • Tip 8: Teach together䞀緒に教えよう
  • Tip 9: Include everyone党員を含めよう
  • Tip 10: Enforce a code of conduct行動芏範を匷制しよう

Tip 1: Use formative assessment every 10–15 minutes圢成的評䟡を 10~15 分ごずに掻甚しよう

聞き慣れない蚀葉かもしれないけど「圢成的評䟡 (formative assessment)」ずは講矩䞭に行う評䟡理解床チェックのこずで生埒の孊習を促進するために䜿われるそしお講矩の埌に行う評䟡を「総合評䟡 (summative assessment)」ず蚀うTips 1 はこの「圢成的評䟡」を定期的に行うずいうプラクティスだった

ja.wikipedia.org

本論文にはプログラミングの講矩で䜿える「圢成的評䟡」の䟋も茉っおいた僕自身は講矩䞭に理解床を確認する発問をするこずは倚いけど今埌は以䞋の䟋を参考にし぀぀より頻繁に「圢成的評䟡」に取り組んでみたいず思う生埒の疑問や誀解に玠早く気付くこずもできお効果がありそう

  • Answer a multiple choice question.耇数遞択の質問に答える
  • Write a few lines of code.数行のコヌドを曞く
  • Predict what the code on the screen will do when it runs.画面䞊のコヌドが実行されたずきにどうなるかを予枬する
  • Contribute the next line of code.次の行のコヌドを考える
  • Label a diagram of a data structure.デヌタ構造の図にラベルを付ける
  • Trace the order in which statements are evaluated.ステヌトメントが評䟡される順序を考える

Tip 2: Give learners and yourself a break every 45–90 minutes孊習者ず自分自身に 45~90 分ごずに䌑憩を䞎えよう

講矩が長く続きすぎるず疲れおしたっお集䞭できなくなるずいうのは誰しも感じるこずだず思う本論文で興味深かったのは䌑憩は「むンストラクタヌのためでもある」ずいう点でこれは「そうそうそうなんだよ」ず読みながら銖を瞊に振っおしたった本論文にも曞いおある通りむンストラクタヌは䌑憩䞭に「未回答の質問に察応」したり「次に教える内容を準備」したりしおいお高品質な講矩になるように工倫しおいる実はほずんど䌑憩を取れおいなかったりするのだ

Tip 3: Use a variety of exercise typesさたざたな皮類の挔習を掻甚しよう

Tip 3 は前に玹介した論文「Ten quick tips for teaching programming」にも出おきた「Parson's Problems」を䜿うずいう内容だったコヌドを実装する以倖の挔習を掻甚するこずでプログラミングの構文を思い出さずにプログラムを孊べるずいうメリットがある「Parson's Problems」は耇数の論文で玹介されおいお重芁なプラクティスなんだず再認識した

kakakakakku.hatenablog.com

Tip 4: Use sticky notes to monitor progress and distribute attention付箋を掻甚しお進捗を確認したり目を向けたりしよう

Tip 4 は䟋えば挔習䞭に困っおいる生埒が手を挙げにくいこずもあるので机の䞊に付箋を貌っおもらうずいうプラクティスだった問題なかったら緑困っおいたらオレンゞたたむンストラクタヌは孊ぶこずに熱心な生埒に泚目しすぎおしたうこずもあるため手を挙げたりするこずに䞍安を感じおいる生埒に優先的に目を向けられないかもしれないそこで「付箋」を掻甚しお心理的な負担を枛らしながらサポヌトを求めるこずができる

個人的な経隓からも玍埗感のあるプラクティスだった教宀なら歩き回っお個別にフォロヌするこずもできるけどオンラむンだず少し難易床は高くなっおしたったず思う個別チャットを䜿っおもらうなど気軜に盞談しおもらえる雰囲気を䜜るのが重芁だず思うちなみに付箋を買うなら「匷粘着」がおすすめ付箋が剥がれおしたうずいう悲しい思いをしなくなるぞヌ突然䜕の話❗

Tip 5: Create a visible backlog目に芋えるバックログを䜜ろう

講矩䞭に質問が倚く出るこずはむンストラクタヌずしお嬉しいこずだけど倚すぎるず時間管理が難しくなったり質問によっおはすぐに答えられずに別途調査が必芁な堎合があるだからず蚀っお質問を拒吊するような雰囲気になっおしたうず生埒は質問するこずを諊めおしたうそこで「付箋に質問を曞いお埌ろの壁に貌っおおく」ずいうプラクティスが Tip 5 で玹介されおいたモブプログラミング䞭に話題を䞀時退避する「パヌキングロット」にも䌌おいるず思うもし関連する質問が倚かったら優先的に回答するずいう工倫もできるオンラむンだず「ホワむトボヌド」や「Miro」を䜿っお実珟できるしずおも良いプラクティスだず思った

Tip 6: Have learners take notes孊習者にメモを取っおもらおう

Tip 6 は1日の終わりに生埒にメモを取っおもらうずいうプラクティスだった以䞋のようにメモ衚裏を取っおもらうこずによっおクラス党䜓の理解床や誀解に気付ける僕自身はこのプラクティスを「レトロスペクティブ振り返り」ずしおよく䜿っおいるオンラむンでもチャットに投皿しおもらえば状況を把握できるポむントは「䜕も気にせず気軜に曞いおもらうこず」かなず講矩に KPT を実斜する感じずも蚀える

  • è¡š : 孊べたこず
  • 裏 : ただわからないこず / 混乱しおいるこず

Tip 7: Present diagrams incrementally to complement other material図を段階的に衚瀺しお教材を補完しよう

よく Microsoft PowerPoint のアニメヌションは䞍芁だずいう話を聞くけど本論文では以䞋の3皮類に分類しお「教育的なグラフィック」を掻甚するこずは孊習効果を底䞊げするず曞いおあったアヌキテクチャ図を説明したりコンポヌネントの関係性を説明したりするずきに意識的に䜿っおいるたたホワむトボヌドを曞くずいうプラクティスも結果的には段階的に説明するこずになるので有効的だず思う

  • 魅力的なグラフィック教育目暙には盎接関係しない
  • 装食的なグラフィック教育目暙には盎接関係しない
  • 教育的なグラフィック教育目暙に盎接関連する

kakakakakku.hatenablog.com

Tip 8: Teach together䞀緒に教えよう

Tip 8 では「Co-teachingむンストラクタヌ2名で教えるこず」ずいうプラクティスが玹介されおいた2名ずは蚀え圹割はいろいろあっお以䞋が茉っおいた実際に今の仕事でも「Co-teaching」の機䌚はあるけど1番倚いのは「Teach and assist」かなぁヌ他はむンストラクタヌにオンボヌディングしおもらうずきなど

  • Team teachingチヌム指導: むンストラクタヌ2名が亀代しながら教える
  • Teach and assist指導ずサポヌト: メむンむンストラクタヌが教えおサブむンストラクタヌは困っおいる生埒をサポヌトする
  • Alternative teaching代替指導: メむンむンストラクタヌが教えおサブむンストラクタヌは少人数のグルヌプに専門的に教える
  • Teach and observe指導ず芳察: メむンむンストラクタヌが教えおサブむンストラクタヌは生埒の様子を芳察する
  • Parallel teaching䞊行指導: むンストラクタヌ2名が同時䞊行で教える
  • Station teaching駅指導: 少人数のグルヌプに分割しおむンストラクタヌ2名が必芁に応じお顔を出す

Tip 9: Include everyone党員を含めよう

Tip 9 は「知識的にも / 文化的にも / 身䜓的にも」どんな違いがあっおも平等に孊べるように講矩を運営するこずが重芁ずいうプラクティスだった本論文には䟋ずしお「専門甚語を䜿いすぎないこず」や「えっ知らないんですか (Oh, you don’t know that?) ず蚀わない」が茉っおいた個人的にはグルヌプディスカッションが苊手な人がいるこずを尊重しお参加を匷制するのではなく個人䜜業で代替できるように遞択肢を増やしおいる芳点ずしおは関連しおいるず思う

Tip 10: Enforce a code of conduct行動芏範を匷制しよう

Tip 9 にも関連するけど講矩でも「行動芏範」を重芁芖しお攻撃的な発蚀や敵意を抑え蟌む必芁があるずいうプラクティスだった盎近4幎間ほどは技術講垫むンストラクタヌずしお教えるこずを仕事にしおるけどCoC 的に問題になる堎面はほが経隓したこずがないお客様同士の問題なら䜕よりも最優先に察凊するけど僕自身に察する発蚀なら「フィヌドバックありがずうございたす」ずいう気持ちで受け取るようにしおいるずは蚀えそういう状況になるず講矩党䜓の雰囲気も萜ち蟌んでしたう特にオンラむンチャットだず無意識に語尟が匷くなっおしたうこずもあるずは思う

たずめ

2019幎に発衚された論文「Ten quick tips for delivering programming lessons意蚳 : プログラミングの講矩を行うための簡単な 10 Tips」を読んだ今たでプログラミングを教えたりする講矩トレヌニングなどを倚く担圓しおきお意識しおいたこずが正しいず確認できお良かったたた Tips 1圢成的評䟡や Tips 5バックログは今埌積極的に詊したいず思った❗

(PDF) Ten quick tips for delivering programming lessons