SE Can't Code

A Tokyo based Software Engineer. Not System Engineer :(

Blogを移転した.

はてなblogのUIがなんとなくイケてないなぁと前々から思っていたので、Mediumにblogを移転した。

medium.com

今後はここに書いていく。

Remove all ads

言語処理系とかコンパイラ作ってる.

年末の有り余る時間を使ってシステムプログラミングの勉強を本格的にやろうと考えている。その手始めということで、まずは純Lispを作ってみた。これはWikipediaあたりを参照しながら書いたんだけども、SICPで学んだことも活きたのか割とサクッと実装出来た。途中でいろいろ組み込みたくなり、結果として不純Lispになったが、マクロの実装で挫折して終わった。

そしてちょこちょこ作っていたコンパイラのバックエンドも改めてスクラッチで書き直そうと意気込んで手を動かし始めた。とりあえずは、int main() { int x = 1; return x + 1 } ぐらいは動くようになった。これは年末にかけて勉強しながらインクリメントに実装していこうと思う。GC辺りが個人的に弱いのでそこの技術書を読み漁るところから始めよう。

システムプログラミングが出来る仕事はないのだろうか。少なくとも今の会社にはないのだろうな。この前、会社の偉い人に聞いてみても「昔はあったけど、今はもうないだろうね。」と言われた。10年前ぐらいだとOSから書いていたプロジェクトがあったらしい。今の人事部長とかは飛行機の移動時間とかでOSをサクッと書いちゃったりするらしいし、昔は良い時代だったんだろうな。今はもうプログラミングすらさせてもらえなくなっているし。

GoogleAmazonといった先進的なIT企業はハードウェアすら自作するようになっているのに、SIerとかは逆に外注に走っているように見える。どうしてこうも同じIT企業でも考え方が違うのだろう。まぁビジネスそのものが違うので答えは明白なのだが。

とりあえずは何がどうなるかはわからないので、好きなように面白い技術を学んでなんか作っていればいい。それが将来、何かに役立つかもしれないし。

あーやばい、数学と機械学習の勉強頑張れや、って声が聞こえてきたので、これから頑張る。

Remove all ads

2016年、振り返り.

あと数日で今年も終わるので振り返りをしようと思う。一言でまとめると、自分の要領の悪さを実感した一年だった。当初持っていた期待値に対して、全く届くことが出来ずに頭を悩ませることが多かった。特に量の面では、もう少し出来ただろ、と自分に突っ込みたくなるくらい。ただ、そんな中でも出来ることはいくつか増やすことが出来たと思う。成長は徐々にしている。たぶん。

はてさて、じゃあ改めてきちんと振り返ってみよう。今年のキーワードとしては「機械学習」「プログラミング」「英語」の3つを掲げた。

機械学習の辛さ

機械学習の勉強の辛さは、数学と統計学が必須なところにある。これらがわからないとお話にならない。機械学習の専門書には数式ばかりが書かれていて、年中泣きながら機械学習のモデルの理解に勤しんでいた。

基本的に僕はMOOC→専門書という動きで学習を進めているが、年始辺りに受講していたUdacityは微妙だった。いくつかの講義はSklearnを動かして、可視化し、ほらこのモデルを使えばこんな具合に分類できるよ!と、ふんわりした説明に留まり、理論の説明がまるっと抜けていて納得感のないまま時間を過ごす事が多かった。案の定、それは自分の身に修めることは出来ていない。

途中からCouseraのML講義を受講するようになり、劇的に学習速度が上がったと思う。数式モデルの説明を噛み砕いてくれるので頭の中で知識がストックされたような気がしている。

ただ、実践という意味では今年はイマイチではあった。仕事では去年の年末辺りに取り組んだアルゴリズムテーマがあったのだが、そいつの教師データの作成や評価、チューニングをずっと取り組んでいたために、新しいテーマにチャレンジしてみる、というのはあまり出来なかった。そこが今年の一番のモヤっとポイントだろう。

プログラミングの習熟

コンピュータサイエンスの基礎勉強に取り組んだ。基本的なアルゴリズムやデータ構造をもう一度学び直し、SICPを読むことで抽象化やストリーム、遅延評価、lambdaの関数プログラミングあたりを学び、インタプリタの実装ぐらいは出来るようになった。個人的にはこれが今年一番の成果だろう。プログラマーとしてのレベルが上がった気がする。

途中でコンパイラ開発に乗り出して、それ以降は言語処理系の技術書やLLVM、ドラゴンブックあたりを週末に読み耽っていた。システムズプログラミングの分野は僕の中の憧れであったので、常にワクワクしながら本を読んでコードを書いていた。ただ、やはりここも機械学習同様に学習難易度が高いところなので、挫折を多く繰り返す結果となった。

やっぱりコンピュータサイエンスは楽しくてしょうがない。知らないことがまだまだたくさんあって、常にワクワクしながらモノを作れる。これから先の人生でずっと遊べるオモチャだと思う。

英語と海外

今年の頭から「エンジニアは英語出来ないと詰む!」ということをいろんな人に言われて勉強を開始した。全く話せない状態から、DMM英会話を始めたり、週末に外国人のバスケットボールチームに乗り込んでみたり、会社の英会話教室に参戦してみたりといろいろトライした結果、ちょっとは話せるようになった。

仕事では、初めての海外出張&研修講師というものを経験し、外国人エンジニアのOJTを担当したりと割と面白い経験をさせてもらった。おかげで下手なりにも物怖じせずに英語が口から出るようになり、こんな自分でも英語喋れるようになるもんなのだな、とちょっと感動した。

海外のエンジニアとGitHub経由でコードRvのやり取りをすることもあったし、外国人エンジニア主催の社外の勉強会に乗り込んで発表したり、Pythonプログラミングを教えたりもした。

こう振り返ると人間やれば出来るようになるもんだ、と驚く。学生の頃の自分が見たら、外国人と英語でやり取りしているなんて想像も出来ないだろう。まぁ未だに下手くそな英語なんだけども。

まとめ

今年ずっと悩んでいたことの一つに、「このまま機械学習の分野で勝負するのか。アカデミック上がりの人と闘えるのか」というものがあり、これから先のエンジニアとしての生存戦略をより具体的に、キチンと考えるようになった。

結果として出た答えが「機械学習」と「プログラミング」であり、この二つの両輪で知識を付けていけば、当分はなんとか生きていけるんじゃないかと思っている。また、これから先の30年以上は続くだろう仕事なので、一番自分が面白いと思える仕事をすべき、という考えが根本にある。面白くないと仕事のための勉強なんてそもそも続かないし、面白くないことに時間を割く人生なんて勿体無い。その点、機械学習もプログラミングも面白さでは底がなく、勉強していても苦しい中に面白さはあるので良い選択だと思う。

機械学習はトレンドにも乗ってるし、プログラミングは割とアカデミックな人と比べて優位性を発揮する気がするので、なんとなく生きていけそうじゃないか。そして英語が話せるようになれば尚良し。

年齢も25歳ということでボチボチ30歳に向けての準備を始めていこうという一年だったと思う。来年は26歳で、次は27歳で、、なんて考えるとゾッとするが、エンジニアとして面白いこととキャリアになることの折り合いをつけながら、これから先もやっていくのだろう。

ってなわけで振り返りおわり。来年計画はまた別で立てる。

Remove all ads

Pythonで関数型プログラミング.

SICPを読むようになってから、完全に関数型プログラミングの魅力にハマってしまったんだけど、そのおかげか仕事で書くPythonコードがかなりキレイに書けるようになってきた。行列演算する時に、map, reduce, filterあたりの高階関数をlambdaの無名関数と合わせてよく使うぐらいだったが、カリー化もよく使うようになったし、generatorやyieldでストリームのデータ構造を遅延評価で扱ったりもする。

この頃、Scala系の関数型プログラミングの技術書をよく買っては読みふけるようになったが、手続き型よりも個人的にはスマートに書けるので自分のコードは関数型プログラミング寄りになってしまった。仕事でもたまにリファクタリングに耽ることがある。綺麗なコードを書くと気持ちがいい。

SICPを読んでからこの傾向は強くなった気がする。過去のMITのコンピュータサイエンスの一年生が最初に読む技術書だと聞いていたが、確かにプログラミングというものを最初に学ぶのに適した技術書だと思う。もっと早くSICPで勉強しておけば良かった、と後悔するぐらいに。

Python関数型プログラミングも可能な言語なので、やはりプログラミングを学ぶ用の言語としてはうってつけなのだろう。機械学習のトレンドからPythonがフィーチャーされているが、この言語から学ぶ事は機械学習に留まらない。個人的には、正規表現あたりをもっとPerlみたく使いやすくしてくれると文句はない言語なんだけどね。

Remove all ads

職場を改善すること.

少し前、上司である部長から突然仕事を振られた。「レガシーなプロジェクトをモダンな開発に変えてくれないか」と。なかなかふわふわした指令だった。レガシーをモダンに変える。レガシーをモダンに変える。メールを見返してもその言葉以上の内容はない。ただ、なんとなく言いたい事は伝わったので一度飲み込んだ。

僕の会社はおそらくIT業界を見渡した時に先進的な開発をしているとは言えないだろう。勿論半径50m内のプロジェクトしか見えないのでここまで括ってしまうのは暴論に見えるが、当たらずとも遠からず、といったところじゃないか。レガシーとモダンを定義するのは難しいが、部長の想いはわかる。社外の情報やソフトウェア工学辺りの本を読み耽っているやつならなんか改善出来るんじゃないか、というところだと認識した。

しかしこの仕事はあーだこーだとやり取りしたあと断った。どこかのプロジェクトにメスを入れることは多分僕のキャリアの中で最も難易度が高くて、時間も莫大に取られるので、それをやる余裕はないという理由だった。既に成熟した文化に外から手を加えることの難しさは重々わかっていた。

ドキュメントを英語で書く

小さな例を出そう。最近あったこれの縮図のような話。僕のプロジェクトではアルゴリズム検討チームなるものがいて、僕はそこに属しているのだが、書いたコードはGitLabにPushしてメンバー間でシェア出来るようにしている。そしていつの間にか根付いた文化として、コメントやドキュメント、Commitメッセージは英語で書いている。これは僕がただ英語でコメントを勝手に書いていたことから波及した取り組みだった。外国人エンジニアがいた時期もあったため自然とそれがデフォルトになった。

最近になり、チームに新しい人が入ってきた。その人は以前プロジェクトに属していた人だったが、稼働の空き具合からまたお手伝いに来てくれるようになった。その人にある時呼び止められて言われたことは「英語をやめませんか」ということだった。何故わざわざ英語でコメントやドキュメントを書いているのか、Commitメッセージを英語で記述なんてしていたら変に稼働がかかる。日本語に戻したい、と訴えられた。ちゃんとこちらの意図なども説明したが、彼にそれは受け入れられなかった。英語が苦手な人のことを考慮されていない、という意見だった。

この話を受けた時、心の中で「エンジニアやるんだったら英語くらい読み書き出来るようになってくれよ」と苛々しながら思ったのを覚えている。ただこれも一つの文化の違いによる衝突の一例だと思う。

日本の開発現場で英語で全てが回っている環境はなかなかないだろう。それが突然、「今後のことを考えて全て英語にしましょう」なんてことを言われたら、そりゃ反感を持つだろう。英語が出来ないのなら勉強しろ、と言われれば余計腹が立つ。

ドキュメント関連を英語にするのは一つの新しい取り組みだったが、それを受け入れられない人は当然いる。なんでもそうだが、新しい取り組みは反感を買ってしまうものだ。定着する前に頓挫することが多いだろう。英語という新しい文化に対して、嫌な顔をされるのは当然の反応だと思う。

文化にメスを入れる

先の話に戻ると、レガシーをモダンにするのは最たる例だ。どうして今のままで回っているのに、新しい取り組みをしないといけないの、と思われて、反感を買うだろう。新しい取り組みを導入したことで、現場の人は新しい何かを学ばなければならず、そんな努力は払いたくないと思う人が必ず現れる。何かを改善することの一番難しいところはここにある。

開発現場にメスを入れることは確かに僕もやりたいが、自分のような一兵卒には難易度が高過ぎた。この手のことをボトムアップ式で実践するのは難しくて、ある程度トップダウン式でやらないとうだうだとしてしまい、最悪戦争になってしまう。だから、これは僕の考えだが、文化に向かっていくときはある程度の権力が必要だと思う。

いつかは

いつかはこうした他プロジェクトを改善する、ということをやれるようになればいいなとは思う。ソフトウェア工学の本を漁っていれば、改善出来るところは多くある。正解は先人達の本の中にある。SoRとSoEの共存、MicroServices、DevOps、、、勿論、現場は全てがその通りになり得ないのだが、チャレンジしがいのある問題だ。

僕がやろうとするとまだまだ知識と経験が足りない。もうちょっと偉くなったらチャレンジさせてくれ。まぁ今のところで偉くはなれないと思うけども。

Remove all ads