エンジニアはプログラミングの力で世界を変えることができる

篭橋裕紀氏(以下、篭橋):ありがとうございます。他に質問したい方はいますか? 次のところのほうがもう少し詳しくいろいろな話が聞けるかなと思うので、そしたらテーマ2に。城倉さんお願いします。

城倉和孝氏(以下、城倉):じゃあテーマ2ですね。先ほどのコースが3つあります。じゃあそれになるためにまずどうしたらいいのかという話ですが、みなさんはエンジニアなので、やはりエンジニアとしてそれなりに大成するということは大事だと思います。

例えば、「VPoEになります」と言っても、やはりエンジニアの気持ちがわからないとマネジメントもできないですよね。だから、まずは「イケてるエンジニア」を目指してほしいなというのがテーマ2になります。

今わりと「エンジニアが不足してる」という声もありますが、なんでかという話を少し話すと、まず時代背景があります。DXってたぶんみなさん少なからず聞いたことがあると思います。デジタルトランスフォーメーションですね。これ、けっこう勘違いされていて、「デジタル化すればDXだ」と言う会社さんがけっこう多いんですよ。これは、手段を目的にしちゃってるケースになります。

DXって経済産業省も言っていることで、経済産業省のレポートに背景が載っています。軽く読み上げますと、あらゆる産業において新たなデジタル技術を利用して、これまでにないビジネスモデルを展開する新規参入者、まぁGAFAなどもそうですよね。これが登場して、ゲームチェンジが起きつつある。

今までの常識だと、例えばカメラだったらフィルムが要りますよね。富士フイルムさんなどが強かったですが、デジカメになるとフィルムが要らなくなるんですよね。そうすると、完全にゲームチェンジが起きて、SONYや家電メーカーがカメラに強くなるわけですよ。こういうことが起こっています。それで各企業が競争力維持・強化のためにDXを進めなさいというのが、趣旨になります。

ということは、やはりこれからはデジタル化が進んでいく社会なのですね。その中でみなさんはどういう価値があるのかというと、プログラミングの力で世界を変えることができるんですね。

だから、ものづくりができるというのは僕は最強だと思っていて。モノが作れない人はプログラムを作れないから世界も変えられませんが、(みなさんは)モノが作れて、自分の力で変えることができるんですね。こんなにすばらしいことはないんじゃないかなと思っています。

大切なのは「要素技術をしっかりと覚えていく」こと

そういう意味で、「エンジニアのこれから」ということで、技術力を持っていろいろな生活や行動をプログラミングの力で変えていくことができます。顔認証なんかも普通になりましたよね。最初は「こんなのできるんだ」と思いましたが、今はまったく普通ですし、スマートホームなどもあります。ブロックチェーンもですね。エストニアが個人の情報を全部ブロックチェーンで管理しているのは有名な話です。

Web3という、メタバースなどが今はやり始めています。『ソードアートオンライン』というアニメがありますが、「ブレインインターフェイス」といって、手でのインプットでもなく、声でのインプットでもなく、脳波でインプットして、アウトプットしてインプットするというアレですよね。これはFacebookがまじめに研究しています。

こういうものがどうやって生まれるのかというと、コンサル会社のガートナー(ガートナー・コンサルティング)ですね。これが毎年、「戦略的テクノロジ・トレンドのトップ10」というものを出しています。(スライドを示して)これは2019年でちょっと古いんですが、「1番、自律的なもの」「2番、拡張アナリティクス」「3番、AI主導」などいろいろと書いてあります。これがテクノロジーのトレンドです。1番から10番まであります。

じゃあこれをどう実現するんだとなると、真ん中に書いてあるIoTデバイス、5G、マシンラーニング、VR、ブロックチェーン、もちろんWebの技術もありますね。それほどすごいことを考えなくてよくて、だいたいこういう要素技術の組み合わせなのですよね。だから要素技術をしっかりと覚えていくのが、エンジニアとしては非常に大切になります。

イケてるエンジニアは良いコード・良いアーキテクチャを追求する

ということで、みなさんが「イケてるエンジニア」になるためにぜひ大切にしたいことですね。これは当たり前の話ですが、良いコード、良いアーキテクチャを追求しましょう。今日はジュニア層、それからミドル層の方に向けているので、たぶんシニア層の方は「当たり前のこと言うな」と言っていると思いますが、そこはご容赦ください。

「良いコードとはなんでしょう」という話なのですけど。一番よく書かれているもので、たぶん読まれている方がたくさんいると思いますが、『リーダブルコード』ですね。ぜひこれは必ず読んでほしいなと思います。序章は、「美しいコードを見ると感動する。優れたコードは見た瞬間に何をしているか伝わる。そういうコードは使うのが楽しいし、自分のコードもそうあるべきだと思わせてくれる」から始まっているんですね。

(スライドを示して)ここに書いてあるのは抜粋してきています。例えば、適切な命名ですね。それからインデントや美しさ。それから価値のないコメントを書かない。これ、実は適切な命名とすごく関係しています。

採用面接をしていて、よく「なにかこだわりがありますか?」と聞くと、「あります」と。「読みやすいコードを書くのがこだわりです」と言う方がいて、「読みやすいコードってなんですか?」と聞くと、「コメントを書きます」と言うんですよ。コメントだらけのコードなんて想像してください。もう読めたもんじゃないですね(笑)。

