薄いブログ 〜全てが薄い〜

だいたい酔った勢いで書いてる

ぴぎゃほばふごごへぽぽりーぜ!!(訳:26歳未経験からエンジニアになったけど「単語力」がなくて詰んだ話)

26歳の春。

ターミナルの開き方を知らず、スマホを使ったこともない僕は

iOSエンジニアになりました。

 

元々はit企業でui/uxディレクションやオウンドメディアの立ち上げなどを担当していたのですが、隣の席に座っていたエンジニアが凄く楽しそうに個人開発するのを見て

 

「やばい、自分も何か作ってみたい!」と思い、気づいたら転職していました。

 

・javascriptとjavaの違いを知らない

・面接で「得意な言語は?」と聞かれて「日本語です!」と答える

・半年前までガラケー

 

「でもやる気だけはあります!」と猛烈アピールして転職成功しました。

改めて振り返るとそれなりに世の中をナメていたことが伺い知れます。

 

案の定、入社してから詰みました。

 

masterにpushして怒られるのは朝飯前。

社内ISUCONに参加するもgit cloneできなくて足を引っ張り

(社内アプリとはいえ)テストせずリリースして上長にクッソ怒られたり

 

苦しくも実り多い1年が過ぎた辺りで我が身を振り返って気づいたのが

 

「エンジニア、単語力ないとマジしんどい」

 

ということ。

 

 

 

 

「単語力」って?

 

端的に言うと「どんだけエンジニア関連の用語を知っているか」です。

コレが足りないとどうなるのか。

わかりやすく例えるために、入社したての僕が配属された現場で先輩エンジニアが交わしていた会話を再現してみます。

 

 

先輩「ぴよいふぇをば?」

先輩「サーバをふぇぼっちからほみおぱぱげほすまの?」

先輩「セバスススパムヌルンの?」

先輩「ウボンゴをルシエワンゴボボ?」

先輩「ふぃぼなっち?」

先輩「ふぇるみ」

先輩「wwwwwww」

先輩「じゃあ、そんな感じで進めますか」

先輩「そうですね。(僕に向かって)で、どう思う?」

 

 

一言もわかりません。

会話が終わったタイミングで「あ、コレ日本語だったんだ」と気づくレベルです。

 

この状況でコミュニケーションを取ろうとすると

 

僕「ぴよいふぉえば、ってなんですか?」

先輩「あぁ、それはぴよふがほげをほげふがばなすこ、ってことだよ」

僕「・・・・???」

先輩「だから、ぴよふがほげをほげふがなすこ」

僕「えっと・・・ぴよ、ってなんでしょう・・・」

先輩「ググれ」

僕「ヒィ」

 

こうなります。

 

「コミュニケーションを取れない」状況は

特に未経験エンジニアにとっては致命的だと感じました。

 

「分からないことが多いから沢山質問したい」けれど

「そもそも回答が理解できないから質問しにくい」というジレンマ。

 

ただでさえ経験が浅いのだから先輩にサポートしてもらう必要があるけど

そのサポートを得られる土台が出来上がっていない、という状況。

 

この沼にハマるとなかなか抜けられません。

 

未経験者と経験者は、学習効率に雲泥の差があります。

例えばswiftの「ミラー」について学んだ時に

java経験者なら「あぁリフレクションみたいなものね」と数秒で咀嚼する概念が

未経験者だと「え?え?」と、その数十倍はかかる。

 

放っておくと一度ついた差が加速度的に広がってしまいますので、「学習効率が低い時期」は最短で駆け抜けなければなりません。

 

そのために必要なのが「単語力」だと思うのです。

 

 

 

 

 

未経験者あるある?最悪の学習法

転職先が決まり入社を1ヶ月先に控えた僕。

 

面談でお会いした先輩に

「あと1ヶ月、何を勉強すればいいですかね!」と聞いたところ

 

「配属先が未定だとなんとも言えないけど、javascriptは勉強しておいて損はないよ。この本を読んでおいたら?」と、「Javascript本格入門」を勧められました。

 

「よーし!頑張るぞー!」と意気込み、朝5時から出社まで勉強、帰宅してからも勉強と、ひたすらに頭の中にjavascriptを染み込ませる日々。

 

これ大失敗でしたね。

今にして思えば。

初学者の学習失敗あるあるなのかもしれませんが。

 

この勉強を1ヶ月続けた結果、僕は

 

・自分のブラウザでのみ完結する簡単なゲームなりアプリが作れる

・でもアーキテクチャめちゃくちゃだし、DRYすら知らない

・prototypeとか言語特有の仕様は何となく理解してるけど使い所がわかっていない

・アプリ層以外の知識が皆無 

 

こんな僕が現場に行くと、こうなります:

  

・ネットワークの基礎を知らないから、apiを叩くメソッドが思いっきりlocalhostを向いているのに、リモートのapiサーバから返信が来なくて「どうなっているんでしょう・・・」と先輩に泣きつく

 

・デプロイ手順を知らない。「えっと・・・ipaファイル作ったけど、どうすればいいんでしょ・・・」と途方に暮れる

 

・サーバの基礎を知らない。これが致命的。

 学習用のjavaアプリを作る研修を受けた際の会話:

 

僕「javaのアプリできました!」

先輩「よくやった!ちゃんとリモートで動いたか?」

僕「りもー・・・と?よくわかりません」

先輩「ん?デプロイはしたの?」

僕「でぷ・・・ろ・・・い?」

先輩「そもそもローカルで動いた?ビルドしただけ?」

僕「ろー・・・かる?びる・・・・ど・・・?」

 

