给计算机系学生的建议

ps:因为我今年刚上大学,而且是计算机系的学生,所以转了这篇文章过来。也希望对跟我同样是计算机系的朋友有用。看着这篇文章好象是国内的人翻译自国外的,也许有些对于我们国内的情况并不适用,但是我想这篇文章还是对我们有一定帮助的。

来源:http://www.20xue.com
作者:Quicl
2005年1月2日

虽然大概一两年前我还在夸夸其谈桌面应用程序是将来的潮流,大学生们现在还是偶尔向我请教职业发展的问题。所以我把我的建议写下来。以供学生们阅读,嘲笑,忽略。

大多数锐气十足的学生从来不向前辈征求意见。在计算机科学领域,这样做是正确的。因为前辈们很可能说些“在2010年前,市场对于那些只会敲击键盘的代码工人的需求将会超过一亿(因此前景是乐观的)”,或者诸如“Lisp语言现在真的很热门”。
我和那些前辈也差不多,当我给别人建议时,实际上我不知道自己在说些什么。我是如此的落后于时尚,以至于连AIM也搞不明白,而不得不使用 email(恐龙时代的产品,在那个时代,音乐是刻在扁扁的的圆圆的盒子上,噢,那种盒子叫cd)。(译者按:我认为祖儿这里在说反话,后文很多地方作者都在说反话,读者尽量理解这种美国式幽默吧。)

所以你最好不要理睬我将要说的,你应该立刻去制作某种在线交友软件。

然而,如果你喜欢编程,那就感谢上帝吧:你属于幸运的少数人,这些人喜欢工作,他们的工作可以保证他们能过上舒适的生活。大多数人没有这么幸运。对大多数人来说,工作是不愉快的,忍受工作的目的攒钱,是为了在年满65岁退休后能过上自己想过的生活。如果他们想过的生活不需要灵活的膝盖,明亮的眼镜,轻盈的脚步的话。

现在让我回到主题,我将提供一些建议。

好了,不罗嗦了,下面就是Joel给计算机系学生们七条免费的建议:

  • 毕业前学会写作
  • 毕业前学会C语言
  • 毕业前学习微观经济学(microeconomics)
  • 不要因为某些非计算机课程枯燥无趣就敬而远之
  • 学习有大量编程实践的课程
  • 不要担心工作都跑到印度去了
  • 好好做夏季毕业实习

