天天看點

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/

繼續閱讀