天天看點

程式員的思考 - 技能

當了十幾年程式員了,是不是很失敗。現在仍然在Coding。

沒有所謂的“架構師”、“技術總監”、“系統分析員”頭銜,是的,沒有。我仍然陶醉在代碼當中。姑且叫做興趣吧,因為我的薪水不高,甚至可以說太低。但我仍然喜歡這個職業,不管外界的喧嚣、行業更疊等。說他大有前途如首富比爾·蓋茨,說他苦命如屌絲程式員,我都一笑了之,不為所動。其實骨子裡的原因是我的性格,善于和機器交流,不善與人交流;或者說與機器交流令我愉悅,與人交流令我不适。是以造就了我可能永遠是一個碼農的命。

當看着寫出的代碼流暢地在機器上運作并給出正确的結果時,我就忍不住内心激動,也許這就是傳說中的“成就感”。

跑題了,言歸正傳,大緻說一下程式員說需要的基本技能。這個純粹是個人思想總結,僅供參考,切勿奉為聖經,如誤人子弟,罪莫大焉。

1. 關于平台

這裡所說的平台可以了解為作業系統吧。目前世界上主流的作業系統也就兩大體系吧,Windows和Linux/Unix。我說的是主要是應用平台,嵌入式可能是特殊的一套體系,不做讨論。如果考慮如今炙手可熱的移動開發,則要加上iOS、Android。其實iOS/Mac OS源頭可追溯為FreeBSD,可劃歸Unix,Android源頭可追溯為Linux。是以,仍然是兩大體系。

當然,體系往下分很多版本,Windows有98/XP/2000/Vista/7/8等,Linux/Unix有Redhat、Ubuntu、AIX、HP-UX等。對程式員來講,體系内的開發方式是類似的,而兩大體系之間的開發差别則是巨大的。主要是底層所用到的API函數不同(對于C/C++語言的開發),另外,作業系統本身的運作機制是截然不同的,如記憶體、磁盤、程序的管理都不一樣。是以,跨平台的開發是一個繁重的工作。當然,利用語言本身的一些特性可以做些規避,如C/C++開發盡量采用POSIX标準,JAVA語言本身帶虛拟機,可規避大部分平台差別,另外一些腳本語言如Python/PHP/Perl由于自帶解釋器也可适用多平台。或者借助一些跨平台的庫如QT等。但是,涉及到底層的一些東西是繞不開的,要徹底做到跨平台是不現實的。

是以,程式員應該具備多平台開發的能力。當然,這是能力的一種提升,并不是強制。因為既然存在多平台,那麼項目中就有可能用到多平台,或者是不同的項目用不同的平台。如果接到需要不同平台的項目不至于慌神,不至于心裡沒底,同樣也可以拿出設計方案,這樣就顯出你的能力了。目前比較流行的開發方式是,Windows做用戶端,側重表現,Linux/Unix做服務端,側重業務邏輯。當然,服務端用Windows的也比較多。但用戶端,或者說桌面,幾乎被Windows壟斷,Mac OS也隻是一小部分而已。

另外一種趨勢是,Web(浏覽器)用來做表現,背景則是Web Server。這種趨勢在HTML5興起愈發表現得強烈。但Web App或是Native App究竟孰優孰劣,至今尚在争論而無定論。不管趨勢怎麼發展,我感覺兩大體系将在長時間内共存,任何一方壟斷都是不可能的。各有各的優勢,各有各的劣勢,以後的發展,最多此消彼長。任何一方消失都尚早。是以程式員掌握多平台的開發能力絕對是有很大益處的。

要怎麼掌握呢? 一句老話:實踐。掌握作業系統的運作機制,檔案管理,程序管理等;掌握基本的底層API,基本的開發調試方式;嘗試做一些小的項目等等。其實彙總為一句話,多折騰! 當然,這個折騰是褒義詞。隻有通過折騰,才能熟悉系統,才能解決實際的問題。用慣Windows的人初次嘗試Linux/Unix會覺得難用得要死,什麼都要用指令搞定,什麼都要編譯,Makefile簡直是惡夢;而搞Linux開發的人會覺得Linux程式的開發簡直比Windows簡單太多了,它的底層體系因為一直多年來沒有改變;而Windows一直在變-OLE-COM-AcitveX-.Net-Sliverlight-WPF-WinRT,微軟的技術詞彙層出不窮,每個新版作業系統都會帶來新的技術名詞,讓開發人員應接不暇。

