Slide 1

Slide 1 text

この中に1人、素人がいる! ~素人が現場に投入されるとやらかすこと~

Slide 2

Slide 2 text

自己紹介 名前:桶矢秀人(おけやひでと) 前職:クライアントプログラマ(5年) ・モバイルゲーム開発(C, C++, C#, Java, Objective-C) ・少しの間PHPをかじった IL:サーバプログラマ(1年) ・モバイルゲーム サーバ側開発 (PHP)

Slide 3

Slide 3 text

皆様は仕事でミスをしたことがありますか?

Slide 4

Slide 4 text

現場にはまさかのミスをする人がいます

Slide 5

Slide 5 text

そういう人に出会ったときのための 心構えをしましょう

Slide 6

Slide 6 text

目次 日常業務編 ・事例1.質問できない ・事例2.小さなことでパニックを起こす クライアント開発編 ・事例3.後先を考えない ・事例4.自分に非があるかもしれないことを考えない ・事例5.サーバは最強だと思っている サーバ開発編 ・事例6.本番の想定ができない

Slide 7

Slide 7 text

日常業務編

Slide 8

Slide 8 text

事例1.質問できない

Slide 9

Slide 9 text

事例1:質問できない(1) 前職でPHPの勉強をする機会を頂いた時の話。 前提 ・PHP経験なし ・当然MySQLもApacheもXAMPPも知らない ・そもそもソーシャルゲームという単語を初めて聞いた それを踏まえて

Slide 10

Slide 10 text

先輩 「んじゃ、以前運営してたゲームがあるんだ けど、それをローカルで動かして。わかんな かったら聞いて」

Slide 11

Slide 11 text

事例1:質問できない(2) ・えー...と? 具体的にわかっていないこと ・そもそも「動かす」とはどうなる状態になればいいのか? ・ローカル?これはサーバで動いていたものだよね。自分のPCで 動くの? ・早い話「何からやればいいんですか」と聞きたいが、そんな質問 して大丈夫なのか?

Slide 12

Slide 12 text

事例1:質問できない(3) ・聞きたい人は別の作業をしていたりでつきっきりというわけでは ない。 ・「PCの電源のつけ方がわかりません」レベルの質問なのではな いかと疑ってしまう。「そんなのもわからないのか」と思われるのが 怖い。 ・聞いたら、すんなり教えてくれる。ただ、「わからないなら聞いて いいから」と改めて念を押される。

Slide 13

Slide 13 text

事例1:質問できない(4) 教える側の意識 ・「こいつあんまり質問してこないな」って人は意外と質問を溜め込 んでいる。 ・相手側から歩み寄ってくれると非常に質問しやすくなるので、最 初のうちは定期的に声をかけることで質問を吐き出させるとお互 い得する。

Slide 14

Slide 14 text

事例2.小さなことでパニックを起こす

Slide 15

Slide 15 text

事例2.小さなことでパニックを起こす(1) ILではない事例(初運営業務) 私の座席の後ろから先輩が見ている。 ・「ログを見てみて」 ・「ステージングに入ってもらえる?」

Slide 16

Slide 16 text

事例2.小さなことでパニックを起こす(2) ILの事例(配属初日) ・「このプロジェクトはテスト駆動開発でやってます。そんでもっ て――」 ・「バージョン管理はgit使ってますよ、と。あとは――」 ・「じゃあまずは環境構築からやってって。マニュアルはここにある から見てね」

Slide 17

Slide 17 text

(わ、わかんないです...)

Slide 18

Slide 18 text

事例2:小さなことでパニックを起こす(3) ・総じて、「できなければやばい」という気持ちから焦っている。 ・必死になってるのは結構伝わるので、察してくれることも多い。 現状できることを探し、手詰まりなら恥ずかしくても聞きましょう。 ・説明してくれてる人が不親切だとか、そういう話ではない。 ・ILが特別厳しいという話でもない(重要)

Slide 19

Slide 19 text

クライアント開発編

Slide 20

Slide 20 text

事例3.後先を考えない

Slide 21

Slide 21 text

事例3:後先を考えない(1) ソケット通信を利用したゲーム開発をしたときの事例。(C++) 前提 ・iOSアプリ開発で、このときで2度目 ・ソケット通信は初経験 ・クライアント1人、サーバ1人の2人での開発(=問題点を指摘す る人間がいない)

Slide 22

Slide 22 text

ソケット通信部分のソースコード ※ClientSocketはシングルトンクラス int ClientSocket::connection( const u8* ip, int port ) { if( ( socket_ = socket( PF_INET, SOCK_STREAM, 0 ) ) < 0 ){ return CONNECT_SOCK_ERROR; } pthread_create( &thread_, NULL, threadHook, this ); return CONNECT_SUCCESS; } 事例3:後先を考えない(2)

Slide 23

Slide 23 text

事例3:後先を考えない(3) ・ソケットを1本しか作れない。ゲーム以外で通信できない ・後でプロデューサーに「チャット機能入れたいな」と言われる。私 ビビる ・必死のロビー活動によってそれを阻止する ・「リファクタリングしてなんとかしよう」という発想は無い

Slide 24

Slide 24 text

事例4.自分に非があるかもしれないことを 考えない

Slide 25

Slide 25 text

事例4:自分に非があるかもしれないことを考えない(1) 事例3と同じプロジェクト 前提 ・ゲームサーバに対してゲームデータを送信する ・ゲームサーバはあるAという処理において、1バイトのデータと4 バイトのデータを連結した合計5バイトのデータを要求している

Slide 26

Slide 26 text

データ送信部分のソースコード(要約) // 送信データの構造体 typedef struct { char a; // 1バイト long b; // 4バイト } Foo_t; 事例4:自分に非があるかもしれないことを考えない(2)

Slide 27

Slide 27 text

データ送信部分のソースコード(要約) Foo_t bar; bar.a = 10; bar.b = 20; char* data = new char[sizeof(Foo_t)]; // 1 + 4で5(?) memcpy(data, &bar, sizeof(Foo_t)); Connection::getInstance()->send(data); // 送信 事例4:自分に非があるかもしれないことを考えない(3)

Slide 28

Slide 28 text

事例4:自分に非があるかもしれないことを考えない(4) ・この構造体は8バイトになる         理想(5バイト)                 現実(8バイト) ・アライメントの機能を知らない。 ・問題なのは、自分のミスを疑っていないこと。先に相手側のミス を疑って攻勢に出る。

Slide 29

Slide 29 text

事例5.サーバは最強だと思っている

Slide 30

Slide 30 text

事例5:サーバは最強だと思っている(1) 今回は課金時のエラー処理の事例。 while (true) { char* receipt = getReceipt(); // レシートを受け取る int status = PurchaseManager::send(receipt); // ポイント追加 if (status == SUCCESS) { break; // 成功したので抜ける } }

Slide 31

Slide 31 text

事例5:サーバは最強だと思っている(2) ・インターバルもなしに無限に投げるのでさながらDoS攻撃状態 ・後ほどインターバルを入れるように修正したが、それほど深刻に 受け止めていなかったりする ・サーバを担当してからクライアントに同じことをされて、やばさを 再認識した

Slide 32

Slide 32 text

サーバ開発編

Slide 33

Slide 33 text

事例6.本番の想定ができない

Slide 34

Slide 34 text

事例6:本番の想定ができない(1) ・PHPによるソーシャルゲーム開発において、初めて一人で一つ の機能作成を任されたときの事例 前提 ・担当したのはログインボーナス機能 ・ライブラリで吸収してくれているので、自分でSQLは書かない。 楽勝である

Slide 35

Slide 35 text

事例6:本番の想定ができない(2) 当時の本番サーバの構造(作ってるときは知らない) マスター スレーブ 書き込み(UPDATE, INSERT) 同期 読み込み(SELECT)

Slide 36

Slide 36 text

事例6.本番の想定ができない(3) 当時書いたPHPのコード(要約) if (!$is_login) { return; } // 日をまたいでいるかどうか $login_bonus->add($user_id, 1); // 1日加算(UPDATE) $days = $login_bonus->get($user_id); //日数を取得(SELECT) $reward->give($days); // その日の報酬を配布

Slide 37

Slide 37 text

事例6.本番の想定ができない(4) ・報酬が配られた人間と配られない人間が出てしまった。 ・原因は、スレーブの更新が追いつく前にSELECTしてしまったか ら。 ・クライアントからの流れで、書き込んだものを読み込んだら、更 新された値が手に入って当然という認識。 ・ソースコードレビューのシステムがあれば防げたかもしれない。

Slide 38

Slide 38 text

まとめ

Slide 39

Slide 39 text

まとめ ・現場にいる素人に対して、「素人だから大目に見るべき」というこ とではない。 ・ただ、それでも現場で、少なくともプロジェクトが続いている間は 一緒に仕事をしなければならない相手でもある。現実として。 ・その人の数少ない強みなどを拾って、足りない部分をなんとかご まかして、使ってあげてください。お願いします。

Slide 40

Slide 40 text

ご清聴ありがとうございました。