让我逐条解释这些建议。但解释之前我要说明一下,如果因为这些建议是Joel的建议你就打算无条件地接受,以至于连我的理由都想跳过,那么你就太单纯,太容易被别人骗了。如果你是那种单纯的人,我还要给你第八条建议,找心理医生咨询一下如何培养自信(self-esteem)。

  • 毕业前学会写作

    如果Linus Torvalds不懂如何布道的话,Linux会成功吗? 正象每一个黑客,Linus精通写作,他知道如何准确地在email和邮件讨论组中使用书面英语表达自己的思想,所以他能够从全世界召集大量志愿者为Linux工作。

    你听说过最近风靡全世界的极限编程(Extreme Programming)吗? 即使你不懂什么是极限编程,你至少听说过这个词。为什么?因为宣传极限编程的人都是天才的作者和演说家。

    就看看你身边的那些小型的软件开发组织吧,最有权力和影响力的人是那些可以用自信,准确,舒适的英语交流的人。好吧,我承认这些人也许言过其实,但是你无可奈何。

    一个合格的程序员和一个伟大的程序员的区别不在于知道多少种编程语言,不在于他们是喜欢Python或者Java,而是在于他们是否擅长表达。他们能够说服,所以他们获得权力。他们能够写清楚明白的评论和接口文档,所以他们使得别人不用重写,而可以重用他们的代码,否则他们的代码就是毫无用处的。他们也能够写出清晰的用户手册,于是最终用户可以理解他们的代码是做什么用的,明白了他们的工作的价值。sourceforge埋葬着许多精美的代码,这些已死的代码无人使用,因为代码的作者很少写(或者根本不写)用户手册。

    我不会雇佣一个不懂写作的程序员。如果你擅长写,你就很容易找到工作,紧接着你就会被要求写技术规格文档,这意味着你已经被管理层注意到了。

    大学里有一些课程,要求你做很多的写作练习,不要犹豫,赶快参加这些课程。不要错过任何要求你每周或者每天练习写作的课程。

    给自己建立一个网络日志(weblog)。在上面写的越多,你会写地越容易。写地越容易,你就写地越多,这是一个正向地循环激励。

  • 毕业前学会C语言

    我可没有说是C++。虽然现在用C的工作不多,但是掌握各种编程语言的程序员事实上用C来交流(lingua franca);更重要的是,C比某些“现代”语言更接近机器语言。我不管现在大学里在教什么流行的垃圾语言(trendy junk),你至少得花一个学期接近机器。否则,你不可能使用高级语言写出高效的代码。这意味这你不会有机会写编译器或者操作系统,也许这是更好的编程工作;别人不会相信你能够为大项目设计架构。无论你知道多少高级的控制结构,知道如何进行错误处理,如果你不能解释为什么while (*s++ = *t++);的意思是进行字符串拷贝(而且对你而言这是世界上最自然,最易懂的代码),那么你就是在对编程一窍不通的状态下编程(programming based on superstition)。打个比方,就好比一个医生不懂基本的解剖学就给你开处方,如果你问这个医生为什么开这种药而不是那种药,他会说因为医药销售代表说这种药有用。

  • 毕业前学习微观经济学(microeconomics)

    我个人对经济学的一些理解:在经济学刚诞生的时候,它只是局限于有限的领域,在这些领域中人们发展和发现了很多有用的理论和很有趣的事实,这些理论和事实是从逻辑上是可以证明的。然后, 经济学开始走下坡路了。 “有限的领域”就是微观经济学,它对于商业可以进行有意义的指导。然后,事情就开始变糟了(以下部分你可以跳过),你接下来碰到的是讨论诸如失业率和银行利率之间关系之类东东的宏观经济学,很多时候宏观经济学讨论的理论都是无法证明正确或者错误的。接下来事态更加恶化了,经济学中的一些领域开始和物理学搭界,嗯,学习物理经济学也许你帮你在华尔街找到好工作。言归正传,无论如何请学习微观经济学,因为你需要知道什么是“供给和需求”,什么是竞争优势,什么是净现值(NPVs,Net Present Value,指项目经济寿命期内现金流入总和与现金流出总和之差额),什么是折扣和边际效用(discounting and marginal utility),如果你真想了解商业是如何运作的话。

    为什么计算机系的学生要学习经济学?因为理解商业基本规律的程序员对商业界来说是宝贵的程序员。我记得无数个程序员使我非常沮丧,因为他们在代码中坚持某些疯狂的设计,这些设计从技术上来说,完美;从资本主义的角度来看,发疯。如果你是一个理解商业的程序员,商业会给你回报。这就是你要学习经济学的原因。

  • 不要因为某些非计算机课程枯燥无趣就敬而远之

    首先,你需要让你的学分平均分(GPA)看起来漂亮点。

    不要低估学分平均分的威力。很多雇主和人事经理(包括我)阅读简历时首先看成绩,为什么?因为这代表了大部分的教授在很长的时期内对你的学业的一个平均的看法。托福成绩(美国的托福大致相对于我国的高考中的语文考试)?哈,几个小时的测验而已。当然学分不一定说明了一切,如果你修的是很难的课程,学分就有可能低一点。即使你的学分平均分很高,我还是要看各科分数是否一致。如果你应聘的是软件工程师职位,我为什么要关心你在大学里学的欧洲历史课程分数的高低呢?毕竟,历史很枯燥。那么要是你要编程的部分也是很枯燥的,你是不是要放弃了?事实上,有时候编程是枯燥的,如果你不能忍受编程中的枯燥部分的话,你就不能完成整个工作,雇主不愿意雇佣你这样的员工。

    我在大学里修过一门叫做“文化人类学”的课程,因为那时候我也搞不懂我到底要学什么,听起来这么课程可能还蛮有意思的。

    出乎我的意料。我不得不阅读大量讲述巴西热带雨林中的印第安人如何如何的书,让人真昏昏欲睡。听老师讲解也好不到哪去,我发觉看教室外的草如何长更有趣点。土著人如何烤蕃薯藤和我有什么关系?我为什么要去讨论如何烤蕃薯藤?但是期中考试马上就要到了,我暗暗下定决心,如果我能跨越“文化人类学”这个障碍,以后也许没有什么能难倒我了。我决心得A并且得到了A。以后当我不得不坐在林肯中心,连看18个小时的瓦格纳的《尼伯龙根的指环》时,我终于明白我为什么要学习“文化人类学”了,相比之下,我也能忍受这种歌剧了。

  • 学习有大量编程实践的课程

    我还记得决定不去读研究生的那一刻。

    就是在学习《动态逻辑》(Dynamic Logic)这门课的时候,我记得是耶鲁的Lenore Zuck(一个天才的教师)教的。

    修这门课的时候,我已经不再是雄心勃勃了。我可不指望在这么课程中得个A,我梦想的是混个及格。逻辑本质上是很简单的:如果结论正确,前提必须正确。例如,如果“所有读书好的人都能找到工作”并且“张三的读书好”,那么“张三能够找到好工作”。就这么简单。

    但是我要学的是动态逻辑, 动态逻辑和一般逻辑差不多,但是要考虑时间因素。例如,“在你开灯之后,你可以看见你的鞋子”加上“过去灯被打开了”意味着“你现在可以看到你的鞋子”

    动态逻辑学对于象Zuck教授这样的天才理论家来说非常诱人,因为这门学科的知识也许可以用来证明计算机程序是否正确。我记得在第一堂课上,为了证明“如果你有一盏关着的灯”并且“你按了一下开关”,那么“现在灯亮了”,Zuck教授就使用了两黑板加上边上的墙壁。

    证明过程难以置信的复杂。我觉得如此复杂的证明过程很可能会有小错误,但是我没办法证明证明过程本身是正确的。事实上,写在黑板上的证明跳过了很多中间步骤,许多步的证明使用了演绎法,使用了归纳法,以及一些研究生才懂的证明方法。

    作为课后作业,我们需要证明以下命题:如果灯过去是关着的,并且现在它是开着的,请证明有人按了开关

    我真的试着证明它了。

    我花了许多小时,试图证明这个命题。

    在无数个小时的努力后,我发觉Zuck博士的原始的证明有一个逻辑上的错误,也许这个错误是我的笔记抄错了,我不知道。于是我终于认识到,如果为了证明一个简单的问题需要花三个小时写下几黑板的证明步骤,再考虑到这个漫长的证明过程中可能会引入种种错误,那么这种机制是不可能用来证明任何有趣的东西的。

    对动态逻辑学家来说,有用是无关紧要的。

    于是我退出了那门课程,发誓永远不会去读计算机系的研究生。

    这个故事的主题是,计算机科学和软件开发不一样。如果你非常非常幸运,你的学校会开软件开发的课程。然而,他们也可能不开这样的课程,因为名牌大学认为教授实用技巧的事情应该留给那些二三流的技术学院或者某些释放犯人再安置计划。你可以在任何地方学习编程,我们是耶鲁大学,我们培养未来的世界领导人。你付给耶鲁16万美元的学费就是为了学习如何写循环语句吗?你把耶鲁当成什么地方了?Java速成班吗?哼。

    问题在于,我们没有一个专业的学校教授软件开发。所以如果你想成为一个程序员,你可以进计算机系读书(当然计算机科学也值得学习),但是你学的不是软件开发。

    如果走运的话,你可以在计算机系发掘出很多有大量编程实践的课程,就象你能在历史系找到很多提供写作水平的课程一样。这些课程绝对值得学习。如果你喜欢编程,不要为你不能上教授诸如lambda算子或者线性代数的课程沮丧,在那里你连摸一下计算机的机会都没有。找找看有没有名字中带有“实习(Practicum)”字样的课程,不要在乎Practicum是个拉丁语。有用的(无奈状)课程就是需要在课程名中塞一些拉丁语,才能从那些装模作样(Liberal Artsy Fartsy)管理层的眼前蒙混过关。

  • 不要担心工作都跑到印度去了

    啊哈,如果你人在印度,你就无所谓了。愿你享受外包带来的工作机会并顺祝身体健康。

    但是我听说现在愿意读计算机系的学生越来越少了。据说原因之一是工作机会都跑到印度去了。我认为这种观点是大错特错。首先,根据眼前的商业时尚选择事业是非常愚蠢的。其次,即使工作真的都跑到印度和中国去了,编程对于其他有趣的工作来说都是极好的训练,例如业务流程工程(business process engineering)。第三,无论是在美国还是印度,好程序员仍然是非常短缺的,请相信我。当然,现在有许多所谓搞IT的人吵吵嚷嚷地说就业形势不好,工作太难找。但是事实如何?恕我直言,好程序员找工作还是很容易。第四,你还有更好的主意吗?历史系的毕业生找工作更容易吗?去法学院如何?据我所知,99%的律师恨他们的工作,每分钟都恨。而且律师一周工作90小时。正象我以前说过的,如果你喜欢计算机,那么感谢上帝,你将属于全世界人中的极少数的幸运儿,这些幸运儿热爱他们的工作,而且工作也可以提供体面的收入。

    实际上,我也不认为报考计算机系的人越来越少有多大的意义。相对于internet泡沫时期大家都疯狂的往计算机系挤,现在的人数回落只是回归正常水平而已。在泡沫时期,我们这个行业涌入了许多对计算机毫无兴趣的南郭先生,他们梦想的是拿着高的吓人的薪水加诱人的期权,然后年轻退休。谢天谢地,现在这些人都跑了。

  • 好好做夏季毕业实习

      明智的招聘者知道热爱编程的人初中就为当地的牙医写数据库程序,高中就在计算机夏令营教课,为校报规划网站,在某个软件公司做实习。他们找的就是这样的人。

      如果你喜欢编程,你最容易犯的最大的错误就是“有活就接”。我知道,其他专业的学生假期打工可顾不了这些条条框框。但是你不一样,你拥有一种特殊技能,不要浪费它。当你毕业时,你的简历上应该已经罗列一堆的编程工作实习。让其他人去“为大家提供租车服务”(Tom Welling是个例外,他业余时间去演超人)。

    最后,为了让你的生活更容易一点,也为了说明我这篇文章是能够自圆其说的,我将给我自己的公司的做做广告。我的公司Fog Creek软件公司,可以为大学生提供软件开发方面的实习机会。在我们公司,你可以学习“编码,开发,商业”。去年在我们公司实习的Ben就是这么说的,可不是因为我给他什么好处他才这么说。二月一号截至,抓紧机会吧。

    如果你听了我的建议,你就会太早地卖掉Microsoft公司的股票,拒绝Google提供的职位,原因是因为你已经拥有自己的公司了。到时候可别后悔,更别怪我,呵呵

