软件工程师入门教程--KaYiCRM实录(1)

来源:互联网 发布:mac 怎么用excel 编辑:程序博客网 时间:2024/05/23 16:30
介绍

作为一个程序员和培训师,在过去的一些年里写了很多程序,上了一些课。一直以来我都想写一本能够帮助那些想要学习软件开发的人轻松地进入学习的教程,现在终于可以动笔了。我无法为这本“教程”想出一个很好的名称,就暂且叫它《软件工程师入门教程》吧。

这本教程主要是从初学者的角度介绍软件开发是怎么回事,以及怎么学习它。相信我,做软件开发其实是个很简单的事情,程序员也只是个很普通的工作而已。

这不是一本关于某种特定的编程语言的教程,比如Java或C#;这也不是一本能够让人能成为顶尖高手的书,因为本人都不认为自己是个高手,如果我写的内容大家觉得有错误、或者有待商榷的内容,欢迎写邮件给我:hexh@18days.org, 或者在这里回帖。

写程序和做软件

写程序和做软件是不一样的。这个话题让我想起令人尊敬的、我的第一个老板周苏老师讲的一句话:

“我们这里是车间,不是研究所。”

我想这句话最好地诠释了“写程序”和“做软件”的区别。

写程序就是通过编写一系列的指令,让计算机完成你想要让它完成的任务。

而做软件是不一样的,我的理解是——在指定的时间内,编写符合客户要求的、有效的、实用的和高质量程序,并确保能赚钱。

写程序是编写一系列计算机可以执行的命令,让它做你想让它做的事情。这些命令一般和英语很类似,也有人想用中文来写这些指令(比如“易语言”),但是以我的看法还是英语比较爽,试想有下面的程序用中文写是这样的:

如果 年龄大于18并且性别为男
{
  打印(”hello,world”);
}

而用英文显然会少敲很多次键盘:

if (age>18 && gender==male)
{
  printf(“hello,world”);
}

编写这些“程序”可以使用不同的语言,其实就是不同的标准和规范而已,这个问题暂时我们不展开讨论,我也不愿意讨论Java和C#谁更有前途这样的问题,尽管这个问题会被很多初学者问到。这个就如同我问你馒头和米饭谁更好吃一样,不同的情况下有不同的答案。

是的,我们需要使用一种类似英文的语言来控制计算机,这不是一件很难的事情。

而我们的客户,通常我们把它们叫做“最终客户”,他们并不愿意学习怎么来写程序,所以他们出钱,请我们来帮他们写程序,我们可以把自己叫做“软件工程师”,这样听上去更体面。

我想,我们首先要强调的是——软件工程师是为客户服务的。一个好的软件工程师,他不仅仅要能够写程序,还能够使客户满意,只有这样客户才会给我们开支票。

因为只有客户才知道他自己需要什么样的软件(至少听上去应该是这样的),所以我们首先要能够和客户进行有效的沟通,了解客户需要的是什么。

看起来这是一件很容易的事,但执行起来却很麻烦,很多耗资不菲的项目最后失败就失败在这里,原因很简单——软件工程师做出来的东西并不是客户想要的。

这听上去很荒谬,但事实经常如此。

软件开发过程中首先要做的就是了解客户的需求,但我们和客户之间有一道“沟”,简单来说,客户不是学计算机的,我们也不懂客户的专业,所以与客户的沟通总是存在障碍的。客户心里会想:“这么简单的东西,还需要我跟你讲吗?”,而软件开发人员会嘀咕:“这人什么智商,怎么说话总也说不清楚”。

还有些时候,客户以为他说清楚了,软件开发人员也真的以为自己听明白了,而真相不是如此。这种情形下下做出的软件系统就南辕北辙了,再加上有些杀千刀的销售人员给客户承诺了一个根本不可能实现的工期,在多方的压力下,我们不得不很快进入设计和开发阶段,而忽视了最重要的需求调研,这样,我们就可以成功地做出一个客户不想要的软件系统。

很遗憾,我们是为客户服务的,如果我们做不出来客户想要的东西,还是那句话——拿不到支票,这是很悲催的。

还有一个原因,其实很多时候客户自己也不明白自己想要什么,这也很荒谬,但事实也是如此。在软件开发领域有一个词叫做“需求变更”,所有人(除了客户自己)都很痛恨它却又无法避免,所以经常出现开发方认为系统已经可以验收了,而客户却觉得差的很远的悲惨局面。于是,有软件高手专门写一本书,叫做《拥抱变化》来安慰自己。

所以,理解客户的需求,帮助客户找出对软件系统的需求并确认它,就是软件开发过程中最重要的一步。这个比写程序要难得多。

