システム開発で思うところ

Javaで主にシステム開発をしながら思うところをツラツラを綴る。主に自分向けのメモ。EE関連の情報が少なく自分自身がそういう情報があったら良いなぁということで他の人の参考になれば幸い

新人エンジニアが読んでおいた方が良いと思う本の紹介

春もそろそろ近づいてきています。新人さんの季節ですね。

新人さんに限らずですが「こういう本を読んでおくと良いと思いますよ」と薦めている本がありますので、それを紹介したいと思います。

実際のところは「若いうちに読んでおけば良かった」という自戒の意味が強かったりします。
ここから書籍の紹介までは、おじさんの昔話なので、適当に読み飛ばしていただければと思います。

私は元々COBOLで金融系の開発をしていて、その後、PL経験を積んだ人間です。一応、物事を整理する能力は人並みにはあったということで最低限の仕事はしていたとは思います*1。とはいえ、OJTという名の下に仕事は現場で覚えるものと言い訳をして、物を作る基礎力の無い残念なエンジニアの典型でもありました。Javaでの実装経験が無くても、オブジェクト指向が分からなくても、設計書のレビューもしますし、プロジェクト管理もしますし、さらにはデバッグやプログラム改修もします。なんだか無茶苦茶ですね。でも、それが実態でした。プログラムの良いところは結果が出てくれるというところです。やり方はともかくとしても要件・仕様は把握しているので、そこを満たせば目の前の問題に限っては対処できます。また、幸いにもプログラミングについては、より詳しい技術者もいましたので、そういった方々と協力したチームを作ることで多くの問題も解決できました。PLやPMとして求められたのは、私の技術向上よりも、チームをまとめて大きい金額の仕事をしていくことなので、その意味では問題はありませんし、それも正解の1つだと思います。
ただ、私自身は大きな売り上げを出す人よりも、自分の力で1から物を作ることが出来る人に憧れがありました。だったら自分で行動すれば良かったわけですが、日々の仕事を言い訳に行動をしないままでした。そんな時、色々とあって大きなプロジェクトの開発プロセスに携わるチームに実質一人で参画できます*2。そのことが私にとって非常に良い転機になります。これまでやってきていた、お客様のシステム要件を理解することももちろん大切なのですが、システムを作ることそのもの(開発手法、プログラミング手法、方式検討など)をじっくり考えることが出来る時間が出来ましたし、情報収集・分析の一環としてVBAでツールを作ったりして、自分の手を動かして1から物を作る機会も得ることが出来ました。

そして、この頃から、ようやくシステムに関する本を少しずつですが読み始めます。そして思います「あぁ、こんなにサクッと読める本もあるのに、なんで私はもっと早く読んでいなかったんだろう。。あの時、知っていたら、もっと良い結果に導けたかもしれないなぁ」と。

とまぁ、そんな経緯もあって、私が読んだ本の中で、達人プログラマーになるというよりも、浅く・広く・難しすぎない・目を通すだけでも見ておくと後々良いと思う、という本を周囲に薦めるようになります。そして今回紹介している本はそういう経緯で選定した本です。

では、おじさんの昔話はこのあたりにして新人さんが読んでおいた方が良いと思う本を紹介していきたいと思います。

Javaアソシエイツ

SUN教科書 Java アソシエイツ (SJC-A)

SUN教科書 Java アソシエイツ (SJC-A)

Sunテキスト Javaアソシエイツ EXAM 【310-019】 (SKILL-UP TEXT)

Sunテキスト Javaアソシエイツ EXAM 【310-019】 (SKILL-UP TEXT)

何から勉強したら良いのかなぁ、と思っていらっしゃる方であれば、まずこれらの本を薦めています。どちらの本でも良いですし他にもあります*3。ページ数が多いから前者、通勤電車で読むからコンパクトな方が良いというのであれば後者、など立ち読みして好みの方を選んでください。知っておいてほしい知識はどちらでも学べます。

言い過ぎかもしれませんが、この資格そのものに実際のところ何の価値もありません。なので合格を目的としなくて良いです*4