软件的围城,谈高级语言的学习(一位架构师的忠告!)

软件开发中,语言这一关是从业人员必须要闯的一关。 首先要记住一点:学语言并不等于是学软件.从C到C++,到JAVA,c#,VB,语言的趋势是从原有的过程型到现代的面向对象了
过程型的语言如C,是按面向过程的思维,是人在处理事情的顺序思维体现即先算法后数据结构,缺点是如果事情过于复杂,这个过程的顺序处理中就藕合度就非常高,并且在重用性上也不利。
面向对象的优势在于在处理事情时先把事物对象封装,再将各个过程可以灵活的串起来,即先数据结构后算法的一种思维,这样可以形成一种低藕合度的的优势,并且可以达到高度的重用。
分析了这个背景,就看看现代高级语言的一些具体特点。
a.现代高级语言的数据结构(JAVA或C#):
类是一个最重要的数据结构,由于现代信息数据量的激增,在现在大容量内存中,类可以以动态,大容量(堆)的提供数据处理所要求的内存,所以在高级的语言中,类也就是这些语言中的生命基线了。
所以从以前几K或几M内存的软件编写方式到现在动则上G的内存中编写代码,却实有很大的出入,但有一点要注意的是,再大的内存也是有上限的,在编写代码还是要有很多注意的技巧。
接口,在JAVA或C#中,这也是一个很重要的结构了。如果把类看作是一个真正处理数据的载体,那么接口可以看作是这个载体的指挥官,具体一点是:接口专门作一些计划,类就负责完成这些计划。
所以接口能将业务的定义和业务的实现分开对待,就像人做事要先有计划,再去按这个计划作事一样,因此接口在高级的语言中跟类一样,都是非常重要的数据结构。
其他的就是类接口的成员了,以后有时间再说吧。。。呵呵
b.高级语言的算法
很多的计算机专业都学了数据结构和算法这一门课,一直把算法的概念定位在高深的,专一的处理过程。其实在你用JAVA或C#编写第一个方法的时候,算法就开始了。方法的设计或定义,方法的具体实
现等都是高级语言的算法设计体现,不要以为搞个像二叉树,图形计算的时候你就知道这是要用算法。平常的这些代码方法就是在用你的算法思路了。
对于语言和软件的具体学习,我有几点建议与大家共享:
起步:最好能有些计算原理,操作系统,数据结构,软件工程等方面的理解能力.
(以。NET的学习为列)
1.透过语言看本质.
任何语言的学习是不能脱离环境来单独用的!,所以学C#肯定是要结合.NET Framework(学java除了像eclpise开发工具的应用之外,也是要结构应用一些开源框架,如spring,hibernate)
从.NET Framework1.0,1.1,2.0,包括现在3.0,3.5的框架.框架都不外乎要做到:内存管理,安全管理,异常管理,编译环境管理,类库管理等.
a.内存管理:这是任何一个优秀语言和框架的招牌功夫,不要想像现在的内存条容量很大又如何的便宜,那些垃圾软件可以在半个小时内照样把你的内存空间吃得通光!
一个软件加载到内存中,占用的内存区可分二大部分.
第一部分:代码区(存放程序代码的空间,空间大小也是差不多固定下来的).
第二部分:数据区(存放程序代码加载的各种数据).
数据区可分为:全局/静态数据区,常量数据区,栈,堆,对于全局/静态数据区,常量数据区会在程序编译阶段就已分配好了固定的空间,这样,消耗内存容量的情况就关健看栈和堆
了.栈的空间大小在程序中是按固定大小分配的,这个固定大小哪倒底是多大?这是要由编译器决定的事啦,在VS.NET2003中栈的大小默认是1MB,当然我们可以通过编译选项来指定栈
的大小,但通常栈也不会太大.由于栈上的内存是系统自动分配,压栈和出栈都有相应的指令来进行操作,因此效率较高,并且栈的内存空间是连续的,不会产生内存碎片,所以内存的分配管理最后重任落在了
堆上,
堆的大小只受限于系统的有效虚拟内存大小,一般是用来分配一些占用内存较大的对象或数据,由于堆所占用的内存是由开发人员来动态分配和回收的,当NEW(C#用new,C++用
new,malloc)申请内存时,系统需要按一定的算法在堆空间(虚拟内存)中寻找合适的大小的空闲堆,并修改相应的维护堆空闲空间的链表,然后返回地址给程序,所以效率比栈要低,还易产生内存碎片,针对这
个重任,微软在.NET 框架中作了垃圾回收的管理(GC),在.NET中引用类型的都是用堆来分布内存的,当然CG是一种被动的回收机制,要想取得更好更高的性能,快速高效的利用内存,还得要利用成对编码的原
则:较晚的分配内存,最早的释放内存,在C++或C#中都提供了构造与析构的方式,但我们也可以提前执行GC,但效率始终没有C++高,呵呵,先天性的.
b.异常管理:很多人写代码时都是把代码一写上,编译一通过,跑一下,OK,就完成了,写代码最好是在写完一句或一个功能时,要看一下,如果有错误时程序是怎么处理的,把正确时的处理与异常时的
处理都作好了,你的代码肯定是OK,这样的代码才有容错机制.
c.其他的有时间再谈
2.读代码.
不管你以后要作一个普通的软件工程师或高级软件研发人员,要想写出好的代码,不多读好代码,那肯定是闭门造车,所以成就软件人生,第一关是多读好的代码,现在书市上那有这样的书呀,很少,
奇少!petshop,duwamish以及MSDN上的代码都是可以多读的,多读最好能练练手,自己写一写,看代码也有技巧,首先要把代码的类结构搞清楚,再去看具体实现!
3.调试.
写代码的第一关就是调试了,要想成为一个高手,除了多读好代码,多写,伴随着这个过程更多的是调试,所以调试技术最能衡量一个开发人员的重要指标,调试会让你更多的去理解软件是怎么运行
的,以后会如何处理这类型的问题,常用的调试估计大学都学过,在.NET中作项目,必须得学会应用程序的调试,脚本调试,window服务及Web服务的调试,数据库程序的调试.调试技术的书籍有一本书推
荐:<<.net 和windows应用程序调试>>,清华出版社的,也是Visual Studio.net产品组审校的
4.理解接口和抽像类.
这是.NET的核心之一了,大型的应用软件中,要设计成高可扩展性的应用程序,得依赖松散耦合的原则,高内聚低耦合,接口负责只作业务的定义,把定义和现实很好的剥离了,能够更好的满足这种原
则,所以在.NET的设计中不用接口是不敢想像的,在C#中是采用单类多接口的继承方式来进行实现,C++中是多类继承的方式,在petshop4.0中整个的技术架构就是用的接口,在.net Framework
(1.0,1.1,2.0,3.0)中也全部是采用接口的设计思想!
其实这一关也是学习JAVA和C++所共同的核心,当然C++是没有接口,只提供抽像类.
5.代码设计.
写出好的代码,得首先要有一个好的代码结构,学会用设计模式会有助于你取得一个更好的代码结构或一个好的框架,其实常用的设计模式不多,在.NET框架中接口和抽像类是你应用设计模式的基
础,也可以这么讲吧,其他的如:MVC基于BS的,抽像工厂,工厂方法,外观模式,适配器模式,命令模式,单件模式等
6.文档.一个好的产品或软件都是伴随着各种文档产生的,文档的好处不用多说,如要作好一个软件开发人员,熟练办公软件也是基本功!熟悉基本的软件文档内容写法是最好的.

如何成为一个合格的java程序员(转载)

1、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错 应该能够根据报错信息知道是什么样的语法错误并且知道任何修正。
2、命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需 要熟悉:appletviewer、HtmlConverter、jar、java、javac、javadoc、javap、 javaw、native2ascii、serialver,如果这些命令你没有全部使用过,那么你对 java实际上还很不了解。
3、工具:必须至少熟练使用一种IDE的开发工具,例如Eclipse、 Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括进行工 程管理、常用选项的设置、插件的安装配置以及进行调试。
4、API:Java的核心API是非常庞大的,但是有一些内容笔者认为是必 须熟悉的,否则不可能熟练的运用Java,包括:
1)、java.lang包下的80%以上的类的功能的灵活运用。
2)、java.util包下的80%以上的类的灵活运用,特别是集合类体系、 规则表达式、zip、以及时间、随机数、属性、资源和Timer。
3)、java.io包下的60%以上的类的使用,理解IO体系的基于管道模型 的设计思路以及常用IO类的特性和使用场合。
4)、java.math包下的100%的内容。
5)、java.net包下的60%以上的内容,对各个类的功能比较熟悉。
6)、java.text包下的60%以上的内容,特别是各种格式化类。
7)、熟练运用JDBC。
8)、java.security包下40%以上的内容,如果对于安全没有接触的话根 本就不可能掌握java。
9)、AWT的基本内容,包括各种组件事件、监听器、布局管理器、 常用组件、打印。
10)、Swing的基本内容,和AWT的要求类似。
11)、XML处理,熟悉SAX、DOM以及JDOM的优缺点并且能够使用 其中的一种完成XML的解析及内容处理。
5、测试:必须熟悉使用junit编写测试用例完成代码的自动测试。
6、管理:必须熟悉使用ant完成工程管理的常用任务,例如工程编译 、生成javadoc、生成jar、版本控制、自动测试。
7、排错:应该可以根据异常信息比较快速的定位问题的原因和大致位置。
8、思想:必须掌握OOP的主要要求,这样使用Java开发的系统才能是 真正的Java系统。
9、规范:编写的代码必须符合流行的编码规范,例如类名首字母大 写,成员和方法名首字母小写,方法名的第一个单词一般是动词,包名全 部小写等,这样程序的可读性才比较好。

