如果一个程序员从来没有在Linux或Unix下开发过程序,而是一直在Windows下开发程序,并且工作了10年,大部分时间和在Linux下是一样的Linux和Unix开发了10年的程序员水平会相差很大。本文无意贬低在Windows下开发的人。做Windows开发的人看完可能会觉得不爽。我不是那个意思,我只是说说我自己的感受。我最初是在Windows下开始学习编程的。我学了VB,然后转学了VC++。那时候用的是VC6.0。在Windows下开发了5年后,转入Linux下开发,开始在Linux下工作。在开发过程中,我也做了很多Windows下的项目。在Linux下开发比在Windows下开发真的学到了很多东西。我从开源代码中吸收了丰富的营养。我不是说我是大师。只是在Linux下学习会让你进步更快。但我需要强调的是,我这里说的是“在大多数情况下”,意思是“在同样勤奋、同样努力程度、同样基础知识、同样工作年限、同样申请的情况下”development”,如有错误,请在下方评论。您可能想知道,为什么会发生这种情况?慢慢听我说!***:闭源与开源Windows下的程序基本上都是闭源代码,尤其是10年前的Windows下,你可以说没有可用的开源软件。现在的情况比以前好多了。很多Linux下的开源程序都移植到Windows上了,但是Linux下的开源程序数量增加得更多。以前在Windows下写应用程序,需要用到MFC、WINSOCK、ODBC、FILEIO等,能找到资料的地方主要是微软的官方文档MSDN,只有MSDN是最全的地方。第三方网站是vckbase、CSDN、codeproject这些网站。但是,从这些网站上查到的代码,都是针对某个特定的小功能。为演示如何实现这个小功能而编写的代码层次和风格参差不齐。都是demo性质的小东西。只需学习和查看代码,您就可以将其集成到您自己的应用程序中。如何构建一个完整的应用程序,一个结构良好的应用程序,大学里不会教你,一切都得自己摸索。公司项目得到改善。直到项目商业化,后期维护修改代码。回头看自己写的代码,深刻体会到自己当时写的代码结构是多么的不合理,维护和修改是多么的困难。如果在网上找不到自己需要的资料,就只能自己想一些实现方法了。虽然功能完成了,完成的时候你可能还是很有成就感的,但是有一天你突然发现有人实现了这个功能,而且用了一个巧妙的方法,这才恍然大悟,为什么不呢?我当时没有想到这个吗?在Windows下开发,能找到可以借鉴的开源项目并不容易。一切都取决于你。但是在linux下就不一样了。当你要开发一个新的项目时,可以想想有没有开源的项目已经完成了类似的功能。大家可以下载源码作为参考,把算法和架构设计好,等到自己有了详细的了解之后,自己开发的时候会更得心应手。可以避免别人犯的错误,少走很多弯路。第二:学习的知识量不同。学习window下的开发,需要学习大量的WindowsAPI。截至2009年9月,WindowsAPI总数为2258个,WindowsAPI参数众多,参数类型复杂。记住这么多东西不是一件容易的事,至少和学一门外语是一样的。大学英语四级要求总词汇量为4500个单词。可以想象学习这么多API的用法是多么的困难。那么学习Linux需要掌握多少API呢?Linux下的内核API只有335个,但是这些内核API只能在写驱动的时候用到,应用的开发基本不用内核API。应用程序的API基本都是CAPI,Linux下所有CAPI的数量是279个,也就是说你只需要掌握不到300个API就可以顺利的在Linux下开发应用程序。比起在Windows下学习那一堆API,能不能省下很多时间去学习其他知识呢?我举一个简单的例子:CreateFileReadFileOpenFileWriteFileDeleteFileReadFileExWriteFileExCloseHandle以上API都是Windows下文件操作的API。一共有8个,看CreateFile的参数,HANDLEWINAPICreateFile(__inLPCTSTRlpFileName,__inDWORDdwDesiredAccess,__inDWORDdwShareMode,__inLPSECURITY_ATTRIBUTESlpSecurityAttributes,__inDWORDdwCreationDisposition,__inDWORDdwFlagsAndAttributes,__inHANDLEhTemplateFile);在Linux下有几个用于文件操作的CAPI。有四个fopenfwritefreadfclose。让我们看一下参数。FILE*fopen(constchar*文件名,constchar*模式);两个参数,你需要多少时间来掌握。可能会有人发表评论,说上面的CAPI在Windows下也能运行?是的,它可以在Windows下运行,但是你掌握跨平台的CAPI就够了吗?都是在Windows下吗?开发者喜欢用C的API,不知道怎么用Windows本身的API?Windows下的API不用学吗?你同事用的是CreateFile这个函数,你不需要了解他吗?你不需要阅读同事的代码?别人写的代码你不需要维护吗?如果你还这么认为,那我再举个例子吧!让我们以创建线程为例。这里有2个Windows下创建的线程比如第一个是创建safeworkerthread,第二个是创建interfacethread,还有一个功能我没放下,就是创建unsafeworkerthread.//线程安全的工作线程函数uintptr_t_beginthreadex(void*security,unsignedstack_size,unsigned(*start_address)(void*),void*arglist,unsignedinitflag,unsigned*thrdaddr);//界面线程函数HANDLEWINAPICreateThread(__inLPSECURITY_ATTRIBUTESlpThreadAttributes,__inSIZE_TdwStackSize,__inLPTHREAD_START_ROUTINElpStartAddress,__inLPVOIDlpParameter,__inDWORDdwCreationFlags,__outLPDWORDlpThreadId);在Windows下进行开发,必须掌握以上两个创建线程的函数。当然你也可以在Windows下只需要知道_beginthreadex就可以搞定,但是当你看到别人的代码使用CreateThread的时候,你应该不会不习惯吧。MFC中很多人都用CreateThread。您是否厌倦了掌握这么多API?跟上学的时候背单词一样累。下面我将列出Linux下创建线程的函数intpthread_create(pthread_t*restrictthread,constpthread_attr_t*restrictattr,void*(*start_routine)(void*),void*restrictarg);看,你只需要知道这个。C的大部分API都可以在Windows下运行。在Windows下学习和开发,不仅需要了解C的API,还需要花更多的时间去学习Windows系统本身的API。你可能会说,所以应该是你在Windows下学到了很多东西。我想说的是,你有很多API,但是对于一个软件来说,最重要的还是系统架构,数据结构,好的架构设计。对于后期的代码维护和功能修改都是非常重要的,这也是为什么一个新手写的代码连自己都很难维护的原因,更不用说让别人维护了。API相当于基本功,系统架构、数据结构都是内功。我们练基本功的速度越快,练内功的时间就越多。修炼内功,要多向高手学习。在学习Windows下开发应用的道路上,我们需要掌握更多的API。学习之后,我们的路越走越窄。没有特别丰富的开源代码可以参考,水平提升很慢。好消息是,现在很多开源项目已经被很多人移植到Linux上了,也有很多开源项目是跨平台的。最常用的是wxWidget界面库,用法和MFC类似。还有qt的界面库,也是很强大的。有一个开源的3D引擎OGRE,架构非常好,值得学习它的架构模式。但是Linux下的开源库比Windows下的开源库要丰富的多。我们可以很容易地从专家的代码中学习数据结构、设计模式和编程技巧。这就是Linux下的程序员。可能是因为Windows下的程序员水平更高吧。毕竟我见多识广。唐诗三百首我熟,不会作诗也会唱!
