プログラミングが難しいと感じる理由と解決法

2023年2月7日

こんにちは
ノムノムです

現代の世の中ではコンピュータがありふれていますよね。
どんどん便利になっていっています。

そして、誰でもどんな場面でも使いやすく便利なものがたくさんあります。
使う人の利便性のことをユーザビリティと言います。

昔と違いユーザビリティの高いアプリがたくさんありますね。
プログラマーとして飯を食べていくには、このユーザビリティの高いソフトウェアを作ることが重要になってくるわけです。
 

あんな難しそうなものなんか作れないと思うかもしれません。

断言しましょう。まず作れません。
プログラマー歴15年の私でもちょっと覚悟を決めて、お金を払わなければカッコイイものなんて作れません。

なぜなら使いやすく、見栄えのいいものというとプログラミングだけではなく、デザインの知識や経験が必要になってくるからです。
そしていいものや、大作となると一人ではとてもつもなく時間が掛かってしまうからです。

つまり、ちゃんとしたアプリを作るっていうのは、プログラミングの知識だけで完結できるものではないのです。

でも自分が使うだけの単純なものであれば、簡単に作ることができますし、特別デザインの知識がなくてもそれなりの見栄えのいいアプリは作れます。

プログラミングは全然難しくない

プログラミングが難しく感じてしまうのはなぜでしょう?
それはその人にとって未知なものだかです。

知らないことを知るのには人間勇気がいります。
どんなことでも知らないことやったことのないものはは難しそうと感じてしまうのです。

プログラミングは、文章を書くのと一緒です。言語なのです。それをパソコンが理解できる形で書くというだけの話。
なので英語と同じで文法や単語を覚えれば簡単に掛けてしまうものですよ。

世間一般でよく言われる難しいと言われる理由を考えて見ました。

難しく感じる理由1.理系のスキルだと思っている。

プログラミングはコンピュータに理解できる形で言語化する技術です。

パソコンやスマホにやって欲しいことを、パソコンやスマホにわかる言語に翻訳してあげるだけなのです。

つまり、あなたが思っているほど、理系な要素は少ないです。
あっても四則演算で終わることがほとんどです。

僕のまわりのプログラマーには、文系出身の人はたくさんいます。
高卒プログラマーもいます。

だから、理系だからできる、文系だからできないということはないです。
読み手のことを考えてわかりやすい文章を書ける人が、プログラミングに向いていると僕は思います。

難しく感じる理由2.何ができるのかわからない

基本的にプログラミングは、効率化や利便性を図るビジネス用途と娯楽などのゲーム用途に分類されます。

でもどれも基本は一緒でインプット → 整形/処理 → アウトプットでできています。

人間の体で例えると
目で捉え(インプット)頭で認識し(処理)言葉で発する(アウトプット)
と考えるとわかり安いと思います。

つまり、画面入力やファイルなどでデータを取得し、そのデータを加工し、画面表示やファイル出力することができるのです。

実際の仕事で例えるならば、勤怠の集計をしたいと思います。
勤怠EXCELのフォルダを選択(インプット) → フォルダ内の今月の勤務時間だけ抽出し集計する(整形/処理)→ 集計用EXCELファイルに出力する(アウトプット)

このような感じでアイデア次第で今まで何時間もかけて手作業でやっていたようなことを一瞬で終わらせることだってできるのです。

難しく感じる理由3.目標が高すぎる

プログラミングを学ぶにあたって例えばゲームを作りたいと思う人って多いと思うんです。

僕自身もゲーム大好きでファイナルファンタジーみたいな3Dでカッコイイものを作ってみたいと言って勉強し始めたことがあります。

そして難しいと感じたのはプログラミングではなく、3Dだと幾何学的な分野の勉強、グラフィックやサウンドの技術、そして超膨大なコードの前に挫折しました。

一人でがああいった超大作なものを作るにはまず不可能だと感じます。

つまり、やりたいアイデアがあるなら是非取り組むべきですが、自分ができる限度を見極めないと完成する前に燃え尽きてしまう可能性が高いです。

難しく感じる理由4.開発ツールの使い方がわからない

プログラミングを行うにあたり、開発するための環境を整えたり、開発ツールの使い方をまず覚える必要があります。

