Windows程序员需要学什么

经常发现有人在网上提出这样的问题,现实中也确实有不少人在经历了3-5年的Windows开发之后就开始迷失方向,每天浑浑噩噩混日子,可能是因为这个问题粒度太大,没人愿意花时间回答,希望本文可以抛砖引玉,给大家节省些时间,同时也希望园子里面的兄弟们能尽力的补充,从而使这篇文章可以帮助更多的后来人。


首先说明的是,本文提到的各种技术不分先后,没有顺序,虽然先学什么,再学什么对某些人来说可能更方便,但是这些都不是绝对的,因为每个人的情况不同。

Windows开发首先必须学习的就是操作系统的API,因为其他的一切都是构建于OS之上,所谓九层之台,起于垒土,如果你对linux的系统调用很熟悉就会发现其实他们大同小异,都是应用程序在使用系统提供的功能。

接下来是MFC,有了MFC你才真正的可以干点开发,因为MFC实在是太全了,几乎封装了所有的Windows API, 消息循环,COM实现…

到了此地,你可以开始学习调试技术了,熟悉了调试的各种技巧才可以做到事半功倍,得心应手。

接下来是组建对象模型COM,作为windows的基石,不懂COM,很难说自己精通windows编程,因为即使现在的.NET framework也是构建于COM之上,很多问题还是需要SOS到底层去调试。

当你懂得了COM的精髓,你应该开始学习ATL了,这个类库可以使你的COM开发更加得心应手。

说到ATL就不能不提到他的前辈STL,这个出自于标准C++的类库在windows上同样也得到了很好的支持,有了STL在你有一天想转linux开发也同样会用得上。

Windows 8中的WinRT现在还没有应用于实际开发,现有的技术中.NET 是非常值得学习的,因为.NET 的主旨是提高程序员的开发效率,在这个浮躁的世界,开发效率有时候能够代表一切。

从COM到.NET只有一步之遥,.NET 其实是从COM+演化而来,具体细节请参看 Don Box的《.NET 本质论》了解了这些会使你对.NET的认识上升到一个新的层面。

接下来是C# 因为这家伙是.NET的嫡系部队,除了IL,这家伙可以说和.NET 的关系最为亲近,大部分的新功能都会最先在其中加以体现。当你熟悉了C#, BCL,《CLR via C#》可以说这个时候你已经可以胜任基本的C#开发了,可以很快写出一个小工具,完成一个相关的task。

接下来是WCF和WPF,做分布式开发少不了WCF,同样华丽的界面少不了XAML,WPF。

大概罗列了一些,其实每个主题仔细探究下去都很有韵味,还有需要说的是,其实Windows上面好多的东西都和UNIX很像,比如PowerShell明显是为了像UNIX一样,给开发者提供一个更强大的shell, 如果有兴趣,触类旁通一下,也很是有趣。

还有:

LINQ改变了我们的数据操作方式,统一了数据操作模型,经常操作数据的兄弟,你值得拥有。

F#作为一种函数式编程语言也很值得研究,由于本人使用不多,在此不作评价。

另外:

作为基础的算法;

作为提升功力的设计模式,UML;

作为改善系统性能的重构;

作为大部分分布式核心的TCP/IP;

等等主题也是值得大家研究的。

最后借鲁迅的话收尾:其实地上本没有路,走的人多了也便成了路,希望大家不要把时间都浪费了,原来还有好多东西可以去钻研。

不当之处望大家批评、指正、拍砖, 并提出您的宝贵的意见和补充。


  
#1楼   2011-11-26 11:47  纯粹的郭子   
不错的文章,值得一顶啊!
看来楼主学习了不少东西!~
我走webForm开发路线,所以一直没有学习WCF和WPF,不过其他的对于走微软路线的开发人员应该学习的东西都是一样的吧!
特别市内功的锻炼尤为重要!
  
