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

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

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

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

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

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

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

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

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

ベテランプログラマー「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年後まで

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

tmux/screen上でのnvimのescapeレスポンスを早くする - 真面目に、強く、上品に

これ!

ずっとneovimでESC押した後の次のキーの認識までのタイミングが長くて、vimのサクサクした操作というメリットがなくなっていました。しかしこの状況を言葉でなんと表現したら良いか難しくてググれず、困っていました。

いつも何か無意識にESCを押した後一瞬待つという謎のワークアラウンド作法が身につくほどでしたが、この度解決しました。ありがとうございます!サイコー!

先週、食中毒になったようで数日間非常に苦しんだ。

もう回復してあとは胃が荒れているぐらいなんだが、吐き気のない生活のなんとすばらしいことか。

おそらくしゃぶしゃぶ食べ放題に行った時の肉か生卵かどちらかに当たったと思うんだが・・・。

肉はしっかり火を通そうと固く決意したし、もう生卵を食べるのが怖くなった。

そういえばこのブログのドメイン(docs.komagata.org)ばかり使っていてkomagata.orgのドメインはだいぶ放置していたのでサイトを作りました。

Google Domainsを使ってるので(?)Firebase Hostingにおきました。

CSSのAnimationはTwitterで@shimewtrさんに教えてもらいました。ありがとうございます。

https://komagata.org

ずっと下記に書いたような問題意識を自分たちのプログラミングスクールに対して持っております。

OSS Gateオンラインワークショップに参加 - komagataのブログ

そこでこんな活動をやってみたらどうかな〜と思っています。(スクール内限定じゃなくてパブリックなワークショップにしたい)

ワークショップ

OSS活動は終わらないネットゲームであり、みんな脳汁を垂れ流して楽しんでおります。しかしそこに辿り着くまでに色々と障壁があり、プログラミングに興味のある人や初心者の方にプログラミングの楽しさを知ってもらうためのワークショップができないかと考えております。(また、OSS活動以外のプログラミングの楽しみもいいと思う)

Joy of Programming(プログラミングの楽しみ)

1回につき1テーマのプログラミングの楽しみについて体験してもらい、みんなで楽しむ。

役に立つとか、勉強になるとかは置いておいて、楽しさを一番重視する。

テーマ1

自分のための小さなスクリプトを作ろう。

~/binとかに置くような自分のためだけのちょっとした便利スクリプトをみんなでかく。

「昼飯をランダムで決めるスクリプト」とか「~/Downloadsディレクトリの中を定期的に削除するスクリプト」とか「平日の10時に自動で勤怠アプリにログインする」スクリプトとかそういうやつです。

テーマ2

基本のアルゴリズムを実装してみよう。現代のプログラミング言語であれば標準ライブラリで備えているような基本的な簡単なアルゴリズムを自分の得意な言語で実装してみる。

テーマ3

フリーソフトウェア運動に参加する。フリーソフトウェアとは何かを学んで入信する。自分の使ってるソフトをフリーソフトウェアに置き換えられないか検討したり、布教活動をする。

テーマ4

Quineを作ってみよう。(説明すると長くなるので省略)

テーマ5

使ったことない言語を使ってみよう。

テーマ6

使ったことないOSを使ってみよう。

テーマ7

競技プログラミングに挑戦しよう

テーマ8

名著を読もう。

みんなで色々な名著を読んできて、大体の内容を話してもらう。他人におすすめする。

テーマ9

ライブラリを作ろう。gemとかnpmとかそういうのの作り方ワークショップ。これができたらOSS活動に進む感じ。

どういうワークショップにするか

1〜3時間ぐらいの長すぎないワークショップにしたい。一回につき1テーマで開催する。色々やってみて評判の良いテーマが絞れたらそれらを繰り返しやる。1 > 3 > 7...とか。

前半は説明をして、後半で手を動かしてやってみる。最初は1人でサポートしきれるぐらいの人数が良いかもしれない。

全体として、Terminalの使い方、簡単なコードが書ける力(どの言語でもいいが)などが必要になる。

