以大三本科生角度谈计算机学习:关于开源产品与学习书籍

来源:互联网 发布:淘宝购物车结算不了 编辑:程序博客网 时间:2024/06/06 07:36

 转载请注明出处:http://blog.csdn.net/zbf8441372

作为程序猿,除了技术书籍,我们还应该多读一些锻炼思维,甚至和心理学相关的书。

这篇文章写给现在的自己——作为阶段性总结和后续发展的指向标,也写给几年后的自己——当有一天我回过头来,看我这拙劣的文笔和幼稚的想法的时候,会不会忍俊不禁。

 

读者?

 

      这篇文章不适合科研型的人士,所以这里不会有数学,不会有算法的分析和讨论。只要你打算做的是Java开发者或者对开源技术有学习兴趣和热情,肯定有合你胃口的地方。欢迎大家线上线下的交流,提供我的qq邮箱369447122@qq.com(好吧,用qq邮箱的人弱爆了= =)

 

现在流行什么?

      对技术的接触,还仅半年,但我看到了很多东西。每当看到一些开源的产品和主流技术,都让我兴奋不已,甚至觉得为了学这些东西,连吃饭和睡觉都是在浪费时间。以下这些东西只是我狭隘的眼见所捕获到的。


      Hadoop:

    hadoop家族已经算不上一种新的技术了,现在用它的人非常多,我认为大数据时代下,hadoop必须是大家都热衷的一个大产品。主要的三大组员HDFS,MapReduce和Zookeeper,此外还有Hbase,Hive,Pig等等。《hadoop权威指南》一书对其各部分的介绍还是很基础的,推荐可以看看《Hadoop in action》以及《Pro Hadoop》。话说权威指南这套书好像不咋滴,in action这套才是王道(个人认为)。

     HDFS,MapReduce和Zookeeper三大利器,我相对熟一点的是Zookeeper。总之,阿里的一位架构师说,这三个东西,你要是都搞好了,那就打遍天下无敌手了!不仅仅是用用,深入剖析他的源代码,考虑他的设计和理念才是关键。HDFS是参照与Google的三驾马车之一的GFS而设计的吧,如果我没记混的话。MapReduce这种编程模式可以适用到许多经典的机器学习,数据挖掘算法,可以看看NIPS06年的一篇文章, Map-Reduce for Machine Learning on Multicore,介绍了LWLB, NB, GDA, k-means,PCA,EM,SVM等算法并行化的可行性。具体的,Apache的Mahout项目实现了机器学习算法的hadoop框架实现,具体可以看看《Mahout in action》一书。

        

      NoSQL:

      不要说现在已经不流行SQL了,因为no SQL了嘛。那我会喷血的。话说,一次听Peter Chen(ER图设计者)做报告的时候,竟然就是这么说的。我想说,这位大师怎么连NoSQL的概念都不知道?= =NoSQL家族配合分布式大数据的处理,为底层提供了更强大的支持。包括Hbase,MongoDB,Redis,Cassandra,CouchDB。哇,听上去就激动人心,对我诱惑力十足。只可惜到目前只是涉猎了一丁点,实在没有精力去仔细研读其中一个以及它的源代码。推荐http://blog.nosqlfan.com/newslist NoSQL fan的网站。里面的资料汇总非常不错,书籍也很多!

      不同的NoSQL适用不同的场合和环境。Hbase的列存储结合Mapreduce做分布式运算和中间结果存储巴拉巴拉。多说就说错话了,还得好好了解之。


      搜 索:

      搜索的时代可能快过去了。目前社交网站也许更火些。不过全文检索方面的Lucene这个东西,还是很有价值去学习的。《开发自己的搜索引擎 Lucene+Heritrix》是本好书,想好好学习呢,还是得读《lucene in action》。


      SOA:

      现在许多产品都是面向服务的概念。包括云计算。SOA的技术有很多,我熟的是OSGi框架。具体介绍可以关注淘宝林昊(国内OSGi先驱)的博客和他写的介绍OSGi的两本书。当然也有《OSGi in action》和更加深入的《OSGi in depth》。国内运用OSGi的人还是有一些的,他的设计理念是相当好的,关于他的介绍我之前的博客里也有,就不多扯啦。


      Node.js:
      国内,应该是淘宝内部部分员工在主推,了解不是很多,就参加过一次技术沙龙,知道了这个东西,不多说。


       云计算:

       现在什么都能和云扯上关系。微软的Azure云操作系统代表着微软对云的迈进。他也有自己的三驾马车。具体见我之前浅析Azure架构的文章。近日还看到,Azure上还要部署hadoop的东西,微软也加入了hadoop这个大家庭。


