プログラミングの方法がまだわかりませんか?


122

さまざまなプログラミング言語、Java、Python、Cなどの本をたくさん読みました。言語の基本をすべて理解し、知っています。また、アルゴリズムとデータ構造を理解しています。(たとえば、2年間のコンピューターサイエンスクラスに相当)

しかし、私はまだ有用な何かをするプログラムを書く方法を理解できません。

プログラミングの本はすべて、言語の書き方を示していますが、使用方法は示していません!プログラミングの例はすべて、ライブラリやシンプルなゲームのカードカタログを作成したり、アルゴリズムを使用したりするなど、非常に基本的なものです。実際に役立つ何かを行う複雑なプログラムを開発する方法は示しません。

SourceForgeでオープンソースプログラムを見てきましたが、私にはあまり意味がありません。各プログラムには数百のファイルがあり、数千行のコードがあります。しかし、これを行う方法を学ぶにはどうすればよいですか?Amazonで購入できる本には、これらのプログラムを作成するためのツールを提供するものは何もありません。

Javaの概要、Pythonのプログラミング、Cプログラミング言語などを読んでから、実際にXプログラムのアイデアを思いついたと言えるようになるにはどうすればいいですか。これは私がそれを開発しようとしていますか?

本やクラスで学ぶよりも、プログラムの作成に深く関わっているようです。何かがあるように感じます。

どうすれば正しい軌道に乗せられますか?


52
一部の人々は、単にプログラムすることを意図していません。代替パスがあなたを整理するかどうか、または何か他のものを試す時が来たかどうか、あなただけが答えることができます。ここで役立つ答えを得ることはまずありません。
duffymo

3
「有用」とは何だと思いますか?

7
@Michael-私は、オフトピックとして投票し、P.SEに移行しました。私はそれが、キャリアと工芸としてのプログラミングについての議論のためのより適切な場所になると思いました。

12
@duffymo:また、一部の人々は質問にコメントするつもりはありません。
davidk01

4
私はあなたがあまりにも長い飛躍を取っていると思います。本の例から本格的なSourceforgeプロジェクトに移行することは広大で困難です。代わりに、すでに構築したものを拡張してみてください。機能の追加、GUIの追加、ネットワーク機能の追加。そしてまもなく、Sourceforgeであなた自身のプロジェクトができると思います。
ギャブリン

回答:


93

より複雑なプログラムの構築には経験が必要です。最初にプログラムを作成したとき、25行以上の長さであればうまくいくと思いました(そしてスクロールバーを使用しなければなりませんでした)。

このページが面白いと思うかもしれません。「10年でプログラミングを教える」http://norvig.com/21-days.html

ところで:プログラムを開始するのは非常に難しいです。作家はそれを「作家ブロック」と呼ぶかもしれません。代わりに、コードを書き始めて改善することをお勧めします。必要な処理を行わない大きなセクションを削除することを恐れないでください。もう一度始めましょう。今回は、あなたが何をしているかについてのより良い考えを書いてみましょう。もう一度起動すると、前回書いたものの半分は必要ないことがわかります。著者が物語を書くとき、それは長い時間、多くの書き込みと書き直しなどを必要とします。多くのレビューとフィードバックがあり、それが公開(リリース)されなければならないときだけ終了します


13
+1ビルが言ったことと、「作家のブロック」について議論したことに対して。
デイヴィッドワイザー

ガウド、私はこれを数年(10 + -2)やっていますが、それでも時々時々たくさんのコードを書いて、それを削除してしまいます。私は数日間「ソースリファクタリングを介して」取り組んだ「リファクタリング」をいくつか行いました。
ケンヘンダーソン

5
ストーリーを書くことに例えると+1。私のプログラムはまだ「昔々...」の段階にあります。
アンディ

4
プログラミングに関する最も恐ろしいことの1つは、空のドキュメントです。そのハードルを超えると、順調に進歩しました。
ギャブリン

1
作家のブロック。そこに釘付けしました!
アベル

70

SourceForgeやGitHubで見られるような非常に大きなプロジェクトにも常に圧倒されました。何千、何千行ものコードで、何十、何百ものファイルで何が起こっているのか、誰が、あるいはチームでさえ理解できるのだろうかと思いました。

誰もしない。少なくとも最初は。

プロジェクトは有機的なものです。本当にシンプルなアイデアとして始まったものは、すぐに巨大な作品に拡大することができます。これが、古典的なウォーターフォールアプローチではなく、反復開発の主な理由だと思います。

車を作ることを考えてください。外からはかなり単純に見えますが、ごくわずかな方法ででも、検討する必要がある膨大な数の考慮事項、トレードオフ、および無害なケースがあることを発見します。

例:

半大規模プロジェクトの場合、多くの場合、小規模から始まります。「キャッシュサーバーを構築したい」。そのため、数日かけてハッキングし、機能するものに到達しますが、劇的に改善される可能性があります。そこで、スレッド化の概念を追加します。

次に、そのスレッドによる同時実行の問題が発生します。したがって、並行データ構造に変更することで修正します。

現在、プロセスは遅くなっています。したがって、並行データ構造を通常の構造に変更しますが、同期のためのロックメカニズムを提供します。

ユーザーは操作がアトミックではなく、データが破損していると不平を言うことを除いて、すべてが正常に実行されているようです。

したがって、増分や保存などのいくつかの古典的なアトミック操作を追加します。これは機能し、ユーザーは満足しています。しかし、誰かがチケットを開いて、リスト操作を実行できるかどうかを尋ねます。

そのため、その機能を組み込むのに1週間か2週間費やします。この頃、友人があなたを助けることにします。一緒に作業し、完了し、リリースします。

2つのチケットが開きます。リスト処理にはバグがあり、デッドロックを引き起こすまれなケースがいくつかあります。

