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
100
この中に1人、素人がいる!
12月2日に行われたインフィニットループ×クラスメソッド×クリプトン合同勉強会で発表した資料です
http://connpass.com/event/20314/
Infiniteloop
August 16, 2023
Tweet
Share
More Decks by Infiniteloop
See All by Infiniteloop
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2025年版)
infiniteloop_inc
15
54k
俺の PHP プロファイラの話 PHP スクリプトで PHP 処理系のメモリをのぞき込む
infiniteloop_inc
1
500
心理的安全性を学び直し、 「いい組織とは何か?」を考えてみる
infiniteloop_inc
0
710
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
infiniteloop_inc
1
910
詫び石の裏側
infiniteloop_inc
0
730
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2024年版)
infiniteloop_inc
7
33k
リファクタリングで実装が○○分短縮した話
infiniteloop_inc
0
230
ADRという考えを取り入れてみて
infiniteloop_inc
0
220
500万行のPHPプロジェクトにおけるログ出力の歩み
infiniteloop_inc
0
170
Other Decks in Programming
See All in Programming
今ならAmazon ECSのサービス間通信をどう選ぶか / Selection of ECS Interservice Communication 2025
tkikuc
20
3.8k
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
1
600
都市をデータで見るってこういうこと PLATEAU属性情報入門
nokonoko1203
1
590
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
620
0626 Findy Product Manager LT Night_高田スライド_speaker deck用
mana_takada
0
140
Select API from Kotlin Coroutine
jmatsu
1
210
Discover Metal 4
rei315
2
110
技術同人誌をMCP Serverにしてみた
74th
1
510
スタートアップの急成長を支えるプラットフォームエンジニアリングと組織戦略
sutochin26
0
300
ニーリーにおけるプロダクトエンジニア
nealle
0
710
PHPで始める振る舞い駆動開発(Behaviour-Driven Development)
ohmori_yusuke
2
240
Create a website using Spatial Web
akkeylab
0
310
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Done Done
chrislema
184
16k
Automating Front-end Workflow
addyosmani
1370
200k
Thoughts on Productivity
jonyablonski
69
4.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
A Modern Web Designer's Workflow
chriscoyier
694
190k
Statistics for Hackers
jakevdp
799
220k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
The World Runs on Bad Software
bkeepers
PRO
69
11k
Adopting Sorbet at Scale
ufuk
77
9.4k
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してしまったか ら。 ・クライアントからの流れで、書き込んだものを読み込んだら、更 新された値が手に入って当然という認識。 ・ソースコードレビューのシステムがあれば防げたかもしれない。
まとめ
まとめ ・現場にいる素人に対して、「素人だから大目に見るべき」というこ とではない。 ・ただ、それでも現場で、少なくともプロジェクトが続いている間は 一緒に仕事をしなければならない相手でもある。現実として。 ・その人の数少ない強みなどを拾って、足りない部分をなんとかご まかして、使ってあげてください。お願いします。
ご清聴ありがとうございました。