GitHubを使って、1人のプログラム学習で世界レベルの学びを

## あなたは新人エンジニアです

意欲的なあなたは、仕事以外の時間を使って1人で学びたいと思っています。

手元にあるのは、大学時代から使っているノートパソコンだけです。

さて、どうやって勉強するでしょうか？

まずはネットで「Python スクレイピング」と検索してみたり、本を買って勉強計画を立てたりするでしょう。
そしてこう考えます。

**「長い道のりだな。何年かかるかな。」**

手を動かしはじめても、「これが何の役に立つんだろう？」「いつ仕事で使えるレベルになるんだろう？」と考えてしまい、結局学習をやめてしまうこともあるでしょう。

こうしたことが数年続く人も少なくありません。

実際に私がそうでした。

優れたエンジニアになれる気がしない。あの先輩のようにはなれないと悩みました。
しかし、なんとか仕事はできているので問題の解決には真剣になれない状況。

「できるエンジニアって楽しそうに仕事してるよな。楽しめてない自分はそもそも向いてないのかな。」などとも思いました。

では、できるエンジニアはどうやってスキルを身に着けているでしょうか？

答えは「仲間と一緒に勉強すること」です。

仲間とのコミュニケーションを楽しみながら、気付いたらスキルも身についているのです。

仲間に教えてもらうには、自分もその人に役立つことを提供する必要があります。

それは、役立ちそうな知識を提案したり、分かりやすくまとめたりすることです。

そういった人間関係の中で、スキルアップしていくのです。

私自身も、一人で頑張ろうと思っていた時期や、独学でプログラムに没頭していた時期がありました。

でも、一人で作ったプログラムは2000行程度。
複数人で開発したプログラムは10000行を超え、はるかに高性能です。

皆さん、

開発は一人でするものではありません。

情熱や好奇心だけではどうにもならないこともあります。

数をこなせばいいわけでもありません。

大事なのは、GitHubでエンジニア同士の繋がりを作り、コミュニティに参加することです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680051/1ec8c2aa-e338-cc9e-d99a-9b58a8c7ccde.png)


どんな仲間と何を作っていくか？
誰かが作ったものをどう活用してカスタマイズしていくか？

もちろん、コミュニティがあれば誰でも成功できるわけではありませんが、コミュニティは自分の成長を大いに促進してくれます。

まず学ぶべきは、コミュニティで自分の意見を積極的に発言するため、世界の動きを知ることです。

## GitHubで世界を知る

本書のメインですが、GitHubを使いこなす大きな利点について1つ紹介します。

昨今、生成系AIの普及に伴い、AIによる文書学習・検索システムの依頼が殺到しております。

何百万円も払ってシステムを実装する企業も少なくありません。

一方で、システムの効果検証やユーザフィードバックは実装後、、、
もし、ユーザの使用感が悪ければ、損失が確定してしまいます。
最悪、さらに追加実装を頼むマッチポンプのリスクがあります。

要は、気軽に試すことができません。

これがコマンド1つでデモ環境を構築できたら？

今の時代、コマンド1つ入力するだけで、下図のようなAIの文書検索システムを実装できます。(意外とめんどくさい接続設定などをすべて自動で実装してくれます。)

![appcomponents.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680051/3d73923a-1a04-f8cc-0928-ebb91db4d28b.png)

そこで紹介したいリポジトリがこちらです。
azure-search-openai-demo
https://github.com/Azure-Samples/azure-search-openai-demo

このリポジトリを自分のPCにクローンして、PowerShellで以下のように入力するだけで、デモ環境を構築できます。
```
azd init -t azure-search-openai-demo
```
以下、READMEの抜粋となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680051/6c6c5cad-2dab-83ea-17d4-f98bef9d37dc.png)

私は、これを知った時シンプルに「すげーな」と思ったと同時に「**知ってると知らないのとでは実装効率が全然違う。** 自分の開発しているシステムに近いリポジトリ探しとこ。」と思いました。