當然,最好有多平台的實際項目經驗,這樣是最能學到東西的。

2. 關于語言

當然,這裡是指程式員用的開發語言。如今的程式設計語言已經非常豐富了,多到令人眼花缭亂的地步。可以按不同的劃分方式來劃分。按編譯型和腳本型,前者有c/c++, java, fortran, pasical,後者有php,python, perl;按托管型和原生型,前者有java,c#, 後者有c/c++;按web型和app型,前者有php,ruby,javascript,後者有c/c++, python,objective-c;按函數型和非函數型,前者有erlang,後者有c/c++。

不同的語言擅長幹的活是不一樣的。c/c++着重底層開發或者注重性能的地方;PHP就是web的服務端語言;javascript是web的用戶端語言;c#是專為Windows平台服務的;objective-c是專為Mac OS和iOS服務的。

程式員至少要熟悉一門語言,要能拿這門語言幹活。當然這是最基本的,要不然就不叫程式員了。但一門語言,視野太窄,能幹的事範圍也窄,如果能多學一門語言,視野得到拓展,同時也能完成更多的事,何樂而不為呢。以前我隻會c/c++,認為c/c++無所不能,勝任任何事。後來接觸了PHP,Python等腳本語言才明白,c/c++是能幹任何事,但有時可能代價太大,得不償失。c/c++性能是好,但語言本身的庫不豐富,記憶體管理風險也很高,幹一個簡單的任務,可能遠不如腳本語言來得快速。

現在Web盛行,不掌握一點Web開發都不好意思跟别的程式員打招呼。于是,HTML/CSS/Javascript就免不了要學學了,這還隻是前端,如果涉及後端(話說現在幾乎沒有靜态網頁了),又得學習PHP/ASP/JSP等等。

誰都想隻想掌握一門語言,熟悉一個平台,就走遍天下。可惜這太理想,根本做不到。沒有最好的語言,隻有最适合的語言。有時,并不是自己想掌握多門語言,而是項目給逼出來的。項目都是強調多快好省的,什麼最快,什麼實作最簡單就采用什麼。掌握多門語言,就可以想到或找到項目最适合的開發方式。

掌握一門語言并不容易,如果僅僅懂得文法,則隻是皮毛,遠遠不夠。還需要熟悉使用這門語言的庫,完成某件事情采用的基本方式,不同平台下的表現形式,還是老話,多實踐吧,必須自己親自去敲代碼用程式完成某件事情,你才能算剛剛入門。

總結一句話吧,程式員應該精通一到兩門開發語言,熟悉多種語言,了解不同語言所各自擅長的領域。 

3. 關于資料庫

做軟體應用系統的話,極少能避開資料庫的。其實這裡的資料庫,可以了解廣義一點,不是特指某一種資料庫管理系統,如Oracle,SQL Server, MySql等,而是指将資料持久化的一種方式,更簡單地說,是将曆史資料存儲在硬碟(或其它存儲媒體)上的方式。這種方式直接影響了軟體對資料讀取和寫入的規劃。

最簡單的資料庫即平面檔案。以作業系統的檔案通路方式來實作資料的讀寫,這可以應對簡單邏輯的單機應用。這種檔案可以有标準格式的,如ini檔案,json檔案,也可以完全自定義,讀寫完全采取自己的方式。其次就是現今主流方式,結構化資料庫方式,支援标準的SQL查詢語言通路方式,支援實務,這是商用主流資料庫管理系統提供的方案,如Oracle, SQL Server, Sybase, DB2。開源的還有SQLite,MySql, Firebird等等。它們共同的特征是支援SQL查詢語言,盡管支援程度不一樣。

另外一種資料庫-NoSQL,是近期興起的資料管了解決方案,這是應對Web中産生的海量資料産生的,或者說是應對無窮變化産生的。因為在Web時代,講究快速應對需求變化,講究快速疊代開發,是以NoSQL類資料庫幾乎無需Schema設計,強調充分利用記憶體,一般采用特有的API通路資料。它們用來應對多變的資料管理,但一緻性不如傳統的SQL資料庫。是以NoSQL一般是網際網路公司采用較多,而傳統的銀行、電信等行業依然以SQL資料庫為主流。

項目上采取哪種資料庫,是要按項目本身的需求來決定的。有可能還用到不止一種資料庫。資料的規模及程式對資料的通路方式(業務模型)決定了采用什麼樣的資料庫設計方式。另外還要考慮硬體及人力成本。大型的資料庫管理系統常常需要雇用專職的資料庫管理者,如Oracle或DB2。

