程序員挑戰:如何讓一個技術小白搞懂二分法檢索?
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)
在向萌新介紹計算機科學時,教授基本算法可能是很具挑戰性的部分之一。它介于假設性問題和抽象性思維之間,十分棘手。但或許可以不必這么困難。有一個小眾的觀點:只要能清晰地構造問題,任何一位善于思考的人都可以對一個基本算法問題提出優秀的解決方案。
不相信嗎?可以找一個朋友試驗一下。我敢打賭,即使他們沒有任何技術背景,最后他們也能開發出一個二分法檢索的算法,并且理解這個概念。
傳統意義上的二分法檢索問題
以下是Geeks for Geeks上給出的二分法檢索的定義:“給定一個包含n個元素的排序數組arr[],編寫一個函數來搜索arr[]中的給定元素x。”
即使我是軟件工程專業,但讀到這里時依然會頭疼。如果用這么復雜的語言來講述,聽者保證會一只耳朵進,另一只耳朵出。不要這么做。
構造好問題是成功的一半。如果想用一種不那么專業的方法來提問二分法檢索問題,以下是一種很好的方法:“你有一大盒一模一樣的雞蛋,想要測試這些雞蛋的硬度。假設你在一棟100層的辦公樓里工作,要找到把雞蛋扔下去還完好無損的最高樓層。如何盡快做到這一點?”
雖然不必完全一致,但在構建問題時,應該記住下列提示。
技巧1:把問題當作與編程無關的問題來交流
對于非技術人員來說,計算機科學是很“可怕”的。相信我,因為我深有其感。曾經有一段時間,我對編程的了解僅限于電視節目中播放的有關黑客攻擊的片段。我對它一無所知,只能一臉茫然地聽別人解釋什么是程序或算法。
如今,作為一名軟件開發人員,我意識到編程實際上并沒有第一眼看起來那么難。計算機語法非常有誤導性。無論你是否有技術背景,只要你善于思考,都可以想出很棒的算法解決方案。
那么我的建議是什么呢?那就是不要講代碼。別把它當成是一個編程問題。這會把他們嚇壞的。

技巧2:利用常識
“想象一個嚴格遞增的整數值的列表…”等等。信息過載了。你也一樣。我的建議是:不要解釋,讓常識幫你做這件事吧。
是的,二分法檢索要求搜索列表需按照一定的順序和方向排列,但不必用那么多的術語來表達。
我在構造問題時,通過使用一棟建筑來類比,將每個潛在值(樓層數)都控制在一個嚴格遞減的區間。因為這是現實世界中人們心照不宣的常識。
每個人都知道,如果東西從高處掉落,重力只會把它拉向一個方向——下方。通過常識,人們知道,如果一樣東西從某一樓層摔下還能完好無損,那么在比該樓層低的任何一個樓層也都不會摔碎。
常識能比我們更好地解釋問題,好好利用它。畢竟,每個人都更愿意解決適用于現實世界的問題。
技巧3:避免使用過多的技術術語
你是一個軟件工程師或數學專業的學生,你喜歡用你們復雜的術語交流。但和其他領域一樣,你每天都在說的行話對小白來說幾乎毫無意義。就像一個外科醫生在向病人解釋的時候,會盡可能簡化說明,所以,應該盡量避免使用計算機科學領域特有的行話。
記住,你是在教別人一個概念,而不是炫耀專業知識或教他們技術術語。
避免使用“臨界”等字眼。雖然“臨界值”在算法世界中可能意義重大,但大多數非技術人員并不能意識到這一點。你會注意到我在上文中要求的是最高樓層,而不是“臨界樓層”。
應該使用簡單的用語,盡可能用能讓非技術人員聽明白的語言講述。
是的,你可以定義“臨界”這個詞,但這又有什么意義呢。這個詞對于問題本身是不必要的,它只是添加了一個會分散注意力的信息。對于那些有不必要定義的詞,請跳過它們。
此外你會注意到,我構建問題時使用的是100層,而不是二分法檢索問題中常用的n層。
計算機科學家可能習慣于把每個問題中的“n”看作是概括問題大小的一種方法,但大多數人認為“n”只是問卷中“no”的縮寫。即使用任意值構造的問題可能適用于普遍情況,但任意值不會改變問題的本質。
如果想讓別人理解一個問題,就給他們一個很好的整數作為起點,這樣他們的大腦就會專注在這個問題上。而任意數字很難概念化。讓他們專注于手頭的問題,而非專注于可視化任意值“n”。
除非絕對必要,否則不要將問題普遍化。先解決問題,再根據需要進行概括。這是我解決任何算法問題的技巧,但對于同完全沒有技術背景的人交談時,這一點便尤其重要。
小貼士:設身處地為他們著想
耐心點。做一名你一直想在面試中渴望遇見的那種面試官,在需要時提出提示性問題。
沒有人喜歡待在原地不動,不知道下一步該去哪里,這令人沮喪和尷尬。如果有人陷入困境,請幫助他們。問他們一個問題,讓他們找到正確的方向。或者,如果他們的解決方案是錯誤的,給他們一個不是最優的解決方案,而不是直截了當地告訴他們答案。
設身處地為一個沒有技術背景的人想想,請別人來解決雞蛋掉落的問題會很有意思。你會感到驚訝,原來那么多對編程一無所知的人能解決算法問題。