見出し画像

「文系の方がプログラミングを学ぶのは難しい」に対する自分なりの考察


はじめに

文系の方がプログラミングを学ぶのは難しい」という意見はよく耳にします。この議題について、賛否が分かれることは確かです。この話題について、自身の経験で整理できて感じていることがあるので、文章に残しておこうと思います。

私のプログラミング経験について

はじめに、簡単に私のプログラミング経験を書いておきます。

プログラミングの習得は22, 23歳の頃

高校を中退して、専門学校に入ってJavaというプログラミング言語を勉強し始めました。

基本の仕事はプログラミング

そこから、SierやWeb制作会社などを得て、現在まで主にソフトウェア開発を仕事としています。
 プロジェクトマネジメントなどもやります、主な仕事はプログラミングで約15年弱くらいはプログラミングというものに携わっています。

理系ではなく、CS分野の勉強もしてきていない。 という文脈では私も文系側に入るのかなという認識です。

プログラミング言語は、自然言語に似ている

「プログラミング言語」 と呼ばれるようにプログラミングは日本語や英語のような自然言語に通ずるものがあります。

public class Book {
    private String title;
    private String author;

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    public void displayInfo() {
        System.out.println("タイトル: " + title + ", 著者: " + author);
    }

    public static void main(String[] args) {
        Book harryPotter = new Book("ハリー・ポッターと賢者の石", "J.K. ローリング");
        Book norwegianWood = new Book("ノルウェイの森", "村上 春樹");

        harryPotter.displayInfo();
        norwegianWood.displayInfo();
    }
}

これはJavaという言語の例文です。「これのどこが自然言語?」と思われるかもしれません。
当然プログラミング言語は会話やコミュニケーションを目的としたものではないため、自然言語と同じようにメールや口頭のやり取りで使うような感覚で書くことはできません。

ですが、プログラミングは自然言語と似たような考えをする特徴をもっています。以下に例を挙げてみます。

名前を大事にする

プログラミング言語には、一時的な情報を保持するための「変数」や特定の処理の塊を表現する「関数」といった、自分である程度自由に名前をつけれる機能があります。
プログラミング言語では、こういった自分たちで定義できるものの名前をとても重要視しています。
10年以上プログラミングをしていても、名前については毎回学ぶことや考えることが多く、重要な要素の一つです。
これは、自然言語でいう『言葉選び』のようなものかもしれません。
美しい文章や、わかりやすい文章を書くために必要な語彙力や言葉の表現が必要なように、プログラミングにおいても理解しやすい名前というものがとても重要なのです。

分割や、整理整頓を大事にする

プログラムとは、小さいプログラムの塊をつなぎ合わせ、大きな機能を実現するパズルのようなものです。
プログラムは前述の「関数」であったり、さらにいくつかの関数をまとめた「クラス」や、それらをまとめた「モジュール」のように、いくつものプログラムの集約によって、大きな機能を実現しています。

このようなプログラムの集約を上手に作成するには「意味のあるプログラムの塊を適切に分割する」「分割したものを効率よく集約する」といったスキルが必要です。

自然言語における文章構成においても、適切な段落分けや、主語、述語を適切に使い分ける、起承転結を意識するなど、文章のまとまりを構成する能力が重要です。
これらが機能しないと、支離滅裂な文章になり読む人に正しい意図が伝わりません。

プログラムにおいても、美しい文章や適切な構成の文章と同じような、適切な構成力が求められます。

読みやすいということが重要視される

プログラムの実行においては、コンピュータはコードの「読みやすさ」を気にしません。しかし、ソフトウェアの開発や保守に携わる人間にとって、コードの読みやすさは重要な要素となります。

多くのソフトウェアは複数の開発者によって書かれ、メンテナンスされています。そのため、ある開発者が書いたコードは、他の開発者にとっても容易に理解でき、変更できる必要があります。読みにくいコードは、バグの原因となる可能性が高まり、新しい機能の追加や既存の機能の変更が困難になるリスクが増大します。

これは、多くの人間によって作成されるビジネス文章、プレゼン資料などが、読みにくく、構成が悪いことにより、パフォーマンスに影響することと似ています。

「文系でもプログラミングは覚えられる」の意味

プログラミングを書くためには、必要な文法とルールを覚える必要がありまが、それ以上の専門知識が必要ということは少なく、覚える事自体は難しくないと言えると思います。決して、簡単とまでは言いませんが、言語としてのルールでいえば日本語の方が遥かに難解で覚えることは多いです。

正確には、言語によって適正があり、コンピュータのメモリやCPUの構造が理解できていないと、正しいことが実現できない言語や、特定の専門分野に特化した言語も存在しますが、比較的一般に普及されている言語については、そのあたりの専門性をしらなくても良いように抽象化されています。