另外,還有一些專業的資料庫,如列儲存的,空間資料庫、圖資料庫等,都有專門的适合場景,不再一一讨論。程式員應該多了解各種資料庫的特性,以便為項目對資料庫的選擇及設計打下良好基礎。

4. 關于庫和架構

再回到代碼上吧。現在程式員寫代碼,一般是要用到成型的庫的。所謂的庫,就是封裝好的,具備某些特定功能的函數或類庫。外界使用它的時候,不用管它的實作,隻管引入并調用它即可。庫是很有用的東西,當開發語言中成型的庫比較多的話,是可以大大節省開發時間的,因為很可能你需要的功能有的庫已經幫你實作了。java,python等語言擁有非常多的庫,是以它們做起東西來是比較快的,好多通用的功能幫你實作好了。c/c++的庫就比較可憐,标準庫包含的東西太少,做起東西來就慢。近年随着stl, boost庫的完善,c++11标準的釋出,稍微好了一些,但仍然和别的語言差距很大。精通一門語言的人,必然精通它可能涉及的常用的庫,因為你開發項目時不得不用,不熟悉是不可能的。不使用現成的庫,什麼都自己去實作,不太可能,也浪費大量時間,重複發明輪子是不可取的。

架構,是比庫高一個層次的東西,或者說,它還不僅僅是庫,還融入了思想,它約定了一種開發規則,讓你在它的規則下去實作你的應用。而這種規則的好壞,即展現了該架構的思想高度和優劣程度。舉例來說,Windows中開發工具VC++中用于封裝API的類庫MFC就是一個架構,它不僅提供豐富的功能,如字元串處理、容器、控件等,也提供了設計思想,如MVC,有專門的視圖和文檔類,還封裝了消息傳遞機制等等。類似的類庫還有以前Borland公司開發的Delphi中的VCL,也是十分出色的架構,是快速開發Windows應用的利器,相信使用過的人深有體會。Web服務端語言PHP也有很多架構,優秀的有YII、CodeIgnitor、Zend等,用了某種架構,就得遵循它所約定的開發方式。

架構帶來的好處是節省你的開發時間,對你應用的健壯性有一定保證,對程式的架構設計及以後的維護都會有效率上的提升。設計和實作一個優秀的架構絕對不是一件容易的事情。是以優秀的架構是值得我們去使用和學習的。

5. 關于架構

標明平台了,熟悉一種語言了,知道采用什麼資料庫了,那麼可以進行項目開發了吧。如果是個人練練手的項目或是臨時性的小項目(僅供幾個人在短時間使用),那麼是夠了,這時候隻是要求快,或者為熟悉和驗證某個技術,不需要考慮太多。但如果是商業項目開發,隻考慮上述方面是遠遠不夠的。

對項目的全景規劃我們稱之為架構。現在軟體行業有一種流行的職位叫”架構師“,就是幹這個的-對項目的全局設計。對軟體項目的架構設計至關重要,因為它決定了項目采用的軟硬體環境、采用的開發語言和資料庫、部署方式等等。比喻來說,架構即為骨骼,語言、資料庫等為肉。架構決定了軟體的初步輪廓,即高還是矮,胖還是瘦。但長得漂不漂亮決定不了;也決定了是否健壯,是否情緒穩定,但決定不了喜怒哀樂。

架構設計要對客戶需求進行仔細而全面的分析,要考慮軟體最終的運作環境,要考慮應對将來可能的需求變化,要考慮開發方式以及傳遞後的維護成本。總之,架構是對軟體項目的一個總體設計,它基本上決定了項目的走向,對項目的成敗(指技術上的,非市場上的)起着至關重要的作用。

做一個合格的架構師相當不容易。首先,你得熟悉相當多的軟體技術方面的知識,作業系統、資料庫、中間件、開發語言、技術架構等等,如果你不熟悉,怎麼來做架構設計,怎麼知道哪種選型是合适的?其次,架構師必然是從開發崗位一步一步走上來的,這樣才有實際的項目經驗,才會對軟體開發的各個方面有細緻的認識,才能做好架構設計。紙上談兵的架構師是相當危險的。

是以對于程式員邁向架構師之路,沒有捷徑,勤奮的學習+多年的項目經驗+多思考總結。

繼續閱讀