ラベル プログラム の投稿を表示しています。 すべての投稿を表示
ラベル プログラム の投稿を表示しています。 すべての投稿を表示

2020年9月26日土曜日

プログラミングのロジックはアナログから考えろ

こんにちは。

経験が浅いプログラマーは、
「このプログラムのロジックが思いつかない。」
「プログラミングのロジックってどうやって考えれば良いの?」
と悩むことがあると思います。

ロジックというのは、処理の手順のことです。

私は、以下の方法でロジックを考えています。
  1. プログラミングのロジックはアナログから考える
  2. アナログな方法を抽象化する
  3. ループ処理を入れ子にしない

私は10年以上プログラマーとして働いて来た。
経験が浅い頃は、ロジックが分からなくで悩んだりしていました。
でも、今ではロジックが分からなくて悩むことはなくなりました。

いろんなロジック考え実装してみて、たどり着いた結論が上の3つの方法になります。

以下で細かく説明していきます。

1.プログラミングのロジックはアナログから考える

プログラミングのロジックは、
アナログな処理を自動化することです。

なので、まずは、
「自分がこの処理をするなら、どうやってやるか?」
を考えてみましょう。

例えば、
与えられた2つの数字から、その間の合計を計算するロジックを考えてみます。
与えられる数が1と10なら、55を返えします。

その場合、
1+2+3+4+5+6+7+8+9+10=55
と計算しますよね。

なのでロジックとしては、以下になります。
  1. 与えられた小さい数に1を加える
  2. 与えられた小さい数を合計に加える
  3. 合計に1で作成した値を加える
  4. 1で作成した数に1を加える
  5. 3、4を繰り返す
  6. 4で作成した数が与えられた大きな数になったら終わり
  7. 合計を返す

でも、実際にプログラマーとしてロジックを作っていると、
アナログな方法が分からないこともあります。

そんな時は、プログラミングの依頼内容が理解できていないのです。

なので、プログラミングを依頼して来た人に聞いてみましょう。

つまり、プログラミングのロジックを考えるにはアナログな方法を考えるのが1番です。

2.アナログな方法を抽象化する

上で書いた方法は、アナログなロジックです。

プログラミングする上では、アナログなロジックでも良いのですが、
処理速度が遅くなることがよくあります。

上の例だと、与えられる小さい数と大きい数の差が大きい場合、時間がかかってしまいます。

そこで用いるのが抽象化の考えです。

上の例だと、数学に強い人はすぐに分かると思いますが、
以下の式で求めることができます。

合計 = n * (a + b) / 2
aとbは与えられた数
nは、aとbの間の個数 (b - a + 1)

このように、ロジックを抽象化することで、
常に同じ処理時間で処理できるロジックを作ることができます。

3.ループ処理を入れ子にしない

これは、プログラミングのロジックを考える方法ではないのですが、
ロジックを考える上で、常に頭に入れておいた方がいいことです。

ループ処理というのは、繰り返し行う処理のことです。

つまり、繰り返し処理の中で、繰り返し処理を行わないということです。

ループ処理が入れ子になると、処理時間がかかるからです。

例えば、
10回ループする処理の中で、100回ループする処理が入っていたとします。
すると、その処理の中では、1000回の処理が実行される事になるのです。

ループの回数が固定なら、同じ処理時間で終わるのでいいのですが、
ループの回数が与えられた数で変動する場合は、処理を見直した方がいいです。

特にwebシステムの場合は、データが多くなるにつれて処理が重くなり、
挙句の果てに、画面表示がタイムアウトする事になります。

このような不具合はよくある事で、
最初はサクサク動いていたのに、使っていくうちに重くなっていくのです。

どうやって勉強すればいいの?

最後に、プログラミングのロジックの勉強方法について書きますね。

プログラミングのロジックは、
「どんなシステムを作るのか」
「どんな処理を作るのか」
とさまざまです。

なので、勉強して覚えられることではありません。

でも、いろんなロジックを見ていると、
「あそこで使ってたロジックが使える」
「あのロジックを少し変えれば使える」
と思い出せるようになります。

経験が浅いうちは、ソースコードを読む事も少ないと思います。

しかし、Web上には多くのシステムのソースコードが公開されています。

公開されているソースコードをまずは読んでみましょう。

何故このようなロジックになっているのか
を考える事でプログラミングのロジックを鍛える効果があります。

また、プログラミングについても知識を増やせると思います。

まずは試してみてください。

では、今日はこの辺で。

2020年3月31日火曜日

プログラムが動かない時の対処法

こんにちは。

今日は、プログラムが動かない時の対処法について書いてみます。

結論を言うと以下になります。
  • ロジックを追って確認する
  • ログを埋め込んで確認する
  • デバッガで確認する