開発ツールは、作りたいものによって変わってきますし、それぞれ専門的な用語であふれています。

プログラミング言語を覚えるだけでも大変なのに開発ツールの使い方までマスターするのは大変だと感じます。

しかし、開発ツールに関しては慣れるしかないのですが、自分が使用する機能以外は無理して覚える必要はないです。

プログラミンはインプット、処理、アウトプットこれだけ

先ほどもありましたが、プログラミングはインプット → 整形/処理 → アウトプットだけです。

インプットとは

プログラムは様々なアクションを起こすことによって、そのアクションに対して処理を記述していきます。
これをイベントと言います。

イベントは、「フォームが表示された時」「ボタンを押した時」「テキストボックスに入力した時」これが処理を開始するきっかけになります。

そしてボタンやテキストボックスの持っている情報をプロパティといいます。

インプットは大きく分けてこの二つになります。

整形(処理)

インプットから渡された情報に対して処理を行います。
条件分岐や繰り返しなどを駆使して、インプットデータを整形してアウトプットデータにします。

条件分岐とは、「もし~だったなら~する。そうでなければ~する。」とった条件に当てはまった時だけ処理をする記述をします。
一般的にIF文、SWITCH文と呼ばれるものです。

繰り返しはそのままですが「値が~なるまで繰り返す」といって指定条件から外れすまで繰り返すことを指します。
一般的にFOR文、WHILE文です。

アウトプットとは

アウトプットは作成したデータをどう処理するかです。

画面に表示するのか、ファイルとして書き出すのか、メールにしてどこかに送信するのか

作成したデータをプログラムから外部に出力することを指します。

プログラミングはやればできる、やらなきゃできない

なぜプログラミングをしたいと思ったか

  • プログラミングができればいろいろできて面白そうだから
  • 面倒な作業をボタン一つで簡略化できるから
  • IT企業に勤めたいから
  • フリーランスになりたいから

などいろいろだと思います。

プログラミングは技術スキルになります。
プログラミングの技術スキルがあれば、機能の創造、仕事の効率化、就職、起業いろんな分野で利用できます。

でも難しいんじゃないか?と思うかもしれません。
実際のところ、ツールの使い方と記述の仕方さえわかればなんてことはないほとんどコピペで行けてしまいます。

昔と違ってネット上にやりたいことは基本的に掲載されています。
最近、試行錯誤はほとんどしなくなりました。
なぜならGoogleで検索すれば、解決案がすぐ見つかるからです。

おそらく難しいと思っている人は、本などを読んでアルゴリズムがどうたらこうたら、アーキテクチャがどうたらこうたらと書いてあるから難しく感じているんだと思います。
実際はそんなこと考えてプログラミングしてる人はだぶんいません。少なくとも僕はそんなこと意識しながらプログラミングしていません。

あなたが思っているほど、あなたがやりたいものというのは、プログラミングで難しいことはしないので大丈夫です。

実は何でもかんでも理解して使おうとしている

そうはいっても現役でプログラマーしてるノムノムだからそんなこと言えるんじゃないのか?と思うかもしれません。

15年間プログラマーをやってきていろんな人を見てきました。
IT企業は忙しくて大変、残業をいっぱいして、難しいプログラミングをしてるから、自分には無理と思っているかもしれません。

実情は、ただの人手不足です。
持論ですが難しいプログラムなんてものはありません。プログラムは単純なコードの集まりで複雑に見えてるだけなのです。

今の時代、プログラミングで「デジタルだから0と1の集合で・・・」なんて考える必要はありません。
知識として知っている分にはいいですが、パソコンやスマホ上で動かすためのプログラミングでは気にする必要はありません。

だから、恐れることはまったくないのです。

僕が新人を教育する時どうするか

新人が仕事でプログラミングを使うときに何しているかというと、だいたい既に似たような記述がどこかで使われているのでそれをコピペして値だけ変えて「よし終わり!」っていうのがほとんどです。

僕はそう教えます。これこれこういうプログラムを組んでください。参考になるプログラムはここなのでコピペして使ってください。っていいます。

