Build@MercariTrainingProgram2024で学んだ「translation」
0. この記事について
0.0 この記事で書くこと
私は、Build@Mercari2024というプログラムに参加しています。この記事は、その学習期間中に最も重要な学びであった"translation"について書きました。要約すると、「他者(人間やコンピュータ・本やweb上の記事)の言葉と自分の言葉との"translation"を繰り返す中で学びが生まれ、理解が深まり、自分の視点が移動していく過程がある」ということです。
0.1 対象読者
この記事は、このプログラムに参加する前の過去の自分へ向けて書きました。今回一緒に学んだ参加者のみなさん、お世話になったメンターのみなさん、Build@MercariTraningProgramに興味がある方が読むことを想定しています。
以下より過去の自分への言葉遣いとなるため、「常体」の文章になります。
0.2 "translation"とは?
まず、"translation"を辞書で引いてみる。
ついでに "language"も調べてみる。
私が "language" に "tranlation" を行うと「言葉」となる。Build@Mercari2024には海外在住の方々も多く参加していた。そして、日本全国から年齢・性別・学歴など関係なく多様な人生を歩んできた多くの方が参加していた。1. の意味は、日本語と英語や方言の違いがあることを指し、2. の意味はチームミーティングなどで使った「言葉」を指す。人によってslackに書く文章のスタイルが異なり、それらに対して多様なスタンプを押してリアクションしていたのは3. や4. の意味が表すところだろう。そして、GoやPython,TypeScript, commandやdockerfileなどを記述する際に5. が意味する「言葉」もたくさん使った。
私は上記の文章において、『"language"=「言葉」』とは書かなかった。
『"language" → 複数の意味 → Build@Mercariでの具体例 → 「言葉」』
のように一つの流れを経て、"language"と「言葉」をつなげた。これは最初に辞書で引いた "translation" が意味する「ある言葉を別の言葉へと変形するプロセス」の一例だろう。
1. 未知の知識をどのように学ぶか?
1.0 慣れない開発
参加者の多くが、Goを書くのが初めてだったり、PythonでAPIを開発するのが初めてだったり、DockerやGit/GitHubを使ったりするのが初めてだった。自分もGoで開発するのは初めてだったし、dockerについて学ぶのも初めてだった。
1.1 学習方法の不安
複数の参加者は上記のような学習方法で学んでいることを心配をしていたみたいだ。2週間という限られた期間で、ゼロから環境構築やCUI操作, Git/GitHub, Go/PythonでのAPI開発, Docker/フロント開発などをすべて理解するのは難しい(と自分は思う)。どこかで理解を断念し、前に進まないといけないのだろうか。
1.2 模倣が有効なとき
これはある程度正しいと思う。例えば数学の学習。抽象的であり、精緻な論理で紡がれる思考プロセスは、ある程度時間をかけて学習したあとに漸く体得され、その意味を深く理解する。
先へ進んだ後に分かることもある。しかし、ただの模倣だけ(コピペ)だと先へ進んだときに困ることもある。真似をすることは学ぶ方法の一つであり、それは「ある状態へ近づくため」という目的の下で有効だと思う。以下のような返信をした。
つまり、『「未知を既知と結びつけたり、ある規則を見つけたり」して、「それらを説明できる状態にしたり、再現や応用ができる状態にする」』ための模倣という学習は有効だと思う。
上記の返信は長文だが、これは「自分の考える学習観」を「相手の言葉」へ"translate"する上で必要な言葉の変換過程だと思う。
⚠️(2章は自分用のメモなので、お急ぎの方は読み飛ばしてください。理解が深まり次第、修正加筆します。)
2. 知識の"translation"
Build@Mercari Training Program
https://github.com/oz1042/mercari-build-training/
「(自分の)普通は(相手へ)不通である」という拙語を元に、既知だった部分も含めて可能な限りわかりやすい説明に努める。一方、初めて学んだことは誤った記述をしている場合がある。コメントにてご指摘いただけると幸いである。
2.0 CUIに慣れる
WordやExcel, PowerPointなどは使ったことがあるかもしれない。それらのデータはファイルに保存される。他にも、画像ファイルやテキストファイルなどいろんな種類のファイルがある。.pngや.jpg, .txtなどファイルの後ろについているものを拡張子という。
複数のファイルをまとめて入れることができるものをディレクトリ(フォルダ)という。ディレクトリの中にディレクトリを入れることもできる。例えば、スポーツディレクトリ(sports)の中に野球ディレクトリ(baseball)をつくり、その中に大谷翔平選手の写真(OtaniShohei)を入れる。これをGUI (Graphical User Interface)で行うには、マウスを使ってディレクトやファイルを移動させればいい。一方、CUI(Character User Interface)で扱うにはパス(path)という表現方法を用いる。上の例のパスは、「sports/baseball/OtaniShohei.png」である。
✅ ディレクトリとファイルの違いを説明できるか?
✅ コマンド(CUI)でディレクトリやファイルを作成・削除ができるか?
✅ コマンド(CUI)でディレクトリの移動やファイル検索を行えるか?
✅ rootディレクトリとhomeディレクトリを説明できるか?
✅ 絶対パスと相対パスの違いを説明できるか?それらを使って実際にディレ
クトリを移動できるか?
2.1 Git/GitHub
STEP1: Git
初めて触れる道具を扱えるようになるには、「その使い方を知ること」と「実際にその道具を使ってみる」ことが大事。
Git/GitHubについては、本・Web記事・動画などたくさんの解説コンテンツが存在する。自分の状態(確保できる学習時間/使えるお金/得意な学習法)に合わせて選ぶとよさそう。
この記事の以下では、誰でもすぐにアクセスできるWebコンテンツ(記事とスライド)を中心に添付する。
一つ目の記事は、Gitの導入や設定(SSHなど)の参考になる。サル先生のGit入門はReferenceにも載っているコンテンツで、参加者からもわかりやすいと評判だった。二つ目の記事は私の拙文記事。中級者向け。ただ、ここまで理解すると、「2.0 CUIに慣れる」で触れたファイルシステムの知識とつながると思う。最後のやつは、Git公式ドキュメント。特に、GitHubの導入のところでよくわからなかったり、つまづいたらメンターやできている他の参加者に質問するといい。ただ聞きすぎるのもよくない。自分で考える時間も必要だ。
参考:Google人工知能チームの「15分ルール」
✅ Git/GitHubとは何か、使うメリットなどとともに簡単に説明できるか?
✅ working tree(directory), staging area(index), local repository, remote repositoryなどを図で説明できるか?
✅ その際、git init, git clone, git add, git commit, git remote add origin, git pushなどのコマンドをどの過程(流れ)で使うか説明できるか?
✅ branchやmerge, PR(Pull Request)について意味と操作を調べたか?
✅ git status, git ls-files, git logなどのコマンドや、それらのオプションを調
べたか?(例えば、git push -u origin mainの"-u"の意味は説明できるか?)
✅ 上記を自在に使えるようにするためにたくさん手を動かして失敗したか?
✅ 余裕があれば、コンフリクトやforkの意味、git rebaseなども調べる。
実際の開発でどう使われているかも調べる(この後のSTEPで実践する。)
📚 フォークした後に本家の変更を取り込む方法
2.2 環境構築(Go/Python)
調べつつ、分からなかったらすぐに聞く。ここが最初の難関。余裕があれば、それぞれ何をしているのか意味を理解できるようにする。
✅ Pathを通すとは?(「2.0 CUIに慣れる」で触れたあの「パス(path)」)
export/sourceコマンドや.zshrc, .bashrc/.bash_profileを説明できるか?
✅ (Python) uvicorn main:app --reload --port 9000は何をしている?
仮想環境/requirements.txtとは何か?どう使うか?
✅ (Go) go run app/main.go は何をしている?(app/main.goもパス(path))
go.modファイルとは何か?go mod tidyのコマンドの意味は?
Reference:[試して理解]Linuxのしくみ ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】
💬 ここまで来ると「パス(Path)」という概念は応用可能になっているはず。
2.3 Develop API with JSON
STEP3: 出品APIを作る 環境構築に続き第二の難関。まずは概念理解から。たくさん調べたり、質問する中で自分が既に持っている知識や言葉と結びつける("translate"する)とよさそう。私はC言語を学んでいるから、Goの文法をCと比較しながら理解した。初めて触れる概念は比喩/アナロジーを用いて仮説を立てて、実際に調べ尽くしたりプログラムを書いたり、質問することで検証した。
インターネットについて(IPアドレス/ポート番号)
https://lecture.ecc.u-tokyo.ac.jp/~cai/IP.pdf
HTTP入門
Web API 入門
RESTful API 入門
JSONについて調べたら、Pythonで実装するならディクショナリ(辞書)型+リスト、Goで実装するなら構造体+スライスを使うといいかも、と検討がつく?
curl.1 the man page
✅ -X, --url, -d(--data), -F(--form)等のオプションはどんな意味を持つか?
(-Fを調べたときに出てくる"MIME multipart"はGoのドキュメントを読む
ときに役立つから調べてメモしておくといいかも。)
Goとechoの勉強 (初めてだけど挑戦したい!)
A Tour of Go
✅ Goで関数を書けるか?構造体の定義はどう書くか?
✅ packageとは何か?import文の書き方と標準ライブラリを調べたか?
使えるか(コーディングできるか)?
✅ その他、defer, slice, map, interfaceなども説明できるか?
↑ (Reference: http://tenn.in/go)
echo > docs > Quick Start
【golang】echoを使ってさくっとAPIを作成する話
[Golang]EchoのMiddlewareを実装する
Go言語初学者がエラーに立ち向かう方法
✅ echoとは何か?middleware, routingとは?
✅ Contextインターフェース, Echo型が持つメソッドを知っているか?
✅ ハッシュ化とは何か?ハッシュの種類は?
-> gitのcommitにもハッシュが使われている。
✅ port (ポート番号) とは何か?
✅ localhost, 127.0.0.1 は何を意味するか?
✅ HTTPリクエストメソッド (GET, POST...)にはどんなものがあるか?
✅ HTTPステータスコード (1XX, 2XX, 3XX, 4XX, 5XX)はそれぞれどんな意味を持つか?
✅ log levelとは何か?
🤨 (難)CORSとは何か? -> CORS とは何ですか?
実装が難しいときは、模倣する学習法も有効。ただし「自分の言葉で説明できるか?」「他のケース/課題に応用できるか?」で理解しているかをチェックする。
2.4 Develop API with SQLite3
2.3 ではJSONファイルにデータを保存していたが、2.4ではデータベースにデータを保存する。その際、SQLite3というRDBMS(Relational Database Management System / データベース管理システム)を使う。また新しいツールが出てきた。
SQLite入門
Command Line Shell For SQLite
✅ JSONファイルではなくデータベース(SQLite)にデータを保存する利点は何か?
✅ 正規化とは何か?
2.5 Docker
3つ目のスライド資料に「Understand build context」というキーワードが出てくるが、本当にその通りだ。dockerfileを書くときには"Path(パス)"を意識して書こう。
2.6 CI
STEP6: CIを使ってDocker imageをBuildする
3. コミュニケーションの"translation"
3.0 一緒に仮説を検証する
5人ほどで作業通話をしていた際、1人(Aさん)がエラーの質問をした。私はその解決の筋道が見えていたので、他のメンバー(Bさん)が出した解決策の仮説より、自分の仮説をゴリ押しした。結果的にAさんのエラーは解決されたが、Bさんの学習機会が失われた。このことを反省し、メンターさんに質問した。
時間があるなら、みんなが出したエラー解決のアイデアを一度書き出して、一つひとつ実行してみる。そうすることで、場にいるみんながいろんな試行とその結果を知ることができる。そして、場にいる参加者それぞれに学びが生まれる。
時間を要するが、エラーについて一緒に調べたり、問題について一緒に考えたりすることは、自分の学びにもなる。
3.1 PR(Pull Request)レビューで視点を獲得する
相手のコードをPRのコメントやソースコード内のコメントを参考に読み解く。違う書き方やロジックがあると、その違いが学びになる。自分と相手のコードの相違点や類似点を知ることで、自分の書いたコードが輪郭をもつ。自分の現在の視点や知識が浮き彫りになり、相手の視点を獲得するために検索したり質問したりする。相手の視点にも立つことができたとき、また一つ学びが増えている。
相手の視点へ移動するという"translation"もまた学びをもたらす。
3.2 相手の言葉を使う
情報科学を学んでいる学生(A)と「Pythonから学び始めたらオブジェクト指向はあたりまえの概念だけど、Cからはじめたらその価値がわかる。」という話をしていた。この話を「プログラミングを始めたばかりのもう一人の場の共有者(B)」に伝える際、「オブジェクト指向」という言葉は通じない。彼女(B)は微分方程式の話を雑談中にしていたので、数学が得意なのだろうと推測。「私たちは『積分』を学校教育で学んであたりまえの概念として知っているが、昔の人たちは土地の測量のためにその概念を生み出した。Pythonは比較的新しい言語だから『オブジェクト指向』があたりまえとして存在するけど、Cは昔からある言語だからそうではない。」このように説明すると、彼女にも話の流れが通じる。「オブジェクト指向」自体を説明しなくても、例えを使うことで相手が知っている言葉を用いて、話の内容構造を伝えることができる。
これは一事例だが「相手がもつ言葉」で伝える"translation"は、様々な場面で役に立つと思う。適切な比喩は理解を助ける。
3.3 スタンプや画像を使う
よく言われることだが、オンライン上でのテキストコミュニケーションは感情や意図が伝わりにくい。チャットツールやPRでスタンプや画像を使用するとテキストだけでは伝わない情報も伝えることができる。特に、チャットツールにおいて誰かが投稿したメッセージにスタンプのリアクションをするのは大切だと感じた。スタンプを駆使していた参加者には親しみやすさを感じた。
感情や意図の"traslation"も重要だ。
3.4 学び方は人それぞれ違う
「ソフトウェアエンジニアリング」が意味する「ある規則を未知の事例へ応用する知的技能」を習得することができれば、模倣することやAIに質問することも素晴らしい学習方法だ。もちろん、他者に質問するのもいい。Web上の情報より人間が持っている情報の方が多いと言われるくらいだ。一方、1人で黙々と調べたり考えたりする学習法も同様に素晴らしい。人それぞれ得意な学び方があり、今回のBuildプログラムはどんな学習方法も歓迎していた。むしろ、自分自身の学習スタイルについて再考したくらいだ。
質問に答えるときは相手の学習スタイルに合わせてヒントや問いかけの形を"translate"することも大事だ。
4. 感謝と今後
4.1 感謝
このような学びが得られたのは、Build@MercariTraining2024の運営とメンターのみなさん、そして一緒に学んだ方々のおかげです。ありがとうございました 😊!!!
4.2 今後すること
・Goをマスターしたい。
・残りの課題(Extra2, STEP7,8)に取り組む(2weeks)。
・もう一周やってみる(2weeks)。
・食材の栄養素を叩けるAPIと外食・自炊で摂取した栄養素の可視化と偏バランスアラート機能を持ったアプリを開発したい。
・関連書籍を読む/Udemy動画を視聴する。
Appendix. このせわしない時代に自分のペースで学ぶということ
🔍 「ピアジェ 構成主義」
時間を決めて取り組むことは大切だ。時間を決めないと人間は永遠にだらける。しかし、他者と進度を比較して自分の進捗が遅いことに焦り、理解を疎かにしたまま前へ進むことは、かえってその後の歩みを遅くする。
🔍 自律調整学習
応募時は全然合格するとは思っていなかった。合格をいただき、仲間と学ばせていただいて、今こんな景色が見えているよと、過去の自分へ伝えたい。
この記事が気に入ったらサポートをしてみませんか?