挑戰無處不在

火星人 @ 2014-03-12 , reply:0


  

作者:陳皓 原文鏈接

 

 面試過一些應聘者,當我問到為什麼換工作的時候,他們都會告訴我,現在的工作沒有挑戰,無聊,所以想換一個有挑戰的工作。於是我問了一下他的工作情況,發現那些有挑戰的東西他還沒有搞懂。我總是為有這樣的認識的朋友感到惋惜,因為我總是認為有挑戰的東西無處不在啊,不能因為工作上沒有,自己就放縱了自己。比如,面試過一個做地圖的工程師,他的工作是做計算地圖上任意兩點的最短或最優路徑的一部分功能。我覺得這個事很有挑戰,也有難度,應聘者說,沒什麼挑戰,因為他做的東西只是調用相關的演算法庫。他在這個項目幹了2年了,當我問他有沒有看過演算法庫,知不知道地圖是怎麼存儲的?他卻告訴我,因為沒有去做,所以就沒有去了解,等做的時候再了解(我希望有這樣想法的人都去看看程序員的謊謬之言還是至理名言?)。這樣的例子很多,很多應聘者在面試中不能和我一起解決某個問題的時候,比如:OOD,資料庫設計,系統設計,等,他們都會告訴我,不好意思,因為沒有做過相關的事情,所以就不懂了,所以,他需要一個像我們這樣的項目來學習和鍛煉。我並不要求你能解決你所不擅長的問題,但畢竟資料庫,OO,系統設計都是軟體開發的基礎知識,多少要懂一些吧。

 

但另外一方面,他們都會告訴我他們對技術充滿和熱情和興趣,有著很強的學習能力,也有很能吃苦的態度。這也許是某面試寶典上看來的,面經上可能都會說,如果面對不能作答問題,可以說一下自己的態度和決心。可惜的是,我並不這麼想的,我在我的兩篇關於招聘的文章里(我是怎麼招聘程序員的,再談我是怎麼招聘程序員的)都說過一些我對如何擇人的想法。這裡重點說明一下其中兩個觀點:

 

  • 關於熱情和態度,說白了就是不要給自己找借口。比如:“工作忙事多沒時間學所以可以不懂”,“工作中沒用到所以可以不懂”,“工作沒有挑戰,一直沒有遇到合適的項目”等等。時間可以擠,工作之餘可以學,隨時隨地去思考,挑戰是無處不在的…… 想想那些你有熱情的事,你會發現,幾乎沒有什麼可以阻止你去做那些事。
  • 對於某些事情,如果以前沒有在你身上發生過,那麼這個事情在未來也不會發生。如果你以前沒有對你接觸過的東西去學習,去深挖,去思考,去改善,那麼我不會相信你會在未來面對新的東西的時候也會有這樣的態度;如果你以前沒有用業餘時間學習一些項目之外的東西,那麼我也不會相信你會在未來會這樣做;如果你以前沒有把你的熱情和態度轉換成你的知識,經驗和成果,那麼我也不會相信你會在未來能做到。

 

這兩個觀點可能太刻薄了,但是,當我回想我自己的經歷的時候,觀察程序員的成長過程的時候,我發現,優秀的程序員都是相似的,當他們還在是一個菜鳥的時候,就已經有各種成為高手的苗頭了,這些苗頭就是——他們熱愛思考,喜歡解決難題,對新鮮事物非常好奇,總是找人討論,可以用自己的業餘時間狠命研究很多和工作無關的技術,會在業餘的時間裡寫些有趣的小程序,或是會把自己的思路書寫下來,等等,等等。

 

一些問題

我這樣說,大家可能會覺得“挑戰無處不在”這句話太虛了,而且可能不明白什麼叫“熱愛思考”,這裡,我把我的或別人的思考的東西羅列一下,這些問題,有的會讓我思考推敲,有的會讓我瘋狂地查資料,問人,或是找人討論,詢問。大家不妨可以跟著我一起思考一下。

 

酷殼上有一些小問題,比如:火車運煤問題,賽馬問題,這些問題都不夠實際,我覺得也這些問題有點無聊,我們不妨觀察一下我們身邊的東西,我們就可以看到很多有挑的戰的東西,對於這些問題,如果是你來做,你會怎麼做呢?

 

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)我的軟體開發的三重門中說過,第三重門是解決實際問題,讓你的業務處理更為的智能,更為地強大。我不知道為什麼這一兩年,我們的圈子裡所有的人都在關注著“雲”,“海量數據處理”,“高性能架構”這樣的東西,尤其是那些性能調的高性能的東西並不很難,而這些更為實際問題更有挑戰性,也更有前景。

(全文完)





[火星人 via ] 挑戰無處不在已經有79次圍觀

http://www.coctec.com/docs/discuss/show-post-74292.html