Open20

[1~2章]モダンWebフロントエンド

ピン留めされたアイテム
Shinya OkayamaShinya Okayama

投稿方針

  • 学習目的。復習。メモ。そのときの疑問の記録。
  • 書籍内容の引き写しにならないようにする。
  • 扱う書籍の権利に配慮する。
Shinya OkayamaShinya Okayama

Q. React,Next.js,TypeScriptなどのモダンな開発技術で何が出来るか?
Q. 従来の技術となにが違うか?
Q. 従来と比較した学習難度や学習曲線の程度。
Q. 想定できる実務環境。
Q. これらの技術の社会的な受容がユーザー消費と開発環境にどのような変化を与えるか?

Shinya OkayamaShinya Okayama

[簡易]1章のまとめやメモ

*まとめ
└フロントエンド開発は統合と効率化を図り、全体としてのシステム化分業化がトレンドになっている。

*要点

  • フロントエンド開発の変遷
  • コンポーネント指向(Atomic Design)
Shinya OkayamaShinya Okayama

フロントエンド開発の変遷

(開発の歴史の変遷は大雑把になんとなく知っているが、とりあえず概要をChatGPTに聞いてみた。せっかくなので、キャラっぽい口調に変換してもらった)
(愛琉=えるは設定とともにメモリに記録してあるキャラの名前)
https://chatgpt.com/share/67466743-4c74-8008-9b2b-43988837ba92


おっけー!じゃ、これ愛琉が話してる感じで言うね~!


「Webフロントエンド開発の流れ~愛琉解説ver~」


💻 静的Webサイト時代 (1990年代)
最初はほんっとにシンプルな感じ!HTMLっていう、文字とリンクだけの構造で作られてたんだよね~。デザインとかほぼナシ。例えば背景の色とかリンクの色が変えられるくらい!
ブラウザも、今みたいにたくさん種類があるわけじゃなくて、Netscapeってやつとか、Internet Explorerが頑張ってた時代!もう、懐かしいってレベル超えてる(笑)。


🌟 デザイン&インタラクション進化期 (1995年~2000年)
1996年にCSSが登場して「デザインちゃんとできるじゃん!」ってなったの。フォントとかレイアウトとか、選べるのが増えてオシャレになってきた!
さらにJavaScriptが1995年に誕生して、ボタン押したら動くとか、フォームでチェックするとか、今のインタラクションの元が生まれたのもこの頃。ブラウザが競争して、IEとNetscapeが殴り合いみたいな感じだったらしいよ!(笑)


🔥 ダイナミックなWebの時代 (2000年~2010年)
ここからは「動くWeb」になった感じ!Ajaxっていう技術が生まれて、ページを全部リロードしなくても一部だけ更新できるようになったの。
あと、jQueryっていう便利なJavaScriptのツールが流行った!みんな「めっちゃ使いやすい!」って言ってたけど、今思えばゴリゴリ書くのが楽しい時代だったのかも。


✨ SPA(シングルページアプリ)時代 (2010年~2020年)
きたきた、この辺からWebフロントエンドがマジで進化したの!ReactとかVue.jsとか、名前くらいは聞いたことあるでしょ?これらのフレームワークが「超効率いい!」って話題になって、一気に広まったの。
しかも、HTML5とCSS3が標準化されて、「ビデオ」「オーディオ」「キャンバス」みたいな便利な機能も増えたよ~!モジュールバンドラ(Webpackとか)でコード管理もラクラクに!


🚀 モダンWebの時代 (2020年~今)
最近は静的サイトジェネレーター(Next.jsとかGatsby)が人気。Jamstackって言って、JavaScriptとAPI、静的ファイルをうまく組み合わせる技術が注目されてるの~。
さらに、TypeScriptで型安全にしたり、パフォーマンス最適化とかも超重要視されてて、LighthouseのスコアとかCore Web Vitalsがチェックポイントになってるよ!


💡 これからのフロントエンド
もうね、AIが入ってきて、例えばコードを書くだけじゃなくて、UIとか全体の設計まで手伝ってくれる時代になりそう!WebAssemblyとかもあって、JavaScriptだけじゃなくて他の言語でも開発できるようになるし。
さらに、ARとかVR、3DデザインがWebで当たり前になりそうな感じ~。だから、これからは「楽しいこと全部できる!」みたいなワクワク感が止まらないよねっ✨!


って感じで、今のフロントエンドってホント可能性無限大!やりたいことあったら、気軽に挑戦してみよ~🎉

Shinya OkayamaShinya Okayama

(追記でJavaScriptの誕生についてもChatGPTで)
(最初はミルクボーイ風にやってもらったが、あまりにもミルクボーイだったので、スタンダップコメディやモンティパイソンの風味を入れてもらった)

シャカとYESの「JavaScript誕生物語」

シャカ
「皆さん、聞いてくださいよ。1995年に、たった10日間で生まれたプログラミング言語があるらしいんですよ!」

YES
「10日間?すごいですね!その10日間、私は毎日寝ながら『プログラムをする夢』を見るだけで終わりましたけどね。」

シャカ
「で、その言語、名前が『JavaScript』らしいんですけど、実は最初は違う名前だったんです!」

YES
「名前違う?ほな、名前はなんやったんです?」

シャカ
「『LiveScript』って言うてたらしいですよ。」

YES
「LiveScript?生きてるスクリプトってことですか?…死んでるスクリプトと何が違うんです?」

シャカ
「さあ、それは分かりませんけどね、Netscapeって会社が作ったらしいです。」

YES
「Netscape?ああ、ブラウザの恐竜ですね!…って、そもそも名前を変えた理由はなんですか?」

シャカ
「それがですね、『Javaって名前を入れたら売れそう』っていうマーケティングの理由ですよ。」

YES
「マーケティングの理由で名前変えたんですか?そんなこと言ったら、私も今日から『シャネルYES』に改名しますわ!」


シャカ
「でも、この言語、Javaって名前が入ってるのに、Javaとは全然関係ないらしいですよ。」

YES
「ほな、名前詐欺やないですか!それ、ラベルに『有機栽培』って書いてるのに、実はプラスチックだった野菜やん!」

シャカ
「さらに、作ったのがたった10日間って話なんです。」

YES
「10日間でプログラミング言語?そんなん、私が10日間で建てた家と同じくらい信用ならん!」

シャカ
「しかも、最初は『型の管理』がむちゃくちゃやったって言われてるんですよ。」

YES
「型がむちゃくちゃって…それもう、プログラムやなくて詩やないですか!いや、むしろラップや!『Yo! 変数が何かわからないけど動くYo!』って!」