デッドロックに取り組む間、あなたの友人はリスト処理バグに取り組んでいます。アトミック操作へのかなり重要な書き直しが必要であることに気付きます。

...そしてそれは行く。

これは、プロジェクトがどのように成長するかを表す非常に典型的なものです。数週間で10個程度のファイルが20個に増えました。元の計画とは別の新しい機能が追加されました。複雑なバグ修正が追加され、コードが不自然に大きくなります。

私のアドバイス:

圧倒されることはありません。アイデアがある場合は、機能の一部を実装します。その後追求する価値がある場合は、少しずつ追加します。プロジェクトを自然に成長させます。


はい、それは...それは個人的な経験から来たほとんどのようなものだ
NickAldwin

@Nick、「Y」と「Z」の機能を備えたプロジェクト「X」で私たち全員が同様の経験をしていませんか?昨年中に同様のプロジェクトが2つありました。どちらもRedis = Pではありませんでした
ジョシュスミートン

これは私が書いたほぼすべてのプログラムを説明しています。
ティムポスト

だからそうなるのです。カート・ヴォネガットは、コンピュータプログラミング満たしている
ズート・

1
優れた例ですが、少し小さく始めることができた場合は、さらに改善されていました。たとえば、いくつかのデータ構造の構築から始め、次にこれらのデータ構造のAPIを提供するコード、このAPIを使用してキャッシュ機能を実装するコード、最後にこの上にGUIを作成します。Voilá、キャッシュサーバーを作成しました!
ギャブリン

28

最大のプログラムでさえアイデアから始まり、一度に1行ずつ記述されます。

実際のプログラムを書く方法を学ぶための最良の(おそらく唯一の)方法は、それを始めることです。問題が発生した場合、Webを検索するか、ここでそれらの問題の解決策を求めます。最終的には、経験を積むことができ、あまり頻繁に尋ねる必要がなくなります。

ただし、最初から注意すべき点がいくつかあります。

  • 最近では、大規模なアプリケーションが完全にゼロから作成されることはほとんどありません。既存の高品質のライブラリとフレームワークを使用すれば、はるかに短時間でより多くの作業を完了できます。これらを使い始めることは、自分でやるよりもかなりイライラし、多くの作業を感じることがよくありますが、それはほとんど本当ではありません。
  • プログラムが大きくなったら、プログラムの構造(設計方法)について慎重に考えることが非常に重要です。それについて少し時間を割いて、設計(特に「クリーンコード」をお勧めします)とソフトウェアエンジニアリング、および技術的な基礎についての本を読んでください。

6
「現実世界のプログラムを書く方法を学ぶための最良の(おそらく唯一の)方法は、それを始めることです。」多かれ少なかれ私が言うこととして。読むことができるのは、「基本を理解する」ことだけです...ゴムはどこかに道を踏み出さなければなりません。
WernerCD

1
「やり始めてください」の行に+1。本から経験を学ぶことはできません。
riwalk

本「Clean Code」に言及した場合は+1。常にコードを読み取り可能にする必要があります。読みやすい==わかりやすい==簡単に変更
イゴールポポフ

15

あなたが話しているのは、プログラミングよりもソフトウェア工学です。それは少しアーキテクチャであり、少し「ベストプラクティス」と「デザインパターン」であり、他の人と少し働いています。役立つ本はありますが、そのほとんどは経験に基づいています。Microsoft Wordのように、誰も執筆を始めません。

あなたが書きたいと思う大きな「本物の」プログラムについて考えてください。次に、必要な方法で機能させるために構築する必要があるさまざまな要素について考えます。たとえば、現代の一人称ゲームでは、3Dグラフィックエンジン、非プレイヤーキャラクターAI、音楽/サウンドモジュール、物理エンジン、およびゲームのルールを強制するトップレベルモジュールが必要です(知っている「マップ」、さまざまなキャラクターの相互作用など)。そして、アートワーク、キャラクターデザイン、音楽があります。いずれもコードではありませんが、ゲームを完成させるために必要なものです。

さて、これらのうちどれを自分で構築し、他のどこで取得しますか?ほとんどの大規模なソフトウェアプロジェクトは、ゼロからプログラムされていません。おそらく、市販の3Dエンジンと音楽/サウンドモジュールを使用して、ゲームをユニークにするものだけをプログラムするでしょう。それでは、使用するサードパーティモジュールを把握する必要があります。これには、コスト、使用する言語、使用する機能、APIの設計方法(完成度など)が含まれます。それはあなたの個人的なプログラミングスタイルなどにどれだけうまく適合しているかなどです)。さまざまなサードパーティモジュールの候補を1つまたは2つ使用して、「概念実証」を作成するか、プログラムをテストして、必要なすべてのことを実行し、使いやすいことを確認します。

また、自分で書きたいコードでさえ、自分だけが考えている時間枠で完了するには仕事が大きすぎるかもしれません。他に何人のプログラマーがプロジェクトに取り組む必要がありますか?どのように仕事を分割しますか?さまざまなモジュールがどのように設計されていて、それらが異なる人によって書かれたとしても、それらがすべて一緒に収まるように設計されますか?お互いの変更を一掃することなく、同じソースコードですべての作業を行う方法(回答:バージョン管理。単独で作業しているときは非常に便利ですが、他の人と作業するときは不可欠です)。

社内で作成するモジュールを決定したら、同じプロセスを実行します。各モジュールの断片、それらがどのように組み合わされるべきか、そしてあなたが自分で書いて、他のどこで手に入れるかを考えてください。それぞれのピースがあなたが心に留めるのに十分な小ささになるまで、物事を分解し続け、あなたが「はい、私はそれを書くことができます!」そして、そうします。あなたがそうするように、あなたはあなたのプログラムの様々な部分がどのように適合するかについて予期せぬ障害に遭遇するでしょう。これらはいらいらしますが、あなたのクラフトについてもっと学ぶ機会であり、そのように見られるべきです。

