プログラミング初心者の俺の勉強法チラ裏。

スポンサーリンク

 

こんにちは!HELLO!您好!привет там ! 안녕하세요 !Hola !

ここ数日は大学の後期授業が始まるにあたって教科書を買ったり履修登録の修正をしたりで、何やかんや慌ただしい生活を送っていました。

そのため Twitter は殆どチェックしていなかったのですが、今日久しぶりに Twitter を徘徊して、こんなツイートを発見しました。

 

me

おぉぉーーー!エンジニアが第1位かぁ!なんか嬉しい!

おや?ちょっと前まで1位だった気のする Youtuber を遂に抜いたのか。

 

僕は大学の情報工学専門の学科で勉強中のエンジニアのひよっこで、将来はブリッジエンジニアもしくはプログラマとして海外で働こうと思っています。

そのため自分が目指す職業が中学生や世間に注目されていることを知りすごく嬉しくなりました。

俄然、勉強のモチベーションも相当上がります。

 

ただ1つ気になったことが、アンケートに答えた中学生は一体どういったエンジニアになりたいのでしょうか?

ただ漠然と「ITエンジニア」と答えたのでしょうか?抽象度高め IT系なら何でもあり?

ITエンジニアと一口に言っても、実際は様々な職種が存在します。

例えば、

  •  システムエンジニア SE ( 主にシステム開発・運用・保守を担う )
  •  サーバエンジニア ( サーバの構築・運用・保守を担うSE )
  •  ネットワークエンジニア ( コンピュータネットワークの設計・運用・保守を担うSE )
  •  データベースエンジニア ( データベースの設計・運用・保守を担うSE )
  •  Webエンジニア ( Web上で動作するシステムの設計や開発・運用・保守を担う )
  •  プログラマ ( SE等が設計したシステムやプログラムを実装する )

などが挙げられますが、他にも専門的なエンジニアが多数存在します。

細かい話ではありますが「エンジニア」によって仕事の内容は異なります。

 

me

ちなみに僕が目指すブリッジエンジニアは国外エンジニアにプロジェクトを外注する際に海外と日本のプロジェクトチームとの橋渡しを行う特殊なエンジニアです。

SEとしての基本的な技術やコミュニケーション能力、マネージメントスキルが要求されるここ数年注目のエンジニアです。

 

一般論ですがいづれのエンジニアを目指すにせよ基礎的なプログラミング経験があることが理想的だとよく言われます。

プロジェクトの設計や考案が主な仕事で実際にコーディングをすることがなくとも、

プログラムを実装することを考慮しつつ設計段階からプロジェクトを効率的に計画することができれば、その後の開発をスムーズに行うことができるからです。

※ 開発のプロセスモデルによっても変わると思いますが。

また、仕事上のちょっとしたことでプログラミングで得た知識が役立つ場面も多いと聞きます。

 

以前、僕の大学へシステム開発に携わる会社の取締役の方が講師として訪れ、学生に現在の IT業界の実情をお話ししてくださったことがありましたが、その話のなかで社長がポロっと口にした事がとても印象的でした。

取締役

今の学生はね。確かに頭はいいんだけど、プログラムを書いたことがない学生が意外と多いんですよね。(ボソっ)

うちの社員のなかにもエンジニア志望で入社にしたにも関わらず、学生時代にプログラムを書いたことがないって子は意外と多いから少し残念。ボソっ

仕事上の話が伝わらないことが結構ある。ボソっ

 

あっ、これは本音だな。

言いづらい事であったのか結構な早口で、しかもマイクをやや遠ざけてボソッとおっしゃっていましたが、最前列に座っていた僕にはバッチリ聞こえました。

で速攻メモしました。

聞くところによると確かに必ずしもコードを書けることが必須条件ではない職種もあるそうですが、

やはり「エンジニア」を名乗るからにはコーディング能力が求められるのだなと改めて強く感じた瞬間です。

 

また、昨今話題の IoT。

「モノのインターネット」の時代が実現しつつあります。というか一部導入済み。

me

IoT = Internet of Things !

