軟件開發升級打怪之路
作者:陳天
今天講講軟件開發升級打怪之路。因為留言中有大量的類似問題:我剛剛上完了 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 一百次,也抵不上自己的一次思考,一次練習。
所以,找個問題,深入下去,并(最好和別人一起)尋求解決之道,這就是程序君眼中的軟件開發升級打怪之路。
<span id="shareA4" class="fl"> </span>
</div>