最初は、プログラムのごく一部(たとえば、個々の機能)を念頭に置いておくことができるため、コーディングを開始する前に多くのことを分解する必要があります。経験を積むと関数について考える必要がなく関数について考える必要がなくなり、オブジェクトについて考えるようになります。そして、あなたは考えるだろうオブジェクトや思考について、より大きなモジュール。最後に、あなたが考えているだろうモジュールや思考についての全体、大規模な、実際のプログラム。

そして、あなたはまだ学ぶべきことがたくさんあることを発見するでしょう...しかし、それは行きます。プログラマーとして学習をやめると、あなたは時代遅れになり、新しいモデルに置き換えられます。

とにかく、怖がらないでください、そして、これが聞こえるかどうか心配しないでください...ひどくまたは不可能であり、結局プログラマーになりたくないのです。それは皆のためではありません。私は音楽とデザートが大好きで、鍵を少し弾いて料理を作ることもできますが、素晴らしいミュージシャンやマスターシェフになるのにかかる時間を費やすつもりはありません。

大規模で実際のデスクトップアプリケーションを作成するプログラマになりたくない場合は、他の種類のプログラミングジョブがあります。たとえば、組み込みプログラマになることができます。組み込みプログラムの作成には明確で興味深い課題があり、有用な作業を行っていますが、通常、プログラムはデスクトップアプリケーションよりもかなり小さくなっています。または、Webアプリケーションを作成することもできます。Web上では、少しの機能を簡単に接着することができるため、Webコメントシステムを作成することができます(Webアプリケーション全体ではない場合でも便利です)。Web上のものも少しずつ改善するのは簡単なので、基本的なWebメールクライアントから始めて、時間の経過とともにGmailのようなものに進化させることができます。(ただし、Gmailと競合するため、そうしないでください。)

プログラマーになりたくないが、それでもコンピューターで作業したい場合は、ITまたは他の技術分野に進むことができます。これらの場合、あなたが既にしているのと同じくらい多くのプログラミングを知ることは非常に便利です。なぜなら、あなたの仲間はそれほど多くないかもしれないからです。または、それが魅力的であればミュージシャンになります。それは(ほとんどの分野と同様に)今日のコンピューターに関係しているからです。オーディオまたはMIDIファイルをさまざまな巧妙な方法で操作する小さなプログラムを作成して、より優れたミュージシャンにしましょう。あなたが持っているどんなプログラミングスキルでも、あなたの仕事をより良くするために多くの分野に適用できることがわかります。


埋め込みプログラムが通常デスクトップアプリよりも小さいことに同意しません。過去にもそうだったかもしれませんが、私は数百人年以上の開発を必要とするいくつかの組み込み製品に取り組んできましたが、これらは特に大きいとは見なされませんでした。
バートヴァンインゲンシェナウ

1
「埋め込み」の意味に依存すると思います。スマートフォンや統合された自動車システムのようなものを意味するなら、私はあなたの100人年を信じることができます。ただし、そのスペースにはまだ小さなシステムがたくさんあります。
キンダル

+1は、小さなことについて考えてから、同じことを考え大きなものについて考えるようになったためです。
ギャブリン

1
Gmailと競合することの害は何ですか?あなたが独力で書いたものが実際にGoogleがリリースしたものと競合できるなら、あなたは自分をかなり気の良いプログラマーと考えることができます。
ギャブリン

主な理由は、GMailがWebメールを解決したと考えるからです。ほとんどのプログラマーは、他の人によってすでに解決された(そしてうまく解決された)問題に取り組むことをあまりおもしろいとは思いません。たぶん、まだ解決されていない問題を見つけてもっと楽しくすることができます-そして、800ポンドのゴリラと競争することなく、潜在的にそれを市場に出すことができます。
キンダル

9

実際のタスクに直面しない限り、プログラミングの方法はわかりません。単純な実世界のタスクを置き換える理論はありません。rwシナリオで作業を開始する前に、すべての例を含む本をたくさん読んでいたが、実際の問題に直面したとき、タスクを完了するために理論的な知識をすべて集めることができなかった。初心者の場合は、どこからでもタスクを取得することをお勧めします。あなたがそれらを解決しない限り、それらが役に立たないとは思わないでください。最初のステップとして、リンクリストの並べ替え、ツリー、グラフでのDFS、BFSの実行などのデータ構造の問題を解決してみてください。コーディングスキルが向上するだけでなく、さらに重要なことは、分析スキルとアルゴリズムスキルが向上することです、私を信頼することは貴重な知識です。その後、ポインター、再帰、

一番下の行。練習がすべてです。ただ掘り続けて、コード、コード、コード。


7

誰もがやったように、コンピューターゲームから始めましょう。優れたゲームはプログラミングと設計の両方の課題であり、内部構造について慎重に考える必要があり、多くを教える方法でシステムライブラリを使用しますが、物事を壊す傾向がなく、「良い結果をもたらす正当な理由」を必要としません実際の「有用な」ソフトウェアのように。

一般的なルールは、十分なものを書いた後、何らかの種類の啓発が不可避的に起こることです。

(Cのように感じる場合)始める良い点はhttp://gamedev.net/、特にhttp://nehe.gamedev.net/です。開始する他の多くの良い点もあります:D


4
(ああ、私はちょうどみんながゲームで始まる理由に気付きました。光沢があり、きれいなものがやる気になります。)

10
みなさん?大胆な主張。

4
私はゲームから始めませんでした。複雑な= Pを超えて
ジョシュスミートン

4
最近のほとんどの人は、エントリーの障壁がはるかに低いwebappから始まります(単なるテキストです)。
スリーブマン

