若手エンジニア時代に学んだ2つの重要なこと 〜プログラムの基礎概念と良いコードとの出会いと実践〜

はじめに

アソビューでエンジニアリングマネージャーをやっている竹内です。

この記事を書こうと思った背景は、2、3年目ぐらいのいわゆる若手エンジニアの成長をもっと促進できないかという悩みからでした。色々と考えましたが、自分が成長できたと感じたことを伝えると、誰かのヒントになるのではないかと思ったことがきっかけでした。社内向けの記事にしてもよかったのですが、せっかくならテックブログとして書くかと思い至りました。誰かの何かのヒントになれば幸いです。

この記事では、私が経験した新人から3、4年目あたりまでのことを書きます。 なお、四半世紀前(2000年ごろ)のことなので、記憶が曖昧なところや今では参考にならない部分もあるかもしれませんが、エンジニアとしての基本的な成長や考え方については、時代を超えて通用する部分もあるのではないかと期待しています。

前提

私のそれまでのキャリアについて

  • 学生時代にC言語をメインで学校の授業で勉強していました
  • HTMLやCSSはある程度独学で理解していましたが、JavaScriptやSQLは全く触れたことがありませんでした
  • SI企業に入社し、新人研修でJavaとSQLに初めて触れました

そのとき私の周りで使われていた技術がどんな感じだったかについて

入社当時は以下のような技術を主に使っていました。

  • Java 1.2 ぐらいで、Servlet が実案件で使われ始めた(Struts はまだない)
  • ブラウザはInternet ExplorerとNetscapeが主流
  • Webアプリケーションの業務システムが比較的新しい存在
  • 入社当時は Eclipse はまだなく、私の周りではテキストエディタで開発していた

このころエンジニアとして学んだ重要なこと

1. プログラムの基礎概念

なぜ重要だったか

これらの概念を理解しないとプログラム1行1行がどのように動くか、なにが行われるかがわからないからです。 どんなプロダクトも1行1行の積み重ねである以上、その1行をきちんと理解することはとても重要と思っています。

変数、型、ポインタの理解

学生時代にC言語で学んだときに理解した基本的な概念が、その後のプログラミング言語の理解の基盤となりました。

int value = 10;        // 即値
int *pointer = &value; // ポインタ

このような変数と型とポインタの概念を図で理解することで、メモリ上での値の格納方法やポインタの仕組みを視覚的に理解できました。この概念がプログラミング言語を理解する上での基礎になっており、以後いくつかの言語を使ってきましたが、まずはこの概念を使って理解をしてきました。

Javaの変数、型、参照を上記の概念で理解する

会社に入ってJavaに初めて触れて、オブジェクト指向言語も初めてでした。しかし、学生時代に学んだC言語の概念を適用することで、理解を深めることができました。

int value = 10;           // プリミティブ型(即値)
Integer ref = new Integer(value); // オブジェクト参照

MyObject obj1 = new MyObject();
MyObject obj2 = obj1; // obj2はobj1と同じオブジェクトを参照
MyObject obj3 = null; // どのオブジェクトも参照しない

このように、Javaではプリミティブ型と参照型で振る舞いが異なり、参照型の変数はオブジェクトそのものではなくアドレス(参照)を保持しているため、C言語のポインタの理解があればスムーズに理解できました。

私の頭の中では以下のようなイメージで理解しています。

図: 四角=変数(即値の場合値を明記)、丸=オブジェクト、参照型変数は矢印でオブジェクトを指す。

私が理解している概念が正しいかを確かめるために、理解した概念に基づいて考えたコードを書いて動かし、意図通りの結果になるかを実務の中で確認していました。この取り組みを1〜2年間続けていたと思いますが、これで Java の基本的な概念が体に染み付いていきました。また、自分が初めて使う要素に出くわしたときにも、この概念で理解できるかを考えて自分の中に落とし込んでいました。こういったことを通じて、意図通りにコードを書くことと他人が書いたコードを読むことに自信がついていきました。また、不具合の特定と修正もスピーディに行えていたと思います。

学びのポイント

  • 基礎概念の理解は、新しい技術を学ぶ際の基盤となる
  • 実践を継続することにより、理解が深まり技術的な自信を身につけることができる
  • 基礎概念の理解により、バグの特定と修正がスピーディに行えるようになる

2. 良いコードとの出会いと実践

デザインパターンなどの書籍を通じて良いコードと出会った