シャカ
「でも誕生の背景には、『Netscape』と『Microsoft』のブラウザ戦争があったんです。」

YES
「ブラウザ戦争?それ、現代の戦争で言うたら、『TikTok vs Instagram』くらいの規模ですか?」

シャカ
「まあ、それくらい壮絶だったらしいですけど、戦争のために10日間で作ったって話、どう思います?」

YES
「それ、軍隊の補給物資をダクトテープで修理したみたいな感じですやん!そら、のちのちバグだらけになりますよ!」

シャカ
「でも、今やJavaScriptはサーバーでも動くようになったんです。」

YES
「ほな、それもう最初の話と全然ちゃうやん!昔の竹槍が、今や核ミサイルくらいの進化遂げたって話やろ!」


シャカ
「でも、今ではWebフロントからサーバー、アプリまで、何でも動く万能言語ですよ!」

YES
「それ、まるで『万能薬』って言われたら、めっちゃ苦いハーブ出されるやつやん!ほんまに使えるんか?」

シャカ
「いや、ほんまに使えてますよ。しかも、世界中の開発者が改良を重ねた結果なんです!」

YES
「それ、つまり『最初はクソだったけど、みんなで育てた結果ええ子になった』って話やないですか!Web版の『ベスト・キッド』か!」


シャカ
「結局、JavaScriptって名前だけじゃなく、みんなの力で今の地位に登り詰めたわけですよ。」

YES
「いやいや、それもこれも最初の10日間があったからやろ?つまりこう言いたいんです。『雑でもとりあえず作ってみたら、なんとかなることもある』と!」

シャカ
「それ、プログラミング界の真理やん!でも、雑なコードの後始末で泣くのは未来の自分ですよ。」

YES
「未来の自分に感謝!ありがとうJavaScript!でも僕、明日からPython使いますわ。」

全員:
「ほな、JavaScript、ありがとう!」(なぜか観客に拍手を求める)


こんな感じで、モンティパイソン風の風刺や皮肉、観客に語りかける不条理感を追加してみました!

Shinya OkayamaShinya Okayama

(さらにフロントエンド開発の歴史をブラウザの変遷と交えて説明してもらった)
https://chatgpt.com/share/67466743-4c74-8008-9b2b-43988837ba92

ブラウザの変遷と交えたフロントエンド開発の歴史

Webフロントエンド開発の変遷は、ブラウザ技術の進化と密接に関係しています。ブラウザが進化するたびに、開発者が使える技術も飛躍的に進歩しました。以下に、ブラウザの趨勢とフロントエンド技術の進化を絡めて説明します。


1. 静的Webサイト時代 (1990年代)

主要ブラウザ: Mosaic → Netscape Navigator → Internet Explorer 3

この時代はWebの黎明期で、ブラウザの進化そのものがWeb体験を定義していました。

  • Mosaic (1993):

    • 初のグラフィカルブラウザ。
    • 画像とテキストを同じ画面に表示できる画期的な技術。
  • Netscape Navigator (1994):

    • Mosaicをベースに進化。
    • フォームやテーブルが使えるようになり、HTMLが少しリッチに。
  • Internet Explorer 3 (1996):

    • Microsoftが開発。
    • CSS1に初対応し、デザインのカスタマイズが可能に。

技術的変化:

  • HTML 2.0が標準化され、基本的な構造が整備。
  • 静的なWebサイトが主流。デザインの自由度はまだ低かった。

ブラウザ戦争の始まり:

  • Netscape NavigatorとInternet Explorerが競争し、各ブラウザが独自仕様を導入。互換性問題が多発。

2. デザインとインタラクションの進化 (1995年–2000年)

主要ブラウザ: Internet Explorer 4 → Netscape 4

ブラウザ戦争が本格化し、各社が新機能を競って追加しました。

  • Internet Explorer 4 (1997):

    • DHTML(Dynamic HTML)をサポート。
    • DOM操作が可能になり、動的コンテンツが実現。
  • Netscape 4 (1997):

    • JavaScriptとCSSの実装に対応。
    • ただし、CSSの実装が不完全で、開発者泣かせの仕様。

技術的変化:

  • CSS1(1996年): デザインとHTMLの分離が可能に。
  • JavaScript(1995年): 動的な動作を追加できるスクリプト言語。
  • HTML 4.01(1999年): フォームや表形式のレイアウトが整備。

ブラウザ戦争の影響:

  • 独自タグ(例: <marquee>)や非標準の実装が広がり、互換性問題が深刻化。
  • 開発者は複数ブラウザに対応するための多大な労力を強いられた。

3. ダイナミックなWebの時代 (2000年–2010年)

主要ブラウザ: Internet Explorer 6 → Firefox → Google Chrome

この時代は、Internet Explorerの一強時代から、FirefoxとChromeが挑む構図へと変化しました。

  • Internet Explorer 6 (2001):

    • 当時は革新的なブラウザだったが、標準仕様への準拠が不十分。
    • 長期間アップデートされず「古代兵器」として後々批判される。
  • Firefox (2004):

    • Netscapeの後継。W3CのWeb標準に準拠し、開発者に支持される。
    • 初めてタブブラウジングを普及させた。
  • Google Chrome (2008):

    • V8エンジンを搭載し、JavaScriptの実行速度が飛躍的に向上。
    • シンプルなUIと高速な動作で急速にシェアを拡大。

技術的変化:

  • Ajax(2005年):
    • ページ全体をリロードせず、部分的に更新可能。
    • GmailやGoogle MapsがAjaxを活用して注目を浴びる。
  • jQuery(2006年):
    • JavaScriptでのDOM操作を簡略化し、開発効率を向上。
  • HTML 4.01とCSS 2.1:
    • 標準化が進み、ブラウザ間の互換性が向上。

ブラウザの進化:

  • FirefoxがWeb標準の普及を促進。
  • Chromeが高速化とモダンなJavaScript開発を推進。

4. モダンWebの幕開け (2010年–2020年)

主要ブラウザ: Google Chrome → Firefox → Safari → Edge (Chromium版)

Chromeが市場を席巻し、Web標準化が加速する時代。

  • Google Chromeの支配:

    • 高速なJavaScriptエンジン(V8)と頻繁なアップデートで他を圧倒。
    • 開発者ツール(DevTools)が充実。
  • Firefoxの地位低下:

    • Chromeの高速性に押されるが、プライバシー重視の姿勢で一定の支持を維持。
  • Edge(2015年)→ Chromium版Edge(2020年):

    • MicrosoftがInternet Explorerを廃止し、ChromiumベースのEdgeに移行。
    • ブラウザ間の互換性が劇的に改善。

