見出し画像

【コードが書けないQAエンジニアがコードが書けるQAエンジニアになるまでの話】導入編

みなさんこんにちは!honaminです。
いよいよ2021年も終わりかけてます。一昨日幸先詣をしたので、初詣にはいかない予定です。

さて、私が「開発経験のないQAエンジニア」であることは自己紹介noteで書きました。なので基本的にはコードが書けません。QAエンジニアの業務をしている中で、コードが書けないから困ること、実はほとんどないのですが、実際には「単体テスト」や「コード品質」に踏み込めないという壁にいつかぶち当たります。(今ぶち当たってます😊)

「開発者の領域だから・・・」と言ってしまえばそれまでなのですが、「コードが書けるQAエンジニア」になれるとできることの幅が広がると思いますし、日々のエンジニアさんとのやりとりも格段にしやすくなるのではと思ったりしてます。というか、最近QAエンジニアもコードが書けるようになったほうがいいよね、というお話をたくさん聞くようになってきました。理由は数あれど、ほんそれ。

「コードを書くのも手段じゃん」という声が聞こえてきそうですが、手段から入ってみることにします。形から入るタイプです。

ということで、この年末年始は少しでもコードの理解ができるように、同居しているエンジニアさんに頼んでブートキャンプをしてもらうことにしました。

ちなみに、コードを書けないといっても下記のような知識・経験はあります。

  • HTML, CSS, PHP, は何となくわかる

  • SQLはテストに困らない程度にかける。select, join, create, update, delete(テーブル作ったりはできない)

  • Pythonの基礎は一通り勉強したことがある

  • progateで2ヶ月くらい勉強してた時期がある

  • GAS(Google Apps Script)をつかって業務の自動化をちょっとだけやったことがある。WEBに落ちてたコードをコピペ&カスタマイズ

さて、QAエンジニアはコードが書けるようになるのか?!?!
前途多難な様子を公開していければと思います。ちなみに言語はRubyです。勉強用の環境はセットアップせずに、今回はブラウザ上でコードを実行できるpaiza.ioを利用させていただくことにしました。

はじめに

プログラムとは何か

1 + 1 = 2
1 + 2 = 3
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13

上記のような計算を繰り返すとき、ずっと手で計算していくのは面倒です。
プログラムとは「やるべきことを順番に書き出したもの」
また、コンピューターでいうプログラムは「繰り返しの処理」をしたい時に便利、とのことでした。

上記の計算は以下のように表すことができます。

n = 1 + 1
n = 1 + 2
n = 2 + 3
n = 3 + 5
n = 5 + 8

「1 + 1は n と等しい」ではなく「1 + 1 が n に代入されている」ということですね。ふむふむ。ここまでは何となくわかります。

この数列は1,1,2,3,5,8,13…と続いていきます。フィボナッチ数列ですね。ということで導入編のお題がフィボナッチ数列に決まりました。

フィボナッチ数列を計算&表示してみよう

その1:各々の計算を表示

フィボナッチ数列は最初の2項は1、3項以降は前の数値の和となる数列なので、以下のように表せます。

n = 1 + 1
puts n #=> 2

n = 1 + n
puts n #=> 3

n = 2 + n
puts n #=> 5

n = 3 + n
puts n #=> 8

n = 5 + n
puts n #=> 13

処理結果を表示させるためにputsをつかいます。ここでは1つ1つの処理に対し、nを表示させています。各 n の値は必ず直前に代入された値になります。(説明するまでもないかもですね👼)

n の関係

その2:変数を利用

その1では「1」「2」などの数値が指定されていました。その2では変数を利用してみます。変数を利用することでより汎用性の高いプログラムに近づけます。

a = 1
b = 1

b = a + b
a = b
puts a #=> 2
puts b #=> 2

b = a + b
a = b
puts a #=> 4
puts b #=> 4

変数a, bにそれぞれ1を代入してみたところ、a=2, b=2となり、フィボナッチ数列になっていません😢
aの値がbの値と一緒に更新されてしまうからですね。aの値は1になりたいです。そこで一時的にtmpという変数を利用します。

また、putsでそれぞれの変数をまとめて表示したいので、puts "a=#{a}, b=#{b}"を利用しましょう。#{a}で変数を呼び出します。

a = 1
b = 1

tmp = b
b = a + b
a = tmp
puts "a=#{a}, b=#{b}" #=> a=1, b=2

