10年 Windows 與 Linux 程序員(yuán)的(de)區(qū)别

2018-06-26 16:32

如果一個(gè)程序員(yuán)從來(lái)沒有在Linux、Unix下(xià)開發過程序,一直在Windows下(xià)面開發程序,同樣是工作10年,大(dà)部分(fēn)情況下(xià)與在Linux、unix下(xià)面開發10年的(de)程序員(yuán)水(shuǐ)平會差别很大(dà)。這(zhè)篇文章(zhāng)并不是想貶低Windows下(xià)面開發的(de)人(rén),做(zuò)Windows開發的(de)人(rén)看了(le)可(kě)能會感覺不舒服,我并不是這(zhè)個(gè)意思,我隻是說說我自己的(de)感受。

 

 

我最早開始學習(xí)編程也(yě)是在Windows下(xià)面的(de),學的(de)是VB,後來(lái)轉到VC++,當時(shí)用(yòng)的(de)是VC6.0,做(zuò)Windows下(xià)面的(de)開發5年後轉入Linux下(xià)面做(zuò)開發的(de),開始在Linux下(xià)面做(zuò)開發的(de)時(shí)候,也(yě)做(zuò)過很多(duō)Windows下(xià)面的(de)項目,在Linux下(xià)面做(zuò)開發确實比我在Windows下(xià)面做(zuò)開發多(duō)學到了(le)很多(duō)的(de)東西,從開源代碼裏面吸取了(le)豐富的(de)營養,我不是說我是個(gè)高(gāo)手,隻是說在Linux下(xià)面學習(xí),你會進步得(de)更快(kuài)。

 

不過我需要強調一下(xià),我這(zhè)裏說的(de)是“大(dà)部分(fēn)情況下(xià)”,意思就是說“在同樣勤奮,同樣努力程度,同樣基礎知識,同樣工作年限,同樣是做(zuò)應用(yòng)程序的(de)開發”的(de)情況下(xià),如果說的(de)不對(duì),希望大(dà)家在下(xià)面發表看法。

 

可(kě)能大(dà)家會奇怪,爲何會出現這(zhè)種情況呢(ne)?聽(tīng)我慢(màn)慢(màn)道來(lái)!

 

第一:閉源與開源

Windows下(xià)面的(de)程序基本都是封閉源代碼的(de),特别是10年前,在Windows下(xià)可(kě)以說找不到可(kě)用(yòng)的(de)開源的(de)軟件,現在的(de)情況比以前好多(duō)了(le),很多(duō)Linux下(xià)面開源的(de)程序被移植到Windows下(xià)面來(lái),但是Linux下(xià)面開源的(de)程序增加的(de)更多(duō)了(le)。

 

以前在Windows下(xià)面寫應用(yòng)程序,需要用(yòng)到MFC,WINSOCK,ODBC,FILE IO等,可(kě)以找資料的(de)地方主要是微軟官方的(de)文檔MSDN,也(yě)隻有MSDN才是最全的(de)地方,下(xià)來(lái)是第三方網站 vckbase,CSDN,codeproject 這(zhè)幾個(gè)網站。但是從這(zhè)些網站找到的(de)代碼,都是針對(duì)一個(gè)特定的(de)小功能,爲了(le)演示如何實現這(zhè)個(gè)小功能而寫的(de)代碼,寫代碼的(de)水(shuǐ)平參差不齊,風格各異,都是一些demo性質的(de)小東西,簡單研究看看代碼,就可(kě)以集成到自己的(de)應用(yòng)程序裏面。

 

如何構建一個(gè)完整的(de)應用(yòng)程序,架構良好的(de)應用(yòng)程序,大(dà)學裏面不會教你,一切都得(de)靠自己摸索。在公司裏面做(zuò)項目獲得(de)提升,直到項目商用(yòng),後期維護修改代碼時(shí),回頭看自己寫的(de)代碼,才深刻體會到,自己當時(shí)寫的(de)代碼架構是多(duō)麽的(de)不合理(lǐ),維護修改是如此的(de)困難。

 

如果在互聯網上找不到自己需要的(de)資料,就隻能靠自己想一些實現的(de)方法,雖然功能完成了(le),可(kě)能完成的(de)時(shí)候還(hái)很有成就感,但是等那天你突然發現有人(rén)實現這(zhè)個(gè)功能,并且用(yòng)了(le)一個(gè)巧妙的(de)方法,這(zhè)時(shí)你才突然恍悟,我當時(shí)爲何就想不到這(zhè)麽實現呢(ne)?

 

