エバンスの雑記帳

MBA、Python、子育て、将棋、文房具、その他

3分切れ負けでの将棋初段取得のための向かい飛車(77角戦法)

こんにちは。居飛車党のエバンスです。
苦手としている対居飛車の勝率を上げるために、遂に振り飛車に手を出しました。 この戦法のおかげで長らく1級だった3分切れ負けも初段になり、将棋ウォーズは全ルール初段に到達しました!

向かい飛車77角戦法は、狙いが明快で攻めやすく、かつ、序中盤の考慮時間を節約できるため、3分切れ負けでは特に勝ちやすい戦法です。

向かい飛車77角戦法

77角戦法は、一旦角を77に待機させ飛車を振った後に角交換を行い、最終的には77桂から、相手の隙をついて8筋で飛車交換を挑む戦法です。
飛車を8筋に振った後は早めに8筋の歩をついて85歩からの飛車交換の余地を残しつつ、自陣は美濃囲いに組むことで、飛車交換後の横からの攻めに備えます。

角交換する前の、典型的な進行は以下のような感じになります。

角交換後は8筋を突き返します。その後は冷静に美濃囲いを完成させつつ77桂。8筋で飛車交換を挑んだ場面はこちらです。

飛車交換後は互いに相手陣の8筋に飛車を打ち込む展開ですが、横からの攻めに強い美濃囲いのおかげで振り飛車が十分指せます。

序盤のポイント

定跡としては整備されていないようですが、序盤のポイントは以下の3点です。

  • 飛車を振った後はすぐに68銀
    • 角道を開けたままにするため、いつでも角交換からの45角(2筋と6筋の両取り)があります。この変化は乱戦になるのでなるべく避けましょう。そのためにも飛車を振った次の手は、6筋を守る68銀!この手が入れば狙いの戦型に一歩前進です。

  • 角交換をして8筋の歩を突き返す
    • 相手が銀でしかとれない早いタイミングで角交換をします。その後はすぐに8筋の歩を突きます。最終的に77の桂馬を活かして飛車交換するので、85の地点で戦いを起こす必要があるので、その仕込みです。角交換の次は、歩を突きこされないように歩を突き返すのを忘れないようにします。

  • 美濃に囲う前に38玉と58金左
    • 38玉と58金左の形は浮いた駒がありません。相手の金銀の連結が弱ければ、この状態で飛車交換を挑むことが可能です。序盤から積極的に動き、相手の狙いを外して自分の土俵で戦うことを心がけましょう。

急戦に分類される戦型ですが、最低限の準備は必要です。68銀、角交換+8筋の歩突き、38玉と58金まで入れたうえで、隙をついて飛車交換を挑みましょう。

向かい飛車77角戦法のメリット

私が指している感触では、次の3つのメリットがあると思います。

  • 攻め筋が明快
    • 角を手持ちにして飛車交換を挑む。攻めの方針が明確です。相手が駒組み段階で隙の大きい囲いの場合、特に大きな戦果が期待できます。

  • マイナーで対策されにくい
    • 有名な戦法ではないため、相手はどう指して良いかわからない(はずです)。相手が囲いを優先して離れ駒を作ろうものなら、飛車交換が刺さります。

  • 居飛車党でも指しこなせる
    • 向かい飛車は居飛車党の裏芸、とも言われます。角交換ができなかった場合は、通常の向かい飛車として戦いますが、居飛車党の私でも向かい飛車だけは、あまり違和感なくさせています。三間・四間・中飛車はどれもダメダメです。。

気を付ける点

非常に優秀な戦法である向かい飛車77角戦法ですが、飛車を振った瞬間に角交換をされて45に角を打たれると完全な力戦になります(体感的には10局に1局あるかないかですが)。この場合は、6筋を銀で守った方が勝ちやすいように思います。場合によっては鬼殺向かい飛車が楽しめます(エフェクトが出るときの音声が有名なアレです)が、本戦型とは似ても似つかない異次元の将棋になります。級位者は出現頻度の低い戦型は勉強せずにスルーすることをオススメします。