家電製品や自動車、インフラ設備などをはじめとする身の回りのあらゆるモノをインターネットに接続することでその利便性を高めようとする、まさにモノのインターネット。

 

さらには web業界や IT業界の急速な成長や技術者の定年などといった理由から人材の需要と供給のバランスが崩れ、日本に一時的なエンジニア不足が蔓延しています。

そのため各企業は若手エンジニアの育成に力を入れ、国は「プログラミング教育の必修化」を考えたという経緯もあります。

で、実は「エンジニア・プログラマ不足」は日本に限った話ではなく世界的にみても、2020年には約40万人のプログラマが足りなくなるという予測もされています。

 

こうした背景から「プログラミングができる」はこれからの時代を生きていくうえで武器になるかなと思っています。

少しかじっておく程度、もしくは趣味であっても将来役立つことがあると思います。

というかそもそもプログラミング自体が面白いです。

小中学生でも独学でプログラミングを習得し大人顔負けの技術を持ち合わせているといった話があるくらいですから、年齢問わず興味があれば誰でも始められます。

仕事レベルまで持っていけるかは別として。

 

僕は今の大学に入学する前からプログラミングに興味をもっていましたが、漠然とした難しさを感じて尻込みを続けていました。

ですがいざ大学でプログラミングの蓋を開けてみると僕がイメージしていた程の高い壁はなくスムーズに始めることができました。

勉強方法や要領「コツ?」さえ掴んでしまえば後は独学でガンガン突き進めることができるため、

授業で扱わない言語や文法は自分で勉強しています。

プログラミングに限った話ではなく、受験勉強やスポーツ、仕事、料理でも何でもかんでも「やり方」「要領」を掴むことって物凄く大切だと思います。

 

プログラミングに関しては、上手な学習法を身につけると

  1. 「効率よく勉強できる」
  2. 「短い時間でも集中して技術を身につけられる」
  3. 「広範囲の学習ができる」
  4. 「幅広い技術力が向上する」
  5. 「作れるモノが増える」
  6. 「楽しい」

で、

「プログラミングどはまりしたんですけど?」

「本気で楽しいんですけど?」

みたいな状態になります。

でミッケやウォーリーを探せなどのゲームが強くなります。また、全角と半角スペースの判別が早くなります。

 

ということでプログラミング歴2年とちょいの超ビギナーのひよっこな僕ですが、

ここまで培ってきた知識を活用して「最初からこれを知っていればもっとプログラミングが上達したのになぁ」という情報を含め、

プログラミングを始めるうえで知っておくとよいことなどを初心者の僕なりにチラ裏しようと思います。

 

前置きが滅茶苦茶長くなってしまいましたが、

プログラミングに興味がある小・中・高生生の方やプログラミング初心者の方の参考になれば幸いです。

自分の忘備録のためにも。

 

プログラミング言語の種類

そもそもプログラミング言語の役割は?

ざっくりとした説明をしようと思います。

人間が問題を解決しようとしたとき、普通その問題解決方法を考えますよね?

「こうして、ああして、次にこうすれば無事解決!」といった具合に。

 

こうした問題解決方法を「アルゴリズム」なんて言いますが、

アルゴリズムを思いついてしまえば後はそれを実行して問題は解決できます。

 

しかしその問題解決に何らかの計算が伴う場合人間はミスをする恐れがあり時間もかかります。

一方、コンピュータにとって計算は得意の専門分野であり、

人間が考えた「アルゴリズム」をコンピュータにお渡しすればまさに「秒」で解決してくれます。

 

「ならコンピュータに全部おまかせしよう!」と思いますが、

人間が話す「自然言語」とコンピュータが話す「機械語」は全く異なり、意思疎通を図ることができません。

それなら「人間が機械語を話せるようになればいいんだ」と言いたいところですが、機械語は「0」と「1」の2進数の羅列であるため人間にとって複雑で難解です。

 

そこで活躍するのが「プログラミング言語」です。

プログラミング言語は主に英単語で構成され、人間が使う言葉により近い形式をもちます。