4
あなたの最初のコメントは、おそらくあなたの答えよりも優れていた- 光沢のあるきれいなものがやる気にされます。それが重要です。
Scorchio

6

あなたは全体の巨大なプログラムを見ているとそれは不可能のようです。しかし、全体は、あなたが「有用なことは何もしない」と言っているような小さな愚かなプログラムで構成されています。

必要なのは、巨大で複雑なタスクを小さなシンプルなタスクに分解する経験です。それがすべてのプログラミングのルートです。残りは単なるセマンティクスです。


6

運転や料理と同じように、プログラミングはあなたがすることで学べることです。実践はかけがえのないものです。

教科書の例がすでに基本的すぎる場合、それは素晴らしいことです!より複雑な何かのために動く時間-そして、あなたはすでにあなた自身のためにいくつかの挑戦的なエクササイズを理解することができます。

または、特定のアイデアを念頭に置いている場合は、それを少しずつ壊してください。最初に問題の小さなサブセットを解決します。次に展開します。新しいコードを既存のコードに統合することが困難になると、すべてを再設計します。


5

200行のスクリプトを作成します。その後、改善を開始します。

Featuritisを使用すると、すぐに100個のソースファイルと数百個のKLOCにアクセスできます。


5

「彼らは実際に何か役に立つことをする複雑なプログラムを開発する方法を教えてくれません!」

「有用」の定義がなければ、「正しい」軌道に乗せるためにできることはほとんどありません。

あなたがどのように失敗しているか、何が間違っているのかはわかりません。どのトラックを使用しているのかわかりません。

どういうわけか、あなたはあなたの頭の中にあなたがコミュニケーションしていないという概念を持っています。

ソフトウェア-プログラミング-は、すべての言語(Python、Java、英語など)に頭の中から概念を取り入れることです。

プログラミング(および質問)における重要なステップの1つは、用語を定義することです。「何か役に立つこと」とはどういう意味ですか?非常に明確で、完全で、非常に正確であること。


投票して、このトピックでのOPの答えに本当に興味があります。
Scorchio

5

始め方など、この質問はいつも聞かれます。本当に簡単です。これがステップバイステップです。

  1. アイデアを思いつきます。あなたはすでにそれを持っているように聞こえます。
  2. あなたのアイデアをその基本的な核に単純化します-あなたが取り組むことができるかもしれないと思う何か
  3. 紙やナプキンなど、何でもUIをレイアウトします。
  4. 開発環境でUIを試してレイアウトしてください。
  5. google、google、googleで問題が発生した場合は、stackoverflowで質問してください。インターネットリソースから生きているがらくたを使って助けを求めてください。プログラマーである友人や同僚に、特定の状況での支援を依頼してください。手順4に戻ります。
  6. アプリケーションのロジックの作成を開始します。問題が発生した場合は、前の手順に戻ってやり直してください。
  7. すぐに、何かがすぐに機能するようになります。

ワークフローの+1-何らかの形で機能するはずです。2番目のステップがどれほど重要かはわかりません。たぶんそれはあなたがタスクを処理できるかどうかを決定するステップです。
Scorchio

「あなたはすでにそれを持っているように聞こえます。」私はそれを争うだろう。アイデアがあった場合、それは質問の一部になります。
S.Lott

実際には、アプリのロジックを記述してからUIを追加する必要があります。もっと簡単です。
CaffGeek

あなたが使用するツール/アプリケーションを考えることができれば、それはさらに良いでしょう。廃棄プロジェクトはやる気をそぐことができます。それが何であれ、小さく始めてそこから構築します。コマンドラインツールをお勧めします。
カルロスフォッカー

1
@Chad私はあなたに同意しません。初心者にとっては、ロジックは抽象的ですが、UIは簡単に把握できます。その逆には経験が必要です。
AngryHacker

4

小さなものを作成します。気にしないでください、あなたのプログラムはそれをする1000番目になるでしょう。

いくつかのアイデア:

  • 時計(最初にデジタル、次にアナログの外観)、
  • 自動陰唇クリエーター、
  • ディレクトリ構造表示、
  • mp3アルバムリスター、

プラットフォームを選択すると、ツールはタスクの一部です。


私は実際にあなたに原則的に同意します。しかし、OPは有用なソフトウェアについて尋ねています。mp3アルバムリスターは良い選択です。彼はプロジェクトが直面する困難を経験するので、基本的なmp3プレーヤーの方が良いでしょう。LOCを含む。
ジョシュスミートン

@ Josh、mp3デコードは初心者のプログラマーにとって適切な方法です。

@Thor、絶対に簡単ではありません。しかし、それは有用であり、プログラムが非常に大きくなる方法を非常に迅速に教えます。すべてのニュアンス、バグ修正、エッジケース。この特定のケースでは適切ではないかもしれませんが、一般的には適切です。自分で作成したソフトウェアを自分で使用できることは素晴らしいことです。
ジョシュスミートン

@ジョシュ、私はまだMP3デコーダーが小さなもので、この目的に適しているとは思わない。

3

では、有用なことを行うプログラムXのアイデアから始めましょう。

  • 紙、マインドマッピング、または作図ソフトウェアを使用して、プログラムの論理的なフローをレイアウトします。

  • 開始したばかりなので、それらのアイテムの1つ(できれば先頭近く)を選択し、さらに細分化してください。

  • そのためのコードを最初に記述し、それを使用して構築します

プログラムXは、ファイルを開いて操作し、出力ファイルを作成する必要がありますか?最初のステップとして、ファイルを開いてエコーできるかどうかを確認します。素敵なユーザーインターフェイスが必要ですか?ファイルエコープログラムなどを実行できるものを構築します。複雑なプログラムで使用できるコードを段階的に構築するだけでなく、情報を検索および検索する必要があるため、言語知識も構築します。

sayingにあるように-Gnomeは1日で構築されませんでした:-)


