|
面試過一些應聘者,當我問到為什么換工作的時候,他們都會告訴我,現在的工作沒有挑戰,無聊,所以想換一個有挑戰的工作。我總是為有這樣的認識的朋友感到惋惜,因為我總是認為有挑戰的東西無處不在啊,不能因為工作上沒有,自己就放縱了自己。比如,面試過一個做地圖的工程師,他的工作是做計算地圖上任意兩點的最短或最優路徑的一部分功能。我覺得這個事很有挑戰,也有難度,應聘者說,沒什么挑戰,因為他做的東西只是調用相關的算法庫。他在這個項目干了 2 年了,當我問他有沒有看過算法庫,知不知道地圖是怎么存儲的?他卻告訴我,因為沒有去做,所以就沒有去了解,等做的時候再了解(我希望有這樣想法的人都去看看程序員的謊謬之言還是至理名言?)。這樣的例子很多,很多應聘者在面試中不能和我一起解決某個問題的時候,比如:OOD,數據庫設計,系統設計,等,他們都會告訴我,不好意思,因為沒有做過相關的事情,所以就不懂了,所以,他需要一個像我們這樣的項目來學習和鍛煉。
但另外一方面,他們都會告訴我他們對技術充滿和熱情和興趣,有著很強的學習能力,也有很能吃苦的態度。這也許是某面試寶典上看來的,面經上可能都會說,如果面對不能作答問題,可以說一下自己的態度和決心。可惜的是,我并不這么想的,我在我的兩篇關于招聘的文章里(我是怎么招聘程序員的,再談我是怎么招聘程序員的)都說過一些我對如何擇人的想法。這里重點說明一下其中兩個觀點:
- 關于熱情和態度,說白了就是不要給自己找借口。比如:“工作忙事多沒時間學所以可以不懂”,“工作中沒用到所以可以不懂”,“工作沒有挑戰,一直沒有遇到合適的項目”等等。時間可以擠,工作之余可以學,隨時承地去思考,挑戰是無處不在的…… 想想那些你有熱情的事,你會發現,幾乎沒有什么可以阻止你去做那些事。
- 對于某些事情,如果以前沒有在你身上發生過,那么這個事情在未來也不會發生。如果你以前沒有對你接觸過的東西去學習,去深挖,去思考,去改善,那么我不會相信你會在未來面對新的東西的時候也會有這樣的態度;如果你以前沒有用業余時間學習一些項目之外的東西,那么我也不會相信你會在未來會這樣做;如果你以前沒有把你的熱情和態度轉換成你的知識,經驗和成果,那么我也不會相信你會在未來能做到。
這兩個觀點可能太刻薄了,但是,當我回想我自己的經歷的時候,觀察程序員的成長過程的時候,我發現,優秀的程序員都是相似的,當他們還在是一個菜鳥的時候,就已經有各種成為高手的苗頭了,這些苗頭就是——他們熱愛思考,喜歡解決難題,對新鮮事物非常好奇,總是找人討論,可以用自己的業余時間狠命研究很多和工作無關的技術,會在業余的時間里寫些有趣的小程序,或是會把自己的思路書寫下來,等等,等等。
一些問題
我這樣說,大家可能會覺得“挑戰無處不在”這句話太虛了,而且可能不明白什么叫“熱愛思考”,這里,我把我的或別人的思考的東西羅列一下,這些問題,有的會讓我思考推敲,有的會讓我瘋狂地查資料,問人,或是找人討論,詢問。大家不妨可以跟著我一起思考一下。
酷殼上有一些小問題,比如:火車運煤問題,賽馬問題,這些問題都不夠實際,我覺得也這些問題有點無聊,我們不妨觀察一下我們身邊的東西,我們就可以看到很多有挑的戰的東西,對于這些問題,如果是你來做,你會怎么做呢?
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)我的軟件開發的三重門中說過,第三重門是解決實際問題,讓你的業務處理更為的智能,更為地強大。我不知道為什么這一兩年,我們的圈子里所有的人都在關注著“云”,“海量數據處理”,“高性能架構”這樣的東西,尤其是那些性能調的高性能的東西并不很難,而這些更為實際問題更有挑戰性,也更有前景。
it知識庫:程序員:挑戰無處不在,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。