九点整,办公室门被敲响。菲奥娜探头进来:“老板,要咖啡吗?”
    “两杯,黑咖啡。”凌云说。
    菲奥娜端进来两个白色马克杯,放下后离开,带上了门。
    凌云端起咖啡喝了一口,没加糖也没加奶。艾瑞克也喝了一口,然后继续翻看技术文件。
    “开发阶段分三期,”凌云走到白板前,指著右边那张空白日程表,“第一期,三个月,出核心框架。支持基本的http请求处理,静態文件服务,达到一万並发目標。”
    他在日程表上写下:
    phase 1 (12/15-3/15): 核心框架
    - 事件驱动模型
    - 基础http解析
    - 静態文件模块
    - 1万並发达標
    “第二期,”凌云继续写,“两个月,完善功能。加反向代理、负载均衡、日誌模块,达到五万並发。”
    phase 2 (3/16-5/15): 功能完善
    - 反向代理
    - 负载均衡
    - 访问日誌
    - 5万並发达標
    “第三期,一个月,优化和稳定。压测,调优,文档,准备发布。”
    phase 3 (5/16-6/15): 优化发布
    - 性能调优
    - 稳定性测试
    - 文档编写
    - 正式发布
    艾瑞克看著日程表,眉头微皱:“时间很紧,尤其是第一期,三个月要从零搭出框架,还要达到一万並发。光事件驱动模型和http解析,就至少需要两个月。”
    “所以需要抓紧时间。”凌云说,“项目组实行弹性工作制,但核心期晚上和周末可能要搭进去,奖金和期权会体现。”
    艾瑞克在笔记本上计算了一下:“如果按每天十小时,每周六天算……技术上可能,但人会很累。”
    “累就累三个月。”凌云说,“做成了,这个產品能定义未来十年的web伺服器市场。做不成,我们可能错过一个关键机会窗口。”
    艾瑞克没再反驳。他在日程表旁边写下几个关键日期:12/20 团队组建完成、1/15 原型演示、2/28 一期验收。
    “团队组成,”凌云回到办公桌,打开笔记本电脑,调出一张组织结构图,“总共十人。你负责整体架构和核心模块。下面分四个小组。”
    投影仪亮起,屏幕上显示:
    nexus 项目组 (20人)
    ├── 架构设计 (艾瑞克 + 1)
    ├── 事件与网络组 (8人)
    ├── http与模块组 (8人)
    ├── 测试与工具组 (2人)
    “事件与网络组负责事件驱动模型、tcp连接管理、內存池。”凌云用雷射笔点著屏幕,“http组负责协议解析、模块接口、反向代理。测试组写压测脚本、做性能分析、辅助调试。”
    艾瑞克盯著屏幕看了会儿:“人员分配你有建议吗?”
    “有。”凌云切换幻灯片,显示每个人名和背景,“事件组建议让戴维手下那个俄罗斯工程师负责,安德烈。他写过底层网络库。http组从星语团队调一个,熟悉协议。测试组新招。”
    “戴维会放人吗?”
    “已经谈过了。”凌云说,“安德烈下周转过来。”
    艾瑞克在笔记本上写下人名,並在旁边標註分组。写完他抬头:“开发环境呢?用什么工具链?”
    “统一用gcc,c语言,”凌云说,“代码风格参照linux內核,4空格缩进,k&r风格。版本控制用cvs,每天自动构建。测试伺服器已经订了,下周到货,双cpu,4g內存,够初期用了。”
    “文档標准?”
    “每个模块必须有设计文档,注释率不低於30%。接口文档用doxygen生成。用户手册单独写,要能让运维看懂。”
    艾瑞克记下。他翻到笔记本新的一页,画了一个简单的甘特图,把三个阶段的起止日期填进去,然后標出几个关键里程碑。
    “风险点,”他边画边说,“事件驱动模型的稳定性是最大的。如果事件循环出bug,整个伺服器会掛。需要大量测试。”
    “所以测试组要儘早介入,”凌云说,“让他们写自动化测试,覆盖边界情况。特別是高並发下的內存泄漏和文件描述符耗尽。”
    “性能调优怎么做?”
    “用oprofile採样,找热点函数。网络i/o用tcpdump抓包分析。关键路径的汇编代码要审查。”
    艾瑞克点头,在甘特图上標记了几个性能测试的时间点。
    办公室安静下来,只有艾瑞克写字的沙沙声,和窗外偶尔传来的汽车声。
    九点三十分,菲奥娜再次敲门:“老板,十点你有会,和暴雪的电话会议。”
    “知道了。”凌云说。
    艾瑞克合上笔记本,站起来:“我下午出详细的任务分解,明早发给你。”
    “好。”凌云也站起来,从桌上拿起一个u盘递给艾瑞克,“这里面有更详细的设计文档,还有我收集的一些论文,关於事件驱动和高並发架构。你有空看看。”
    艾瑞克接过u盘,插进口袋。
    “另外,”凌云说,“下周三开项目启动会,全体成员参加。你准备一下技术宣讲。”
    “明白。”
    艾瑞克走到门口,手放在门把上,又停住,回头:“老板。”
    凌云抬头。
    “这个项目,”艾瑞克说,“如果做成了,星辰系统在伺服器市场就有了一席之地。但如果失败了……”
    “不会失败。”凌云打断他。
    艾瑞克看著他,几秒钟后,点了点头,拉开门走了出去。
    办公室重新安静。凌云走到白板前,看著那张日程表。他拿起红笔,在“正式发布”旁边画了一个小小的星號。
    然后他擦掉白板上所有的字跡,只留下那个星號。
    窗外的阳光完全照进来了,在橡木地板上投出明亮的光斑。
    十点的电话会议,要跟暴雪谈战网扩容。他们等不了六个月,可能要求先用临时方案。
    临时方案……也许可以先做一个简化版,只处理长连接,撑过这几个月。
    他走回办公桌,打开笔记本,新建一个文档。標题:“nexus lite – 临时方案”。
    手指放在键盘上,停顿片刻,然后开始敲击。他想起后世那个叫nginx的伺服器。1997年,它还没诞生。它的作者,伊戈尔·赛索耶夫,现在可能还在俄罗斯某家公司写代码。
    但等不到2004年了。网际网路的发展速度比记忆中更快,需求已经冒头。谁先解决,谁就占住这个关键位置。
    他转身走回白板前,看著那六条开发目標。然后拿起红笔,在“高並发处理能力”下面划了两道横线。
    五万並发,只是开始。
    未来的网际网路,会有千万人在线同时抢购,会有亿级並发的消息推送,会有实时互动的全球直播。那个世界需要新的基础设施。
    而星辰要做的,就是提前把它建好。
    他擦掉白板上的所有字跡,收拾好自己的东西,离开会议室。
    走廊里,几个工程师正围在一起討论星际爭霸的战术,看到他,停下来打招呼。
    “凌总。”
    凌云点头,走过时停了一步:“艾瑞克在办公室吗?”
    “在,刚回来。”
    “让他半小时后到我办公室。带上內核组和网络组的人。”
    “好的。”
    凌云继续往前走,经过星语团队的区域时,他听见有人在抱怨:“apache又崩了,上午高峰期,掉了两百个连接。”
    “日誌报什么?”
    “內存不足,fork失败。”
    “得重启了。”
    “正在重启。”
    需求就在那里,真实,而且很迫切。
    现在,就要去解决了。