这是一封发到邮箱里面的邮件,感觉有点代表性,这里做个统一回答,一家之言哈,欢迎拍砖。
原文如下:
我从csdn学习大本营得到您的信息。不好意思打搅您。
我现在用c++在linux下开发大型应用程序。我想请教是否值得深入学习linux kernel。
我没有特别多的时间。另外我有多年Windows下开发应用程序的经验。
我的回答:
呵呵,我感觉这还是一个学习方向的问题。
Linux这几年,发展越来越好了,至少在很多应用服务器市场,Linux已经取代Windows成为第一选择,另外,在嵌入式环境,Linux也是逐渐成为主流。这导致很多原本是Windows的程序员,由于工作需要,逐渐走向Linux开发,这中间当然涉及到一个学习的问题。我本人也算其中一份子吧。
我本来一直做Windows开发,在这之前,在DOS下用过gcc开发,还翻译了djgpp的库函数手册,也算有点基础。不过,在07年公司安排我在Linux下正式开发商用服务器的时候,我心里还是很打鼓的。因为也面临着一个学习的问题。
看看市场上的书籍,很乱,我当时花了一整天在汉唐书城,仔细分析Linux开发相关的书籍,我发现分几种,首先是shell编程,这个我看了有半个小时,就觉得没用,这貌似给网管员用的,我做传输服务器用不到,连带着,正则表达式,我觉得对我用处也不大。真的要做复杂条件筛选,我的习惯是写个词法分析程序,自己来分析,也花不了多少时间,所以,我一直就没学正则表达式,呵呵。
然后是C和C++编程相关,我仔细看了,发现一说到开发,就讲到Linux kernel,这部分显然是操作系统的知识,我仔细想了想,发现自己的问题并没有得到解决。就算我知道了kernel怎么工作,里面有什么开发技巧,对我的工作并没有什么帮助。
我当时做的是分布式数据库的传输服务器部分,这部分讲究多线程,高效能,但还是局限在应用层,并没有多少涉及到kernel的东东。我觉得用处不大。
反而我觉得我有必要对socket编程重新补一补了。经过挑选,我给自己选了一本《UNIX网络编程》的第1卷网络通信篇,第2卷是进程间通讯,我觉得我的程序用多线程跑已经很好了,线程本身就是共享内存的,无需考虑太多异步通讯,而且,我的习惯,进程间通讯,一般直接使用socket,这个放之四海皆真理,而且,好处是我的进程可以跨机器随意部署,只要我提供IP地址,进程间就可以互相通信,协同工作。所以,我只买了第1卷,就是专门讲socket的,这是好书,我现在没事还要拿出来看一看。
另外,我又给自己挑了一本《Unix编程艺术》,这本也是好书,我以前就发现,Dos程序员有Dos程序员的习惯,Windows的有Windows的习惯,这些方言,习惯,教科书是没有的,必须找有经验的程序员问,而这本书恰好就是专门讲这些问题的。比如DOS时代,硬盘通常很小,用户分盘又很乱,我们要是想向磁盘存个临时文件,最好找C盘,连D盘都是很多计算机没有的。而Windows下系统提供了服务,可以通过api查询系统临时文件目录,就好多了,而Linux下呢,是约定俗成,大家都用/var来做临时目录,这就是风俗。
嗯,这本书我看了以后,遵守了一半,呵呵,也没全遵守,它强调程序都是过滤器,从信息流中过滤自己有用的信息,加以处理,但是,不准破坏信息流,并且强调信息流无缝流转到下家,这个我很同意,这也是我这几年逐渐领悟到的一个程序设计原则。不过,它强调搭积木我就不太同意了,Unix的程序员,有个坏习惯,对管道很滥用,这就造成了很多程序都是小程序,通过管道勾搭到一起,完成一个强大的功能,这个呢,见仁见智,在某些场合合用,但我的开发领域,我强调强大的系统分析能力,一体化的系统设计思考,强调从系统设计阶段就杜绝很多潜在的逻辑bug,简单说,我对系统各个模块之间的和谐性看得很重,因此,这条我就没有遵守。
嗯,还有就是它强调简洁开发,我呢,也只同意一半,把程序写简洁,每个函数,每个类,都很简单,减少bug,这个我是同意的,不过,简介到变量名函数名都净是缩写,人都看不懂,就太离谱了。

呵呵,我的习惯就这样,别人的东西好,对我有用,我就用,我觉得有异议,并且认为自己的理由更站得住脚,我就坚持自己的。并且,一切从实践中看,计算机是最公平的,乱写程序,就算是大师也照挂,小心翼翼地写程序,即使是刚入行的小弟,也能写出很漂亮的程序。

