当前位置

qyb的博客

新员工培训——搜狐介绍

周四,也就是第一天的课程是公司介绍,目的是让员工对公司的各大业务线有一个基本的了解,还有就是和所有人都有紧密关系的服务部门也做详细解说,特别是 HR 和 ES/admin,整个上午的半天都是在讲这两个部门的工作流程。

一、搜狐业务

按收入来源说,搜狐的业务线分为:广告、游戏、无线

游戏分成游戏运营、RPG开发、休闲游戏开发三个子部门;无线增值的业务大家都很熟悉

广告现在是分为面向大企业大广告主的 Content 业务,以及面向中小企业的搜索业务。17173、focus、chinaren、乃至邮件等应该算前一种的;go2map 现在被归入后一种业务。不过最近 chinaren 似乎被划归王小川管,难道意味着 chinaren 日后的广告业务会和搜索靠拢??(另外还有一个可能,不过只能想不能说,嘻嘻)

对于内容/Content业务来说纵向上是设计(SAS)、市场、销售、编辑、CS(客服似乎涵盖了广告投放、PV分析、callcenter、QA等一系列工作)、技术(CMS,总体上看 club 也应该算是 CMS 的一部分,但我接触的 club.sohu.com 的技术人员和 CMS 没有直接从属关系)。从横向上来说内容也分好几块,除了 club 外,最近还新分出来的3个事业部——体育、娱乐、奥运,尤其是娱乐事业部还在培养自己的艺人!!!搜狐的内容业务真是我这种新员工所看不懂的啊.. hehe。

奥运事业部比较有趣,因为这可以说就是今明两年一锤子买卖的业务,来自奥运事业部的同事调侃说他们是“奥运失业部”。仔细一想会发现虽然奥运的政治意义大于商业意义,可是奥运官方网站的建设还是很有技术难度的——全球24小时不间断访问,五门语言(现在正在紧急招募会西班牙语、阿拉伯语的人才),多个赛场实时比分同步...要克服很大困难才能做出一个好的官网。当年清华的王浩老师说起参与北京亚运会的 IT 建设,自豪之情溢于言表。虽然我一直认为这个北京奥运会极其无聊,但若是有参加相关的工程项目的机会,还是很吸引我的。

研发中心和搜狗互为表里,搜狗有自己的销售和渠道市场部门。除了 go2map 外,研发中心包括两大产品:搜索产品、桌面产品。

二、支持部门

从培训内容来看,搜狐的支持部门包括 HR、ES、Tech-NO、LEGAL、FINANCE、IA、MIS 等。

HR 的工作包括三部分:员工控制和服务;企业管理运营的顾问,以及推进变革(在购并或者裁员的话就需要了);业务线合作,就是说从HR方面支持各个部门的工作。
HR 分成两部分:CorpHR 和 BizHR。所谓 BizHR 就是和业务线专职的 HR,比如负责技术人员的田春,印象最深刻的是面试我的时候说她能叫出搜狐所有技术部门人员的名字,BizHR 一共是 7 个人。CorpHR 也分三个部门:一个是负责薪酬的部门,一个是负责招聘渠道,一个是负责员工培训和员工关系。

搜狐的社保基数上限是前一年北京市平均工资的三倍,06 年的基数上限大约是 8k 出头(我觉得应该不属于机密信息吧)。五险一金里个人共负担 20%,除此外搜狐还免费提供商业的补充医疗保险以及一份人生意外伤害险。

津贴通常只是午餐津贴,每月400,从老张开始人人有份。长期出差的人有另外的津贴待遇,目前似乎只有那些在各个省移动做业务的才有。

搜狐的奖金政策是:业务线有业务线的奖金,销售部门有提成奖,其他部门则是 PM 奖。

由于现在股票价格比较稳定,期权已经没有什么吸引力,搜狐现在改成 RSU(限制性股票单元),可以看作是零授予价格的期权。但现在要拿 RSU 需要很强的背景才有了,xjb 时代似乎是新员工或多或少总会有一些的。

经理没有加班费。员工的加班费为周六、日每天200;周一至周五八点以后的加班用餐票、的票来补,餐费30上限,车费40上限;节假日的加班费算法举例:初一到初三200x3,初四到初七200x2

说到经理,据俺个人的猜测和分析:搜狐似乎是 5 级(含)以上算是那种无加班费的经理;7、8级为(高级)总监;9,10级为(高级)VP;11级属于核心管理层——目前只有一位CFO;12级是金字塔的顶尖张朝阳博士。

