Edited at

[Go] 第二言語勉強のときは入門書+ユニットテストがイイぞ !!


概要

基本学習嫌いな自分が第二言語の勉強法として入門書のサンプルのユニットテストを書くと学習が捗りまして何より楽しかったので、単純な写経との比較とかなんで第二言語?とかその辺りを書きます


対象読者

これから Go やってみようかなという自分と同じような方

多分他言語でも共通で使えるので第二言語の勉強法に悩んでる人など


経緯

ペチパーとして生を受けて早1年と半年強ぐらい

そろそろ第二言語勉強しなきゃなって思って(ちょっと遅いけど)言語候補を探していました

そんなとき以下の記事と出会いました

Ruby->Go->Scalaという習得順序がエンジニアの爆速の成長に最適である理由

ふむふむ、Web エンジニアとしての第二言語は Go を選べばいいんだなと アッホ 素直な自分は第二言語に Go を選択しました

Go に対する知識は、ゴファーとかいう煽りネズミがマスコットであることと Google が設計を行ったことを知っているという程度

そんな状態で勉強方法を探してみると、まずヒットしたのが公式のチュートリアル A Tour of Go

これでも十二分に学習できそうでしたが、なんか本読みたいなって気分だった(雑)ので入門書を購入

選んだ入門書は、 スターティングGo言語 です

その本がたまたま最序盤でユニットテストをやっていたのをきっかけに他のサンプルのテストを書いてみると理解が深まりました


写経との比較して

プログラミングの有名な学習法の一つに写経があります

「サンプル片手に写すだけ」というシンプルさ、継続的に行いやすいため作業癖をつけれるというメリットがあります

ダイエットで言うところの「ウォーキング」に該当するかなと言う点もあり、初学者にはめちゃめちゃおすすめな学習法です

ただ、個人的には写すだけだと飽きが来やすく単純作業となりがちで挫折するパターンが多いです

他にも「写して動かすだけで満足」しがちと言う点もあります

その面、ユニットテストを書く場合、サンプルを理解して適切なモジュールに分割した上でサンプルにないコードを動かす必要があります

以下は、go によるクロージャで、「一つ前の文字列を出力する」と言う実装がされたメソッドのテストのサンプルです

func TestLater(t *testing.T) {

f1 := later()

expect := ""
actual := f1("One")

if expect != actual {
t.Errorf("%s != %s", expect, actual)
}

expect2 := "One"
actual2 := f1("Two")

if expect2 != actual2 {
t.Errorf("%s != %s", expect2, actual2)
}

expect3 := ""
actual3 := later()("Two")

if expect3 != actual3 {
t.Errorf("%s == %s", expect3, actual3)
}
}

サンプルにないことを書くことで理解もより深まりますし、何よりたのしいです :raised_hands:

あとサンプルないことを書く -> 本に書かれてないエラーも多発する -> 調べる過程でも学習になる

と良いこと尽くしです

さらにテストを楽しくするパッケージありました(色が付くとたのしいです)

go testの出力を見やすくするツール作ったった


なんで第二言語?

初学者にいきなりユニットテストといっても難しいかなと思ってます。

ユニットテストってこういうもんですよ。とか理解する前に挫折したら本末転倒ですし。(ペアプロとかしてくれる人とかいたら別)

第三を学習しようという頃には、もうエンジニアとしての練度も上がってるだろうし、リファレンスを斜め読みで OSS のサンプルコードとか読んだり、何か適当なものを実装した方が早いかなと言うイメージです

そんなこんなで第二言語向けの学習法かなと思いました


終わり

何より楽しく学習できる方法なので、プログラミングをプライベートでやるって言っても何やれば良いかわかんないんだよな〜って人にもおすすめです

ぜひ実践してみてください :raised_hands:

実践したサンプル的なの投稿しました

[Go] ユニットテストから学ぶ Golang スライス編