プログラミング上達する上で何をすればよいか

解決済

回答 5

投稿

  • 評価
  • クリップ 3
  • VIEW 2,630

omikuji

score 58

私は趣味でプログラミングをしています。(本職はNWエンジニア)

そもそも、自分がプログラムに興味を持ったのは機械学習を少しでもできるようになってみたいなあと思ったからです。(たびたびオセロのプログラムについての質問をここでさせて頂きました)
ただ、機械学習を実装するにあたって基本的なプログラミング知識が足りなさすぎると感じ、いろいろなサイトを巡って上達法を探ってみました。

例えば、バブルソートを自分で実装してみたりとか、paizaなどプログラミングの題材が置いてあるサイトで学習したり(レベルBくらいならスラスラとけるようにはなりました)、ネットではあまり意味がないとよく書かれていますが、javaの資格(silver)を取得するなど、いろいろやってみました。しかし、個人としてはあまり成長している気がせず、あまり面白さを感じなくなってきてしまいました。
皆さんはどのようなプログラムを作り、そしてどのように上達してきたのでしょうか?
体験談やアドバイスなど頂ければ幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+6

プログラミングに限らず、物事の上達になにより必要なのは「○○しなきゃ」という義務感よりも、「○○したい」という欲求だと私は考えています。

私はプログラミングの勉強というものを意識してした事はありません。
その都度やりたいことがあって、それを実現するためにプログラミングを調べながら実装し、実装しているうちに力が身に付いてきた感じです。

最初はゲームを作りたいという想いからでした。最初に作ったのは3×3パズルのような単純なものだったと思います。それから色々なゲームを作ってるうちにプログラミングの基礎が身に付きました。

ゲームの規模が大きくなるに従ってオブジェクト指向などのプログラミングをしやすくなるための知識が身に付き、オンラインで他の人とデータ共有できる機能を追加するためにperlの知識を身に付け、スマフォアプリ化するためにAndroidアプリ開発の知識が身に付くなど知識が多様化してきました。

一番力が付いたのは某有名ゲームの自動化マクロを組んだときでしょうか。あまり大きな声で言えることではありませんが、ルーチンワークを自動化するために専用ブラウザの開発やマクロツールの開発を行ったりして、プログラミングの技術や、他人のソースコードを見て理解する力がモリモリ付きました。

このように、自分はやりたいことをただやってくうちに気付いたら力が付いていました。なので正直「これをやれば良いよ!」とはっきりとは言えません。

omikujiさんの機械学習を少しでも出来るようになりたいという欲求も、きっと同じような事だと思います。
最初からハードルを高めに設定するよりも、まずは自分(自分が強すぎるのであれば適度な友人)よりもオセロが強いプログラムを作れるようになると目標を設定して、段階的に上げていくのがいいと思います。
そうして楽しみながら、挑戦しながらコードを書いていれば、いつの間にか技術が身についているでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+5

以下の文章は私の偏見に満ちています。
参考になれば幸いですが、「ふーん、こんな考えの変人も居るんだ」くらいの認識でサラッと読んで下さい。


NWエンジニアならターミナル(コマンドプロンプト・PowerShell・Bashなどなど)を立ち上げて作業したことはありませんか?
あれの自動化からはじめてみる事をオススメします。

もし手順書を確認しながらコマンドを打ち込むようなオペレーションがあるならば、
その手順書とコマンド群はリソースの無駄遣いです。

その手順書にはxxxコマンドでyyyを確認し、
aであればA操作をbであればB操作を行うみたいに書いてあることでしょう。
スクリプト化すれば、実行権限を付与してやれば勝手に複数コマンドを使い分けて、条件分岐させて仕事の完了まで面倒みてくれます。

それなりに長く続いているプロジェクトならば、先輩や前任者が作った秘伝のタレ(スクリプト)が幾つも転がっていることでしょう。
あれはよく忌み嫌われますが、本来とても重要なものです。
禁止する方向に向かうべきではなく、どうすれば可読性や再利用性が上がるかを検討すべきです。

複雑な手順だから無理?そういうのを上手く整理して書ききる事がプログラミングの腕の見せ所です。
数書いて後悔して書き直すフローを数十回こなせば、自然とあるべき処理をあるべき場所に整理整頓出来ます。
電子世界のおもちゃ箱を触るには誰も彼もが三歳児なのです。何度も散らかして片付けて洗練させるしかありません。


ターミナルはマシンに入れた全てのプログラムを実行出来ます。
プログラムとプログラムをパイプで組み合わせて、いくらでも新しい仕事の形に順応させることが出来ます。
(コマンドプロンプトやBashでは|の縦棒をパイプと呼びます。左から右にコマンドを数珠繋ぎのように組み合わせて問題を一撃で解決出来ます。)

仕事の形がうまくフィットしない時は、いくらでも自作のプログラムを作ってあてがう事が出来ます。
別に後から探して同じライブラリが見つかったとしても、そのライブラリのコードを見て評価してやろうという時に頭への入り方は段違いになりますので無駄にはなりません。
実行速度が必要でなければ是非スクリプト(batやシェルスクリプト)や、スクリプト言語(Node.jsやRuby、Python)で自作のプログラムを作ってみてください。

注意点としては、後からいくらでもパイプで組み合わせる事が出来るという点です。
実行するスクリプトはなんでも出来るファットな仕様にするより、小さな事を確実にこなすようにしてください。
あとで正しく組み合わせるスクリプトをあてがえば済みます。


