|
面試過一些應(yīng)聘者,當(dāng)我問到為什么換工作的時(shí)候,他們都會(huì)告訴我,現(xiàn)在的工作沒有挑戰(zhàn),無聊,所以想換一個(gè)有挑戰(zhàn)的工作。我總是為有這樣的認(rèn)識(shí)的朋友感到惋惜,因?yàn)槲铱偸钦J(rèn)為有挑戰(zhàn)的東西無處不在啊,不能因?yàn)楣ぷ魃蠜]有,自己就放縱了自己。比如,面試過一個(gè)做地圖的工程師,他的工作是做計(jì)算地圖上任意兩點(diǎn)的最短或最優(yōu)路徑的一部分功能。我覺得這個(gè)事很有挑戰(zhàn),也有難度,應(yīng)聘者說,沒什么挑戰(zhàn),因?yàn)樗龅臇|西只是調(diào)用相關(guān)的算法庫。他在這個(gè)項(xiàng)目干了 2 年了,當(dāng)我問他有沒有看過算法庫,知不知道地圖是怎么存儲(chǔ)的?他卻告訴我,因?yàn)闆]有去做,所以就沒有去了解,等做的時(shí)候再了解(我希望有這樣想法的人都去看看程序員的謊謬之言還是至理名言?)。這樣的例子很多,很多應(yīng)聘者在面試中不能和我一起解決某個(gè)問題的時(shí)候,比如:OOD,數(shù)據(jù)庫設(shè)計(jì),系統(tǒng)設(shè)計(jì),等,他們都會(huì)告訴我,不好意思,因?yàn)闆]有做過相關(guān)的事情,所以就不懂了,所以,他需要一個(gè)像我們這樣的項(xiàng)目來學(xué)習(xí)和鍛煉。
但另外一方面,他們都會(huì)告訴我他們對(duì)技術(shù)充滿和熱情和興趣,有著很強(qiáng)的學(xué)習(xí)能力,也有很能吃苦的態(tài)度。這也許是某面試寶典上看來的,面經(jīng)上可能都會(huì)說,如果面對(duì)不能作答問題,可以說一下自己的態(tài)度和決心。可惜的是,我并不這么想的,我在我的兩篇關(guān)于招聘的文章里(我是怎么招聘程序員的,再談我是怎么招聘程序員的)都說過一些我對(duì)如何擇人的想法。這里重點(diǎn)說明一下其中兩個(gè)觀點(diǎn):
- 關(guān)于熱情和態(tài)度,說白了就是不要給自己找借口。比如:“工作忙事多沒時(shí)間學(xué)所以可以不懂”,“工作中沒用到所以可以不懂”,“工作沒有挑戰(zhàn),一直沒有遇到合適的項(xiàng)目”等等。時(shí)間可以擠,工作之余可以學(xué),隨時(shí)承地去思考,挑戰(zhàn)是無處不在的…… 想想那些你有熱情的事,你會(huì)發(fā)現(xiàn),幾乎沒有什么可以阻止你去做那些事。
- 對(duì)于某些事情,如果以前沒有在你身上發(fā)生過,那么這個(gè)事情在未來也不會(huì)發(fā)生。如果你以前沒有對(duì)你接觸過的東西去學(xué)習(xí),去深挖,去思考,去改善,那么我不會(huì)相信你會(huì)在未來面對(duì)新的東西的時(shí)候也會(huì)有這樣的態(tài)度;如果你以前沒有用業(yè)余時(shí)間學(xué)習(xí)一些項(xiàng)目之外的東西,那么我也不會(huì)相信你會(huì)在未來會(huì)這樣做;如果你以前沒有把你的熱情和態(tài)度轉(zhuǎn)換成你的知識(shí),經(jīng)驗(yàn)和成果,那么我也不會(huì)相信你會(huì)在未來能做到。
這兩個(gè)觀點(diǎn)可能太刻薄了,但是,當(dāng)我回想我自己的經(jīng)歷的時(shí)候,觀察程序員的成長過程的時(shí)候,我發(fā)現(xiàn),優(yōu)秀的程序員都是相似的,當(dāng)他們還在是一個(gè)菜鳥的時(shí)候,就已經(jīng)有各種成為高手的苗頭了,這些苗頭就是——他們熱愛思考,喜歡解決難題,對(duì)新鮮事物非常好奇,總是找人討論,可以用自己的業(yè)余時(shí)間狠命研究很多和工作無關(guān)的技術(shù),會(huì)在業(yè)余的時(shí)間里寫些有趣的小程序,或是會(huì)把自己的思路書寫下來,等等,等等。
一些問題
我這樣說,大家可能會(huì)覺得“挑戰(zhàn)無處不在”這句話太虛了,而且可能不明白什么叫“熱愛思考”,這里,我把我的或別人的思考的東西羅列一下,這些問題,有的會(huì)讓我思考推敲,有的會(huì)讓我瘋狂地查資料,問人,或是找人討論,詢問。大家不妨可以跟著我一起思考一下。
酷殼上有一些小問題,比如:火車運(yùn)煤問題,賽馬問題,這些問題都不夠?qū)嶋H,我覺得也這些問題有點(diǎn)無聊,我們不妨觀察一下我們身邊的東西,我們就可以看到很多有挑的戰(zhàn)的東西,對(duì)于這些問題,如果是你來做,你會(huì)怎么做呢?
0)許多年前,當(dāng)我看到珊瑚蟲 QQ 把 IP 轉(zhuǎn)成地實(shí)際地址的時(shí)候,我就在思考,如果我有一個(gè) IP 網(wǎng)段的數(shù)據(jù)(全球 IP 地址數(shù)據(jù)),我怎么來完成這個(gè)功能呢?比如:某地點(diǎn)的 IP 網(wǎng)段是:10.10.1.* – 10.10.5.*。我要有一個(gè) IP 地址是:10.10.3.20,我怎么匹配這個(gè)網(wǎng)段?用 Hash 表嗎?好像有問題。把 IP 字串轉(zhuǎn)成整型?排序+二分法,好像更容易解決一些,但是如果有一些修改的話好像有點(diǎn)不方便。用樹型結(jié)構(gòu)(森林)會(huì)不會(huì)更好一些呢?如果我要通過地點(diǎn)反查 IP 段呢?
1)網(wǎng)上短網(wǎng)址服務(wù),你有想過這個(gè)短網(wǎng)址生成的算法是什么,如何能做到能最短?怎么查詢?你也許覺得會(huì)用 key-value 的 NoSQL。那么,如果對(duì)于同一個(gè) URL,如果要重用已生成的短網(wǎng)址,你怎么用 key-value 的 NoSQL 來解決?
英漢詞典的檢索和這個(gè)很相似,如果通過英文查漢語,又通過漢語查英文?如果是N多種語言的互相翻譯呢?你的數(shù)據(jù)存儲(chǔ)和檢索如何做呢?
2)當(dāng)我看到 Dropbox 這樣的云同步的軟件的時(shí)候,我不知道你是否會(huì)和我一樣會(huì)去思考,在多個(gè)設(shè)備間的文件同步是怎么做的?如果網(wǎng)盤上有幾萬,甚至幾百萬個(gè)文件,當(dāng)要和我的本地?cái)?shù)據(jù)同步時(shí),他如何比較經(jīng)濟(jì)地知道哪些文件更改了?需要向服務(wù)端同步或是向客戶端同步。更進(jìn)一步,你有沒有想過沒有中心結(jié)點(diǎn)的文件同步問題?你有沒有想過,文件沖突的問題?
3)我們的新員工入職的時(shí)候,有一些公司會(huì)給新員工的帳號(hào)生成一個(gè)隨機(jī)口令,然后新員工可以在登錄后修改口令(我一直在想我們的銀行應(yīng)該為用戶生成一個(gè)隨機(jī)口令,而不是設(shè)置一個(gè) 6 個(gè) 0 或是 6 個(gè) 8 的初始口令)。那么,對(duì)生成隨機(jī)安全口令的算法知道怎么做嗎?如果你寫出這個(gè)算法來了,你怎么證明這個(gè)算法是足夠隨機(jī),生成的密碼強(qiáng)度足夠大的?(你會(huì)發(fā)現(xiàn),測試口令是否隨機(jī)是否安全的程序,會(huì)比生成器更難寫)
4)關(guān)于動(dòng)態(tài)密碼 RSA SecurID(如下圖),這個(gè)小設(shè)備上的 6 位數(shù)字會(huì)每 60 秒變一次,在你登錄的時(shí)候,需要輸入這 6 位數(shù)字,服務(wù)器上會(huì)認(rèn)證這 6 個(gè)數(shù)字,那么這個(gè)事怎么做?再試想一下,這樣的小設(shè)備我要發(fā)給我的客戶,我希望我的每個(gè)客戶都使用不一樣的隨機(jī)算法,就算是算法一樣,算法的種子也不能一樣。那么,如果我的客戶一共有百萬甚至千萬,我的服務(wù)端怎么管理這些用戶的 SecurID?
5)看看我們的網(wǎng)銀或是 ATM 的用戶登錄功能,如果你登錄時(shí)輸錯(cuò)口令超過 3 次以上,你的帳號(hào)就會(huì)被凍結(jié),需要去柜臺(tái)重置口令。這個(gè)功能看上去很安全,因?yàn)榭梢苑乐购诳驮诰€嘗試破解你的登錄口令。不過這又帶來了另一個(gè)問題,如果有一個(gè)惡意用戶知道你的卡號(hào),他就上網(wǎng)或是造個(gè)卡故意輸錯(cuò)你的口令,導(dǎo)致你的帳號(hào)被凍結(jié),讓你一次又一次地去銀行排隊(duì)重置。面對(duì)這樣的情況,你該怎么解決?
6)當(dāng)你在網(wǎng)上購物的時(shí)候,你會(huì)去一些電子商務(wù)的網(wǎng)站,這些網(wǎng)站都會(huì)對(duì)他們的產(chǎn)品進(jìn)行分類,有大分類有子分類。你進(jìn)到分類后,你可以通過不同的屬性來過濾不同該分類下的商品,注意,不同分類下的商品的過濾屬性不一樣,如,手機(jī)分類和電視分類的屬性都不一樣。試問,你如何設(shè)計(jì)你的數(shù)據(jù)庫表結(jié)構(gòu)?
7)當(dāng)你在泡各種論壇或 SNS 社區(qū)的時(shí)候,你會(huì)看到,用戶在互相回復(fù)的時(shí)候存在一個(gè)問題,尤其是用戶量很大的時(shí)候,大家的回復(fù)完全交織在一起什么也看不清楚。以前有的論壇使用樹形列表來解決這個(gè)問題,樹形列表好是好,但是把一棵大樹放在那里還是很難看。Twitter.com 給了一個(gè)非常不錯(cuò)的解決方式,就是所有人的回復(fù)或是回復(fù)的回復(fù)都按時(shí)間線放在一起,如果你要查看某回復(fù)的上下文的話,點(diǎn)擊一下這個(gè)回復(fù)就可以看到了(我在我在“國內(nèi)微博和 Twitter 的最大不同”中批評(píng)過這個(gè)事)。新浪微博在禁評(píng)論事件后也開發(fā)出了這個(gè)功能。你知道這個(gè)事怎么做嗎?
更進(jìn)一步,新浪微博的設(shè)計(jì)上有很多的缺陷,單說新開發(fā)的“查看評(píng)論”功能這個(gè)事來說,還是不完美,因?yàn)槟承┰u(píng)論會(huì)隨著轉(zhuǎn)發(fā)帶到別的地方去,他的“查看評(píng)論”功能只能看到當(dāng)個(gè)貼子下的東西,不能把所有轉(zhuǎn)發(fā)出去的貼子的評(píng)論一起綜合起來。雖然這對(duì)于用戶使用來說沒有什么在不了的,但是對(duì)于軟件設(shè)計(jì)來說,我們不妨做一個(gè)練習(xí),可以思考一下,怎么樣設(shè)計(jì)會(huì)更好。
再舉一反三,有時(shí)候,我發(fā)現(xiàn)多個(gè)網(wǎng)友會(huì)提出同樣的問題,我很想用一個(gè)回復(fù)同時(shí)回復(fù)他們。如果有這樣的功能的話,我們的回復(fù)就會(huì)從一個(gè)樹形變成另外一種形狀了,我們又該如何設(shè)計(jì)才能支持這樣的功能呢?
8)說到新浪微博,我就想多說幾句,我最近觀察到了兩個(gè)事:
- 一個(gè)是驗(yàn)證碼的事,如果你在你的帳號(hào)設(shè)置里設(shè)置了“登錄需要驗(yàn)證碼”,你會(huì)發(fā)現(xiàn),在登錄新浪微博的時(shí)候,僅當(dāng)你輸對(duì)了口令后,系統(tǒng)才會(huì)提示你輸入驗(yàn)證碼。為什么呢?因?yàn)椋@個(gè)“登錄需要驗(yàn)證碼”這綁定在你的帳號(hào)設(shè)置里的,所以,要取這個(gè)設(shè)置,就需要你登錄成功(?!),老實(shí)說,這個(gè)功能在設(shè)計(jì)上有點(diǎn)二(中國特色)。如果是你,你怎么設(shè)計(jì)呢?
- 另一個(gè)事情是新浪微博或 Twitter 的用戶名修改后,被他人@過的信息就再也鏈接不到你這里來了。我們來試想一下,如果是你,你怎么解決這個(gè)問題?(我的我的微博里討論過這個(gè)事,不一定對(duì),供大家參考)
9)我有時(shí)候我會(huì)發(fā)一些快遞,有時(shí)候是一些小東西,有時(shí)候是一些大包裹,有時(shí)候近,有時(shí)候遠(yuǎn)。我發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,就是快遞員來收件的時(shí)候,快遞的價(jià)格都是快遞員自己說了算的,我還可以和他們砍價(jià)。我觀察到他們會(huì)以距離,重量大小來訂價(jià)。于是我在想如果你要運(yùn)營一個(gè)物流公司,你作為這個(gè)物流公司的程序員,你需要開發(fā)一個(gè)軟件來標(biāo)注快遞價(jià)格,你會(huì)怎么做?比如,這個(gè)快遞公司會(huì)說,在北京五環(huán)以內(nèi)是一個(gè)價(jià),以外是一個(gè)價(jià),出省后,上海以北是一個(gè)價(jià),上海以南是一個(gè)價(jià),等等,這只是北京的,如果把全國的各個(gè)城市到別的城市的價(jià)格都考慮進(jìn)來,還要受到重量,體積,價(jià)格,是否加急等等因素的影響,你的數(shù)據(jù)庫設(shè)計(jì)要怎么做呢?
A)國內(nèi)的水軍太恐怖了。他們活動(dòng)的刷排名,刷信用,刷積分,刷粉絲等等地方,你是否想過如何解決這個(gè)問題?還有廣告聯(lián)盟的欺詐問題,等等。這些東西,有的還是可以通過技術(shù)手段進(jìn)行限制和計(jì)算的,你有思考過應(yīng)該使用什么樣的方法嗎?
B)說到水軍就不能不提垃圾郵件和垃圾短信。你有沒有想過郵件系統(tǒng)怎么過濾垃圾信息的?
C)關(guān)于推薦功能,這必然是一個(gè)熱點(diǎn),這是軟件產(chǎn)品從 request -> response 的被動(dòng)方式到主動(dòng)方式的進(jìn)化。微博上有推薦關(guān)注者的功能,電商有推薦商品的功能,豆瓣上有推薦影片音樂書籍的功能。不同的領(lǐng)域的推薦算法各不相同,你有沒有思考過,如果是你來做推薦算法的時(shí)候,你會(huì)怎么做嗎?更進(jìn)一步,推薦通常伴隨著學(xué)習(xí)和匹配,學(xué)習(xí)用戶的行為,匹配相似的東西,你想過怎么學(xué)習(xí)用戶的行為,怎么匹配相似的東西了嗎?
D)關(guān)于微博,某名人有幾千萬的粉絲,當(dāng)這個(gè)名人發(fā)一個(gè)微博的時(shí)候,需要通知這幾千萬個(gè)粉絲,這個(gè)在系統(tǒng)架構(gòu)上應(yīng)該怎么做?如果某天這個(gè)名人與人發(fā)生口角,和人吵架,拼命的刷微博,那么,系統(tǒng)架構(gòu)要怎么設(shè)計(jì)才能支持這樣的事呢?
E)想想火車票的分段賣票的方式,現(xiàn)有的解決方案是為每個(gè)站點(diǎn)預(yù)留票,于是我們可以看到火車始發(fā)時(shí),有很多空坐,這些空坐都是留給下一個(gè)站點(diǎn)的,我們能否開發(fā)出一個(gè)系統(tǒng)來,可以把一條線上的這些這站上那站下的旅客統(tǒng)籌規(guī)劃一下,制定出一個(gè)最經(jīng)濟(jì)的方式,讓火車運(yùn)行得更有效。
F)對(duì)于地鐵公交網(wǎng)絡(luò),我們希望這個(gè)網(wǎng)絡(luò)既能有更多的覆蓋,又能節(jié)省路線,你能不能設(shè)計(jì)出一個(gè)系統(tǒng),當(dāng)我們輸入一些數(shù)據(jù)(如:站點(diǎn),是否終點(diǎn)或起點(diǎn)站,該站的下一站可能方向(多個(gè)),該站是以上車為主,還是下車為主,等等),你的系統(tǒng)能自動(dòng)安排出各種線路嗎?
這樣的問題實(shí)在是太多了,都是可以讓我們?nèi)ニ伎嫉模⒉灰欢ㄓ薪?jīng)濟(jì)效益,但是至少可以讓你鍛煉一下怎么去分析問題,怎么去思考,怎么去解決問題。
總結(jié)
綜上所述,我想說的是:
1) 只要你想,挑戰(zhàn)是無處不在的。那怕是你現(xiàn)有的覺得無聊的東西,只要你想做到極致,那怕是一個(gè)簡單的功能(比如用戶登錄的功能)也會(huì)讓你充滿挑戰(zhàn)。
2)觀察身邊的事物,去思考,去調(diào)查,舉一反三,這才是你成長的源泉。不要把你的成長推給客觀原因。
3)我的軟件開發(fā)的三重門中說過,第三重門是解決實(shí)際問題,讓你的業(yè)務(wù)處理更為的智能,更為地強(qiáng)大。我不知道為什么這一兩年,我們的圈子里所有的人都在關(guān)注著“云”,“海量數(shù)據(jù)處理”,“高性能架構(gòu)”這樣的東西,尤其是那些性能調(diào)的高性能的東西并不很難,而這些更為實(shí)際問題更有挑戰(zhàn)性,也更有前景。
it知識(shí)庫:程序員:挑戰(zhàn)無處不在,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。