為何敲代碼,學好數學很重要?

2021-01-08 酷扯兒

本文轉載自【微信公眾號:手機電腦雙黑客,ID:heikestudio】經微信公眾號授權轉載,如需轉載與原文作者聯繫

數學是編程的靈魂所在。

以下為譯文:

程式設計師喜歡討論程式語言。除了辯論它們各自的優點外,我們還喜歡將它們整合到我們的身份認知中,甚至通過某人使用的語言來推斷這是一個怎樣的人。有些人甚至用語言決定論的一種形式爭辯,認為思維受限於可被分類的東西的。

由於我們花了很多時間來使用語言,因此想要使它們變得更好的想法是合理的。然而,這些辯論的特點表明我們認為它們代表著更多的東西。也許我們忘記了語言本身最主要的作用。程式語言是實現工具,而不是思考工具。它們是嚴格的正式的語言,以人性化的方式來給機器下指令。相反,思想最好通過一種自由而靈活的媒介來表達。

用數學思考

數千年來,被高效地用於計算方面思考的自然語言就是數學。大多數人並不認為數學是自由的或靈活的。他們在學校看到可怕的符號和對解題步驟生硬記憶的經歷與自由和靈活的數學精神恰恰相反。我希望本文的讀者在數學方面有更好的經歷,比如在離散數學或線性代數課程中; 那種涉及構建清晰的定義和演繹,並用符號寫成散文(推理步驟)的經歷(大多數符號甚至直到16世紀才被發明)。

數學允許你推理邏輯結構,而不受其他約束的影響。這也是編程所需要的:創建邏輯系統來解決問題。我們來看一下編程的基本模式:

找出問題所在設計算法和數據結構來解決它實現和測試在實踐中,工作往往組織得不是那麼好,因為步驟之間存在相互作用。你可以編寫代碼來通知別人設計方面的問題。可即便如此,上面這個基本模式也一遍又一遍地在實踐中重現。

請注意,步驟1和2是佔用我們大部分時間,能力和精力的步驟。同時,這些步驟並不適合程式語言。這並不能阻止程式設計師嘗試在他們的編輯器中解決它們,但他們最終會得到一些混亂,緩慢或解決了錯的問題的代碼。並不是程式語言還不夠好。沒有哪一種正式語言在這方面擅長。我們的大腦就不是那麼思考問題的。當問題變得困難時,我們繪製圖表並與同事們討論。

理想情況下,首先解決步驟1和2,然後才使用程式語言來解決步驟3。這在轉換實現過程中有額外的好處。有了數學解決方案,你就可以專注於選擇最佳的表示和實現方式,編寫更好的代碼,了解最終目標將是什麼。

實現問題

為什麼程式語言作為思維工具是繁瑣的?一個原因是編寫代碼與實現密不可分。實現問題對於給計算機下指令是必要的,並且值得做好,但它們也分散了在要解決的問題方面的注意力。想想如果要編寫一個簡單的函數,所有的注意事項:

我應該提供什麼輸入?它們應該被命名為什麼?它們應該是什麼類型的?(即使動態類型語言也必須考慮類型,它是隱含的而已。)我應該通過值還是通過引用來傳遞它們?我應該把這個函數放在什麼文件中?結果是否應該重複使用,或者它是否足夠快以便每次重新計算?這個列表還可以繼續下去。關鍵是這些考慮因素與函數的作用無關。它們會分散人們對該函數試圖解決的問題本身的注意力。

許多語言旨在隱藏諸如此類的細節,這對於普通的日常任務尤其有用。但是,它們無法超越其作為實現工具的角色。SQL很容易被認為是這方面最成功的例子之一,但它最終關注的還是表,行,下標和類型等實現方面的問題。正因為如此,程式設計師仍然在編寫一堆JOIN之前,以隨意的方式設計一些複雜的查詢,比如一些他們想要「獲取」的東西。

不靈活的抽象

程式語言的另一個限制是它們是糟糕的抽象工具。通常,當我們討論工程中的抽象時,我們的意思是隱藏實現細節。一個複雜的操作或過程被打包成一個「黑盒」,其內容隱藏,並且暴露出明確定義的輸入和輸出。伴隨著這個盒子的是一個關於它的功能的虛構故事,這很容易理解。

