$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

良かったことは良かったとはっきりフィードバックする

最近心がけていることとして、「良かったことは良かったとはっきりフィードバックする」ということがある。

自分がリーダーやマネージャのポジションになった時に、方針やメッセージを打ち出す、チームの開発フローを改善するなどを行うことがあった。この時、何もフィードバックが返ってこなくて、結局良かったのか、それともあまり興味がないのか、実は不満に思っているのか、どれなのかわからず、非常に不安に思ったという経験がある。

逆に自分が伝えられる立場になった時を考えてみると、何かが行われた時、気になることはよくフィードバックするけど、良かったなと思うことは心の中で思うだけでフィードバックしないことが多いと感じた。

そこで最近は、「良かったことは良かったとはっきりフィードバックする」ように心がけている。はっきりフィードバックするというのは、どこが良かったかを出来る限り具体的に相手に伝えるということである。伝える場所はどこでも良くて、例えば社内のグループウェアで書く、チャットでメンション飛ばす、直接口頭で伝えるなどがある。

また、同時に気になることも併記して伝えるようにしている。つまり、

  • 先に良かったところを出来る限り具体的に書く
  • 続いて気になるところ、課題と感じることを出来る限り具体的に書く

というように書いていく。自分がフィードバックを貰う立場でも良かったことを先に書かれると気分が良いので、フィードバックを書く時もこのようにしている。


このように最近は良かったことをはっきりとフィードバックしてみているのだけど、相手からそう言ってもらえて嬉しいなどの声が返ってきて、やっぱり言ってみて良かったと感じている。

【Scala】テスト時にjoda-timeの現在時刻を変更できるjoda-time-fakeを作りました

テストをしようとすると、現在時刻を変更したくなることがよくある。現在のプロジェクトではjoda-timeを使っているので、joda-timeのDateTime.nowが返す時刻を変更したい。ということで、それを簡単にできるjoda-time-fakeというライブラリを作りました。

インストール

sbtの場合はlibraryDependenciesに入れる。

libraryDependencies ++= Seq(
  "com.github.shibayu36" %% "joda-time-fake" % "0.0.2"
)

使い方

README.mdに書いてありますが、以下のように使います。

import com.github.shibayu36.jodatimefake.FakeTimer
import org.joda.time.DateTime

// 現在のepoch (ms) で現在時刻を変更する
val result = FakeTimer.fake(1515974400000L) {
    println(DateTime.now.toString) // 2018-01-15T00:00:00.000Z
    "hoge"
}

// 現在時刻はブロックを抜けると戻る
println(DateTime.now.toString)

// ブロックで返した値を受け取ることができる
println(result) // hoge

// joda-timeのDateTimeインスタンスを渡して現在時刻を変更可能
FakeTimer.fake(new DateTime(2018, 2, 13, 14, 59)) {

}

// ISODateTimeFormatの形式を指定して現在時刻を変更可能
FakeTimer.fake("2018-03-02T12:34:56+09:00") {

}

// ブロックの中でさらに時刻を進めたい場合は、fakeWithTimerを使う
// 渡ってくるTimerのインスタンスのtick()メソッドを呼ぶと時間を進められる
FakeTimer.fakeWithTimer(1515974400000L) { t =>
    println(DateTime.now.toString) // 2018-01-15T00:00:00.000Z
    t.tick(3000) // 3000ms時間を進める
    println(DateTime.now.toString) // 2018-01-15T00:00:03.000Z
}

注意

このライブラリはjoda-timeのDateTimeUtilsのsetCurrentMillisProviderというのを使っているのだけど、これがマルチスレッドに対応していません。そのため、マルチスレッド環境下でテストを動かしている場合、このライブラリもうまく動きません。

マルチプロセスなら動くので、並列でテストしたい場合はマルチプロセスを使うと良さそうです。

まとめ

joda-timeから得られる現在時刻を変更するライブラリであるjoda-time-fakeを作りました。どうぞご利用ください。

Scalaのエコシステムを知るためにという意図もあって、簡単なライブラリを作って公開してみたけど、実際に学ぶことが非常に多かったように思う。いろいろな知見に関してはこれから少しずつ公開していく予定です。

sbtで複数のScalaのバージョンでビルドする

ライブラリを作っていて、2.11と2.12両方共でビルドしたかったので、sbtでどうやるか調べた。


方法は非常に簡単で、https://www.scala-sbt.org/1.0/docs/Cross-Build.html#Cross-Building+a+Project を参考にすれば良い。

まずbuild.sbtにcrossScalaVersionsを記述。

crossScalaVersions := Seq("2.11.12", "2.12.4")

あとはsbtで+付きで実行すると両方のバージョンでsbtのタスクの実行を行える。

sbt:joda-time-fake> +compile
[info] Setting Scala version to 2.12.4 on 1 projects.
[info] Reapplying settings...
[info] Set current project to joda-time-fake (in build file:/Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/)
[info] Updating ...
[info] Done updating.
[success] Total time: 1 s, completed Mar 22, 2018 7:36:15 AM
[info] Setting Scala version to 2.11.12 on 1 projects.
[info] Reapplying settings...
[info] Set current project to joda-time-fake (in build file:/Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/)
[info] Updating ...
[info] Done updating.
[success] Total time: 0 s, completed Mar 22, 2018 7:36:15 AM
[info] Reapplying settings...
[info] Set current project to joda-time-fake (in build file:/Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/)

もちろんテストとかも+付きで実行するだけでいい。

sbt:joda-time-fake> +test

++を使うと、Scalaのバージョン切り替えもできる。これを使えば+なしで普通に実行した時のバージョンを選択できる。

sbt:joda-time-fake> ++ 2.11.12
[info] Setting Scala version to 2.11.12 on 1 projects.
[info] Reapplying settings...
[info] Set current project to joda-time-fake (in build file:/Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/)
sbt:joda-time-fake> ++ 2.12.4
[info] Setting Scala version to 2.12.4 on 1 projects.
[info] Reapplying settings...
[info] Set current project to joda-time-fake (in build file:/Users/shibayu36/development/src/github.com/shibayu36/joda-time-fake-scala/)


sbt便利ですね。