では、なぜ私がこの本を進めるかというと「教科書」的な位置づけの本だからです。SIerで勉強というと、まず出てくるのが基本情報処理試験だと思います。こちらも悪いわけではないです。ただ情報分野への理解には良いですが、システムやプログラミングへの理解という意味だと良くはないです*5。良し悪しではなく目的が違います。

教材にすることでJavaで開発をする人にとって一通り知っておいてほしい知識が身に付きます*6。AWTとかSwingとか「今、それ使う開発はあるの?」という情報もありますが、知識として知っておいて損はありません。メンテナンス対象となっているシステムが使用しているケースもあり得ます。また、Javaは関係ないから、という人もいると思いますが、もしSIerで仕事をする方であれば、UML*7や継承など、オブジェクト指向での開発に必要となる知識は必要です。言語特有の知識はありますが、自分の開発言語に置き換えながら読むなどして、いろんな言語があるんだな、という学習の仕方もあると思います。

「この程度の事をわざわざ勉強しなくても」という方もいらっしゃるかと思いますが、むしろ「この程度の事」だからこそ、きちんと勉強をしておくことが大切だと私は思います。

もし理解を深めたいというのであれば問題集もあります。私は資格取得までしたので問題集まで読みましたが、私がまず知っておいてほしい知識と思っている内容は参考書で十分です*8

徹底攻略 Javaアソシエイツ問題集[310-019]対応 (ITプロ/ITエンジニアのための徹底攻略)

徹底攻略 Javaアソシエイツ問題集[310-019]対応 (ITプロ/ITエンジニアのための徹底攻略)

開発現場の掟

開発現場の掟 (プロの鉄則) エンジニアが現場で生き残るための極意 (開発の現場セレクション)

開発現場の掟 (プロの鉄則) エンジニアが現場で生き残るための極意 (開発の現場セレクション)

実際の開発現場での経験を踏まえた知恵が書かれた本です。経験豊かなエンジニアからすれば当たり前であったり、平凡なことばかりかもしれません。でも、これから経験を積む入り口に立っている新人の方には有用な情報が多いと思います。

当たり前のように思うかもしれませんが、この当たり前が実際は難しいものです。

例えば、新人の方でも、自学してスクラムとかアジャイルとか、そういった開発手法を導入しよう、なぜ導入しないんだ、あぁだからSIerは・・・と思うことがあるかもしれません。確かにそういう一面もあるかと思いますが、それを取り入れない理由もあります。おじさんになると、そのあたりも勘案するようになったりしますが、若さゆえの衝突もあると思います。ひょっとしたら、正しい、間違っているは別にして「アジャイルの劇薬の鉄則」あたりが現場の経験としてあったためかもしれませんよ。

他にも仕事の進め方や、開発時に「始めからやっておけば良かった」ということなど、まぁそういう引き出しが色々と書かれている本なので、読んでおいて損はないと思います。

楽々ERDレッスン

楽々ERDレッスン (CodeZine BOOKS)

楽々ERDレッスン (CodeZine BOOKS)

データベースはシステムにおいてほぼ必須です。データベースを使わなくてもモデリングは必須です。

データベースの設計は、設計時の初期にシステムをモデリングする際に検討することが多いため、新人はなかなか経験できません。そして経験年数を重ねて設計工程に参画することになって、いきなりやれと言われます。そこから改めて過去の自分の携わったシステムを正解として自分なりに試行錯誤をすることになりがちです。でも、まだ「やれ」と言われて経験が出来るのであれば幸せかもしれません。

設計はセンスではなく技術なので、そうやって経験を積む中でより良い設計が出来るようになるわけですが、モデリングおよびデータベース設計は、やり直しのリスクが大きいため、始めから出来るだけ品質の良いものにしておきたいところです。そうすると案件的に「経験者優先」となってなかなか経験そのものを積むこと自体が難しいことの方が多いです。

では、本当に、その既存の設計や経験者の設計は妥当なのでしょうか?自分が設計したデータベースがただのデータの入れ物になってはいないでしょうか?

