はじめに
このブログでは、情報処理の単位を落とすほどITに疎く、大抵の問題は「気力と体力」で解決してきた男が、「これからの時代はスマートフォンか!」と無謀にもIT業界に飛び込み、
8年間の経験を通して感じたエンジニアに必要なスキルについて、ご紹介できればと思います。
「システム開発ってどんなんなん?」と考えている方や、実際に開発現場で働く人にも、何かヒントになるお話しができれば幸いです。
自己紹介
こんにちは、はじめまして。プロトソリューションの棚原と申します。
私はAIテクノロジー推進室沖縄に所属しており、現在は自社SaaS開発の業務に携わっています。
私は入社してこれまで、Webアプリやスマートフォンアプリの開発、ハイブリットアプリやAPIの開発と、さまざまなプロジェクトでさまざまなシステム開発に携わってきました。
経歴を簡単にまとめると以下の通りです。
年 |
業務概要 |
触れた技術など |
H25.9~ |
入社して初めてプログラミングを学ぶ |
PHP, Objective-C |
H26.4~ |
自社サービスのB向けWebアプリ開発 |
Zend-PHP, PostgreSQL |
H27.4~ |
グーシリーズやCtoCフリマアプリ等のスマホネイティブアプリ開発 |
Objective-C, Swift, Andorid Java, FuelPHP(API), MySQL |
H29.9~ |
自動車ディーラーの業務支援アプリ開発(ハイブリットアプリ) |
Ionic AngularJS, FuelPHP(API) |
H30.7~ |
グーバイクの新規コンテンツ開発(SPA) |
Angular, Laravel(API), AWS |
R2.4~ |
自社SaaS開発 |
Angular, React, AWS(Serverless), Chalice(Python) |
私の考えるエンジニアのスキル
これらの経験を通して私が考えるエンジニアに必要なスキルは、「効率的により速く、最適解を導き出す」力だと考えます。 システム開発とは、「業務上発生する何かしらの課題をコンピューターの力で自動化・効率化・仕組み化する」様な仕事をしますが、その中で効率的により速く最適な答えを出すことがなぜ必要だと考えるのか、説明していきたいと思います。
なぜ「効率的により速く」が必要か?
私たちの仕事はどのプロジェクトにおいても、背景にビジネスがあり、ニーズがあり、競合がいて、必ず期限があります。 こうした背景の中にある課題を技術で解決することがエンジニアには求められますし、そこにはスピードが伴います。それに応え、効率よく素早く課題を解決することがエンジニアの仕事なんだと、私は考えています。
どうやって「効率的により速く」を実現するか?
例えば、ドラえもんはポケットの中から課題に対する最適な答えを素早く出し、課題を解決します。まさに理想像です。 ですが、ドラえもんのすごいところは、道具を的確に出すところです。 つまり、多くの引き出しを持ち、それらでどんなことができるかを知ってるということが、効率的により速く答えを導き出すスキルの一つなんだと思います。
私も色々な技術に触れたことで、それぞれのクセや特徴が引き出しになり、ふとした場面で課題解決のヒントとなった経験が多々あります。
また、多くの引き出しを持つというのは「知ってるだけ」で十分です。 極端な話ですが、私は未だにプログラミングの基本構文であるfor文も覚えていません。知ってるだけです。それでもIDE(プログラミング環境)の拡張機能を使ってfor文を書くことができます。 無駄に多くのことは覚えず、必要な時に取り出せればとても効率的です。
知ってるか知らないかの違い
少しかじった話になりますが、具体例でイメージしていきます。 例えば、Webサイト(静的サイト)を作成してインターネットに公開したい、という場面があります。
Webサーバを利用した場合
通常、Webサイトを構築・公開するには、大きく以下の様な対応が必要になります。
・Webページの制作
・Webサーバの構築(サーバの調達・ミドルウェア(Webサーバソフトウェア)のインストール等)
・Webページのアップロード・公開
・サーバの運用監視
と手間がかかります。
Amazon S3を利用した場合
ところが、AWS(Amazon Web Services)のS3というストレージサービスの静的ウェブサイトホスティングを利用した場合はこうなります。
・Webページの制作
・S3バケットの作成・設定
・Webページのアップロード・公開
S3を利用すればWebサーバの構築が不要で、必要な設定は管理画面上で操作でき比較的容易です。 また、S3はマネージドサービスでサーバの運用監視が不要です。(しかも安価です)
AWS Amplifyを利用した場合
それだけでなく、同じくAWSのAmplifyというサービスを利用した場合、S3の静的ホスティングと同様の仕組みを自動で構築してくれる他、https通信に対応させる為のSSL証明書の発行・設定も自動で行われたり、カスタムドメインの設定が管理画面上で容易にできたりと、手動で行う作業を更に削減することができます。
このケースだと、Amplifyで出来ることや特徴を知っていることで、他の構成よりも効率的により速くWebサイトを構築することができます。
実際の現場では、どの構成が最適なのかはプロジェクトの要件次第です。 ですが、複数の構成パターンを知っていることで、効率的でリソースに無駄のない最適な選択ができます。
プログラミングにおいての効率
上の例はシステム構成寄りのお話でしたが、プログラミングの場面でも「知ってるかどうか」が効率化につながります。
複雑さがないこと・無駄なプログラムは書かないこと
身近なExcelの関数で簡単な例です。
①
=IF(A1>=80, "優", IF(A1>=70, "良", IF(A1>=60, "可", "不可")))
②
=IFS(A1>=80, "優", A1>=70, "良", A1>=60, "可", A1<60, "不可")
どちらも同じ結果を得られますが、①の方は入れ子が多く見辛いです。条件が増えると更に見づらくなります。 ②のIFS関数を知っていれば、シンプルになります。 プログラミングでも、プログラムが見辛いと不具合につながりますし、シンプルである方がレビューなど多方面に効率的です。
引き出しから引き出しが生まれる
また専門的な話になってしまいますが、プログラミングでの例です。 プログラミング言語は、それぞれ似た様な機能を持つことがあります。
Javaで有名なエラーにぬるぽ(NullPointerException)があります。 nullの格納された変数に、メソッド呼び出し等すると発生します。発生するとアプリが停止したり、致命的です。
String str; // null
int num = str.length(); // ぬるぽ
Swiftでも同様のエラーがありますが、これを避ける方法としてOptional Chainingという機能が用意されています。
var str: String? // nil
let num = str?.count() //Optional Chaining
JavaScriptでも同様のエラーを避けたい場合があります。 そうした場合、「JavaScript Optional Chaining」とググってみます。
var str //undefined
let num = str?.length //Optional Chaining
JavaScriptでも同じくOptional Chainingが用意されていることがわかり、同じ様な記述で回避できました。 この様に、一つの言語で知っていた情報が、他の言語においても解決策となる場合があり、その観点さえあれば、効率的に問題を解決することができます。
まとめ
いかがでしたでしょうか。 ここで私がお話ししたかった内容をまとめるとこの様になります。
・システム開発とは、様々な背景にある課題を解決する仕事であること
・システムの設計やプログラミングは課題解決の手段で、それを駆使して課題を解決するのがエンジニアであること
・課題解決の手段はより多くより効率的である方が、最適で素早い課題の解決につながること
これはもちろん、基礎があってこそだと思います。 私自身もPHP, Objective-Cのプログラミング学習から始まり、色々なプロジェクトに首を突っ込むことで Webアプリ→API、iOSアプリ→Androidアプリ→ハイブリットアプリ→SPAと引き出しや感覚を身につけてきました。 これを機会に、この経験談が誰かのスキルアップに繋がれば大変嬉しく思います。
おわりに
今なら情報処理で”優”が取れそうな、なんかそんな気がしました。 今回は技術特化の内容ではありませんでしたが、またの機会には日頃触れている技術のアウトプットもしていきたいと思います。 最後までご覧いただきありがとうございました。