在Windows下(xià)面開發,不太容易找到可(kě)以參考的(de)類似你要完成功能的(de)開源項目。一切都得(de)靠自己。但是在Linux下(xià)面就不一樣了(le),當你要開發一個(gè)新項目時(shí),可(kě)以想想有沒有什(shén)麽開源項目也(yě)完成了(le)類似的(de)功能,可(kě)以下(xià)載到源代碼來(lái)做(zuò)一個(gè)參考,對(duì)其中的(de)算(suàn)法、架構設計等做(zuò)一個(gè)詳細的(de)了(le)解,然後自己開發的(de)時(shí)候就會比較得(de)心應手了(le),可(kě)以避免别人(rén)犯過的(de)錯誤,少走很多(duō)彎路。

 

第二:要學習(xí)的(de)知識量不一樣

 

學習(xí)window下(xià)的(de)開發,你需要學習(xí)很多(duō)的(de)Windows API。截止到2009年9月(yuè),Windows總API數量爲2258個(gè),并且Windows API 的(de)參數多(duō),參數類型複雜(zá),要記住這(zhè)麽多(duō)東西不是一件容易的(de)事情,至少也(yě)和(hé)學習(xí)一門外語一樣,大(dà)學英語四級要求掌握的(de)總詞彙量達到4500個(gè)單詞。可(kě)想而知,學會這(zhè)麽多(duō)的(de)API用(yòng)法,有多(duō)難了(le)吧。

 

那麽學習(xí)Linux下(xià)的(de)開發,要掌握多(duō)少API呢(ne)?Linux下(xià)的(de)内核API,全部算(suàn)下(xià)來(lái)也(yě)才335,但是這(zhè)些内核的(de)API隻有編寫驅動的(de)時(shí)候才能用(yòng)到,開發應用(yòng)程序基本用(yòng)不到内核的(de)API,開發應用(yòng)程序的(de)API基本都是C的(de)API,而Linux所有的(de)C的(de)API個(gè)數是279個(gè),也(yě)就是說你隻需要掌握不到300個(gè)的(de)API,就可(kě)以順利地在Linux下(xià)面開發應用(yòng)程序了(le),相比學習(xí)Windows下(xià)面的(de)那一堆API來(lái)說,你是不是可(kě)以省下(xià)很多(duō)時(shí)間來(lái)學習(xí)其他(tā)知識呢(ne)?

 

下(xià)面我就舉個(gè)簡單的(de)例子:

CreateFile ReadFile OpenFile WriteFile DeleteFile ReadFileEx WriteFileEx CloseHandle

 

上面這(zhè)些API是Windows下(xià)面對(duì)文件操作的(de)API,總共是8個(gè),看看CreateFile的(de)參數吧,

 

HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in HANDLE hTemplateFile );

 

這(zhè)些參數的(de)意義和(hé)類型,請問你需要花多(duō)少時(shí)間來(lái)掌握呢(ne)?

 

我們再看看Linux下(xià)面對(duì)文件操作的(de)C的(de)API有幾個(gè),

 

fopen fwrite fread fclose

 

共四個(gè),我們再看看參數吧,

 

FILE *fopen( const char *filename, const char *mode );

 

兩個(gè)參數,請問你需要花多(duō)少時(shí)間掌握呢(ne)?可(kě)能有的(de)人(rén)會提出意見,說上面C的(de)API也(yě)能在Windows下(xià)面運行啊。

 

沒錯,是能在Windows下(xià)面運行,但是你就掌握這(zhè)跨平台的(de)C的(de)API夠嗎?難道所有在Windows下(xià)面開發的(de)人(rén)都喜歡用(yòng)C的(de)API,不會用(yòng)Windows本身的(de)API嗎?你不需要學習(xí)Windows下(xià)面的(de)API嗎?你的(de)同事使用(yòng)了(le)CreateFile這(zhè)個(gè)函數,你不需要搞懂(dǒng)它嗎?你不需要看同事的(de)代碼嗎?你不需要去維護别人(rén)寫過的(de)代碼嗎?

 

如果你還(hái)是這(zhè)麽想,那我還(hái)可(kě)以再舉其他(tā)例子!就拿創建線程的(de)例子吧,下(xià)面是2個(gè)在Windows下(xià)面創建線程的(de)例子,第一個(gè)是創建安全工作線程,第二個(gè)是創建界面線程,還(hái)有一個(gè)函數我沒有放下(xià)面,是創建不安全的(de)工作線程的(de),具體的(de)原理(lǐ)大(dà)家可(kě)以參考《win32多(duō)線程程序設計》,作者:(美(měi))Jim Beveridge & Robert Wiener 著,侯捷 譯 這(zhè)本書(shū)。  

 