3

(上記のコメントで既に回答済み。質問を再度開いた後、これを回答として送信することをお勧めします。)

どんなに複雑だと思っても、あなたは解決したい問題から始めます。次に、この問題を取り上げ、それを書き留めて、小さな問題に分け始めます。次に、これらの小さな問題などを、解決方法をすでに知っているか、または何らかの努力でそれを行うことができるプリミティブになるまで、分解します。これらの各部分のコーディングを開始し、それらを異なる機能または異なるクラスなどに編成します。

次に、次のサブ問題に取り組みます。各問題に取り組んでいるときに、小さなテストケースを作成し、実際に成果が上がるのを確認できます。途中で常に課題がありますが、決してアプローチすることさえできないほど巨大なものと見なされることはありません(現在対処しているように思われます)。これは、プログラミングと多くの人生の課題に当てはまります。彼らの鍵はそれを解体することです。

何をすべきか-アイデア。何か新しいものを発明しようとすることもできますが、あなたが情熱を持って既に存在しているかもしれないものを取り入れることもできますが、それをもっと良くしたり、単に違うものにしたりすることさえできます。現在、暇なときにAndroid用のギターチューナーアプリを書いています。他の多くのギターチューナーアプリが既に存在することは知っていますが、これは楽しくてやりがいのあるプロジェクトになると思い、それを引き受けました。最初はほとんど不可能に思えましたが、問題を小さなステップに分割した後、実際にうまくまとめられています。分割して征服し、目標を堅持します。


3

あなたが初心者であるときに最も難しいことの1つは、「どのように改善できますか」-運動があなたの現在のレベルで何を含むべきかについて現実的な目標を設定することです。

与えられた仕様に従ってプログラムを完成させる能力は、生計を立てるすべての人にとって非常に貴重なものだからです。

http://projecteuler.net/をよくご覧になることをお勧めします。http://projecteuler.net/には、多くの演習と自動化された「回答の確認」システムがあり、自分のペースで作業できます。エクササイズの内容はわかりやすいですが、考える必要があります。よく考える必要がある人もいますが、それを解決できなかったとしても、何か役に立つことを教えてくれます。

問題1の完全な文言は次のとおりです。

3または5の倍数である10未満のすべての自然数をリストすると、3、5、6、および9が得られます。これらの倍数の合計は23です。

1000未満の3または5のすべての倍数の合計を見つけます。

これを解決できると思いますか?じゃやれ!


3

実世界での経験が必要です!! 。本はあなたにそれを教えることができません!

あなたはより良いそれを行うことができると思うし、どのようにそれを改善する方法(コードやコーダーの両方)、それらを嫌いにどのように、それを維持するためにどのように、他人のコードを読む方法を学び、数ヵ月後に大声で叫ぶする必要があり、私は」このコードを書いた人を殺してやる!!! ソースバージョン管理で見つけるのはあなただけでした!

本は非常に具体的であり、ソフトウェアの開発方法をすでに知っている人にとっては時々理解する必要があります。

プログラミングの仕事を見つけることをお勧めします。必要に応じて、最も基本的なエントリーレベルに申し込んでください。おそらくあなたはあなたが値すると思うほど稼ぐことはありませんが、実際の世界でソフトウェアがどのように開発されているかを学ぶために数ヶ月を使用してください、多くの場合、どこで作業するかによってコードの品質が非常に低くなりますが、それは経験の一部です)

本を読み続けると、同じトピックを毎年少しずつ(または異なる方法で)理解できることがわかります。

才能のある開発者と一緒に仕事をすることができれば、はるかに優れています。彼らから学び、間違いをすることを恐れないでください。

最初のライブプロダクションの緊急のバグを修正する必要があるまで、ソフトウェアのバグが何なのかわかりません!

:)


2

オープンソースプロジェクトを試してみて、収まるかどうかを確認してください。ソースをダウンロードして、チケットを手に入れることができるかどうかを確認してください


15
初心者プログラマは、オープンソースプロジェクトに参加しようとしないでください。あなたがなり、単純な方法で取得します。オープンソースプロジェクトは、家庭教師の初心者にはありません。

直接関与する代わりに、プロジェクトのソースをフォークし、自分のブランチでチケットを試して修正し、そのままそのままにしておくことです。複数の人が書いてレビューしたコードを読むことの価値、きちんと編成されたプロジェクト構造、そしてあなた自身の作品のテンプレートとして機能することができ、コラボレーションプロセスの仕組みを理解することはたくさんあります。公共の部分を観察し、コードを個人的にいじるだけです。
jellyfishtree

3
@jellyfishtree、あなたが少し野心的かもしれないそれをプログラムできない場合。

@Thorbjornは間違いありませんが、それは私が最初に始めたときにもっとや​​りたかったことです。何でもそうですが、最初に浸透と潜水だけで多くを学ぶと思います。少なくとも、あなたが知らない/理解していないもののより良い尺度を得るでしょう-あなたが最初に目標を設定し、何に向けて取り組むべきかを知りたいと思っているときにはるかに貴重なもの。
jellyfishtree

@jellyfish、確かに、私はそれが取るべき良い一歩であると確信していますが、この場合はまだです。

2

新しい言語を学びたいときは、通常、フラクタルグラフを実装しようとします。そうすれば、機能するかどうかについてすぐにフィードバックが得られ、非常にやりがいがあります。また、フラクタルを改善する方法はたくさんあります。マンデルブロの素朴な実装は非常に遅いです。

それはあまり有用ではありませんが、あなたは多くを学び、見るのは美しいです。


私はこれが好きです-新しい言語を学ぶための非常に詩的な方法。しかし、私はこれを初心者に勧めるべきかどうかわかりません:D
Scorchio

2

