介绍一些经典的网站和书籍

来源:互联网 发布:阿里云esc重装系统 编辑:程序博客网 时间:2024/05/29 16:35
 
介绍一些经典的网站和书籍
2008年11月03日 星期一 上午 00:47

因为要经典,不敢写得太多,欢迎大家继续补充。这里只是涉及编程的东东,如果想要关于破解方面的资料请到“工具下载”栏目的置顶帖。

ps.网上这些书的电子版大都是未经作者同意而发布的,我并不能保证给出的链接长期有效。我的看法是您可以先下载试看;),如果觉得物有所值,还是推荐去买一本纸质书,也是支持一下作者的辛勤劳动。

有用的网站:

MSDN Library

http://msdn.microsoft.com/library/

CSDN

http://www.csdn.net/

经典书籍:

=======================
WINDOWS编程类
=======================

Windows程序设计中文版(Programming Windows,Charles Petzold著)

http://www.a5d.com/SoftView/SoftView_673.asp

这个不用我多废话了,地球人都知道的经典,用C语言+WinSDK写成。

Windows核心编程(Programming Applications for Microsoft Windows, Fourth Edition, Jeffrey Richter著)

http://www.infoxa.com/asp/book/xxnr.asp?id=494

内容较深的一本书,同样经典,如果能通读一遍,可以说基本上就掌握了Windows的精髓。

Win32 ASM Tutorial Resource Kit

http://www.pediy.com/document/Win32ASMTRK.rar(解压密码:dREAMtHEATER)

dREAMtHEATER收集的WIN32ASM教程,内容很全,包括32位汇编的基础知识,Iczelion的经典教程中英文版,罗云彬的32位汇编教程,还有PE格式和VxD的一些内容。

Windows环境下32位汇编语言程序设计(罗云彬著)
http://www.infoxa.com/asp/book/xxnr.asp?id=2243

汇编语言版的Programmin Windows ,可以与上面Iczelion的教程相互参照着学习。

=======================
程序设计语言类
=======================


C语言程序设计(The C Programming Language (2nd Edition), Brian W.Kernighan & Dennis M.Ritchie著)

作者是C语言和UNIX系统的发明人,这一本书是如此经典,以至于两位作者名字的缩写 K&R 成了一个专有名词,以至于书里的"Hello,World"这个简单的句子被无数人用无数种程序语言写出来。很薄的一本书,却成了一个不朽的传奇。个人看法,学好C语言,这一本小书足矣。

C++语言程序设计(The C++ Programming Language (Special Editon),Bjarne Stroustrup著)

作者是C++语言的发明人,这本书之于C++就好比上本书之于C,不同的是这本书巨厚无比,毕竟C++复杂了太多太多。这本书介绍到了C++的方方面面,巨细无遗,毕竟是作者发明的么,不过我只看了几章就晕得受不了了。
btw:关于C++的好书还有很多,如<< C++ Primer >>, << Thinking in C++ >>, << Essential C++ >>、<< Effective C++ >>等等,因为我对C++不很感冒,这里不敢妄加评论,请大家多补充。
再btw:对Java, .Net, Python这些新东东(Java好像也不新了吧,看来是我老了)了解不是很多,也不敢乱写,同样请各位补充。

=======================
面用对象WINDOWS编程类
=======================

也不知道这么说合适不合适,总之就是像MFC,VCL之类的东东啦。这类图书大概是最多最杂的了,像什么XX从入门到精通啦,XX编程宝典啦, XX编程100例啦……鱼龙混杂,泥沙俱下,也说不出哪个是经典。这里只选出几本有一定深度的,大家基本公认的好书。

深入浅出MFC(第二版)(侯捷著)

侯捷网站:http://jjhou.csdn.net/
关于侯先生写的和译的书,赞的人很多,骂的人也有,我是很推荐这本书的,虽然我不喜欢MFC,只硬着头皮看了前几章。感觉如果能通读下来,可以试着自己架一个类库了,呵呵。需要注意的是,读这本书先要有一定的SDK编程的基础,这本书不是教你如何用VC写程序的,好像有许多人不明白这一点,所以来骂侯先生,如果你只想快点用VC写个程序出来,建议去看看《21天VC++无师自通》之类的书。
btw:侯先生的网站上有很多有趣的东东,顺便推荐一下。

