プログラマのための IT 教科書

新しい言語をどう学ぶか

この部の 4 / 9 章 ・ 全体で 37 / 76 章 ・ 読了目安 30 分

この章を読むとできるようになること
  • 未経験の言語を半日で書き始められる手順を持つ
  • 前の言語の書き方を持ち込まずに済む
  • 言語に依存しない資産が何かを説明できる

この教科書では TypeScript と Go を扱いました。 これは「今の現場で使うから」であって、 この2つが特別に優れているからではありません。

3年後には別の言語を書いているかもしれません。 実際、多くのエンジニアはキャリアの中で5〜10個の言語を使います。

だから本当に必要なのは、新しい言語を短時間で使えるようになる手順です。 この章はそれを扱います。

言語は「文法」ではない

新しい言語を学ぶ時、多くの人は文法から入って、 チュートリアルを最後まで読んで、そして何も作れないまま忘れます。

言語を使えるようになるとは、次の4つが揃った状態です。

1. 動かせる      環境構築・実行・依存の追加・テストの走らせ方
2. 書ける        文法と標準ライブラリ
3. らしく書ける  その言語の慣用句(idiom)に沿って書ける
4. 直せる        エラーメッセージを読み、デバッグできる

1 と 4 が抜けていると、実務では何もできません。 そして多くのチュートリアルは 2 しか教えません。

学ぶ順番

新しい言語に触る時、私はこの順で調べます。半日で一通り終わります。

ステップ1: 動かす(30分)

□ 処理系のインストール方法(バージョン管理ツールは何が主流か)
□ 「Hello, World」を実行するコマンド
□ プロジェクトの初期化方法
□ 依存ライブラリの追加方法とロックファイル
□ フォーマッタとリンタ(公式のものがあるか)
□ テストの書き方と実行コマンド
GoTypeScript / Node
バージョン管理mise / gvmmise / nvm
初期化go mod initpnpm init
依存追加go getpnpm add
ロックgo.sumpnpm-lock.yaml
整形gofmt(公式・議論の余地なし)prettier(設定が要る)
テストgo test ./...vitest / jest
最初にテストの走らせ方を調べる

テストが走る状態にしておくと、文法の疑問を実験で解決できます。

「この場合どう動くんだろう」と思ったら、 テストを1本書いて確かめる。ドキュメントを読むより速いことが多いです。

ステップ2: 値と型(1時間)

□ 基本型は何か(整数の幅、文字列の扱い、真偽値)
□ 変数宣言と、可変・不変の区別
□ 「無い」をどう表すか(null / nil / None / Option / undefined)
□ 配列・リスト・マップに相当するものは何か
□ 構造体・クラス・レコードはあるか
□ 値のコピーと参照のどちらになるか

「無い」の表現は、言語ごとに最も差が出るところで、 バグの温床でもあります。

言語「無い」の表し方
Gonil(ポインタ・スライス・マップ・インタフェース)
TypeScriptnull と undefined の2つ
RustOption<T>(必ず開けてから使う)
Javanull と Optional<T>
PythonNone

ステップ3: エラー処理(30分)

言語の思想が最も出るところです。

// Go: 値として返す。呼ぶ側が必ず受け取る
result, err := doSomething()
if err != nil {
    return fmt.Errorf("処理に失敗: %w", err)
}
// TypeScript: 例外を投げる。呼ぶ側は catch しなくてもコンパイルは通る
try {
  const result = doSomething();
} catch (err) {
  // err の型は unknown(何が飛んでくるか分からない)
}
// Rust: 型で強制する。? 演算子で伝播
let result = do_something()?;

見るべきは3点です。

  1. エラーは値か例外か
  2. 呼び出し側が無視できるか
  3. どこまで伝播させるのが慣習か

ステップ4: 並行処理(1時間)

□ 並行の単位は何か(スレッド / goroutine / async タスク / プロセス)
□ 共有メモリか、メッセージパッシングか
□ 排他制御の道具は何か
□ キャンセルとタイムアウトの標準的な書き方
言語単位特徴
Gogoroutine + channel軽量。context でキャンセル
JavaScriptイベントループシングルスレッド。CPU 処理は苦手
Javaスレッド + 仮想スレッド
Rustスレッド + asyncコンパイラがデータ競合を防ぐ

ステップ5: 慣用句を知る(継続的に)

ここが最も差がつきます。文法が書けても、その言語らしくなければレビューで止まります。

// Go らしくない(他言語から来た人が書きがち)
func GetUserById(userId string) (*User, error) { ... }
 
// Go らしい(頭字語は大文字で揃える、Get は省く)
func User(id string) (*User, error) { ... }
前の言語の書き方を持ち込まない

これは新人だけでなく、経験者も強くやりがちな失敗です。

  • Java から来た人が、Go で過剰にインタフェースと抽象クラスを作る
  • Go から来た人が、TypeScript でエラーを戻り値で返そうとする
  • Python から来た人が、TypeScript ですべてを any にする

その言語のコミュニティが何を良しとしているかを先に知ってください。 判断に迷ったら「その言語の標準ライブラリのソース」を読むのが一番確実です。

どこを読むか

言語ごとに、質の高い一次情報が決まっています。 Qiita や個人ブログから入ると、古い情報や間違いを掴みます。

言語まず読むもの
GoA Tour of Go → Effective Go → 標準ライブラリのドキュメント
TypeScriptTypeScript Handbook
JavaScript / WebMDN Web Docs(事実上の標準リファレンス)
RustThe Rust Programming Language(通称: the book)
Python公式チュートリアル → PEP 8
公式ドキュメントは「読む」より「引く」

