Github開發大神教你玩轉資料庫程式設計

Github開發大神教你玩轉資料庫程式設計

新智元報道

編輯:時光

【新智元導讀】

每個人的心目中都有自己最喜歡的程式設計問題。這次,我們先跟著這位大佬去資料庫的世界裡溜一圈看看。

在Github上,一位名叫Arthur O’Dwyer的使用者,經常發表關於C++程式語言方面的東西。

最近,他分享了一次發生在2013年的軟體工程面試經歷。

如今,9年時間已過,他卻對此記憶猶新。

Dwyer表示,這道題可以說是大多數真實世界程式設計的一個縮影。

就比如說,當你維護一個龐大的程式碼庫時,總會有一些你不完全理解的程式碼路徑,一些感覺沒有必要的風格,以及大量難以立足的程式碼。

給你3個小時,能夠做出來嗎?

首先我們來看看這個「程式設計挑戰」長什麼樣。

透過incr和decr命令,memcached可以把k加到某一個數字上。然而,memcached不提供其它算術運算,尤其是沒有乘以k這個操作。

現在,你要向memcached新增一個mult命令。在完成之後,能利用telnet到memcached的客戶端執行如下命令:

memcached入門

在這個題目中,面試者要求使用memcached資料庫進行程式設計。

memcached是高效能的分散式快取伺服器,用來集中快取資料庫查詢結果,減少資料庫訪問次數,以提高動態web應用的響應速度。

為了成功構建memcached,可能需要brew install libevent和其它一些東西。

你可以假設,所有參加面試者都已獲得Linux裝置的訪問許可權,它具有所有正確的依賴項。

讓我們繞過GitHub Repo,解壓一個當代的原始碼發行版:

現在,就已經構建了memcached可執行檔案,可以開始執行:

透過預設的memcached埠11211與伺服器通訊,這可以使用普通的telnet來對話:

如果沒有telnet,也可以用nc-c代替。

玩轉memcached

memcached是一個鍵值儲存,這意味著可以告訴它記住一些東西,如鍵和值之間的關聯。

在memcached中,鍵是指ASCII字串,值是指任意位元組流。

例如,在telnet會話中輸入:

這等於告訴memcached記住:字串鍵fullname和10位元組值John Smith之間的關聯。

這一行程式碼上的其它數字是一個「flags」值0,要與位元組流值一起記住,到期超時3600秒。

之後,memcached將會忘記這個關聯。

無論如何,在你輸入這兩行之後,memcached將會響應:

現在,你可以檢索fullname值,在同一個telnet會話中輸入:

memcached將返回:

memcached可以覆蓋fullname關聯的值,透過發出另一個set fullname命令,可以要求memcached以特定的方式修改值。

例如,有專門的命令用於append和prepend。

如果你想在客戶端程式中附加-Jones到fullname,可以這樣做:

如果你有多個客戶端連線到相同的memcached伺服器,他們都會同時新增到相同的鍵。

這個get/set版本可能會導致一些更新後的資訊丟失,而append則保證會找到它們。

另一個執行的專用命令是incr:

memcached會使用自增後的值進行響應:

這個響應很有用,因為有很多個客戶端。如果你發出一個單獨的get age命令,你只有在其它幾個客戶端完成各自更新後,才可能看到新的值。

假如,你打算將該值用作序列號、SQL主鍵或類似的東西,那麼,有一種方法可以檢視增加的值,這是非常好的。

當然,memcached也會記住增加的值:

注意37和38仍然以位元組串的形式儲存和返回。

它們被ASCII解碼為整數,然後作為原子化操作的一部分返回。

如果你試著incr一個非整數值,你會得到一個錯誤:

最後,記得incr或decr任何正值,而不僅僅是1。

順便說一下,當你完成與memcached的通訊並希望終止連線時,可以鍵入memcached命令quit,或者,你可以使用nc-c、Ctrl+D同樣起作用。

最好的面試問題

「這是我在工程面試中遇到的最好問題!」9年後,Dwyer依然這麼認為。

因為,它非常清晰地將候選人劃分為三種:

第一種型別是看完題就直接懵了的人。不過他們可能沒有多少能夠在面試過程中走到這一步。

第二種型別可能會想:「我知道怎麼做,乘法就是加法的重複,我們已經有了一個現成的加法子程式,即incr的形式。所以我只需要在這個基礎上,嗯,把x的值加到它自己的身上……哦對了,整個過程還需要是的,然後再讓我們來看看這個鎖該怎麼用……」

結果,他們在各種坑裡越陷越深。最後,3個小時過去了,一點有用的東西都沒有寫出來。顯然,這種型別的候選人也不會被錄用。

第三種類型說:「我知道怎麼做,乘法和加法一樣,除了加法做+,乘法我應該做*。」

於是,他們複製貼上把所有的「+s」改成「*s」,並在規定的時間內完成了。

這種型別的人就很可能被錄用。

當然了,更加優秀的候選者會注意到,需要一些時間來潤色他們的程式碼,才能正式提交。

Dwyer表示,這個挑戰特別適合用在面試中,因為只有一個正確的答案,也就是將「bool incr」改為「int opcode」(或任何與之同構的答案)。與此同時,問題提供的程式碼和陳述和在一起提供了非常明確的暗示,目前有兩個算術運算指令,而你的工作是將其擴充套件到三個算術運算指令。

順便說一句,memcached資料庫挑戰需要熟練掌握C++語言,如果你的程式碼庫都是Python和Go,你可能不會使用memcached。

有趣的是,出這道題的作者也看到了這個帖子並且回覆稱,自己是在工作了幾個月之後想出來的。

作者表示,資料庫的程式碼非常龐大而且複雜,對於最開始的那一年,幾乎每次維護都像是在做題。

顯然,「快速弄清楚一段不熟悉的程式碼塊」這個技能,可以說是相當的重要了

參考資料:

https://quuxplusone。github。io/blog/2022/01/06/memcached-interview/