200X年12月23日的一次面試經歷(共六輪),至此9-X周年之際,和各位朋友分享,希望對各位朋友有用,有些自己的答案貼出來也僅僅是拋磚引玉,希望各位朋友不吝賜教,說句老實話,面試的時候時間很緊,很難考慮最優算法。
起因是朋友推薦我去W公司應聘Senior SDE這個職位,應該算是內部推薦了,下面是招聘要求
Title: Senior SDE (高級軟件開發工程師)
1. 本科學歷,計算機相關專業
2. 英語CET4,能熟練閱讀英文文檔
3. 工作經驗4年以上
4. 優秀的邏輯分析能力,良好的溝通能力
5. 豐富的ASP.NET 、C#、 SQL Server的經驗
6. 有豐富的項目開發、測試經驗
7. 獨立帶領小組完成項目的能力
應該還算吻合,自己很久沒有被面試了,也想去找找面試的感覺,而且對方也是個大公司,也比較期待。
下了地鐵,由于地方不熟,打車又打不上,居然晚了了15分鐘才找到公司(后來發現是通知我面試的MM沒說清楚,但自己沒有問清楚是最不應該的),先去找WC解決一下,然后準備面試。
進門和前臺MM說明了一下遲到的理由,帶我到會議室,給了一套筆試題目,一共七道,沒有說明多久需要做完
第一輪筆試
算法題:可以使用c,c#和java
1. 已知m和n是已經排序好的數組,從小到大,現在要合并這兩個數組內的數到一個數組,仍然要求是從小到大排序
2. 使用遞歸求n的階乘
3. 有1,2,2,3,4,5六個數,要求輸出他們組合的全排列,4不能在第三位,5和3不能相鄰
4. 請解釋HTTP,Cookie和Session
5. 請解釋視圖,存儲過程,左連接
6. 請簡單描述三層架構
7. 寫一段HTML頁面完成注冊功能
看了題目,沒有給答題紙,只能在背面寫了,
先從第四題開始寫起,寫HTTP協議的時候心里有點嘀咕,他不會等會真問我HTTP協議的細節吧。Cookie和Session先講了最重要的,都是Web應用程序中保存特定用戶信息的。Cookie信息存放在客戶端(大小限制4K,只能存放string類型,不安全,但可以考慮使用加密和驗證),Session信息在服務器端(安全性好,占服務器資源,除InProc方式存放的對象需要可序列化),然后簡單說明臨時Cookie和永久Cookie,Session的三種存放方式(InProc、StateServer、SQLServer)
第五題,分別說明視圖和存儲過程的概念/優點/可能使用它們的主要場景
第六題,簡單地描述三層架構,從代碼重用/團隊協作/系統維護/測試等上面說了下,網上相信能找到很多更好的答案。
第七題,寫標記的時候盡量按照xhtml的規范來寫,表單的提交,簡單的樣式和javascript驗證的代碼
這時有人進來,我趕緊又要了一張紙(后面的算法題肯定需要),這4個題目的答案大概寫了A4紙的1面。
回過來寫了算法中最簡單的第二題:
~~~
public static int Func(int n)
{
if (n < 0)
{
throw new ArgumentException("不能小于0");
}
if (n == 0 || n == 1)
{
return 1;
}
return n * Func(n - 1);
}
~~~
看了一下第一題和第三題,還是感覺第一題更簡單,盡量考慮了算法的復雜度,但這個不是本人的強項,不過常識是算法題只應該用一個循環,當時大致寫的代碼如下:
~~~
public static int[] Func(int[] SLm, int[] SLn)
{
if (SLm == null || SLn == null)
{
throw new ArgumentException("傳入數組不能為空");
}
int[] result = new int[SLm.Length + SLn.Length];
int mIndex = 0;
int nIndex = 0;
for (int index = 0; index < result.Length; index++)
{
if (mIndex >= SLm.Length && nIndex >= SLn.Length)
{
break;
}
if (mIndex >= SLm.Length)
{
result[index] = SLn[nIndex++];
continue;
}
if (nIndex >= SLn.Length)
{
result[index] = SLm[mIndex++];
continue;
}
if (SLm[mIndex] < SLn[nIndex])
{
result[index] = SLm[mIndex++];
}
else if (SLm[mIndex] > SLn[nIndex])
{
result[index] = SLn[nIndex++];
}
else
{
result[index] = SLm[mIndex++];
nIndex++;
}
}
return result;
}
~~~
寫第三題到一半的時候MM過來問了一下是否做完,估計自己應該能寫出來,就說還要一回就好。現在已經忘記當初具體怎么寫的了,不過肯定是完成了功能,還記得當時判斷5和3不能相鄰時用的技巧是:相鄰的兩個數字之和不能等于8。下面這個版本是根據http://blog.csdn.net/qianling3439/archive/2008/08/07/2781041.aspx 修改的C#版本:
~~~
public static void Main()
{
char[] number = new char[] { '1', '2', '2', '3', '4', '5' };
Func(number, 0, number.Length - 1);
Console.WriteLine(list.Count);
foreach (String s in list)
{
Console.Write(s + " ");
}
}
public static List<string> list = new List<string>();
public static void Func(char[] n, int beg, int end)
{
if (beg == end)
{
string result = new string(n);
if (result[2] == '4')
return;
if (result.Contains("35") || result.Contains("53"))
return;
list.Add(result);
return;
}
for (int i = beg; i <= end; i++)
{
Swap(n, beg, i);
Func(n, beg + 1, end);
Swap(n, beg, i);
}
}
public static void Swap(char[] n, int a, int b)
{
char temp = n[a];
n[a] = n[b];
n[b] = temp;
}
~~~
**第二輪面試**
答完題目之后,一個年輕人(25歲左右)給我面試,根據我的經驗估計對方應該是項目小組中的技術骨干
1. ASP.NET頁面生命周期
這個問題我本身比較熟悉,出門前還看過 :)。
說了幾個自己認為比較重要的PreInit、LoadViewState、 LoadPostData、Load、RaisePostDataChangedEvent(所有實現了IPostBackDataHandler接口的控件)、RaisePostBackEvent(實現 IPostBackEventHandler 接口的控件,如 Button, LinkButton等)、PreRender、SaveViewState。當然包括每個事件主要做什么,尤其是LoadViewState和SaveViewState是實現ASP.NET了保持狀態的假象。
(相信這個問題回答的超出對方想象)
2. 母版頁的作用
這個問題比較簡單,簡單介紹并提及自己不喜歡用母版頁,用javascript找控件比較麻煩,對方頗有同感。
3. 簡單查詢,考勤表id(PK int) name(varchar) time(datetime),求遲到次數最多的員工的最后一次遲到時間
答案就不貼了
4. 經典的第M條到第N條記錄
先問了一下要SQL Server 2000還是SQL Server 2005的版本,對方馬上笑了,說還是SQL Server 2000的吧,給了一個top的版本
(我的blog上寫過類似的東東http://blog.csdn.net/amandag/archive/2008/07/14/2646472.aspx)
5. 算法:最長升序降序序列,7 5 6 8 10 7 9 3 8 7 4 1 8 9 4,則最長的升序序列為5, 6, 8, 10,最長的降序序列為8,7,4,1
個人的答案是用了一個循環,這里就不貼了。
順便提一句,手寫算法題的時候,對方會一直盯著看,壓力比平時寫程序大很多
6. 無限級分類數據庫設計及節點查找
最近寫了一篇類似的blog,當時的思想也差不多是這樣
http://blog.csdn.net/amandag/archive/2009/12/16/5021126.aspx
7. 二叉樹查找
個人感覺由于前面的問題回答的還不錯,后面的這兩個問題對方也只是要求我說了一下思想,并未寫具體的代碼
**第三輪面試**
面試官是一個年約28~29的女孩,問了一些關于我做的項目的問題,個人感覺她的技術不如前面一個面試官,而且表達思路也不是很清楚,略聊了一會對方告訴我下面會有項目經理面試。
**第四輪面試**
面試官應該是個技術性的PM,問了一下網站架構的問題,和其聊了一會數據處理中需要考慮的問題(并發、索引、安全、分布式、緩存、海量數據)。
做技術的還是比較坦誠,他認可我的技術水平(這點讓我頗為開心),并建議我應聘PM的崗位(其實對方招聘的時候只有SDE、Senior SDE這兩個崗位),此時我也意識到如果僅僅應聘Senior SDE看來并不匹配。
**第五輪面試**
面試官應該是個部門經理,很能聊,主要談了兩個問題
1. 如何控制項目管理中的風險(主要提到了項目進度的控制和客戶的交流)
2. 如何打造一個高效的開發團隊、如何評估你的團隊開發人員
針對我的回答又問了些相關問題,說句老實話,對方顯然很有經驗,這輪不知深淺。
這輪結束后對方說公司的副總大概18:30左右會過來,問我是否介意等,我當然不介意。
**第六輪面試**
對方顯然更有經驗,感覺不到對方在問問題,基本就是在聊天,他的回答經常是笑著說"我了解了"或者"我明白了",我也只能見招拆招了,最后對方問了一下薪資的問題,我努力踢過去一個皮球,被對方輕易地踢了回來,只好先翻底牌了。
今天的面試總計用了大約6個小時。
**結語**
很多朋友很關心最終面試是否成功,要讓大家失望了,最終我沒有去這家公司,如果去了,怕也未必會發這個帖子。
沒有去的原因有些不便說,可以提及的說一下。
面試結束后對方并沒有給我回音,由于我有W公司另一個人事的MSN,所以托其問一下,對方給了回應,和我預期的情況差不多,薪資沒談攏(和我預期的有不少差距),我考慮再三(上班的車程大約要1個半小時,而我現在只需要40分鐘),最終還是放棄了。
另:我咨詢了一個朋友(Z公司的副總),講述了一下我面試的經過,問下有何問題,朋友給我的解釋也可能是為了安慰我,內容大致如下:
1. 對方本來沒有打算招PM,但顯然 Senior SDE和我并不匹配,所以我這個屬于隱形招聘需求,對方最需要的并不是PM。
2. W公司現在招人是為了有可能接上政府的單子,項目還沒接上,這個PM對W公司并不著急。
**歡迎各位朋友對上述問題不吝指教!所有分數將給提出有價值的答案或者建議的朋友,謝謝!**
- 前言
- 那些年,我們一起找過的工作
- 1——山東藍鳥貴薪的面試經歷
- 2——面試求職帖:瑾對自己負責
- 3——來北京找工作有感
- 4——出師不利
- 5——再接再厲
- 6——程序員之路
- 7——1天面試4次的有木有
- 8——最近的六次面試
- 9——找工作之路
- 10——阿里巴巴面試經歷
- 11——我的第一份實習工作
- 12——給找工作的應屆生一些建議
- 13——ASP.NET面試經歷分享(最終版)
- 14——我的求職經歷(完結篇)
- 15——心態決定成敗
- 16——機會是自己給的
- 17——在廣州闖蕩的經歷,不斷去追求自己的夢想!
- 18——話說我的面試經歷
- 19——淡定的面試
- 20——最近5次面試經歷的總結
- 21——這段時間的幾個面試
- 22——步入實習道路的第二次面試
- 23——畢業后第一次遠走他鄉的憧憬
- 24——低調著吹牛
- 25——正在實習,剛剛經過洗禮的應屆生
- 26——真實的“面試”經歷
- 27——java程序員求職總結