面試總結

guolong123發表於2021-04-28

最近在面試,兩天時間面試了 5 家,其中 4 家線下面試,一家影片面試。有三個面試有複試機會。記錄下面試過程中問到的一些問題,促進自己進步。


1 ping++

ping++ 是一家做聚合支付的供應商,去面試自動化測試崗位,去先做題,題目比較簡單,python 的一些基礎,sql 語句,還有給了一個介面的描述資訊,包括介面地址,請求引數等資訊,讓你設計測試用例。我主要從介面欄位的約束和介面許可權控制兩方面來回答的,主要是測試每個欄位的約束,比如長度,空,唯一,型別等,再就是許可權控制,測試每種身份登入後對介面功能許可權的控制,以及資料許可權的測試。不知道還有沒有別的測試點?

後面面試官問到了一些比較基礎的 python 相關知識都沒答上來,還是比較可惜,一個是深複製和淺複製的區別,再就是問了一個介面欄位唯一性怎麼測試,我說呼叫兩次插入介面,正常來講第二次是無法成功的。他說到了一個冪等,我沒理解~~。聊了有 1 個小時,最後應該是掛了。

上海瑞界

這家面試過程還算順利,他們希望我能負責公司的持續整合以及自動化測試方向;沒有具體問技術細節,問到的還是比較務實。個人感覺說得還可以,後面也約了 2 面。2 面的時候是一個市場部的人來面試,全程基本在拉家常,過程中我反應了一些當前公司的問題,可能讓人覺得不靠譜吧。


伯鐳科技

剛開始是電話談了下,後面見面談,直接在電腦上操作,修改 nginx 配置檔案做一個反向代理;手寫一個 sql 語句等,還是比較簡單的。後面再有一個電話面試,聊了些需求實現上的內容,基本沒涉及到細節。在後面 hr 來溝通薪資,比我預期的薪資還是低一些,我說過幾天等答覆。

領視科技

面試官提了一個問題,說有老師學生 app,最近老師經常反應 app 使用卡頓,請求超時情況,你如何去定位這個缺陷?

我這邊從伺服器硬體效能,軟體效能,服務端網路,客戶端網路來分別舉例測試,主要是效能測試,從負載和壓力測試來得出伺服器效能情況;不知道答得怎麼樣,但從後面她的反饋來看是不如她意的。

七牛雲

七牛雲找我要簡歷的時候我是不怎麼抱希望的,覺得我的工作經歷和能力以及學歷應該是夠不上的,但後面居然給了我一個影片面試的機會,還是感覺到非常意外的。

影片面試前半小時我就在騰訊會議等著了,然後面試官非常準時的上線,上線後不像一般的面試讓我做個自我介紹,而是直接說讓介紹下自己覺得最擅長的內容,然後我把我寫的開源庫著重的說了下。然後面試官問的問題每個說實話不難,但是比較偏和細。比如問 “你能自己實現列表的功能嗎?”,這一問就比較懵逼,以前從沒考慮過這個,然後他及時說沒關係,我們下一個,感覺還是挺輕鬆,讓我沒有因為答不上來而緊張。後面讓我實現一個方法,方法接收一個符合 Linux 規則的路徑,輸出一個絕對路徑;寫的時候思路還是有點亂,最後沒能寫出來,實際上後面再想想還是很簡單的,思路大概就是先得知傳參的路徑是否以/開頭,否則是相對路徑。然後用/分割,迴圈所有分割字元,遇到..就將路徑使用 rsplite 切割,保留前段,遇到.不處理,遇到其它字元直接使用/拼接。

# 事後寫的

import os


def path_(path):
    paths = path.split('/')
    root = paths[0]
    if root != '/' and root != '':
        current_dir = os.path.abspath('.')
    else:
        current_dir = '/'
    for p in paths:
        if not p:
            continue
        if p == '..':
            current_dir = current_dir.rsplit('/', 1)[0]
        elif p == '.':
            pass
        else:
            current_dir = current_dir + '/' + p
    print(current_dir.replace('//', '/'))
    current_dir = current_dir.replace('//', '/')
    return current_dir

而我在面試的時候直接說分割後用 chdir 方法一個個進去,然後最終用 current_dir 方法輸出絕對路徑...,然後還問了些細節,問到 docker 映象如何減少其儲存空間佔用,我這邊從基礎映象的選擇,多命令合併減少層數,刪除構建快取這三個方面回答了問題,應該還有其他的。又問 nginx,我說比較熟悉,然後他問 nginx 的高併發調優怎麼做...又問懵了,我說基本上只配個反向代理啥的...,有點打臉。還有關於資料結構的、設計模式的問題都答得不好。後面一小時的時候結束了面試,意想不到的是沒過多久居然收到了二面的機會,真的是非常意外。


上面說的問題在面試完了之後都去查了,還是比較簡單的。知其然,知其所以然還是有必要的。


4 月 30 日更新

昨天去了七牛雲線下面試,總共面了三輪。包括前面影片面算 4 輪。下面總結下面試官問的問題:

  • Python 有了 gil 為何還要執行緒鎖?

