soy-curd's blog

へぼプログラマーです [https://twitter.com/soycurd1]

地方のプログラマーが都内のベンチャーに転職して2年ぐらい過ごして感じたこと

自分は以前群馬のSIer的な企業で働いていて、転職を機に東京に引っ越した。そして働き始めてからいつのまにか2年以上も経っていたので、新卒として群馬で働き始めてから東京に転職して今までに至る流れを、備忘録としてここにまとめてみる。地方から都内に転職しようとしている人がいたら、もしかしたら参考になる部分もあるかもしれない。

前職(SIer的な企業)

自分は大学時代は生物学をやっていたが、就活していた時はちょうどピペド世界がもし100人の博士だったらのような話がキャンパス内に蔓延していた。研究室の先輩を見ても、アカデミックに残るには命と生活を削らないと無理そうだったので、なんとか就職はしたいなと思っていた。生物学を学んでいたら食品業界とか製薬業界とかに就職しそうなイメージだと思うけれど、研究室の同期の就職先は公務員×2SIer×2といったかんじで、非常に生々しかった。自分はそのSIerのほうの1人なのだが、これは研究の実績的にバイオは無理っぽかったとの、研究でCとかMATLABをちょっと触ってたのと、理系っぽい業界で未経験でも入れるのはSIerぐらいだろうな、と雑に思っていたからだった。

就活ではなんやかんや苦労して1個だけ内定をもらい、そこに新卒で入社した。内定先は東京の企業だったが、すぐに群馬の子会社に出向になった。SIerピラミッドでいうと二次受けぐらいの位置の会社で、たぶん世間で言われているようなブラックSIer企業ではなかった。研修もたっぷり3ヶ月はあったし、配属された部署はほとんど残業もないし、仕事も急いでやらないとヤバイやつは新人には回ってこなかったし、家賃補助もボーナスもあった。完全にホワイト企業だった。ドキュメント書きやテストの仕事が多かったので、どっちかというとコーディングをたくさんしたいと思っていた自分としては多少不満だったが、まあそれも新人のうちだけだろうと思って素直に働いていた。

ただ、働いていくと次第に、残業がないのが自分の部署ぐらいだということがわかってきた。他の同期は今月もX0時間残業だ、というようなことをよく言っていて、4・5年目ぐらいの他部署の先輩で心が破壊されてしまう人もぼちぼちいた。結局多少プログラムが書けるようになるとすぐに外注管理や協力会社との折衝が仕事のメインになり、社会的ななんやらの板挟みになって壊れてしまうのだ。(壊れてしまった場合、休職したのちに復帰プログラムが組まれ、負荷の少ない職場からリスタートできる)。

そして自分が働き始めて2年目の冬、ぬるま湯だった我が部署に新たな案件が振ってきた。既存のガラケーのアプリをイマドキのタブレットのアプリにリプレイスするという素敵な案件だ。しかも今流行りのオフショア開発を用いているということで、高品質なプロダクトが素早く低価格で顧客に提供できるはずだった。

自分は別のチームで別の作業にしばらくの間従事していたのだが、時間が経つにつれその素敵な案件に先輩がどんどん吸い込まれていった。どうやらオフショアで出していた開発の部分でバグが大量に見つかり、その特定に人員が必要らしかった。ブリッジSEのための席が新しく増え、協力会社の方々が常駐するようになり、ついに自分も客先でテスト作業をするために駆り出されてしまった。この適度に炎上した案件はそれなりの時間と人員をかけて鎮火されたけれど、わかったのはこの部署は決して安全なわけではなく、他の部署と同じようにいつ誰が病んでもおかしくないということだった。自分はまだ病んではいなかったが、きっとそれは今自分がただのプレイヤーだからで、未来の自分についてはなんの保証もできなかった。

転職活動

それで約2年前、転職活動を始めた。これまでの知見として、マネジメントは心を破壊されるということがわかっていたので、コーディングをメインで働けるほうが良いかなと思った。CodeIQとpaizaをやってみて、CodeIQのほうはほぼ人材紹介会社からしかリアクションがなかったので、paizaのほうが良さそうに感じた。skypeで面談したり実際に東京まで言って話を聞いたりすると、どこの仕事も楽しそうだった。ある1社で給料を前職から維持してくれるというところがあり、入社を決めた。新卒で就活していたのと比べるとはるかにあっけなく決まったので、かなり拍子抜けしたような覚えがある。

つまり自分は、都内のベンチャーに入りたいから都内のベンチャーに転職したのではなく、コーディングでまともに仕事できそうな企業が都内のベンチャーだったので、というかpaizaに登録している企業がそういうかんじだったので、今の職場に転職したということになる。だから、もし群馬県の企業や他の土地でSIer的なやばさから遠い職場環境があったら、そのような企業に入っていたかもしれない。今思うとpaizaのSIer煽りに完全に乗せられた形だが、転職後に前の職場の同僚に話を聞くと、すでに前の職場の部署は解体され存在せず、そしてチームの先輩どころか役職持ちの方々まで新しい部署で精神を破壊させられりたりしているようなので、結果的にはpaizaに乗せられて良かったと思う。

都内のベンチャーで就職

就職先は山の手線沿いの西側の駅の職場だった。家は安そうなところで板橋区東上線沿いのアパートにした。家を出て職場まで1時間程度で、今は耐えられているが、満員電車に遭遇した時など死にそうになるので(東上線は遅延からの満員電車コンボはよくある)、かなり家選びは悪手だったかなと思う。いずれ引っ越ししたい。

仕事自体はかなり良かった。入った頃はPythonを書いていて、今はその他にNode.jsだったりAngularだったりも使って仕事している。同僚も自分よりレベルが高い人ばかりで学ぶことが多いし、新しい技術が好きな人が多いので自分もいろいろ勉強しなきゃなという気持ちになる。

物理的には、夏場に短パンサンダルで出社できるのがめちゃくちゃ良い。群馬では徒歩通勤で近かったのは良かったが、夏にスーツと革靴で出社させるのは端的に頭がおかしかった。近年の夏はスコールが発生したりして、実質熱帯雨林気候なのだから、それに合わせてライフスタイルも変革する必要がある。

もちろん今の職場も100%良い会社なわけではなくて、ささいな不満もないわけではない。そういう影響で、同僚では他の会社に転職していってしまう人もいる。でもそれはこのweb業界が他の業界と比べてプログラマーに対する環境がかなり良いからで、働いている中で感じる不満が、相対的に大きく感じてしまうのだと思う(常に隣の飯は白いし、東京はが本当に歩いて1分くらいしか離れてない会社だったりする)。

最近不安なのは、自分のバックボーンが生物系なこと、自分のプログラミング経験が周りと比べて短いことだ。中学とか高校からプログラミングをやっている人間と、大学1年のCの授業をほぼコピペで乗り切って20才すぎてからようやく研究でプログラミングし始めたのとでは、やはり決定的に知見が違う気がする。自分は仕事がある程度できている状態だと自分でも思っているが、そのある程度が、ちょっとSQL書けて、ちょっとサーバーサイド書けて、ちょっとフロントエンド書けるというかんじで、特に誇りを持って自慢できるなにかがあるかんじじゃない。今の同僚や、転職していった人たちに較べて、2分の1かそれ以下ぐらいのパフォーマンスしか出ていないのではないか?と思うことがある。自分がこれからどれだけ学んでも、周りと比べて誇れる技術力が持てるか、見通しが立たない。

でもそんなこと不安に思っててもたぶん意味はないし、自分の技術力の未熟さを言い訳しているだけなので、気にせずに今後も淡々と好きなことを勉強していきたい。その結果が誇れるような技術力に跳ね返ってくればかなり嬉しいが、それは5年後だったり10年後だったりするかもしれないので、それまではその時その時の現状で出せる全力のパフォーマンスで会社には貢献していきたいと思っている。

さいごに

ほぼ悩み相談みたいな文章だし、似たようなことを以前も書いている気もするが、いったん今の段階で自分が働いてきてこれまでに感じている感情の流れをまとめてみた。とりあえず、生物学専攻の人でもプログラマーで就職はできるということと、東京のベンチャーにはいつでも入れるということは言えた。似たような境遇の人がもしいたら、少しでも参考になれば良いなと思う。

JavaScriptでforの二重ループからforを一個削除する方法

プログラマのためのコードパズル」を読んでいたところ、かなり始めのほうに、for文の二重ループから forを一個削除することによりプログラムを短くするコードゴルフの技法が載っていた。 しかし、簡単な説明のみで式変形され、すぐには理解できなかったので、 理解しがてらその方法を紹介していく。

まずは以下のような二重ループがあったとする。

function solve() {
  for (var a = 0; a < 10; a++) {
    for (var b = 0; b < 10; b++) {
      if (a * b === 81) {
        console.log("solve!");
      }
    }
  }
}

solve()

このとき、変数aとbがそれぞれ0から9までインクリメントされ、a*b9*9=81となる場合が発生するので、"solve!"というログを見ることができるだろう。

これをfor一個で書く方法として以下のようなものがある。

function solve() {
for(a=0,b=-1;a<10;b<9||(b=-1,a++))b++,a*b==81&&console.log("solve!")
}
solve()

確かにコードからはforが一個消えている。しかし、消えた分のforの処理はどこで行われているのだろう?

これではわからないので、まずは読みやすくフォーマットしてみる。

function solve() {
  for (var a = 0, b = -1; a < 10; b < 9 || (b = -1, a++)) {
    b++;
    if (a * b == 81) {
      console.log("solve!");
    }
    // ※
  }
}

forの加算式の、b < 9 || (b = -1, a++)が目につくと思う。 ここで、※の部分にconsole.log(a, b)を仕込んでaとbがどのように増えるか見てみる。

0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
1 0
1 1
1 2
.
.
.

普通にforを二重にした場合と同じように、内側のループの変数がインクリメントされ、 その後外側のループの変数がインクリメントされている。

インクリメントしている部分はb++の箇所だ。

それでは、なぜこの箇所でaのループが一回しか回っていないのにもかかわらず、b++が10回も実行されるのだろうか...?

ここで、b < 9 || (b = -1, a++)をもう一度見てみる。これはfor文の加算式ではあるけれど、もっと重要な点がある。それは、a++b < 9の場合は実行されないという点だ。

つまり、このfor文は変数aについてだけのループではない。bが9より小さい場合はbのループを回し、そうでない場合にaのループを回す役目があるのだった。

(b = -1, a++)を式(x), b++を式(y)として、 logの結果にコメントをつけてみると、

0 0  // b == -1 < 9なので式(x)は実行されない。式(y)のみ実行でb == 0になる
0 1  // b == 0 < 9なので式(x)は実行されない。式(y)のみ実行でb == 1になる
0 2  // 上記と同様...
0 3  // 上記と同様...
0 4  // 上記と同様...
0 5  // 上記と同様...
0 6  // 上記と同様...
0 7  // 上記と同様...
0 8  // 上記と同様...
0 9  // 上記と同様...
1 0  // b == 9 < 9ではないので式(x)が実行。aがインクリメントされ1, bが-1になる。さらに式(y)が実行されb == 0になる。
1 1
1 2
.
.
.

ということだとわかる。ひとつひとつ処理を追ってみて、ようやく仕組みを理解できた。

コードゴルフでは、forの([初期化式]; [条件式]; [加算式])の部分で、式で可能なあらゆることをするようなので、そのあたりを注意して本のほうを読み進めていきたい。

AMP対応のためのnpmモジュール作った

www.npmjs.com

ampは全てのcssを外部ファイルではなくhtmlに埋め込まなければならないので、直書きしたくない場合は、 なんらかの手段でhtmlにcssを持ってくる必要がある。

github.com

が良さそうだったが、ampタグには対応していなかったので、PRを出した。だが、よく見るとこのリポジトリはPR放置されるかんじのやつだったので、 amp対応したやつを別に公開しておいた。

使い方

例えば以下のように,

index-amp.html

<html>
  <head>
    <style amp-custom href="./yo-amp.css"></style>
  <body>
    <h1 class="hey">
        Hey!
    </h1>
  </body>
</html>

yo-amp.css

body {
  background-color: cyan;
}

.hey {
  color: red;
}

というようなファイルがあったとき、

yarn add html-inline-amp
./node_modules/html-inline-amp/bin/cmd.js -i index-amp.html -o ./_index-amp.html -b ./

すると、

<html>
  <head>
    <style amp-custom>body {
  background-color: cyan;
}

.hey {
  color: red;
}</style>
  <body>
    <h1 class="hey">
        Hey!
    </h1>
  </body>
</html>

というように、cssがamp-customタグに埋め込まれたhtmlファイルが出力される。

webpackとか使うまでもないときに便利かもしれない。

トヨタ生産方式読んだ

トヨタ生産方式読んだ。サブタイトルに『脱規模の経営をめざして』と書いてあるが、読了後に脱規模なんて単語本文にあったか?という気分になった。目次にもその文言がなく、謎。

内容は二つで、『ジャスト・イン・タイム』と『自働化』が生産の肝であるだという話だった。ジャスト・イン・タイムのほうは、「大量生産だと工程毎に無駄(在庫)が出る」-> 「無駄がでないように必要な分だけ必要なタイミングで作る」ということで、それを実現する方法がカンバン。カンバンを使うと、後工程は前工程に必要な部品を必要な時に要求し、それをもらうことができる。 アジャイルサムライで言うと、WIP(仕掛中のタスク)は4つまでで、イテレーションのない開発をカンバン方式として紹介しているが、これは結局、タスクをどこかで溜めてしまうと、後回しになったり、結局リリースされなかったりすることを防ぐためなのだろう。そこが在庫とのアナロジーになっている。

自働化については「ポカヨケ」とかの仕組みと一緒に説明されていて、機械・ライン・チームは、故障すると自動で止まる。変な部品を後工程に流したりして、後で人手で直す、みたいなことを防ぐためだ。そのために、そもそも人が、ミスをしないように機械やラインを設計したりもする。これについてはCIの考え方が対応する気がする。タスクを回していくなかで、常に高品質でバグのないプロダクトを保つため、こまめにテストし、デプロイする。

本を読んで、脱規模という単語自体は見当たらないが、そのような考え自体はいたるところで示唆される。大量生産できない市場環境の中で、いかに無駄を省いて(真の)生産性を上げるかについて繰り返し語られるからだ。微視的な効率が、巨視的なレベルでの効率を築いていくことに対する、こだわりが伝わってくる。

GitHubのエクステンションサービスでZenHubというものがあって、これがあるとGitHubのissueをカンバンっぽくすることができたり、バーンダウンチャートを見れたりする。これを見るだけでアジャイルしてる感があるので満足度があるのだけれど、何も考えずこれだけ使ってもただ雰囲気だけアジャイルっぽいことをしてるだけなのでたぶん意味がなかった。ただ、今回トヨタ生産方式を読んで思想的なものを学ぶことができたので、今後はよりアジャイルっぽい状態でアジャイルできると思う。

トヨタ生産方式――脱規模の経営をめざして

トヨタ生産方式――脱規模の経営をめざして

Ubuntu16.04でgolangのechoを使う

まとめ

Ubuntu16.04 LTSはデフォルトでインストールされるgolangのバージョンが1.6のため、最新のechoを実行することができないので、golangのバージョンを上げる必要がある。

事象

echoがgolang1.7から入ったcontextパッケージに依存しているため、インストールに失敗する。

対処

# apt-getのリポジトリ更新
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt-get update
sudo apt-get install golang-go # -> 1.8が入る
go get -u github.com/labstack/echo

以上です。

Ubuntu16.04でgolangの開発環境Goglandのインストール

インストーラーの入手

https://www.jetbrains.com/go/download/#section=linux

JetBrainsのサイトからGoglandをダウンロードします。2017年6月時点では、EAP 9, 171.4694.35が入手できました。

インストー

tarで固められたファイルが手に入るので、解凍してください。Ubuntu16.04の場合、ダブルクリックでArchive Managerが起動しますので、Extractを実行して解凍してください。

その後、terminalを立ち上げ、解凍したディレクトリに入ってから、gogland.shを実行します。

cd {YourLikeDir}/cd Gogland-171.4694.35/bin/
./gogland.sh

その後、GUIの画面が立ち上がります。今回は初めてのインストールでしたので、Do not import settingsを選択しました。

f:id:soy-curd:20170610205622p:plain

これでインストールは完了です。

golangの設定

golangをインストールしていない場合は、まずそこから始めましょう。

sudo apt-get install golang

# bashにgopathの設定
mkdir ~/{YourLikeDir}/go
echo "export GOPATH=$HOME/Project/go" >> ~/.bashrc
echo "export PATH=$GOPATH/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

これで設定は完了です。

Goglandを使ってみる

File > New > Projectから、新規プロジェクトを作成します。 その後、Projectファイルを右クリックして、New > GoFileでgolangのソースファイルを作成します。

f:id:soy-curd:20170610213320p:plain

そして、Configure GOPATHから、GoglandにもGOPATHの設定を行います。

次に、Run > Edit configuretionsから、実行環境の設定を行います。 左上の+を押し、Go Applicationを選択してください。その後、Fileに先ほど作ったファイルを設定します。

f:id:soy-curd:20170610213045p:plain

あとは、Runを押して下のコンソールに実行結果が表示されたらOKです。

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]

