📜 [專欄新文章] Merkle Tree in JavaScript
✍️ Johnson
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
這篇文章會說明 Merkle Tree 的運作原理,以及解釋 Merkle Proofs 的用意,並以 JavaScript / TypeScript 簡單實作出來。
本文為 Tornado Cash 研究系列的 Part 1,本系列以 tornado-core 為教材,學習開發 ZKP 的應用,另兩篇為:
Part 2:ZKP 與智能合約的開發入門
Part 3:Tornado Cash 實例解析
Special thanks to C.C. Liang for review and enlightenment.
本文中實作的 Merkle Tree 是以 TypeScript 重寫的版本,原始版本為 tornado-core 以 JavaScript 實作而成,基本上大同小異。
Merkle Tree 的原理
在理解 Merkle Tree 之前,最基本的先備知識是 hash function,利用 hash 我們可以對資料進行雜湊,而雜湊後的值是不可逆的,假設我們要對 x 值做雜湊,就以 H(x) 來表示,更多內容可參考:
一次搞懂密碼學中的三兄弟 — Encode、Encrypt 跟 Hash
SHA256 Online
而所謂的 Merkle Tree 就是利用特定的 hash function,將一大批資料兩兩進行雜湊,最後產生一個最頂層的雜湊值 root。
當有一筆資料假設是const leaves = [A, B, C, D],我們就用function Hash(left, right),開始製作這顆樹,產生H(H(A) + H(B))與H(H(C) + H(D)),再將這兩個值再做一次 Hash 變成 H(H(H(A) + H(B)) + H(H(C) + H(D))),就會得到這批資料的唯一值,也就是 root。
本文中使用的命名如下:
root:Merkle Tree 最頂端的值,特色是只要底下的資料一有變動,root 值就會改變。
leaf:指單一個資料,如 H(A)。
levels:指樹的高度 (height),以上述 4 個資料的假設,製作出來的 levels 是 2,levels 通常會作為遞迴的次數。
leaves:指 Merkle Tree 上的所有資料,如上述例子中的 H(A), H(B), H(C), H(D)。leaves 的數量會決定樹的 levels,公式是 leaves.length == 2**levels,這段建議先想清楚!
node:指的是非 leaves 也非 root 的節點,或稱作 branch,如上述例子中的H(H(A) + H(B)) 和 H(H(C) + H(D))。
index:指某個 leaf 所在的位置,leaf = leaves[index],index 如果是偶數,leaf 一定在左邊,如果是奇數 leaf 一定在右邊。
Merkle Proofs
Merkle Proofs 的重點就是要證明資料有沒有在樹上。
如何證明?就是提供要證明的 leaf 以及其相對應的路徑 (path) ,經過計算後一旦能夠產生所需要的 root,就能證明這個 leaf 在這顆樹上。
因此這類要判斷資料有無在樹上的證明,類似的說法有:proving inclusion, proving existence, or proving membership。
這個 proof 的特點在於,我們只提供 leaf 和 path 就可以算出 root,而不需要提供所有的資料 (leaves) 去重新計算整顆 Merkle Tree。這讓我們在驗證資料有沒有在樹上時,不需要花費大量的計算時間,更棒的是,這讓我們只需要儲存 root 就好,而不需要儲存所有的資料。
在區塊鏈上,儲存資料的成本通常很高,也因此 Merkle Tree 的設計往往成為擴容上的重點。
我們知道 n 層的 Merkle Tree 可以存放 2**n 個葉子,以 Tornado Cash 的設計來說,他們設定 Merkle Tree 有 20 層,也就是一顆樹上會有 2**20 = 1048576 個葉子,而我們用一個 root 就代表了這 1048576 筆資料。
接續上段的例子,這顆 20 層的 Merkle Tree 所產生的 Proof ,其路徑 (path) 要從最底下的葉子 hash 幾次才能到達頂端的 root 呢?答案就是跟一棵樹的 levels 一樣,我們要驗證 Proof 所要遞迴的次數就會是 20 次。
在實作之前,我們先來看 MerkleTree 在 client 端是怎麼調用的,這有助於我們理解 Merkle Proofs 在做什麼。
基本上一個 proof 的場景會有兩個人:prover 與 verifier。
在給定一筆 leaves 的樹,必定產生一特定 root。prover 標示他的 leaf 在樹上的 index 等於 2,也就是 leaves[2] == 30,以此來產生一個 proof,這個 proof 的內容大致上會是這個樣子:
對 verifier 來說,他要驗證這個 proof,就是用裡面的 leaf 去一個一個與 pathElements 的值做 hash,上述就是 H('30', 40) 後得出 node,再 hash 一次 H('19786...', node) 於是就能得出這棵樹的 root。
重點來了,這麼做有什麼意義?它的巧思在於對 verifier 來說,他只需要儲存一個 root,由 prover 提交證明給他,經過計算後產生的 root 如果跟 verifier 儲存的 root 一樣,那就證明了 prover 所提供的資料確實存在於這個樹上。
而 verifier 若不透過 proof ,要驗證某個 leaf 是否存在於樹上,也可以把 leaves = [10, 20 ,leaf ,40]整筆資料拿去做 MerkleTree 的演算法跑一趟也能產生特定的 root。
但由 prover 先行計算後所提交的 proof,讓 verifier 不必儲存整批資料,也省去了大量的計算時間,即可做出某資料有無在 Merkle Tree 上的判斷。
Sparse Merkle Tree
上述能夠證明資料有無在樹上的 Merkle Proofs 是屬於標準的 Merkle Tree 的功能。但接下來我們要實作的是稍微不一樣的樹,叫做 Sparse Merkle Tree。
Sparse Merkle Tree 的特色在於除了 proving inclusion 之外,還可以 proving non-inclusion。也就是能夠證明某筆資料不在某個 index,例如 H(A) 不在 index 2 ,這是一般 Merkle Tree 沒辦法做到的。
而要做到 non-membership 的功能其實也不難,就是我們要在沒有資料的葉子裡補上 zero value,或是說 null 值。更多內容請參考:What’s a Sparse Merkle Tree。
實作細節
本節將完整的程式碼分成三個片段來解釋。
首先,這裡使用的 Hash Function 是 MiMC,主要是為了之後在 ZKP 專案上的效率考量,你可以替換成其他較常見的 hash function 例如 node.js 內建 crypto 的 sha256:
crypto.createHash("sha256").update(data.toString()).digest("hex");
這裡定義簡單的 Merkle Tree 介面有 root, proof, and insert。
首先我們必須先給定這顆樹的 levels,也就是樹的高度先決定好,樹所能容納的資料量也因此固定為 2**levels 筆資料,至於要不要有 defaultLeaves 則看創建 Merkle Tree 的 client 自行決定,如果有 defaultLeaves 的話,constructor 就會跑下方一大段計算,對 default 資料開始作 hash 去建立 Merkle Tree。
如果沒有 defaultLeaves,我們的樹也不會是空白的,因為這是顆 Sparse Merkle Tree,這裡使用 zeroValue 作為沒有填上資料的值,zeros 陣列會儲存不同 level 所應該使用的 zero value。假設我們已經填上第 0 筆與第 1 筆資料,要填上第 2 筆資料時,第 2 筆資料就要跟 zeros[0] 做 hash,第 2 筆放左邊, zero value 放右邊。
我們將所有的點不論是 leaf, node, root 都用標籤 (index) 標示,並以 key-value 的形式儲存在 storage 裡面。例如第 0 筆資料會是 0–0,第 1 筆會是 0–1,這兩個 hash 後的節點 (node) 會是 1–0。假設 levels 是 2,1–0 節點就要跟 1–1 節點做 hash,即可產出 root (2–0)。
後半部份的重點在於 proof,先把 proof 和 traverse 看懂,基本上就算是打通任督二脈了,之後有興趣再看 insert 和 update。
sibling 是指要和 current 一起 hashLeftRight 的值…也就是相鄰在兩旁的 leaf (or node)。
到這裡程式碼的部分就結束了。
最後,讓我們回到一開始 client 調用 merkleTree 的例子:
以及 proof 的內容:
前面略過了 proof 裡頭的 pathIndices,pathIndices 告訴你的是當前的 leaf (or node) 是要放在左邊,還是放在右邊,大概是這個樣子:
if (indices == 0) hash(A, B);if (indices == 1) hash(B, A);
有興趣的讀者可以實作 verify function 看看就會知道了!
原始碼
TypeScript from gist
JavaScript from tornado-core
參考
Merkle Proofs Explained
What’s a Sparse Merkle Tree?
延伸:Verkle Tree
Merkle Tree in JavaScript was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
c#判斷路徑是否存在 在 元毓 Facebook 的精選貼文
【後疫情時代中國面對的經濟環境】
本文嘗試用一個廣角、簡略但直入重點的方式分析中國在疫情之後所面對的全球經濟環境。
國家競爭力的經濟學概念與中國縣競爭制度
根據經濟學比較優勢定理,國家之間的競爭始終被比較成本所局限。而在分析國家競爭力上,我摒棄華而不實的哈佛商學院Michael Poter的鑽石競爭理論,回歸最基本但正確的經濟學成本概念,其中尤受諾貝爾經濟學獎得主R. Coase的「The Problem of Social Costs」鴻文啓發:
國家競爭成本 = 直接生產成本 + 間接生產成本 + 制度費用
特別說明我所謂的「間接生產成本」更接近上頭成本,本身除了牽涉到整體租值外也會涉及到產業乃至於社會國家的路徑依賴。
在相同供應層面,某國是否可以用更低成本下滿足同樣的需求,以及是否可以善用比較優勢定理。後者包含了前者的同時,也是國家與國家之間的角色不單純只是競爭關係,而是有更多供需關係。後者之所以尤為重要在於「買方與賣方永遠不存在競爭關係」。因此在供應鏈上彼此依賴的買賣雙方國家,依賴程度越深入越廣泛,則敵對的成本將等比級數增加。
換個角度來說,Covid-19疫情本身帶來上述三種成本的同步增加。這也意味著在疫苗逐漸普及的後疫情時代,能夠以更快速地降低上述三種成本的國家將在新一輪全球經濟重新平衡的過程中取得更佳的競爭優勢地位。
在張五常「The Economic Structure of China」一書闡述的中國曾有的1990年代末到2010年間之縣競爭制度下,中國借此享受人類近代少有的超低制度費用與間接生產成本,佐以原本享有的人口紅利帶來的在中低階工廠流水線上較低直接生產成本,中國製造橫掃全世界九成以上的中低階工業領域。
但隨著中國中央政府出台勞動法與加強反托拉斯管制與大大小小的管制措施,上述獨有的縣競爭制度似乎已不復存在。這也為疫情後面對全世界新的經濟環境中國是否還具有經濟學謂「低制度費用」的高彈性與快速適應力埋下變數。
瞭解這個重要局限條件改變後,我們來看看疫情後中國所面對的全球經濟挑戰有哪些。
1 全球通貨膨脹可能帶給中國輸入性通膨
美國建國以來90%以上的M0貨幣發行量是在最近15年內產生,尤其疫情後Fed諸多舉措都可說是「瘋狂印鈔」,在世界多數原物料與貿易均以美元定價與結算的前提下,世界性通貨膨脹必然來到。
站在2021年5月這個時間點看,美國股市、房市、債市與全世界的大宗期貨、能源價格都受到局部性通膨影響,尤其主要農產品、金屬期貨價格多在52周以來新高。(見圖)
(美國M0通貨)
(美國股市)
(美國房市)
(美國債市)
(石油價格)
中國改革開放以來相當長一段時間貨幣匯率政策緊盯美元。2010年代以後雖然改盯一籃子貨幣,但明眼人都看得出美元的比重。故,在美元瘋狂印鈔的環境下,人民幣相應的輸入性通膨也必然發生。
這一塊我們可以預測,在貨幣學 Impossible trinity law的局限,以及中國對人民幣國際化的追求下,中國人民銀行應將在近年內逐步脫鈎對美元匯率的政策,同時部分放寬外匯管制,以得到更多貨幣主權。
同時取消或降低部分關稅,以及放寬戶口管制,都可以是中國政府提高國家競爭力可能採取的措施。
二、 全球局部地區將因疫情影響出現糧食危機
很明顯Covid-19疫情影響了糧食生產與輸布,全球局部地區的糧食危機已經開始出現。根據聯合國2020年糧食安全報告估計到2020年底全球因疫情而陷入經濟衰退與飢餓的人口數達8300萬~1.32億人。其引發的糧食價格增長將加重中國輸入性通膨下,百姓生活的負擔
中國家戶支出30%花費在食物品項,又中國國內大豆需求90%依賴進口滿足,因此可預見中國的飼料與肉品市場價格恐將上揚且吃緊。
(中國主要糧食供需狀況)
全球能源市場也會因疫情與之前負油價事件影響一段時間內失去部分供給彈性,意味著能源市場價格伴隨通膨因素影響的上揚也是可以預期,這一塊同樣也會加重中國未來將面對的輸入性通膨壓力。
因此我們會看到中國在人民幣國際化推廣上會施以更大力道,例如與更多國家簽訂貨幣清算與貨幣交換協議,嘗試在糧食/能源品項上更多地採人民幣定價結算。如此方可在不過度犧牲中國世界供應煉地位的前提下,減少輸入性通膨對人民的衝擊,尤其是輸入性通膨下中國國內資本投資的資源錯置現象將可以得到一定程度約束。當然這部分中國政府應該還會採取價格管制或其他市場管制措施相佐之,但政府干預與介入本身又會帶來更多訊息費用、交易費用,甚至政府本身就成為資源錯置的問題根本,也是極為可能。這些都是身為投資人的我們值得持續觀察與因應。
三、 中美衝突與戰爭風險提高
如前述,國家邊際競爭成本,尤其邊際間接生產成本與邊際制度費用,增加速率大過他國之速率,則一國之國力衰退,或更精准地說,國家相對競爭優勢衰退。反之則可視為國家相對競爭優勢增加。
在人民幣國際化過程將直接與美元產生競爭關係且削弱美國對全球徵收「美元稅」的能力,經濟邏輯上的效果是:2008年金融危機後的QE之所以沒有在美國發生嚴重通膨,正是因為美元在國際貿易與國際金融的霸主地位可以對全球抽取美元稅,意味著美國可以將貨幣濫發帶來的經濟成本移轉給全世界承擔,其中以世界貿易額佔比越高者承擔越多,故身為世界第一大商品出口國的中國自然也承擔大部分苦果,這也是為何我長時間以來主張美元的地位相當程度是由中國支撐。
而在人民幣競爭之下(我們假設人民幣國際化真取得成效),美國不再能輕易移轉自身國家競爭成本給全世界時,通貨膨脹將回歸隨著貨幣發行量增長而提高,這對美國而言代表聯邦政府與州政府等一系列債券、連動債務的利息支出成本將提高,未來借貸成本也將提高。在一定程度上,美國政府或州政府可能因此停擺,甚或我們會看到州政府、市政府因此破產。
因此美國必然會嘗試在各方面阻止之。
提高上述中國的國家邊際競爭成本也無可避免會是美國未來數十年的整體戰略目標。
所以我們看到美國從President Trump任期開始,嘗試尋找各種可以提高中國國家邊際競爭成本的手段。
然而在當今真實世界供應煉、服務煉、金流、資訊流高度分工交雜的局限條件下,我推斷任何一任美國政府、智庫都難以清楚釐清自身採取的任何競爭戰略是否會帶來意料之外的後果(unintentional consequences)。
a 舉例來說,比如美國政客錯誤判斷關稅手段制裁中國會有效,於是我們看到Trump任期貿易戰初期就是違背WTO規範,片面無理對中國出口商品加重關稅或其他非關稅貿易手段。
然而真正懂經濟學邏輯者看法多如我當時寫下的預判一樣 — 如果美國以關稅手段要抑制中國出口經濟,但關稅提高幅度不夠大不夠全面的話,則中美之間的貿易逆差狀況不但不會縮減,反而在某些不同彈性系數之下會增加。(見圖)
(中國出口美國統計圖)
反之,美國經濟將因自身對中國的片面關稅障礙而受創。
更進一步,若美國政客傻到真的將制裁關稅提到夠高,足以發生抑制中國出口額的效果,則美國經濟將必須付出重大代價,其中包括美元地位將大幅動搖。如前述貨幣政策問題,不但聯邦政府利息支出將壓垮政府財政,州政府乃至市政府破產潮亦不遠。故,我們看到即便是Trump也被迫停止更瘋狂的關稅壁壘措施。
b 再以半導體產業的光刻機為例,美國施壓荷蘭ASML禁止出貨中國廠商已經付費採購的光刻機,其結果反而是給中國光刻機或EDA廠商創造市場,協助排除了原本ASML強力的競爭。從經濟學角度來看這是一件很諷刺事情。
這是因為全球光刻機市場是一個高度技術集成的天然寡頭壟斷市場,除非有類似當年ASML與日本佳能之間的技術彎道超車(浸潤式UV光刻技術)特殊情況發生,否則後來者都會因為技術認證與攻克的巨大前期投資成本而被排除於競爭之外。
然而,從經濟學競爭的角度看,美國禁止ASML對中國出口,結果反而是讓中國半導體製造廠被迫轉向投資與採購其他中國光刻機供應商,使得原本在市場上幾乎無競爭力的後者,因美國的禁令創造的「競爭真空」環境而有了成長空間。
因此我們放大時間尺度來看,20年、30年後如果中國半導體設備商有了長足的進展,肯定要回過頭感謝美國政府政府的錯誤干預所創造的商機。
說到商機身為投資人的我們可以注意,在上述政客的錯誤決策中,一些轉瞬即逝的投資機會也會因政府干預而起。例如下一點。
c. Super Micro 間諜晶片事件,2018年10月美國知名商業性雜誌Bloomberg刊登新聞「The Big Hack: How China Used a Tiny Chip to Infiltrate U.S. Companies」聲稱Super Micro這家公司利用一顆米粒大小的間諜晶片替中國政府竊取資訊。
姑且不提一顆米粒大小,本身毫無無線射頻天線的晶片在當時技術上幾乎不可能竊取什麼資訊,2年多後海潮退去,不但美國政府或Bloomberg都未提出更進一步有力證據,整件事甚至根本就被遺忘。
當年我不但寫了幾篇文章駁斥這種謬論栽贓。還親自動手買入這家粉紅單公司,短短三天就賺了台轎車。
香港2019年暴動事件、2021年新疆奴隸棉花事件、最近新冠病毒向中國求償事件...等,我們都可以看到美國政客在試圖提高中國競爭成本的過程,會創造大大小小系統性或個體性的災難風險,例如前述Super Micro因栽贓性假消息股價從$20.61美元在一兩日內崩跌至$13左右,但隨著栽贓者無力提供更多證據,市場回歸均衡的過程,截至2021年5月28日,Super Micro股價已經來到$35。
這是說,某些因政治干預造成的個體性或系統性風險,雖然屬於不可預測的風落(windfall),但其中不乏類似Super Micro的例子,在隨後回到正常的價值位置。如W. Buffett所言:市場短期是投票機,但長期是磅秤。
d. 美國知名橋水基金創辦人Ray Dalio在其將於2021年11月初版的書籍」The Changing World Order」 已提前公開的第七章」US-China Relations and Wars」提出綜合國力歷史計算與國力表(見圖)
提出美國正處於信用擴張後期的大國階段,而歷史上處於此階段與新興國力上生階段的國家一旦發生國力曲線交叉時,多半發生大規模戰爭以重新均衡雙方與整體國際關係。
依其推論,中美兩國發生戰爭的風險來到史上最高點。
但這部分我持較保留態度,特別是新任President Biden政府的高達$6 triilion美元的聯邦預算案出台,我們注意到一者,美國聯邦政府支出繼續維持二次世界大戰以來的GDP高佔比--達25%,二者,預算增幅最大均在健康醫療(成長23.1%)、商務(27.7%)與環保(21.3%),然在國防(1.6%)與國家安全(0.2%)幾乎未有成長,甚至計入通貨膨脹因素,後二部門的預算是實質減少的。因此可推估此任政府對發生大型戰爭的預期心理。
四、 變種病毒的不確定性
這是最後最難評估的風險,在現階段的資產配置決策中不可忽略卻又幾乎難以估計。拔高到國家決策層面來看,這也是中國面對的最棘手風險之一。
結論:
以上是我從經濟學角度出發,非常簡略地預測中國在疫情後將面對的國內外經濟環境與挑戰。其中任何一項單獨提出要深入探討都會是長篇大論。還有一些我認為相對重要性較低的現象與局限條件轉變,本文也尚未涵蓋。
BTW,最後多提一句台灣獨有的風險:後疫情時代是否接種過疫苗有可能在相當時間內成為國際旅遊的必要條件。然如果台灣政府真的壓寶在台灣國產疫苗上,則在現今環境下有沒有可能不被世界多數國家組織承認?會是一個額外的成本。
參考文獻:
* The Wall Street Journal, 「Biden is the $6 Trillion Man」 (May 28, 2021), https://www.wsj.com/articles/biden-is-the-6-trillion-man-11622241749
* The Financial Times, 「The summer of inflation: will central banks and investors hold their nerve?」 (May 15, 2021), https://www.ft.com/content/414e8e47-e904-42ac-80ea-5d6c38282cac
* Ronald Coase, 「The Problems of Social Cost」 (1960)
* Ray Dalio, 「The Changing World Order: Why Nations Succeed and Fail」 (2021)
* Irving Fisher, 「The Money Illusion」 (1928)
* Mundell, Robert A. (1963). "Capital mobility and stabilization policy under fixed and flexible exchange rates". Canadian Journal of Economics and Political Science. 29 (4)
* Milton Friedman and Anna Schwartz, 「A Monetary History of the US, 1867-1960」 (1963)
* Milton Friedman, 「Money and the Stock Market」 The Journal of Political Economy, Vol. 96, No. 2 (Apr., 1988), pp. 221-245 「
* Allan Meltzer, 「Learning about Policy from Federal Reserve History」 (Spring 2010)
* Armen A. Alchian, 「Effects of Inflation Upon Stock Prices" (1965)
* 張五常, 「Will China Go Capitalist?」 (1982)
* 張五常, 「The Economic Structure of China」 (2007)
* Ronald Coase and Ning Wang, 「How China Became Capitalist」 (2012)
* Alfred Marshall, 「Principles of Economics (8th ed.)」 (1920)
文章連結:
https://bit.ly/3vD1B2o
c#判斷路徑是否存在 在 李開復 Kai-Fu Lee Facebook 的最佳解答
分享好文,中學生要學電腦嗎?
作者:創新工場CTO、人工智慧工程院執行院長 王詠剛
文章来自半轻人微信公众号(ban-qing-ren)
………………………………
朋友的孩子高中剛畢業,已拿到美國頂尖大學(非電腦專業)的錄取通知。疫情影響,不知何時才能去學校報到。孩子想抓緊學習一下程式設計,為大學打好基礎。這孩子找我聊了一個多小時,從如何學程式設計,聊到非電腦專業和電腦專業的路徑差異,又聊到如何從不同角度認識電腦與程式設計。聊得比較寬泛,不知是否對這孩子有用。
回想我自己的高中時代:那時雖迷戀程式設計,卻完全沒有懂行的人指導。在我們那個四線城市的廠礦中學裡,開設電腦興趣課的老師知道的資訊還沒我多。我高一時跑到北京中關村逛街,卻完全沒意識到中國第一代頂尖程式師當時就在我身邊的低矮辦公樓裡寫代碼(這話說得並不準確,比如求伯君那年就主要是在珠海做開發),鼎鼎大名的UCDOS、WPS、CCED就出自他們之手……我在當時街邊的一家書店(位置似乎就在今天的鼎好大廈對面)買到了許多種印刷品質極低劣的電腦圖書。用今天的標準看,那就是一批盜版影印或未授權翻譯的國外圖書。可那批書竟成了我高中時代最寶貴的程式設計知識來源。
顯然,我在高中時根本就是野路子學電腦。現在後悔也沒用,當時我的眼界或能觸及的資源就那麼多。如果能穿越回30年前,我該對喜歡程式設計的自己說些什麼呢?這些年,我與世界上最好的一批程式師合作過,也參與過世界上最有價值的軟體系統研發——我所積累的一些粗淺經驗裡,有哪些可以分享給一個愛程式設計的中學生?
【問題1】中學生要不要學電腦?
當然要!
每個中學生都要學。只不過——建議大部分中學生使用“休閒模式”,小部分(不超過10%)中學生使用“探險模式”。
啊?兩個模式?那我該進入哪個模式?⟹請跳轉至【問題2】
【問題2】選哪個模式?
你癡迷電腦嗎?比如,你玩遊戲時會特別想知道這遊戲背後的代碼是如何編寫的嗎?再比如,就算老師家長不同意你學電腦,甚至當著你的面把電腦砸了,你也要堅持學電腦嗎?如果是,恭喜你進入“探險模式”⟹請跳轉至【問題200】
你對數學有興趣嗎?比如,你看到街邊建築的曲線,就會在腦子裡琢磨曲線對應的函數或方程嗎?每當手裡攥著幾粒骰子,你就會不由自主地計算概率嗎?如果是,歡迎進入“探險模式”⟹請跳轉至【問題200】;當然,如果有些猶豫,也可以先進入“休閒模式”⟹請跳轉至【問題100】
即便你對電腦和數學興趣不大,家長、老師還是強烈建議你學電腦嗎?就算你一百個沒時間一千個不願意,家長、老師還是會逼著你學電腦嗎?如果是,建議你主動進入“休閒模式”並向家長、老師彙報說“我已經按照前谷歌資深軟體工程師的專業建議在認真學程式設計了”⟹請跳轉至【問題100】
其他情況,一律進入“休閒模式”。⟹請跳轉至【問題100】
【問題100】休閒模式 | 主要學什麼?
“休閒模式”將電腦視為我們生活、工作中的必備工具,主要學習如何聰明、高效、優雅地使用計算設備。這裡說的計算設備,包括所有形式的電腦、手機、遊戲機、智慧家電以及未來一定會進入生活的自動駕駛汽車。
什麼什麼?你已經會用電腦、會玩手機、會打遊戲了?別著急,慢慢往下看。
【問題101】休閒模式 | 我會用搜尋引擎嗎?
我知道你會用百度搜習題答案。但,習題答案不是知識。你會用搜尋引擎來搜索和梳理知識嗎?請試著用電腦和你喜歡的搜尋引擎來解決如下兩個問題:
(1)圓周率𝜋的計算方法有多少種?每種不同的計算方法分別是由什麼人在什麼時代提出的?借助電腦,今天人們可以將圓周率𝜋計算到小數點後多少位?將圓周率𝜋計算到小數點這麼多位元,一次大概需要花掉多少度電?
(2)全球大約有多少個廁所?在發展程度不同的國家,分別有多少比例的人可以享用安裝了抽水馬桶的衛生廁所?為什麼比爾·蓋茨曾大力推動一個設計新型馬桶的研發專案?比爾·蓋茨的公益組織在這個專案上大約花費了多少資金,最終收到了多大的效果?
如果你沒法快速得到上述問題的全部答案,那就給自己設一個小目標:一個月內,學會用搜尋引擎系統地獲取、梳理一組知識點的全部技巧。
【問題102】休閒模式 | 接下來學什麼?
建議學好典型的工具軟體。比如,我知道你會用Office了,但用Office和用Office是很不一樣的。對生活、學習、工作來說,學好、學透一個工具軟體比鑽研程式設計技巧更實用。
你會用Excel來管理班級公益基金的預算和實際收支情況嗎?
你會用Excel做出過去20年裡全球大學排名的演變趨勢圖嗎?
你會用Word排版一篇中學生論文嗎?論文中的圖表和最後的參考文獻部分該如何排版?
你會用Word編排一份班級刊物,包含封面、扉頁、目錄、插圖頁、附錄、封底等部分,可以在列印後直接裝訂成冊嗎?
PowerPoint呢?你有沒有研究過蘋果公司發佈會上那些幻燈片的設計?當約伯斯(多年以前)或蒂姆·庫克站在幻燈片前的時候,他們的演講思路是如何與幻燈片完美結合的?
還有哦,別忘了學學如何為數碼照片做後期,如何用電腦或手機剪視頻,如何為剪輯好的視頻配字幕,如何將照片、音樂、視頻等素材結合起來,做出一段吸引人的快手/抖音短視頻。
最後,抽空玩玩那些設計精妙的遊戲吧,比如《紀念碑穀》、《塞爾達傳說:曠野之息》之類;同時,遠離那些滿屏廣告,或者一心騙你在遊戲裡充值花錢的垃圾。
【問題103】休閒模式 | 不學學知識嗎?
當然要學知識。下面每種實用的電腦知識都夠大家學一陣子了。
(1)色彩知識:你知道同一張數碼照片在不同品牌的手機螢幕上、不同的電腦螢幕上、不同的智慧電視上顯示時,為什麼經常有較大色差嗎?你知道有一些色彩只適合螢幕顯示,不適合列印輸出嗎?你知道軟體工具裡常用的RGB、HSL之類的色彩空間都是什麼意思嗎?如何在設計PowerPoint幻燈片時選擇一組和諧美觀的色彩?
(2)字體知識:你知道什麼是襯線字體,什麼是無襯線字體嗎?你知道網頁中常用的英文字體都有哪些嗎?你知道商務演講時最適用于幻燈片的英文字體有哪些嗎?你知道電腦和手機常用的黑體、宋體、仿宋體、楷體等中文字體分別適合哪些實際應用場合嗎?你會將不同字體混排成一個美觀的頁面嗎?
(3)網路知識:你知道5G是什麼嗎?你知道5G和4G在通信頻寬、通信距離上的具體區別嗎?你知道什麼是路由器,什麼是防火牆嗎?你知道如何配置路由器,如何配置防火牆嗎?微信或QQ聊天時,對方發的文字、語音或視頻是如何傳送到你的手機上的?
(4)應用知識:淘寶中搜索得到的商品資訊是從哪裡來的?商品是按什麼方式排序的?為什麼購物APP經常會推薦給你一些曾經買過、看過的商品?你知道如何為自己建立個人網站嗎?你知道如何管理微信公眾號嗎?
(5)安全知識:你知道網路上的釣魚攻擊是怎麼回事兒嗎?你知道什麼是電腦漏洞嗎?你知道駭客為什麼想把一大批受攻擊的電腦變成可以遠端操控的傀儡機嗎?你知道為什麼現在很多手機APP都要通過短信發送驗證碼嗎?如果驗證碼被壞人截獲,你會面臨哪些風險?
這裡只是舉例。實用的電腦知識還有很多。大家可以自己發掘。
【問題104】休閒模式 | 我需要學程式設計嗎?
可以學,但不是必須。即便學,也只需要根據自己的需要,學那些最能幫你解決現實問題的部分。
【問題105】休閒模式 | 我該學什麼程式設計語言?
在“休閒模式”裡,電腦就是工具,程式設計也是工具,夠用就好。學什麼程式設計語言,完全看你想要電腦幫你做什麼。
• 如果你想對資料處理有更多自主權,那不妨學學Python;
• 如果你想做簡單的交互演示程式,那就先把JavaScript學起來;
• 如果你想更好、更快地寫論文,那不妨學學LaTeX(什麼什麼,LaTeX不是程式設計語言?你太小看LaTeX了);
• 如果你想學做簡單的手機APP,那麼,Android手機就學Java,蘋果手機就學Swift好了;
• 如果你只想知道程式設計是怎麼回事,那……從Python或JavaScript開始就行。其實,跟五六歲的小朋友一起學學Scratch圖形程式設計也不錯。
【問題106】休閒模式 | 我需要學人工智慧嗎?
在“休閒模式”裡,最需要學的不是“人工智慧的實現原理”,而是“什麼是人工智慧”,以及“人工智慧能做什麼,不能做什麼”。
• 在手機上試一試,人工智慧做語音辨識時能做到什麼水準?哪些話容易識別,哪些話不容易識別?
• 打開機器翻譯軟體,試一試哪些資訊翻譯得好,哪些資訊翻譯得不好?
• 手機上的拍照軟體一般都有人臉識別功能。試一試人臉識別在什麼場景下做得好,什麼場景下做得不好?
• 找一部講人工智慧的科幻電影,用自己的判斷解讀一下,電影裡哪些技術有可能成為現實,哪些技術存在邏輯矛盾。
【問題107】休閒模式 | 推薦什麼參考書、參考文獻?
書不重要,豆瓣評分7分以上的電腦應用、程式設計甚至科普類圖書都可以拿來翻翻。
直接在知乎裡搜索你想瞭解或學習的知識點可能更有效率。
如果你意猶未盡,覺得自己剛活動開筋骨,還想挑戰更高層次,歡迎進入“探險模式”。⟹請跳轉至【問題200】
否則,“休閒模式”到此結束。⟹請離開此問答
【問題200】探險模式 | 主要學什麼?
“探險模式”需要有挑戰精神。電腦科學的世界技術演進快,脈絡複雜,要想在探索時不迷路,你得通過有順序、有系統地學習電腦知識,慢慢構建出一張可以在未來幫你走得更遠的思維地圖來。
在“探險模式”裡,電腦就不止是一件能快速計算的工具了。電腦更像是我們大腦的一種延伸。這既包括認知能力的延伸,也包括認知邏輯的延伸。隨著學習深入,大家會逐漸體會到電腦所具有的多維度能力:
電腦是一種可以表示不同類型資訊(數、符號、文字、語音、圖像、視頻、虛擬空間、抽象邏輯)的“資訊管理機”;
同時,電腦也是一種可以連續執行指令以完成特定的資訊處理任務的“指令處理機”;
同時,電腦還是一種可以在知識與邏輯層面完成特定推理任務的“知識推理機”;
同時,電腦也是一種可以從人類給定的資料或自我生成的資料中總結規律,建立模型,自主完成某些決策的“智慧學習機”。
“探險模式”的目標就是盡可能準確地認識電腦,掌握有關電腦運行的最基本規律。有了這些基礎。未來在大學期間或工作中,你就能更容易地設計電腦軟硬體系統,或是設計出碳基大腦(人類)與矽基大腦(機器智慧)之間的最佳協作方案。
【問題201】探險模式 | 我的英語水準足夠嗎?
蘋果每年秋季的新品發佈會,不加字幕的話,你能聽懂多少?
能聽懂大部分:建議在學習電腦的過程中,盡可能使用英文教材、英文文檔。
能聽懂小部分:建議將原來準備學電腦的時間,分出一部分來學英語。
只能聽懂“你好”“再見”之類:⟹請離開此問答。然後,把原來準備學電腦的時間用於學英語,六個月後再回來。
【問題202】探險模式 | 我的數學水準足夠嗎?
如果你是數學和數學應用小能手——較複雜的數學問題總能快速找到核心思路,或快速簡化為簡單問題;很容易就能將抽象概念映射到具體的數學圖形,或將數學問題與相應的現實問題關聯在一起:請繼續探險之旅。
如果你應付正常數學課程感到吃力:建議將原來準備學電腦的時間,分出一部分來學數學。
如果你還搞不清楚什麼是方程、函數、集合、概率……:⟹請離開此問答。然後,把原來準備學電腦的時間用於學數學,六個月後再回來。
【問題203】探險模式 | 為什麼強調英語和數學?
(1)統計上說,最好的電腦參考資料大都是英文寫的,最好的電腦課程大都是用英文講的,最新的電腦論文大都是用英文發表的。
(2)函數、方程、坐標系、標量、向量、排列組合、概率這些中學數學裡會初步學習到的數學知識,是電腦科學的基礎。
【問題204】探險模式 | 電腦知識那麼多,正確的學習順序是什麼?
最重要的順序有兩個。建議先從順序一開始,學有餘力時兼顧兩個順序。
順序一:自底向上,即,自底層原理向上層應用拓展的順序。
電腦原理的基礎知識:
為什麼每台電腦(包括手機)都有CPU、記憶體和外部設備?
(馮·諾依曼體系結構的)記憶體中為什麼既可以存儲資料,也可以存儲指令?
CPU是如何完成一次加法運算的?
程式設計語言的基礎知識:
資料類型,值,變數,作用域……
語句,流程控制語句……
過程、方法或函數,類,模組,程式,服務……
編譯系統的基本概念:
電腦程式是如何被解釋或編譯成目標代碼的?
演算法和資料結構的基礎知識:
陣列,向量,鏈表,堆,棧,二叉樹,樹和圖……
遞迴演算法,排序演算法,二叉樹搜索演算法,圖搜索演算法……
應用層的基礎知識:
為什麼電腦需要作業系統?設備驅動程式是做什麼的?
網路通信的基本原理是什麼?流覽器是怎麼找到並顯示一個網頁的?
資料庫是做什麼用的?
虛擬機器是怎麼回事?
人工智慧系統的基礎知識:
先熟悉些線性代數、概率和數學優化的基礎知識。
什麼是機器學習?從簡單的線性回歸中體會機器學習的基本概念、基本思路。
什麼是神經網路?什麼是深度神經網路?為什麼神經網路可以完成機器學習任務?
如何使用PyTorch或TensorFlow實現簡單的深度學習功能?
順序二:自頂向下,即,自頂層抽象邏輯向下層具體邏輯拓展的順序。
• 電腦的本質是什麼?
• 什麼是圖靈機?什麼是通用圖靈機?
• 什麼是讀取﹣求值﹣輸出迴圈(Read–eval–print Loop,REPL)?
如何用自頂向下的方式理解(解析、解釋、編譯)一段程式碼?
• 靜態語言和動態語言的區別?
如何理解變數與資料類型之間的綁定關係?
• 什麼是函數式程式設計?
程式設計語言中,函數的本質是什麼?
函數為什麼可以像一個值一樣被表示、存儲、傳遞和處理?
• 什麼是物件導向?
類的本質是什麼?
如何用物件導向的方式定義個功能介面?
如何依據介面實現具體功能?
• 什麼是事件驅動?
什麼是事件?事件如何分發到接收者?
如何在事件驅動的環境中理解代碼的狀態和執行順序?
【問題205】探險模式 | 如何提高程式設計水準?
在掌握基本知識體系的基礎上,學好程式設計只有一條路:多程式設計,多參加程式設計比賽,多做程式設計題,多做實驗項目,多找實習機會——其中,能參與真實專案是最有價值的。
【問題206】探險模式 | 該從哪一門程式設計語言學起?
我個人推薦的程式設計入門語言(可根據情況任選):
Python
Java
Swift
C#
JavaScript / TypeScript
Ruby
……
可能不適合入門,但適合後續深入學習的語言:
C
C++
Go
Objective-C
組合語言
機器語言(CPU指令集)
Shell Script
Lua
Haskell
OCaml
R
Julia
Erlang
MATLAB
……
【問題207】探險模式 | 如何選參考書和參考資料?
(1)強烈推薦的參考書和參考資料:
• MIT、Stanford、CMU、UC Berkeley這四所大學中任何一個電腦專業方向使用的教學參考書或參考資料。網上可以查到這些學校電腦專業方向的課程體系,有的學校甚至公開了課程視頻。其中往往會列舉參考書和參考資料連結。
• 維琪百科(英文)上的數學、電腦科學相關條目。
• Github上star數在1000以上的開原始程式碼和開來源文件。
(2)強烈推薦但須小心辨別的參考資料:
知乎上的數學、電腦科學相關條目。使用時需要格外注意三件事:
儘量只看高贊答案或高贊文章;
辨別並避開廣告軟文;
辨別並避開純抖機靈的故事或段子。
Stack Overflow上的程式設計問題解答:
自己動手實驗,辨別解答是否有效。
CSDN上的程式設計問題解答:
自己動手實驗,辨別解答是否有效。
(3)其他推薦的參考書和參考資料:
國內專業作者寫作的專業技術書籍(豆瓣評分7分以上的)。
大廠(Google、Facebook、Microsoft、Amazon、阿裡、騰訊、百度、頭條等)資深工程師的技術公號、專欄、博客等。
著名圖書系列:如O’Reilly的動物封面的系列圖書(請注意最新版本和時效性)。
國內翻譯的著名技術圖書(譯本在豆瓣評分7分以上的)。
(4)儘量避免的參考書和參考資料:
• 已經過時的圖書或參考資料。
• 作者或譯者人數比章節數還多的專業圖書。
• 百度百科上的數學或電腦科學相關資料。
什麼什麼?你這篇問答居然沒有推薦一本具體的圖書?是,沒錯。如果你覺得即便有了上面的線索,自己還是找不到好書好資料,那也許你還是適合“休閒模式”⟹請跳轉至【問題100】