给计算机相关专业研究生的一封信

时间:2022-04-27 21:58:13

给计算机相关专业研究生的一封信

 http://hi.baidu.com/qsbbdfssdkbelvd/item/f54ac80ac1fcebce74cd3c8f

之前曾经写过一篇《写给信息安全专业学弟学妹的一篇文章》,不过那会我刚读研不久,因此也写不出太多值得借鉴的东西。大约两年的时间,我对计算机相关技术有了更深的理解,因此我觉得重新写一篇文章,和大家分享我学习计算机技术的经验,应该是有意义的。我希望这篇文章可以给刚刚步入研究生当然也包括本科生的同学一些借鉴,倘若有谁能够从中学习到点什么,或者是在将来的学习中,能够因此而少走些弯路,这让我欣慰万分了。

 

本人本科和研究生都是信息安全专业,不过读研之后在两个公司实习过,实习期间,做的基本上都是软件开发工作,因此在软件研发方面也有一些经验。因此我下面将简单总结一些我自己对计算机相关专业学习的一些心得和建议。

 

关于编程语言

有些同学可能本科学习过C语言,有些则可能学习或者自学过C++,个别学校开过java语言课。不过语言类型并不重要,建议有志于IT行业的同学,精通c语言和C++,并且能够熟悉一门快速开发的语言,比如perl ,java ,ruby,python ,C#等。原因大概有以下几个:

 

精通C语言对理解系统级软件和高性能服务器端软件是必须的,只有精通C语言,才能够有能力去阅读Linux的源代码,windows操作系统的模拟代码(React OS),Apache HTTP服务器的源代码,sphinx代码,libcurl代码等。C语言由于其语言本身的极度简洁,因此有关该语言的编程技巧也就很多,多阅读一些优秀的开源软件的代码,对提升自己的C语言编程能力大有好处。

 

精通C++的必要性在于,现在一般性能优越的开源软件,基本都是使用C++进行开发的,C++语言的STL可以满足编程中需要的大部分数据结构,而C++的模板对于提高代码的复用率如虎添翼,C++的面向对象特性,又更有利于实现大规模软件,更有利于模块划分和代码管理与维护。现在在工业界,服务器端的大部分软件都使用C++实现,一般的搜索公司,大部分项目都是C++语言实现。因此学好C++非常重要。

 

之所以需要学习一些快速开发的语言,是因为在日常的编程事务中,常会有需要快速编写代码,解决某一个小问题的情况,这种情况下,借助于较为高级的语言,依托其庞大的类库和丰富的第三方库,便可以很容易解决问题。不过这方面我并不熟悉,也正打算在不久的将来,好好学习一门脚本语言。我实习的时候,遇到过一些场景,需要我熟悉脚本语言,迅速解决某些小问题。一般Google之类的公司,都希望招聘的员工能熟悉Python或者perl之类。

 

下面简单介绍几本相应的书籍:

C语言:

Ø  《深入理解计算机系统》

Ø  《C程序设计语言》

Ø  《C专家编程》

Ø  《C与指针》

Ø  《C缺陷与陷阱》

 

以下的《深入理解计算机系统》虽然不是专业介绍C语言的设计,但是对于理解程序运行背后的机理,深入理解C语言大有帮助。而《C程序设计语言》这是C开发设计者的书,简洁却全面深刻,其它三本都是C语言深得口碑的书,不可不读。

 

C++

Ø  《C++程序设计语言》

Ø  《C++编程思想》

Ø  《Inside the C++ Object Model》

Ø  《STL源码剖析》

Ø  《Effective C++》

Ø  《STL扩展技术手册卷I》

 

C++名著可谓是汗牛充栋,这里不推荐太多,不过以下几本书建议有精力的可以好好阅读。我的建议就是,真想精通C++的人,最好是能拥有上面的几本书,或者是其中的一部分。《C++程序设计语言》是C++语言设计者对C++最权威的阐释,而《C++编程思想》和《Effective C++》对提高C++编程水平都大有借鉴意义。《Inside the C++ Object Model》这本书更受欢迎的是《C++ Primer》,不过相比这本书,我觉得《C++ Primer》的大部头便不太值得一看。这本书是C++所有书籍中最深刻也最晦涩的,如果能够通读该书,想必写C++代码的时候,便可以做到知其然也知其所以然了。《STL源码剖析》《STL扩展技术手册卷I》这两本书将祝您精通C++的STL,并有能力扩展STL,驾驭C++语言。我个人只阅读了侯捷的《STL源码剖析》,深深受益,之后打算找个时间好好阅读《STL扩展技术手册》。

 

由于我本人对java以及一些脚本语言并不熟悉,因此这里便不进行介绍,以免误人子弟。

关于数据处理

一个在运行时性能表现良好的软件,必然有其对数据处理的优良设计。几乎所有的软件,都需要和书籍打交道。不说大型的搜索引擎了,就是一个门户网站,或者是微博网站,SNS网站,每天需要处理的数据都非常大。

 

因此建议大家有时间可以好好学习数据处理相关技术。这一块我自己不是特别了解,但是可以提提我的建议:

 

