プログラミングで生計を立てるなら企業ニーズの多いJavaはリターンの多い言語ですから使えるようになっておいて損はありません。
Javaはこの先まだまだ隆盛を誇るでしょうから、優秀なJava開発者になれれば未来は広がります。
でもどうやったら優秀なJavaプログラマになれるんでしょうか。
資格を取る?本を読む?
それも重要だと思いますが、より実践的な方法が以下の記事で紹介されていました。
https://dzone.com/articles/10-things-become-outstanding
私を含め同じ欲求を持っている方や、初学者の方には共感出来ることが多い内容かと思うので要点をかい摘んで紹介してみます。(意訳なので詳細を読みたい方は原文を参照ください)
因みに、自分が優秀かどうかは他人が決めることです。
重要なのは、努力した結果、以前の自分には出来なかったことが出来るようになった自分を喜べるようになりたいかどうか、だと思います。
自分の成長を楽しみながら以下を実践していきたいですね。それが出来ればいつの間にか「優秀なJava開発者」になっているはずです。
目次
1.オブジェクト指向原則に対する強固な基礎と理解を持つ
オブジェクト指向でソリューションを設計する為、オブジェクト指向原則を理解する為にはオブジェクトモデリング、継承、ポリモーフィズム、デザインパターンの強固な知識を身に付ける。
OOP(オブジェクト指向プログラミング:Object Oriented Programming)では平べったくAPIや制御文を書き並べていくより構造ごとにオブジェクトにしていく方が再利用性が高まり、デザインパターンを学べばOOPの造詣をより深めるきっかけになってくれます。
この本はもう20年くらいデザインパターン本の代表格ですね。今でもぽっと出の本より遥かに役に立ちます。
私はC++を使ってもCのコードしか書けなかった頃、OOPで書けるようになった時の感動を鮮明に覚えています。
OOPの基礎がしっかりしていればソースリーディング速度が上がり、確実に成長が速まります。
少しハードルが上がるかも知れませんが、C++を一通り勉強してみることはJavaを学ぶ上で、必ず根本的な底力になってくれます。
今Javaで活躍している人は大多数がC++を経ているんじゃないでしょうか。JavaのパラダイムはC++から継承しているところが多いですから、長くJavaでご飯を食べて行くつもりならC++もご一緒に。基礎になったものを分かっていると伸びしろは間違いなく増えます。
人月ビジネス的にも案外JavaよりC++の方がいい収入源になってくれたりするかも知れませんね。ただC++はメモリ管理があるのとシンタックスシュガーが多い分Javaよりも難度は高いので、ご飯を食べるならそれなりの学習覚悟が必要です。
2.コアAPIをマスターする
どれだけ理論的知識を持っていようが、言語とコアAPIを知らなければ意味が無い。java.lang.*、I/O、例外、コレクション、ジェネリクス、スレッド、JDBC、その他のハンズオンが必要。Webアプリケーションを作る際も、どんなフレームワークを使おうが、サーブレットとJSPの概念を理解しておくことが重要。
ネイティブAPIを使わないピュアなjavaで作られていれば、どんなフレームワークでもソースを追って行くと最終的にはコアAPIに行きつきます。底辺を知っていれば上層がどう実装されているか逆算することが出来るようになります。
本やJavadocを見ながら独習コーディングするのもいいですが「java2s.com」にはコアAPIのサンプルが集約されているので学習のお供として役立ちます。
私事ですが20年前(Java1.2の頃)「Javadocを見ながら1クラスずつコアAPIを使ってみる千本ノック」をやったことがあります。
それから20年経って会社仕事でJavaを書く機会が減った今でも、その経験が「まだ負けん」と思える底力になってくれています。
JDKバージョンが上がるにつれてどんどんAPI数が増え、ノックするのも厳しくなっていましたが、Java10からは削減の一途でJava12では全盛期(Java9 : 6,005クラス)の役半分になっています。三千本ならノック出来るかも。
最先端のライブラリやフレームワークは魅力的です。でも底辺を知っている人間の方が知識の根が深く、結果的に将来性が高まるとをこの項は教えてくれています。
3.コーディングし続ける
問題を理論的に話す時それは非常にシンプルで、理論的に解決法を見つけることが出来る。しかしそのアプローチで実装を始めると問題の深さに気付く。言語の制限やベストプラクティスを知る為にコーディングし続ける。
優秀と言われるプログラマは大概、問題を議論しながら同時に脳内でその問題を解決する為のコーディングをしています。
でも問題に対するソリューションを考えながら脳内コーディングして、実際コードを書いてみたら言語仕様やフレームワーク仕様的に無理だった。なんて時間の無駄はしたくないですね。
コーディングし続けることでベストプラクティスを身に付け、脳内コーディングの精度を上げたいところです。
ネタとして「自分で作りたいものリスト」を持っておくと、コーディングするモチベーションには事欠きません。
4.フォーラムを購読する
世の中には同じ技術を使って働いている人が沢山いる。プロジェクトを開始すると奇妙な問題に直面し、公式ドキュメントからは解決方が見いだせないかも知れない。新しい技術を使って働き出した時、最初にすべきもっともよいことは関連技術フォーラムに登録すること。直面している問題が何であれ、世界の誰かは既に同じ問題に直面していて、解決法を見つけているかも知れない。そしてもしあなたが他のフォーラムユーザからの質問に答えることが出来ればそれは本当に素晴らしいこと。
今ではstackoverflowがこの役割になるんでしょうか。長く続いているフォーラムではcoderanchがメジャーです。
サイトのデザインもずっと変わりません。なんというか、家に帰ってきた気がします。
年齢問わず尊敬する先人が見つけ、いつか自分も誰かにとってそう在りたいと思う気持ちはモチベーションの一端になってくれるはずです。
技術、知識だけでなく人間性も素晴らしい人に出会えて、オフでも交流することができれば幸福度が上がります。
5.ブログをフォローする
世の中には熱狂的な技術フリークが沢山居て、技術に対する見解をブログに書いている。他のブログや開発者から様々な視点を得ることが出来、ある人はそのフレームワークを価値あるものとし、その一方で無意味だという人も居る。ブログを読むとそのツールの良い面と悪い面を知ることが出来る。
ネガティブな意見を聴くには公式サイトより利用者の個人ブログの方が適しています。
昔、複雑なDBを持っているのにJPA(Java Persistence API)を採用しているプロジェクトを受注してどハマリしたことがあります。
その後、色んな人がJPAのデメリットを挙げているのを見て「あー、これ読んでおくんだった」と思ったことがありました。
昨今はフリークじゃなくても発信する場が増えて情報源が沢山あります。本と授業しか情報源が無かった時代と比べたら本当に情報天国ですね。
ブログを通じて年齢問わず様々な人達から色々教えて貰えることが出来てありがたい限りです。
私はデスマに参画中、mkyong.comに命を救われたことがあり、それ以来ずっとこのブログのファンです。
6.オープンソースフレームワークのソースコードを読む
特に優れた開発者になりたいなら、成功している様々なフレームワークのソースコードを調べ、内部メカニズムとベストプラクティスを理解すること。この知識はより効果的な方法でフレームワークを使う時にも非常に役に立つ。
よく使われているフレームワークのソースはベストプラクティスの宝庫です。これらのソースは会社の先輩よりも多くのことを教えてくれるはずです。
いつでもどこでも好きなソースを追える環境をOpenGrokで作っておけばコードリーディングが趣味になるかも知れません。
7.新しい技術トレンドを知る
新しいフレームワークが既存のスーパーセットとして開発される為、使っていたものが時代遅れになるリスクがある。現在のフレームワークで解決しようとしている問題は、新しいフレームワークを使用することで1行で解決できるかも知れない。
strutsやspringがサーブレットを提供してくれるのは最初は抵抗があったけど使ってみると「あぁこっちの方がいいか」と思えるものでした。
アノテーション1行で複雑なことを賄えるようになったことを考えると、あながち誇張でもありません。
トレンドを掴むにはHackerNews他、いろいろな先端サイトを情報源の一つにすることです。
自分だけの情報源を多く見つけられれば自然と周りより知識的優位が取れます。情報量は圧倒的に英語圏の方が多いので、自然と英語のリーディングスキルも身に付きますね。
8.使えるコード、スニペットを手元に置いておく
同じコードを何回もコピーペーストしているなら log4.properties、JDBC構成などのようなスニペットと、StringUtils、ReflectionUtils、DBUtilsなどを用意しておくこと。それ自体はあなたを傑出した開発者にしないかも知れないが、オブジェクトのコレクションからプロパティの値のリストを取得したい時、ReflectionUtilを使えば数分で実装出来ることを想像して欲しい。
既存ライブラリの知識と同様に、優れた開発者はプライベートなgitサーバを持っていて自作の小道具を持っています。丸腰で戦うより武器を携えていた方が勝率が高まることを経験則で知っているからです。
検証であれ個人プロダクトであれ、プログラムを書いたら保存しておける自分だけのプライベートgitリポジトリは、長い開発者人生の良い相棒になってくれるはずです。
9.様々な開発手法を知る
アジャイル、SCRUM、XP、ウォーターフォールなどのさまざまな方法論に精通すること。 さまざまな方法論に関するアイデアを持っていることはプラスにる。
大規模SIが決まってウォーターフォールで受注開発するのは思考が停止している典型例です。
単に顧客との決済をし易くする目的が強く、変化の速い現代ではプロジェクトを成功させる為の手法とは言い難い時代になっています。
大規模でも最初から高単価の少人数でサイクルを回して工期を少し伸ばした方が成功するケースもありますし、機械学習をウォーターフォールで開発するプロジェクトが成功する可能性は限りなく低く、参画しても苦労が絶えません。
自社開発サービスであれば売上結果が全てで顧客との金銭交渉もありませんから、ウォーターフォールを選択する意味もありません。
もしウォーターフォールのプロジェクトに入ってしまっても、チーム内部ではアジャイル、スクラム、DevOpsを意識して作業し、経験付けしていけば未来は明るくなるはずです。
ウォーターフォールをありがたがるのは本質的な仕事をしない経営層です。実際に開発をする開発者ではありません。
10.技術に関する考えをドキュメント化したりブログに書く
日々の仕事では、物事の新しいより良い方法、ベストプラクティス、アーキテクチャのアイデアなどを学ぶことができる。それらの考えを文書化することは自分やその他の開発者にとって非常に価値がある。 ブログに書いておけばそれらはいつか他の人やあなた自身に役立つ。
自分の技術ノートを持っている開発者は年齢問わず出来る人、または将来伸びる可能性が高い人だとこの20年の経験で実感しました。
勉強会でその知識を共有したりブログで発信したりする人は、人に価値を与えようとしている人です。身近にやたら役に立つことを話す人が居るなと思ったら、それが返報されて自分の価値に還元される仕組みを実践しようとしている人なのかも知れません。
動機がどうであれ、自分が成長して、鬱陶しくならない程度に人の役にも立つことができればWinWinの関係が築けます。
テキストメモでもEvernoteでもなんでも良いので記録は残していきましょう。脳内の記憶は使わないと一か月と持ちませんから。忘れても備忘しておけば勉強した内容を思い出すことができます。
まとめ
Javaに限らず、技術者として成長する為のヒントを提示してくれる原文でした。
とはいえ勉強して成長をしていっても成果に直結する場所が無くては張り合いが無く、いつかはモチベーションが落ちてしまいます。
運よく知識がマッチして会社で業績を残しても、短期的には個人ではなく会社全体の功績になります。
スキルアップモチベーションを保つ為、社会人である前に一開発者として自分のプロダクト、サービスを持てばそこで惜しむことなく知識を発揮出来、更に著作権も自分に帰属します。その結果、本業にも少なからずプラス効果が発生します。
もし11番目のステップを挙げるなら「優れたJava開発者になった後の自分の福祉をイメージする」なのかも知れません。
Javaは企業ニーズも最大級で、個人開発でもPython他に負けない伸びしろのある言語です。可能ならC 、C++、Javaをセットで学び、基礎を身に付けることができれば、他言語の習得が想像以上に容易になるはずです。