给软件开发初学者(精)

发布时间:2018-10-03 21:18:13

给软件开发初学者

在论坛上呆久了, 发现很大一部分有关开发的帖子都是有关心怀梦想, 立志成为一个软件英 雄或者响当当的黑客人物; 或者是狂热的游戏玩家, 突然想迈入游戏开发的殿堂, 自己打造 一个完美的游戏;或者被以前 IT 行业的途无量所吸引,为了经济因素希望成为一个程 序员的,而寻求进入软件开发领域之门的求助帖子。

这些诸如你好,我想做程序员,应该怎么做? ” , “ 初学 C++,请问看什么书好 ” , “ 请高手帮 我看看这个程序 ” , “ 我想转行, 请高手指点 ”…… 的帖子占了各大软件开发论坛帖子总量的很 大一部分,而且内容是长年不变,重复来重复去 :P

自从做了 epubcn C++板块的版主,经常收到不相识网友的消息或 Email ,基本上还是问 这些问题。看到这些帖子和 Email ,不禁想起自己刚刚迈入软件开发的领域,茫茫然不知何 去何从,兴奋而又彷徨不安的过去, 这样的经历一次又一次, 在不同的地点、不同的时间仍 然在不断的重复。今天终于坐下来,写下一点文字,希望能够对彷徨的朋友们有点帮助。

确认你真的要迈入软件开发领域

