Image from Gyazo

ペパボエンジニアとメンターが語る、「エンジニアとして働くということ」

今週8月26日に開催されるペパボエンジニアとメンターが語る、「エンジニアとして働くということ」というオンラインイベントに登壇することになりました。

主にこれからプログラマーになりたい人・就職したい人やなったばかりの人へ向けたイベントです。僕はプログラミングスクールをやっていて大事だなと感じていること(+フィヨルドブートキャンプのCM)について話す予定です。

最後にペパボさんへの就職やフィヨルドブートキャンプへの入学について直接質問できる時間が用意されるようなので、ペパボさんへの応募を考えている人や、フィヨルドブートキャンプ気になってる人は是非ご参加いただければと思います。

フィヨルドブートキャンプをWindowsマシンでも受講できるようにしました。

WindowsではWSL2を使うためWSL2が動くマシン限定ではありますが。(最近のマシンならほとんどOK)

WSL2はかなり優秀で速度もMacと同じか速いぐらいです。僕の場合はMacより性能がいいWindowsマシンでの体感ですがHyper-Vのおかげか圧倒的にWSL2で動かしたRailsの方が速いです。

独自のinitに変えられてるなど若干の違いはありますが基本的に直接入れたLinuxと同じ感覚で使えます。むしろWindowsとの連携機能が多数あるので便利になってるところの方が多いぐらい。

ただ快適なのは経験者の方の話で、これから勉強を始める方にとっては若干敷居が高いので難易度的にはまだMacを一番オススメしております。

フィヨルドブートキャンプをやる上でのOS選び | FJORD BOOT CAMP(フィヨルドブートキャンプ)

まあプログラマーの実際の仕事ってのは純粋なプログラミングというよりこういう環境作りでの苦戦とか、何回ハマったか、バッドノウハウをいくつ知ってるか的なところがあるのでどのOSがいいのかと試行錯誤するのもいいとは思います。

スクールの内容をWindows対応にするのは意外と大変で、最初はMacのBoot CampでWindowsを入れてやってたんですが、色々と使いづらいところもあってWindowsマシンを買ってやりました。

Alienware x17買った - komagataのブログ

macとWSL2環境の違い(macとLinuxの違いも含む)は色々あって下記の連載を全部Windows+WSL2用に書き換えたりしました。

「本当は怖くない黒い画面」入門(Windows + WSL2編)

/binの中身を見てみる箇所があるんですが、macと違って/binがディレクトリじゃなくて1ファイルになってるので説明が難しくなっちゃったり、デフォルトのディレクトリが/mnt/c/Users/komagaになってたり(ホームディレクトリはまた別)、デフォルトシェルがmacはzshだけどbashだったり、経験者の人にとっては、

「あ~この辺違うのね」

で済む点でも初めて知る方にとっては複雑な経緯を回避して説明するのが難しです。まあmac用の教材を用意するときもLinuxとの違いで困ったのでどっちもどっちです。

未だに僕はM1 Macを持ってなくてトラブル時にはM1 Macを持ってるメンターの方に頼らせていただいてますが、次のMacBook Proが出たタイミングで購入してそちらの教材も作っていきたいと思います。

FF2ピクセルリマスターをクリアしました。

Image from Gyazo

Image from Gyazo

FFのピクセルリマスターシリーズが予約できるようになったときにSteamで全部予約しました。

特にFF2が好きなのでFF2を最初にやりました。FC版、PSP版をやったことあるのでそれとの違いを書きたいと思います。

良かったところ

オートバトルモード!これは演出のスピードもアップしてとにかくサクサクできてレベル上げも苦にならなくなるのでとても良かったです。FF12の倍速モードを彷彿とさせますね。

またPSP版でも同じですが全体化魔法がほぼ同時に全員にかかる(くらう)のでサッと終わるのも良いです。FC版ではレッドソウルなどにクッソ遅延行為をされてましたがPC版ではこいつらの憎さが激減です。

FC版・PSP版との主な違い