フレームワークっていういろんな機能の集まりがあるんですが、僕自身もこのフレームワークを利用しているだけに過ぎず、フレームワークの中で何やってる、どういうソースコードが書かれているか知らずに使っていることがほとんどです。

つまり何でもかんでも理解しなければプログラミングできないってことはないのです。

簡単便利プログラミング方法

プログラミングを習得するためには、単純に数をこなすことこれに限ると思います。
これから簡単に覚えるための手順を追っていきます。

Step1.VisualStudioのインストール

プログラムを作成するツールにVisual Studioというのがあります。
主にはWindowsアプリを作成するためのツールです。

今回はこれを利用して簡単なプログラミングをしていきたいと思います。

Visual Studio ダウンロード

これがインストール画面

自分用にプログラミングする分にはとりあえず.NET デスクトップ開発があれば問題ないです。

インストールが完了したらプロジェクトを作成します。

言語はC#を選びます。
C#は記述の仕方がJAVAやPHPと似ており、他の言語への切替がしやすいからです。

実際に実行してみましょう。
開始ボタンを押すとデバッグモードで実行できます。

起動したでしょうか?アプリが起動すればもうあとは、記述を書いていくだけになります。

Step2.ボタンをおいてHello Worldの表示(インプットとアウトプット)

フォームにボタンをおいて、メッセージボックスで「Hello World」と表示しましょう。
まずボタンを置きます。

ボタンを置いたらボタンをダブルクリックしてください。

以下のbutton1_Clickが作成されています。

これはイベントといって「button1がクリックされた時に処理しますよ」

という意味です。
そこに「Hello World!」とダイアログを表示するアウトプットを記述してみましょう


private void button1_Click(object sender, EventArgs e)
{
    //メッセージボックスの表示
    MessageBox.Show("Hello World!");
}

それでは開始して、ボタンをクリックしてみてください。

Hello World!と出ていれば完了です。

Step3.処理を書く

実際に簡単なプログラムを組んでみましょう

写真の撮影日でファイル名を自動変換するようなアプリはいかがでしょう。

じゃあどう記述するかですが、これは他のサイトからパクります。

下に完成したプログラムを記述してあります。
うわ、いろいろ記述してあって無理って思うかもしれません。実は9割型コピペプログラムです
コメントにURLを記載してあるところは、パクってるところです。

これでEXEファイルと同じ場所にある写真に撮影日時がある場合、ファイル名が変更されます。


private void button1_Click(object sender, EventArgs e)
{

    //実行ファイルのディレクトリパスを取得する
    //https://dobon.net/vb/dotnet/vb6/apppath.html#section7
    string exe_path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

    //ディレクトリ内のJpgファイルを取得する
    //ワイルドカード"*"は、すべてのファイルを意味する
    //https://dobon.net/vb/dotnet/file/getfiles.html#dotnet2
    string[] files = System.IO.Directory.GetFiles(@exe_path, "*.jpg", System.IO.SearchOption.AllDirectories);

    //ファイル名をすべて変換するまでループ
    foreach(string file_name in files)
    {
        //撮影日を取得する
        //https://dobon.net/vb/dotnet/graphics/getexifinfo.html
        //画像ファイル名
        string imgFile = file_name;
        string new_file = "";

        //読み込む
        System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(imgFile);
        foreach (System.Drawing.Imaging.PropertyItem item in bmp.PropertyItems)
        {
            //Exif情報から撮影時間を取得する
            if (item.Id == 0x9003 && item.Type == 2)
            {
                //文字列に変換する
                string val = System.Text.Encoding.ASCII.GetString(item.Value);
                val = val.Trim(new char[] { '\0' });
                //DateTimeに変換
                DateTime dt = DateTime.ParseExact(val, "yyyy:MM:dd HH:mm:ss", null);
                //新しいファイル名を生成
                //http://www.atmarkit.co.jp/ait/articles/0408/27/news104.html
                new_file = System.IO.Path.GetDirectoryName(imgFile) + "\\photo_" + dt.ToString("yyyyMMdd_HHmmss") + ".jpg";

                break;
            }
        }
        bmp.Dispose();

        //もし新ファイル名が空じゃななかったらファイル名を変更する
        if (new_file != "")
        {
            //ファイル名を変更
            //https://dobon.net/vb/dotnet/file/filecopy.html
            System.IO.File.Move(@file_name, @new_file);
        }


    }
}