参考になる動画

Youtubeで将棋系の動画をアップしているヤスさん(将棋ウォーズ5段)がこの戦法を得意にされています。

ヤスさんは77角戦法でかなりの数の動画がアップされています。↓の動画以外にも、是非とも参考にしてみてください。

https://m.youtube.com/watch?v=fetCM66tx0A

まとめ

3分切れ負けで自分の土俵で戦えるのはかなり大きいです。相手が急戦・持久戦どちらできてもそれなりに戦える本戦法はオススメです。77角戦法で居飛車をやっつけてみてはいかがでしょうか。

将棋初段取得のための終盤勉強法

こんにちは、居飛車党のエバンスです。初段取得のためにどのように終盤力を鍛えるのが良いのか御紹介したいと思います。

終盤とは

厳密な定義はないように思いますが、駒がぶつかり始めてアドバンテージを稼ぐ(飛車先を突破する・成り駒を作る等)のが中盤だとすれば、それ以降の相手玉を詰ましにかかるのが終盤になります。

大事なこと

相手に自玉が詰まされるよりも、「一手早く」相手玉を詰ますことです。自玉が攻められていても相手玉を一手早く詰ませば勝ちなので、速度を重視した手を選択することが重要になります。

勉強方法

詰みの形を知る

一間龍(イッケンリュウ)やそれを活かす送りの手筋、また、矢倉崩し・美濃崩しといった出現頻度の高い囲いを壊滅に追いやる方法を丸暗記しましょう。

どんな本でも良いと思いますが、私が初めて終盤の勉強するために購入したのは ↓ の本でした。2006年出版。。。笑

www.amazon.co.jp

最近だとここらあたりが良さそうでしょうか

www.amazon.co.jp

また、手筋云々の前に、終盤の指し方(方針)自体がよくわからないという方は、↓ の本を読んでみると終盤では何を優先すべきなのか理解が深まると思います。

www.amazon.co.jp

受けなしにするために

初段が間近になってくると、相手も自玉の詰み筋がわかってくるのでそれを防いできます。こうなると直接詰ますというよりは、相手玉を受けなし・必至に追い込む、という指し方が必要になります。「王手は追う手」や「玉は包むように寄せよ」というのは、まさに相手玉は受けなしに追い込むべし、という格言ですね。

私が実際に読んで、大きな効果を実感したのは ↓ の書籍です。少し難しめの本ですが、もうすぐ初段という棋力はあるが終盤に難ありという方には、強くオススメできます!

www.amazon.co.jp

詰将棋

サクサク解けるレベルの問題を多く解くのが良いと思います。初段を目指すのであれば、まずは3手詰みをしっかりと解けるようにする、物足りなければ5手詰みというのがセオリーだと思います。7手詰めを迷わず解けるという方は、既に終盤力は初段以上のレベルだと思います。 詰将棋でオススメの棋書というのも難しいですが、とりあえず有名どころを載せておきます。

www.amazon.co.jp

www.amazon.co.jp

まとめ

初段になるためには、優勢の将棋を波乱なく勝ち切る・劣勢の局面から逆転するための終盤力は非常に重要です。終盤を勉強して、寄せの手筋で相手玉を一気に詰ます爽快感、ジリジリと相手玉を必至に追い込んだ時のしてやったり感を是非味わってみてください!

Pythonを使って「マンガ線形代数入門」の練習問題を解く

こんにちは、文系なのにPythonにハマっているエバンスです。仕事で逆行列に触れる機会があり、知識がない者でも読みやすい入門書を探していたところ「マンガ線形代数入門」に辿り着きました。

bookclub.kodansha.co.jp

マンガなのに講談社ブルーバックスシリーズ、これは!ということで購入(電子書籍版)。読み進めたところ、章の終わりに練習問題が。。。

