如何成为一名程序员
成为程序员是一个日积月累的过程,需要日复一日年复一年的技能增长。编程本身是有趣的,并且有回报(脑力层面、精神层面、经济层面)。这份指南不能保证你轻松当上程序员。不要神化下面这些步骤,从中你大概能了解在现今编程界如何成为一名程序员。
步骤
- 01
学习下列这些学科中一两门引导性课程: 逻辑学 离散数学
- 02
学习数据库概念,比如表,视图/查询和进程。你可以使用任何简单的数据库包来完成这些,比如: MS Access DB V Fox Pro Paradox MySQL是一个很值得学习的数据库,因为它免费且通用,数据库常常用于SQL查询。
- 03
想好你要成为哪种程序员。通常程序员会是下面某一种: 网络程序员 桌面软件程序员 操作系统程序员(有单系统,也有多系统) 独立平台程序员 分布式程序设计员 库/平台/框架/核心程序员 系统程序员 内核程序员 驱动程序员 编译程序员 编程科学家
- 04
了解你的编程领域内相关技术和编程语言。下面的部分详细给出了成为不同类型程序员所需的步骤。
网络编程
- 01
了解网络编程的含义。网络应用是指设计在网络结构顶层的软件部分。这就意味着这些应用是通过诸如火狐或IE之类的浏览器来处理的。架构于网络结构的顶层并不一定要连接到网络。这就是说网络应用建立在如下标准网络技术的顶层: HTTP FTP POP3 SMTP TCP IP协议 HTML XML Coldfusion ASP JSP PHP ASP.NET
- 02
浏览不同的网站,了解它们的外观。(右击,选择“查看源”或按F12。)寻找网站类型/内容的多样性,而非数量。通常你需要访问以下网站类型中至少一种: 团体网站(商业公司,非营利机构/组织,政府组织) 网络索引引擎(搜索引擎,meta搜索网站,专业化搜索引擎,目录) 数据挖掘网站 个人网站 信息/百科全书式网页(维基,数据单,技术规格,人工列表目录,博客和日志,新闻和新闻机构网站,黄页,等等。) 社交网站(社交门户,书签网站,记录笔记网站) 合作网站(这包含了上面提及的目录,比如维基和博客)
- 03
学习至少一种头脑风暴技术/方法,并学习一个用来实现头脑风暴的软件。例如:头脑风暴图和微软Visio。
- 04
熟悉网站结构。指的是创建概念化网络范式、网络地图和导航结构。
- 05
赶紧学一门图形设计的课程。尽量学习至少一个图形编辑/操作软件包(不是必须的,但强烈推荐)
- 06
了解网络下部构造的基本情况。包括了解以下: 基本网络服务协议(HTTP,FTP, SMTP和POP3或IMAP4) 网络服务器软件(最好其中一个就是你以后主要工作的平台) 网络浏览软件 邮件服务器和客户端软件
- 07
学习HTML和CSS语言。或许你还想要“所见即所得”软件包来编辑HTML。
- 08
学习XML及其相关技术,比如XSL和XPath(不是必需,仅作推荐)。
- 09
先建立简单的静态网站,直至你熟悉并习惯HTML语言。
- 10
学习客户端脚本语言。多数人要么学Java,要么学VB,但也有一些人学习Perl和DHTML。
- 11
熟悉你所学的客户端脚本语言。潜意识里提醒自己只用你学的那个语言。只有在你熟悉你的客户端脚本语言之后才能进入下个步骤。
- 12
学习至少一种服务器端脚本语言。如果你只用一种服务器软件,那就学其中一种编程语言。否则,你得每个服务器软件都学至少一种编程语言。
- 13
学完服务器端编程语言之后就开始创建一个试验项目。
- 14
获得你的网站,开始用你自己的网页实验。
桌面软件编程
- 01
弄清楚桌面软件编程是怎么回事。多数桌面软件程序员都是编写商务需要的代码,所以好好了解一下商业及其组织和经济结构将对节省时间、提高效率大有裨益。
- 02
了解不同的电脑硬件结构。看看数字电路设计和电脑结构的入门级课程,但是也有人认为这对于刚起步来说太超前了,所以看两三篇说明的文章(比如这一篇和这一篇)就够了。学完第一种编程语言后你可以再返回这个步骤。
- 03
学习一种入门级(小孩子学的那种)编程语言。不要因为你不是个小孩子就不好意思去学。这些入门级语言能大大减轻你正式学习第一门编程语言时的痛苦和压力。然而这一步也不是必须的。你也可以在上一步之前完成。
- 04
学习程序化、面向对象、函数设序设计规范的入门。
- 05
学习一种程序化程式设计语言的入门课程。无论你以后选择何种编程语言,在某种程度上它都要求程序化程式设计。此外,据多数程序员反映,程序化程式设计总的来说是了解编程的一个很好的切入点。
- 06
学习至少一种高级建模技术,比如UML 或ORM。
- 07
开始编写一些小的主控台应用程式或类似的应用程式。你可以利用编程书中的常见小练习。选择一个工具,用你所学的编程语言编写程序。
- 08
学习一门你选择的编程语言的更高级课程。确保进展之前先理解下列概念,并能熟练运用。 对程序用户输入输出信息。 程式化设计语言写成的程序中的逻辑流程和执行流程。 声明、分配和比较变量 编程结构分支,比如if..then..else 和 select/switch..case. 循环结构,比如while..do, do..while/until, for..next. 创建、调用程序与函数的编程句法 数据类型及如何操控 用户定义数据类型(records/structs/units)及其使用 如果你的语言支持超载函数,理解它。 你选择的语言的内存处理方式(指针,变量窥视,等等。) 如果你的语言支持运营商超载,理解它。 如果你的语言支持delegates/函数指针,理解它。
- 09
应用你所学的高级技能 面向对象的规范
- 10
至少再学习一门编程语言规范的入门课程。推荐学习每种范式的编程语言,多数高级程序员确实是这么做的,然而,通常你开始时只学一种,应用所学知识训练了一段时间,获得了编程的鲜活经验,然后接着学习另一种。试试下面的语言: 逻辑编程范式 函数编程范式
- 11
试着比较你所学的两门编程语言。评估各自利弊。通常可按以下方法完成 拿出你在学习第一门编程语言时编写的简单范例,现在用第二门语言重新编写。 创建一个工程,尽量用上两种语言完成它。有时取决于你选择的工程和语言,你可能仅用一门语言还无法完成这个工程呢! 写一份两种语言之间相似结构和独特之处对比的速查表或一览表。 尽量使用另一门语言找到模仿这两门语言中独特之处的办法。
- 12
利用你学过的一种语言来学习可视化编程概念。几乎所有的编程语言都具有支持可视化编程和其他支持控制台或类似控制台编程的版本/库。同时进行的包括: 初步了解事件驱动编程。在某种程度上,多数可视化编程依赖事件及事件处理(用上你选择的语言)。 尽可能多的尝试桌面软件,理解软件是做什么的。多数软件开发公司会提供产品的测试版,你可以拿来测试软件。在完善用户界面方面保持更新。 阅读关于图形用户界面的文章或教程。
- 13
开始把你所学的知识运用到你设计的软件小工程中。尽量把你的编程专业知识运用到你日常生活中的问题上。比如,编写程序,批量重命名文件,视觉上比较文本文件,复制目录里的文件名到内存/文本文件之类的东西。刚开始简单一点。
- 14
创建一个虚拟的“毕业工程”。把这个放到最后完成,用上你到目前为止学到的可视化编程技术。
- 15
通过学习更高级的课程、更加注意细节以及在网上学习搭建架构的技巧,来加深对你学过的可视化架构/库/包的理解。
- 16
搜索其他含可视化元素的包/库并学习它们。
- 17
学习图形学课程(而非图形设计)。对于想要写出吸引人的用户界面元素的程序员来说,这将大有裨益。
- 18
成为游戏程序员(不是必须的)。很大程度上游戏编程是被当作桌面编程的。如果你想成为游戏程序员,完成这些步骤后你需要进一步学习游戏编程。对于游戏程序员而言,图形学课程是必须的,后续步骤中第二门语言应该选择逻辑/函数编程语言(最好是Prolog或Lisp)。
分布式程序设计
- 01
处理分布式应用编程。分布式应用编程被许多人认为是最难学的一种,它要求计算机和通信技术中的不同知识。
- 02
快速了解通信系统及其硬件。这个步骤不是必须的,但是对于理解网络拓扑结构很有用。
- 03
熟悉网络硬件结构和设备,比如集线器、接线台和路由器。
- 04
学习网络协议的课程。在你开始分布式应用编程之前,你需要好好理解“开放系统互联 (OSI) ”模型、以太、IP、TCP、UDP和HTTP 。
- 05
学习XML 语言,并熟悉它。
- 06
开始学习一门shell脚本语言。对基于Windows的编程,可以是任何能与Windows脚本宿主兼容的脚本。对基于Linux的编程,Bash脚本和 Perl就够了。对这两个平台都强烈推荐Java,原因如下: 几乎所有操作系统的都支持脚本宿主(Windows 脚本宿主默认支持java ,大多数Linux发行版都有支持java脚本控制的包)。 许多开发者认为它很容易学。 当你需要学第二门编程语言(C,C++,C#,Java和J#都有ALGOL开源句法)时,它拥有的ALGLO开源句法就能使你熟悉更多编程语言 通过学习java,你会熟悉网页的客户端脚本,这可谓一大福利!
- 07
开始时用上你学的脚本知识,只运用程序化程式设计。之后,根据你的脚本语言和它所支持的,你可以用上更高级的编程技巧和范式。所有的脚本语言在某种程度上都有程序化程式设计的一些方面。
- 08
使用你所学的脚本语言,写出实现机器之间通信的脚本。学习完成这个所必需的东西。简单的通信就足够了。
- 09
转移到桌面脚本/编程语言。一个比较好的是多范式语言,比如Python。简单了解第二门语言。有许多理由让多数程序员选择java。然而,在这个领域内C#正在获得多数优势。Java和C#被青睐的原因如下: 它们是面向对象的编程语言,使大量程序员免遭实现细节之苦,因为它们都支持组成部分(代码单元、预编译,它们可以执行特定任务,并被用到其他程序中)。 它们支持事件驱动编程,在某种程度上还支持OO和程式化程序设计。 建立语言的架构按属性分布(比如Java)。 有许多现成的包来处理。社交网络同时作为开源代码和架构内置包,这使得程序员继续其他人工作更加容易。
- 10
专注于语言的核心部分,尤其hi那些支持网络。少注意用户界面元素,比如输出,窗口设计和技术等。
- 11
学习分布式应用设计与结构的课程。可以通过书本、网上教程或学术课程来完成。然而,十分有必要理解分布式应用的结构及其概念。
- 12
使用你所学的编程语言来了解服务部分建构和服务。
- 13
学习如下技术中一种或更多。推荐你每一种都了解以下。多数分布式应用程序员不会止于一两门编程语言,他们会每个操作系统各学至少一种语言。这是因为如果你希望你的应用“分布式”,你应该至少为每个主要的操作系统各提供一个版本。 公共对象访问代理体系结构(CORBA) 简单对象访问协议(SOAP) 异步JavaScript和XML(AJAX) 分布式组建对象模型(DCOM) .NET远程处理 XML 网络服务
库/平台/框架/核心编程
- 01
了解什么是核心编程。核心程序员几乎都是高级程序员,已经从编写应用转变为给其他程序员编写代码汇编。
- 02
学习一门支持创建可重复使用内容/包的编程语言,如果你还没学过的话。
- 03
学习一门UML 和ORM的高级课程。多数库开发者使用其中一种,或两种都用。
- 04
学习软件工程的课程。
- 05
学习至少一个模块,基于内容的、面对对象的和 事件驱动编程技术和概念。你所学覆盖越多编程范式和语言,你就能成为越成功的库/包程序员。
- 06
进一步了解不同的操作系统及其支持的编程架构。
- 07
集中学习独立平台架构、编程语言和技术。
- 08
如果到目前为止你学习的编程语言具有ANSI/ISO/EEE/W3C标准版本,那么掌握这些标准。无论何时尽可能使用标准代码。
- 09
尝试模拟简单的、已经建立的库,尤其是开源的库。这在成为库/包程序员的早期阶段十分有用。从简单的包开始,比如单位转换和中间科学计算包。如果你是大学生,利用你的非编程课程,尝试把这些课程的方程式与核心科学用作库。
- 10
在你的编程领域内寻找开源的包。首先下载包的二进制/可执行文件。尽量去用,并发现它的利弊。之后,下载源,尽量弄明白它是怎么完成的。尝试再创造这些库或其部分。刚开始,看完代码再做;之后,先做再看代码。后期阶段,尝试完善那些库。
- 11
学习不同方法。给程序员分发、配送内容。 通常,库/包程序员倾向于以递归和/或迭代的思想来思考他们面临的所有问题 。尽量把每个问题当作一个小问题的汇编(一系列更小的任务)或一个重复的不断缩小问题范围直至把这些更小的范围彼此堆到一起的处理过程去思考。 库/包程序员倾向于概括化。也就是说,当面临一个特定的简单的问题时,他们通常会想到一个更为概括的问题,并努力解决这个更概括的问题,如此,小问题便不攻自破。
系统编程
- 01
了解系统编程的定义。系统编程处理的是编程的“科学”,而不是具体的编程实现。不要把你自己栓到特定平台上。
- 02
跟着“桌面应用程序员”的前三个步骤。
- 03
学习线性代数的入门课程。
- 04
学习微积分课程。
- 05
学习逻辑学和/或离散数学课程。
- 06
了解不同的“准操作系统”。这可以通过以下途径完成: 了解操作系统是如何安装的。 了解在一台PC上如何安装不同的操作系统(不是必须的,但作为推荐) 安装不止一种操作系统。不要在系统中安装任何辅助包,相反,仅利用操作系统本身提供的函数。
- 07
学习计算机硬件结构的课程(或者作为替代,看看书)。
- 08
深入理解不同的计算机硬件平台。
- 09
初步熟悉你所选择的硬件平台/操作系统的汇编语言。稍后你会学习其他平台/系统的汇编。
- 10
学习ANSI C 和 C++ 语言,还有程序化程式设计的一些概念。
- 11
在你选择的平台上理解并实践C/C++标准库。尤其注意标准模板库(STL)和活动模板库(ATL)。
- 12
搜索网络资源、书籍和课程来理解你的平台独特的C风格。
- 13
用C/C++练习编写高级代码。
- 14
学习更高级的Assembly。
- 15
学习操作系统设计的课程。
- 16
寻找并阅读你所选择的平台的相关文章。如果你选的是基于Unix的操作系统就会容易得多。充分理解你今后将要用来工作的系统。
- 17
练习你已经掌握的知识。首先创建小的系统软件。如下通常很有用: 试着重创你系统中已有的小工具。 试着把其他系统中的应用移植到你的系统里。
- 18
以最有益的顺序学习语言。此处是唯一强调第一门编程语言的地方。首先学习ANSI C 而不是 C++、C#、Java 、D。然后学习 C++。 限制你第一门语言仅为C是因为系统编程要求程序员熟悉如下概念: 源代码真实、完全的编译 低级对象输出文件 链接二进制 低级机器语言/汇编编程。C语言被某些人认为是伪饰过的/更容易学习的汇编语言。只要你愿意,它还支持插入汇编语言代码,并且它只是程序化的(像汇编)。
编程科学
- 01
了解编程科学家是做什么的。编程科学家是十分高级的程序员,他们不开发程序,但他们研究计算科学,比如密码学、编程语言和数据挖掘算法。没有深入的学术研究是很难达到这个水准的。
- 02
累积和四年制计算机科学学历同等多的科学知识。可通过如下其中一种完成: 获得真实的学术学历(这也是通常情况)。 从现代大学中获得该学历要求的课程大纲,自学课程或 分开一门门学。理论上这样做也可以,但还是推荐第一种做法。
- 03
选择特定的领域。越具体越好。这取决于你的偏好。但是这里给出计算机编程领域中一些主要的课题: 算法设计(例如搜索、分类、密码、解码、错误检测 等) 编程语言/编译器设计/最优化 人工智能领域(模式识别,语音识别,自然语言处理,神经网络) 机器人技术 科学编程 超级计算 计算机辅助设计/模式(CAD/CAM) 虚拟现实 计算机图形学(计算机图形学通常和图形设计或图形用户界面设计混淆,计算机图形学是研究如何表示和操控计算机系统中的图形的领域)
- 04
考虑获取更高级的学历。或许你想追求硕士学历或博士学历。
- 05
了解你选择的编程领域的相关技术和编程语言。