Delphi源代码分析(周爱民著)

我只在很早之前玩过Delphi,水平就是只知道Form上放几个Button,Edit,双击两下就开始写代码,因为以前学过Pascal,看着语法很熟悉,玩得不亦乐乎,什么也不管,N久以后才知道有Object Pascal这回事,汗……因为N多大牛推荐这本书,所以我也推荐一下,虽然里面东西基本都不懂。同样,这本书也不是教你如何画个窗口摆个控件的,那样的书遍地都是……

=======================
数据结构与算法类
=======================

算法、数据结构,这是计算机程序的灵魂所在。下面介绍的书可以在http://lib.verycd.com/2004/12/16/0000031024.html找到,而且那里有更详细的评论,强烈推荐!

Introduction to Algorightms (算法导论,Thomas.H.Cormen等著)

此书简称CLRS(四位作者名字的缩写),被人们称做“计算机算法的圣经”绝不为过,是ACM竞赛的必读书,影印版由高等教育出版社出版,共1180页,厚度约五公分虽然书很厚而且是英文,但是由于大师深入浅出的讲解,反而很好读懂,有时候我学一个算法,看相关中文书看得一头雾水,翻翻这本书却能豁然开朗。

The Art of Computer Programming vol1,2,3(计算机程序设计艺术I-III卷,Donald.E.Knuth著)

简称TAOCP,经典中的经典,名气可能比上一本书还大,此系列书原计划出七卷,目前为止只出版了三卷,已经被评为20世纪最重要的20部著作之一。因为里面用一种奇怪的程序语言写成,而且只出了三卷,内容没有CLRS全面,这套我没有买,只在图书馆里翻翻(有中译本),但绝对是值得一看的好书。

Concrete Mathematics A Foundation for Computer Science (具体数学,Donald.E.Knuth & Ronald L.Graham著)

同样是ACM竞赛必读书之一,几乎包含了所有计算机科学里涉及到的数学问题,里面有众多的经典问题与经典解法,对开拓人的数学思路有极大的帮助。看这书给我的感觉是,如果你能把每章后面所有的习题都解出来,估计离图灵奖也不远了

=======================
关于编程竞赛
=======================

下面是几个比较大的在线提交系统(Online Judge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有Pascal/C/C++/Java)写好源代码提交即可,会实时返回信息告诉你是否正确。采用黑箱测试,系统里有一套标准的输入输出数据(对外保密,而且通常数据很多很怪),你的程序的输出和标准输出完全符合即可。常见的返回信息有AC(Accepted,通过)WA(Wrong Answer,输出有错误)TLE(Time Limit Exceeded,超时)MLE(Memory Limit Exceeded,内存溢出)RE(Runtime Error,发生实时错误)等,只有AC了才算做对一题。这里只是一个简要介绍,请大家在做题时先看看各网站上的FAQ,Enjoy it~~~

浙江大学 Online Judge(ZOJ)http://acm.zju.edu.cn

国内最早也是最有名气的OJ,有很多高手在上面做题。特点是数据比较刁钻,经常会有你想不到的边界数据,很能考验思维的全面性,现在我主要在这个OJ上做题

北京大学 Online Judge(POJ)http://acm.pku.edu.cn/JudgeOnline/

建立较晚,但题目加得很快,现在题数和ZOJ不相上下,特点是举行在线比赛比较多,数据比ZOJ上的要弱,有时候同样的题同样的程序,在ZOJ上WA,在POJ上就能AC

同济大学 Online Judge http://acm.tongji.edu.cn/index.php

这个OJ题数上不能与上两个相比,推荐这个OJ的原因是它是中文的,这对很多对英文不太感冒的兄弟是个好消息吧。它也因此吸引了众多高中的OIer,毕竟他们的英文还差一些呵呵,上面的题目也更偏向高中的信息学竞赛一些。

