現役フリーランスエンジニアがノンキャリアからのプログラミング学習について考えた

機会があり、先日からとある未経験の方にプログラミングを教えているのですが、教材選びに情報収集していると、ツイート数や検索結果数から、1番おすすめされたのはProgateなどの学習系アプリだったので、未経験の時の感覚を思い出しながらやってみた感想を述べようと思います。

想定する読者

これを読んでいるのは今絶賛勉強中、もしくは勉強する前段階の方がほとんどだと思うので、先にモデルの特徴を挙げておきます。

  • 情報系の学校には行っていない
  • Web業界とは無縁
  • ITの知見もない
  • 英語力はヒアリング以外高卒程度

モデルといっても元々の僕の特徴ですが、別業界の方なら大半が当てはまる特徴だと思います。

ちなみに今の僕はフロントエンドを主戦場としたフリーランスエンジニアです。
その他開発とは異なる分野にも手を出していて、収益源は一つではないです。というかフリーランスの方って案外みんなこんな感じだと思ってます。
話が逸れそうなので早速本題に戻します。

アプリを一通り試した感想

Progateを含めたいくつか試してみました。感想としては「学習教材の一つにする」ということであれば良いかもしれませんが、UI/UXが丁寧に作り込まれているのもあってか学習の大半が受動的になり、おそらくこれだけこなしても「ほんとに何も知らない状態だったが各言語の文法の特徴はなんとなく掴めた」というところで終えるのが関の山だと思います。

マーク式と記述式とでは問題は同じでも難易度が全く違って見えますよね。もし問題を全て解き終えているのであれば、解いた問題に一からソースコードを書いて答えを出してみてください。

その出来高がおそらく現段階のコーディングスキルだと思います。

ただ別の見方として、参入障壁を緩和させてくれる工夫が各所にされていることから「なんか難しそう、専門職だから未経験からの参入は厳しい」という先入観を打ち破ることはできそうなので、きっかけづくりとしては最適とも思いました。

そもそも未経験者にはいくつか関門がある

オンライン学習教材は言語仕様の解説・演習がほとんどを占めていると思うので、未経験者の場合だと言語だけ学習していても、現実に存在するサービスのどこにどのように使われているのかというイメージが掴めず、苦しむことになります。

例えば僕が躓いたポイントを挙げると、

  • クラスやオブジェクトはどういった時にどんな単位で使用するのか
  • サンプルコードでは単なる文字列を出力して終えているので、このような内部的処理が実際のデータや見た目とどう紐付いていくのか
  • Web APIというものは一体何者なのか
  • インターフェースという言葉がいろんなところで出てくるが意味合い的に使い勝手が良すぎてしっくり頭に馴染んでくれない
  • リモートサーバーはアップロードするだけで公開してくれるが、ローカルではコマンドを打たないと確認できない、どう違うのか

他にも多数ありましたが、これらのイメージが掴めずに大変苦戦しました。フロントエンドから始めたこともあったせいか、手元で扱えて目で見える情報ばかりを追っていったこともおそらく原因の一つだったと思います。

こういう時に最後の助け舟となるのはイメージです。

そのイメージを持つにはプログラミングとは少し離れたところに位置するコンピュータやウェブの体系的な基礎理論を学ぶ必要があります。

まだ右も左もわからない内は実装に必要な部分にばかり目が行きがちですが、こういったことを頭に入れておくと後になって物事がリンクするようになり、理解速度が向上したりします。

毎回同じような場面でよくわからず行き詰まるのであれば、そのイメージをしっかりできているか再確認することで、何が足りていないのか明確化出来るかも知れません。

一番初めに変えなければならない考え方

まず大前提として能動的に学んでいかなければおそらく力はつきません。

ここでいう能動的とは積極的といった意味ではありません。

なので例えば

  • 何らかのコミュニティに参加してセミナーに出席した
  • 勉強している内容をとにかくアウトプット

これらはもちろん素晴らしい行動ではあるのですが、これらが良い方向へ作用するのは、自身の抱えるタスクやその中でできた悩みを俯瞰して再確認出来る段階になった時だと僕は考えております。

ですので固まった(成功体験のある)パターンをまだ一つも持っていない段階の方が積極的に外の世界へ出ると、まだ触れていない未知な部分の選択肢が増えたりと情報量が過剰になり惑ってしまうかもしれません。

逆に缶詰状態でずっと一方向に学習を進めている方には価値観の洗練や視野の拡大にもなって、気分転換としてもおすすめできます。

勉強の方法論を考える

言語

最初はどの言語で始めるのがいいですか?

テンプレートのような質問ですが初心者なら誰もが考えることだと思います。

結論から言うと正直なんでもいいと思ってます。
ただし何でも良いというのは「学習を始めたら一通りの概念を学び切るまでやめないという条件であれば」です。

言語仕様を学んだ後に実践としてアプリケーションの開発をするんだから一貫した言語の方が効率的だということで、WebであればRubyやPython、ネイティブアプリであればSwiftやKotlinなどの言語がおすすめされているのをよく目にします。

ですが実際に苦戦するのはいざ開発するにあたってフレームワークや周辺ツールを使用したり、環境を構築する時です。いってしまえば言語学習の時にわからなかったところがあっても、最初から最後までアプリケーションを作り上げる力を培っておけば、無意識のうちにわかるようになってたりします

僕の場合、一からちゃんと勉強したのはCとPythonでしたが、プロジェクトでPHPを使用することになった時、言語自体のキャッチアップはすんなり終わったものの、結局序盤から終盤までフレームワークの扱いに苦しみました。

