面試過一些應聘者,當我問到爲何換工做的時候,他們都會告訴我,如今的工做沒有挑戰,無聊,因此想換一個有挑戰的工做。因而我問了一下他的工做狀況,發現那些有挑戰的東西他尚未搞懂。我老是爲有這樣的認識的朋友感到可惜,由於我老是認爲有挑戰的東西無處不在啊,不能由於工做上沒有,本身就放縱了本身。好比,面試過一個作地圖的工程師,他的工做是作計算地圖上任意兩點的最短或最優路徑的一部分功能。我以爲這個事頗有挑戰,也有難度,應聘者說,沒什麼挑戰,由於他作的東西只是調用相關的算法庫。他在這個項目幹了2年了,當我問他有沒有看過算法庫,知不知道地圖是怎麼存儲的?他卻告訴我,由於沒有去作,因此就沒有去了解,等作的時候再瞭解(我但願有這樣想法的人都去看看程序員的謊謬之言仍是至理名言?)。這樣的例子不少,不少應聘者在面試中不能和我一塊兒解決某個問題的時候,好比:OOD,數據庫設計,系統設計,等,他們都會告訴我,很差意思,由於沒有作過相關的事情,因此就不懂了,因此,他須要一個像咱們這樣的項目來學習和鍛鍊。我並不要求你能解決你所不擅長的問題,但畢竟數據庫,OO,系統設計都是軟件開發的基礎知識,多少要懂一些吧。html
但另一方面,他們都會告訴我他們對技術充滿和熱情和興趣,有着很強的學習能力,也有很能吃苦的態度。這也許是某面試寶典上看來的,面經上可能都會說,若是面對不能做答問題,能夠說一下本身的態度和決心。惋惜的是,我並不這麼想的,我在個人兩篇關於招聘的文章裏(我是怎麼招聘程序員的,再談我是怎麼招聘程序員的)都說過一些我對如何擇人的想法。這裏重點說明一下其中兩個觀點:程序員
- 關於熱情和態度,說白了就是不要給本身找藉口。好比:「工做忙事多沒時間學因此能夠不懂」,「工做中沒用到因此能夠不懂」,「工做沒有挑戰,一直沒有遇到合適的項目」等等。時間能夠擠,工做之餘能夠學,隨時隨地去思考,挑戰是無處不在的…… 想一想那些你有熱情的事,你會發現,幾乎沒有什麼能夠阻止你去作那些事。
- 對於某些事情,若是之前沒有在你身上發生過,那麼這個事情在將來也不會發生。若是你之前沒有對你接觸過的東西去學習,去深挖,去思考,去改善,那麼我不會相信你會在將來面對新的東西的時候也會有這樣的態度;若是你之前沒有用業餘時間學習一些項目以外的東西,那麼我也不會相信你會在將來會這樣作;若是你之前沒有把你的熱情和態度轉換成你的知識,經驗和成果,那麼我也不會相信你會在將來能作到。
這兩個觀點可能太刻薄了,可是,當我回想我本身的經歷的時候,觀察程序員的成長過程的時候,我發現,優秀的程序員都是類似的,當他們還在是一個菜鳥的時候,就已經有各類成爲高手的苗頭了,這些苗頭就是——他們熱愛思考,喜歡解決難題,對新鮮事物很是好奇,老是找人討論,能夠用本身的業餘時間狠命研究不少和工做無關的技術,會在業餘的時間裏寫些有趣的小程序,或是會把本身的思路書寫下來,等等,等等。面試
一些問題
我這樣說,你們可能會以爲「挑戰無處不在」這句話太虛了,並且可能不明白什麼叫「熱愛思考」,這裏,我把個人或別人的思考的東西羅列一下,這些問題,有的會讓我思考推敲,有的會讓我瘋狂地查資料,問人,或是找人討論,詢問。你們不妨能夠跟着我一塊兒思考一下。算法
酷殼上有一些小問題,好比:火車運煤問題,賽馬問題,這些問題都不夠實際,我以爲也這些問題有點無聊,咱們不妨觀察一下咱們身邊的東西,咱們就能夠看到不少有挑的戰的東西,對於這些問題,若是是你來作,你會怎麼作呢?shell
0)許多年前,當我看到珊瑚蟲QQ把IP轉成地實際地址的時候,我就在思考,若是我有一個IP網段的數據(全球IP地址數據),我怎麼來完成這個功能呢?好比:某地點的IP網段是:10.10.1.* – 10.10.5.*。我要有一個IP地址是:10.10.3.20,我怎麼匹配這個網段?用Hash表嗎?好像有問題。把IP字串轉成整型?排序+二分法,好像更容易解決一些,可是若是有一些修改的話好像有點不方便。用樹型結構(森林)會不會更好一些呢?若是我要經過地點反查IP段呢?數據庫
1)網上短網址服務,你有想過這個短網址生成的算法是什麼,如何能作到能最短?怎麼查詢?你也許以爲會用key-value的NoSQL。那麼,若是對於同一個URL,若是要重用已生成的短網址,你怎麼用key-value的NoSQL來解決?小程序
英漢詞典的檢索和這個很類似,若是經過英文查漢語,又經過漢語查英文?若是是N多種語言的互相翻譯呢?你的數據存儲和檢索如何作呢?安全
2)當我看到Dropbox這樣的雲同步的軟件的時候,我不知道你是否會和我同樣會去思考,在多個設備間的文件同步是怎麼作的?若是網盤上有幾萬,甚至幾百萬個文件,當要和個人本地數據同步時,他如何比較經濟地知道哪些文件更改了?須要向服務端同步或是向客戶端同步。更進一步,你有沒有想過沒有中心結點的文件同步問題?你有沒有想過,文件衝突的問題?服務器
3)咱們的新員工入職的時候,有一些公司會給新員工的賬號生成一個隨機口令,而後新員工能夠在登陸後修改口令(我一直在想咱們的銀行應該爲用戶生成一個隨機口令,而不是設置一個6個0或是6個8的初始口令)。那麼,對生成隨機安全口令的算法知道怎麼作嗎?若是你寫出這個算法來了,你怎麼證實這個算法是足夠隨機,生成的密碼強度足夠大的?(你會發現,測試口令是否隨機是否安全的程序,會比生成器更難寫)網絡
4)關於動態密碼RSA SecurID(以下圖),這個小設備上的6位數字會每60秒變一次,在你登陸的時候,須要輸入這6位數字,服務器上會認證這6個數字,那麼這個事怎麼作?再試想一下,這樣的小設備我要發給個人客戶,我但願個人每一個客戶都使用不同的隨機算法,就算是算法同樣,算法的種子也不能同樣。那麼,若是個人客戶一共有百萬甚至千萬,個人服務端怎麼管理這些用戶的SecurID?
5)看看咱們的網銀或是ATM的用戶登陸功能,若是你登陸時輸錯口令超過3次以上,你的賬號就會被凍結,須要去櫃檯重置口令。這個功能看上去很安全,由於能夠防止黑客在線嘗試破解你的登陸口令。不過這又帶來了另外一個問題,若是有一個惡意用戶知道你的卡號,他就上網或是造個卡故意輸錯你的口令,致使你的賬號被凍結,讓你一次又一次地去銀行排隊重置。面對這樣的狀況,你該怎麼解決?
6)當你在網上購物的時候,你會去一些電子商務的網站,這些網站都會對他們的產品進行分類,有大分類有子分類。你進到分類後,你能夠經過不一樣的屬性來過濾不一樣該分類下的商品,注意,不一樣分類下的商品的過濾屬性不同,如,手機分類和電視分類的屬性都不同。試問,你如何設計你的數據庫表結構?
7)當你在泡各類論壇或SNS社區的時候,你會看到,用戶在互相回覆的時候存在一個問題,尤爲是用戶量很大的時候,你們的回覆徹底交織在一塊兒什麼 也看不清楚。之前有的論壇使用樹形列表來解決這個問題,樹形列表好是好,可是把一棵大樹放在那裏仍是很難看。Twitter.com給了一個很是不錯的解決方式,就是全部人的回覆或是回覆的回覆都按時間線放在一塊兒,若是你要查看某回覆的上下文的話,點擊一下這個回覆就能夠看到了(我在我在「國內微博和Twitter的最大不一樣」中批評過這個事)。新浪微博在禁評論事件後也開發出了這個功能。你知道這個事怎麼作嗎?
更進一步,新浪微博的設計上有不少的缺陷,單說新開發的「查看評論」功能這個事來講,仍是不完美,由於某些評論會隨着轉發帶到別的地方去,他的「查看評論」功能只能看到當個貼子下的東西,不能把全部轉發出去的貼子的評論一塊兒綜合起來。雖然這對於用戶使用來講沒有什麼在不了的,可是對於軟件設計來講,咱們不妨作一個練習,能夠思考一下,怎麼樣設計會更好。
再觸類旁通,有時候,我發現多個網友會提出一樣的問題,我很想用一個回覆同時回覆他們。若是有這樣的功能的話,咱們的回覆就會從一個樹形變成另一種形狀了,咱們又該如何設計才能支持這樣的功能呢?
8)說到新浪微博,我就想多說幾句,我最近觀察到了兩個事:
- 一個是驗證碼的事,若是你在你的賬號設置裏設置了「登陸須要驗證碼」,你會發現,在登陸新浪微博的時候,僅當你輸對了口令後,系統纔會提示你輸入驗證碼。爲何呢?由於,這個「登陸須要驗證碼」這綁定在你的賬號設置裏的,因此,要取這個設置,就須要你登陸成功(?!),老實說,這個功能在設計上有點二(中國特點)。若是是你,你怎麼設計呢?
- 另外一個事情是新浪微博或Twitter的用戶名修改後,被他人@過的信息就再也連接不到你這裏來了。咱們來試想一下,若是是你,你怎麼解決這個問題?(個人個人微博裏討論過這個事,不必定對,供你們參考)
9)我有時候我會發一些快遞,有時候是一些小東西,有時候是一些大包裹,有時候近,有時候遠。我發現一個有趣的現象,就是快遞員來收件的時候,快遞的價格都是快遞員本身說了算的,我還能夠和他們砍價。我觀察到他們會以距離,重量大小來定價。因而我在想若是你要運營一個物流公司,你做爲這個物流公司的程序員,你須要開發一個軟件來標註快遞價格,你會怎麼作?好比,這個快遞公司會說,在北京五環之內是一個價,之外是一個價,出省後,上海以北是一個價,上海以南是一個價,等等,這只是北京的,若是把全國的各個城市到別的城市的價格都考慮進來,還要受到重量,體積,價格,是否加急等等因素的影響,你的數據庫設計要怎麼作呢?
A)國內的水軍太恐怖了。他們活動的刷排名,刷信用,刷積分,刷粉絲等等地方,你是否想過如何解決這個問題?還有廣告聯盟的欺詐問題,等等。這些東西,有的仍是能夠經過技術手段進行限制和計算的,你有思考過應該使用什麼樣的方法嗎?
B)說到水軍就不能不提垃圾郵件和垃圾短信。你有沒有想過郵件系統怎麼過濾垃圾信息的?
C)關於推薦功能,這必然是一個熱點,這是軟件產品從request -> response的被動方式到主動方式的進化。微博上有推薦關注者的功能,電商有推薦商品的功能,豆瓣上有推薦影片音樂書籍的功能。不一樣的領域的推薦算法各不相同,你有沒有思考過,若是是你來作推薦算法的時候,你會怎麼作嗎?更進一步,推薦一般伴隨着學習和匹配,學習用戶的行爲,匹配類似的東西,你想過怎麼學習用戶的行爲,怎麼匹配類似的東西了嗎?
D)關於微博,某名人有幾千萬的粉絲,當這個名人發一個微博的時候,須要通知這幾千萬個粉絲,這個在系統架構上應該怎麼作?若是某天這個名人與人發生口角,和人吵架,拼命的刷微博,那麼,系統架構要怎麼設計才能支持這樣的事呢?
E)想一想火車票的分段賣票的方式,現有的解決方案是爲每一個站點預留票,因而咱們能夠看到火車始發時,有不少空坐,這些空坐都是留給下一個站點的,咱們可否開發出一個系統來,能夠把一條線上的這些這站上那站下的旅客統籌規劃一下,制定出一個最經濟的方式,讓火車運行得更有效。
F)對於地鐵公交網絡,咱們但願這個網絡既能有更多的覆蓋,又能節省路線,你能不能設計出一個系統,當咱們輸入一些數據(如:站點,是否終點或起點站,該站的下一站可能方向(多個),該站是以上車爲主,仍是下車爲主,等等),你的系統能自動安排出各類線路嗎?
這樣的問題實在是太多了,都是可讓咱們去思考的,並不必定有經濟效益,可是至少可讓你鍛鍊一下怎麼去分析問題,怎麼去思考,怎麼去解決問題。
總結
綜上所述,我想說的是:
1) 只要你想,挑戰是無處不在的。那怕是你現有的以爲無聊的東西,只要你想作到極致,那怕是一個簡單的功能(好比用戶登陸的功能)也會讓你充滿挑戰。
2)觀察身邊的事物,去思考,去調查,觸類旁通,這纔是你成長的源泉。不要把你的成長推給客觀緣由。
3)個人軟件開發的三重門中說過,第三重門是解決實際問題,讓你的業務處理更爲的智能,更爲地強大。我不知道爲何這一兩年,咱們的圈子裏全部的人都在關注着「雲」,「海量數據處理」,「高性能架構」這樣的東西,尤爲是那些性能調的高性能的東西並不很難,而這些更爲實際問題更有挑戰性,也更有前景。
(全文完)
原文連接: 挑戰無處不在