プログラミング言語やフレームワークの学び方

この記事は、[Wano](https://group.wano.co.jp/)のエンジニア勉強会で発表した内容になります。

言語の場合もフレームワークの場合も、最近はチュートリアルなどが充実しているので、そんなに苦労しません。基本的には、以下の3点で事足りるかなと思っています。

1. チュートリアル/Getting Started のガイドを読む
2. その他の公式ドキュメントを必要に応じて読む
3. 検索/ChatGPT等の生成AIをつかってしらべる

終了。

...で話を終わらしてしまうわけにもいかないので、昔、学んだもので、Blogに記事を書いたものから、だいたいこういうポイントで学んでいるな...というものを書いてみました。

## プログラミング言語

### [Go](https://go.dev/)

9年くらい前(2015年)に[記事](https://ktat.hatenadiary.jp/entry/20150621/1434893179
)にしてます。

ネットの記事もいくつか読みましたが、基本的には、公式ドキュメントを読んだかなと思います。

- [Goチュートリアル](http://golang.jp/go_tutorial)
- [Go言語仕様](https://golang.org/ref/spec)
- [Effective Go](https://golang.org/doc/effective_go.html)
- [Go言語 FAQ](http://golang.org/doc/faq)

記事にある項目がだいたい全てですが、以下が僕の中でのポイントなのかなという感じです(順番は前後することがあります)。

1. 慣例や作法があるか調べる(ファイル構成なども含む)
2. 基本的なコマンドの使い方を調べる
3. 基本的な文法について概ね、以下の流れで調べる
    - 変数宣言と基本的な型(string,int,slice,map等)
    - 文字操作
    - キャスト
    - ループ
    - 条件
    - 正規表現
    - エラーハンドリング
    - ファイル/標準入力操作
    - 関数の作り方
    - モジュールの作り方(他言語ではOO関連の書き方に該当)
    - その言語で特徴的な内容(固有というか、書き方が特徴的と言うか)
        - interface
        - goroutine
        - channnel
        - generics(最近だと)

### [Rust](https://www.rust-lang.org/ja)

5年前(2019年)に[記事](https://qiita.com/ktat/items/27d09cbe8be07127f025
)にしましたが、Goのときとそんなに変わらない気がします。

当初は、徹夜で読んでやってみるという若干ネタ的にやってみた感じなので、以下しかしなかったです。

- [The Rust Programming Language](https://doc.rust-jp.rs/book/second-edition/foreword.html)を読む

これも記事にある項目を並べると、大体Goと似通った感じになります。

1. 基本的なコマンドの使い方
1. 基本的な文法
    - 変数宣言
    - 文字列操作
    - 関数の作り方
    - キャスト
    - ループ
    - ファイル操作
    - その言語で特徴的な内容(固有というか、書き方が特徴的と言うか)
        - Option/Result型
        - 所有権
        - trait
        - 非同期処理 ... 後から必要になって学んだ

ただ、この数年後に趣味で書き始めるようになってからは、以下の2点で勉強していた感じがあります。

- ライブラリのドキュメントを読む
- コンパイラの言う通りになおす ... 言うとおりに直してるだけなので、学んでるか不明

ちなみに、この頃のChatGPTは古い情報しか持ってなかったので、Rustのことを聞いても見当違いの内容しか言ってこなかったです。

その当時は、ChatGPTのことは「ダメダメな先輩」と呼んでいました(知ったかぶりで、間違った内容を教えてくる)。

## [Python](https://www.python.jp/)

2年前(2022年)に[記事](https://ktat.hatenadiary.jp/entry/2022/07/31/134918)にしています。
が、全然覚えてないんですよね。

- [PerlユーザのためのPython移行ガイド](https://www.amazon.co.jp/dp/4894714183) ... 20年くらい前に読んだ覚えはあります
- Mailmanのソースコード ... 15,6年前にMailmanを改造する仕事をしたので

多分、公式ドキュメントで学んだんだと思いますが、記事に書いていることからポイントを並べてみます。

1. 関数定義
1. signal ... 普通最初には調べない
1. クラスの書き方
1. 基本の型
1. 文字列操作
1. キャスト
1. 条件、比較
1. thread, 非同期処理 ... 普通最初には調べない
1. エラーハンドリング
1. ループ
1. package
1. httpアクセス ... 普通最初には調べない
1. 画像の生成 ... 普通最初には調べない

やりたいことが明確(STREAME DECKを操作する)だったせいか、若干踏み込んでる感じがありますね。

## Web Application Framework

### [Fiber](https://docs.gofiber.io/)

今年(2024年)に学んだWAFです。記事にはしていませんが、覚えているので書いてみます。
時間があまりなかったので、ポイントだけを調べて、後は検索という感じなので、以下のような感じです。

- [公式ドキュメント](https://docs.gofiber.io/)
- サンプルコード
- 検索

ポイントとして抑えたところは、以下です。

1. 設定ファイル(環境ごとのかき分け)
1. ルーティング
    - ネームスペース
    - フック
1. リクエスト
1. レスポンス
1. ミドルウェアの有無を公式ドキュメント、書き方を既存のコードから調べる

### [Beego](https://github.com/beego/beego)

6年前(2018年)に、[記事](https://developers.wano.co.jp/1594/)にしています。
Fiberとあんまり変わりませんが、FiberはAPIのみでの利用だったので、若干異なります。

1. 設定ファイル(環境ごとのかき分け)
1. セッション ... FiberはAPIでの利用だったので、調べなかった
1. キャッシュ ... なんで調べたのか不明
1. i18n ... i18nが必要なプロジェクトだったので調べた
1. ルーティング
    - ネームスペース
    - フック
1. テンプレの書き方 ... Webサイトだったので

## ORM

### [sqlc](https://github.com/sqlc-dev/sqlc)

今年(2024年)に学んだORMです。[記事にいっぱいしました](https://qiita.com/ktat/items/89bd5dbfed238e761b44)が、公式ドキュメントしか見てないです。後は、issues くらいではないかと思います。

以下を学びました...というか、「選定する際に見た」という方が正しいような気がします。

- SQLをどう実現するのか
    - SELECT ... JOINできるか。複雑なSQL書けるか
    - INSERT
    - UPDATE
    - WHERE ... どのように書けるか。subselectできるか
    - Bulk Insert
    - イテレータで取れるか
- DBの型と各SQLを実行する際に渡す型との一致具合

Bulk Insertやイテレータはsqlcにはないのですが、そんなに難しくなく自分で書けるので、問題ではなかったです。

## Frontendフレームワーク

### [React](https://ja.react.dev/)

2年前(2022年)に[記事](https://ktat.hatenadiary.jp/entry/2022/06/11/185757)にしました。
僕自身は仕事では使ってないのですが、プロジェクトで使いそうなので、勉強しました。

公式しか見てないです。

- [公式のチュートリアル](https://ja.reactjs.org/tutorial/tutorial.html) ... ※古いものです
- [公式のガイド](https://ja.reactjs.org/docs/hello-world.html) ...  ※古いものです

当時、クラスベースの説明だったのですが、フックベースに変わって、そっちが主流になると読んでショックを覚えた記憶はあります。「先言えや」という気分になりました。

フロントエンドのフレームワークはそんなに使わないので、あまりポイントはわかっていないせいか、チュートリアル全部やればいいや、になりがちな気がします。Vue.jsも同じ要領で学んだと思います。

## 終わり

以上、プログラミング言語やフレームワークの学び方についてでした。ただ、最初に書いたとおり、最近の言語やフレームワークは公式のドキュメントが充実していますので、それで十分じゃないかなという気がしています。
変にBlog記事とか読むと情報が古かったりしますので。

最初は公式を読んで、困ったときは検索/ChatGPT(等の生成AI)くらいがちょうど良いのではと思います。

ちなみに、ドキュメントや情報が充実していない頃(20年以上前)は、本で勉強することが多く、だいたい以下のような本で勉強していました。

1. かんたんな本を読む ... 何でも良い初心者向けのもの
1. 難し目の(というかは網羅性の高い)本を読む ... Perlだとラクダ本

今どきでも、良書(そのコミュニティでお勧めされているもの)であればじっくり本を読むのも良いと思います。
ただ、繰り返すように、基本的な内容は、公式ドキュメントが揃っていますので、本を読むなら、最初から詳しめの本を読むことになりそうな気がします。