初心者がWebアプリを作れるようになる方法【遠回りした僕からのアドバイス】

2019年1月11日金曜日

Web技術

初心者がWebアプリを作れるようになる方法

こんにちは、uni-browserの財前航介です。

私は学生時代に趣味でTwitterのボットを作ったことをきっかけに、Webプログラミングに興味を持ち、勉強を続けていました。

Twitterボットの目的は、広告を掲載したWebサイトにユーザーを誘導して、ちょっとしたお金を稼ぐことでしたので、ボットだけでなくWebアプリケーションや、Webサイトの作成にも強い興味を持っていました。

そんな不純な動機でWebに興味を持った私ですが、自力で一からWebアプリケーションを作って公開できるようになるまでに、3~4年ぐらいかかってしまったと思います。
(かかり過ぎ)


その間、ITエンジニアとしての業務の傍ら
「少しでも知識をつけよう」
と、
プログラミングスクールに通ってJavaの資格を取ったり、通信教育を受けて応用情報技術者という資格を取ったり、ITやWebに関する勉強も続けていました。


自分は幸か不幸か友達も少ないので(幸ではないか)、正直、社会人になってからのプライベートの時間は、ほとんど勉強に充てて来たと思います。

そのおかげで仕事の方はある程度順調にこなすことができ、2階級特進をさせて頂く場面もありました。

しかし、当初の目的であったはずの、
自力でWebアプリケーションを作れるようになる
という目標に到達するまでには、予想以上の膨大な時間を要してしまいました。

今思うと、相当効率の悪い道のりを歩んできたと思います。



この記事は、昔の私と同じような、
Webアプリケーションを作りたいんだけど、何から手を付けて良いか分からず、ガムシャラに勉強してしまっているような、新米エンジニアの方に向けて、私からのアドバイスをさせて頂きたいと思います。

結論から言うと、Ruby on RailsなどのWebフレームワークに関する勉強をお勧めしたいと思います。

この記事が、少しでも皆様のお役に立ちましたら幸いです。


初心者がWebアプリを作れるようになる方法
【遠回りした僕からのアドバイス】

初心者がWebアプリを作れるようになる方法

僕の失敗例


自分がエンジニアとしてWebアプリケーションを作れるようになるために、最初に描いていた道のりは、以下のようなものでした。

  1. サーバー構築を一通り覚える

  2. Javaプログラミングをマスターする

  3. JSP/Servletをマスターする
    (JavaでWebシステムを作る仕組み)

  4. SpringStruts等の、Webフレームワークを覚える
    (効率的にWeb開発を行うためのツール)

  5. 自力で本格的なWebサービスを作れるようになる

どうでしょう。
完璧なプランじゃないですか?


上記のようなプランを立てておきながら、なぜそんなに時間がかかってしまったのでしょうか。

僕自身の反省点は、以下のようなものです。

  • Web業界ではなく、SIer業界に就職してしまった

  • 大きい会社に就職してしまった

  • 資格の勉強に時間を使ってしまった

  • フレームワークの学習の優先順位を、下の方に設定してしまった

この記事で最も言いたいのは、一番下の
「フレームワークの学習の優先順位を、下の方に設定してしまった」
という部分なのですが、念のため一項目ずつ見ていきましょう。


Web業界ではなく、SIer業界に就職してしまった


SIerが全て悪いと言っているわけではないのですが、基本的にSIer業界は、使っている技術がレガシーになりがちです。

特に、SIerの市場の中で大きな割合を占める、金融業界などはお金を扱うシビアな業界のため、そんなにホイホイ新しい技術を採用したり、外のネットワークと繋げたりする訳にもいかない部分があります。

自分は携わりませんでしたが、同期で入社した人たちの中には、COBOLという昔ながらのプログラミング言語を用いて、銀行の基幹システムの開発を行っている人もいました。

いわゆるWeb技術などとは、かなり遠いところにある技術ですね。

プログラムを大人数で開発するためには、バージョン管理のためのツールが必須なのですが、現在の開発で用いられるものとしては、Gitが主流ですね。

しかし、私がSIer業界で業務に当たっていた際には、ほとんどの現場で、もっと古いバージョン管理ツールが用いられていました。
SVNVSSと呼ばれるものです。)

Gitが使えると、Githubというサービスを用いて世界中のプログラマーが公開しているソースコードを取得したり、逆に自分でもソースコードを公開できたりと、非常に勉強になることが多いのですが、やはり業務で使いながら使い方を覚えられないのは、忙しい社会人にとってはどうしてもマイナスになってしまいます。

Gitはあくまで付加的なツールですが、開発環境自体も、一般的なWebサービスを作るための構成とは、かけ離れた技術スタックで開発している現場も多いです。

私がJava技術者として携わっていた開発案件においては、Javaと一緒に「ビズブラウザー」というツールが使われていました。

このビズブラウザーとは、ChromeFirefoxInternet ExplorerSafariなどのWebブラウザの代わりに使うもので、独自の仕様で、ユーザーに表示する画面を作成します。

