第5章
第一台Mac------------------------------------------,张伟正在打魔兽世界。,是在排队。2008年的魔兽世界服务器一如既往地烂,黄金时段排队动不动两小时起步。张伟盯着屏幕上“位置:2458”的数字发呆,听见门响,扭头看见陈燃抱着一个纸箱,满头大汗。“这什么东西?这么大一个箱子。Mac mini。”陈燃把箱子放在桌上,开始拆胶带。“麦……就是你说的那个苹果电脑?对。”,看着陈燃从箱子里拿出那台银白色的小主机。在2008年,苹果产品的设计领先同行至少一个时代。这台Mac mini虽然是一年前的旧款,但那简洁的铝合金外壳、那颗会亮的白色电源灯、背面整齐排列的接口,放在任何一台PC旁边都像是来自未来的产品。“**,”张伟伸手摸了摸机身,“这玩意儿是金属的?铝合金。得不少钱吧?三千二。”。“三千二?你花三千二买了这么个小盒子?这玩意能干啥?打游戏?能让你赚钱。”陈燃把主机放到桌面上,接上电源线和网线,然后犯了难。。,是刘洋的——他用来接笔记本电脑打游戏。王浩倒是有一台,但他那台是CRT的,又大又笨重,而且接口不匹配。
“张伟,你显示器借我用用。”
“我的?”张伟指了指自己桌上那台17寸的AOC,“我那台是VGA接口的,你这Mac能用吗?”
陈燃看了一下Mac mini的接口——DVI和Mini-DVI。他没有转接头。
2008年,一个DVI转VGA的转接头要卖三十多块钱。他不是买不起,但跑一趟电脑城又要花半天时间。
“算了,”陈燃说,“我先用远程桌面。”
他从书包里掏出自己的联想笔记本——一台大一入学时家里给买的神舟电脑,塑料壳子,自重快三公斤,散热口在底部,放腿上能烫出水泡。他开机,下载了一个VNC客户端,用网线把Mac mini和笔记本连到同一个路由器上,然后通过远程桌面连接Mac。
屏幕亮了。
Mac OS X 10.5 Leopard的欢迎动画出现在笔记本的屏幕上。一只Finder的笑脸图标,一条进度条,下面写着“正在启动您的Mac”。
张伟凑过来看。“这系统长得挺好看的。”
“嗯。”
“比Windows XP好看。”
“嗯。”
“你就能不能说个别的字?”
陈燃没理他。进度条走完了,进入桌面——蓝色的星空壁纸,底部的Dock栏上排着一排图标:Finder、Safari、Mail、iTunes、垃圾桶。
他深吸了一口气。
上辈子,他的第一台Mac也是二手的。2010年,他刚毕业,工资三千五,省吃俭用三个月在京东方买了一台二手Mac*ook Air。那台机子的屏幕有压痕,键盘有几个键不灵,但那是他第一次拥有属于自己的Mac。
他记得那一天。他把Mac*ook Air抱回出租屋,从晚上八点一直折腾到凌晨三点——装Xcode、配环境、写第一行iOS代码。
那时候他不知道,那台破电脑会陪伴他走过创业最初的日子,会在一次深夜加班时从桌上摔下来,屏幕碎了,但还能外接显示器用。它一直撑到公司A轮融资,陈燃才舍得换了一台新的。
现在,他捧着这台更旧、更慢、屏幕都没有的Mac mini,心里的感觉和上辈子一模一样。
——值了。
开机设置花了他快一个小时。系统是10.5.8,需要升级到10.5.8的最新补丁。Xcode 3.1.3的安装包有1.2个G,以2008年的网速,下载需要三个小时。
他点开了下载按钮,然后去食堂吃饭。
晚上八点,Xcode安装完成。
陈燃打开Xcode,看着那个经典的蓝**标和初始界面,觉得亲切得有些陌生。Xcode 3.1的界面和后来的Xcode 4、Xcode 5完全不同——没有story*oard,没有自动布局,没有ARC。Interface *uilder是独立的应用程序,和Xcode分开运行。
你要先写代码,然后在I*里拖控件,再通过Outlet把两者连接起来。
别说Swift了,连ARC都没有,内存管理全靠手动retain/release。
陈燃闭着眼睛都能写。
他新建了一个项目:基于View的应用程序,语言是O*jective-C。在2008年,还没有Swift,没有SwiftUI,每一个界面都要手写或者用I*拖。
他开始写FlamePop的iOS版本。
代码框架他早就想好了——一个主视图***,管理游戏网格、得分、计时器;一个自定义UIView,负责绘制火焰精灵和处理触摸事件;一个GameEngine类,封装消除逻辑、下落算法、连锁反应。
他把头一天晚上在笔记本上写的架构图展开,按图索骥,一行一行地翻译成代码。
敲键盘的声音在宿舍里响起来。
噼、噼、啪、啪、噼、噼、啪、啪。
不是打字,是弹奏。
陈燃的十个手指在键盘上飞,速度比宿舍里任何人都快。他不需要看键盘,不需要查文档,不需要考虑语法——O*jective-C的语法在他脑子里像肌肉记忆,一个类怎么写,一个方法怎么定义,内存管理怎么写,他闭着眼睛都能写对。
张伟在旁边看了一会儿,终于忍不住说话。
“你打字速度怎么这么快?”
“练的。”
“练了多久?”
“十四年。”
张伟以为他在开玩笑。
写到快十点的时候,陈燃遇到了第一个问题。
Mac mini的硬盘速度太慢了。
编译一次需要将近一分钟,运行模拟器需要再等三十秒。这对习惯了SSD和M1芯片的陈燃来说,简直是一种折磨。
上辈子,他的开发机是16寸Mac*ook Pro,M1 Max芯片,64G内存,2T SSD,编译一个中型项目只需要五秒钟。
现在,他坐在一把吱吱响的木头椅子上,面对一台转速5400转的机械硬盘,等着一行一行地编译。
但这也不全是坏事。
慢有慢的好处。编译跑不起来的时候,他会想得更仔细,写得更谨慎,尽量减少试错。
这让他想起上辈子刚入行时带他的老工程师说过的话:“代码不是跑出来的,是想出来的。跑得越快,想得越慢。”
那时候他不信。现在他信了。
写到凌晨一点,FlamePop的核心界面搭好了。
一个主游戏网格,4x4,每个格子是一个UI*utton。这是最简单粗暴的做法,性能不好,但够快。上辈子他做第一款游戏时也是这样干的,后来用户量大了才优化成了自定义绘制。
现在不用着急。先把产品做出来,再考虑优化。
陈燃把笔记本合上,揉了揉酸痛的眼睛。Xcode还在编译,进度条走到一半就不动了。他看了一下系统活动监视器——内存占用已经满了,CPU风扇在狂转,整台Mac mini烫得能煎鸡蛋。
这配置,放在2022年,连浏览器都开不动。
但在2008年,它就是他的超级计算机。
他站起来,伸了个懒腰。宿舍里的灯已经灭了,只有他的屏幕亮着,白色的光映在屋顶上。张伟已经睡了,刘洋和王浩也睡了,鼾声此起彼伏,像一首没有节奏的交响乐。
他爬**,躺下,闭上眼睛。
脑子里的代码还在跑。一个视图***的生命周期,viewDidLoad、viewWillAppear、dealloc。内存管理要小心,谁alloc谁release,不要造成循环引用。触摸事件怎么处理,touches*egan和touchesMoved的配合。
迷迷糊糊快要睡着的时候,手机震了。
他伸手摸过来,屏幕的白光照得他眯起眼睛。
是苏晚发来的短信。
"你今天怎么没来上大课?老师点名了。"
陈燃愣了一下。大课。*****基本原理。
他完全忘了。
不是因为重生后记忆力减退,而是因为他脑子里装的App Store、Mac mini、FlamePop太多了,根本装不下***。
他回复:"有事。老师说了什么?"
"说你旷课一次,扣平时分。你最好找老师解释一下。"
陈燃想了想。上辈子他从来不会旷课。他是不敢,他是太老实,他以为考勤分关系到绩点,绩点关系到奖学金,奖学金关系到简历,简历关系到前途。
现在他知道,这些都不重要。
但他还是回了:"知道了。谢谢。"
"没事。"苏晚的回复很快,"你的ACM选拔赛报名了吗?"
"报了。"
"那就好。晚安。"
"晚安。"
陈燃把手机放在枕头边,看着屋顶上那些被屏幕光照亮的裂缝。
苏晚在提醒他上课。
苏晚在督促他报名。
苏晚在关心他。
上辈子,这些事情也发生过。但那个陈燃没有注意到,或者说,他注意到了但没有勇气回应。
他觉得苏晚是天上的月亮,他是地上的泥巴。
现在他知道,月亮和泥巴之间,差的不是距离,是勇气。
他翻了个身,闭上眼睛。
这一夜,他做了一个梦。梦见自己站在纳斯达克的敲钟台上,手里拿着锤子,锤子下面是一个金色的按钮。他用力敲下去,钟声响起来,礼堂里所有人都站起来鼓掌。
他看见了张伟,穿着西装,笑得很开心。
他看见了林默,还是那副沉默寡言的样子,但眼角有泪光。
他看见了苏晚,穿着一条白色连衣裙,站在第一排,笑着看他。
然后他醒了。
屏幕还亮着,编译早就完成了,Xcode停留在“*uild Succeeded”的界面。
外面天已经快亮了,鸟在叫,食堂的烟囱冒着白烟。
新的一天开始了。
周五傍晚,陈燃终于把FlamePop的第一个可玩版本跑起来了。
不是模拟器,是真实设备——他借了张伟的iPod touch。
2008年的iPod touch是第二代,3.5寸屏幕,320x480分辨率,200万像素摄像头,没有GPS,没有陀螺仪,只有重力感应器。
但在2008年,这就是神机。
陈燃把游戏装进iPod touch的那一刻,手都在抖。
图标出现在屏幕上——他用Photoshop随手画的一个火焰图标,红黄渐变,中间一个白色的“F”字。图标的像素边缘有点锯齿,颜色饱和度太高,放在2022年会被设计师喷成筛子。
但那是他花了两个小时做出来的。
双击。
加载。
网格出现了。
四个颜色,十六个格子,动画流畅得不像是在2008年的设备上运行的。他用手指拖动一个红色火焰和旁边的**火焰交换,三个红色火焰连成一线,消除——嘭——一个小型的动画效果在屏幕上炸开,得分加了一百分。
张伟凑过来,眼睛都直了。
“这个动画效果怎么做的?”
“Core Ani**tion。”
“什么山?”
“苹果的动画框架。”
“你是说,苹果公司专门做了一个做动画的东西,让你们开发者用?”
“对。”
“免费?”
“对。”
张伟沉默了。他在魔兽世界里为了买一个飞行坐骑,攒了两个月的金币。现在有人告诉他,苹果公司免费提供了一套做动画的工具,让开发者做出这种效果,然后拿去卖钱。
“这东西……”张伟指着屏幕上的火焰,“我有点明白你为什么要借钱了。”
陈燃把iPod touch递给他。“你玩一局。”
张伟接过去,手指在屏幕上划来划去,三消、四消、五消,连击、加时、火焰风暴。他玩了一局又一局,每一局结束都会说“再来一局”。
六局之后,他抬头看陈燃。
“这游戏要是卖0.99美元,我会买。”
“真的?”
“真的。”张伟说,“比我玩过的所有****都好玩。不,比我玩过的所有小游戏都好玩的。”
陈燃笑了。
不是因为张伟的肯定。是因为他知道,张伟说的是实话。
但还有一句话他没有说出来:
——这还不是最好的版本。
等他把图形优化、加入音效、加入关卡、加**网排行榜,那才是真正的FlamePop。
现在这个版本,只是婴儿的第一步。
那天晚上,陈燃把那台Mac mini放在桌上,拍了张照片。
照片是模糊的,光线不好,构图也不专业。但他在照片下面写了一行字:
"我的第一台Mac。陪我打下江山。"
他把照片存在了一个叫“逆袭之路”的文件夹里。
然后关机,睡觉。
明天的任务更重:*ug修复、性能优化、图标重绘、应用截图、***分析、描述文案。
App Store不会自己上架。
钱不会自己飞进口袋。
他能做的,就是一行一行地写代码,一个*ug一个*ug地修,一步一个脚印地走下去。
就像他上辈子做的那样。
但这一次,他不会在中途倒下。
“张伟,你显示器借我用用。”
“我的?”张伟指了指自己桌上那台17寸的AOC,“我那台是VGA接口的,你这Mac能用吗?”
陈燃看了一下Mac mini的接口——DVI和Mini-DVI。他没有转接头。
2008年,一个DVI转VGA的转接头要卖三十多块钱。他不是买不起,但跑一趟电脑城又要花半天时间。
“算了,”陈燃说,“我先用远程桌面。”
他从书包里掏出自己的联想笔记本——一台大一入学时家里给买的神舟电脑,塑料壳子,自重快三公斤,散热口在底部,放腿上能烫出水泡。他开机,下载了一个VNC客户端,用网线把Mac mini和笔记本连到同一个路由器上,然后通过远程桌面连接Mac。
屏幕亮了。
Mac OS X 10.5 Leopard的欢迎动画出现在笔记本的屏幕上。一只Finder的笑脸图标,一条进度条,下面写着“正在启动您的Mac”。
张伟凑过来看。“这系统长得挺好看的。”
“嗯。”
“比Windows XP好看。”
“嗯。”
“你就能不能说个别的字?”
陈燃没理他。进度条走完了,进入桌面——蓝色的星空壁纸,底部的Dock栏上排着一排图标:Finder、Safari、Mail、iTunes、垃圾桶。
他深吸了一口气。
上辈子,他的第一台Mac也是二手的。2010年,他刚毕业,工资三千五,省吃俭用三个月在京东方买了一台二手Mac*ook Air。那台机子的屏幕有压痕,键盘有几个键不灵,但那是他第一次拥有属于自己的Mac。
他记得那一天。他把Mac*ook Air抱回出租屋,从晚上八点一直折腾到凌晨三点——装Xcode、配环境、写第一行iOS代码。
那时候他不知道,那台破电脑会陪伴他走过创业最初的日子,会在一次深夜加班时从桌上摔下来,屏幕碎了,但还能外接显示器用。它一直撑到公司A轮融资,陈燃才舍得换了一台新的。
现在,他捧着这台更旧、更慢、屏幕都没有的Mac mini,心里的感觉和上辈子一模一样。
——值了。
开机设置花了他快一个小时。系统是10.5.8,需要升级到10.5.8的最新补丁。Xcode 3.1.3的安装包有1.2个G,以2008年的网速,下载需要三个小时。
他点开了下载按钮,然后去食堂吃饭。
晚上八点,Xcode安装完成。
陈燃打开Xcode,看着那个经典的蓝**标和初始界面,觉得亲切得有些陌生。Xcode 3.1的界面和后来的Xcode 4、Xcode 5完全不同——没有story*oard,没有自动布局,没有ARC。Interface *uilder是独立的应用程序,和Xcode分开运行。
你要先写代码,然后在I*里拖控件,再通过Outlet把两者连接起来。
别说Swift了,连ARC都没有,内存管理全靠手动retain/release。
陈燃闭着眼睛都能写。
他新建了一个项目:基于View的应用程序,语言是O*jective-C。在2008年,还没有Swift,没有SwiftUI,每一个界面都要手写或者用I*拖。
他开始写FlamePop的iOS版本。
代码框架他早就想好了——一个主视图***,管理游戏网格、得分、计时器;一个自定义UIView,负责绘制火焰精灵和处理触摸事件;一个GameEngine类,封装消除逻辑、下落算法、连锁反应。
他把头一天晚上在笔记本上写的架构图展开,按图索骥,一行一行地翻译成代码。
敲键盘的声音在宿舍里响起来。
噼、噼、啪、啪、噼、噼、啪、啪。
不是打字,是弹奏。
陈燃的十个手指在键盘上飞,速度比宿舍里任何人都快。他不需要看键盘,不需要查文档,不需要考虑语法——O*jective-C的语法在他脑子里像肌肉记忆,一个类怎么写,一个方法怎么定义,内存管理怎么写,他闭着眼睛都能写对。
张伟在旁边看了一会儿,终于忍不住说话。
“你打字速度怎么这么快?”
“练的。”
“练了多久?”
“十四年。”
张伟以为他在开玩笑。
写到快十点的时候,陈燃遇到了第一个问题。
Mac mini的硬盘速度太慢了。
编译一次需要将近一分钟,运行模拟器需要再等三十秒。这对习惯了SSD和M1芯片的陈燃来说,简直是一种折磨。
上辈子,他的开发机是16寸Mac*ook Pro,M1 Max芯片,64G内存,2T SSD,编译一个中型项目只需要五秒钟。
现在,他坐在一把吱吱响的木头椅子上,面对一台转速5400转的机械硬盘,等着一行一行地编译。
但这也不全是坏事。
慢有慢的好处。编译跑不起来的时候,他会想得更仔细,写得更谨慎,尽量减少试错。
这让他想起上辈子刚入行时带他的老工程师说过的话:“代码不是跑出来的,是想出来的。跑得越快,想得越慢。”
那时候他不信。现在他信了。
写到凌晨一点,FlamePop的核心界面搭好了。
一个主游戏网格,4x4,每个格子是一个UI*utton。这是最简单粗暴的做法,性能不好,但够快。上辈子他做第一款游戏时也是这样干的,后来用户量大了才优化成了自定义绘制。
现在不用着急。先把产品做出来,再考虑优化。
陈燃把笔记本合上,揉了揉酸痛的眼睛。Xcode还在编译,进度条走到一半就不动了。他看了一下系统活动监视器——内存占用已经满了,CPU风扇在狂转,整台Mac mini烫得能煎鸡蛋。
这配置,放在2022年,连浏览器都开不动。
但在2008年,它就是他的超级计算机。
他站起来,伸了个懒腰。宿舍里的灯已经灭了,只有他的屏幕亮着,白色的光映在屋顶上。张伟已经睡了,刘洋和王浩也睡了,鼾声此起彼伏,像一首没有节奏的交响乐。
他爬**,躺下,闭上眼睛。
脑子里的代码还在跑。一个视图***的生命周期,viewDidLoad、viewWillAppear、dealloc。内存管理要小心,谁alloc谁release,不要造成循环引用。触摸事件怎么处理,touches*egan和touchesMoved的配合。
迷迷糊糊快要睡着的时候,手机震了。
他伸手摸过来,屏幕的白光照得他眯起眼睛。
是苏晚发来的短信。
"你今天怎么没来上大课?老师点名了。"
陈燃愣了一下。大课。*****基本原理。
他完全忘了。
不是因为重生后记忆力减退,而是因为他脑子里装的App Store、Mac mini、FlamePop太多了,根本装不下***。
他回复:"有事。老师说了什么?"
"说你旷课一次,扣平时分。你最好找老师解释一下。"
陈燃想了想。上辈子他从来不会旷课。他是不敢,他是太老实,他以为考勤分关系到绩点,绩点关系到奖学金,奖学金关系到简历,简历关系到前途。
现在他知道,这些都不重要。
但他还是回了:"知道了。谢谢。"
"没事。"苏晚的回复很快,"你的ACM选拔赛报名了吗?"
"报了。"
"那就好。晚安。"
"晚安。"
陈燃把手机放在枕头边,看着屋顶上那些被屏幕光照亮的裂缝。
苏晚在提醒他上课。
苏晚在督促他报名。
苏晚在关心他。
上辈子,这些事情也发生过。但那个陈燃没有注意到,或者说,他注意到了但没有勇气回应。
他觉得苏晚是天上的月亮,他是地上的泥巴。
现在他知道,月亮和泥巴之间,差的不是距离,是勇气。
他翻了个身,闭上眼睛。
这一夜,他做了一个梦。梦见自己站在纳斯达克的敲钟台上,手里拿着锤子,锤子下面是一个金色的按钮。他用力敲下去,钟声响起来,礼堂里所有人都站起来鼓掌。
他看见了张伟,穿着西装,笑得很开心。
他看见了林默,还是那副沉默寡言的样子,但眼角有泪光。
他看见了苏晚,穿着一条白色连衣裙,站在第一排,笑着看他。
然后他醒了。
屏幕还亮着,编译早就完成了,Xcode停留在“*uild Succeeded”的界面。
外面天已经快亮了,鸟在叫,食堂的烟囱冒着白烟。
新的一天开始了。
周五傍晚,陈燃终于把FlamePop的第一个可玩版本跑起来了。
不是模拟器,是真实设备——他借了张伟的iPod touch。
2008年的iPod touch是第二代,3.5寸屏幕,320x480分辨率,200万像素摄像头,没有GPS,没有陀螺仪,只有重力感应器。
但在2008年,这就是神机。
陈燃把游戏装进iPod touch的那一刻,手都在抖。
图标出现在屏幕上——他用Photoshop随手画的一个火焰图标,红黄渐变,中间一个白色的“F”字。图标的像素边缘有点锯齿,颜色饱和度太高,放在2022年会被设计师喷成筛子。
但那是他花了两个小时做出来的。
双击。
加载。
网格出现了。
四个颜色,十六个格子,动画流畅得不像是在2008年的设备上运行的。他用手指拖动一个红色火焰和旁边的**火焰交换,三个红色火焰连成一线,消除——嘭——一个小型的动画效果在屏幕上炸开,得分加了一百分。
张伟凑过来,眼睛都直了。
“这个动画效果怎么做的?”
“Core Ani**tion。”
“什么山?”
“苹果的动画框架。”
“你是说,苹果公司专门做了一个做动画的东西,让你们开发者用?”
“对。”
“免费?”
“对。”
张伟沉默了。他在魔兽世界里为了买一个飞行坐骑,攒了两个月的金币。现在有人告诉他,苹果公司免费提供了一套做动画的工具,让开发者做出这种效果,然后拿去卖钱。
“这东西……”张伟指着屏幕上的火焰,“我有点明白你为什么要借钱了。”
陈燃把iPod touch递给他。“你玩一局。”
张伟接过去,手指在屏幕上划来划去,三消、四消、五消,连击、加时、火焰风暴。他玩了一局又一局,每一局结束都会说“再来一局”。
六局之后,他抬头看陈燃。
“这游戏要是卖0.99美元,我会买。”
“真的?”
“真的。”张伟说,“比我玩过的所有****都好玩。不,比我玩过的所有小游戏都好玩的。”
陈燃笑了。
不是因为张伟的肯定。是因为他知道,张伟说的是实话。
但还有一句话他没有说出来:
——这还不是最好的版本。
等他把图形优化、加入音效、加入关卡、加**网排行榜,那才是真正的FlamePop。
现在这个版本,只是婴儿的第一步。
那天晚上,陈燃把那台Mac mini放在桌上,拍了张照片。
照片是模糊的,光线不好,构图也不专业。但他在照片下面写了一行字:
"我的第一台Mac。陪我打下江山。"
他把照片存在了一个叫“逆袭之路”的文件夹里。
然后关机,睡觉。
明天的任务更重:*ug修复、性能优化、图标重绘、应用截图、***分析、描述文案。
App Store不会自己上架。
钱不会自己飞进口袋。
他能做的,就是一行一行地写代码,一个*ug一个*ug地修,一步一个脚印地走下去。
就像他上辈子做的那样。
但这一次,他不会在中途倒下。
阅读下一章(解锁全文)
点击即可畅读完整版全部内容
相关书籍
友情链接