关于linux:做十年Windows跟十年linux的程序员差距有多大

如果一个程序员素来没有在linux,unix下开发过程序,始终在windows上面开发程序, 同样是工作10年, 大部分状况下与在linux,unix上面开发10年的程序员程度会差异很大。

我写这篇文章并不是想贬斥windows上面开发的人,做windows开发的人看了可能会感觉不难受,我并不是这个意思,我只是说说我本人的感触,

我最早开始学习编程也是在windows上面的, 学的是VB,起初转到VC++,过后用的是VC6.0, 做windows上面的开发5年后转入linux上面做开发的,开始在linux上面做开发的时候, 也做过很多windows上面的我的项目,在linux上面做开发的确比我在windows上面做开发多学到了很多的货色,从开源代码外面汲取了丰盛的养分,我不是说我是个高手, 只是说在linux上面学习,你会提高的更快。

不过我须要强调一下,我这里说的是 “大部分状况下”,意思就是说“在同样怠惰,同样致力水平,同样基础知识,同样工作年限,同样是做应用程序的开发” 的状况下,如果说的不对,心愿大家在上面发表认识。
可能大家会奇怪, 为何会呈现这种状况呢 ?

听我缓缓道来!

第一:闭源与开源

==========

windows上面的程序根本都是关闭源代码的,特地是10年前,在windows下能够说找不到可用的开源的软件,当初的状况比以前好多了, 很多linux上面开源的程序被移植到windows上面来,

然而linux上面开源的程序减少的更多了。
以前在windows上面写应用程序, 须要用到MFC,WINSOCK,ODBC,FILE IO等, 能够找材料的中央次要是微软官网的文档MSDN,也只有MSDN才是最全的中央,下来是第三方网站 vckbase, CSDN, codeproject 这几个网站。

然而从这些网站找到的代码,都是针对一个特定的小性能,为了演示如何实现这个小性能而写的代码,写代码的程度参差不齐,风格各异,都是一些demo性质的小东西,简略钻研看看代码就能够集成到本人的应用程序外面。

如何构建一个残缺的应用程序, 架构良好的应用程序, 大学外面不会教你, 所有都得靠本人摸索,在公司外面做我的项目取得晋升,直到我的项目商用,前期保护批改代码时, 回头看本人写的代码, 才粗浅领会到,本人过后写的代码架构是如许的不合理,

保护批改是如此的艰难。如果在互联网上找不到本人须要的材料,就只能靠本人想一些实现的办法,尽管性能实现了, 可能实现的时候还很有成就感,然而等那天你忽然发现有人实现这个性能,并且用了一个奇妙的办法,

这时你才忽然恍悟, 我过后为何就想不到这么实现呢? 在windows上面开发, 不太容易找到能够参考的相似你要实现性能的开源我的项目。所有都得靠本人。然而在linux上面就不一样了, 当你要开发一个新我的项目时,

能够想想有没有什么开源我的项目也实现了相似的性能, 能够下载到源代码来做一个参考, 对其中的算法, 架构设计等做一个具体的理解,而后本人开发的时候就会比拟得心应手了,能够防止他人犯过的谬误,少走很多弯路。

第二:要学习的常识量不一样

===============

学习window下的开发, 你须要学习很多的Windows API,截止到2009年9月,Windows总API数量为2258个, 并且Windows API 的参数多, 参数类型简单,要记住这么多货色不是一件容易的事件,

至多也和学习一门外语一样,大学英语四级要求把握的总词汇量达到4500个单词。可想而知, 学会这么多的API用法,有多难了吧。那么学习linux下, 要把握多少API呢 ? linux下的内核API,

全副算下来也才335,然而这些内核的API只有编写驱动的时候能力用到, 开发应用程序根本用不到内核的API,开发应用程序的API根本都是C的API,而 Linux所有的C的API个数是279个,

也就是说你只须要把握不到300个的API, 就能够顺利的在linux上面开发应用程序了,相比学习windows上面的那一堆API来说, 你是不是能够省下很多工夫来学习其余常识呢?

上面我就举个简略的例子:

**CreateFile
ReadFile
OpenFile
WriteFile
DeleteFile
ReadFileEx
WriteFileEx
CloseHandle**
下面这些API是windows上面对文件操作的API, 总共是8个,看看CreateFile的参数吧,
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);

这些参数的意义和类型, 请问你须要花多少工夫来把握呢 ?
咱们在看看linux上面对文件操作的C的API有几个,
fopen, fwrite, fread, fclose 共四个,咱们在看看参数吧
FILE fopen( const char filename, const char *mode ); 两个参数, 请问你须要花多少工夫把握呢。
可能有的人会提出意见,说下面C的API也能在windows上面运行啊? 没错, 是能在windows上面运行,然而你就把握这跨平台的C的API够吗? 难道所有在windows上面开发的人都喜爱用C的API, 不会用windows自身的API吗?你不须要学习windows上面的API吗? 你的共事应用了CreateFile这个函数, 你不须要搞懂他吗? 你不须要看共事的代码吗? 你不须要去保护他人写过的代码吗? 
如果你还是这么想,那我还能够再举其余例子!就拿创立线程的例子吧,上面是2个在windows上面创立线程的例子, 第一个是创立平安工作线程, 第二个是创立界面线程,还有一个函数我没有放上面, 是创立不平安的工作线程的,具体的原理大家能够参考《win32多线程程序设计》,
作者:(美)Jim Beveridge & Robert Wiener 著,侯捷 译 这本书。

//线程平安的工作线程函数 
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 );

做windows上面的开发, 下面两个创立线程的函数咱们都必须把握。当然了, 你也能够只须要晓得 _beginthreadex 来在windows上面通吃,然而当看到他人的代码应用CreateThread的时候, 你可不要不习惯,MFC外面很多人都用CreateThread。 把握这么多的API累吧 ? 就和你上学的时候背单词一样累。
上面我在列一下linux上面创立线程的函数

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

看到了吧, 你只须要晓得这个就能够了。
C的API 绝大部分都能够再windows上面运行,在windows上面学习开发, 你岂但要懂得C的API, 你还须要多花工夫来学习windows零碎自身的API, 你可能要说,

这么说应该是windows上面学得多啊, 我要说的是你把握的API是很多, 然而对于一个软件来说, 最最重要的是零碎架构,数据结构,架构设计的好, 对前期的代码保护,性能批改都很要害,

这也就是新手写的代码, 到最初连他本人自己都很难保护的起因, 更别说让他人来保护了。
API相当于基本功, 零碎架构, 数据结构是内功,基本功练的越快,咱们就越有更多的工夫来练习内功。练习内功,咱们要多向高手学习。
在学习windows 上面开发利用的路线上, 咱们须要把握更多的API, 学习后, 让咱们的路越走越窄, 没有特地丰盛的开源代码能够参考, 程度进步的速度很慢。
可喜的是, 当初很多开源的我的项目被很多人移植到了linux上面, 也有很多的开源我的项目是跨平台的, 罕用的是 wxWidget界面库, 用法相似MFC, 还有qt这个界面库,

也很弱小,还有开源的3D引擎OGRE, 架构十分好,很值得学习其架构模式。然而linux上面的开源库要远远比windows上面的开源库丰盛得多,

咱们能够不便的从高手的代码外面学习数据结构,学习设计模式,学习编程技巧,这也就是linux上面的程序员, 可能会比windows上面的程序员程度更高的起因

毕竟见多识广嘛, 熟读唐诗三百首,不会作诗也会吟啊!


如果你想转linux却不晓得从哪开始,能够进群973961276跟大家一起学习linux。学习直通车>>c/c++  linux服务器高级架构师

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理