非常给力的编程新手教程

那些密密麻麻的E文是一些很棒的编程教程,令人激动的是~~全是英文版的。可因为是菜鸟教程,SO很简单阅读,边练编程技术边成为英语高手,哇塞,非常不错的哦!

Quicl温馨提醒,如果觉得自己在编程方面还是初级入门,我嘛~强烈建议你把本页设为你的收藏夹。
C

C Optimization Tutorial
Compiling C and C++ Programs on UNIX Systems – gcc/g++
Building and Using Static and Shared C Libraries
Programming in C: UNIX System Calls and Subroutines Using C
Introduction to C Programming
C FAQ
C Programming Class Notes
ANSI C for Programmers on UNIX Systems
Sams Teach Yourself C in 24 Hours
Sams Teach Yourself C in 21 Days (4th Ed.)
The Standard C Library for Linux – Part 1: file functions
The Standard C Library for Linux – Part 2: character input/output
The Standard C Library for Linux – Part 3: formatted input/output
The Standard C Library for Linux – Part 4: Character Handling
The Standard C Library for Linux – Part 5: Miscellaneous Functions
Programming in C: A Tutorial
An Introduction to C Development on Linux
C Programming Course
C Language Tutorial
CScene: An Online Magazine for C and C++ Programming

C++
C++ Tutorial
Understanding C++: An Accelerated Introduction
An Introduction to C++ Class Hierarchies
G++ FAQ
Introduction to Object-Oriented Programming Using C++
Compiling C and C++ Programs on UNIX Systems – gcc/g++
C++ FAQ Lite
C++ Programming Language Tutorials
Reducing Dependencies in C++
C++ Exception Handling
Part 1: Unicode
Part 2: A Complete String Class
Making C++ Loadable Modules Work
Sams Teach Yourself C++ in 21 Days (2nd Ed.)
C++ Portability Guide
C++ Tips
C++ Language Tutorial
CScene: An Online Magazine for C and C++ Programming
C++ Libraries FAQ

