プログラミングのスピードは仕事の評価に直結します。コーディングのスピードを上げることができれば、
など、あらゆる面でメリットを受けることができます。
しかし、プログラミングのスピードが遅い人は上記と真逆の状態になってしまいます。
今回は、コーディングのスピードが速い人のプログラムを組む手順についてお話していきます。
なお、今回の記事を書いている僕はどちらかというと実装は速いと言われる方で、立てられた工数の2/3ぐらいの時間で実装を完了させたりしています。
そんな僕の実装手順を発表したところ、評判が良かったのでまとめてみました。
プログラミングのスピードが遅い人の特徴
結論からお話すると、プログラミングのスピードが遅い人の特徴は全体像を把握する前に実装を始めてしまうということです。
より具体的に解説すると、以下のようなポイントに当てはまる人です。
ゴールが明確でなく見当違いな実装 -> 時間の無駄
実装完了のゴールが明確でない人はプログラミングのスピードが遅い傾向にあります。
なぜなら、途中まで進めている実装が全て無駄になる可能性があるためです。
例えば、仕事ではコミュニケーション不足によってエンジニアの作業分担が明確になっていないケースがあります。
その際に「自分の作業範囲はどこか?」がわからずになんとなく実装を進めていると、納期直前に自分の作業範囲が実は全然違うところだったなんてことも起こりえます。
実装をする前に、
は最低限確認しておきたいところです。
とりあえずで手をつけて実装 -> 手戻りが発生
とりあえず自分のできるところからやる人もプログラミングのスピードが遅い傾向にあります。
なぜなら、実現に必要な最低限の知識をつけないまま実装を進めてしまうため、より効率的な実装方法を見逃すことが多いためです。
例えば、以下のような機能追加のケースを考えてみましょう。
- 全てのHTMLページに特定のタグを埋め込む
- 「タグの中身」は微妙にページによって異なる
この実装を考えたときに真っ先に出てくる方法としては、全てのHTMLページに直接1つ1つタグを埋め込む方法です。
しかし、1つ1つタグを埋め込む作業をしているうちに「追加するタグの内容が少し変わった」となった場合、また0からタグの埋め直しをしなければなりません。
一方、同じ実装を依頼されたケースであっても、
など、始めに調査や楽に実装する方法を検討しておくと、わずかな修正で機能を実現できるかもしれません。最初にどうすれば目的を実現できるか?の方法は複数検討しておくといいでしょう。
ゴール達成の技術的情報が不足 -> 見積もりに失敗
自分の実装にあたって技術的な情報が不足しているため、スピードが遅くなるケースも考えられます。
例えば、以下のような機能追加の依頼があると想定してみましょう。
- Redisからデータを取得
- Redisにデータが存在しなければDBからデータを取得
- Redisにデータが存在しなければデータを登録
※ Redis:DBのように値を保存できるデータストア
これらを実現するためには以下の知識がなければ実現できません。
これらの知識を十分に持たないまま実装を始めると、自分が立てた見積もり時間を大幅に超える実装時間が必要になる可能性があります。
今回のケースでは、事前の調査不足によって以下のような状況が起こりうるでしょう。
技術的な側面において「どこに時間がかかりそうか?」を認識した上で、見積もりを立てる必要があると言えるでしょう。
速くプログラムを組むための4ステップ
では、プログラミングのスピードを速くするための手順を紹介していきます。手順は以下の通りです。
- ゴールを明確化する
- 実装の方法を検討する
- 必要なクラスやメソッドの大枠を作る
- 具体的な処理を実装する
1つずつ解説していきます。
ゴールを明確化する
まずは、実装に入る前にゴールを明確化するところから始めましょう。
ゴールを明確化する際に気をつける点としては、作業完了の粒度をあらかじめ知っておくことです。
例えば、気をつけるポイントとして以下のポイントが挙げられます。
- 機能実装が行えれば完了か?
- テストコードは必要とするのか?
- 仕様変更が入る可能性はどれくらいあるか?
- 仕様変更が入るとするとどこに入ることが想定されるか?
このように考えることで、どこから手をつけるべきか優先順位を決めやすくなりますし、作業ボリュームも読みやすくなります。
ここは主に依頼者とのコミュニケーションで決まる部分なので、時間をかけすぎることなく次のステップに進むようにしましょう。
実装方法を検討する
続いて実装の方法を検討します。プログラミングにおいて、ある機能を実現する方法は1つではありません。
したがって、以下の観点からどのような技術を採用するか?を検討する必要があります。
- その追加機能にかかるアクセス負荷
- 実装に必要なコスト
- ツールを導入する場合は導入に必要な実装・費用コスト
仕様書が存在するのであれば、このステップはそこまで重要になりません。むしろ、仕様書を読み込む方が必要になるでしょう。
どのような方法を使えば今回のゴールを達成できるか?は初めにある程度時間をかけてでも調査を進めるといいでしょう。
このステップは全体の20%程度の時間をかけてでも把握しておきたいところです。
必要なクラスやメソッドの大枠を作る
続いて、必要なクラスやメソッドの大枠を作ります。
大枠を作ると言われると難しく聞こえますが、「どこにどのメソッドやクラスを実装するか」ということです。
具体例として、Reactでフォームのバリデーションを実装するケースを考えてみましょう。
import React, { Component } from 'react';
import Validation from './Validation';
class App extends Component {
state = {
info: {
email: '',
password: ''
},
message: {
email: '',
password: ''
}
};
handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
// TODO: formの中身が書き換えられたときにinputの情報とエラーメッセージをセットする
};
canSubmit = (): boolean => {
// TODO: 送信のボタンを押せるか条件を作成する
};
submit = () => {
// TODO: 送信の処理を行う
};
render() {
const { info, message } = this.state;
return (
<React.Fragment>
<p>
<label>メールアドレス: </label>
<input
type="email"
name="email"
value={info.email}
onChange={event => this.handleChange(event)}
/>
{message.email && (
<p style={{ color: 'red', fontSize: 8 }}>{message.email}</p>
)}
</p>
<p>
<label>パスワード: </label>
<input
type="password"
name="password"
value={info.password}
onChange={event => this.handleChange(event)}
/>
{message.password && (
<p style={{ color: 'red', fontSize: 8 }}>{message.password}</p>
)}
</p>
<p />
<p>
<button disabled={!this.canSubmit()} onClick={() => this.submit()}>
送信
</button>
</p>
</React.Fragment>
);
}
}
export default App;
const emailValidation = (email: string): string => {
// TODO: emailが不正のときエラーメッセージを返す
};
const passwordValidation = (password: string): string => {
// TODO: passwordが不正のときエラーメッセージを返す
};
class Validation {
static formValidate = (type: string, value: string) => {
// TODO: 入力されたtypeによってバリデーションを変える
}
}
export default Validation;
このように、必要なメソッドやクラスに書く処理を決めておくことで、ソースコードが煩雑になることも防げます。さらに、仕様変更が来た場合でも、どこを修正すればいいのかわかりやすいため効果的です。
具体的な処理を実装する
最後は、具体的な処理を実装するだけです。
正直、ここのステップは今までの手順をきちんとできていれば、コードを当てはめていくだけの作業になるため、そこまで大変になりません。
逆に言うと実装の手順を軽くできるように、ここまでの準備をしっかりしておくことが重要と言えそうです。
まとめ
この記事のポイントをまとめます。
- プログラミングのスピードを上げるためには準備が9割
- ゴールを明確化する
- 実装方法を検討する
- 必要なクラスやメソッドをの大枠を決める
- 実装までに完成のイメージを持つようにする
プログラミングのスピードがかかる人ほど、完成イメージを持つことなく闇雲に実装を進めています。
事前準備を入念にしておくことで、
といったメリットがあります。ぜひ、プログラミングのスピードを上げて、プログラミングができる人に向かって学習していきましょう。