上記の順で確認すると、大抵の不具合は解決します。

プログラムを作成していると、動かないというのはよくある事です。

調べていくとロジックのミスの場合が多いです。

ロジックを追って確認する

専門用語で言うと、机上デバッグと言います。

実際にソースコードがどのように動くかを、1ステップごとに追って確認する方法です。

大体、大きなロジックによる不具合は、机上デバッグで見つけることができます。

この段階で見つかる不具合は、詳細設計の段階で不具合が入り込んでいるケースが多いです。

ウォータフォールモデルでの開発では、ソースレビューを行うので、不具合がなくともレビューで見つかると思います。

ログを埋め込んで確認する

机上デバッグである程度動くソースコードができると、ログを出力して確認します。

机上デバッグでは、データの変動による不具合が見えにくいことがあります。

その場合は、ログに変数の値を出力し、なぜ動作しないのかを確認します。

私は、ログを埋め込む時に、どこのログか分かるように埋め込むようにしています。

特にループ処理の場合は、何回ループが回ったかを確認するようにしています。

たまに不要なループが回って、処理に負荷がかかっている場合があります

そういうのは、ログを埋め込んで確認するのが1番です。

デバッガで確認する

デバッガで確認するといろんな情報を取得することができます。

デバッガは、プログラムとは別のツールになります。

実際に仕事でプログラムを開発していると、ログを埋め込んで確認するのを飛ばして、デバッガでデバッグする事もあります。

上にも書いたように、デバッガは別のツールなのでいろいろと設定が必要になります。

ツールを使用できない事もあるので、ログを埋め込んで確認する方法も身に付けておきましょう。

デバッガを使用すると、様々な変数の値を見ることができます。

そこで、不具合に気づく事もよくあります。

まとめ

プログラムには不具合が付き物です。

不具合のないプログラムを組むことが理想ですが、最初から不具合のないプログラムはありません。

なので、プログラミングの後に試験を繰り返し不具合を叩き出すのです。

その時必要となるのが、上にあげた3点になります。

では、今日はこの辺で。

2020年3月26日木曜日

プログラミングを勉強する時に大切なこと

こんにちは。

今日は、プログラミングを勉強する時に大切なことについて書いてみます。

結論から言うと以下になります。
  • まずは1つのプログラム言語をマスターする
  • フレームワークは学ぶ必要ない
  • Linuxコマンドをマスターする
この3点に注力すれば、3ヶ月でそこそこ動くプログラムを作ることができるようになります。

これは、社会に出たばかりの自分に伝えたいことです。

まずは1つのプログラム言語をマスターする

まずは、1つのプログラム言語を充分にマスターしましょう。

プログラム言語は、どの言語も似ている点が多いです。

また、基本となる処理は以下のみです。
  • 分岐
  • ループ
  • 関数
基本となる処理については、過去に書いた記事がありますのでそちらを参照してください。


1つのプログラム言語をマスターしてしまえば、違うプログラム言語を勉強するのも、すんなり入ってきます。

フレームワークは学ぶ必要はない

フレームワークは、初めのうちは学ぶ必要はありません。

実際に仕事をするようになると、フレームワークを使います。

しかし、企業によって使うフレームワークは違ってきます。

プロジェクトによって違う場合もあります。

なのでフレームワークを学ぶのではなく、まずは、1つのプログラム言語を十分に身に付けることを意識してください。

フレームワークは、実際に仕事をするようになってからで十分に学ぶことができます。

また、使用するフレームワークに詳しい先輩や仲間がいるので、分からないことは使いながら学ぶことが可能です。

しかし、プログラム言語を1つも知らなと仕事になりません。

Linuxコマンドをマスターする

実際にプログラマーとして仕事をすると、Linuxサーバでの作業が多いです。

開発するPCはWindowsでも、実際に動作するOSはLinuxが大半です。

Linuxコマンドが使えなと動作試験で苦労します。

Linuxは、デスクトップもありますが、コマンドで使えるようにしておきましょう。

GUIのツールがある場合もありますが、実際遅いです。

Linuxコマンドに慣れているだけで、プログラマーとしての生産性が結構違います。

まとめ

つまり、Linuxで1つのプログラム言語をとことん勉強するのが一番です。

私が社会に出たばかりの頃は、いろんなプログラム言語を勉強していました。

それに使えそうなフレームワークがあれば、いろいろと使ってみてました。

でも、フレームワークは、プロジェクトで決まっていることが多く、いろんなフレームワークを知っていてもあまり役に立ちませんでした。

結局、私はいろいろとやって遠回りをしてしまいました。

この3点に注力すれば、プログラミングの仕事は何とかなるのではないでしょうか。

では、今日はこの辺で。