CGI
CGI Programming Tutorial
CGI Programming 101
CGI Manual of Style
CGI Developer’s Guide
CGI Programming Unleashed
Sams Teach Yourself CGI Programming with Perl 5 in a Week (2nd Ed.)
CGI/Perl Tips, Tricks and Hints
A Tour of HTML Forms and CGI Scripts
Reading CGI Data: URL-Encoding and the CGI Protocol
CGI Programming FAQ

CORBA
CORBA FAQ
A Brief Tutorial on CORBA
CORBA 2.0 Specification
CORBA Tutorials
Sams Teach Yourself CORBA in 14 Days
Linux Network Programming, Part 3 – CORBA: The Software Bus
CORBA Program Development, Part 1
CORBA Program Development, Part 2
CORBA Program Development, Part 3

CSS
CSS2 Tutorial

CVS
CVS Tutorial
Concurrent Version System Tutorial

DHTML
Introduction to Dynamic HTML

Emacs
Emacs: The Software Engineer’s “Swiss Army Knife”
Emacs FAQ
GNU Emacs Lisp Reference Manual
Programming in Emacs Lisp
GNU Emacs Manual
A Tutorial Introduction to Emacs
EMACSulation: Internet-ready!
EMACSulation: Ediff – An Emacs interface to diff and patch
EMACSulation: Emacs as a Server
EMACSulation: Customizing Emacs
Basic Emacs
EMACSulation: Templating Mechanisms
Emacs Macros and the Power-Macros Package
Polyglot Emacs 20.4