就这样,我借着这两本书慢慢看,然后,大多数习惯还是Windows的,到现在我开发,都是VC下编辑程序,然后写个makefile,ftp到虚拟机去编译执行,也走到今天了。
后来发现,我没有学习shell,我没有学习kernel,我没有学习很多教科书上规定必须学习的东东,我的程序居然也完成了,我们的工程在去年,9轮测试,只发现51个bug,属于C和C++这边的bug,只有7个,这就是我坚持我自己无错化程序设计方法的威力。
当然,这中间也学了一点很重要的东东,Windows和Linux,在锁、线程、socket访问这几个点上差别很大,毕竟是两种系统,库都不一样,我这里着重做了一些学习和开发,设计了一套跨平台工程库,然后就解决了问题。
至于多任务开发,这方面本来就是我的强项,我自己的内存池、线程池和任务池,再配合跨平台库,基本上就无缝转换了,呵呵,又有多大的问题?
后来还有个后话,某一天我自己买了块arm,装了嵌入式Linux操作系统,把我的程序放过去,就改了一点,把线程池300条线程预备限额改为30条,马上就可以运行了,顺利得出乎我的意料。
所以,根据我的经验,其实Windows程序员转Linux没多难的。把住我上面说的几点,坚持自己正确的方法,尊重对方的方言习惯,跨平台开发,其实很easy。
嗯,我的新书《0 Bug -- C/C++商用工程之道》,其实主要就是讲解我的这些理解的,里面的内容包括商用系统开发思维,无错化程序设计方法,跨平台工程库,内存池,锁论,线程池,任务池等,尤其是对于时间片的理解,对于多线程的并行程序开发,我分享了很多自己的实战经验,你的问题,在我的书里基本上都是现成的答案。
这本书由电子工业出版社出版,预计11月份面世,等书出来,建议买本来看看。不贵的,我考虑到大家经济压力别太大,已经让出版社尽量压低成本,不要把书做得太贵。

转载于:https://blog.51cto.com/tonyxiaohome/204692

Windows程序员如何转向Linux开发应用?相关推荐

  1. [Linux] PHP程序员玩转Linux系列-Linux和Windows安装nginx

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  2. Windows程序员初学Linux内核(附Linux内核各版本历史纪年表)

    我是荔园微风,作为一名在IT界整整25年的老兵,最近受邀给年轻人讲了一场Windows内核和Linux内核相关的讲座.大家听得非常认真.下面我把其中一些PPT放上来和大家分享. Windows内核(右 ...

  3. Windows程序员进阶应该看的那些书

    Windows程序员进阶应该看的那些书 业内有一个普遍的现象,一般Windows程序员在写了3-5年的代码的时候会有一段迷茫期,因为这个时期的程序员已经掌握了常用的一些编程技巧,对某种编程语言已经比较 ...

  4. [Linux] PHP程序员玩转Linux系列-腾讯云硬盘扩容挂载

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  5. [Linux] PHP程序员玩转Linux系列-nginx初学者引导

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  6. 后端程序员必备的 Linux 基础知识

    后端程序员必备的 Linux 基础知识 原文来自github stars>63k的项目JavaGuide,欢迎小伙伴去支持原作者 一 从认识操作系统开始 1.1 操作系统简介 1.2 操作系统简 ...

  7. linux究竟有何优势?为何大多数程序员会选择linux?

    对于某站上不少编程教学视频,在前期会教大家学习使用linux,那么linux究竟有何优势呢?下面小编给大家分享几点我自己的看法. 一:windows无法比拟的安全性 1.在目前来看,linux的病毒相 ...

  8. [Linux] PHP程序员玩转Linux系列-升级PHP到PHP7

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  9. linux php 守护进程,PHP程序员玩转Linux系列 使用supervisor实现守护进程

    PHP程序员玩转Linux系列文章: 首先遇到的问题是,部署nodejs的博客程序时,我把执行nodejs的命令放到后台,使用加&和nohup命令 如:nodejs index.js & ...

最新文章

  1. jittor和pytorch 生成网络对比之clustergan
  2. LiteRouter 路由
  3. python psi计算_KL散度,PSI,IV值之间的故事
  4. python代码图片-python实现图片上添加图片
  5. Mysql——case函数
  6. Android ListView 圆角
  7. NanoHttpd源码分析
  8. c语言二进制转十进制(附完整源码)
  9. python按键_【python】python控制鼠标和键盘
  10. 一个自动上传ip到ftp服务器的bat脚本
  11. 如何卸载mysql5.6.28_如何完全删除MySQL以进行全新安装
  12. matlab开关电源仿真软件,开关电源仿真设计软件选择
  13. 运放系列:电压跟随器
  14. Matlab的fspecial函数
  15. android PIN码解锁流程
  16. 变态矿工源码、闪电鸡app等软件的应用及发展方向的个人见解
  17. Web two days
  18. 解密excel工作表打开密码
  19. Java常用设计模式(一)
  20. Jmeter察看结果树之RegExp Tester (正则表达式测试)

热门文章

  1. Linux     grep命令,正则表达式
  2. javascript 正则表达式详解
  3. 妨碍你成为CCIE的10个不良习惯
  4. 使用CA和CCA克隆账户
  5. Cookie编程入门篇
  6. ORM映射框架总结--数据操作(五)
  7. 0717PHP基础:面向对象
  8. Windows下利用TortoiseSVN搭建本地SVN服务器
  9. Javaweb学习笔记——(五)——————DOMXML目录
  10. NSIS来自己设定快捷方式的图标