プログラムは「動けばOK」
AIにコードを丸投げし、中身が分からないまま過ごす日々が不安
こんなことを思って日々過ごしていませんか?
そんな方に僕が現場を経験して気づいた、技術の「表面」ではなく「本質」を掴んで成長を加速させるためのヒントを、僕の失敗談を交えつつお伝えします。
1. コンピュータの「中身」を無視しない。
エンジニアになりたての頃、僕はとにかく「タスクを終わらせること」に必死でした。コードの書き方は調べても、その下の階層で何が起きているかには無頓着だったんです。
謎のフリーズと「5大装置」
ある時、大量のデータを一気に処理するプログラムを書きました。ローカル環境では動いたのに、本番環境に乗せた途端にシステムが沈黙。先輩から「メモリの割り当て考えた?」と聞かれ、僕はフリーズしました。
コンピュータは、主に以下の5つの役割を持つ装置で構成されています。
- 制御装置・演算装置(CPU): コンピュータの「心臓部」であり、命令の実行や計算を行います。
- 記憶装置(メモリ・ストレージ): データを一時的に保持するメモリや、永続的に保存するHDD/SSDなどがあります。
- 入力装置: キーボード、マウス、各種センサーなど。
- 出力装置: ディスプレイ、プリンタなど。
これらが OS(オペレーティングシステム) という基本ソフトを介して、ハードウェアとアプリケーションを仲介しています。当時の僕は、プログラムが「メモリ(記憶装置)」という有限なリソースを消費している自覚が全くありませんでした。
「コンピュータの仕組み」を知ることは、不具合の原因を推測するための地図を持つことだと痛感しました 。
2. 開発の「流れ」を知る。プログラミングはライフサイクルの一部
エンジニアになって気づいたことは、コードを書いている時間は、開発全体のほんの一部でしかない ということでした。
システム開発には標準的な工程があり、これを ライフサイクル と呼びます。
- システム企画・要件定義: 何のために、どのような機能を持つシステムを作るかを明確にします。
- 設計: ユーザーが見る画面を決める「外部設計」と、プログラムの内部構造を決める「内部設計」を行います。
- 実装(プログラミング): 設計書に基づき、実際にコードを書きます。
- テスト: 単体テスト、結合テスト、システムテストを通じて、バグがないか、要件を満たしているかを確認します。
- 導入・保守: 完成したシステムを本番稼働させ、不具合の修正や機能追加を継続的に行います。
現代的な開発手法:アジャイルとDevOps
近年は、短い期間で開発とリリースを繰り返し、変化に柔軟に対応するアジャイル開発が主流です。また、開発(Development)と運用(Operations)が密に連携し、スピーディに価値を届けるDevOpsという考え方も重要視されています。
実装(プログラミング)工程しか見ていないと、後工程が大変
未経験の頃の僕は、ライフサイクルの「3. 実装(プログラミング)」工程で、目の前のコードを動かすことしか考えていませんでした。しかし、プログラムは一度書いて終わりではありません。
開発中の コードレビュー で仲間にコードの意図を伝えたり、リリース後の 保守 で未来の自分や保守の方が修正したりと、常に誰かに読まれることを前提 としています。
読みやすさを後回しにしたコードは、周りの方々に迷惑をかけてしまいます。
例を見てみましょう。
Before:書いた本人にしか分からないコード
「とりあえず今、動けばいい」という、レビュー担当者や未来の保守担当者などへの配慮が足りない書き方です。
// 「1」や「2」が何を指すのか、パッと見て意図が伝わらない
// レビュー時に質問が発生したり、後の修正でミスを誘発しやすくなります
function getPrice(p, t) {
if (t === 1) {
return p * 0.8;
} else if (t === 2) {
return p * 0.5;
} else {
return p;
}
}
After:意図が明確で、読み手に優しいコード
レビュー者が一読して理解でき、保守工程でも安全に修正できるように配慮した書き方です。
/**
* ユーザーランクに応じた割引後価格を計算する
* @param {number} basePrice - 元の価格
* @param {string} userRank - ユーザーランク(REGULAR, VIP, GOLD)
*/
const USER_RANK = {
REGULAR: "REGULAR",
VIP: "VIP",
GOLD: "GOLD"
};
// 割引率を定義し、変更があった際もここを直すだけで済むようにする
const DISCOUNT_RATES = {
[USER_RANK.REGULAR]: 1.0,
[USER_RANK.VIP]: 0.8,
[USER_RANK.GOLD]: 0.5
};
function calculateDiscountedPrice(basePrice, userRank) {
// 該当ランクがない場合は定価を返す
const rate = DISCOUNT_RATES[userRank] ?? DISCOUNT_RATES.REGULAR;
return basePrice * rate;
}
ライフサイクル全体を俯瞰できるようになると、 次にバトンを渡すレビュー担当者など将来のコードを読む方々のために、今どう表現すべきか という視点が持てるようになります。
3. ネットワークとデータベースを知る
エンジニアとしてコードを書くようになると、プログラミング言語の文法と同じくらい ネットワーク と データベース の知識が重要であることに気づきます。これらは人間で例えると電気信号を伝える 神経 と、記憶を司る 脳 のように、システムが正常に動くための生命線だからです。
ネットワーク:通信の「迷子」を防ぐための地図
ほとんどのアプリは、インターネットを通じて別のコンピュータとやり取りをしています。ネットワークの知識が必要な理由の一つは、「どこで通信が止まっているか」を突き止めるためです。
- 知識がないと: 「画面が表示されない」というトラブルが起きたとき、自分のコードが悪いのか、通信経路(神経)の問題か、相手のサーバーが落ちているのか、原因の切り分けができません。
- 知識があると: 通信のルール(プロトコル)を理解していれば、エラーの場所を特定し、最短ルートで問題を解決できる可能性があります。
データベース:情報を守り、活用するための「データの保管庫」
ユーザーのIDや投稿内容など、あらゆる大切な情報を安全に保存しておく場所がデータベースです。
プロダクト作りにおいて、データベースは 脳 の一部と言っても過言ではありません。ほぼすべてのWebサービスは、このデータベースからデータを取り出しすことで成り立っているからです。
-
知識がないと(リスク):
データの保存方法がデタラメだと、利用者が増えたときに動作が極端に遅くなったり、大切なデータが消えたり混ざったりする大事故に繋がります。 -
知識があると(メリット):
システムの信頼性を守れるのはもちろん、 データを取り出すスピード(性能)を速めることもできます。また、整理整頓された保管庫(適切な設計)であれば、後から新機能を追加する際も、コードを複雑にせずスムーズに開発を進めることが可能になります。
4. 成長を加速させるマインドセット
エンジニアのキャリアをスタートさせたばかりの頃は、最新技術を追いかけることばかり考えていました。しかし、現場での経験を積むうちに、技術を支える「土台」となる考え方の重要性に気づきました。
IT業界は日進月歩であり、昨日までの常識が明日には古くなることも珍しくありません。そこで求められるのは、単なる知識量ではなく、以下の3つのマインドセットです。
-
継続的な学習意欲:
技術の流行に左右されず、常に新しい情報をキャッチアップし続ける姿勢が不可欠です。「自ら学び続けること」そのものが、エンジニアとしての最大の生存戦略になります。 -
論理的思考力(ロジカルシンキング):
プログラムの不具合(バグ)の特定や、効率的なシステム設計には、物事を整理して筋道立てて考える力が欠かせません。複雑な問題を最小単位に分解して解決する力が、開発の質を左右します。 -
コミュニケーション能力とチームワーク:
システム開発は決して一人で行うものではありません。クライアントの要望を正確に理解し、チームメンバーと円滑に連携するための「伝える力」と「聴く力」が、プロジェクトを成功に導きます。
技術の先にある価値を創るために
これらのマインドセットは、日々の学習・実務を通じて磨き続けられます。技術を手段として使いこなし、社会に価値を提供し続けるエンジニアを目指していきましょう。
さいごに
未経験の方にとっては今は暗闇で手探りかもしれませんが大丈夫です。今回ご紹介した指針を持ちつつ、目の前の課題に真摯に向き合えば、きっとみなさんのキャリアアップに繋がります。一歩づつ、進んでいきましょう!
PRUMのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
▶ コーポレートサイト