#2楼   2011-11-26 11:48  傻瓜力量大   
windows编程 Mfc 学了 还得学windows网络编程 熟悉windows下的网络编程 然后还要学 atl 跟com组件的制作 之后...要是还要学C# 基本就得累个好歹了....
  
#3楼 [ 楼主2011-11-26 11:56  SolidMango   
@ A_明~坚持
学通了一个,在上手其他的就相对容易了..
  
#4楼 [ 楼主2011-11-26 11:57  SolidMango   
@ 傻瓜力量大
可以有选择的学,每个人的情况不一样..
  
#5楼   2011-11-26 12:00  syx278250658   
为什么要走 .net 那条路... 继续windows编程或者C++很不错的啊!
  
#6楼 [ 楼主2011-11-26 12:24  SolidMango   
@ syx278250658
处理不同问题的时候只不过是多了个选择,那个方便就用哪个..
  
#7楼   2011-11-26 12:42  无色   
多学科学t和英语,技术学一两门就可以了。

技术搞多了,永远学不精,技术很多时候只是外动。

别人用vb写代码,我用c++,可我的代码没办法和他的比,因为他的全是数学算法,他那个数学水平比我高的不是一点点,没办法。
  
#8楼   2011-11-26 13:16  法克给木   
说到ATL就不能不提到他的前辈STL
如果是因为看起来相似就把这两者做比较貌似太牵强了,我没有看出两者之间有太多联系,如非要说类似的地方,好像都是用模板技术作为支撑。

对于一个大的平台:三年入门,五年精通,七年积累,十年有作为,积累最重要。
  
#9楼   2011-11-26 14:32  janehlp   
应用开发c/s选择c#开发路线,这个快。
网络开发b/s选择java开发路线,好找工作。
光语言还不行,得会使用一个相关编辑工具才可以。
c#->vs.net
java->myeclipse
根据行业需求不同,也许还要学习一些其它技能。
如:图形二三维开发,数据库等。
  
#10楼   2011-11-26 14:57  王清培   
顶一下楼主。其实方向千千万,贵在坚持。任何一本技术研究下去了对其他的技术也就触类旁通了。顶
  
#11楼 [ 楼主2011-11-26 15:18  SolidMango   
@ 无色
都是学问,少一个都不行,我也写过某些领域的算法,在谈到效率的时候,多数还是用C和C++的,这涉及到一个平衡..
  
#12楼 [ 楼主2011-11-26 15:20  SolidMango   
@ 蔡建良
很有见地..
  
#13楼 [ 楼主2011-11-26 15:23  SolidMango   
@ 南京.王清培
所谓占得一山方可望到另一山,你在一个领域的知识往往对你扩充其他领域也是很有帮助的..
  
#14楼 [ 楼主2011-11-26 15:28  SolidMango   
@ 法克给木
对,STL和ATL之间的关系也就只不过是都用了模板技术而已,但是据说微软当年开发ATL是受了STL的启发,这个我也只是听说,有待大家证实。
  
#15楼   2011-11-26 15:37  Jeffery-Zou   
学习一下,楼主很厉害了,懂这么多,To me 重要的是深度...在这方面我得下功夫了。
  
#16楼   2011-11-26 16:08  kanego   
windows开发,需要的时间太长了啊
  
#17楼   2011-11-26 16:52  ktx   
当你学完windows编程的一切角角落落,估计你就老了。。。
  
#18楼   2011-11-26 17:36  徐少侠   
对于大多数人来说,我反对这个路线:
当你懂得了COM的精髓,你应该开始学习ATL了,这个类库可以使你的COM开发更加得心应手。
说到ATL就不能不提到他的前辈STL,。。。。

如果任何人有这种想法,那么他会成为学完少林72绝技的达摩院长老。
却永远出不了藏经阁。
应该会和照顾韦小宝的那个武痴高僧一个德行。

并且很多技术在缺乏场景的情况下,要想学到精髓是很难的。
一定是一个事倍功半的努力。
懂得了COM的精髓?
有多少人敢于凭良心说自己有这个能力?
100个使用C\C++的程序员里会有10个么?
因此是不是就是说剩下90个不应该开始学习ATL?