簡単に説明しますね

インプット

    //実行ファイルのディレクトリパスを取得する
    //https://dobon.net/vb/dotnet/vb6/apppath.html#section7
    string exe_path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

    //ディレクトリ内のJpgファイルを取得する
    //ワイルドカード"*"は、すべてのファイルを意味する
    //https://dobon.net/vb/dotnet/file/getfiles.html#dotnet2
    string[] files = System.IO.Directory.GetFiles(@exe_path, "*.jpg", System.IO.SearchOption.AllDirectories);

最初のこの部分で、実行ファイル(EXE)のフォルダを取得し、その中にある写真ファイル(jpg)のリストを取得します。

URLが参考サイトになっています。コードはサイトのパクりです。

整形/処理

    //ファイル名をすべて変換するまでループ
    foreach(string file_name in files)
    {
        //撮影日を取得する
        //https://dobon.net/vb/dotnet/graphics/getexifinfo.html
        //画像ファイル名
        string imgFile = file_name;
        string new_file = "";

        //読み込む
        System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(imgFile);
        foreach (System.Drawing.Imaging.PropertyItem item in bmp.PropertyItems)
        {
            //Exif情報から撮影時間を取得する
            if (item.Id == 0x9003 && item.Type == 2)
            {
                //文字列に変換する
                string val = System.Text.Encoding.ASCII.GetString(item.Value);
                val = val.Trim(new char[] { '\0' });
                //DateTimeに変換
                DateTime dt = DateTime.ParseExact(val, "yyyy:MM:dd HH:mm:ss", null);
                //新しいファイル名を生成
                //http://www.atmarkit.co.jp/ait/articles/0408/27/news104.html
                new_file = System.IO.Path.GetDirectoryName(imgFile) + "\\photo_" + dt.ToString("yyyyMMdd_HHmmss") + ".jpg";

                break;
            }
        }
        bmp.Dispose();

    }

つぎにここで、写真ファイルの撮影日を取得してファイル名を作成しています。

写真ファイルから撮影時間を取得するところも、パクりです。

item.id == 0x9003 ってなんですか? item.Type == 2 ってなんですか?意味わかりません。って思うでしょう?

私もなんでか知りません。そういう風に誰かが決めたそういうものです。
撮影日はTypeが「2」でidが「0x9003」って決まっているそうですね。という理解です。

アウトプット

        //もし新ファイル名が空じゃななかったらファイル名を変更する
        if (new_file != "")
        {
            //ファイル名を変更
            //https://dobon.net/vb/dotnet/file/filecopy.html
            System.IO.File.Move(@file_name, @new_file);
        }

最後に整形/処理で作成したファイル名にファイルを変更しています。

変更するための関数もパクりです。

動かしてみる

細かい説明していると長くなってしまいますし、そういった説明は本を読めば大抵書いてありますので割愛しますが、ほぼどこかのサイトから持ってきた内容しか記述していません。
リファレンスとか読めれば便利ですが、最初の内は誰かが掲載しているページを真似て作っていけばプログラムは完成します。

少し慣れてくると、難しいこともやりたくなってきます。その頃にはどうやって調べればそれが実現できるかの力がついているはずです。

まとめ

どうでしょう?やってみると意外と簡単だったかと思います。

結局プログラミングはツールです。
新しいiPhoneを手に入れたらあれこれいじり倒して使い方を覚えていくのと一緒です。
つまり、プログラミングもあれこれいじってみて使い方を覚えるそれだけです。

もし、プログラミングを仕事で本気で使ってみたいという場合、僕は未経験でも募集しているIT企業に就職してしまうのが一番だと思います。
実際現場でやっている生のプログラムを触ることで上達も早いですし、先輩社員に質問できる環境もある、お給料ももらえ、実務経験を積める。
もちろんその企業が自分のやりたいことができるかリサーチは必要です。

プログラミング技術を磨いて、独立起業、転職や昇給の武器にしましょう。

ここまで読んでくれて、うれしいです。
ありがとうございました。

雑記

Posted by nomux2