プログラミングでつまづいてきたこと 自分の場合

プログラミング初学者のときにつまづいたことというテーマで,記事が続々投稿されています.

satoru-takeuchi.hatenablog.com

mizchi.hatenablog.com

熱が冷め切らないうちに私も少し書いてみます.

結論を言うと,プログラミング自体であまり苦労した記憶は無いです. しかし,つまづいたかどうかと言うと,やはり最初は難しかった概念というのは多くあります.

今何をやっているか

私は今は社内ツールの開発をしています.

言語としてはVBAPHPC#SQLなどです.

ものによっていろいろな言語は使いますが,あまり大規模な開発は経験が無いです.

プログラミング歴

私の場合は小学生の頃にHSPという言語に触ったのが始まりです. 本を元に学習をして,サンプルコードを入力したり,サンプルのゲームのプログラムを改造したりして遊んでいました.

その後,高校生のときにはプログラミングはほとんどやらなくなりました.

高卒で就職後,当初は事務をやっていましたが,1年半くらいした後に今のプログラミングの仕事に移してもらいました.

あと,並行して電気通信大学夜間主コースに通っていましたが,大学の授業では対してコードを書いていないので,プログラミングはほぼ独学か仕事の中で自分で覚えていった感じです.

つまづいたところ

趣味時代

基本的にプログラミングは趣味でやっていたので,「これが苦しかった!」っていうのは思い浮かばないです. 人間関係とか苦手な人間なので,プログラミング(とか勉強)が,逃げ場または自尊心の拠り所になっていた気がします.

ただ,「難しいこと」には苦手意識があり,仕事でプログラミングを始めるまでは避けてきました.

例えば以下のようなことです.

基本的に,ゲームのキャラを動かすなど,目の前のことをすぐしたいので,それをそのままコードにするっていうことしかやってこなかった気がします.

ちなみに情報オリンピックに応募しましたが,アルゴリズム系の高度な知識が要求されることをよくわかっておらず,予選落ちしました.

あとは,高校時代でもコンピュータの分野には興味があり,基本情報技術者情報セキュリティスペシャリストとかの資格を取ったりしていました.

仕事時代

仕事でプログラミングを初めた後は,少しコードを書いてブランクは取り戻した気がします. プログラミングとかコンピュータサイエンス系は,元々興味がありますし,自分の居場所という気がして,技術面では特に大きな苦はなく覚えていきました.

しかし,仕事でやる中で課題に思った(今も思っている)のが,設計,開発手法など,エンジニアリング寄りの部分です.

あまり大きな開発はしないにせよ,やはり設計をある程度しっかりやっておかないと,作っていくうちにコードがぐちゃぐちゃになって,よくわからないバグに悪戦苦闘したり,仕様変更の改修が地獄だったりと,そんなことがありました.

ネットの情報とか,試行錯誤を経て,例えばリーダブルコードにあるような内容とかは理解できるし,(全部では全然ないけど)実践できるようになってきているとは思います. ただ,オブジェクト指向的な設計とかはまだまだなので,精進したいです.

加えて,仕事と趣味の大きな違いに成果物の品質があります. 趣味ではコード書いて動けばOKみたいな感じでしたが,仕事ではテストを念入りに行ってあらゆるパターンにおいて異常な動作にならないことを確かめる必要があります.

元々単純作業が好きではないが不安症という性格もあり,テストは開発工程の中で一番辛かったです.

まあ,当初はアドホックにテストしていたので余計大変だったのですが.いくつもテストしているうちにある程度勘所がわかってきました. (本当は自動テストとかもやりたいけど,それがペイするほどツールの規模感や改修頻度が大きくない...VBAだと自動テストしんどいし)

ちなみに苦手意識があったことについて,

  • アルゴリズム: 大学で少し勉強した.今も勉強中.業務では別にいらない知識だった.
  • 物理シミュレーションなど数式: 物理学の知識は業務ではいらない.数学の苦手意識はまだあるので数学の勉強中.
  • WEBフレームワーク: 業務で触っているうちにわかってきた(あんまり使わないけど).
  • Javaの本格的なオブジェクト指向: Javaは (特に数年前は) だいぶアレな言語仕様だったけど,業務でやったC#が楽しかった.Visual StudioのIntellisenseとか最高!ちょうどVBAに飽きてきた頃だったので勉強は楽しかった記憶がある.

という感じでなんとかなりました.

あと苦手なことでぱっと思いつくのは,node.jsでよくあるコールバックの非同期処理です.値を返すのとかどうするんだ... Promiseも今ひとつ理解できていません. ここらへんは慣れだと思いますが.

なぜプログラミングでそこまで苦労しなかったのか

なぜプログラミングで苦労を感じなかったのかを考察しました.

1. 仕事の要求水準がそこまで高くない

仕事では小規模なVBAが中心なので,要求水準はそれほど高くないです. 基本ができれば,あとは自分のペースで勉強していけるような雰囲気はありました.

2. プログラミングを「本分」や義務として勉強したことが無い

小中学生のとき,趣味でプログラミングをしていたときは,完全に趣味で,ある意味で逃げ場でした. 小中学生の本分(というか普通すること)は学校のクラスで友達を作って楽しく学生生活を送ることなのでしょうが,私の場合それが苦手だったので,プログラミングをしていました.

仕事でプログラミングを始めるようになったときも,当時は事務の仕事が苦手な仕事だとわかり辛い気持ちで仕事をしていた時期だったので, プログラミングは義務でやらされたというよりも大きな好機でした.

基本的なコードは書けるので少し慣れれば最低限の仕事はできたため,追加の学習も趣味のような意識がありました.

