はじめに
僕は大学で3年間プログラミングを学び、今年に卒業と共に日本のあるIT会社に就職しました。その後、エンジニアとしてもう一歩成長していきたいと思い、10月よりRailsのプログラミングスクール「RUNTEQ」で勉強しています。
今回は僕が大学とRUNTEQでプログラミングを学びながら感じた「エンジニアとしてのコツ」を共有したいと思います。実務経験も少ないくせに勝手に語っているので、信頼性は0のはずだと思いますが、少しでもお役に立ったら何よりだと思います。
【1】 覚えるのではなく理解しよう
プログラミング言語(あるいは、フレームワーク)はその特性や得意分野の違いから山ほどありますが、結局使い方は同じです。プログラミングの基本である条件分岐とループ処理を例としましょう。
下記は全て0から10まで繰り返しながら偶数を出力するコードです。
#include <stdio.h>
int main() {
int iCount = 0;
while(iCount > 10) {
if(iCount % 2 == 0) {
printf("%d\n", iCount);
}
iCount++;
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
int iCount = 0;
while(iCount < 10) {
if(iCount % 2 == 0) {
System.out.printf("%d\n", iCount);
}
iCount++;
}
}
}
i_count = 0
while i_count < 10
if i_count % 2 == 0
puts i_count
end
i_count = i_count + 1
end
# 上記のコードは下記のようにも表現できます
10.times{ |i_count| p i_count if i_count.even? }
Rubyの場合はCやJavaと仕組みを合わせるために書き方をわざと崩したこともありますが、要は言語が違ってもロジックをコードで書く方法が大きく変わったりはしないということです。なので、言語ごとにどう書くべきかを無鉄砲に覚えるよりは、1つの言語だけでいいのでロジックをコードで書く方法
を理解するのが大事です。これが理解できたら、新しい言語に出会っても使い方を爆速に身に付けることができます。
これはプログラミング言語だけではなく、フレームワークにも適用されます。フレームワークの中でも下記のように使い道がほぼ同じである場合、1つでもきちんと理解しておければ他のフレームワークもより効率よく学ぶことができるでしょう。
- Webフロントエンド: React, Vue.js, Angular.js, ...
- Webバックエンド: Ruby on Rails, Laravel(PHP), Django(Python), CakePHP, ...
【2】 大きい問題は小さい手順に分けてみよう
お客様から自然数が入っている配列を昇順でソートするアプリを作って欲しい
との依頼が来ました!どうしたらいいでしょう?
このように大きい問題に直面した時、素直にその問題と対峙してしまうとこれからどう進むべきかが全く見えません。
簡単に説明するため、【1】の例で利用した問題をまた使ってみましょう。
お客様から0から10の中で偶数を出力するアプリを作って欲しい
との依頼が来ました。
であれば、実現する手順としては下記のように想定できます。
- まずは0から10までカウントする
- 偶数をカウントする場合はコンソルに出力する
あとはこの手順をコードに書くだけで終わりです!
# 1. まずは0から10までカウントする
10.times do |count|
# 2. 偶数をカウントする場合はコンソルに出力する
p count if count.even?
end
では、先ほどのお客様からの依頼はどう分けたらいいでしょうか。
自然数が入っている配列を昇順で整列するための手順は下記のように想定できます。
- 配列で一番小さい自然数を探す
- その自然数と一番前の項目を交換する
- 上記のフローを配列の一番後の項目まで繰り返す
では、上記の手順をソースコードで書いてみましょう!
arr = [9, 7, 10, 2, 3, 5, 4, 1, 6, 8]
def sort_array(array)
length = array.length
# 上記のフローを配列の一番後の項目まで繰り返す
length.times do |i|
# 配列で一番小さい自然数を探す
min_index = i
j = i + 1
while j < length
if array[j] < array[min_index]
min_index = j
end
j = j + 1
end
# その自然数と一番前の項目を交換する
unless min_index == i
temp = array[i]
array[i] = array[min_index]
array[min_index] = temp
end
end
array
end
p sort_array(arr)
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
【3】 解決策が全く見えない場合は、むしろ休もう
頑張って書いたコードを実行してみたらエラーが起きました!
ではデバッグを行いましょう!ググってみて、QiitaやStackOverflowで関連記事を全て読みました。
けれど、全く解決できません!
このエラーを解決するためにほぼ1日を全部使ってしまって、時間はもう退勤時間を超えているのですが
問題は一切解決されていません。どう解決したらいいか見当もつきません。
どうしたらいいでしょうか???
このような場合は、このエラーをどのように解決するか
の前提から間違っている可能性があります。
解決しようと思ったところがエラーの原因と全然関わってないとしたら、いくら時間をかけても解決できないのが当然です。
なので、こういう場合はむしろ休みながら頭を冷やすのをおすすめします。
家できちんと疲れを取って、次の日にソースコードをしっとり確認したら、意外なところで解決策を見つけるかもしれません。
【4】 スマートな怠け者になろう
このパートで大事なところはスマートな
というところです。
ただの怠け者になってしまったらダメです。職場から首になりますので。。。
僕が思う一番ヤバいプログラミング方法は似ている機能は既存のソースコードをコピペして少し直すこと
です。その理由はやはり将来的にバグを起こす可能性がすごく高いからです。当面は工数があまり掛からないからいいなーと思うかもしれませんが、時間が経って機能の修正やデバッグが必要になったら、コピペしたコードも全部修正しなくてはいけないのでその工数は爆発的に増えます!しかも、人の手でする作業だからその過程で他の不具合がまた起きる可能性もすごく高いです。なので、「同じソースコードをコピペして直そー」という考え方は全くバカな怠け者の考え方です。
では、スマートな怠け者の考え方というのは、一体なんでしょうか?僕的には、将来の工数を減らすため、ベースになるコードをしっかり固める
というのです。「一体なにを言っているのか?」と思われるかもしれませんが、プログラミングの発展像を見ると理解ができます。
今みなさんに高いスキルが求められると思われるオブジェクト指向プログラミング
という手法や、MVCモデル
みたいなデザインパタン、Don't repeat yourself
のような原則、TDD
みたいな開発工程、それから各種フレームワークやライブラリは、結局どうすればより工数を減らしながら堅固なプログラムを作られるかを工夫して生まれた物です。これらが目指すところはいろいろありますが、結論はどうすれば同じ行為を二度もしなくていいか
とういことを悩んできた結果です。なので、このようなスキルを身に付け自由自在に使えるようになったら、より短い時間でより安全で価値の高いプログラムをお客様に届けるのが実現できます。これこそ、スマートな怠け者の考え方だと思います。
【5】 自分のコードがいつも誰かに見られていると意識しよう
現場で働く際、1人で始めから終わりまで全部作るのはないと言っても過言ではありません。
規模が結構あるプロジェクトはもちろん、小規模のプロジェクトもそのプロジェクトが成長することと共に新規メンバがジョインしてくる可能性があります。あるいは、自分自身が他のプロジェクトにアサインされる可能性もあります。
その際、誰かが自分しかわからないソースコードを書いてしまったとしたら、どうなるのでしょうか?
下記のコードを読んでみましょう。
class Abc
def initialize(arg1, arg2, arg3, arg4)
@n1 = arg1
@n2 = arg2
@c = arg3
@e = arg4
end
def f
"#{@n1} #{@n2}"
end
end
abc = Abc.new('james', 'bond', '09012345678', 'james@example.com')
p abc.f
どういうこと????
こんなにわけがわからないソースコードに出会ったら、説明する人もそれを聞く人も大変になるはずです。「いやーこんなことはあり得ないでしょう???」と思うかもしれませんが、私は実際にこういう風に書く人をみたことがあります。
では、今回は下記のように書き直してみましょう。
class Contact
def initialize(first_name, last_name, phone, email)
@first_name = first_name
@last_name = last_name
@phone = phone
@email = email
end
def full_name
"#{@first_name} #{@last_name}"
end
end
contact = Contact.new('james', 'bond', '09012345678', 'james@example.com')
p contact.full_name
これなら、このソースコードが何の役割を持つものなのかがわかりやすくなりますよね。初めてみた人も、これが連絡先を保存するプログラムでBondさんのフルネームを表示しているのだと理解できます。
今回のケースでは変数名やメソッド名のように名前を例にあけましたが、このコツは名前だけに限りません。ソースコードの書き方、インデント、ファイルの置き場、コメントの書き方などのようにプログラミングに必要な要素であれば全て対象になります。なので、単純に書くよりはどうしたら人がもっと理解しやすいか
を考えながら書くと、周りの人からもっと歓迎されるエンジニアになれると思います。
まとめ
かなり長くなりましたが、僕的に思っているエンジニアとしてのコツを5つ紹介しました。人によって共感してくれるかもしれないし、「いや、これはコツとしてヤバくない?」と思われるかもしれません。こう語っている自分も、全ての人に適用される最善のコツは存在するはずがないと思っています。これらのコツが絶対だとの法則はないので、自分だけのエンジニアのコツを探しながらこの文章を参考にすることだけでも、僕は全然嬉しいと思います。それでは。m(_ _)m