その後自身で何か開発した際は、フレームワークの概念をある程度把握していたので、「今回のフレームワークの〇〇は前回のフレームワークでいうところの△△にあたる」というように置き換えるだけで済み、学習が更に一段と楽になりました。

もちろん特有の振る舞いや概念はどのFWにもあるので、その時は新たに覚える必要があります。

自分の話へ逸れましたが、実務を意識した学習において言語はそこまで重要視するべきではなく、問題は実務でよく使われている周辺FW・ツールにあります。

先程の例であれば、RubyならRails,PythonならDjango, SwiftならXcode等の周辺環境, KotlinならAndroid Studio等の周辺環境といったようなものになります。

さらにCRUD処理も実装するのであれば、MariaDB, PostgreSQLなどのRDBMSも加えて必須になりますし、リリースまで持っていくのであれば、Apache/Nginx等のWebサーバーも多少は勉強しなければなりません。

ものすごく量が多くて荷が重く感じるかも知れませんが、裏を返せばこれらの中で言語仕様の学習が占める割合は微々たるものなので、勉強する言語は一度決めたら反復して洗練するよりも、浅くても良いのでまずは一周してしまって早速開発に取り掛かりましょう。

ちなみに個人的にはメモリやポインタの概念があるCがおすすめです。

流行りの言語には無い概念もあり、コンピュータ・サイエンスに無縁だった人にはありがたい根底の理論を学べます。

その後無関係なFWを扱うにしても、言語の学習は新たに必要になるものの、そこまで遅れはとりません。

仮にPythonをしっかり学んでいたとしてもDjangoで開発を始めると、どのみち道中で何回もコケます。

分野

事始めにはどのような分野を目指すのがおすすめか、というのもどこか忘れましたが聞かれたことがあります。

僕が初めて仕事でコーディングをしたのはWeb制作会社だったのでどうしても意見に偏りが出ますが、

最近はAI化が進んでいるせいか機械学習・IoTなどのジャンルが踏み出す一歩としては人気っぽいですね。(単なる肌感です)

収益性・将来性共に明るく憧れる分野ではありますが、正直あまりおすすめができません。というよりも目指すのは個人の自由として、一発目に採用される事例を聞いたことがありません。

というのもこういった分野は一通りの知識・経験が揃った上でさらにそれらの応用力や学問的な知識も必要になってきます。

将来の目指す目標に置いておくのはとても良いことだと思うので、それはそれとしてまずは小さい成功経験をいくつも積んで段階的にキャリアアップして辿り着くのが現実的だと考えております。

もし自主制作を意図した分野選定であっても最初は何か単調なWebサービスの方がいいんじゃないかなぁと思います。

自主制作ならなんでもいいじゃないかという意見もあるかと思いますが、機械学習の場合、なんとなくでも一応動作するそれっぽいガラクタを作るにしても膨大な時間を要します

また、作り手も人間なので実績も少ないうちに出来るかわからないものを長く取り組むより、確実にできそうなものからちゃんと作り上げていくほうが精神衛生上も良く、得られるものも多いと思います。

やっぱり開発は楽しんでやらないとって思います。

もしそれでも一度は手を出したいという方は、まずは人相・文字・画像、なんでもよいのでそれらの解析からしてみてください。

その解析判定も自動化できてようやく一歩なので、そこで初めて解析だけでも凄まじいボリュームとなるのが解ると思います。

自身のレベルはどのようにして測るか

開発スキルは残念ながら可視化ができません。

これは開発業界に限ったことではないので、他の業界の方の意見も十分参考になり得るのですが、結局は判断材料が基本的には実績と制作物になります。

もしそれらが少しでもある方の中で、今自分がどの程度のレベルに位置しているのかを確かめる方法の一つとしては誰かと話した時、ソースコードを言葉に翻訳してどれだけ具体的に説明できるかだと考えております。

僕自身これが結構苦手なのであまりうまく説明ができませんが、例えばとあるWebサービスを開発していていくつか問題点や非開発者からの要望が出てきたとします。

  • アップロードする画像枚数に上限を付けてほしい
  • レスポンシブ対応でスマホのサイズの時、ボタンはアイコン+テキストではなくアイコンのみにしてほしい
  • テーブル(タグ)のセル内のテキストは折り返さないようにしてほしい
  • このページだけリロードすると画面が真っ白になる
  • 遷移先の画面Bでも確認できるように一時的に画面Aでデータを保存したい

ひとまず抽象的な表現で挙げてみましたが、これらの問題点の原因予想や要望の解決策を具体的・抽象的に相互変換できていれば、これまでに覚えた技術用語の意味や周辺の仕組みをしっかり理解していると相手も認識できます。

自身の書いたソースコードの説明を開発者・非開発者で分けることができれば着実に力は付いていると思います。

最後に

あくまで一個人の経験則でしかない上に僕自身物覚えが良くないところもあるので、初学者の方の中にも全然共感できなかった方もいらっしゃるとは思いますが、もし「そう!それなんだよ!」と言わんばかりに共感した方がいらっしゃったら今日から取り組み方を改善すれば何か変化が見られるかも知れません。

僕はメンターなんて大層な立場に立つ気はありませんが、もし同じような境遇で思い悩んでいる方がいたら遠慮なく気軽にDM送ってみてください。

何の繋がりも接点もなく一からWeb業界に飛び込んだ身として少しはお役に立てることがあるかも知れません。

第二新卒向けの就職支援サービス