最初から通読する必要はありません。

  1. チュートリアルだけ通す(Tour of Go は2〜3時間)
  2. あとは作りながら引く
  3. 標準ライブラリは「何があるか」だけ眺めておく

「何があるか」を知らないと、車輪の再発明をします。 slices パッケージを知らずにソートを自分で書く、といったことが起きます。

言語をまたいで持ち運べる知識

ここが本題です。言語を変えても捨てなくていい知識があります。

移せる(一度学べば一生使える)移せない(言語ごとに学び直す)
ネットワーク・HTTP・DB の仕組み文法・標準ライブラリの名前
計算量とデータ構造ビルドツール・依存管理
設計の考え方・責務分割慣用句・命名規則
テストの書き方・考え方エラー処理の作法
デバッグの手順並行処理の道具
セキュリティの原則エコシステム

左側が、この教科書の大半を占めている理由です。

新しい言語の習得が「1週間」で済む人と「3ヶ月」かかる人の差は、 才能ではなく左側をどれだけ持っているかです。

実際にどう習得するか

「チュートリアル地獄」を避ける

チュートリアルを5本やっても、何も作れるようになりません。 手を動かして作るものが必要です。

おすすめは、同じものを2回目の言語で作り直すことです。 仕様を考えなくていいので、言語の違いだけに集中できます。

ハンズオン: サービスを1本作って動かすのハンズオン(URL 短縮サービス)を、別の言語で書き直す
→ 同じ設計・同じテスト・同じ API
→ 差分がそのまま「その言語の特徴」になる

既存コードを読む

既存コードを読むの技術がそのまま使えます。 その言語で書かれた良いコードを読むのが、慣用句を身につける最短路です。

  • Go なら標準ライブラリ(net/http は読みやすい)
  • TypeScript なら、使っているライブラリの型定義ファイル

リンタと公式スタイルに従う

自分の好みを持ち込まず、まず言語の標準に合わせます。

gofmt -l .          # Go は議論の余地なし。公式が1つの形を決めている
golangci-lint run

「なぜこう書くのか」は、従っているうちに分かります。

AI に書かせながら学ぶ時の注意

新しい言語こそ AI が便利ですが、そのまま使うと学びがゼロになります。

有効な使い方は次の2つです。

  1. 書かせたコードを1行ずつ説明させる(分からない構文を潰す)
  2. 自分で書いてからレビューさせる(「この言語らしいか」を聞く)

危険なのは、動いたコードを理解せずにマージすることです。 動いているのに何が起きているか説明できないコードは、 障害時に自分を殺します(エンジニアとしての立ち振る舞い)。

言語の宗教戦争に参加しない

「Go は書きにくい」「TypeScript は型がザル」といった論争は、 インターネット上に無限にあります。関わる価値はありません。

言語はトレードオフの塊です。

得意代償
Go単純さ・並行処理・デプロイの容易さ記述が冗長になりがち
TypeScript表現力の高い型・エコシステム実行時には型が消える
Rust安全性と速度の両立学習コストとビルド時間
Python書きやすさ・ライブラリの豊富さ実行速度・大規模での型の弱さ

「その現場で選ばれた理由」を理解するほうが、優劣を語るより有益です。 そして、チームの言語選択に不満があるなら、 感想ではなく具体的な問題と代替案で議論してください(ドキュメントを書く)。

チームで新しく Python のバッチを書くことになりました。あなたは Python 未経験です。最初の半日で何をしますか。

実務の落とし穴まとめ

  1. チュートリアルだけやって作らない — 何も身につかない
  2. 前の言語の書き方を持ち込む — レビューで必ず止まる
  3. 個人ブログから学ぶ — 古い情報を掴む。一次情報を読む
  4. 標準ライブラリを見ない — 車輪の再発明をする
  5. リンタを外す — 自分の好みより言語の標準が先
  6. AI の出力を理解せずマージ — 障害時に説明できない
  7. 言語の優劣を論じる — 時間の無駄。選ばれた理由を理解する

まとめ

  • 言語の習得とは、動かせる・書ける・らしく書ける・直せるの4点
  • 学ぶ順番は 実行環境 → 値と型 → エラー処理 → 並行処理 → 慣用句
  • 「無い」の表し方とエラー処理に、その言語の思想が最も出る
  • 一次情報(Tour of Go、TypeScript Handbook、MDN)から入る
  • 移せる知識(ネットワーク・計算量・設計・テスト・デバッグ)が資産になる。 だから言語より先にそちらを厚くする
  • 習得の最短路は同じものを別の言語で作り直すことと、良いコードを読むこと

公式ドキュメント

迷ったら一次情報に戻ってください。

対象リンク
A Tour of Go(日本語)https://go-tour-jp.appspot.com/
TypeScript Handbookhttps://www.typescriptlang.org/docs/handbook/intro.html
MDN Web Docs(日本語)https://developer.mozilla.org/ja/
The Rust Programming Language(日本語)https://doc.rust-jp.rs/book-ja/

章末問題

Java 経験者が書いた Go のコードをレビューしています。1つの実装しか無いのに、すべての構造体にインタフェースが定義されていました。どう指摘しますか。

次の章からは、実際に目に見える画面を作ります。まずは HTML と CSS です。

読み終わったら記録しておくと、目次で進み具合が分かります。