つまり、HTMLCSSJavaScript等の、いわゆるWebシステムで用いられるようなフロントエンドの技術を用いず、独自の言語を用いて、画面の見た目や、ブラウザ側の処理を作成するのです。

正直、その技術を身に着けても、他の現場では全く使えません。

ましてや、自分でサーバーを立ててWebサービスを公開することには繋がりにくいものです。

なぜSIer業界で働くと、そのようなことになる場合が多いのかというと、業界としてB to Bの形態を取っている場合がほとんどだからです。

一部の例外を除いて、SIerが開発をするシステムは、「業務システム」です。

つまりそのシステムのユーザーは、お客様の企業の社員のみです。

そうなってくると、全世界にインターネットでサービスを公開する必要もないので、世の中で一般的に採用されている規格に合わせる必要もないのです。

そのため、現場独自の技術スタックで、マイナーな技術を組み合わせてシステムを構築してしまう場合も多いのです。
(社内システムであれば、それで事足りますから。)


その時の私はJavaエンジニアを名乗り、確かに業務の傍らスクールなどにも通いながら一生懸命Javaの勉強をしてはいたのですが、Java言語そのものに詳しくなることと、Javaを用いたWebアプリケーションを開発することは、必ずしもベクトルが一致していなかったのです。


大きい会社に就職してしまった


私が日本のSIer業界で働いていた時に経験した会社は、少なくとも数100人規模の会社でしたので、
携わる技術が、入社後に決まる
というのが、普通でした。

会社の中で空いている案件に、空いている社員をあてはめる形で、配属が決まります。

ある程度それまでに経験していたプログラミング言語などを考慮に入れてはくれますが、基本的には会社の意向に従って、案件に配属され、開発を行うことになります。

そうなってくると、自分が携わる技術を自ら選ぶことはできません。


また、配属を選ぶ方々の業種がエンジニアでない場合、そもそも技術について良く分かっていない人たちによって携わる案件が決められてしまう場合もあります。

まさに私も、Javaの使用経験があり、Javaの開発を希望していたために、一般的なWebシステムとは異なった技術構成のシステム開発に携わることになってしまいました。

特にJavaなどの場合だと、Webシステムだけでなく、本当に色々なものが作れますから、Webシステムに携われる可能性は下がってしまいますね。


あなたが本当にWebアプリ開発のスキルを身に着けたいのであれば、あまり世間体や待遇を気にせず、小さい会社に就職することも選択肢に入れてみることをお勧めしたいです。
いわゆるベンチャー企業なども視野に入ってくると思います。

特に、自社のサービスや、自社の製品を持っている会社が良いと思います。

その上で、それを作るために使われている技術が、あなたのやりたいこととマッチしていることを、入社前に確認してください。

そうすれは、まず間違いなくお目当ての技術で開発を行うことができますから、自分の伸ばしたいスキルに合った業務に携わることができます。


もちろん、プライベートで自習をするのも良いのですが、やはり社会人は、ほとんどの時間を仕事に費やすことになります。

仕事で携わっている人と、全く関係がない仕事をしている人とのスキルの差は、やはり根性論だけでは埋め難いものがあります。

今あなたが携わっている業務が、あなたの目標からかけ離れたものであるのなら、思い切って転職してみるのも一つの手かもしれません。


資格の勉強に時間を使ってしまった


まさに本末転倒の典型。愚の骨頂ですね。

私が働いていた会社では、資格手当というものがあり、IPAという団体が実施している資格試験に合格すると、会社から毎月お金がもらえるようになる仕組みがありました。

まんまとそれにつられ、結構な時間と労力をかけて、社会人の貴重な時間を割きながら勉強をしてしまいました。

給料のアップや、組織の中での出世だけが目的なのであれば、資格取得は決して間違った選択ではないと思います。

しかし私の場合、自分でWebサービスを作れるようになるのが目標でしたから、その目的と照らし合わせると、やはり無駄な時間だったと言わざるを得ません。


また、これは人によると思いますが、エンジニアとしていつか海外で働くことを志されている方であれば、資格取得にはあまり意味がありません。

それよりもソースコードをGithubで公開したり、自分のWebサービスを作っておいて、ポートフォリオとして会社に提示できるようにしておいた方が、よっぽど役に立ちます。


フレームワークの学習の優先順位を、下の方に設定してしまった


これがこの記事で最も言いたかったことです。

私がそうだったのですが、Webシステムの開発について良く分からない初心者にとっては、
「プログラミングができる ⇒ Webサービスが作れる」
と考えてしまいがちです。

ただ、実際のところ、JavaでWebシステムを作ろうとしても、Javaプログラミングだけでなく、多くの周辺知識が必要になります。

サーバー構築から始まり、ネットワークの設定、各種設定ファイルの記述、データベースとの連携、セキュリティー、、、、

Webサービスの全体が、隅から隅までJavaで書かれているわけではないのです。

これは、RubyでもPHPでもPythonでも同じです。