まぁ使い物になりませんよね。

 

なので未経験からのエンジニアに「とりあえず一つプログラミング言語を」と、言語仕様に関する細かな教本を読ませるのはオススメできません。

 

おそらく今の僕が当時の僕にアドバイス出来るとしたら

 

・パスに応じて数種類のhello worldを出し分けて、mysqlにCRUD操作するだけの超簡単なAPIサーバを作ってみる

・debugとproductionでdbを分けてみる

・全ての作業をgit管理する。わざと異なるマシンからpushしたりmergeしてみたりする

・テストから書く

・kataribeでもなんでも良いので、ログを出力する

・gcpやawsなどクラウド環境にデプロイしてみる

・curlとかsshとか、LPIC1,2程度のコマンドに慣れる

・cronで定期実行バッチを作ってdbをいじる

・エンドポイントを呼び出すだけのアプリを作ってみる

・(iOSなら)証明書も取得してtestFlightで配信してみる

 

こんな事をしながら勉強するんじゃなかろうか、と思います。

 

理由としては以下3点:

 

①言語仕様の理解に割く学習時間を減らした方が良い

②広範な単語を覚えられる

③誤った理解を防ぐ

 

 

 

①言語仕様の理解に割く学習時間を減らした方が良い

 

僕自身を含め、未経験者は言語の学習に時間を割きすぎる気がします。

structとclassの違いとか、interfaceとかextendsとか、

言語本を読むと1〜2章あたりから出てくるアレですね。

 

この辺りはもう少し優先度を落としてもいいと思うんです。

 

仮にclassしか知らなくてもアプリは動きます。

でもコンパイルや依存関係の解消方法を知らなかったり、

アプリを動かすサーバを用意できなければ、アプリは動きません。

 

実世界のサービスを簡略化しつつ、全体を一気通貫で構築することで

最低限必要な各機能の連携ポイントを抑えた方が良いです。

 

その辺りの「最低限必要な知識」を網羅しておけば現場配属後も

「うーんAPIから返答がないけどエンドポイントの向き先間違えたのかな」とか自主的に考える余地がありますが、言語仕様とビジネスロジックしか知らないと

「APIから返信がない = ロジックが間違っている!?」といった具合に可能性と選択肢が非常に狭い状態で思考するので、問題の切り分けができません。

 

配属しょっぱな、サービス仕様すら理解していない状況からいきなり複雑なロジックを任されることはありません。

 

最初は簡単なバグfixから始まって開発フローに慣れていくと思うので

その肝心の開発フローで躓かないよう、まずは当たり前レベルのミスをしない事。

最低限の知識レベルを幅広く持っておくことを目指した方が良いのでは無いかな、と。

 

②広範な単語を覚えられる

 

入社当初の僕は「デプロイ」「テスト」「ローカル」あたりの単語すら知らなかったので先輩の会話に全く着いていけず、どんどん知識差が広がっていくのがもどかしかったです。

 

くっそーjavascriptのprototypeじゃなくて最低限のサーバ周りの知識覚えておけばよかった〜と後悔したものです。

 

一気通貫で一度やっておけば「awsにテキトーなインスタンス建てといてくれる?」みたいな指示を受けた時に、ググって自己解決する余地があります。

 

でもjavascriptしか知らなければ「インスタンスを・・・立てる・・・とは」と硬直します。

 

とにかく「あぁ、あれね」と、モヤ〜っとした理解でも全然構わないので「イメージ」を持っておくことが大事です。

 

 

③誤った理解を防ぐ

 

これ大事。

 

だって僕、現場に配属されるまで「データとはローカルストレージに保存するもの」って思ってましたもん。

 

言語本を読んでもDBとの連携に触れることはないので、万物はオブジェクトとしてアプリに保存されるもの、と思い込んでいました。見ろ、メモリがゴミのようだ!

 

そのほかにも「万物はlocalhostという文字さえ指定すれば、なぜか繋がる」と思っていました。だってlocalhost以外出てきたこと無いんだもん・・・

 

なので「それってどこのホスト指してる?」と聞かれた時は「は?ホスト?歌舞伎町の?」とか考えちゃうし

「DBと接続できてる?」とslackで聞かれても「は?ドラゴンボール?」とか思いました。

 

大まかな流れを掴むことは、非常に大切です。

一般的なwebサービスがどのように分割されていて、

どんな役割があるのか。これを一気通貫で理解しておかないと

周りの人と会話できません。

 

 

「単語力」を身につけないと損をする

 

「会社」は、個人では経験し得ない学びの宝庫です。

その学びエキスを吸えるか否か。

全ては単語力にかかっています。

 

隣の席で先輩が叫んでいる!

「うわ〜firebaseがiOSの課金sdkのコールバック横取りするから初期化コケてるやんけ〜」

 

コレも単語を知らないと意味がわかりませんが

知っておけば、いずれ自分が課金実装する際に役立つ大きな学びです。

 

後ろの席で先輩が嘆いている!

「おうっふ・・elasticIPはインスタンスが落ちてても請求発生するのか・・・」

知っておけば、いずれ自分がawsを使う時に無駄に請求されずに済みます。

 

自分一人で失敗できる回数は限られているからこそ周囲の失敗から学び、吸収していかなければいけません。

しかし「単語力」が無いと他人の失敗から学ぶこともできない。

 

故に学習効率が低い未経験者ほど

全ての基礎としての「単語力」が必須で

その「単語力」を身につけるためには

凄まじくシンプルなアプリで構わないので

一気通貫で公開まで実行することが大切なんじゃないかな〜

 

そんな事を考えた、2年目エンジニアでした。