コメントは価値があるところは書くべきですが、基本は書かない。その代わりに、関数名や変数名の命名が適切で、きれいに書いてあるというのがやはり見やすく、可読性が高くて良いコードだと思います。

プログラムも言語なので、話すのと同じで「相手」ですよね。相手がどう理解できるかを考えながら作るのが必要になります。それからループやロジック、巨大な式など、複雑性をなるべくなくしましょうという話です。

あと、変数と読みやすさ。それから共通化ですね。汎用コードの分離と言っているのが、「同じところはまとめていきましょう」「短いコードを書く」など。それからテストのことも書いてあって、「テストしやすいコードや読みやすいコードを書きましょう」と。そういうことも書いてあります。

コードのこだわりについてというところなのですが。(スライドを示して)これ、みなさんはパッと見ればもうだいたいプログラムの意味がわかると思います。配列、パラメーターから偶数だけを取り出して2倍に返すという簡単なロジックです。1、2、3、5、8を与えると、2と8が偶数ですから、それを倍にして4、16が返ってくるというロジックです。

これはRubyですよね。左と右を見て、どちらが美しいコードかたぶん察しがつくと思います。つまり、「シンプルで無駄がない」というのが重要かと思っています。

エンジニアが学ぶべきものとは何か?

じゃあ「何を学習したらいいんですか?」という話ですが、まず1つは良いコードや良いアーキテクチャは、先ほどの『リーダブルコード』もそうですが、やはりコンピューターサイエンスを必要なところだけでいいので、学習するのが良いのかなと思っています。

さっきのコードでも、マップを使っていましたが、マップを知っているとループの数やIF文が削減できるわけですね。なので、きちんとコンピューターサイエンスみたいなところで、アルゴリズムやコードのあるべきところを勉強するのがいいのかなと思います。

あと、僕が「いいコードとはなんですか?」と聞かれた時によく言っているのが、「捨てやすいコード」です。技術的負債というのは絶対にたまります。今みなさんが書いていてイケてると思っているコードも、3年後に入ってくる新しい人から見るとクソコードかもしれないですよね。

これはしょうがないです。改修してるうちにIF文を追加したり、ドンドン肥大化したり複雑になったりしていくので。やはりビジネスはある程度スピード優先なので、そこに目をつぶらざるを得ない時もけっこうあります。

なので、負債返済をしていかなきゃいけないのですが、その時に返済しやすいかどうかという話ですね。捨てて新しいものに替えられるのかって大事です。クリーンアーキテクチャやドメイン駆動設計などをしっかり学んでいると、捨てやすいコードが書けるんじゃないかなと思います。

コンピューターサイエンスにもうちょっと触れますと、「サイエンス」と呼んでいますが、「プログラミング、アルゴリズム、ハードウェア・ソフトウェア処理といった計算の理論や情報の処理に関する学問」というよりは、それを体系的に整理しているような話ですね。

(スライドを示して)これは下に例があります。オブジェクト指向プログラムであればデザインパターンやソフトウェア解決、リレーショナルデータベース、フレーム枠にはこんなものがあるというのが、こう整理がされています。先ほど言ったアルゴリズムなども載っています。

けっこう幅広いので、機械学習だったり、画像処理だったり、自然言語処理だったり、いろいろありますが、全部を知る必要はなくて、自分が関係するところですよね。プログラム言語についてでもなんでもいいので、そういったものを学ぶと良いのかなと思います。

“好奇心駆動”で学び、アウトプットをすることが重要

では、どのように学習するかですね。これもよく聞かれます。「じゃあeラーニングのナントカというサイトにアクセスして、それをイチからやりましょう」という答えを期待されると、そうではなくて。「好奇心駆動で」これだけでいいです。

「なんでだろう」「どうなっているんだろう」「もっと知りたいよ」となると、気になるから調べますよね。調べると、また新しいキーワードが出てくるんですよ。そうすると、そのキーワードも「なんだろう」となる。要はWikipediaを想像すればいいのですが、読んでいるうちに単語がリンクになっていて、押すと飛んでいってさらに……というような。

僕はWikipediaを見出すと、1日でも見てられるなというくらいすごく見てしまいます。とにかくエンジニアには「なんでだろう」「どうなっているんだろう」という好奇心が大事です。なので、「好奇心駆動」でいろいろやるといいと思います。学習ですね。

それには、アウトプットがやはり重要なのですね。インプット、これは学習ですね。書籍、インターネット、勉強会、業務中のOJTなどいろいろあります。それらから得た知識を1回暗黙知にして、さらに形式的にアウトプットするということですね。整理やスライドを作って表現することで、また自分の中で「あ、これ俺わかっていなかったな」という気づきもあります。

アウトプットはなんでもいいです。ブログでもいいですし、発表だとLTでの勉強会でもいいですし、あとは競技系なんてのもあります。いろいろなアウトプットの場があるので、これで知識を共有する。

そこでこのアウトプットを聞いた人がインプットして、「おもしろそうだな、俺もやってみようかな」という気持ちになる。それから、フィードバックをもらう時もありますよね。そうすると、「あ、そういうことなのか」と、さらに自分の理解が深まります。

少しお仕事が忙しくてなかなかLTができないなとか、ブログが書けないなという方も多いとは思うのですが、エンジニアのカルチャーとしてはこのアウトプットってとっても大事です。大事なので、やれる場合はぜひやったほうが良いかなと思います。だいたい以上になります。