グラフィックは望んでたものそのもので、魔法などのエフェクトまでピクセルなのは驚きました。ただPSP版では魔法エフェクトは単体・全体で別のものになってたのでそれは欲しかった気がします。

ベースはPSP版ですがSORや秘紋の迷宮などの追加要素は無いです。ストーリー的にSOR無しはちょっと悲しいですが、専用武器など本編のバランスがめちゃくちゃになるし、終わってみた感じは有りかもと思いました。

一番大きな違いは「後列にも攻撃が当たる・後列からでも攻撃できる」点と「逃走不可エンカが無い」点です。

これはかなりゲームバランスに違いがでるので今までのFF2をやってきた身としては新鮮で新しい考え方が求められるので面白いです。

キャラを後列においてもおそらく回避率が上がってるだけで普通にくらいますし、後列からでも命中率が下がるくらいで攻撃できます。(弓以外でもすべての武器で)

こうなっているので、1人だけ前にだして攻撃を集中させて回避回数を育てて、後列から魔法を使うという戦法が使えません。普通より鍛え気味でクリアしましたが最終回避回数はみんな3ぐらいだったので1人残して全員殺しておくとかかなり意識的に回避回数上げをしない限り敵の攻撃を食らっちゃいます。

そんなんだったらクアールやデスライダーどうすんの?と思うかもしれませんが、そこは「逃走不可エンカが無い」という点が全てカバーしてくれます。雑魚戦は全逃げすればいいんです。

唯一宝箱エンカ(逃げられない)と先制攻撃を食らったときだけが大変ですが、素早さが十分あれば確定先行が取れますし、宝箱エンカできついのは1つだけでパラメキア城のサンブレードが入ってるラミアクイーン+クアールx5だけでした。このエンカは厳しいですが、素早さがあれば先行できるので「どうのすなどけい」や「ねむりそう」を使ってなんとか切り抜けられました(3回ぐらい全滅した)。FF2の麻痺や眠りは簡単に治らないのでラミアクイーン眠り効果付き殴りもほぼ死と同じできつい。試してないですが、おそらくウォールも攻撃の追加効果は防げないので役に立ちません。

あと気になったのが2本あったブラッドソードの1本のフィン城地下のヤツがリッパーナイフに変わってたところです。これはPSP版もそうだったかもですが、たしかにブラッドソードは1本だけの方が良いよなと思い直しました。

少しのバグ

クリアまでに1回だけフリーズしたことがあって気になりましたが、このぐらいはいいやって感じです。

感想まとめ

この感じだと他のピクセルリマスターも非常に期待できそうなので楽しみです!

フィヨルドブートキャンプの内容をWindowsにも対応させるべくDellのAlienware x17を買いました。

Image from Gyazo

17インチはデカイ!

これまでは(Macの)Boot Campを使ってWindowsを使ってたんだけどやっぱりイマイチ遅いし、Mac上で動かすとやはりカメラやオーディオなどがうまく動かなかったりしてました。

純粋なWindows環境はやはり快適!GPUが早いのでサクサクしてるし、Windows Helloでのカメラでのログインもしっかり動くし、Bluetoothオーディオもばっちり(あたりまえだけど)。

WSL2上のインストールやコンパイルもすごく早くて快適。

ついでにサイバーパンク2077も動いて嬉しい。

プログラミングスクールのフィヨルドブートキャンプを運営しています。

プログラミングに限らずですが、メンターの役割の人が、

「生徒の人から質問がきた時になぜすぐに答えを即答してくれないのか」

について書きたいと思います。

質問している人にとっては、「なんですぐ答えを即答してくれないんだよ、ヒントとかいいからさ。ウゼェ〜」と思っちゃうかもしれません。

そこでプログラミングのバグを殺人事件、バグの原因を犯人に例えて書いてみたいと思います。

プログラムが動かない殺人事件

新米プログラマー「このプログラムが動きません、なぜでしょうか?」

新米捜査官「この殺人事件の犯人がわかりません、誰でしょうか?」

