【D1N910】編程習(xí)慣養(yǎng)成與思維學(xué)習(xí)筆記
正常操作,正常分析,大家好我是D1N910。
下面是學(xué)習(xí)
https://linklearner.com/#/learn/detail/60
編程習(xí)慣養(yǎng)成與思維 的內(nèi)容

1/7 防御性編程的基本思想
假設(shè)A:不要指望用戶(hù)提供您所需的完美輸入。即使您要求的是正數(shù),用戶(hù)可能會(huì)提供其他類(lèi)型的輸入。
假設(shè)B:即使您是程序的編寫(xiě)者(可能是我,也可能是您自己),程序可能存在錯(cuò)誤。因此,您應(yīng)該意識(shí)到不僅用戶(hù)可能會(huì)犯錯(cuò),程序的其他部分也可能會(huì)出錯(cuò)。
進(jìn)行多樣化的測(cè)試:為了應(yīng)對(duì)可能出現(xiàn)的問(wèn)題,您需要進(jìn)行各種不同的測(cè)試。您的假設(shè)是寧愿在某些事情出錯(cuò)的情況下發(fā)現(xiàn)錯(cuò)誤,而不知道問(wèn)題的具體來(lái)源。
主要原則:要記住的重要事情是,人們普遍有犯錯(cuò)的傾向。因此,編寫(xiě)程序的目標(biāo)是避免在用戶(hù)犯錯(cuò)時(shí)發(fā)生災(zāi)難性后果。
養(yǎng)成防御性編碼的習(xí)慣:為了實(shí)現(xiàn)上述目標(biāo),您需要培養(yǎng)編寫(xiě)防御性編碼的習(xí)慣,即考慮可能出現(xiàn)的錯(cuò)誤和異常情況,并采取相應(yīng)的措施來(lái)防止災(zāi)難發(fā)生。
2/7 科學(xué)分析思維?
迭代問(wèn)題邏輯
1、選擇一個(gè)可以計(jì)算的變量(Choose variable that "count")
2、在外部需要初始化它(Initiative outside the loop)
3、需要設(shè)置正確的最終測(cè)試(Setup and test)
4、構(gòu)建代碼塊(Conctract block)
5、清楚當(dāng)代碼運(yùn)行結(jié)束后該怎么做(What to do when done)
代碼效率
目前需要解決問(wèn)題的增長(zhǎng)速度高于電腦計(jì)算速度的增長(zhǎng)
在時(shí)間、空間恒定的情況下,需要考慮的是:
1、計(jì)算需要多少內(nèi)存
2、輸入大小的函數(shù)所需的基本步驟數(shù)量是多少
3/7 圖靈完備語(yǔ)言
圖靈完備語(yǔ)言包含三部分
1、數(shù)據(jù):數(shù)組、字符串、布爾值
2、操作:數(shù)字運(yùn)算,如+、-、and、or等
3、命令:賦值、輸入/輸出、條件/分支、循環(huán)機(jī)制
有了這三部分,我們就可以做任何事情,包括自然語(yǔ)言學(xué)習(xí),圖像識(shí)別,語(yǔ)音識(shí)別等
4/7?Debugger的思路
debugging的目標(biāo)是朝著沒(méi)有錯(cuò)誤的程序進(jìn)行運(yùn)行。做這個(gè)最好的兩個(gè)工具是打印和閱讀代碼(帶著懷疑的眼光看)?首先要發(fā)現(xiàn)產(chǎn)生問(wèn)題的最小輸入,然后進(jìn)行打印測(cè)試。
采用二分法進(jìn)行測(cè)試:
????每次是在代碼中進(jìn)行打印,每次測(cè)試可以排除一半的代碼塊。
????* 自己先預(yù)測(cè)一下結(jié)果會(huì)是什么,耐心冷靜的減小搜索出現(xiàn)問(wèn)題的地方。
請(qǐng)教別人:
????在請(qǐng)教別人的時(shí)候,自己會(huì)把問(wèn)題邏輯整理清楚再去問(wèn)。有時(shí)候在問(wèn)的時(shí)候,問(wèn)了一下,自己就會(huì)恍然大悟,原來(lái)是這樣。
5/7 抽象化、模塊化、封裝代碼
這部分是為了解決閱讀代碼的問(wèn)題。幾十萬(wàn)行的代碼直接理解起來(lái)不是一件簡(jiǎn)單的事情。通常會(huì)把代碼進(jìn)行分成幾個(gè)模塊,一個(gè)模塊負(fù)責(zé)對(duì)應(yīng)相關(guān)的操作。這樣不僅有利于閱讀代碼,同時(shí)也方便后續(xù)的debugger。
例如:機(jī)器學(xué)習(xí)的相關(guān)代碼會(huì)分為數(shù)據(jù)清洗、訓(xùn)練、測(cè)試,三個(gè)大模塊。
6/7?如何知道運(yùn)行代碼的時(shí)間
經(jīng)過(guò)基礎(chǔ)部分的學(xué)習(xí)大家已經(jīng)了解到運(yùn)行不同的代碼是需要不一樣的時(shí)間的。影響代碼運(yùn)行時(shí)間包括但不限于:機(jī)器性能、使用的語(yǔ)言、數(shù)據(jù)量。因此我們不能直接預(yù)估運(yùn)行代碼的時(shí)間,畢竟機(jī)器性能、使用的語(yǔ)言、數(shù)據(jù)量等都會(huì)不同。但是在知道運(yùn)行我們的程序的實(shí)際步驟后會(huì)有利于縮短我們運(yùn)行代碼的時(shí)間。
舉個(gè)例子:魔方復(fù)原,在復(fù)原魔方的時(shí)候,如果一開(kāi)始不知道怎么復(fù)原,沒(méi)有思維邏輯進(jìn)行復(fù)原,可能需要的時(shí)間需要很久。通過(guò)查閱相關(guān)資料與思考,最終可以將復(fù)原魔方幾個(gè)步驟,就可以順利復(fù)原。
所以運(yùn)行代碼的時(shí)間在于你知道你的代碼需要運(yùn)行多少步。思考的邏輯決定了你的運(yùn)行代碼時(shí)間。
7/7 如何修復(fù)他人的代碼
在編程的時(shí)候,我們常常會(huì)借鑒別人的代碼。但因?yàn)榘姹?、運(yùn)行環(huán)境等的影響,并不是每一份代碼都可以完整復(fù)現(xiàn),這時(shí)候就要修復(fù)他人的代碼為我所用。
思路如下(參考(4)Debugger
0、進(jìn)行系統(tǒng)性思考(參考之前的內(nèi)容
1、記錄下每個(gè)你嘗試過(guò)的方式、修改過(guò)地方
2、考慮重新假設(shè)
3、調(diào)試代碼
4、放下自己的驕傲,尋找他人的幫助
5、離開(kāi)一段時(shí)間再回來(lái)修復(fù)
End