看什么书?

       好吧,我这么一个小白也敢来说看什么书,简直不知天高地厚。

       大家耳熟能详的一些书籍这里就不列举了,详见刘伟鹏的博客http://mindhacks.cn/2011/11/04/how-to-interview-a-person-for-two-years/ 中 “怎样花两年时间去面试一个人”一文。当时这篇文章是让我茅塞顿开的一篇博文,我也出于对其人的敬仰,拜读了《暗时间》一书,很让人有共鸣。推荐大家可以抽空读一读。


        听说面试微软前必看的十本书:   

               Code: The Hidden Language of Computer Hardware and Software (《编码的奥秘》)
               Computer System: A Programmer’s Perspective (《深入理解计算机系统》) / Windows via C/C++ (《Windows核心编程》 / 《程序员的自我修养》
               Code Complete 2(《代码大全》)/ The Pragmatic Programmer (《程序员修炼之道》,我也把这本书称为《代码小全》)
               Programming Pearls (《编程珠玑》) / Algorithms / Algorithm Design / 《编程之美》
               The C Programming Language
               The C++ Programming Language / Programming: Principles and Practice Using C++ / Accelerated C++
               The Structure and Interpretation of Computer Programs (《计算机程序的构造和解释》)
               Clean Code / Implementation Patterns
               Design Patterns (《设计模式》) / Agile Software Development, Principles, Patterns, and Practices
               Refactoring (《重构》)


       Head First系列从书都蛮不错的,阅读起来快,很快。推荐《Head first 设计模式》《Head first OOA&D》


       《重构》《设计模式》(推荐除了看那本薄薄的原版《设计模式》外,其他解释,进一步阐述这本书的设计模式书籍也许更有益,推荐清华大学出版社的《研磨 设计模式》,而且这本书是基于Java语言)这类书一定是必看的


       《编程珠玑》《代码之美》这类书还没看过,不过我会把这几本放到优先级比较低的地方。一来,有了实战积累再看;二来,不像《重构》《设计模式》看了之后可能没有显著性用处,个人认为。


       《编程之美》挺不错的,看起来像在做脑筋急转弯,哈哈。


        in action书籍和NoSQL的书以上或者下文还会提到,你感兴趣于那些方面,就去看那些书吧。(其实这部分我想强调的,就只有这一点~哈哈)


关注开源产品

       Apache系列的开源产品我关注过很多了,包括Karaf, Camel, ActiveMQ, Mahout, ServiceMix, ACE, Maven, Amdatu。给我最大的体会是,Apache这些东东,除了运用了最主流的一些技术,把他们变成大家都可以用的工具之外,各自的产品又嫁接在一起,形成一种技术产品的融合和互相搭建实现,让我赏心悦目!比如ServiceMix就是一个基于OSGi的大容器,是一个ESB(消息服务总线),他能容纳Camel,ActiveMQ(MQ中最热的产品之一,还有Storm中的ZeroMQ)这样的产品,形成一整套的东西。

       Storm(最近很火的感觉,以后有时间一定好好看看), Yahoo的S4(可能比较老了)

       MongoDB,Redis这样的就不说了,实在是太热了,NoSQL中必须得真正熟悉一个,我觉得。

 

基本功?

      应该具备哪些基本功?就从淘宝的Taojob上http://www.tbdata.org/about-us/departments对职位的基本要求和素质来看,我认为我们需要:

      1. java基础:J2EE各种技术和框架(包括JSP,Servlet,Spring,Hibernate,Structs2, EJB),js相关(Ext JS库,JSON,Ajax,Node.js, jquery,jvm内部实现(主要内存管理这块),设计模式和重构(实现低耦合,高内聚的模块化代码),分布式java编程和java并发编程,java core中java特性的东西(反射机制)
      2. 一种脚本语言:Python(万能语言不解释),javascript(在Unity3D下写过游戏的脚本,制作前台特效和网页上动态的东西)
      3. 网络知识:这里牵涉到linux环境下,对集群的管理和环境配置,网络的基础知识和操作系统知识是很有用的。《TCP/IP详解》也是必读的书
      4. 传统的RDBMS数据库要熟悉一种(如MySQL,熟读他的手册,特别关于他的拓展特性,比如和memcached的联系和嫁接),NoSQL也要熟悉一种,推荐MongoDB,Redis,Hbase(读过他们的源代码,知道每种NoSQL的特点和适用情境)
      5. 服务器(集群)配置、管理能力:至少得会服务器批量系统的安装,许多分布式环境的搭建
      6. 关注开源产品和新技术,我个人关注架构,搜集过包括facebook,Amazon,Taobao,支付宝,ebay,wiki,Twitter,MySpace,livejournal,Qcon,douban等等的架构发展情况和各类技术运用。我想做一位架构师,还会关注包括Qcon,infoQ(每月8号有月刊),GitHub,open-open。你可以没有用过这些东西,但是你不能没有听过thrift,Avro,memcached,Ehcache,NginX等等。真正新的东西还都是在论文中,凡是出书了的技术都是老的了。论文才是新技术的发源地。
      7. 各类数据挖掘/机器学习算法的(java)实现(参看DM工具weka的代码),并且参考用mapreduce实现(参看Apache Mahout),这是个Big Data时代。(每次都想起海贼王里的台词= =)

      8. vim或者Emacs编辑器熟用一种。不要停留在Notepad++之类的编辑器之上。vim是“编辑器之神”,而Emacs则是“神的编辑器”,强大的像一个操作系统。

      9. hadoop这快就不用说了,我觉得这是一个很好,很值得去学习的技能
      10. 全文搜索的lucene(很好上手,实用,可以直接使用包装过了的Compass框架)
      11. 耐心和恒心。我相信勤能补拙,我相信记录是最好的记忆方式。还有多跟读一些业界的著名人士的博文。每个公司核心团队成员的开发经历和开发经验。(好吧,我看的最多的是淘宝林昊的博客,谁叫他是国内OSGi的先驱者呢,其次就是刘伟鹏,哈哈,领悟到技术之外的好多东西,强烈推荐大家去学习学习~)

 

       就匆匆忙忙写了这么些,主要是给自己一个参考和监督,让自己更好地把握。微软笔试和考试周正在临近,很可惜,近期无法接触我喜爱的东西了,o(︶︿︶)o