这里说的都是员工手册上没有涵盖的内容,仅供参考。其实员工手册里面的信息已经非常详尽,我也非常不明白为什么不对公众披露,比如提供一个 PDF 版本供下载,hoho

说了半天 HR,下面各个部门的介绍就简单多了

ES(行政部)分成4个小组:资产小组——包括入职领取计算机、IP电话就是从这里库房取到的;物业小组——负责协调大楼物业,内部物业等,当时我想到的是《人件》里描述的家具警察;差旅小组——负责公司的商务差旅;最后是新分离出来的客服小组,如果对 ES 工作流程不熟悉的话可以统一找客服小组帮忙,另外前台也属于客服小组。

Tech-NO 我已经很熟悉了,就在旁边,交流也多,还都属于 KCN 的管理。Tech-NO 分成值班组——专门蹲机房,接受新机器,很辛苦;系统组——安全、调优等;网络组——公司所有网络设备,和IDC机房的接口,公司、机房、分公司之间的内网连接,IP、网络流量管理;DBA,这个比较容易理解;还有一些不是特别容易划分的职责,包括备份、PV、DNS、采购、TechNO内部IT系统维护等等

MIS 是内部的 IT HelpDesk 部门,包括 sohu-inc.com 邮箱、IP 电话、设备维修更换、办公耗材、甚至做了一个会议室预定系统. hehe。似乎最近也归 KCN,和 Tech-NO 一起合作。

LEGAL 的准备其实很充分,很精彩。可惜是下午的第一堂课,我非常困.. 只是记下了目前这个部门一共七位律师,一个助理。

所有的商务合同都必须一式四份,除了 LEGAL 要留底外,FINANCE 也需要留底。FINANCE 反复强调预算的重要性,任何费用都要事先填写 PR 单。介绍者最后拿出一个表格出来,讲解什么样级别的人可以批准什么样费用标准的 PR 单。

严格来说 IA(内部审计)部门和公司直接运营没有任何关系,这个部门的存在是为了符合 SO404 的要求。部门的最终领导/负责对象是董事会任命的审计委员会,和搜狐管理层没有任何关系。哪天如果发现 Charles 有贪污行为可以去告发他,呵呵。SO404 规定如果高管未尽职责而确认了会误导投资者的文件,将受到1M美元罚款,直至10年的监禁;如果是蓄意误导投资者,将面临5M处罚直至20年的监禁。

本来课程计划里还有 CS 部分的介绍的,因为时间因素就取消了,小小遗憾一下。

最后从 ES 那里获得一个消息,威新大厦将被更名为搜狐网络大厦(或搜狐国际网络大厦),回来搜索了一下,报导还不少

目前的分布是:
8层 CallCenter、QA、GameOper、Sports、Entertainment
9层 sogou、go2map
10层 wireless、ES、MIS
11层 Olympic、游戏研发、TechNO、CPC、ChinaRen、Club、CMS 的技术人员
12层 Content、SAS、Marketing
15层 Focus、HR、LEGAL、FINANCE、销售?管理层
除此外在华清嘉园还有一部分人,上海、广州、福州有分公司,每个省有移动增值业务相关的人员

机房情况为:
最大的是皂君庙机房,将近 2k 台
其次是电信兆维机房
网通土城机房
赛尔的教育网机房
移动和联通的机房——做移动增值业务
GAME 全国各地都有分区服务器
天津、上海、成都、广州、南京等地有静态 HTML 发布镜像
威海、杭州、南通等地也有做视频加速的机房

Topic: 

"似是故人来"

周三在搜狐碰到一位故人,搜狐RD测试部的头头,罗学超。

其实我和她彼此对人都没有什么印象,只是说起我是来自亿邮的时候,她恍然大悟的说起她以前接触过亿邮的人:她的第一份测试工作就是在"renren"测亿邮的邮件系统,那是2000年的事情了。然后她还补充说当时来测试的是两个人。

我激动万分,那可不就是屠敏和我么。那时候可真算是两大帅哥哦,不过现在都是人老珠黄了。

罗MM还记得俺们的CTO李勇先生,估计主要是和两大帅哥的反差太强烈了,所以印象也很深刻... //grin

附: 替老朋友做个广告,测试部门很缺人,欢迎加盟。据她说搜狐的测试是几大门户里面最好的,姑妄信之。

Topic: 

俺也回来了

过了三天没有泡网的日子。