Expect
Advanced Programming in Expect: A Bulletproof Interface
Automating Tasks with Expect
What Can you Expect?–A Data Collection Project Using Linux

Fortran
Professional Programmer’s Guide to Fortran 77
Fortran 90 and Computational Science
User Notes on Fortran Programming
Fortran Programming for Physics and Astronomy
A Fortran 90 Tutorial
Using GNU Fortran
Fortran 90: A Course for Fortran 77 Programmers
Fortran 90 for the Fortran 77 Programmer
Introduction to Fortran

GIMP
GIMP Tutorial Index
A Tutorial for Perl GIMP Users
A Scheme Tutorial for GIMP Users
GIMP Guide
The GIMP User Manual
Pseudo 3-D with GIMP
Graphical Photocomposition with GIMP
Creating Text with the GIMP
Creating Fire Effects with the GIMP
Creating and Editing Animations with GIMP
GIMP-Perl: GIMP Scripting for the Rest of Us
Writing a GIMP Plugin
GIMP: The RRU Tutorial
GIMP User FAQ
Script-Fu Tutorial
The Quick Start Guide to the GIMP, Part 1
The Quick Start Guide to the GIMP, Part 2
The Quick Start Guide to the GIMP, Part 3
The Quick Start Guide to the GIMP, Part 4

