1.Java在虚拟机上运行 Java源代码并不是被编译成为普通的机器代码。而是被翻译成为虚拟机可以执行的代码。一个Java解释器最终执行这些代码。这其中没有连接的过程;解释在需要的时候动态的加载一些类; 2.Java是完全面向对象的 Java是一种完全面向对象的语言。这意味着你对任何一个Java对象所做的动作都是通过一个方法实现的。第一点就是,再也没有没有主函数这样的 孤立的东西了。取而代之的是,你必须开始用一个对象的看法看待一个程序,一个类的对象。但是这个对象又什么对象呢?大多数Java程序只是简单的通过继承 Java基础类Object来实现所需要的东西,但是你可以通过创建程序基础类用于多个特性相似的应用程序来节省时间。 严格的面向对象的规定意味着理用原有的C/C++代码不可以直接不加改动的使用;系统调用也是这样的。C++中,你可以通过在C++正常的命名空间外声明extern”C”来使用原有的C的过程调用,包括系统调用。 在Java中,只有一个类似的安全回溯的方法,但是并不是十分简单的方法。你必须定义一个本地方法,其目的是为C语言提供接口,然后提供连接的介 质。Java环境提供了完成这种任务的工具,但是整个过程和C++中提供的extern比微不足道,完成使用C++类的过程则更加复杂,因为这样会引入对 C的借口和C函数和C++成员函数的问题。 幸运的是,许多常用的系统实用工具函数已经在系统类中的方法中提供出来,但是这些明显没有包含经过许多年来你所创建的那些类和过程。所以,在你需要的时候你应该去钻研一下。 3.Java中没有独立的头文件 在Java中,关于类的一切东西都被放到一个单独的文件中。方法的位置只可能在一个地方出现,一个方法的实现必须在它的定义过程中同时进行。这样 做得优点是在实现程序的时候不容易因为文件的非同步错误而失败,或者获取到一个没有实现的声明。类的声明可以被Java解释器利用甚至是从一个编译过的单 元中获取,所以不再需要有头文件,只要有编译过的文件。 这样做的缺点与我们编程的过程有关。许多C++程序员喜欢用头文件来代替文档。要看一个成员函数的接口参数,只需要看头文件中的声明即可。你可以 经常的看头文件即可了解怎样去使用这个类。在Java中,没有这样的总结。因为实现类方法的代码必须在方法定义的时候出现,而且,对于一个单独的函数的代 码来说就经常占据了一整页乃至更多。这样,很难通过看Java的代码就初步了解类是怎样使用的。你必须为你需要的类准备足够多的文档。不言而喻,再处理非 商业类库的时候文档是极度缺乏的。 在当先的Java环境中提供了两个工具来补偿这些,javap来打印类标识,javadoc为嵌入式程序提供HTML文档。 4.用Package来分解Java命名空间 在大的C++工程中经常遇到的一个问题是命名空间–怎样保证工程的一些程序员不会创建和另一些程序员一样名字的类?更糟糕的是,供应商可能会提 供一个包含和你的类一样名字的类的库。有许多方法可以解决这一问题,但是很可能在问题发现之前工程已经启动,改正错误是需要付出许多痛苦的。 Java通过”Package”这个概念解决了这个问题,Package有效地通过通过集合类划分了命名空间。在不同包内的两个同名的类仍然是不同的。关键问题就变成了类是否放置到相应的包中。 记住,Java并没有解决命名冲突的问题。扩展一个基类而引起了派生类的冲突。比如说,如果你最喜欢的供应商提供了一些类,然后你把它们用做基类 并且派生有一个foo方法的类,当供应商提供一个新版本的类的时候就可能出现,如果供应商业也在新类中提供了一个foo的方法。 5.异常是Java的重要特性 在C++中,异常和异常处理是十分深奥的事情;许多C++程序员从没有处理过它们甚至不知道它们是何物。异常是在正常的过程中出现的未预料的错 误,因此,它们不会从方法中返回,或者作为参数传入;但是,它们不能被忽略!这里的一个例子是计算一个书的方根的方法。正常的接口形式是将一个正数作为参 数传入方法,然后方法会返回一个正实数作为结果,方法可以检验这些并且在异常产生的时候抛出异常。在大多数系统中,程序员并不是必须这样做,这样,一个没 有考虑到的异常可以使程序不正常的退出。 在Java中,异常已经成为语言中非常成熟的部分。方法的说明中就包含了异常的信息,程序处理器也强制检验如果你使用了一个能够产生异常的方法, 你就必须检查异常是否发生。几乎所有的Java程序员都会遇到异常的情况,因为许多非常有用的库中的类都会抛出异常。处理异常并不难,但是在一些时候是需 要注意的。一个方法的文档会指明方法抛出的异常的类型。如果你忘了,不要紧,编译器会提醒你的。 6.字符串不再是字符数组 Java中包括了一个字符串的对象,并且是个常量。字符串不像字符数组一样,虽然可以简单的从一个字符数组构造一个字符串。你应该尽可能的用字符串代替字符数组,因为他们不会因为误操作而被覆盖。 7.Java限制了常量对象和方法 在C++中,你可以正式的声明一个函数参数或者函数返回值为const类型,这样可以有效的防止对参数或者返回值的不正当修改。另外,你可以声明一个成员函数为const,表明它不可以修改任何他操作的对象。 Java支持常量操作符,只读变量,这些通过final关键字实现。但是Java没有支持强制的使一个可写变量在函数传递、返回的过程中变为只读。或者定义一个不操作修改对象的常量方法。 在Java中,这个省略带来的影响和在C++中相比就非常小了,这很大程度上因为字符串变量和字符数组的不同,但是这也带来一个引起错误的隐患。特别地,没有办法检验一个方法是否可以改动对象。 … 继续阅读
运算符重载
(1) C++ 不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。 (2) C++允许重载的运算符C++中绝大部分的运算符允许重载。 不能重载的运算符只有5个: . (成员访问运算符) *(成员指针访问运算符) ∷ (域运算符) sizeof(长度运算符) ?:(条件运算符) 前两个运算符不能重载是为了保证访问成员的功能不能被改变,域运算符和sizeof 运算符的运算对象 是类型而不是变量或一般表达式,不具重载的特征。 (3) 重载不能改变运算符运算对象(即操作数)的个数。 (4) 重载不能改变运算符的优先级别。 (5) 重载不能改变运算符的结合性。 (6) 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与前面第(3) 点矛盾。 (7) 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。 也就是说,参数不能全部是C++的标准类型,以防止用户修改用于标准类型数据的运算符的性质。
友元、构造、析构
(1)
友元的关系是单向的而不是双向的。
(2)
友元的关系不能传递。
在实际工作中,除非确有必要,一般并不把整个类
声明为友元类,而只将确实有需要的成员函数声明
为友元函数,这样更安全一些。
关于友元利弊的分析:
面向对象程序设计的一个基
本原则是封装性和信息隐蔽,而友元却可以访问其
他类中的私有成员,不能不说这是对封装原则的一
个小的破坏。但是它能有助于数据共享,能提高程
序的效率,在使用友元时,要注意到它的副作用,
不要过多地使用友元,只有在使用它能使程序精
炼,并能大大提高程序的效率时才用友元。
A:构造函数:
构造函数是一种特殊的成员函数,与其他成员函数不同,不需要
用户来调用它,而是在建立对象时自动执行。构造
函数的名字必须与类名同名,而不能由用户任意命
名,以便编译系统能识别它并把它作为构造函数处
理。它不具有任何类型,不返回任何值。构造函数
的功能是由用户定义的,用户根据初始化的要求设
计函数体和函数参数。
有关构造函数的使用,有以下说明:
(1)
在类对象进入其作用域时调用构造函数。
(2)
构造函数没有返回值,因此也不需要在定义构
造函数时声明类型,这是它和一般函数的一个重要
的不同之点。
(3)
构造函数不需用户调用,也不能被用户调用。
(4)
在构造函数的函数体中不仅可以对数据成员赋
初值,而且可以包含其他语句。但是一般不提倡在
构造函数中加入与初始化无关的内容,以保持程序
的清晰。
(5)
如果用户自己没有定义构造函数,则C++
系统
会自动生成一个构造函数,只是这个构造函数的函
数体是空的,也没有参数,不执行初始化操作。
a:构造函数重载:
(1)
调用构造函数时不必给出实参的构造函数,称
为默认构造函数(
default constructor)
。显然,无参
的构造函数属于默认构造函数。一个类只能有一个
默认构造函数。
(2)
如果在建立对象时选用的是无参构造函数,应
注意正确书写定义对象的语句。
(3)
尽管在一个类中可以包含多个构造函数,但是
对于每一个对象来说,建立对象时只执行其中一个
构造函数,并非每个构造函数都被执行。
B:析构函数:
析构函数是与构造函数作用相
反的函数。
当对象的生命期结束时,会自动执行析构函数。具
体地说如果出现以下几种情况,程序就会执行析构
函数:
①如果在一个函数中定义了一个对象(
它是
自动局部对象)
,当这个函数被调用结束时,对象
应该释放,在对象释放前自动执行析构函数。
c/c++初学
编程及C/C++初学者 FAQ
本文原为本人在论坛所发若干帖,意在集中解决新手学习C/C++语言时将遭遇到的各类问题,网友反馈情况良好,集合修订后作为个人作品贴于此处。
本贴主要分析概念原理和解决方案,不讨论具体程序语法,立足于让初学者能运行起第一个程序。其他事宜如解释入门语法等本文基本不涉及。
本文依照 创作公用约定(署名-非派生作品-非商业用途) 发布。作者(即本人)无更新计划,请勿与作者联系。
作者:碧蓝右耳。
联系方式:BlueAuris@gmail.com
版本号:3.0
完成日期:2008-03-10
=========================================分割线================================
目 录
一、开始之前
FAQ 那是什么
为何有这篇FAQ
编程为何物
如果这就是编程,那语言是怎么回事
我为啥要学编程
听说编程很难,是真的么,那我能学会吗?
我真的可以么
还一定要有台电脑么
好吧你说服我了,我打算开始,该怎么做
那么,下一步怎么干
我碰到问题了,谁能帮我
我能看懂别人的程序,但自己做就觉得无从下手,怎么会这样
我英语\XX不会,咋办
关于态度、情绪和其他
二、选择C/C++语言
C语言是什么
C++语言是什么
为何要选择纯C
C/C++语言和其他语言有什么关系
我为什么要学C/C++语言
Python语言 作者的另一推荐
三、一些重要的概念—–计算机原理
编程的对象是什么————计算机
程序到底是怎么回事————是操作而不是结果
为什么要编程————因为机器的特点
你们老是提到编译器,那是什么—–代码翻译机
给我解释下啥叫编程语言————各路江湖武功
语言之后要确定的事情——操作系统和平台
编程时什么东西最重要—-源代码
我的程序和一般的程序不一样,什么原因————控制台和图形界面的差异
好像不能建立一个单独的文件来编译————工程和项目的问题
难道一切都要从头干起————函数、API、类、控件、开发包与软件复用
关于图形库的补充说明——–可选择的图形库
四、教材、习题和示例
能推荐几本好书么
首先是纯C的教材
然后是C++的教材
接下来是Windows编程
Unix/Linux/BSD系统
数据结构和算法
各种图形以及其它库
软件工程思想
找书的诀窍
光看书似乎不解决问题,难道要做题
OJ是什么
哪里有可用的OJ
哪里有代码示例可看
五、选择编译器
有哪些编译器可用
还有些可以配合编译器的开发环境
他们在哪里
怎么安装他们—-特别解释 MingW版GCC的安装
六、TC下常见的问题解决
用TC创建第一个程序
TC的库路径设置
TC下的图形编程设置
我的程序在TC下可以编译,在VC/GCC下为什么出错
七、其它编译器问题
用VC创建程序
用DEV-CPP创建程序
用MingW创建程序
用Lcc-win32创建程序
八、结束语
程序员成长的六个阶段
=========================================分割线================================
一、开始之前
FAQ 那是什么
FAQ就是Frequently Asked Questions,也就是常见问题解答。这玩意儿通常是一些所谓的高手或者前辈为了节省回答新手的大量简单重复问题所耗费的时间精力而采用的一种偷懒手法。一旦完成,高手只要一努嘴,“看FAQ去”就万事大吉了。实在是居家旅行杀人越货之必备良药,因此在各大论坛已经有大泛滥的趋势。
本篇FAQ为学习C语言、C++语言的大量新手编写,重点是如何运行起第一个程序,不涉及语法、数据结构和算法等内容。如果你已经通过计算机二级或水平相似的考试,甚至你是职业选手或是大师级的人物,就不必再往下看了。同时,本FAQ只讨论C/C++语言,其他语言如Java VB python等均不涉及,虽然阅读本文前四章节也会对学习这些语言有所帮助,但深入学习还是请阅读这些语言的专门教材。
为何有这篇FAQ
本文是为那些对编程新手所准备的,如果你自认已经不是新手,那么请离开把时间放到更有用的地方。如果你是那种对编程一无所知,迫切想知道他是怎么回事,或者仅仅编写了几个小程序,却遇到一大堆问题,而在论坛或是其它地方又得不到帮助,但心中又有雄心壮志想要做绝世高手顶尖黑客或者想要以程序为生的入门级新人,那么你恰好是本文的服务对象,请详细阅读以下的文字,我想应该会对你有所帮助。而且请你了解,本文的这部分内容所要介绍的是那些普遍性的概念,与具体任何一种语言都无关。
正如我们所知,市场上充斥着无数的编程教材,同时可以肯定的是,目前已经面世的教材(包括正式出版物和网络上的教程),穷一人一生之力是看不完的。在这些书中,有大量的垃圾书,大量的平庸之作,还有少量的精品。而即使是这少量的精品,也不可能看全。既然书这么多,我为什么那么闲还要来写一篇呢,有这时间,我还能多画几张效果图挣俩钱花呢。
情况是这样的,市场上的书虽多,但其中几乎没有几本是面向初学者的。我所指的初学者,是指从来没有编写过程序,甚至是连编程二字都没有听说过的人。这样的书是如此之少,以至于要去购买或是阅读到他们都是很困难的事。在我个人的学习生涯中我认识到很多编程教材有个糟糕的倾向。他们要么是一下子告诉你所有的事,好像你能在千分之一秒中突然从菜鸟变成好手,要么就是认为有些事你早就应该知道,拿你当熟手看,导致你有一种赤身裸体被抛弃于猛兽横行的非洲旷野的感觉。你还没有穿上衣服走出帐篷,连刀子都没有摸过,他们就试图告诉你草原上有多少可以捕获的猎物以及他们的位置,告诉你几百种武器和毒药的使用秘籍,告诉你两百条以上的陷阱安放要领。你没有经过丝毫的练习,甚至还没有杀死过一只刚出壳的小鸡,他们就要你独自去捕猎数十头饥饿的狮子。这种看似荒谬的情况从过去持续到今天,至今仍然存在。这并不是说那些写教材的朋友都是傻瓜,这件事当然有它的原因,因为他们面向的读者是程序员。程序员就象是猎人,他们更换语言就像猎人更换武器一样,不管他使用哪一种武器,捕猎的基本原理没有变化,变化的只是武器的使用方法。对一个成熟的猎人而言,再强调基本原理就没有必要,所以教材们对人所共知的一些事也就避而不提。一个成熟的猎人,她心中的捕猎知识是浑然一体的,武器的选择,野兽的习性,陷阱的安放,怎样做和为什么这样做都结合在一起,没有哪一部分可以独立出来,一部分一部分的教给别人是极度困难的的,要教就只能混杂在一起。程序员的情况类似,知识体系是完整系统的,谈到一个问题总会牵扯到另一个,最后的结果就是别人总是希望并想当然的认为你可以一口吃成一个胖子。
这样的后果就是,一些很明显的事情,老手认为那是你应该知道的因而不予回答,而新人却发现没有任何地方可以找到解释,也不知道该到哪里去找答案。(不懂得如何找答案也是新人的特点之一)。有一个典型例子与这种情况很类似,鼠标,我们已经习以为常并且很熟练地使用着,但是很多第一次接触电脑的人那却是完全摸不着头脑的东西。在各地的论坛里,总有大量的新人提出诸如“学C++好还是VC,VC++好?”“C++也可以编窗口程序吗?”这样的毫无常识的问题。我的FAQ就是为了来一次性解决这种问题的。
编程为何物
编程就是编制程序。程序是让计算机发挥功能的命令的集合。程序有两种形式,让计算机真正执行的是电脉冲形式,叫机器码,程序员编制的通常是文本形式,叫源代码。使用一个称为编译器的工具,可以把源代码转变为机器码。而编程就是产生那些源代码的工作。这个工作类似于谱曲、编菜谱、写工作手册。我们知道,谱曲并不是一蹴而就的,往往需要反复的修改,直到最后满意为止,编程也是一样,接近工作时间的30%是完成粗制成品,剩下的70%时间是在不断的修改,这是相当枯燥和乏味的。有志于投身编程的朋友们,不要忘记这一点。
如果这就是编程,那语言是怎么回事
文本形式的源代码,其实有些规定的。就像我们和老美用英语交流。首先你得说英文单词,不能冒法语词汇日文假名出来,其次你得按语法讲话,不能一个个单词往外蹦。程序也同样有词汇和语法上的一些规定,这些规定就构成一门语言。显然任何一门编程语言都是人造语言。人造的东西,因发明人的想法而不同,就形成了不同的语言。
我为啥要学编程
这个问题有两层意思。首先是编程为啥要学,很简单,因为这玩意不是生来就会,就像木匠活一样属于一门手艺,自然要通过学习才能掌握。你怎么也得花上几年来学英语不是。
第二层涵义才是重点,为啥我要学它。答案因人而异。有人为了上学有人为了考试,有人为了求职挣钱,还有人就是吃饱撑没事做自虐。什么为了开发智力啊证明自己啊寻找成就感啊,那都属于自虐,在下便属于自虐一族。没啥说的,确定你的目的,也许只是好奇想接触下啥是编程,也许是有课业的任务,也许是想以后靠他找工作,或者是羡慕那些黑客。总之,想继续深入的,往下看,没信心的趁早走人,外面帅哥美女多的是,不要浪费大好时光青春年华在一台破机器上,ok?
听说编程很难,是真的么,那我能学会吗?
你觉得说中文难么?你能流利的说普通话是不是。但是你知道么,汉语是世界上最难学习掌握的语言。稍后我会介绍计算机的特征,你就会明白知道基本上编程这件事的难度等价于指挥IQ<20的壮汉。任何一种计算机语言的难度都不会超过英语,更比不上汉语。那么你认为你能不能学会编程呢。
请记住学会和学好是两个层次,就像中学生作文和报刊出版物之间的差异。达到学会那个程度,只要有小学三年级的知识基础就可以开始了,也就是识字就行。而如果要学好,那需要初高中毕业的文化水准,也就是应该略懂英文和解析几何。当然还有更高的技术层次,比如在相当于职业作家的水平上,你将被称为专业程序员。而如果你被称为大师,那就是诺贝尔文学奖。抵达那个程度需要付出艰苦的努力,至于怎么达到,不在本FAQ讨论之列。
我真的可以么
如果你已经看完前面的部分到达这里,显然你是确实想要学习编程的新手。不论你是为了什么目的来学习,在看了我上面的话之后是不是很有信心呢,不过我要打击你一下,不是谁都学得好编程的。人人学开车,但不是谁都能上赛道,舒马赫更是只有那么一个。
就像有些惊险刺激的游乐设施禁止高血压心脏病患者参与一样,编程作为一项耗费智力和体力的活动,对参与者也有一定的要求,先来看看吧,满足这些条件,你就可以放心大胆的开始。
先说体质要求。太祖说:身体是革命的本钱。健康的身体对编程大有益处,但并不是说残疾人就不能参与。就目前的技术水平,除了脑瘫和目盲这两项,其他的肢体残缺根本不妨碍。霍金先生在这样严重的情况下还能持续研究的事实,还不够激励你么。
紧随其后的是足够的精力和时间。Dear friend,只要你能静坐20分钟安静的看完这篇FAQ,你的体能就达标了。如果你想告诉我,你能够一天在电脑前连续操作18小时以上,我要说的是,年轻人,虽然你很威猛,但请注意保养身体。只要每天您能抽出30分钟来学习,那你的时间也合格了。当然有更多时间确实会更好,不过也没必要每天12小时,编程并不是世界上最重要的事,我们还有别的事要做(这是对非职业选手说的)。必须认识到,学习编程重要的是持之以恒,而不是依靠爆发力,每天半小时比一周一次6小时效果好的多。
第三个要求是你要略微懂一点计算机。不错,只要略懂就可以了。因为这正是本文的主要目的:向略懂计算机的人介绍编程。那么,怎么才算略懂呢。
如果你能够前往这几个网站并浏览:www.google.com www.acm.org 和www.csdn.net,那么你的水平已经超过我的想象,完全能胜任接下来的学习。不用现在就前往,你知道怎样操作就可以了。
如果你还不会上网,没事。你会不会打字,不需要打得很快,也不需要会打中文,只要你能把键盘上的26个字母和十个数字挨个输入一遍我就认为你已经通过。然后,对于Windows用户,你能不能打开记事本程序,在里面打几个字并且存成一个文件。如果你说能,OK,你合格了。
你还不会打字或是不会用记事本?这样的话,你最好还是先学一学基本操作,否则本文对于你实在是毫无用处。
你找不到记事本程序,请让您边上的人指导一下,可能你还没有安装这个程序。有可能您不是Windows用户,联系给你装机的人或公司,或是你们的网管,让她给你可用的文本编辑器,通常会是vi或Emacs,当然也可能是别的,只要你会编辑并存储一个文件,就可以了。
你连电脑都没见过??@#$%^&*!!!! 这样的话,本教程对你根本没有用处,你还是看见过电脑以后再来阅读本教程吧。
最后一点,你需要有顽强的毅力。编程并不象你想象的那样轻松,不是野餐和聚会。尤其是对于职业程序员都应掌握的C++,她可以用两句话来形容:三年不开张,开张吃三年。千万记住,C++被称为是真正的程序员使用的语言不是没有理由的,她的复杂度和性能超出你的想象。有无数的编程新手,在第一个月不到就放弃了,你最好确定你不是他们中的一员。毅力没有尺子可以来度量,在这里我只能先祝愿各位读者都能坚持到最后。
还一定要有台电脑么
不幸的是,到目前为止,是的。在老年时期,贝多芬可以凭空作曲而不依靠钢琴之类的东西。但几乎没有哪个程序员不依靠电脑而只在大脑里编写,尤其是开始学习的阶段。
作为编程的另一方面,一台合适的计算机也是不可缺少的。用各种语言所编写的程序被运行在各种各样的机器和设备上,从掌上设备到巨型服务器,从台式电脑到微波炉,所有能够自动运行的地方都有程序的身影。但是很遗憾,并不是只要能够运行的设备就可以用来进行编程的,这就像虽然可能洗衣机也能发出悦耳的声音,但你不能指望用洗衣机来录制流行歌曲(嗯,也许SONY有这样的产品,我保留意见)。我们主要还是用个人电脑来学习编程。目前大部分语言,所需要的电脑并不如你想象的那样高级(.net系列不在我们的讨论之列,他的集成环境对系统要求很高)。就我所知,即使是主频只有30MHz,640K的内存,也是可以用来编写小规模C/C++程序的,只不过感觉不是那么畅快而已。当然作为学习,我们还是需要有比较称手的设备。不错,最重要的就是称手两个字,所谓称手,就是不会由于设备的问题,妨碍你的思考,不需要高速的处理器,也不需要巨大的显示器,更不需要海量的硬盘,只要称手。编程不是豪华海上旅游,而是修行。修行不需要五星级饭店,但也要有破屋以遮风雨,否则感冒发烧了,怎样来修行呢。那么还是来谈一谈电脑的要求吧。
只要你的电脑能运行DOS,就及格了。如果能够比较好的运行Windows 98操作系统(说实话,98死机是免不了的,只要不常死机就可以),硬件上就达到80分的要求了,如果能运行Windows 2000的话,那已经是满分了。如果比这还高档,那简直好的超出想象,甚至可以参加奥运拿金牌去。满分的那种设备,能够流畅运行.net环境的,在2008年1月份,全新的低于人民币一千元,二手设备甚至三百元不到。如果你实在囊中羞涩,可以考虑到毕业前夕的大学去碰碰运气,也许能遇到大肆的前辈们送你一台。在你看到本FAQ的时候,去任何一个电脑商场,随便购买一台,都可以符合要求。在下强烈建议你买一台自己的设备,那种自由是公共机房无法给予的。当然你执意要去机房的话,我也不反对。但你能看到这份教材,就连一台能运行win2000的机器都弄不到吗,怎么说现在也已经是双核时代了。
我希望你的机器上装着以下操作系统之一:Windows 2000, FreeBSD, Windows XP, Windows98, Linux ,MS-DOS或任何厂商的UNIX。我强烈推荐使用WindowsXP+SP2和FreeBSD这两个系统进行学习,本文中所有的程序在这两个系统都可以顺利运行通过,我将详细介绍在这两个系统下的设置,这对新手尤其重要。当然我也没有忘记其它系统的兄弟,相应的设置也不会遗漏。我没有提到Mac OS系列是因为我对她还不熟悉,但我不反对你拥有她。如果你的机器没有以上任何一个操作系统,请联系提供给你机器的人,如果不是你的机器忘记安装操作系统的话,那她极有可能是军方的机密设备,总之你小心为妙。
软件方面,依据不同的语言需要安装不同的软件。
如果学习C/C++。使用FreeBSD,Linux,Solias等UNIX系统的,推荐安装GCC,该程序是默认被安装的,总在系统的某处,初学者不必考虑版本问题。使用Microsoft操作系统的,建议使用VC 6.0或VC2005/2008,或者GCC的windows移植版。由于版权问题,如果不想破费的话, VC6要用VC2005的免费学习版来代替,BCB的命令行编译版和GCC的Win32版本来就都是免费的。GCC的Win32版有Dev-cpp,MinGW等不同发行形式。
其他语言都要按照相关的资料安装和设置。比如本文作者偏爱的Python语言,那是非常的方便,只要去python的主页直接下载对应不同平台的可执行包既可。
这些编译器怎样安装和设置我会在随后的章节里详细说明。毕竟,好多人的学习热情就是被这样的细节所消耗掉的。
除此之外,拥有以下两件法宝将使您如虎添翼。
一:一个被大家称作高手的喜欢玩计算机的人,这种人通常被叫做黑客或者极客。拥有他(她),你在遇到问题的时候,可以求他帮忙。记得给他点好处,吃个饭什么的。
二:便捷的Internet连接。可以上网意味着你可以干很多事,譬如可以和线上的高手(譬如我)即时联系,到论坛和usenet寻求帮助等等。这在有时是极有价值的。
好了,不要着急,还有一点点准备工作我们就可以出发了。
好吧你说服我了,我打算开始,该怎么做
首先确保你的健康状况和基本计算机操作水平,我上面说过的机器也已经找好了吧,从来没听说谁没有电脑就能学习编程的(以后科技进步到人机合一的程度,也许可以实现)。如果能有网络连接,那简直达到了完美的境界。
没人可以无师自通,天才也不行。所以你要做的第一件事是找一本好的入门教材,最好是经典作品。反复地看教材,要牢记一点,你所提出的大部分问题,教材上都有解释,只是你没有认真看而已。反复地阅读,直到你觉得你已经可以编写出那本教材了,才可以丢弃他。教材比老师好的理由之一是,你可以带教材上厕所去卧室,而老师不行。当然,老师也有比教材优越的地方,那就是他可以给你解释教材上没有的问题。但记住老师也是人,你不动脑子就去找他,他会厌烦的。不要鄙视你的老师,即使他其它方面不如你,至少在编程这件事上他能做你的老师就是他比你强的硬道理。
你以为光看语法书和背诵单词而不练嘴就能说好英语么,显然不对。编程也是,熟能生巧在任何地方都是一样的。首先看懂教材上的那些例子,确保看懂之后,按着他的思路把它默写出来,当你尝试过就会知道看懂和默写是两个完全不同的程度。然后就可以做书后面的习题,独立想,不要看答案或提示。等到整本书后面的习题你都能做对的时候,你就算入门了。然后去找等级考试二级三级的题目来做,等到也可以准确无误的时候,恭喜你,C语言(或者其他语言)可以算是通过了。如果你的目的是去考试,现在就出发吧。但如果你想要以编程谋生,sorry,你还欠火候。这其中的差别就相当于大学英语四级作文和畅销英文小说之间的差异。
那么下一步怎么干
只需要考试的朋友,不需要看这一段。想谋生或自虐的这边请。
通过C语言(或者其它语言)考试只是编程的第一步而已。你掌握了大量的单词并且熟悉语法还不能让你写出优美的英语小说。你要学习修辞手法、谋篇布局这类文学技巧,也需要掌握历史典故、谚语俗话和文化背景这些文字外的东西,如果要畅销,还需要超凡的主题生动的故事跌宕的情节。编程圈子里有和这些类似的玩意儿。
算法和数据结构就是程序里的修辞手法谋篇布局。人类编程虽然不过几十年,但运用程序所解决的问题,已经覆盖世界的每个角落各个方面。各种各样的问题,被前辈的大师提炼归纳。有些人们直接找出了解决的方法,有些人们找到了寻找解决方法的途径,还有些人们索性证明了在现阶段是不可能解决的。这些解决方案就被统称为算法。学习算法就是学习前人的智慧,少走弯路。连牛顿爵士都是站在巨人的肩膀上,除非你自觉比老牛还牛,凭空就能解决别人十几年才想清楚的问题,那我也无话可说。
学算法很简单,也是找教材,做习题。教材容易找,但新手往往找不到合适的习题。我的建议是,在完成教材上的所有习题之后,可以去找编程竞赛的练习题来做,也就是所谓的OnlineJudge,我会在后续深入讨论这个东西。
相当于历史典故、谚语俗话、文化背景的东西,就是各个编译器和平台上的接口和库了。假设现在有个程序要读写文件,不要误认为你需要亲自写个程序去控制硬盘的磁头伸缩,或者是光驱的透镜移动或者是U盘的地址定位。除非你是想做个window或者Linux那样的操作系统(那样的兄弟会来看这篇FAQ还真是奇迹),否则所有包括文件操作、网络通讯、人机界面(键鼠屏打印机)这些,都是由操作系统提供的现成模块,只等着你来使用。这些模块通常称为应用程序接口,不同的操作系统提供的不一样。在接口的基础上,很多编译器和程序员做了进一步的包装形成了库,你可以比直接使用接口更方便地使用这些库而达到同样的功能。
由于系统的不一致,编译器的不同,所以在学库之前,先要确定你所要工作的平台和环境,还有应用方向。Windows下编游戏和Linux下做数据库用的库是大相径庭的。然后就是同样的一套步骤,找教材,做练习。这个教材通常就是官方文档,windows下最好最全的就是MSDN,Unix/Linux平台有大量的文档,分布于man页和各种手册上,其他平台自行搜索。可以去找习题,但更好的方案是去找一个实际的小型应用,在使用中学习效果无与伦比。编写一个QQ或者BT,绝对能让你对网络操作部分了如指掌。在这个阶段,你已经可以写出实用的程序了,为什么还要执着于做题呢。
优秀的文学作品有个共同的特征,他们虽然立足于不同的本民族文化,但却关心全人类共通的思想感情,体现着终极的人文关怀,我们都会为奥塞罗流泪不是么。优秀的程序虽然应用方向不同平台各异,但他们一定完全符合计算机原理,用最合理的数学模型来展现。如果你想成为合格的程序员,计算机原理和相关的数学知识是一定要补习的理论课。
除了看书和做题之外,还有一个内容不可缺少,就是阅读别人的程序。没有哪个作家不大量阅读别人的作品,同样你也可以从别人的代码中吸取营养。代码就是程序的全部,是真实的实现方法,一切都在代码中,甚至有时长篇累牍的说明还不如几行代码清晰明白。今天的程序员是幸运的,开源运动的发展使得他们能够无偿而方便地得到世界上最优秀的并且是实际运作中的代码,几乎遍布任何应用领域。只要你有心,可以找到任何想要的代码。但读代码也是辛苦的事,请阅读和你水平相当的代码,差距太大将会是严重的身心打击。
学习库和学习算法可以同时进行,在你完成这两个阶段的时候,你已经是一个合格甚至是优秀的程序员了。
超凡的主题跌宕的情节,这个东西其实就是你的程序的应用方向。如果说前面都是练习的话,这就是你自主创新的时候到了。很多人都只是在老板的安排下为了工资而被动做些既不喜欢又没有价值的流水线产品,少数人才有机会做自己喜欢的东西。想想看,QQ、3DMAX、WOW、IE、Apache甚至Windows都是多么知名的程序,有朝一日你的程序将会和他们一样知名。不过我还是不得不给你泼冷水,这需要不懈的努力、敏锐的眼光和少量的运气,只有极少数的程序员能做到这一点。不过,有梦想才能不断前进,不是么。
我碰到问题了,谁能帮我
郑钧说,记得没人会同情你,我亲爱的兄弟。这真是至理名言。编程这件事,基本上是不能指望有人帮你的。
当你遇到编程遇到问题,首先应该是去看编译器提供的信息。它可是最直接的来源,相当于案发现场,从没听说刑警不看尸检报告就直接破案的。现代的编译器已经不止编译那么简单,编译本身就能送出大量的提示,调试功能更是强大到可以让你检视程序运行的每一步都发生了什么变化,只要你能看懂。机器的问题,就应该用机器来解决,而不是用人的肉眼去检查。
然后就去查教材和文档。手边的教材能解决70%以上的问题,如果还不够,上网去查。如果找不到,请记住有个东西叫搜索引擎,国内最著名的两个,google baidu。99%的问题可以得到解决。
如果你有老师,可以试着向他请教。不要抱太大的希望,虽然他收你学费,但他也不是万能的。
如果还是不行,确认你已经努力过而没有答案,那么你可以考虑提问,去论坛、新闻组或者群,都可以提问。
在你确定要提问之前,请先阅读这篇文章《提问的智慧》
http://www.chinaunix.net/jh/29/8675.html
http://www.vcgood.com/bbs/forum_posts.asp?TID=1581&PN=1&TPN=1
这个也行,《提问的智慧 图片版》
http://bbs.chinaunix.net/viewthread.php?tid=750796&extra=page%3D1
http://www.vcgood.com/bbs/forum_posts.asp?TID=1573&PN=1&TPN=1
我能看懂别人的程序,但自己做就觉得无从下手,怎么会这样
正如你所知道,刚开始学习的时候,我们总会作一些习题,等到后来涉及实际的应用程序,我们也可以把它们都看成是大型的习题。这个问题就变成了,为什么你能看懂别人的解题程序,而自己写不出来。这个问题其实每个刚开始学习编程的人都会遇到,你所见到的各位达人大牛都曾经有过这段经历。所以不要为这种情况而怀疑自己的能力。
为什么会有这样的情况出现呢,因为思维模式。
在小学的数学教材里,有一种题型,叫应用题。他会给出很多生活中的场景,然后让你用数学知识来解决。在解这种题时,其实分为三个步骤,首先是要提取出数理模型,比如常见的追击相遇这类问题,就要使用速度时间模型,然后把这个模型数学化,找出各个变量之间的关系,确定已知量和未知量,形成可求解的方程,最后求解。
编程的情况与此类似。首先要建立一个抽象描述模型,然后建立数学表达,接下来略有不同,不是亲自求解,而是给出求解的方法,也就是算法,最后把算法转化为程序。而新人通常之所以会卡壳,是由于这个流程中有两个难关。建立模型不是问题,数学表达也不难,但找出算法却是非常艰难的事情,即使找到正确的算法,要把它写成正确的代码也不容易。新人常说我在学习XX语言,XX语言真复杂啊。其实学习语言本身只能保证你在最后一步,也就是翻译代码那里少出错误,即使你顺利的学习了一万种语言,你也会觉得编程很难,如果你没有学习算法的话。
让我们找个具体的例子来说明,假设现在有个题目要找N个正整数中的最大值。显然这个题目模型很清楚,本身就是数学问题,也不需要数学表达了。接下来就是解法,新手这时就卡在这个地方了。
刚接手这个题目,很多人就会想用一种类似人类的快捷操作,比如三个数,瞥一眼就可以找出最大值,四个数也毫无问题,甚至十个数也是一下子。这时我问你,你怎么把这个瞥一眼的动作表示成程序,另外如果N大于10000怎么办。哑口无言。原因是,人类的头脑过于聪明,可以同时处理很多事务,也就是可以并行处理一定量的数据(当然大规模数据就要另外对待)。而计算机,很遗憾,没有这种能力。有人要和我抬杠,现在不是有多处理器多核多线程等各种各样的并行处理的计算机了么。我要告诉你,那些都是不同层次的概念。目前这个时代的计算机,在出现革命性的变化之前,从CPU指令的层次来说,都是单线程单参数工作的。再说明白一点,这些机器任何时候只能一次处理两个数,而且其中一个还必须已经在CPU内部了,任何N>=3个数相加都必须转化成持续的两个数相加,就是先把第一个第二个加起来得到结果之后,才能和第三个相加,照此重复求得所有的和。这时目前的科技无法改变的铁律。
这个时候我要请你记住一个重要的思想:编程中任何问题都要分解到足够小,小到机器可以一次解决的程度。回到刚才的那个题目:寻找N个正整数中的最大值。我们知道直接解决是不可能的。而按照刚才讲过的铁律,我们知道直接找到两个数中的最大值是一次可以做到的。怎样从2个扩展到N个呢。这里就是算法的天下了。一种很常见的想法是,完全可以从两个中找出最大值,再让他和接下来的一个比较,这就是N=3的情况,再把三个中的最大值和第四个比较,这就解决了N=4,以此类推,我们似乎找到了通用的算法,是的,找到前N-1个中的最大值,然后与第N个比较。不要怀疑,这个算法方向是正确的。接下来就是把它细化使他能变成代码。你注意到,首先要设法从1增加到N,而且每次前进一步都要做类似的操作。显然用一个循环来实现。每一次循环中,都需要将保留的最大值和当前的这第n个数比较,如果最大值比他大,那就保留,否则就要把最大值替换成新的。这就是条件语句的作用了。写完这个循环之后,还有些小细节,比如这个最大值在于第一个数比较之前应该是多少呢,太大的话,可能会比整个数列的数都大,这就会出问题,常用的做法是,就让他等于第一个数。然后包括读入那N个数,输出这个最大值这些琐碎的细节就属于收尾工作了,没什么可多谈的。
当然,即使是这样的小题,也不仅这一种算法。你记不记得有一种叫做单淘汰赛的机制,最后顶点的就是最大值。用在这个地方正合适。不过,如果要把这个淘汰赛算法实现成程序的话,如何实现分组,如何表达这个淘汰过程和取出顶点的值,正是算法描述里要解决的。这个就是排序里很有名的最大堆排序。一旦算法描述齐备,程序编写不过是打字校对的工作。
现在你明白本节讨论的情况的实质在哪里了吧,是的,是算法。为什么你可以看懂别人的程序呢,因为他的算法隐含在程序中已经被实现了。就像你读一段高明小说家的风景人物描写,总能在眼前浮现出那幅画面。但轮到自己写,却描绘不出那样的画面。一方面是因为你胸无成竹,不知道怎样找到可实现的算法,另一方面是即使你找到了算法,也是爱你在心口难开,也不清楚怎样去表达他。
算法总是从问题出发,通过一定的模式,逐渐细化再细化,直到可以直接转成程序。新手很难一下子领会怎样的算法是可以实现的。但好在新手接触的问题不是很难,算法通常很清楚明白,所以重点先要解决后面那个表达的问题。这就是为什么我建议各位默写教材上的例题程序的原因。很显然对于那些例题,只要你用心看过就会领会他的算法。那么,你再默写一遍,即使和他的原程序样子不一样,也总算是把这个算法表达出来了。反复这样练习,这个表达问题不就解决了么。而且在这个过程中,至少你学到了一个算法。基于此原则,任何你遇到的可以看懂的例程,我都建议你默写它。尤其是例如等级考试的题库的标准答案那样的东西,以及开源的精品代码。
我英语\XX不行,咋办
无法回避的事实,今日世界中的信息技术,绝大部分是欧美人的发明,更明白地说,是美国人的功劳。顺理成章的,各种资料文档技术手册,尤其是记载最新技术的,都是用美国通用语也就是英语撰写的。可能在其他领域不懂英语没有什么问题,但在IT业,不懂英语就是无法掌握最先进的技术,基本等于没有出头之日。
话说回来,不是说你一定要有个托福雅思的高分才能去学编程的。就编程本身而言。他所需要的英语水平不过是死记硬背三五个单词而已。你在看好莱坞大片时,一部片子下来总能记住主角和主要配角的名字吧,C语言全部关键字一共32个,而其中有6到7个的使用率超过78%。这样你还有什么可担心的。但是,要想成为高手,阅读大量的相关资料是免不了的,这个时候,英语就显出它的重要性了。
刚才谈过算法。前辈们已经总结出很多算法和产生算法的方法,我们可以直接学习。如果你积极进取,总有一天,你会发现有需要自己开创新的算法的时候。这个时候,数学功底会帮你很大的忙。也许只是数学工具在起作用,但更有可能是你的大脑受过的数学思想训练在帮助你。总之,为了前途着想,提高数学素养是没错的。这不是说多背数学公式和多做数学题,而是指一种数学的思维方式。
看不懂英语,那编程还有什么前途。数学不行,成为大师的希望不大了。不能上网,你完蛋一半。没有机器,难道要我买给你。指法不行,练去。
记得没人会同情你,我亲爱的兄弟。不会就去学吧,没有什么是不可跨越的障碍。
请记住这段话:在信息时代,任何主观障碍都不存在。如果你要研发什么新技术的话,只需要一台便宜的二手电脑、一张linux光盘和一个上网账号,再加上为之献身的决心,你就可以达到想要的任何编程深度。这话是一位大牛说的,那是谁,回想一下提问的智慧,然后自己上线查。
关于态度、情绪和其他
和技术无关,关于学习态度和方法的一些提示。
《循序渐进学编程 》
http://www.vcgood.com/bbs/forum_posts.asp?TID=1353&PN=2
《一个程序员给初学编程人的建议》
http://www.vcgood.com/bbs/forum_posts.asp?TID=265&PN=1
《 c语言学习经验–请不要做浮躁的人》
http://www.vcgood.com/bbs/forum_posts.asp?TID=1359&PN=2
《成为软件高手的几个忌讳》
http://www.vcgood.com/bbs/forum_posts.asp?TID=155&PN=8
《程序员四大忌》
http://www.vcgood.com/bbs/forum_posts.asp?TID=174&PN=8
=========================================分割线================================
二、选择C/C++语言
C语言是什么
C语言是一种计算机编程语言。语言是什么,请查阅上面的内容。
1970年前后,AT&T 贝尔实验室的 Ken Thompson根据BCPL语言设计出较先进的并取名为 B的语言,之后Dennis Ritchie在此基础上设计发明了C语言, 并首次在UNIX操作系统的 DEC PDP-11 计算机上使用。随后,C语言和UNIX操作系统一起,攻占了计算机世界的大片领地。
在发展的过程中,出现了许多略有差别的C语言版本。1989年,美国国家标准研究所(ANSI)为C 语言制定了一套ANSI标准, 成为现行的C语言标准,就是所谓的C89。当然经过10年的发展,在C89的基础上又颁布了C99标准。现在流行的大部分编译器完全支持C89,部分编译器完全支持C99。对于初学者来说,掌握经典的C89即可。
C++语言是什么
C++和C的关系非比寻常。1979年,当Bjarne Stroustrup在新泽西州的Murray Hill实验室工作时,发明了C++。Stroustrup 最初把这种新语言称为“带类的C”,1983年,改名为C++。C++通过增加面向对象的特性扩充了C。因为C++产生在C的基础之上,因此它包括了C所有的特征、属性和优点。在这个意义上,你可以认为C++是C语言的进化,这个进化的原因是复杂性(complexity)。一旦一个程序的代码超过25 000~100 000行,就很难从总体上把握它的复杂性了。C++突破了这个限制,帮助程序员理解并且管理更大的程序。
当然今天的C++已经不只是C的进化那么简单,他还包含了其它很多很多的新内容,它是如此的复杂以至于你要花上几倍于学习C的时间来学习他。但由于他和C的历史渊源,所有支持C++的编译器都能支持C。因此他俩也就被合称为C/C++语言。
C++对于C的进化着重体现在规模上,几乎C++的所有新特性,都是为大规模编程服务的。如果说C语言编程是单兵小组作战的话,C++编程就是集团军运动。
为何要选择纯C
在某些时候,我们不得不只使用C语言而不是C++,这种情况称为纯C编程。最常见是因为以下两个原因:
C++的语法很复杂,所以C++的编译器很难制作。因此在很多平台上没有现成的C++编译器,而C编译器因为足够简单,几乎到处都有,这时就只能用纯C。实际上最初的C++编译器也是用C语言来实现的。
仍然是因为C++很复杂,为了实现很多特性,做出的程序往往比用C做的类似功能程序体积要大很多,在程序的空间和时间要求比较高的时候,也只好选择纯C。
上面两种情况经常共同出现,实例之一就是嵌入式设备。各种单片机往往没有足够的内存和处理器能力,在上面实现C++编译器也比较困难,因此往往是纯C开发,而非C++。
C/C++语言和其他语言有什么关系
java 只要用一句话就可以概括,它是一种简化了的跨平台的C++语言。掌握了C++的人,学习java几乎是轻而易举。
basic pascal delphi(其实是objectPascal) perl python 还有其他诸如此类的语言,或者与c处于同一档次,或者与C++处于一个水平,学过C/C++之后,再去学习他们是很容易的事。作者个人比较偏爱和看好python,它的很多特性使他极有前途。
lisp Scheme是和C的思维方式完全不同的一类,被称为函数式编程语言,在人工智能等领域有奇妙的应用。有兴趣的朋友可以去领略,如果你要成为一个大师,至少要学习其中的一种。
我为什么要学C/C++语言
考试的人不用讨论这个问题,他们没有选择。如果我们有选择,为什么我们学习C语言而不是别的。
首先因为C本身是非常优秀的,他是世界上最伟大的编程语言之一。许多人认为C语言的产生标志着现代计算机语言时代的开始。它成功地综合处理了长期困扰早期语言的矛盾属性。C语言是功能强大、高效的结构化语言,简单易学,而且它还包括一个无形的方面:它是程序员自己的语言。它的设计、实现、开发由真正的从事编程工作的程序员来完成,反映了现实编程工作的方法。它的特性经由实际运用该语言的人们不断去提炼、测试、思考、再思考,使得C语言成为程序员们喜欢使用的语言。
在编程规模越来越大的今天,用C往往会遭遇协作型的问题,而C++在保持了C的高效的同时,实现了大规模协作的可能,因而成为了真正工业化的语言。
C/C++的优秀,使得他是主流的,在20世纪70年代末和80年代初,C成为了主流的计算机编程语言,至今仍被广泛使用。今天几乎所有的操作系统、大部分的(大于70%)的应用软件,90%以上的大型游戏都是用C/C++编写的。在对运行速度和资源占用有严格要求的领域,比如游戏、即时控制、嵌入系统,基本都是C语言内嵌汇编语言的天下。今天只有一种语言的性能比C强,那就是汇编,优化过的C程序的速度大约是汇编的95%-98%。但汇编基本不是常人用的。所以实际上C就是最快的语言。
主流的就意味着资料丰富。不论是编程时所需要的文档,还是学习的示例代码,甚至是平台提供的接口和库,C/C++语言版本都是最丰富的。业界的算法研究理论研讨,大部分都是C/C++语言,开源代码的78%以上是C/C++.任何一家硬件软件公司,当他开发一款能够编程的设备或是软件,必然会提供C语言的接口函数。其他的语言,就不一定有这样的好处了。不论是计算机图形学、加密解密还是计算机编程的其他领域,C/C++简直就是编程界的普通话。根据 International Data Corporation 的统计,C/C++ 是全球开发者使用最多的编程语言。如果确实要投身编程界,不懂C/C++的话,根本就是Mission Impossible。
如果你还不明白,我只需举一个小例子。假设你现在有机会去学习一门外语,投入时间差不多,你会选择学习英语呢,还是斯瓦希里语呢。(斯瓦希里语流行于非洲东部,为肯尼亚坦桑尼亚等国的官方语种)
当然,并不是说其他语言不值得学习,存在即是合理,今天存在的各种语言,当然都有它存在的价值,多学一点没有坏处。没有人禁止你在学会英语的基础上再学习法语日语等等。况且为了找工作等现实原因,学习其他语言也是非常正常和必要的。无论过去、现在还是将来,天底下不存在哪一门语言非学不可才能成为高手,思想最重要,“不会XXX语言不算真正的高手”之类的言论实在无聊之至。学C/C++,主要还是通过他学习编程思想。真正的武林高手,难道会局限于手里的那把大剑吗。
但我们还是强烈建议初学者从C语言开始,因为除了上面所提的好处,C语言还足够的简单。初学者或许会觉得C很难,但请记住,那些是编程之难,不是C之难。当你学过三种以上语言的时候,就会越发体会到C的简单。
Python语言 作者的另一推荐
虽然如上所述,C/C++语言有如此之多的好处,但他也不是完美无缺的,第一个致命弱点是复杂性。为了应付千奇百怪的需求,C++提供了很多奇妙的语法从而实现了各种现代编程特性,这就使得C++变得异常复杂。可以充分体现这个情况的一个事实就是,迄今为止,还没有哪个C++的编译器是100%完全实现C++官方标准的。如果有一个程序员对你夸口说他已经彻底掌握了C++的话,你基本可以断定他接触C++还没超过半年。幸好C语言还没有复杂性的困扰。但是开发效率也是C/C++的致命伤。因为过于接近硬件底层,C/C++程序在运行时几乎可以调动一切资源,取得最高的性能。但与此同时,C/C++程序员必须小心维护程序的运行状态,稍有不慎,轻则文件丢失内存泄露,重则死机甚至导致整个系统软硬件崩溃也是有可能的。所谓高收益必与高风险相伴就是这个道理。这就使得开发时必须小心谨慎,开发效率也就提不上去。
对于性能要求极高的程序,比如要求大量高速3D计算的计算机游戏、密集科学计算的工程软件、同时应付巨量用户的网页和数据库服务器,使用C++是当仁不让的选择。但是对于很多应用来说,些许的延迟是可以忍受的。举例来说,在某个工程中想要得到圆周率的后十万位,如果此时我们不在乎0.25秒和1.25秒运算时间之间的差别的话,就可以选择开发效率极高,而计算速度相对较慢的其他语言来实现。
在所有这些其他语言中,本文作者强烈推荐的是 Python语言。
由创始人Guido van Rossum在1989年圣诞节期间创造出来的Python语言,是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行。
Python语言有两大关键特点。首先他被称为是一门清晰的语言。因为它的作者在设计它的时候,总的指导思想是,对于一个特定的问题,只要有一种最好的方法来解决就好了。这在由Tim Peters写的python格言(称为The Zen of Python)里面表述为:There should be one– and preferably only one –obvious way to do it。这正好和Perl语言(另一种功能类似的高级动态语言)的中心思想TMTOWTDI(There’s More Than One Way To Do It)完全相反。Python语言是一种清晰的语言的另一个意思是,它的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。这样有意的强制程序员养成良好的编程习惯。简单来说,几乎所有的python程序看起来都是一个样子的,而相对的,人们说,到哪里去找一段随机字符,读一段perl程序就行。
第二个特点是他被称为胶水语言。哦,这可不是说他会把你的手指给粘住。他的意思是他可以象胶水一样,把用其他语言制作的模块拼合起来。很多人是这样用python语言制作大型程序的:他们先用python做出一个可用的程序,再把其中最影响性能的部分用C/C++语言重新写成模块(在已经满足要求的时候,根本就无需替换)。不用担心配合的问题,python的可扩充性完全可以胜任要求。可扩充性可说是Python作为一种编程语言的特色。新的内置模块(module)可以用C/C++或其他语言写成。同时也可为现成的C/C++或其他语言模块加上Python的接口。这样一来,我们既能充分享受到python快速开发带来的效率,又能够实现足够强大的性能。
再加上设计极为出色的三大内置数据类型:异构列表、元组、字典和从函数式语言学来的列表解析、对象自省、方法动态生成等突出特性,使得它的功能变得极为强大的同时程序又相当简洁。想想看,你能在C程序运行的同时,改变自身的代码让他再次以另一面貌运行么,python就可以轻松地做到。同样的功能,用python实现所需的语句仅仅是C的十分之一到二十分之一,而开发(包括调试)所需要的时间更可能只需要百分之一。
Python在编程领域的占有率一直处于稳步上升之中,根据2007年末最新的统计数据,Python排名第七。前六名分别是Java,C,VB,C++,PHP和Perl. 作为一个很年轻的语言,Python的位置已经相当令人振奋了。随着微软将Python纳入.Net 平台(官方行为),相信Python的将来会更加强劲发展。Python 很可能会成为.Net平台快速开发的主流语言。欲了解这方面情况,请参考Iron Python的相关信息。
著名的搜索引擎 Google 大量使用Python,NASA等大站也在用。更加令人吃惊的是,在Nokia智能手机所采用的Symbian操作系统上,Python成为继C++,Java之后的第三个编程语言!可见Python的影响力之巨大。
作者个人的观点是,Python语言是少有的一种可以称得上即简单又功能强大的编程语言。对于工程师会计师这类非职业程序员(本人就是),在平时需要某种语言来编写程序解决一些小问题的时候(例如做个土方计算,分析某种投资的收益,批处理一些文件的改名压缩之类),python是比C语言更好的选择。即使对职业程序员,python也是称手的工具。总之,python就是手边的语言。
=========================================分割线================================
三、其它一些重要的概念—计算机原理
编程的对象是什么————计算机
如果你看到的这篇文章是电子版的话,你眼前的东西就是计算机,也就是俗称电脑的东西。这样的说法对普通用户来说是已经足够了,但是电气工程师认为一堆电路板、缆线、马达、和机壳的组合才算,联想的销售人员认为他们卖的那些方块才是计算机,而中央军委的人大概觉得银河5才能称得上。程序员的看法和他们并不完全相同。程序员看来,只要能自动计算的东西,就是计算机。这个说法的重点在于自动和计算这两个词。广义的计算是指能对外界的某种输入做出反应,不一定就是数学运算。比如电梯就可以对按键做出反应,所以她也是能计算的。自动是说计算是通过自身的运作来完成的,不需外界干预。在有电的时候,电梯就可以自动运行,这样看来电梯也是计算机。算盘虽然能计算,但不是自动完成的,如果把打算盘的人一起算上,那就是不错的计算机了。使用指纹或虹模的智能锁、秦始皇陵里的机关和自动钢琴似乎也都是一种计算机。情况确实是这样,计算无处不在,计算机也无处不在。如果你有兴趣的话,可以把我们的世界看作一台巨大的计算机,然后就觉得我们是生活在Matrix里,不过打住,我现在没兴趣和你讨论哲学问题。通常在实际编程中,程序员只考虑现代数字电子计算机,也就是使用电能为动力,在运算时以电子电路和逻辑代数为基础的计算机。他们用途广泛,种类也是极其繁多,手机、PC、服务器是比较常见的样子,电梯、收银台、智能门禁则是各种隐藏的版本。虽然设备的外在形式千变万化,但现代电子计算机的基本原理和体系结构并没有太大的变化,这体系结构的问题我们会在以后详细讨论。就本文的读者—新手程序员而言,回答什么是计算机这一问题,请回头看本段的第一句话。
程序到底是怎么回事————是操作而不是结果
计算机本身什么也做不了,必须依靠程序来指挥他做事。程序就是操作流程的顺序,或者说是顺序排列的多个操作过程,他是方法的描述。
有一次我的朋友王二老板要做家具,这可是他的老本行。他先把原木分割成木条木板,再把木条木板弯曲到指定的形状,然后把他们放置到适当的位置,接着设法固定他们,最后雕花抛光和上漆,一张漂亮的摇椅就做好了。这整个的流程如果记录下来,就是一个程序。任何程序都有三个要素,执行者、操作对象(也称为资源)和操作方法(指令)。在做家具这个程序里,王二就是执行者,木头就是他所对付的资源,在指令的持续作用下,木头(资源)的状态(如形状大小、颜色位置等)不断发生变化。最后,在程序结束时,木头变成了家具。
电脑程序和上面一样,是方法的描述。只是这些程序的执行者不再是人,而是CPU,命令也变成了CPU的指令(无法想象怎么给CPU下“吃口菜”的指令),而资源则是CPU可以改变其状态的东西,通常是内存,当然端口硬盘等等也是,不过一般应用程序都只使用内存就可以完成工作。
有一点要注意,CPU其实并不知道自己在做什么,是程序在指挥CPU的运作。这一点比较难理解,让我举例说明。来看一个算盘的计算,要使用算盘,只需要一件东西:口诀。记熟口诀(当然还有它对应的操作),就可以用算盘计算。在这个用算盘计算的过程里,口诀就是程序,指导着计算过程。算盘自身并不知道自己在计算,他只产生了物理上的一些变化(算珠位置的变化),做珠算的人同样也不需要知道,他只需要按照口诀调整算珠的位置。当程序结束的时候,算珠必定会处在某个位置上,这个位置的状态可以按照某种约定被读出,被读成某个数值,比如下面4个算珠全都在中档而上面的珠子没有落下的状态就是4。
操作和储存状态的设备并不需要知道状态是怎么转换成信息的,转换由阅读者来完成。显示器在显示图像的时候,总是这样进行:
坐标(1,1)黑色、坐标(1,2)白色、坐标(1,3)白色、坐标(1,4)白色、坐标(1,5)白色、(1,6)白色、(1,7)白色、(1,8)白色、(1,9)白色、(1,10)黑色……(2,1)黑色、(2,2)黑色、(2,3)黑色、(2,4)白色、、(2,5)白色、(2,6)白色、(2,7)白色、(2,8)白色、(2,9)白色、(2,10)黑色…………虽然显示器只是在适当的坐标显示黑色或是白色,但我们却在显示器上看到了文字、图片和动画,你不会认为显示器知道这些是鸟山明的漫画吧。
计算机也是一样。比如计算圆周率的程序,CPU只是不断地对某一块内存进行操作,当程序结束的时候,这块内存恰好处在某种特殊的状态。而按照事先的约定,这个状态在被读出来的时候,它正好和圆周率相同。于是我们说,算出了圆周率,其实CPU只是在那里象手指头一样拨动内存的算珠而已。这种算珠极其简单,他只有两个位置,0和1,拨动它也很方便,电流就可以,但这种算珠实在太多,使得他们能组合起来表示很复杂的信息,就象只有黑白两色的屏幕点当数量足够多的时候,就可以用来表现有趣的漫画。
所以程序代表人期望电脑能做的事(注意不是电脑要做的事,这一直混淆着许多人),当人需要做这些事时,人提供指令,再给出某些资源以期电脑能对其做正确的改变。程序只是方法的描述,本身是不能发生任何效用的,直到它被执行,人为给定它一块内存,告诉它计算结果的精度及计算结果的存放位置后,他通过控制CPU才改变人为给定的这块内存的状态以表现出计算结果。
通常,我们把计算机的物理实体部分称为硬件包括电路板、机箱、键盘鼠标等,而把不可见的非实体部分称为软件,软件大体就是程序和主要由程序产生的数据。广义的说,乐谱、菜谱、工作手册、仪器的操作说明也是某种程序,我们不妨称之为类程序。
为什么要编程————因为机器的特点
编程这件事存在,完全是迫不得已。人们发明了计算机,想让它做事。但机器有三大特点,使得如果要让机器做事,完全不像吩咐人那么简单。
第一个特点就是机器很傻。很多人希望自己像计算机一样聪明,我说如果那样你就完了。举例来说,从三个数里选出最大最小值,人类可以一眼就看出,但机器只能先从两个里找出最大的,在把这个最大的和第三个比较,然后再这样重复一遍找出最小值。如果是四五个数,机器也是这样反复操作(我想这个例子我已经讲过了)。这就类似工地上搬砖,人类的做法一次搬很多很多砖,用推车或者别的把砖码得高高地然后运到目的地。计算机的做法是每趟只搬一块砖,你没看错,每趟一块。
那为什么计算机这么厉害呢,因为他的第二个特点,快而不乱。机器可以不知疲倦地用同一方法,重复重复再重复地做某件事,而且每次重复都相当的快。这一点是人类做不到的,让一个人搬一堆砖,也许没什么问题,但是一车砖就会让人疲惫不堪,如果有一轮船的砖,想必大多数人想都不想就放弃了,即使有坚持去做的人,他的动作质量也只会越来越差。但机器不同,他搬砖不是每趟一块么,但他每趟来回的时间很短,比如低于0.00……001秒,不管砖头有多少,十万块也好十亿块也罢,按同一方法处理,既没有差别也不会厌烦直到全部处理完。从总体来比较结果,机器就比人强了。还是以选最大最小数为例,人可以用肉眼检视三四个数,但超过100个数就要用其他的方法。对机器来说,三个和三万个数只是重复次数的差别。单调快速的重复,这就是机器的诀窍。
更重要的一点,机器和我们言语不通。就是说,我们不可能一抬手一挑眉毛就吩咐他做事。不要和我抬杠说你可以用鼠标画圈让机器做事,也可以声控。那都已经不是纯粹的机器了。机器和我们处在一个不同的感知空间,所以他不能理解我们的话语。我们要命令他,必须用他能够理解的形式。从根本来说,就是电脉冲。
基于这三个特点,要让机器做事情,就必须让把我们的要求转化成最简单适于重复的命令集合,而且是电脉冲形式。比如我们要让机器在屏幕上显示一幅图,首先我们要把这幅图分解成很多很多的小方格,也就是所谓像素,每个像素只有一个颜色,每个颜色都用一个很长的数字表示,然后所有这些数字转化成内存里的电平信号,再用另外的电路信号来一个个的把这些电平送到显像电路。所有这些电平和信号的集合就是程序。而编程,就是制造这些程序的工作。
也许有一天,我们不再需要编程序,程序员这个职业也不复存在。不过我想如果那天到来,那就是机器已经能完全理解人类的语言和思想的时代了。在肉眼所及的范围里,似乎还看不到呢。
你们老是提到编译器,那是什么—–代码翻译机
这个问题经常被问到,我在前面的文字略微解释了一下。不过我不介意再解释一次。
是的,我刚刚说过,程序其实是电脉冲形式的指令的集合。对机器这是绝对正确的。但你认为人类可以直接操作电脉冲么,当然不能。所以最早的时候,程序员们是通过反复的拨动开关或者插拔插头来做这件事的,就像老电影里的电话接线员和发报员。后来技术进化了,人们可以把脉冲信号设置在打了孔的纸带上,然后让纸带穿过有灯管的感应器,有孔电路就通,没有就是断,由纸带机实现了在电脉冲和纸带之间转换。老电影里的工程师们经常拿起一条长长的纸带来阅读。真是高深莫测啊。不过即使这样,要理解程序还是很困难,更别说阅读编写和修改了,人毕竟不是机器。其实人们最习惯用来表达思想的方法是文字,于是人们设想能否直接写出文字形式的程序。通过不懈的工作,这个目标实现了。今天人们可以写出文本形式的称为源代码的程序,然后再利用特定的工具把代码转换成机器能理解的电脉冲形式,也就是目标程序。这种转换工具就叫做编译器,作用相当于翻译,以前是纯粹的机电设备,到了现代他也成了程序的一种。
从某个角度来说,其实没有任何人能被称为程序员,编译器才是真正的程序制造者。人所制造的只是源代码。从这个角度往下想的话,其实是程序在制造程序,换言之,程序在借助人类之手自我进化。
在这里顺便讲解下编译和解释的差别。编译器的工作本质上类同于翻译,而我们知道其实翻译有口译和笔译两种工作模式。程序员写完所有的源代码,由编译器一次性转为可执行文件留待以后执行,这种类似笔译的模式我们称为编译。程序员每次输入一行或数行代码,编译器马上把他转换并执行,并等待程序员的后续输入,这种类似即时口译的方式就称为解释,此时编译器就被叫作解释器。C/C++ pascal等语言是编译型的,perl python等语言就是解释型的,java语言很特殊,他先编译成一种中间代码,然后在不同的机器上边解释边执行,这样就能实现跨平台运行,成为半编译模式。微软的.net也是这种机理。现代的新型解释性语言很多都是半编译的,兼顾了运行效率和跨平台性。一般来说,编译型要比解释型的运行效率高些,因为不需要等待程序员的输入,也便于系统优化,但解释型在编程的时候容易排错,界面友好,而且通常程序编写比较方便。不管用哪种语言编程,你总需要一个编译/解释器。
现代的编译器,往往不止是编译器,他还会包含有着色和搜索等功能的代码编辑器,支持单步调试并行调试的调试器,能够读入文件的多个版本并进行比较分析的版本控制,编辑图标等的资源编辑器,在大型项目中用于统一协调的项目管理,和用于自动化代码生成的向导工具等等。这样的编译器,我们就称它为集成开发环境(IDE : Integrated development environment ),最著名的代表就是微软的VisualStudio系列。
给我解释下啥叫编程语言————各路江湖武功
菜谱、仪器的操作说明可以用法语来写、也可以用中文来写,不影响实质效果。因为人类生存在同一个四维物理时空中,具有相同或类似的感知。虽然人类的语言五花八门,但都可以通过翻译得到正解。仪器操作说明、一般的菜谱,所描述的都是人类世界的事物,人类可以理解,因此它们可以用人类的语言来描述。但计算机程序显然与菜谱有不同,他是指挥计算机用的。首先CPU所能感受到的物理空间和与人类的感受严重不同,很多概念根本无法传达,其次没有大脑的计算机并不懂得人类的语言,何况人类的语言并不那么完美,很多事不能精确的描述,所以人类的语言不论英语还是中文都不能胜任这个任务。这个情况和音乐有点类似,解决方案是发明一种人造语言专门用于这个领域。比如五线谱就是一种专门的供音乐使用的人造语言(简谱也是,不过那是国人的自创,有点地方话的味道)。于是就有一些专门的纯粹用于计算机的语言被创造出来。
其中最早的一种基于电路原理,直接用0和1来表示电路的开关通断,不断的拨动开关,就形成了程序。这种语言就是机器语言,它可以直接被计算机听懂,但遗憾的是,人类虽然可以看懂这种语言,但它不符合我们通常的交流习惯,很难被人所阅读,更不要说修改了。
后来人们提出这样一个方案,我们可以先按某种方法和规则,生成一个我们能看懂的指令序列(就是源代码),再通过某个转化的工具(就是编译器),把它变成机器可以运行的指令(也就是可执行程序)。这个我们能看懂的指令序列的规则的总和(也就是词汇和语法),就是我们通常说的计算机语言,为了和机器语言相区别,被称为高级语言。相应的规则,被称为语法。由于语法和词汇的不同,常见的语言有很多种,本文将介绍的就是C/C++语言,其他著名语言有BASIC、Pascal、JAVA、COBOL、 Python、汇编等等,他们各有所长,在不同的领域发挥着作用。但由于计算机的体系结构大致相同,这些语言也大同小异,具有共通之处。这情况很好理解,通常真实世界的拳法看起来都有点相似,只有漫画这类幻想作品里才会有手脚飞出或者口吐火焰眼下喷水这种怪异的事情发生。这个编程语言的共通之处也就是我前面讲过的算法和数据结构、平台和库这类东西。由于历史原因,大部分计算机语言借用了部分英语的词汇作为基本词汇,但绝不是说必须先学英语才能学习编程。如果只因为那几个屈指可数的英文单词而放弃学习编程,我只能说这样的人乘早离开为好。
顺便提一句,本文作者(也就是我),一向认为那个叫易语言的中文编程语言是个不折不扣的笑话。理由很简单,其他流行的语言都有自己的独到之处,就像武当剑少林拳打狗棒一样在江湖上占有一席之地,而这个语言除了有几个中文标识符之外,一无所长。而这几个中文标识符也不过是使用了文本替换的方式把C语言的几个特定词汇换成了意思相对应的中文而已。任何一个文本编辑器都可以做到这一点。形象的表现一下,这就是有个猥琐的家伙特地身穿全套阿拉伯长袍练了整路正宗少林长拳然后大声叫嚷这就是他发明的具有民族特色的中东石油大亨拳。
语言之后要确定的事情——操作系统和平台
在众多的程序里,有一大类特殊的程序,他们就叫操作系统。操作系统是最基础的程序,他让计算机运行起来,所有的硬件都做好准备,接受别的程序给予的指令。相对的,其他程序就叫应用程序。操作系统和应用程序的关系,就象人的基本意识和数学水平一样。想让一个连基本意识都没了的人(植物人)参加数学高考,看来你和我都疯了。一般的计算机都是硬件、操作系统和应用程序相互分离的,需要的时候分别安装。有些特殊的设备直接把操作系统做在硬件里,比如各种电子游戏机,可以开机,但是要有游戏光盘或游戏卡才能玩,还有些计算机把操作系统和应用程序都做在一起,放在机器内部,前几年很流行的俄罗斯方块掌上游戏机和电子宠物就是这样的设备。但总体而言,没有操作系统的计算机,就像没有灵魂的身体,是无法动弹的。这种情形,回想一下你那只进了水彻底完蛋了的手机就明白了。
编写操作系统要比通常想象的困难的多,它涉及到大量的背景知识和底层操作。所有连本篇FAQ都还不能消化的新学者应该完全打消诸如自己制作操作系统的念头,有实力之后再来尝试也不迟。
提供给钢琴和手风琴的乐谱并不是完全一样的,这是一种共识。为什么,因为这是两种不同的乐器。同样,在这个世界上有很多种的计算机,他们相互之间的差别也很大。每一种计算机都需要操作系统,而某一款计算机可能有好几种操作系统可以使用,就象黄种人可以说中文,也可以说日语。特定的计算机和特定的操作系统的组合,就被称为平台。就像钢琴曲不是给京韵大鼓使用的,对印度土著说中国成语也不会有什么好效果,编程通常都要针对某种平台来做。有一些高级语言号称能够跨平台,也就是可以在很多平台上运行,但作者认为那样多少会有性能上的损失或者意想不到的问题出现,所谓有得必有失就是这个了。
就像我在前面谈到库的时候已经提到过,如果你想要在编程上面有所成就,你不得不选定一个平台深入地钻研。个人认为,初学者不适宜同时在两个完全性质不同的平台上学习,不同的特性绝对会把你搞晕,在你确认掌握了一个之后再学习另一个,相互借鉴的作用才能体现出来。
编程时什么东西最重要—-源代码
按照一般编程语言的规则编写的程序通常都是文字形式的,虽然还不能直接执行,但可以转换成可执行的程序,它是真正程序的源头,于是被称为源代码。编程的主要工作就是在制造源代码。由于源代码几乎人人都能看懂,而源代码又可以生成真正的程序,所以取得了源代码,就相当于取得了程序的一切,包括程序本身和程序背后的思想。基于此,大型软件公司要把他们的源代码严密的保护起来,而开源组织的第一条规则就是开放源代码。而作为初学者的你,请妥善保管你所写下的每一段源代码,这都是你积累的财富。
我的程序和一般的程序不一样,什么原因—-控制台和图形界面
当你开始照书上的例子编写第一个C程序时,很快就会问出这个问题。回想平时见到的那些程序,他们通常都有标题栏,有菜单和工具栏,可以用鼠标在上面点来点去好像还有很多别的功能。可是这个程序似乎完全不同,难道出了什么问题。其实没有问题,这是一个控制台程序。
世界上有各种各样的程序。几乎所有的程序都要和用户交流,接受用户的输入,送出运行的结果,但他们接受和送出的方式是不一样的。程序与用户交流的方式被称为界面,还记得早期科幻电影里那种出现在计算机屏幕上可以和人对话的巨大人脸吗,那就是界面的一种。事实上这种界面到现在还没有实现,人类的想象力总是能超前实际技术很多。
界面有好多种。有些程序不需要界面,因为他们根本不和用户交流,他们和其它的程序交流,你可以叫他无界面,典型的例子就是驱动程序,你什么时候见过驱动程序运行的样子。现在常见的windows下的程序所使用的则称为图形用户界面(GUI:Graphics User Interface)。简单来说,就是所有的输入和输出都使用图形的方式。他接受用户图形化的输入,譬如用户用定位设备(鼠标、轨迹球、手写板)输入坐标、绘图,把程序的输出反映在可以显示图形的设备上,譬如显示器、打印机、头戴式监视器,通常这种程序会提供菜单、工具条等方式而极大地方便用户。这种程序直观明了,一般用户能很容易的掌握使用,只需要点击就可以完成大部分的任务。魔兽世界和WORD就是典型的GUI程序。
但其实图形界面的编程是相当复杂的。你能想象其实每次你都要画出显示器上所有的东西,窗口移动缩放时,你需要重画窗口里的每一样东西,在多窗口并存的时候,如果你的窗口被别人的窗口挡住了一部分(这是很常见的情况),你需要控制窗口上哪部分被显示、哪些被遮挡,鼠标移动的时候,你需要把被鼠标遮住的部分盖住,并重画鼠标,当鼠标点击时,你需要判断鼠标的位置,还要判断这个点击是你的程序的,还是别人的,当鼠标点击到菜单的时候,你要确定是菜单还是按钮,是哪个菜单项,然后执行相应的操作。所有这些情况,都必须解决。有些,操作系统可以帮你解决,但你要知道怎样才能让他帮你做,还有些就必须你自己想办法,种种问题使得图形界面的编程变得异常复杂。由于处理图形的需要,图形界面对硬件的要求也比较高。画面绚丽的3D游戏,远比记事本程序对系统的要求要高的多。虽然现代的计算机早已能够满足这些要求,但早期的计算机并不是这样强大的。
所以,在早期(也不远,大约是6、70年代)的时候,程序的界面并不是图形,而是字符的。用户在键盘上输入文字,比如dir,系统找到相对应的命令,然后执行,执行的结果也是以一行行文字的形式输出在可以输出文字的设备上(当然也主要是显示器),用户阅读文字,进行下一步的操作。现代的一些科幻片,在表现黑客侵入或者是操作高级设备(比如美国国防部的核武器系统)时,往往出现操作员在啪啪啪啪快速打字,然后突然一回车,就大功告成的场景,很少会出现卡通化的菜单和工具栏。想想黑客帝国的那个接线员,你见过他什么时候抓着鼠标吗。这种方式就叫命令行界面(Command Line Interface),由于操作员通常是坐在一个操作台前,而这个操作台确实可以控制整个系统,所以也被称为控制台界面(Console Interface)。控制台下运行的程序,就是控制台程序,运行控制台程序的系统,就叫控制台环境。
控制台看起来很高级,很酷很眩,黑客们操作的时候也显得很高深。其实反倒是比较容易编程实现的。因为你只要处理和输出字符就可以,系统自然会把字符放在屏幕上适当的位置。你不用去管字体大小颜色这些事,更别说窗口菜单鼠标这些不存在的东西,只要把注意力全部放在程序的功能上。电脑系统也不用消耗资源来画图,系统自然比较高效。所以,命令行界面一出现,就得到了广泛的应用,他的历史可比图形界面古老多了。和GUI程序比起来,命令行的程序通常很难看,操作也不直观。但由于它的高效和快捷,命令行方式的程序迄今仍然在使用,在很多时候,人们宁可使用命令行的程序来完成某些工作。在现代,FreeBSD、Linux和其它的UNIX系统,默认都是控制台环境,DOS就是一个标准的控制台环境,windows系列操作系统,也提供了控制台环境。而很多的GUI程序,借鉴控制台方式,仍然保留有直接使用键盘操作的方法。比如魔兽争霸,几乎每个命令都有快捷键的以加速操作。
实际上,很多系统管理员更偏爱控制台程序,除了他比图形化程序更高效之外还有一个原因。同样要增加实现一个选项,控制台只要增加一个输入字符作为开关,而图形界面至少需要增加一个按钮,想想看,屏幕上是可以增加的按钮多还是可以增加的字符数多呢。所以控制台程序往往更能实现纷繁复杂的功能,只要你记得住指令。
让我们打开在Windows下打开一个控制台环境并使用几个控制台程序感受一下。至于其它的操作系统,基本上本身就是控制台环境。就不需要演示了。假如你使用的是Windows2000或Windows XP,点击开始,找到程序->附件,在里面有一个叫“命令提示符”的快捷方式,点击运行他。如果是Windows 98,在程序组里设法找到一个叫MS-DOS方式的快捷方式,运行它。
你是不是看到了一个窗口,没有菜单,没有工具栏,只有标题栏和最大最小化的按钮,这就是win2000下的控制台环境,在这里就可以运行控制台程序。现在,输入”dir”,然后回车。你看到了输出吧。这就是控制台程序的运行了。只要输入命令再回车,就可以运行了。再来运行一个,time。再来一个,ipconfig。最后再来一个,help。他给出了当前系统提供的各种命令,你可以看着提示分别试一试。其实不止可以运行这些,试试 notepad,你发现了什么。explorer,calc,cdplayer,freecell等等都是可以这样运行的哦。
玩够了,好吧,输入exit,再回车。控制台环境就被关闭了。
控制台程序容易编写,易于理解,所以对于初学者,控制台程序是理想的选择。本教程以后的部分所讲的程序,在没有特别说明的情况下,都是控制台程序。在学会了控制台程序的基础上,再转到窗口程序就比较轻松了。
好像不能建立一个单独的文件来编译
————工程和项目的问题
有一件很明显的事情是,当软件项目变得很大的时候,仅仅使用一个文件来完成所有的内容是不现实的。以《魔兽世界》这款游戏为例,游戏中需要声音、动画、图片这样的素材,也需要地图编辑、人工智能、光影渲染这些不同的模块,在制作的时候,需要有不同的部门完成不同的工作,工作中所使用的文件和工具都不相同,不可能生成同一个文件。这时,就存在一个协调的问题。因此,对于流行大型的开发工具来说,他们不是以单个文件为单位进行处理的,而是以项目为单位。一个开发项目包含一个到几个工程,每个工程都包含有大批的文件,有源代码,有程序所使用的图片音乐等资源,还有编译时需要纪录的各种参数。每次编译都要完全编译整个工程(当然在优化状态可以只考虑更新变动的部分)。即使源代码只有一个非常小的文件,也必须为它生成一个工程才可编译。
显然工程对于类似魔兽世界这样的大型项目的编写是十分必要的,但在新手练习的小程序上,使用工程就象你只想在家给你的小狗搭个窝,却拉来了整个中国长江三峡工程开发总公司,实在有点小题大做。而且,以后我们要编写很多这样的小程序,如果每一个都兴建工程,那会生成多少垃圾文件啊。所以,我们需要一种只编译单独文件的方法。幸运的是,不论哪种开发工具,他们都提供了这样的方法。虽然这种方法通常不会在菜单上直接出现,但他确实是常用的和正确的方法。
难道一切都要从头干起
————函数、API、类、控件、开发包与软件复用
还有件事也很明显,随着工程项目的越来越浩大,每一次都从零开始编写一个项目是不经济也是不现实的。我们注意到,不论是程序还是源代码,都有以下两个特性。第一,他们都是人类智慧的成果,每一行源代码都凝聚了程序员的聪明才智,花费了开发者的时间和金钱。第二:几乎每一行源代码本身都可以毫不费力的零成本的被复制到另一处,另一个代码块、另一个程序甚至另一个项目。基于这样的特性我们认识到,如果能够重复利用已经编写过的程序和源代码,尤其是那些在使用中已经被证明强壮而正确高效的程序,就能够节约巨大的人力物力财力时间。即使只能使用其中的一小部分,也是了不起的成就。这就叫做软件复用。从编程出现的第一天起,人们就意识到这一点,并为实现软件复用而努力。软件复用最重要的好处就是能够让程序员不再把有限的智慧放到早已解决过的问题上,而是投身新的问题,也就是:不要再重复发明轮子。开放源代码的一个重要理由就是为了软件复用。
软件复用的一个行之有效的方法是使用函数。所谓函数,就是把一些具有固定功能的代码段组合在一起,并给予一个名字。在需要这些功能的时候,只要在适当的地方填入函数的名字。在编程时使用函数而不是纯粹手工打造,就像在盖楼时使用砖块而不是用粘土堆砌,是不小的进步。盖楼时使用的砖块,既可以自己制造,也可以到市场上去购买。购买来的砖块,虽然有某些差异,但总是遵循某些共同特性。这些砖块虽然总是一块块地使用,但总是一车车的大量购买。函数也一样,市场上总是有专业公司提供函数出售,他们出售的函数按照功能聚集在一起,成为函数库。虽然不同公司的函数库可能具有相同的名字和功能,但内部是怎样完成的却不尽相同。大部分现代编程语言,在规定了语言本身的语法和词汇(当然其中也包括了函数的使用方法)的同时,还会规定一个函数库。这个函数库只规定了每个函数的名称和用途。至于函数的具体实现方案,有的是由语言本身直接定义,有的是由实现该语言的编译器的厂商提供。而使用这种语言的用户,只要在需要的时候使用,而不用去管函数库内部的问题,大大提高了效率。这个库就叫做标准函数库。通常,现成的函数库都是经过了大量的检验证明是高效而强健的,要比自己徒手打造的函数好用的多,所以在可能的情况下,要充分使用已有的函数库,尤其是标准函数库。C语言之所以如此强大,原因之一就是它有一个强大完备的标准函数库。而C语言之所以如此难学,原因之一也是在于它有一个强大完备的标准函数库。
软件通常是运行在操作系统下。从软件复用的角度看,操作系统如果能提供某些通用的服务,程序就可以集中注意力做自己的事。这些服务包括文件读写、设备操作、网络通讯、窗口绘制等等。否则,程序就会把大把的精力浪费在这些基础工作上。幸运的是,几乎所有的现代操作系统都提供了这样的服务。这些服务以函数的形式出现,在程序使用这些服务,就象使用函数一样。这些函数形式的系统服务,就叫做应用程序接口(Application Program Interface),即API。遗憾的是,不同的操作系统,提供的API通常是不同的。使用某个操作系统的API而编写的程序,搬动到另一操作系统时,由于API不能相互对应,也就不能运行了。这就是编程要针对平台的原因了。
有时候,有些大型程序,比如Autodesk公司的AutoCAD,当你对他的某些功能不满或是感到有改进的必要时,它提供了编程改变的可能,相对于第一次开发来说这就叫二次开发。二次开发时,原始程序所提供的那些服务也被称为API。
使用砖块盖楼确实很方便,但如果能使用预制板,那就更方便了。比函数更高一级的可以复用的程序模块叫做类。类的使用比函数复杂,但是它可以更广泛的复用,是更高级的软件复用形式。类,同样可以聚集成类库。能够使用类的语言,就会规定标准类库。C++比C更强大,更难学,就是因为,C++除了具有C所有的函数库之外,还有一个完整强大的标准类库。
在类库当中,有一种很特殊的类,称为控件(control)。控件在快速的窗口程序开发中特别有用。它可以实现拖放式的编程。举例来说,想要编写一个有一个按钮的窗口程序。那么只要先创建一个窗口程序的工程,这个工程会自带一个窗口控件,而且直接显示在工作区里,然后再用鼠标把按钮控件从控件板上拖到窗口里需要的位置,按钮就摆放好了。至于按钮的功能,就需要程序员来编程实现。将来编译运行之后,程序的外观就和设计的外观一模一样。控件极大的提高了编程效率,但因为它需要自动生成某些代码,所以需要编辑环境的支持,支持控件的编辑环境总体来说比较少。控件的总和,就是控件库。
所有这些,函数、API、类乃至控件,开发必备,就象旅行时必需携带的行李一样,于是被统称为开发包(SDK : Software Development Kit)。最著名的SDK就是windows提供的Win32SDK了。有些开发包是编译器自带的,如标准库等等。有些包是第三方厂商提供的,比如微软的DirectX系列开发包专为游戏编程所设计。所有开发包都需要集成开发环境(内带编译器)的支持,有的要编译器提供内部实现,有的要编译器给于连接,有的要编译器生成代码。不同的编译器提供的方式不太相同,这就造成了编译器之间的差异,有时,甚至导致某个开发包不能在某款编译器上使用。
为了进一步提高程序员的工作效率,很多集成开发环境还发明了另一些方法,相当于直接用一间间的房子叠在一起做成居民楼,你几乎只要刷刷外墙漆,就可以完成了,这被称为应用程序框架。可惜,不同的厂商的方法根本不同,这进一步扩大了集成开发环境之间的差异。
不管未来怎样,至少现在,编程的规模变得越来越大,也越来越需要更多人的智慧。每个人的智慧都是有限的,不应该被浪费,充分使用每个人的智慧,才能取得成功。软件复用就是整合所有人智慧的方式之一。从你编程的第一天开始,请牢牢记住:软件复用。要复用,复用,再复用。
关于图形库的补充说明
——–可选择的图形库
黑客们很偏爱控制台,但对于用户来说,图形界面是他们更熟悉的。我们也喜欢编写GUI程序,因为那看起来确实更友好也更有成就感。那么,怎样才能编写GUI,需要什么东西呢。
答案是:图形库。每一个操作系统,都会提供一套API(不理解的请回头看上面一小节),如果该系统支持GUI,那么它的API中就会有一个图形子系统和窗口管理子系统。其中图形子系统包括了基本图形元素的绘制,比如画点线面、显示文字图片和上色渲染等等,窗口管理子系统首先会包含图形子系统,再增加上包括窗口和窗口元件的绘制、窗口的遮盖、移动调整,以及鼠标点击这类事件的传递处理等等这些内容。在Windows下,图形子系统就叫GDI(Graphics Device Interface)。其他平台也有类似的接口,在TC下可以通过扩展的graphic.h来实现画图,不过窗口的支持要另行实现。此外,为了应对3D绘图在速度和效果上的需求,有专门的3D加速图形库被开发出来,最著名的就是DirectX和OpenGL。其中前者只能用于Win平台,但除了图形之外还整合其他很多功能,用他搞出了大量的windows游戏。后者跨平台,能在从家用到大型商务等各方面使用而且性能卓越,无数的好莱坞电影都是用OpenGL渲染生成的。
但是即使有图形库窗口管理库,GUI编程仍然是相当的繁琐。首先是要完成某个工作必须填写大量按部就班的代码,而且这些代码在程序内部和各个程序之间重复着。这提示人们应该在图形库的基础上作进一步的抽象。简单来说就是要在画点画线函数的基础上做出画二次曲线画立方体的模块。幸运的是,这些工作已经有人完成了,而且是不止一套。
这些东西按照功能强弱,有的叫图形用户界面库,有的则叫应用程序框架。在windows下,使用VC的人 可以选择MFC ATL,使用Delphi和BCB的,可以用VCL,至于VB,它本身就是和图形库捆绑在一起。如果你选择.net阵营,.net framework 就是你最好的选择。
如果你希望程序不止在windows使用,那么跨平台的QT GTK+ wxWindow 都是你的好选择。他们在保证效率的同时,适当抽象,抚平了底层操作系统的差异。
对于学习C++的人来说,上述库都是可以用的。但如果你是C语言死忠,就我的认知,可以直接用API,否则只有一个选择:GTK+。实体书比较少,相关资料推荐去线上查。
=========================================分割线================================
四、教材、习题和示例
能推荐几本好书么
当然,FAQ的目的之一就是这个。我将分别介绍纯C、C++以及widows编程、数据结构算法以及图形库等等的教材。市场上这些主题中任意一个的教材都是汗牛充栋,读都读不完。不过很显然,大家都公认的经典,也只是那么寥寥数本而已。下面推荐的都是这样的著作,当然总是有好作品在不断推出,我这里不可能把他们都列举出来,你可以用自己的犀利的目光把他们挑出来。
首先是纯C的教材
第一本:H.M.Deitel和P.J.Deitel的《C HOW TO PROGRAM》(C程序设计教程)。
作者是父子,从事语言教材的编写合计超过40年,本书被美国众多高校选用为教材,既可入门也可翻阅,甚好。本FAQ作者认为如果你只打算看一本的话,那就选他好了。
第二本:Brian W.Kernighan和Dennis M.Ritchie 的《The C Programming Language 》(C程序设计语言)。
此书简称K&R,由C语言的创建者撰写,是全球销售最多的C语言教材,其品质不容置疑。不过不适合入门,适于在入门之后巩固提高。实体书有原版和译本购买,电子版英文较多。
第三本:谭浩强的《C程序设计》。
优点在于,面向中国学生,语言易于理解,而且全书篇幅小,看过的人多,容易找到人请教。但是各方面的概念不深入,浅尝辄止,实际上还有些小错误,不是很严谨。因此适合第一次入门学习,例题做完基本就可以抛弃了。有实体书和电子版下载。同时配套有习题集和习题解答,适合自学。
第四本:王大刚先生的《C语言编程宝典》。
质量不错,与老谭的书一样非常适合中国学生,而且对于TC的图形编程讲解非常透彻。本人没有发现实体书,可能只发布在网络上,在VCgood论坛有转载:
http://www.vcgood.com/bbs/forum_posts.asp?TID=1560&PN=2
http://book.chinaz.com/C/C/index.html
第五本:无名作者的《C语言初学者入门讲座》
VCgood论坛转载,作者未知,质量同上一本。http://www.vcgood.com/bbs/forum_posts.asp?TID=1294&PN=4
第六本:Kenneth A.Reek 的《C和指针》
进阶读物,把指针一章演绎为一本书可见其技术精度。指针是C的灵魂,能领会本书中的理念,才能算是真正明白了C指针的奥妙,才算懂得了C。
第七本:Andrew Koenig 的 《C陷阱与缺陷》
进阶读物,在认真读完上面的入门书之前,暂勿阅读。本书畅销14年历久不衰,足证品质。
最后一本:ISO C89规范/C99规范
一切关于C语言的疑问,只有一件东西最权威,那就是ISO的规范。但这不是正式出版物,是类似法律文本的技术说明,而且只有英文版。新手阅读,提防吐血而亡。
然后是C++的教材
C++比C复杂的多,所以教材也就纷繁芜杂。既有综合性入门性的,也有专项深入的,阅读要循序渐进,以下分阶段介绍(以下文字有部分引用自他人评介)。
首先是毫无基础的时候,先要初步掌握语法并形成编程的概念
level 0:
H.M.Deitel和P.J.Deitel的《 C++ How to Program 》(C++大学教程)。
又是这对父子。有很多号称C++入门的书,但经我的观察,如果要选择能推荐给毫无编程概念的新手用的书,这本算是佼佼者了。此父子的《C程序设计教程》我已推荐了。
仍然是K&R,Brian W.Kernighan和Dennis M.Ritchie 的《The C Programming Language》(C程序设计语言)。
尽管C++之父亲口说,最好把C++看作一门新语言来学习,但我个人认为,一开始学习C至少有两大好处。相比C++,C还是非常简单的,易于掌握,避免你过早陷入C++的语法泥潭。同时,学C能让你对计算机的底层运行有所认识,建立良好的概念。
钱能的《C++程序设计教程》
国内C++教材中较好的一本,作者是教师,总结多年教学实践的经验写成的,比较适合国内学生。
PS:老谭也有一本C++教材,在此就不太推荐了,它完全是用C的思维来看C++。
当读者有一定c/c++基础
推荐的阅读顺序:
level 1
从Stanley B.lippman著 侯捷 译的《essential c++》开始,短小精悍,可以对c++能进一步了解其特性。Stanley B.Lippman的职业是提供关于C++和面向对象的训练、咨询、设计和指导。他也是Bjarne Stroustrup领导的Bell实验室Foundation项目的成员之一,负责C++程序设计环境中的对象模型部分。简单说,他是C++的创建者之一。
以Stanley B.Lippman,Josee LaJoie,Barbara E.Moo的《c++ primer》作字典和课外读物,因为太厚不可能一口气看完,当然你也可以用它作为主力教材。Lippman说过了,Josee LaJoie是C++标准委员会原负责人,Barbara E.Moo 是独立咨询顾问,参与了第一个使用C++编写的商业产品的开发,领导了公司中第一个C++编译器项目。
C++之父Bjarne Stroustrup的《the c++ programming language》,简称BS的TCPL,全面而深入的书,缺点也是太厚。
这个阶段 也可以延用前阶段Detiel父子的教材。
level 2 这个阶段就要养成好习惯
然后从Scott Meyers的《effective c++》开始转职,这是圣经,请遵守10诫,要经常看,没事就拿来翻翻
接着是 Herb Sutter的《exceptional c++》。此人是C++标准委员会的主席,主席说话,谁有异议。
顺下来就是Scott Meyers的《more effective c++》和Herb Sutter的《more exceptional c++》,请熟读并牢记各条款
level 3 这个阶段 把C++的类搞透
Stanley B.lippman的《insied the c++ object model》(深度探索C++对象模型)看过后如一缕清风扫去一直以来你对语言的疑惑,你终于能明白compiler到底都背着你做了些什么了,这本书要细细回味,比较难啃,最好反复看几遍,加深印象。
看完上一本之后,这本Bjarne Stroustrup的《The design and evolution of c++》(C++的设计与演化)会重演一次当年C++他爹在设计整个语言过程中的历程。
Stephen C. Dewhurst的《C++ Gotchas: Avoiding Common Problems in Coding and Design》(C++程序设计陷阱)会帮你在设计层面避免错误。
level 4 这个阶段深入STL吧
Nicolai M.Josuttis的《the c++ standard library》(C++标准程序库—自修教程与参考手册) 是stl的字典,什么都可以查得到。
Scott Meyers的《effective stl》,它和圣经一样是你日常行为的规范。发现没有,Scott Meyers先生一直在搞effective系列。
Matthew H. Austern的《generic programming and the stl》(泛型编程与STL)让你从OO(面向对象)向GP(泛型编程)转变。
光用不行,我们还有必要了解stl的工作原理,那么侯捷的 《stl源码剖析》会解决你所有的困惑。
level 5 彻底掌握模版泛型编程
对于c++无非是OO和GP,想进一步提升OO,Herb Sutter的《exeptional c++ style》是一本主席这么多年的经验之谈,是很长esp的。
一位stl高手是不能不去了解template的,《c++ template》是一本百科全书,足够你看完后对于GP游刃有余。
Andrei Alexandrescu的《modern c++ design》是太过聪明的人写给明眼人看的。
level 6
这个时候,对于C++语法本身,你应该是已经到了随心所欲的境界,你所要练习的大概就是大规模的C++程序的设计以及一些通用的高效库的使用,以及为什么要这样做的理由。
所以,《C++ 输入输出流及本地化》《C++ Network Programming》《大规模C++程序设计》是你需要的。
同时,C++教材中的异类:Barbara E.Moo和Andrew Koenig的《Ruminations On C++》(C++ 沉思录)是值得你一看的,他集中反映了C++的关键思想和编程技术,说明了C++是什么样的以及能够做些什么,不仅告诉你如何编程,还告诉你为什么要这样编程。本书曾出现在众多的C++专家推荐书目中。
和C一样,同样有最后一本书
ISO+IEC+14882-1998 C++规范。这可不是宝典圣经,这就是C++的法律,一切疑问以此为准到此打住。不过,有个脚注,某些具体情况取决于编译器实现。
接下来是Windows编程
至少在国内来说,Windows环境下的编程还是很有市场的。
第一本书:Charles Petzold 的 《Programming Windows》(Windows程序设计)。
如果说,在windows编程领域只能翻阅一本书的话,那就是他了。《Windows程序设计》由微软出版社在1988年首次出版,后来被认为是这方面最好的导论性读本。在1994年5月,Petzold作为仅有的七个人之一(并且是唯一的作家)被《Windows Magezine》和Microsoft公司授予Windows Pioneer奖,以表彰他对Microsoft Windows的成功做出的贡献。这本书经典到这个程度,以至对于Windows程序员来说,“从Chares 的(Window程序设计)一书中寻找答案。”几乎成了一句至理名言。
你可以在这个地方观看到他的外观,http://www.charlespetzold.com/pw5/,国内书店有售,电子版则需要仔细搜索。
第二本:Jeffrey Richter 的《ProgrammingApplicationsforMicrosoftWindows》(Windows核心编程)和《Advanced Windows》(Windows 高级编程指南)
和上面这本书难分伯仲。这么说吧,你读了之后就会后悔,后悔为什么没有早点读他。建议先看高级,再看核心。
个人认为除非windows发生革命性的变化,否则看完这三本书,足以应付通常的Windows编程。
上面三本书介绍的是直接使用WindowsAPI实现应用,总的来说那是一种很基础但很繁琐的方式。Windows下有很多的编程库可以使用,VC和BCB都自备了优良的库。
在VC来说,存在版本的差异,如果是6.0版本,那么你基本只有MFC这一种选择,但对于2002以后的版本,包括新推出的2008,MFC、ATL、.net都不错。
对于MFC。
要学会怎么用,可以看一下这几本:
微软出版社授权的中文版系列书 由David J.Kruglinski,Scot Wingo,George Shepherd写的《Programming Visual C++ 6.0 技术内幕(第5版)》,经典的“Visual C++技术内幕”的第5版。
清华大学出版社出版 杨永国 的《Visual C++ 6.0实用教程(第2版) 》,这本不是那么经典,同类多得很,但好处是便宜,而且能够买到,有些书已经买不到了。
如果想知道MFC的原理,侯俊杰先生的《深入浅出MFC 》(Dessecting MFC)就值得你仔细阅读。
对于VC2002–2008中的.net,单独讲授的似乎目前还没有像《Windows程序设计》那样经典的书出现,毕竟.net出现的时间也不长。但把.net MFC ATL等综合在一起讲的,倒还是有一些。
由H.M.Deitel,P.J.Deitel,J.P.Liperi和C.H.Yaeger共同编写的《Visual C++.NET:How To Program 》(Visual C++.NET大学教程)品质算是上乘。还记得Deitel这对父子作者么,在chinapub上可以看到父子俩合著的教材有47套之多,而且个个畅销,我觉得他们俨然就是美国的谭浩强,只是水平高出不少。
George Shepherd,David Kruglinski 的 《Visual C++ .NET技术内幕(第6版)》,就是上面那本书的.net升级。
IVOR HORTON的《VISUAL C++ 2005入门经典》也可一看。
BCB在版本6以前用的是著名的VCL库,BCBX另起炉灶,用的是wxWidgets库。由于对BC,作者自己涉猎不多,所以这两套库的教材,请大家自行查找。
就像C++和C的规范文件一样,Windows编程中,也有一件类似万宝全书的神物,那就是Microsoft自己推出的MSDN。
MSDN是Microsoft Software Developer Network的简称。这是微软的针对开发者的开发计划。你可以在http://msdn.microsoft.com看到有关软件开发的资料。在VisualStudio中包括MSDN Library的光盘,其中包括VisualStudio的帮助文件和许多与开发相关的技术文献。MSDN Library每个季度更新一次,可以向微软订阅更新光盘,不过价格不便宜。
MSDN就是微软的技术大全,所有微软的软件系统的开发的已公开资料,都在上面。如果在那里也无法找到答案,那你只能想办法咨询微软的内部工程师求得隐藏秘籍。不要妄想能够完全阅读它,3G容量的文档(大部分是文本,不是图片和视频),实在太过巨大了。
Unix/Linux/BSD系统
相对于Windows,在UNIX下编程获得相关文档要方便很多。由于历史原因,能够看到的教材基本上都经受了考验,几乎个个都是经典,不象Win下有鱼龙混杂泥沙俱下的现象。
三本可以替换的入门书,任选其一即可:
Bruce Molay的《Understanding Unix/Linux Programming A Guide to Theory and Practice》(Unix/Linux编程实践教程)应该是你的第一本书。一句话,大家都说好。
Kay A.Robbins(美), Steve Robbin(美)的《UNIX Systems Programming》(UNIX系统编程)。他是一本介绍UNIX系统的工作原理以及学习UNIX系统程序编写方法的经典教材,一本程序员不可多得的案头必备参考书。
Neil Matthew(英),Richard Stones的《Beginning Linux Programming》(Linux程序设计)。本书是Linux程序设计领域的经典名著,以筒单易懂、内容全面和示例丰富而受到广泛好评。
随后,以下几本书排名不分先后,分属不同方面,想深入的伙计建议都看:
W.Richard Stevens, Stephen A.Rago的《Advanced Programming in the UNIX Environment》(UNIX环境高级编程)
W.Richard Stevens,Bill Fenner, Andrew M. Rudoff,Richard W.Stevens的《Unix Network Programming》(UNIX网络编程),注意这套书是三卷本。
宋宝华 的《Linux设备驱动开发详解》。一本介绍Linux设备驱动开发理论、框架与实例的书,是作者多年Linux设备驱动开发从业经验的总结。能够在众多海外强手的教材阵中脱颖而出,足见作者的实力。
Robert Love 的《Linux Kernel Development》(Linux内核设计与实现)。内核相关概念及如何使用内核介绍的非常到位,全书偏应用,主要强调如何用,以及为了用而需要了解的内核实现。
Daniel P. Bovet和Marco Cesati 的《Understanding the Linux Kernel》(深入理解Linux内核),分析内核代码几乎无出其右者。
John Lions(澳)的《Lion’Cornmentary on UNIX 6th Edition With Source Code》(莱昂氏UNIX源代码分析) 。本书由上下两篇组成。上篇为UNIX版本6的源代码,下篇是莱昂先生对UNIX操作系统版本6源代码的详细分析。本书语言简洁透彻,曾作为未公开出版物在黑客界广泛流传了二十多年。现在MIT的操作系统的研究生课程里面依然采用的是这本书,unixV6的代码量小,门槛比动辄数百万行的linux更适合初学者。绝对是神作,很难买到这本书,所以如果遇上要毫不犹豫弄到手。
和MSDN类似,Unix/Linux/BSD下也有一个文档大全似的东西,而且只要一个命令就能打开他。他就是所有Unix系统都会自带的man page,完整安装的情况下,他已经存在系统中,更重要的是,他是免费的,相对照的MSDN宇宙版至少需要几百美元。
最后,在UNIX下无论如何都必须翻阅的教材是由公认的Unix编程大师、开源运动领袖人物之一Eric S. Raymond亲自撰写的《The Art of Unix Programming 》(UNIX 编程艺术),这本书著名到他有个专用缩写: TAOUP。他不是在技术层面讨论问题,而是从哲学角度来讨论UNIX编程,从而把编程上升到了艺术的高度。
数据结构和算法
数据结构就是在机器里组织数据的方法,而算法就是解决某个问题的总思路。数据结构和算法有两个层次,一开始的时候,它是语言相关的,尤其是对于数据结构来说,因此C和C++的教材要分开。后来在算法的层面,他就只是一种思想,也就和语言无关了。
清华教授严蔚敏和广东工业大学教授吴伟民的《数据结构(C语言版)》,这是清华计算机系的标准教材,还有什么要补充的么。
清华教授殷人昆的《数据结构(用面向对象方法与C++描述)》,也是清华的教材。
Mark Allen Weiss的《Data Structures and Algorithm Analysis in C》(数据结构与算法分析–C语言描述)和《Data Structures and Algorithm Analysis in C++》(数据结构与算法分析–C++语言描述)。数据结构和算法分析的经典教材。
之后就可以看深入一点的东西了:
王晓东的《算法设计与分析》。国内本科教材,书写得不错。
M.H.Alsuwaiyel(沙特)的 《Algorithms Design Techniques and Analysis》(算法设计技巧与分析)。本书结构简明,内容丰富,适合于作为计算机学科以及相关学科算法课程的教材和参考书,尤其适宜于学过数据结构和离散数学课程之后的算法课教材。同时也可作为从事算法研究的一本好的入门书。
Thomas H.Cormen, Charles E.Leiserson的《Introduction to Algorithms》(算法导论)。这是麻省理工学院计算机系的算法教材,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。
经典中的经典,每一个想要掌握算法精髓的人都必须看的书,算法书中的圣经,他就是:
大师中的大师 Donald E.Knuth的《Art of Computer Programming》(计算机程序设计艺术)。
Donald E. Knuth(唐纳德 E. 克努特,中文名高德纳)是算法和程序设计技术的先驱者、计算机排版系统TEX和METAFONT的发明者,他因这些成就以及大量富于创造力和具有深远影响的著作(19部书,160篇论文)而誉满全球。这么说吧,目前你所能听说过或者还活着的那些计算机软件大牛,没有哪个不直接或间接的受过Knuth的教导。他强悍的程度只用一件小事就可以说明,在撰写这套《计算机程序设计艺术》的过程中,由于感到原有排版系统的不足,他特地重新制作了一套新的计算机排版系统,这套称为TEX的东西目前已经是出版界的标准系统。
《计算机程序设计艺术》这套关于算法分析的多卷论著已经长期被公认为经典计算机科学的定义性描述。迄今已出版的完整的三卷已经组成了程序设计理论和实践的惟一的珍贵资源,无数读者都赞扬Knuth的著作对个人的深远影响,科学家们为他的分析的美丽和优雅所惊叹,而从事实践的程序员已经成功地将他的“菜谱式”的解应用到日常问题上,所有人都由于Knuth在书中表现出的博学、清晰、精确和高度幽默而对他无比敬仰。微软的盖茨曾经说:如果你能完成他书中50%的习题,请尽管给他寄简历。(事实上,用盖茨来衬托Knuth简直是对Knuth先生的侮辱)
此书原定计划为七卷。目前已出版四卷,作者还在撰写后续部分。已出版的分别为:
第1卷 基本算法 Volume 1: Fundamental Algorithms
第2卷 半数值算法 Volume 2: Seminumerical Algorithms
第3卷 排序与查找 Volume 3: Sorting and Searching
第4卷 组合算法 包括:
第4卷 第0册 组合数学和布尔函数 Introduction to Combinatorial Algorithms and Boolean Functions
第4卷 第1册 尚未出版
第4卷 第2册 生成所有元组和排列 Volume 4, Fascicle 2: Generating All Tuples and Permutations
第4卷 第3册 生成所有组合和分划 Volume 4, Fascicle 3: Generating All Combinations and Partitions
第4卷.第4册 生成所有树 Volume 4,Fascicle 4: Generating All Trees History of Combinatorial Generation
各种图形以及其它库
图形库,著名的有两个:OpenGL和DirectX。
OpenGL(“Open Graphics Library”)是一个性能卓越的三维图形标准,是图形硬件的软件接口。他是在SGI等多家世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通用共享的开放式三维图形标准,具有使用简便、效率高、便于移植、性能卓越等特点,独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。目前包括Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL做为三维图形标准,许多软件厂商也纷纷以OpenGL为基础开发出自己的产品,其中比较著名的产品包括动画制作软件Soft Image和3D Studio MAX、仿真软件Open Inventor、VR软件World Tool Kit、CAM软件ProEngineer、GIS软ARC/INFO等等。包括迪斯尼梦工厂等好莱坞厂商的大批电脑特效程序都是使用的OpenGL库。
OpenGL有两大经典教材:
OpenGL体系结构审核委员会,Dave Shreiner, Mason Woo, Jackie Neider, Tom Davis 联合撰写的《OpenGL Programming Guide: The Official Guide to Learning OpenGL》(OpenGL编程指南),此书因封面为红色,被大家爱称为“红宝书”。
Richard S Wright和Benjamin Lipchak的《OpenGL SuperBible》(OpenGL超级宝典),是另一本合适的入门教材。
OpenGL结构评审委员会的《OpenGL Reference Manual》(OpenGL 参考手册),就和他的名字一样,它是一本文档大全,和“红宝书”相对应,他被称为“蓝宝书” 。
按照前辈的经验,有红蓝两宝书足矣。不过,OpenGL社区的实力雄厚的很,好为人师的大牛也不少。有一位昵称NeHe的大牛,他在自己的网站上放了一整套完整的OpenGl教程,实例教学讲解清晰,而且会跟随OpenGL的发展在随时更新,更重要的是,除了C/C++的标准例程之外,他的例程还几乎涵盖世界上的所有语言,如果想用自己喜欢的独特语言,可以参考页面最下方的联接。NeHe的教程在http://nehe.gamedev.net/。同时,Nate Robin的例子对你理解OpenGL很有帮助。http://www.gamedev.net/reference/articles/article839.asp。
OpenGL最权威的资料在他的官方网站 http://www.OpenGL.org的Documentation中,可以下载到官方教程和例子程序。
DirectX是微软提供的一种应用程序接口(Application Interface)。简单的说它是一个提高系统性能的辅助加速软件。”Direct”的意思是”直接的”,而”X”则意味着”无限”。事实上它是一个.dll(动态连接库Dynamic link library)的文件集合。通过这些动态连接库文件,开发者们可以在不考虑设备差异的情况下访问硬件最底层。这项特性使程序员从无尽的硬件驱动程序中解脱了出来。DirectX同时封装了一些COM(Component Object Model)对象,这些 COM 对象为访问系统硬件提供了一个主要的接口。DirectX是一种游戏开发利器,Windows下的大量游戏在制作时都用到了它。DirectX包括很多组件,他们按功能划分为:DirectDraw,Direct3D,DirectMusic,DirectSound,DirectShow,DirectPlay,DirectInput,DirectSetup and AutoPlay等等。
在DirectX中最重要并且最具有代表性的是Direct3D和DirectDraw(在DirectX7.0之后被合并进了Direct3D),它的主要功能就是3D图形。Direct3D和OpenGL处于竞争关系,很难评论他们孰优孰劣。OpenGL专攻图形,而且适用众多平台。而DirectX可以在Win平台下获得多样的服务,而不止是图形。
如果你想学习如何使用DirectX,那么必须得掌握BASIC或Delphi或C++/C#等语言中的一种,纯C是不行的。同时,掌握Win32编程技术以及一些其他相关的知识也是必需的。
Frank D.Luna的《DirectX 9.0 3D游戏开发编程基础 》可以作为你的入门书。DierctX合适的入门书其实很多,重点是要注意版本要跟上最新的DircetX才行。
微软的东西,最标准的教材就是MSDN。想深入学习DirectX,就去翻阅MSDN好了。而且,那里也有不错的入门资料。
OpenGL和DirectX的最新进展往往是由显卡厂商作出的,经常去Nvidia和ATI的主页上去关注最新技术是个好选择。
其他库,比如用于构建窗口程序框架的GTK、QT、wxWidgets等,用于科学计算的Blitz、CGAL,网络通讯的ACE,加解密用的Crypto++,测试用的CppUnit,XML用的xml4c、XMLBooster、Xerces c++,当然也少不了即将加入标准库的Boost,这些库由于在不断的发展进化中,实体出版物相对较少,但他们自带的电子文档和相关主站上的资料通常足以满足需求。请记住,既然这些库的作者把他们发布给大家用,他当然要给齐资料让我们知道怎么用才行。
软件工程思想
当软件膨胀到一定程度,它就不是一个人能搞定的了。这个时候,就要像建筑上对待一个大型工程项目一样,通过有效的组织管理来进行软件生产。这种思想就叫软件工程。而实际上,即使是个人开发者,在初窥编程门径之后,也建议学习软件工程,从而培养起好的编程习惯便于将来的集体合作。所谓好习惯的养成是很难的而改掉坏习惯就更难,所以千万不要养成坏习惯。
林锐、韩永泉的《高质量程序设计指南–C++/C语言》会让你大吃一惊,原来你原先的编程习惯就有这么多的漏洞。
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides的《Design Patterns:Elements of Reusable Object-Oriented software》(设计模式:可复用面向对象软件的基础),这是软件复用的权威教材,不过似乎要有很久编程经验之后才能领会。
Andrei Alexandrescu 著 侯捷 译的 《Modern C++ Design Generic Programming and Design Patterns Applied 》(C++设计新思维——泛型编程与设计模式之应用)是从实例上演示设计模式的。
Martin Fowler著 侯捷 译的 《Refactoring: Improving the Design of Existing Code》(重构:改善既有代码的设计),与巨著《设计模式》并称”软工双雄”,全美销量超过100000册,亚马逊书店五星书。
Ian Sommerville的《Software Engineering》(软件工程)直接以软件工程为名的书,猜猜也知道有多强,此书已经再版8次。
Frederick P.Brooks的《The Mythical Man-Month: The Essays on Software Engineering》(人月神话)。出版于1975年的《人月神话》是软件开发方面的经典作品。在软件领域,很少能有像《人月神话》一样具有深远影响力并且畅销不衰的著作。Brooks博士为人们管理复杂项目提供了最具洞察力的见解,既有很多发人深省的观点,又有大量软件工程的实践。32年后的今天,他的思想仍然引领我们。他是和《计算机程序设计艺术》一样经典的著作。
找书的诀窍
可能有一天你会踏入一个别的编程领域,比如人工智能、加解密和密码学、网络与通讯、嵌入式等等,我并没有在这里列出书单,又或者你打算自己找些书。有什么能快速找到好书的技巧么,除了在线上论坛新闻组等地方寻找别人的推荐评价,在老师和前辈师兄师姐那里咨询之外,还有一个极为简洁的方法,那就是去找著名大学的计算机教材。声名在外的麻省理工、加州伯克利和清华,他们的教授们的眼光绝对是你可以信任的。买书时参看出版社也是个好办法,国内的清华大学出版社、机械工业出版社、电子工业出版社、人民邮电出版社四家出好书的机会很高,不过有时翻译质量是个问题。国外的O’Reilly可以说是最专业的计算机图书出版商,他出的没有不是经典的。此外Addison Wesley、Microsoft Press、 Pearson几家也尽是出猛书的地方。这个经验可不止是适用于编程哦。
光看书似乎不解决问题,难道要做题
当然要做题,而且做题也要循序渐进。
首先是教材正文中的示例,然后是书后的练习题。
第二步可以做国家等级考试二级三级的C语言题。在线上可以找到,大量二级题库。三级题推荐南开的三级100题。此外VCgood群的共享文件中也有一些这一难度的题目。
正如前面讲过,当第二步的题目都做完后,语法已经不是问题,应该开始学习数据结构和算法。这个方面的练习题可以去各大OJ。OJ是什么,请看下一节。
OJ是什么
OJ是OnlineJudge的缩写。OnlineJudge是一种在线裁判系统。她可以对程序原代码进行编译和执行,并通过预先设计的测试数据来检验程序原代码的正确性。
首先,他是一个在线的题库,有很多习题,你可以任选其中之一来解答。然后,系统的编译器能够编译执行你所提交的代码。如果编译通过,针对每个题目,系统将使用自带的多组测试数据检验你的程序,如果程序都能得到正确的输出,那么你顺利地解决了这个问题。最后,系统还能对所有参与答题的用户进行统计和排名。
OJ的题目大部分是关于算法的。题目的输入输出通常是命令行方式,而非图形界面。也就是说,要关注的不是平台的兼容性、文件的格式抑或窗口的布置这种无关紧要的细节,而是问题本身的逻辑实现。一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。最后系统返回给用户一个状态,通过、错误、超时、溢出或是无法编译。
Online Judge系统来自ACM和IOI大赛。由美国计算机协会(ACM Association for Computing Machinery)发起和组织的ACM国际大学生程序设计竞赛(简称ACM/ICPC)是目前世界上规模最大的计算机学科赛事。IOI则是国际信息学奥林匹克竞赛,和数学奥林匹克竞赛一样著名。Online Judge系统是IOI或ACM的训练题库,同时也是ACM和IOI的评分系统。
哪里有可用的OJ
以下几个OJ都很不错,请随意进入。也可以自行搜索,国内很多学校的OJ正在热火朝天的建设中,有的甚至直接作为了考试用系统。
Vijos http://www.vijos.cn/
内容丰富、分类清晰明了的中文在线评测题库。题量适中(目前大约400题左右),难度面向初学者和中学生,尤为重要的是,界面和题目都是中文的。
USACO http://ace.delos.com/usacogate/
全美计算机奥林匹克竞赛(USACO)的训练网站,特点是做完一关才能继续往下做,与通常的OJ不同的是测试数据可以看到,并且做对后可以看标准解答(包括分析),所以如果大家刚开始的时候在上面那些OJ上总WA却找不到原因的话,可以试着来这里做做,看看测试数据一般是从什么地方阴你的。此外,虽然都是英文题目,但在国内有人做了翻译,有全部题目的中文译本,搜索即可。
这两个强烈推荐新手前往。
浙江大学的Online Judge http://acm.zju.edu.cn/
国内最早也是最有名气的OJ,有很多高手在上面做题。特点是数据比较刁钻,经常会有你想不到的边界数据,很能考验思维的全面性。
北京大学的Online Judge http://acm.pku.edu.cn/
建立较ZOJ晚一些,但题目加得很快,现在题数和ZOJ不相上下,特点是举行在线比赛比较多,有报告称数据比ZOJ上的要弱,有时候同样的题同样的程序,在ZOJ上WA(wrong answer),在POJ上就能AC(accomplished)
这两个可以说是国内顶级水平了。
西班牙的Universidad de Valladolid http://acm.uva.es/
世界上最大最有名的OJ,题目巨多而且巨杂,数据也很刁钻,全世界的顶尖高手都在上面。据说如果你能在UVA上AC一千道题以上,就尽管向IBM、微软什么的发简历吧,绝对不会让你失望的。
俄罗斯乌拉尔大学 http://acm.timus.ru/
也是一个老牌的OJ,题目不多,但题题经典。
有实力的朋友,尽量去国外的OJ为国争光吧。那上面中国大陆选手的排名可不怎么靠前哦。
另外几个可以尝试,但不保证服务器总是开机的站
myOJ http://myoj.kuye.cn/
建站人员自称是专为中学生OI选手训练使用,由中学生和中学教师共同开发的,也是给中学生和中学教师使用的。优点是题目难度较低,而且题目都是中文版易于阅读。
浙江大学宁波理工学院 http://acm.nit.net.cn/
也是适合新手的OJ,题目难度由低到高不等。中文题不少。
同济大学的OJ http://acm.tongji.edu.cn/ 大部分是中文题。
南开大学的OJ http://acm.nankai.edu.cn 界面友好,部分中文题
天津大学的OJ http://oi.tju.edu.cn/ 界面题目皆中文
杭州电子科技大的 http://acm.hdu.edu.cn/
武汉大学的 http://acm.whu.edu.cn/noah/
这几所大学的题目难度相近,甚至有好多是相互借用的,难度等级要比北大和浙大的低一些。
一个人孤单做题的滋味是很郁闷的,尤其是当你确实绞尽脑汁也搞不定的时候。幸好线上还是有很多同样在做题的朋友,他们通常会在论坛BBS之类的地方集中讨论解题心得,甚至有可用的答案。建议用OI (Olyimpiad in Informatives 信息学奥林匹克)为关键字搜索。请不要用答案代码直接提交哦。
哪里有代码示例可看
这个可以自己google或baidu。
如果你已经能够做一些OJ的题了,那么可以考虑看一些开源软件的代码。http://sourceforge.net/ 是全球最大的开源软件集中地,确定一个应用主题上去找就会有收获。不过说实话,从OJ到项目是很大的跨越,所以要找到适合自己的项目来看是不容易的。个人的建议是,找一些知名的又比较小规模的项目,然后找他的早期版本的代码,会比较清晰,比如 vim1.0/2.0 lua1.0 apache1.0这种。
=========================================分割线================================
五、选择编译器
有哪些编译器可用
一般国内学习有以下几款可以用:TC VC GCC LCC-Win32,以下分别介绍。
TC 是Borland公司出品的Turbo C的简称,运行于DOS平台,win下可在控制台下使用。国内常用2.0版作为学习和考试的平台,为于1989年发布的产品,距今大约20年。另有3.0版本也可以使用,3.0比2.0多了C++语言支持。Turbo C 提供了两种编译环境:一种是类似于UNIX环境的命令行,包含一个TCC编译器和一个MAKE实用程序;一种是集成开发环境,由编辑器、编译器、MAKE实用程序和RUN实用程序,还有一个调试器组成。
TC2 具有编译速度快、代码优化效率高等优点,所以在当时深受喜爱。但由于DOS环境已经不是应用主流,所以TC基本不能用来作为软件开发平台。在今天由于TC对系统要求低,操作简便容易上手,他仍然是新手学习C语言的入门编译器之一。传闻Borland已在2002年放开TC的所有权,如果属实,那么使用Tc不再存在任何法律问题。
VC 指的是Microsoft公司的集成开发工具套装VisualStudio中的C/C++语言集成开发环境Visual C++。
目前可以使用的版本有VC6.0,和2005(即VC8)。VC2002/2003是过渡产品,可以不考虑。截至本文最后更新时,2008测试版已发行,2008正式版即将推出。
VC的编辑编译调试都可以在同一个窗口内完成,在Win下兼容性最好,代码效率高,被广泛用作Win下各类程序的开发,可以说是Win平台下的标准开发工具。使用VC意味着和微软同一阵营,文档有微软的官方文档MSDN作为最权威的参考,示例代码数量巨大,学习投资得到有效保护。纯粹学习和开发win本地应用可使用VC6,如果需要进行.net程序开发,就要用2005版。
VC系列的缺点有三:第一是体积庞大,VC6不包含MSDN容量为250M左右,包含则再加1G。VC2005不包含MSDN容量为2.7G,包含再加1.6G。第二是操作复杂学习门槛高,如果要在集成环境编译,必须建立工程和一批附属文件,同时还要熟悉集成环境的使用。第三:VC是有版权的软件。按照法律规定不付费购买是不可以使用VC的,因教学目的可以免费使用,但不能用于商业活动(不过显然国内的兄弟根本不理会这一套)。
VC6有一点要补充说明,VC6是没有中文版的。你所看到的中文版是某些人汉化的结果。虽然简洁明快,但在有些时候会出现莫名其妙的问题,还是直接使用英文版为好。
VC2005分为好几个版本,其中有一套叫做Express版的值得一提。他是微软送出的免费版,专门提供给学生和爱好者使用,功能上有删节,主要是图形界面和大量的工业用库和工具被裁减,而且基本只能在命令行编译。不过对于学习C/C++语言本身是完全足够的。如果有版权顾虑,可以用它。
GCC GNU Compiler Collection 也即是 GNU 编译器家族。
GCC是开源软件,是自由软件的旗舰项目,是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
GCC 不仅仅能支持 C 语言,它还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言等等等等。另一方面,说到 GCC 对于各种硬件平台的支持,概括起来就是一句话:无所不在。几乎所有有点实际用途的硬件平台,甚至包括有些不那么有实际用途的硬件平台。
根本无需再用什么语言来描述GCC的优点。几乎所有的开源软件和自由软件都是使用GCC编译的。如果要评选世界上编译出程序最多的编译器,除了GCC没有谁能担当这个荣誉。GCC的卓越是不言而喻的,连微软的员工也在使用GCC,学习GCC就是和世界上最优秀的程序员并肩作战。
GCC最早是在Unix平台上开发的,所以在Solaris/Linux/BSD等Unix平台上是默认组件。通过黑客们的努力,GCC已经被移植到Windows平台,而且性能绝无缩水。Win平台下的GCC有两种形式,一种是集成开发环境的,典型的是DEV-CPP,另一种是纯粹编译器和命令行指令集合,以MingW项目为首。
GCC的缺点是对新手不友好,命令行编译方式需要学习才能彻底掌握。
LCC-Win32
这是个小巧的纯C集成开发环境,目前最高版本4.0,和上面三个编译器相比,它有很多明显的优势。
第一她很小巧,全部安装不过30M多,相比VS2005这种庞然大物,简直是迷你的不行。虽小却不缩水,他的确能够编译出Win下的可执行程序,这一点是同样小巧的TC做不到的。可以肯定地说他是Win平台下体积最小的C环境。第二他完全支持C99标准。VS2005基本不能支持C99标准,GCC可以支持C99,但需要适当的配置,而LCC-Win32原生支持,无需任何调节。第三点最关键,它是自由软件,也就是说,他和GCC一样可以免费使用,而且作出的程序也可以自由的销售。缺点是缺少中文文档,无中文版是使用上最大的不便。
还有其它一些编译器,比如Borland的C++编译器BCB系列其中包括免费BCB5命令行版,Intel的Intel CPP Compiler等。在《C++编译器推荐目录》一文中有一个收集的编译器列表,各位可以前往参观。Blog: http://blog.csdn.net/sunwhite 。编译器如此之多,在下就不一一介绍了。
还有些可以配合编译器的开发环境
上面提到的或者是编译器,或者是整合编译器的开发环境。实际上有时我们还用另一种形式,就是用一个开发环境再搭配一个已有的编译器。
首先是业界很有名的Eclipse,这个是由IBM公司开发的一款java的IDE。但由于他设计出色的插件机制,使得在安装了插件之后,他可以通常充当C/C++的IDE。不过,只是在编辑上提供了方便,如果要编译程序的话,就要配合GCC的编译器才行。其实安装插件和编译器之后,Eclipse可以充当C/C++ python perl等很多语言的IDE。
第二个是一个开源的C++IDE,名叫Code::Bblocks。开源、跨平台、代码提示、支持插件、支持代码折叠,配合GCC可以说是完美的IDE,性能与VS2005不相上下。唯一的问题是:自从2005年10月25日发布了1.0rc2版本之后,就没有新的更新了。按官方的说法是在内核部分作重大修改,不过这个时间也太长了些。
第三个应该是算一大类,就是配置好的文本编辑器。Editplus、VIM、Emacs,这三个编辑器非常有名,而他们的可配置型使得他们能够很方便的成为准IDE。尤其是Emacs,当Emacs设置完成的时候,程序员根本不必退出他,就可以完成编程的所有工作。Emacs被戏称为程序员的操作系统,意思是它不仅仅可以用来编程,他可以做一切事,只要配置完全。
他们在哪里
理论上来说,这个问题应该自行通过搜索引擎解决,但我们还是不厌其烦的提供帮助。
TC20可在众多编程入门论坛找到,在VCgood论坛的空间也可。http://www.programfan.com/showdown.asp?id=152 此处也有。
VS6和VS2005建议直接买盘,要找建议通过电驴或BT等工具。
此处也有VC6 http://soft.zt169.com/Software/Catalog130/1569.html
此地址为VS2005 http://soft.zt169.com/Software/Catalog152/5496.html
GCC的dev-cpp版本在此,http://www.bloodshed.net/devcpp.html
GCC的MingW版本在此 http://www.mingw.org/download.shtml
lcc-win32可在 http://www.cs.virginia.edu/~lcc-win32/ 找到,英语很简单,很容易找到下载点,下载之前要填个名字。且本论坛空间也有。
怎么安装他们
除了GCC之外,上面提到的其他编译器都是很容易安装的。他们或者是简单的压缩包,释放即可,或者是标准的windows安装程序,相信大家都很熟悉。GCC的安装别具一格,要特别提一提。
dev-cpp版本的GCC是标准的windows安装程序,但MingW版本不是。MingW版本的GCC继承了UNIX应用程序的风格,简单来说就是小工具的集合。MingW就像一大堆积木组成的,你需要哪个功能,就把哪个模块下载并复制到适当的位置,他就可以工作。
具体操作流程如下:(PS:软件中所提版本以页面上最新为准)
1.下载
到MinGW的主页下载各个组件的最新版本: http://www.mingw.org/download.shtml
以下几个组件是必须的
binutils 其中包括ld,as等编程需要的程序组
gcc-core C语言编译器
mingw32-make Make程序
mingw-runtime 其中包括编译程序的大部分头文件和库文件(不包括Win32API)
w32api 这个里面是Win32 API 的头文件和库文件
其他组件可以根据需要下载,反正多装不影响。作者机器上还有如下组件:
gcc-g++ C++编译器
gdb 调试器
mingw-insight 调试器的图形化界面
软件包都提供了源代码版(src)和二进制版(bin),下载二进制版本即可。
2.解压
下载后,全部解压缩到同一个目录中,比如 C:\MinGW目录中。如果存在重名现象,通常都是许可证等的文件,可以覆盖掉或者不复制。
因为这些程序包都是使用GNU的压缩工具生成的,所以文件名不是zip,通常是.tar.gz。你可以用WinRAR打开,此处作者推荐著名的工具 7-zip 。
3. 设置环境变量如下:(假设mingw安装在C:\MinGW,且注意GCC的版本,这里假设为3.4.5版)
PATH : C:\MinGW\bin; (如果安装过其他c++编译器,务必把你要使用的编译器路径放在最前面)
LIBRARY_PATH :C:\MinGW\lib
C_INCLUDE_PATH :C:\MinGW\include
CPLUS_INCLUDE_PATH:C:\MinGW\include\c++\3.4.5;C:\MinGW\include\c++\3.4.5\mingw32;
C:\MinGW\include\c++\3.4.5\backward;C:\MinGW\include
=========================================分割线================================
六、TC下常见的问题解决
用TC创建第一个程序
用TC编辑和编译都很方便。
首先是菜单 File->new,在编辑区也就是那一大块蓝色的地方输入你的代码,然后file->save,会提示输入文件名并保存在合适的路径。
选择菜单Complie->compile或者按快捷键Alt+F9,就可以编译你的程序。编译成功后可以用菜单Run->Run或者按快捷键Ctrl+F9可以运行它,如果发现画面一闪而过,可以用菜单window->user screen或者按快捷键Alt+F5来查看。
如果编译失败,通常会给出提示,并且光标会停在第一个出错点,请仔细阅读。如果你要寻求帮助,也最好把错误提示贴给大家看。反复修改,直到程序通过。
TC的库路径设置
使用TC会遇到的第一个问题是库的路径设置。
当新手第一次用TC学习C语言,他们信心满满地照着书上的例子输入代码(这个例子往往是HelloWorld),存盘,编译,希望能看到想象中的结果,但却惊讶的发现TC报错。能看明白TC说的是缺少文件的人已属不错,大部分是不知道问题发生在哪里。
排除输入错误这类问题之后,这种情况通常只剩下一个原因,那就是TC的库文件的路径设置错误,解决方式如下。
目前安装TC通常不是使用安装文件,而是用解压缩的方式放到硬盘上的。这种方式会释放出一个名为TC20或者TC30的目录,里面有全套文件,包括默认的运行参数。这个默认参数所记载的TC目录的位置通常是C:\TC20,这就是问题所在。如果你的TC确实在那个位置,万事大吉,可惜通常情况不是这样的。
动手解决之前,首先检查你目前TC所在的路径,确保路径经过的每一个目录的名字都不超过8个字符,也没有中文或其他语言的字符,就是说确保目录名称都是8个英文字符或数字。我假设你的TC安装在X:\foo\code\TC
然后打开你的TC,打开Options菜单,可以用鼠标点击,也可以按键盘的Alt+O。用方向键移动到Directories菜单,回车之后就能看到一个窗口,这就是设置的地方。
在第一个输入栏里写上X:\foo\code\TC\include,这是头文件所在的目录。
在第二个输入栏里写上X:\foo\code\TC\lib,这是库文件所在的目录。
第三个输入栏是输出文件的路径,也就是编译完成的程序所在的位置。第四个是TC启动时搜索源代码的路径。这两个路径你都可以设为你喜欢的位置。
然后就可以ok确认。请选择Options菜单下的save命令来保存,避免以后再次设置。
至此问题解决。再次编译程序就可以通过。
PS:使用安装文件方式安装不会出现这个问题,但我已经很少看到TC的安装包了。
TC下的图形编程设置
很奇怪我们的教材却乐此不疲地要求学生们练习TC下的编程,而且是图形编程。因为这实在是太落伍而没有实际价值的要求。当然作为图形编程的练习,因为他够简单,也就可以理解了。
这个部分最好的文档就是上面提到过的王大刚先生的教材,其中专门有一章图形函数,详细讲解了所有的问题和事项。http://www.cnread.net/cnread1/dnwl/cxsj/c/cyyb/041.htm
鉴于有很多人不习惯认真地看文档,而偏爱直接发言。他们即使看完文档也还是会提问为什么我的TC图形程序不能运行。我就再麻烦一点,先讲一下两个最有可能导致无法运行的原因。
第一:使用图形函数时要确保有显示器图形驱动程序*BGI, 同时将集成开发环境Options/Linker中的Graphics lib选为on, 只有这样才能保证正确使用图形函数。图形驱动程序由Turbo C出版商提供, 文件扩展名为.BGI。根据不同的图形适配器有不同的图形驱动程序,你可以在TC的安装目录下找到他们。
第二: 在屏幕作图之前, 必须根据显示器适配器种类将显示器设置成为某种图形模式, 在未设置图形模式之前, 所有图形函数均不能工作。设置屏幕为图形模式, 可用下列图形初始化函数:
void far initgraph(int far *gdriver, int far *gmode, char *path);
其中gdriver和gmode分别表示图形驱动器和模式, path是指图形驱动程序所在的目录路径。
典型用法是 initgraph(&gdriver, &gmode, “c:\\tc”);
注意path应形如”c:\\tc的形式,使用两个 \ 来转义表示单个字符\
其他问题请自行查阅文档。
也可查阅此帖 http://www.vcgood.com/bbs/forum_posts.asp?TID=1188&PN=1
我的程序在TC下可以编译,在VC/GCC下为什么出错
很简单,如果程序只涉及C语言本身和标准库,那么在任何平台都是可以运行的。而你运行出错的那些程序一定是调用了TC平台特有的服务和函数。比如,上一节提到的TC下的图形函数,在VC中完全不被支持,由GDI系统取代了,在Unix下的GCC中也要调用其它的图形函数库。同样的还有TC下的内存驻留程序,调用中断(如int13h进行硬盘读写操作)的程序。但此类程序可以在TC中编译通过后,由Win提供模拟DOS环境运行。
这也是我们建议新手尽量少用TC作为开发平台的原因。
=========================================分割线================================
七、其它编译器问题
用VC创建第一个程序
用VC创建程序取决于你的编译方式。
如果你选择命令行编译,你可以用你喜欢的任意文本编辑器编辑源代码(通常我们就用VC的环境),保存为后缀为.c的文件。然后转到命令行,输入 cl ,回车。你应该看到这样的话:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80×86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
usage: cl [ option... ] filename… [ /link linkoption... ]
这是VC的编译器程序 cl.exe在无输入时的结果。如果你没有看到cl的招呼,而是这样的一段话:
“’cl’ 不是内部或外部命令,也不是可运行的程序或批处理文件。”
这说明你没有安装VC,或是你安装的VC存在某些错误。其实也不是什么严重的错误,就是程序没有设置路径。假设你的VC安装在 D:\vs60,那么在控制台输入 SET PATH=d:\vs60\VC98\Bin;%PATH% ,再运行VCVARS32.BAT就可以了。
假设你的程序在 E:\cppcode 名为 Demo.cpp 那么输入:
cl Demo.cpp
一切顺利的话,就是这样的文字:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80×86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
demo.cpp
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:demo.exe
demo.obj
这是告诉你编译成功,编译出了一个名叫demo.exe的可执行文件。如果输入:
cl /Fea.exe demo.cpp
编译出的可执行文件就叫a.exe,这是用参数控制编译的过程和结果,以后常常会用到。现在可以键入 demo.exe(或是a.exe),运行程序。
这就是使用VC在控制台编译程序,是我个人推荐的编译方法。
如果你选择在集成环境中编译,那么要在VC中选择:
菜单->file->new->Projects->Win32 Console Application,输入你的程序名,选择路径,在之后的操作中选择An Empty Project,这样就新建了一个空的控制台工程。
然后再菜单 file->new->Files->C++ Source File,填上文件名。
然后你就可以在打开的编辑区中编辑。最后,单击工具栏上的 save all 按钮,以保存你所有的工作。编程是个体力活,经常保存你的成果是非常明智的。
要把他编译成可执行的程序。选择菜单 Build->Build Hello.exe,稍等片刻。你会看到在屏幕下方出现了一个新的窗口,上面会依次出现如下的文字:
Compiling…
Demo.cpp
Linking…
Hello.exe – 0 error(s), 0 warning(s)
如果看到以上文字,尤其是最后一句,表示程序顺利的编译成了可执行代码。
如果情况是类似这样:
Compiling…
Demo.cpp
E:\cppcode\Hello\Demo.cpp(8) : error C2143: syntax error : missing ‘;’ before ‘string’
Error executing cl.exe.
Hello.exe – 1 error(s), 0 warning(s)
这表示程序有错而无法通过编译,你需要寻找出错误并修改。对于本例,是输入错误,请检查大小写,标点符号和中英文状态。改正之后,重新保存文件,再次编译,以上过程要反复的进行,直到编译通过。
编译通过的程序就可以运行了。选择菜单 Build ->Execute Hello.exe。
如果一切顺利,你应该看到了运行的结果。一个黑底白字的窗口,上面有两排字:
Hello World!
Press any key to continue
其中第一句是程序运行的结果,第二句是操作系统告诉我们,随意按一个键,便可结束该程序。
VC下的入门教程 可参见此帖 http://www.vcgood.com/bbs/forum_posts.asp?TID=1214&PN=1
用DEV-CPP创建程序
使用DEV-CPP的操作类似于用VC在集成环境下创建,也是新建工程,输入代码,然后编译连接,最后运行。差别只在于菜单和快捷键的设置。总体来说,DEV-CPP的编译速度要比VC慢一些。
用MingW创建程序
用MingW操作类似于用VC在命令行下编译。不同之处是控制台的命令是gcc 。命令形式为:
gcc demo.cpp,在Win下默认输出文件为a.exe
MingW不自带编辑器,因此用户要自己选择合适的编辑器,通常我们推荐Editplus gvim和Emacs这三款。后两款功能强大到无以复加,但需要学习。
GCC的简单使用教程见以下几帖
http://www.vcgood.com/bbs/forum_posts.asp?TID=1197&PN=1
http://www.vcgood.com/bbs/forum_posts.asp?TID=517&PN=1
http://www.vcgood.com/bbs/forum_posts.asp?TID=340&PN=1
Vi编辑器的使用可参见此帖
http://www.vcgood.com/bbs/forum_posts.asp?TID=141&PN=2
用Lcc-win32创建程序
Lcc-win32的使用类似于dev-cpp,不同点是它的项目设置不在项目目录里的单独文件中,而是直接记录在注册表。
有关Lcc-win32的资料可以参考lcc-win32的使用说明 http://www.blogjava.net/bluesky/archive/2005/11/30/21919.aspx
=========================================分割线================================
八、结束语
程序员成长的六个阶段
著名程序员梁肇新先生在他的《编程高手箴言–高手是怎样练成的》一书中提出了程序员成长的六个阶段,你到达了哪一个阶段呢,又有信心到达哪个阶段呢。
一个程序员的成长可分为如下六个阶段。
第一阶段 :
此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。
第二阶段 :
此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库函数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。
第三阶段 :
此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。
第四阶级 :
此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。
这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是比较困难的。为什么会难呢?这就是因为很多人的思想转变不过来。
第五阶级 :
此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对市面上的任何软件进行剖析,并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会设计出来。
第六阶级 :
此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么代码就能表示的。也就是“手中无剑,心中也无剑”。此时,对于练功的人来说,他已不用再去学什么少林拳,只是在旁看一下少林拳的对战,就能把此拳拿来就用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。
每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐心地去学习。
要想从第二个阶段过渡到第三个阶段,就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。但是,有些人到达第三个阶段后,常常就很难有境界上的突破了。他们这时会产生一种观念,认为软件无非如此,认为自己已无所不能。其实,这时如果遇到大的或难些的软件,他们往往还是无从下手。
现在我们国家大部分程序员都是在第二、三级之间。他们大多都是通过自学成才的,不过这样的程序员一般在软件公司也能独当一面,完成一些软件的模块。
但是,也还有一大堆处在第一阶段的程序员,他们一般就能玩玩VB,做程序时,去找一堆控件集成一个软件。
初级程序员和高级程序员的区别
一般对于一个问题,初级程序员和高级程序员考虑这个问题的方法绝对是不同的。比如,在初级程序员阶段时,他会觉得VB也能做出应用来,且看起来也不错。
但到了中级程序员时,他可能就不会选择VB了,可能会用MFC,这时,也能做出效果不错的程序。
到高级程序员时,他绝对不是首先选择以上工具,VB也好,VC也好,这些都不是他考虑的问题。这时考虑的绝对是什么才是具有最快效率、最稳定性能的解决问题的方法。
软件和别的产品不同。比如,在软件中要达到某个目标,有n种方法,但是在n种方法中,只有一种方法或两种方法是最好的,其他的都很次。所以,要做一个好的系统,是很需要耐心的。如果没有耐心,就不会有细活,有细活的东西才是好东西。我觉得做软件是这样,做任何事情也是这样的,一定要投入。
程序员到达最高境界的时候,想的就是“我就是程序,程序就是我”。这时候我要做一个软件,不会有自己主观的思路,而是以机器的思路来考虑问题,也就是说,就是以程序的思考方式来思考程序,而不是以我去设计程序的方式去思考程序。这一点如果不到比较高的层次是不能明白的。
你设计程序不就是你思考问题,然后按自己的思路去做程序吗?
其实不是的。在我设计这个程序的时候,相当于我“钻”入这个程序里面去了。这时候没有我自己的任何思维,我的所有思维都是这个程序,它这步该怎么走,下步该怎么走,它可能会出现什么情况。我动这个部分的时候,别的部分是否要干扰,也许会动一发而牵全身,它们之间是怎么相互影响的?
也只有到达这个境界,你的程序才能真正地写好,绝对不是做个什么可视化。可视化本身就是“我去设计这个程序”,而真正的程序高手是“我就是程序”,这两种方法绝对是不同的。比如,我要用VB去设计一个程序,和我本身就是一个程序的思维方式,是不一样的。别人也许觉得操作系统很深奥,很复杂,其实,如果你到达高手状态,你就是操作系统,你就能做任何程序。
对待软件要有一个全面的分析方法,光说理论是没有用的。如果你没有经过第一、第二、第三、第四这四个阶段,则永远到达不了高境界。因为空中楼阁的理论没有用,而这些必须是一步一步地去做出来。
一个高级程序员应该具备开放性思维,从里到外的所有的知识都能了解。然后,看到世界最新技术就能马上掌握,马上了解。实际上,技术到达最高的境界后,是没有分别的。任何东西都是相通的,只要你到达这个境界以后,什么问题一看就能明白,一看就能抓住最核心的问题,最根本的根本,而不会被其他的枝叶或表象所迷惑,做到这一步后才算比较成功。
从程序员本身来说,如果它到达这一步以后,他就已经形成了开阔的思维。他有这种开放性思维的话,他就能做战略决策,这对他将来做任何事情都有好处。事实上,会做程序后,就会有一种分析问题的方法,学会怎么样把问题的表象剖开,看到它的本质。这时你碰到任何具体的问题,只要给点时间,都能轻而易举地解决。实际上,对开发计算机软件来说,没有什么做不了的软件,所有的软件都能做,只是看你有没有时间,有没有耐心,有没有资金做支撑。
“我就是程序,程序就是我。” 梁肇新先生的这本 《编程高手箴言》这本书就是他自己十余年来编程经验的集结。全书通篇没有时髦的IT新名词或新思想,而是踏踏实实地对很多知识进行了深刻的剖析,这有助于为编程打下坚实的根基。只有这样,才能使开发者在飞速变化的软件领域里免于雾里看花,才能更快更深地认识许多新问题、新知识,也才能更从容地应对未来之挑战。相信这本书对广大程序员大有裨益,无论是从技术角度还是从职业生涯指导角度。
内容涵盖了从认识CPU、Windows运行机理、编程语言的运行机理,到代码的规范和风格、分析方法、调试方法和内核优化,内有作者对许多问题的认知过程和透彻的分析,以及优秀和精彩的编程经验。建议朋友们都设法弄来一看。
=========================================分割线================================
FAQ暂到此结束,如有问题,欢迎提出。
IT学生解惑真经
非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。
——–韩愈《师说》
在校的IT学生有几百万
都在为如何如何学习才能找到工作、融入社会而迷惑
我们需要的不是灵丹妙药
而是一本让你少走几年弯路的
IT学生解惑真经
肖舸 杨中科 左飞 著
这是一部写给在校计算机专业学生的书
如果没有看到这本书
你可能会茫然无措的度过学习阶段
把这本书推荐给你的同学
你会得到更多朋友
序
中国IT领域的发展速度之快令世界瞩目,但是中国的计算机教育却没有能够跟上。因此,在各大高校扩招的同时,IT培训机构同样发展的很快。
然而,学习IT的学生却仍然面临着其他专业不一样的困惑。因为IT技术发展很快,而课程体系并不能很快跟上,因此学生在学校并不了解企业需要什么,自己需要学习什么。
正是在这种情况下,CSDN作为最大的IT技术社区,我们看到了IT学生所面临的困惑。于是专门推出了学生大本营(http://student.csdn.net),邀请了上百位在企业一线的技术高手和专家,IT培训机构的精英老师加入进来,针对IT学生所面临的通用问题进行解答。这些老师是站在过来人的角度,耐心的分析现在的市场、同学的心理,以及面临的机会和挑战,更重要的是,每位老师都给出了具体的建议。只要认真的读取这些老师的回信和总结,你总能从中获得自己想要的答案。
韩愈的《师说》中写道:“非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。”有了这些困惑并不可怕,可怕的是不知道如何寻找答案和解决问题的方法。
现在,就开始在这些老师的文章中寻找答案吧。
CSDN创始人 蒋涛
IT学生解惑真经
目 录
大学计算机课程学习路线 2
如果你是一个计算机相关专业大学低年级学生,那么这篇文章就是为你写的。我之前曾经发过一篇博文《大学计算机专业那些课》来谈论大学中各门课程的意义和重要性。那是针对更宽泛的范围来说的,这篇文章则更加精要和简约。
考研还是不考? 5
有很多同学发出过这样的疑问“到底应不应该考研?”,很多同学都被这样的问题困扰着。“考研”这个词围绕在我们每个人周围,学校海报栏中最大的广告一定是考研培训班的,学校书店里卖的最火的书一定是考研的辅导书;同学们之间经常聊的也是“你考不考研,想考哪儿的研?”,仿佛不想考研就是没追求的表现。
做什么样的软件才能赚钱?学什么样的知识才能赚钱? 14
我到学生大本营半年,发现大家都没有讨论过。那就是,做什么最赚钱?无可否认,软件可以实现各方面应用,不过,就我的观察,在现实生活中,有两种软件最赚钱,一种是数据库,一种就是嵌入式底层的东东,嗯,随着互联网的发展,目前做网络程序也很赚钱。
程序员如何踏上社会 22
目前在学生大本营里,我也观察到,很多二本,三本的同学,在心里上有种自卑感,总觉得考分低了,出来就低人一头。这点,我是万万不赞同的。人一生是很复杂的,和邓大爷一样,三起三落不到头,关键是,你现在准备做什么?你能坚持多久?
职业生涯第一步—-选择你的城市 27
目前,感觉很多同学,在双选会签约,工作地点的选择上,有一定的盲目性。很少有人能主动地去选择合适自己的城市,因此,这里提出一点讨论。一家之言哈,欢迎拍砖。
关于女生的程序员之路 33
目前大学里面有句话:“干得好不如嫁得好!”,我想大家都听说过。其实是人就有惰性,也有一些劣根性,都想找一些活少拿钱多的工作,舒舒服服地赚钱,这种思想,其实不管男人女人都有。我自己也有,呵呵。关键是,社会是公平的,一分贡献,一分收获,哪有那么多不劳而获的事情。
如何找需求练技术 37
被很多同学问,怎么才能知道用人单位的需求。这个给个建议哈:去CSDN或者其他什么网站的项目外包栏目看看,里面的需求,就是别人肯付钱的需求,自己试着实现一下,比较练技术。如果能卖出去,就表示技术练差不多了,可以凭这个项目经验找工作了。个人感觉,这个项目经验在找工作的时候,有时候比学历证书管用。
修炼编程的内功 39
什么叫编程的内功?我的理解,就是对这个世界的抽象化理解能力以及描述能力。一个工作,能迅速从中提炼出下次可以重复的套路,并且能以一定的规则,就是计算机语言规范,描述出来,拥有这两个能力,就能保证遇到任何问题,都有办法写出程序来。所以,大家学校中学了很多数学,语言,算法,数据结构,甚至编译原理,操作系统,其实这些统统是工具,不是写程序的目的。
7000块钱能买什么?–答一位同学的培训问题 45
大家不妨扪心自问一下,学培训班,是为了找工作,还是为了跟风,还是为了学到真本事?自己有没有决心,让这7k物有所值?如果大家能像这样有割肉的感觉去学习,把自己往死里逼,这7k就花的值得,该学,如果没有这个劲头,学了和没学一码事,建议还是省省吧,替你爸爸妈妈省点钱。
构建自己的不可替代性 49
我问过很多年轻的朋友,他们在找工作的时候,最看重什么?答案很多啦,公司要够大,薪水要够高,要有足够的挑战性,要有成就感。。。等等,当然,也有一脸茫然的,那是还没有想好的。其实后来我考虑了一下,这个话题可以换个方式问,就是大家为什么需要找工作?其实人生活在社会上,公司里,最关注的,还是安全感。
简述C和C++的学习历程 53
总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。一家之言,欢迎拍砖哈。
IT业的职业细分 58
在大本营看到很多同学讨论以后的出路,感觉到大家对IT业职业的细分还不是很了解,这里就我的经验,给大家一点参考,希望能帮到大家。一家之言哈,欢迎拍砖和补充。我在IT业很多年,也仔细分析过IT业的职业构成,就我的了解,其实IT业也在细分,大致分为如下几种……
选择技术还是选择销售? 63
我看了你的信,你说大学没有学习好,虚度了光阴,现在培训班,觉得自己缺乏钻研(注意,不是专研)精神,不想做技术了,想做业务,我根据你的文字,理解这个业务就是销售工作。但是又觉得自己这么多年在技术上投入过多,舍不得。
这么多技术我该怎么学 67
什么都想学。恨不得把所有的知识统统都塞到肚子里去。看到什么,想学什么!这是几乎所有在校大学生的通病。但是,这不是坏事,甚至可以说是好事。说明了你“求知欲”高!总比那些,生活没有激情,整天知道泡妞、上网、打游戏、混日子的强。
金融危机下的职业思考—-答一位同学的问题 70
在你的问题中,你有一个大前提,就是金融危机,导致就业机会偏少,我个人认为,其实没有必要这么悲观的。你的问题让我想起了十年前,98年到2000年的经历,估计你那时候还没有考虑到就业问题,不过当时我可是身历其中,现在想想,其实当时有很多想法也不是很正确。
简述如何书写工程化的简单代码 74
在坛子里混了这么久,看了很多同学的代码,感觉到大家的代码,学校里面的书生气有点重,对于细节考虑不够,有时候,感觉和吃了颗苍蝇一样,确实很不舒服。这里根据我个人的经验,给大家简述一下,工程化代码,以及简单代码,不容易出错的代码的一些基本写法。
附:作者简介&编者后记 81
大学计算机课程学习路线
左飞老师
如果你是一个计算机相关专业大学低年级学生,那么这篇文章就是为你写的。
我之前曾经发过一篇博文《大学计算机专业那些课》来谈论大学中各门课程的意义和重要性。那是针对更宽泛的范围来说的,这篇文章则更加精要和简约。因为这里研究的仅仅是核心计算机课程,更重要的是,这里要说的是这些课程之间的关系,以及它到底讲得是些什么东西。我想这些课程最终是要组成一个体系的。
请注意我这里所说的是通常情况下的核心课程,每个学校在课程设置是可能是存在差异的,但总体上框架应该是不变的。
最开始的第一门课应该是“C语言程序设计”,这基本上属于你日后一切学习的开始,简单说这门课程的主要目的和内容就是介绍一种计算机语言的语法内容,至于怎么学好它,之前的文章都谈过了,这里就不罗嗦了。
之后的课程会分为三条线,第一条线的第一门课程是“数据结构与算法”。这很简单,一些有了语言基础之后,为了更好的使用语言去解决问题,就必须学习结构知识和算法。至于怎么学好它,之前的文章也谈过了——请注意,如何学都不是本文的重点。本文的重点在于告诉你你将来都会学些什么以及该学些什么。
“数据结构与算法”的后续课程是什么?答案应该是《编译原理》。很奇怪吧?课程就是这样设计的,其实这个路线也不是我发明的,国外大学的CS Course的体系也是这么设计的。编译原理说白了就是介绍编译器如何工作的,是让计算机理解计算机语言的一种方法和理论。这个工作过程之中蕴含了大量的算法,而且是非常复杂的算法,很多人甚至认为编译原理是计算机专业本科阶段最难的一门课程。主要就是因为这里面的算法太复杂,当然也会用到很多结构,树可能是用得最多的。当然,这就是相当于是数据结构与算法课程的一个后续性课程,类似一道附加题。最近听一个学生说有些学校本科已经取消这门课了,我想应该是较少一部分学校的做法吧。不过,中国的学习并不太重视这门课倒是真的。一般课程设置就是一个学期左右的课时。但是一般的国外学校这门课都要学上1年,甚至两年之久。这条线路到编译这里就应该是终点了。
下面我们来谈谈大学计算机课程学习的第二条路线。
在你具有了一定C语言基础之后,除了前面讲的第一条路线以外,你已经可以开始下面这条路线的学习了。
为了更好地探究计算机系统的研究机制,在学习了C语言之后,下面一门需要学习的课程是“汇编语言和微机接口技术”,这门课程包含两部分的内容,一部分就是汇编语言,汇编是一种更底层的语言(相对于C而言),说白了它就是一种“用助记符描述的机器语言”。很多人刚学汇编的时候都觉得很复杂,因为它跟硬件紧密相关,就是那些个寄存器也够初学者糊涂一阵子的。这门课程的另外一部分内容是微机接口技术,目前国内高校这部分内容都是基于80X86系列芯片的。已经可以看到这门课其实涉及到了很多硬件的知识,其实还不止,关于I/O控制,寄存器,中断,这门课里都有体现的。
接下来要学习的内容就是《计算机组成原理与体系结构》。其实我特别奇怪,我在写学习路线1(也就是前一篇文章)的时候,有读者认为在学习C语言之前,或者在学习其他专业课程之前,最先要学的就是这个东西。我不知道大家是不是觉得大学第一门专业课就是这个,我觉得这么想的人是不且实际,信口开河的。这门课程还是比较深的一门课程,在汇编和接口之后安排这门课程是比较的。不过国外的一些先进的计算机教育体系确实也有在较开始的时候开设一门概论课来作为导引,有时候叫Computer System Introduction,有时候叫Computer Culture,其实内容差不多,但作为计算机专业课程的导引课程,这些课程的设置里面已经设计到组原和OS的初步内容了。但这和Computer Structrue & Architecture还是有区别的。
接下来的一门课程是《计算机操作系统》,如果外行听起来可能觉得这个课应该是学如何使用操作系统的吧,就像“WindowsXP 速成”?非也!这门课程是讲OS是如何设计的,或者说是如何实现一个OS(当然做要比说起来难多了)。之所以这门课程被安排在组原之后,那是因为这反映了一种自底向上的学习路线。操作系统当然是在计算机系统之上来搭建的。向调度啊、虚拟内存啊这些问题都是由操作系统来控制的。我最近所写的《代码揭秘》基本上是属于这条路线上的内容的,不同的是我采用了一种更贴合读者理解方式的描述,因为在讲述这些原理之前,我都是采用C语言实例来作为引子的。有空也推荐大家看看,应该学校里的图书馆是可以借到的。前一阵子一位四川大学的计算机青年教师给我写信谈起我这本书时,我才知道高校的图书馆里原理已经可以借到了。以上就是大学计算机课程学习的第2条路线,下面我们来讲最后一条路线。
最后一条路线属于应用型的,也就是说当你学完了基本的原理之后,一方面为了日后更好的工作,另一方面如果从事研究工作也可择其一而继续深入探究,那么最好总之要上升到一定应用层面的东西。
在你有了一定的C基础之后,学校可能会开一些面向对象程序设计方面的课程,可能是C++或者Java,因为面向对象的语言在实际开发中正广泛的被使用。无论是C++还是Java,跟C来说本质上都是语言,只不过他们多了一些OOP方面的特性。如何学好它们,我前面的文章中已经谈过,这里就不多言了。
接下来的一门课程应该是“数据库系统”,这门课不是教你怎么使用SQL SERVER或者DB2的,学校里的课程远没这么前沿。数据库系统这门课依然偏重更多理论,尽管数据库相比于组原和OS来说已经是上层建筑了。这门课讲的多是些数据库系统设计方面的原则,例如如何解决关系问题或者SQL语言等等。
再之后可能会学的课程是“计算机网络”,这门课里会更加系统的向你介绍网络方面的知识,TCP、UDP,HTTP这些名词会粉末登场。注意这门课一般不是教授你如何布网的,例如如何配置路由器这种东西一般是CCNA里面的内容了。这门课里讲的更多的是上层原理与协议。
以上就是一般的大学计算机课程学习的几条路线。他们彼此联系,共同作用。注意我这里讲的内容不是给你推荐学习方向,而是告诉你大学里会学什么,之间联系如何。从之前的文章评论里不难看出,有的同学好像根本没理解文章的意思,说自己好像更适合哪条路线的样子,其实适不适合哪条线的问题根本不存在,这些东西你都得学,既然学就要学好。本身就是一个体系的,怎么能做瞎子摸象的事情呢?现在CSDN学生大本营搞得不错,资源很多,访问量很大,但也能客观的看出浏览的人真的是分好多等的,有的是谦逊而好学的,有的则是蜻蜓点水的过客。浮躁之气甚嚣尘上,胸中无物自然谈吐轻浮,看什么都不求甚解,浅尝辄止,多少有些自以为是、妄自尊大了。这也是我在此开博四个月余来的感受吧。希望大家都能保持一颗平常心,戒骄戒躁,平和的埋头学习吧。
学生评论:
陈俊强(C/C++学生) :
感谢老师抽空写出这3条线路,我是一名大二的学生,之前在大一的时候参加过思科的CCNA培训,真的那个时候很开心,能自己把实验做出来,但是事后深深的思考后,我究竟懂得了什么呀?难道我只会操作吗?我深入的问一下那为什么这个实验能实现呢?深入到原理性的东西就发现不懂了。跟现在大多数人一下,我也在学习J2EE,但是我已经能从更高的高度去看待这个J2EE体系了,我要求达到的目标是:不仅是懂得操作,而且要懂得原理性的东西。真的,我越来越发现大本营的优点了。
曹秋枝(C/C++学生) :
受教了,很明确的路线。大学里确实是应基础为重,为应用奠定雄厚的基础
河北科技师范学院 刘勤(C/C++学生) :
期待!这个问题从我开始学编程起一直在想,我想很多初学者都很需要老师们这样的指点的…
考研还是不考?
杨中科老师
有很多同学发出过这样的疑问“到底应不应该考研?”,很多同学都被这样的问题困扰着。我今天在这里向同学们统一解答一下,因为内容比较多,我是一边写一边发表,因此这篇文章会分几期贴在学生大本营。
“考研”这个词围绕在我们每个人周围,学校海报栏中最大的广告一定是考研培训班的,不仅很霸道的贴满所有区域,而且“野火烧不尽,春风吹又生”;学校书店里卖的最火的书一定是考研的辅导书;每到临近考研,学校里的自习室、图书馆一定被考研的同学长期“占座”;同学们之间经常聊的也是“你考不考研,想考哪儿的研?”,仿佛不想考研就是没追求的表现。
到考研报名的时候每个班都有相当一部分同学报了名,问到选择考研的原因,回答一般都是:“大家都考研”、“上大学就是为了上研究生”、“工作不好找,只能读研争取好的发展”、“读研能找到更好的工作”、“想读研进一步深造,研究专业知识”、“我一直成绩很好,不读研可惜了”、“我父母让我考研”。
首先我对一些同学的误解进行一一破解。
误解一、“大家都考研,我也考”
“从众心理”是大部分人的心理特点,就像葛优在广告里说的那样“哪儿人多我去哪儿,我就是相信群众”。在大街上大家都爱往扎堆儿的地方走;在火车站里哪怕不知道哪儿是进站口,只要跟着大流走,一般都不会走错;组织班级活动的时候,也经常选择其他班级去过的地方玩儿。因为“跟着大伙走,一定不会有错”。在很多情况下“哪儿人多我去哪儿”是非常合理的一种“选择”方式,因为根据概率来讲,大部分人选择的道路有非常大的概率是正确的道路。好像根据这种说法,“大家都考研,我也就考研”是非常合理的一种想法,可是实际并非如此,因为考研和上边举的这些例子有太多的不同。
首先,目的性不一样。逛街的时候大部分人的目的就是“看热闹”,人越多的地方肯定越热闹;在火车站里,几乎所有人的目标都是“进站”,因此跟着大家走也肯定没错;班级活动,大家的目的都是“玩儿好”,其他班级都选择的地方肯定都挺好玩。可是考研却不一样,考研的目的是什么呢?有人说是“考研成功读研”,注意“读研”只是过程,而不是目的,因为你不可能一辈子“读研”,因此“读研”的目的才是“考研”的目的。很显然,不同的同学考研的目的是不一样的:有的同学是为了考更高的学位,增光耀祖、显耀门庭;有的同学是为了读研、读博,继续深入学习专业知识;有的同学是为了逃避就业压力,拿更高的文凭,找更好的工作;有的同学是为了跨专业考研,去学自己感兴趣的专业;有的同学是为了能从普通大学考入名校,圆自己的“名校梦”。看似大家的共同目标都是“考研”,但是其实每个人都有自己不同的目标,如果没有自己明确的目标就加入考研大军的话,无疑是成为了“群体性盲动”大军中的一员。
其次,选择错误路线后的后果是不一样的。大街上有利用大家的从众心理专门找托儿撑场面的,如果被托儿吸引到这里,却发现没什么意思的话,大不了再去其他的地方;火车站中偶尔也会有临时性的调度,你随大流到了目的地以后却发现,其实那些人是出站,大不了再走回头路重新找进站口;选其他班级都选择活动线路的后才发现其他班的同学太低级趣味了,不符合你们的喜好,大不了这次玩儿的不开心,没有太大的损失。但是考研就不一样了,考研失败了的话,就业的黄金时间已经过去了,再找合适的工作非常难;即使考研成功了,上研以后才发现研究生生活不像自己想像的那样,各种原因导致研究生毕业以后发展还不如那些没上研的同学。一旦考研这条路选择错了,你是没法走回头路的。
从众最大的好处是不用担责任,不用担心选错了道路造成的后果,因为“大不了大家一起死” 。“死亡率”只是一个统计学上的概念,对于我们每个个体来说,死亡率只有0%和100%,因此在决定从众之前,需要掂量一下是否这件事情是否“值得”。
在决定是否考研的问题上,千万不能有“大家都考,我也考”的想法,考研还是不考研,都请“给我一个理由先!”,找到了理由,再往下看。
误解二、“上大学就是为了上研究生”
很多同学从上大一开始就定下了考研的目标,理由很简单“上小学的目的是上初中,上初中的目的是上高中,上高中的目的是上大学,上了大学当然要读研了”,“我一直成绩很好,不读研可惜了”,在这些同学心中,人的前进就是不停的考,有一个网络上流传很广的笑话就很能反映这个现象:“学士上面是硕士,硕士上面是博士,博士上面是博士后,那博士后上面呢? 如果你够勇敢再读2年是勇士,再读5年是壮士,再读7年是烈士,烈士以后呢? 教育部会推出圣斗士,读满2年是青铜圣斗士,5年是白银圣斗士,7年是黄金圣斗士。毕业以后愿意再读上去的女孩子有机会考出–雅典娜”。
如鹏网的朱老师讲过一个真实的故事,他认识的一个人,学习非常厉害,上大学、考硕士、考博士,都是一路顺风,毕业后又考过了司法考试(难度非常高的考试),能考得试都让他考过了,然后发现自己“没得可考”了,失去了奋斗的目标。最后只好进入法院工作,发现自己无法适应实际的工作,找不到以前那种考试时春风得意的感觉,每天都要处理很多自己不愿意处理的事情,最后竟然精神分裂进入了精神病院。
上大学的目标不只有“考研”这一条所谓的“出路”。按照严格的区分,研究生是为有志于从事本专业深层次理论知识钻研而设置的,其培养的目的是“研究员”甚至“科学家”。但是,由于大学扩招、国家产业结果不合理等原因造成大学生就业率和就业质量严重下降,而“研究生扩招”则可以暂时“饮鸩止渴”性质的提升所谓的“就业率”,同时,有些人出于不同的目的也想利用“研究生扩招”大捞一把,因此他们利用在社会上、媒体上的话语权,大肆鼓吹“本科毕业以后还是考研好”,这更是使得很多同学认为“上大学就是为了上研究生”。
同学们可能已经看到了我在上边给“出路”两个字加了双引号,的确,考研不是本科生的“出路”,因为“考研、读研”只是过程,不是出路,除非你想一辈子考呀考,以死前考上“雅典娜研究生学位”为目标,否则一切过程的真正的目标都是“工作、赚钱、娶媳妇、生孩子、养二老、买房、买车、买油、买面……买坟”,你所做的一些事情都应该围绕这个最终目标而进行规划。
不要把“考研”当成唯一的出路,考虑自己的情况,考虑“工作、赚钱”这一终极目标,做出自己的决定。
误解三、“现在工作不好找,只能读研争取好的发展”
这是相当一部分同学决定考研的理由,因为听说毕业工作不好找,害怕“毕业即失业”,因此把希望寄托于通过读研进一步提升自己的实力;有的同学则是到了大四才发现自己没有工作所需要的本领,害怕面对找工作,“考上研究生就能多争取两三年学习时间,上了研一定好好学”。
现在的工作真那么不好找吗?就业机会真的那么少吗?别的专业我不敢妄加评论,看这篇文章的同学大部分都是可能毕业以后要从事IT相关工作的,根据我工作这些年接触的来看,很多IT企业有“人才荒”的现象,也就是很多职位长期缺人,招不到人。有同学听到这里疑惑了“怎么可能缺人呢?每年毕业这么多学生?”,有一句话很伤人、也很找骂,但是我又不得不说“企业不是招要饭的,不是随便招一个阿猫阿狗凑数就行;企业要招的是能帮它赚钱的能人”。
难道是企业里对学生们的要求太高了吗?来听听企业招聘人员的评论吧:
“招聘启事发出去了,邮箱很快就被简历撑爆了,但是大部分简历都是只有个人信息、专业课程设置、从小学到大学的考学履历,最后跟着一封热情洋溢、废话连篇,却空无一物的求职信,好像这几千份简历都像是一个人的简历一样,没有丝毫自己的特色。真不知道除了他满足我们在招聘启事中说的‘2010届应届生’以外还有什么其他条件满足。”
“一个学生来应聘网络管理员,我问他一台计算机连不上网了,有可能有哪些问题,你会怎么进行故障排除。那个同学竟然支支吾吾半天,一句完整的话都没说出来,哪怕说一句‘可能是网线断了’都行呀!”
“一个学生来应聘软件工程师,我问让他写一个打印菱形的控制台程序,这是C语言教材上前几页的最简单的程序,竟然愣了半天一行代码都写不出来,问他当时C语言考试是怎么过的,他回答的很干脆‘就那么过的’!”
其实企业里对应届生要求并不高。比如对于软件开发职位的学生来说,企业里的要求就是“有编程的感觉、动手能力强、好学”,不需要你懂这个工具、那个工具,不需要你会这个语言、那个语言,不需要你懂这个框架、那个框架,只要“有编程的感觉、动手能力强、好学”,那些工具、语言、框架公司只要培训一下就可以掌握,“有编程的感觉、动手能力强、好学”也不是只有聪明的学生才能具备的品质,只要智商正常,平时多动手、多写程序,成为“有编程的感觉、动手能力强、好学”一点都不困难。可是实际情况是,纵观一个有50个学生的班级,有10个人对学习完全不感兴趣,有10个人对本专业完全不感兴趣,有10个人迷迷糊糊,有10个人只会死读书,还有5个人今天学两页C语言、明天学两页Java、后天学两招黑客技术,真正能踏实下心来多动手、多写程序的能有两三个就相当不错了。
有一个笑话大家都听说过: 有两个人在森林里散步,忽然出现了一只大老虎,一个人忙伏下身去系鞋带。
另一个人问:“你系什么鞋带啊?你难道还能跑得过老虎吗?”
这个人说:“我那能跑得过老虎啊。不过我只要跑的过你就行了!”
在班级里学习成绩名列前三名是比较困难的事情,但是成为被企业相中的两三个人却是非常轻松的事情,因为大部分人不会“多动手、多写程序”,而你只要“多动手、多写程序”就足够了。有同学会问“我们班的同学都看了这篇文章,那岂不是他们都和我一起努力竞争了,我又没有优势了?”,同学们太高看我了,我没那么大的能量,我不比游戏更能吸引同学,很多你的同学根本不会看到我这篇文章,哪怕有人看到也只会随便瞄一眼,而能认真看完这篇文章的则又少之又少,认真看完这篇文章并且相信我讲的这些道理并且长期坚持照着做的能多一个我就很欣慰了。
因此那些害怕工作不好找而想考研逃避的同学大可不必担心,只要你能比身边的同学多努力一小点儿,就可以很轻松达到企业对应届生的要求。及时那些大一、大二、大三都玩儿过来的同学也不必担心,踏实下心来,用剩下的半年到一年的时间集中强化一下自己,想搞编程的吃准自己最熟悉的语言多练、多写,想搞网络管理的同学报一个思科培训班苦练实际的技能,想搞嵌入式开发的同学弄个开发板把常用的嵌入式功能实现……,相信半年之后达到企业的要求轻而易举。
如果你只是怕工作不好找而考研的同学到这里就不用往下看了,关了这个网页抓紧“系鞋带”去吧。
误解四“我父母让我考研”
现在有一些大学生让人感觉很可怜,从小就被家长安排着,早餐吃什么、买什么衣服、放学了去哪儿玩、周末做什么、上哪所小学、上哪所中学、学文科还是学理科、报哪所大学、考哪个专业……一切一切都听父母的。
在我们小时候,父母在我们心中就是超人,什么都懂、什么都能干,可是你在茁壮成长,父母却在慢慢老去,总有一天在知识、阅历、判断力上会不如你。父母永远是爱孩子的,做的一切的决定的初衷也是会孩子好的,可是有时候他们的好心会办成坏事的。
我认识的一个在读硕士的朋友说,他父母在规划他未来的时候,说他家里几代人没出一个“有文化”的人,希望他好好努力,能考多高就考多高,“硕士上完了,考博士,博士考完人考博士后,无论你考多高我和你妈都全力供你上学,咱们要增光耀祖!”,可怜天下父母心呀,希望孩子成为地位高的人,这样以后就可以说“我们家孩子是博士后!”,他们连“博士后其实是找不到工作的博士,不是比博士更高的学位”这样的事情都不知道,他们的安排我们怎么能听呢?
父母给了我们生命,供养我们长大、上学,是永远值得我们去尊重和孝敬的,但是他们的想法并不总是对的,如果不自己分辨只是一味听他们的话,早晚有一点会被他们的好心害惨的。
有一个很老的纪录片叫做《狐狸的故事》,它讲述了一个自然界的生存法则:一窝小狐狸出生了,在老狐狸的呵护下成长,小狐狸渐渐长大了,外形已经显得跟父母一样高大。老狐狸一朝突然变脸,驱赶小狐狸出门。被赶出家门的小狐狸好生可怜伤悲,不愿离开,一次次回家门口,但是老狐狸不仅不让小狐狸进门,反而以“疯狂地嘶咬”的方式,生把小狐狸撵走。从此,小狐狸一个个无依无靠,形单影只,在饥恶、天敌和猎人的胁迫下到处流浪。经过重重考验,小狐狸终于获得了在恶劣的条件下顽强的生存的能力。狐狸尚且懂得这个道理,那我们人呢?
有的家长是懂得这个道理的,从很小就培养孩子独立做事、独立思考的能力,家长不对孩子轻易做干涉,最大程度的尊重他们自己的意愿,这样环境中成长的孩子往往能成为社会中的强者。但是不幸的是,大部分的家长是不懂得这个道理的,只要他们还能动,就尽他们的一丝力为孩子创造条件、选择道路、扫清障碍,慢慢的培养了一批离了父母就无所适从、没有任何生存能力的孩子。
如果你的父母还在尽力为你做着决定,那么请你很尊敬的告诉你的父母:“爸!妈!谢谢你从小到大为我做的一切。现在我长大了,我要学着自己做决定了。我会向着进步的方向前进的,不要担心我。是不是考研我会自己决定的,我会认真考虑你们给予我的建议的。我会找到自己的路,无论做什么决定,我都会做一个好孩子。我要成长为一个有能耐的孩子,然后有能力孝顺你们,赡养你们!”。
无论是在是否考研这件事情上,还是在以后的其他事情上,把父母的建议当成一个朋友、一个长者的参考,然后最终自己决定吧!
误解五“很多工作都要求硕士学历,找工作的时候满地都是硕士”
很多同学听说过类似的传言:现在找工作的时候大部分公司都要求硕士以上学历,哪怕只要求本科学历的门前也会有好多硕士生来求职,我们“小本”在他们面前没有任何的自信,不读研怎么行。
“大部分公司都要求硕士以上学历”这是明显带着偏见得出来的结论,很多同学看到如鹏网的“就业信息”贴出的招聘信息以后就感叹“怎么这些公司都要求硕士学历呀!”,但是其实理性的统计一下,要求硕士以上学历的职位不足10%。经过分析可以很容易的发现,要求硕士以上学习的公司或者职位一般都有如下的特点:国字头、中字头的单位,比如中国移动、国家电网、中国工商银行;国家机关、事业单位,比如省公安厅、红十字会;高校、科研机构。由于众所周知而在这里又不方便说明(害怕被河蟹)的原因,国字头、中字头、国家机关、事业单位中人才的浪费现象非常严重,招博士生去看大门的事情都是屡见不鲜的,但是这是事实,他们招聘的时候就要尽可能招高学历的人,这样才能达到他们的某些目的;高校、科研机构由于特殊的原因,招聘的人员也必须是高学历的。如果想去国字头、中字头、国家机关、事业单位、高校、科研机构任职的话,必须有高学历,否则哪怕你能力再强也没用,没有那张文凭一切都是白搭。
其实还有另外一些职位也是经常标明“硕士学历”的,那就是一些公司的“研究院”,比如微软亚洲研究院、IBM研究院等,这些职位通常都是进行一些前沿领域理论、技术的研究,由于大部分本科生的知识深度没有达到这些职位的要求,因此这些公司要求硕士博士学历也是非常合理的,同时这些职位中也一般都是被一些名校的硕士、博士占据着。但是凡事无绝对,比如微软亚洲研究院也不乏优秀的本专科学历的人员。
除了这一小部分要求硕士以上学历的职位以外,大部分职位都是只要求本科或者专科学历的,道理很简单,企业招聘员工的目的是让员工去帮着企业赚钱,因此本科还是硕士对于企业来说并不是重要,哪怕公司所有人都是博士,只要没赚到钱,公司照样倒闭。公司招聘一部分高学历人士的的初衷也是希望他们干一些其他人“很可能”干不了的事情,仅此而已。只要你有能力,能给企业带来收入,人家才不管你什么学历呢。
“要求本科学历的门前也会有好多硕士生来求职”,这是事实,也是很多同学在招聘会上底气不足的原因。道理也很简单,为了提升本科生所谓的“就业率”、缓解就业压力,研究生一再扩招,这批研究生毕业以后早晚还是要流入就业市场,因此就与当时毕业的本科生产生的撞车。有同学会说了:“我一个本科生和一堆研究生挣一个职位我肯定被淘汰呀”,这个担心完全没有必要。理由如下:首先,企业招聘的时候都会控制不同学历人员的比例的,比如招聘20%的硕士生,招聘70%的本科生,招聘10%的专科生,因此不同学历人员并没有直接的竞争,和你竞争的还是那些本科生;其次,现在很多硕士毕业生的质量也大大下降,我面试过很多硕士毕业的人,问他做过什么项目,最后支支吾吾说出来的是做硕士论文的所谓项目,而且明显是抄别人的,问他计算机的一些基础知识,竟然连“队列和堆栈的区别”这样简单的问题都回答不出来,问了问他对读研的感受,他说“我和很多我同学感觉都一样,后悔读研了”,听了这些你还害怕和这些硕士生们竞争吗?
因此,如果你是想去国字头、中字头、国家机关、事业单位、高校、科研机构熬日子的话,还是去考一个高学历吧,而且还要把其他的方面也补足一下;如果你是想去国际性大公司的研究院工作的话,也尽可能的去考高一点的学历,并且不要光有学历,在研究能力、动手能力方面更要努力,这些公司是靠一分钱一分钱的赚活命的,你没有能力给他们带来符合你职位的收入的话,即使你成为“黄金圣斗士”他们也不会要你。
误解六、“研究生就业的起点更高”
听到有同学说“研究生就业的起点更高,毕业后就能进入高一个层次的岗位,不用从基层还是熬。”这肯定是同学们臆想出来的,或者说是听那些去国字头、中字头、国家机关、事业单位等单位的人说出来的。对于大部分企业来说,其实不同学历人员的起点并没有实质的差别。如果非要说差别的话,也是有的,那就是“基本工资”,每个公司都有自己的薪资架构标准,比如新入职本科生的基本工资是3500、新入职双学士的基本工资是3800、新入职硕士生的基本工资是4000,一般新入职本科生和新入职硕士生的基本工资起点的差超不过1000元。为什么企业里会给新入职硕士生的基本工资高一点呢?决定一个员工工资的唯一标准就是这个员工对公司的贡献度,虽然新员工通过了公司的笔试、面试,但是企业仍然无法分辨出不同员工对公司的贡献度,只有实际工作中真刀真枪的实干才能分辨出来,但是在入职定基本工资的时候必须对不同的人进行分别待遇,既然硕士生有实际经验、学过更深入的知识,那么就有更大的概率进行更高的贡献,因此给他们稍微多一点的基本工资也是合理的,但是一个员工的工资不是固定不变的,通常入职后根据贡献不同都会给予调薪的,这时候学历就靠边站了,谁贡献大谁就拿钱多。
有同学说“不对呀,听师兄说,和他一起进公司的硕士生工资涨的比他快呀!”,大家忽略了一个事实,那就是“年龄差”、“加速度”!这位和硕士生比较的本科生师兄年龄估计也比硕士生小三岁吧?硕士学习了三年,知识、经验都会肯定比和他一起入职的本科生更高一些。因此不要和与你一起入职的研究生比,和那些比你晚三年进入公司的研究生比。就像下面的这张图一样:
黑色的线是新入职研究生的能力变化曲线,那么你究竟是深红色的线还是蓝色的线则取决于你自己的努力了。
三年的研究生学习和三年在企业中实际工作的经验也是不对等的,在学校里读研要学公共课、准备论文、搞乌七八糟的事情,其对人工作能力的锻炼绝对和在企业中真刀真枪干的锻炼强度不一样。因此那些想利用研究生阶段积累工作经验的同学也要仔细考虑一下了,是去企业里积累三年的工作经验(赚钱)更重要还是去读研积累三年(花钱)更重要,每个人的价值观不一样,请根据自己的情况判断。
有一些同学认为的“毕业后就能进入高一个层次的岗位,不用从基层还是熬”也是错误的,任何脑子正常的企业都不可能会让你一个刚毕业的学生当领导,因为人家根本不了解你,怎么能让你当领导?任何人刚进入公司都要从基层干起,然后根据不同人的能力才得到一步步的提升。
说了上面几个误解,还有一些同学们的关于考研的想法也需要梳理一下。
想法一“想读研进一步深造,研究专业知识”
这样的同学是中国未来的希望,中国在基础理论方面太差了,需要这样有抱负的同学。但是有这样想法的同学一定要做好心理准备。在国内的很多大学里,研究生每天做的工作已经不是“做研究”了,而是在“乱七八糟”。如果你问问很多读硕士的同学,他们评价导师好坏的标准就是“是不是有活儿干”,好的导师可以揽到很多项目,然后分给研究生干,这些研究生都管导师叫“老板”;坏的导师则是什么项目也没有,学生研一去老老实实上一年课,和在本科的时候一样,研二上半年稀里糊涂的,有门路的自己出去找兼职,没门路的则像本科一样继续在宿舍里魔兽、睡觉、上网,研二下半年就开始准备论文开题,开始了东抄西抄的生活,然后很快研究生三年就过去了,进来时候是0,出去还是0,唯一的区别就是多了一张硕士学位证和老了三岁。
因此如果你的梦想是“进一步深造,研究专业知识”,那么在选学校、选导师的时候一定要多注意,最好选在这个领域有名的学校和导师,如果有可能的话能去美国等发达国家留学最好,因为在很多领域特别是计算机领域这些国家都是处在前沿,而且他们的科研气氛也更浓一些。
想法二“想通过读研实现转专业、进名校的愿望”
有的同学由于高考时的种种原因,在本科期间没有读自己满意的专业、大学,想通过跨专业或者跨校考研来圆自己的梦。
我的习惯还是先泼冷水:企业里是招聘人去帮它赚钱的,因此专业、学校都不是他们关注的对象,根据我工作这么多年的经验来看,企业里同事之间根本不知道彼此的专业、学校、学历是什么,甚至连领导都不清楚。无论是你决定考研还是直接就业,那么都应该把提升个人实力作为首先考虑的因素。
如果你还是决定跨专业、跨学校考研的话,需要做好心理准备,首先导师对于跨专业、跨学校考研的人通常是有歧视的,因为考研录取的时候导师有很大的自主性,因此经常会出现有些同学考试成绩非常高,但是最后仍然落选的情况;其次有的企业里也对跨专业、跨学校的硕士毕业生有一定的歧视,很多企业招聘里都注明“要求本科和硕士期间的专业基本一致,本科期间院校必须是211院校”等。虽然这些都是一些软性的门槛,只要有能力,这些都不是问题,但是同学们仍然必须做好比别人努力更多、受更多打击的心理准备。
想法三:“不想找工作,考一考看,万一考上呢”
有一部分同学是怀着“撞大运”的想法考研的,他们的想法就是“万一能考上呢?就省得找工作了”,这些同学通常都是用“我准备考研,不去找工作”为理由逃避就业,但是平时不看书,连考研的辅导资料都是从图书馆借的,看两页就扔到一边儿去了。用脑子想想看,那些每天都没白天没黑夜备考的同学都不一定能考上,这样的大运怎么可能让你撞上呢?
每年研究生考试的时候都有相当数量的考生根本没去参加考试或者考了一两门就再也没去考,理由很简单,他们根本没任何准备,怎么可能考上?
因此那些只是“撞大运”、“借考研逃避就业”的同学还是醒醒吧,面对现实,想一想下一步该怎么办才是实际的事情。
想法四:“考研很难,一个名额有好几十个人报考”
很多同学描述一个研究生名额难考的证据就是“有100个人报那个导师,那个导师只招10个”,其实还是我在这个系列的文章一开始提到的那样大部分报名的同学都不努力,一部分是撞大运去了,一部分是自我约束力不强没有认真备考,真正用心准备的没有几个人。高考和研究生考试的最大区别就是所有的同班同学都是参加高考的,大家有统一的目标、统一的时间点、统一的学习计划,而研究生考试则不一样,不是所有的同学都考、时间进度靠自己安排,因此能从始至终坚持下来,学习方法得到的人没有几个,因此只要你能坚持下来,并且学习方法得当的话考试取得好成绩并不是非常困难。
想法五:“从大一开始就准备考研”
有一部分同学是从大一就开始准备考研的,大一就开始做考研题、看考研书,这可能是从高中带过来的学习习惯,这也是很多人管大一叫做“高四”的原因。其实也完全没有这个必要。在决定考研之前,先把假定自己不考研,然后自己给自己考研的理由,如果决定了考研再想后面的事情。刚才我说了,考研并没有想像中的那么难,没必要这么过早准备。如果你们学校有保研的机会,并且保研的专业、导师也比较满意的话,只要把高数、英语等考研公共课以及主干专业课学好,然后在期末考试中尽可能的拿到好成绩、拿奖学金就可以,这样能争取到保送名额的机会的话就轻松了,可以利用剩下的一年大四的时间继续充实自己,即使没有保研成功的话,因为之前高数、英语以及主干专业课等考研课程学的都不错,只要花上半年复习一下考研成功的几率也是非常高的。剩下的时间还是要用来多动手、多参与实践,如果自己在大学前三年把动手能力锻炼的很好了,那么如果考研成功,你在导师眼中也是红人(考研成功并不是最终的成功,如果在研究生期间是失败的人的话你最终仍然是失败的),也就赢得更多的机会;如果考研失败,凭着自己很强的动手能力和扎实的专业知识、基础知识,找到一份好工作也并不是很困难的事情。
无论是否考研,大学前三年都应该是以学好专业知识,提高自己动手能力为主。
说了这么多,很多同学看到我很多时候都是在说研究生的坏话,“是不是因为杨中科老师没有读研,而吃不到葡萄说葡萄酸呢?”。说实话研究生教育本不应该像我说的那样不好,但是这是现实。任何事情都有两面性,我相信质量过关的研究生学习的利还是大于弊的,只不过现在很多同学被蒙蔽了眼睛,只看到它好的一面,而没有看到他坏的一面,我在这里把坏的一面讲出来,同学们自己根据这些进行判断自己是否应该考研。
也许你认为我的这篇长达九页的“解惑”系列文章是我在学生大本营、如鹏网里发表的最没意思的文章,因为这篇文章根本没有告诉你是否应该考研。考研与其他事情不一样,如果你问我是不是应该喝农药,我肯定告诉你不应该,因为谁喝农药谁都会死;如果你问我你中了一百万,是不是应该去兑奖,我肯定告诉你应该去,因为谁不去谁是傻子。但是考研则不一样,考研对不同的人、不同的环境有不同的取舍,你只能根据自己的情况进行选择。我不可能给你答案,因为每个人都不一样,如果非要一个答案的话,我建议你抛硬币,正面朝上就考研,背面就不考,这样你就不用选择了,可是你愿意把自己的命运交给硬币吗?
我这里列出了考研的好处与坏处,请根据自己的情况来决定。很多同学害怕做决定、害怕自己选择道路,因为习惯了家长为你选择道路,但是大家要知道做选择的权利是一个人最应该珍惜的权利,别人可以给你讲不同的路的差异,但是不同的人走一条路会有不同的结果,最后走路的是你,究竟走哪条路没有人可以代替你,希望大家珍惜选择的机会,选择好自己的路,然后勇往直前的走下去,不要停止!
The End!
学生评论:
邓可(C/C++学生) :
长者的智慧。大家都想做的好一点,但是很多人都像这位同学一样 “为什么我老是静不下心来专心做一件事呢”? 问别人是没用的,关键在自己。
华东交大 李鹏(C/C++学生) :
我现在大一,看了这篇文章真是受益匪浅。我明白看了一个道理:只要你有才,不怕找不到工作!
重庆大学 史苏明(3G/移动开发学生) :
以前还比较懵懂,不知道到底是考研还是工作,看了之后目标基本明朗了。谢谢指导。
做什么样的软件才能赚钱?
学什么样的知识才能赚钱?
肖舸老师
这是发在我的邮箱里面的一封信,这里做个统一回答。一家之言,欢迎拍砖哈。
(原信篇幅过长,请大家到原帖去看)
我的回答:
这位同学你好,从这封信看得出来你的心情还是很急迫的,你这种心情我完全能够理解。我把问题分几点说,尽量说细一点,希望能对你有所帮助。
首先,你说你是09年毕业的大学生,那么算下来,你应该上班才几个月而已,就这一点,你能在新的单位几个月时间就把工作拿上手,首先恭喜你,这说明你是真的很有实力,当年我转行游戏编程,用了差不多两年才真正想清楚程序设计的真意,我觉得你比我强。呵呵。
你说Java基本上都是做B/S数据库,觉得没有意思,其实这个我也很理解,不过,我觉得你可能不是很了解实际情况。这里我需要给你讲清楚,其实不仅仅是Java程序员,只要到企业中做应用开发,或多或少都和数据库沾点边。当年我用VC还写报表系统呢,你能说这不是数据库?
其实有个问题可能大家都没有关注到,至少,我到学生大本营半年,发现大家都没有讨论过。那就是,做什么最赚钱?无可否认,软件可以实现各方面应用,不过,就我的观察,在现实生活中,有两种软件最赚钱,一种是数据库,一种就是嵌入式底层的东东,嗯,随着互联网的发展,目前做网络程序也很赚钱。
其实原因很简单,就是因为软件的盗版问题。我想看到我这篇文章的每个人,或多或少都用过盗版软件,包括我自己,呵呵,咱们中国人穷啊,动辄几百上千的软件费用,咱们买不起的,所以电脑城的光盘市场才这么火爆。
但是,这带来了另外一个问题,就是当有一天,我们自己成为软件开发者的时候,才发现,盗版导致我们自己的收入降低,无法维系生活。这时候,恐怕再来大声疾呼,杜绝盗版,已经晚了,你说是不?
其实我们可能对市场不敏感,反正每个月发薪水,收入基本上旱涝保收,但是公司的老总们对这个很敏感,软件卖不出钱,公司就亏本,亏多了,就垮掉了,最终程序员还是没有收入。
因此,公司里面做软件,一般都做上面的软件,即数据库应用,嵌入式应用,控制类应用,网络服务应用较多。因为这几种应用,不容易被盗版,能卖到钱。通用性的应用,比如操作系统,比如很多工具软件,比如PC游戏,其实很难卖钱的。
数据库应用,一般数据库本身是使用成熟的商用系统,如MySQL,SQL Server,Oracle等,我们小公司拿来,再根据具体应用需求,做二次定制开发,这是一大类市场,其实这个市场的真正名字叫做“企业数据应用定制市场”。由于是定制的,自然没有通用性,也就不会有盗版了。
控制类,嵌入式类,很多都和具体硬件设备相关,换个硬件平台就不通用了,大家知道,中国的东东,要防盗版,最好和硬件相关,只要绑定硬件,软件一般不好到,以前出的防病毒卡,汉卡什么的,其实利用的就是这个市场规律。
服务应用呢,就更好说了,由于主要程序逻辑都在服务器端,基于B/S的模型,客户端连个软件都没有,服务器的管理自然比卖出去的软件好管理,不容易盗版。因此,这类企业也活得长,比如各个网站,各种网游什么的。所以我一直觉得,以后云计算发展起来后,很多软件可能会把零售制改为租用制,比如photoshop,大家买套软件几千,但一般人就是处理一下自家照片,自然不划算,因此盗版很多,但以后假如软件公司把它做成服务器版,大家把照片上传,处理,最后再存回来,这个过程每次租金1毛钱,每个人都花得起的话,我看以后就没那么多盗版了。另外,服务器应用其实大多数也是数据库应用。
所以,我首先要说,不管你是不是换工作,以后你恐怕会一直遇到数据库类的应用,不管你喜欢不喜欢,但这是社会的现实,你必须承认。你说对吧?
在这个共识下,我们再来看,其实我们会发现,三大主流应用中,只有嵌入式不适合Java,其他的数据库和服务器应用,其实Java比C和C++方便得多,因此,我建议你就在Java这条路上走下去,不一定非要转C和C++。本来你的强项就是Java,而且这也是主流的可以卖钱的市场,为啥不坚持呢?
从另外一个角度说,我也认为你应该坚持,你毕竟毕业不到半年,对社会,对公司,对本职工作其实了解并不深入,你认为Java就那么几个设计模式,没有挑战性,这个我能理解,但是,我觉得你说的不全面。起码我做程序做了这么多年,到底有多少种设计模式,我也说不清楚,我相信很多人都说不清楚。需要具体应用具体分析。
我不是Java程序员,不过我觉得,如果要做一个合格的程序员,首先不应该是程序设计的大师,而应该是理解客户需求,并迅速拿出解决方案的专家,这个,不管用什么语言,不管在哪里工作,都是必须的,同时,这也需要很长时间的积累。
准确的讲,我认为,一个人不在一门语言,一种业务领域努力3年、5年乃至10年,是很难成为专家的。因此,我建议你完全没有必要这山望着那山高,轻易就决定跳槽,建议你就这个环境,先锻炼自己,我这里放句话,你可以试着验证一下,两三年以后,你再看Java语言和数据库开发,都还是会找到自己不会,值得学习和钻研的东西的。因为最起码,客户的需求是千变万化,永无止境的。
当然,话分两说,如果你真的喜欢C,很想做嵌入式应用,就是不想做Java,那也无可厚非,因为毕竟每个人都有选择的权利。
不过,我仍然不建议你辞职回家学习。我以前有句话,大学毕业,才是学习的开始,不过,这个大学毕业后的学习,和学校中的学习,有很大差别,突出的几点:没有老师,没有教材,都是自己主动学,针对自己的需求来学习,学技巧多,学原理少,并且一般都是干中学,而不是学完了再干,我总结就是“用以致学”,而不是“学以致用”,这是我总结的学习经验。
同时,毕业了,总不好意思再向家里面父母要钱,总得自己赚钱养活自己。你说是吧?你说辞职半年,专心学习,那你没有收入吃啥?还不是吃父母的?这样不是很好。
C语言没有那么神圣的,也没有太高的门槛的,不要想太复杂了。另外,指针,内存什么的,学习C语言确实能接触到,但是,我还是要说,C语言并不是因为有了指针和内存的直接访问,才牛叉,C语言是因为大量的程序员用它解决了很多具体应用,才牛叉的。请你注意不要学偏了,不要为学指针而学指针。指针就是指针,仅仅是个访问工具而已,不是用来显得很酷的,需要了才用它。
Java语言用个数组,其实也能模拟指针的大部分功能的。其实我作为C程序员,我们平时工作时对指针是很谨慎的,能不用都不用,尽量用引用来代替,为啥,因为危险,容易出错。
数据结构,计算机组成原理,算法语言,编译原理,嗯,还有个图论,这几门应该算最经典的计算机理论了,但是,也没那么神秘的,书店里面有,自己没事买几本回来看看就好了,生活是没有考试的,不需要你必须考够100分才能找到工作,了解,理解就好了,背书是背不出好程序员的。你说对吧?
其实这几门,不用C和C++语言,用Java语言一样可以学习的。嗯,编译原理可能够呛,需要理解一点C。
另外,我再给你透露一点点,其实真正实际应用中,我们对于上述基础知识用得很少,用得最多的,其实就是数据结构里面的队列了,其他,包括栈都很少用,C程序员也不是每天都从底层,从0做起的,还是有很多工具套用的。这和Java语言从框架开发是一个道理。
反而有一门课程建议你好好学,就是概率和统计学,这门知识是我现在应用最多的,很多时候,我们评估软件系统性能,瓶颈优化,都是在用这个学问。程序员做久了,可能大多数时候都是和这个在打交道,建议买本好好看。
总结一下吧,建议你目前暂时不要辞职,既然选择了Java和数据库应用开发,选择了B/S模型,你耐心做3年再看,也许3年后,你自己的想法就变了。
C可以学,你说的课程都可以学,不过,不要辞职专门学,先赚钱养活自己,再利用时间学习,你这么大的决心,每天晚上就不要看电视了,那你每天晚上,19:00~24:00,至少有5个小时来学习,利用好了,我敢说比你在大学里面效率高。
看书学习不是什么神秘,神圣的事情的,也不需要什么斋戒沐浴,念几天经才能学习,我觉得就和我们吃饭喝水一样,随时都可以学的,找几本书,就在床头放着,每天晚上看看,几个月也就看完了,又有多难嘛?
关键是,养成习惯。
你说对不?呵呵,先说到这里,有问题再问哈。
最后补充一点,如果学习C,并且有一定基础的话,等我书出来看看吧,里面的跨平台开发工程库,可以帮助你迅速掌握嵌入式底层的一些技巧。不过,要有基础哈,一点不会C看不明白的。
(该位同学继续来信咨询并表示了决心,原信过长,这里不转贴了,请大家到原帖来看吧)
我的回复:
这位同学你好,我昨天其实已经说明了我的一个观点,虽然我建议你继续努力学习Java,不过,每个人都有选择的自由,因此,如果你还是坚持要学习C的话,我也不反对。
你在两封信里面,都强调你原来是个差生,但最后半年知道发奋学习,最终过五关斩六将,成功拿到offer,超过了很多同学,也让老师的眼镜掉了一地,呵呵,我真心恭喜你,也很佩服你。
其实我以前有笔记说过,人要发奋,什么时候都不晚,苏东坡的爸爸是这样,小时候我们学的《周处除三害》也是将这个道理的。你能把计算机里面200G的游戏和电影删掉,换成学习资料,嗯,了不起,比我强。
不过,如果我们要讨论C的学习路径,恐怕要让你失望了。因为C和Java语言并不一样。并没有前人规划好的必然成功之路。
Java语言由于面向应用面相对狭窄,框架模板众多,最重要的,其主要工作方向比较确定,就是做基于网络的跨平台数据应用为主,因此,其发展方向很容易确定,学习路线也比较好规划。
但C显然不是这样,C应用面太广,可以说,汇编能做的事情,C就能做,甚至做得更好,也就是说,我们能想出来的计算机软件应用,其实都可以由C来实现,仅仅是成本高低而已。
而不同的应用,除了计算机软件编程知识之外,还需要很多应用相关的知识,这就造成了C程序员往往也需要成为自己应用方向上的半个专家,这就比较麻烦了,这么多的应用方向,写游戏的知识储备,和写驱动显然不一样,与写操作系统和编译器的方向又显然不一样,因此,很难说一个C程序员需要掌握哪些知识,才够用。
以我自己为例子,我做程序差不多快20年了,做C也超过15年,做过游戏,工业控制,电子教育,网络传输等各种软件,我总结自己的知识储备,也仅仅觉得自己在数据传输方面有一点心得,并且对于C和C++语言怎么实现0Bug程序设计,有点经验而已,真不敢说自己什么都会。
另外,C语言之所以难学,并不是说它自己多难,真正的问题在于,C语言偏底层,只要我们一做应用程序,或多或少都需要调用很多操作系统相关的api来完成工作,Windows下,如果我们不懂Win32API,则很难写出合用的代码,C语言玩得再熟都不行,Linux下对于各种系统和应用级api,也需要不断查询man,否则根本写不下去。所以,要想成为C程序员,至少要学习操作系统,通常,至少应该把Windows和Linux常见的api学一遍。MFC是Win32API的C++框架表示,最好也学一点。
其实这已经带出另外一个话题,现代开发,C和C++一般不分,C++到了函数内部,其实是C,而C呢,有很多特性写程序不够方便,也需要使用很多C++的特性,如默认参数,如引用等等。所以,学习C,最好和C++套着学,都看看。呵呵,这已经是两门语言了。
还有一个问题,不管是C还是C++,总是各个具体的操作系统上开发,Windows和Linux有差异性,很多库函数,常量定义都不一样,因此,C和C++一般说来,很难做到程序通用,需要使用大量的编译宏,这需要了解语言之外的东西,即编译器的很多特性,不过,很可惜,关于编译器特性,目前的资料很少,我很多都是摸索的。
另外,现代的操作系统,都是多任务操作系统,多任务开发是个难点,这个多任务计算其实就是并行计算了,必须对进程,子进程,线程有很清楚的认识,对于时间片有清醒的认识,对于锁的使用,锁的作用域,去锁优化要很熟悉。但是,也很可惜,目前市面上的书籍,讲语言的就讲语言,讲操作系统的就讲操作系统,对于这个多任务开发这块,同时需要结合语言和操作系统两方面知识的,几乎没有,需要自己摸索。其实我写《0 Bug —- C/C++商用工程之道》,有很大一部分目的,就是希望填补这个空缺的。即从语言和操作系统中,抽象出来,站在更高的角度,从较为宏观的立场探讨并行计算程序的开发之道。所以我说如果你要学C,等我书出来最好看看。
嗯,还有一个很重要的问题,C语言的基本库相对薄弱,很多近年发展的高级语言,对于哈希,List,队列,栈,树等常见数据结构都提供标准库函数,或者库模块来支持,但C一般是没有的,偏偏实际应用开发还经常用到,得自己找开源,或者程序员自己写,这也会耽误程序员很大一部分精力。
这里就出现了C语言一个不好不坏的特性,或者说既好也坏,C语言没提供这些工具,程序员自己写,很麻烦,但是,由于是自己写的,自己掌握所有底层代码,因此,优化变得很容易,一个队列,我随手加个队尾指针做加速因子,可以规避大量的递归操作,效率提升百倍甚至千倍以上,这在C里面就是加几行代码而已,但是对于Java等语言,由于底层库是厂商提供,甚至根本就不是本语言开发的(很多高级语言底层库其实是C和C++写的),程序员一般没有修改能力,有时候,遇到性能瓶颈,大家就只有干看着,没有任何办法。因此,同样的应用,C语言可能一台服务器就够,但是Java语言呢,可能需要3~5台,就是因为这些语言做的太完善,而太完善的东西,一般不好做优化,性能就不及经过专项优化的C代码。
就是因为这个原因,在很多嵌入式等小终端场合,由于CPU计算能力有限,需要使用C来做优化,而不能使用Java等高级脚本语言,否则程序跑不过乌龟。
另外,现代的数据应用,出于优化起见,一般趋于功能细分的设计模型。比如一个数据库应用,存储模块专门负责高速出库和入库,中间甚至添加cache机制作专业的优化,而业务模块则强调设计一套嵌入式脚本语言做二次开发,保持最大的业务开发灵活性。其实Java,PHP,很多都是这种模型,MySQL底层模块实现高速存储,上层则使用apache和PHP、Java等语言,灵活二次开发具体应用。
但是,C由于一般都是编译执行,不是解释执行,一般很难做到这么大的灵活度,不能用户仅仅加个字段,就跑过去把整个服务器重新改写编译一遍,这样维护成本太高了。因此,C程序员的解决方案,一般是自己实现底层的高速数据应用,再自己写个脚本语言的解释器,提供给用户做二次开发。
你发现什么没有,其实C程序员如果做企业数据应用,一般需要具有编译原理的知识,我们一方面要实现用户的业务,还需要写一套Java这类脚本语言给用户做二次开发用,说白了,就是我们自己实现一套lamp体系,呵呵,这不是又费马达又费电嘛,因此,我前文说,做数据库应用,最好直接用Java,直接用C,成本太高,而且不容易满足用户需求。
说到这里,你又发现什么没有?C语言之所以难学,并不是C本身难学,而是如果要成为一个C程序员达到实用级的地步,需要掌握很多方面的知识,这些知识,书上可能有,也可能没有,没有的,就要靠钻研,靠实战,靠自己去想通,因此,很难通过K书成为C程序高手的。建议你学习时,关注C这个特点。
不过好在你强调做游戏和嵌入式两种,这两种呢,我可以根据经验讲一点:
如果从事游戏的话,很多时候是和图形打交道,目前的游戏,趋向是大型化的视频图形游戏(包括大型网络游戏、电视游戏机的游戏)和小型化的终端游戏(手机类、PDA游戏),这两种比较好卖,至于中型规模的PC游戏,由于盗版太严重,已经很少人做了。仅仅是一些游戏公司为了宣传自己,会出一些经典的大作。
嗯,硬件厂商为了宣传自己的新板卡,如新的图形显示卡,会拿出钱来,请游戏公司做一些针对该型板卡特定优化过的游戏,以刺激广大用户对硬件升级换代,这也是一条财路,很多游戏,在面市之前,就已经从硬件厂商获得了足够的利润,并不需要从零售市场获取利润。我们在电脑市场看到,几乎每出现一款游戏大作,就带来一次显卡,甚至PC机硬件的升级换代热潮,其实背后就是这个故事。
不过呢,游戏引擎我还是建议你最好不要去做,因为做这个成本太高了,很少有公司去做,而这些公司,一般都是欧美公司,对人员要求很高,轻易不会招收亚洲国家的程序员,因此,学这个好比屠龙之技,看起来是很酷,但是实际上工作机会很少,甚至不比中彩票来得高。
另外,做游戏引擎不好玩的,因为现在也都细分了,做引擎的公司一般自己不出游戏,最多出点Demo,他们就是提供高性能引擎,而不是好玩的游戏,而游戏公司,则是购买引擎,然后开发具体的游戏内容。比如Quake和虚幻的引擎,就很多家游戏公司买去做自己的游戏。其实很多游戏引擎,目前也提供脚本语言,即里面用C实现了另外一套语言。
游戏公司其实主要是美工建模,绘图,企划编故事情节,程序员反而很少,更多地是使用脚本语言,在引擎基础上做二次开发而已。因为游戏公司就是做好玩的游戏,至于具体用什么技术,其实他并不是很关心。说不定,如果你哪天进个游戏公司,会发现自己又见到Java语言这个熟人,呵呵,那个时侯会不会有欲哭无泪的感觉?
其实这也是社会分工的不同,好的引擎程序员,更多的是个数学家,强调逻辑思维,你让他去写个美少女梦工厂,如何抓住少女的心,还不如杀了他,呵呵。
而做嵌入式系统,其实也有诀窍。嵌入式系统,目前我们看到的手机应用仅仅是很小很小的一类,更多地,嵌入式系统是应用到工业控制领域,从大型机械设备的控制,飞机、汽车轮船的控制系统,甚至到十字路口一个红绿灯,里面都是嵌入式系统。
目前有个现象,嵌入式好赚钱,很多学软件的同学都想找嵌入式工作,但是,毕竟在这个领域里面,给手机做游戏的就那么几家公司,不可能吞下所有的人才,更多的是需要自动化控制人才,因此,这类软件转嵌入式的人,进去一般都有点缚手缚脚的感觉,总觉得知识上欠一点,又不好补。
其实,嵌入式应该是最简单的,比如说驱动,就很多硬件厂商要人,而驱动其实就是做一套打口读口的api,很简单,最多做的时候注意点,别用太复杂的算法,保证计算速度而已。
但是你注意到没有,嵌入式其实主要是和硬件打交道,硬件知识必不可少,至少,计算机组成原理,数字电路,模拟电路要很熟,最起码,你要知道开关量和模拟量,要知道集成电路的选通信号和真值表,对于地址表的编址要很敏感,对于常用的集成电路块的特性,比如8235等,要比较了解。否则,是写不好嵌入式程序的。
因此,我以前有笔记说,嵌入式开发,很多时候软硬件不分,我见过的很多嵌入式工程师,其实也能自己画一些简单的电路板,至少,他在设计时,知道哪些功能硬件来做更合适,而不是一味的走软件路子。
不过,嵌入式学习要钱,这是肯定的,最起码,你自己手边要有个基本的嵌入式平台,不过好在这个并不贵,一个arm9的开发板,目前也就500多元,淘宝上就有卖的,买块回来自己做练习,应该不难。
如果要我给你职业路线建议,我还真想建议你就走这条路子,原因很简单,工作好找,进去之后的门槛并不高。你花点时间,自己钻一下数字电路等前面说的几本书,对于底层的汇编看看,主要看看arm的和51系列的就好了,也不用看太精,嵌入式程序大段大段的都还是C,仅仅部分端口动作,为了协调时序,采用用到汇编,而且,用得最多的还是NOP指令,就是强制CPU延时,这个很容易的。
最关键的是,嵌入式设备在很多工业设备制造公司都有用到,他们也需要大量的人才,并且,我们都知道,公司里面,普遍学历最高,年龄最低,门槛也最高的就是IT软件企业,这些工矿制造企业反而门槛比较低,进去之后,老板也比较看重人才,因为制造业的产品一般立竿见影,开发一套设备半年就开卖,不像软件,一般要开发到3.0版才有市场,呵呵,老板看得到钱,自然也比较看重赚钱的人的。
虽然你是软件人员,上述硬件知识没有学过,不过就我学习的经验,其实反而门槛还低,甚至比学个Java的框架来得还容易,建议你可以考虑从这条路上走。
嗯,先说到这里吧。有问题继续探讨。
最后我还是要劝你一点,生活不是PK,生活也不是孤注一掷,没必要什么时候都把自己逼到绝境,想成功其实很容易,只要制定一个目标,一个计划,然后按部就班走就好了,不需要找锥子扎自己屁股的,那是自残,呵呵。
自然一点,看开一点,少给自己太大压力,看书累了,看看电视也没啥,出去走走也没啥,没事的时候,眼睛从计算机屏幕上转一下,看看身边有没有合适的女孩,谈谈朋友也不错,如果那个错过了,才是一辈子的遗憾。
成功的道路,应该是很快乐的,如果都是眼泪和汗水,即使做到百万富翁,又有什么意思?
你说呢?
学生评论:
成功学院Gwolf-Team sky_water(Net爱好者):
很喜欢这句话:
C不是因为直接操作内存才牛才,是因为他解决了好多问题才牛叉
我想任何语言都是
犹如在战场上能杀敌的兵才是好兵
广东工业大学 cch(Java学生) :
受教了,“关键是,养成习惯”,能举的我都举起来赞成
孙建(C/C++学生) :
肖老师出品,一定要看,自己在也C/C++语言中迷茫,基础已经看完,就是不知道后面怎么走,这下,又知道应该做什么了!了解WIN32API函数,呵呵,还有别的,
四川大学锦江学院 黄启银(Java学生) :
肖老师 我真的很感谢你 你让我明白了 我以前不知道学模电 到底以后能干什么呢 现在我应该好好学习模电了哦
合肥师范学院 董海(C/C++学生) 2009-10-19 17:50
每个字的读 我对以后的方向一直很迷惑 看来我有方向了
湖南大学 冯本明(Java学生) 2009-10-23 21:56
旁边的师兄还在说他们去面试公司10家只有一家找java程序员,看了你的讲解后,我觉得还是要坚持自己的想法,无论什么行业,做精了,都是专家,牛人。
福建工程学院软件学院 四维(Java学生) 2009-11-05 11:02
一字一句的看完了,心情很不一样!
相比之下我是刚踏入大学一年的学生,路还很长,却没有动力和毅力!
谢谢你的分享
江西财经 彭文忠(C/C++学生) 2009-11-21 17:17
第一:真很佩服这个学生,他的经历让我知道要好好珍惜大学这剩下的三年啊
大一我也混了一年,还好觉悟的还早现在还有信心学好;
第二:肖老师的回复让我学到了很多东西啊,让我明白原来要学好C++就必须学
好那些我薄弱的课;同时也让我更加清楚了C/C++是一门怎样的语言,处于什么
地位;谢谢肖老师
程序员如何踏上社会
肖舸老师
这是发到邮箱里面的一封信件,个人觉得比较有代表性,特地在此公开作答。还是那句话,一家之言哈,欢迎拍砖!
原文:
老师好!我是河南较好的一个二本大学学生,信息与计算科学专业,开设的课程大多是数学和信号,计算机的只学了C和C++,以后还有操作系统、数据结构和数据库等课程,我们专业就业形势不好,我不准备考研,想毕业后从事计算机方面的工作,例如做软件编程,可是学校开的相关课程就我说的那几个,所以我只能平时自学。我发现编程是个大学科,光语言就十来种,我在学C++可是人家说学C++得三五年才能学成,我现在都快大三了,毕业时C++水平肯定很菜,今天又XX培训机构的老师聊天,他说现在企业用JAVA和.net的多,他们都不开设C/C++的课。我现在真的迷茫了,我是继续学C++还是改学其它的呢?我只想毕业时能找个工作,以后去深圳慢慢发展。我该怎么办?请老师指点一下啊,不盛感激!
我的回答:
这个问题相对比较复杂,也很宽泛,很难简单回答,我这里,也仅仅就个人的一点认识,谈谈看法。
目前在学生大本营里,我也观察到,很多二本,三本的同学,在心里上有种自卑感,总觉得考分低了,出来就低人一头。这点,我是万万不赞同的。很多时候,我对小弟讲,我相信你们的老师,师兄,师姐,前辈,都有讲过:“大学毕业,仅仅是开始,不是结束。”
中国的社会,越来越商业化,其实商业化有一个好处,就是这个社会给每个人的机会,总的来说还是越来越公平。这个问题分怎么看,名校毕业,高官子弟,亿万富豪的孩子,总会比我们站在更高的一个起跑线上,这是事实,但是,也仅仅是起跑线而已。在社会上,也有太多的故事,从一个穷家子弟,经过努力奋斗,最后成功的事实,因此,首先我觉得大家不必气馁,万事有拼才会赢,只要敢拼敢做,没什么大不了的。
肖老师自己的学历就不高的,经过这么多年奋斗,也取得了一点成绩,这里就不多说了,总之,请大家记住,这个世界,还是相对比较公平的,只要肯努力,就会有回报。反过来说,当我们认为社会不公的时候,不妨问问自己,自己尽到自己最大努力没有?
第二个问题,关于学校里面开设的课程,大家可能会觉得不够时髦,不够酷。净是一些计算机组成原理,数据结构等老掉牙的课程,远没有什么spring框架来得过瘾。呵呵,不过根据我的经验,工作几年以后,大家可能会觉得,最值钱的,恰恰是这些最土气的课程。用框架,永远不算本事,也没有什么核心竞争力的,哪天框架死了,你就死了。会做框架,才叫本事,才叫公司里面的骨干人才,才可能成为架构师。而另一方面,框架也是人做的,大家以为,做框架需要哪些知识?是不是上述old的知识?
因此,我的建议,大家好好学好自己的课程,在这几门课上,清华的老师,比起你们的老师,未必有优势,因为这些知识太经典了,也没有给老师什么推陈出新的发挥余地,学这几门课,大家和清华的学子,是站在同一个起跑线上的。
第三个问题,学习C和C++的问题,大家不用想,我的经验,别说这两门相对复杂点的语言,就算是Java,PHP等语言,没有指针的干扰,要想学精学透,没有3到5年、5到10年的刻苦,也是不行的,大学毕业就想做大师,不太可能的。因此,建议大家不必妄自菲薄,你做不到,别人也做不到,大家还是一个起跑线,关键看,以后工作中,能不能扎下来潜心研究,仔细揣摩,不断增长自己的经验值。
第四个问题,关于培训机构不培训C和C++的问题,我也很好奇,好像是有这么回事。我曾经研究了一下,认为原因是这样的:
培训机构也是商业公司,主要目的是赚钱。对他们来说,赚钱有两个重点,第一是短平快,要短期出成果,让学生和家长有看得见的进步,给客户以信心,好让客户买单。第二则是成本够低,在同样营业收入的情况下,培训时间越短,请的老师价格越低,老师的沟通成本越低,培训机构的利润越大,因为企业做生意,核心问题是利润,即他真正赚到手的那部分钱。
这就很好理解了,无论从哪个方面理解,C和C++都不是最佳的选择。大家可能没有讲课的经验,但是我本人有一点。我讲课时,发现最难和同学们沟通的细节就是指针,翻过来揉过去说,几个小时下来,就是有人搞不懂指针,至于指向指针的指针,就更晕了。更不要说C中的函数指针,C++中的对象指针,泛型设计等复杂概念,反之,Java,.net都有比较成熟的应用程序框架,同学们可以快速搭建一些立竿见影的应用,因此,从短平快角度,从利润最大化角度,C和C++都不是最好的教学语言。
如果我开培训公司,我的目的是赚钱的话,我也不会教C和C++,太费神了。当然,有人说你贵买贵卖吗,收费贵点,把成本补回来。那样也不太现实,因为,太贵的费用,就没有客户了,大家试想一下,如果开个培训C和C++的培训班,保证出来会写操作系统,收费20万,大家学不学?我估计就算这个课程值这个价,恐怕也卖不出去。
所以,这位同学说的培训机构的意见,我的建议是,听听就好了,不要太认真。
不过,这里肖老师提示大家一点。任何东东,价格和价值是不等的,价值取决与这个东东本身值多少钱,价格则更多地取决与市场需求。大家可以想象一下,目前100个培训班,90个都在教Java,这意味着什么?是不是以后Java程序员暴多。暴多的结果是什么?肯定是跌价啦,因此,我曾经推论,Java程序员以后的薪情堪忧。
反过来,C和C++,如果我们自己肯钻研,钻出成绩来,前景还是很可观的。我们要坚信,C和C++的市场需求还是有的,在游戏业,在通信业,在很多嵌入式场合,C和C++语言都有不可替代的作用,程序员少而市场大,大家知道意味着什么吗?薪水高是不?呵呵,这是肖老师自己YY,乱讲的,大家可以自己想。
反过来说,C和C++的培训班少,我们找不到,清华北大的同学出来,是不是也找不到?这是不是说,在C和C++这条路上,我们和他们又站在一个起跑线上了?呵呵,可能有人会说,那些名校毕业,不需要培训班,当然。但是,名校毕业,我想也不会成为大师,他们工作一开始,还是得老老实实地学,大家说是不?
最后一个问题,去深圳发展。我的建议是不要去了,深圳目前已经比较成熟了,相对来说,机会比起刚刚改革开放时,已经少多了,我们贸然过去,期待有个好的工作,这是不了解导致的幻想。深圳工资高,相对物价也高,大家找工作,不要单纯比较工资绝对值,好好比较一下两地的房价,会发现,深圳的工作,性价比不高的。
深圳还好点,北京上海,就更过分,房价高不说,把个户口看得跟什么似的,外地人过去,很难在当地买房,落户,扎下根来的,会有很多看不见的杠杠在阻碍你。我是这么看的,打工者和城市是互动的,诚然,打工者需要城市提供的环境赚钱,而城市也需要打工者增加税收和消费,进一步增加城市收入。一个城市把自己看的太高傲,不是好的合作伙伴,也不是适合长期呆的地方。我自己就是这么看的,从成都出来,没有选择那些一线城市,选择了西安,主要就是看城市的包容度,基本的物价指数。
嗯,还有个很具体的问题,就是找对象结婚。大家不要笑啊,人之常情,谁也不想一辈子当和尚。 据我所知,越是大城市,北京、上海,甚至成都、西安也有,很多女孩,很浮,看重表面的东东,看不起外地来打工的人。这也没办法,这个社会随着商品化思维的加深,每个人都有一种交易心态,女孩希望嫁好一点,无可厚非。但是,由于她们这个心态,一般都看重一个男人有什么,而不是很细心地观察这个男人的潜力如何,因此,大家就算专业技术再有优势,但只要手边没有现金,没有房子,车子这些硬件,恐怕过去找媳妇,也很困难。大家刚毕业可能感觉不明显,不过,我想过几年,大家就有感觉了。
当然,有人说,我大学里面有女朋友,或者说,我过去也找打工的。完全可以,不过,两个人都是打工的,处于一个陌生的环境,奋斗起来,可能会比较艰难一点。建议大家做好思想准备。
这个话可能某些同学不爱听,不过我放在这里,欢迎PK。
因此,我最后的建议:人一生是很复杂的,和邓大爷一样,三起三落不到头,现在我们看到的,不一定就是一生中最重要的。仔细去看一些最古老的道理,有时候反而更有用。
关键是,这辈子给自己一个目标,定一个计划,只要能坚持走,最后一般都能成功。这个计划,可能很小,比如我一定要成为C和C++的高手,也可能很大,我要成为某方面的专家,我要成为北京人,上海人,甚至我要出国等等,都可以。
关键是,你现在准备做什么?你能坚持多久?
学生评论:
徐浩然(C/C++老师) 2009-06-30 12:39
同意肖老师的说法。尤其是关于女生找男生的那一段。以及,很感谢肖老师关于深圳工作的那一段,十分感谢,如醍醐灌顶。
唐俊鑫(C/C++学生) 2009-06-30 14:38
非常感谢老师的回答,没想到老师会花时间讲这么多,真的很感动!也明白了一些,路很长,我会一步步地走下去.
王刚(数据库学生) 2009-06-30 22:25
肖老师就是我的精神鸦片,一抗不住了就上来打点,如果多打几针能象老罗那样坚持半年以上就好了,现在又拣起C语言大全(第四版)开始看了。
广东工业大学 曾章华(学生) 2009-07-01 01:35
这个计划,可能很小,比如我一定要成为C和c++的高手,也可能很大,我要成为某方面的专家,我要成为北京人,上海人,甚至我要出国等等,都可以。
关键是,你现在准备做什么?你能坚持多久
说的太好了
郑州轻工业学院 王绍峰(C/C++学生) 2009-07-01 14:05
谢谢老师!
肖老师在指导学生这方面的造诣比我们导员都厉害。我感觉现在还是打好基础,至于像架构之类的有精力的可以去搞。
云翔(C/C++爱好者) 2009-07-07 08:17
一直以来潜水,一直以来都在静静地向大家学习,今天又看到肖老师的经典之谈,不得不冒出个头来,这篇文章,从学习到规划、到个人发展、未来选择都做了非常现实的深刻的阐述,让人受益匪浅,对我这样毕业混了几年的人来说,很有感触,我想这篇文章对于刚踏出校门的人来说,应该是非常有帮助的,肖老师、真牛!!!
职业生涯第一步—选择你的城市
肖舸老师
这也是早就想探讨的一个话题了。目前,感觉很多同学,在双选会签约,工作地点的选择上,有一定的盲目性。很少有人能主动地去选择合适自己的城市,因此,这里提出一点讨论。一家之言哈,欢迎拍砖。
我本人其实就是盲目选择的代表,呵呵。
十几年前,我第一次从国营单位辞职出来,当时就没有什么主动选择的意识,直觉上,就跑到成都了,原因很简单,因为算家乡吧。在成都辛辛苦苦十几年,才发现选错了,成都虽然好,但是不适合我啊。呵呵,搞得三十几岁又跑出来重新选择,其中的故事很多,不提也罢。
在我第二次选择的时候,我想了很多,也很慎重,因为我发现,每一个城市都有它的文化,选择一个城市,就是选择一种生活方式,选择一种生活态度,往宽里说,甚至就是选择了一种人生。
为什么这么说呢?我觉得首先我们讲讲什么是文化。我以前做过一点企业管理,对于文化这个词学了一点点,我的理解,文化就是一群人在一起生活和做事,慢慢的,这群人总结出一些做人和做事的原则,即什么叫做好,什么叫做坏,怎么做才叫做正确。一个企业,一个部门,一个系,一个班级,都有其文化,一个城市,当然也有它自己的文化。
一个人,生活在一个城市中,或多或少,都会受到这个文化的影响,你每天上班下班,接触到的每一个人,你的老板,你的同事,你的朋友,你的夫人(或者老公),这些人构成了你的生活圈,你每天的言谈举止,其实都在和这些人互动,而这些人与你沟通过程中,体现出来的价值观,对人物、事物正确与否的判断标准,虽然没有明确的文字说明,但日久天长,慢慢地你能感觉到,并且受到影响,这就是文化的威力。
中国有句古话,叫做“入乡要随俗”,其实就是讲的这个道理,即一个人到了一个地方,要尊重当地的文化,不能拿着自己的原则去硬碰,否则一般都死得很难看。
因此,我想和大家说的第一个话题,选择你的城市,首先就是选择你以后生活的文化氛围,一个适于你生存的原则环境。
为什么要选择呢?原因很简单,不是每个人都能适应每个文化氛围。
我们每个人,在这个世界上成长了十几年,几十年,都有自己的经历和阅历,这点每个人都不同。在接触这些不同的人和事的过程中,我们会逐渐培养自己的判断力,这就是自己的生存原则。
原则是一个很厉害的东东,这是每个人判断事务的基本准则,因此,每个人都不太愿意轻易改变自己的原则。更何况,很多原则是自己经历过深痛教训才得来的,当然很固执。我们常说的“江山易改,本性难移”,其实就是这个道理。
因此,如果我们大学毕业,选择工作的时候,不加思考,贸然选择,则很可能选择到一个自己不喜欢的城市,一个和自己的原则很冲突的氛围,这给以后的人生道路造成很大的阻碍和痛苦,就不划算了。
这里我们还需要沟通一个细节,文化和原则,是无所谓对错的,我这里虽然说,一个人的原则和一个地区的文化,可能会相冲突,其实不是说哪个好,哪个坏,都对,都有道理,仅仅是双方不合拍而已。
比如我曾经仔细比较过西安和成都的文化,我发现一个很有意思的现象。西安街头的小吃,很多,很杂,什么地方的小吃都有,有些,我很喜欢吃,有些,我觉得很难吃,但是,这些小吃过的都很好。成都街头的小吃,也很多,很杂,但是,不管什么地方的小吃,我都喜欢吃,原因很简单,都很符合我四川人的口味。
我仔细想了一下,这大概就是文化的差异了。西安毕竟是六朝古都,从汉唐盛世以来,一直是经济文化中心,长期的多元文化的结合,使她有了无与伦比的包容性,在西安看来,一个人,只要能保持他的原汁原味,不必讨好所有人,西安就能包容他,给他一块生存空间。成都呢,也包容,只要这个人改的和四川人一样,成都就包容他。肯德基发辣椒包,就是在成都兴起的,不然成都人不吃啊,呵呵。
这是我个人的一点观察和理解,可能不一定准确,四川的父老乡亲,不要K我哈。不过,我本人确实就是因为这个原因,最终离开成都的。
因为我也有我的一些原则,不愿意妥协,比如说,我相信亲情,我相信这个世界上,将心换心是存在的,比如说,我相信这个世界上,只要一个人付出了努力,就一定有回报。再比如说,我相信这个世界上,好人会有好报。但既然成都无法包容,我就换个城市来发展。
因此,我给同学们的第一个建议,谨慎地选择适合你的城市文化,每个公司,都有其背后的城市文化,你的同事,都是在这个城市的文化熏陶下成长和生活,选择适合你的文化,比什么都重要。双选会上,不要急于签约,先回来上上网,看看书,找同学打听一下,查找一些你心中中意的公司,它所在的城市,文化背景如何。
还可以细心关注一下你的同学,一个大学,哪个地方的人都有,你问问自己,自己平时和哪个地方的同学处的来,这些都是重要信息。可以帮助你判断的。当然,如果实在不好判断,有个简单的办法,就选择你熟悉的城市,比如你的家乡,或者你大学所在的城市,或者你长期生活过的城市,等等。
说完了文化问题,我觉得还有必要讨论一下饮食问题。大家不要笑啊。民以食为天嘛。
很多人不是很看重这个,我原来也以为自己不看重,不过,这次出来,还是被上了一课。所谓天下厨房,味在四川,不管怎么说成都,都无可否认,成都的小吃,成都的风味,确实很好吃。以前有个说法,“川人不出川”,我估计,这个主要原因就是,到了其他地方吃不惯。
西安虽然很好,但是这个饮食我一直是没有抱太大期望值的,过来很长一段时间,我每天吃饭基本上和完成任务差不多,just so so。到现在,我每隔一段时间,都要去吃吃川菜,吃吃火锅什么的,不然嘴巴里面没有味道。
呵呵,我是如此,大家想必也是如此吧,大学生活的食堂,我想确实不会很好,不过,以后大家的生活道路还长着呢,如果贸然选择一个口味不符合自己的城市,也会很痛苦。怎么痛苦呢?每天只痛苦三次就够了。
想想看,一个喜欢吃面食的同学,跑到南方城市,天天对着白米饭,会昏过去的。我一个朋友跟我说,吃米饭,每天下午3点肯定饿,吃不饱。我呢,和他相反,中饭只要吃馒头,不管三个,四个,下午4点,肯定饿,真要昏死过去了。不过这还好,还有个家伙好死不死,从四川跑到上海,还娶了个崇明岛的姑娘,每天早上一大碗白米饭,直接拌糖吃,他说他想自杀。呵呵。不过这么多年,貌似他没有自杀,倒是他夫人,火气见长,估计是吃辣椒吃的。
因此,我第二个建议,当同学们决定去一个城市的某一家公司工作时,先看看自己吃得了不?如果吃上面出了问题,很多时候,呆不住的。
有人可能说,我自己做着吃,可以。不过,巧妇难为无米之炊,我到西安来,一直买不到泡菜盐,泡不出泡菜来。那天参加个什么展销会,一个四川企业过来卖泡菜。不许笑,我那个口水,哗哗滴。。。。
以前看过《读者》的一片文章,《胃知乡愁》,一个人,年轻时能吃苦,年纪大了,很多时候,你的胃会提醒你,常回家看看。。。
说完吃,我们再说说住。这可是热门话题。中国人赚了钱,买房子是一定的,所谓“安居才能乐业”。大家看见没,目前房地产市场不管是火热还是萧条,总之是新闻热点啦,近期世道不好,房产销售不景气,为了吸引眼球,连房子本身都开始做“俯卧撑”了。呵呵。
前面说了很多话,其实归根到底一句话,是“我选城市”,但是,大家别忘了,做生意嘛,是相互的,光我选不够,还得“城市选我”,你说是不?
城市怎么选我呢,很简单,就是物价指数,凭我的本事,能不能赚到在这个城市生活的基本生活费。而所有的物价指数中,我理解最重要的,就是房价。
我当初选择西安,就是这么计算的。我隐隐约约听到一个美国的算法,即一个家庭的收入,不吃不喝100个月的月收入,应该能买套房子,否则就是物价太贵。100个月差不多10年,这样的话,一般选择20年贷款,这个家庭月收入差不多一半来还贷,能勉强应付下来。
我是这么理解的,这主要参考一个城市的平均工资水平和房价。平均工资水平很好查,各地社保局都有数据公布,可能跟大家目前的月薪期待值差的有点远,但那毕竟是国家承认的基本工资水平,是平均值,还是有一定代表性的。比如成都和西安,公布的都是一千多。
我们这么计算,夫妻是两个人,这个平均工资应该Double,算2k多,再加上杂七杂八一些工资外收入,基本上算3~4k,应该问题不大,事实上,我听到的西安普通公务员的收入,差不多就是2k~2.5k一个月。这算是一个比较标准的数字。当然,还有大量的工人,收入不到这个数字。
ok,我们折中一下,按照一对夫妻月收入3k计算,那么,100个月的工资,30w,按照平均一个家庭购买80~100平米的房子,算90好了,我们计算一下理论上的房价,30w/90=3333元/平米。再加上国家的税收,大修基金,装修费用(低档装修吧),差不多折合下来,4000元/平米,这是入住价格。
这样,我计算出了一个城市,根据工资收入算出的理论合理房价,那这就好办了,把当地房价和理论房价比较一下,一下就能看出这个城市的物价指数怎么样。这个我就不细算了,因为各个城市不一样,大家可以自己算。这里提示一点,成都的房价,高层公寓,一般在8k左右,西安的一般在5k左右。
从另外一个方面,我发现,上述计算也能判断一个公司开出来的薪水是否合理。我们知道,上面是100个月,和90平米的关系,我们模糊一点,大概算都是100,那么,基本可以讨论,家庭的月收入,应该和当地的房价基本持平,即,一个家庭每个月的工资收入,应该能买1平米房子。
因此,比如当地房价是10k,这在北京上海等一线城市,貌似很常见哦。
那么,我们至少应该能每个月赚到5k,否则,根本活不下来,也别想买房子,娶媳妇生娃。这还是男女双方收入对等的情况,中国的现状,女方高薪的,毕竟少见,因此,男方一般应该负担至少三分之二的工资收入,因此,男方应该月收入在7k~7.5k左右,女方在2k~3k左右。
不过,别忘了,这是要拿回来的钱,我们的钱,很多时候,要扣税,扣社保等,要拿回10k的钱,税前收入至少应该是12k左右。男方8k,女方4k,这是基本参数。
ok,大家知道怎么计算生活成本了吧?
说完吃住,当然还要说行啦。
别激动,很多时候,上下班是个大问题,一个城市,扩大了,很多时候生活就慢慢变得不方便。像北京、上海,上下班花超过2小时是经常事,在没有可能买得起车子的情况下,公交上下班的困境,是很多年轻人的噩梦。这意味着,每天早上6:00就要起床,晚上20:00以后才能到家,一天有4小时在路上。
有几个解决方案:
1、买公司附近的房子,不过这一般不现实,我们IT业,一般都在高新区,房价都很贵,这多出来的成本,买辆车都够了,还有,我们的寿命一般都比公司长,换了公司,总不能换房子吧,投资回报率不高的,风险也很大,不是个好主意。
2、买车子,这确实能解决问题,不过,由此每个月多带出来1k左右的开销,上面计算的数字还记得不?12k月收入,需要涨到13.5k才够用,这还没有算买车的钱,仅仅是使用费用。
3、到公司附近租房子住,周末回家,这也很多,但这毕竟不是好的生活方式。
4、等所在城市地铁网建成,在很多一级城市,地铁不错,不过,也不一定顺路,还有很多二线城市,地铁在建,暂时还帮不上忙。
5、等公司的班车,这要大公司才行,不是每个公司都有条件的。
呵呵,想来想去,还真没什么好主意,只有走一步看一步啦。
呵呵,啰嗦了这么多,就是希望就我本人的经验,给大家一点参考,希望能帮大家开启一点思路,切实帮助大家解决一点以后的困难。
其实选城市,我个人的理解,也难也不难,如果都照上面说的,事事计算完,就很难。不过,也有很多简便的办法,先签一家,过去做几年,看看,合适就留下,不合适,再换,也是一种办法,毕竟,很多东东是感觉,用理性分析不清楚的。
关键是:你想过什么样的生活?
学生评论:
河南成功学院Gwolf团队 魏天阳(PHP学生) :
选择城市也就意味着选择近几年的生活方式,的确是一个重要的问题,谢谢肖老师。这也是一个很迷茫的事情呀!
西北大学 任艳(C/C++学生) :
肖老师的话我深有体会,我觉得吧,人选了个什么职业,也就决定了你选择了个什么生活方式,以前吧,我自己感触没这么深,现在读到研究生阶段了,再跟以前那些非计算机专业的人讨论问题,总是觉得思维方式格格不入,而且也有点志不同道不合的感觉,呵呵,看来以后选什么都是要慎重的,毕竟这将影响到你的生活质量。
回复 黄海峰(网络管理爱好者) :
环境太重要了。在广州读的书,回家乡中山这个小地方去打工,当初猜中山竞争不大,会舒服点,后来才慢慢发觉很不适应,我习惯了高速的节奏,中山却有点慵懒,给我很慢的感觉,我觉得在虚耗人生。说中山竞争不大,其实也假,这里招开发啊网络啊等工程人的职位比起广州深圳少非常多,有时候找到了一份工作就算你已经觉得不会太喜欢还是要撑着做,不然吃不了饭,然后工作过程中再时常关注招聘广告。另外高楼不多感觉不到城市气息,觉得自己很原始,我是很愿意跟着感觉走的人,譬如我以前在广州读书那会喜欢挤在地铁里想事情看世态人情,一个人流连在川流不息的热闹夜市,全世界都很忙,没人有时间发现我,我感觉自己走在明处却能藏着许多私事,感觉很自在。小城市慢,没什么可资娱乐的消遣,人也传统一点,并且目光也短浅一点,勾心斗角的事情会多些,大城市人人都忙,不太会计较小事情,要么干脆不理你,要么大吵一场,大家都忙,不会浪费时间经营关系制造事端玩城府。大家说大城市人情淡薄,但我也可说那才是君子之交。
回复 邱沧淮(C/C++学生) :
每一个城市都有它的文化,选择一个城市,就是选择一种生活方式,选择一种生活态度,往宽里说,甚至就是选择了一种人生。
听了肖老师的话更理性的看待了将来的去留,留住男人的胃就是留住男人的心,留在一座城市,吃也是重要,我南方沿海人,吃不惯辣椒馒头面食,离不开海鲜,呵呵;生活成本,房价胡乱长,什么时候是个头啊,入不敷出啊,有压力就有动力,这个压力,有点大。其实我们这里也挺好的,就是对TW问题城市一直没得发展,现在情况好了经济飞跃,年青人就是想到处闯闯…啰嗦半天了,还是学生,我的路还长,我还有努力的机会!
关于女生的程序员之路
肖舸老师
这是发到邮箱里面的一封信,感觉近期讨论女性程序员居多,有一定代表性,这里尝试作答。一家之言哈,欢迎拍砖。
原文如下:
肖老师:
您好!
我是在大本营上认识的您,首先感谢您在大本营中给予我的帮助和指导,我真的从中获得不少收获。
说实话,我之所以加入大本营是因为在大学中课程学习的需要,但是随着学习的深入,我对编程产生了很浓厚的兴趣,但是关于女生从事程序员之类的工作,我有很多疑惑。
首先程序员是份耗脑力和体力的工作,熬夜加班出差都是常事,不管有多大的兴趣,身为女性的体质能否胜任其中种种艰辛?
其次,有多少公司愿意招收女程序员?性别歧视仍然存在是不可否认的事实,要获得肯定,女性势必要付出更多。更何况是刚毕业的女大学生?
我很迷茫。是不是应该在编程这条路上继续走下去?关于大本营中的各个课堂,什么JAVA,PHP,NET,嵌入式,等等。我都没有接触过,我只是个编程初学者,只是学习了数据结构和C++,考试和实验成绩也不错,很多人说我有这方面的天赋。而且我自己也很有兴趣,希望能继续走下去。但是接下去该怎么走,完全没有头绪。
其实现在所有烦恼都是来自于就业和未来的生活,我希望能从事我喜欢并且适合我们女孩子的工作。男孩子喜欢了就会不顾一切,但是女孩子难免有很多顾虑。希望老师能给我建议,或者能指点我方向。能让我从迷茫中走出来。。。。
期盼您在百忙之中能给我回信,谢谢!
您的学生
===========================
我的回答:
这位同学你好,呵呵,首先声明,肖老师是男生,从来没有站在女生的角度思考过问题,因此只能就自己的角度来探讨一下问题,说得不准,勿怪。
嗯,说个现象吧,我在成都呆了12年,确实没怎么看到女性程序员,有几个,生了娃以后,都回家带孩子去了,不过我到西安来以后,吓了一跳,程序员中男女比例接近1:1,呵呵,确实给我上了一课。
所以,就我的经验值,我发现你说的其实不准确,起码中国北方城市,女性就业率还是比较高的,至于是不是程序员职业,并不重要,也有很多女性做的,你大可不必担心这个问题。
当然,女性有女性的弱点,生理上的咱们就不说了,其实对于办公室工作来说呢,问题不大,关键是结婚生孩子,根据劳动法,女性一般是4~6个月的产假,这在很多小公司来说,一个人接近半年不上班,还拿薪水,确实有点难以接受,因此,在招聘时,不知不觉就对女性有点回避倾向,就造成了女性求职困难的现状。
但是呢,我觉得这是短期现象,为什么呢?一个公司,如果要做大做强,做正规,必须正视这些劳动法规定给员工的基本福利,如果老板刻意回避这些话题,应该说,这家公司也确实做不大。至少,我到现在没有看到哪家超过1000人的大中型企业,里面一个女人都没有的。你说是吧?
所以,这个问题,归根到底,我的理解,还是市场经济的初级阶段问题,即中国的企业刚刚出现,还在进步,目前实力还弱,无力承担太多的社会责任,无法承受女性结婚、生子的一系列额外成本增加,因此导致女性就业渠道偏弱。
就我的经验而言,目前国有大型企业、欧美外资企业,嗯,台资和港资等企业也是,对劳动法遵守比较好,反而是中国的民营企业,遵守得不好,让买个社保都磨磨唧唧的,更不要说女性的产假等问题了。因此,如果求职时主要针对上述企业来说,应该问题也不是很大。嗯,国内华为、中兴等大型企业,对女性歧视也很小,可以考虑。
但是,要注意,这里面也有个门槛问题,国有大型企业,其实福利是比较好的,但是,工资待遇偏低,尤其是进去主要靠关系,很少有凭借真本事能进去的,这个难度很大。其他三资企业,人家是典型的资本主义社会原则,看人部分男女,都是成本,每个人必须创造出效益来,因此,首先必须要真本事才进得去,其次,进去后,人家用人也比较狠,我们常说“女生当男生用,男生当畜生用”就是这个道理,如果进这类企业,要做好被扒层皮的思想准备。
第二个提法,我觉得目前女性就业困难,关键还在女性自己。
目前大学里面有句话:“干得好不如嫁得好!”,我想大家都听说过。其实是人就有惰性,也有一些劣根性,都想找一些活少拿钱多的工作,舒舒服服地赚钱,这种思想,其实不管男人女人都有。我自己也有,呵呵。
关键是,社会是公平的,一分贡献,一分收获,哪有那么多不劳而获的事情。但现在的女生,我觉得普遍有点问题,都想走捷径,都想一次革命成功,目前大学校园中,傍大款的不少,很多女生一门心思嫁个好老公,认为这辈子就有靠了,不需要奋斗了。
因此,在求职市场上,很多女生不是找不到工作,是根本没有一心一意地去找,因为对女生而言,通常都有第二选择,可以靠家里,靠男朋友,等等。这种求职态度上的不坚决,其实无形中,已经给自己关闭了很多企业的大门。有个现象,同等条件的两名女生都面试,一名犹犹豫豫的,一名态度极其坚决,一定要拿到这份工作,通常都是后者获胜,因为企业认为这个人既然这么需要这份工作,那不管能力怎么样,进来后起码会拼命做事。
那我们再来比较男生和女生,就可以看出显著差异了,其实男生有时候也想靠,但是没得靠啊,反而,还有个女生在靠自己,自己还要撑起一片家庭,那么,你说男生求职拼命不?
但我还是得说,前面女生的这种思维是严重错误的,夫妻也是经济共同体,双方需要共同完成家庭建设,这样的家庭才稳定。一个女性,如果觉得职场艰难,就打退堂鼓,那,不管是不是程序员,其实我觉得她什么职位都找不到的。
这样还有潜在的恶果,现在有很多闪婚族,出了校门就结婚,我认为和女性的这种依赖思想有一定关系,但这样的婚姻,是不是稳定呢?
其实我不讲,大家都应该清楚,女性凭借个人的外貌实现魅力,男人更多的是凭个人的内涵和事业的成就实现魅力,这就决定了,一个女人,魅力最大的时候,是18~28这个年龄段,而男人恰好相反,一个男人最有魅力的时候,是35~45岁这个年龄段。这中间有落差。
一个女性,如果坚持以漂亮为本钱,早早地就嫁人,在家里相夫教子,那么,在她30多岁,年华老去的时候,情况就比较危险了。首先,男方逐渐进入事业巅峰,很多更为年轻漂亮的女性,会青睐这种男人,男人面临的诱惑在加大,其次,这个家庭,十几年其实都是男方一点点赚出来的,女方是享受者,不是建设者,在这个家庭里面渐渐就没有发言权,经济基础决定上层建筑,不要说对方爱你就会一辈子听你话,很多事会变的。
如果此时女性再不注意,试图通过控制经济等手段压制男人不会变心,或者采用跟踪,哭闹等极端方法,往往适得其反,最终导致男人离他而去。一旦出现这个问题,女性的问题就比较危险了,十几年没有上过班,自己的专业能力,恐怕仅仅剩下一张文凭了,知识都还给老师了,那她在社会上可以说没有任何竞争力可言。那么,她以后靠什么生存?
所以我这里提醒一句,现代女性,最好有一份自己的事业,不要轻易依赖别人,记住,今天你有优势,别人会爱你,但是明天当你优势丧失,而男方优势突显的时候,很多时候,家庭并不是很稳固的。最好的方法,有份自己的工作,有份自己赚的薪水,可能不多,但是家庭建设有你一份,男方如果动不动就动歪心思,就是他无理取闹,打官司他都打不赢的。这也是保护自己必要的方法。
当然,也不要走另外一个极端,动不动就以女强人自居,你的事业是第一位的,男人天天在家里要给你扫地做饭端洗脚水,这也不好,中国社会,毕竟几千年,有个文化风俗在里面,女性再赚钱能力上,总的来说还是不如男方的,以后家里的顶梁柱还是男方,那么平时在家里,让着男方一点,家务活多做一点,让男方回到家,有个休息的感觉,能放松能感到温馨,这样的话,这个男人就是你的,打都打不走。呵呵。
总结一下,女性的工作问题其实比男性复杂,中国的男性,一般都是一门心思顾事业,把事业做到最好,而中国的女性,永远需要在事业和家庭之间求得平衡,既不能没有自己的事业,也不能放弃家庭,这很难的,不过,慢慢锻炼,总会找到办法。我的经验,能把握好这个平衡的女性,一般这辈子都比较幸福。
所以,针对你的问题,我觉得要辩证地看,既要看到,找份工作对你很重要,也要看到,作为以后家庭中,主要负责家庭事务的成员,你的工作不要一味追求高薪高职位,要寻求一个合适的职位,能满足长期工作不失业,但也不能太苦太累,搞得家庭无法维系。这才是比较周全的解决之道。
现在我们回过头来看看程序员,其实程序员这份工作,我觉得女性可以做的,程序员有很多加班的,但是这往往是工作刚开始,没有太多经验的情况,待工作一定年限,掌握了一定经验,加班会越来越少,其实大多数程序员工作岗位,是不出差的,基本上是朝九晚五制,做久了,收入也不低,可以满足一个女性对事业和家庭的平衡。因此,我建议你大大方方就做程序员,找不到,努力找咯。
嗯,再多说一点,就我个人的经验,程序员的加班,往往都是由于bug导致的,大多数时候,公司在安排项目开发时间时,时间还是给得比较够的,至少是评估过的,但是,往往是后期出现了很难跟踪,很难解决的bug,导致项目进度大大滞后,时间突然变得很紧,于是出现大量的加班,有经验的朋友可以想想,自己以前的加班是不是这样。
其实这个问题和男女无关,实实在在是每个程序员的问题,我本人以前也深受其害。后来我痛定思痛,准备彻底解决这个问题,于是我用了大约8年的时间,研究了一种方法,叫做《C/C++无错化程序设计方法》,出来后,我的bug果然少了很多,几乎达到0 bug的地步,自然而然,我加班也变得很少了。
这种方法我在我的新书《0 Bug —- C/C++商用工程之道》里面,已经share出来,供大家参考,如果你以后希望过的轻松一点,能更好地在事业与家庭之间求得平衡,少加班,多陪家人的话,建议书出来你看看。呵呵,也算我做个小广告。这种方法虽然是C和C++的,但里面的原则都是跨平台跨语言的,因此,其他语言的朋友,建议也看一看。会有帮助的。
学生评论:
金涛(软件测试爱好者) :
不光是在谈学习了,更是在谈人生,和未来了。男同胞也受用了。
陕西理工学院 郝争涛(C/C++学生) :
肖老师说的挺现实的,技术高了,加班自然就少了,重要的是关键技术。
上海大学 吴昊飞(游戏开发学生) :
肖老师的这篇文章让我了解到程序员加班的真实情况了,以前曾经有个IBM的程序测试员来我们学校免费上了几堂程序测试的课程,他有说过一句话,大致意思是程序员很难不加班,后来我又在一家软件外包公司短期实习了一个多月,好像是项目快到交付日期了吧,反正那里研发部的程序员几乎天天加班,结果给我的印象就是:程序员=加班
而且自从那次我妈就觉得程序员这工作太累(那时候实习的地方离家比较远,路程有两个钟头,实习生不用加班,也要早上七点出门,晚上八点到家吃晚饭,然后洗洗直接睡觉了),现在大四开始找工作,我妈就一天到晚跟我说最好不要找程序员的工作,说得我都快有点动摇了……
应该把我妈拖过来让她看看这篇文
如何找需求练技术
肖舸老师
被很多同学问,怎么才能知道用人单位的需求。
这个给个建议哈:去CSDN或者其他什么网站的项目外包栏目看看,里面的需求,就是别人肯付钱的需求,自己试着实现一下,比较练技术。如果能卖出去,就表示技术练差不多了,可以凭这个项目经验找工作了。个人感觉,这个项目经验在找工作的时候,有时候比学历证书管用。
嗯,这里面有几点请注意:
1、不要做外挂!不要做木马!不要去破解!这短期内能帮你赚钱,但长期看,相当于自己封杀自己这辈子到达程序设计巅峰的机会。靠偷东西,是没有办法受人尊重的。就算以后赚很多钱,脑门上还是写了个“贼”字。
2、不要去评价对方要求合理不合理,他肯花钱,就是客户,客户永远是正确的。
3、不要去嫌钱少,你觉得你已经很努力了,用了很多技巧,用了很多技术,但是,你干的活,对客户产生的价值,就只有那么点。
4、有些太大的需求别怕,比如20000做个带VoIP的IM软件之类的,那明显不是给你的,是某些人,希望做套IM系统,但又舍不得花钱,希望用这点钱,诱惑某个正在做这个IM软件公司的员工,把公司的源代码偷出来卖给他的,这是一种诱惑,算是引人犯罪,别理他,堂堂正正地做人,比什么都强。
5、别怕别人的回复,很多人回复,说是什么什么的成熟团队,其实可能就做过一两个项目而已,你找几个朋友也可以,尝试给客户发发电子邮件,低调一点,慢慢谈,刚开始甚至免费做,就期待对方给你一个机会。只要做过,你已经赚到项目经验了,已经获得很多了。
6、不要想着一个人做事,有人看见一条自己合适做的,激动万分,生怕别人知道了,恨不得这条消息马上下线,免得有竞争对手,其实,有竞争才有进步,找几个同学,一起做,你会发现,你的同学比你聪明的。学着欣赏他们,以后你就是项目经理。
7、不要气馁,千辛万苦做出来,对方客户一句话,不要,很正常,市场竞争就是这样,千万别跳楼,自己再来就是了。大不了重新来过,怕个P啊!
8、用心做事,既然做了,目的就是卖钱,不是过家家,不是开玩笑,用尽全部心思,让客户买单,不管最后结果如何,只要你做了,就问心无愧,而且,你会发现这个过程给你带来的,比你卖的钱要多得多!
9、最后一条,如果你赚到钱了,有低年级的小弟,请教你如何赚钱,把我这篇文章推荐给他,这不是培养竞争对手,是把软件外包这块市场越做越大,钱是赚不完的。帮别人就是帮自己,以后你做项目经理,如果你手底下的技术骨干是你这么培养起来的,你说轻松不?
学生评论:
河南成功学院Gwolf团队 赵鹏(C/C++爱好者):
比我的驱动学习还是任务学习更加深刻,更加考虑周全。再提炼就可以把一种学习方法抽象成一种方法学了。呵呵~~期待您的下一篇……
在肖老师的指点下,这里我针对我们学生,提出几点小的建议:
1.找需求
不要找大的,就找小的,比如做一个程序自动开启器,一个课程表,一个游戏计时器,一个博客计数器都可以。
关键点在于:能够通过自己的眼睛来发现需求,然后抽象成一个软件或者一段程序
2.团队学习
团队学习不是你让别人来,别人就来了。一般也不是约来的,我更看中的是你也强了,然后带动一部分强了,那么团队就有了。一开始就想要个团队,我觉得是会失望的,因为很简单,人家为什么要和你一起呢?
关键点:尽力用实力营造羊群效应,被动地带动一部分来做,而不是主动!
3.钱的问题
一般情况下,学生的作品是不能产生商业价值的(仅仅是一般),所以,目光要远点。能卖钱的,一般就是网站之类的,管理系统什么的。这些东西可以在学习体验软件工程的时候来实践,但不是说别的项目就不能实践软件工程,只是如此实践,成本较低!大学时代,多去探求真理,知识根本原理。比如web开发的数据处理模型,数据库的基本模型等等,那么以后的价值增长是不可估量的
关键点:做事情要学会计算成本,尤其学习,因为时间成本是没办法回收的!大学时代不为钱,就为明天的增值,就为今天的成本而学习!
以上纯属个人意见,仅供参考!
修炼编程的内功
肖舸老师
这也是一直想写的一个话题。近期,在坛子里也回复了一些帖子,感觉同学们在这方面认识也有一些偏差。干脆就写一篇吧。这里是两篇同学们的帖子,大家可以参考一下。
老师,给有点迷茫的学生一些指导吧,谢谢谢谢谢……杰杰 2009-06-02 04:12 http://student.csdn.net/space.php?uid=46110&do=thread&id=1840
也来出道题郭晓 2009-06-03 23:26 http://student.csdn.net/space.php?uid=54179&do=thread&id=1921
(特别注明啊,在郭晓同学的题目中,肖老师被狠狠地鄙视了,呵呵。)
还是那句话,一家之言哈,欢迎拍砖。
很多年以前,我还是一个学建筑的学生,但是很喜欢学计算机。不过呢,由于专业限制,我没有计算机用的。学校只开了一个学期的Fortran语言,上机时间只有可怜的5节课,那会把我憋坏了,呵呵。
大家不要笑啊,90年那会,生活不富裕,PC机还是一个很贵的东东,一般家庭都还停留在18吋电视机的时代,大学生又是最穷的,物质条件更为匮乏,我当时有个小收录机,京华牌的,呵呵,在同学中已经很牛叉了。因此,像现在的同学们,一考上大学,MP3、MP4、笔记本电脑家里给配齐的,在当时是根本不可能想象的事情。我作为过来人,还是要说大家一句,大家真是生在好时代了,很幸福的。
不过呢,我很喜欢编程,就养成一个习惯,想象编程,找一个题目,自己在脑子里把程序构思出来,写在纸上,然后自己模拟电脑的run,把程序过一遍,看能不能执行正确。这个习惯现在都还有。呵呵,我老是劝大家写简单的程序,其实和这个习惯有很大关系,因为我比较笨,稍微复杂的程序,脑子就想不过来了,就晕了。
也正因为有了这个经历,我就开始思考一个问题,编程究竟是什么?呵呵,当时我在学校,也是小有名气,大家都知道有这么个程序疯子,没事喜欢发呆,喜欢想程序。在一次舞会上(别激动,我也是过来人,也会跳舞的,虽然很难看哈,呵呵),一个计算机专业的师姐就考我,问我编程是什么?
我当时想了一下,很郑重地回答她,我的理解,编程就是拆解任务,把一个任务,拆解成很细很细的步骤,一步步教计算机去做。计算机很笨的,举个例子,我们说早上起来去上课,是个人都知道做什么,但是它不知道,因此,我们要告诉它:
起床–穿衣–拿饭盒–去食堂–买早饭–吃饭–洗饭盒–回宿舍–放饭盒–拿书–出门–如果人都走完,要记得锁门–去教室–推门–找到自己的座位–走过去–坐下来–等待上课–上课。
说到这里,我突然自己有点明悟了,编程,就是把复杂的问题简单化,简化到每个动作都是1+1=2那么简单,然后计算机照做就好了。这就是我理解编程的真谛。我师姐听到了,也若有所悟,这个话题就没有再说了。
我们来分析一下计算机的特点,准确的讲,目前我们这个社会的计算技术,还很原始,说它是计算机,正确,它确实只能计算,说它是电脑,太抬举它了,它不可能有思考能力。
在冯诺依曼体系架构中,计算设备就是具有一定计算能力,有能力和外界做出IO互动,并且能高速重复动作的这么一种设备,这可能和大家在教科书里面学到的不太一样啊,不过,我是这么理解的。
因此,我从一开始,就没有把计算机作为一个伙伴,一个可以帮助我出主意,或者代替我思考的伙伴,仅仅是看做一种工具,这种工具有什么用呢?我认为它最重要的,有两个作用:
1、无限可重复性,一个动作序列,一旦编订程序,计算机就可以无数次重复这个序列,不会感到累。这特别适合于那些乏味的,不断重复的劳动,比如,我们一个学校每天要敲钟,打上课铃,如果让人来做,这个人会很乏味,做久了,就可能出错,但是让计算机来做,它可没有什么思想,不会觉得累,而且做的很好。计算机特别适合做重复性工作。
2、服务品质的稳定性。计算机适合做重复工作,还有个有点,就是每次执行结果都是一样的。这体现了工业化时代最重要的一个思想:量产思维,大家可以看到,现在的社会,不可重复的艺术固然很好,但公众需要的是量产的产品,因为质量稳定,产量稳定,能满足大众需求。劳斯莱斯虽然很美,但绝大多数人在开大众、丰田等低端车。就是这个道理。还是打铃那个例子,如果是人,可能会生病,可能会请假,或者干脆搞忘了,但计算机不会,只要有电在正确工作,打铃就不会出错。
这样,我就慢慢理解到了,计算机其实就是能以恒定品质不断重复输出服务的机器而已。
ok了,这我们是不是可以理解到,计算机编程,其实首先是人的工作,当我们遇到一个服务需求,我们人来做一次,嗯,获得一个比较满意的结果,然后我们觉得这个动作可以重复,下次遇到类似的问题,照做就好了。于是,我们就安排计算机来做这件事了。是不是这样?
这是不是说明,程序,其实是在讲一件事应该怎么做,这个做的过程,以及这个过程的含义,其实是人定义出来的,然后通过编程,教给计算机来做而已。
我以前经常有种感觉,计算机编程,是两层意思,一层,是程序本身的含义,就是怎么做事,另一层,是隐含在程序下面的逻辑含义,就是做事的意义,程序只是字面上的意思,而逻辑,是程序段落组合起来,共同表述的一层意思。现在想想,其实就是这个道理。
嗯,既然我们知道,编程,就是把做一件事情的步骤,分拆开来,教计算机去做,但,分拆到什么粒度呢?这个很重要。如果分拆的粒度太细,白白浪费程序员的时间和精力,这些都是成本。而分拆得太粗,计算机还是弄不明白,做事不对,就是bug了。
这说明,编程有个很重要的概念,就是粒度,也就是我们对问题描述的精细程度。
最开始的计算机是最笨的,学过计算机组成原理的同学大概知道,只要有个累加器,其实已经可以算一台计算机了,只会做加法计算。因为从数学上,我们可以知道,任何计算,最终都可以演化成加法计算,事实上,现在的CPU,在最底层核心的部分,也还是这个加法逻辑。
这样做当然没什么不好,不过,有个小小的问题,就是粒度太细了。如果每件事情,都要程序员去拆解成很细的加法计算,这个工作就几乎不是人干的事情了。难道就无解了吗?
呵呵,前面我们说过,计算机的特点是什么?无限重复,大家就发现,一个事情,比如7*24,这是乘法计算,但是,我们最终要拆解为加法计算去实现,但是,不是说我们每次都要这么拆解,乘法计算也是一个工作,有规律的,因此,当我们拆解一次之后,我们当然可以把这次拆解过程本身,编订为程序,下次遇到类似问题,让计算机把这个程序再跑一遍就ok了。呵呵,大家以为Intel的CPU里面的乘法计算指令是怎么实现的?大家又以为AMD的CPU内部的微代码体系是怎么实现的?
就是这么一个思维,解决了所有的问题,遇到需求,首先拆分,然后不断检索我们以前是不是以前拆分过了,遇到能套用的程序段落,就直接用,不用每次都拆分那么细,减少工作量,当然,遇到新问题,还是需要自己拆解的,不过,拆解后,最好把拆解本身,也写成程序,下次重用。
大家玩各种语言,一般都提供基本库,这个基本库,其实就是前人已经拆解过的结果,软件公司觉得有代表性,可以满足大多数应用场合,就编订到基本库里面,以后程序员直接用,不用自己重复了,大家说是不是这样?
现在,大家知道怎么看待C的stdio.h,stdlib.h这些基本库了吧?C++的iostream是什么含义,知道了不?MFC知道了不?Java的运行时库是什么意思,也知道了吧?
不过呢,这个世界的需求总是很多的,并且,计算机的能力也是不断在进步,以前不适合计算机做的事情,现在也慢慢变得适合了。因此,大家总能遇到一些新问题,需要自己重新拆解,基本库中没有提供,这就是程序员这个职业存在的真实含义。帮助用户不断拆解新需求,解决新问题。当然,库本身也在进步,不断把已经被证明拆解成功的问题,修补到库中,避免以后的程序员做重复工作。就这么简单。
呵呵,啰嗦了这么多,可能很多同学看的一头雾水,肖舸老师你到底想说啥?
我想说的,其实很简单,编程序,就是拆解问题,但讲究个拆解的技巧和方法,以前人做过的,别做,尽量用,没有的,做过一次,尽量保留下来,供下次使用,就这么简单。
那,这和本文的题目“修炼编程的内功”有啥关系呢?
当然有关系了,什么叫编程的内功?我的理解,就是对这个世界的抽象化理解能力以及描述能力。一个工作,能迅速从中提炼出下次可以重复的套路,并且能以一定的规则,就是计算机语言规范,描述出来,拥有这两个能力,就能保证遇到任何问题,都有办法写出程序来。
所以,大家学校中学了很多数学,语言,算法,数据结构,甚至编译原理,操作系统,其实这些统统是工具,不是写程序的目的。
写程序,就是遇到需求,能迅速抽象,理解其共性,并能以清晰的语言描述出来。上述学科,不是帮助提升你的抽象能力,就是帮助提升你的描述能力,大家看是不是这个道理?
所以,我在带徒弟的时候,有时候喜欢说一句话,其实作为程序员,学习一点语文有好处,因为最能培养描述能力的,其实还是语文。英语不算啊,英语虽然也是一门语言,但中国的教育,一般是能看懂,很少从一个英文文学家的角度培养学生用英文的描述能力。只有我们的语文课,这不但是教语言,而且通过无数次造句和作文,在教大家描述问题的组织能力,这个能力在写程序的时候,很有用。
这个时候,话题就出来了。中国的语文,先是甲骨文,然后古文,然后白话文,大家发现没有,总体是越来越简单,这是发展的趋势。为什么呢?因为大家觉得,语文就是让人懂的,太深奥的东东,不太适合普及,就没有生命力,反而越简单的东东,普及越快。
因此,请大家注意,写程序时拆解,是把问题简单化,不是说把一个问题描述得晦涩难懂,才叫本事。真正的程序高手,都是简化问题的大师。
当然,从这个话题,我们是不是可以得出一个结论,其实写程序的方法本身,编程的内功本身,其实是没有什么语言特性的,C、C++、Java、PHP、Python。。。是不是都用的同一种方法在做事情?
因此,我这里提出,修炼编程的内功,是学习抽象能力和描述能力,与语言无关,换而言之,从任何一门语言入门,都可以修炼到内功的极致,关键看你用不用心。
因此,学习期间,我的建议,不要好高骛远,不要去评价语言的好坏,平台的好坏,没有多大意义的,你并不能确定这辈子最终能在哪个平台下用哪种语言开发。捡着手边有的书,老师教的课程,埋进去学扎实,出来后,换语言比吃盘菜也难不倒哪去,呵呵。这算是正式回答杰杰同学的问题。
再说一下郭晓同学的问题。他列了一个很偏的题目,就是有两个变量a和b,不用if、?:、switch或其他判断语句,找出两个数中比较大的那个。
这个问题,我不认为是个好问题,因此提出异议。主要的原因就是基于上述的讨论,我认为评价一个程序员好坏的标准,应该是考察其简化描述问题的能力,而不是把问题复杂化的本事。
这在学院派里面很多,这里大家可不要生气啊,我知道大家现在基本上都是大学学计算机专业的,算是学院派,但肖老师我的实战出来的,看法很多都和大家不一样。
学校里面,老师的任务是把尽可能多的东东教给大家,因为他不知道以后你做什么工作,哪些知识没用,因此,学校老师会尽量培养大家描述复杂问题的能力,这就造成了,学校里面的考试,是尽量把问题复杂化,多考察大家几个项目。学校里面的风气,也认为能解决复杂问题算高手,甚至问题本身不复杂,大家把它造复杂,来考核自己的能力。
但实际工作中不是这样的,实际工作中,大家最看重的是能用最简单的办法解决问题的能力,因为这样成本最低,无形中,大家赚钱最多。所以,对问题的抽象拆解和清晰描述非常看重。
很多同学刚刚上班,会很不适应,其实就是这个思路的转换。学院里,以复杂为美,而商业公司中,以简单为美。这应该是一个很大的思想转变,甚至是世界观的改变,很难的。一般转的比较快的同学,在公司里面进步就比较快,但我也见过工作几十年了,还是没有转过来的程序员,一般在公司里面活的就比较累一点。
建议大家好好思考一下我今天的提法,看问题抓本质,只要能及时理解商业公司的开发思路,理解简单这个要素,我不敢说大家一定能找到工作,但只要找到了,在公司里面,基本都能快速融入公司。
呵呵,先说到这里,好累。大家有问题,欢迎探讨啊。
学生评论:
江西师大 朱斌(Java学生) :
很喜欢老师讲话风格!!!一口气读完了,一开始看这么长文章,是想复制下来以后看的……
讲的非常在理。。我也曾经试图将电脑想的非常简单。可实际写程序的时候就是没法将其看的简单。不知道问题在哪
郑州大学 胡章思(Net学生) :
读了你这篇文章我感触颇深,因为我一直以来也是这么认为的,我感觉编程就像造出来一台又一台可以听从你工作的机器,而这些机器连到一块运行就能产生你所需要的东西。
所以程序员最重要的是编程的思想,而不是什么语言,架构,那些东西用到的时候去学习一下就行了,但是如果没有编程的思想,所有的东西都是空谈。
其实对于企业的面试,我以为他们出这种题目本意就是刷人,找出思维比较灵活,反应比较快的人,这种人比较适合研究产品,而不一定适合开发产品。
个人的一点见解,呵呵!
北京建筑工程学院 陈丽君(C/C++学生) :
说的很有道理哦,很适用于实际工作中,给我们这些还在学校的学生一些启示!从您这篇文章中,提炼出以下五点,我认为概括得比较精辟的地方:
1、计算机其实就是能以恒定品质不断重复输出服务的机器而已;
2、编程的内功,就是对这个世界的抽象化理解能力以及描述能力;
3、编程序,就是拆解问题,但讲究个拆解的技巧和方法,以前人做过的,别做,尽量用,没有的,做过一次,尽量保留下来,供下次使用;
4、写程序,就是遇到需求,能迅速抽象,理解其共性,并能以清晰的语言描述出来;
5、写程序时拆解,是把问题简单化,不是说把一个问题描述得晦涩难懂。
感谢您分享您对编程的理解!
河南理工大学 韩记伟(C/C++学生) :
这几天,学习一直处于低谷状态,直到看到这篇文章,才茫然清醒了许多。也顿时找到了以前那种自信和兴趣。说的太贴近实际了。
编程是有它的趣味之所在的,到一定的时候,真的是会顺水顺舟,水到渠成。
一直一来寻找的编程之精髓:程序融于生活,编程提炼人生。
1:我们不要急躁,修炼内功。
2:编程趣味生活中无处不在,编程能带领我们触摸到社会的各个角落,跻身编程不枉人生
3:玩转编程后,让人生变的轻松愉快
7000块钱能买什么?—-答一位同学的培训问题
肖舸老师
昨天接到一个同学的网上提问,由于这位同学没有实名,因此,这里没有办法确定哪位同学了。
他的问题很简单:
目前马上暑假了,他有两个机会学习深造:
1、某个很不错的培训班,7000块钱学半年,Java语言的入门和深入,每天晚上上课。
2、他老师安排他和研究生同学一起研究嵌入式课题。不要钱。
乍一看,这个问题好像问一个人吃红烧肉还是吃大便一样,不用想都能选,但是我在回答这个问题的时候,突然打了个突,发现很难回答。
第一个选择,培训班都是上手比较快,老师一般都是实战出来的,有自己的套路,按照套路来学习,一般说来都很快。另外,老师一般都已经把书读通了,很容易能帮助同学们快速建立统揽全局的概念,能跳出书本看知识,因此,获得的整体印象很好。只有一个问题,要花钱。
第二个选择,其实看似不收钱,但是就我的经验,发现这类跟着高手一起参与项目,学习效果一般都不好。这个我也有过经验。其实这和学习无关啦,主要是人的问题,高手毕竟不是老师,没有一定的教学大纲,往往是做到哪,用到哪,很少能系统的讲解知识,并且,这还和你本人是不是善于分析问题,提问能力高低有关,也和高手的脾气和态度有关。遇到脾气不好的,甚至你问了,都不一定回答你。大家可以想想,有没有小弟弟,小妹妹,问你一个初一的数学题,当时你是否很耐心,很仔细地给他讲解透彻了?
这个不是说高手不是人,大家都是年轻人,一个年轻人,学会东东很容易,但是,能耐心地把东东讲出来,不容易,同时,对对方提出的弱智问题,不发火,不急躁,任何时候,都有耐心回答,确实太难了。想想看,如果半夜两点一个菜鸟给大家打电话,问一个奇弱智无比的问题,比如为什么从Windows界面删除一个快捷方式,软件还在?大家会不会发火?
因此,我的第一个建议,任何工作,要有一个职业化的态度,找专业的人士帮助,学习也一样,不能流于形式,要学习,就要在师生双方建立某种契约关系,以一定的职业要求,来约束双方,一个认真教,一个认真学,自然能在短期内取得效果。
上述第二种方式,不是不可以,如果你能和这批高手一起呆10年,其实还是能学不少东西的。肖老师以前就有一个高手,带了我差不多10年,那个人软硬件都很牛,我学的是他的软件部分,呵呵,硬件没钱买,就没学。效果很好,不过呢,10年哦,如果当时等着吃饭,我早就饿死了。
因此,短平快的学习,最好找学习班,前提是学习班口碑很好,真的能学到东西。
我给那位同学出了个主意,就是那个培训班有没有试听课程,如果有,去听听,做好笔记,and把笔记发点到CSDN学生大本营来,请这边的Java高手老师点评一下,看水平如何,再决定是否买单,大家觉得这样好不好?
不过,转念一想,我又有点不想让他学了,原因很简单,钱钱太多啦!7k哦。。。
我不知道这位同学家境如何,大学生,总不太可能自己赚钱,因此都是花家里面父母的钱。大家可能感觉不深,不过呢,这里说说肖老师自己的故事。
我在2000年的时候,参加培训班学习MCSE,那可是花的自己的血汗钱,也是7k多,真的很肉疼。记得我把所有的培训费用交完,手边只有1800多块钱,然后那个死没良心的老师,居然跟我说,考试费250一门,一共6门。
当我用颤抖的手,再数出去1500元大钞,大家体会到什么感觉没?我这个月的生活费,只剩下300啦。当时我就跟自己说,我绝对不能补考,因为我已经没有钱补考了,必须6门一次过。
and开始疯狂K书,课堂上,基本上都是我问,老师回答,我一般都要求老师围着我转,不管了,我花了那么多钱,不学就亏了。6周时间,全部K完,一次过,当时感觉人都疯了,每天脑子里都是题。当然,MCSE这会不值钱了,不过,那会,还是觉得自己学到真东西了,我现在做服务器集群,很多理念都是学习微软的Domain概念。
ok了,说到这里,我的意思很简单,如果大家能像这样有割肉的感觉去学习,把自己往死里逼,这7k就花的值得,该学,如果没有这个劲头,学了和没学一码事,建议还是省省吧,替你爸爸妈妈省点钱。
不过很遗憾,当时我看到我那个培训班,很多川大的学生,他们没有通过考试,像有个小女生,人很新潮,玩的手机也很高档,不过呢,做实验我看她一直抄着手,让她男朋友做,她看,要知道,这类培训项目,试验是重要的一环,这么看能学到什么,最后当然挂掉啦。我当初光是Windows NT 4.0 Server,都装了7xx遍。
大家不妨扪心自问一下,学培训班,是为了找工作,还是为了跟风,还是为了学到真本事?自己有没有决心,让这7k物有所值?
我这里给大家算个帐啊:
一对小城市的中年夫妻,一般说来,只要不是贪官或者暴发户,基本上靠工资吃饭呢,平均月薪大约4k~5k左右。两人带个娃,一般要花掉2.5k左右。剩下的1.5k能存下来。
如果这个娃在上大学,则很可能超支,大家目前自己每个月每年花多少钱,有算过没有?我见过很多中年夫妻,在娃上大学期间,基本上每个月都持平,甚至要透支,都需要动用老本。
就算按照正常年份,这对中年夫妻,每个月存1.5k,基本上要5个月才能存够7k,嗯,不止,你们上培训班,有没有交通费?有没有夜宵费?和同学要不要聚聚?这也是消费,7k的培训班,半年,上下来,花的钱差不多10k了。
也就是说,这对中年夫妻,要存差不多7个月的钱,才够你上次培训班的。这中间他们不能生病,不能买衣服,不能出去旅游,不能吃什么好吃的,只能按照平时的水平小心翼翼地生活。and,这7k到了我们手里,再转交到培训班手中,1秒钟都不要。平时大家happy,应该也不会考虑到后面的父母在怎么生活。
我不是说,培训班不可以上,但是,考虑到7k这个费用,我觉得有点过了。
按照这位同学的描述,这个班半年时间,每天3小时左右,收费7k,我算了一下,平均每小时收费38.9元。按照工资折算,每月22天,每天8小时,这个班在一个学生身上收取的月薪是6844。这工资不低了,很多一对一的家教,收不了这么高。
不过大家别忘了,培训班不是一个学生的,我们简单按照这个班收了20个学生来计算,则这个培训班每个月收取的薪水是136888.9元。
接近14万一个月,怎么都算是暴利了。当然,培训班的老师可以振振有词地说,知识是无价的。但这个培训班教授的是Java,我学C和C++的,不好评价Java的知识是不是值这么多钱,不过,我觉得,如果自己有恒心和毅力,自己买点书来K,未必需要花这么大的代价吧?
我给那位同学打个比方,你自己卖点Java的书籍,自己这个暑假不回家,跑学校图书馆K书,两个月,如果有人给你7k,你干不干?相当于别人花钱请你读书,看两个月书,赚7k。
ok啦,节约的成本都是利润,你自己K俩月书,不教这7k,是不是就赚到了?就算Java很难学,我不信K俩月书,啥都学不会。我学C语言嘛,当初也只用了十天而已嘛。
因此,我最后给这位同学的建议是这样的:
1、想学习,选准自己的方向,比如Java。
2、买点入门的书,查字典也需要,不要多了,1~2本就够
3、网上有很多解密的教程,不管是PPT、PDF还是录像,下一个,下的时候,先不忙去挑选哪个好,随便一个,只要别人做出来,就有真东西,大家别不信,很多人,挑课程能挑一个月。
4、捏着鼻子把这些东东一股脑看完,我的习惯是边看边写笔记,眼过千遍,不如手过一遍。看书也喜欢抄书,一般一本书抄一遍,怎么都会了。
5、每章的习题都做,就是给自己下任务,一定做完,做不完不睡觉。
6、这么坚持两个月,我不太相信效果不如培训班,最惨了,这不还有学生大本营嘛,有问题你问嘛。
大家觉得我这个建议如何?
学生评论:
朱志(Java学生):
英雄所见略同啊
赔本的买卖咱不干
干了一个买卖就得想法回本儿AND赚回来
我学四年就得花8万、、也就买个本科证,想想就心疼,所以得使劲儿学
重庆邮电大学 单文彬(嵌入式学生) :
说得很对,有时我也是这样想的,不过很少有那个毅力,平时要上课,还得要准备考试,用在这上面的精力也少了,有时我真怀疑中国的大学教育真的存在问题。老是在注重基础,可是去找工作,人家看的却是你有多少实际经验。想去学一些实用点的技术,又怕挂科,到头来学位证都得成问题。到头来是想学的没学好,不想学的也没学好。
合肥工业大学 张慧君(C/C++学生) :
现在学校教的东西都只是个基础,一些项目中遇到很多问题,都是要自学的!赞肖老师的狠劲儿!现在我看到我暑假要做什么了~多谢老师教导!
构建自己的不可替代性
肖舸老师
这是最近的一些思考,由感而发,希望能给大家一点参考。
一家之言哈,欢迎拍砖!
我问过很多年轻的朋友,他们在找工作的时候,最看重什么?
答案很多啦,公司要够大,薪水要够高,要有足够的挑战性,要有成就感。。。等等,当然,也有一脸茫然的,那是还没有想好的。
其实后来我考虑了一下,这个话题可以换个方式问,就是大家为什么需要找工作?
这个答案就少一些了,赚钱吃饭,养家糊口,为了实现人生价值,等等。
那如果我们再换个方式问呢?
你觉得在一个员工公司里面工作,最重要的是什么?
这个答案更少,升职、加薪。当然,偶尔有个别希望成为老板女婿的不算啊,呵呵。
不过,这些是不是最重要的呢?
我们换个思路,逆向思维一下,通常,一个人最看重的,不是自己能得到什么,而是自己最怕什么。大家想想是不是这样?
从原始社会,甚至再往前,当我们祖先还是猿人的时候,最敏感的是对危险的感应。这个习惯到现在,经过了这么多代,都还有,不信,在你床头挂上一幅画,上面什么都不画,就画一对大眼睛看着你,看你还能睡着觉不?在很多人的场合,只要有人在凝视你,再多的人,再乱的场合,你都能察觉到,是不是这样?
别说眼睛了,现代人虽然早已脱离原始社会,对于横向并排在一起的两个圈,都很敏感,觉得不舒服,因为这让人联想到眼睛。为什么这个让人敏感,不舒服呢?因为在原始社会,如果有一双眼睛盯着你,通常就意味着你被某个猛兽盯上了,随之意味着可能会死,这种眼睛带来危险,进一步带来死亡的感觉,一直传到我们现在。
上述分析麻烦大家别拍啊,我也是看一些心理学书学到的,呵呵。这里借用一下,想给大家说明一个话题,其实人生活在社会上,公司里,最关注的,还是安全感。
很难想象,一个人在公司里面,随时会被炒掉,或者公司随时可能分分钟关门,这个人还能静下心来做事。
于是大家就开始研究,如何让我们职业人士,能感到安全一些。
如果学过一点经营管理,都能理解一个概念,就是“核心竞争力”,一个产品,一个公司,一个人,能存活在这个世界上,其实都有他的“核心竞争力”。不过,这个“核心竞争力”究竟是什么呢?根据我的经验,一般说来,这个“核心竞争力”还有个名字,叫做“不可替代性”。
目前房价很高,但是大家可以看到开发商还是有恃无恐,随时准备涨价,大家说了,如果太高,大多数人买不起,那房子卖给谁,开发商哪敢这么狂?价格太高,也没什么炒作空间,那些想买房子升值的炒房客,也不会买,为啥房子还不降价呢?
就我的分析,房价之所以这么坚挺不降,或者说,房屋这个市场之所以还存在,就是因为购买者中有一部分是“刚性需求”,就是一些人,确实没有房子住,要结婚,要生娃,要有个家,没有办法,哪怕房价太贵,那怕再不合适,哪怕当房奴,也一定要买。就是因为有这些“刚性需求”存在,所以房价即使会跌,也不回跌得太离谱。
大家注意到没有,其实这个所谓的“刚性需求”,就是房屋这个产品本身的核心竞争力,不可替代性,至少在我们的社会,没有产品可以替代房子对一个家庭的支撑作用,所以它永远有市场。
这就可以给大家讲清楚了,所谓的不可替代性,就是消费者,顾客,除了找你买,找不到别的替代品,或者替代品无法满足消费者所有的需求,无法完全替代,比如美国有人住在房车里面,不买房子,但毕竟是少数,大多数人还是觉得住在房子里面舒服。
这个“不可替代性”是个很厉害的东东,顾客就算再不满,也得认账,跑一圈,也得回来买单。
OK啦,这里我们可以说出一个人在公司里面,如何解决最重要的安全感问题,其实就是构建自己的“不可替代性”,或者说“核心竞争力”。当我们在公司业务的某个方面,具有绝对的话语权,占据重要地位,比如,某个核心产品,是你挑大梁完成的,并一直坚持维护的,这就是一种“不可替代性”,公司不是找不到高手来替换你,而是任何替换你的举动,都会导致更大的成本开支,那么,你就是安全的。
当然,做到这一步,也就不仅仅是安全了,升职加薪也不远了。
因此,我们今天第一个话题,就是建议大家到了公司里面,先勤奋一点,踏踏实实做几个产品,做几个项目,做出自己的成绩,让自己在老板心目中,成为不可替代的人,那大家以后就会轻松多了。
这个过程其实不会很长啦,多则5年,少则3年,只要大家珍惜时间不荒废,努力度过这段职场入门期,一般都能在后期取得不错的成绩。
不过,说完这点,还没有完,因为还有个不好的消息告诉大家。
我学过一点管理,在企业管理中,有个很重要的原则,就是绝对不允许任何人,任何事,具有“不可替代性”。因为这对公司太危险了。
试想,一个几百人的公司,拳头产品可能就那么几个,其核心技术也就可能掌握在那几个、十几个人手中,如果这批人跑到竞争对手那边,公司马上就可能倒闭,甚至就是简单离职,干别的去,公司都需要付出高昂的成本来弥补这个漏洞。
因此,我们要知道,老板其实是一种非常矛盾的动物,他一方面希望大家努力做出贡献,最好一个人把所有的事情做完,成本低啊,但另一方面,他又随时防着大家,怕大家掌握的公司的核心机密,跑了,他就死了。
这就造成了一种很奇怪的博弈现象,员工不努力,分分钟被杀掉,员工太努力,老板也提防着他,结果,员工感到这一点,一种不受信任的感觉油然而生,最终员工反而更容易离职。
很多基层岗位,直接面对的是部门主管,还不是老板,但这种情况也有,部门主管也防着员工啊,万一哪个家伙太厉害,把自己顶了咋办?但手下都是一群P都打不出来的绵羊,他也不行,他这个部门别想出成绩,年终各个部门评比,他也悬。
大家看到这里,可能就更加混乱了,肖老师你想说啥?这么乱?
呵呵,我想和大家说,这些,都是正常现象,大家要正确对待。上面说的老板、主管、员工,谁都没有错,而上述的矛盾本身,也都没有错。都是合理的存在。
那我们怎么办呢?我这里给大家几点建议:
1、任何时候,努力学习和做事,都是对的,大家到了公司,先努力做事,争取早日成为技术骨干,拥有自己的核心竞争力。这是保证自己安全的关键,也是以后升职加薪的关键。
2、上述问题,在我们还没有取得任何成绩的时候,其实是没有意义的,大家无需理会,先做出成绩来。要让老板提防你,首先你也得有让他提防的东西啊,你说是不?
3、做出事情来,可能会升职加薪,可能也不会,不排除受到打压的可能性,建议大家遇到了,平常心对待,先看看呆的下去不?呆不下去,换个公司也无所谓,这时候,你前期的努力就体现出来了,一个做过事的人,和一个没有做事的人,面试时5分钟就能看出差距,面试官都是人精,你放心,你的水平他看得到的。
4、如果事情不好也不坏,老板既没有炒我,也不给我升职加薪,那就继续,也许我们的努力还不够,还不足以让老板重视,加油。当然,还有个重要的问题,你对这家公司需要的技术,业务是不是已经学完了?没有就坚持做事,学习,什么都学会,什么都能做,老板还看不到,叫做他瞎了眼,那个时侯再闪人,效果会更好。
5、当然,自古知兵非好战,我们也不是为了跳槽而跳槽,在公司一天,就认真做事,平时的态度也要端正一点,多说点公司的好话,觉得不对的地方,私下,记住是私下,给老板发封电子邮件,语气平和点,站在公司的立场上,帮老板改善公司的状况,老板会感激你的,这一来让老板认识到你的重要性,二来给老板吃颗定心丸,表示你还是支持公司的,老板会报答你,用升职加薪来报答你的。
6、不管公司同不同意,努力构建自己的不可替代性还是没错的,毕竟我们的寿命比很多公司都长,公司和老板不可能养我们一辈子,有了本事,到哪都能吃饭。因此,先做好自己。
7、当然,既有了不可替代性,又不让老板担心的员工,同时还不断帮老板提升工作的人,就要换个名字了,这种人一般叫做公司的“核心骨干”,或者干脆叫老板的“心腹”,如果你是老板,你会怎么对待这种员工?
其实,上面说了这么多,归根到底还是一句话,做好自己,做好每件事,我们在公司里面,不管是开发程序的研发人员,还是门厅的小MM,都是在做同一个东西,叫做“做事”。如果一个公司里面,每个人都能做好自己的事,同时帮助别人做好他们的事,这个公司又怎么会垮?老板又怎么会提防员工?
在公司里面希望有个好的发展,不让老板提放你,最简单的办法,就是做好自己事情,认同公司的企业文化,没有对公司的敌视心理,能自我调节各种工作压力。
呵呵,以上是个人的一点经验之谈,大家参考一下。
学生评论:
洛阳理工学院 王富涛(C/C++学生) :
我拍。。我拍。。。拍桌子。。讲的太好啦。。呵呵。感觉老师您太可爱了。。
湖南文理学院 张清山(Net学生) :
感觉有面向对象的影子,既要“封装”好自己,又要给别人提供很好了解自己的“接口”。当别的事物对自己产生了依赖,也就体现了自己的价值!肖老师,理解的对不?
文达信息技术职业学院 贺强志(Java学生) :
每个人都有阶段性目标(当然也各所不同啦),就像老师说的那样——要多思考。富有激情的做每件事,别让自己觉得很轻松。目标完成一个,在挑战下一个。你能说自己没有或一直没有核心竞争力嘛!~
期待(C/C++学生) 2009-08-04 23:44
受教育了!
肖老师研究方向果然广泛:技术、管理、心理学、房地产。。。,仅单就这片文章,更可窥见在文学上的造诣!
HOHO,佩服!
简述C和C++的学习历程
肖舸老师
总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。
一家之言,欢迎拍砖哈。
1、可以考虑先学习C。
大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望成为一个解决问题的专家。做一个有用的程序员,做一个赚钱的程序员。我们的价值,将体现在客户价值上,而不是语言写得好不好看。
C++是C的一个面向对象的解释,C++为C扩充了大规模工程应用,复杂的系统结构的组织和掌控方法,但是,我认为,C++骨子里还是C的。
毕竟,解决具体问题,每个函数内部,都是用C的方式写程序,还是面向过程的。
因此,想要学习好C++,我的建议,先学习C,先学解决问题的能力,再讨论解决大问题的能力。就是先学习怎么走路,再学习怎么跑步。
2、学习C的过程中,一定要理解结构化编程思维。
为什么呢,我前面有文章说过,软件语言的发展过程,就是一个数据私有化的过程,大型工程应用,强调高内聚,低耦合,模块化设计,保持代码最大的灵活性和安全性。
这是现代工程化开发的核心和灵魂。
因此,利用C这门语言入门,借此理解结构化开发思维,可以说是个很方便的路子。因为C的函数,本来就是为重用做准备的。同时,全局变量和cpp内部私有变量的差别,其使用原则,这些都能学到很多结构化开发思维。
3、开始学习C++
C++不难学的,很多人觉得C++难学,其实是因为它在C之外,又提供了很多的概念,尤其是对象,很难以理解。
不过我经过这么多年,把这个问题反而看淡了,我认为面向对象相对面向过程,仅仅是结构化程序设计的一个具体体现,是编译器提供手段,强迫程序员必须遵循数据私有化的一个实例,C++和C的关系,最核心的莫过于此。
现在我们回到C再看看,如果我们把一个全局变量,写到一个cpp里面,并且在对应的h文件中不声明,它是不是就只有这个模块可以使用?它是不是就是私有变量,以这个理解,类能明白了吗?
4、学习C++的深入技巧
C++在类的基础上,经过这么多年的发展,其实提供了很多深入的概念,看起来很复杂,其实我看也很简单。比如模板,我的理解就是“类的类”,大家说是不是?
既然模板理解了,STL,ATL这些,静态模板库,动态模板库,还难理解吗?就是一大堆类的类,可以借此实现很多应用中需要的类,不需要程序员再自己写而已。
ok,STL都理解了,泛型开发还难吗?所谓泛型开发,其实就是我做一个模板,来定义一套算法规则,但是呢,我希望这个算法规则,能进一步抽象,对核心数据类型不要限死,我把各种数据套进去,都可以用,这样,仅算法这部分,我不需要重写了。你想想是不是这个道理?
学到这里,C++和C,其实已经差不多了。再学语言,就是求全责备,过于钻牛角尖了。
5、学习应用开发
前面说了,学习语言,目的不是让别人认为自己是专家,是为了写程序赚钱。因此,语言学完,要学习应用开发。
什么叫应用开发呢,我会一门语言,但是,客户不懂,客户说的很直接,在Windows下给我写个程序,我要什么什么功能。为啥Windows呢?因为我习惯。
OK,很多时候,应用开发要尊重客户习惯,一般说来,语言这个东东,还是要结合具体平台的开发,才能开发出有意义的应用程序卖钱。那么,一般说来,客户端是Windows系统,服务器是Linux,这些都是行业习惯,嵌入式不好说,各种平台都有,Palm,S60,Linux,WinCE,等等。要根据自己的目标客户来定。
当我们选定目标平台后,有一个问题,选什么语言,很多时候,学生和商用程序员差别就在这里,学生一般没得选,自己会啥就用啥呗,企业里的程序员不会,要先评估需求,看哪个语言更合适,不会的语言,要去学。
ok,假定我们选了C和C++,那么,我们需要选择开发平台,Windows下不用说了,VC,这是最好用的,Linux下呢,gcc,其他的也差不多。
假如我们开发VC,并且使用C++,这个时候,才需要考虑学习MFC了,因为这是微软的标准类库,至少Windows平台下,它最权威,你看见没有,我们从学习开始,走了多少步,才走到MFC?是不是MFC不是学习C++上来就必须学的?
6、学习MFC
学习MFC,很多人一上来就开始看其体系架构,看得一头雾水,那个模块关系依赖图,我到现在都看不懂。
呵呵,其实不是啦,和学语言一样,我们学MFC的目的,也不是希望成为MFC的专家,而是要利用MFC开发Windows应用程序,为我们赚钱。看见没?MFC是手段,不是目的,目的是开发Windows程序。
其实Windows下,有一套很标准的C接口,叫Win32API,这个才是Windows的标准编程核心,因此,学习MFC,真实的目的是理解Windows程序开发,建议可以先学习Win32API,看来我们又回到C了哈,呵呵。刚开始学C有用吧?
7、Win32API
其实Win32APi不难学的,因为虽然它很大,有很多接口,但不是必须的,我们真正做个简单的Windows应用,其实用不到这么多的。做个简单的Dialog,然后实现个功能,你遇到的接口函数,其实绝大多数,就是以后常用的了。把常用的记熟练,就ok了。
关键是,这个时候要通过WinMain方式,去理解Windows的事件机制,这是核心,其实说起来简单得要死。就是以前你的程序,由于没有系统支撑,很多事必须自己做,比如检查鼠标和键盘输入,你需要写个死循环,自己不断去看,而Windows说,这些事你不要做了,我来做比你好。你没事就玩去吧,我把和你相关的消息放到一个队列里,就是你的事件队列,你自己没事去找找看,有没有新消息来,有就做事,没事就玩好了。很简单是不?
当然,Windows是多任务操作系统,有时候,我们的逻辑需要并发一些功能,比如说,我在等鼠标键盘消息的时候,需要再看看打印机准备好了没有,这里就需要理解并行计算了,这和语言无关,和操作系统无关,这是另外一个话题,这里不多说了,你可以自己找找线程开发的相关资料看。
看见没,为了学习好Windows编程,其实我们不仅仅需要学习语言,还要学习操作系统,并行计算原理,内存原理,可能有时候还需要学习网络通信,等很多知识,所以说,单凭学习语言,是成不了商用程序员的,一个合格的程序员,需要理解的东西,太多了,要广为学习。
当我们把Win32API,以及基本的窗口化程序设计理解了,就可以回到MFC继续学习了。是不是有点递归返回的意思?呵呵。
8、回到MFC
原来学MFC很难的,因为其封装了太多细节,很难理解透彻。不过还好,我们有侯老师的深入浅出MFC,去找本来看看,如何从Win32API的纯C编程,改变为MFC的C++方式,看这个最快,基本上前6章看完,已经会了,这里我就不多说了。
9、COM
COM、COM、COM,我最头疼的COM,呵呵。
COM就是一种远程过程调用,即你请求的代码是在另外一个进程中运行的,通过某种通信协议来回传递参数和结果。仅此而已。DCOM进了一步,服务者可以在另外一台计算机上。在公司开发中,大家可能各做一块,如果要合作,Windows下建议多使用COM。(我个人喜欢socket通信哈)
简单说,COM提供了一种机制,可以跨进程通信,甚至跨机器通信。不过,为了传递各种类型的参数,COM可谓是无所不用其极,它发明了智能指针,可以指向任何类型的数据,同时,为了实现智能指针,它使用了大量的C++泛型设计,看见没,C++的基本功就起作用了,还用到了ATL。
学习COM,要注意一个接口的概念。由于开发者是不同的人,调用程序和服务程序,可能不是同一种语言,OK,不能简单提供一个C或C++的.h文件来解答接口,因此,COM提供了标准接口,使用者在程序内部,以查询方式获得可用接口,进而以接口ID调用。很累人的。
学会了COM,就可以多理解一点ActiveX了,那么再学习一点dll(动态链接库)的知识,我们就已经可以写OCX控件了。一般说来,OCX控件是个很好的设计,哪都能用,一个软件的模块,最理想是开发成这个样子,比exe灵活。
10、没了。
按少林派说法,学了上述这些,其实已经算打过18铜人阵了,已经可以下山助明主,扫奸佞,扭转乾坤,解万民于倒悬了。
不过,关键是你通过上面的过程,是不是已经学会了学习的方法,再遇到新的东东,是不是已经不难学了?这大概就是武学中的悟性了,有了这个根基,以后只要慢慢修炼,估计20年后,可与天下英雄一较短长了。
呵呵,你说是不是?
呼呼,好累。
学生评论:
董志勇(Net老师) :
总结很好,现在太多学校、同学以上来就搞面向对象,Windows节目开发。或者JAVA里面就搞JSP。往往除了问题的时候都不知道怎么解决,往往要花很多时间来补最基础的东西。
面向过程都不懂,搞什么面向对象呢!
武汉交通职业学院 胡军(C/C++学生) :
谢谢老师,受益了!哈哈,我是学VC的,去年暑假开始学的,然后自己在寝室折腾了一个月。因为当时听说有VC,也有VC++,我想,学VC的话,那就不用学C++了吧?(我太懒,就想学个C),结果头弄晕了,又跑去蹲图书馆,总算把C++学的差不多了(像老师您说的一样,学了C,C++确实很好学)。现在在做MFC,也有模有样的。哈哈。
迷茫(C/C++学生) :
谢谢肖老师 这段时间一直在考虑怎么学C 要学到什么程度 很多人说C是做底层开发的建议深学 软件开发还是重点学C++ 看来C还是不能囫囵吞枣的学 再次感谢
海南大学 张继兴(C/C++学生):
看了不少文章,我想这篇文章应该是很适合我了.
学了c,c++,又了解一点mfc.不知道下一步怎么走.
肖老师的这篇文章正好给了我方向
谢谢~~~
湖北大学 马刚(C/C++学生) :
今年刚毕业,在做C方面的开发,记得开始学习C的时候觉得C只能做些简单的工作,不知道在哪儿听说的用C语言开发的程序超过5W行就会出现很多问题,后来学了C++,java觉得类的作用很强大,呵呵,今天看了肖老师的文章收获挺大,其实很多东西不用类照样可以做好,只是自己要做的工作就多了。
IT业的职业细分
肖舸老师
在大本营看到很多同学讨论以后的出路,感觉到大家对IT业职业的细分还不是很了解,这里就我的经验,给大家一点参考,希望能帮到大家。
一家之言哈,欢迎拍砖和补充。
我在IT业很多年,也仔细分析过IT业的职业构成,就我的了解,其实IT业也在细分,大致分为如下几种:
1、研发,包括软件研发和硬件研发,就好比我们这个论坛大多数朋友,在一个公司里面完成项目开发,或者定制产品,一般说来,软件研发基本上就算产品的设计者和制造者,硬件研发,只能算设计者。因为后面还有生产环节。
通常研发岗位,包括RD,QA,以及配置管理员,架构师,小组长,项目经理,研发助理等,就是研究部分所有的职位。部门经理一般我没有计算在内,感觉部门经理管人,应该算管理岗位。不过有些小公司,部门经理和项目经理,甚至架构师,都不分,因此需要具体情况具体分析。
其中RD,就是我们说得最多的设计人员了,这个大本营的同学,以后估计大多数都从这里起步,当然,做QA测试的也不少。
RD这个词有讲究,就是设计和实施,是两个意思,设计,是决定一个东西怎么做,实施是把它做出来,我们刚开始,可能都是先做实施,慢慢走到设计,模块设计,系统设计等等,如果做得好,以后慢慢专门做设计,就是架构师了。
软件人员一般RD不分,设计者通常就是实施者,因为基本上程序敲完,产品也就出来了。硬件人员则不同,一般就是设计者,以及第一轮白盒测试的QA,自己测,当产品测试稳定,定型,就可以交给中试部进行产品测试,最终上线贴片生产。
QA这里面一般细分为软件测试和产品中试,像华为、迈普这类大中型企业,以生产硬件产品为主的公司,都有自己的中试部,中试部简单说,就是专门测试硬件的,比如各种静电测试,温度测试,跌落、震动测试等,为产品最终上线做准备。我想,大多数同学可能对软件测试熟悉,对产品中试可能不太熟悉,不过差不多就这么多东西。
软件研发通常还有个角色很重要,就是配置管理员,一般小公司没有这个角色,由负责的测试人员兼任,大公司会专门设置这个角色,并且这个角色还有商业秘密保全的功能。
我们软件人员开发的产品,在自己的机器上,一般叫测试版,只有提交到CVS或SVN等版本管理系统,才叫产品,测试部不是从我们手里拿软件去测,而是由配置管理员在中心服务器上,将软件产品从源代码编译成可执行文件,生成安装程序包,然后发给测试部,测试部测试完毕,返回测试报告,公司领导签字后,以后软件产品的发货,就是配置管理员负责发货。
大家明白了吧,这里面很严格的,在大公司,软件一旦投测,如果RD发现有个小bug,小公司可能打个招呼就改了,项目控制流程上看不出来,但在大公司,必须发文,说明上一版本作废,然后重新发测试申请,重新提交代码走流程,项目流程上就记录,废版一次,以后就是扣工资的依据。因此,大公司的程序员一般比较严谨,发版测试很谨慎,就是怕出现这类bug,这样的缺点是对市场的反应不够灵敏,可能客户提交一个bug,RD改只要几分钟,但是流程要走一两天,但是好处是产品质量有保证,每个人的工作结果都记录在案。便于管理。且程序外泄几乎不可能。
我以前有篇文章说,国外很多程序员,可能在一个公司工作一辈子,都没有见过自己服务的计算机,就是这样的,RD都在终端工作,自己本地测试好了,提交到中心服务器,由配置管理员负责最后的编译和提交。
2、市场,这大约是最多的,往低里说,电脑城的谈单员,就是市场,往高里说,华为、Cisco的地区总裁,其实也是市场角色。市场根据个人经验,又分为Sales和Marketing,前者是简单的客户成交服务者,即客户准备购买,完成买卖手续,协助送货什么的,Dell那边的电话销售小姐,大约就是这个角色,由于Dell是定制,因此她们还需要下订单。后者就是属于较高层级的销售人员了,可以引导市场,引导客户,促成交易。
一般说来,市场其实也是个技术活,很少有朋友是天才,上来就可以做到Marketing的,都是从Sales先入手,慢慢练,这个过程,可能比一个程序员走到架构师还难,很多销售人员,做一辈子,都做不到Marketing的,不信,去商场看看售货员,公交车的售票员,都是Sales。
这里说说广告,广告我的理解,就是Marketing的一个分支,吸引眼球,吸引客户,促成交易。
我们经常说,每个行业都有英雄,其实市场中,Marketing就是英雄,一般说来,走到这一步,就可以站在这个行业的巅峰,出去讲课,拿最高的佣金,享受猎头挖角的快感等等。不过,很难的,有句话请大家注意,“这个世界上,99%的销售人员,都不知道自己在干什么,说的就是这个问题”,那1%才是Marketing。
通常情况下,开发人员瞧不起市场人员,总觉得对方是耍嘴皮子的,但市场人员同样也瞧不起开发人员,总觉得这帮书呆子不创造价值。呵呵,大家别生气,大多数公司,把研发单位,看做最大的成本单位,只花钱,不创造价值的,虽然我们设计了产品,但公司的财务上,这部分是没有价值的,产品价值是在销售出去以后才体现出来,因此,财务上看,研发部门总是赤字一片。
其实,真正厉害的市场人员,我们研发人员还是要尊重的,要知道,一个研发人员要成名成家,其实很容易,随便什么东西,攻克一个难点,出几篇论文,出一个产品,这个研发人员就可以在公司里面牛起来了,一个研究院,至少20%~30%都是这种牛人。但是,市场要能做到Marketing,前面说过,1%,可能都不到,你说这帮人算不算精英?
3、技术,终于说到技术了,这是最奇怪的一个职业,本来没它的,但就是出现了这个职业。其实技术在国外,应该叫做Service,即技术支持。
技术,往低里说,电脑城的拼机器的,也是技术人员,通常由谈单员兼任,谈单员通常由大学生勤工俭学兼任,呵呵,一起练了。再往上,客户那边送货,把包装拆开,技术,联网,技术,调试网络,技术,再大了,这里说句话,希望大家不要见怪,网络管理员,其实也是技术。
以前有段时间,MCSE很流行,我也去考了一个的,但是,后来发现,研发单位招人,根本不看这个,因为这个学习的是如何操作机器,而研发是设计机器以及操作模式,让别人操作。CCIE也是啊,因此,当时很多说法其实是有点误导,说学了这些证书可以不上大学,成都还出现过一个娃娃,高三毕业考过了MCSE,就不上大学了的事情,现在不这么说了,因为毕竟上大学才是王道。光靠这个证书,是吃不了一辈子饭的。
在华为,迈普,技术是一个专门的职业,负责给客户送货,因为他们出路由器,安装配置有一大堆事情,电信局又是大牛,人家才不会去管这个事呢,厂家来人解决。顺便说一句,电信局守机房的,也是技术。
原来没这个职业,就要研发人员兼任,因为这毕竟是个技术活,不过,久了研发人员不干了,天天出差,还做什么研发,老板也不干了,因为研发人员工资高,在大家看来,连连线,配置几个IP地址,这不复杂,如果用研发人员干,成本太高了。
喏,就这样,一个独有的职业,技术,在IT企业被定义出来,这部分主要找一些较为低端的人才,二本啦,三本啦,自考啦,总之,我看见很多年轻的朋友,希望进入IT业,没有本钱,不会做老板,也进不去一些大型公司的门,一般选择,就是在电脑城做技术起步。
现在很多系统集成公司,他们定义的项目经理,和研发单位的项目经理不太一样,其实也是技术,这类公司一般都是经销商,不是制造商,自己没有产品,靠代理别人的产品再销售来获取利润,一般说来,渠道这个词,就是指这类公司。这些公司的技术人员,主要工作就是看,我代理了哪些产品,哪些产品利润高,我怎么给客户报方案,把利润高的产品设计进去,等等。
这里面其实也有设计工作,但是,显而易见,这部分设计工作和前面的研发架构师的设计,是两个层面。
当然,这里有两个特例,一个是目前很多中小型,做网络应用的架构师,他们也有这个设计部分,这些企业一般都是项目制,没有自己的产品,每一单都要定制开发,这类和前面的系统集成设计有一定类似,因为很多项目包括了设备采购什么的。
另外一个特例就是系统集成设计,通常就是Marketing的活,因为自从IBM提出卖服务的概念以后,给客户交钥匙工程成为主流,大家都说自己是解决方案提供商,因此,Marketing通常就是采集需求,利用本公司产品或者代理的产品,组成解决方案,一体化提供给客户。
因此,从职业发展途径,技术一般说来,也可以走到Marketing。通常Marketing有两个产生渠道,Servicer技术,或Sales销售。
当然,这里也看出技术这个职业的短板,因为Marketing毕竟是销售为主,因此,销售能力占主导,技术人员由于长期和机器打交道,因此,恐怕也是机器脸居多,卖东西能力很差,因此,技术能转成Marketing的,更少。
当然,也有技术人员转回来做研发的,不过,也很少,起码我没有看到什么成功的案例。
4、管理,这里就简单说啦,一般说来,管理本身是抽象的,并不是IT业的管理,一定只能从IT业产生,或者一定只能管IT业,IBM的总裁郭士纳,就不是IT业出生,管理的英雄们,例子就太多了,他们有个统一的称呼,职业经理人。
前面说的几种,总的来说,都可以最终成长为管理,不过,管理也是最难的,一来人是最复杂的,不像机器那么好打交道,二来,管理要看运气,单纯说水平不行,得老板看得上才行,你说是吧?
因此,研发,销售,技术,要想成为管理,这个成功率,一般不高于1%的,不信,数数你们公司管理人员和普通员工的比例,或者,学校里面老师和学生的比例,虽然这不准,但基本能说明一点问题。
由于我们这个大本营不是管理论坛,管理就不多说了。
5、生产,这个岗位其实各公司都有,不过大多数老板不承认,员工也不愿意承认,呵呵。
大型公司,如华为、迈普,Intel等,以生产硬件产品为主的,基本上都有生产部,记住啊,这个生产部很重要,生产,仓储,物流,基本都在这一块。
千万别小看生产,目前生产线上的工人,由于要开贴片机什么的,基本上都要大专学历,还要培训的,我不想明确建议,不过,有些目前找工作特别困难的同学,不妨考虑一下这类大型企业的生产岗位。
大型制造业,如美的,海尔等,他们很多管理层都是生产线上下来的,生产线上也不都是工人岗位,很多生产工艺师,工装设计师什么的,都需要设计这门工作,如果一个学历较高的人进入这个部门,只要自己肯努力,其实也很容易出头,毕竟周围的竞争对手太低了,呵呵,比起研究院来说,要容易得多。
6、其他,这就太多了,老板就属于其他了,呵呵,创业也属于其他,由于这部分不带普遍性,就不多说了。各级行政人员,如财务,秘书,都算其他吧。
上面是我的一点总结,大家可以参考一下,到招聘会时,也可以按照这个分类问问面试官,你们这个职务,是研发职务还是生产职务,呵呵,可能某些小公司的面试官会被你问住。
学生评论:
杭州电子科技大学 邓晓华(C/C++学生):
哇,这是我想看到的,老师辛苦了!
对天IT职业的分类,听老师这么一说,有了一个初步的了解了。但是我现在还有个问题得麻烦老师:对于经常谈的计算机专业学生的发展方向,我一直不是很清楚,比如大家说网络方向,还有什么往底层发展,做嵌入式开发等等。对于这些我一直很糊涂,所以想请问老师:计算机专业学生的发展方向一般分几类?又该如何选择发展方向?
说来惭愧,这些问题,原本应该是我通过网络查询等方式就可以解决,可是我尝试过,发现现在依然糊涂。也许和我换学校有些关系,我是07年上大学,前两年是在一个学校读计算机科学与技术专业。今年通过考试,考上一个稍好点的学校,不过现在专业换成软件工程,我对校方的培养计划也不是很清楚。
虽然惭愧,可是依然希望老师能于百忙之中抽出一点点时间,能够说一些相关的,相信这些对其他同学也很有用,学生在此先谢谢拉!
邱沧淮(C/C++学生):
谢谢,解惑了~1本以下的当自强!我连3本也算不上,不过我不灰心,努力提高自己,有一天我也会向他们看齐的。收藏了!
上海外国语大学 张吉(PHP学生) :
感觉自己不适合研发,本想离开自己喜欢的IT业,但看了楼主的文章,发现出路还是很多的,比如技术和销售~
选择技术还是选择销售?
肖舸老师
这是一位同学给我的留言,咨询方向选择的问题,最近被同学们问这类问题很多,感觉有些代表性,因此这里统一作答。
一家之言哈,欢迎拍砖。
原文在这里
========================================
肖舸老师你好:
看了您对那么多人的评论之后,觉的您的建议很中肯,所以想向您请教。
我去年大学毕业(专业是通信工程), 觉得自己虚度了光阴,而且自己性格有点内向,觉得该从事技术,所以我毅然放弃了应届毕业生的优势,找了家培训机构去学习java和.net开发。经过一年的学习,发现自己对技术不是特别感兴趣,没有专研精神,觉得自己应该很难在技术上达到一个很高的高度。因此,我想从事与业务相关的工作,但是又觉得自己学了那么久技术,放弃又太可惜了。而且,我还不知道自己在销售这方面能不能做好。这让自己更加迷茫了!我该如何在两者中取得一个平衡,又该怎样选择工作?我已输在了起点,不想在终点时还是落后别人一大截。未来我想好好规划,好好度过,不管是为了自己,为了父母,还是社会。我可以忍受平穷,但是不能容忍自己平庸。
前方的路到底该怎么走?自己花费了那么多时间与金钱是否值得?未来自己能否达到自己想象的高度?我完全迷失了。在有几个月我就要培训完了,将要再次找工作,再次面临抉择。所以我恳切的想知道老师的建议,非常感谢。
向所有CSDN老师致敬
我的回答
========================================
这位同学你好:
从来信中,感觉问题比较多,我试着讲一点,你尽量参考吧。
我先讲个故事吧,是古代的一个墓志铭:
吾表兄。
年四十余,始从文。
三年不中。
遂习武。
校场发一矢,中鼓吏。
逐之出。
改学医。
自撰一良方,服之,卒。
好笑不?这个人可以说是一类人的代表,就是做事情缺乏恒心和毅力,我们说做事情靠天分,但是,我个人的理解,恒心和毅力也是必要的,我还记得小时候学习的一篇课文,讲一个小猫去钓鱼,结果它一会儿捉蜻蜓,一会儿捉蝴蝶,总是钓不到鱼。不知道你看过这篇课文没有?
我看了你的信,你说大学没有学习好,虚度了光阴,现在培训班,觉得自己缺乏钻研(注意,不是专研)精神,不想做技术了,想做业务,我根据你的文字,理解这个业务就是销售工作。但是又觉得自己这么多年在技术上投入过多,舍不得。
这里我说几点:
1、不管选择技术和销售,其实都是可以的,这个世界有很多行业,每个行业都有自己的英雄人物,你选择任何一行都有道理,我支持你选择的态度。
2、不管是技术还是销售,其实都需要钻研精神的,技术上,可能针对一个问题,钻半天,销售上,针对一个客户,也需要不断钻研,去仔细研究客户这个人,他喜欢什么,不喜欢什么,然后投其所好,但是,提醒你,销售上,不会针对每个客户都有一本教科书,因此,钻研起来更加看天分,很多时候,你怎么了解一个客户的喜好,都是一个大难题。
3、感觉你想转行的目的不明确,有畏难情绪,好像主要是因为技术太难,就不想学,想转行,我认为这不好。任何一个行业都有风光的一面,也有艰辛的一面,你因为害怕技术艰辛,就跑去转行,那你想想,哪天感到销售艰辛,又转行,是不是就变成上面的“我表兄”了?那一辈子是不是就事事无成?你想过这种生活吗?
4、但另外一方面,你觉得自己技术投入很多,选择的时候舍不得,我也不赞同,男人大丈夫,死就死了,怕个P啊,选择讲究的是决断,一旦选定,“虽千万人吾往矣”,做事情不要瞻前顾后,患得患失。
5、永远不要因为怕什么而改变自己的生活,你选择职业,就是选择一种生活方式,但是,如果你是因为“怕”技术上很苦,那么,很不幸,我得告诉你,你到销售上会更“苦”。销售是一门很辛苦的行业,我做过一点点,这么说吧,以常规的学生思维,恐怕很难坚持下来。
曾经有个小姑娘,问我怎么才能找到工作,我想了一下,说你把门关上,她就关了,然后我给她一面镜子,让她对着镜子把一段话念7遍:“我就是一个要饭的,我今天必须把饭要到,不然我明天就会饿死!”,她当时脸涨得通红,不过还是坚持念下来了,一周后,她找到了工作。这个故事你能体会到什么吗?找工作就是销售,销售的是自己,你可以先试试,如果你找工作很容易,证明你有销售天赋,可以考虑从事销售行业。
6、任何一个行业,都需要恒心和毅力,技术如此,销售尤其如此。日本有个销售大师,叫原一平,是推销保险的,他跟踪一个客户,跟踪了十五年,你猜怎么着?那个客户死了。
如果你是他,会不会就此放弃?客户都死了,十五年心血白花了,是不是很伤心?
他不是,他还是坚持去,然后那个死者的儿子说,你不用说了,我跟你买,然后跟他签了一份巨额的保单,他赚了很多钱。
这个时候你看见这个人,会不会觉得他很成功?但是,你看见了他十五年的艰辛吗?
好,现在问题出来了,如果你转行销售,你可不可以跟踪一个客户达到十五年?
7、任何一个行业都有其风光的一面,也有其悲哀的一面,技术,就要忍受无穷无尽的寂寞,别人玩的时候,你不能玩,别人happy的时候,你得去看书,这是职业特点,IT业更新换代太快,不努力学习,很快就被淘汰。
我三十岁过生日的时候,和朋友喝酒,别人问我有何感想?我想了一下,说了一句很狂的话:“二十岁到三十岁这十年,勤奋这两个字,我背得起!”,大家都不说话。因为后面有句话我虽然没说出来,他们都知道,我十年没有看过电视。因此,如果你能坚持十年不看电视,每天晚上看书的话,我想,你的技术一定会很厉害的。
做销售呢,也差不多,天天晚上陪客户,看似很风光,但是,你要注意,这是陪别人,不是你的生活。
我也见过另外一个销售高手,有天晚上饭馆出来,跑到我那里哭,(先说明,那会他年收入十几万),可他说这真他娘不是人过的日子,然后就吐,吐到最后,吐出血来了,我也吓到了,打120把他送到医院,一检查,胰腺炎,再晚送过去半小时,人就没了,这是医生告诉我的。
这就是销售,不是说销售一定是喝酒吃饭,但是,中国的市场,是关系营销,必要的勾兑,是少不了的。
上面两种生活,你愿意选择哪种?
其实仔细想想,你会发现,人生无坦途,很多东东,不是想象中那么美好,但是,也不一定,只要你找准一条路,坚持做下去,做到这个行业最好,你看到的,就全部是这个行业最光辉的一面。
但在这之前,你必须先忍耐,积累。根据大多数人的感觉,除了投胎投准一点,其他时候,人生一般没有捷径。
你说呢?
学生评论:
ZheJiangUniversity 晓磊(Java爱好者) :
我觉得肖老师的话很中肯,都是肺腑之言,,用心良苦,说实话现在哪个行业想混好都难,我们往往只看到少数人成功的一面,却没看见他们背后的付出,也没看见更多的失败者,我们需要的是一种专注的精神,平和的心态,不要浮燥的心。
昆明理工大学 李俊(C/C++学生) :
被肖老师的那句“二十岁到三十岁这十年,勤奋这两个字,我背得起!”感动了,的确很多时候是我们自己的毅力不够,坚持一个自己的方向就好!大家都加油!
河南成功学院Gwolf团队 赵鹏(C/C++爱好者) :
“选你所爱,爱你所选!”
我们大学创办人题词,我铭记于心……
今日,又在肖前辈这里遇到相同话题。是呀,人的选择有很多,也因为选择太多,才更容易放弃。我也好几年没看过电视了,好几年没有玩网游了。一个帐号玩了两年还没过25级……
路漫漫,其修远矣……
每隔几日,便来读读前辈文章。字里行间就两字:朴实!
相比之下,晚生深感惭愧……
年轻人容易浮躁,但年轻不能成为浮躁的理由。
tongshou(C/C++爱好者) :
“…我十年没有看过电视..”
肖老师,您真是个超人!这都能做到,还有什么做不到的!
您的这篇文章写得很棒,相信会让不少人、尤其年轻人从中受益!
山东科技大学 李宗鹏(Net学生) :
感觉老师这句话太精辟了:人生无坦途,很多东东,不是想象中那么美好,但是,也不一定,只要你找准一条路,坚持做下去,做到这个行业最好,你看到的,就全部是这个行业最光辉的一面。
这么多技术我该怎么学
杨中科老师
一、这多东西啥时候能学完?
现在IT新技术日新月异。就常用编程语言而言,有c/c++、汇编、java,c#、Python等;操作系统平台有unix/linux,windows系列;开发工具有VC、VisualStudio2008、Eclipse、NetBeans等;每个大平台下,还有很多的的方向:如网络、数据库、脚本、HTML、动态网站、游戏开发等;有人还在学Dreamweaver做网页、Flash做动画、Photoshop做美工、3DMax做三维动画…………是的,我们什么都想学。恨不得把所有的知识统统都塞到肚子里去。看到什么,想学什么!
今天看这VC的书,明天又看Java,后天又看C#,东搞西搞!看到别人做网页。自己兴趣了来了。好,学html语言,我也做网页,听说做网页要会“网页三剑客”,所以又想学Dreamweaver、Flash。后来开始知道有JSP、PHP、ASP.NET做动态网站这玩意儿。也想去学,学学学……
这是几乎所有在校大学生的通病。但是,这不是坏事,甚至可以说是好事。说明了你“求知欲”高!总比那些,生活没有激情,整天知道泡妞、上网、打游戏、混日子的强。
但是如果你今天想学这个,明天又想学那个。这样你就能永远徘徊在技术的门外。很多人都有过或者正在经历这样的苦闷日子:总觉得有“太多东西”要学了,然而人的精力是有限的,总有永远学不完的感觉,所以心理特别急,整天惶惶不可终日,不知道先要学哪个,一会儿拿起这本书,一会拿起那本书,折腾了几个月,突然发现自己什么都没有学到……
每一个大方向如果没有上几年的学习,很难能学习出什么来。但程序设计的最根本的东西是相同的。所以我们学习要抓根本。俗话说:通一理,融百里。
学程序设计就像习武一样,如果内功学的好,其他功夫就很容易上手。君不见《倚天屠龙记》中的张无忌练了“九阳神功”8年,练“乾坤大挪移”只需12个时辰吗?
习武之人,谁不想在“江湖”上扬名立万,谁不想成为万人敬仰的大侠?大侠之所以能成为“大侠”,当然有他们的看家本领。狄云的“神照神功”,金世遗的正邪融合的“乔北冥内功心法”,张无忌的“九阳神功”,段誉的“六脉神剑”,令狐冲的“独孤九剑”,哇,太多了…
古人历经千辛万苦才能找到这些“武功秘籍”。我们现在这些后辈,比起古人来说:简直太幸运了。去书店,各种各样的心功心法,剑法,拳法,应有尽有,看得你眼花缭乱…
你选什么呢?今天练“六脉神剑”几式,明天去学“降龙十八掌”几招,后天又去练“发暗器”,这样何时才有个尽头呢?你说,你什么武功都会,但是“形似而神不似”,不得要领,不够火候。一上擂台,就被别人一掌打趴了。试问哪个软件公司敢要一个号称任何编程语言都会,而是每种语言只能写出个“hello world!”的程序员,你不被人家扫地出门才怪。
二、学**还是学**更有前途?
看了上面的话,有的同学已经开始烦了,“知道了知道了,不止一个像你这样的所谓的‘老前辈’跟我说过‘学什么都一样,思想才是最重要’的大道理,可是你们站着说话不嫌腰疼呀,现实是有很多技术需要学,比如做Web开发就有JSP、PHP、ASP.NET等好多方向,我总得选一个吧!到底学哪个有前途呢?我必须要选择一个有前途的,选错了就麻烦了。”
其实像“学**还是学**更有前途”的话没意义,因为“选择JSP还是选择PHP”的前途的差别不像“选择英语还是选择日语”的前途差别那样大,不存在“选错方向”的问题,因为都是相通的,你也不能保证你毕业以后搞的就是你学的那个方向,更不能保证你靠你学的这点东西就能吃一辈子。比如我上大学的时候一直在钻研是Delphi语言,可是毕业校园招聘的时候我照样在Java职位的考试取得了第一名,而且工作以后经过简单的学习就掌握了Java语言,并且后来还写了三本关于Java语言的书;再如我毕业后两年多的时间一直在用Java开发,后来公司要做一套基于.NET的产品,我只用了一个礼拜熟悉了.NET体系以及C#的语法,然后就开始进行开发。
不过就像上边说的“做Web开发就有JSP、PHP、ASP.NET等好多方向,我总得选一个吧!”这个问题是非常实际的,因为只有先学一个才能深入这个方向,把这个方向学通了才能想以后“一通百通”。因此我的建议就是学校教过什么语言,你就继续深入学习这么语言,而不要去问“这么语言有没有前途”这样的傻问题。尽量不要去学一门所谓“有前途”的新语言,因为你去学一门新语言就要把很多精力耗费在语言、语法本身,而耽误了编程的实战,而以一个已经学过的语言来学习的话,起码语法本身不用再去学、开发工具本身不用再去熟悉,只要研究怎么使用这门语言开发有用的程序就ok了。比如大部分同学都学过C语言(有的学校直接开了C++的课,但是C++的面向过程编程部分还是C语言),所以咱们就开了《C语言也能干大事》的课程,让同学们把精力放到学以致用上,而不是学“有前途”的新语言上,这也是这个思想的一个体现。
举几个例子。咱们如鹏网的《计算机专业职业发展测评系统》是我用PHP开发的,但是在这之前我从来没写过PHP程序,但是我以前写过JSP、ASP的程序,因为写网站程序的原理都是相通的,只是语法不同而已,因此我只用了几个小时的时间熟悉了开发PHP用的工具并且快速浏览了一下PHP的语法,然后用半天时间就开发出了这个测评系统。想像一下一个整天在今天学JSP,明天学ASP,后天学PHP,大后天仰天长叹“到底学哪个有前途”的人能用半天时间学会一门新语言吗?
我大学时有一个同学,他看我当时Delphi学的比较好,写了很多程序,他就说他也想学软件开发,让我教他Delphi,可是我们专业前一个学期已经开了PowerBuilder的课,因此当时我就建议他还是继续深入学习PowerBuilder,用PowerBuilder写又实用价值的东西,而不是像上课那样写HelloWorld的程序。当时Delphi还是如日中天的流行的编程语言,而PowerBuilder则市场占有率比较小,他就说不想继续学PowerBuilder,因为PowerBuilder没前途,我就给他讲了“一通百通,从自己最熟悉的入手”这个道理,然后他就踏实的深入研究PowerBuilder起来,到了毕业的时候他已经能用PowerBuilder写非常复杂的程序而且还学习了用PowerBuilder写Web程序。毕业后没多久就应公司的要求用Delphi写程序,他只用了不到一周的时间学习了Delphi,然后就写出了一个符合公司要求的系统,当时他就给我打电话向我报喜。前一阵子我听说他已经开始指导一些新员工用Java开发一个中型规模的企业级系统了。可以说他的成功就得益于“一通百通,从自己最熟悉的入手”这个原则。
总结一下,不要管“哪门语言好就业、有前途”,因为那些“好就业、有前途”都是纸老虎。尽量不要学新语言,从自己最熟悉的语言入手,深入研究,出山后你就是被用人单位争抢的红人。
三、企业里都需要什么方面的才能?
这个要视用人单位的要求而定了。你现在还没有毕业,也不知道未来要面对什么样的岗位。因此建议大家在上学期间不要偏科,所以的课程都要好好学,学好专业课,培养自己的“内功心法”,然后进入一个大公司,那么大公司自然会为你安排一个人才培养计划,在工作的环境中学习就更有目的性。
山西大学 张瑞(C/C++学生) :
真心的感谢这里的每一位老师,在这里可以学到贴近职场和应用的许多知识,这些都是在象牙塔里学不到的。不过我们也应该珍惜在校园的这些自由的日子,可以有充裕的时间学习基础理论知识,没有那么大的经济和心理压力。
认真的做好自己每个阶段该做的事情,戒骄戒躁,踏踏实实的一步一步往前走。我觉得这就是很多过来人都在告诉我们的道理。
四川大学 李川(Net学生) :
…狂顶。。。
老师说得太好了。。。
我身边就有不少像老师说的那样的同学。弄得我也心里有点小慌。还好我定力好。坚持C#不动摇。现在更是坚定了我学习C#的决心。
一定要推荐同学们都看看这个文章。
太谢谢老师了。
HOHO~~~
吉首大学 邓嘉(C/C++学生) :
谢谢了,这个问题在我心中好久了。
我本来的想法是:先花一些时间,了解几门语言,然后在其中找到自己打算深入的一门。再一门通,百门通。
现在看来,还是老老实实地看我地C吧~~~~!
大连海事大学 文星(Java学生) :
说出了大学生的通病,我大四了深有体会,希望看到这篇文章的同学们,能专一了哈哈
北京理工大学 苏建学(Java学生) :
很有感触,因为我自己就是那种什么都想学,但是什么都深入不了的那种人。我曾经看过C++、Java、C#的书,里面的基本语法感觉只要半天就能熟悉了,但是要想深入学习感觉就找不到方向了。所以到现在为止也没能学好任何一门语言,看来我真的该静下心来好好研究一门语言了!
金融危机下的职业思考—-答一位同学的问题
肖舸老师
进入大本营以来,发现部分同学的思路有些片面,思考问题有些绝对化,带有一些普遍性。这里借着一位同学的提问,谈一点我的看法,希望能帮助大家理清思路,看清未来。
还是那句话哈,一家之言,欢迎拍砖。
这位同学的问题如下:
肖老师,您好!很敬佩您懂得这么多的知识,掌握这么多的技术。我是一个即将上大二的网络工程的男生,现在有一个和我的努力方向有管的问题,使我感到迷茫:我是努力考研还是按自己的想法来做?具体的如下:由于金融危机,大学毕业生就业不景气(我上的是个独立学院),所以我父亲让我考研以便将来可以有一份稳定的工作(我父亲就职于联通公司),当然我也乐意在考研上下一番功夫,但是分歧在于我还想在大学期间多学些东西,比如:CCNA,建站技术,Linux网络。但我父亲反对,说是我应该专心考研,其他的都可以不要。可是,得尊重客观事实啊,努力了,不一定100%就能上研啊!学点东西不至于没考上,反而落得一场空。当然,父亲也是为我好。您认为我的计划合适吗?或者说我的职业规划对吗?补充一下,我对计算机室很有兴趣的!从98年就开始接触了,这个专业也是我自己选的。希望得到您的帮助!
我的回答如下:
首先,感谢这位同学的表扬,说实话愧不敢当,我并不是你想象中那么博学,仅仅是日常工作和生活中,多看一点书,多想一点问题,能对某些问题提出一点自己的看法而已,你要愿意,也能做到的。这不算什么。
在你的问题中,你有一个大前提,就是金融危机,导致就业机会偏少,我个人认为,其实没有必要这么悲观的。你的问题让我想起了十年前,98年到2000年的经历,估计你那时候还没有考虑到就业问题,不过当时我可是身历其中,现在想想,其实当时有很多想法也不是很正确。
当时,情况应该比现在还难过,98年开始的金融大风暴,把整个东南亚的经济打得一塌糊涂,泰国、新加坡等几个国家都差点破产。工商业更是一片哀鸿遍野。当时IT业还勉强可以,因为新兴的网络科技,从Yahoo开始带动的网络公司热潮,毕竟还算一片利好的消息,但随之而来的2000年,网络泡沫破灭,IT业也受到了沉重的打击。
当时记得上网,天天看的都是网络公司被收购,倒闭的新闻,最后都习惯了。你可以想象,我作为一个IT业的软件工程师,心情可想而知,当时我也有点迷失自我,跳了几家工作,都感觉不尽人意。人有时候都有点栖栖遑遑了。
不过,过了十年,现在回顾过去,其实也就那么回事,经济好,生活会好点,但也没有好到随心挥霍的地步,经济差,不管怎么说,人吃饭还是吃得起的,可能顿顿下馆子不够了,不过在家做做吃,也不会饿死,仅此而已。
经过这一轮阵仗,我感觉我们这一批程序员心理素质都还可以了,其实金融危机也没有那么可怕,还有,其实不止我们,大家当时都不喜欢金融危机,因此,你看看各国政府都在想办法救市,这个不用你我这些老百姓操心,其实国家和富人们更怕金融危机,他们损失更大,因此,不会没人管的。
从你的信息,你现在才大二,到大四毕业,还有两年,我想,这一轮金融危机,两年后,怎么都该有个结果了,不会一直持续下去,因此,你以金融危机作为以后找工作困难的理由,我其实是不同意的。
人的一生是很长的,你以后至少还有接近40年的职业生涯,这次金融危机,可能仅仅是你这一生遇到的第一次而已,以后还多,不能因为可能发生金融危机,就悲观,就说人生没有希望,我觉得,只要自己本事在身,金融危机下,还是有老板会需要人才的,找工作,不会很难,甚至,真正有本事的人,由于大量的公司,都生意不好,养不起闲人,会强制进行优胜劣汰,无形中,可能工作机会更多也是有可能的。
事实上,我从去年到今年观察了一下,我们国内除了专门做外销的一些制造业,航运业,在金融危机中受到很大冲击外,其实中国国内本身,并没有受到多大损害,反而国家还拿出4万亿拉动内需,开始家电下乡补贴工程,其实要是明眼人,都能看出目前国内的经济态势,其实比国外好。
还有一个,这和中国人习惯有关,美国人,很多欧洲的人,他们的习惯和我们不一样,他们主要是借贷消费,其实这次金融危机就是他们贷转贷造成的次贷危机,由于大多数美国人没有很高的储蓄,反而分期付款欠下很多债务,一旦有金融危机,他们收入一旦断绝,会立即破产,被银行强行收回大多数分期付款购买的财产,如房子,车子等,对他们个人经济造成了巨大的损害。
而中国人,至少我们上一辈人,大多有储蓄的优良传统,家家户户其实都有储蓄,换而言之,中国家庭的享受程度可能不如美国家庭,但是中国家庭的经济健康程度远高于美国家庭,目前中国家庭最大的负债问题,可能就是房贷了,除此之外,一般的家庭没什么负债的,因此,很难像美国人那样家庭破产,最多过点苦日子而已。
我说这么多,就是想告诉你,金融危机没有你想象那么可怕的,生活品质可能有下滑,但是,不会饿死的。过几年,经济好点了,再享受就是了。
那么,我们回过头来看看你的问题,其实你的问题和金融危机没有多大关系,是一个简单的职业道路选择的问题,考研还是毕业就做工作。
这个我的理解,见仁见智,都可以,考研,前期投入大点,后期回报高点,但时间长,毕业找工作,前期投入少,后期呢,本科毕竟没有研究生发展潜力大,不过,可以快速挣钱。
而且这两个不矛盾,考了研,毕业也得找工作,研究生找工作比本科生有优势,但也不是绝对的,研究生不好好学,找不到工作的也有,收入不如本科生的也很多。
本科生呢,不好好学,也找不到工作,好好学的,找起来也不是那么困难,毕竟,这个社会提供给本科生的工作机会,从数量上说,远远超过研究生,而且,工作几年,还可以考研进修,也不是不可以,我很多朋友都是工作2~3年以后上的研究生,这些人,普遍学习的效果好于大学直接上研,因为他们有一定工作经验,有了一定的思考了。
我觉得,你家里要是经济还可以,不急着要你出来赚钱养家,你可以考虑先读研,如果经济不太好,就直接找工作算了,先养活自己吧。
另外,什么事情都别绝对,准备考研了,但遇到好的工作机会,也要把握,一个本科生进到华为或者IBM、微软等大公司,可能收入比其他公司的研究生还高,不准备考研呢,实在找不到工作,回来考研,作为第二选择也不坏。别太执着了,随时注意调整自己的思路更重要。
不过你的话题有个东东我不太同意,你的话:“但是分歧在于我还想在大学期间多学些东西,比如:CCNA,建站技术,Linux网络。但我父亲反对,说是我应该专心考研,其他的都可以不要。”我觉得这是你们父子俩没有沟通好,其实这些技术的学习与考研不矛盾,甚至像Linux网络,本身就可以作为研究生的研究方向,还是那句话,做事不要绝对化,万事都是相通的,你完全可以在准备考研的时候,学习这些技术,也许,这些技术的熟练还成为导师选择你的一个亮点呢。
但关键是,不管是考研,还是找工作,你现在要把学习弄好,不管学什么,钻研一点,学出本事来,本事不够,找工作找不到,考研也成问题,如果考上研究生,不好好学,出来也可能找不到工作。
所以,今天我回你这篇帖子,想和你说,你的问题,金融危机,考研,找工作,学习方向,其实都不重要,最重要的是,不要把这些作为自己躲避学习的借口,专心好好学习,做学生,就做一个专业的学生,本职工作做好,那样,你可能两年后,选择权会大得多,而不是像今天在这里患得患失。
你说呢?
学生评论:
重庆邮电大学移通学院 小溧(网络管理学生)
谢谢肖老师的指点,我知道了眼前的才是最重要的,考研和学习技术,嗯,或者可以用邓小平的话来讲叫做:两手都要抓,两手都要硬。
黄海峰(网络管理爱好者) :
非常有道理。。。当初没有大学老师教我这些处世道理,所以都是自己胡乱摸索,但这也是一种人生磨练。。。我想那位同学只是比较紧张自己的前途而已,像我一样做一天和尚撞一天钟的人上学时就没有如此压力,找不到工作时我也是努力自学偶尔看电影调剂,找到工作了就从工作中学习做人做事。我总是想,我一直有努力学习,如果始终找不到工作,饿死也不会只我一个,在关于就业问题的方面我很乐天,但是讲到感情问题就惨情了,内向型it人对自己相貌事业皆无甚自信,不敢主动结交漂亮女生,害怕被耻笑,不愿结交恐龙型的,害怕消化不来,没有刚刚好的,因为it人环境严重局限,可供选择的女孩极其稀罕,人的健康是多方面的,情感方面一直很缺失,身边常常光顾按摩院的同事大有人在,这样的生活貌似也很不健康,肖老师能否在这方面点拨一下像我一样很困惑的it人?谢谢。
简述如何书写工程化的简单代码
肖舸老师
在坛子里混了这么久,看了很多同学的代码,感觉到大家的代码,学校里面的书生气有点重,对于细节考虑不够,有时候,感觉和吃了颗苍蝇一样,确实很不舒服。
这里根据我个人的经验,给大家简述一下,工程化代码,以及简单代码,不容易出错的代码的一些基本写法。
1、工程化代码,首先考虑是团伙作案,独行大盗的时代已经过去了,呵呵,因此,特别强调“人”能看懂,很多教科书上给出的示例,一切以计算机能正确run为准则,写出的代码只有计算机能看,作者本人再看都要想半天,这不是好代码。
工程项目团队,很多时候都是大家合作开发,你的代码,可能使用者不是你,下一个维护者也不一定是你,与人方便,与己方便,当有一天你对着一堆看不懂代码大骂的时候,想想,从我做起,给别人点方便。
2、简简单单写程序,不是说惜墨如金,多敲一个字符都嫌累。
在Unix时代,没有显示器,都是电传打字机,编辑器也是行编辑器,因此,每多敲一行字,都是钱,再加上那会内存小,编译器能用的空间有限,因此,Unix的老程序员,对于变量名,函数名,标签,珍惜得很,很少用2字符以上的,这是历史因素,人家穷,小家子气。
不过,现在大家用的都是以G为单位的内存,液晶显示器,IDE又那么强悍,拜托,起名字给长点,有点表意性好不好,别一段程序写下来,满篇都是“你猜”两个字,看程序的人要疯。
3、注释,很多教科书,一说编程规范性,就是注释,好像这是程序易读的唯一方法,大学里面的老师,没见识过大型工程开发,没一次干过几十万,上百万行代码,这么说也是可以理解的。
不过,工程程序员,项目压力一般都很重,在开发时,所有的注意力都在如何实现需求上,很少有人能有闲心,有耐心,精雕细琢自己的代码,甚至,很多代码,都是交工前最后一刻写出来的,因此,要求详细注释,在工程开发中,实际上没有可操作性。
起码我自己都做不到,这就是为什么我特别强调命名表意,程序写短点。即使程序员没有注释,看字面意思,也能大致理解。这么说吧,看别人的工程代码,没有注释,是正常,有注释,是福气。
嗯,有时候是霉气,很多程序员,开发时写注释,后期出现bug,开始疯狂Debug的时候,那会哪有时间改注释哦,能把程序改对,都是烧高香了,最后,很可能注释和代码是反的,顺着注释看,顺理成章就掉坑里去了。
还是那句话,别期待注释,别全信注释,注意自己的程序,自身的表意性,至于你自己写不写注释,如果在我的团队里面,.h文件里面的公有函数和方法,一定写全,每个入口参数的含义,返回码的含义,越多越好,别人正确调用你的程序,bug就不会找你麻烦,这是为了你自己。至于其他方面,爱写不写,我不管。
4、再说简单,简简单单写程序,可不是说你惜墨如金,是说让读的人,感到简单,脑子里不转弯。这很好理解,我们做出一个产品,好不好,用户说了算,你的软件产品可能有特定的用户,但你的代码本身,也是产品,你的团队伙伴就是你的用户,大家可能听说过换位思考,我们写程序的时候,除了想象客户会不会骂娘,还有没有想想,以后读我们代码的人会不会骂娘?
团队中有规范,按照规范来,不要讨论合理不合理,先照做,大家养成阅读习惯,看代码就不难。
写代码,不要耍酷,年轻人,或多或少都有点爱表现自己的欲望,人之常情,可以理解,不过要控制。哪些为了一个算法的优化,绞尽脑汁,最后把三个变量节约成一个变量,把四重循环节约成一重,看似水平高了,可是,算法复杂度高了,看的人就晕了。
不想挨骂的话,老老实实的写吧。函数内部的变量,只要不是动态申请的,一般都建立在浮动栈上,随着函数的退出,就会自动拆除回收,给下一个函数使用。对象内部也差不多。所以,不妨多用几个变量,老老实实地写,不玩什么花样,看得人看得轻松,其实自己脑子也清晰,不容易出错。
武侠小说中,说越是大宗师,越不喜欢用奇门兵器,一路简简单单的太祖长拳,破尽少林寺七十二绝艺,这说明什么?把事情弄复杂,弄玄妙,不算本事的,能用最简单的招式,化解最复杂的问题,内力够了,自然可以。修炼内功,就是减少对招式的依赖,简单,直接,直奔要害。以最小的成本,获得最大的收益,大家说,是不是?
5、规矩,很多人,一说工程化开发,就认为编程规范很重要。于是开始找大公司的开发规范,于是,网上的华为软件开发规范,传来传去,大家奉为圣旨。谁要敢说半个不字,管杀不管埋。
规矩是人定的,每个人群,每个开发团队,都有自己的开发方向,常用工具,所以,编程规范其实是很小范围的东东,都是针对目前项目最有效的,很难想象,一个做.net的开发团队,拿着华为用gcc做VxWorks工程的编程规范,能做好事情。
什么规矩是最好的?我的理解,最合用的就是最好的。系统设计完成,开发之前,项目团队在一起开个短会,讨论一下规范,把大的几条定出来,之后就随着项目的进行,不断补充罢了。很多时候,项目经理也要尊重程序员的习惯,一个程序员用VC的IDE习惯,总不能为了写gcc,强迫大家都用vi吧。这里面有个个性化的规矩问题。
大家别不习惯,出去之后,走上社会,大家会发现,很多东东都是灵活的,不是一成不变的,很多人就在哭,这个世界太黑暗了。其实是自己不能灵活变通。项目组,有牛人,大家一般会跟着牛人走,他的恶习都可以变成团队规矩,这也合理,没有牛人,大家一盘散沙,就在接口处统一,里面程序乱点没啥,也可以,方法太多了,只要能出活,出来的代码,大家基本能看懂,其实就ok了。
像那种,还没做事,先说一大堆规矩,程序员学习规矩和习惯养成都要半天,这些,最后都是项目成本。江山易改,本性难移,做项目管理,何苦来和每个人作对,尊重一下大家的习惯,直接把习惯做成规矩,不是更好?
6、轮子,笔者生活中,遇到很多了,坛子里面喜欢拍砖的人,也不少,开口就说,这个世界需要依赖工具,自己造轮子的人是笨蛋。
这个话确实见仁见智。很难说对不对,不过,笔者建议,初学者还是少用别人的轮子。
大家毕业,走上工作岗位,还有几十年呢。谁都不知道这辈子是不是一定在某个平台,或者某种语言,某种框架下写代码。
一旦年轻时,习惯了享受某种框架的便利性,就很难深入思考了。那随着年纪增大,走向架构师岗位的时候,由于很多底层的特性思考不够,会后继乏力。我们说,出来混,总是要还的,现在享受了,但是,这辈子的债,总得换,到三四十岁再来重新学习研究,会很难的。
很多人大言不惭,一说就是框架,以框架搭建工程固然很快,但是,想想看,做框架的人,和用框架的人,哪个水平高?哪个收入高?其实很多时候,企业的架构师,就是针对项目或产品,为项目团队制定本企业合用的框架的。
学着自己写队列,学着自己写堆栈,再代入到实际工程中测试,做一些量身定做的优化,你的水平会迅速提升的。
学生评论:
西安工程大学 袁小龙(数据库学生) :
老师的话总是能给人启迪。我就向往着teamwork的生活,希望老师还能继续发帖,让我们这些学生提前感受,学习到社会的知识~~谢啦!
河南成功学院Gwolf团队 赵鹏(C/C++爱好者) :
呵呵,喜欢读,因为简单,明了。不为别的,喜欢这种风格。
内容来自真实的一线,说服力强!
黄海峰(网络管理爱好者) :
我才毕业没多久,发觉很是理想主义,很想当“独行大盗”的心态,有时甚至感觉单位的前辈写代码过于迂腐,但是遇到问题找他们时,他们又总是能很快把我指通,我晕。经验呀。
作者简介
(按姓名拼音字母排序)
肖舸,CSDN学生大本营名师。MCSE,商用程序员,现任普罗通信(西安)有限公司研发主任。拥有多年的软件研发和研发管理经验。精通C/C++,TCP/IP,擅长分布式数据库、服务器集群以及并行计算领域的研发。曾担任西南交大客座讲师,讲授《C/C++语言无错化程序设计》课程。曾在多家企业担任项目经理,负责过的项目有《http tunnel防火墙隧道穿越系统》、《freepp V1.5 服务器集群》、《电子白板子系统》、《水泥生产窑红外线监控系统》、游戏《隋唐演义》、《营区网络化视频监控》、《局域网IM即文档共享平台》、《核爆测试频谱分析系统》、《多媒体网络教室》等。
肖舸老师主页:http://student.csdn.net/?39028
肖舸老师读者讨论组:http://student.csdn.net/space.php?do=room&ac=detail&roomid=27
“我心目中的商用化开发和工程化开发”征文大赛:http://student.csdn.net/space.php?do=event&id=10
杨中科,CSDN学生大本营名师。毕业于山东大学物流工程专业,如鹏网(www.rupeng.com)创始人,CowNew开源团队发起人,专注于企业级系统开发、编译技术以及IDE开发,撰写了《J2EE开发全程实录》、《自己动手写开发工具》、《程序员的SQL金典》等技术图书,已录制IT视频课程《C语言也能干大事》等。曾任职于金蝶软件,目前任职于北京赞同科技发展有限公司,从事银行基础技术平台的开发。
杨中科老师主页:http://student.csdn.net/?52781
左飞,CSDN学生大本营名师。移动通信工程师、技术作家,现就职于中国移动通信集团。对于面向对象技术和程序设计有深入的理解,尤其在C/C++编程方面拥有丰富的开发经验,研究计算机数据结构和算法问题是他的兴趣。此外,他的研究兴趣还包括图像处理和图像加密等。已正式出版的代表作包括《Visual C++ 数字图像处理开发入门与编程实践》、《C++ 数据结构原理与经典问题求解》、《把脉VC++》、《代码揭秘——从C/C++的角度探秘计算机系统》等。其文风严谨认真,但力求通俗简洁,他坚信“每多一条公式或者专业术语就会把一个读者挡在门外”,因此作品多具有图文并茂、实例丰富的特点。
左飞老师主页:http://student.csdn.net/?113322
编者后记:
我们精挑细选了老师的经典回答,相信已经回答了你心中的很多问题。
当然,可能你还有很多具体的问题没有得到解答。这也没有关系,因为只要你立刻加入CSDN学生大本营(http://student.csdn.net),你随时可以向这些老师拜师,这些老师也随时等候你的问题,分享自己的经验。而且,每天都有老师继续解答更多同学的疑惑,带领大家学习IT知识。
而且,更为重要的是,还有十几万名和你一样的学习计算机,爱好编程的学生,大家可以一起交流、讨论、成长。只要你愿意,它都将成为你自己的一个学习成长社区。
如果你认为这本书很好的解答了你的疑问,我们唯一希望的就是你能够把它发送给QQ、MSN、人人网上的同学,或者通过U盘拷贝给你的同学,让每一个学习IT,有志于IT领域发展的学生都能从中得到启迪。