言語ごとに異なる文法があり人間はその書き方にのっとって命令を記述し、「コンパイラ」というプログラムを用いて機械語に翻訳しコンピュータに命令します。

ただしコンパイル不要なプログラミング言語も存在します。

 

コンパイラ言語とスクリプト言語

プログラミング言語には大きく分けて2つの形式があります。

コンパイラ言語とスクリプト言語です。

誤解を恐れず端的に説明すると、

  • コンパイラ言語 :  コンパイル作業が必要
  • スクリプト言語 :  コンパイル不要

もう少し説明を加えると、

コンパイラ言語で記述したソースファイルは「コンパイラ」によって機械語にコンパイルし「実行可能ファイル」を生成することでプログラムを実行することができます。

一般的にコンパイル作業の手間がかかりますが、実行速度はスクリプト言語に比べ高速です。

一方スクリプト言語の場合、コンパイルせずに実行可能で、ソースコードを逐次的に解釈し同時に実行するインタプリタ形式という実行方式をとっています。

一般的にコンパイラ言語よりも実行速度は劣ります。

 

ここで一般的なプログラミングの基本的な流れをまとめておきます。

  1.  プログラミング言語を用いてソースコードを記述 > ソースファイル
  2.  コンパイラで機械語にコンパイル > 実行可能ファイル ※ コンパイル不要の場合有り
  3.  実行可能ファイルを実行する

 

どうしてプログラミング言語はいっぱいあるの?

世界には現在256種類ものプログラミング言語があるそうです。

有名な言語から聞いたこともないような無名の言語 (使われていない化石?) までを足し合わせてその数になるみたいです。

 

The Big List of 256 Programming Languages

ではどうしてそれ程たくさんのプログラミング言語が存在するのでしょうか?

 

それはプログラミング言語ごとにできることや得意な分野が異なるからです。

解決する問題やその環境は様々で、それぞれの問題に適した解決方法があり、それに応じて人間がプログラミング言語を選択する必要があるのです。

また一般的にプログラミング言語によって作成したプログラムは、特定のデバイスや環境下でのみ動作するということも意識する必要があります。

※ Java は Write Once, Run Anywhere

さらにプログラミング言語には系統があり、専門的な言葉はあまり使いたくないのですが、

  •  オブジェクト指向言語
  •  命令型言語
  •  並行型言語
  •  関数型言語
  •  論理型言語

などに分かれています。

ですがこれは結構マニアックな知識ですので最初はあまり意識しなくても問題ないと思います。

 

以上のことを踏まえ、

学習するプログラミング言語を選択する際には人気の高さなどでただ何となくで選ぶのではなく、

  •  動作環境  動作するデバイスや環境
  •  得意分野  できることと特徴 
  •  学習難易度 参考書や学習環境は整っているか
  •  認知度   実際の現場でどれくらい利用されているか 
  •  将来性   長く利用される見込みはあるか

などの基準を参考に、とりわけ汎用性の高さを把握うえで選択することをお勧めします。

ちなみにですが僕はとりわけ C/C++, Java, Python の勉強をしています。

また、厳密にはプログラミング言語とは言わないらしいですが、最近になって HTML, CSS, PHP の Web系言語を勉強し始めました。

単純にデザインが好きで以前から Webサイトを作ってみたいと思っていたからです。



初心者向けプログラミング学習法

入学当時のプログラミングの成績が最悪だった話

まずはこちらの写真をご覧ください。

これは1年次前期のプログラミング科目の最終成績です。※ 科目名は伏せさせていただきました。

大学生はわかると思いますが、それぞれあと6点、9点以上点数が低ければ単位を落とすところでした。

本気であぶなかったです。

恥ずかしくてお見せしたくなかったのですが、僕のプログラミング力の推移を数字で客観的に評価するためにこの数値を使用します。

「大学のプログラミング科目の成績でプログラミング力を測ることができるか」といった議論は置いておいて、ここではひとまず大学の成績を指標にしようと思います。

 

僕はこの成績を返されて初めてプログラミングの厳しさを思い知らされました。

個人的には、講義にしっかり出席して教えられたプログラムを自分で実装して復習も完璧にこなしていたつもりでした。