当時の上長からデザインパターンというものがあることを教えてもらい、こちらの書籍 を購入して読み込みました。 多くのパターン書かれていますが、かなりの割合は理解できなかったです。オブジェクト指向の設計パターンを適用する機会が少なく、どういうときにどのパターンを使えばいいかイメージがつかなかったのだと思います。 とはいえSingletonやFactoryパターンは比較的単純で目的も理解しやすかったため、その後のプロジェクトで実際に活用していくことができました。また、OSS 例えば Struts のコードを読んだときにも、ここはこのパターンだなと気づいたこともありました。

この頃から、技術書籍に興味を持つようになり、『達人プログラマー』や『リファクタリング』などを読んでいたと思います。これらを通じてどのようなコードが良いコードなのか、あるいは設計なのかを意識していったと思います。

OSS のコードを読み良いコードと出会い、フレームワーク構築を通じて良いコードを参考にした

当時のプロジェクトでも OSS を活用していました。特に Struts はこのころに登場し、実際の案件で使うに当たって読み込んだ記憶があります。私が初めてコードを読んだ OSS は Struts でした。 Struts で登場するクラスがどのような関係でそれぞれ何をやっているのか、クラス図のようなものを書いて理解しようとしていきました。 今思えばこういったことを通じてクラスの構造を理解することを身につけていったのかもしれません。それとアーキテクチャに興味を持ち始めたのもこの頃だったように思います。

新規プロジェクトでリーダーを任されたときにStrutsと簡易的な自作ORMapperを導入しました。 自作ORMapperを作るときに、Struts のコードを読んだときに知った commons-beanutils というライブラリを活用しました。このライブラリは、JavaBeansの操作を簡単にするユーティリティで、ORMapperの実装に必要な機能を提供してくれました。これまでに得た知識を総動員してアーキテクチャを考えていたと思います。

また、合わせて Entity クラスを導入しました。これは業務の概念をコード上で定義したいと考えていたためです。業務の世界をコード上で表現したいと思っていました。そのほうがわかりやすいと考えていたからです。この思いはのちに DDD への興味へとつながっていったと思います。

この経験は私にとっては大きな自信になりました。新規プロジェクトで 1 から自分で設計したものがフレームワークも含めて意図通りにそして大きな問題なく動いてくれてお客様に使っていただけた、これが大きかったと思います。

学びのポイント

  • 良いコードは意外と自分に近いところにあるし、簡単にアクセスできる環境にある
  • 良いコードを読み理解し参考にすることで、自分のコードにも良い影響が生まれる

最後に

この記事では、私が若手エンジニアだったころに学んだ2つの重要な要素から振り返りました:

  1. プログラムの概念の理解 - 基礎概念を自信がつくまで理解することの重要性
  2. 良いコードとの出会いと実践 - デザインパターンやOSSのコードリーディングを通じた良いコードとの出会いとそれらを参考に実際に書くこと

これらの経験を通じて学んだことは、基礎をしっかりと理解することと実践的な学習を続けることの重要性です。表面的な知識や覚えるといったことではなく、なぜこうなっているのか?といった部分まで理解しようとすることが、さまざまな技術習得に役立ってきましたし、礎になってきたと感じています。

そのためには、納得するまで理解することがとても大事です。かの t-wada さんが以下のスライドで引用されている「量は質に転化する」はそのとおりだなと思います。理解するためには時には量(同じようなコードを何度も書いたり、様々なパターンを試すなど)が必要な場合もあるでしょう。

speakerdeck.com

私はこのころは「(プログラミングの勉強は)やればやっただけ自分に返ってくる」と考えていて、結果的に量をこなしていました。 プログラミングが好きだし楽しいことも、継続できた理由のひとつです。

これらのことをやっていくうちに、同僚から質問を受けたり、技術選定に関わったり、後輩の指導を担当することになりました。 新たな役割を得たり、周囲からの信頼を得ることにつながっていったと思います。

現在の技術環境は当時と大きく変わっていますが、これらの基本的な成長の考え方は、時代を超えて通用するのではないかと考えています。 特に最近では AI にコードを書かせることが当たり前になりつつあります。AI がコードを書いたとしてもエンジニアが内容を理解する必要がありますしもちろん責任も伴います(少なくとも今は)。 こういった基礎的なことを理解することは重要なことであると改めて感じています。

これからエンジニアとして成長していく方々にとって、少しでも参考になれば幸いです。

PR

アソビューではより良いプロダクトを世の中に届けられるよう様々な挑戦を続けています。 私達と一緒に働くエンジニアを募集していますので、興味のある方はぜひお気軽にエントリーください!(カジュアル面談もやってます!)

www.asoview.co.jp