プログラミングとは、大量のコードを書くことではなく、問題解決とコミュニケーションに関するものです。コードは単に必要なものであり、通常はより多くのコードではなく、より少ないコードを記述するようにしてください。

どこから始めればよいかわからない場合は、問題はないかもしれません!

Linuxや他のUnixライクなシステムを見てください。それらはすべて、たった1つのこと実行するだけでなく、それをうまく実行する多くの小さなアプリケーションで構成されています

コンピューターのフォルダーで最大のファイルを10個見つけるためのスクリプトが必要なとき、本を読んでいませんでした。私はグーグルで検索して、既存のソリューションの1つを使用しました。コードを書きましたか?-いいえ。問題は解決しましたか?- はい。この1行のプログラムは便利ですか?-そうそう。

通常、数千行のコードを含むプログラムは、複数のプログラマーによって作成されます。オペレーティングシステム全体を単独で作成することはできず、その必要もありません。また、バージョン管理単体テストなどのチートもよく使用します


バージョン管理と単体テストを「チート」として言及しないでください。作業のバックアップを作成し、それを使用することが必要です。バージョン管理は正気を保つのに役立ちます。単体テストについても同じです。1行のコードを書いた人は誰でも、いくつかのテストを実行する必要があることを知っています。
Scorchio

@Scorchio私は、バージョン管理と単体テストを使用することで、それらを使用しない(十分な)人よりも有利であることを意味しました。特に大規模なプロジェクトを扱う場合。
kolobos


2

プログラミングを始めたとき、コンピューターゲームが大好きでした。そのため、手元にツールがあればすぐに自分のゲームを書き始めました。

当然のことながら、私の最初のゲームはテキストアドベンチャーでした。同様に、クイズなどから始めることも、何らかの推測ゲームから始めることもできます。

また、スロットマシンのようなものから始めることもできます(実際にアニメーションや写真さえ必要ありません。A=リンゴ、L =レモン、S =開始、P =プラムなどを使用してください)。

これにより、ユーザー入力を処理し、ゲームの状態を維持し、それに応じて出力を生成する基本を学びます。

私はこの道をかなり進んだ。キーボードの状態を読み取る方法、またはマウス、グラフィックコードの使用方法を徐々に学びました。私は言語自体についてもっと学び(PASCALから始めました)、これを使って既存のゲームを強化したり、何か新しいことを始めたりしました。

プログラミングを学ぶのにゲームは本当に素晴らしいと思います。わずかな経験でも、小さなものを作成して、小さな誇りを感じることができます。何かを作成するので、それは楽しいです。実際のアプリケーションを作成するのは非常に無意味です。なぜなら、何かを作成するのに多くの作業が必要であり、それが実際に有用であるのに対して、驚くほど簡単で、小さなゲームを作成すると中毒性が出るからです。

実際に教育用の言語を使用したいかもしれません(私の場合、これはPASCALであり、回顧では、かなり良い選択であることが証明されたと思います)。それらの多くは、特にゲームの作成などを目的としています。

アプリケーションの作成は、単にアルゴリズムを作成するだけではありません。機能を設計する必要があります。コードをさまざまなレイヤーとモジュールに整理して構造化する必要があります。大学で与えられたかなり「アトミックな」問題とは異なり、アプリケーションは段階的に開発するのが最適な場合があります。何かから始めて、その上に物を追加します。そのため、(ウィキペディアの記事にリストされているいくつかの言語の場合のように)既に何かを始めているので、多くのフラストレーションを省き、すぐに何かを作成し始めます。(私の同僚は、quake 2 modを書くことでプログラミングを始めました)。ある時点で、これらの使いやすいツールの制限を見つけるようになりますが、それまでは、より多くの洞察と理解が得られます。おそらく十分な、


2

大学では、基本的にこのランプを教えたプログラミング実習と呼ばれるクラスがありました。初期の段階では、基本的なショッピングアプリケーションのUIが提供され、バックエンドをコーディングする必要がありました。先月はゼロからのテトリスでした。小学生から大学生へのランプアップは非常に難しいため、クラスを再受講しない新入生の約50%が失敗したと思います。

次の1つ以上をお勧めします。

  • オープンソースプロジェクトをダウンロードして、何かを追加します。有用である必要はありませんが、構造を確認する必要があります。これにより、プロジェクトがどれだけ大規模に構築されているかの感覚が得られます。

  • 依存関係の矢印を使用して、最終プロジェクトを紙の上で設計するだけです。ヘビを作っている場合、ヘビの頭、ヘビの尾、食べ物、空きスペース、壁、ボード、現在の方向などがあるかもしれません。あなたのプロジェクトがあなたが思っているよりもはるかに大きい場合、あなたは気付くかもしれません。

  • 基本的なプロジェクトを取り、それをより大きくします。おそらく多くのリファクタリングを行うでしょう。そして、簡単に追加できる小さなプロジェクトを作成する方法を学ぶことを願っています。

  • 誰かが経験を積んでいることがわかっている場合は、プロジェクトのアイデアを伝え、クラスといくつかの重要なメソッドを書いてもらうと、おそらく1時間ほどかかります。そうすれば、メソッドに入力するだけで、次に何をする必要があるかを常に把握できます。

最後に、何をするにしても、おそらく基本的なMVC(モデル、ビュー、コントローラー)デザインパターンを使用する必要があります。詳細を説明することなく、ビュー(UI)を1+クラスに、コントローラー(入力、出力など)を1+クラスに、モデル(論理、データ、基本的にその他すべて)をいくつかのクラスに入れます。これは、基本的な組織を取得する簡単な方法です。

このステップは難しいことを忘れないでください。一部の人々は単にプログラムできないことは事実ですが、おそらくこの段階で立ち往生しています。幸運を!


2

