# 程序员指北-袁冬

> 袁冬学长是03级海大物理系本科生，在2005年担任第三届爱特站长，他同时在海大读研读博。他的博客：[冬冬 - 博客园 (cnblogs.com)](https://www.cnblogs.com/yuandong/) 。2008年，他在个人博客写了一篇文章，阐述如何成为一个优秀的程序员。这是一篇16年前的文章，技术的浪潮汹涌澎湃，彼时的技术环境与如今相比已发生了翻天覆地的变化，文章中的路线不一定适用于现在的程序开发，但是可以学习袁学长对技术探索时的那份执着与激情。文章最后，袁学长总结的特别好：“在学习开发的这条道路上，肯吃苦是最重要的，只要肯学，我相信每个人都能成为程序员，这一令人羡慕的职业。”


**【2024年12月5日收录】**


**摘要：** 本文主要阐述的是如何成为一个合格的程序员的必经的道路，如果你一直想学但是一直找不到“北”的话，那么这篇“指北”文章，或许正好适合你。我将以.Net开发为主要路线，或许以后会写一篇Java的，但是其实你真的学成了一项之后，我觉得你自己也就知道以后的路要怎么走了。欢迎你和我就各种问题交流：学习方法、技术问题、业务开发、吹牛扯蛋。


**关键字：** 程序、开发、学习方法




## 一，引言


看到这句话，起码说明你是个想要学习程序的人，那么恭喜你，这已经是成功的一半了。因为在自学这条道路上，特别是在自学计算机开发这条道路上，兴趣，是最好的老师。


我不要求你有什么计算机开发基础，甚至说你连鼠标和老鼠的区别都不知道的话，也没有关系。我们一步一步的来，只要你把我下面说的都做到了，那么，你就是一个合格的程序员了。


在学习程序的道路上，你要吃很多的苦，受很多的累，其中很多是身体上的，更多的是精神上的。因为在你达到一定水平之前，外行人是欣赏不了你的，这和美工不同。美工也许做了一个很好的东西，别人马上就可以说：“酷”，很用成就感。而程序，别人只会说三个字：“看不懂”，更不幸的是你的水平越高，说这三个字的人越多，呵呵。不知道你现在是不是已经觉得很郁闷了。但是注意我说的话：在你达到一定水平之前。为什么这么说？因为如果你接了一个工程，人家给你20万，利润过半，傻子也知道你是什么水平了。至于美工能不能接到20万的项目……呵呵，个人的看法是可能性不大。


总的来说，学程序，或者说得大一点，学系统开发，是一件很有比较孤单的事情。要求你耐得住寂寞。而且必须要有吃苦的精神，因为程序，并不好学。请做好心理准备。


本文主要阐述的是如何成为一个合格的程序员的必经的道路，如果你一直想学但是一直找不到“北”的话，那么这篇“指北”文章，或许正好适合你。我将以.Net开发为主要路线，或许以后会写一篇Java的，但是其实你真的学成了一项之后，我觉得你自己也就知道以后的路要怎么走了。欢迎你和我就各种问题交流：学习方法、技术问题、业务开发、吹牛扯蛋。


## 二，什么是合格的程序员


什么是合格的程序员？那我们应该先问：什么是程序员？程序员，顾名思义就是写程序的人。那什么是合格的程序员呢？就是写出合格的程序的人。那什么是合格的程序呢？这个问题，就很难回答了。合格的程序，首先要是可以运行的程序，其次还牵扯效率、安全性、可扩展性、可移植性、可读性……等等很多很多东西。所以什么是合格的程序员？我觉得，还是把眼光放得低一点，能写出可以实现所有功能的、可以正常地运行的程序的人吧。


这个问题看似很简单，其实，事情不像想象的样子。


这里指的能实现所有的功能，可以正常地运行的程序并不是说仅仅写出一个“Hello World。”你就可以说自己是程序员了。那程序员早就满天飞了，你也不用看我废话了。


这里所说的实现所有的功能，起码是解决一个具体的问题，比如说一个信息发布系统、一个学生管理系统、一个办公系统或者是某些通用的平台等。但也不要被吓倒，其实也不像想象的那么难。只要肯吃苦，合格的水平还是人人都可以达到的，而且应该是很快就可以达到的。但成为一个合格的程序员之后的路，更长、更艰苦，那就不是我们这篇文章讨论的问题了。


废话不表，我们进入正题。


## 三，成为程序员的阶段：


我将成为一个合格的程序员的过程分为以下几个阶段：
（一）熟悉电脑的基本操作
（二）熟悉一门编程语言
（三）掌握一门DotNet语言
（四）掌握针对数据的编程
（五）掌握网络编程
下面我一个阶段一个阶段的讲解：


### （一）熟悉电脑的基本操作


如果你已经能够独立的重装操作系统了，那么这个阶段你就可以跳过了。


其实这个阶段没有什么实质性的东西，就是对电脑的熟悉。电脑，总该在学习开发之前熟练的应用吧？


说具体点，要会用Office2003，会用IE浏览器上网，能找到并且正确安装自己需要的应用程序，再进一步，要能够自己把自己的系统搞崩溃，再自己重装。这段时间兴趣是最重要的，因为没有什么明确的目标，所以你对什么感兴趣就学什么。而且千万不要对电脑有恐惧感，如果你真的能把你的电脑搞坏了（指的是物理损坏，排除暴力因素），那也算是一件了不起的事情了。呵呵，所以不要怕，使劲用它就是了，只要能把电脑的基本操作熟悉了，起码你买电脑的钱，已经赚回一半来了。


这段时期如果能够对服务器系统（主要是WindowsServer2003和IIS），有一定的了解，就更好不过了，然后你就可以给人家很自豪地说，我会假设服务器了。还有就是用Server系统，需要花点功夫研究一下权限系统，很有必要。建议如果对自己的英文有信心的话，使用英文版的操作系统。


还有一个很重要的方面，就是对网络的应用要熟悉，比如Google、P2P下载。这些都是宝贵的资源，善加利用，事半功倍。


另外如果你身边有一个高手，那么你简直就是买彩票中奖了，不要浪费，一定要不厌其烦地问，问得越多，学得越快。


总的来说，这段时间是一个很有乐趣的时间，大概经历一到两个月，你就可以摆脱电脑盲的帽子了。不过真正的熟练掌握电脑，还需要在学习开发的同时，不断的实践。


### （二）掌握一门编程语言


从这个阶段开始，就正式进入我们的学习阶段了，学习是枯燥的，学习程序的初期尤其如此，所以如果有的时候你受够了，就调剂一下，继续做你第一阶段做的事情，继续漫无目的的捣鼓一下你的电脑，是一种一箭双雕的好办法。


我们应该从什么语言学起呢？C，种种迹象表明，学C，是初学者最好的途径，可以让你有一个很坚实的基础，虽然我们以后几乎不会用C来做实际的开发，但是在C中学到的东西，足以使我们在整个职业生涯中受益，甚至可以把话说得大一点，不论是程序、美工、服务器管理员，只要是从事电脑开发工作的相关人员，都应该学C。


C语言是大学计算机二级的标准课程，也是国家计算机等级考试二级的考试科目，还是计算机专业很基础的专业课。所以学C不是一件很难的事情，采用的教材也很统一，谭浩强老先生的《C语言教程》，一般用的是第二版，第三版也出了，我没看过，我以第二版为主。这本书是清华大学出版社出的，几乎是所有高校的标准教材，所以好不好就不用我多说了。


这本书我觉得也不用所有的都看，比如位操作、文件读写等，我们就很少用，我指的是实际开发，走算法优化或者竞赛路线的，不在此类考虑范围内。


具体地说一下这本书的阅读方法：


第一章到第十章：精读，所有的课后题全部都要做，而且最好是全部要上机调试通过。其中条件语句（第五章：if语句）、循环（第六章：for语句、while语句）、函数（第八章：形参和实参），指针（第十章）都是重点中的重点。必须要掌握。


第十五章：面向对象的开发，了解概念。这个概念很重要，所有我单独拿出来说，因为以后我们的开发，基本就是面向对象的了，所以面向对象的概念，必须非常透彻的理解（其实很容易理解，但容易不代表不重要）。其中类、对象、继承、派生、多态等概念，在以后的开发中是基础的基础。


这个阶段其实比较好渡过，因为学习的模式和我们接受了十几年的应试教育的模式基本一致，就是看书，做题。而且如果你肯下功夫，这个阶段也很短暂。我的一个学生，用了十天的时间，从没接触过编成，到把C基本学成。很惊人的速度。当然，这十天他过得很艰苦，每天看十几个小时的书，基本上除了睡觉其它时间都在看，无论是吃饭、坐车、上课、上厕所……


不过按照我的看法，仅仅是《C语言教程》这本书所带的习题是远远不够的，还应该有些深度，建议把南开一百道题全部做完，上机调试通过，再适当的做一些ACM/ICPC的预赛题，效果会更好。当然搞实际开发的，没必要把算法优化到变态的地步。主要是锻炼自己的数学建模能力。


### （三）掌握一门Dotnet语言


当你走到这一个阶段的时候，也许在某种意义上说，你已经是一个程序员了，因为你已经写了很多程序了。但是你可以问一下自己，你写的程序有什么用处吗？判断闰年还是找出100以内的素数？难道这就是你学习的最终目的？当然不是，这只是开始。


当我们开始学习DotNet的开发时，我们可以说，我们开始学习一些实际的，而且是与世界前沿的计算机技术接轨的东西了。


我在这里并不想给出DotNet的任何描述，那不是这篇文章的内容。我想说的是怎样学。其实方法很简单，看书+写程序。和学C没有什么差别，只是没有了习题，大概学起来就会有一种找不到北的感觉。习惯了就好了，以后我们要学的东西，都不会有习题。


我推荐两本书：


1，《C#高级编程》（《Professional C#》）清华大学出版社翻译出版，Wrox公司原著，128.00RMB。网上有电子版，评价不一。我的启蒙书。


2，《C#编成思想》（《Thinking in C#》）机械工业出版社出版，Larry O’Brien & Bruce Eckel著。网上有电子版的，评价很高。


以上这两本书都很好，都很值得看，其中Wrox的书是一整套，很方便后续的学习。这也是我推荐这本书的很重要的原因。至于《Thinking in C#》这本书，网上的评价是很高的。而且和他一套的还有《Thinking in C++》、《Thinking in Java》等，都是难得的好书。建议这两本书中至少要买一本。两本书都有英文版的，仍然建议E文好的优先选择英文版。


说一下读书的方法。这两本书都很有分量。比如说《Professional C#》，一千多页，还是大本的，很有震撼力。不用说全部看懂吃透，只是逐字逐句地读一遍，也要不少功夫。但是谁让咱要学呢？忍了。


顺便说一下我对Wrox这一套书的一些看法。Wrox,中文翻译叫乐思。他们出的书很全，基本上涵盖开发的所有方面，从Asp到Asp.net，从C#到Java，从关系数据库到XML。而且大部分的内容分为“入门经典（Beginning）”和“高级编程（Professional）”两类。我觉得入门经典没有必要看，因为讲的太过基础，给人一种唠唠叨叨的感觉。所以我建议直接看高级编程，特别是如果你认识高手的话。虽然已开始看高级编程会觉得比较吃力，但是一旦入门，进步的速度会很快。


我讲一下《Professional C#》这本书的阅读方法，因为我一直拿这本书当教材。其实这本书的章节的划分我认为不是很合理，我认为好的阅读顺序如下：


1，第一章：描述性的东西。了解就可以了，开始肯定不明白。


2，第二章到第五章：必须看，重点。也很基础，有C的基础很容易搞定。


3，第九章、第十一章、第十二章、第十九章：这些算是新的内容了，也是很重要的。


4，二十一章、二十二章：数据访问。我们以后和数据打交道是最普通的，数据库是必须要掌握的，书上这两章讲的很基础，必须要深入理解。


5，二十五章、二十七章：网络开发的基础。个人认为网络开发是趋势，学程序不学网络开发部完整。


以上我说的是第一遍要看的东西。剩下的我没有提到的，可以以后慢慢看，像是委托和事件（第六章）、反射（第十章）、程序集（第十三章）、线程（第十五章）等都是有重要、也是很有用的技术，但是对于初学者比较困难。


第一遍读的时候肯定会很迷糊，没关系，很正常。耐着头皮看，一定要挺住。第一遍看到一半的时候，应该就有点感觉了，如果第一遍确实看不完，也不用勉强，看个十几二十章的，开始第二遍。第二遍看得时候，收获就会很大，很多东西很自然的就明白了，特别是面向对象的概念。然后这一遍看到看不下去的时候，你已经入门了。然后是第三遍，建议第三遍仔仔细细得看，尽量多懂一些。


只是死读书很容易导致读书死的，所以我们要注重实践，那么实践的内容是什么？下面我列举一下，也算是一些不太高明的习题。


1，安装编译环境。不要以为很容易，装个TC也许你可以一下子搞定，但是能装好VS.Net，绝不是一件容易的事情。这里我推荐VS.net 2005，刚刚发布的，确实很好用。


2，“Hello World”。没错，学习所有的开发语言、开发环境，先写一个“Hello World”是很有必要的。这代表是一个完整的开发过程。


3，书上的示例。也许你在看的时候，觉得示例很容易，但真正的把它写成一个可以执行的文件，还是有很多不同之处的。从理论到实践是很有差距的。不过“高级编程”这个系列的书有个算不上缺点的缺点，就是它给出的都是代码的片断，很少给出完整的代码。所以如果你写不出来的话可以把源代码找来看。示例代码也不用都写，主要是实际的用C#写点东西，避免眼高手低。


4，MSDN演练。我们主要还是用VS.net开发（不要给我说你用NotePad写程序，这不是王道）。微软的看家东西，功能自然不必多说。掌握这个IDE（集成开发环境）是必须的事情。方法就是做MSDN所带的演练。做得越多越好，其实全加起来也没有几个。演练讲的很细，只要你按照他说的做，或许无法最后实现功能，但是肯定可以把开发环境熟悉了，这样我们的目的就达到了。


5，写一个计算器。主要目的是掌握一个实际的程序的开发。了解.net的主要类，习惯面向对象的系统开发。这个计算器写得越复杂越好，呵呵。


当你成功的运行了自己写的计算器的时候，你对开发，已经有一个全新的认识了。不过很显然，这些还远远不够，那么，我们还应该掌握什么呢？


### （四）针对数据库的编程


数据，可是说是我们开发的最基础的东西了，没有数据，那我们在处理什么？


我这里所说的数据，可以分为如下几类：


1，基础的数据结构


2，DotNet中的主要数据类型，特别是集合类型


3，关系型数据库


4，XML


对于传统的数据结构，要求不是很高，主要看自己的兴趣，不想看的话，掠过也可以，想学的话。清华大学的那本《数据结构》（C语言版）就够了。也是大部分高效的标准教材。


对于DotNet中的数据类型，就要很熟悉了，其实很基础，所以在平时练习中就潜移默化的掌握了。只是像HashTable这种很有用的集合类型（其实就已是一个类），要好好研究一下。


关系型数据库才是真正的重点。主要是M$ SQL Server、M$ Access、MySQL、Oracle等比较程序的数据库系统，不要被这么多不同的种类的数据库吓倒，其实就是掌握SQL语言，和连接、访问数据库的方法。


千万不要把SQL和M$ SQL Server混了，后者是微软的一种产品，而SQL（Structured Query Language，结构化查询语言）是一种类似C、C#的语言，只是不时程序设计语言，而是一种用于操作数据库的语言，是一种大家都支持的标准。所以我们只要掌握了这种语言，对任何数据库都是通用的。


学习SQL语言，推荐一本书：《数据库系统概论》（第三版），高等教育出版社，萨师煊、王珊，25.10RMB，是计算机国家三级考试的教程，也是很多计算机专业大四的专业课。这本书不用都看，主要是第三章，其他的随意。另外M$ SQL Server自带的联机丛书也是很好的参考资料。另外市面上还有一些专门讲数据访问的书，例如Wrox的《.NET数据服务 C#高级编程》（《Data-Centric .NET Programming with C#》）之类的，如果自己觉得有必要，也可以买来看一下，有益无害。


对数据库的了解，不应只限于访问，数据库系统的安装、备份、故障恢复、权限设置、安全性设置等一系列的操作都应该很熟悉。特别是Access和M$ SQL Server这两个系统，用得比较多。Oracle就比较专业了，只用得比较大型的项目中。


在.NET中，对数据库的访问主要是System.Data命名空间。DataSet类，核心，重点掌握，还有DataAdapter，Command，Connection这几个类，说白了，也就这点儿东西了。这也就是我们所谓的ADO.NET（Active Data Object.Net）。


至于XML，是一个很重要的，很基本的东西。注意是很基本，不是很基础。基本的意思是它有些属于系统底层，但不基础，因为也许并不是很好学。


这里我仍然推荐Wrox的《C# XML 高级编程》（《Professional C# XML》），看完一遍应该就明白什么是XML了，当然你也可以买专门讲XML的书来看。


等到数据的访问比较熟悉了，可一个自己写一个通讯录，功能自己定，只要能把你学到的都用上，就是个很完美的程序。这个小东西基本涵盖了数据访问到数据操作的所有东西。


### （五）掌握网络编程


我认为学习开发，但不学习网络开发是不完整的，毕竟网络是一个趋势，这也就是为什么会有DotNet的原因了。


在DotNet下的网络开发其实和基于WinForm看起来没什么差别，当然，学到一定的程度就知道了，其实根本不是一回事儿。


对于DotNet中基于网络的开发，说白了，就是ASP.NET（Active Server Page.Net）。基本上看一本书就可以了：Wrox的《ASP.NET 1.1 高级编程》（《Professional ASP.Net 1.1》）。也是一本厚度惊人的书。1K多页吧。


这本书有些部分可以先不看：Web服务（第十九章、第二十章）、移动控件（第二十一章）。其他的尽量看，同样，第一遍不可能全部看懂，每看一遍都会有新的收获。


掌握ASP.Net大概也就是半年的时间，当然，辛苦不用我再说了。


不过网络开发的面，不能只限于ASP.Net，还有很多很多相关的东西：


1，HTML（超文本标记语言）。也是网页的官方语言，必须掌握。当然，我不建议你每个标签的每个属性都滚瓜烂熟，也不可能。只要你知道怎么用就可以了。其实标记语言（ML）都是很简单的。


2，CSS样式。其实是和HTML算是一类的，都输入网页设计的范畴，有些和美工交叉。但是没办法，大部分的整合工作还是有程序原来做的，所以这些东西必须会。


3，JavaScript。不要和Java语言混了，根本不是一个东西。它是一种小型的网页互动的脚本，功能很弱（相对而言）。其实也应该属于美工的范畴。


4，一定的服务器假设和维护的知识。我们要调试网站，必须在服务器操作系统上，现在也就是Windows Server 2003。所有相关的知识必须会，比如怎么用IIS，如何分配权限、如何配置防火墙等。这有些和系统维护的范围交叉。


当你大抵熟悉了以上的内容时，那么恭喜你，你可以开始着手开发你的第一个系统了，这个系统，我建议是一个信息发布系统，说白了就是一个文章系统。让用户可以查看、发表、修改、删除文章就可以了，复杂得还可以实现文章分类、用户分类、文件上传等。你可以自由发挥。如果你认识做美工的，给你做套页面最好不过，不过没有也没关系，主要是实现所有功能。


这个系统，如果你真的开发出来了，那么，我就可以以程序员称呼你了。其实从什么都不会，到现在战胜最终的BOSS，也就一年的时间吧。


## 四，今后的路


当你真正的成为了一个程序员，那么以后的路，不确定地方，就会多很多，我说一下我的一些看法吧，并不成熟，因为我也在探索。


在可以开发出一个合格的程序之后，我们的着眼点就变成了如何开发出一个优秀的程序，这牵扯到更多的东西，所以我们要进行更多的学习。一下我列举一些比较重要的东西：


1，MSDN：M$开发资料的大本营，不论是网站还是Library，都是第一手的和最权威的资料。其实大部分的内容都是由MSDN转化而来的，但是MSDN的逻辑性太差了，它是以类似字典的结构整理的，所有用来查询最好不过。不过有的时候随手翻翻也会受益匪浅。


2，Duwamish：这是MSDN一直自带的一个示例，现在有DotNet版本的了，这个示例是官方版本的，好不好不说，但是规范程度绝对是最一流的！网上有一种说法，如果你把Duwamish全看懂了，你就是高手了。


3，《Design Patterns》：关于设计模式的一种经典书，必看。


4，Wrox的一些书：Wrox的一系列的书清华引进了很多，网上也可以找到很多。有一些很有难度的，比如那本《ASP.NET 电子商务高级编程 提出问题-设计方案-解决方案》（《ASP.NET E-Commerce Programming Problem-Design-Solution》）就很好。自己去书店翻翻，看不懂的就买几本回来仔细看，呵呵。


5，CSDN：大概算是中国的MSDN了吧，如果你缺乏帮助，缺乏交流，那就不用犹豫了。上CSDN吧。


6，TeahNet：同样是微软的网站，它的教学中心，里面的WebCast有很多很好的，类似面对面的讲座，可以学到很多最新的技术。而且微软的网站，下载速度非常快。微软有一些讲师，特别是一些有金牌讲师称号的，水平确实很高（无论是技术水平还是讲解的水平）。网站更新很快，应该经常看。


7，ASP：虽然说我们已经掌握了ASP.NET，而ASP已经是昨日的黄花，但是这黄花的数量实在太大，我们不能回避这个庞大的资源。其实如果已经学会了ASP.NET，再看ASP应该是小菜一碟，随便找一个系统的源代码看一下就OK了。


8，动易文章系统&动网论坛：算是民族软件中不可多得的东西了吧，也许是我见识太短，但我认为这两个软件的水平，绝对算得上是高的。更可贵的是两个软件都有免费办的，值得好好研究一下。有能力的话，可以写一个和功能类似的系统，自己用。不过这两个系统都是ASP的，要求有ASP的一定基础。另外，这两个系统对模版的支持相当强大，可以说是二次开发的必备之物，美工尤甚。


9，项目管理（版本控制）：这里的项目管理，更多的是指的对微型项目，也就是一个程序员加一个美工，甚至说一个程序员就可以搞定的项目。主要的内容也就使版本的控制和项目资料的整理。经验问题，需要多实践。


10，文档的书写：不要说你做一个项目一个文档也不写，这样你永远做不了好的项目，所以文档是一个程序的必须的组成部分。学会写一个格式良好、叙述清晰的文档，势必学的技能。


11，Google & VeryCD：我们的资源库，要找东西去这两个网站就对了。没有去VeryCD看看也很好，上面有你一辈子都看不完的教材和资料，也有你或许听都没听说过的软件，更重要的是，全部都可以下。


终于把要写得都写完了。本人水平有限，不自量的发表一些自己的看法，如果能对你有些益处，也算是我没有浪费你的时间。在学习开发的这条道路上，肯吃苦是最重要的，只要肯学，我相信每个人都能成为程序员，这一令人羡慕的职业。