ベテランプログラマー「15行目のiの変数が原因ですよ。」

ベテラン刑事「吉田が犯人だ。」

〜次の事件〜

新米捜査官「この殺人事件の犯人がわかりません、誰でしょうか?」

ベテラン刑事「おい!毎回俺に犯人を聞くつもりか?捜査の仕方を覚えろ!」

ベテラン刑事「まず関係者に事情聴取をしろ」

ベテラン刑事「そしてアリバイを調べろ」

ベテランプログラマー「まずエラーメッセージとログを確認してください。」

ベテランプログラマー「まずはprintデバッグをしてみましょう。」

犯人だけわかっても意味がない

多数の事件を経験してきても犯人だけ知ってるだけでは意味がありません。次の事件を解決できる捜査方法を知っている必要があります。

スクールで課題をやるのはそのためであって、答え自体に意味はありません。

あらゆる推理小説の犯人だけ知ってても推理することが出来ないのと同じです。

課題を通して(プログラミングの問題の)捜査方法を学び、習得することが目的です。

プログラミングの捜査方法

プログラミングの捜査方法を身につけるとは、下記を指します。

  • デバッグ方法を身につける
  • わからない情報の調べ方を身につける

それを学ぶにはまず基本的な用語・概念を学んでおく必要があります。

例えば、

「アリバイってなんですか?」

「事情聴取ってどうやってやるんですか?」

「警察が守るべき法律には何がありますか?」

などを知らないと捜査方法を学ぶことが出来ません。

プログラミングでいえば、

「Terminalの使い方」

「Linuxの使い方」

「HTTPの理解」

などがそれにあたります。

そして自走へ

基本的な知識と捜査方法を覚えればあとは自分で新しい事件を経験していけば一人で成長していくことが出来ます。

プログラミングでも同じです。常に新しい技術が出てくるので誰かに教わるのではなく、自分で技術を習得する必要性が出てきますが、基本知識と捜査方法さえ分かっていれば自分で調べて学んでいくことが出来ます。

プログラミングスクールのフィヨルドブートキャンプを運営していて、就職に関するアドバイスを求められることも多いです。SESについてはよく訊かれるのでここにまとめて回答しておきます。

SESとは

SES(System Engineering Service)とはソフトウェア開発・運用・保守における委託契約の一種です。特定の業務に対してエンジニアを派遣し、エンジニアリングの能力を時間で提供します。

他に一般的な契約として請負契約があります。(特定派遣については2018年に廃止されました)

この二つは主に報酬の対象が違います。

  • SES:労働時間に対して報酬を支払う。
  • 請負:成果物に対して報酬を支払う。

SESはその時間働いていれば必ずお金がもらえますが、請負は成果物(システム)ができなかったら報酬が貰えません。

請負が成果物によって報酬が出るか決まるということは、「成果物とは何か?」ということを事前に明確に定義しなければいけないので大変です。気軽に「うちの開発が大変だから2〜3人手伝ってくれない?」という頼み方はできないわけです。

そういう点で成果物の定義が難しいものやまだ決まってない・流動的なプロジェクトなどで重宝されているのがSES契約です。

SESは良いか悪いか

ただの契約の一種なので一概に良い・悪いとは言えません。

一つの企業の中でプロジェクトによっていろんな契約方法を併用するのは当然ですし、SES契約でやるホワイトなプロジェクトもあれば、請負契約でやるブラックなプロジェクトもあります。

実際の話

とはいえSES契約の

  • 「成果物に責任を持たなくて良い」
  • 「その時間働けば確実に報酬がもらえる」

という点を悪用して

  • 「全くそのプロジェクトをこなせるスキルのない状態でエンジニアを送り込む企業」
  • 「プロジェクト内容・待遇を度外視してとにかく沢山エンジニアを集めて送り込む企業」

といったブラック企業がたくさんあるという日本の現状は確実にあります。それによってSESと聞いただけで嫌悪感を持つ人もたくさんおり、それはある程度仕方ない面があります。

