本記事は、独学でのプログラミング学習で、障害となる壁6選と解決方法 前編の続編になっています。
3つ目の壁
3つ目の壁 解決方法(部分解決)
オブジェクトを深く理解するのに、下記の本がとても参考になりました。あるセミナーで講師の先生からお勧めして頂きました。当時の私のレベルで、何回も読み直してやっと理解できるレベルです。(初心者レベルでは、言葉や概念が難しく、とっつきにくい内容になっています。)
この本で印象に残ったのは、「システムは永遠に完成しない事を前提に作る」という事でした。時代は変化を続けるし人の考えも変わっていくので、要求が永遠に発生するのは当然だなと思いました。
この時まで、私はオブジェクト指向に登場する。抽象クラスやインターフェースの本当の意味を理解していませんでしたが、やっと腑に落ちました。またこの本を通して、いわゆる「デザインパターン」も習得できるのでお勧めです。
しかしこの本を読んでも、ソフトウェア全体を具体的にどのように作ったらよいか、未だ分からずでした。アーキテクチャーの話は、出てこなかったと記憶しています。
これとは別に、セミナーの講師がDDD(ドメイン駆動開発)がお勧め、と言っていたのでさっそく本を購入してみました。
しかしこの本、当時の私では何を言っているか全く分かりませんでしたww
(正確には抽象的すぎて、どうコードを書くべきか、全く分からない状況でした。)
でもその後、ずーと、DDDという言葉が気になっていました。
(後編で、詳細を記します。)
4つ目の壁
エラー発生時にコード中を探し回る
3つ目の壁と同時期にぶつかった問題です。この頃になると、1つのソフトウェアあたりのコード量は多くなっていましたが、関連するコードがあちこちに分散していたり、似たようなコードが複数あったりと、低レベルなコードになっていました。
よって必然的に、新機能を追加した際、エラーが発生しまくりました。それをデバッグで1つずつ修正していく感じで対応しており、時間を大幅に取られていました。
4つ目の壁 解決方法
3つ目の壁で紹介した「オブジェクト指向のこころ」を理解すれば、各オブジェクトの役責という観点で設計でき、またオブジェクト間の低い結合性を意識するようになるので、ある程度は解決できるようになりました。
その上で「テスト駆動」を採用すると、各オブジェクトがどう使われるか、より意識してコードが書けるようになります。また部分を作っては、そこの品質を保証してから、次の部分に取り掛かるスタイルなので、エラー発生時、どの場所がエラーなのかすぐ分かるというのが素晴らしいです。
これでエラーを修正するために、コード全体を探し回る事が大幅に無くなりました。(でもテストを書くのが、結構大変です。手が止まります・・ そして、テストを書くのが面倒なので、常にSkipしたい誘惑にかられます・・)
テスト駆動開発、下記本がおすすめです。
またコードの品質担保はとても重要な事で、テストを基礎から勉強するのがお勧めです。近日中に、テスト方法に関する記事も記したいと思っています。
5つ目の壁
勉強する事が多すぎて、追いつかない
この頃になると、Webアプリも作っていました。
Webアプリを作る場合、フロントエンドである、Html/CSS/Javascript、バックエンドである、Java(この頃はPythonに移ってたかも)、Webフレームワークの学習、他にサーバーを用意してLinux等のOS構築、Webサーバー構築、DB構築、DBの操作方法(SQL、ORMとか)、セキュリティー対策、・・・ 覚える事が多すぎて、次から次へと勉強しないとダメで、げんなりしていました。
その上で、Androidアプリとか、Windowsアプリとか、バージョン管理とか、ディープラーニングとか もう無理!! 一人でやれる量ではなかったです。それぞれ奥が本当に深くて、全部習得するのは、私では無理です。(でも世の中には、天才がいるんですよねー)
プログラムの文法だけ覚えれば全て終了だと思っていた時期が、本当に懐かしい・・・
5つ目の壁 解決方法?(現在も解決できていません。)
学習対象を絞る事がまずは重要だと思いました。私みたいに「何を作りたいのか」の目的がなく学習していると、全部学習しようという事になってしまいます。その上で、Paas等を使用してインフラ系は勉強しないとか、思い切りがとても重要だと、最近思っています。
Webアプリの場合、Herokuが有名です。
(Gitの使い方を知っていれば、簡単にデプロイできて便利です。)
もっと早く、こういう存在を知っていればと強烈に思いました。私は、インフラ系の勉強は(深くは)しないと決めています。
またそもそも簡単なサービスの場合、Googleが提供しているGAS等で実現できる事が多く、実装が簡単で、セキュリティーとかサーバ構築とかあまり気にする必要がなくデプロイできます。素晴らしい世の中になりました。
でもこういった物を使用するとしても、勉強量は半端ではないです・・
(誰か、一度勉強すれば、記憶が定着できる方法を教えて下さい・・)
6つ目の壁
依然として、既に作ったコードに機能追加をすると、コードの変更が大変な状態が続いていました。
デザインパターンを使うと、変更が発生しそうな箇所に変更容易な構造で作っておけるのですが、それでも何故か、私が書いたコードはごちゃごちゃになっていきます。
リファクタリング(コードはだんだん汚くなっていくので、綺麗にする取組みです。)も勉強して実施していましたが、最後には、どこから手をつけたらみたいな状況に陥りました。リファクタリングもどの程度までするのかの判断が難しく、(リファクタリングしている間は生産性0ですし・・)それより何よりも、プログラムのアーキテクチャーが整然としていないから、こういう事になるんだろうなーと思っていました。
次に続きます。