黑盒對於大型系統的工程設計至關重要,因為細節過多,對人腦來說理解起來壓力山大。它們也有許多眾所周知的局限性。黑盒洩漏是因為其簡要的說明無法完全表述清楚其具體行為。不透明的界面引入了低效率,例如重複和分散設計。

最重要的是對解決問題來說,黑盒很僵硬。它們呈現出固定的抽象層級,這個層級可能對問題來說級別太高或太低。從理論上講,你可以隨時查看黑盒內部,但在代碼中,任何時候的抽象級別都是固定的。它們也只提供了一種抽象視角。一個高級Web伺服器可以提供用於服務JSON的極好的接口,但是如果你想要將其用於提供不完整數據流的接口(例如來自程序的輸出)那它表現就很差了。

相比之下,數學中的抽象一詞與隱藏信息完全不同。這裡,抽象意味著提取與特定上下文相關的某些事物的基本特徵或特徵。與黑盒不同,這不會隱藏任何信息。它們不會以同樣的方式洩漏。我們鼓勵你調整到正確的抽象級別,並在不同角度之間快速跳轉:

這個問題最好用表來表示嗎?或者,一個函數?我可以將整個系統視為一個函數嗎?我可以將這些東西作為一個整體處理嗎?我應該看整個系統還是單個部分?我應該做出什麼假設?我應該讓它們更強還是更弱?只需看看一個函數的多種表示方法:

數學的主要分支代表了常用的抽象:

幾何圖形從世界中的物體中(或轉換不變量,取決於想要獲得的宇宙)抽象出基本形狀。拓撲從其形狀中提取表面特徵。群論將二元運算抽象為關於它們如何組合和反轉的屬性。但是,並不僅限於這幾個領域。你可以選出對某個問題很重要的屬性,並忽略其他。文章最後的示例項目顯示了如何完成此操作。

程式語言非常適合構建黑盒; 它們提供了函數,類和模塊,所有這些都有助於將代碼包裝到漂亮的接口中。但是,在嘗試解決問題和設計解決方案時,你真正想要的是數學那樣的抽象。如果你試著在鍵盤邊上思考,可用的黑盒會扭曲你的視線。

問題表徵

正如程式語言的抽象能力有限一樣,它們在表示數據的方式上也受到限制。實現算法或數據結構的行為只是選擇一個能表示它的許多可能的方式之一。通常,在你了解所需內容之前,這還不是一個你想現在就做出的決定。

例如,圖(頂點和邊的集合)出現在許多編程問題中,例如網際網路網絡,尋路和社交網絡。儘管定義簡單,但選擇如何表示它們很難並且這取決於它們的使用情境:

與定義最匹配的那個:vertices:vector <NodeData> edges:vector <pair <Int,Int >>如果你只關心連接問題,可以刪除頂點。如果要快速遍歷節點的鄰接節點,那麼你可能需要一個節點結構:Node{id:Int,neighbors:vector <Node *>}你可以使用鄰接矩陣。每行存儲特定節點的鄰接節點:connectivity:vector <vector <int >>尋路算法通常在單元板上隱式地處理圖:walls:vector <vector <bool >>在對等網絡中,每臺計算機都是一個頂點,每個插槽都是一個邊。整個圖表甚至無法從一臺機器訪問!數學允許你對圖本身進行推理,解決問題,然後選擇合適的表達方式。如果你使用程式語言進行思考,則不能延遲此決定,因為你的第一行代碼就是為了特定的表達而存在的。

請注意,圖的表示太多樣化,無法限於單一種類的接口,類型類(tpyeclass)甚至程序。因此,創建一個可完全復用的庫是不切實際的。它只能在幾種類型上工作,或者強制所有圖使用不恰當的表示。但這並不意味著庫沒用。類似的表示會重複出現(比如std :: vector),但你沒法寫一個能一勞永逸地解決所有圖形問題的庫。

一些現代程式語言試圖提供更多的數學抽象工具。例如,Haskell有Ring和Group類型類(typeclass)。然而,表示問題表明這些特徵肯定不如它們的理論靈感有用。編寫一個僅依賴於關聯屬性並且就那樣存檔的算法是明智的。這就是用數學語言思考。但是,實際上,這只能適度地處理相似類型的小家族。

作為必然結果,程式語言應該主要將注意力放在如何做好一個有用的實現工具,而不是思考工具上。C在很大程度上做到了這一點。C#的異步和等待等現代語言功能為實現並發程序提供了很大的改進。

