Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
この中に1人、素人がいる!
Search
Infiniteloop
August 16, 2023
Programming
0
76
この中に1人、素人がいる!
12月2日に行われたインフィニットループ×クラスメソッド×クリプトン合同勉強会で発表した資料です
http://connpass.com/event/20314/
Infiniteloop
August 16, 2023
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
0
270
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
0
340
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
infiniteloop_inc
0
410
詫び石の裏側
infiniteloop_inc
0
370
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
6
25k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
140
ADRという考えを取り入れてみて
infiniteloop_inc
0
130
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
110
I ❤ Virtual Machines 仮想環境をより便利に使うツールたち
infiniteloop_inc
0
83
Other Decks in Programming
See All in Programming
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.4k
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
120
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
CSC509 Lecture 11
javiergs
PRO
0
180
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
110
Jakarta Concurrencyによる並行処理プログラミングの始め方 (JJUG CCC 2024 Fall)
tnagao7
1
290
初めてDefinitelyTypedにPRを出した話
syumai
0
400
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
2
660
RubyLSPのマルチバイト文字対応
notfounds
0
120
リアーキテクチャxDDD 1年間の取り組みと進化
hsawaji
1
220
A Journey of Contribution and Collaboration in Open Source
ivargrimstad
0
890
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Git: the NoSQL Database
bkeepers
PRO
427
64k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
Unsuck your backbone
ammeep
668
57k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Rails Girls Zürich Keynote
gr2m
94
13k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Facilitating Awesome Meetings
lara
50
6.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
A better future with KSS
kneath
238
17k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Transcript
この中に1人、素人がいる! ~素人が現場に投入されるとやらかすこと~
自己紹介 名前:桶矢秀人(おけやひでと) 前職:クライアントプログラマ(5年) ・モバイルゲーム開発(C, C++, C#, Java, Objective-C) ・少しの間PHPをかじった IL:サーバプログラマ(1年)
・モバイルゲーム サーバ側開発 (PHP)
皆様は仕事でミスをしたことがありますか?
現場にはまさかのミスをする人がいます
そういう人に出会ったときのための 心構えをしましょう
目次 日常業務編 ・事例1.質問できない ・事例2.小さなことでパニックを起こす クライアント開発編 ・事例3.後先を考えない ・事例4.自分に非があるかもしれないことを考えない ・事例5.サーバは最強だと思っている サーバ開発編 ・事例6.本番の想定ができない
日常業務編
事例1.質問できない
事例1:質問できない(1) 前職でPHPの勉強をする機会を頂いた時の話。 前提 ・PHP経験なし ・当然MySQLもApacheもXAMPPも知らない ・そもそもソーシャルゲームという単語を初めて聞いた それを踏まえて
先輩 「んじゃ、以前運営してたゲームがあるんだ けど、それをローカルで動かして。わかんな かったら聞いて」
事例1:質問できない(2) ・えー...と? 具体的にわかっていないこと ・そもそも「動かす」とはどうなる状態になればいいのか? ・ローカル?これはサーバで動いていたものだよね。自分のPCで 動くの? ・早い話「何からやればいいんですか」と聞きたいが、そんな質問 して大丈夫なのか?
事例1:質問できない(3) ・聞きたい人は別の作業をしていたりでつきっきりというわけでは ない。 ・「PCの電源のつけ方がわかりません」レベルの質問なのではな いかと疑ってしまう。「そんなのもわからないのか」と思われるのが 怖い。 ・聞いたら、すんなり教えてくれる。ただ、「わからないなら聞いて いいから」と改めて念を押される。
事例1:質問できない(4) 教える側の意識 ・「こいつあんまり質問してこないな」って人は意外と質問を溜め込 んでいる。 ・相手側から歩み寄ってくれると非常に質問しやすくなるので、最 初のうちは定期的に声をかけることで質問を吐き出させるとお互 い得する。
事例2.小さなことでパニックを起こす
事例2.小さなことでパニックを起こす(1) ILではない事例(初運営業務) 私の座席の後ろから先輩が見ている。 ・「ログを見てみて」 ・「ステージングに入ってもらえる?」
事例2.小さなことでパニックを起こす(2) ILの事例(配属初日) ・「このプロジェクトはテスト駆動開発でやってます。そんでもっ て――」 ・「バージョン管理はgit使ってますよ、と。あとは――」 ・「じゃあまずは環境構築からやってって。マニュアルはここにある から見てね」
(わ、わかんないです...)
事例2:小さなことでパニックを起こす(3) ・総じて、「できなければやばい」という気持ちから焦っている。 ・必死になってるのは結構伝わるので、察してくれることも多い。 現状できることを探し、手詰まりなら恥ずかしくても聞きましょう。 ・説明してくれてる人が不親切だとか、そういう話ではない。 ・ILが特別厳しいという話でもない(重要)
クライアント開発編
事例3.後先を考えない
事例3:後先を考えない(1) ソケット通信を利用したゲーム開発をしたときの事例。(C++) 前提 ・iOSアプリ開発で、このときで2度目 ・ソケット通信は初経験 ・クライアント1人、サーバ1人の2人での開発(=問題点を指摘す る人間がいない)
ソケット通信部分のソースコード ※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)
事例3:後先を考えない(3) ・ソケットを1本しか作れない。ゲーム以外で通信できない ・後でプロデューサーに「チャット機能入れたいな」と言われる。私 ビビる ・必死のロビー活動によってそれを阻止する ・「リファクタリングしてなんとかしよう」という発想は無い
事例4.自分に非があるかもしれないことを 考えない
事例4:自分に非があるかもしれないことを考えない(1) 事例3と同じプロジェクト 前提 ・ゲームサーバに対してゲームデータを送信する ・ゲームサーバはあるAという処理において、1バイトのデータと4 バイトのデータを連結した合計5バイトのデータを要求している
データ送信部分のソースコード(要約) // 送信データの構造体 typedef struct { char a; // 1バイト
long b; // 4バイト } Foo_t; 事例4:自分に非があるかもしれないことを考えない(2)
データ送信部分のソースコード(要約) 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)
事例4:自分に非があるかもしれないことを考えない(4) ・この構造体は8バイトになる 理想(5バイト) 現実(8バイト) ・アライメントの機能を知らない。 ・問題なのは、自分のミスを疑っていないこと。先に相手側のミス を疑って攻勢に出る。
事例5.サーバは最強だと思っている
事例5:サーバは最強だと思っている(1) 今回は課金時のエラー処理の事例。 while (true) { char* receipt = getReceipt(); //
レシートを受け取る int status = PurchaseManager::send(receipt); // ポイント追加 if (status == SUCCESS) { break; // 成功したので抜ける } }
事例5:サーバは最強だと思っている(2) ・インターバルもなしに無限に投げるのでさながらDoS攻撃状態 ・後ほどインターバルを入れるように修正したが、それほど深刻に 受け止めていなかったりする ・サーバを担当してからクライアントに同じことをされて、やばさを 再認識した
サーバ開発編
事例6.本番の想定ができない
事例6:本番の想定ができない(1) ・PHPによるソーシャルゲーム開発において、初めて一人で一つ の機能作成を任されたときの事例 前提 ・担当したのはログインボーナス機能 ・ライブラリで吸収してくれているので、自分でSQLは書かない。 楽勝である
事例6:本番の想定ができない(2) 当時の本番サーバの構造(作ってるときは知らない) マスター スレーブ 書き込み(UPDATE, INSERT) 同期 読み込み(SELECT)
事例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); // その日の報酬を配布
事例6.本番の想定ができない(4) ・報酬が配られた人間と配られない人間が出てしまった。 ・原因は、スレーブの更新が追いつく前にSELECTしてしまったか ら。 ・クライアントからの流れで、書き込んだものを読み込んだら、更 新された値が手に入って当然という認識。 ・ソースコードレビューのシステムがあれば防げたかもしれない。
まとめ
まとめ ・現場にいる素人に対して、「素人だから大目に見るべき」というこ とではない。 ・ただ、それでも現場で、少なくともプロジェクトが続いている間は 一緒に仕事をしなければならない相手でもある。現実として。 ・その人の数少ない強みなどを拾って、足りない部分をなんとかご まかして、使ってあげてください。お願いします。
ご清聴ありがとうございました。