//線程安全的(de)工作線程函數 
uintptr_t   _beginthreadex(    
void *security,    unsigned stack_size,    unsigned ( *start_address )( void * ),    void *arglist,    unsigned initflag,    unsigned *thrdaddr  );  



//界面線程函數 
HANDLE WINAPI CreateThread(   __in          LPSECURITY_ATTRIBUTES lpThreadAttributes,   __in          SIZE_T dwStackSize,   __in          LPTHREAD_START_ROUTINE lpStartAddress,   __in          LPVOID lpParameter,   __in          DWORD dwCreationFlags,   __out        LPDWORD lpThreadId );

 

做(zuò)Windows下(xià)面的(de)開發,上面兩個(gè)創建線程的(de)函數我們都必須掌握。當然了(le), 你也(yě)可(kě)以隻需要知道 _beginthreadex 來(lái)在Windows下(xià)面通(tōng)吃(chī),但是當看到别人(rén)的(de)代碼使用(yòng)CreateThread的(de)時(shí)候,你可(kě)不要不習(xí)慣,MFC裏面很多(duō)人(rén)都用(yòng)CreateThread。掌握這(zhè)麽多(duō)的(de)API累吧?就和(hé)你上學的(de)時(shí)候背單詞一樣累。

 

下(xià)面我再列一下(xià)Linux下(xià)面創建線程的(de)函數,

 

int pthread_create( pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*),  void *restrict arg);

 

看到了(le)吧,你隻需要知道這(zhè)個(gè)就可(kě)以了(le)。

 

C的(de)API絕大(dà)部分(fēn)都可(kě)以在Windows下(xià)面運行,在Windows下(xià)面學習(xí)開發, 你不但要懂(dǒng)得(de)C的(de)API,你還(hái)需要多(duō)花時(shí)間來(lái)學習(xí)Windows系統本身的(de)API, 你可(kě)能要說,這(zhè)麽說應該是Windows下(xià)面學得(de)多(duō)啊,我要說的(de)是你掌握的(de)API是很多(duō),但是對(duì)于一個(gè)軟件來(lái)說,最最重要的(de)是系統架構、數據結構,架構設計得(de)好,對(duì)後期的(de)代碼維護、功能修改都很關鍵,這(zhè)也(yě)就是新手寫的(de)代碼到最後連他(tā)自己本人(rén)都很難維護的(de)原因,更别說讓别人(rén)來(lái)維護了(le)。

 

API相當于基本功,系統架構、數據結構是内功,基本功練得(de)越快(kuài),我們就越有更多(duō)的(de)時(shí)間來(lái)練習(xí)内功。練習(xí)内功,我們要多(duō)向高(gāo)手學習(xí)。

 

在學習(xí)Windows下(xià)面開發應用(yòng)的(de)道路上,我們需要掌握更多(duō)的(de)API,學習(xí)後, 讓我們的(de)路越走越窄,沒有特别豐富的(de)開源代碼可(kě)以參考,水(shuǐ)平提高(gāo)的(de)速度很慢(màn)。

 

可(kě)喜的(de)是,現在很多(duō)開源的(de)項目被很多(duō)人(rén)移植到了(le)Windows下(xià)面,也(yě)有很多(duō)的(de)開源項目是跨平台的(de),常用(yòng)的(de)是wxWidget界面庫,用(yòng)法類似MFC,還(hái)有qt這(zhè)個(gè)界面庫,也(yě)很強大(dà),還(hái)有開源的(de)3D引擎OGRE,架構非常好,很值得(de)學習(xí)其架構模式。但是Linux下(xià)面的(de)開源庫要遠(yuǎn)遠(yuǎn)比Windows下(xià)面的(de)開源庫豐富得(de)多(duō),我們可(kě)以方便地從高(gāo)手的(de)代碼裏面學習(xí)數據結構,學習(xí)設計模式,學習(xí)編程技巧,這(zhè)也(yě)就是Linux下(xià)面的(de)程序員(yuán),可(kě)能會比Windows下(xià)面的(de)程序員(yuán)水(shuǐ)平更高(gāo)的(de)原因,畢竟見多(duō)識廣嘛,熟讀唐詩三百首,不會作詩也(yě)會吟啊!

本文轉載自:https://blog.csdn.net/langeldep/article/details/7069874