学习mysql数据库,包括使用,管理,优化,改进等。学习mysql我觉得可以有以下一些努力方向:

Ø  学习SQL查询语言,能够熟练处理各种数据存储和数据查询请求。

Ø  学习SQL的编程接口,能够熟练使用C,C++或者java等与mysql通信。

Ø  学习mysql管理和性能优化

Ø  阅读mysql源代码,深入研究关系型数据的实现技术,了解其优势和局限性,探索能够改进mysql,或者是借由对代码的理解,从而可以更好的发挥其优势。

 

这几年Nosql已经刮起了一阵阵旋风,facebook ,twitter等巨型公司也都纷纷向其靠拢,因此如果对数据处理有兴趣的同学,可以好好研究Nosql数据库。相关的一些开源项目有:

Redis,Tokyo Cabinet,Cassandra,Voldemort,MongoDB,Dynomite,HBase,CouchDB,Hypertable, Riak,Tin, Flare, Lightcloud, KiokuDB,Scalaris, Kai, ThruDB

 

其中Cassandra是apache基金下非常有名的开源项目,现在也有很多公司准备从关系型数据库转向或者部分转向Cassandra 。对这一块有兴趣的同学,我觉得可以好好阅读对应的文档以及Cassandra的源代码。

 

关于开发平台

开发平台现在主要就是windows,Linux两大操作系统,java ,C#等跨平台语言。对于windows开发平台,我个人有一些编程经验,推荐的主要有:

 

Ø  如果对界面感兴趣的同学,可以深入学习MFC,阅读MFC源代码。

Ø  如果对UI设计感兴趣,建议好好学习GDI,GDI+等相关技术。

Ø  如果对C#比较感兴趣的话,这比较简单,找几本相关书籍阅读,并多学习网上的一些开源项目。

Ø  阅读《windows核心编程》,这本书对于从事windows编程的人来说,可以说是一本必读之书,阅读该书,将让你对windows平台的开发有一个很清晰的理解。其中Unicode,内核对象,进程,线程,动态链接库等相关章节,在实际开发中非常有学习和借鉴价值。

Ø  阅读《windows程序设计》,这本书对于windows UI开发者来说,是必备工具书,如果你想写一个不是控制台的windows程序,那么就从这本书开始吧。

Ø  阅读《软件调试》《深入解析windows操作系统》《windows内核情景分析》,这三本书可以说是windows领域的高阶书,如果对windows操作系统还有什么好奇或者不解之处,这求助于上述三本书即可。

 

Linux领域的开发,我是最近一个月才真正开始的。因此可能以下建议不太专业。

 

Linux领域,系统API相关书籍,我建议阅读《Unix环境高级编程》,该书深入浅出,代码丰富,是入门和高阶人员都应该备在案头的一本书。

 

网络编程领域,我推荐阅读《Unix网络编程》,该书对网络编程的客服端和服务器端,都有极其精彩的解读,并且例子循序渐进,讲解循循善诱,阅读下来可以说是流畅至极。是网络编程书籍中的奇葩。而入门级的开发书籍,我觉得《Linux程序设计》可能是个不错的选择。

 

Java和C#我个人编写的代码不太多,不过各个领域都有各自的倚天屠龙之类书籍,也无须我做过多介绍。这里推荐的是精读Lucene的Java版本代码,或者是C#版本代码,这样既可以熟悉搜索技术,又可以深入学习一门语言,可谓是一举两得。

关于网络编程

网络编程书籍,windows领域我觉得王艳平的《windows网络与通信程序设计》是个不错的入门选择,Linux平台,这《Unix网络编程》当之无愧是最佳选择。除此之外,《TCP/IP详解》三卷本是案头必备书籍,这三本书是理论与代码的完美结合,值得网络编程人员细细琢磨。

 

不过这里我不像花在介绍书籍上,而是想介绍几个开源项目。

Ø  Apache。Apache现在是市场占用率最高的web服务器,Apache的模块化体系结构非常精巧,阅读Apache源代码对提高网络编程水平,学习高性能并发处理模型,深入掌握http协议,提高软件架构水平,都大有裨益。除此之外,现在也有其它几个比较有名的开源http服务器,也都非常值得学习,研究。

Ø  Firefox。Firefox最为最有名的开源软件之一,并非浪得虚名。Firefox的架构,性能,可扩展性,对HTML标准的高支持度,都是其值得软件开发人员深入学习与研究之处。

Ø  Libcurl或者libwww,这是两个最有名的网络开发库,Libcurl是使用C语言编写的,其接口友好,调用灵活,支持多网络协议,是使用c/c++进行网络编程的首选网络库。

Ø  TCP/IP协议栈。这个FreeBSD和Linux等都有开源的协议栈,并且也有很多解析网络模块的书籍。

 

 

关于信息安全

我觉得信息安全相关的开发,涉及到的可能有以下几个项目:

Openssl

CryptoPP

Openssl对https等网络安全中使用频繁,而CryptoPP对系统软件安全,桌面软件安全等挺有用武之地。总之两者都是应用很广泛的两个库,可以在学习和编程中多多使用它们,如果有兴趣也可以阅读器源代码,加深对相关算法和协议的理解。

 