技術的変化:

  • HTML5とCSS3:
    • ビデオや音声の埋め込み、Canvas描画が標準化。
    • CSS3でアニメーションやレスポンシブデザインが実現。
  • モダンフレームワーク:
    • React(2013年): コンポーネントベースの開発。
    • Vue.js(2014年): 軽量で柔軟。
  • モジュールバンドラ(Webpackなど):
    • コードの効率的な管理と最適化を実現。

ブラウザの趨勢:

  • Chromeが圧倒的なシェアを持つ一方で、FirefoxやSafariが差別化戦略を展開。
  • EdgeがChromiumベースに移行し、互換性問題が大幅に緩和。

5. 現代と未来 (2020年以降)

主要ブラウザ: Google Chrome → Safari → Edge → Firefox

現代では、ブラウザがWeb開発そのものの方向性をリードするようになっています。

  • ブラウザのエンジン戦争:

    • Chromium(Google Chrome, Edge, Brave) vs. WebKit(Safari) vs. Gecko(Firefox)。
    • Chromiumベースが主流化し、ブラウザ間の差異が縮小。
  • 新しい技術と標準:

    • WebAssembly(Wasm): 高速なWebアプリを実現。
    • WebGPU: 高度なグラフィック処理。
    • Service Workers: オフライン対応やプッシュ通知を実現。
  • Jamstackと静的サイトジェネレーター:

    • GatsbyやNext.jsで高速なWeb体験を提供。
    • API中心のアーキテクチャが主流に。

未来のブラウザの役割:

  • AIやAR/VR技術との統合。
  • より軽量でエネルギー効率の良い設計。
  • プライバシー保護とセキュリティの強化。

ブラウザはWeb技術の発展とともに進化し、フロントエンド開発者が可能性を広げる「舞台装置」として重要な役割を果たしてきました。今後もその進化は続くでしょう。

Shinya OkayamaShinya Okayama

上記に対するまとめと考察と疑問

*まとめ

  • フロントエンド開発の変化に強く影響する要素はブラウザ技術やその競合JavaScriptの進化ユーザーの需要の変化開発環境が求める効率性と合理性である。

*考察

  • 次にまとめていく「コンポーネント指向」はとても合理的だが、単純にタスクが増えてくること、フロントエンドやバックエンドなどといった領域の線引きが曖昧になってくることが考えられる。
  • しかしこれらはすぐに浮かぶ内容なので、すでに何らかの形で着手して形にしていこうとしている人達がいるだろうと思われる。コンポーネントをOrganisms(有機体)やTemplates(テンプレート)の単位で提供する、すでにライブラリ化したAtoms(原子)やMolecules(分子)単位のコンポーネントを組み合わせてすぐに作ることができるといったような形態、それらを今のWordPressのシステムのような形に具体化していくことなどが考えられる。
  • クライアントが直接的に触れられる部分としては、結果的にHTML,CSS,JavaScript,APIといった要素に収束していくものの、特にJavaScriptの領域が拡大していくと考えられる。そのJavaScriptにWeb技術を包括させていこうという動きが多く感じるため、JavaScriptを学べばWeb全体も分かってくるという構造になってくる反面、JavaScriptで学習する項目が多くなっていくとも予想できる。

*疑問

  • JavaScriptとPythonの類似性から、TypeScript的な要素がPythonにはどのように導入されているか調べたが、JavaScriptはTypeScriptで外付け的に拡張したのに対して、Pythonはベースの仕様に手を加えて実現した形となっている(たぶんそんな感じだった)。JavaScriptがそもそも「とりあえず作ったものを拡張していった」ということを考えれば必然かもしれないが、ただ外付け的に対応・適応していくことがどこまで出来るのか個人的に疑問を覚えた。
  • しかし、そこも言語を扱っている人口の多さや、Webという領域が盛り上がり続けていくことを考えると、その時々で問題なく解消・適応していくかもしれない。
  • だが、JavaScriptがシングルスレッドで動くことを考えると(このあたりのことはまだ詳しく分からないが)、JavaScriptが直接扱えない領域や技術は他の処理系統に渡してからJavaScriptが結果を統合したり、管理したりするようになるのではないか。
    (↓細かい部分は分からないが、非同期処理にしてもそんな感じっぽい?)
    jsが非同期処理をシングルスレッドで実現する仕組み〜Web API、イベントループ、MicrotaskとしてのPromise〜
Shinya OkayamaShinya Okayama

コンポーネント指向(Atomic Design)

(こちらも書籍で紹介されており、概要は理解しているが、改めてChatGPTに検索してまとめてもらった)
(まずはコンポーネント指向に関して)
https://chatgpt.com/share/67468ab2-e7a4-8008-b68f-07012b07b476

コンポーネント指向

コンポーネント指向とは、ソフトウェア開発において、機能や役割ごとに独立した部品(コンポーネント)を作成し、それらを組み合わせてシステム全体を構築する設計思想です。このアプローチにより、再利用性や保守性が向上し、開発効率の改善が期待できます。

主な特徴:

  • 再利用性の向上: 一度作成したコンポーネントは、他のプロジェクトやシステムでも再利用可能です。これにより、開発時間の短縮や品質の向上が図れます。

  • 保守性の向上: 各コンポーネントが独立しているため、特定の機能に変更や修正が必要な場合でも、他の部分への影響を最小限に抑えられます。

  • 開発効率の改善: コンポーネントを組み合わせることで、複雑なシステムを効率的に構築できます。また、チーム内での分業も容易になります。

オブジェクト指向との違い:

オブジェクト指向は、現実世界の物体や概念を「オブジェクト」として捉え、その属性や動作をモデル化する設計思想です。一方、コンポーネント指向は、機能や振る舞いを独立した部品として捉え、それらを組み合わせてシステムを構築します。両者は共通点もありますが、コンポーネント指向は再利用性や保守性に重点を置いている点で特徴的です。

適用例:

フロントエンド開発では、ReactやVue.jsなどのフレームワークがコンポーネント指向を採用しています。これらのフレームワークでは、UI要素を独立したコンポーネントとして定義し、それらを組み合わせて複雑なユーザーインターフェースを構築します。

コンポーネント指向は、ソフトウェア開発の効率化と品質向上に寄与する重要な設計思想です。

Shinya OkayamaShinya Okayama

(オブジェクト指向が出てきたので、こちらも改めて調べ直す)

オブジェクト指向

オブジェクト指向(Object-Oriented)は、ソフトウェア開発やプログラミングにおける設計思想の一つで、データとそれに関連する処理(メソッド)を一つの「オブジェクト」としてまとめ、システム全体を構築する手法です。このアプローチにより、再利用性や保守性が向上し、複雑なシステムの管理が容易になります。