まずWebフレームワークを勉強しよう

まずWebフレームワークを勉強しよう

上記で色々私の反省を書いてきたのですが、読者の皆さんに結局言いたいのは、
「早めにフレームワークの勉強をしよう」
ということです。

フレームワークとは、Webサービスを作成する上での、必要な機能をあらかじめ提供してくれるもので、そのフレームワークのルールに沿ってプログラムを書いていけば、面倒くさい設定などは基本的にフレームワーク側がやってくれるようなものです。


正直、プログラミング言語の理解がフワフワしている時点から、フレームワークの勉強を始めてしまっても良いと思います。

JavaであればSpringPHPであればLaravelPythonであればDjangoなどを勉強すると良いでしょう。

特に私が初心者の方におすすめしたいフレームワークは、Rubyという言語で開発を行うためのフレームワークである、Ruby on Railsというフレームワークです。

Ruby on Railsの大きな特徴は、「レール」という名前にも表れているように、Webサービス作成の道筋を、あらかじめガッチリ決めてくれてあって、そのルールに沿って開発をすれば、あまり深いことを考えなくても、動くアプリケーションが作れてしまうことです。

その中でも特に、コマンド一つでソースコードを自動で生成する機能を備えており、単純なアプリケーションであれば、魔法のような速度でWebアプリケーションが出来上がるのは、特筆すべき特徴です。

Ruby on Railsを参考にして作成された後発のフレームワークであれば、そういった機能を備えていることもありますが、このタイプのフレームワークではRuby on Railsが最もメジャーでしょう。


初心者はRuby on Railsをやるべきでない?

初心者はRuby on Railsをやるべきでない?

実は初心者がRuby on Railsを使うことには、反対されるエンジニアの方もいらっしゃいます。

なぜかというと、Ruby on Railsを使えば、プログラミング言語の細かい仕様や、詳細な技術を理解していなくても、Webアプリケーションが生成できてしまうからです。

それでは勉強にならない!
という方もいらっしゃいますし、プログラム等の詳細な技術を長年勉強されてきた方々からすると、細かい仕様を全く理解していない初心者が、自動でソースコードを生成してWebアプリを作った気になっているのが、面白くない…といったところなのでしょう。


しかし、私の経験からすると、自動生成だろうが何だろうが、まずはちゃんと動くWebアプリが作れて、それを公開できるところまでやって、細かい仕様などはその後に学べば良いと思うのです。

もちろん、ゆくゆくはシステムの内側の仕様や、ソースコードの詳細を理解していく必要はあります。
その必要がないと言っているわけではありません。

自動生成されるものなんて言うのは最低限の機能のみを備えたアプリですから、しっかりとしたオリジナルのサービスにするためには、中身を理解してカスタマイズしたり、自力で機能を追加したりする必要があります。


しかし、そういった詳細部分を理解する労力なんていうのは、どんな道を通っても必要となるものです。

フレームワークなしでスクラッチで一から作るにしても、当然、ソースコードや設定ファイルの理解は必要になります。


どちらにしても通らなければならない道なのであれば、あらかじめひな形となるアプリケーションを自動で生成して、生成されたものを解析しながら勉強した方が、ずっと効率が良いと思うのです。

特にRuby on Railsは、フォルダー構成から、ファイルの名前の付け方まで、細かくルールが決まっています。

ルールが決まっているというのは面倒くさそうに聞こえてしまうかも知れませんが、裏を返せば、それが決まっていないければ、フォルダー構成やファイルの命名規則を、自分で考えなければいけないということです。

しかし、そういうことをちゃんと考えられるようになるのは、Webシステムの「あるべき姿」を知った後でしょう。


どういうフォルダー構成にすると良いのか、
どんなファイル名にすると良いのか、
プログラムはどの程度の粒度でモジュール分けするのか、
どんな機能を持ったプログラムモジュールが必要なのか、
どんな設定値をシステム全体から参照できるようにするのか、
どんな風にしてデータベースとシステムを連携させるのか、
データベース側はどういうテーブル設計にするのか。。。

そういった部分を考えられるようになるには、まずは「あるべき姿」で作られたシステムを解析し、経験を積む必要があります。

それには、自動生成でも、ガチガチの規約でも、ある程度基礎となる「レール」を元に組み立てられたシステムを参考にして、勉強を進める必要があります。


もし業務でそういう素晴らしいシステムに携われているのであれば良いのですが、そういった方々ばかりではないでしょう。

社会人がプライベートの時間を用いて勉強できることは限られています。


「プログラミング言語をマスターしてから」

ではなく、

できるだけ早い段階で、フレームワークの学習に取り掛かることをお勧めします。

この記事でオススメしたRuby on Railsに関しては、以下の記事でも詳しくまとめているので、よろしければご参照ください:
Ruby on Railsのメリット・デメリット【初心者にもわかりやすく解説】>>


極力、目的に直結することをやりましょう。
以上、遠回りした僕からのアドバイスでした。