如何成为一名优秀的程序员?
一位仁兄说的“程序员写的程序不是‘算法+语法’,而是要能够满足用户需求的工具”我非常
赞同。要想达到用户需求就必须从各个方面来考虑,如业务、人机交互 、效率等方面,而不只是一
个语言(语法)的问题,语言(语法)只是工具,只知语法不知其他那就真是编程机器了!编程机
器在印度高中生经过几个月培训,按照严谨的软件工程方法,加上较高的管理,就可以胜任了!大
家相信吗,我是相信的!
谈到这里我就不禁说到了国内教育界最近在探讨的问题“计算机科系的毕业生特别是本科大专
生到底出来干啥、如何适应社会要求”。大家也看到了很多计科系大学生说“精通 N 种语言,熟悉
N 种工具”,不知道学校里的其他知识到那里去了,甘愿做编程机器,浪费了人民的纳税,干高中
生能干的事,比较可惜吧!在国内现在就是这样了。国内的软件开发业到底是需要哪些人?如果仅
仅是编码机器,那我估计中国硅谷还是做梦去吧!
社会似乎也需要编码机器,翻翻招聘广告,做应用开发的都要求精通某某语言,熟悉某某工具,
很少需要懂管理懂软件工程的人。以我个人一点偏激的想法,民族软件产业要腾飞,更需要的是能
管理使用编码机器的人,即管理人员。国内软件产业编码机器已经很多了。希望不要惹怒了那些
编程高手!System Develop 与 Application Develop 在国内到底哪个能养活你,能赚钱?诸位仁
兄想必也知道,况且俺也没发现几家水平高的公司招这方面的人。毕竟 OS,DB MS,COMPILER 都被
国外做了;另外也别跟我谈 LINUX,毕竟还是少数烧钱的人做的事情,我先喂饱肚皮再说。我手下
的很多搞4GL语言的程序员都想转行学VC等所谓的更低级的语言,我总是说“在 XX 城市,先用 4GL
工具生存,以后再学习 VC 吧!” 。说的简单一点:先解决肚子问题。
如何判断自己是否是编程机器?
1、面对需求不考虑用户,只是考虑用哪些程序技术展示自己的语言语法技巧。
2、学习了 N 种语言。
3、从来不学习或实践软件工程。
4、语法语言水平在众人中遥遥领先、特别是一些稀奇古怪的语法。凭着兴趣和创造力去干,却
重复繁琐的劳动,做着没有意义——唯一意义是赚钱,而且真是出了半斤力,拿不足八两。终日劳
累,却不能学自己想学的。最终结果是跟不上社会科技的发展 ,人已衰老。悲哀!!!
开发软件的关键是要有想法,一个好的想法比什么都重要。尤其是有关网络方面的就更是如此。
实际上一个程序员最终的技术需要和实际相结合。当编程水平到达一定水平时候,语言的使用并不
是最大的障碍,对整个项目的把握、软件工程的把握、数据库的设计以及执行效果的分析等等才是
需要进一步考虑的东东!否则,为何大多数公司要求有编程经验了!这些不是程序员必须学的。但
软件工程、数据结构、离散数学、编译原理、操作系统原理等是必须要学好的,英文也要多看,
不懂计算机英语可不行。
我以前是学机械的,(后来自学了计算机),我非常了解在传统的制造业是如何的规范,设计
人员设计图纸,然后经审核,再到车间试样,再根据情况,修改图纸,如此反复几次后才能一个产
品定型。而在软件界,就没那么好了。领导会说,这个你做,那个他做,也没有经过很细的分析
(国内很多都是这样),在我们这里也没有系统分析员,每个人都是设计员,也是编程员。虽然这
样对个人来说,能学到很多东西,但不利于项目。我国的软件过程水平确实令人担忧,目前为止只
是几个人十几个人的小软件,还没有能拿得手的大型软件。
至于中专生编程问题,我认为只要入了这个行,就不会比本科生差。因为对他来说没有优越的
学历条件,那么只好埋头苦学,但这正好适应当前计算机软件迅速发展的今天。学历只能代表过去
和基础。更需要的是有能力的人,解决问题的人,实干的人。我也是个中专生。有时我确实有点自
卑,没有上过高中和大学(由于那个年代,我只知道能为父母减少一点负担就行了),所以我一直
在努力地学习(Corba,UML,Java,软件过程等),目前为止我并没有觉得我的构架能力和编码水
平比他们差(只是觉得 English 实在太差)。所以我觉的中专生并不比一般大学生差(当然有些重
点学校除外 //hehe),有时中专生有更大的压力逼迫自己去学习。学历不是重要的,关键是一个人
的素质。我们不能将目标定位在做程序员或编码员(Coder)上。光会写代码有什么用?那叫“编码
员”,在国外是属于体力劳动的,不像国内,会写程序的就叫高科技。重要的是分析问题、解决问
题和规划的能力,系统分析,系统设计及项目规划才是正途。
程序员不应依赖开发工具,程序员更应该拥有的是一种思维、一种精神、一种观念。就像
Richard.M.Stallman 一样,有自己的精神,为自由软件而奋斗。就像求伯君,为民族软件的振兴而
奋斗。这才是真正的程序员。应该说,他们更注重的不是技术,而是软件的思维,软件的灵魂!!
每个人都有自己的学习方法,也许这种方法对我来说有用,但不见得就对所有的人有用。所以,
请不要盲目的跟着别人的学习方法学习,要思考属于自己的学习方法。但以下几个原则是要遵守的:
1. 坚持,坚持,再坚持。首先要有毅力,对编程的狂热也可以在一定程序上起到帮助。我就是
这样的。起初,我学习 VC 是三天打鱼两天晒网,学习进度很慢,幸好对编程的执著,使得自己坚
持下来了。我周围有几个人,他们比我先学 VC 近半年,但现在仍然学不会;而我现在虽说不是很
厉害,但基本的应用程序是不在话下。我就是天天看书,上机实践,几乎所有的时间都泡在里面,
有时连吃饭都在想,为什么?因为我确实想啃下这块硬骨头,我不想半途而废,我觉得学习 VC
不仅仅是学到了更多的东西,最主要的是培养了我们自己一种坚持克服困难的毅力。
2. 实践,实践,再实践。当你学到了一种新的技术或知识时,多实践是巩固学习的一种最好
最有效的方法。这个实践不是照著书上的例子做一遍,而是根据自己的能力,给自己出题,然后去
完成它。只有这样,你才能发现自己的不足,同时又增加了编程经验。但要成为合格的程序员,光
会写代码是远远不够的,更重要的是思考。谋定而后动,是不变的真理。
3. 掌握编程思想。学一门语言,不能仅仅是语言,还要注重语言背后的思想方法,获得提出问
题,分析问题,解决问题的能力,不是为编程而学习。看它是如何来解决某一问题的,为什么要这
样去做,他总是要符合客观事实的,就像人说的话一样,存在某种逻辑,数据的组织,信息的传递,
靠你自己的头脑去建立,然后看该怎么样用编程语言来表达自己的想法。只要你认真实践,努力去
做,寻求乐趣,就会达到目标。
4. 耐心、细心、平常心、团队协作精神。在这个网络时代,资料到处都有,无论什么先进的技
术,只要查到资料,不会的快的学上几天慢的一两个月也能学会。现在已没有写不出的程序了,写
不出是因为你没有写完它。我以为现在的程序员不一定要多么聪明,而更需要他有完成枯燥项目的
耐心,找 BUG 的细心,对于金钱的平常心(不要为了早日拿到钱而赶进度),最后最重要是有顾
全大局,团队协作的精神。
如果你从来就没有接触过编程,那你学习 VC 的速度可能会比学过面向过程编程的人要慢一些,
因为你要去理解命令及语句的含义。但只要你努力,并且可以得到别人的帮助,在半年内你会对 VC
有一定的认识。
也不要以为学过面向过程编程就很容易学会面向对象编程。面向过程与面向对象实在是区别太
大了。就拿封装一词来说吧,当初我是左想右想才想通的。所以不要自己学过编程,就会在学习
VC 的通道上比别人轻松。学习VC是一项费时费力的艰苦学习过程。为了真正用好 VC,你不得不
先从 OOP 开始学起,也许浏览一本纯理论的书要更有意思。你将从另外的角度考察 OO 思想。
接下来学习 C++,学习 Windows API,学习 MFC,剖析 MFC,扩充 MFC,创造自己的类库(不要企
图写一个和 MFC 同重量级的类库),然后精通 Microsoft C 编译器的各种参数,研究微软 C/C++
语言编译器的进化历史(结合各种背景知识)。掌握了编程的思想,征服 VC 只是时间问题。
现在有一种现状应该让我们注意,我发现有很大一部份初学者觉得 VC 是一种语言,C++ 又是另
一种语言。有的初学者竟然还认为学 VC 为什么就没必要学 C++!我想这个问题是很多人都没有注
意到的。就是 C++ 对 VC 学习的重要性。我这有个例子,跟大家讲一下。我有个同学,他接触编程
比我要早,在我还在为 VC 中“::”号怎么标记的时候,他学习 C 已经很久了。后来,我对 VC 稍
有理解的时候,他也发觉 C 的跟不上时代的脚步了。我便提议他从 C++ 语言学起,可他认为自己
有 C 的学习功底,根本就用不着再去学习 C++。可在学习 VC 的当中,遇到的困难真是数不胜数。
最近,他还是去买了一本学习 C++ 的书,从头学习 C++。 我希望通过这个例子,能让广大的初
学者知道 C++ 对学习 VC 的重要性。
在我的理解,VC 只是一个编程工具,就如 BC、BCB、Delphi 一样,其实对于编程最根本的就
是三个方面,语言、开发包、 操作系统 API,他们三个方面应该说是相对比较独立的。
学习 VC,必须有对 C++ 深刻的理解。举例,对于虚函数,不仅要知道有这么一个东东,更要
知道它的内存镜像 。这样才能对 VC 中很多的东西举一反三,事半功倍。本人学习 VC 近 2 年,
但自觉第一年由于心情浮躁,把 VC 的书翻了一遍又一遍,却每次都只看了一点就无法再深入。直
到毕业前夕,痛定思痛,克服浮躁,认认真真的从最基本的开始学,把每一点都搞的水落石出,经
过三个月的刻苦,终于大成。直到现在,半月搞定 COM / DCOM,都托当日刻苦之福,因此劝告想学
VC 的朋友,一定要顶住开始的艰难岁月。成功属于刻苦者。
学习 VC,还要对 WINDOWS 运行机制有深刻理解,才能成为高手。这需要学习微软的技术,其
中 Windows 编程,Win32 系统(实际上 Win32 系统实现了很多我们在屏幕上能看到的东西,最起
码 NT 的内核并不大)是一定要学会的。另外,COM(深入研究它,理解对象是如何跨越进程边界的,
最终能够自如地在 EXE 中实现自己定义的接口才算到家了。不过这多少有些不太必要)、Dcom、
ActiveX、Windows DNA 等等,如果你有能力,学吧。
我不赞成滥用 ActiveX,一来我以为它的性能很成问题,真是又大又慢又不稳定(可能是我有点
偏激了吧),二来用了它您的程序今后就要被别人牵着鼻子走了。有次我用了个控件,程序都写了
大半了,它给我来个继续使用请支付 333 美元,我两个多月的工钱,烦不烦人?现在我尽可能用别
人写的源代码(我已收集各类代码3-400MB了),用起来一样方便,还能边用边学,必要时还能自已改造。
VC 是 MS 开发的,所以针对的是 Windows API,你可以不会 C++, 也可以在 VC 下用 C
写出很优秀的程序,当然如果你比较熟练 C++,并且熟悉开发包 MFC 的话,工作可能要轻松不少。
所以在我看来,学习的过程可以是这样的:
1. 先学习 C 或 C++,在 Windows 的 Console 环境下编写不太深入涉及 API 的程序;
2. 在基本上掌握了语法之后,开始接触简单的系统 API,学习 Windows 的编程原理和机制;
3. 在可以编写简单的菜单程序,可以简单地在 WM_PAINT 下操作 GDI 函数后,开始学习 MFC,
可以从 Step tourist 学起,看 MFC 的源代码,理解几个关键的宏的定义与实现,特别是
MESSAGE _MAP。在学习的过程中为了给自己增加点挑战,尽量不要使用 Resource edit,试着自己
编码实现控件的创建、消息的响应。再就是看自己的造化了,动手做一些小工具,特别是自己平常
需要的,对自己的提高也应该是很有帮助。究竟我们要的是结果!良好的分析问题高效清晰地肢解
问题的能力才是我们真正要不断学习的。
对于 VC,我有几点经验:
1. 技术为本,语言为次。
2. MFC 的单个类有用,DOC / VIEW 要小心。
3. OOP 要小心,使用不当反而造成大量的工作和糟糕的代码。
4. 如果可能,考虑选择使用 Delphi ( CBuilder+ VCL )。
5. 到了一定程度,一定要学 COM。
学习 VC++ 有相当的内容要学,而最后的深度则看个人的悟性与勤奋了。
1)掌握最新标准的C++。(2个月)
如果曾经在大学里自以为学过 C/C++,还对dynamic_cast/static_cast/template/try/catch/throw/stl/...
感到陌生,那你该 Refresh 一下新的 ANSI C++ 标准了。
——此与VC++无甚关联,G++ / BCB 均有所支持 。
2) 学习 SDK 编程。(6个月)
痛苦是暂时的,必要的,坚持就是胜利! 建议用 Lccwin32/Masm32/Tasm 编写小而精的工具软件。
《Windows Programming Guide》、《Advanced Windows Programming》
3) 研究 MFC 源代码。(6个月)
不要被一大堆的宏所蒙蔽,just track and dig into it!! 在知道 MFC 如何扩展、包装
SDK 之后,自可功力渐进,不被其 MFC 系统框架所困绕。
(《MFC Internals》)
4) 研究 OLE / COM 技术。
COM / ActiveX 技术是 MS 的核心技术,只有彻底洞察其理论精髓才可以体会现在的操作系统
的技术趋势,以不变应万变。
(《Inside Ole 2》)
***几点建议***:
1) Delphi / BCB / VB 可以很快构筑界面,但对于想真正学习、理解系统不是一个好的平台,
但如果有时间读一读 VCL 的源码,看看 Borland 是如何封装系统的,也可借鉴不少。
2) 学习 ASM 对理解 C++ 有很大益处。Soft-ICE 也是和 VC++ 结合在一起的好工具。
3) 语言本身是皮毛,算法是筋骨;无论高级语言如何发展,在理解操作系统的基础上不断提高
自我创新能力。如果精髓一旦了然于胸,选择何种开发工具都可以驾御,一见如故了。
Visual C++ 技术开发链接
Microsofts VC++ page
http://msdn.microsoft.com/VISUALC/
Microsoft 的 Visual C++ 站点,了解 Visual C++ 最新消息的最佳去处。
Visual Studio Start Page
http://msdn.microsoft.com/vstudio/
Microsoft 的 Visual Studio 站点, 了解 Visual Studio 最新消息的最佳去处。
MFC FAQ Home Page
网上最好的 MFC FAQ 收集站点, 由 Stinggray 软件公司制作,在我们的 CD 中提供他们的 EXE 本地版本。
Reliable Software
http://www.relisoft.com/index.htm
Reliable软件公司
MFC Programmer’s SourceBook
一个巨大的 MFC 源程序汇集站点, 包含内容非常全面,更新非常快,最有意思的是每一个人能对源程序发表自己的看法。 因此它也成为很多程序员开发经验的聚集地。 制作人:Zafir Anjum
MFC Programmers’ Resources
一个链接源程序站点,讨论组和使用指南的站点。
MFC Professional
http://www.visionx.com/mfcpro/
一个包含源程序,使用技巧的站点。
WorldCom MFC library Site
http://users.aol.com/chinajoe/wcmfclib.html
包含很多免费的MFC类。
Visual C++/MFC Resources
R2M的Windows开发资源。链接非常丰富。
PJ Naughters home page
PJ Naughters的个人主页。
Win32 Foundation Classes
http://ourworld.compuserve.com/homepages/Sam_Blackburn/wfc.htm
Sam Blackburn收集的一些MFC类。
Internet Wisdom - Windows Programming MFC
http://www.kudonet.com/~ixfwin/winprog_faqs/wpw_mfc_index.html
Tony Lee从新闻组上收集的MFC编程资料。
Microsoft Systems Journal
Microsoft的系统杂志, 站点包含该杂志的源程序。
Visual C++ Developers Journal
非常有名的Visual C++开发杂志,站点包含该杂志的源程序。
Visual C++ Magazines
http://msdn.microsoft.com/developer/bookmag/visualc.htm
Microsoft的Visual C++杂志。
Dr. Dobb’s Journal
Dr. Dobb 主办的杂志, 包含大量源程序。
Ask the MFC Pro (Fawcette Technical Publications)
http://www.inquiry.com/techtips/mfc_pro/
Fawcette技术出版社的 MFC FAQ 。
DevCentral Q & A
http://devcentral.iftech.com/learning/qa/
Interface科技公司的FAQ 。
MFC FAQ
Michael Pickens制作的FAQ 。
Tips for Visual C++ Developers
http://www.pinpub.com/vcd/tips.htm
Pinnacle出版社收集的Visual C++开发的技巧。
ActiveX FAQ
关于ActiveX技术的FAQ 。
The MFC Mailing List
http://www.digiday.com/mfcpro/joinmfcl.htm
Mailing Lists (Miller Freeman)
http://www.cuj.com/link/subject34.html
Mailing Lists and Newsgroups (Microsoft)
http://www.microsoft.com/workshop/essentials/mail.asp
The Official MFC-L Mailing List Archive (The MFC Professional)
http://www.visionx.com/mfcpro/mfc-l/index.htm
MFC@LISTSERV.MSN.COM (L-Soft international)
http://www.lsoft.com/scripts/wl.exe?SL1=MFC&H=LISTSERV.MSN.COM
Archives of MSVC-BEGINNERS@MAELSTROM.STJOHNS.EDU (St. John’s University)
http://maelstrom.stjohns.edu/archives/msvc-beginners.html
WINDEV-L Mailing List
mailto:windev-l-request@netcom.com
Deja News
非常有名的Deja News,包含内容非常丰富。
MSDN Newsgroup List
http://msdn.microsoft.com/developer/newsgroups/newsgroups.htm
Microsofts MSDN的Newsgroup列表。
Microsofts VC++ newsgroup
news://msnews.microsoft.com/microsoft.public.vc.language
Microsofts的Visual C++新闻组。
Microsofts MFC newsgroup
news://msnews.microsoft.com/microsoft.public.vc.mfc
Microsofts的MFC新闻组。
Public MFC newsgroup
news://msnews.microsoft.com/comp.os.ms-windows.programmer.tools.mfc
公用的MFC新闻组。