周四、周五、周六参加新员工培训,周四、五是在十五层的四海会议室,周六是参加一个拓展训练。正是项目最紧张的时候,前两天培训的时候每当有休息时间,我就赶紧冲回办公室,检查我们部门和其他业务部门的进度情况。周四晚上还别人都下班了还得回复并撰写一堆 email。周六晚上打开 bloglines,顿时发现三天时间积攒了好多好多的 feeds,硬着头皮看下来......找两条有意思的吧:

1. 云风也开始讨论用户身份认证方案。内容没有什么,倒是回复中有人提到多服务 SSO (single sign on) 的标准解决方案是用 kerberos。其它解决方案也是用 kerberos 的模型,日后有时间学习学习 kerberos

2. 最新的一期 Firefox trunk build 增加了好多特性。Trunk 版本自从 Win32 加入 Cairo 后我基本上就天天用了;办公室的系统由于 FireBug 还不完全支持 trunk (无法在 console 中输入命令),所以最近一直在用 2.0。不过总体来说 trunk 的可用性稳定性和正式版没有什么区别,没事可以考虑装个试试看,不过还是应该创建一个和正式版不一样的 profile。

Topic: 

使用 httplib 而不是 urllib/urllib2

决定写一个 python 脚本来定时检查用户登录是否好用,本打算使用以前用过的 urllib2 模块的——qyt同志和我曾合力写了一个脚本从网站上爬数据,追踪我妈购买的三支股票的情况,结果发现并不那么合适。因为挂在 passport.sohu.com 这个域名下的机器有多台,urllib2 无法分布通过不同的内部 IP 进行连接。

在 CHM 里面搜索了一番,找到了 httplib。首先用 HTTPSConnection(host) 指定连接的目标,然后就可以发送 request 了;另外它也支持 https。

另外要注意的是 httplib 缺省是阻塞无超时机制的 socket 连接。使用之前需要

  1. import socket
  2. socket.setdefaulttimeout(5.0)
Topic: 

尝试了一下 Python for S60

两个月前就在我的 3650 上安装了 Python for S60 1.2,不过一直很忙没有时间尝试写个脚本玩玩。因为 PuTTY 刚发布的最新版本 0.59 加入了串口支持,所以今天通过蓝牙连上手机上的 Python Console 跑了几行代码。

WinXP SP2 缺省的 Native Bluetooth 驱动连接 S60 后会安装 2 个串口,一个 Outgoing 一个 Incoming。用 PuTTY 连接 Incoming 的串口,然后在手机上运行 Python 后执行 "Bluetooth console" 就可以进入 PuTTY 的终端界面了。

最新的 Python S60 已经不再从 Nokia 网站上下载了,而是 sf.net。对于我的 3650 来说(相同平台的包括 N-Gage 等),仅有 1.3.1 可以使用,从 S60 2nd 开始最新的 Python S60 就都可以用了。

Python S60 似乎只支持几种 Unicode 的编码,所幸 PuTTY 可以使用 UTF-8;不过 PuTTY 0.59 刚刚支持串口,似乎还有很多 bug,动不动就崩溃掉。

仿造教程写了一个脚本,看起来运行很正常,呵呵。

  1. import contacts
  2. import time
  3.  
  4. db = contacts.open()
  5. for i in db:
  6.     contact = db[i]
  7.     title = contact.title.encode('utf8')
  8.     last_modified = time.strftime('%X, %x', time.gmtime(contact.last_modified))
  9.     print contact.id, title, last_modified

FireBug 1.0 !

这个月三个重量级的产品发布了新的里程碑:jQuery 1.1,prototype 1.5,然后就是 FireBug 1.0

其实我也就是最近才偶尔用用 FireBug,不过还是觉得这玩艺深深改变了以往调试 JS 程序的方式。Internet Explorer Developer Toolbar 好不容易赶上了 DOM Inspector + Web Developer 的功能,但又远远被 FireBug 落在了身后。

如果有工夫的话,倒是想着利用 python 给 IE 做一个开发用的插件,实现 HTTP Watch 的功能

Topic: 

Apache2 Module 开发后记

没有接触 Apache Module 开发的人可能觉得这是一个很深奥的事情,其实对于有一定经验的人来说还是挺简单的。当然最好是有这么一个环境,一些"SMTH系"的人的 blog 时常会提到什么什么时候又写了一个 Apache Module,语气犹如吃饭睡觉一样稀松平常;深受清华影响的 SOHU 也是如此,动辄就会有个人跳出来和你讨论某样业务如果用 Apache Module 来实现会如何如何,久而久之,就会在思维深处认为写 Apache Module 简直是天经地义。