示例項目

那麼用數學思考是什麼樣的一個過程呢?最近,我在工作中研究了一個API,它為商家的加密貨幣定價。它考慮了最近的價格變動,並建議商家在動蕩時期收取更高的價格。

雖然我們在理論上做了一些功課,但我們想通過實證檢驗它以了解它在各種市場條件下的表現。為此,我設計了一個機器人來模擬與我們的API開展業務的商家,以了解它的表現。

BTC / USD(1天)

預備步驟:

定義:匯率r(t)是法定/加密貨幣的市場匯率。

定義:商家費率r'(t)是商家被建議向客戶收費的修改後的匯率。

定義:當客戶購買商品時,我們稱該行為是「購買」。購買包括法定價格和時間。p =(f,t)。

定理:通過應用修改的匯率t(p)= p(1)/ r'(p(2))找到購買的加密量。

證明:p(1)/ r'(p(2))= fiat /(fiat / crypto)= fiat * crypto / fiat = crypto

定義:當商家出售他們的加密資產時,我們將該事件稱為銷售。銷售包括加密金額和時間戳。s =(c,t)。

定理:通過將匯率應用於銷售g(s)= s(1)* r(s(2))來找到商家從銷售中獲得的法定金額。

證明:s(1)* r(s(2))= 加密*(法定/ 加密)=法定

定義:一組購買和銷售的餘額是所有購買加密金額和所有銷售加密金額之間的差額。b(P,S)=從t到p(p_i)的i到N之和 - 從j到M的s_j(1)之和

請注意,b(P,S)> = 0必須始終成立。

定義:一組購買和銷售的收益是銷售法定金額和購買法定金額之間的差額。e(P,S)=(s_j(1))從j到M的總和- p_i(1)從i到N的和> = 0。

目的

定義:如果大多數典型的購買和銷售收入都是非負的,我們說商家利率是有利的。

r'(t) is favorable iff e(P, S) >= 0.

在一個有利的案例中,商人通過接受加密並沒有失去任何法定貨幣。

「大多數」和「典型」的兩個要求將不會被嚴格定義。

作為典型的一部分,我們可以假設商家會及時出售他們的加密資產。因此,假設s_i(2) - s_j(2)<W在i,j屬於{1 .. M}範圍內時成立,某些約束W.購買金額應隨機分布在商業行為完成的合理範圍內。也許10-100美元。

機器人的目標是驗證r'(t)是有利的。

請注意,此定義只是質量的一種衡量標準。也許抵制最壞的情況比有利更重要。在這種情況下,我們會擔心可能會進行一組收益非常低的購買。

算法

重複多次:

隨機選擇時間範圍[t0,t1]。在[t0,t1]內的隨機時間生成一組購買。價格應該在典型價格的[p0,p1]範圍內。在[t0,t1]內以均勻間隔時間(可能具有輕微隨機噪聲)生成一組銷售額。每次銷售應該是當時的全部餘額。計算這些集合的收入。記錄收入。後:

報告有多少收入為負數,有多少為非負數。顯示每個的百分比。確定最低和最高收入並報告。

總結

當你閱讀這個例子時,我認為你的傾向可能是認為它的陳述是顯而易見的。當然,這些步驟都不是很難。然而,令我驚訝的是,我的許多假設得到了糾正,選擇有利結果的客觀定義是多麼困難。這個過程讓我意識到一些如果我從簡單編寫代碼開始的話,就壓根不會考慮的假設。也許最大的好處是,在編寫之後,我能夠與同事一起快速審查它並進行簡單的更正,但在代碼中很難改變。

我希望用數學語言思考會給你的項目帶來類似的好處!請注意,此示例只是一種利用數學思維的方式。