まず、クラスを受講し、参考資料を読み、オープンソースプロジェクトを見て、質問に興味を持ち続けることによって、あなたはすでに前提条件を満たしています。これは、人が自分の脚の仕事をする前に個人的に同様の質問に出くわしたためです(具体的には、クラスを迂回し、ショートカットを取ることを望んでいる個人)。さて、チューリングマシンについての研究室があったときと、当時は実際のプログラミングではないと感じていたときのことを振り返ります。これらは、ショートカットを取っている人がスキップしているというあなたが続ける経験です。

  • 学生プロジェクトにサインアップします。私は(CSUA)志を同じくする学生のグループに参加して、私の4年生のカーニバルブースのゲームを構築しました。引き続き楽しんで、関与を拡大したいと考えている場合は、リソースを実際に活用してください。プロジェクトについて調べ、クラスメート、教授と話をして、インターンシップに参加します。

  • 経験豊富なプログラマーと一緒に座ってください。本当に感動的な他の人のプログラムを見たとき、私の歴史の中で約3回ありました。彼らにとって、彼らはただコードを書いて大声で考えていました。誇張する必要はありません。自分で何年も聞くよりも、彼らの話を聞くことに夢中になっているように感じました。もっと出会うと、あなたはずっと豊かになります。ビデオを視聴したり、完全なソースリポジトリを調べたり、膨大な知識のオンラインストアを瞬時に検索したりできる時代になれたことは幸運です。これは、対面での体験に代わるものではありませんが、メンターがいない場合、従来の素材よりも劇的に改善されます。ただし、他の人が生のコードを単独で調べても、何も得られない場合があります。何かを念頭に置き、ロジックにステップインするための優れたデバッガーが必要になります。私の一番好きな瞬間の1つは、Quake MODを作成することでした。記憶に残るものは、MOD自体ではありませんでした。カーマックのゲーム内ロジックを見ていた。modは私が飛び込む理由にすぎませんでした。

  • ラボパートナーが提示した質問の説明と回答の練習。教えるのを助けるボランティア。おそらく研究グループを形成し、各メンバーがクラスのトピックの専門家になることを要求します。それからその人を焼いて、彼らに焼いてもらいます。質問への回答を余儀なくされた場合、回答を自分で学ぶ必要があります。概念を他の人に明確に説明できると、自分の理解を深め、本や自分の考えの外でそれを伝えることができるようになります。

  • 最後に、難しい方法を学ぶことを恐れないでください、手を汚し、間違いを犯します。これは経験とも呼ばれます。扱いにくいコードベースと多数のファイル数を伴うプロジェクトに関する質問に関するより実用的な例として、この演習を行います。作業には単一のファイルを使用します。本当に私は冗談ではありません。このまったく同じ質問が実際に私の現在および以前の会社で出てきました。ここで別の開発者は、クラスごとに1つのファイルを保持することを好むことに気付きました。これは彼にとって異質であるように思われ、関連する問題で、彼は部分クラスも好きではありませんでした。したがって、ロジックを個別のファイルに分割するのが適切なタイミングまたは場所を把握する1つの方法は、単一のファイルから始めることです。複雑さを増すことを期待して、複数のプロジェクトで1つのファイルルールを実践したら、1つのファイルに非常に多くのクラスがあるプロジェクトに遭遇する可能性があり、読みにくいか、バージョン管理のために共同作業が難しくなります。この時点で、別々のファイルを作成して、異なるクラスをグループ化します。好みに応じて、1つのファイル内のすべてのデータクラスが好きであると早期に判断できます。その後、おそらく後で、グループとしてのデータクラス間でも個別のファイルが好きであると決めるかもしれません。


+1いい答え。経験豊富なプログラマーと一緒に座っていることも、新しい人を始めようとするときに威圧する可能性があると言わざるを得ません。かなりの時間がかかっていたものを高速化する。しかし、人の種類に応じて、あなたはそのようなものであり、あなたの腹の中でその火の一部を明るくすることができます。お尻を蹴りたいようにあなたをプッシュ。
テランス

1

何かのプログラミングを始めるために素晴らしいアイデアを持っている必要はありません。簡単な部分から始めます。既に使用しているプログラムのように。それがどのように機能するかすでに知っているものを作ってみてください。問題に直面しているので、より早く学習できます。より多くの経験を積むと、プログラミング中の人生を楽にするプログラムの良いアイデア、または今まで考えたことのない何かをするための良いプログラムを得ることができます。私はJavaをほぼ1年間、他の言語を数年間プログラミングしています。本当にやりたかったことを始めるには時間がかかりました。私は自分の仕事を始めました。StackOverflowに感謝します。以前は知りませんでした。


1

たくさんの答えがありますので、すでに言われたことの多くを繰り返しても許しますが、ここに私の2セントがあります。

最初にアイデアを選びます。どんなアイデアでも結構です。単純なものはおそらく大規模なものよりも良いでしょう。プロジェクトは、その範囲内で急速に成長する傾向があります(クリープをフィーチャーと呼ぶものもあります)。

次に、プロジェクトのスケルトンを作成します。これには、少しのアーキテクチャと設計の知識が必要になります。最初に10回試してみると、間違いを犯すでしょう。適切なファイル構造と、システムの重要な部分を示す小さなコードのスケルトンを単純にレイアウトします。

VCSにスケルトンを保存します(これで毒を選んで、聖戦につながる場合はそのままにします)。VCSの使用を開始すると、小さな変更に常にVCSを使用することが2番目の性質になりますが、必ず開始してください。

ここで、システムにとって小さくても重要な機能を選択して作成します。すべてが完全にカプセル化されていること、および「システム」とともに進化する「最良の」設計を持っていることを確認することについて心配する必要はありません。機能するものを入手してください。また、いくつかの単体テストを取得すると、テストを定期的に実行する場合に、何かが壊れたときに何が起こったのかを確認できます。