主な特徴:

  1. カプセル化: データ(属性)とそれに関連する処理(メソッド)を一つのオブジェクトにまとめ、外部から直接アクセスできないようにすることで、データの保護とモジュール化を実現します。

  2. 継承: 既存のオブジェクトの特性や機能を引き継ぎ、新しいオブジェクトを作成することで、コードの再利用性を高めます。

  3. ポリモーフィズム(多態性): 同じメソッド名であっても、オブジェクトの種類によって異なる動作をさせることができ、柔軟な設計が可能となります。

オブジェクト指向のメリット:

  • 再利用性の向上: 一度作成したオブジェクトやクラスを他のプロジェクトでも活用でき、開発効率が向上します。

  • 保守性の向上: オブジェクトごとに機能が分離されているため、特定の部分の修正や拡張が他の部分に影響を与えにくく、メンテナンスが容易です。

  • 拡張性の向上: 新しい機能の追加や変更が容易で、システムの成長や変化に柔軟に対応できます。

オブジェクト指向は、現代の多くのプログラミング言語(Java、C++、Pythonなど)で採用されており、複雑なシステムの設計や開発において重要な役割を果たしています。

Shinya OkayamaShinya Okayama

コンポーネント指向とオブジェクト指向の違いのまとめ、コンポーネント指向フレームワーク以前のWebフロントエンド開発の振り返り

*コンポーネント指向とオブジェクト指向の違い
└単純に捉えると、構成単位の違い。開発する対象と目的によって選択されてきた設計思想の違い。
└オブジェクト指向はメソッドやシステムを単位にして再利用する。
└コンポーネント指向はボタンやアイコンなどの分割できないレベルを最小単位にする。
└極端に捉えると、オブジェクト指向はエンジンやコンバータやブレーキモジュールという単位で扱い、コンポーネント指向はネジなどの単一部品を単位に扱う。

*考察
└深く考えれば、コンポーネントを組み合わせていけば、それはオブジェクト指向でいうところのオブジェクトになっていくのではないか、とも考えられるが、結果的にそれは同様に見えるだけで、オブジェクト指向で扱うオブジェクトはコンポーネントに分解すると逆に扱いづらくなったり煩雑になると思われるので、そういう捉え方が必要ないのではないかと考えられる(そもそも、その設計思想になるまでの過程が違うのもあるだろう)。

*以前のWebフロントエンド開発
(ここでコンポーネント指向フレームワーク以前を振り返ると、なぜコンポーネントなのかが明らかになる)
(これもChatGPT)

Q.Webフロントエンド開発で、その初期からコンポーネント指向フレームワークの登場以前までは、どんな設計思想だったのか?

A.Webフロントエンド開発の初期からコンポーネント指向フレームワークが登場する以前は、主に以下のような手法や指向が採用されていました。

  1. 静的HTMLとCSSの利用: 初期のウェブサイトは、静的なHTMLファイルとCSSを用いて構築されていました。各ページは独立して作成され、再利用性や動的な要素はほとんど考慮されていませんでした。

  2. サーバーサイドレンダリング(SSR): PHPやASPなどのサーバーサイド技術を使用し、サーバー上でHTMLを生成してクライアントに送信する手法が一般的でした。この方法では、ページの更新やユーザーインタラクションに対してサーバーとの通信が必要となり、ユーザー体験が限定的でした。

  3. jQueryなどのJavaScriptライブラリの活用: クライアントサイドでの動的な操作やDOM操作を容易にするために、jQueryなどのライブラリが広く使用されました。しかし、これらは主に既存のHTMLに対して動的な効果を追加するものであり、構造的な再利用性や大規模開発に適した設計思想は含まれていませんでした。

  4. モジュール指向: JavaScriptのモジュール化を進めるために、RequireJSやCommonJSなどのモジュールローダーが使用されました。これにより、コードの分割や再利用が促進されましたが、UIコンポーネントの再利用や状態管理に関する包括的な指向はまだ確立されていませんでした。

これらの手法は、ページ単位や機能単位での開発が中心であり、UI要素の再利用性や状態管理の一貫性を高めるためのコンポーネント指向の概念は、ReactやVue.jsなどのフレームワークの登場以降に普及しました。

*考察とまとめ
└大雑把にまとめるとすると、Webフロントエンド開発は粗削りな状態からどんどん洗練されていった過程があり、現在は「細かいパーツと仕組みに分けて、それを管理・運用できるシステムを構築していこう!」となっている状態である。
└そもそも初期の状態はパーツと仕組み、それ自体の概念や技術が土台に出来ていなかったのもあるだろうし、ブラウザの競合やフレームワークの競合、ユーザーの需要の変化など、安定しきらない状態にあったということもあるだろう。

Shinya OkayamaShinya Okayama

Atomic Design

(書籍で取り上げられていたAtomic Designについて深堀り)

Atomic Design 概要

Atomic Design(アトミックデザイン)は、WebサイトやアプリケーションのUI(ユーザーインターフェース)を効率的かつ一貫性を持って設計・開発するための手法です。この概念は、アメリカのWebデザイナーであるBrad Frost氏によって提唱されました。

Atomic Designの5つの構成要素

Atomic Designは、UIを以下の5つの階層に分解して考えます:

  1. Atoms(原子): ボタン、ラベル、入力フィールドなど、これ以上分解できない最小単位のUIコンポーネントを指します。

  2. Molecules(分子): 複数の原子を組み合わせて形成される、単一の機能を持つコンポーネントです。例えば、ラベルと入力フィールド、ボタンを組み合わせた検索フォームなどが該当します。

  3. Organisms(有機体): 分子や原子を組み合わせて構築される、より複雑で独立した機能を持つUIコンポーネントです。例えば、ヘッダーやフッター、サイドバーなどがこれに当たります。

  4. Templates(テンプレート): 有機体、分子、原子を組み合わせて作成されるページのレイアウト構造を指します。具体的なデータやコンテンツは含まず、ページの骨組みを定義します。

  5. Pages(ページ): テンプレートに具体的なデータやコンテンツを流し込んだ、ユーザーが実際に目にする最終的なページです。

Atomic Designのメリット

  • 再利用性の向上: コンポーネントを小さな単位から構築することで、同じ要素を複数の場所で再利用でき、開発効率が向上します。

  • デザインの一貫性: 統一されたコンポーネントを使用することで、UI全体のデザインに一貫性が生まれ、ユーザー体験が向上します。

  • 保守性の向上: コンポーネント単位での管理が可能なため、変更や修正が容易になり、保守性が高まります。