相關焦點

  • 學Python編程為什麼會對學好數學有幫助呢?
    下面的Python代碼用於求階乘運算,factorial(n)是求階乘運算的函數,n是要求階乘的自然數, n是指自然數1、2、3、4、5、6、……。同學們可以先不用理解這段代碼及factorial(n)函數,在後面的課程我們會詳細講述,在這裡主要是理解用編程來實現數值計算的意義。
  • 如何學好數學
    要學好數學這門課必須領悟以下幾點:1、要領悟數學「黃金圈思維」。具體來說,一共有三個問題值得我們去深思:第一個問題:為什麼要學數學?大家一定覺得很簡單,我是這麼理解的:數學是重要的學科,內容豐富多彩;數學是有力的工具,在很多領域起著關鍵作用;數學是長青的知識,結論具有永恆的意義;數學是關鍵的技術,所有高技術都要應用到;數學是先進的文化,影響著人類文明的進程;數學也是義務制教育裡必學的學科,影響著升學考試。
  • 中國第一代程式設計師裡的「四大天王」,30年前敲代碼,現狀如何?
    網際網路來中國的時間不長,平時接觸的程式設計師敲代碼超過十年以上的也是少數,在為自己擔心的時候,不妨看一下中國的第一代程式設計師們的現狀,他們從1988年開始敲代碼,如今也已經有了三十年的經驗當時的他們名震世界,如今卻差距太大,有的人身價千億、有的人財務自由瀟灑過生活、有的人卻被掃地出門黯然離場。
  • 「學好數學的秘密不在課堂」
    原標題:「學好數學的秘密不在課堂」 「初中是數學學習的關鍵過渡期,這對初中數學教師的教學能力和教學方法提出了挑戰。」昨天,美國芝加哥大學數學系教授扎爾曼·尤西斯金在華東師範大學分享了他多年的教學研究成果,並接受文匯報記者採訪。
  • 數學家談:如何學好數學?
    生前曾任中國科學院數學研究所所長、中國數學會理事長、中國科技大學副校長等職。以下是他在1962年對廣東省數學會會員和中學教師的一次講話中關於「怎樣學好數學」的內容,相信對同學們學好數學會有所教益。 一、基本運算要熟、要快 基本運算不但應當「會」,而且要熟、要快。
  • 華羅庚:如何學好數學
    生前曾任中國科學院數學研究所所長、中國數學會理事長、中國科技大學副校長等職。以下是他在1962年對廣東省數學會會員和中學教師的一次講話中關於「怎樣學好數學」的內容,相信對同學們學好數學會有所教益。基本運算不但應當「會」,而且要熟、要快。這樣的要求不但是為了目前的質量,而且更重要的是保證進一步學習的進度與質量,是為了運用自如。應當與「會了就可以,習題可以少做」的思想鬥爭。
  • 極客晨星名家講堂開講,首師大教授分享學好數學的奧秘
    8月11日20:00,極客晨星少兒編程名家講堂「科技一小時」直播在中國青年報客戶端開啟,首期嘉賓為首師大數學科學學院副教授、數學奧林匹克北京隊總教練和領隊梁志斌老師,分享了」籃球傳球問題背後的數學奧秘「
  • 兩度破譯「白宮密碼」,卻稱自己是抱娃敲代碼的普通媽媽
    抱娃敲代碼基於Hash函數的MD5和SHA-1是由美國標準技術局(NIST)頒布的,是國際上公認最先進、應用範圍最廣的兩大重要算法。那十年,當別人在為了評職稱、拿獎勵,不斷想辦法發表「注水」論文的時候,王小雲在不斷敲代碼
  • 2 好記性是學好數學的最大障礙,「融會貫通」打通任督二脈……
    這是人教版四年級數學下冊的每二篇分享。不改變這一點,不可能真正學好數學……在學習數學中,算術是基礎,而代數正是從算術演變得來的。家長們之所以覺得很多小學數學題看上去超級簡單,但是要用小學生已學的知識來解的話,就變得超級難了,是因為如果不用小學以後才學到的一些方程式來解決的話,好像根本就無從下手了。算術,它就是從 1 + 1 = 2 開始的。
  • 用代碼了解數學符號
    全文共1595字,預計學習時長6分鐘學好數理化,走遍天下都不怕!這句話我們從小就聽,放到今天似乎依然行得通。達文西說:「數學是一切科學的基礎」,數學與代碼之間也有著千絲萬縷的聯繫。似乎任何熱衷於機器學習、數據科學的人都相信,總有一天,他們將研究透徹python庫,暢享裡面的數學知識。大量論文集將展現在你面前,詳細說明其原理。對核心數學的理解越深入,你就越可能獲得靈感,創造新方法。對於多年來鑽研數學或從事機器數學學習的人來說,將上面這個方程式詳細地解析為含義和代碼並不難。
  • 數學重要不重要?全看用不用得到
    比如評價數學到底重要不重要時,他們會先說,「學會數理化走遍天下都不怕,所以數學很重要,」然後再加個「但是」繼續說,「對大部分電子工程師來說,數學其實用不到,所以不重要」。本文引用地址:http://www.eepw.com.cn/article/201907/402650.htm但是,真的用不到嗎?不久前,我還和一位同事-楊工-結合著我們的日常工作和人生規劃辯論過這個問題。
  • 1700頁數學筆記火了!全程敲代碼,速度飛快,硬核小哥教你上手
    這位來自歐洲的小哥非常強烈安利Vim文本編輯器,他說:用LaTeX寫數學公式,我選Vim編輯器。它強大、通用、可擴展性很強。只要是基於文本的任務我都用它,寫代碼、編輯LaTeX、寫markdown都是。雖然入門階段的學習曲線超級陡峭,但只要掌握了基本的操作方式,就會欲罷不能。
  • 學好初中數學從掌握數學思想開始 新東方在線教你從這兩點開始
    這是由於初中數學對同學們思維能力和數學意識的考察越來越強,不僅要求同學們具備較強的理解辨別能力,還需要掌握一定的數學解題思想。數學解題思想,指的是能從問題中「提取」必要的數學信息,並從數學的角度思考解決問題的策略和方法,對於同學們學好數學有很高的指引性。
  • 中國科學院院士告訴你,怎樣才能學好數學?
    數學知識太多了,我們不可能統統掌握,所以只能在眾多的數學分支裡面,挑選那些最重要的進行學習。什麼是最重要的呢?比如說我們小學學的算術,那是人類幾萬年智慧的結晶。小學念完念中學,中學是簡單的代數,也相當於算術的發展,還有一些初等的幾何學,這是人類幾千年的智慧結晶,所以我們要學。中學念完念大學,大學學什麼呢?
  • 基礎不太好如何學好高中數學?
    高中數學怎麼學好,這個問題說實話很寬泛,要對每一個階段,每一個可能遇到的問題,每一個層次都展開說的話我可能需要十篇長文。 由於篇幅有限,本篇回答將會涵蓋我高中學習三年以及畢業後一年思考得出的學好高中數學最關鍵最重要的部分。
  • 李大潛院士:今天我們為什麼要學數學?怎麼學好數學?
    我們希望看到的是教師付出了認真的努力,學生通過學習更加熱愛數學,愈學愈想學,對進一步學好數學充滿了熱情和渴望,但實際的情況和這個差距還比較大。這不能怪這一部分學生不是學數學的材料,從教師的角度,應該更多地認識到,我們的教學方法,包括我們所編的教材,還有很大的改進的空間和餘地。
  • 初中數學:圖形計算公式匯總,很全面!學好數學就靠它了!
    數學是一門基礎學科,對於許多同學來說,數學學習的好壞與否,會直接影響到後面化學、物理、生物等學科的學習,由此可見學好數學是多麼的重要。而在數學的學習中,幾何題目是同學們掌握起來比較吃力的部分。特別是那些比較難一點的幾何題目。
  • 高考數學之常用的公式匯總,高考數學重要考點
    數學是一門基礎學科,它涉及生活的方方面面。學好數學是21世紀人們所必須完成的任務。在這種形勢下,如何學好數學就顯得非常重要。數學的學習從幼兒時期就已開始,兒童認識數字,學習加減法,然後到小學時打下數學基礎。這一階段學習的都是非常基礎的、日常生活中常用的實用數學。
  • 學好初中數學從掌握數學思想開始 新東方在線教你從這兩點開始...
    這是由於初中數學對同學們思維能力和數學意識的考察越來越強,不僅要求同學們具備較強的理解辨別能力,還需要掌握一定的數學解題思想。數學解題思想,指的是能從問題中「提取」必要的數學信息,並從數學的角度思考解決問題的策略和方法,對於同學們學好數學有很高的指引性。
  • 數學老師分享學好數學的三個小忠告,高一高二高三都適用!
    在學校不少同學都存在偏科的現象,特別是數學這個科目,不少同學都感覺數學太難學了,甚至不少同學考及格都難,到底數學要怎麼樣才能學好呢?下面是一數學老師分享學好數學的三個小忠告,大家都應該好好讀一下。