結論

SES契約をやっているかどうかは関係無い。就職するならホワイトかブラックか企業を慎重に見定める必要がある。

おまけ - ブラックIT企業の見極め方

ここからは僕の経験上の話になってしまいますが、下記のような企業はブラック率が高いです。

給与・賞与が極端に低い

「出世すればすごく上がるよ」という話は信用してはいけない。ホワイトな会社は最初から給料が良い。

コードを書かないプロジェクトばかり

コードを書かないプロジェクトばかりの会社は絶対やめた方がいいです。居てもスキルが上がらないからです。

この業界の大きなメリットである「給与もらいながら勉強できる」が享受できません。

「勉強頑張ればコードを書くプロジェクトに入ることもできるよ」という話を信用してはいけません。ブラック企業ではそういう人は1〜2割しかいない場合がほとんどです。

プログラミング技術の高い先輩がいない

上記と関連して、先輩の姿は将来の自分です。「自分がすごく勉強を頑張れば・・・」という人がいますが、組織の文化が人を作ります。

プレスコットのピクルスの原理

「漬け水がキュウリに漬かるよりキュウリが漬け水に漬かる方が早い」

つまり「ここの文化を俺が変えてやる!」と意気込んでも、組織の文化がかわるより先に「そこの文化に自分が染まる」方が早いという意味です。

自分が成長できる文化を持つ会社を自分で選びましょう。

使ってる言語が微妙

あくまで僕の経験なんですが、コードが書ける仕事といっても、オラクルのERP上でしか動かない言語とか、特定のハードウェア上でしか動かない言語などを使ったプロジェクトに新人を送り込む会社は社員の成長を軽視しています。

プログラミングテストの機能を作りたいの続き

ネットにアクセスするrubyコードnet.rb

require 'net/http'

Net::HTTP.get_print 'example.com', '/'

これをコンテナ内で実行する。

$ docker run --rm -ti -w /tmp -v /Users/komagata/dev/src/github.com/fjordllc/drill-sergeant/tmp:/tmp/program ruby ruby /tmp/program/net.rb 
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
(略)

ネットをnoneにして実行する。

$ docker run --net=none --rm -ti -w /tmp -v /Users/komagata/dev/src/github.com/fjordllc/drill-sergeant/tmp:/tmp/program ruby ruby /tmp/program/net.rb
/usr/local/lib/ruby/3.0.0/net/http.rb:987:in `initialize': Failed to open TCP connection to example.com:80 (getaddrinfo: Temporary failure in name resolution) (SocketError)
    from /usr/local/lib/ruby/3.0.0/net/http.rb:987:in `open'
    from /usr/local/lib/ruby/3.0.0/net/http.rb:987:in `block in connect'
    from /usr/local/lib/ruby/3.0.0/timeout.rb:97:in `block in timeout'
    from /usr/local/lib/ruby/3.0.0/timeout.rb:107:in `timeout'
    from /usr/local/lib/ruby/3.0.0/net/http.rb:985:in `connect'
    from /usr/local/lib/ruby/3.0.0/net/http.rb:970:in `do_start'
    from /usr/local/lib/ruby/3.0.0/net/http.rb:959:in `start'
    from /usr/local/lib/ruby/3.0.0/net/http.rb:490:in `get_response'
    from /usr/local/lib/ruby/3.0.0/net/http.rb:444:in `get_print'
(略)

ネットを遮断した状態でホスト上のプログラムをコンテナ内で実行できた。

sinatra + pumaでリクエストを受けて結果を返すWebサーバーを作れば同時アクセスはpumaが捌き、ファイルの後片付けはdockerがやってくれるだろう。

pumaで同時アクセスされてもいいように被らない一時的なディレクトリを作ってそこにプログラムを置いて実行すれば良さそう。(プログラム名をランダムにすると$0とかがダサくなるからディレクトリの方をランダムな名前にしたい)

次は実行時間を30秒以内とかに制限したい。

