Love, and to be Loved.

我愛你,你是自由的。

100 Interview Questions for Software Developers(FW)

1月13日,著名博客作者Jurgen Appelo寫了一篇博文:“軟件開發者面試百問”。該文甚受讀者歡迎,15日便登上了delicious,Popurls.com,Reddit的首頁。InfoQ中文站在得到作者許可之後,将其全文翻譯爲中文,希望可以對國內讀者有所助益。

以下爲文章全文:

想雇到搞軟件開發的聰明人可不容易。萬一一不小心,就會搞到一堆低能大狒狒。我去年就碰到这種事了。你肯定不想這樣吧。聽我的,没錯。在樹上開站立會議門都没有。

問點有難度的問題能幫你把聰明人跟狒狒們分開。我决定把我自己整理出來的軟件開發者面視百問發出来,希望能幫到你們的忙。

這個列表涵蓋了軟件工程知識體系中定義的大多數知識域。當然,如果你只想找出類拔萃的程序員,便只需涉及結構、算法、數據結構、測試这幾個話題。如果想雇架構師,也可以只考慮需求、功能設計、技術設計这些地方。

不過不管你怎麼做,都要牢記一點:

這裡大多數問題的答案都没有對错之分!

你可以把我的這些問題作為引子,展開討論。例如下面有個問題是使用静態方法或是單例的缘由。如果那個面試者就此展開長篇大論,那他很有可能是個聰明能幹的家伙!如果他一臉茫然的看著你,發出這種聲音,很明顯這就是只狒狒了。同樣,想知道一個數是不是2的乘方也有很多方法,不過要是面試的人想用mod運算符,嗯……你知道我的意思吧。(你不知道也没關係,來根香蕉?)

需求

1) 你能給出一些非功能性(或者質量)需求的例子么?
2) 如果客户需要高性能、使用极其方便而又高度安全,你會给他什麼建議?
3) 你能給出一些用來描述需求的不同技術么?它們各自適用於什麼場景?
4) 需求跟蹤是什麼意思?什麼是向前追溯,什麼是向後追溯?
5) 你喜歡用什麼工具跟蹤需求?
6) 你怎麼看待需求變化?它是好是壞?給出你的理由。
7) 你怎樣研究需求,發現需求?有哪些資源可以用到?
8) 你怎麼給需求製定優先級?有哪些技術?
9) 在需求過程中,用户、客户、開發人員各自的職責是什麼?
10) 你怎麼對待不完整或是令人費解的需求?

功能設計

1) 在功能設計中有哪些隱喻?給出幾個成功的例子。
2) 如果有些功能的執行時間很长,怎麼能讓用户感觉不到太長的等待?
3) 如果用户必須要在一個很小的區域内,從一個常常的列表中選擇多个條目,你會用什么控件?
4) 有哪些方法可以保证數據項的完整?
5) 建立系統原型有哪些技術?
6) 应用程序怎樣建立對用户行为的预期?給出一些例子。
7) 如何入手設計一組數量龐大而又複雜的特性,你能舉出一些設計思路吗?
8) 有一個列表,其中有10個元素,每個元素都有20個字段可以編輯,你怎樣設計這種情况?如果是1000個元素,每個元素有3個字段呢?
9) 用不同的顏色對一段文本中的文字標記高亮,這種做法有什麼問題?
10) Web環境和Windows環境各有些什么限制?

技術設計

1) 什麼是低耦合和高聚合?封裝原則又是什麼意思?
2) 在Web應用中,你怎樣避免几個人編輯同一段數據所造成的衝突?
3) 你知道設計模式吗?你用过哪些設計模式?在什麼场合下用的?
4) 是否了解什麼是無狀態的業務層?長事物如何與之相適應?
5) 在搭建一個架構,或是技術設計時,你用過幾種圖?
6) 在N層架構中都有哪些層?它們各自的職責是什麼?
7) 有哪些方法可以確保架構中數據的正確和健壮?
8) 面向对象設計和面向組件設計有哪些不同之處?
9) 怎樣在數據庫中對用户授權、用户配置、權限管理這幾項功能建模?
10) 怎樣按照等級制度給动物王國(包括各種物種和各自的行爲)建模?

程序設計

1) 你怎樣保證你的代碼可以處理各種錯誤事件?
2) 解釋一下什麼是測試驅動開發,舉出極限編程中的一些原則。
3) 看别人代碼的時候,你最關心什麼地方?
4) 什麼時候使用抽象類,什麼時候使用接口?
5) 除了IDE以外,你還喜歡哪些必不可少的工具?
6) 你怎麼保證代碼執行速度快,而又不出問題?
7) 什麼時候用多態,什麼時候用委派?
8) 什麼時候使用帶有靜態成員的類,什麼時候使用單例?
9) 你在代碼裏面怎麼提前處理需求的變化?給一些例子。
10) 描述一下實現一段代碼的過程,從需求到最终交付。