西班牙Valladolid大学 Online Judge(UVA)http://online-judge.uva.es/problemset/

世界上最大最有名的OJ,题目巨多而且巨杂,数据也很刁钻,全世界的顶尖高手都在上面。据说如果你能在UVA上AC一千道题以上,就尽管向IBM、微软什么的发简历吧,绝对不会让你失望的。

俄罗斯Ural立大学 Online Judge(URAL)http://acm.timus.ru/

也是一个老牌的OJ,题目不多,但题题经典,我在高中的时候就在这上面做题的。

UsacoGate Online Judge(USACO)http://ace.delos.com/usacogate

全美计算机奥林匹克竞赛(USACO)的训练网站,特点是做完一关才能继续往下做,与前面的OJ不同的是测试数据可以看到,并且做对后可以看标准解答,所以如果大家刚开始的时候在上面那些OJ上总WA却找不到原因的话,可以试着来这里做做,看看测试数据一般是从什么地方阴你的。

以下是本人几年以来学习和开发中的一些积累和总结,欢迎讨论,欢迎B4.

1. 书籍:
    Essential c++ : 入门书籍,读完可以开始写C++代码
    The C++ Programe Language : C++之父的著作,无微不至,居家旅行必备良书。
    C++ Primier : 非常完整的C++著作,不过不推荐入门阅读,参考书。
    Effective C++: Scott Meyers作品,有一定功底以后再读,从此可以称为熟手。
    More Effective C++: 与上篇一样。
    Exceptional C++ : Herb Sutter作品,Scott Meyers学生,国外的博士就是不一样。
    More Exceptional C++: 与上篇一样。
    Modern C++ Design: Anders Alexandr著作,俺们最最佩服的神人之一。
    Large-Scale C++ Software Design: 如果你需要参与设计20万行以上的软件,建议阅读,否则还是继续研究设计模式吧。

2. 连接
    Newsgroup:comp.lang.c++ : 古老的新闻组,需要代理才能访问。如果跟我一样懒,不妨试试news.gmane.org,可以使用Outlook Express浏览。
    CUJ : 读大牛们论文的好地方,不过2002年以后的更新都没啥好玩的了。强烈推荐"Generic<Programming>"系列,Anders Alexandr的范型专栏。
    http://www.research.att.com/~bs/C++.html   : Bjarne Stroustrup的C++联结页面,大量的C++联结信息。

3. 代码库
    STL : C++的标准模板库,有好几种版本,其中以SGI(GCC默认)的版本最为好使,VC6所带版本最蹩脚。
    Boost : 非常完善的跨平台C++库,提供智能指针,正则表达式,线程,字符串工具函数等好用的DD。很长时间了网站都没法访问,不过可以通过C-VIEW的镜像访问。
    Loki   :   Anders Alexandr的代码库,设计精巧,提供智能指针,Functor,TypeList等。
    QT : 本来是完美的C++ GUI库,可惜对于商业开发要收取版权费,动辄上千美元,惹不起。
    Xerces : XML代码库,估计是除.Net Framework的System.XML外最好使的XML库了,对于C++程序员,如果需要完善的XML Core Level3支持,跨平台的,免费的XML库,那就是它了。不过体积可不小。
    Xalan : XML XSLT支持库,配合Xerces使用,Apache的一贯传统,大而全。
    TinyXml : 如果您的XML只需要支持Ansi和UTF8编码,只需要做些简单的XML解析,TinyXML是很好的选择,小而精。
    ICU : IBM的Unicode实现,有JAVA和C++/C两种版本,支持各种编码,国际化和本地化功能,但是,很庞大,8M左右。
    libiconv : GNU的UNICODE实现,提供各种字符集到UNICODE之间的转换功能,1M左右。
    ACE: C++网络编程库,很完善,使用方便,适合开发服务器。提供网络通讯,消息队列,线程/进程池,各种互斥缩/信号量,以及一整套服务器开发框架,不过目前好像没有提供对epoll的支持。
    cURL : 从名字可以看出来,c操作URL资源的库,完善支持HTTP,SHTTP,FTP等协议,比WinINet好使,与正在“烟酒”中的WinHTTP有一拼。
    FreeImage: 非常完善的图像处理库,设计非常好,用插件的方式支持多种图像格式,GIF因版权问题除外。
    IT++: 专业的数学库。
    GC6.2: C++垃圾回收器,很好使。GCC自带,Mono中使的也是它。
    libpdf : 生成PDF文件的库,可惜不能读入编辑PDF文件。

    没事去www.sf.net上转转,说不定什么时间就出了极品。

