作者有話說
這是關於程序員面試的一篇文章, 希望對你有幫助. 干了快3年了. 可以簡單參考, 對比總結.雖然本人很水.
很喜歡當前做的手游項目.做的很認真.後端每個人技術都很好.但是結果都不如意.在死亡線上掙扎.
目前基本上老大都找小弟們談談走的事. 但是我的老大還有老大的老大希望我繼續留下來. 哎, 但想出去看看.
簡單的自扯一點. 我是2013年退學出來干IT. 當時做window後端相關開發. 後面從事Linux後端開發. 用過
較多語言,技術很一般.
干了那麼久有點明白了, 產品比技術重要......
那開始說正題吧, 最近1-2周面過的那些名門.幫同事面的就不寫了,也比較多.都很相似.
面 一個最好的團購部門
我的同事跳槽進去了,內推我進去. 主要是做高性能Web相關開發.這方面沒有項目經驗,但面試我的人很熱心.
耐心的同我講解Web框架,流程等. 其中問我一個問題是
/* * 1. 怎麼判斷一個字符串是個合法的ip串. */
需要手寫.再扯一點, 面的東西太多了就找一個有代表性的面試題吧.
主要思路是 以 ip4 為例 *.*.*.* => *.*.*.*\0 以 '.'和\0 分割成4部分處理. 比較基礎主要看代碼
// 是ip返回 true, 否則返回false bool isipv4(const char* ips) { //記錄當前計數范圍[1, 3], 總的計數范圍[7, 15], n記錄當前量, 點的個數 int ncut = 0, scut = 0, n = 0, dcut = 0; char c; // 臨時量記錄*ips結果 // 簡單判斷字符串 if(!ips || !*ips) return false; do { c = *ips; // 非法字符直接返回false if((c<'0' || c>'9') && c!='.') return false; if(c>='0' && c<='9') { n = 10*n + c - '0'; // 排除>=256 和 00,09的情況 if((n>255) || (ncut>0&&n<10)) return false; } if(c=='.' || !ips[1]){ // *.*.*.*\0 以'.' 和 \0分割 n = 0; ncut = -1; ++dcut; } } while((*++ips) && (dcut<4) && (++ncut<=3) && (++scut<=15)); return dcut==4 && !*ips && ncut<=3 && scut<=15; }
當然面試官說語言不限. 我就用C寫了個. 當時是下午狀態不好.面試的很不好. 數據結構,算法,緩存,linux基本都過了.
關於數據庫mysql 方面不行, 被問倒了. 主要問事務,慢查詢, 索引優化. explain和mysqldumpslow 等等...
這裡三面中聊的最多的是設計. 對當前公司模塊的設計, 對未知模塊的設計. 例如他問,我們這是個電商, 你怎麼設計電商系統等等..
面的都比較實在, 手寫的算法題也簡單.
最後結果是, 那邊經理說,有幾個人都差不多再看看.
總結: 狀態不好,不情願千萬別去面. 要去面一定要全力以赴.
技術方面:數據結構要可以, 對自己當前公司的架構要深刻了解. 基礎知識要牢固. 數據庫要好.
完整演示demo, 運行結果也在下面
#include <stdio.h> #include <stdbool.h> // 是ip返回 true, 否則返回false bool isipv4(const char* ips); /* * 1. 怎麼判斷一個字符串是個合法的ip串. */ int main(int argc, char* argv[]) { const char* ips; ips = "192.168.1.34"; printf("%s => %d\n", ips, isipv4(ips)); ips = "192.168.1.34.45"; printf("%s => %d\n", ips, isipv4(ips)); ips = "192.0.01.34"; printf("%s => %d\n", ips, isipv4(ips)); ips = "192.168.1.341"; printf("%s => %d\n", ips, isipv4(ips)); ips = "0.77.1.a4"; printf("%s => %d\n", ips, isipv4(ips)); return 0; } // 是ip返回 true, 否則返回false bool isipv4(const char* ips) { //記錄當前計數范圍[1, 3], 總的計數范圍[7, 15], n記錄當前量, 點的個數 int ncut = 0, scut = 0, n = 0, dcut = 0; char c; // 臨時量記錄*ips結果 // 簡單判斷字符串 if(!ips || !*ips) return false; do { c = *ips; // 非法字符直接返回false if((c<'0' || c>'9') && c!='.') return false; if(c>='0' && c<='9') { n = 10*n + c - '0'; // 排除>=256 和 00,09的情況 if((n>255) || (ncut>0&&n<10)) return false; } if(c=='.' || !ips[1]){ // *.*.*.*\0 以'.' 和 \0分割 n = 0; ncut = -1; ++dcut; } } while((*++ips) && (dcut<4) && (++ncut<=3) && (++scut<=15)); return dcut==4 && !*ips && ncut<=3 && scut<=15; } View Code
面 一個最好的手游工作室
這個面試基本上刷新了我的面試記錄. 都5面過了. 對我說你可以的恭喜. 這邊還需要總部的一個總監面試一下. 但是等了很久,
聯系了第一面那位. 那位讓我再等等,估計總監忙.豪門社招真心 讓你等到麻木.(但是面的很值, 都是前輩高手)
中間最關鍵的是二面,他們的技術總監過來了. 問的很隨意,先讓我手寫一個完整的可運行的程序. 求加數和
/* * 寫一個完整的程序. * 輸入一個數c,輸出所有 c = a+b的結果 * 例如 3 = 1 + 2, 不用輸出 3 = 2 + 1 和 3 = 1 + 1 + 1 */
再扯一點,這家公司一面很難. 中途總結: 計算機網絡, 數據結構, 實戰經驗, 操作系統知識不好, 行業經驗不足基本上 過不去.
這方面也很贊同, 基礎知識決定程序員的地基打的牢不牢固. 不細說了, 還是說這個題吧
#include <stdio.h> #include <assert.h> // 打印所有結果 void printsum(int s); /* * 寫一個完整的程序. * 輸入一個數c,輸出所有 c = a+b的結果 * 例如 3 = 1 + 2, 不用輸出 3 = 2 + 1 和 3 = 1 + 1 + 1 */ int main(int argc, char* argv[]) { int s; // 輸入階段 printf("Please input sum(need gt one):"); if(scanf("%d", &s)!=1 || s<=1){ fprintf(stderr, "Input s:%d is error!\n", s); return -1; } //輸出階段 printsum(s); return 0; } // 打印所有結果 void printsum(int s) { int i, len; // 習慣決定素質, 謙虛就是最好的習慣和最大的裝逼 assert(s>1); for(i=1, len = s/2; i<=len; ++i) printf("%d = %d + %d\n", s, i, s-i); }
演示結果如下
還有
他看完後. 基本上就過了. 後面就繼續聊設計了了. 模塊設計, 代碼調試了等 後面項目經理面, 技術專家面等. 都好難很深入. 真心覺得,
經驗不足,能力不夠, 外在不注意那就pass.
總結: 大公司核心部門 講究的是運氣了. 如果不是極其優秀的話. 關鍵優秀也是靠時間的. 姜還是老的辣.
感悟:像我這樣的菜鳥還是需要多向前輩們多學習學習,爭取少趟坑.
能和那些干的很久的同行交流,是一件很愉快的事. 朋友們多找機會.
這家公司很注意外在談吐, 內在基礎和聰明程度.
臉黑或實力不是撒亞人超表 我看懸...
面 一個低調的端游公司
這家是北京為數不多的端游公司, 很低調.個人面試的很愉快. 如果實在臉黑. 已經准備加入到這家公司維護和開發更出色游戲項目.
它需要先做筆試題. 快速的花了30min做完了. 就找前台聊了. 聊得最多的是基礎和調試還有就是設計. 最後應該是組長給我
定位說你技術可以,就是設計差....... 其中一個面試題如下
/* * 寫一個函數 "將整數字符串轉成整數" */
這家公司 主要問計算機網絡 和 pthread線程開發 還有C++基礎聊得很多. 要求最高的就是C++基礎. 上面題做出來容易. 做好不容易看下面.
/* * 將整數字符串轉成整數.通過pnum返回 * istr : 源字符串 * pnum : 返回的整數 * : 返回0表示成功, -1表示參數錯誤, -2表示溢出 */ int convert(const char* istr, int* pnum){ int num = 0, tmp; char c, f = 0; // f == 1表示負數 // 先檢查參數錯誤 if(!istr || !*istr || !pnum) return -1; // 處理正負號 if((c=*istr)=='-' || c=='+'){ f = c == '-'; ++istr; } // 處理正數部分, !!是為了消除Pelles c的警告 while(!!(c=*istr++)) { // 非法字符直接返回 if(c<'0' || c>'9') return -1; tmp = 10*num + c-'0'; // 數值越界直接返回結果 if(num>tmp) return -2; num = tmp; } *pnum = f ? -num : num; return 0; }
很多場景,很多代碼.你沒躺過坑你是不會曉得行業潛規則的.沒有努力和勤奮或者堅持和聰明再或者沒有傻勁
你真的做不好. 真的頂不住 , 更別說抗住了. 個人也只是裝逼, 也在學習成長....
演示測試代碼如下
#include <stdio.h> #include <stdlib.h> /* * 將整數字符串轉成整數.通過pnum返回 * istr : 源字符串 * pnum : 返回的整數 * : 返回0表示成功, -1表示參數錯誤, -2表示溢出 */ int convert(const char* istr, int* pnum); /* * 寫一個函數 "將整數字符串轉成整數" */ int main(int argc, char* argv[]) { const char* str = "+123456"; int num; int flag = convert(str, &num); //輸出測試結果 if(flag) fprintf(stderr, "%s is error %d\n", str, flag); else printf("str:%s => %d\n", str, num); return 0; } /* * 將整數字符串轉成整數.通過pnum返回 * istr : 源字符串 * pnum : 返回的整數 * : 返回0表示成功, -1表示參數錯誤, -2表示溢出 */ int convert(const char* istr, int* pnum){ int num = 0, tmp; char c, f = 0; // f == 1表示負數 // 先檢查參數錯誤 if(!istr || !*istr || !pnum) return -1; // 處理政府號 if((c=*istr)=='-' || c=='+'){ f = c == -1; ++istr; } // 處理正數部分, !!是為了消除Pelles c的警告 while(!!(c=*istr++)) { // 非法字符直接返回 if(c<'0' || c>'9') return -1; tmp = 10*num + c-'0'; // 數值越界直接返回結果 if(num>tmp) return -2; num = tmp; } *pnum = f ? -num : num; return 0; } View Code測試截圖
到這裡 關於三個面試基本都簡單說了. 也許不是干貨. 但是是最近親身經歷. 最想表達的是.
做程序員, 多重視基礎. 務實沉澱是根本. 不管在那都要認真工作, 踏實處理事情.
後記
到最後了.很希望最後是最有意義的. 心靈雞湯能幫到你. 讓你覺得最值.
1. 程序員對工資的看法, 假如你8K, 和你相似的是18k. 在北京一年下來比你多10萬, 10年也就是100萬. 在北京100萬能干什麼呢?
我所想表達的是 (以Dota舉例) 程序員不是後期, 需要瘋狂打錢, 他是中單帶節奏的. 一定要找到自己的節奏, 帶起節奏
2. 程序員如何提升技術, 務實謙虛, 好學好問善於交流, 認真有擔當, 關鍵時刻要頂住.
(純屬個人扯淡, 歡迎交流打臉, 錯誤是難免的,指出就會改正)
以上是我最近面試幾次的感悟, 希望能幫助到大家, 互相思索,共同提高.拜~~~ , 歡迎交流推薦.