tmp = b
b = a + b
a = tmp
puts "a=#{a}, b=#{b}" #=> a=2, b=3

tmpを利用したことでa, bの値が求めていた値になりました!
これで tmp ~ puts までをたくさんコピペすればフィボナッチ数列を好きなだけ爆誕させられます…!

その3:繰り返しの処理はまとめよう

とはいえ、処理を回数分コピペするのはめんどいので、繰り返しの処理をメソッドを使ってまとめます。

a = 1
b = 1

5.times do 
    tmp = b
    b = a + b
    a = tmp

    puts "a=#{a}, b=#{b}"
end

=begin
実行結果
a=1, b=2
a=2, b=3
a=3, b=5
a=5, b=8
a=8, b=13
=end

〇回繰り返すは 〇.times do ~ end を利用します。timesメソッドはIntegerクラスで用意されているメソッドです。(参照

繰り返したい数を指定するだけで好きなだけフィボナッチ数列を作れるようになりました。

その4:tmpってなんやねん

ここまでコードを書いてきた本人は「tmp」の意味分わかりますよね。ですが、このコードを初めて読んだ人にとってはいきなり出てきたtmpってなんやねんとなります。その意味を読み解く、ということをしなければなりません。これは大変。
ということで、tmpでやりたかったことをもうちょっとまとめます。

tmp = b
b = a + b
a = tmp

つまり、変数の入れ替えができればいいので、以下のようにします。

a, b = b, a + b

これでtmpが消えました。また、「,(カンマ)のあとに半角スペースを入れる」と読みやすいらしいです。

その5:【要求】aが奇数の時だけ表示したい

さて、フィボナッチ数列を表示させるコードはだいぶんすっきりしました。そんな時横から「aが奇数の時だけ表示したい」という要求がすべり込んできます。

a = 1
b = 1

5.times do
    a, b = b, a + b

  if a % 2 == 1
     puts "a=#{a}, b=#{b}"
    end
end

=begin
実行結果
a=1, b=2
a=3, b=5
a=5, b=8
=end

「aが奇数の時だけ」if文を利用します。
また、奇数は2で割ったときに1余る数、としています。

その6:関数を利用しよう

その5でも要求にはこたえられるのですが、共通で使えなものは関数にしておくとさらに汎用的なプログラムをめざせます。

def odd?(n)
    n % 2 == 1
end

奇数かどうかを返す関数を作成しました。
()の中のnは引数です。また、true or falseの真偽値を返す関数には半角?をつけるのが慣習とのこと。また、関数名はだれが見ても分かりやすい名前にしましょう。

def odd?(n)
    n % 2 == 1
end
    
a, b = 1, 1

5.times do
    a, b = b, a + b

    if odd?(a)
        puts "a=#{a}, b=#{b}"
    end
end

=begin
実行結果
a=1, b=2
a=3, b=5
a=5, b=8
=end


ここでの苦労ポイントは

  • endの付け忘れ

  • 関数の引数の付け忘れ

でした…。エラーが返されたくま。。

その7:もうちょっとすっきり書ける

かなり完成系に近づきましたが、もうちょっとすっきりできるようです。
最終形態は以下となりました。

def odd?(n)
    n % 2 == 1
end
    
a, b = 1, 1

5.times do
    a, b = b, a + b
    puts "a=#{a}, b=#{b}" if odd?(a)
end

=begin
実行結果
a=1, b=2
a=3, b=5
a=5, b=8
=end

最初に比べるととてもすっきりしましたね!すごい!(小並感)

まとめ

キャンプ1日目とは思えない情報量でした👼
学べたことは以下です。

  • 何をやりたいのかを常に考える

  • エラーが表示されたらきちんと読む

  • コードを変えたら必ず実行する

  • 結果がわからないならとりあえず実行する

  • インデントをつける(慣習)

  • 最後の行は1行あける(慣習)

「何をしたくてこう書いてるの?」「ここでやっていることは何?」と何回も聞かれました。。。やりたいこと、やっていることを言語化する。これが結構大変でした。
何かをしたくてコードを書く、ということをしてこなかったからですね…。方法論だけ公式的に覚えていても、書けるようにはならないんだなぁという学びです。

さて、本当はもうちょっと教えてもらったのですが今回はここまで。休み中にどこまでいけるのか乞うご期待です👼


この記事が気に入ったらサポートをしてみませんか?