4. 经典论题:
   
    Smart Pointers in Boost : http://www.cuj.com/documents/s=8014/cuj0204karlsson/
    Scope Guard : http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/alexandr.htm
    Min Max: http://www.c-view.org/journal/007/gp_aa.htm,这是译文。

5. 编译器差异:
   
    主要考虑两个编译器GCC和VC6,以及跨平台跨编译器代码中应该注意的一些问题。
    1. VC6和GCC处理临时变量的const属性的不同处理,例程和解释请参考 这里 。
    2. VC6和GCC对64位整数的扩展的差异。VC使用__int64,GCC使用long long.
    3. VC6下的wchar_t为2个字节,GCC下wchar_t为4个字节。
    4. VC6下对模板的支持bug很多,导致很多代码在VC6下无法编译,详细可以参考一下一个简单的列表。
    5. VC6下使用__forceinline强制函数为inline,linux下没有办法,但是可以通个编译选项-finline-limit对编译器进行“强烈”建议。
    6. VC6下使用#pragma comment(lib,libname)可以静态连接库文件,GCC下通过-I和-L选项在Link是连接库文件。

6. 个人观点:
    强烈推荐Learning Standard C++ as a New Language(http://www.research.att.com/~bs/new_learning.pdf),Bjarne Stroustrup的
肺腑之言,就本人的所知,很多人都只是把C++当作带类的C来使,对一些基本的概念比较模糊,比如拷贝构造,赋值构造,深度拷贝,模板,
多重继承,虚集成等概念不大清楚,在代码中又无意中用到,bug也就随之而来。

    忘记模板。STL很伟大,ATL很好使。但是模板实在是一把双刃剑,而且受伤的十有八九是自己。除非用于设计地层的代码库,
否则建议放弃使用模板,因为它,整个工程变得难以维护和调试。是的,可能你很熟悉,维护起来没有问题,可是不是每个人都是模板高手。

    只有两个理由使用宏。第一个,为了优化代码。GCC没有强制INLINE的方法,导致使用宏是唯一确保可行的性能优化手段。其次,为了实现
一些没有宏就实现不了的功能,比如连接字符串(配合##使用),读取当前的行号(__LINE__)。这两种情况以外,建议不要使用宏,特别是
不要使用镶嵌宏,这种代码如果出现bug,只有上帝知道怎么解决。我曾经因为工作需要,花了一年时间维护一个50万代码行的软件,其中充斥
着各种设计精巧,动辄50行的宏。不错,这些宏确实大大减少了整个软件的代码行,可是,发现bug以后,我唯一的办法就是把这些宏重新展开
到函数中去,不然怎么调试?

    项目一开始就对内存泄漏和资源泄漏进行跟踪,最好实现一些进行跟踪的辅助代码。本人曾经实现过一个,如果有兴趣,可以参考讨论,
连接如下。内存泄漏也可以使用一些工具,如bound checker,其它资源就只有靠自己了。

    对于服务器软件开发,写LOG文件是最好的调试方法。

7. 小技巧:
   
    如何让一个类只能被new出来,分配在堆中?
   
    这是一个偶然的机会,和一个朋友讨论的结果,我至今不知道为什么他会有这种需求,但是方法确实找到了。让您先想想,我的解决方法请见这里。