寫給互連網上從業的Web程式員
程式員是一個脆弱、特殊的群體,以各種方式生存在有01的世界裡。
程式員的特點:
狂躁,但是有修養
隨和,但是瘋癲
肯向任何人學,但是不服任何人
守約,但是不守時
感情豐富,但是單純
……
Web程式是程式員中的一個別具特色的群體,他們有著和HTTP協議類似的無狀態性、無序性、不可預測性。我這麼說,是因為web程式員的出身、成分、學習途徑、從業曆程多種多樣。Web程式員,是現今IT從業者中最具活力也最複雜的最可愛的一群人。
相比於傳統的“學院派”程式員(請暫時允許我這麼說),Web程式員的普遍出身都比較“貧寒”,這是行業事實,尤其是處於剛入行不久的這一大部分人中,有很多是沒有上過大學,受過正常高校教育體制折磨的。高中、專科甚至初中學曆的程式員比比皆是,他們通過自己的努力,掌握了一定的技能,取得了一項不錯的工作。
“學院派”包括很多集團性質的大規模開發活動,外包項目,基於底層或硬體的開發,研究性的開發等等,體現在開發工具上多集中於C、C++、Ada等學院氣息濃厚的語言,Java在某種程度上也可以算作其中,他們的特點是基礎牢固、嚴謹、重視內在,又有些枯燥的味道。Web開發更傾向與靈活、開發效率和表現形式。
然而由於各種原因,很多高等學府中的學生有一種很不正確的誤解,認為Web開發是低於傳統開發的,沒有水平的,浮躁的,實在沒工作的表現,從而看不起它。相對的,很多Web從業者認為大學生畢業後去的大公司的工作是死板的,缺乏創造性的,枯燥的,沒有真才實學的,更認為大學裡學不到什麼,從而也看不起,甚至仇視大學教育(包括一些受過高等教育的人)。這是一個非常現實的矛盾。
當然這個矛盾只是集中沒有畢業的學生和從業時間不長的人群中,等到工作一段時間之後,相互接觸得多了,都會覺得自己原本並沒有體驗到對方的真實內涵。傳統開發中有很多富有創造性富有激情的內容值得互連網行業借鑒,而Web開發中千奇百怪的想法和時刻面對億萬使用者的幾乎無法預測的使用環境都是傳統開發人員覺得羨慕不已的,而兩者結合更是體現了學院的嚴謹、知識的重要、來自使用者的成敗決定性,比如搜尋引擎,比如企業級的B/S分布系統。
一個精熟C語言並有著豐富經驗的人,轉行從事Web開發是比較快的,甚至可以說是如魚得水,但是一個做了兩年PHP而又沒有什麼其它的語言背景的程式員,在自身發展上就會受到阻礙了。任何一門語言上升到一定高度,它所面對的問題已經不再是這門語言本身。語言只是工具,使用工具的方法才是生產效率的決定因素。熟習了語言之後,慢慢地在工作中會碰到諸如執行效率、儲存方法、演算法最佳化等更多偏向分析而不是代碼藝術的內容。通常對於一個沒有受過系統的電腦教育,沒有受過自認為“沒用”的大學培養的程式員,在這些問題面前表現都是比較盲目、無助的。很多問題需要嚴整的數學分析,查閱參考資料需要比較好的英文水平和數學基礎,聰明一點的會馬上意識到大學基礎教育的重要性,多半都會後悔上課睡覺了,呵呵~~
一些人對於分析方法等抱著不以為然的態度,認識多是浮於表面,比如對於資料結構和演算法的淡漠,覺得在Web開發中極少或不可能觸及到這些內容。誠然,現在的Web開發指令碼語言都有豐富的函數,靈巧的使用方式,多數已經不需要再像C語言一樣聲名變數、建立指標、計算記憶體位址、寫排序演算法。而且基於互連網的不可預知性,也很難有一個完美的演算法解決所有情況下的問題,比如排序。程式員在這種情況下都是使用語言內建的各種功能在完成操作,當然我不是說什麼都要從頭開始自己寫,那是莽夫做的傻事,但是我想,既然用了,多多少少也應該知道函數是怎麼回事。自己寫的function是函數,系統提供的就不是函數了嗎?不求看懂源碼,至少也應該知道它是在做什麼。每天追求執行效率和頁面執行時間的程式員,更是忽略了系統函數本身的效率問題,把所有的系統函數都想象成了彙編中的NOOP這種單元操作。
Web開發中碰到的演算法問題很少嗎?舉一個小例子:iForum論壇(前年我在上海看過)中記載使用者組許可權的方法,是在資料表中插入一條類似11110010011100的字串,每一位代表一種操作,1就是表示有許可權進行操作,0就是沒有。這種方式很簡單實用,但是它受到Varchar的長度限制(雖然255種操作已經足夠複雜了),而且字串的計算效率又是低於數字,那麼有沒有想過這種演算法的本質是什麼呢?有沒有想過最佳化它呢?
中國古代有一套數學理論叫做“盈不足術”,例如,有十隻盒子,第一個盒子裡放一個盤子,第二個盒子裡放兩隻,第三個盒子裡放四隻,第四個盒子裡放八隻……第九個盒子裡放256隻,第十個盒子放512隻,即第N只箱子裡放2^(N-1)只盤子,一共1023隻。那麼命題如下:在1023這個數字之內,任何一個數目都可以由這十隻盒子裡的幾隻組合相加而成(大家自己算算就知道了……呵呵)。
那麼1、2、4、8、16、32、64、128、256、512這個序列為什麼有這麼個魔力?這個數列的特點:1、每項是後一項的二倍,2、每項都比前面所有項的和大,而且大1。這個1就是關鍵,就因為這個1,它才可以按1遞增,拼出總和之內任意一個整數。這個序列叫做超遞增序列,它是解決背包問題的基礎。
對於一個整數,假設377,它的二進位表示為“101111001”,它就是由第一隻、第四隻、第五隻、第六隻、第七隻和第九隻箱子拼成的,對於一個表現了9種操作的描述,377就是這個描述下的一個執行個體,是一個權值。
那麼相比於儲存這個字串和儲存這樣一個數值,好處和壞處都在哪裡呢~~很明顯的,儲存字串的好處是運算壓力小。我們可能聽過一個故事,就是把這個超遞增序列延伸到第64項,就是那個術士和皇帝在國際象棋棋盤上要米粒的傳說。64項的和是一個天文數字!但是不要忘了,電腦本身就是一個只認識二進位的機器!(這點很多Web程式員都忽視了,很多人不知道位操作是什麼玩意)有人擔心資料庫的int不夠長,那麼既然可以儲存一個只有0、1組成的varchar字串,為什麼不能儲存一個十六進位的字串,有人規定varchar只能儲存01嗎?十六進位串的長度正好是二進位的四分之一,而十六進位到二進位的轉化是非常直接方便的。
以上就是這個許可權串的由來,不知道有多少web程式員想到過這些……而一個C或組譯工具員看到這個字串第一眼就會想起這是個十進位的15516(當然不是馬上就算得出來)。
由此引出的和web相關的,比如多選框的儲存,投票選項的儲存等等……
Web程式員需要學習一些資料結構、演算法分析等知識,雖然在工作中不會使用得那麼明顯,但是這些概念是學習本身語言的一個很好的催化劑,它會讓程式員更有效地理解資料上的資訊,達到事半功倍的目的,也會在問題陷入苦處不得解脫時候協助開發人員理清頭緒,以一個清晰的思維過程找到解決問題的突破點。
阻礙程式員學習這些的原因,第一就是基礎學科不紮實,比如數學。電腦劃分為理工科是非常有道理的,電腦科學建立在深厚龐大的數學系統之上,至於如何學數學……這是功夫問題了。第二是心理障礙,覺得離開學校就學不好。自然學校是學習基礎學科的最好地方,但是往往工作上需要的知識更貼近實際,在實際中學習通常會比在枯燥的書本上搬東西效果更好。第三是客觀原因:從業者多半工作都很忙,業餘時間很少(這幾乎是程式員的標誌),那麼學習只能在工作中見縫插針,這種學習方式需要會用巧功,會聯絡。第四個就是資訊來源。現在適合Web程式員學習,根據Web指令碼語言特點編寫的基礎類書籍太少了!比如資料結構類書籍多半是以C/C++/Pascal這類強型別的嚴謹的傳統語言為描述基礎,作業系統原理多是以彙編等底層指令碼描述,設計思想多是以Java這種純OO的語言為主,我沒有發現有使用Perl這種怪異的語言教授資料結構的學校。
基於以上的研究結果,我們可以有條理地整理思路,多站在Web程式員的角度上考慮,做出一些適合這個特殊群體學習提高的有意義的活動。