0からwindows10にPython3.6環境を構築する方法(2017/6版)

mac OSXやlinuxにはデフォルトでPythonがインストールされていますが、windowsにはインストールされていません。 今回はPythonを初めて使うwindowsユーザーがお試しですぐ触れるよう、 windowsで0からPython3.6の環境を構築する方法をまとめてみました。

環境

1. Anacondaのインストー

いきなり、判断が難しいところなのですが、windows 10ではAnacondaを用いてPythonをインストールするのが 最も手軽だという結論に至りました。

Anacondaは数値解析や科学計算のライブラリを含んだ形で配布されているPython環境なのですが、 非常に手軽にPythonを実行することができます。(環境変数の設定さえ必要ありません)

また、windowsにおいてハマるポイントとして、C言語のライブラリを含んだパッケージの導入があるかと思われます。 numpy、matplotlibなどを特にハマらずにインストールするためには、Anacondaの導入が手っ取り早いです。 (Django等を使ってwebサーバを建てたい、という方には関係ないですが)

https://www.continuum.io/downloads

リンク先にPython3.6のインストーラーがありますので、そこからダウンロードしてください。 f:id:soy-curd:20170603230920p:plain

ダウンロードが終わったら、インストーラーを実行してください。 何個か選択肢がありますが、 特にこだわりがなければ、すべてNextを押せば問題ありません。

