? ? 前些天買了一本新書《枕邊算法書》([韓] 林栢濬 著;崔盛一 譯,人民郵電出版社,2018),也是想作為睡前讀物看看??戳艘粋€(gè)晚上,確實(shí)如書名所言,文章主要以作者的經(jīng)歷,寫的比較貼近程序員生活,不像傳統(tǒng)的一些算法或編程書比較刻板。這么寫的優(yōu)點(diǎn)是作者通過自己的經(jīng)歷,從自身角度出發(fā),通過一個(gè)個(gè)實(shí)際遇到的小問題小故事,寫得生動(dòng)有趣。當(dāng)然,也有缺點(diǎn),因?yàn)閺淖陨沓霭l(fā),所以有些想法很主觀,對現(xiàn)在的國內(nèi)開發(fā)者,并不一定完全合適。
? ?先說說看了第一章前幾節(jié)的一些共鳴:對自己編寫的代碼進(jìn)行單元測試,是“必須”的,而非“可選”環(huán)節(jié)。這點(diǎn)我深有感觸,不能因?yàn)橼s進(jìn)度,自己都不測試一下就把代碼提交,至少在團(tuán)隊(duì)協(xié)作中,每個(gè)人要對自己編寫的代碼負(fù)責(zé),這確實(shí)是工作態(tài)度問題。大部分情況下,查找bug是考驗(yàn)韌勁和注意力的過程,與奇思妙想或精妙構(gòu)思相比,查找bug更多地需要毅力。經(jīng)常調(diào)試別人的代碼時(shí)提高編程能力的捷徑之一。這點(diǎn)我非常同意,因?yàn)槲易陨砉ぷ鞯脑?,?jīng)常要對別人的代碼進(jìn)行二次開發(fā),而這個(gè)過程可以學(xué)到很多技巧。而即使有遇到不明白的地方,由于工作原因,也會(huì)迫使自己去學(xué)習(xí),或者去請教相關(guān)的知識(shí)。
? ? 而一些作者主觀的內(nèi)容,也很明顯,也可能和作者國籍有關(guān),有些我甚至覺得太為難自己。第一章里作者就幾次通宵熬夜,這種不放棄的毅力值得學(xué)習(xí),但我不支持常年加班熬夜,身體健康更為重要,畢竟“活著才能寫出代碼”。而他的另一個(gè)觀點(diǎn),“不能再承諾時(shí)間內(nèi)完成任務(wù)的人,壓根算不上是程序員”,我想了下,也許他是沒遇到過需求一天變?nèi)兊漠a(chǎn)品經(jīng)理吧。此外,作者覺得想“一下子”解開算法問題的都只是編程菜鳥,“高手”應(yīng)該是一步一步向著最終目標(biāo)前進(jìn)的。我覺得,真正的高手才是那種“靈光一閃”,然后“一下子”解決問題的人,一步一步按部就班解決問題并不一定是“高手”,但是可以說是“閱歷豐富”,至少很穩(wěn)健。比如小學(xué)生做數(shù)學(xué)題:8x134,按部就班的學(xué)生會(huì)列“豎式”進(jìn)行一步一步按位乘法計(jì)算,真正的高手會(huì)是8x134=8x(125+9)=1000+72=1072. 此外,作者覺得有紙筆的情況下,3分鐘以內(nèi)應(yīng)該能解開愛因斯坦的那道邏輯題。我才疏學(xué)淺,開了個(gè)excel表記錄,花了大概5分鐘解開了。這種謎題如同作者所言像查找bug時(shí)找凌亂的線頭,其實(shí)毅力更為重要,大家不用糾結(jié)是3分鐘,還是5分鐘。另外我想說的是,好記性不如爛筆頭,借助工具可以讓你更有效地提高效率。
接下去分享一下昨天看到的幾個(gè)趣題,確實(shí)不錯(cuò)。
1. 一個(gè)島上有N個(gè)和尚,紅眼睛是被詛咒過的,如果知道自己是紅眼睛,當(dāng)晚就會(huì)自裁。但是他們規(guī)定,不能告訴別人或者問別人自己的眼睛顏色,島上也沒有鏡子或其他可以看到自己眼睛顏色的條件。直到有一天,一個(gè)游客來玩,說了一句:你們之中至少有一人是紅眼睛。接下去島上發(fā)生了可怕的事。 這個(gè)故事最終從遞歸角度來講,解釋了所有情況,淺顯易懂。
2. 大家要習(xí)慣寫“防御型代碼”,增加代碼的健壯性。作者用了個(gè)很通俗易懂的例子來說明了Java中常見的NullPointerException,一道數(shù)學(xué)題:假設(shè)a=b, 那么a平方 = ab,a平方-b平方=ab-b平方,(a-b)(a+b)=b(a-b),a+b=b,b+b=b,2b=b,2=1。實(shí)際編程中經(jīng)常遇到這種類似的看起來很低級(jí)的錯(cuò)誤,因此需要寫“防御型代碼”規(guī)避類似的“低級(jí)錯(cuò)誤”。
3.挑戰(zhàn)一下自己,用Java或其他編程語言編寫一段代碼,內(nèi)容是輸出這段代碼本身。
4. 愛因斯坦的那道邏輯題:五個(gè)國家的人住在5棟屋子里,彼此愛好不同的飲料、香煙,養(yǎng)不同的寵物。①英國人住紅房子。②瑞典人養(yǎng)狗。③丹麥人喝茶。④綠房子緊鄰在白房子左側(cè)。⑤綠房子主人喝咖啡。⑥抽“長紅”牌香煙的人養(yǎng)鳥。⑦黃房子主人抽“登喜路”牌香煙。⑧正中央房子的主人喝牛奶。⑨挪威人住在最左側(cè)房屋。⑩抽Blends牌香煙的人住在養(yǎng)貓人隔壁。?養(yǎng)馬人住在抽“登喜路”牌香煙的人隔壁。?抽Bluemaster牌香煙的人喝啤酒。?德國人抽Prince牌香煙。?挪威人和藍(lán)房子主人相鄰。?抽Blends牌香煙的人與喝礦泉水的人是鄰居。問:誰養(yǎng)鳥???
這道邏輯題我正好身邊沒紙筆,借助了excel,感覺和做數(shù)獨(dú)差不多,線索還是很線性很明顯的。