1. 最通常的用法就是 ap_hook_handler. 这里是 http request 处理的最后时期。而且注册的所有的 handler 都会执行一遍。我做的模块的最核心的流程就是在某些条件下增加一个 HTTP Header 交给最终的内容处理引擎(比如JSP/PHP之类);以及设置一个 Response HTTP Header 项,当 Apache 开始向浏览器返回 Response 的时候,会把我这里添加的项目也输出出去。

2. ap_hook_handler 会应用于所有的请求,有些时候会显得效率有些低——比如对静态文件就没有必要执行额外的处理,这时候用 input_filter 可能会比较好。通过 AddInputFilter 可以设定对某些 Directory/Location 才执行对应的 filter 操作。不过据说 filter 应用也有一些效率问题,需要做详细的 benchmark 才能有结论。

input_filter 的另一个用途就是保持长连接,比如 webim 就可以通过这个方式来实现 Server 端的业务。

3. post_config 阶段可以用来检查运行模块所需要的参数是否都在 httpd.conf 里面被正确配置了。不知道 Apache 的人出于什么样阴暗的心理,post_config 会被执行两次!?这里有人提出了解决方案,如何确保自己的代码只运行一次,而不至于在 error_log 里面留下连续两行同样的LOG如同可笑的弱智bug。

由于我写的这个模块将会被部署到很多台很多台服务器上,万一哪天需要更换模块就需要找出所有部署的系统进行更新。于是每次 Apache 启动后会向一台中央服务器发送一条记录,通知该服务器维护人员的联系方式。这个流程也放在 post_config 阶段,此时 Apache 还没有 spawn 子进程,如果连接并发送记录花很长时间的话会影响 Apache 的正常服务。通常的思维是发 UDP 包出来,但这样的话需要额外写一个 UDP Server 接受它们,于是我在模块里面无耻的 fork 出一个子进程,利用 APR 提供的 socket 函数,大概 10 几行代码就搞定一次 HTTP 请求,然后马上 exit

Topic: 

openssl speed

使用 openssl speed [value] 可以测试某项算法的执行速度。

可以直接执行 openssl speed rsa,让他依次去计算 512bit、1024bit、2048bit、4096bit 的效率;也可以单独执行 openssl speed rsa512 来算。

在 PIII 700 上的结果为

                  sign    verify    sign/s verify/s
rsa  512 bits   0.0021s   0.0002s    475.4   5199.0
rsa 1024 bits   0.0102s   0.0005s     97.7   1883.4
rsa 2048 bits   0.0592s   0.0017s     16.9    582.2
rsa 4096 bits   0.3912s   0.0055s      2.6    181.9

speed 参数还支持 -multi n 参数来进行并发操作。在 PIII 700 双CPU 情况下并不是成倍增长,很奇怪。不过可能因为那台机器当时还有其他负载的缘故。