這個問題面試官首先是問是否瞭解 python 的全域性鎖,我說了 pythonGIL 鎖是為了保證 python 程式執行時同一個單位時間內只能有一個執行緒執行。然後他問了為什麼,沒答上來,後面又問到多執行緒時,問為何需要用多執行緒加鎖機制,我說是因為多執行緒同時操作一個物件時可能會得到意外的結果,舉例說明了下:A 執行緒和 B 執行緒同時操作 a+=1 的語句時我們要的結果應該是 3,但實際上可能是 2,然後面試官說既然有了 python 全域性鎖,為何還要線上程上加鎖呢?既然同一個時間只能有一個執行緒執行不應該沒有剛剛你說的那個問題嗎?我又懵了。結束後搜尋後得知,在 python 以及 c 語言中,a+=1 這種語句看起來是隻有一行,但實際執行緒執行時是分兩步來操作的,即:

tmp=a+1
a=tmp

所以,讓 A 執行緒執行時執行到 tmp=a+1 後,執行緒切換到 B 的 tmp=a+1,然後再執行 a=tmp,此時 a=2,切換到 B 執行緒執行 a=tmp,因為此時 tmp 還是 1,所以結果還是 2。所以我們需要加鎖來處理這種情況,實際上可以理解為 python 的 GIL 鎖是執行緒鎖,保證同時只能有一個執行緒執行,而我們自己寫的鎖是資料鎖,只有拿到鎖的執行緒才能去運算元據。

  • Python 不可變型別有哪些

這個問題是比較基礎的,但在正常寫程式碼過程中可能不會太在意變數是否可變,所以這個問題我比較含糊,只答出來元組是不可變的。但實際上 int,str,元組都是不可變的,列表,字典和集合是可變的。字典的 key 只能用不可變型別,元組除外。

  • 元祖中的 list 是不是可變的

這個問題我的回答是肯定的,因為在淺複製時元組中的 list 也是可以被引用的。面試官說的確是可變的,但操作的時候會報錯。我剛剛試了沒有報錯,是可以 append 的:

l = ([1,2,3], 4)
l[0].append(4)
print(l)
>>> ([1,2,3,4], 4)
  • 兩數之和不用雙層迴圈求解,雙層迴圈的時間複雜度

力扣第一題,我說能想到的就是兩層迴圈,兩數之和對比,與結果一致則返回。第二層迴圈時從第二個開始...

def add(l: list, sum_num: int):
    n = 0
    while n < len(l):
        m = n + 1
        while m < len(l):
            print("{}+{}={}".format(l[n], l[m], l[n] + l[m]))
            if l[n] + l[m] == sum_num:
                return l.index(l[n]), l.index(l[m])
            m += 1
        n += 1


能想到的就是這個方法,但面試官說太複雜了,問我時間複雜度多少,我沒有這個概念。

  • 連結串列的插入,寫程式碼實現

沒答上來

  • Dbfaker 分庫分表時是否能支援?

自己寫的 dbfaker 庫,面試官一眼就能看出不能直接支援分庫分表。

  • 股票的買賣,已知一支股票連續 N 天的價格,可買賣一次求最大收益組合。
  • 元祖,列表以及字典分別使用了什麼資料結構?

只知道元組和列表是用的列表資料結構,字典是對映

  • 使用 map 和 lamba 實現功能,將列表中的奇數乘 2 python map(lamba x: x*2 if % 2 == 1 else x, l)

然後問這個 map 返回是個什麼型別,我回答的 list,面試官糾正說是一個迭代器,然後問,如何將這個迭代器轉換為 list,我說直接套 list 方法,然後他問,是否可以多次使用 list 來對迭代器操作,回答不能,因為迭代器執行完後,會拋異常。

  • Orm 框架,在 Django 等框架中只需要建立類即可被轉換為 ddl 語句,它是怎麼實現的?是否瞭解 Python 的元類?
  • Python 的垃圾回收機制?為何需要分代回收?引用計數為 0 的時候不就可以回收了嗎,為何還需要分代?

我回答了引用計數和分代回收,說明了引用計數的原理,但說不出為何需要分代回收;後面看了文件,發現分代回收是為了解決效能上的問題,如果每次都去處理所有物件是否需要回收,就會要處理所有物件,分代後,每次優先去處理新生代的物件,中年代和老年代的回收頻次會降低。以達到節省效能的目的。

  • 程式碼實現字串轉 int

這個題目本身面試官是讓我自己寫一個轉換方法,我理解成轉換任意字串成為 int,然後想著這個只能透過編碼來轉換了。後面才知道面試官說的是把"123"這種字串轉為 123,我說在 python 中直接用 int 就好了。然後他說寫一些測試用例,我寫的:

int('1')
int('0')
int('-1')
int('-0')
int('123')
int('2147483647')  # python中的int最大值
int('-2147483647')  # python中的int最小值
int('a123')
int('0x01')
int('\x01')

後記

記得七牛雲面試二面最後的時候面試官問我,你覺得你今天答得怎麼樣,我說答得不怎麼好,問題問的比較偏,很細節,很多問題沒答上來或沒完全答上來;然後面試官說了一句很印象深刻的話:面試過程就是要問到你答不上來為止,才能知道你的水平究竟在何處。

相關文章