适合大多数人的学习路线是:
学以致用,因用而学
所以楼主后面的一些推荐我还是赞同的
那就是永远拥抱主流技术,而不是所谓的经典技术

学习的真正目的是:
学其神而忘其形

当你能把COM的精髓使用到C#代码的架构设计的时候
你才算真正懂得什么是COM
此时,你会把你曾经的所有各种方面的经验,在未来不可知的技术领域发扬光大。

而如果因为精通了COM但只会按照best practice去使用COM。
那只是学会了“术”而没有学会“道”

那么,未来的路就是很漫长的
COM,ATL,STL,再往下还有汇编,甚至是CPU微代码
.NET,WPF,WCF,WFF
同步处理框架,验证框架...
.NET类库及其官方扩展已经足够写N本砖头了
在加上系统部署,服务器家族的配置和整合应用

总之,哥不想老死在达摩院里

如果说学IT技术如同学武功,九阳神功才是大家最应该去追求的,用经验去快速获取经验的能力才是真正的能力。

江湖上应该有哥的传说
  
#19楼   2011-11-26 18:04  _小基   
想想,自己真的不太适合程序开发??
  
#20楼 [ 楼主2011-11-26 18:12  SolidMango   
@ jeffery_zou
每个人的情况不一样,有选择的学习就够了..
  
#21楼 [ 楼主2011-11-26 18:13  SolidMango   
@ kanego
选择对自己最重要的来学习..
  
#22楼 [ 楼主2011-11-26 18:15  SolidMango   
@ ktx
是啊,呵呵,而且微软一直在变,推陈出新啊..
  
#23楼 [ 楼主2011-11-26 18:17  SolidMango   
@ _小基
慢慢来,技术这东西和知识不一样,你可能不会写高效率算法,因为需要复杂的数学证明,但是技术这东西,只要努力,没什么难度..
  
#24楼   2011-11-26 18:18  _小基   
呵呵,感谢,我会的
  
#25楼 [ 楼主2011-11-26 18:23  SolidMango   
@ 徐少侠
学以致用,我顶你,其实兄弟我也是学以致用,只不过项目中的应用场景相对苛刻,我也就一步步跟进了达摩院,呵呵,解决问题,使项目达标才是我们的终极目标..
  
#26楼   2011-11-26 20:51  AlanLau2011   
Such a long road!
  
#27楼   2011-11-26 22:07  work hard work smart   
学习了...
  
#28楼   2011-11-26 22:37  悠然自得   
我学的还是太少了。此文是学习什么很好的参考,谢了。。
  
#29楼   2011-11-26 22:38  Meta.Grfx   
MFC过时了,COM如果你真的研究过我相信你就不会早早把它说出来,因为COM的精深犹如metaprogramming,随随便便说会玩的不是智商260就是懂了ABC就说自己英语精通的。
WCF和WPF技术点面向受众不同,做WPF可能一辈子也不需要用到WCF,反之亦然。当然在中国这种老板找人恨不得你是奥特曼的条件上,一切“奇迹”都有可能发生。
我没有任何恶意也不针对博主,只是想说,全文只是把很少数的一些基于windows platform的技术罗列而已。
我先发表下我的看法,作为一个windows程序员,你有追求的前提下,理解OS工作方式,看看发布的学术代码,看看文件系统,EXE怎么执行,很基础的windows技术,这些才是最重要的,知识需要整理,一味的去最新潮技术,把流行技术挂在嘴边,看起来很牛逼,对自己内功没有什么太大帮助。
  
#30楼   2011-11-26 22:39  Clingingboy   
均接触过,继续深入
  
#31楼   2011-11-27 00:26  诺贝尔   
学无止尽。
初学者应该学好算法,数据结构,语言知识,数学知识等基础,因为你不知道将来工作是面向什么方面,所以你要学习将来能派上用场的基础知识。