が、この有り様。

 

当時は本当に焦りました。手汗、冷や汗、変な汗だらだら。

「この先ずっとこの調子だったら真剣に将来を考えなきゃいかんな。」

「僕ってプログラミングのセンスないのかな。」

「この学科で生きていけるのかな。」

とか色々考えました。

成績を返却されてから数日間はずっとネガティブなことばかりを考えていました。

 

そして辿りついた答えがこれです。

「プログラミングができる人に教えてもらえばいいんだ!」

単純ですが、結局これがベストアンサーでした。

 

勉強、スポーツ、料理、仕事でも何でもそうですが、

やっぱり「できる人」に聞くのが上達の近道。

「できる人」は自分が知りもしないことをたくさん知っています。

 

僕はプログラミングができる先輩や友人を師匠と崇め、プログラミングの勉強法や考え方、やり方など様々なことを教えていただきました。

幸運なことに、僕の学科の同級生には出身県の大きいなプログラミング大会で準優勝した経験のある学生や、

小学生のころから趣味でプログラミングをしていた猛者達がうじゃうじゃいます。

 

そんな彼らに教えていただいたプログラミング上達の秘訣や僕の経験から得たコツをまとめておこうと思います。

 

プログラミング初心者向けの学習法と上達の秘訣

これから以下の7点についてお話しようと思います。

  1.  プログラムを改造する 
  2.  実験プログラムを作って試してみる
  3.  プログラミング言語も結局は言葉 
  4.  コンパイラのエラーメッセージは神の言葉
  5.  ブラックボックスと割り切る勇気
  6.  プログラムを見せ合ってアドバイス交換をする 
  7.  大学の図書館はプログラミング参考書の宝庫

 

 プログラムを改造する

参考書や講義などで与えられたプログラムはぜひ自分の考えで改造を施しましょう。

同じ目的のプログラムであっても、端的で効率が良く他の人が読んでもわかりやすいコードである方が優れています。

また、プログラムの実行時間を短縮するコーディングができればなお良いと思います。

最初は与えられたサンプルプログラムを理解することで精いっぱいかもしれませんが、余裕ができれば自分なりの変更や改良を加えてみることをおすすめします。

 

「この部分をこの文字列に変更するとどうなるかな?」

「ここでこの関数を呼び出すとどうなるかな?」

「この行をコメントアウトすると動作はどう変わるかな?」

などなど疑問に思ったらすぐに試してみる好奇心こそがプログラミング上達のための大切な要素です。

 

こうした習慣を心がけると、学習テーマ以外の文法や技術や、講義では時間の都合上で割愛されてしまった深い知識が自然と身に付きます。

また、「あー!そういう事だったのか!」といったような深い納得や気づきを得ることができます。で感動します

 

そもそも大学は全てを教えてくれるわけではないので、自分で追い求める姿勢がなければいけませんよね。

「1を聞いて10を知る」最近やっと気付きました。白目

 

 実験プログラムを作って試してみる

「プログラムを改造する」と少し似ていますが、これは改造ではなく、気になる関数や文法を試行ための新たなプログラムを作ることを指します。

結構面倒くさいですが、僕がアドバイスをもらった「できる人」は全員当たり前のようにやっていました。

規模の大きいプログラムを作っていると、実験したい一部分を変更しても実行結果に影響があったのか否か確認しにくい場合があります。

また、その結果を確認するまでに時間がかかるなど、試行上不都合な場合が結構あります。

そんなときは、もはやその部分をくり抜いて新しいプログラムを作って実験すれば話は早いです。

確かに手間や時間がかかり面倒ですが、こうした実験プログラムを作っておくと後々そのプログラムに助けられるシーンが増えます。

例えば大学生の場合、講義などで教授が「ここをこうするとエラーになるんだよ。」といった説明をしたとき、他の学生が「なんで???」な具合で頭に?を浮かべていたとしても、

手間をかけて実験プログラムを作った学生は経験しているので「あーはいはい。それな!」といった具合ですんなり理解できます。

 