最初は解く気がせず、答えを見て納得しつつ読み飛ばしていたのですが、折角だから Python に解いてもらおう、ということでブラウザ上で Python3 のコードを書いて実行できる paiza.IO にて、それぞれ解いてみました。

paiza.io

第2章練習問題

行列の計算には、Pythonでは Numpy を使うことが多いようです。Numpy 内では選択肢が複数あるようで大きくは array (配列)派か matrix (行列)派に分かれるみたいです。今回は難しいことは考えずに行列用の matrix を採用しました。

この章の練習問題は、連立方程式を行列を使って解くものです。書いたコードを載せておきます。

第3章練習問題

1は2×2の行列の逆行列を求める問題。2は2×2の行列入りの方程式を解く問題。求める行列が、与えられた行列の右側か左側かで計算の過程が変わるのがおもしろいですよね。

第4章練習問題

連立方程式を行列にの形にして解いてみる問題。ちなみに、あえて解がない方程式が出題されていて、解がない場合は不定不能かを判定するべきなのですが、面倒なので「不定 or 不能」と解けないことだけ明示しています。

第5章練習問題

座標上に、格子状に9点(x: 0, 1, 2 と y: 0, 1, 2 の組み合わせ)が与えられており、それを2×2の行列で1次変換する問題。

本当はmatplotlibを使って変換前後を比較したかったものの、paiza.IO上でエラーが出たので視覚化は断念。

まとめ

「行列の計算は機械の方が得意」と本書の中にも記載があったとおり、コードにすると非常にあっけないというのが感想です。Python(というか Numpy?)に感謝ですね!

Python学習法_Paizaラーニングの練習問題

こんにちは。文系なのにPythonにハマっているエバンスです。
以前の記事でPython学習のための無料サービス「Paizaラーニング」を紹介しました。この記事では、そのサイト内の練習問題について、私が問題に取り組んだ課程を振り返り、解き方を説明したいと思います。

以前の記事はこちら。

evansmode.hatenablog.jp

練習問題

Paizaラーニングにはたくさんの練習問題が掲載されています。練習問題は、時間制限なしで自分の評価(ランク)にも影響がないため、気軽に腕試しをすることができます。

「プログラミング練習問題」という名前で、Paizaラーニングのトップページ上からアクセスすることができます。(他のコースに混ざって、ページの底に近いあたりに掲載されているので、意外と見つけにくいです。。)

こんなのです。
f:id:evansmode:20180514022052p:plain

問題ランク

練習問題は、それぞれSからDまでランク付けされているので、自分の実力に合わせた問題に挑戦することができます。

まずは、時間のかからないDランクかCランクの問題を解いてみると良いと思います。Dランクであれば1分かからずに解けますし、Cランクでも5分程度で解くことができると思います。

私の場合、Bランクが10~20分かけて楽しんで解けるレベルです。Aランクだと真面目に考えないと答えに辿り着けない、また、メモを取らないとコーディングの途中で迷子になる感じです。

問題を解く流れ

まずは問題文を読みましょう。入力例と回答例も載っていて、どのような回答が求められているのか、イメージしやすく親切です。

簡単な問題であれば、この時点でコーディングの内容について目途が付いていると思います。

また、コーディングの前に、解答欄の右上のプルダウンで Python3 を選択するのを忘れないでください。

1. データの取得方法

Paizaラーニングの問題では、「標準入力」という形態でデータが与えられるのですが、これが慣れないうちは意味不明で挫折しがちです。

問題とは関係ないところで引っかかるのは単なる時間の無駄なので、↓の記事を見て、データの取得・加工(切り分け等)は丸写ししてしまうのをオススメします。

qiita.com

なお、出力(回答)は print するだけなので簡単です。

今回の問題では、文字列形式で数字が与えられるので、↓のとおり int() 関数を使って整数形式に変換しながらデータを受け取るようにしました。

input_int = int(input())

2. コーディング(繰り返し処理)

