はじめに
私は一年間職業訓練校でITに関する基礎的な知識を学びました、現在は社内研修や、先輩方が作り上げたアプリ等を見て実際に業務に携わる為に日々努力をしています。
そんな中で、私が職業訓練校で学んだ事とは違った点をまとめた記事になります、また私が通っていた訓練校で習った内容ですので、他の訓練校の内容と違いがあるのをご承知の上、見ていただけたら幸いです。
前提条件、勉強と仕事
職業訓練校に行かれる方の大半はIT業界が初めての方だと思います、なので職業訓練校で教わる事は、初心者がプログラミングを理解が出来るようになることに重点が置かれています。
変わって、研修では、可読性や保守性に重点を置いた実務的なコードを学びます。
なのでこれから言う事は、職業訓練校で学んだ事を否定するわけでは無く、求められる事が違うと言う事を理解してください。
早期リターン
職業訓練校で教わるcodeの書き方は、とにかく出口は一つと言われてきました。
public class Test {
public static void main(String[] args) {
userNameCheck("John");
}
public static boolean userNameCheck(String userName) {
boolean isValid = false;
if (userName != null) {
if (userName.length() >= 3) {
isValid = true;
}
}
return isValid;
}
}
上の関数はユーザーの名前がNULLではなく、三文字以上かをチェックする関数です、訓練校ではretrun場所が一つなので、boolean型の変数に結果を入れて戻り値としてました、それによってネストが深くなり、可読性が損なわれます。
しかし早期リターンを活用することで同じ内容でも可読性を上げることができます。
public class Test {
public static void main(String[] args) {
userNameCheck("John");
}
public static boolean userNameCheck(String userName) {
if (userName == null) {
return false;
}
if (userName.length() < 3) {
return false;
}
return true;
}
}
こちらは早期リターンを活用し、ネストが浅く、ぱっと見でもこちらの方が理解しやすいと思います。
何故訓練校では出口は一つと言われるのか?
訓練校で『出口は一つ』と厳しく教わったのは、プログラムの基本的な流れを学ぶためでもありますが、最初に習う言語の歴史や性質が大きく影響しています。
私の通っていた訓練校では、現代の言語の基礎としてC言語から学習を始めました。実は、このC言語の特性こそが「出口は一つ」というルールの正体です。
C言語と現代の言語の違い
- JavaやPythonなど: プログラムが自動で不要なメモリを片付けてくれる機能(ガベージコレクション)がある。
- C言語: 自動の片付け機能が無い。コード内で確保したメモリは、使い終わったら必ず自分の手で解放しなければならない。
もしC言語でメモリの解放を忘れてしまうと、以下のような深刻な問題を引き起こします。
- メモリリーク: プログラムがメモリを占有し続けてしまう現象
- システムの不具合: 最終的にパソコンの空きメモリが無くなり、フリーズやデータ破壊が起きる
そのため、C言語の時代に「何箇所も出口があると解放を忘れてバグが出る。出口を1つに統一して、その直前で1回だけメモリを解放すれば絶対に忘れないよね」という大原則(単一出口の原則)が生まれました。訓練校の先生は、この歴史的な基本を徹底するために「出口は一つ」と教えてくれていたのです。
訓練校で習った言語と研修で習った言語
研修で使用した言語はPythonでした、Pythonは動的型付けで訓練校で習った、静的型付け言語とは違い宣言をしなくてもエラーにならないと特徴があります。
この為、動的型付けは、型を開発者自身が強く意識しなければなりません。
そして、変数名や関数名も他人が見たときに何型なのかわかるように命名規則などを整える必要があります。
上記で使用した関数改変したものです。
public class Test {
public static void main(String[] args) {
boolean result = userNameCheck("John");
if(result)
System.out.println("エラーが発生しました。")
}
public static boolean userNameCheck(String userName) {
boolean isValid = false;
if (userName != null) {
if (userName.length() >= 3) {
isValid = true;
}
}
return isValid;
}
}
これはユーザーの名前が正常なデータなのかをチェックし、boolean型の戻り値を返します、userNameCheckの戻り値がboolean型なのは関数の戻り値の所や、戻り値を代入する変数の型を見ればわかると思います。
しかし、これをPythonで書くと
def user_name_check(user_name):
is_valid = False
if user_name is not None:
if len(user_name) >= 3:
is_valid = True
return is_valid
def main()
result = user_name_check("John")
if not result:
print("エラーが発生しました。")
if __name__ == "__main__":
main()
このコードはぱっと見リザルトになんの型が入っているかわかりません。
これが文字列だったり、リストだったりなどすると開発者の意図しない動作を引き起こす可能性などがあります。
なので開発などでは型ヒントを用意します。
def user_name_check(user_name: str | None) -> bool:
is_valid: bool = False
if user_name is not None:
if len(user_name) >= 3
is_valid = True
return is_valid
def main() -> None:
result: bool = user_name_check("John")
if not result:
print("エラーが発生しました。")
if __name__ == "__main__":
main()
このように関数を定義する可読性が向上します。
しかし型ヒントはあくまでヒントなので、それ以外の型を入れる事ができる点に注意が必要です。
言語毎に違う命名規則
研修でPythonで書いたコードを見せた時に教えて頂いたのが言語毎に推奨される命名規則が違い、訓練校で習っていたJavaの命名規則はPythonでは推奨されていなかったのです。
これが各言語の推奨される命名規則になります。
| 命名規則の名称 | 具体例 | 使用されている主な言語 |
|---|---|---|
| キャメルケース |
myVariablemyFunction
|
JavaScript / TypeScript, Java, Kotlin, Swift, C#(ローカル変数・引数) |
| パスカルケース |
MyClassMyMethod
|
ほぼ全ての言語(クラスや型の名前) C#(メソッド名や定数名にも使用) |
| スネークケース |
my_variablemy_function
|
Python, Ruby, PHP(変数は $my_variable) |
| アッパースネークケース | MY_CONSTANT |
ほぼ全ての言語(定数の名前。※C#などを除く) |
| ケバブケース | my-style-class |
HTML / CSS (※プログラミング言語の変数名には基本使用不可) |
このように命名規則を調べてからコーディングなどを始めましょう。
現場などではすでに命名規則が定めてある場合もあるので、確認しましょう。
まとめ
職業訓練校と研修を経験して感じたのは、「どちらの知識も正しく、状況によって求められる最適解が違う」ということです。
- 訓練校の教え: プログラミングの基本構造や歴史的背景(C言語のメモリ管理など)を確実に理解するための「基礎の型」。
- 現場の教え: チーム開発において、誰が見てもバグを生まないための「可読性」と「保守性」。
学校で学んだな基礎があるからこそ、「なぜ今は早期リターンを使うべきなのか」「なぜ動的型付け言語で型ヒントが必要なのか」を理解することができました。
「動けばいいコード」から「誰もが迷わず読める美しいコード」へ。
研修で学んだことを当たり前にできるように、
チームに貢献できるエンジニアを目指して日々コーディングに励んでいきたいと思います!