-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
602 lines (274 loc) · 43.6 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
<meta charset="utf-8">
<title>My Octopress Blog</title>
<meta name="author" content="Your Name">
<meta name="description" content="
">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="http://leeseon.github.com">
<link href="/favicon.png" rel="icon">
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
<script src="/javascripts/modernizr-2.0.js"></script>
<script src="/javascripts/ender.js"></script>
<script src="/javascripts/octopress.js" type="text/javascript"></script>
<link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml">
<!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
<link href="http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
<link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
</head>
<body >
<header role="banner"><hgroup>
<h1><a href="/">My Octopress Blog</a></h1>
<h2>A blogging framework for hackers.</h2>
</hgroup>
</header>
<nav role="navigation"><ul class="subscription" data-subscription="rss">
<li><a href="/atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
</ul>
<form action="http://google.com/search" method="get">
<fieldset role="search">
<input type="hidden" name="q" value="site:leeseon.github.com" />
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
</fieldset>
</form>
<ul class="main-navigation">
<li><a href="/">Blog</a></li>
<li><a href="/blog/archives">Archives</a></li>
</ul>
</nav>
<div id="main">
<div id="content">
<div class="blog-index">
<article>
<header>
<h1 class="entry-title"><a href="/blog/2011/12/07/new-post/">New-post</a></h1>
<p class="meta">
<time datetime="2011-12-07T07:27:00+08:00" pubdate data-updated="true">Dec 7<span>th</span>, 2011</time>
</p>
</header>
<div class="entry-content">
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2011/03/05/only_for_technorati_post_claim/">Only for Technorati Post Claim</a></h1>
<p class="meta">
<time datetime="2011-03-05T00:00:00+08:00" pubdate data-updated="true">Mar 5<span>th</span>, 2011</time>
</p>
</header>
<div class="entry-content"><p><a href="http://technorati.com/claim/dth37vnwa" rel="me">Technorati Profile</a></p></div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2011/03/05/china-national-website-maintenance-day/">贴图不说话</a></h1>
<p class="meta">
<time datetime="2011-03-05T00:00:00+08:00" pubdate data-updated="true">Mar 5<span>th</span>, 2011</time>
</p>
</header>
<div class="entry-content"><a target='_blank' href='http://www.slide.com/s/gjGmiA-s6D9qDrOPVZOKiTn5T9yokQpF?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f84e/1/158/wD_swcpW4T-G7ugW3IxSrMtSEzRW-ct_.jpg' border='0' alt='Snap3' title='Snap3' /></a>
<a target='_blank' href='http://www.slide.com/s/uO-SuyOv2D-z_qf6XIhcjDtVmxxIuYS6?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f84c/1/158/gB911YxcxT9mwfQEI2X4HE31guVR2kbA.jpg' border='0' alt='Snap1' title='Snap1' /></a>
<a target='_blank' href='http://www.slide.com/s/xvrxOaCK7z_gC2Vr_1LWch_Fh9ukc96M?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f84d/1/158/Tn5tTtNr7z_KstVP5TdWcd0Hvr-8u7It.jpg' border='0' alt='Snap2' title='Snap2' /></a>
<a target='_blank' href='http://www.slide.com/s/fT_9umGv6T9nsoOiN3aLnpn0GhYYU07R?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f84f/1/158/HgZBSk8T5T89rQai_BFgPJW8dKfDSW5A.jpg' border='0' alt='Snap4' title='Snap4' /></a>
<a target='_blank' href='http://www.slide.com/s/lt8ycXKh0T8z-bnrkonFQL-u13wg838V?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f850/1/158/1PTBi3eT7T92wJjqJeWCCJeiqykccew7.jpg' border='0' alt='Snap5' title='Snap5' /></a>
<a target='_blank' href='http://www.slide.com/s/oPbWOOaRsj-pYp2gX3Eruoh6l_jjfR3K?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f851/1/158/AA97U9afcD8SF0GVFVJh1ye9qVg1t2Qh.jpg' border='0' alt='Snap6' title='Snap6' /></a>
<a target='_blank' href='http://www.slide.com/s/YDu91XOVwj8wyvUXbzEZliXFfF8zzKxF?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f852/1/158/3oyo20Ni1D8rxkgNku1nnu46LTMBPNZW.jpg' border='0' alt='Snap7' title='Snap7' /></a>
<a target='_blank' href='http://www.slide.com/s/gL6Zml8Uoj9DQcjahtmZjA10YqmwE__0?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f854/1/158/EjoB5TLE5D80BE5aD58x8GVCZfgOvq3d.jpg' border='0' alt='Snap9' title='Snap9' /></a>
<a target='_blank' href='http://www.slide.com/s/kRxnTDHO5T_2ZnbBfBsz6-xPm4y-Dmrv?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f855/1/158/MSlNOES35D8Hetc3qHdl83YJilD5VCCC.jpg' border='0' alt='Snap10' title='Snap10' /></a>
<a target='_blank' href='http://www.slide.com/s/RtLs2BuF6T-kVY-_4BjbcTFY2oOCpibF?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f856/1/158/HYxayRXG7j9A1n_O3rMJk49rZYs9P4IQ.jpg' border='0' alt='Snap11' title='Snap11' /></a>
<a target='_blank' href='http://www.slide.com/s/ASYeiLkH5T-0UxfxGoV5DFOuRoRf2eQh?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f857/1/158/Ym62mBLj0T_IRFlq05PVzVK6ReDxRWzu.jpg' border='0' alt='Snap12' title='Snap12' /></a>
<a target='_blank' href='http://www.slide.com/s/WOt1g_Ej1T9gO93oV7TrROcIH2Pj7ryj?referrer=hlnk'><img src='http://widget.slide.com/rdr/1/1/1/W/300000000943f858/1/158/ZByAABw-5z9KAoKapfYSERWONiOkeECK.jpg' border='0' alt='Snap13' title='Snap13' /></a>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2010/06/15/a_litter_opinions_on_my_two_years_mobile_game_devolopment_experience/">说说我在手机游戏行业这两年</a></h1>
<p class="meta">
<time datetime="2010-06-15T00:00:00+08:00" pubdate data-updated="true">Jun 15<span>th</span>, 2010</time>
</p>
</header>
<div class="entry-content"><p>已经在新公司工作一个月了,每天写写ruby真是一件很快乐的事啊,不用等着漫长的编译时间,不用开着调试器慢性自杀真是一件很惬意的事。最近想来有点奇怪,好象游戏程序员与非游戏程序员之间平时交流的实在是不多,两者的关注点,交流圈,阅读书目与业界偶像都大大的不同,所以有必要谈一谈这两年来一点点观察与想法,以供可能有兴趣加入手机游戏业的同学一点点参考。因为我已经算是离开游戏业,所以有些想法一定会很主观,因为这仅仅是我的一点点观察与想法而已。</p>
<p>在说正事之前先扯扯淡淡(事后发现扯得太长,没兴趣的点"这儿":#subject 看正题)吧,首先我不是一个硬派的游戏玩家,但还是有一段沉迷玩游戏之中的青葱岁月,大学时迷恋于仙剑,曾经一遍一遍的为了尝试那个谣传的另一结局,在迷宫中来回拼杀,创下了八小时打穿仙剑的记录(当然是用改的,一开始改出乾坤一抛,然后每次R即可,主要是迷宫太费劲了)。后来一发不可收拾,打完了我当时能找到的任何RPG游戏,包括《剑侠情缘2》与《风云天下会》,不过始终没有再也没能找到仙剑给我的感动,也就再也不动RPG,连暗黑都懒得尝试了。在早就烦腻了《红警》儍逼的坦克大战之后,偶然遇到了《帝国时代》,精美的画质与动感的音乐让我立刻爱上了它,从此它成为了我最爱的游戏,常常呼朋换友一起群P,单挑。后来也常常与几个死党打打《大富翁4》、《quake2》、《英雄无敌3》《三角洲》体会一下与人斗的无限乐趣。但是帝国,尤其是帝国2依然是我最爱的游戏,曾经花过不少时间来看战报,研究录像,上game zone与浩方,实战演练开局,也从中享受到无穷的乐趣。后来因为微软的不进取帝国3实在是太弱智,与玩帝国的人本来就比较小众,熟悉的战友日渐稀少,也渐渐的不再玩了。因为实在不喜欢星际的画面,以及与魔兽争霸玩众的疏离,也就再也没有玩过任何即时战略的游戏了。后来风起的网游,可能也是与玩家心理上的隔离,我是没有玩过,只有魔兽世界让我着迷了一段时间,只是发现太花时间,也就渐渐的不再玩了。至于小游戏,我也后来玩一下PopCap的几个经典的休闲游戏。最近也只偶尔玩一下数独来保护大脑的清醒。那种迷恋游戏的岁月与我越行越远,与那些从小伴着红白机,Gameboy一起长大,或又现在XBox,PS,<span class="caps">NDS</span>, <span class="caps">PSP</span>, Wii等设备一应俱全的玩家们,我只能感叹,我似乎从来没有真正的融入到video game的时代中来过。</p>
<p>不过话说回来,虽然事后想想,我曾经在游戏上消磨了太多的时间,但也是因为游戏,让我明白了DOS上的HIMEM与EMM386的设置,也从用FPE改游戏的过程中领悟了16进制,以及计算机程序的组成无非只是一些0101从磁盘跑到内存中被执行,也从中找到了一点点关于计算机的兴趣,然后才有机会能最终从事程序员这个前途的职业的。我是在高三毕业后那个不堪的回首的暑假中,第一次就是在我父亲科室的机房里接触到电脑的,那里的电脑看着还是很神秘,在一个大大装着空调的房间里放着两台电脑与一台针式的打印机,电脑应该一台是8086,一台是386,用着5寸盘与3寸盘保存着公司所有的重要资料,外人是不允许进去的,那时我们那儿被认为最牛的人现在看来只是一个数据库管理员,他掌管着公司上千号人的档案与工资资料的数据库,而真正教我使用电脑的大姐姐,只算是一个打字员。而我那可怜的对计算机的兴趣,一开始就被给毁了,我还以为计算机就是学习五笔+WPS+UCDOS。唉,如些看来入门老师还是很重要,可能一次糟糕的入门体验能毁掉你对一件事物的兴趣,好在我是幸运的,游戏让我重新认识了机算机的魅力。</p>
<p>虽然游戏让人重新找到对计算机的兴趣,而且我自己的第一个大一点非玩具式的程序也是一个能拿来玩一下的俄罗斯方块,但我自己却从来没有想过自己可能会成为一个游戏程序员,毕竟在我毕业的那个时代,游戏与互联网都还没有成为一个真正的成熟的产业,国内的游戏工作室是很少而且基本不成气候的,也只在网游找到了赢利模式之后,形成了一个巨大利润的成熟娱乐产业之后才慢慢的发现开发游戏的国内公司多了起来。在通过自学会了一点点C的皮毛,并通过侯捷老师的《深入浅出MFC》突然搞明白了什么是多态之后,终于有一个公司没有在乎我本科的专业,给我了一份工作,我成了一个写编辑器的C++程序员。</p>
<p><a name="subject">言归正传</a>,话说两年前,在我厌倦了自己永远搞不懂的ERP开发之后,当时本着头脑中依稀对游戏开发神秘的好感,也看好于移动产业未来,我加入了Gameloft的北京工作室,成为了一个非典型的游戏从业者,因为在公司里我所接触的游戏程序员基本上都是从一开始工作就一直在游戏业中打拼。当然可能因为我的视角不同,所以可能会有一些不同于业内人士的感受吧。</p>
<p>一、全然不同的关注点与语境</p>
<p>当我到了Gameloft之后,首先发现的第一件事,就是游戏程序员使用着完全不同的术语体系,他们关注的总是帧数(FPS),三角形面数等指数,而且有一些词总是有一些特定不同于常识的含义,例如物理与AI都是指游戏中的特定概念。还有一些游戏专有的概念,利如UV、纹理、材质、寻路、动画、骨骼、路点、生死点及碰撞等等。这些都是一个要从事游戏业要搞明白的基本知识,唯有补充这些专业知识,才可能在游戏业中登堂入室,而且这些只是基础中的基础而已。</p>
<p>但是从另一方面来说,我接触的游戏程序员却多半不太关心模式,重构这些概念,对于高内聚与低耦合之类更是基本上不关心,agile与TDD之类在游戏业好象没有什么话语空间。DRY与KISS之类的原则好象在这儿不是太通行,曾经一度让我怀疑我是不是还生活在OO开发语境的生态之中,当然我的经历可能只是个例,但是我觉得可能国内游戏开发业与IT业内的交流不太多,整体不够开放吧。例如在游戏业内外能通吃的偶像级博主也大概只是云风一人而已吧。</p>
<p>二、iPhone与android当立,J2ME已死</p>
<p>其实我一入Gameloft时所进的项目组是NDS次世代平台,而后也曾在两个项目空隙之间暂时性的做过android与J2ME项目,而后一直都从事iPhone平台下的开发,所以对于这三个手机开发平台都还有一点认识,至于windows mobile平台、Symbian与Brew虽然支持原生的C++开发,但是由于开发成本,也多半不会为它们开发专属的C++游戏,基本上大部分是从J2ME移植过来的。而且这后三种平台基本现在是处于萎缩状态。虽然NOKIA的手机销量很大,但是它的Symbian开发平台真的是让人诟病,凡是我接触过做过Symbian平台的程序都多半不愿意继续在Symbian下开发。因为Gameloft不做国内市场,所以我不了解MTK平台。</p>
<p>先说J2ME吧,希望这个标题党的XX已死的口号不会招来太多人的口水,因为我这样说绝对不是为了哗众取宠,而是的确是这样想的。</p>
<p>1、J2ME的原创游戏先天怪味:我先说说原创的J2ME游戏吧,当我第一次看到J2ME写成的程序时,我当场就被雷得皮焦里嫩,程序有且仅有几个非常巨大的java类,而且怎么读都象是用java写成的糟糕的C代码,后来才知道这样是有原因的,因为手机游戏发行商的原因,对于游戏jar包的整体大小是严格的限制了,一般最大是1M,为了节约每个java类产生的元信息所占的大小,java语言的OOP特性只能被迫去除了,所以写出来的代码反而有着比较直接用C来写更古怪的不纯的怪味。在这样一种有着破窗户的示范效应的代码风格的影响下,真的很难有一个比较良好的代码质量,而与之伴随的自然是无尽的BUGs与牵一发而动全身的补丁加补丁。这样也造成了一个J2ME程序员基本成长空间不大的事实,因为这种代码质量及手机平台的硬件限制造成了在J2ME基本上做不出太复杂的游戏,并且程序员基本总是被BUG缠身,没有什么时间进行更多的思考与学习,除了几个个别天份很好的程序员,因为对于代码质量有更深入的追求,能在游戏开发技术上有更一步的精进,基本上我所遇到的J2ME程序员,都是将他们一年的工作经验用了n年。</p>
<p>2、J2ME的移植项目的体力粗活:至于J2ME的移植项目基本上就是IT业中的手工劳动密集的产业了。在讨论这一点之前,我需要大概说一下J2ME的游戏的开发流程:一个J2ME的游戏早期一般只会选一个主要的普及率高的手机作为目标机型,以它作为平台来只在它之上进行开发与测试,这一般被称之为主版(master),然后当游戏进入到alpha期之后,会另选出一些普及率次之但也很流行的手机作为目标机型,并在之上进行测试,一般会选出某一手机系列中比较有代表型的机型大概10个左右,称之为top10,在这之上开发的版本称之为次主版(submaster),然后大概等游戏进行到beta期之后,基本上就进入了大规模移植期,这时所有目标机型都会由一个专人负责,根据手机的厂商,手机的分辨率,是否支持触摸,是否有键盘等等功能,分出一系列子版本,在每个目标机型上进行移植开发与测试。如果不幸加入到这种项目中,每天的工作可能就是与分辨率,坐标,与手机的特性打交道了,恭喜你,你已经成为了蔡学镛所说的“程序女工”了,可能比较蓝领都不如吧。</p>
<p>至于程序女工,还是让我说两个悲惨的血泪故事,让大家明白我的所言非虚吧。惨案一:一个同事遇到一个程序只在某一型号的手机上只要跑到特定步骤就会死机,毫无头绪看不出任何问题的征兆,只到有一次偶然将一个局部变量改成全局变量时才解决了这个问题,原来是因为这个手机的J2ME的实现比较特别,将栈实现得特别小而且不给出任何异常,只要栈满了就毫无提示的死掉,只能放入堆中才能解决这个问题,遇到这种问题除了多了一个报怨的谈资与教训之外,其实对于真正的成长是没有太多的好处的。惨案二,对于不同的分率辨的屏幕布局是比较头痛的一件事,需要写时预定义一些与坐标相关的值,并考虑到不同分辨率之可能之调整,预留一些调整值定义的,而且鉴于java没有条件编译之说,不过好在有人创造性的使用cpp(C的宏处理器)来解决了这个问题,如果主版不是一个由同一个地理上的工作室上完成,基本上主版人员是没有什么动力将这样坐标魔数替换成预定义常量的,所有接手之人所做的事那就是各种魔数先博斗一番吧,哪怕运气好一点,每天为了坐标而不断调整也只是一件毫无技术含量的脏活而已,可能只能耐心有好处吧。而且也可能是大家都太耐心了,居然没有任何一个人想过要做一套统一的布局编辑器,虽然不能解决所有问题,但是能很大的程度上解决移植者之痛苦的。唉!</p>
<p>3、iPhone真是太爽了,虽然apple的审查制度让人不爽,再加上最近的那次开发者许可修改,封杀了诸如Unity 3D引擎的生存空间,但是总的来说在iphone下开发游戏还是最爽的,很少的几样目标机型,统一的分辨率(在iPhone4与iPad之后不再是了),完整的opengl es 2.0支持,充足的硬件资源(比起NDS不是好一点半点),完善的工具链再加上可以实时连机调试功能,再加上低廉的SDK价格,充足的社区资源与生态、支持C++等等。唯一可以算得上是缺点的地方,就是平台太好,竞争也比较激烈一点吧。此外有一点不知是否算是缺点的缺点,就是开发最后总是会需要Mac OS X的,你需要有一台mac,并且熟悉一下Mac OS X与Objective的,反正我是爱死这一点了。</p>
<p>4,android的前景不错,不过最近开发平台与营销平台还不算成熟,Gameloft作为第一手机游戏厂商在去年大辐缩减android上的投入就是一点证明,因为在android上投入产出比并不高,应该是低于iPhone。而且多机型测调试的问题也是存在,开发一款好的游戏,要在大部分的android的手机运行是需要花费更多的人力与物力的,这方面我的观点大概同于tinyfool的观点,不过随着android的占有率更一步提高,以及大量的原J2ME产业转型会更优先选择java语言平台,而非C++/Objective C++的iPhone平台,以及android的开源旗帜,末来的手机平台市场应该就是google与apple分庭抗礼了,至于第三家我现在是没有看到。</p>
<p>三、程序语言</p>
<p>现在的游戏语言主流还是C++ 与Java,虽然iPhone的第一语言是Objective C,但是因为它支持OpenGL及Objective C/C++混合编译,而且很多游戏都是一开始用C++写成,所以真正用Objective C还不多,除非是一开始专为iPhone所写且没有移植到其它平台的需求。Java就不用多说了,J2ME与android自然是用它。此外lua与sql(sqlite3)也在iPhone上有人使用,这个以后也应该会越来越多。不过可能又是一个有趣的个案,我身边的两个同事居然在需要一个排序算法时,直接人肉写出一个冒泡,而不是去用C++ 的sort,这种不研究自己所使用语言的行为真的是应该引以为戒的。</p>
<p>四、面向测试开发</p>
<p>我曾经有一段时间需要完善一个体育游戏的AI,结果发现了一个问题,就是程序的AI的“不可测”,当然这个不是海森堡的不可测,而是没有一套机制将出现时的场景保存下来,或者是将某个AI状态前的场景保存下来,能固定的重复,如果出现了bug,或者加了某个功能,你都需要手工操作人肉到那个状态(而且你还真不一定能人肉到),这实在是一件很痛苦的事情。其实在开发的一开始,就考虑这个问题,在底层提供一套序列化机制,能做到快照功能,并加上一个可控的伪随机函数,就不会出现一些所谓的不好重现的AI中的bug了,不过可惜项目的工期是死的,而且也没有太多人在乎这种质量问题,所在大家都只需苦练调试技巧就好了。</p>
<p>五、考勤加班与薪水</p>
<p>当一个公司大了之后,就会慢慢的有上大公司病,例如不再了解手下员工的工作情况,为了便于简单管理,会有严格的考勤制度,我觉得这一点对于游戏开发公司来说有点讽刺,当然这可能只是我的想法吧。此外游戏公司的加班自然是少不了的,好在Gameloft算是外企,周末的加班还是有双薪的,其它时候的加班那就算是贡献了,便是仅仅是为了一个诡异的完成期限(其实都是层层的留有余地)而加班,或又是一年年的欠上技术债而不愿还,搞到最后只能用加班撑门面,实在是说不过去。没有时间思考,没有时间阅读学习,没有时间生活,没有时间锻炼,此中的代价可是巨大的。不过说到薪水,手机游戏开发应该是高于其它行业一点点,但又低于网游公司一些吧,我说的是平均情况,其实与付出的代价相比,好象也不怎么多。不过从我最近观察到的情况,可能因为最近iPhone与android人才比较少有经验的程序人员(不限游戏开发)开出的价码还算可观吧,此外,现在基于SNS的flex的游戏程序员的需求也比较大,薪水还算不错噢,有兴趣的可以试试。</p>
<p>六、Joel测试</p>
<p>这个是纯报怨贴,不准备去Gameloft的人可以不看,我只说一下“9.你用到了你资金能力内可买到的最好工具吗?”这一条吧。公司居然在这一点上抠门,不肯购买Visual studio只让使用不能装插件的Express版本,本来可以提高效率的IncreBuild与Visual Assist X不能使用,你就等着VS在那个缓慢的编译吧,或者在需要打开某个文件时从文件树中一级级展开一级级查找吧,虽然commads可以减少一点这样的痛苦,但是它的补全功能也很一般。VAX的从声明自建定义,从定义自建声明的功能自然是不能用的了,你要一遍一遍去将两都定义全;没有了可以帮助重构的插件,你觉得大家会辛勤手工来搞定吗?或者大家都不重构,反正也没有人在乎。超级怀念我曾经买过的Ref++,可惜只支持到VS2005就停产了。自然也不会有人去使用DevPartner来寻找一个内存泄漏的吧。我也用emacs与e texteditor还有windbg与项目博斗了很久,可惜windbg的调试的友好性还是远差于VS,这样我总是要开着一个不拿来做编辑功能的VS express窗口,真TMD的别扭。好在大家都没有象我这样痛苦过,也许都从来没有高效过,或者是耐性极好。好吧,说VS太贵(真不贵,你与浪费的人力比,那个根本不算什么),每天开发需要的双显示器与mac mini总应该能按需申请吧,可惜没有,这两者的价格真的让我不好意思来说贵吧。我只是不明白为什么到了现在一个大公司居然还在这件事上犯糊涂。</p>
<p>七、引获</p>
<p>抱怨完了,还是说一点积极的东西,免得我形象太阴暗,象是一个破口大骂前女友的怨男。手机游戏行业虽然没有PC网游与次世代video game公司光采照人,但是也让我有机会能投身于游戏业内一窥全豹,而且也感受到移动产业的确是未来的金矿,虽然我现在不再做游戏了,但是依然没有离开移动产业。而且认识了几个牛人与交到一两个不错同事,其实这样还不够吗?</p>
<p>小结(总算写到这了,这篇博客也写得太费劲了)<br />
总之如果从事手机游戏,如果你不是做iPhone或者是andriod的话,就不用做了,主要是没有什么前途而且是在谋杀生命。如果不做原创,也要慎重考虑。远离J2ME,远离移植,尤其是所谓的大规模移植。至于是否要入我的前东家嘛,兄弟你自己琢磨吧,我不表态。</p>
<p>此外,多学习点数学,多了解点语言,多品味点优秀的程序,总是对的。</p></div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2010/01/16/bye_bye_dreamhost/">ByeBye Dreamhost</a></h1>
<p class="meta">
<time datetime="2010-01-16T00:00:00+08:00" pubdate data-updated="true">Jan 16<span>th</span>, 2010</time>
</p>
</header>
<div class="entry-content"><p>因为"Site5":site5 还为从其它主机转过来的用户提供了一份更多的优惠,你只需要能证明自己是从其它的主机转过来并且已经关闭了以前的帐号,你就能得到$25的“回扣”用于下一次的任何购买中。不过这份回扣是需要在购买"Site5":site5 的30天内申请的。反正我的域名已经全部转到了"godaddy":http://godaddy.com 网站也全迁过来了,虽然离真正到期还有一个多月,但是close掉在"Dreamhost":dh 上的帐号自己是不二之选了。关闭帐号是很简单的,只要点击close然后再确认再输入密码就行了。在最后提示我因为我的费用并没有用完,下次如果还决定回"Dreamhost":dh 的话,那笔钱还是可以作为折扣从我的价格中减去的。很公平不是吗?可惜我是真的不太准备回去了。</p>
<p>好吧,不管怎样我已经使用了"Dreamhost":dh 快三年了,说一说我的感受吧,可能对后来者能一点帮助,也算是一点经验或者是总结。</p>
<p>其实根据VPSer的"介绍":introduce <a href="http://dreamhost.com">Dreamhost</a> 自建的机房位于洛杉矶,网速其实是很快的(这个我们下面会讨论的),而"Site5":site5 是使用著名的"The Planet":http://www.theplanet.com/ 机房速度也不慢,不过从我的(北京联通)测试上来看还是稍慢于"Dreamhost":dh 一点点。不过我这儿谈的网速仅仅是指传输层的速度,但是真实的用户体验是"Site5":site5 的速度大于"Dreamhost":dh 的,这个是得到多方(监控宝与google analytics)证实的。</p>
<p>为什么会是这样?我们可以先看几张我从"监控宝":http://www.jiankongbao.com/ 上获取的几张图</p>
<p>第一张是在"Dreamhost":dh 上较快的HTTP响应时间分布<br />
<img src="http://leeseon.com/assets/leeseon.com/2010/1/16/chart3.jpeg" alt="" /></p>
<p>第二张是在"Dreamhost":dh 上转慢的HTTP响应时间分布<br />
<img src="http://leeseon.com/assets/leeseon.com/2010/1/16/chart2.jpeg" alt="" /></p>
<p>第三张是在"Dreamhost":dh 上最慢的HTTP响应时间分布<br />
<img src="http://leeseon.com/assets/leeseon.com/2010/1/16/chart.jpeg" alt="" /></p>
<p>第四张是在"Site5":site5 上平均的HTTP响应时间分布<br />
<img src="http://leeseon.com/assets/leeseon.com/2010/1/16/chart4.jpeg" alt="" /></p>
<p>第五张是在"Site5":site5 上较慢的HTTP响应时间分布<br />
<img src="http://leeseon.com/assets/leeseon.com/2010/1/16/chart5.jpeg" alt="" /></p>
<p>总体上来说,DNS的解析速度区别并不大,我在监控宝上关于ping值与DNS解析的速度的对比上"Dreamhost":dh 是要优于"Site5":site5 的,不过那个区别在100ms之内,人是感觉不到的。对于网页的下载时间,其实两者区别也不大也在100ms之内,而真正引起感官上的区别的主要是服务器的计算时间的区别,DH有时比S5要慢上太多了,而且有时DH上连建立链接的时间也会很慢,这只能说明DH也太超卖(oversell)了。而"Site5":site5 在这个方面控制的是比较好的吧,起码我现在的平均总的HTTP响应速度在2s左右。</p>
<p>总结一下吧,DH其实还是一个不错的主机,尤其是它第一年的优惠价格太诱人了,而且主机开放ssh权限,这对需要翻墙或者部署rails应用的用户来说还是很不错的。我就是因为它第一年的$24的价格被吸引去的,前不久居然还有过$7.77的第一年的价格优惠。但是第一年之后的价格就比较贵了,而且并不太物有所值了。加上它疯狂的超卖,我的那台主机开始感觉到越来越慢(第一年还好,是最近越来越糟的),所以你如果只是一个linux或rails的初手,只是想架个Blog或者是部署下rails玩玩,我还是推荐你可以买来玩上一年,别象我似的玩了一年之后因为懒得搬家就一共呆了快三年。除此之外我还是推荐"Site5":site5 作为共享主机的一个不错的选择,当然你要用VPS我还是推荐"Linode":http://www.linode.com 虽然我还没有用过,但是因为有几个我依赖的人的推荐,我相信这个是不错的。</p>
<p>PS:就我个人感觉"监控宝":http://www.jiankongbao.com/ 真的很不错,如果你有一个网站,那你一定要用用它! 关于Site5的购买你可以去"riku":riku 那儿看看</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2010/01/13/writing_when_google_is_going_to_leave/">写在google将要离开时</a></h1>
<p class="meta">
<time datetime="2010-01-13T00:00:00+08:00" pubdate data-updated="true">Jan 13<span>th</span>, 2010</time>
</p>
</header>
<div class="entry-content"><p>2010实在是一个互联网的大年,昨天的百度被黑,本来就引不起我作为一个看客的兴趣,也引不起我的同情。一个不被人尊敬的公司被黑,反而让我有一点暗爽,也许这是百度能给我带来的最大快乐了。</p>
<p>然后今天“谷歌”的离去ing,却让我有点兔死狐悲的悽凉,谷歌的底线还是让人肃然起敬的,不过作为天朝的屁民,本来也不想多说什么,剧本已经由《动物庄园》写好,我们只用等着去欣赏就好了。可惜的是"XiaoLai":xiaolai 与"TinyFool":tinyfool 都引述了一个SB的名言,搞得我都有点无奈的想说点什么。好在我不用去百度混饭吃,也不在乎它是否收录我的网站,反正我说的也不是中文,想来它也是看不懂的。</p>
<p>Xiaolai表达是含蓄而自明的,tinyfool的表达是简单而达意的。我就不多重复什么了,只是这个孙云丰作为一个竞争对手的高层,居然在这个时候,不合时宜、迫不急待的跳出来将屎盆扣向谷歌,让我不禁对他的无瑕演技佩服得五体投地,以至于我开始如梦如幻如坠云里般精神恍惚并开始人戏不分了。</p>
<p>我不知他是真的本色出演将SB的这个角色刻划的如此如此入木三分,还是的确已入化境能如此的入戏,说出完美的台词。老大,你真的是《英雄》还是《十面埋伏》又或《头文字D》看多了,果然是对剧本理解得精妙之极,如果要打击对手这时跳出来又太急躁,远不如事情将过末过之时,来几句绵里藏针的阴损、显得既体面又圆滑而收效甚巨。抑或是急于向主人邀功献媚,那也不用说出:</p>
<blockquote>
<p>政治环境短期内是无法改变的。在中国,每个企业或者个人,都必须戴着镣铐跳舞。</p>
</blockquote>
<p>这样的实话来?有些事是知道而无需说的:大家都在男盗女娼,你自各儿道貌岸然、看不下去,还放出狠话来,说不玩了且宁可去死。这让喂食于你的主人情何以愖?你这难道不是给竞争对手一个将自己树立为不肯听从“世人皆浊,何不淈其泥而扬其波? 众人皆醉,何不哺其糟而歠其酾?”的劝告一意孤行投江而死的屈原形象的口实吗?唉,情何以愖啊?养狗也不能养这么笨的嘛、、、、</p>
<p>噢,对不起是我搞错了,大错特错,你这样的惊人表现的确是可歌可泣,技压达斯汀•霍夫曼蝉联百届奥斯卡都不为奇。因为这部记录片的名字不是《雨人》而是《S+B++++++》!!</p>
<p>PS:下次续集《SB#####》的主角你也一并演了得了。</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2010/01/10/move_away_from_dreamhost_to_site5/">搬家成功Dreamhost=>Site5</a></h1>
<p class="meta">
<time datetime="2010-01-10T00:00:00+08:00" pubdate data-updated="true">Jan 10<span>th</span>, 2010</time>
</p>
</header>
<div class="entry-content"><p><img src="/assets/leeseon.com/2010/1/10/promo-save-35-instantly-sprsum.png" alt="" /></p>
<p>其实早在几个月前,当我的"new relic":http://www.newrelic.com/ 发给我的报告表明在Dreamhost上的得分从fair到了poor与让我很不爽的Unacceptable之后,又鉴于已有的"前例":learning ,我已经另寻乐土之意。</p>
<p>赶在美国传统的打折季,新年动手吧,反正离我的dreamhost的过期时间有不到两个月的时间了。对于"Linode":http://www.linode.com 我虽然很有向往,但是对于自己的需求来说,VPS的价格还是偏高。因此在shared的主机中选择是比较正常的,其实一开始我并没有直奔"Site5":http://site5.com 而已,而是绕了个小弯去试试一下"HostMonster":http://www.hostmonster.com/ 因为它打折之后$4.95/m的价格还是很让我心动的,不过在试用的感觉中我感觉可能是因为被dreamhost上ssh的方便给惯坏了,它需要身份验证(发个身份证的照片过去)才能开ssh的默认流程,就让我有预感HostMonster可能与rails不合,而且它那繁复的控制界面让我比较头大,试用了三天就直接要求退款了,好在它退款还是很方便。教训是没有关注一下rails社区对它的评价。这年头国内国外谈论的居然都是"Linode":http://www.linode.com 与"slicehost":http://www.slicehost.com/ 甚至"joynet":http://www.joyent.com/ 。我就一个想要找个地方hosting自己的mephisto偶尔玩一下rails的小网民容易吗?</p>
<p>有了这次教训,最后也就选中了"Site5":site5 :SSH自动开启也算是我想要的,总体上来说$9.95/m的费用是与dreamhost相当的,不过因为我当年曾经将dreamhost的空间一起与"LiuFeng":liufeng 分享,所以还是与它商量了一下,我们一起合租site5了,我出hostpro的价钱,他出turbo的费用。这样我们就又可以一起合租了,而且还额外得到了一个独立IP,的确是一个很好的方案噢。</p>
<p>虽然Site5本来就有60天回款的保证,但是为了麻烦,我还是使用了一个可以试用30天的coupon,不过事后证明这一步好象是多余的,因为我一开始试用就开始喜欢上site5了,居然它已经为你建立好一个/home/username/ruby/gems,而且还有一个已经写得不太完整的.gemrc。噢,看来site5为rails的用户已经想得足够多了。</p>
<p>至于site5的好处,liufeng已经在"这里":this 讲过了,我就不多说了,只记得他当时太兴奋,在gtalk里面也不停的说site5的好处。对我而言最深的感受,它的网速与机器速度很快,我最喜欢的是它的live chat的客户支持,虽然我的英文足够糟到可以让它的客服刚好了解我要说什么,但是他们总是能很耐心且及时的解答我的很多问题,比起Dreamhost糟糕的live chat系统要好上太多了。</p>
<p>其实我是在中国时区的25号使用了一个30%折扣购买了一年的hostPro+Turbo主机计划,但是就是一个小时之后,就发现的主页上的折扣因为圣诞促销变成了35%,杯具啊。感觉就象被玩弄了一般,在我有点恼羞成怒地急躁的与Site5的交涉之后,他们居然很大方的答应将5%直接refund给我,呵呵,这种感觉让我一下子喜欢上了Site5。</p>
<p>就算了是site5没有其它好过dreamhost太多的优点,我也会因为这一点而喜欢site5的。噢噢</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2009/07/05/the_natural_evolution_from_side_project_to_full-time_business/">从副业到全职的自然演变</a></h1>
<p class="meta">
<time datetime="2009-07-05T00:00:00+08:00" pubdate data-updated="true">Jul 5<span>th</span>, 2009</time>
</p>
</header>
<div class="entry-content"><p>下文翻译自"Signal vs. Noise":blog</p>
<p>有人怀疑我们认为应该在开展副业的同时保留日常工作的建议。他们认为建立一样事业需要如此多的坚持不懈地努力,以致于你需要投入所有的时间来将它做好。</p>
<p>的确如此建立一样事业需要大量的时间和精力。但是这种认为需要辞职的才能将它做好观点是一种误导。一旦你辞职,你就改变一切。你并没有获取多的时间,而是失去了它。你等于使自己的业务进入了倒计时。将自己自缚于要么马上赚钱或者完蛋的境地。你必须要么马上成功否则就只能永远放弃。</p>
<p>保留日常工作可以给您一个较长的时间来构建想法。它可以使您随着时间的推移提供持续不断的努力。没有快速致富的选项。但可以日积月累地缓慢建构。</p>
<p>是的,你需要寻找的时间做副业和日常工作。但是如果使用得当总会有足够的时间的:致力于您的想法,而不是看电视或玩《侠盗猎车手》。11点而不是10点去睡觉。这并不意味着通宵达旦或每天工作16小时,我们指的是每周有少许额外的时间。这就有足够的时间去做一些事情,然后不断给它加油。</p>
<p>让你的副业自然地发展成为一个全职的业务。让它有机地增长。开始一项副业。缓慢的构建它。持续的花点时间。随着项目的发展,你就可以判断是否投入更多资源。最后,如果一切按计划进行,您就可以辞职并全职于它(如果这正是你想要的) 。但是如果一开始就这样做的话那就是本末倒置。</p>
<p>想一想,自然中的演变是如何发生的。没有巨大的飞跃。事情逐渐发生变化。这是一种我们力争能达到的模式。</p>
<p>PS: 其实文章简单明了,本不用翻译,只是正好拿它来试试google 不久前出的"翻译辅助工具":toolkit</p>
<p>不错,一个很好用的工具,虽然它的翻译总会给你点误导:) 只可惜它现在的共享功能不太全,不能提供共享给大家,有点遗憾</p>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2009/06/03/scheme_interpreter_in_15-minutes/">Scheme Interpreter in 15 Minutes</a></h1>
<p class="meta">
<time datetime="2009-06-03T00:00:00+08:00" pubdate data-updated="true">Jun 3<span>rd</span>, 2009</time>
</p>
</header>
<div class="entry-content"><object width="400" height="290" data="http://vimeo.com/moogaloop.swf?clip_id=4339116&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash">
<param name="allowfullscreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4339116&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" />
</object>
</div>
</article>
<article>
<header>
<h1 class="entry-title"><a href="/blog/2009/05/22/david_heinemeier_hansson_at_startup_school_08/">David Heinemeier Hansson at Startup School 08</a></h1>
<p class="meta">
<time datetime="2009-05-22T00:00:00+08:00" pubdate data-updated="true">May 22<span>nd</span>, 2009</time>
</p>
</header>
<div class="entry-content"><object type="application/x-shockwave-flash" style="width:520px; height:276px;" data="http://www.omnisio.com/bin/Embed.swf?embedID=bXt-gerXSr3R8UadbiFy2w"><param name="movie" value="http://www.omnisio.com/bin/Embed.swf?embedID=bXt-gerXSr3R8UadbiFy2w" /><param name='bgcolor' value='#FFFFFF' /><param name='quality' value='high' /><param name='allowscriptaccess' value='always' /><param name='allowfullscreen' value='true' /></object>
</div>
</article>
<div class="pagination">
<a class="prev" href="/blog/page/2/">← Older</a>
<a href="/blog/archives">Blog Archives</a>
</div>
</div>
<aside class="sidebar">
<section>
<h1>Recent Posts</h1>
<ul id="recent_posts">
<li class="post">
<a href="/blog/2011/12/07/new-post/">new-post</a>
</li>
<li class="post">
<a href="/blog/2011/03/05/only_for_technorati_post_claim/">Only for Technorati Post Claim</a>
</li>
<li class="post">
<a href="/blog/2011/03/05/china-national-website-maintenance-day/">贴图不说话</a>
</li>
<li class="post">
<a href="/blog/2010/06/15/a_litter_opinions_on_my_two_years_mobile_game_devolopment_experience/">说说我在手机游戏行业这两年</a>
</li>
<li class="post">
<a href="/blog/2010/01/16/bye_bye_dreamhost/">ByeBye Dreamhost</a>
</li>
</ul>
</section>
</aside>
</div>
</div>
<footer role="contentinfo"><p>
Copyright © 2011 - Your Name -
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
</p>
</footer>
<script type="text/javascript">
(function(){
var twitterWidgets = document.createElement('script');
twitterWidgets.type = 'text/javascript';
twitterWidgets.async = true;
twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
})();
</script>
</body>
</html>