軟體開發升級打怪之路

周末兩天收到很多鼓勵和贊同的留言,程序君感到非常開心。雖然有不少呼聲希望能夠天天看到連載,但程序君真得沒法一周七天寫同一件事,那樣,寫出來的東西無法保證質量。雖然目前對於『途客們的旅行夢』,程序君有一些存稿,但將其從草稿的狀態轉化為待發表的文字,程序君還是每次花費差不多一小時的時間呢。

有些讀者覺得兩次更新間等待的時間太長,建議縮短間隔。程序君覺得在理,所以從本周起,從周六周日連續兩更變為周三一更,周日一更。所以『途客們的旅行夢』的下次更新就在周三早上,敬請期待。

有人質疑為何過去三年的事情我還能記憶猶新,很簡單:有段時期程序君一直在記日記,或者寫工作日誌。所以這段日子的記憶就特別準確。人的記憶就像一塊無限大的內存一樣,你經歷的一切都靜靜地放在那裡,從不丟棄。如果給你一個指向某段記憶的指針,你就能輕而易舉地獲取這段記憶,而各種形式的日記就是這個指針。

言歸正傳。今天講講軟體開發升級打怪之路。因為留言中有大量的類似問題:我剛剛上完了xx語言的課程(或者自學了xx語言),下一步該怎麼學習才能達到開發產品的水平?

這是個好問題,相信困惑不少人,尤其是學生。

辦法很多,程序君講講自己最喜歡的,也是最暴力的 —— 直接動手使用你剛掌握的技能開發產品。

這有兩種途徑:(1) 加入一個使用該種技能的團隊進行產品開發;(2) 自己動手開發。

途徑(1)在任何時刻都是最佳選擇,一群人在一起探索(尤其裡面可能還有一些高階能手)的效率是最高的,你的成長也是最快的。但世間之事往往郎有情而妾無意,你看得上的團隊未必瞧得起你。這時候,(2)便成了唯一的選擇。

可是我都不知道自己該開發些什麼,怎麼辦?

程序君可以舉個例子 —— 你可以拿這個例子練手,也可以順著這個思路,想想其它對你更有意義的『產品』進行開發。

這個例子源自前幾天的有人在留言中寫錯的成語『血脈噴張』,我將其糾正為『血脈僨張』,有人又糾正我說應該是『血脈賁張』。後來我查了百度百科,『血脈僨張』和『血脈賁張』都是正確的。我就想,可不可以做個產品,對一篇文章中的成語進行自動糾錯?

這個問題很大,做起來有不少坑需要填。很多時候,同樣的結果,如果你問對了問題,那麼處理的難度要小不少。我們把這個問題稍稍改改:可不可以做個產品,對用戶輸入的成語進行自動補齊?

這下簡單多了。能滿足80%的需求。

我們將它進一步分解縮小成入門水平程序員能夠理解的問題。

(1) 獲取一個包含儘可能多的成語的詞庫

(2) 讀入詞庫,以特定的方式存儲,以便於掃描

(3) 根據用戶的輸入進行判定和補全

對於(1),最簡單的方法是導出某個輸入法的成語詞庫(可能還需要做些過濾的工作),對於(2),可以考慮將詞庫建個前綴匹配樹,對於(3),將滿足前綴匹配的結果推薦給用戶。

這問題解決起來不難,詳細的實現手段我就不說。接下來你可以考慮這些問題:

(1) 如何進一步提升匹配的速度(performance)和精度?(還有什麼更好的演算法嗎)

(2) 如果將其封裝為一個unix service,該怎麼做(比如說將匹配和推薦做成一個服務,監聽tcp/unix domain socket,讓本地,甚至遠程的進程也能訪問)?你會制定什麼樣的協議(protocol)來規約客戶端和伺服器?

(3) 如果將其封裝成一個web app,該怎麼做?如何達到類似google suggest的效果?

有人覺得(2)(3)很類似,其實差別很大。對(3)而言,每個http訪問都是一個單獨的請求,互相之間沒有狀態,所以你不能和(2)一樣直接使用已有的載入好的詞庫,但如果每個請求都載入,代價很大。所以你要麼使用(2)的成果,要麼啟動一個緩存服務(如redis)將詞庫按照你的存儲方式載入進去。

這樣一步步走完後,你可以問自己更多的問題:

如果用戶在連續輸入,而不是特定輸入某個成語,我該如何進行自動補齊的推薦?如『頓時感覺血脈』,這時候能推薦出來『賁張』么?

如果這個問題也解決了還意猶未盡,可以研究下一個問題:可不可以做個產品,對用戶輸入的成語進行自動糾錯?

糾錯和補齊是兩個概念。糾錯會難很多。比如:對於『血脈賁張』,如果用戶輸入的是『雪脈賁』,能否推薦出來『血脈賁張』呢?

或者,回到最原始,可能也是最難的問題:可不可以做個產品,對一篇文章中的成語進行自動糾錯?

程序君就不一一分析了。以上例子如果你能潛心研究下去,並做出一個解決方案,那麼我相信BAT會樂於吸收你入伙的。

這個例子本身僅僅為了拋磚引玉。它可能並不符合你的口味,但我相信在生活中你總能找到很多很多類似的問題你認為值得花時間用程序員的方式去解決。它們一開始可能是一個很大,很難搞的問題,但只要你一點點簡化下去(使用遞歸分治等手段),思考下去,最終能找到一個適合自己去實現的問題,實現之,然後再一層層回溯。你會感受到打怪升級的那種成就感。

但有一點一定要注意:如果問題已有答案,可以借鑒,但不要抄。也許以上的問題別人已經有了解決方案,但那畢竟是別人思考和練習的結果,你copy&paste一百次,也抵不上自己的一次思考,一次練習。

所以,找個問題,深入下去,並(最好和別人一起)尋求解決之道,這就是程序君眼中的軟體開發升級打怪之路。

如果你對本文感興趣,歡迎訂閱公眾號『程序人生』(搜索微信號 programmer_life)。每天一篇原汁原味的文章,早8點與您相會。


推薦閱讀:

為什麼你要懂點信息安全
用心與否,一試便知
[技術] 談談編程思想
AWS 及 IAM 答疑

TAG:迷思 | 『途客们的旅行梦』 |