競プロのサイトのように入力されたコードを実行して出力が指定のものになってるかどうかをチェックする機能をプログラミングスクールの機能として作りたい。

少なくともrubyとjsは実行できるようにしたい。メンターの@maedanaさんから競プロのジャッジサーバーのOSSであるarrow-judgeを教えてもらった。

なるほど、chroot, cgroup, ulimit等で実行ディレクトリやCPU・メモリといったリソースを制限しているようだ。

ってことはdockerでもできそうだということで調べてみた。

dockerでコンテナから外部へのネットワークアクセスを禁止する

まずは外部ネットワークにアクセスされると危険なので防ぎたい。

$ docker run --rm debian ping komagata.org -c 3
PING komagata.org (151.101.1.195) 56(84) bytes of data.
64 bytes from 151.101.1.195 (151.101.1.195): icmp_seq=1 ttl=37 time=4.34 ms
64 bytes from 151.101.1.195 (151.101.1.195): icmp_seq=2 ttl=37 time=5.27 ms
64 bytes from 151.101.1.195 (151.101.1.195): icmp_seq=3 ttl=37 time=5.32 ms

--- komagata.org ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 6ms
rtt min/avg/max/mdev = 3.698/4.748/5.385/0.748 ms

これが失敗するようにできれば良い。

$ docker run --net=none --rm debian ping komagata.org -c 3
ping: komagata.org: Temporary failure in name resolution

デフォルトでインストールされる3つのネットワークのうちの一つnoneを指定すればあらゆる外部ネットワークアクセスは防げそうだ。

dockerでメモリ使用量を制限する

docker run -m 100m --rm debian ping komagata.org -c 3 
PING komagata.org (151.101.1.195) 56(84) bytes of data.
64 bytes from 151.101.1.195 (151.101.1.195): icmp_seq=1 ttl=37 time=3.70 ms
64 bytes from 151.101.1.195 (151.101.1.195): icmp_seq=2 ttl=37 time=5.16 ms
64 bytes from 151.101.1.195 (151.101.1.195): icmp_seq=3 ttl=37 time=5.39 ms

--- komagata.org ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 6ms
rtt min/avg/max/mdev = 3.698/4.748/5.385/0.748 ms

100Mに制限してみたがどのぐらいが適量かわからない。

続く

あとはコードを楽にcontainerで実行したい。そして標準入力・コマンドライン引数を流し込んで、標準出力・標準エラーが取れればOKだが・・・

もう5月も後半になりますが、新人の方々はもう新しい生活に慣れたでしょうか。すごく良い会社だとしても慣れない最初のうちはしんどいものです。そこで、20代の内に6社以上転職し、そこからはもう数えるのを辞めた・・・ミスターアンカウンタブルこと私komagataが新しい会社に入った時のいつもの気持ちをお伝えしたいと思います。

入社1日目

緊張もありごちゃごちゃ考える余裕は無い。ただ帰宅後どっと疲れている。

入社2日目

道に迷わず出社できる。

入社3日目

これからずっとここに通うのかよ〜

入社した週の週末

1番しんどい。フィジカル・メンタル共に疲れがでかい。ただ、どんなに自分に合ってて良い会社だとしてもいつもこうなので耐える。 友達に愚痴を言えるぐらいであれば割と余裕がある方。

入社してから2週目の週末

最初の週末と同等レベルでしんどい。友達に愚痴を言える気力もなかったら要注意。

入社してから1ヶ月後

もう1ヶ月か〜なんとか1ヶ月経ったな〜という気持ち。まだしんどいが、2週目の週末よりはだいぶマシ。

入社してから1ヶ月半後

楽ではないが、この感じだったら続けられるかもという気持ち。

入社してから2ヶ月後

これはやっていけるわ。という気持ち。

入社してから1年後

過ごしやすいわぁ〜

入社してから1年半後

業務は大体わかった。飽きてきたな・・・

入社してから2年後まで

転職。(振り出しに戻る)