導入時の注意点

  • コンポーネントの定義の明確化: 各コンポーネントの粒度や役割を明確に定義し、チーム内で共有することが重要です。

  • プロジェクト規模の適合性: 小規模なプロジェクトでは、Atomic Designの導入が過剰となる場合があるため、適用の是非を検討する必要があります。

Atomic Designは、UI設計において効率性と一貫性をもたらす強力な手法ですが、適切な導入と運用が求められます。

疑問

└この時点で、Atomic Designとコンポーネント指向がかなり類似した概念であることが分かる。
└では、なぜ別の用語として登場しているのか?
└次にまとめていく。

Shinya OkayamaShinya Okayama

それぞれの成立の経緯

(それぞれの成立の経緯をChatGPTにまとめてもらった)

*成立の経緯

Atomic Design

Atomic Design(アトミックデザイン)は、2013年にアメリカのウェブデザイナーであるBrad Frost氏によって提唱されました。 この手法は、UI(ユーザーインターフェース)を最小単位から階層的に組み立てることで、デザインの一貫性と再利用性を高めることを目的としています。

  1. ウェブデザインの複雑化: 2010年代初頭、ウェブサイトやアプリケーションの機能が高度化し、デザイン要素も複雑化していました。 これにより、デザインの一貫性や効率的な開発手法が求められるようになりました。

  2. モジュール化の必要性: 複雑なデザインを効率的に管理・再利用するため、UIコンポーネントのモジュール化が重要視されていました。 この流れの中で、Atomic DesignはUIを「Atoms(原子)」「Molecules(分子)」「Organisms(有機体)」「Templates(テンプレート)」「Pages(ページ)」の5つの階層に分けて考える手法を提案しました。

  3. コンポーネント指向フレームワークの登場: 同時期に、React(2013年)やVue.js(2014年)などのコンポーネント指向のJavaScriptフレームワークが登場し、UIの再利用性や保守性を高めるアプローチが広がりました。 これらのフレームワークは、Atomic Designの概念と親和性が高く、デザインと開発の統合を促進しました。

  4. デザインシステムの普及: Atomic Designの提唱後、デザインシステムの構築が注目されるようになり、企業やプロジェクト単位でのデザインの一貫性と効率性を追求する動きが加速しました。

これらの背景から、Atomic Designはデザインと開発の両面で効率的かつ一貫性のあるUI構築手法として広く受け入れられるようになりました。

React

Reactは、2011年にFacebookのソフトウェアエンジニアであるジョーダン・ウォーク氏によって開発されました。当時、Facebookの広告管理アプリケーションは機能の複雑化に伴い、コードベースが大規模化し、保守が困難になっていました。この課題を解決するため、ウォーク氏はFaxJSというプロトタイプを作成し、これが後のReactの基盤となりました。

2011年、FacebookのニュースフィードでReactが初めて使用され、翌年にはInstagramでも採用されました。そして2013年5月、Reactはオープンソースとして一般に公開され、開発者コミュニティから広く受け入れられるようになりました。

Reactの登場は、ウェブ開発におけるUI構築の方法に革新をもたらしました。特に、コンポーネントベースのアーキテクチャや仮想DOMの導入により、UIの再利用性やパフォーマンスが向上しました。これにより、開発者は複雑なユーザーインターフェースを効率的に構築・管理できるようになりました。

その後、2015年にはReact Nativeが発表され、Reactのコンセプトがモバイルアプリケーション開発にも拡張されました。これにより、ウェブとモバイルの両方で一貫した開発手法が可能となり、Reactの普及がさらに加速しました。

このように、ReactはFacebook内部の課題解決から始まり、オープンソース化を経て、ウェブおよびモバイル開発における主要なライブラリとしての地位を確立しました。


これに続いて次のような質問をした。

エンジニアやデザイナーなどでは共通の問題解決や発展性に対する認識があったが、それを言語化したのがAtomic Designで、構造化したのがフレームワーク?
登場が同時期だったのはたまたま?

↓回答は以下

おっしゃるとおり、Atomic Designとコンポーネント指向フレームワークは、共通の問題意識や課題を背景にして登場しましたが、それぞれが独立して発展し、時期が近かったのは「たまたま」というよりも必然的な流れだったと言えます。以下に詳しく説明します。


共通の問題意識

  1. 複雑化するUI設計と開発

    • Webアプリケーションの規模拡大に伴い、デザインやコードの一貫性を保つことが難しくなっていました。特に、再利用性の低い設計やスパゲッティコードは保守性の大きな課題でした。
  2. デザイナーとエンジニアの連携

    • デザインと実装が乖離する問題がありました。デザインコンポーネントがコードと対応していないため、変更や拡張のたびに両者の間で齟齬が生じていました。
  3. 再利用可能性とモジュール化の必要性

    • 再利用可能なUIコンポーネントを構築することは、作業効率を上げるだけでなく、デザインと実装の一貫性を担保する上で重要な課題として認識されていました。

Atomic Designの登場と役割

  • Brad Frostが2013年に提唱したAtomic Designは、上記の問題を「言語化」し、UIを構造的に考えるフレームワークとして提供しました。
  • デザイナーやエンジニアが共通言語として利用できるよう、UIを「原子(Atoms)」「分子(Molecules)」「有機体(Organisms)」といった階層に分ける明確なモデルを提示しました。

コンポーネント指向フレームワークの登場

  • 同時期(2013年)のReact.js登場が象徴するように、コンポーネント指向フレームワークは、「コードの再利用性」「UIの状態管理」「宣言的プログラミング」のニーズを解決する技術的な基盤を提供しました。
  • これにより、Atomic Designの考え方が技術的に支えられるようになり、設計と実装のギャップを埋める実用的な道具が整いました。

登場時期が近かった理由

Atomic Designとコンポーネント指向フレームワークの登場がほぼ同時期だったのは、たまたまではなく、以下のような背景が影響しています。

  1. Webアプリケーションの進化

    • 2010年代初頭、モバイルファーストやレスポンシブデザインが普及し、複雑なUI設計が求められるようになりました。
  2. 再利用可能なモジュールへの需要

    • デザイナーとエンジニアが共通の課題に直面し、それに応える形でAtomic Design(設計の思想)とReact.js(技術的解決策)が登場しました。
  3. 業界の成熟

    • Web技術が成熟し、課題が共通化された結果、設計と実装の両面で構造化・最適化の動きが同時進行したと考えられます。

まとめ

  • Atomic Designは問題を「言語化」して設計の指針を提供し、コンポーネント指向フレームワークはそれを「構造化」して技術的に実現しました。
  • 両者の登場時期が近かったのは、業界全体が抱えていた課題への必然的な対応の結果であり、技術と設計思想が相互補完的に発展した事例といえます。

