見出し画像

新技術習得にコツはあるか

今日のお題は非常に難しいのですが、新しいことを早く習得する方法について書いてみたいと思います。誰しも最短距離で技術を学びたく、時間の使い方や理解できないことへの対処に悩んでいると思います。全部に答えられないですが、自分がやっているITの技術習得という点ではいくつかポイントが有るかと思います。

ちなみに自分は
言語スキル:Ruby, PHP, Python, Javascript, VisualBasic, GAS, C
データベース:MySQL, Postgres, Oracle, SQLServer
プラットフォーム:AWS, GCP, Heroku, Linux, Windows, Soraris, HP-UX
その他経験あるとかけそうなものだとCI(CircleCI、Jenkins)とかプロビジョニングツールでItamaeとかソース管理ではGit、SCCS、Subversion、仮想化ではDockerやVagrant, Virtualboxとか書きだしたらキリがないほど色々やったと思います。

どの技術について勉強するのがいいのかと言うのはよくある悩みではありますが、私はまず基本をしっかり抑えたほうがいいと思います。
アプリケーション開発なら動作原理や必要な各パーツの意味合いを知ることから始めるべきだと思います。

CodezineのRailの基本的考え方より

例えばRuby on RailsならMVCの考え方やシステム構成ではWEBサーバとアプリケーションサーバ、そしてデータベースが必要になるというところの基本はまずは理解すべきです。

私の場合は少し特殊で中学生時代にパソコンブームが来たので、BASICが動くパソコンが色々あり、プログラムを書いてrunという文字を入れて改行を打つだけでプログラムが動くことが最初の体験でした。実際には当時のコンピューターにはBASICのインタープリターが内蔵されていて、OSの中にプログラム入力モードがあるのでそこから行番号つけてプログラムを入力すると動的にバイナリーに変換して動いていたのです。そういう原理を作りながら学んでいったし、ソフトウェアを作って動くものを見るのが楽しいという体験があったから続けられたのだと思います。高校から大学4年で計算器系のゼミに入るまでほぼパソコンとは無縁だったけど、就職をプログラマーとしてやっていくことを決めたときにはなんとなく自信はありました。

社会人になってC言語やデータベースやクライアントサーバという概念を学びました。カード会社のシステムでメインフレームが作成したデータを通信ソフトでサーバに取り込んだものをクライアントの専用画面で操作するという仕組みなのですが、今のWEBやスマホのネイティブアプリに通じるものだったりします。

こういうバックグラウンドがあるから積み重ねで勘所がつかめます。

あとは人々が単純作業で面倒くさいなと考えているものは必ず自動化の仕組みが作られます。その典型がコードによるテストやCIです。人間が手作業で行うテストを自動実行できたらソフトウェアの品質が上がりますよね?デプロイの作業も自動に出来たら操作ミスによる障害は起きにくくなりますよね?AnsibleやChefのようなプロビジョニングツールも発想は同じです。サーバー構築手順をコードにしてGit管理すればアプリケーションのコード同様のサイクルに入れることが出来ます。まさに応用的発想です。サーバー構築が自動化されればWEBのサーバ台数の増減も簡単になります。

ソフトウェアの動作構造を単純化して分業もしやすくしたのがMVCフレームワークという考え方になります。RailsやSpring、Laravelとかはその例となります。実はサイバーエージェントに入るまでWEBアプリのMVCとデザイナー、コーダー、サーバーサイドエンジニアの分業についてはよく知らなかったです。

単純な積み上げでなかったため、理解するのに苦労したものもあります。Gitの使い方と考え方とかです。自分にとって難しかったのがリモートとローカルでブランチを同期する仕組みのところでした。Subversionと違って分散型リポジトリという概念も最初わからなかったし、複数人でブランチ編集した際のコンフリクトの解消方法とかrebaseとかコミットの順番とかの関係もよくわかってませんでした。何度もブランチを作って、mergeしては壊し、もしくはrevertとかしてファイルを見比べて何が起きているのかを観察することで理解できた気もします。周りの人にも大分質問攻めにしてご迷惑をかけたと思いますが経験と壮大な失敗の連続で学んだことは一生忘れないと思います。

gitのブランチ管理のイメージ

ちなみに弊社ではgitのホスティングサービスであるbitbucketを使っています。昨日はgitと完全に同じですし、github的にも使えてお値段もお手頃なので重宝しています。チケット管理に同じAtlasianのJIRA使っていることもあって案件とブランチの紐付けができるので、何で改修したことが動作に影響しているのかのバグ調査にとっても便利です。

思えば社会人になって最初のソース管理システムはSCCSというものでした。ソース管理システムはソースの履歴の管理というのが大事と思えるような失敗をしたことがあったので理解するのは容易でした。ですが、編集する際にチェックアウトとかチェックインとかあったし、その後CVSというのもちょっとやりましたが今のソース管理システムに比べると遥かに使いにくくプログラム開発の実作業を考えると直感に反するようなツールであったことは否めませんでした。それに比べると今だからわかりますがGitの使い良さが、今のオープンソースだったりフレームワークを使いながら車輪の再発明をしなくていい世の中でかなり生産性を上げる役割を果たしているんじゃないかと思います。

この話は脱線になってしまいますが、このソース管理システムのように劇的に操作方法が変わったものはキャッチアップするのがかなりしんどいと思います。人に聞くのが苦手な人は損をすると思うし、成長スピードにも差が出てしまいます。世の中にはこういう人にも手を差し伸べる意味合いで質問掲示板が整備されてます。
MSにいた伝説的プログラマーのJoel Spolskyが立ち上げたStackOverflowは日本語版もある有名な質問掲示板で質問すると簡単な答えやすいものなら1時間以内に返事が返ってくることもあってすごく便利です。私もよく使っています。StackOverFlowが日本語版を立ち上げる前はTeraTailというサイトも同じような役割を果たしていました。30分くらい調べてわからなければ聞くのが一番だと思います。わからないことを掲示板に書いているうちに頭が整理されて解決策を思いつくこともあります。

とりとめなく書きましたが、新しいことを習得するのは何かこうしたいということに対して便利にやるツールがあるので覚えるというイメージが強いかもしれません。まさに必要は発明の母といいますか・・・。

多くの技術は現実にあるものにトレースできたり、絵でかけるようなところがあると思います。最近流行りのグラフィックレコーディング(イメージに落とした議事録)に似てますね。

WEBのフレームワークに出てくるMVCモデルもGitの考え方もコンテナシステムの考え方もRuby, PHPの思想も全部絵に書き起こすことが出来ます。それができると理解は早いと思います。
そういうものに落とし込んでいくスキルは経験や短時間に集中して物事を理解しようとするようなやり方と他人とのコミュニケーションで醸成されていくような気がします。間違いを恐れずにチャレンジしていくというマインドセットも同時に必要になるし、場合によってはわかりやすいメンターも必要です。そういえば色んな人に相談できるMENTAというサービスもあります。これは海外にCodeMentorというサービスがあるのでそれの日本版のイメージです。ハンズオンで教えてもらえるし、何だったらコードも代わりに書いてくれたりもします。時間あたりいくらとかそういうものですが、スキルを時間で買っていると思えば高くないのかもしれません。

私もそうして習得してきたことが多いので、わからないという人の助けになれるように教え方ももっと洗練されていくように精進したいなと思ってます。

この記事が気に入ったらサポートをしてみませんか?