自作したスクリプトはGitで世代管理しましょう。
これが先輩や前任者達が失敗した秘伝のタレを脱却する第一歩になります。

現場にはwork.sh、work2.sh、work-new.sh、work-new.sh.bk等の名前も付けられずに放って置かれたスクリプトの山があるかと思います。
さて、これのどれが最新でしょうか?私にはもはや捨てることしか出来ないゴミにしか見えません。
Gitならwork.shという1ファイルで管理出来ますし、目的に応じて当時の状態に瞬時に戻って取り出す事も可能です。

GitHubやBitbucketというGitのリポジトリホスティングサービスがあります。
GitHubの無料版は公開設定しかありませんので、Bitbucketでプライベートリポジトリを作る事をオススメします。


自作したスクリプトはドキュメントを残しましょう。
これが先輩や前任者達が失敗した秘伝のタレを脱却する二歩目になります。

特別な事をする必要はありません。
Gitのプロジェクトルートのフォルダに、README.mdファイルを投げ込むだけです。
書き方はTeratailと同じMarkdownで、今後のエンジニアのデファクトスタンダートになるフォーマットなので覚える価値は十分あります。

GitHubやBitbucketでそのディレクトリのページを表示すると自動的に記事であるかのように振る舞います。
「概要、インストール方法、使い方」の三項目を記載するだけです。
使い方に至ってはコマンドを作ったら実行してみて、結果とそのコマンドをバッククォート3つでくくりながらコピペしてExampleとタイプするだけ。簡単でしょ?
これでもう半年後の自分や後任者が、使い方ワカンネ、秘伝のタレ乙と悪態をつくことはありません。

余裕が出てきたら、特殊な動作をするコマンドは-hや--helpコマンドを仕込んでみてもいいかもしれません。
manファイルを仕込んで見られるようにするのもありでしょう。


自作したスクリプトはテスト用スクリプトでテストするようにしましょう。
これが先輩や前任者達が失敗した秘伝のタレを脱却する三歩目になります。

○○のレアケースでうまく対応出来ないんだけど…
目視で確認は漏れます。
正常系、エラー系をスクリプトに定義してしまえば一行修正する度に全てのケースで正常であることを保証出来ます。

うっかり漏れても保証すべきテストケースが増えるだけで対応完了。
手順書通りのコマンドが叩けず手痛い失敗をしてしまい、「次は危機感を持って対応するように気をつける」という始末書を書くほど無駄な事はありません。

ここまで出来ればあなたはもうそこらのプログラマより優れています。
NWエンジニアであると同時に、プログラマーとしても十分やっていけるでしょう。


明確な判断が出来るスクリプトは全て作り出せます。
しかしそうこうしている内に、正解が出せるわけではない問題が立ちふさがります。

囲碁将棋等の手が広すぎて最善の手を指し続けられない完全情報ゲーム、
次にどうすれば改善されて利益が上がるのか予測し辛いWebサイトやビジネスの戦略等です。
こういったものが相手として登場して初めて機械学習が出番になります。

とはいっても、基本的には一緒です。
偉い学者さんが作った公式を元にコードを起こせば機械学習プログラムの完成です。
TensorFlowに至ってはGoogleのサイトからSDKを落としてきてAPIを叩くだけです。
後は上記のスクリプトによる自動化の手法がまるっと使えます。


いかがでしたでしょうか?
この世界は解決を待っている魅力的な問題でいっぱいです。

是非身近で(未来の自分から見て)無駄なモノを見つけて自動化することに取り組んでみてください。
その過程でわけも分からず打ち込んでいたコマンドの本当の意味や、オプションの使い方がわかります。

興味のある機械学習を使いこなす土台作りと平行しつつ、本業の腕もメキメキ上達することでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+5

個人としてはあまり成長している気がせず、あまり面白さを感じなくなってきてしまいました。 

練習ばかりでは、面白くないのかもしれません。本職がNWエンジニアなのであれば、本職に近いところで実用的なツールを作ってみたりするのはどうでしょう。たとえば、

  • いつもはEXCELでやっているような設計処理や性能解析処理を Java でやってみる
  • ネットワーク機器に自動的にログインして設定変更するプログラムを作ってみる
  • ネットワーク機器のログを解析して、機械学習的なことをしてみる

プログラミングが面白いと感じられるタイミングは2つあって、難しいデバッグ(自分のバグではなく、使ってるライブラリやミドルウェアが思うとおり動かないときなど)を克服したときの達成感と便利そうなものが完成したときの愉快感だと思います。
練習だと難しいデバッグにならないですし、便利そうなものにもならないので面白くないのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

何か困ったことや問題があってそれをプログラムで解決していくと、達成感が出てきます。
また、便利なプログラムを開発して世の中に少しでも役立てるようにと公開しても良いかもしれません。
公開する場は今ではたくさんあります。使用者からのコメントやバグレポートなどを通じて技量も上がっていくと思います。

何か目標を立ててやっているとそれについての情報などが目に飛び込んで来るようになります。漫然とやっているとなかなか難しいとお思います。

例えば業務上においても、ExcelやWordなどを使って色々とやていると思いますが、それらの一部が自動化されたら業務効率の向上に繋がったりすることは無いでしょうか?そういうものをプログラムで解決していくという方法もあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

プログラミングは実際の問題や課題を解決して役立ててこそ面白いしやりがいもあるので、実務や趣味でもいいので自分のプログラムが使われるような環境を作りましょう。  
あと、自分の書いたプログラムや他人の書いたプログラムについてディスカッションできる場があると色々な視点を得られて理解や目標の幅が広がると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る