つまり、プログラミングを書けるようになることに、文系や理系という適正はなく、ルールさえ覚えてしまえば、書くこと自体は難しくはありません。「文系でもプログラミングは覚えられる」という表現は、この『プログラミング手法を習得できる』とうことを指しているのだと思います。

言語を覚えるだけでは、専門性の高いことはできない

一方で、プログラミングは書けるようになるだけで高度な目的を実現できるか?というとそうではありません。
プログラミングはあくまでツールであり、その他の専門知識がなければ、実現できることは多くないと言えます。

自然言語でいえば、いかに美しく、優れた文章を書ける人でも、科学の論文は科学の専門知識がなければ書けませんし、歴史の知識がない人が歴史小説を書くことはできません。同じようにプログラミングの世界も、プログラムを書くこと以外の専門知識が必要です。

一般的な例として、データベースにある大量のデータのなかから必要なデータを抽出するという使われ方は多いですが、このようなことを実現するためには、データベースの知識が必要です。
また、映像配信を行うようなプログラムの場合は、画像や音声についての専門知識も必要になります。

このような専門的知識は、別途勉強が必要であり、それはプログラミング自体とは関連があまり関係がありません。

文系のプログラマーに立ち塞がる壁に、これらの「高度な目的を実現するための専門知識がない」というのは一つあるのでは無いかと個人的には思います。

理系と親和性が高いプログラミング

自然言語とプログラミング言語の違いのひとつとして、プログラミングは突き詰めると「単純な計算」を目的としたツールであり、計算には多くの数学的な考え方が登場します。
理系で特に数学に強い人がプログラミングに対して素養があると言われるのはこのためです。

また、理系の専門分野によっては、プログラミングによる高速計算によって支えられている分野も多く、大学で高度な研究をしている人にとってプログラミングは、研究に必要なツールであり、日常的に触れられているものというのもあると思います。
音声や映像、AIなどもソフトウェアが深く関連する分野であり、どこかにはプログラミングが登場します。

このような背景から、自然言語の習得とは異なり、プログラミング言語は理系と比較的親和性の高い言語ではあると思います。

専門知識が不要(少ない)プログラミングも結構ある

ここまでの内容からだと「結局プログラミングを覚えられても文系では活躍できないのではないか?」という結論になりそうなので、別の切り口の話もしていきます。

現実的な「プログラミングを使った仕事」を中心にみたとき、それほど高度な専門知識が必要ではない仕事も実は結構あります。

全く必要ないかと問われると、データベースやHTMLなど、プログラミング以外の基礎知識が必要なこともありますが、このあたりは文系理系問わず後発でも習得できる知識といえます。
(どんな職種も職種特有の知識は必要であり、その範囲に収まる難易度かと個人的には思っています)

世の中にプログラミングの仕事はまだまだ膨大にあり、その全てで専門知識が必要なわけではありません。

美しいプログラミングが書けることには、仕事として価値がある

プログラミングは特性として、読みやすく、整理された構造を大事にしていて、このような「美しいプログラム」を書ける事自体にも重要な価値があります。

世の中の業務ドメインは複雑性や煩雑性を持っており、これらを解決するためのソフトウェアには、適切に整理された管理し易いプログラムが求められるためです。

このスキルは、専門知識の習得とはまた違った技術であり、文系理系はあまり問わない内容といえます。

文系出身であっても、このような高度にプログラムを書く技術を習得することで活躍できる場所が広がっていきます。

「プログラミング自体を上手に行うこと」「プログラミングを使って高度な目的を実現すること」を分けて考えることが重要

専門知識を有し、プログラミングというツールを使い高度な作業を実現する」のがソフトウェアエンジニアの仕事です。
しかし、多くの人間が同時に扱うソフトウェアの中で「プログラミング自体を上手に行うこと」にも一定のスキルが必要で需要がある。 というのが私が言いたかったことです。

この2つは、別のスキルであり、切り分けて考えられると思っています。今回は、切り口として2つの観点を挙げましたが、深掘るとその他の観点でも切り分けることはできるでしょう。

プログラミングを仕事として扱う上でも、「どのようなスキルにおいて自分の能力を発揮すれば良いのか?」という分析をしておくと、文系理系問わず、活躍できる場所はきっとあると思います。

まとめ

  • プログラミングは表現するための(英語や日本語に近しい)ツールであり、習得はそれほど難しくはない

  • プログラミングを使って、高度な目的を実現するためには『専門知識』が必要

  • 世の中には難易度が高い専門知識が無いとできない仕事ばかりではない

  • 専門知識を使ったプログラミングにも価値があるが、「プログラミング自体を上手にできる(美しいプログラミングができる)」ということにも価値はある

  • 自分はどの分野を深掘りしていきたいかを考えることが重要

この記事が気に入ったらサポートをしてみませんか?