乐趣区

关于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 服务器高级架构师

退出移动版