入力の部分が終われば、いよいよ本題です。
私が今回挑戦した問題は「Fizz Buzz」というもので、整数Nが与えられ、整数1~Nを1行ずつ出力する問題です。ただし、出力する数字が3の倍数ならFizz、5の倍数ならBuzz、3と5の倍数(要は15の倍数)ならばFizz Buzzと出力せよ、という指示です。(世界のナベアツ。。。)

1~Nを出力する点に注目して、繰り返し処理について記述します。Pythonでは "For文" を使用します。

For i in range(input_):
    print(i+1)

pythonの繰り返し処理の変数 i は、range() を使うと0から始まるので print(i+1) として 1~N が出力されるようにしています。

なお、初心者の場合、コードを書いたらその部分が正しく動くか、少しずつテストして確認することをオススメします。

提出前動作確認ボタンを押下すると、その時点で書いてあるコードを実行してくれるので、きちんと繰り返し処理ができているか、print() の結果を見ることで確認することができます。

f:id:evansmode:20180514033146p:plain

今回は、提出前動作確認の結果、1~20が出力され、正しく繰り返し処理が実行されることを確認できました。(実行結果ステータスの Wrong Answer はこの段階では無視してください)

3. コーディング(条件分岐)

繰り返し処理に問題がないので、15の倍数→3の倍数→5の倍数→それ以外、という順番で条件を分岐させるコードを書きます。(3と5の倍数の条件分岐は順番が逆でも大丈夫です)

なお、15の倍数は、3と5の倍数でもあるので、二重に出力されないようにそれぞれの条件分岐が入れ子になる(else を使用)ようにしています。

例えば、15であれば Fizz Buzz と出力(print)して、それ以降の処理は行いません。

if (i+1)/15 == round((i+1)/15):
        print("Fizz Buzz")
    else:
        if (i+1)/3 == round((i+1)/3):
            print("Fizz")
        else:
            if (i+1)/5 == round((i+1)/5):
                print("Buzz")
            else:
                print(i+1)

4. 提出前動作確認

コードを書き終えたら、与えられているデータについて上手く処理できるか、最後のテストをしましょう。

f:id:evansmode:20180514033253p:plain

与えられた入力データ "20" に対して、正しく処理できたことが確認できました。実行結果ステータスも Success になっています。

※慎重派の方は、自分でもテストデータを作って(input_int に自分で任意のデータを格納)テストするのも良いと思います。

5. 最終提出

最終提出をすると、他の入力データに基づいて、Paizaラーニング側が評価を実施します。 私のコードは、10個すべてのテストをパスし、正解となりました。

f:id:evansmode:20180514034940p:plain

まとめ

PaizaラーニングのDランク練習問題を解く流れについて解説してみました。

標準入出力には戸惑われると思いますが、慣れるまではコピペで済ませ、問題を解くのに集中することをオススメします。また、プログラミング初心者がコーディングする時は、頻繁に提出前動作確認(print で出力)を実施して、自分の思うような処理ができているか確認すると、どこで間違っているのかわからない、という状況に陥ることなくスムーズに解答できると思います。

将棋初段取得のための右四間飛車左美濃(別名:居角左美濃急戦)

こんにちは。居飛車党のエバンスです。
相手が居飛車で矢倉に組んできた場合、私は相矢倉を避けてこの戦い方を採用しています。

相矢倉という「将棋の純文学」を積極的に避ける後ろめたさはありますが、攻め筋が明快・守りが固い等、勝ちやすい戦法だと思います。

四間飛車左美濃

居角左美濃急戦とも呼ばれる戦法で、特に相手の矢倉囲いに対して強い攻撃力を誇る戦法です。二つの戦法名が示すとおり、角を8八から動かさずに左美濃に組み、攻撃時には飛車を4筋に据えて、相手の囲いを攻略していく戦法です。

囲いが完成し、飛車を4筋に振った瞬間は以下のような感じになります。

左美濃の組み方

こちらのブログの冒頭に左美濃に組む手順が詳しく紹介されています。

矢倉崩しの居角左美濃急戦!定跡・手順・対策の紹介 | 将棋上達の科学