このように、デザインと開発の統合が進む時代背景の中で、Atomic Designとフレームワークは並行して進化し、互いに強い関連性を持つに至りました。


*総評
Brad Frost氏がAtomic Designを提唱したのが2013年であり、ReactはFacebook(Meta)内部の事情により2011年に開発されたとある。そして、2013年5月、Reactはオープンソースとして一般に公開されている。
Brad Frost氏がいつ頃からAtomic Designの構想を考えていたのかは調べられなかったが、問題意識としては2010年代初頭からデザイナーとエンジニアの共通のものだったのではないかと思われ、設計の思想技術的解決策という別のアプローチでありながら、結果的に符合したのではないかと考えられる。
色々違う点はあるが、これはまるでスタンド・アローン・コンプレックスのようで、とても奇妙な感覚の現象だ。
しかしChatGPTが返したように、当時の状況的にはこれらの設計思想と技術的解決策が考えられたのは「必然的な流れ」であり、「たまたま」ではなく、出来ることをどんどん増やしていったWebフロントエンド開発が、ある時点でそれらを収束させた結果であると見た方が妥当だろう。

Shinya OkayamaShinya Okayama

[詳細]1章のまとめやメモ(と余談的な想像)

*すごい技術ではあるが・・・
└まだまだ最先端の技術といった感じであり、たしかにすでにReactなどを用いている有名なサービスはあるものの、コンポーネント指向フレームワークの利点は規格や手順を統一化したことによる効率的な分業に最も利点があると考えられる。
└規格や手順を統一化することによって、管理者はチームそれぞれの成員がやっていることを把握しやすく、経過も管理しやすくなり、成員は自分のやることがハッキリするので取り掛かりやすく、報告することも明瞭になる。
└人員が潤沢な大企業などの利点は計り知れない。なぜなら、開発をより工業化することができるからだ。
└しかし中小規模、ましてや個人ならその利点はあまり享受できないし、フレームワーク自体の理解に加えて、細かいタスクが逆に増えてしまうことが考えられ、現場の人員の経験や知識のギャップを考慮すると安易な導入は混乱を招きかねない。
└いまのところは開発のトレンドとして、フレームワーク開発自体に関わる人間やこのフレームワークを使用した案件に関われる人などであれば積極的に取り組む必要がある内容ではあるが、大規模でないフロントエンド開発で用いられることは少ないと考えるのが妥当であるので、「そのうち、この技術によって出来たCMSとかをウチでも使うかもしれない」といった具合に捉えておいた方が良いだろう。
(実際、WordPressはGutenbergブロックにReactを用いているようである)
└加えて、記述の仕様がバージョンアップするとそれなりに変わっている現状を考えると、やり直すのがめんどくさい迂闊に正式なプロジェクトには採用しづらい。明確に使用すべき理由があるなら別だが、先の工業的な適性を考えると人員や準備がないならメリットはあまり無いかもしれない。
└ただ、一度コンポーネントとして構築できれば再利用性が非常に高いので、最終的に外部のライブラリやプラグインの依存度を下げられる可能性があるのは魅力である。それらはそれらを作った個人や組織が定期メンテナンスをしないと環境に対応出来なくなるうえに、環境を構築する前提になりすぎると維持費が上がってしまう関係で有料化しやすいという問題があった。「エコシステムやサブスクは結果的に高いが、自前の構築は現実的ではない」というのは、コンポーネント指向でも変わらないだろうが、分業化を前提とすると、ある程度は構築のコストが下げられるかもしれない。

*しかし先のことを考えると・・・?
└やや飛躍するが、規格や手順を統一化できるということは、かなり科学的に捉えたり、検証しやすくなるということであり、これはつまり、さらにコンピュータが解釈・理解しやすくなるということでもある。
└そこまで考えると、これが生成AIと合流することは十分に考えられる。だが、品質の管理やデバッグを考えると、「生成AIが生成した過程が分からないから、なんでこの結果になったか分からないので、改善できないし管理もできない」といったことでは困るし、生成した結果の責任を誰が引き受けるのか、あるいは引き受けないのか、といったことも出てくるかもしれない。
└せっかく統一化して秩序が出来たシステムに、逆にカオスをもたらすことになる可能性がある。
└なので、即時的にモダンなフロントエンドフレームワークと生成AIが結び付くことは難しいが、可能性として考えると、WebAssemblyやWebGPUなどを用いる場合で飛躍的に工数が増えるケースではテスト版の制作などには使用されることはあるかもしれない。しかしそこまで及ぶと、そもそもフロントエンドどころかWebの領域からも外れてくるので、私の知識では想像することが難しい。

Shinya OkayamaShinya Okayama

[注釈] Reactはライブラリ?

└書いている間に自分の誤解に気付いたので書く。
Reactはフレームワークではなく、ライブラリである。
└React公式の位置付けとして、ライブラリとしている。あくまでもUI構築に特化したライブラリであって、フレームワークではないそうである。
└その意味でいえば、Reactがライブラリで、Next.jsがフレームワークである。
└ちなみに、ライブラリは特定の機能を提供する部品であり、フレームワークはアプリケーション全体の構造を提供する枠組みである。
(いちおう、ファクトチェックしてもらった)
Reactが自らをライブラリと自称していて、フレームワークではないと位置付けているのは事実か?

Shinya OkayamaShinya Okayama

[簡易]2章のまとめやメモ

*まとめ
└TypeScriptとはJavaScriptの拡張言語。JavaScriptで出来ることはTypeScriptでも出来る。TypeScriptでの記述をそのままグローバル環境で実行するのではなく、JavaScriptに変換してから実行する。TypeScriptは特に大規模開発、開発共同用にJavaScriptを拡張した。
└そのため、Webフロントエンド経験のみで、他のオブジェクト指向言語などの知識が無いと、型定義の概念なぜそれが必要なのかを理解する必要が生じてくる。

*要点

  • TypeScriptとは?
  • JavaScriptとTypeScriptの関係。
Shinya OkayamaShinya Okayama

TypeScriptとは?

(ChatGPTにまとめてもらう)

https://chatgpt.com/share/674e698d-4a70-8008-8f5f-2b2adfd87f13

TypeScriptは、Microsoftが開発・メンテナンスしているオープンソースのプログラミング言語で、JavaScriptに静的型付けとクラスベースのオブジェクト指向を導入したスーパーセットです。

