写点什么

年轻人想详细了解做了十年 Linux 跟做了十年 Windows 的程序员差距有多大吗?听我慢慢道来!

用户头像
ShenDu_Linux
关注
发布于: 2020 年 12 月 04 日
年轻人想详细了解做了十年Linux跟做了十年Windows的程序员差距有多大吗?听我慢慢道来!

前言:如果一个程序员从来没有在 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 来说, 你是不是可以省下很多时间来学习其他知识呢?


下面我就举个简单的例子:


CreateFileReadFileOpenFileWriteFileDeleteFileReadFileExWriteFileExCloseHandle
复制代码


上面这些 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 却不知道从哪开始,可以进 Q 群 1106675687 跟大家一起学习 Linux 或者点击这里


缺乏项目实战经验和想转行学编程的朋友看这里>>零基础C/C++入门到企业级项目实战


发布于: 2020 年 12 月 04 日阅读数: 55
用户头像

ShenDu_Linux

关注

还未添加个人签名 2020.11.26 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
66
2020 年 12 月 04 日 16:20
回复
没有更多了
年轻人想详细了解做了十年Linux跟做了十年Windows的程序员差距有多大吗?听我慢慢道来!