下面列出几个信息安全的相关工具:

Ø  Gdb

Ø  WinDbg

Ø  Snort

Ø  Sniffer

Ø  Winpcap

Ø  Ethereal

Ø  IDA

上面这些工具,鉴于时间关系,同时也因为篇幅不宜太长,就不进行介绍,但是可以说每个都是非常重要的安全工具,倘若想从事信息安全技术行业,建议还是至少 了解一下,倘若能够掌握几个,那更是最好不过。

 

下面再列举几个相关论坛:

Ø  看雪软件安全网站: 
http://www.pediy.com/
这个论坛牛人很多,并且有很好的技术讨论氛围,论坛里有很多非常不错的信息安全工具,牛人多多,并且该论坛出版了几本信息安全方面的书籍,非常推荐去逛逛。

Ø  网络安全焦点:
http://www.xfocus.net/
这个论坛是看了一本《网络渗透技术》后才知道的,因为这本书就是这个论坛的高手写的,这个论坛不太熟悉,不过也举办了几次会议,水平较高。
http://www.securityfocus.com/

Ø  这个是一个很不错的国外网站,并且有几乎信息安全各个领域的邮件列表,大家可以订阅一下。
http://www.schneier.com/

Ø  《应用密码学》一书的作者公司的网站,很不错,该作者自己也开发了几个很有名的密码算法,当初AES公开征求算法的时候,他开发的算法名列第二。

 

关于项目开发

说到项目开发,我觉得有以下几个可以参考:

Ø  源代码管理系统

这个比较有名的有svn,cvs,git等。平时如果能够在编写比较大型的软件代码的时候,有意识使用源代码管理系统的话,在工作以后进行团队合作时,可能会驾轻就熟。

此外,也建议关注下sourceforge,googlecode上的一些开源项目,并使用svn包括代码的更新。

Ø  工作流管理系统

这个我经验不太多,一般使用JIRA或者Wiki之类的完成,各位如果有兴趣,可以查找相关之类学习。

Ø Bug报告系统

一个面向市场的软件产品,都应该有bug报告系统,才能够保证软件的可维护性和持续更新,这个可以研究下windows平台的crashreport项目,Google的Breakpad。其中Breakpad是一个开源的多平台崩溃报告系统

,Google Chrome, Firefox,Google Picasa, Camino, Google Earth等项目都使用了这个工具其成功可见一斑

Ø  单元测试

这里推荐使用google的开源产品gtest,其网址为:

http://code.google.com/p/googletest/

gtest是google出品的一个跨平台的c++测试框架,功能强大,建议在平时的学习和编码中,都能养成使用gtest等集成测试功能。

Ø  命令行处理

一个比较好的软件,要么提供一个好友的配置文件解析引擎,要么提供对各种命令行的灵活处理。这里介绍的便是命令行处理工具。

Gflags:http://code.google.com/p/google-gflags/

相关信息请自行查阅,这里不再赘述。

Ø  性能处理

一个好的开发者,对性能都有着苛刻的要求,借助一些工具将有助于开发更加健壮,性能更加优越的软件。

google-perftools,其对应的网址为:

http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools

相关信息请自行查阅。

Apache ab ,该工具主要是测试http服务器性能的。其文档网址为:

http://httpd.apache.org/docs/2.0/programs/ab.html

Ø  日志系统

一个好的软件,也应该具备对日志的完美处理,这样才能够更好的支持调试和性能跟踪,以及运行时的状态追踪。Glog便是一个非常不错的工具。其网址为:

http://code.google.com/p/google-glog/

相关信息请自行查阅。

关于实习和就业

研究生阶段,一般研一的时候课程比较多,研二之后就几乎没有什么课程了。有些学校的学生主要呆在实验室里,有些学校的学生可以出去实习。我读研的时候,基本研二之后都在外面实习,因此我主要说说实习的体会。

 

我当初阴差阳错,到了一个小公司实习,实习阶段,由于没有技术牛人带领,基本是自己摸着石头过河,遇到什么问题,都得自己想办法解决。这样其实是有利有弊的,利在于,可以锻炼自己独立解决问题的方法,从而为之后独立带领一个团队开发一个大型项目打好基础。

另外,在小公司实习,你的觉得可以变得非常重要,因为公司人力资源不足,基本上把你当正式员工使。倘若你足够优秀,你的角色可能比一些正式员工还重要。因此选择一个小公司实习,也有其优势所在。

 

关于就业,一般毕业生都倾向于选择大公司。不过敢于选择小公司甚至创业型公司,既是对自己的一种冒险,又会给自己进行适当施压,这样在刚毕业的一两年中,可以更加投入到工作中,可能受益也不见得比到大公司小。

 

倘若之前曾经在小公司实习过,并且担任过相对重要的角色,那么找工作的时候便不必太急,先给自己打好更扎实的基础,毕业前便可以为找一份工作做更充足的准备。

 

各位刚刚开始自己的研究生生活,一切都将是那么的美好。笔者祝愿看过本文的同学,都能够在研究生阶段,学有所成,等到快毕业的时候,都能找到一份满意的工作。