原文在我的部落格:
筆試題
40分鐘,A4紙手寫。
好多年都沒握過筆了。
筆試完就感覺比較虛,過不了關。
MVC
中的 M, V, C 分別代表什麼?我的答案:
Model
View
Controller
分析:回答比較粗淺,只寫出了完整的單詞。
以下程式碼的執行結果
$value = FALSE; if (empty($value)) { echo 'null'; } else { echo 'have value'; }
我的回答:have value
正確答案:null
分析:對 empty 方法記憶模糊不清。
判斷一個變數是否被認為是空的。當一個變數並不存在,或者它的值等同於false,那麼它會被認為不存在。如果變數不存在的話,empty()並不會產生警告。
——empty
寫出示例中日本電話號碼的正則:03-1234-5678,06-1224-5989
我的回答:正則不熟悉,隨便寫了些。
正確答案:
改進:系統學習下正則,之前也學過,用的時候還是習慣去搜現成的表示式。歸根結底還是沒學會。
寫出下面程式碼的執行結果:
$arr = [2, 3, 5, 8, 10, 9, 7, 5, 9]; // 2 3 5 8 10 9 7 5 9 // 0 1 2 3 4 5 6 7 8 // 0 5 // 1 8 // 2 9 // 3 9 // 4 陣列沒有下標為10的元素 null $num = 0; for ($i = 0; $i < 5; $i++) { $num += $arr[$arr[$i]]; } echo $num;
我的回答:31
實際情況:
PHP Notice: Undefined offset: 10 in /code/demo11.php on line 28
分析:分析出來下標為 10 的陣列元素不存在會報錯,答案硬是給寫出來了個數字。感覺自己太教條了,認為程式的目的是算出一個數字,不管咋都要得出個結果。
在 Linux 下,從當前資料夾及子目錄中查詢內容中包含
old
的檔案:我的答案:
find -R ./* | grep 'old'
正確答案:
grep -lr 'old'
分析:
雖然現在主力系統是 ubuntu,但是平常搜檔案都是圖形介面搜尋,查詢某個字元也是直接在 VSCode 中直接全域性查詢。
在終端查詢的這些命令不熟悉,猜測是用
find
查詢,結合用過的其他命令,拼湊了一個自己實際沒用過的答案。改進:熟悉常用的 Linux 命令。
寫一個方法,不使用 PHP 內建函式,翻轉一個字串:
我的答案:思路是把字串分割成陣列,然後重新排序,再拼回去。但是因為要用筆,純手寫,寫了一通又劃掉了。
回來以後寫的答案:
function strReverse(string $str = '') { $strs = mb_str_split($str); return implode(array_reverse($strs)); // 不知道這算不算使用內建函式 // 直接使用內建函式: strrev($str); } echo strReverse('ni da ye de ...');
分析:
當時也沒想起來用 mb_str_split 分割字串,實際專案中也沒用上過這個函式。
想到的是 explode(實際是沒辦法按每個字元分割的),結果和 implode 老是搞混,寫的是 implode。
陣列翻轉的函式名 array_reverse 當時也沒想起來,說實話 strrev 我也沒想起來,curd 的時候也沒用上過。
寫一個方法,不使用 PHP 內建函式,去重並列印陣列中的數字:
$arr = [5, 6, 5, 8, 10, 6, 9, 20];
,列印結果為:5 6 8 10 9 20
。我的答案:雖然列印出來了,但是格式不對,中間沒有空格。
$arr = [5, 6, 5, 8, 10, 6, 9, 20]; $tmp = []; foreach ($arr as $k => $v) { if (!in_array($v, $tmp)) { $tmp[] = $v; echo $v; } }
回來後改進:
$arr = [5, 6, 5, 8, 10, 6, 9, 20]; $tmp = []; foreach ($arr as $k => $v) { if (!in_array($v, $tmp)) { $tmp[] = $v; } } echo implode(' ', $tmp);
寫一個方法,獲取檔案
somefile.log
的副檔名:這道題出的不太清晰,是先讀檔案獲取檔案的真實副檔名呢,還是直接從檔名獲取擴充套件,時間要緊我們選個簡單的。
我的答案:
function getExtention(string $file) { return implode('.', $file)[1] ?? ''; return explode('.', $file)[1] ?? ''; // 應該用 explode,因為記混了,用了 implode。 } getExtention('somefile.log');
回來後嘗試:
function getExtention(string $file) { return explode('.', $file)[1] ?? ''; } echo getExtention('somefile.log');
改進,當時沒考慮到
xxx.xxx.xx.log
這種情況,經 大佬 提醒,做如下改進:function getExtention(string $file) { $res = explode('.', $file); return end($res) ?? ''; // 這裡為啥不像下邊這樣寫呢? 參見手冊 // return end(explode('.', $file)) ?? ''; } echo getExtention('xxx.xxx.somefile.log');
end,end(array|object &$array): mixed
將 array 的內部指標移動到最後一個單元並返回其值。
array 這個陣列。 該陣列是通過引用傳遞的,因為它會被這個函式修改。 這意味著你必須傳入一個真正的變數,而不是函式返回的陣列,因為只有真正的變數才能以引用傳遞。
什麼是「資料庫事務」和「儲存過程」,兩者有啥區別?
我的答案:事務,保證資料的原子性,方便回滾。儲存過程沒了解過,也沒用過。
分析:心裡明白一點,寫的時候只記起來了原子性和回滾。
改進:
資料庫事務,(簡稱:事務)(英語:transaction)是資料庫管理系統執行過程中的一個邏輯單位,由一個有限的資料庫操作序列構成。
資料庫事務通常包含了一個序列的對資料庫的讀/寫操作。包含有以下兩個目的:
為資料庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。
當多個應用程式在併發訪問資料庫時,可以在這些應用程式之間提供一個隔離方法,以防止彼此的操作互相干擾。
當事務被提交給了資料庫管理系統(DBMS),則DBMS需要確保該事務中的所有操作都成功完成且其結果被永久儲存在資料庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要滾,回到事務執行前的狀態;同時,該事務對資料庫或者其他事務的執行無影響,所有的事務都好像在獨立的執行。
ACID性質:
- 原子性(Atomicity):事務作為一個整體被執行,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行。
- 一致性(Consistency):事務應確保資料庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態的含義是資料庫中的資料應滿足完整性約束。
- 隔離性(Isolation):多個事務併發執行時,一個事務的執行不應影響其他事務的執行。
- 永續性(Durability):已被提交的事務對資料庫的修改應該永久儲存在資料庫中。
儲存過程,又稱儲存程式(英語:Stored Procedure),是在資料庫儲存複雜程式,以便外部程式呼叫的資料庫物件,可以視為資料庫的一種函式或子程式。
優點:
儲存過程可封裝,並隱藏複雜的商業邏輯。
儲存過程可以回傳值,並可以接受引數。
儲存過程無法使用 SELECT 指令執行,因為它是子程式,與檢視錶、資料表或使用者定義函式不同。
儲存過程可以用在資料檢驗,強制實行商業邏輯等。
缺點:
儲存過程,往往定製於特定的資料庫上,因為支援的程式語言不同。當切換到其他廠商的資料庫系統時,需要重寫原有的儲存過程。
儲存過程的效能調校與撰寫,受限於各種資料庫系統。
資料庫索引和關聯查詢、插入一條資料、刪除符合條件的資料。
沒啥可說的,這塊沒啥問題。
人事面試
查戶口
Q. 自己創業散漫慣了,能不能適應固定上班的節奏?之前也有創業失敗的,來幹了幾天不適應走了。
A. 可以,創業也是按時上下班,作息規律。
Q. 客戶是日本的要求非常嚴格,做什麼都要文件先行(日語文件),跟國內開發流程不一樣,能不能接受?
A. 可以,這有啥接受不了的。
Q. 有啥優點?
A. 做過的專案比較多,客戶簡單描述一下就能精準理解客戶需求。
HR. 客戶是日本的要求非常嚴格,你這優點沒用。(WTH?)
Q. 期望薪資多少?
A. 回答完以後,人事有點驚訝。(ps 跟這個崗位寫的也沒差多少)
其他的沒啥可總結的。
技術面試
涉及技術方面的提問:
Q. 設計模式:
A. 知道的幾個設計模式名稱說了下,讓具體講一下,我們確實不清楚。
Q. 索引為啥使用 B+ tree?
A. 這玩意也沒自己研究過。
B+ 樹是一種樹資料結構,通常用於資料庫和作業系統的檔案系統中。B+ 樹的特點是能夠保持資料穩定有序,其插入與修改擁有較穩定的對數時間複雜度。B+ 樹元素自底向上插入,這與二叉樹恰好相反。
B+ 樹在節點訪問時間遠遠超過節點內部訪問時間的時候,比可作為替代的實現有著實在的優勢。這通常在多數節點在次級儲存比如硬碟中的時候出現。通過最大化在每個內部節點內的子節點的數目減少樹的高度,平衡操作不經常發生,而且效率增加了。這種價值得以確立通常需要每個節點在次級儲存中佔據完整的磁碟塊或近似的大小。
B+ 背後的想法是內部節點可以有在預定範圍內的可變數目的子節點。因此,B+ 樹不需要像其他自平衡二叉查詢樹那樣經常的重新平衡。對於特定的實現在子節點數目上的低和高邊界是固定的。
B+ 樹的創造者 Rudolf Bayer 沒有解釋B代表什麼。最常見的觀點是B代表平衡(balanced),因為所有的葉子節點在樹中都在相同的級別上。B也可能代表Bayer,或者是波音(Boeing),因為他曾經工作于波音科學研究實驗室。
—— B+樹
首先需要澄清的一點是,MySQL 跟 B+ 樹沒有直接的關係,真正與 B+ 樹有關係的是 MySQL 的預設儲存引擎 InnoDB,MySQL 中儲存引擎的主要作用是負責資料的儲存和提取,除了 InnoDB 之外,MySQL 中也支援 MyISAM 作為表的底層儲存引擎。
- 雜湊雖然能夠提供 O(1) 的單資料行操作效能,但是對於範圍查詢和排序卻無法很好地支援,最終導致全表掃描;
- B 樹能夠在非葉節點中儲存資料,但是這也導致在查詢連續資料時可能會帶來更多的隨機 I/O,而 B+ 樹的所有葉節點可以通過指標相互連線,能夠減少順序遍歷時產生的額外隨機 I/O;
Q. 索引什麼情況下失效?
A. like 查詢左右匹配的時候,其他的跟欄位查詢的順序有關,現在好像是智慧打的不影響了。
Q. Redis 在哪些地方應用過:
A. 會話儲存,任務佇列。
…
其他記不清了。
後續
面試完,讓等通知,就知道沒戲了。
上午約了個回家順路的初創小公司面試,老闆說下午開始就居家辦公了,沒下文了。
一路走回去,碰到個天橋呆坐了幾十分鐘。
想想自己也是廢了。
順手拍了幾張照片:
點穴會所
城牆邊,護城河,春風吹水起輕波。帥的哥,不帥的哥,一起呆呆看河裡鵝。
這一張圖片轉自這裡,帶走了我一天的沮喪。
15、16年的時候,每天騎自行車回家(單程12.5KM),都會停到這裡看看火車。
現在都快騎不動了。
你們坐那兒在思考什麼?
我坐這兒在思考什麼?
建成不久火車站北廣場
大華1935的仿舊餐館
哪位大佬需要人?能不能撈我一把?
幹活很給力的。
本作品採用《CC 協議》,轉載必須註明作者和本文連結