Terminalの使い方は(昔に書いた)下記で学べるかもだが、基本的なプログラミングも学べる何かが欲しい。

本当は怖くない 黒い画面入門: https://fjord.jp/kuroigamen.html

初心者向けだけど、プロでもネタのチョイスによってはずっと楽しめる感じにしたい。例えばQuine入門の内容をやるけど、超難しいやつを自分のテーマとして毎回作っても良いみたいな感じ。競プロ入門を毎回やるけど、すげー人が既にいるとか。コミュニティーの中に目指したくなるロールモデルがいるとより良いと思うので。

ちょっとできるように考えてみたいと思います。

OSS Gateオンラインワークショップ2021-03-13にサポーターとして初参加させていただきました。

参加理由

フィヨルドブートキャンプというプログラミングスクールを運営していますが、生徒の方で「頑張って、歯を食いしばって勉強する!」という状態になる方が出てしまうのが常々僕らの取り組みの問題だと感じています。

「プログラミングが面白くてハマってたらスキルが上がっていた」というのが理想です。逆にハマりさえすればあとは勝手に勉強していくので面白さを伝えるのがスクールの一番の目標といっても過言ではありません。

「どうやったらプログラミングの面白さを伝えられるんだろう?」と考えたときに、やはり「プログラミングの楽しさっつったらOSS活動だろう」ということでOSS活動に参加する人を日夜増やし続けているOSS Gateさんのやり方を学びたく、また僕もその活動をしたいと思って参加しました。

OSS活動参加をサポート

今回はビギナーの方が自身で選んだOSSであるApache AirFlowの開発に参加してみるのをサポートしました。(実際は進行役のPiroさんのメンタリングを僕はほとんど聞いてるだけの形ですが🤭)

詳細なメモを取りながらまず自分でインストールしてみる。わかりにくかった部分をIssueフィードバックする。その部分を直すPRを作って送ってみるという一連の流れをやりました。

僕もAirFlowって初めて知りましたし、途中でちょっとしたbashの問題にハマったり、Issueを書く時の適した英語表現など、僕も非常に勉強になりました。

感想

事前に動画で予習してる時から感じてたのですが、非常に実践的で、そして予想以上に手厚くサポートしてもらえるワークショップですごいなと思いました。

まさに今回参加されたビギナーさんは「これだったらこのあと家で一人でもできる」と思ってもらえたんじゃないかと思います。

「ソフトの文句を言う人」から「ソフトの開発者」に半日で変わったのだからすごい進化です。

スクールでの適用に対する問題点

ひるがえって自分の運営するスクールでの適用を考えた時の問題点を考えてみました。

OSSって何?

プログラミングスクールの生徒として考えるとまず、「OSSってなんですか?」という状態の人にはまだ早いということです。

人が作ってる?

「XXX(ソフト・ライブラリ名)がとても便利!こんなのがあるなんて知りませんでした。」

という感想に対して僕が

あるというより誰かが便利に作ってくれたってことなんですよね。」

とコメントをすると

「そうですよね。誰かが作っているんですよね。考えてみたこともなかったです。」

的なやりとりが大体発生し、そこで初めてOSSなどを意識して学習していくことが多いです。まずそこを超えた人(=ソフトのありがたみを感じたことのある人)じゃないと参加が難しいと思いました。

コマンドライン・gitが使えない

また、コマンドライン・gitが使えることも前提となるので、フィヨルドブートキャンプでいえばそれらのカリキュラムを履修した人以降が対象だと思いました。

スクールに適用するなら

OSS GateではOSS活動に参加したことのないプログラマーが対象ですが、フィヨルドブートキャンプの生徒に対して行う(またはプログラミング学習中の人に行う)ならば、「XXXが使える人」「XXXのカリキュラムより先に進んでいる人」などの前提条件を決める必要があるなと感じました。

そして僕の問題意識から考えると、まずはそこに達していない人にプログラミングの楽しさを伝える活動が必要なのかなと思いました。(達してる人はOSS Gateへ!)

ちょっとそういった活動も考えてみたいと思います。