如果你是要开发应用程序,偏重数据管理的,就要学好SQL语言,偏重算法的就要学好相关行业的算法。

如果你是在windows下面开发应用程序,而且要求性能高,通用性高的,学c++是比较有意义的,如果是商务方面的,辅助性工具的,学c#等会比较合适。

如果你学网站开发,那么html,xml,css,javascript都是必须要学习的。然后还要学习美工知识,和作图软件。

如果你是做企业开发,c# + aps.net还是不错的。

如果是一般的游戏开发,c++是必要的。

如果是嵌入式,c语言是很必要的。

如果你要用面向对象,那么c++,c#是一个很好的基础,设计模式,敏捷开发之类的是很好的扩展。

如果是游戏开发,算法和数学是很重要的。

总结:
1。训练编程基础是永恒的主题
2。相关行业的背景知识,基础知识,和相关的辅助工具
3。特定情况下需要的附加成本,比如交流的技巧,团队开发的知识,项目管理的知识,人际关系等
4。不停更新换代的编程框架
5。新锐的编程视点,新奇的模式等
  
#32楼   2011-11-27 00:27  abc11   
@ 蔡建良
这个观点我不认同,说的啥跟啥呀?
  
#33楼   2011-11-27 00:29  abc11   
@ iGrfx
赞同你的观点。。。
  
#34楼   2011-11-27 08:58  Jeffrey C. Hill   
每门技术都有自己的缺点,所以专于一门技术的同时,如果我们多少懂点其它的,那日后在使用的过程中可以互相借鉴,就更好了。
  
#35楼   2011-11-27 09:29  gaochuan.joey   
赞赞赞
  
#36楼 [ 楼主2011-11-27 09:45  SolidMango   
@ iGrfx
COM最主要的进步实际上是二进制级别的接口隔离,也就是Stanley B.Lippman所说的二进制防火墙,也正是因为其元数据不完备,而且不一致,所以才有了后来的COM+和.NET, 不懂可不要乱说啊。
我写这篇文章的主旨是为让后来人少走些弯路,知道都有些什么东西,学技术的人最忌讳的就是说这个过时,那个过时,应用场景不同而已。你如果有心可以把我遗漏的地方补充出来,也为后来人做点什么,口舌之争没什么意思,期待你的补充。
  
#37楼 [ 楼主2011-11-27 09:46  SolidMango   
@ 诺贝尔
高屋建瓴..
  
#38楼 [ 楼主2011-11-27 09:47  SolidMango   
@ Jeffery C. Hill
有见地..
  
#39楼 [ 楼主2011-11-27 09:53  SolidMango   
@ iGrfx
没人说WCF和WPF必须同时学习,开篇已经说过每个人的情况不同,我把他们放在一起,只不过是因为他们是差不多同时加入.NET 中的。
  
#40楼   2011-11-27 10:39  toEverybody   
楼主好象是在对Windows上开发知识的列举...
NET与本机C++开发一点关系也没有,NET只不是过建立在Com与C++基础上的一个产品罢了,学了C++和Com或MFC和完全没有必须去学什么NET...要做网站类的建 议用成熟的技术如Java,pHP......
  
#41楼 [ 楼主2011-11-27 10:48  SolidMango   
@ toEverybody
恩,可以有选择的学,但是看你想理解到什么程度了,学以致用吧,有没有必要就看个人兴趣和项目需求了。
  
#42楼   2011-11-29 17:24  quarryman   
谢谢博主分享自己的心得。我想要说君子有所为有所不为,学这么东西在我看来是不可行的,博主列举的学习路径之间未必有依赖关系,没有绝对的先学后学。不过还要谢谢博主至少让大家知道了微软技术发展的脉络。
  
#43楼   2013-01-03 00:29  LEX123   
学习了,但估计上面的那些学精也累死了
  
#44楼   2015-10-07 22:52  kimolate   
刚入门,看看起码有了点方向感。。。。。。。。。。



转自:http://www.cnblogs.com/pugang/archive/2011/11/26/2264107.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值