软件开发是一项纯智力活动 (现在人们都意识到长时间超负荷的连续写程序并不会提高软件 生产率, 反而会对软件品质造成很大负面影响, 所以尽管很多程序员仍然长时间加班, 但这 种现象正在逐步减少并最终会消失,所以体力要求并不会比其他行业高 ,如果你不是一个 智力高于平均水平的人, 说实话, 软件开发并不适合你, 你基本不可能在软件开发领域取得 很高的成就和地位,而且不久就会因为年龄的增长而被淘汰。

如果你以那些开发出共享软件的软件英雄和著名黑客为榜样, 立志也要成为他们的一员, 武侠小说中的大侠一样仗剑江湖。 我要先给你泼上大大一盆冷水, 把你从幻想拉到现实中来。 首先, 现在的软件其复杂度和规模都远远超过以前, 想一个人独力完成一个规模稍大的软件, 基本没有可能(虽然还是有些特例, but trust me,那些仅仅是特例,请不要把自己想像成 独一无二的超人、幸运儿 ;其次,无论是软件英雄还是仗剑江湖的顶尖黑客,他们的软件 开发功底和智力都远远超过软件行业从业者的平均水平, 没有多年的积累和坚韧超常人的毅 ,是不可能,换句话说,想成为他们的一员,可以,但请首先成为一个合格的软件开发人 员。

如果你是因为传说中程序员的所谓高薪 ” ,对自己现在从事的工作不满意,而萌生转行的念 ,我劝你还是再慎重考虑一下。程序员的待遇一般来说,是要比平均水平高一些,但远远 谈不上高薪, 而且以现在程序员的工作量来算, 其实同样的付出, 程序员所得到的能和平均 水平看齐就不错了, 程序员的竞争和淘汰也是异常残酷的。 技术的更新速度更是其他行业所 罕见, 每个程序员都要不停的跑步跟上, 不使自己落伍, 所以在这个层面上来说, 没有谁可 以停下来休息, 唯一能够积累下来的就是你的经验, 但经验中能够为你的竞争力增添筹码的 并不多。

说了这么多, 并不是我故意贬低, 而是希望告诉你我所知道的软件开发行业的真实情况, 于此请再慎重考虑你是不是真的要迈入软件开发领域。

检验一下你是否适合当个程序员

在我看来,要做一个合格的程序员,你需要具备下面几个条件:

1. 强烈的好奇心和求知欲

2. 追求完美的精神

3. 良好的逻辑分析能力

其他方面的条件几乎所有类似的帖子都有提

:如果你不是准备单打独斗, 那么团队合作能力必不可少; 英语我就懒得说了, 没有基本 的阅读英文资料的能力, 我劝你还是打消做个程序员的想法, 没有为什么; 数学能力也是必 不可少的,如果不是做算法,高中水平的数学能力就足够了,但一定要成绩很好才行。

那么为什么我要强调上面列的三点呢?

具有强烈的好奇心和求知欲, 能够让你跟上技术发展的步伐, 仅仅靠危机感和责任感, 你对 技术的学习会有很强的功利性质, 导致你的技术体系不能构成一个完整自包容的整体, 而且 很难对技术有高层次的认识和掌握。

我认识的一个资深系统设计师跟我说过:做软件, “ 做出来做的好完全是两个概念, 要求的投入和技术水平是天壤之别。 现在国内很多程序员仅仅把软件开发当作养家糊口的谋 生手段, 国内计划经济时代凑合、 马马虎虎干活的思想也渗透到了软件业, 很多程序员仅仅 是把功能做出来,根本不会去考虑提高重用性、可维护性,也不会去考虑提高稳定性、 运行 速度,甚至连代码也是乱七八糟,基本的编码规范都不遵守(在我看来,这样的人不配 序员这个称号 , 在我们大声谴责国内软件业环境不好, 拉项目靠关系, 没有质量保证体系, 老板不重视程序员, 疯狂剥削程序员的时候, 我们是不是该问问自己, 你是不是只把眼睛盯 着别人?

现在各种软件开发包应有尽有,包罗万象,编程工具也异常强大方便,对于国内占主流的 MIS 系统来说, 要完成一个功能实在不是很难的事情, 但是如果把系统做为一个整体, 则大 多数都是运行缓慢、占用资源过大、兼容性差、可维护性差、不稳定的系统,你可曾尝试过 开发一个优秀的系统, 如果有, 你就会发现开发优秀软件是多么困难, 对技术的要求是多么 , 而你在努力做到完美的过程中水平的提升是多么快。 没有追求完美的精神, 无论外部环 境如何好, 你也是不会开发出优秀软件的, 等待你的是无休止的修改和维护~, 你的技术水 平也永远停留在简单的编码阶段,最终只有被迫转行。

好了,我真的适合当个程序员,那我该如何开始?

首先选择一门编程语言和操作系统平台。

操作系统平台国内比较流行的基本有 Windows Linux (Unix Mac OS。一般来说大家都 选择的是 Windows 平台,因为此平台是国内处于垄断地位的操作系统,而且有很多优秀的 开发工具可供选择,缺点就是 Windows 平台的开放性不高,往底层探究比较困难(但我对 于言必称底层的观点比较反感, 不是所有搞开发的都要对底层非常了解, 做出用户满意的系 统才是我们追求的根本,玩些底层的 trick 只是一种自我满足罢了。当然我们需要有一些掌 握底层技术的高手,但这个是个人选择的问题 ,而且用惯 Windows 的程序员在配置、脚 本等方面比较弱。 Linux 是开源平台,当然从理论上你可以操纵 Linux 的一切,但是有几个 人能够达到这一水平?刚刚开始学习开发的程序员, Linux 上也仅仅能够开发一些应用 软件罢了。 Linux 下的开发工具不够人性化,但这种情况正在逐步得到缓解, Eclipse 就是 非常出色的开发平台。在 Linux 下开发, 你可以得到大量优秀的源代码, 并且一切都是透明 (只要你想 ,但你必须学习很多命令行指令,掌握各种系统和参数配置以及脚本方面的

知识。

编程语言的选择更是令人头痛, 我涉猎不多, 对于有些语言, 我无法给出任何建议,只好等 这方面的高手来给大家补充了。我仅仅对 C++ Java 进行一些说明,当然这个也仅仅是基 于个人体会,绝对不是权威观点 :P

C++仍然是目前占主流的开发语言(详细的可以阅读 TCPL 中的相关论述 ,而且一种语言 的发展或消亡都是一个渐进的过程,在可以预见的将来, C ++仍然是一门举足轻重的开发 语言,但其所针对的领域和方向可能会有所调整,我认为最主要的变化是 C++会逐步从商 MIS 系统市场上退出。选择 C++的理由是关于 C++的优秀开发书籍和开发工具最多, 关的资源也异常丰富, 待对于一般应用程序的开发掌握之后, 无需过渡, 就可以深入学习各 种技术,因为现阶段讲述系统底层奥秘和高级技术的书籍,基本都是选用 C\C++做为示例 语言。 加上微软精心打造的开发平台 Visual Studio Borland C++ Builder系列, 学习起 来更是如虎添翼。但 C++现在的缺点也是比较明显的,我最深的感触就是对于 XP Agile Development 的支持不好。

Java 简化了 C++的语法,学习起来比较容易(但随着 Java 的日益普及和发展,是否能够 继续保持这一优势,我不敢断言 , Eclipse 是非常优秀的 Java 开发平台,支持 XP 的整个 过程:设计、测试、编码、重构 …… 现阶段敏捷软件开发的主要语言就是 Java 。而且 Java 的跨平台特性更是非常大的优势。

实际上, 选择哪门语言都没有关系, 根据你的发展规划和目前身边的环境选择就可以, 没有 必要跟风,其后的坚持才是难点。

,假设你选择了 C++做为开发语言, Windows 平台上开发,那么我给你如下的学习建 (其他的选择请各位积极补充 …… :

C++语言的学习当然是基础, 这个阶段由于没有任何在特定平台上的开发经验, 我们只能按 照书中的例子一个一个输入运行,暂时告别熟悉的图形界面,回到古老的 DOS 了。参考书 的选择是这个阶段很多朋友关心的, Stan Lippman的《 Essential C++》和《 C++ Primer 是我优先推荐的,而《 Essential C++》因为篇幅较小,讲解内容适当,而且对 C++ STL 运用有不少描述, 显得相当实用, 我认为最适合初学者使用。 无论选择了那本书做为入门教 ,都应该逐个例子逐个例子的消化,不要贪快, 但同时要对重点内容有所侧重。 我们学习 任何东西都是为了解决实际问题, 所以请把重点放在我们实际中最常用的部分, 而不要过多 的追究一些细节和艰深晦涩的不常用技术。

此刻我们会碰到很多过后看来非常简单幼稚的问题, 比如为什么编译出错, 为什么按照书中 的例子输进去却无法通过编译, 找不到头文件等等, 大体上这是因为刚刚接触程序开发, 程序理解还很初级,以及对于所使用的开发环境不够了解,特定编译器对标准 C++的支持 程度不一导致。 请多阅读关于所使用开发环境的各种文档, 以及查阅帮助文档。 以我最经常 使用的 Visual C++配合 MSDN 来说,当出现一个我不能理解的编译错误时, F4键编辑 器就会自动跳到当前错误地点,下面的输出窗口也会给出错误代码(比如 C××× × ,把错 误代码记下,打开 MSDN ,在索引一栏输入错误代码,就能够查到详细的关于此错误的说 ,当然,是英文的(不要问你不会英文怎么办,这是基本要求 。现在的开发工具查错排 错非常方便。 当然, 有时很多错误原因并不是编译器所提示的地方, 而是往前或往后一些地 ,长期的编程经验可以提高查错速度。此时也请多练习练习 Debug 技术。

此阶段只要能够掌握 C++的基本语言要素,对结构化程序设计和基于对象的设计有一定理 , 能够完成一些简单的小程序就可以结束了, 毕竟 DOS 程序现在很难勾起我们学习的欲 望了 :P 在此之后可以视自己的情况决定是否学习数据结构,数据结构是程序员的必修课, 不可或缺, 地位非常重要, 即使你现在希望马上进入图形界面程序开发的世界, 这一课我也 提醒你记着早点补上。

终于可以迈入图形世界,我们要从 SDK 编程开始,不要担心,这不会花费你太长时间, 却是对 Windows 程序运行机制进行深入了解的好时机, 在此的努力都不会白费 (trust me , 此时的参考书没有什么好考虑的,基础的有 Charles Petzold的《 Windows 程序设计》 , 阶的有《 Windows 核心编程》 。请从《 Windows 程序设计》开始, Charles Petzold的书通 俗易懂,学习起来非常轻松,而且对你的语言要求不高,只要懂 C 就可以了。

此时容易碰到的问题大多与项目设置有关,如果使用 Visual C++,请按 Alt+F7调出项目设 置对话框仔细检查,并阅读相关文档,熟悉各项配置的意义。

此阶段请重点掌握 Windows SDK程序的编写方法, Windows 程序的运行机制和 Windows 消息机制,和常用的 Windows API。我们还可以更进一步:尝试用前一阶段学到的 C++ 识对过程化的 SDK 程序进行初步的改造,将我们敲入计算机的程序变得可重用,按照自己 对基于对象思想和面向对象思想的理解来重新编写例子程序。

OK ,现在你已经初步入门了,掌握了 C++的基本用法,对面向对象有了一点模糊而自以为 是的认识,也能够写出 Windows 程序了,虽然还有点简单,还有点丑陋,不过,总归是图 形界面啊。开始有点感觉了,是吗? :P 别急着往前冲,停一停, C++ Windows SDK的基础打牢, 贪多嚼不烂吗。 此时有很多经典书籍等待你去掌握, 也有几乎无限的题材供你 练习,请尽量多阅读接触下面的资源:

C++ Primer

Windows 核心编程》

《应用程序调试技术》

面向对象开发设计方面的书籍

MSDN Platform SDK部分, Periodicals 部分(包含了大量有价值 C++ SDK 方面的技 术文章

CodeProject 里相关的源代码是很好的补充学习资料

现在继续往前走吧,利用 SDK 开发毕竟有时太过于费时费力,还是使用更高级的应用程序 开发框架的好,主要的有 MFC VCL ,关于这些框架谁好谁坏的争论我已经听烦了,一句 ,能帮助我们完成任务就行,它们无非都是工具,你自己随便选择吧。不过选择好之后, 你应该明白,对于你的工具,了解越深,越能发挥它的威力。如果你选择了 MFC ,我建议 学习下面的书籍:

《深入浅出 MFC :关于此书毋庸多说,尽管有人不停的贬低,但它的地位是无可置疑的, 而且也是对我最有帮助的书籍之一。

MFC 程序设计》

Visual C++技术内幕》

然后就停止找书吧,网上开发站点的数不胜数的源代码就是最好的老师了 ……

学习过程中碰到问题我该怎么办?

我始终认为学习软件开发过程中遇到的问题只有自己尽最大的努力去解决, 才能收到最大的 成效, 对于那些动不动就把问题发到网上指望高手帮你解决的做法我非常不赞同, 因为这样 你并不能从中学到多少。 我建议的做法是, 首先尝试自己独力解决问题, 花几个小时解决一 个问题,是很正常的,不要几分钟解决不了就放弃了;实在无法解决的时候,请尝试尽量减 小涉及范围, 将问题归结一下, 初步形成自己的结论; 然后利用搜索引擎或者开发论坛中的 搜索功能来搜索是否有对于自己问题的解答; 实在没有的时候, 再发帖子求助。 请了解一点:你遇到的问题都是别人遇到过的, 网上肯定有现成的解决方法 (因为你还没有到开发研究前 所未有的问题的水平 :P , 只看你找不找得到了, 请尽力去利用现有的资源而不是麻烦别人。 CSDN 的论坛、 MSDN 在线文档都是非常好的资源,基本上我们遇到的问题在这里都能找 到解答。

(写的有点乱,大家凑合看吧 B

给软件开发初学者(精)

相关推荐