システムを構築します。これは、自動化されたビルドシステムと継続的な統合を実現する良い機会でもあります。あなたが彼らが何であるかわからない場合、それを学んで試してみるか、あなた自身のリスクで続けるだけです。どちらの方法でも機能し続けます。

次に、別の機能を選択して、繰り返し、繰り返し、繰り返します。

うまくいったと思ったら、友人に見せてください。友人はプログラムの方法を知っている必要はなく、プログラムが何をしているのかを知る必要さえありません。1つは誰かに見せることに満足し、2つはシステムが何をするのかを正確に知るのに役立ちます。

自分が作ったものに非常に自信を持っているところまで来たら、それをオンラインでリリースし、フィードバックを試してみてください。リポジトリハブまたはプログラマーのサブレディットは、建設的な批判を提供する場合があります。CS / SE教授を探して見つけ、彼/彼女にそれを見てもらいます。たぶんプロのプログラマーに聞いてください。別のプログラマーの意見を聞いてください。

終了したら(おそらく前に)、最初に書いたコードが最近作成したコードよりもずっと悪いことに気付くでしょう。それは完全に自然であり、私たち全員に起こります。新しいプロジェクトを見つけて、何か新しいことを学ぶ必要があります。新しいテスト戦略や、サービス指向アーキテクチャの使用方法などです。


1

役立つ可能性のあるものは、鉛筆と紙でできることをプログラムに置き換えることができる、日々抱えている簡単な問題を考えることです。

これにより、ある程度の自動化を必要とするだけのかなり既知のソリューションで、比較的単純な問題が発生します。これは次のMS Word / WordPad / NotePadである必要はありません。あなたの(単純な)問題を解決する何か。

たとえば、新しい言語で作業するときに再実装し続ける問題は、単純なタイムキーパーアプリです。このアプリは、1日のさまざまなプロジェクトの請求可能時間を追跡するために使用されます。1日の途中でリブートを処理する方法や、リストからアイテムを追加/削除する方法など、小さな落とし穴がたくさんあるかなり単純なプログラム。


1

問題の一部は、あなたがプログラミングの本を読むとき、彼らがあなたに言語を教えるだけだということだと思います。彼らは、ほとんど何でもプログラムするためには、ライブラリーやSDKSなどのプログラミングにアクセスする必要があるとは言いません。残念ながら、言語を知るだけでは十分ではありません。


1

あなたの問題の原因は次のとおりだと思います。3.何を作成できるかわからない場合、何かをコーディングすることはできません。4.難易度の半分を知っている

  1. 理論によって言語を知っているということは、それを「話す」ことを意味しません。それは英語を読むことと話すことの違いです。また、ソースコードのコンパイル、リンク、編集に使用できる多数のさまざまなツールが頭を回転させます。

  2. プログラミング方法を学習するとき、ほとんどの場合、端末がテキストを入出力するために使用される場合、これはプログラミングを扱う最も簡単な方法であるためです。実際、プログラマーはライブラリ(Qtなど)、フレームワーク(djangoのようなもの)、その他のショートカットコードを使用して生産性を高めています。もちろん、独自のホイールを作成できると感じた場合は、それを再発明せずに、コンパイラー設計とカーネル設計に関する本を読んでください:これらには多くのことを学ぶ必要があります。技術の。

  3. 何かを発明する!もちろん、テキストエディタ、ゲームなどを実行できます。問題は、理由がわからない場合は実行しないことです。これらのプログラムは、考えているすべてが既に行われていると役に立たないでしょう。 。個人的には、フェイスブックのような分散型のp2pプロトコルをチャット、オフラインメッセージなどを1つにまとめてコーディングし、ワイヤレスの組み込みデバイスで使用できるようになることを夢見ています。インターネットは多くの可能性を提供します。それについて考えることを忘れないでください。

  4. 実際には、理論は実践するために必要ですが、それだけではありません。アルゴリズムとテクニックはプログラミング理論の一部ではありません。多くのパラダイムやコードを実行する他の「標準的な」方法があります。などなど


1

開始するスクリプト言語を選択できるかもしれません。私はC言語でプログラミングを始めました。私の意見では、C言語は簡単に使い始めることができますが、アルゴリズムとオペレーティングシステムに関する情報を知るには、さらに多くの時間が必要です。そして、私が運動するときはいつもDOS GUIを使用しているだけなので、気分が落ち込みます。

その後、ActionScriptという名前のスクリプト言語を選択して開始しました。スクリプト言語はオブジェクト指向言語であり、Flashムービーの動作を制御できます。スクリプト言語はtrace("HelloWorld")、ActionScriptで文字列を出力するのと同じように、問題の領域に近い作業を簡単に実行できます。また、プログラムが正常に機能しているかどうかを確認できる強力なIDEがあります。

つまり、プログラミングをすばやく開始したい場合は、スクリプト言語を選択するのが適切な場合があります:-)


1

仕様を書きます。プログラムで何をしたいですか?画面(UIベースのプログラムの場合)、ロジック、入出力など。妥当な時間内(1週間?1か月?)にできることだけに範囲を制限してください。

次にビルドします。仕様に固執し、仕様が必要とするものに従って機能するようにします。気を散らすものに出くわすことは確かです。特定の問題に直面したことがないので、研究をしなければなりませんが、構築したいものを構築します。これは、単に「作成」できるものを作成することとは異なります。

終了したら、コードをリファクタリングし、より効率的にするようにしてください。その後、プログラムがまだ完了していないと思われる場合は、最初からやり直し、仕様を改善し、コードを改善し、これを続けてください。

ほとんどの商用ソフトウェアはニーズを解決することを忘れないでください。実際に問題を解決する前に、ニーズとそのニーズを満たすソリューションを定義することは非常に重要です。そして、ニーズがどんどん大きくなるにつれて、あなたのソフトウェアも時間とともに成長します!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.