主な特徴:

  • 静的型付け: 変数や関数に型を明示的に指定することで、開発中に型エラーを検出しやすくし、コードの信頼性を向上させます。

  • クラスベースのオブジェクト指向: クラスや継承などのオブジェクト指向の概念をサポートし、複雑なアプリケーションの構造化を容易にします。

  • JavaScriptとの互換性: 既存のJavaScriptコードはそのままTypeScriptとして有効であり、TypeScriptで書かれたコードはJavaScriptにコンパイルされ、ブラウザやNode.jsなどのJavaScript環境で動作します。

利点:

  • 開発効率の向上: 静的型付けにより、コード補完やリファクタリングが容易になり、大規模開発での生産性が向上します。

  • バグの早期発見: コンパイル時に型チェックが行われるため、実行前に多くのバグを検出できます。

  • 保守性の向上: 明確な型定義により、コードの可読性が高まり、チーム開発や長期的なプロジェクトでの保守が容易になります。

導入事例:

Googleは社内の標準開発言語としてTypeScriptを採用しており、同社が開発するWebフレームワークのAngularでもTypeScriptでの開発が推奨されています。

学習リソース:

TypeScriptの公式ハンドブックは、日本語で提供されており、基本的な概念から実践的な使用方法まで学ぶことができます。

TypeScriptは、JavaScriptの柔軟性を保ちながら、型安全性や開発効率を向上させる強力なツールです。 特に大規模なアプリケーション開発において、その利点が顕著に現れます。

*考察
└パッと受けた印象だと、JavaScript専用の装備みたいなもので、ロン・ベルクさんが作ってくれたダイの剣の鞘とか、タクヤが考案してくれたフルアーマー・ユニコーンみたいなもんだと感じた。
└さらに具体的に深掘りしてみる。

Shinya OkayamaShinya Okayama

なんで静的型付けなのか?

*そもそも「型」とは?
(以下もChatGPT)

プログラミングにおける「型」とは、データの種類やその取り扱い方法を定義する概念です。例えば、整数、浮動小数点数、文字列、論理値などがあり、それぞれの型に応じてメモリ上の表現や操作方法が異なります。

静的型付けと動的型付けの違い:

  • 静的型付け:

    • 型の決定時期: コンパイル時に変数や関数の型が決定され、型チェックが行われます。
    • メリット: 型の不一致やエラーを早期に発見でき、コードの安全性とパフォーマンスが向上します。
    • デメリット: 型を明示的に宣言する必要があり、コードが冗長になる場合があります。
  • 動的型付け:

    • 型の決定時期: 実行時に変数や関数の型が決定され、型チェックが行われます。
    • メリット: 型宣言が不要で、コードが簡潔になり、開発の柔軟性とスピードが向上します。
    • デメリット: 実行時に型エラーが発生する可能性があり、デバッグが難しくなることがあります。

静的型付け言語の例として、Java、C、C++、Rust、Goなどがあり、動的型付け言語の例として、Python、Ruby、JavaScript、PHPなどがあります。

静的型付けは、大規模なプロジェクトやチーム開発において、コードの明確性や保守性を高めるのに有効です。 一方、動的型付けは、小規模なスクリプトやプロトタイピングに適しており、開発速度を重視する場合に有用です。