左美濃に組む際のポイントは、相手が早々に飛車先の歩を突いて居飛車を明示していることと、4四歩と角道を止めて角交換を拒否してくることです。

相手が角道を止めたので、こちらは左の銀を7八に上げることができます。(角道が開いていると、こちらの角がタダで取られてしまいます。注意!)

四間飛車左美濃のメリット

私が指している感触では、次の3つのメリットがあると思います。

  • 攻め筋が明快かつ強力
    • こちら側は、飛車・角・銀という三枚で攻撃します。3筋の歩を突くことで、右の桂馬も容易に攻撃に参加させることができます。相手にとっては、わかっていても受けるのが難しいのが実情です。

  • 左美濃が強固で崩されにくい
    • 左美濃は直接王手をかけられにくい囲いで、終盤の競り合いに強いです。また、攻めの途中でこちらの飛車を渡すことになっても、相手からの飛車の打ち込み(横からの攻め)に強い囲いで、簡単に攻略される心配がありません。

  • 「とりあえず矢倉」という相手に最適
    • 級位者は戦法に幅がない方が多く、居飛車の場合、特に角交換を嫌う場合には「とりあえず矢倉に組んで何とかする」と考えている方が多いように思います。このような相手は、右四間飛車左美濃の餌食になっていただきましょう。

気を付ける点

非常に強力な戦法である右四間飛車左美濃ですが、次のように8筋を攻められないよう、気を付ける必要があります。

  • 9五桂
    • 次の8七桂成→同銀→8六歩を狙っています。これが決まるとすぐに終盤戦になってしまうので注意が必要です。防ぐためには、9四歩をどこかのタイミングで入れておくことで防ぐことができます。

  • 7六桂
    • 相手の7五歩にこちらが同歩と応じた場合に、将来の7六桂打ちのキズができることになります。7六桂に対しては、こちらは角を逃がす必要がありますし、角がいなくても次の8八銀を狙う詰めろになっているため、こちらが守勢に回ることになります。

参考になる動画

Youtubeで将棋系の動画をアップしているクロノさん(将棋ウォーズ4段)がこの戦法を得意にされています。

特に序盤力には定評がある方ですので、是非とも参考にしてみてください。

www.youtube.com

まとめ

「とりあえず矢倉」という相手に対してめっぽう強い右四間飛車左美濃(居角左美濃)について解説してみました。攻め将棋な方には、特にオススメの戦法です。この戦法で居飛車相手に白星を稼いで初段を目指してください!

将棋初段取得のための対振り持久戦(端玉銀冠)

こんにちは。居飛車党のエバンスです。
持久戦と端玉銀冠のセットを、対振り飛車のメインに据えて、将棋ウォーズ初段(10分切れ負け)を獲得しました。その際の経験を基に、対振持久戦における端玉銀冠のメリットを書きたいと思います。

対振り持久戦

対振り持久戦とは、相手が振り飛車を採用してきた場合に、居飛車側が持久戦に持ち込む戦法です。 玉の守りを手厚くすることによって、途中劣勢の将棋であっても、攻め合いに持ち込めば最終的に逆転しやすい、というメリットがあるように思います。

囲いについては、穴熊囲いに組むのが一般的ですが、私自身は「端玉銀冠」を多く採用しています。初段獲得時、端玉銀冠での勝率は7割ありました。(現在は6割7分です。レーティングは正確ですね。。)

端玉銀冠の組み方

端玉銀冠は手数はかかりますが、それ以上の発展形が存在しない非常に強固な囲いの一つです。 相手が振り飛車であることがわかったら、まずは「船囲い」に組み、その後「天守閣美濃」に発展させます。そこから玉を9八に移動させ、銀を8七に、金を7八に動かし、「端玉銀冠」の完成となります。

天守閣美濃」の組み方は、日本将棋連盟(!)のコラムに譲ります。 (↓のコラムでは単に「左美濃」と表記されています。)

www.shogi.or.jp