2020年3月7日土曜日

プログラムの基本処理

こんにちは。

今日は、プログラムを学習するときに押さえておきたい点について書いていきます。

結論から言うと以下の処理を押さえておけば、プログラムを読むことはできるようになります。

  • 分岐(if文)
  • ループ(for文、while文)
  • 関数

プログラムの基本処理

プログラムは、全てが四則演算でできています。

入力された値を変数に入れて、足したり、引いたりと加工し、出力した値を作り上げます。

私は、いろいろなプログラム言語で開発した経験があるのですが、コーディングを開始する前に、まず確認するのが、分岐、ループ、関数の書き方、呼び出し方です。

分岐(if文)

まず必ずと言って良いほど必要なのが「分岐(if文)」です。

条件によって処理を分岐することは必ず発生します。

Javascriptだと以下のような書き方になります。

if (<条件>) {
// 処理
}


分岐を理解するだけでも、プログラムは読めるようになります。

ループ(for文、while文)

同じ処理を繰り返し行う場合は、ループで処理します。

同じ処理を何度も書かないということは、不具合を減らすためにとても大切なことです。

Javascriptでは以下のように書きます。
for (<初期値> ;<条件> ; <加算> ) {
// 条件が不一致となるまで実行する処理
}


ちょっとわかり辛いですかね。
具体的なソースコードを書いておきます。

var a = 0;
for ( var i = 1 ; i < 5 ; i++) {
a = a + i;
}
// a = 10


a の初期値は0です。
i の初期値は1で、5より小さい値の間、i を1づつ加えて処理します。
つまり、a の値は以下のように変化します。

a = 0;
a = 1;     // i = 1
a = 3;     // i = 2
a = 6;     // i = 3
a = 10;   // i = 4

i は 5 まで変わりますが、条件に不一致となるので、ループを抜けます。

ループには、while文という処理もあります。

while文は、条件判定は処理した後に行う時によく使用します。

つまり、一度はループ内の処理を行った後条件を判定する場合です。

Javascriptでは以下のようになります。


do {
// 処理が不一致の場合に実行する処理
} while (<条件>);


while文で気を付けないといけないのは、条件の部分です。

while文は、条件が一致した場合にループを抜けます

また、無限ループを作成し、処理内で分岐してループを抜ける場合もあります。


while(1) {
// 処理
if (<条件>) {
break;
}
}


ただ、このような書き方は、できるだけしない方がいいです。
できるだけ条件を入れて無限ループは作らないようにしましょう

関数

最後に必要となるのは、関数です。

ループ処理でも書きましたが、同じ処理は何度も書くと不具合の原因となります

同じ処理と何度も必要となる時は、関数にして呼び出すようにしましょう。

また、最近の書き方だと、1関数1処理で書くようにすると綺麗なソースコードになります。

Javascriptだと以下のような書き方になります。


function <関数名> (<引数>) {
// 処理
}


プログラミングの経験を積んだ方でも、処理を関数化せずにダラダラと書く方がいます。
そういうソースコードをスパゲティコードといいます。

処理が長くなって、少し修正するだけで不具合の原因となったりします。

まとめ

プログラムを読む際の基本となるのは、この3点です。
  • 分岐
  • ループ
  • 関数
そして、後は多くのソースコードを読んで、処理の書き方や、綺麗なソースコードの書き方を学んでください。ソースコードは人によって書き方が違います。読むだけでも結構勉強になったりしますよ。

では、今日はこの辺で。


2020年3月5日木曜日

NULLは0ではありません

こんにちは。

ほとんどのプログラム言語に存在するNULLですが、
値が0なので0として使っているソースコードをたまに見かけます。

しかし、NULLは0ではありません。

C言語を知ってる方は分かると思いますが、NULLはメモリーのアドレス0番目を指します。

なので、値は0なのです。

しかし、メモリーのアドレス0番目は、不正処理にあたります。

つまり、本来、例外を意味しているのです。

経験の浅いプログラマーが、勘違いして使うのはいいとして、
何年もプログラマーとして働いてきた技術者が使っているとイラッとします。

随分前に関わった開発のリーダーにNULLを0として使っている人がいました。
そのチームのコードレビューに参加したことがあるのですが、
コードレビューの場で0をNULLに置き換えるように指示しているのを見て驚いた事がありました。

後でこっそり教えましたけど、受け入れてもらえませんでした。

ちなみに、NULLは「ヌル」と発音する人と、「ナル」と発音する人がいますが、
「ヌル」はドイツ語で、「ナル」は英語だそうです。

言語によっては、同じ意味でnilを使う事があります。
例えば、Rubyはmilを使っています。

NULLについて少しは理解してもらえたでしょうか。

では、今日はこの辺で。