f:id:soy-curd:20170603231146p:plain

2. Pythonの実行

Anacondaのインストールに成功したら、すぐにPythonを使うことができます。 おそらくスタートメニューには、以下のようなものがインストールされているはずです。

f:id:soy-curd:20170603231855p:plain

この中からAnaconda Promptを選んで、起動してください。

すると、以下のようにプロンプトが立ち上がるはずです。

f:id:soy-curd:20170603232350p:plain

あとはプロンプト内でpythonと入力してください。Pythonが立ち上がります。

それでは、試しになにか実行してみましょう。

f:id:soy-curd:20170604000230p:plain

Pythonが無事に動いたことが確認できました。

3. ライブラリを利用する

今回はAnacondaを利用してPythonをインストールしたので、そのままの状態で、すでにたくさんのライブラリを使うことができます。

どのようなライブラリがインストールされているかは、pip freezeというコマンドで確認することができます。

試しにこの中に入っているmatplotlibという作図ライブラリを使用してみましょう。

まずは先ほどと同じように、pythonを起動してください。 そして、

import matplotlib.pyplot as plt
import random
xs = range(100)
ys = [random.randint(0, x) for x in xs]
plt.plot(xs, ys)
plt.show()

のように、実行してみてください。すると、

f:id:soy-curd:20170603234058p:plain

上記のような画像が表示されたかと思います。このように、Pythonを使うことでグラフの描画も簡単に行うことができます。

4. おわりに

以上、windowsで0からPythonの環境を構築する方法を示しました。 このように、Pythonは非常に簡単に始めることができますので、 windowsユーザーの方も、ぜひ一度最近はやりのPythonを触ってみてください。

みんなのPython 第4版

みんなのPython 第4版

実践力を身につける Pythonの教科書

実践力を身につける Pythonの教科書