算法

1) 怎樣知道一個數字是不是2的乘方?怎樣判斷一個数是不是奇數?
2) 怎樣找出鏈表中間的元素?
3) 怎樣改變10,000個靜態HTML頁面中所有電話號碼的格式?
4) 舉出一個你所用過的遞歸的例子。
5) 在散列表和排序後的列表中找一個元素,哪個查找速度最快?
6) 不管是書、雜誌还是網絡,你從中所學到的最後一點算法知識是什麼?
7) 怎樣把字符串反轉?你能不用臨時的字符串么?
8) 你願意用什么類型的語言來編寫複雜的算法?
9) 有一個數組,裏面是從1到1,000,000的整数,其中有一個數字出現了两次,你怎麼找出那個重複的數字?
10) 你知道“旅行商問題(Traveling Salesman Problem)”么?

數據結構

1) 怎樣在内存中實現倫敦地鐵的結構?
2) 怎樣以最有效的方式在數據庫中存儲顏色值?
3) 队列和堆棧區別是什麼?
4) 用堆或者棧存儲數據的區別是什麼?
5) 怎樣在數據庫中存儲N維向量?
6) 你倾向於用哪种類型的語言編寫複雜的數據結構?
7) 21的二進製值是什么?十六進製值呢?
8) 不管是書、雜誌还是網絡,你從中所學到的最後一點數據結構的知識是什麼?
9) 怎樣在XML文檔中存儲足球比赛結果(包括队伍和比分)?
10) 有哪些文本格式可以保存Unicode字符?

測試

1) 什麼是回歸測試?怎樣知道新引入的變化没有給現有的功能造成破壞?
2) 如果業務層和數據層之間有依赖關係,你該怎麼寫單元測試?
3) 你用哪些工具測試代碼質量?
4) 在產品部署之後,你最常碰到的是什麼類型的問题?
5) 什麼是代碼覆蓋率?有多少種代碼覆盖率?
6) 功能測試和探索性測試的區別是什麼?你怎麼對網站進行測試?
7) 測試套件、測試用例、測試計劃,這三者之間的區別是什麼?你怎麼組織測試?
8) 要對電子商務網站做冒煙測試,你會做哪些類型的測試?
9) 客户在驗收測試中會發現不满意的東西,怎樣减少這種情况的發生?
10) 你去年在測試和質量保證方面學到了哪些東西?

維護

1) 你用哪些工具在維護階段對產品進行監控?
2) 要想對一個正在產品環境中被使用的產品進行升級,該注意哪些重要事項?
3) 如果在一个龐大的文件中有錯誤,而代碼又無法逐步跟蹤,你怎麼找出錯誤?
4) 你怎樣保證代碼中的變化不會影響產品的其他部分?
5) 你怎樣爲產品編寫技術文檔?
6) 你用过哪些方式保證軟件產品容易維護?
7) 怎樣在產品運行的環境中進行系統調試?
8) 什麼是負載均衡?負載均衡的方式有哪些?
9) 為什麼在應用程序的生命週期中,軟件維護費用所佔的份額最高?
10) 再造工程(re-engineering)和逆向工程(reverse engineering)的區別是什麼?

配置管理

1) 你知道配置管理中基線的含義麼?怎樣把項目中某個重要的時刻凍結?
2) 你一般會把哪些東西纳入版本控制?
3) 怎樣可以保證團隊中每個人都知道誰改變了哪些東西?
4) Tag和Branch的區別是什么?在什麼情况下该使用tag,什麼時候用branch?
5) 怎樣管理技術文檔——如產品架構文檔——的變化?
6) 你用什麼工具管理項目中所有數字信息的狀態?你最喜歡哪种工具?
7) 如果客户想要對一款已經發佈的產品做出變動,你怎麼處理?
8) 版本管理和發佈管理有什麼差異?
9) 對文本文件的變化和二進製文件的變化進行管理,這二者有什麼不同?
10) 同時處理多個變更請求,或是同時進行增量開發和維護,這種事情你怎麼看待?

項目管理

1) 範圍、時間、成本,这三項中哪些是可以由客户控制的?
2) 誰該對項目中所要付出的一切做出估算?誰有權設置最後期限?
3) 减少交付的次數,或是减少每個交付中的工作量,你喜歡哪種做法?
4) 你喜歡用哪種圖來跟蹤項目進度?
5) 迭代和增量的區別在哪里?
6) 試著解释一下風險管理中用到的實踐。風險該如何管理?
7) 你喜歡任務分解还是滾動式計劃?
8) 你需要哪些东西幫助你判斷項目是否符合時間要求,在預算範圍内運作?
9) DSDM、Prince2、Scrum,这三者之間有哪些區别?
10) 如果客户想要的東西太多,你在範圍和時間上怎樣跟他達成一致呢?

閱讀英文原文:100 Interview Questions for Software Developers

Origin