経験を補完するためには知識と疑似トレーニングが有効だと思うわけですが、紹介している本は、その2つを満たしていると思います。SQLについても基本的なところだけでなく、難解なものも事例として書かれています。この本は、モデリングだけ、SQLだけ、ではなくて、自分がモデリングしたものを実際にSQLで検索してみると、、という実践の流れまでを一通り押さえてくれているところが良いと思っています。

ひょっとしたら、本書を薦めつつ、新人さんがいきなりデータベース設計をすることは無いだろうということで、矛盾しているように思われるかもしれません。確かに設計そのものをすることは無いかもしれません。ですが、知識の習得や疑似トレーニングをしておくことで、目にするテーブル設計の意図を通じて仕様をより深く理解できるようになるのではないでしょうか。興味を持つと仕事が面白くなります。ER図を自分なりに紐解いていく中で、システムのイメージを掴めるようになります(それはモデリング追体験かもしれません)。無機質に思えたテーブル定義が、システムを抽象的に表現していると感じるようになったら楽しいと思いませんか?少なくとも、私は、そういうことを楽しいと思うエンジニアさんと一緒に仕事をしたいです。

現場で役立つシステム設計の原則

2019/4/19 追記

オブジェクト指向の何が嬉しいの?
じゃあ実際にコードで表現するのは どうしたら良いの?
そのためには どういう設計をしたら良いの?
に対して、理解を助けてくれます。

ただし「これこそが答えである」とはしない方が良いです。
著者の増田さん(増田 亨. (@masuda220) | Twitter)も その時の自分の考えであって、今後も変わっていくと仰っています。

とはいえ、ここまで現場でたたき上げた経験の結果を記した書籍は ほとんど無いのではないかと思います。

私の書評

vermeer.hatenablog.jp

著者も参加されていた勉強会のメモ

vermeer.hatenablog.jp

Javaルールブック

Javaルールブック ?読みやすく効率的なコードの原則

Javaルールブック ?読みやすく効率的なコードの原則

最後に紹介する本は、ぐっとプログラミングよりの本になります。Java5までのコーディング規約です。今はJava8なので情報としては古いのですが、紹介している理由は新しい古いとは別の事なので問題はありません。

こちらの書籍を薦めている理由は、プログラミングでの「良い例」「悪い例」と比較してくれているところです。プログラムをする中で大切な要素に、レビューをしてもらう、という工程があります。その延長で「他人のコードを読んで勉強しましょう」と良く言われます。でも良いレビュアーに出会えないかもしれません。また、コードを読めと言われても闇雲に読むのも難しいですし、目の前にあるコードが読むに値するものか判断するためには、やはりそれなりに経験が必要です。でも、その経験そのものが無い状態では・・・というループになってしまいます。

その第一歩として、この本を薦めています。

その上で、より良いコードを書く技術の本はたくさんありますし、その中には平易なものもいくつもありますので、そちらの本を読むようにしていけば良いと思います。

最後に

紹介した書籍は「絶対に正しい事」とは限りませんし、私自身も紹介した書籍の全てが正しいというつもりもありません。プログラミングも設計も開発手法も、色々な「正しさ」を持っている人がたくさんいますし、好みの問題もあります。とはいえ、まずは土台となる基礎が無いと、そういった判断をすることも難しいと思います。
また、上述で紹介した本の後に読んだ方が良いと思う、割合と平易な本もいくつかありますが、それを言い始めるとラインナップを見ただけで、お腹が一杯になってしまうことになるような気がしましたので、私なりに厳選をしたつもりです。

これからエンジニアになろうとしている方にとって、紹介した本が一助になれば幸いです。

*1:おそらくですが、そういうSIerシステムエンジニアと呼ばれる人は多いのではないでしょうか

*2:その時の上司に拾っていただいたというのが本当のところです

*3:私が読んだのは、この2冊です。

*4:試験料は馬鹿になりません、結構高いです

*5:無駄ではないです。というか無駄な勉強は無いです。

*6:お恥ずかしい話ですが、私はこの教科書的な知識すらありませんでした。

*7:クラス図だけだけど

*8:資格を受けるのなら黒本問題集は必ずやった方が良いです。参考書だけでは演習量が足りないです。