四間飛車相手に「端玉銀冠」に組んだ際は、こんな感じになるはずです。

また、余裕がある場合には、右の金を6八に移動させて、将来の相手からの6九銀(割り打ちの銀)のキズを消しておくと、より攻めに専念することができます。

端玉銀冠のメリット

端玉銀冠のメリットは以下の3つです。

  • 王手飛車取りの筋がない
    • 居飛車で船囲いからの急戦を選択すると、いつも悩まされるのが相手の駒台にある角の存在です。端玉銀冠は玉のコビン(斜め上)を銀が守っており、また、自玉は王手のかからない9八にいます。相手の角打ちにおびえることはありません。
  • 横からの攻めにめっぽう強い
    • 横からの攻めにとても強い端玉銀冠は、振り飛車に駒を捌かれ、飛車や角をこちらの陣に撃ち込まれても簡単には攻略されません。特に、相手陣に打ち込んだ自分の角を馬にしつつ8八の地点に引ければ、相手はどこから攻めてよいのかわからない状態になるはずです。
  • 相手が対策を知らない
    • 優秀な端玉銀冠ですが、後述する弱点(8筋が弱い)は存在します。しかし、級位者が何も知らない状態から8筋を機敏に攻めてくることはほとんどありません。マイナーな囲いの良いところは、相手が情報を持っていないことです。

あとは攻めるだけの簡単なお仕事です。勝率7割も夢ではありません。

対振り持久戦における居飛車の攻め方

基本的には飛車と銀で相手の3筋を攻めていくことになります。 ↓の図からは、3五歩→同歩→4六銀、と相手の歩の狙いつつ銀を前進させていきましょう。

これに対して相手が

  • 3六歩と歩を突いてくる
    • 飛車を2六に移動し、次の歩とりを狙いつつ、相手の3筋(角頭)を銀と飛車で攻めていきます。
  • 3四銀と歩を守りにくる
    • 飛車を3八に移動し、次に銀で歩をとりながら、銀交換を狙います。こちらの守りは固いので、銀交換は望むところです。
  • 4筋の歩を突いて角道を開ける
    • 自分から角交換をして、自玉の位置は9八をキープしてください。角交換の後、とられそうになっている銀を5七に引いて飛車単独で飛車先突破を狙っていくか、強く3五と出て銀を攻め加えていくことになります。

いずれの筋でも実現できれば中盤は有意に進めることができると思います。

気を付けること

優秀な対振り持久戦・端玉銀冠のセットですが、一つだけ注意する筋があります。相手から8筋を効果的に攻撃されることです。そのパターンの初動が、早い時点での5四歩です。

  • 5四歩が早い場合
    • 端玉銀冠の弱点である8筋を効果的に攻撃するために、5四歩を早めに突き、将来的に3三の角を4二に引き、8筋攻撃に参加させてきます。こうなると一気にこちらが壊滅する恐れがあるので、相手が5四歩を入れてくる場合には、穴熊など別の囲いを目指した方が勝ちやすいと思います。

まとめ

自身の経験から対振り持久戦において端玉銀冠がオススメしてみました。初段獲得までは、対振り飛車の戦法は、端玉銀冠に任せて問題ないと思います。是非お試しください!

プログラミング勉強方法

こんにちは。文系なのにPythonにハマっているエバンスです。
「プログラミングは、どうすれば上達するか?」と後輩に聞かれた際の私なりの答えを、せっかくなのでブログに残したいと思います。
なお、言語(Python)自体の勉強方法については、以前の記事を参照してみてください。

evansmode.hatenablog.jp

ちなみに、ようやくPaiza learning のAクラスを解くことができました!これもプログラミング力(プログラミング的思考力?)向上のおかげだと思っています。

プログラミング的思考とは

プログラミング的思考(論理的思考)って何? [3ページ目] - 日経トレンディネット

こちらの記事曰く、プログラミング的思考とは、次の5つの能力から構成されるそうです。

  • 抽象化する能力
  • 分解して理解する能力
  • やるべきことを順序立てて考える能力
  • ベストな方法か分析する能力
  • 方法を他に置き換えて一般化する能力