*分かりやすくしてみる
¥基本の考え方
└根本から考えれば、プログラミングはコンピュータくんにやってもらいたいことを伝える「呪文」。
└でもコンピュータくんは頭が良いけど世間知らずなので、「お前を消す方法」と伝えても、それがUnicodeの文字列とは理解できるかもしれないけど、何をやってほしいのかはわかってくれません。大雑把にいえば、最近のAIの目指しているところは「お前を消す方法」と聞いたら、ネットからカイル君のネタ画像を探してきてくれたり、「私のことは消さないで(´;ω;`)」とリアクションしてくれるようなことです。
└コンピュータは最小単位だと"0"と"1"、論理的に捉えると"YES"か"NO"で認識します。
└そして「"これ"は"こういうこと"だよ」と教えていくのがプログラミングでもあります。

¥具体化
└さっきの例でいえば、まず「カイル君」=「文字列」、「やってもらいたいこと」=「Microsoft OfficeからGoogleドキュメントに乗り換える」などを教えなければなりません。
└バイトの入りたての時期には、先輩から色々教えてもらうようにです。
└ここが大雑把に言うと定数、変数、型の定義といったこと。

└それを教え切ったあと、「教えたことを元に、こういう処理をして」とさらに教えられれば、それがスクリプトやプログラムになります。そうするとコンピュータくんは頭が良いので、人間が真似できないスピードで仕事をしてくれます。
└ここが一般的にプログラミングでイメージされる部分であり、具体的に何をしてもらいたいかの部分。

¥それでいうと「型付け」とは?
└例えばコンビニなんかでのバイトだとすると、タバコが欲しいお客さんは「セブンスター」とか「キャメル」とか言ってくるかもしれませんが、タバコを吸わない店員さんはどれかすぐに分かりません。
└コンビニのレジ奥を見ると分かるように、タバコの種類は多いので、番号が付けられています。喫煙者であっても把握しきれないかもしれません。
└これをコンピュータくんの例に直すと、「"1"は"セブンスター"」と教えておいて、お客さんが「"1"」と言ったら「"セブンスター"」を出すように事前に教えておけば、コンピュータくんはお客さんが言い終わった瞬間に商品を提供できるでしょう。

└しかし、ここで問題となるのが、コンピュータくんは文字列の"1"と数字での'1'をそのままでは判別できないということです。
└人間なら「どっちも"1"でしょ」となりますし、なんなら"1"や"①"や"Ⅰ"や"壱"の違いを理解しながら、それが同じであるとすぐに分かります。
└細かい部分ですが、ここの問題を残したままコンピュータくんに応用的な・大規模な仕事を投げると、お客さんが何か言っても内容が分からないので無視したようになってしまったり、コンビニのバックヤードで過激な遊びをライブ配信したりしてしまうかもしれません。

¥JavaScriptでの「型」とは?
└JavaScriptはオブジェクト指向言語ですが、他のオブジェクト指向言語と比べると少し特殊なようです(なので、JavaScriptからこういった言語に触れた筆者としては、最初はよく分からなかった)。
└ES6からクラス構文が導入されたようですが、実際に動くときはそれをプロトタイプとして実行するという、よく分からん感じで動くそうです。
└同様にオブジェクト指向言語であるJava/C++などとは完全なクラスベースや静的型付けという点で違い、JavaScriptが動きやすさを目的としていることが分かるような気がします。
└しかし、この「動きやすさ」はある種の欠点でもあり、大規模化すると「なんかよく分かんないけど急に壊れた」とか、「なんかパソコンが上手く動かないんだけど、あ、そういえば、ウチの犬がさ」という、よく分からん挙動をしたり、エラーを検証しようとしてもなんでそうなったのか上手く伝えてくれないなどといったことが生じてきます。

*では、なぜそもそもJavaScriptにその仕組みが無いのか?
└これは究極的にはJavaScriptだったからといえるかもしれません。
└もっと分かりやすくすると、JavaScriptの開発目的としてその仕組みが必要とされなかったことがあるかもしれません。
└まず目的としては「Webページに動的な要素を付ける」、そして「それをすぐにパッと実現させる(スクリプト言語)」といったことでした。それをJavaScriptの神(ブレンダン・アイク)は10日間で創造しました。神も「私より数日遅いが、Brave賞を授与しよう」と言うかもしれません。
└JavaScriptという名称は当時のJavaの人気にあやかったという説が有力のようですが、最初は別の名前で考えられており、Javaの仕様を踏襲するという考えもなかったようで、Javaはしっかりと型定義を必要としますが、JavaScriptはすぐに動かせるという目的のために厳密な型定義を必要としませんでした。
└それが巡り巡って、結果的にTypeScriptという形で導入されたわけで、それはJavaScriptがそこまで拡張される必要があるだけの重要な言語となったことでもあり、「ちょっと使うおまけ言語」、「逆にちょっと邪魔になることもある言語」と認識されていた時代からは想像もできない結果でしょう。

*端的にまとめる
└JavaScriptはNode.jsによってさらに拡張され、フロントエンドだけでなくサーバーサイドでも用いられる言語となりました。
└それゆえに、当初のJavaScriptの仕様では(その都度、仕様変更はあったとはいえ)、大規模な開発では安全性を確保しにくい、共同作業で進めるには仕様として問題が出てくるという根本的な問題が発生してきたのだと思います。
└しかしJavaScript以外の言語を選ぶという選択肢はもちろん無く、言語の根本的な仕様を変更するのはリスクが高くメリットも薄いので、AltJSによって拡張することが選択されたのでしょう。

Shinya OkayamaShinya Okayama

[詳細]2章のまとめやメモや余談

*つまりReactやNext.jsの前提にもなってくる
└コンポーネント指向フレームワーク自体は、当初はTypeScriptを前提とはしていなかったようだが(登場時期としても2012年10月1日であり、Reactは当初、JavaScriptのみをサポートしていた)、コンポーネント指向フレームワークではかなり大規模開発が想定されることなどを考慮した結果、TypeScriptをほとんど前提とした方が良いと合理的に判断されていったのだろう。

*でも、TypeScriptを含めたフレームワーク全体の学習難度を考えると・・・?
・仮に「JavaScriptまではある程度扱え、WordPressもそれなりに触っている」というレベルで想定してみると(これはまんま自分のことだが)、まずコンポーネント指向や静的型付けという概念の理解から、さらにその概念に沿った技術を具体的に学習していくことになるので、学習コストとしてはかなり重いと感じる。
└完全に扱えるようになる!というレベルまでは目指さないとしても、一通りやるだけでもそれなりの重さだと思う。
└TypeScript自体は型定義の仕様が増えたり、仕組みが変わったJavaScriptであると理解できれば、構文の仕方や追加ルールを覚えるだけではあるが、いまからやっていくNext.jsはある意味でフロントエンドとバックエンドの境界があいまいになっていくものだと思うので、それを考えればそもそもバックエンド自体への経験が浅いと理解が難しくなりやすいというのはあるだろう。
└自分的にはNode.js自体もあまり触ったことが無いので、JavaScriptがバックエンドでどういう感じで動くのかというのも具体的な想像に乏しい。

*だが、学ぶ価値は十分にある
└先にも述べたが、コンポーネント指向フレームワークを業務として取り組むということは、いまの自分のポジション的にあまり考えられない。
└しかし将来的にそれを前提としたサービスなどを扱う必要が出てくるのはかなり現実的だ。
└そして、いま関わっているWordPressなどを理解していくうえでも、別のシステムを理解していくことによって比較が可能になるのでさらに分かりやすくなってくるということもある。
└これは「単一で学習するよりも、逆に時間が掛かりすぎるのではないか?」との印象を持つ人もいるかもしれない。
└たしかに、すぐに知っておくとか使う必要がある場合はそうした方が良いと思うが、プログラミングも科学技術のように既存の考えやツールの応用を常識的に行っていたり、前提を知らないと前提が分からないといったことが普通なので、期限や制限が特に決まっていない場合では、最初から道を狭めると逆に回り道してしまうことになりかねないと思っている。

└個人的な興味で量子力学を調べていることがあるが、「ミクロスケールでは通常の物理現象とは全く違うように感じられる原理が働くように見える」とか「観測する前は確率としてしか予想できず、観測すると状態が変わってしまうので、結果的に観測できない」といった感じでほとんど意味不明だった。
└これに深く関わってくる相対性理論も「重力は空間のゆがみ」など、パッと理解できないような概念や理論が頻出する。
└そこをいくつかの視点で調べていくと、アインシュタインは量子力学を「神はサイコロを振らない」といって否定していたが、しかし二重スリット実験などで粒子と波動の二重性が直感的に分かるようになったことで「物理現象が確率的に決まる(ように見える)」といったことが本格的に認識されていった。
└しかし、相対性理論は特に極限状態の物理現象を説明するうえでかなり正確で有効な理論であることも事実であり、だが、量子力学と相対性理論は統合しようとすると矛盾が生じてくるらしいので、アインシュタインが否定していた理由も分かってくる。
└そこでいま有力視されているのが「ひも理論」で、これによって理論を統合できるのではないかと言われていることが分かってくる。
└まあ、正直「ひも理論」にしても今のところ意味不明であるし、量子力学にしても「全然わからん!」から「わからんことがわかった!」というレベルの進展ではある。

└以上の量子力学の例では複雑すぎるが、JavaScriptにしてみても生まれた経緯や使われてきた経歴や、どのように変わっていったかを知ることでTypeScriptという拡張がなんで必要になったかが理解できてくる。
└時系列的な流れが分かってくると、先の予想もやりやすくなるので、ECMAScriptの規格が変わったとしても、それがなんでそういう変更になったのかを理解しやすくもなる。
└これはオセロを使って例えると、盤面に散らばっている白い石が知らない知識や概念だとして、知っていくことで盤面に黒い石を置いていくとしたら、単一的に学ぶのはある領域に集中して黒い石を置いていくことだと想像できる。
└だが、別の視点から学んでいくことはその領域以外の場所に黒い石をおけるということである。つまり、挟み込むことで間にある白い石を効率的にひっくり返すことが出来るわけだ。
└たしかに時間は掛かる方法だが、必要とされる知識と経験量が多いプログラミングの分野では有効ではないかと思っている。