また、「2度あることは3度あり、3度あることは….」の法則から、1度つまずいたことって後でまた出てくるんですよね。

プログラミングにおいても、あるプログラムを作成するうえでつまずいたことが別のプログラムを作るうえでの障壁として現れることがあり、

そのときその対処法を記述した実験プログラムがあれば何事も無かったかのように乗り越えることができます。

対処法をしっかり覚えていることが理想的ですが。

 

日々の地道な実験精神で経験値を積むことが結局上達への近道かなと個人的には思います。

 

 プログラミング言語も結局は言葉

プログラミングという言葉の響きから何となくコンピュータやロボットなど機械的なものをイメージしてしまいますが、

プログラミング”言語”と言っている時点でやはり言葉なのかなと個人的には思います。

そのため、受験生時代に毎日英語長文を読んでいた習慣の名残から、

「プログラムも毎日読んでみようかな。」といった思いつきで、苦手な文法を含むプログラムや覚えておくとよいアルゴリズムを実装したプログラムを定期的に読んでいます。

最近は読んでいませんが。。。

 

そうするとただ読んでいても自然に覚え、別のプログラムを書くうえで役立つことがあります。

 

 コンパイルのエラーメッセージは神の言葉

「コンパイラ」は絶対神です。

彼の言葉を無視しては先に進むことはおろか、プログラムの実行はできません。

ときどきコンパイルエラーが出ても適当に読み流してすぐに誤り修正に取りかかる学生 (僕です) がいますが、

コンパイラのエラーメッセージは1度腰を据えて読んでみると意外面白いです。

興味をもって読む習慣があると、何かメッセージを返されたとき自然と瞬時に誤りを判別できるようになります。

そうなると、コンパイルエラーの原因をいくつか覚えてくるのため、コーディングの時点で意識してきちんとコードが書けるようになります。

 

 ブラックボックスと割り切る勇気

プログラミングを勉強し始めると難しそうな専門用語がたくさん出てきて頭が混乱することがあります。

また、サンプルプログラム読んでいても「このコードは何のために書かれているんだ?」「このおまじないは何だ?」「このヘッダファイルは何のためにインクルードされているんだ?」など、

次から次へと疑問が生じます。

しかしそんなときは、「これは必要なコードなんだ!」「ふーーん、こういう関数なんだ。」程度に割り切って、

主眼を置くべき学習テーマにまずは集中すると良いかもしれません。

最初はブラックボックスの部分が多くて気になってもひとまず無視する勇気が必要です。

優先順位をつける意識です。

そうでなければ気になることが多すぎて調べまわることに時間がかかり、最初に抑えなければならないポイントを見逃します。

余裕ができた後に気になる部分を抑え、学習テーマ以外の深い理解を得るようにするといいと思います。

 

って先輩にアドバイスされたことを鮮明に覚えています。

先輩には感謝感謝です。謝謝 。



 プログラムを見せ合ってアドバイス交換をする

将来プログラマとして大きなプロジェクトを作成する場合、1人で全てのプログラムを書くなんてことはスーパープログラマでない限りまずありません。

普通は何十人、何百人のチームの一員として部分的にプログラムを作成し、

チーム間で互いのプログラムを共有しバグや矛盾がないかなどを確認した後に1つ大きなプログラムとしてつなぎ合わせます。

僕もそのスタイルを真似て、大学ではたとえ1人で書ける小規模なプログラムであっても、複数の友人と見せ合っています。

自分が書いたコードを見せ合うことで、

  •  理解に不足や勘違いはないかを確認できる 
  •  自分が知らない上手な書き方を知ることができる 
  •  複数の書き方を1度に学ぶことができる
  •  相手への説明を通して自分の理解が深まる 
  •  相手への上手な伝え方を学ぶことができる
  •  上手に書いて見せたいという向上心が生まれる

などなど、たくさんの利点があると思います。

僕はいつも4、5人の友達と「ここはこうした方がいいよね」とか「この使い方間違ってるよ」などアドバイス交換をしながら課題プログラムのベストアンサーを探しています。

 