GNOME
Application Programming Using the GNOME Libraries
Part 1: Everything You Need to Get Started
Part 2: Building a Sample Genealogy Program
Part 3: Adding File Saving and Loading Using libxml
Creating GTK+ Widgets with GOB: An Easier Way to Derive New GTK+ Widgets
Handling Multipel Documents: Using the GnomeMDI Framework
Livening Things Up: Graphics Made Easy Using the GNOME Canvas
Developing Gnome Applications with Python – Part 1

GTK
GDK Reference Manual
GLib Reference Manual
GTK+ Reference Manual
The GIMP Toolkit
GTK+ FAQ
GTK V1.2 Tutorial
Drawing and Event Handling in GTK
An Introduction to the GIMP Tool Kit

Gnuplot
Constrained Dynamics
Continuum Dynamics
Differential Equation Basics
Energy Functions and Stiffness
Particle System Dynamics
An Introduction to Physically Based Modeling
Rigid Body Dynamics I
Rigid Body Dynamics II
Scientific Visualization Tutorials
Gnuplot – An Interactive Plotting Program
GIF Animation Tutorial

HTML
HTML Table Tutorial
HTML by Example
How to Use HTML 3.2
Creating a Client-Side Image Map
Advanced HTML: How to Create Complex Multimedia Documents for the Web
The ABCs of HTML
Sharky’s Netscape Frames Tutorial

