早在两个月之前就想写一篇blog了,为了记录自己和大家分享两场面试的那种兴奋而又失落的心情,但又怕那样的经历登不了大雅之堂,所以一直逼到现在,不过最近经过一段时间的思考沉淀,总算找到了一些让自己充实和关注的事情,这些日子规律而简单,坚持而快乐,思考着,行动着。不在为上班闲而无聊,不在为工作而工作,不在为没收获感而想跳槽,气定神闲,就这样,挺好!
这篇日志大体上我划分了下面几个大纲:
一、面试经历
二、个人反思和觉悟
三、闲着自己弄一个网站
四、在选用数据库之间做了艰难的决定
五、改写一个开源的Crawler项目收录网络小说
六、用Lucene.net作为索引工具的一些心得
七、网站上线一周收录引擎不搭理重写网站URL
八、对网站定时数据库索引和定时sitemap
该文章有点长,主要讲述这段时间的经历,涉及到的技术都只是点到,关于具体的实现后面的文章会慢慢概述。
早在十月份开始,十一收假回来,有了想换工作的想法,不是公司没前途,不是领导不好相处,不是同事不友善,而是自己就莫名的想换个环境,于是英才网上更新了下简历,间间断断的收到一些公司的HR电话,经过了一些正面了解和侧面打听之后回复了两家公司,首先是新蛋网络,其次是InfoSys,涉及到职业道德的问题,我不会直面写下两家公司涉及到的笔试题,如果不小心爆料了那些不该爆料的细节问题,还请见谅我的不小心。
新蛋网络是美国的的电子商务公司,在上海这边经营newegg.cn中国市场,同时技术部支持美国那边的newegg.com的项目,而我要面试的部门就是支持美国那边的newegg.com项目,比约定时间提前了十几分钟进入他们的办公大楼,前台让我到大厅等候,坐下没几分中,观看了下周围,很多会议室,漂亮妹妹很多,正准备开会的,人来人往,这一层应该是主要是市场部门和销售部门的,像个集市,谈合同的,打电话的,闲得整个接待大厅没那么安静和本分,没一会儿时间,我被一个人事部的MM带到了下面一层,做了些简单的交代之后把我带进了一间会议室,给了我一份试卷,这是笔试,我已经习惯了这样的流程,我大概翻了下题量的页数,问她多长时间完成,她说题目分两个部分,一个是非技能题,类似于那种“一个袋子里有黑、黄、蓝三种颜色的球无数,问至少拿出多少个才能保证有两个相同颜色的球”,另一个就是技能题,会比一些概念题稍微难点,要求一个小时之内完成。对笔试我有一个习惯:一是确定时间,二是把所有的题目先过一遍,大概确定下自己把所有的题做完需要的时间,如果题目是那种变态的基本上答不上来,或者能做得题低于60%,我会直接告诉HR,我不适合,不浪费彼此的时间,然后灰溜溜的拍拍屁股带着几分不屑离开,如果题目比较合意,一般会在半个小时到三刻钟之间把试卷交出去,题目编排还是比较合理的,层次比较分明,有基础概念题,有前端JS,CSS,HTML的题,有数据库的题,有设计题,画流程图、画UML图,有代码逻辑和代码优雅程度测试题,涉及的面比较广,而且题量还不大,整个做下来除了一个SQL的题没做之外,其他的基本上把意思表达出来了,那个SQL题没做出来是因为我觉得做了也达不到出题人的意图,它的意思是有两张表的结果完全相同,请查出两张表不同的记录,当时我就觉得要么是有这种记忆性语法的SQL语句,否则的话是会涉及到算法的东西。这方面的SQL我是见过,如果用算法去实现呢,它就不是一条SQL语句的事情,所以我放弃。
意料之中的进入到了面谈阶段,来了一个微胖界的小伙,看上去很年轻,带眼镜,面带笑容(这点我非常喜欢,让我觉得没多大的距离感),我一边作自我介绍,他一边看我的笔试题目,时不时对我简历中的一些项目提一些简短的问题,我都做了轻松的应答,不经意中他说他家是山东的,我在济南上的大学,两个人都情不自禁的有了亲切的感觉,我问他在这边还吃馒头吃蒜不,他说基本上还是习惯吃米饭了,我说我反而习惯吃馒头面条了,我看他时不时在我题目的答案后面给评分,并在自己的面试卡每条后面写评语,他问了我一些http协议,网络安全,防刷票方面的一些解决方案,对于这些因为以前都经历过,所以很自然的答上几条来,他时不时会意一笑,让我感觉很轻松,最后他说他要了解的已经掌握了,让我等一下,他去找他主管领导来面一下,不一会儿来了一个皮肤比较白嫩的领导模样的人,我还是简单的自我介绍,谈了我的工作经历,我的项目经历,我现在的工作情况,以及想换工作的原因,他时不时带着一些英语腔调,问了我好几个问题,举一些案例,让我给解决方案,我能答上来的就没松懈,不了解的直接说这个问题不了解。他很满意,说我比较自信,沟通起来不回避他问题,给我介绍了现在部门的情况,项目的情况,最后问我的期望值,最后他说了句OK,他去找人事跟我谈一下。不一会儿,来了一个MM,一边看我简历,一边说工作三年了,怎么想换工作?我说想了解电子商务,想积累更成熟的技术,想找一份更有价值感的工作,她又问了工作三年怎么想到提这么高的待遇,我说一份付出一份收获,责任越大回报越大,我相信自己有这个能力要求这个待遇。她默默的点点头,跟我谈公司的福利,工会,保险,公积金,以及平常同事周末活动娱乐项目等,问我最快能什么时候入职,我当时心里想这事看来是成了,对她介绍的情况都认真的点头表示接受,后来谈体检,我说公司两个月前的体检报告可以不,她说没问题,最后要走的时候跟我说了句,对公司即将入职的新员工,人事部会做一个经历调查,这个是对每个同事都一样的,我说没关系,我等你们消息,她说会这一个星期之内给我通知的,就这样,面试结束,前前后后两个多小时,感觉很舒服,心里乐滋滋的赶地铁去了,回到家睡了一觉,醒来之后把这是都跟身边熟悉的人说了下,心里觉得这事应该是定下来了。
一个星期的等待,是煎熬的,让人郁闷的是在这种煎熬的等待之后却是一个失落的结果,那是内心确实痛苦的,一个星期之后我逼不着发邮件问了人事,人事的回复却是:你的面试结果是:待用人才。有一种被玩了得感觉。
接到InfoSys的面试通知后,带着几分踏实和期待来到公司,还是比约定好的时间提前了10几分钟,在保安处登记领了胸牌之后,人事一小姑娘带我进了一间会议室,简短的等待之后来了两个面试官,两个人看上去都挺年轻,说话却能给人一种踏实的感觉,给我影响是两个可靠的人,我很纳闷,我面试的技术,居然没有笔试?从提问的内容来看,我估计一个是负责技术的一个是负责职业规划的,两个人提问的口气都很有亲和力,没有那种非要考到你誓不罢休的雄气,其中在谈到我参与过的一个门户网站是,面试官顿时来了兴趣,让我谈了里面用到的架构,技术,以及部署情况,安全问题,性能问题一带而出,必要时还让我在黑板上画架构图,部署情况,业务逻辑情况等等,由于实际参与的,画起来也比较得心应手,逻辑也比较清晰,后面问了一些关于页面生命周期,Http协议,提供页面加载速度,改善页面用户体验方面的问题,对于我回答的每一个问题他都没接着追问而是微笑点头,另外一个则问了一些职业规划的问题,比如五年内自己有没有给自己一个预定的目标,想做到公司什么职位,或者有没有想换工作性质方面的问题,对于职业生涯的问题,我回答一般都比较现实并有几分消极,我说我没给自己规划多远,我只是想把自己职责范围的事做,做自己该做的事之后再做自己想做的事,很多事或许是水到渠成,想太远,太累。他又问了我为什么会想到来我们公司工作,我说我对公司的了解就是大公司,世界500强,在这样的公司会有更多技术的沉淀,有更多规范的积累,有更多优秀的人,我想跟优秀的人在一起,自己也会变得更优秀。两个人彼此确认了下是否还有要了解的之后,说让我等一会儿,然后出去了,过一会儿之后领我进来的人事MM进来了,带了一份卷子,说你面试通过了,做下这份卷子,题做得Ok的话就差不多了,我一看,两张卷子,正反面都有题,全是英文的,我问她多长时间,她说一个小时,我大概浏览了下题,我类个去的,他妈的没一个技能题,全是逻辑思维题,而且还是英文的,不过大部分都还认识,也就静下心做了起来,大概10几分钟之后,写了三四个题,这时,认识MM进来了,带着很诚恳的态度说,抱歉,刚刚沟通出现了点误会,面试官说你面试结果很OK,不用做题了,你面试通过了,等着人事会跟你沟通联系的,我问今天是不是到这里结束了,她说对的,人事接下来会联系你的,果然在两天后接到了人事的电话,说实话,有点紧张,不知道为什么,我明显感觉到自己声音在电话里有些颤抖,简单寒暄之后她说你现在的情况(主要指三年经验及恶劣的英语水平)公司可能给不了你要的待遇(在填写人事资料的时候填了),我问就公司现在的薪资制度能开到多少,她说估计要比你期望值少2K,简短的思考之后我说,考虑到年底了,加上年终奖和现在的待遇情况,我还是不能接受,她说你可以全方面的衡量下,你来公司了证明你是行得了,待遇是可以网上调,对这种空话我是听不进去的,在我坚持不能接受之后,她说她再去争取下主管部门的意见看看能不能申请下来,我说好,就这样结束了。
之后就不在有音讯,这两次面试,过程都比较好,结果都未如愿。
这两次面试是给我影响最深的,因为都让我心情跌荡起伏了,失无所失,有时候坏事未必就是坏事,我现在的工作也差不多那去,国企控股公司,事情少,上班可以听音乐,可以上网,轻松自在,一番的自我安慰之后,我确定了,换工作的事情过了年再考虑了。
然而对于我来说,我最怕的就是闲着,闲着思路就集中不起来,闲着会想一些不着边际的事情,闲着会觉得自己没价值感,闲着会逼坏的。
要不自己搞个网站,不知道那一瞬间的时候,脑海里有了这个念想,做什么样的网站呢,平常没事的时候同事都会看小说,我也有看,前端时间还看了《盘龙》,郁闷的是VIP章节都会到百度搜索免费得看,但是免费小说的广告真是一塌糊涂,一看就是垃圾站,但是现在免费小说网站多的是,要做点不一样的,于是我想到了定向搜索,如果一本小说在我的网站搜索,可以搜索出几十个免费小说网站的地址,按照更新速度排名,这样读者追着看得小说就能在第一时间找到那个网站有更新了,这样看小说就方便多了,确定之后就开始在网上收集资料,查找相关的东西,理清了思路,开始干了。
在确定做一个免费小说网站之后,得先想想域名的事,叫什么名字好呢,开始找之前一个朋友了解了,他是做空间域名代理的,我知道现在域名备案是件麻烦的事,所以问问他那边能帮忙便捷的给域名备案不,他给我发了一个域名备案需要准备的资料的一个文档,不看不知道,看了就不想搞,那么多资料要准备,是多麻烦的事儿啊,记得大学里自己搞一个博客,买了个域名直接在网上填了些资料,一个星期就审核通过了,现在要搞那些乱七八糟证件的复印件,头疼。无赖中,他给出了一个简单直接的招,找那种别人已经备案好了而没在用的老域名,我觉得这主意不错,于是他就给了我一批这样情况的域名,我去看着域名想名字,看上去顺眼的域名我就用搜狗输入法打这个域名的汉字看出来是什么,大体浏览一遍之后看了一个域名(tiyma.com)还比较简短,用搜狗打出来的汉字:体验码,心里一亮,就是它了,体验码小说网,于是就把这域名定了下来了,“体验码小说网,可能是最好的免费小说网站”,我给它的标题。
一直以来涉及到的项目用到的数据库中,oracle用的比较多一些,其次是MSSQL2000和MSSQL2005,有一些项目用到MySQL,所以对Oracle稍微比较熟,但是对我这种了解、及使用层次的人员来说,除了一些简单的查询语句的优化,索引的优化,T-SQL编写,存储过程编写之外,对数据库引擎的算法是一无所知,从操作上来说MSSQL都基本上是界面的,直接,不管是备份、还原、数据同步、分布式数据订阅操作都非常简单,Oracle从应用上来说,属于稍大点的企业级别解决方案采用,它本身对环境的要求就高,oracle服务启动起来就得占400多M的内存,所以如果在MSSQL和Oracle中来选择的话,我从应用级别来说我会毫不犹豫的选择MSSQL数据库,但是因为多了个MySQL,因为该小说网站去收录小说章节目录的时候会并发的往数据库中插入数据,曾经在一个项目中因为高频率的往数据库中读取数据,导致数据库占用系统内存一直不停的上升,而且停掉对数据库的一切操作之后,数据库占用的系统内存还是没降下来,这很难让我理解,为了确定到底在MySQL和MSSQL中选用那一个,我做了个测试,同事开启1000个线程往MySQL和MSSQL中写数据,以一个小时做为写数据的时间,测试中发现,MySQL占用内存到420多M之后到了一个顶峰值之后就没在上升,但是MSSQL到了700多M了还一直上升,有了这个数据了心里就有答案了,不假思索的就选择了MySQL数据库。
关于MySQL数据库的下载可以直接从MySQL官方网站:
http://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-5.5.17.0.msi/from/http://gd.tuwien.ac.at/db/mysql/
数据库操作工具可以从官网下载MySQL Workbench
http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-workbench-gpl-5.2.36-win32.msi/from/http://gd.tuwien.ac.at/db/mysql/
MySQL数据库的安装第一次使用多多少少会碰到一些问题,比如更改数据文件存放路径,默认是安装在C盘,还以一些环境变量的配置,每次手动更改My.ini文件之后都导致了MySQL服务启动不起来,反复卸载,反复的安装之后才把数据库环境搭建起来。
从网上看了一个老外写得蜘蛛爬虫程序,它用了socket下载url,用队列装载Url地址,下载了看了它源代码,你可以从这里下载看看:
http://www.codeproject.com/KB/IP/Crawler.aspx
觉得可以网这个项目改改作为我收录小说的工具,分析了小说站得结构,大致为列表页面、小说介绍页面、章节列表页面,章节内容页面(这张页面我不收录,否则一本小说几千个章节,一个章节算15k,是没有服务器资源来存储的),所以我需要解析章节列表页面,得到小说信息(只得到小说书名即可)从数据库判断下是否已经有该站点的该本小说,如果有,返回该小说的章节列表地址,如果没有,收录小说的介绍页面,解析小说信息,获取到小说章节列表地址,再收录小说章节列表页面,解析小说章节标题,把小说标题保存起来,下面是简单的逻辑图:
对于章节保存来说,一本小说可能有上千个章节,怎样来增量保存章节的信息,如果是一个没插入一个章节都判断下表里是否存在这个章节的话,那速度将会是非常慢得,那一本小说来说,这次收录是100个章节,并已经保存到数据库,下次收录可能是105个章节,就是说更新了5个章节,所以我们只要在插入之前获取该小说上次更新到的最后章节的章节名字,然后从这105个章节里找出更新了得5个章节直接插入数据库,那会是比较快的。MySQL有批量插入的方法,速度比较快。
对小说的章节,我把它分表来存储了,一个小说站点是一张表,为了以后操作的方便,做到没增加一个站点的配置就自动创建该站点的小说章节表。下面是我增加小说站点需要配置的信息截图:
细节的东西就不说了,来看看收录的效果:
现在一个站点2W多本小说,就基本上2个线程一个晚上就收录完,所以对小说更新能及时收录过来。
为了让读者更方便,更快捷的搜索自己想看的小说,我采用Lucene.net作为索引工具创建数据索引,读者可以根据小说名,作者名,一级分类,二级分类来检索小说信息,我想这应该是一个不错的选择。
关于Lucene.net简介和使用的文章可以在博客园搜搜看,很多园友已经写得很详细,Lucenet.net的SVN地址:
https://svn.apache.org/repos/asf/lucene/lucene.net/tags/
如果你装有SVN的话直接checkout就可以查看源代码或者直接使用其dll了,目前.net方面的最高版本是2.9.2,起初的思路是实时索引,即每收录到一本小说,就用Lucene.net提供的接口生产索引文件,更新一本小说也同时更新索引,但实际操作起来有两个问题,一个是在2.9.2这个版本下确实有增加索引,更新索引的方法,但是单个增加索引会很慢,更新索引我尝试了很多次,是不成功的,反而会销毁之前创建好得索引文件,所以后来就考虑有定时全库索引的方法了,这个根据数据量的大小,索引时间会有变化,不过定时索引时间一般在晚上进行,所以影响不大,看看我的定时索引工具:
我把它做成服务来定时执行,也可以手动去执行,生产索引动作。
网站上线一个星期,有了第一个忠实的读者,他是qq里的一个好友,我们不认识,就都因为是做技术的,给我提了很多好得建议,这里得感谢牛奶糖同学的支持,从上线一周来看,百度不收录,google收录比较少,soso稍微多点,因为小说章节比较多,就是爬虫来怕一本小说也得上千个地址,但是几个搜索引擎收录的地址都不超过一千,我想会不会章节地址没收录,会不会是地址Url的原因,于是想到用重写的方法来看看是不是有效果,于是我把
http://www.tiyma.com/book.aspx?siteid=5&bookid=23490小说地址改写成
http://www.tiyma.com/book/5/23490/ 这样的形式,这样爬虫应该会把它当一个新的地址去收录,而不会因为是同一个文件名而不收录。改造后上线第一晚上soso的收录量增加了1000多,感觉还是挺有收获感的。
具体重写的方法可以看看园子里这边文章:
http://www.cnblogs.com/notus/archive/2007/03/13/673222.html
由于我是影藏了后罪名的重写,所以需要在IIS上配置下,站点不对url文件是否存在做检查,具体配置步骤为:站点à属性à主目录à配置à通配符应用程序映射à插入,弹出的对话框中可执行文件选择C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ aspnet_isapi.dll,把下面的“确认文件是否存在的复选框的勾”去掉,确认就Ok。
为了让引导爬虫来收录网站小说信息,编写了相应的工具生产站点地图,一次生产50个站点地图,对我的站点来说:
http://www.tiyma.com/sitemap/sitemap.xml
……
http://www.tiyma.com/sitemap/sitemap50.xml
接下来就是向google提交站点地图,并编写相应的robots.txt文件告诉爬虫收录规则,
Http://www.tiyma.com/robots.txt 是我收录规则,内容比较简单,就根据google的站长工具想到生产的。
一口气写这么长得文章还是第一次,更多的技术实现会在以后的文章中写出来,太晚了,就这样草率的结束吧。