個人的には、この中では「抽象化(数学だと一般化?)する能力」「分析して理解する能力」「順序立てて考える能力」の3つが大事だと考えています。また、実際のプログラミングでは、コーディングの効率性も考えて、これに加えて「言語の知識」が問われるように思います。

抽象化・分析して理解する能力

抽象化と分析して理解することは表裏一体な気がしますが、これら能力がないと、冗長なコードを書くはめになります。

例えですが、「1から10までの整数の合計は?」という問題に対して、大人であれば、(1+10)×10/2 = 55ということを知っている(もしくはすぐに法則性を発見できる)と思います。ただし、この問題を初めて見た子供は、1から10まで少しずつ足しあげていこうとするはずです。時間がかかりそうですね。

↑の例は、10をyという変数にした場合には、(1+y)×y/2 と抽象化できます。これを知っている(またはすぐに思いつける)ということが重要だと思います。

最初は抽象化することに慣れないと思いますが、プログラミングをしていて、「条件分岐がみるみる増えていく」、「ループ処理の中にループ処理が山ほどあってもはやイミフ」等、思い当たる節があれば、どこか抽象化できないか、一度手を止めて色々と考えを巡らせてみると良いと思います。

私の場合、気付けば無駄に変数を多く設定していて結果的にコードが読みにくくなっていたり、個別ケースに対応(力技)で乗り切ろうとして抜けや漏れが存在し、テスト段階で気づく、というようなことがあります。なるべく早い段階から抽象化できるものはしておいた方が後々楽ですし、プログラムも結果的に読みやすく・メンテナンスしやすくなります。

また、この能力を鍛えるには、普段からプログラミングする際に、関数を作成することだと思います。関数を作成するときは、そもそも処理に必要な最低限の情報しか関数に渡そうとしませんし、関数を作成するには抽象化は避けて通れません。是非試してみてください。

順序立てて考える能力

コンピューターは「適当にやっておいて」と支持できませんので、細かい手順についても指示する必要があります。しかも、コードは1行ずつ実行されていきますので、指示の順序は非常に大切です。要は「計画力」です!

この能力は、ある程度慣れの領域だと思いますが、鍛える方法としては、コーディングの前にプログラムの設計図をキチンとアウトプットすることだと思います。

私の場合、プログラミングをする前には必ず、考えているプログラムの内容をメモします。自分でしか理解できないような単語と矢印満載の怪しいメモレベルのもの(他の人と共有する必要があればワードやパワーポイント等で清書します)ですが、頭の中で考えていることを紙に写す際に、矛盾や抜け漏れがあることにしばしば気づかされます。また、予め自分がプログラミングする内容を正確に捉えておくことで、コーディングの時間は驚くほど短くできます。

言語の知識

言語の知識は、上の二つの能力を助けてくれるものだと思います。Pythonで言えば、リストの知識があれば、データ構造の管理について思い悩むことを省略できますし、ライブラリのmatplotlibを知っていれば視覚化については簡単に目途がつけられるわけです。

そのため、言語の知識についてはある方が良いに決まっていますが、時間的な制約が厳しくないのであれば、使う時に初めて理解するのでも問題ない気がします。むしろ、知っているだけの状態だと、実際にコーディングしてテストした際に「こんなはずでは。。」ということがよくある(Python3のroundは完全に初見殺し。。)ので、「知っている状態」よりも「使ったことがある状態」まで引き上げておいた方が好ましいです。

なので、コードを勉強する場合には、ブログなどを読んで納得するのではなく、自分でコーディングするところまでセットとしてとらえておくことを強くオススメします!

まとめ

プログラミング力は、主に「抽象化」「計画力」「言語の知識」の3つから成り立っていると考えます。それぞれ苦手な部分をつぶしていけば、よりスムーズにプログラミング(構想からコーディングまで)を完遂をすることができるようになると思います!