3. 初心者向けの言語でプログラミングを始めた

こんな記事が紹介されていました.

toyokeizai.net

この記事の人は,初心者でいきなりWEBアプリなど実用的なものを作ろうとしたので、関連する技術が多すぎてわけわからないということになっているような気がします.

私の場合はHSPという主にゲーム作成用の言語で学習しました.この言語は今から思うと以下の理由で初心者に向いています.

(1) 覚える知識が少ない

  • HSPという言語以外の(例えばWEBなどの)知識はあまり必要としない
  • オブジェクト指向高階関数といった高度な機能はない
  • しかし,変数,条件分岐,ループ,関数といった基本的なことはできる

(2) 直感的

  • オブジェクト指向による抽象化は無く,命令を書いたら実行されるのでシンプルでわかりやすい
  • ゲーム向けなので画像描画の機能が豊富であり,例えばline 10, 10, 100, 100と命令を書いたら「座標(10, 10)から(100, 100)に線を引く」のように直感的でシンプル

(3) 文化が初心者にとって良い

  • 初心者向けのわかりやすい本がある.公式のヘルプやドキュメントも初心者向けでわかりやすい.
  • 公式サイトに掲示板があり疑問を解決しやすい.
  • プログラミングコンテストを毎年開催しているほか,ほかの人が作ったプログラムを一覧で見れる「hsptv」というツールがあり,作るモチベーションを生みやすい.

私はこれを遊び道具にして,簡単なゲームを作ったり改造したりしていました.

余談ですが,今は小学校でプログラミング必修化というのが話題になっていますが,実際に興味を持つ子供は一定数いると思うので, (指導する人などの問題はありますが)いい取り組みだなと感じました.

ただ,社会人になると「まずはHSPで...」みたいな悠長なことも言っていられないので,いきなり実践的なスキルを学ばざるは得ない部分はあるのが辛いところです.

4. コンピュータへの興味

2007年に放送された電脳コイルというアニメを知っていますか?

dic.nicovideo.jp

既に公式サイトも閉鎖されているようですが,このアニメは私の人生に少なからず影響を与えました.

電脳コイルの世界は,2020年代の近未来,電脳メガネというグーグルグラスのようなデバイスが全世界に普及しており, メガネ越しで電脳世界のものが実世界に映し出されれて見かけ上一体化しているような感じです. 近未来ですが,実世界は昭和な感じもする少し不思議な世界観です.

当時はグーグルグラスも無く,ARという言葉も普及していませんでしたので,先見性を感じます.

話はそれましたが,出てくる子どもたちがちょうど当時の自分と近い年齢でした. それでいてキーボードを高速でタイピングして色んな所にハッキングをして活躍するのが とてもおもしろそうと同時に憧れを感じました.

思い返せばこのあたりから私のコンピュータへの興味がある気がします.

同じくらいの時期,Suicaのシステム障害がニュースになりました.

www.itmedia.co.jp

ニュースで問題となったプログラムのコードが映し出されたのですが,ちょうどプログラミングを覚え始めた時期だったので, 一般の人にとっては意味不明の記号列の意味が(ごく一部でも)わかること,そしてこのような社会に影響を与える大規模なシステムにプログラミングが繋がっていることに興奮しました.

その後,ゲームを作り始め,自分の思い通りにゲームを作れるということが面白く,熱中していました. (高校に入ってからはゲームをやらなくなったのもありプログラミングもやらなくなりました.)

ただ,ずっとプログラミングは自分の得意分野という意識があり(周りに比べる相手もいなかったのもありますが), またコンピュータへの興味は続いたまま今に至ります.

他の記事で言及がつまずきポイントについて

代入文

これとか

a = a + 1

最初のプログラミング言語を覚えたのが小学生の頃だったので,中学で方程式を覚える前でした. なので,変な先入観なく「そういうもの」と受け入れられたように思います.

アルゴリズム

苦手でした/苦手です.やってみたり記事を読んだりして徐々にわかってきた感じです.

再帰も当初は意味不明でした.

オブジェクト指向

API設計は未だにベストプラクティスはよくわかりません.

低レイヤのこと

あまり触れていないこともあり,苦手意識はあります. レジスタとかは,大学の輪講でようやくちゃんと理解しました.

今からプログラミングを勉強する場合は?

あくまで想像ですが,社会人の今からプログラミングを勉強する場合はどうすればいいかと考えてみます.

1. 期間を長めにとる

初心者がプログラミングを始めるには膨大な知識が必要です.焦らずに勉強するためにも期間を長めに取ることは必要でしょう.(具体的に何にどのくらいかはわかりませんが)

あとは,次の「遊び」ができる余裕が生まれます.

2. 趣味の意識でつくる

「仕事でやらなければならないから勉強する」ではなくて,趣味の一部としてもプログラミングを覚えるといいかもしれません.

例えば,好きなキャラが動くプログラムを作ったり,自分用のWEBスクレイピングツールを作ったりとか? 覚えたことを「遊び」でも使って見るものいいかもしれません.

まあ,これができる余裕があったら苦労しないし,興味はなかなかコントロールできないのですが...

3. 良い教材で確実に

超初心者はネットの無料記事だけで勉強するのは厳しいでしょう.

また,ほかの勉強と同じく,たくさん参考書を買ってつまみ食いするのでは身につかないように思います.

自分の知識量に合わせたわかりやすい教材を適切に選び,確実に1つずつ学習していくことでしょうか. 焦っていきなり高度なことを覚えようとしても全く理解できないので...

まとめ

今までの人生の振り返りみたいになってしまった.