可以松一口气的是,如果你是一个刚入门的程序员,公司通常不会把这个任务交给你,产品经理或者项目经理,或者其他水平比你高的程序员会去做这个工作。但凡事总有例外,如果你所在的公司只有三五个人,那这项工作也有可能让你来做,不要轻视它。

关于做需求调研的一些经验和方法(比如如何防止客户耍赖),在后面有专门的章节来阐述,我在这里首先提到,只是我在这上面吃过不少苦头,以至于我无法忽视它。

好了,我们进入下一部分——选择一个编程语言。

选择一个编程语言

如果你看一个人不爽,以至于想扁他一顿,那你首先要选择扁他的方式和工具。至于用拳头还是大棒取决于你的身体素质和你的心情,也影响了最终的效果。

如果你想要编程序,那你首先要选择编程的语言和工具。这个比扁人要麻烦一点,因为一旦做出选择,那么你在接下来的几年里将主要使用它作为你学习和谋生的工具。

因为我们这个教程是写给即将进入这个行业的人看的,所以我个人希望我们选择的语言符合下面的要求:

1.能用它找得到工作

如果你是一个技术爱好者,需要研究一下DOS下的QBasic如何实现一个常驻内存程序(TSR),我很有兴趣和你探讨,但是很显然这个我学习的第一个语言不能使你或者我在人才市场上找到工作,所以我们选择的语言应该是现在比较主流的编程语言。

2.学习周期不要太长

如果你是到了快要毕业才想着学软件开发的,你显然不想再用四年来学习它,我们希望这个语言尽可能简单一点,使用的工具尽可能好上手一些。
……

关于这个话题,我打算打住了,因为你在google上搜索“哪个编程语言更好”,你会找到约 5,100,000 条结果。

而事实上,我即使再列出更多的选择语言的原则,最终我也会在这本教程里选择C#,因为这是我吃饭的家伙,我最熟悉它,学习C#不麻烦,而且用它也找得到工作。

需要指出的是,在入行的初期,你可能只需要使用一种编程语言,你通过这种语言积累了项目经验,理解了程序设计的思想。那么在今后的工作中,你可以轻松地过渡到另一个编程语言。事实上我学习Java更早一些,因为在一个项目里客户需要使用C#, 所以我找了本书,看了前面的几个章节就开始能写C#的程序,然后开始慢慢积累经验了。我喜欢C#是因为微软提供的开发工具让我觉得更轻松。

所以,不要去纠结哪个语言更好,先入门就好。

关于C#

这是一个麻烦的话题。我必须讲一下C#是什么,以及它和它的冤家Java之间的关系。

在Java和C#之前,编写应用程序的语言有很多,主要可以分为:

n Basic语言
n C和C++
n Pascal语言
n ……(太多了,无法一一列举)

我们不需要一一学习这些前辈使用的语言,如同你不需要先认识你女朋友的奶奶再开始谈恋爱。计算机语言其实就是一组规范,它描述了使用这种语言编写程序的规则。学习一种编程语言,首先要学习它的规则,就像我们学汉语、学英语一样。

上面讲的这些语言所编写的程序,他们都有一个共同的缺点——“可移植性”不是那么好。所谓可移植性,打个比方,一棵植物从一个地方移栽到另一个地方,如果能立刻成活,枝繁叶茂,那么我们就说这个植物的可移植性好,这么说仙人球的移植性一定不错。

一个程序的可移植性就是指这个程序从一个类型的计算机,不加改动的复制到另一种类型的计算机上,如果能够直接运行起来,我们就说这个程序的移植性好。在软件开发过程中,如果程序的移植性好,就可以大大降低软件开发和部署的成本。举个例子,一个Java游戏,在你的Nokia手机和我的Moto手机上都可以玩,而不一定需要软件公司为两款手机开发两套不同的程序。

因为Basic, C和C++等等这些语言的移植性不是很好,所以在1994年出现了Java,它的标准是由Sun公司制定的。这种语言的卖点就在于可移植性,号称“一处编译,处处运行”(而实际的情况可能是“一处编译、处处调试”)。但总体而言,Java还是实现了强大的可移植性,也可以叫做“跨平台”。

跨平台看上去很美,所以很多公司都支持它,包括微软。微软也发布了Java开发工具——Visual J++。 但Sun很不满意,认为微软的Visual J++违背了Java的平台中立性(怎么可能中立呢,Windows可是微软最大的本钱),所以对微软提出了诉讼,微软被迫发表新的语言C#。C#语言取代了Visual J++,C#深受 Java、C 和 C++ 的影响。

所以我们说,Java和C#其实很有渊源,它的代码风格非常类似,类似到如果只给出一个程序片段,你都可能无法分辨它到底是Java还是C#写成的。