恥ずかしがらずに自分のプログラムを友人と見せ合う習慣ができれば幅広く、楽しみながらプログラミングを学ぶことができます。

 

 大学図書館はプログラミング参考書の宝庫

大学の専門科目の教科書って結構高いですよね。

1冊で 3,000円する教科書はざらでそれを数冊も買わなければならないのため、自分が本当に欲しい参考書はお預け状態なんてことが結構あります。

しかも専門科目の参考書は書いている人が少ない分野もあるので、理想的な本がなかなか書店やネットでも手に入らないこともあります。

 

が、「大学図書館最強説」

灯台下暗しと言うか、僕が単に図書館という選択肢を忘れていたせいか大学図書館を甘く見ていました。

何でもありました。

 

僕がこれまでに Amazon のレビューを見て欲しいけど買うほどでもないなと思っていた参考書がずらっと並んでいます。

気になる参考書は片っ端から借りて、普通に買うと約 25,000円もお金がかかるところを無料で読むことができました。

参考書って、ある本と別の本を比較しながら部分的に参照したいことがあるので図書館は宝の山です。

すごいお得感と宝物を発見したかのような感動を味わいながら勉強することができ、感無量です。

 

ということで、僕のように大学図書館の素晴らしさに気付いていない学生の方で

  •  お目当ての参考書が高い
  •  絶版になっている
  •  Amazon等で売られていない
  •  ちょっとした参照目的で、買う程でもない

などに該当する方はぜひ大学図書館の利用をおすすめします。

探してみると意外とあります。

また、小中高生の方であっても大学図書館は利用できますので、ぜひ足を運んでみてください。

キャンパスは凄く広くて迷うかもしれませんが、近くの大学生に聞けば案内してくれるはずです

 

さて、これまでの7点を再度まとめます。

  1.  プログラムを改造する 
  2.  実験プログラムを作って試してみる
  3.  プログラミング言語も結局は言葉 
  4.  コンパイラのエラーメッセージは神の言葉
  5.  ブラックボックスと割り切る勇気
  6.  プログラムを見せ合ってアドバイス交換をする 
  7.  大学の図書館はプログラミング参考書の宝庫

僕はこうした7点を意識しながら約1年間勉強してみました。

プログラミングの力はどれ位変わったのでしょうか?

 

僕のプログラミング科目の成績の変化

再度確認しますが、「大学のプログラミング科目の成績でプログラミング力を測ることができるか」といった議論はひとまず置いて、大学の成績を指標にプログラミング力の変化を確認します。

これは1年次後期のプログラミング科目の成績です。

結構上がりましたね!実力がついたのかは正直わかりませんが嬉しいです。

 

そして2年前期のプログラミング演習科目の成績がこちらです。

 

それとつい最近返却された2年後期のプログラミング演習系科目の成績がこちらです。

これはもう素直に喜んでいいのではないでしょうか?

上記に挙げた項目を意識して勉強した結果だと思います。

 

人それぞれ自分なりの勉強法やこだわりがある思いますが、僕が紹介したやり方のなかで参考にしてみようと思ったものがあればぜひお試しください。

 

僕自身まだまだ技術不足で勉強しなければならないことが多く、

プロの仕事としてのコーディングができるレベルには到底届いていないのでこれからも精進していこうと思います。

頑張ります。

ではまた!

 

落書きボロきれメモほど役に立つ

2017.09.29

Windowsコマンドプロンプトで動かすAtom × JDK のシンプルなJava開発環境を作る!

2017.09.28

【Windows】プログラミング初心者向け!Atom x MinGW の超シンプルな C/C++の開発環境を構築する!

2017.09.22

スポンサーリンク


ABOUT ME!

yuk!

国立大学情報学科に通う大学生です。天然パーマと戦いながらすーぱーエンジニアを目指し技術とセンスを磨いています。 室内に引きこもりがちでヘビメタと猫と甘いものが救いのキーボードカチャカチャ生活ですが、最近はブログで文章を書くことが楽しいです。モットーは「 Who dares wins. = 人生是一箇,活殺全在我。」好きな言葉は「マジ卍」。