働き方はじめにそもそも何をもってフルスタックというのかという話もあるが、ここでは、開発するプラットフォームや言語を問わずエンジニアとしてすぐ働ける、というイメージでフルスタックエンジニアという言葉を使っている。ベテランのエンジニアからすると自分の技術力はまだまだだし、自分でフルスタックエンジニアというのは恐れ多いが、iOS・Androidのモバイル環境やウェブ、ブロックチェーン周りのいろんな技術を現場レベルで触ってきた過程で、どういうことをいつ学んできたのか書いていく。これが正しいわけでもないし、人によってはフルスタックにならずに何かに尖らせたいということもあるので、参考程度にとどめていただければ、と思う。長いので、あらかじめまとめを書いておくと以下のような感じ週末とかもひたすら好きなモノを作ってみる。その際、できれば新しい技術で作ってみるのに挑戦する。環境に慣れてきたら変える。会社でもいいし、プロジェクトでもいいし、言語でもいいし、役職でもいいし、そこに安住しない。自分より格段にすごいエンジニアと一緒に働く。ビジネスサイドともコミュニケーションは取る。UMLとか書くといいかも。(アウトプットもした方がいい。自分はできてなかったので偉そうなことは言えないが...)きっかけ2015年の12月、大学の同級生が作ったCandleという会社でインターンを始め、プログラミングをHTMLから本格的に勉強したのがスタートだった。大学の課題でなんとなくJavaを触ったことはあったが、コンピュータ・サイエンスの基礎とかはやったこともなく、2015年12月の時点ではほぼ初めての状態だった。大学時代は、ラクロスというスポーツをやっていて、ほとんどの時間を部活、筋トレ、映像を見ることに費やしており、恥ずかしながら勉強にあまり時間を割けなかった。基本朝4時半起きだったしそれを言い訳にしていた感は否めないが...。1年強のインターンで0.8人前くらいにインターンといっても初めの1ヶ月はHTML、CSS、JavaScript(jQueryとかの使い方)、PHPをひたすら勉強して簡単なウェブアプリを作ったりしていた。当時はProgateとかの選択肢もなく、ドットインストールがバイブルになっていた。「最悪誰か聞ける人がいるから大丈夫」という環境でなければ、心が折れてプログラミングを投げ出していたかもしれない。僕自身は、「気づいたらパソコンと育っていた」というタイプのエンジニアではないので、初学者がプログラミングを勉強してても続かなくなってしまう理由がとても分かる。誰もが初めはチンプンカンプンで心が折れそうになるのは当たり前なので、決して「自分は向いてないのではないか」と思わないでほしい。そのうち分かるようになる、とやり続けていると、本当にそのうち分かるようになっている。1年ちょっとひたすらコードを書いたり技術書を読み漁って、基本的なコンピュータ・サイエンスの知識(TCP/IPとかネットワークの基礎知識・アセンブラまわりとかの知識)をつけて、iOSなら普通に他の会社(Candle以外)でもやっていけるようになっていたと思う。最初の1年で読んだ本を印象に残った順にピックアップしてみる。PRESSとかCandleでは優秀なiOSエンジニアがそばにいて、その人が綺麗なコードというものを教えてくれたおかげで一気にレベルをあげてもらえた。いう人が身近にいないと早く成長するのは難しいかもしれない。その時は、いくつかのスタートアップを手伝い、ずっと働いて月50万くらいは稼げるようになっていた気がする。AnyPayにiOSエンジニアとして関わりだすプログラミングを真剣に初めて1年強経った2017年の1月末に、AnyPayにiOSエンジニアのバイトとして関わりだした。1年強できる限りプログラミングを勉強してきて、ある程度動くコードを書けるようにはなったつもりだったが、30歳を過ぎた力強いエンジニアたちに囲まれると、いかに自分のレベルが低かったのかを痛感した。議論のレベルが学生エンジニア同士では中々ないレベルだった(もちろん学生エンジニアでもそういうのに平気でついていける人もいるが多くはない)。してテストを書きやすいコードを書くのか、こういう設計だとこういう問題が起きてくる、とかモバイル開発におけるテスト・アーキテクチャについてとにかくキャッチアップした。周りのレベルが上がって刺激的だったので、そういう環境に身を置こうと思い、2017年の4月から正社員として入社することにした。www.wantedly.comエンジニア歴10年以上の人のパソコンの手さばきが早すぎて衝撃的だったのを今でも覚えている。ショートカットをガンガン駆使していて、とにかくキーボードから手が動かないのだ。他にも、バグやわからないことを調べる時は、Qiitaや第三者のブログを当たるのではなく、とにかく公式のドキュメントを参照していたのも当時の自分には新鮮に映った。当時の僕は、馴れないものを触る時は、まずQiitaで日本語で簡単に説明してるのを見てから自分で少しずついじってみる、というのが染み付いてしまっていた。これ自体は悪いことではないかもしれないが、すごいエンジニアと言われている人は公式のドキュメントで正しい情報を取りに行くのだと痛感した。ベテランのエンジニアと一緒に働くことでこうした些細だけどエンジニアとして大切なことを学ぶことができる。「ゼロからですが本気でプログラミングを勉強します!」と言ってこういう環境に飛び込むのは、数学オリンピック優勝とかよっぽどのことがないない限り基本通らないので、どこかで半年~1年くらい実戦経験を積んでから、レベルの高い環境に移動するのが良いと感じた。はじめからベテランエンジニアに囲まれると、力の差に絶望しか感じないので、個人的には、学生であれば友達のスタートアップとか初心者でも入りやすいところから入るのがオススメ。僕は、初めのうちは、とにかく自分の周りの環境にこだわっていて、自分のレベルが上がると周りの環境を変えるのをかなり意識した。この時期読んだ技術書はこんな感じ。FinTechの業界に対するキャッチアップが必要で、技術書よりもFinTechの法律の本などが中心だった。サーバーのコードも書くようになるAnyPayに入った初めのうちは就業時間に関係なくずっとiOSの開発をしていたが、数ヶ月経つと新しい環境にも慣れてきて、仕事が終わったあとはひたすらRailsの勉強をした。いうのも、サーバがRailsで書かれていたからだ。APIを専任で書いている人もいなかったので、自分が書けるようにようになると頼りにされるとも思った。仕事後や週末に、1ヶ月くらいこっそり勉強してから、サーバも興味あるとCTOに話をして、わからないことを教えてもらいつつRailsのコードも書くようになった。Rails)を読んで勉強したのだが、Railsに独特の覚えるべきことが多く苦労した。結局自分で簡単なアプリを作ることでRailsの基本や、よく利用されるライブラリ、ActiveRecordの使い方を習得した。いった甲斐もあって、2017年の夏過ぎから新規事業のサーバーの開発(Rails)もほぼ1人でやらせてもらって、ここでDBの設計からしごかれながらなんとか完成させた。Engine)で開発をしたので、Kubernetesについても勉強することとなった。このプロジェクトを通じて、アラートやロギングをしっかりしておかないと、あとで調査もできないし経済的損失も馬鹿にならないというのも学んだ。会社の環境にもよるが、チャレンジさせてもらえる環境であれば、ガンガンやりたいことを伝えてやらせてもらうべき。逆に、スタートアップで働いているのに、そういうチャレンジがさせてもらえないなら、他の会社を探すなりした方が良いと思っている。いろんな言語・技術に触りたいわけじゃなくても、iOS開発でも機能の要件定義から仕様に落とすとか、ロールをもらえるかどうかも同様。JavaScriptとブロックチェーンの世界に入り込んでしまうRailsを3~4ヶ月くらい開発した後、そのプロジェクトは運用のフェーズに入り落ち着いてきて、また新しいプロジェクトの開発にも関わりだした。NativeでiOS/Androidアプリを作るものだった。2017年の11月くらい、ちょうど暗号通貨が話題の頃で、プライベートの時間にはJavaScriptやSolidityをコツコツ勉強しており、AnyPayの業務でもそういった技術を触るようになった。Railsの時と同様に、業務で使えそうな技術をプライベートで勉強しておいて、ある程度分かってきたら、会社でそれを活かせるところに関わりたい欲をアピールした。それが受け入れられるかどうかは会社によると思うが、幸いなことにAnyPayのCTOはそういった姿勢に対して非常にポジティブで応援してくれる方だった。ブロックチェーン系のプロジェクトはJavaScriptとの相性が良いということもあり、この時期(2017年の冬)から最近(2018年11月)に至るまでほとんどJavaScriptを書いていた。JavaScriptはプログラミング初心者の頃によく勉強すると思うが、JavaScriptを本格的にプロダクトで利用するとなると学ぶことが非常に多い。書き方が柔軟すぎるからだ。ウェブのフロントエンドの変化は早く、去年学んだことがもうdeprecatedになってしまう勢い。開発者が多いので、GitHubでJavaScript系のプロジェクトを見つけるのが非常に容易で、大きなプロジェクトのソースコードを読んだり動かしてみることで勉強をした。ブロックチェーン系の文脈でJavaScriptを学びだしたので、ICOしているプロジェクトや有名なプロジェクトを参考にした。最初の言語がJavaScriptの場合は、勉強のために大きなプロジェクトのコードを読むのは辛いかもしれないが、他の言語の知識があると補完しあうことで理解が早まると実感した。Swiftのような静的型付け言語と、Rubyのような動的型付け言語をそれぞれ学んだことで、新しく言語を学ぶ時の理解度が初めの頃に比べてグッと早まった。Ethereumというブロックチェーンを扱う際に、Solidityという新しいプログラミング言語を利用するのだが、Solidityはほとんど勉強しなくてもコードが読めたし、実装も苦労しなかった。Goに関しては少し苦労したし、まだ自信を持って書けるとは言えないが...。プロダクトの設計も関わりだす初めの2年でモバイル(iOSとAndroid少し)とウェブの開発、ブロックチェーン関連(Ethereum)の開発、アナリティクス周りがそれっぽくできるようになったが、3年目にUMLやDBの設計・プロダクトのアーキテクチャについて、シニアエンジニアとの議論を通じて学ぶことができた。「コードは書ける」という状態から、要件から仕様に起こすといったプロダクトの設計レベルのことにも関わり、エンジニアとして少し深みが出たかもしれない。個人的には、プロダクトの設計の部分が割と重要だと思っていて、独学では中々学べないので実践で学んでいくしかない。PMが普段何をしているのか、ということに注意を払ってみるとこうした設計レベルのことを行っており、エンジニアもそういったプロセスを見ると勉強になると思った。ビジネスサイドの人が何を考えているのか理解することが非常に大切で、そういったことを理解するためにもUMLは欠かせないと思う。エンジニアとしては価値のあるものを作りたいという気持ちがあるが、ビジネスとしてサステイナブルでないものを作るのは、ビジネスとしては間違っているし、中で働いているエンジニアも給料も上がらずいい思いをしないと思う。その他プライベートの時間で自分でモバイルやウェブのアプリを作ったりして、興味がある技術を試したりしていたのも今となっては良い勉強だった。Databaseを利用する案件もあり、プライベートで学んだ知識を還元することができた。IoT系のプロジェクトも少し関わって、はんだごてを握ったりArduinoをガシガシ使ったりした時期もあり、ものづくりの可能性を感じた。アプリ開発だけしているとどうしてもアプリ開発が先に思いついてしまうが、ハードウェアの開発もすると、欲しいもの何でも作れる気がしてきてエンジニアとしては楽しみが増えた。その点では中国の深センは面白い。アウトプットが少なかったことは反省。インプットするものの、ついついアウトプットが少なくなってしまっていた。外部のイベントで登壇やLTをする時期もあったが、忙しくなったタイミングでいつも途絶えてしまう。そこで知り合った人から仕事をもらえたりもするのでアウトプットするのは大切。週末にアメリカ人の会社を手伝っていたのは良い経験になった。英語でのコミュニケーションも勉強になったし、シリコンバレーでずっとエンジニアしていた人だったので、いつもと異なるスタートアップの文化を日本にいながらにして感じることができた。今はもう手伝っていないが、イギリスに移転したからおいでよ、とお誘いもいただけた。まとめつらつら書いてきたが、自分がしてきたことのうち意識したことをまとめると以下のような感じ。どこでもよく見かける内容ではある。週末とかもひたすら好きなモノを作ってみる。その際、できれば新しい技術で作ってみるのに挑戦する。環境に慣れてきたら変える。会社でもいいし、プロジェクトでもいいし、言語でもいいし、役職でもいいし、そこに安住しない。自分より格段にすごいエンジニアと一緒に働く。ビジネスサイドともコミュニケーションは取る。UMLとか書くといいかも。(アウトプットもした方がいい。#10で登壇してきたblockchain.tokyoは、ブロックチェーン技術の普及や、ナレッジ...2017-12-312017年の振り返り(AnyPayで働いてみて)この1年は色々あったので、個人的な記録をかねて残しておこう...2017-10-03AnyPayで働きだしてからの半年を振り返ってみるAnyPayに入社して半年がたった。(ベトナム)でiPhoneをひったくられた話(盗難時のロックとか対処法とか保険とか)プログラミングの勉強をする前に知っておきたかったこと・知っておいてほしいことブロックチェーンまわりの技術本を書きましたウェブサイトを作る時に便利なサービスたち(ロゴ生成、LP作成、画像引用とか)中国の深センの病院を退院して無事帰国しました。(医療搬送とかお金とか海外旅行保険の話)月別アーカイブ参加グループテクノロジーはてなブログをはじめよう!ngo275さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。