编程语言、开发工具和库

我们说编程语言是一组规范,学习编程的人需要学习某个具体的规范,比如C#, 比如Java.
但是只有规范是不够的,你学习了C#这个语言的规范,可以在记事本里写出一个程序,如:
  static void Main(string[] args)
  {
  Console.WriteLine("Goodbye,world\r\n");
  }

但是这个程序是无法运行的。计算机并不能够直接理解这些语言,目前所有的计算机的CPU只能执行由1和0组成的指令(这种语言叫做机器语言),而我们使用的C#和Java是用类似英语的词句编写的,叫做高级语言。

于是,在“高级语言”和“机器语言”之间,需要一个转换器,就像一个中国人和一个西班牙人交谈,如果他们不懂对方的语言,就需要一个翻译来转达他们的意思,这个翻译,叫做编译器。

编译器是一种程序,C# 有好几个著名的编译器(compilers):

n 微软自己推出的 C# 编译器(最标准的 C# 的实现)
n 由Novell 赞助的 Mono 项目提供了 C# 编译器
n Dot GNU 项目也提供了另一个自由版本的 C# 编译器
……

所以,如果你想你编写的C#程序能够运行,那你还需要一个编译器来编译它。当然他们是免费的。

我们还要面临一个问题,就是我们不想做一些重复的、枯燥的工作。而这些枯燥的工作可能是很多人都在做的。我这么说好像有点绕。举个例子,以前我们在写Turbo C程序的时候,如果想要取得鼠标所在的位置,就需要自己写一段代码,这听起来很麻烦,而当时确实有很多程序员都在做这件事。在软件开发领域里,我们称这种行为为“重复地发明轮子”。

为了提高软件开发的效率,有很多聪明人和大公司,把一些大多数程序员都需要做的工作(比如在屏幕上写一行子、画一条线,或者控制打印机操作、或者发送一条短信)都写成一个个子程序,这样一来其他的大多数程序员就轻松了,他们只需要在自己的程序里调用这个子程序,就可以快速实现自己想要的功能了。

有了这个,一个C程序员如果想在屏幕上写一行字,只需要使用:

printf(“hello,world”);

就可以了,他使用了一个叫做printf的子程序,他不需要关心printf是如何做到的,如果你想专业一点,可以把printf叫做“函数”,函数就是子程序,你现在可以这么理解)。

如果不使用这个子程序呢,就要麻烦的多,这种事情我干过,需要算出要输出的屏幕位置对应的显存地址,然后把hello,world送过去,这个太麻烦了,我们忘了它吧。

如果把这些子程序集合到一起,就成为“库(Library)”。比如在你的Windows目录下会有很多扩展名是DLL的文件,它们并不是可以自己独立运行的程序,但是很多程序都会用到它,不信你删掉它试试!

库是一个好东西,程序员们需要用它来提高我们的效率。库不一定是免费的,有些公司就专门做这些“库”来卖给别的软件公
司和开发人员,帮助别人节约时间也是可以收钱的。

对于C#来说,它也有强大的库来方便开发人员(不然谁用它呢),微软把它叫做“.Net Framework 类库”。至于为什么称作“类库”,我们将来再来纠结。

有了编程语言这个规范,有了编译器来帮我们编译程序,再借助于强大的库,我们基本上就可以写程序了。你可以用记事本来编写你的程序,然后调用C#的编译器来编译它,它就真的可以运行了,真的,没错。

但事实上大多数开发人员是不愿意用记事本来写程序的,因为我们要的更多。我们希望可以在一个友好的程序里编写我们的程序(而不是颜色和字体都很单调的、Ctrl+Z只能用一次的记事本),我们希望这个程序甚至能帮助我们发现自己程序中的错误,或者给我一些提示,而且可以方便的编译它…..等等),这个时候,我们需要另一个东西,就是“开发工具”,这些开发工具都是由一些大公司发布的。

每种语言都有流行的开发工具,比如你可以使用一个叫做Eclipse的软件来开发Java程序,Websphere也是用来开发Java程序的开发工具。

你可以使用Microsoft Visual Studio 2005或者Microsoft Visual Studio 2008或者Microsoft Visual Studio 2010来开发C#的程序,他们分布的时间不同。

这些软件都不是免费的,当然,如果你非要用一个下载的破解版本我也无话可说,而且一般不会有人来追究你。

微软是很欢迎我们学习他的编程语言的,所以他提供了一个精简版本,一个叫做Visual C# Express的开发工具,我们完全可以使用它来学习C#的开发,而且在我的工作中,我也主要使用它。

下载地址是:
http://download.microsoft.com/download/c/a/9/ca988e8a-c0ea-4813-88dc-c23a37ac2ac2/vcs_web.exe