IP-Masquerading
ipchains: Packet Filtering for Linux 2.2
Setting Up IP Masquerade
Setting Up IP-Masquerading
Ipchains: Easy Links to the Net
Linux Networking Using Ipchains

ILU
ILU Reference Manual
Using ILU with ANSI C: A Tutorial
Using ILU with Java: A Tutorial
Using ILU with Python: A Tutorial

ML
ML Tutorial
Programming in Standard ML ’97
A Gentle Introduction to ML
Moscow ML Owner’s Manual

IPC
Advanced 4.4BSD Interpprocess Communication Tutorial
UNIX Multi-Process Programming and IPC

Java
Enterprise JavaBeans Tutorial
JavaBeans Short Course
Introduction to the JavaBeans API
JDBC Short Course
Essentials of the Java Programming Language, Part 1
Essentials of the Java Programming Language, Part 2
Writing Advanced Applications for the Java Platform
Fundamentals of Java Security
Fundamentals of Java Servlets
Introduction to the Collections Framework
Introduction to CORBA
Fundamentals of RMI
Advanced
Introductory
Intermediate
Java Language Specification
Java Tutorial: Servlet Trail
Java Virtual Machine Specification (2nd Ed.)
Glossary of Java and Related Terms
The Java Language Environment
Java Look and Feel Design Guidelines
Story of a Servlet: An Instant Tutorial
Introduction to Java
Java2D: An Introduction and Tutorial
Java Servlet Tutorial
comp.lang.java FAQ
Brewing Java: A Tutorial
Shlurrrppp … Java: The First User-Friendly Tutorial on Java
Swing Tutorial
Swing: A Quick Tutorial for AWT Programmers
Thinking in Java
Java RMI Tutorial
Java for C++ Programmers
The Advanced Jav/aJ2EE Tutorial
Hacking Java: The Java Professional’s Resource Kit
JFC Unleashed
Java Developer’s Guide
Java Developer’s Reference
Sams Teach Yourself Java in 21 Days (Professional Reference Ed.)
Java Unleashed (2nd Ed.)
Java 1.1 Unleashed (3rd Ed.)
Java Game Programming Tutorial
Java Networking FAQ
Java Tutorial: A Practical Guide for Programmers
Sockets Programming in Java
Programming with Java – Part I
Programming with Java – Part II
Setting Up a Java Development Environment for Linux
Understanding Java
Beginner’s Guide to JDK
GUI Development in Java
Java Servlets: An introduction to writing and running Java servlets on Linux

JavaScript
Introductory JavaScript Tutorials
JavaScript Authoring Guide
Client-Side JavaScript 1.3 Guide
Client-Side JavaScript 1.3 Reference
Core JavaScript 1.4 Guide
Core JavaScript 1.4 Reference
Server-Side JavaScript 1.4 Guide
JavaScript FAQ
JavaScript Tutorial
The Way of JavaScript
Voodoo’s Introduction to JavaScript
JavaScript Tutorial for Programmers
JavaScript Primer
EchoEcho JavaScript Tutorial
Sams Teach Yourself JavaScript 1.1 in a Week (2nd Ed.)

Lisp
Common Lisp Hints
Common Lisp the Language (2nd Ed.)
Lisp FAQ
Lisp Programming Tutorial
Lisp Tutorial
LISP Tutorial
Common Lisp HyperSpec

Matlab
Matlab Basics Tutorial
Matlab Summary and Tutorial
Matlab – Official Online Manuals in PDF
Misc
The Soar 8 Tutorial Home Page

MIDI
Basic MIDI Tutorials
Tutorial on MIDI and Music Synthesis

MPI
An MPI Tutorial
Tutorial on MPI
MPI: Portable Parallel Programming for Scientific Computing
Tuning MPI Applications for Peak Performance
MPI: From Fundamentals to Applications
MPI Tutorial
MPI: The Complete Reference
Introduction to Parallel Programming Using MPI
Basics of MPI Programming

Quicl’sBlog加入“瑞星云安全网站联盟”

Quicl’sBlog(Quicl的个人博客)网站于2011年2月2日加入“瑞星云安全网站联盟”,该联盟将对Quicl’sBlog网站进行全天24小时不间断监控,如有木马病毒,将会第一时间预警并告知管理员。

Quicl’sBlog网站经过“瑞星云安全网站联盟”扫描检测,目前没有发现被挂马行为,通过了“瑞星云安全网站联盟”安全认证,认证标识请查看博客侧边栏底部图标:

 

您访问的网站目前没有发现被挂马行为