按照《应用密码学》里的建议(Applied Cryptography),2007 年企业应用应该考虑 1536bit,但 openssl speed 不支持1536bit的benchmark,于是自己写了一个程序来计算效率。

  1. /*
  2.  * openssl genrsa -out rsa1536.key 1536
  3.  * openssl rsa -pubout < rsa1536.key > rsa1536.pub
  4.  * gcc -o benchmark benchmark.c -lcrypto
  5.  *
  6.  */
  7. #include <unistd.h>
  8. #include <signal.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <openssl/rsa.h>
  12. #include <openssl/pem.h>
  13.  
  14. int global_flag = 0;
  15. void signal_alrm(int sig)
  16. {
  17.     global_flag = 1;
  18. }
  19.  
  20. int main(int argc, char *argv[])
  21. {
  22.     char *buf;
  23.     int size, ret;
  24.     FILE *pubfp;
  25.     FILE *prifp;
  26.     RSA *pub;
  27.     RSA *pri;
  28.     int i;
  29.  
  30.     OpenSSL_add_all_algorithms();
  31.     ERR_load_crypto_strings();
  32.  
  33.     pubfp = fopen("rsa1536.pub", "r");
  34.     prifp = fopen("rsa1536.key", "r");
  35.     pub = (RSA *)PEM_read_RSA_PUBKEY(pubfp, NULL, NULL, NULL);
  36.     pri = (RSA *)PEM_read_RSAPrivateKey(prifp, NULL, NULL, NULL);
  37.     fclose(pubfp);
  38.     fclose(prifp);
  39.  
  40.     if (pri == NULL) {
  41.         printf("PEM_read_RSAPrivateKey error\n");
  42.         ERR_print_errors_fp(stderr);
  43.         return 1;
  44.     } else if (pub == NULL) {
  45.         printf("PEM_read_RSA_PUBKEY error\n");
  46.         ERR_print_errors_fp(stderr);
  47.         RSA_free(pub);
  48.         return 1;
  49.     }
  50.  
  51.     size = RSA_size(pri);
  52.     buf = (char *)malloc(size);
  53.  
  54.     signal(SIGALRM, signal_alrm);
  55.     alarm(10);
  56.     i = global_flag = 0;
  57.     while (1) {
  58.         if (0 == RSA_sign(NID_md5, "0123456789abcdef", 16, buf, &ret, pri)) {
  59.             printf("RSA_sign error\n");
  60.             ERR_print_errors_fp(stderr);
  61.             free(buf); RSA_free(pub); RSA_free(pri);
  62.             return 1;
  63.         }
  64.         i++;
  65.         if (global_flag) break;
  66.     }
  67.     printf("RSA_sign: %d\n", i);
  68.  
  69.     i = global_flag = 0;
  70.     alarm(10);
  71.     while (1) {
  72.         if (0 == RSA_verify(NID_md5, "0123456789abcdef", 16, buf, ret, pub)) {
  73.             printf("RSA_verify error\n");
  74.             ERR_print_errors_fp(stderr);
  75.             free(buf); RSA_free(pub); RSA_free(pri);
  76.             return 1;
  77.         }
  78.         i++;
  79.         if (global_flag) break;
  80.     }
  81.     printf("RSA_verify: %d\n", i);
  82.  
  83.     free(buf); RSA_free(pub); RSA_free(pri);
  84.     return 0;
  85. }

10秒种内 sign/verify 一个长度为 16 位的字符串结果如下:
PIII 700 330/8680
XEON 2.4G 666/17034
XEON 3.0G 799/22633
XEON 5130/2.0G 1053/29154
感觉这样的效率还是不错的,需要在实际系统中进一步小心的验证。

还有就是 openssl 编译优化的问题。为了测试 ECC 的支持,我自己编译了 openssl-0.9.8。结果发现在计算 rsa512 的时候,我编译的 openssl(采取缺省configure) 比系统缺省的 openssl 慢了 10% (470 vs 420)。改了改config,可以提升到 450 左右,后来就没有再仔细琢磨下去。

最后用 openssl 0.9.8d 测试了一下 ECC 的签名校验效率(ECDSA),执行 openssl speed ecdsa (PIII 700)

                              sign    verify    sign/s verify/s
 160 bit ecdsa (secp160r1)  0.0013s   0.0061s    786.1    162.9
 192 bit ecdsa (nistp192)   0.0013s   0.0062s    774.7    160.4
 224 bit ecdsa (nistp224)   0.0016s   0.0079s    616.5    126.4
 256 bit ecdsa (nistp256)   0.0020s   0.0101s    503.8     99.0
 384 bit ecdsa (nistp384)   0.0046s   0.0249s    218.5     40.1
 521 bit ecdsa (nistp521)   0.0097s   0.0519s    103.0     19.3
 163 bit ecdsa (nistk163)   0.0046s   0.0125s    219.8     80.3
 233 bit ecdsa (nistk233)   0.0090s   0.0240s    110.7     41.6
 283 bit ecdsa (nistk283)   0.0140s   0.0447s     71.5     22.4
 409 bit ecdsa (nistk409)   0.0315s   0.1063s     31.7      9.4
 571 bit ecdsa (nistk571)   0.0705s   0.2507s     14.2      4.0
 163 bit ecdsa (nistb163)   0.0046s   0.0133s    218.8     74.9
 233 bit ecdsa (nistb233)   0.0091s   0.0268s    110.3     37.3
 283 bit ecdsa (nistb283)   0.0141s   0.0506s     71.2     19.8
 409 bit ecdsa (nistb409)   0.0316s   0.1224s     31.7      8.2
 571 bit ecdsa (nistb571)   0.0704s   0.2877s     14.2      3.5

签名速度还可以,就是校验速度慢死了..

Topic: 
订阅 RSS - qyb的博客