算法還重要嗎?
算法還重要嗎?
我為什么要問這個問題呢?其實這最近一周時間都在看算法在數據挖掘和存儲處理性能上運用. 當然這也引起我個人的一些對算法的思考.正好昨天晚上看到張洋同學的算法雜貨鋪——分類算法之貝葉斯網絡(Bayesian networks)一篇文章.更是激發我要去寫這篇文章,躺在床上一直在想這個問題怎么能清楚的說出來. 也許你看到這個標題 你也工作了幾年 回過頭在來看這個問題 也許一時間會感到疑惑. 算法還重要嗎?
1. 什么是算法
我們先不要給算法是否還重要就輕易下了一個結論. 到這我也先不著急給算法下定義做解釋. 我們現在先來看看一種現象: 哪種語言是開發者們可以高高興興的用來編程的?近日,一位美國的開發者通過Twitter對開發者們進行了一項調查 :你是否喜愛XX語言 調查結果分析圖:
基本上每個月都會有一些相關對語言使用程度做了一個排名. 大家業見怪不怪了. 編程語言又能體現出算法相關價值,也許你會好幾種語言, 但隨著工作時間增加和對技術深入研究你會發現: 不是具體的技術而是算法這些基本的東西成為了技術深入的軟肋, 特別是在緊要關口 這個軟肋往往就會更疼。
起碼我認為自己目前工作創造性東西比以前少了很多. 很多算法已經被包裝到了語言和工具中, 作為一個開發者也就不想以前那樣費力去學習. 而往往有些算法只適用于本語言或工具而且只能解決某些問題,移植到別的情況下則無法使用, 這也是我在開始學習Ruby后才感到算法適用范圍有所不同. 最為別扭的是你發現以前在用Asp.NET和Visua4l Studio開發工具中對于有些問題已經界定好思路. 人都是懶惰 既然有現成的東西不用 為何要費力去創新. 這也就導致長期適用單一編程開發者視野上狹隘. 開發者很難有屬于自己的思維方式. 這就是為什么有些人說自己做到一定程度后成了熟練“代碼工人”也不難解釋. 起碼這個問題讓我感到很悲哀。
Ruby之父松本行弘[日本同行]就曾表示,注重的是算法而不是工具, 如果沒有自己的思維方式和編程邏輯,很容易對某種具體的技術或者工具產生依賴性, 而這些編程工具和技術往往是國外開發. 假設有一天我們沒有這些現成的工具 和技術 我們該怎么辦? 豈不是成了一窮二白了嗎?但是如果有了穩固的算法思維 編程世界里東西都不可怕.
算法是一種本質的回歸.
今天出了JAVA 明天出了一個C#. 后天還不知道要出了一個什么 XXX¥¥語言和新技術. 于是乎你也成了那趕潮大軍中一員 一路疲憊被人牽著鼻子走, 到頭來你發現越深入步伐走得越慢. 越是吃力.往往技術了解得越多、做得東西越深,這樣的體會越明顯, 借用一位網友的話說就是"內功”不到位. C# java Ruby 只是兩個你用來練習武功的招式, “內功”則是這些花哨武功招式后本質, 招式可以很多種 如果沒有 ”內功” 招式變換再多也只是表面文章 罷了. 注定你是成不了一個名副其實的”武林高手”
看完了這個現象后 在回頭來說算法定義. 算法(Algorithm)說白了就是是解決問題的步驟.可以把算法定義成解決一個分類問題的任意一種特殊的方法.
編程世界中 算法+數據結構=程序.
而數據結構往往是封裝在不同編程語言中. 求解一個給定的可計算或可解的問題,不同的人可以編寫出不同的程序,來解決同一個問題,這里存在兩個問題:一是與計算方法密切相關的算法問題;二是程序設計的技術問題。算法和程序之間存在密切的關系的.
算法還重要嗎?
算法還重要嗎? 我為什么要加一個“還”來形容這個問題. 上周在網上論壇有一個網友曾說過”現在數據存儲技術和計算機運算速度已經是很快了 這也是將來一個趨勢 算法還重要?”這突然引起我對算法重要性的興趣,當然我也默默問自己這個問題。其實也許我們忽略一個問題. 從去年到今年就拿我們行業里一個非常小地方來看看目前我們要面對問題: 就說說Twitter從2008年開始到現在每月要處理發送數據信息量 統計圖:
美國調研公司Royal Pingdom最新統計報告表明,目前Twitter的每月平均信息發送量正以超過10億的速度快速增長。天那小小的一個社交SNS社交站點從2008到現在短短兩年時間 數據量增長基本是以數量級的方式來增加.這只是目前行業一個小角落. 可想而知未來信息量更會以爆炸方式增長. 而要解決這些問題我們不僅不需要好的設備. 好的技術 更 需要很多卓越的算法來解決這些問題。
說了這么多 下面說一個簡單例子.例如在ArcGis地里空間信息系統中 常常會處理一個關于到導航的小問題. 問題很簡單: 你想從地圖的任意的A點城市 到達任意的B點城市 列出最快的達到路線 并計算最省錢的行進方式:
系統設計中: 如果一下子把全國所有上億條道路信息依次進行逐條比對在進行計算. 反映時間太長. 如果給多個用戶 服務器的壓力就太大了 基本立馬崩潰掉.如果我們需要設計一個算法:
首先從全國道路信息數據庫中 調出 從任意A點到任意B點所要經歷省市的道路信息數據. 這就剔除一大部分沒用數據信息. 縮小了我們數據檢索的范圍。這樣的話還是不行. 訪問壓力依然存在. 這時我們可以把數據按照省市進行分區.處理. 用戶輸入數據后從任意的A點到任意的B點首先確認 是否A點到B點是否在同一個區 如果同一個區 直接在數據庫中這個區域內調取數據進行計算. 至于距離最近路線算法中圖論中有很好解釋 。
這時問題又來: 西北和沿海地區發展速度不一. 道路信息數據沿海城市偏大 用戶量偏多 出行需求量高. 西北地區道路偏少 人口稀缺 遠距離出行量少等特點 再次優化算法。對核心沿海需求量居多城市和省份 區域數據再次進行分區處理. 最頂層的是省份 下級市區 再到縣級.。方便用戶點對點精確搜索和距離計算. 如果底層訪問量較小 類似樹形結構 向上可以延展放大搜索范圍.
上面大概滿足基本需求. 如果用戶提出不同交通方式 乘車/飛行/水路 而且道路也分為高速 國道 省道. 航線非為國際和區域航線. 這樣的話我們計算距離的算法就需要更加細化了. 從上面實例可以看到用戶需求總是不斷變化的. 一個好的算法是解決復雜問題核心關鍵. 可見算法在將來解決數據處理依然是不可替代的.
有人又會問.為什么我日常工作中很少用到算法?
3. 算法的應用范圍
很多人疑惑我的日常編程中很少用到算法. 我個人認為,好的算法是每個程序都應該盡力去實現的, 也許一個程序百分之90以上被項目UI和實現業務邏輯給占據了. 但是總是有那么一部分決定你的產品核心競爭力.
為什么你沒有用到算法?
人們之所以說算法很重要,是因為任何的程序,任何的軟件,都是由很多的算法和數據結構組成的。從這點上說算法確實很重要,但是這不意味著算法對于每個軟件設計人員的實際工作都是很重要的。其實,軟件行業是可以分為算法密集型,典型的比如一個搜索引擎 Cache底層,/三維場景中實時渲染算法.例如Google。每天Google的網站要處理十億個以上的搜索,GMail要儲存幾千萬用戶的2G郵箱, Google Earth要讓數十萬用戶同時在整個地球上遨游,并將合適的圖片經過互聯網提交給每個用戶。如果沒有好的算法,這些應用都無法成為現實
業務邏輯密集型,典型的比如一個CRM/ERP業務系統 項目中我們把更多的時間放到業務邏輯的實現和UI層數據呈現上 至于算法使用只有在性能受到限制或是出現性能訪問瓶頸時加以算法優化。 這通常的情況,而對于基于運用實際問題 往往面臨問題較多 使用算法地方也就相對偏多.
使用體驗密集型,典型的比如娛樂行業Silverlight站點 注重的使用用戶體驗上快捷。所以并不是每個軟件開發者都要求有很好的算法功底。關鍵是看遇到問題解決問題的能力,算法在一定程度積累思維模式上經驗.。這也是很多程序員說自己到了 30歲 在技術上創新陷入瓶頸.每個項目特點和需求特殊也導致算法運用場景上不同. 有人說過算法重要,但不是最重要 這句話在某些特定運用場合時可以講得通的 得靈活使用。
最后
最后至于這個問題 算法還重要嗎?無論IT行業內多么朝夕莫測、新技術 新語言層出不窮,計算機和軟件發展背后的根基卻巋然屹立、經年不變,算法便是基礎之一. 而對于那些已經歷經技術變幻開發者而言算法同是也是一種本質的回歸.