fuzzy study

仕事・趣味で勉強したことのメモ

プログラミングに向いている人向いてない人

プログラミングに向いている向いてないっていう議論を見かけたので、ちょっと思ったことを書いてみます。

自分が思うに、プログラミングに長けた人が持っている力には以下のようなものがあると思います。

  • 書き上げる力
    • プログラミング言語の基本的知識
    • 周辺ライブラリの存在と使い方の知識
    • エラーやバグ調査の効率的な方法の知識
    • 開発環境構築の知識
  • 設計する力
    • 各言語における仕様や特性の理解
    • 読みやすさやメンテ容易性を意識した書き方の知識
    • エラーやバグが発生しにくい(テストしやすい)書き方の知識
    • 性能を考慮した書き方の知識
  • 幅広いアーキテクチャパラダイム、開発手法に対応する力

これらを身につけるために必要と思う素質は、

  • 書き上げるためには
    • 具体的な目的を持つこと
    • 体で覚えるくらい飽きずに繰り返し作業できること
    • うまく進まなくても根気よくやること
  • 良い設計のためには
    • 論理的に考えること(パズル的な)
    • 自分の作ったものを客観視できること
    • 他人のコードに興味を持つこと
    • 丁寧に進めること
  • 対応力のためには
    • 興味を絶やさないこと

初心者のうちはとにかく同じようなものでいいから繰り返し書く、のが効率は悪いかもしれないけど身にはつきますね。大昔C++書いていたころは、VisualStudioの吐く意味不明エラーメッセージに対する対応方法をほぼ暗記していたような記憶があります。。

良い設計をするには書く経験よりも読む経験を積むほうがいいのかなとも思います。そういう意味で、作ることばかりに気を取られず「他人のコードに興味を持つ」のは素質の一つと思います。

プログラミング教育としては、

  • 具体的な目標を持たせ、
  • 繰り返し、かつ飽きずに取り組める題材を用意し、
  • 丁寧に教えて完成までフォローし、
  • 他人のコードと見比べてより良く書くにはどうしたらよいかを考えさせ、
  • 考えた結果をコンピュータサイエンスの背景と照らし合わせて理解を深め、
  • 手を動かしてリファクタリングする

というフローを踏めたら最高かなと思いました。


とここまで書いてみて、大元の議論はもっと基本的なレベルに対する議論だったのではないかと思い直しました。

forとかifとか、変数とか型とか、そういうレベルで向いてる向いてないを議論するなら、まずは書いていて楽しいと思えるかどうかかなと思います。
自分は未だに、自分が書いたコードが動くだけでどんなに単純なプログラムでも楽しさを感じます。(別に自分が「向いている」とは思いませんが)
じゃあどうして楽しいのかというと、自分の場合は、ものを作る力を得たというワクワク感が楽しいのだと思います。ものを作りたいというモチベーションがある人のほうが楽しみやすいでしょう(当たり前か
一方で、具体的に作りたいものが思い描けていないとどこかでむなしくなります。どんなに手を動かしてもものが出来上がらないので。そういう意味で、目的を具体的に持つことや根気は必要な素質かなと思います。

しかし近年は(いや、昔からそうなのかもしれないですが)、言語そのものというよりも、作ろうとしているものの仕組みや周辺知識のほうが重要な気がしています。
webアプリを作るならjavascriptだけではなくHTML/CSSを知って、操作対象としているwebページがどうできているのかを理解する必要がありますし*1pythonが書けてTensorflowやchainerが使えても機械学習のプロになれるわけではないですし、JavaやKotlinが書けるだけでAndroidアプリが作れるわけではなくAndroidアプリの構成とかOSの特性とかを合わせて理解する必要があるわけです。

プログラミングは手段であって目的ではないので、やはり目的意識って大事ですね。書きながら自分に言い聞かせています。

*1:まあさすがにこれは当たり前すぎていい例ではないか