もちろん、前提となる条件がございます。Azureアカウントを所有していたり、自分のPCにNode.jsがインストールされていたり。
それらについては、ReadMeのLocal environment→Install the required toolsをご参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680051/33fe2e3e-9714-98eb-ade7-4f5d1deeacde.png)

実際、数百万円で案件を請け負ったベンダがコマンド1つで実装して、それっぽく仕上げてくるといったケースもあります。

これらを踏まえると、今の時代のインフラエンジニアに必要な能力は、実装力だけでなく**それがあることを知っていること**でしょう。

そのためには、特に1人でスキルを伸ばそうと考えているエンジニアほど情報感度を上げるべきでしょう。そしてそれらの情報源としてはGitHubが最適であると考えてます。

### すごいのは分かったけど

しかし、いくらすごい人が作ったプログラムで簡単に実装できたとしても、それを運用する立場になりうるあなたは、結局そのことについて知らなけらばなりません。

コマンド1つで実装できたとして、あなたの社内では矢継ぎ早にこれらの質問が飛んできます。
・追加で実装して欲しいシステムがある。
・社内のプロキシは考慮してるか？
・コスト超過しそうだからログとって欲しい。
・接続できなくなったけど原因調査して欲しい。
・他のエンジニアにどういう仕組みになっているか説明して欲しい。
など、、、

これらの質問・要望に的確に応えるためには、実装できただけでは足りなく、本当の知識が求められます。

そこで、学習計画としては以下の2パターンが上がると思います。

①実装するスキルを身に着けてから実装するか？
②それとも実装してからそれについて調べるか？

前者だと時間がかかってします
後者だと運用できないときに責任が取れない

鶏が先か卵が先か？
さて、ここで前者を取る人が多いのではないしょうか？

しかし、できるエンジニアはスピード感が違います。

私の結論は
**同時にやる**
です。

結局これしかないと思います。

実装完了させてしまったら、今調べてます。
でいいんです。

初めは質問に答えられなくても、それで得られるメリットはかなり多いです。

まずは世界レベルを実装した後、追いつけばいいのです。

追いつくために、勉強したり、コミュニティで質問したり、、、

それが最も早くできるエンジニアになる手段だと考えます。



<!--
## 具体的なgit開発
イメージを簡単に図にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680051/953efdfc-8500-ceae-131b-f28f55863ce9.png)

簡単な図ですが、これに当てはまればOSもエディタもなんでも問題無いです。


私はローカル環境にクローンしたリポジトリをVSCodeでプッシュし、仮想環境でクローンすることでデプロイします。

作業番号の裁判は、
Dev:開発環境
Git:GitHub上で行う作業
Run:実行環境

とします。

### Dev-1:開発環境にリポジトリをクローンする
開発環境はwindowsOS上のVSCodeですが、クローン出来れば環境は何でもいいです。

クローンに必要な情報は、
```
git clone [リポジトリのURL]
```
です。まじでこれだけ。

クローンが失敗する場合、様々な原因が考えられます。
・URLの間違い
・プロキシを考慮していなかった
など

しかし、**git clone** と **リポジトリのURL** さえ入力できれいれば基礎はOKです。
9割成功していると考えていいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680051/0b726a19-cf40-c27a-fc95-061d53a16be8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680051/e5e86d20-ca8f-97bb-a1e7-cf22fe1aaaa1.png)

### Dev-2:開発環境でローカルブランチを作成
ローカルブランチとか、リモートブランチとか、初心者にとってはややこしいよね。
今まで修正したファイルはアップロードして上書きしてた自分にとっては理解に時間がかかりました。
下図のようにローカルブランチ

### Dev-3:開発環境からfixしたプログラムをpush

ブランチを切ってpushします。

### Git-1:GitHub上でMargeする。

margeリクエストを送ります。


### Run-1:実行環境でリポジトリをクローン
実行環境はLinux serverを

-->