プログラミングってどうやって勉強すればいい?
たまに聞かれるんですが、私の答えはシンプルです。
「同じアプリ(テーマ)を違う方法で何度も作る」です。
なぜ同じものを繰り返し作るのか
プログラミング学習でよくある失敗が「チュートリアル疲れ」です。
Reactでチャットアプリ作って、次はRailsでECサイト作って、ブログ作って...チュートリアル通りに作る だけ ではほとんど何も身についていない。なんか動いているけど、一から作れる気はしない。
それより、ToDoアプリ(でなくとも何でも良いですが)ひとつに絞った方が効果的だと思います。
同じテーマで作ると、要件が明確だから技術の違いに集中できます。前回の実装と比較できるし、段階的に複雑にしていけます。ポートフォリオとしても成長が見えやすいです。
推奨する学習ステップ
ステップ1:素のHTML + PHPで作る
一番シンプルなところから始めます。
// todo.php
<?php
session_start();
if (!isset($_SESSION['todos'])) {
$_SESSION['todos'] = [];
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['task'])) {
$_SESSION['todos'][] = $_POST['task'];
}
}
?>
<!DOCTYPE html>
<html>
<body>
<form method="post">
<input type="text" name="task">
<button type="submit">追加</button>
</form>
<ul>
<?php foreach ($_SESSION['todos'] as $todo): ?>
<li><?= htmlspecialchars($todo) ?></li>
<?php endforeach; ?>
</ul>
</body>
</html>
フォームの送信、セッション管理など、Webアプリの基本的な仕組みに触れられます。
ステップ2:素のPHP + MySQLで永続化
セッションからデータベースに移行します。
// todo_db.php
$pdo = new PDO('mysql:host=localhost;dbname=todo', 'root', '');
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['task'])) {
$stmt = $pdo->prepare("INSERT INTO todos (task) VALUES (?)");
$stmt->execute([$_POST['task']]);
}
if (isset($_POST['delete'])) {
$stmt = $pdo->prepare("DELETE FROM todos WHERE id = ?");
$stmt->execute([$_POST['delete']]);
}
}
$todos = $pdo->query("SELECT * FROM todos")->fetchAll();
SQLの基本、データベース接続、CRUD操作を素の状態で理解できます。
ステップ3:Laravelで作り直す
フレームワークを使ってみます。
// routes/web.php
Route::get('/todos', [TodoController::class, 'index']);
Route::post('/todos', [TodoController::class, 'store']);
Route::delete('/todos/{id}', [TodoController::class, 'destroy']);
MVCパターン、ルーティング、マイグレーション、ORMを学べます。
ステップ4:レンタルサーバーで公開
作ったものを公開してみます。
# .htaccessの設定
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
レンタルサーバー(月500円程度)にSFTPでアップロード、独自ドメインの設定、SSL証明書の導入、.envファイルでの環境変数管理、実運用に必要な知識が身につきます。ドメイン仲介サービスの邪悪な複雑なUIに触れるのも、この辺りのタイミングかもしれません。
公開前にSQLインジェクションやXSSなどについて調べて、ソースコード全体を見直すことをお勧めします。
ステップ5:Laravel (API) + Vue.jsで作る
バックエンドとフロントエンドを分離してみます。
// TodoList.vue
export default {
data() {
return {
todos: [],
};
},
mounted() {
fetch("/api/todos")
.then((res) => res.json())
.then((data) => (this.todos = data));
},
};
API設計、CORS、非同期処理、コンポーネント設計を学べます。
ステップ6:Spring Boot + Reactで作る
違う言語でも同じことができるか試します。
@RestController
@RequestMapping("/api/todos")
public class TodoController {
@GetMapping
public List<Todo> getTodos() {
return todoService.findAll();
}
}
静的型付け言語、DIコンテナ、アノテーションを学べます。
ステップ7:CI/CDパイプラインの構築
GitHub ActionsやCircleCIで自動デプロイを実装します。
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build and Deploy
run: |
npm run build
npm run deploy
プッシュしたら自動でテスト実行、ビルド、デプロイ。本番環境とステージング環境の使い分け、ロールバック戦略、セキュリティスキャン(依存関係の脆弱性チェック)などを学べます。
ステップ8:継続的な機能追加
好きな技術スタックで、ユーザー認証やリアルタイム同期、タグ機能、検索機能、スマホアプリ版などを実装していきます。
あるいは定期バックアップの設定、エラー監視ツールの導入などを試すのもいいかもしれません。
ここまで来れば、開発の基礎が身についているでしょう。
なぜToDoアプリなのか
「ToDoアプリなんか作っても大して学びにならない」という人がいますが、違います。
ToDoアプリには、CRUD操作(作成・読み取り・更新・削除)、状態管理、リスト表示、フォーム処理、データ永続化など、実務で必要な基本的な要素が含まれています。
どんなアプリも、基本的なCRUD操作から始まります。
ただToDoアプリにこだわる必要はありません。繰り返し作りたいテーマであれば、何でもいいです。
学習の参考になるもの
Django Girls チュートリアル
これは本当におすすめです。PythonとフレームワークDjangoのチュートリアルですが、言語・フレームワークの使い方を学ぶ以上の価値があります。
このチュートリアルは「インターネットってどう動いてるの?」から始まります。コマンドラインの使い方を「黒い画面怖くないよ」という感じで説明してくれます。「フォルダって何?」「ファイルって何?」レベルから解説してあって、エラーが出た時の対処法まで書いてあるんです。「こんなエラーが出たら慌てないで」みたいな感じで。
口語的で親しみやすい文章で書かれていて、「プログラミングは難しくない」というメッセージが伝わってきます。
PHPやJavaを学びたい人も、最初にこれを読むことをおすすめします。プログラミングの基本的な考え方、Webアプリの仕組み、開発環境の構築方法など、言語を問わず必要な知識が身につきます。
ブログアプリを作るチュートリアルですが、これを理解できれば、どの言語でもToDoアプリくらいは作れるようになります。
ある程度学習した後に改めて読み直すと、初学者に絶妙な粒度で説明していることがより実感できると思います。
もしチュートリアルの内容から、インターネットの仕組みに更に興味を持ったなら、「ネットワークはなぜつながるのか」を読んでみてください。内容は重厚ですが、面白いです。いきなり理解しようとせず、後で読み直すことを前提にざっと目を通すのが良いと思います。
公式ドキュメント
詰まったらまず公式ドキュメントを確認するのが早いです。
書籍
意外とKindle Unlimitedで読める技術書が結構あるので、おすすめです。普遍的な本は少々値段が張りますが、長く使えます。中古で買うのもあり。最近の本ですが「Tidy First?」は大事な考え方に加えてTips的な、すぐに使える知識も多く紹介されているので初学者にもおすすめです。
YouTube
「Laravel Todo」「React Todo」で検索すれば、大量のチュートリアルが出てきます。
Udemy
セール時に買えば1,500円程度。環境構築で躓いた経験がある方は、動画を見ながらの方が良いかもしれません。頻繁に質問に答えてくれる講師の方もいるようですが、全く答えない方もいるので購入前によく確認した方が良いです。
スクール・メンターについて
正直、多くの方には必要ないと思います。
調べてみると、月1,000円〜で指名したメンターが質問に答えてくれるサービスもあるようですが、結局「誰かに聞く」という依存体質になりがちです。
また高額なスクールはお勧めしません。50万円あれば、MacBook Air買って、技術書50冊買って、まだお釣りが来ます。
転職のサポートをしてくれるからスクールの方が、と考える方もいるかもしれませんが、スクールが紹介する転職先から選んでしまう、というデメリットも考慮した方が良いと思います。自分が働く会社は、あまり人の意見に頼らずじっくり探して、自分で応募した方が納得出来ると思います。
自己解決が難しい問題は、AIに聞きましょう。夜中でも即レスしてくれます。
開発環境について
PCなどは、割となんでもいいと思います(iOSアプリを作って公開したい場合、基本的にMacが必要)。2万円ほどの中古ノートPCを買って、数千〜1万円のメモリを買って換装すれば2〜3年は使えるでしょう。換装の方法は型番をyoutubeで調べれば大体出てきます。なるべく初期費用をかけたくない場合、安いタブレットからCloud9やCodespacesなどのクラウド開発環境やAmazon WorkSpaces等のVDIサービスを利用すれば、コストをかなり抑えられます。
ただMacでの動作のみ検証した技術記事も多く、余裕があるならMacを検討しても良いかもしれません。
私は趣味にあまりお金をかけないタイプで、仕事では貸与されたMac book Proを使ってますが、個人用のPCは最近まで中古のdynabookを使ってました。徐々に勝手に電源が落ちたり充電されづらくなったりした為、Mac miniを買いました。快適ですが、結構高いです。
挫折しそうになったら
プログラミング学習は孤独です。でも、それでいい。
エラーと格闘し、ドキュメントを読み漁り、試行錯誤する。この過程が大事だと思います。
どうしても辛くなったら、1週間休んでください。プログラミングから離れて、また戻ってくる。それでいいんです。C#で学習を始めて難しいな、と感じたらJavaScript等の別言語を触ってみればいいです。続けられること、ある程度は面白いと思えることが大事だと思います。
まとめ
結局のところ、手を動かしてナンボです。
「プログラミングの学習方法は?」と聞かれたら、私はこう答えます。
「同じアプリ(テーマ)を違う方法で何度も作る」
それぞれは簡易的なものでも、なぜその順番で作り、何を学んだかを自分の言葉で説明できれば、それは立派なポートフォリオになります。チュートリアル通りに作った、一見リッチだが中身を説明できないECサイトを見せられるより、ポテンシャルを感じます。
人気だからといって理解できない高度な本を読んで勉強した気になるより、手を動かしながら少しづつ学び、定期的に立ち止まって、知識を体系的に整理するために本を読む、という方が身につきます。本を読むことは目的ではなく、設計・実装時の判断の幅を広げるための手段です。
高い授業料は必要ありません。必要なのは、手を動かす時間だけです。