私は、来年の今頃までに、まともな開発者になることを目標に掲げています。これは、開発の「ライフサイクル」の完全な経験、いくつかの良いアプリ/サイト/ウェブアプリ、そして最も重要なことに仕事ができることを意味しますこれはすでに知っているはずのテクニックで何時間も傍受されることなく、安定したペースで。
私はゼロから始めていません。私はたくさんのhtml/css、SQL、javascript、pythonおよびVB.netを書いて、CやJavaのような他の言語を勉強しました。知っています aboutOOP、デザインパターン、TDD、複雑さ、計算言語学、ポインタ/参照、関数型プログラミング、およびその他の学問的/理論的問題。たとえば、本当にdoneこれらのものはまだです。
だから、私はスピードに慣れたいし、後日まで何を残せるか知りたい。たとえば、アルゴリズムとその背後にある数学を学ぶことは興味深いことですが、これまでのところ、最も基本的なネストされたループ以外は何も書く必要がありませんでした。低レベルの操作をより明確に把握するためにアセンブリを調査することはクールです...しかし、私はめったに日常業務を侵害していないと思います。一方、関数型プログラミング言語を見ると、わかりやすく、隠れた障害が発生しにくいプログラムを書くのに役立つ場合があります(現時点で最大の困難を見つけているのは、アプリの複雑さが理解する能力を超えている場合です) -たとえば、データの受け渡しは問題ありませんでした...私がAJAXでそれを実行し始めなければならないまで、これは苦痛なステップでした)。時間をかけてデザインパターンのケーススタディに取り組むことはできましたが、「実際の生活」でそれらがどれだけ使用されるかはわかりません。
私は基本的な能力を持つプログラマーです-どのスキルを開発することに焦点を当てるべきですか?
(また、私のUnixスキルは非常に弱く、Windows構成の知識も...どれだけの時間を費やすべきかわからない)
これらは、私がしたことではなく、後から考えるべきことを基にした提案です。
実際、学習する能力が信頼できるなら、何でもスキップできます。私はあなたが知りたいことは次のような質問に答えたほうがいいと思います:
優れた開発者はすべてについて知っていることを忘れないでください。コンピューティングはそれ自体をコンピューティングすることはめったにありませんが、理論的な物理学、生態系の保護、または写真効果など、人間のあらゆる分野に適用することは The Matrix 。
最後に、デザイン、抽象化、アルゴリズム、複雑さについて学んでください。私、私を教えてくれたプログラマー、そして私が尊敬するプログラマーは、あなたに感謝し、感謝します。勉強の時間があれば、初版の Code Complete を読むことをお勧めします。
ペットアプリケーションを選択してください。これは非常に簡単に開始できるものである必要がありますが、掘り下げると多少複雑になります。また、多くの時間を費やすことになるので、興味のあるものになるはずです。それが何かをすることも確認してください。現在、フレームワークやWebサービスを作成しようとしないでください。通常のユーザー主導のアプリです。
Git、Mercurial、またはBazaarをダウンロードし、それらを使用してリポジトリを作成する方法を学びます(非常に簡単です)。
次に、あなたの能力を最大限に引き出すために、好きなテクノロジーを使用してペットプロジェクトを実装します。確実に完了できるように、期限を設けてください。作成したソース管理リポジトリを使用して、変更を追跡します。ブランチなどについて心配する必要はありません。間違いを元に戻せることを確認してください。
アプリの作成が完了したら、ラベルを付けます。それがV1です。 Michael Feathersの レガシーコードを効果的に使用する 、Bob Martinの アジャイルソフトウェア開発の原則、パターン、およびプラクティス および クリーンコード 、そしてAndrew Huntとデビッドトーマス ' The Pragmatic Programmer 。それらの間をジャンプする場合でも、任意の順序で自由に読んでください。多くのアイデアが繰り返されていますが、それらは異なる視点から提示されているため、理解を深めることにもなります。 (おそらくGoF Design Patterns 本を参考にしてください)
本を読みながら、あなたが学んでいることを適用して、プロジェクトを改善してみてください。ソース管理を、行った変更の一種のジャーナルとして使用してください。
正しく行われていれば、リファクタリング、テスト駆動設計、既存のコードの改善、デザインパターンの適用方法(およびいつ)を(他のスキルの中でも)習得しているはずです。
理想的には、進捗状況を評価するのに役立つメンターがいるでしょう。興味があれば、私(kharasoft dot netのfirstinitiallastname)に連絡してください。計画を立て、レビューを提供します。
イニシアチブを取り、キャリアを促進していただき、ありがとうございます。それから多くの報酬が得られます。
あなたは良い開発者の秘密を知っていますか?
あなたはそれをすべて知っているわけではありませんが、あなたはあなたがそれを必要とするときに、あなたが知らないこと、そしてあなたが知らないことについてのさらなる情報をどこで見つけるかを知っています。
不可能を達成しようとすることは、不安、不眠、そして自信の喪失につながるだけです。
専門家が何を専門にしたいかによって、答えは開発者ごとに異なると思います。次のアルゴリズムを使用して、自分にとって適切な答えを決定することをお勧めします。
学習したいスキルを使用する簡単なプロジェクトを選択してください。
そのスキルに焦点を合わせて実装してください。
そのプロジェクトがどのように終わったのかについて好きなことと、嫌いなことに注意してください。
このプロジェクトの結果について気に入った点は、「これは自分が得意とする専門分野だと思いますか、それとも私が得意とするものと関連しているのですか」と自問してください。
a。もしそうなら、この専門分野に関連する他のスキルについて考え、それらを書き留めます。
b。そうでない場合は、背中を軽くたたいて、それが得意なものであることに注意して、次に進みます。
プロジェクトの結果が気に入らなかった点については、「これは方法を知っている必要がある(または方法を知りたい)か、またはこれが私ができる開発の側面でありたいと思います。一般的に他人に任せる?」
a。方法を知りたい、またはその方法を知っている必要がある場合は、ステップ4aで開始したリストに追加してください。 b。あなたがその側面を他人に任せることができると思うなら、人間としての限界を超えて憂鬱な態度でため息をつき、それを弱点として書き留め、次に進みます。
専門にできるものと、4aと5aから知っておくべきことのリストからスキルを1つ選びます。プログラミングを希望どおりに近づけるために開発することが最も重要だと思うものをすべて選択してください。
あなたがそのスキルを使って行うことができる簡単なプロジェクトをブレインストーミングしてください。 1つを選択します。リストで上位にある別のスキルを練習できるプロジェクトを選択すると、1石で2羽の鳥を殺すことができます(n/2はnと同じ複雑さですが、この方法の方が高速です)。
このプロジェクトを使用して、ステップ2に戻ります。
残りの人生、または優れたプログラマーである必要がなくなるまで、このループを繰り返します(お腹がすいた孤児を養うためにコーディングをやめたい場合は、私は止めません!)。
私はテストとn層Webアプリケーションを専門としています。私の次のプロジェクトはTDDを練習することであり、ASP .NET MVC 2です。TDDはテストにおける私の力をさらに高めるためのものです(私はSDETなので、TDDはユニットテストについての洞察を与えてくれます。私のテストツール以外では通常は行いません)、優れた設計の弱点を支援するため(私は願っています)、MVCはフロントエンド設計の弱点を支援するためのものです。私のリストにはテストなどが含まれますパフォーマンス、Webセキュリティ、およびWebデザイナーと協力して見栄えの良い(見栄えの良い)Webサイトを作成する。
私が早い段階で受け取った非常に有用であるとわかったもう1つのアドバイス:専門分野は、幅広いものでも、深いものでもかまいません。言い換えれば、少しずつ手を出すのは一種の専門分野です。自分の専門分野にしたいことを考え出すときは、そのことを覚えておいてください。
あなたが何かをカットアンドドライしたかったら申し訳ありません。質問にそのような答えがあるとは思いません。
私は何年にもわたってプログラミングを続けてきました(私は7歳だったので、今は30代後半です)。
私があなたの立場にある場合、私が強く提案することは1つだけですが、他のほとんどの回答ではわかりませんが、定義されたプロジェクトで一緒に作業するプログラマを少なくとも1人見つけることです。
アジャイルプログラミング-SCRUMなどについて読んで、アジャイルでテスト駆動の方法で作業してください。一緒に作業します。ただし、ほとんどのコードを記述させないでください。開発者のペアとして本当に作業します。
そして、すべての独自のバージョンを書くことは有益である可能性があります-私が知っている最高の開発者は、彼らが絶対に自分で行う必要があるもの、つまりプロジェクトの独自性の中核を除いて、コードを書くことを避けることに熟達しています。
残りの時間は、コードを広範囲に再利用します-APIを呼び出し、オープンソースプロジェクト(適切な場合)を使用し、簡単に言うと、ホイール(またはデータアクセスレイヤーなど)の再発明を避けるためです。
そして、これを行う過程で-特にオープンソースプロジェクトでは、それらのプロジェクトにも貢献します-彼らはコードを読み取り、クリーンアップし、バグを修正し、拡張機能を提供します。
現実の世界での開発は通常、チームの一員として働くことです。そのため、そうすることを強くお勧めします。あなたが特定のプロジェクトに取り組みたい他のプログラマーを知らない場合は、何千ものオープンソースプロジェクトを調べ、積極的に関与する1つ以上を選択することをお勧めします。個人的な「かゆみ」をスクラッチします。そして、あなたが貢献できるプロジェクトを見つけ、他の開発者と一緒に取り組むことができるでしょう。
そして個人的には、「私ができることをスキップする」というあなたの態度は悪いものだという助言を軽視します-私が開発者を雇っているとき、自分ですべてをしようとしない開発者が欲しいです。自分で書くのが本能ではない開発者が、コードを書かずに(そして必要な最小限のコードを書いて)ビジネスニーズと要件を実現する方法を最初に考える開発者を強く望んでいます。
また、ビジネス要件を強く念頭に置いてテストしながら、テストを行います。もちろん、テストを行うと、実際にコードを書き直したり、自分で記述したりする必要があることがわかります(プロジェクトを改善するためにこれを寄稿できる場合もあります)。
それは単に、必要なときに読み上げて学習するということです。
どこかに行き詰まったり、「私のソリューションに何かが足りない」と感じたりした場合は、そのために時間をかけて詳細を学ぶ必要があります。
スキップするビットを見つけることは、最善の態度ではありません。
そうは言っても、開発者のどの部分が好きかがわかれば、特定の領域に集中することを目指すことができます。
たぶん、ウィンドウズ開発者の不利益など、ウェブ開発に固執するかもしれません。
私はそれが私をより便利にするので、すべての取引のジャックになるのが好きです。
1年間で、特に急な学習曲線では、「いくつかの優れたアプリ/サイト/ウェブアプリ」が完成する可能性は低くなります。あなたが学ぶ唯一のことは燃え尽き症候群です。
代わりに、興味のあるものに焦点を当て、それを学習ツールとして使用してください。プロダクション品質であることを心配する必要はありませんが(実際にはそうなりません)、何度もアクセスできるサンドボックスとして使用してください。
たとえば、ファンタジー野球に興味があります。何年にもわたって、スクリーンスクレイピングの統計情報収集ロボットから、HTMLのみのWebサイト、スケーラブルなSQL Serverデータベースを備えた完全なWebアプリまで、それに関連する多くのことを開発してきました...私の次のペットプロジェクトは、みんなが仮想テーブルの周りに座ってドラフトを行えるようにするリアルタイムのSilverlightアプリになるかもしれません。
これらのことはどれも私の世界の外ではそれほど役に立ちません。しかし、それらのそれぞれが私をより良いプログラマーにして、私の快適ゾーンの外でテクノロジーを学ぶのに役立ちました。
プログラミングを開始する言語を心配することについて少しスキップします。
いずれかを選択して実行してください。
APIの詳細について学習してください。
理由は次のとおりです。
XUL、EclipseのSWT、wxWindowsのどちらが優れていますか?知りません。それらはすべて非常に巨大な世界であり、私はそれらを実際に評価して伝えることはできませんでした。チュートリアルを読むだけでは不十分です。それが十分であると実際に理解する前に、または実際に食べ物のようにUIの味を味わうことができないことに気付く前に、1〜2年間汗を流して出血する必要があります。
Joel Spolsky、「Lord Palmerston on Programming」 http://www.joelonsoftware.com/articles/LordPalmerston.html
「もう知っておくべき」症候群についてはあまり心配しません。この一連の作業では、常に新しいことを学びます。年に1〜2回、上司から通信プロトコルや集積回路などの200〜300ページのドキュメントへのリンクが送られてきました。誰もがあなたがあなたが「行われた」学習をしているポイントに到達することを期待していません。
開発プロセスに関する限り、それをそのままにしてください。 1度または2度間違えるまで、何が最も有用であるかは本当にわかりません。パフォーマンスを評価し、次回は改善を加えます。
たとえば、昨年私はビルドの不安定性に関して多くの問題を抱えていました。ソースコントロールから更新するのが怖かったです。更新するたびに、すべてを再コンパイルするのに半日を費やすことになったからです。ただし、更新の間隔が長すぎると、最後のマージが恐ろしくなります。また、更新を延期できない緊急のバグが時々発生します。これにより、新しい機能に対してすでに行った部分的な変更を追跡することが困難になりました。
ええと、私の会社はそれを一般的な規模で修正するために取り組んでいますが、その間私自身のために使用できる何かが必要でした。私はビルドの安定性についていくつかの調査を行い、分散バージョン管理を発見し、いくつかの分岐モデルで実験し、共有する必要があるときにローカルで複数のBazaarブランチと会社の集中ソース管理を使用する非常に実用的なハイブリッドシステムを手に入れました。
私の要点は、2年前にソフトウェアツールとプロセスについて次に何を学ぶべきかと尋ねられたとしたら、私はあなたに言うことができなかったでしょう。私と同じような作業環境がない場合は、ハイブリッドソース管理は余分な複雑さではなく、限界的なメリットはありませんが、個人の生産性と健全性を大幅に向上させています。
次に私は私の見積もりスキルに取り組んでいますが、私はその後何が来るのかわかりません、そして私は確かにインターネット上の他の誰かが1年で最も役立つと思うものを知りません今から。あなただけがそれに答えることができます。
ここで2つのポイントを共有したいと思います。
GURU
のようなものはありません。常に学習を続ける必要があり、この事実を前もって受け入れ、学習を続ける必要があります。それにこだわってうまくやるを学ぶ限り、何をしてもかまいません。
あなたが投稿したすべてのアイデアは知っておくべき良いものであり、あなたを助けるでしょう。どちらが一番興味がありますか?あなたはあなたのUnixスキルが弱いと述べました。コンピューターにLinuxをインストールすることを検討しましたか?新しい言語を学ぶという追加のストレスなしにUnixシステムのプログラミングに足を踏み入れることができるので、Cを知っていることはすでに役に立ちます。また、興味がある場合は、デバイスドライバーについて学ぶ機会にもなるでしょう。
開発者教育のある時点で、アセンブリと機能の原則を学ぶことを強くお勧めします。両方とも、Javaプログラマーとしての「通常」の役割で私にとって非常に有用であることがわかりました。私はLISPとPrologを学びました。個人的にはLISPを好みますが、それは意見の問題です。アセンブリはあなたに考えるように教えますコンピューターがプログラムをどのように認識するかについて、そしてそれはすべてのプログラマーが学ぶために重要だと思います。関数型プログラミングは、より決定論的に考えることを教えてくれます。私の場合、テスト可能なコードを書くのに役立ち、それはスレッドセーフです。
だから、あなたが好きなものを選んで、それで数ヶ月を過ごします。あなたはその方が良いでしょう、そしてそれはあなたの自己教育の次のプロジェクトへの足がかりを証明するかもしれません。ああそう、そしてあなたが何をしても、not学習をやめなさい。二番目に、あなたは停滞し始めます。
どこにでもいるようです。特定の領域に焦点を当てたときに人々が最もよく学び、実際に掘り下げると思います。そうすると、他のツールを学ぶ必要がある特定の問題に必ず出くわすからです。このようにして、スキルセットを有機的に、相互に関連性のある方法で成長させることができます。メンタルツールボックスに組み込まれる新しいアイデアやツールを使用すると、他のアイデアをより簡単に学ぶことができるため、得られた知識を失うことはありません。
1年でまともな開発者になることを学ぶのをやめる。 10年間で優れた開発者になることを学ぶ。
リンクされた記事から:
重要なのは、審議の練習です。単に何度も何度も行うだけでなく、現在の能力を超えたタスクに挑戦し、それを試し、実行中および実行後のパフォーマンスを分析し、間違いを修正します。その後、繰り返します。もう一度繰り返します。実際の近道はないようです。4歳のときに音楽の天才だったモーツァルトでさえ、世界クラスの音楽の制作を始めるまでにさらに13年かかりました。
1年後も、ギャンブルを続けるでしょう。それについてできることは何もありません。優れた企業は、ジュニアを投資と見なしています。彼らが求めているのは、現在の優れたスキルではなく、潜在的なスキル、基本をよく理解していること、そして熱意です。エントリーレベルの仕事を得るためには、面接でこれらの資質を得る必要があります。
あなたは自分の時間にどれくらいのプログラミングをしますか?それはおそらく、あなたがすぐに改善するつもりであることを潜在的な雇用主に納得させるための重要な要素でしょう。どのプロジェクトを完了しましたか完了しましたか?完成したプロジェクトは献身的です。
私は2つの異なる企業でのみ雇用されていますが、それぞれが独自の内部テクノロジーを持っていて、生産性を高める前に学ぶ必要がありました。その最初のバンプは、あなたがどれだけの経験を積んでもそれほど減りません。良い雇用主は、最初の学習期間を期待しています。
心配するのをやめて、プログラムに進んでください。 :D
私がインスピレーションを与える読書のステップと、これまでの私の最も転換する瞬間をあなたに伝えたいと思います。
私のソフトウェアのキャリアには、いくつかの「すごい」瞬間がありました。彼らは次のように行きました:
Head First Design Patterns-これは私にとってOOP/OODの世界を切り開いてくれました。
ロバートC.マーティン-クリーンコード-これからの興奮で何日も眠りませんでした!簡単なことですが、クリーンなコードの意味を忘れてしまったため、すぐに軌道に乗ることができました。
ロバートC.マーティン-アジャイルパターンと実践-現在、これらの原則に基づいてコーディングキャリアを送っています。 Word SOLIDは、私が書くコードのすべての部分について私の心を通過します。これはClean Codeとの組み合わせで、私はそれらの影響を非常に受けたので、当時、雇用主は約15人の開発者からなる会社全体にそれを教えさせてもらいました。私は上級者でもなく、プレゼンテーションは得意ではありませんでしたが、私の熱意がそれを実現させました。
私の最後の「すごい」瞬間は、TDDの発見でした。私はそれについての私の理解を、同じ「WOW」効果も持っている他の2人の親友と共有しました。私たちは皆夢中になり、ソフトウェア開発ライフサイクルでのテストの重要性について常に可能な限り話し合っています。テストを行うのに非常に遅い人間のチームよりも自己検証コードを使用する方がよいです;)。
最後に、私の心に非常に近いと感じているのは、スクリプトパーサー、a REST library、testフレームワークなどを書いて、それを書いてください!楽しみのために!楽しんでいただけるだけでなく、まだ完全に理解していないことを書こうとすると、より多くの尊敬と理解が深まることがわかりました、そして私にそれを完全に理解することを強います。
申し訳ありませんが、私は質問からどれだけ脱線したかを理解しました。私が上で述べたことは私の絶対的な核心でした。上記の資料のどれもが私を去りませんでした、そして、私に学習が実際により広くそしてより簡単になったほど素晴らしい偉大な思考を私に与えました。したがって、あなたの質問に答えて、コード作成とソフトウェア設計のコア原則をスキップしないようにしてください。特定の問題を解決するための他の特定のツールはそれほど重要ではありません。
学習と知識の蓄積は建物の建設に似ており、すべてのレンガは別のレンガの上にあり、基礎に依存しています。
物事をスキップし、急いで開始すると、放送でサポートされている、厄介な事実に終わります。彼らが倒れることを恐れて、あなたは彼らをあえて使わないでください。事実を理解する必要があるため、理由と提携していない場合、事実は誤っている可能性があります。
特に、基礎、数学、アルゴリズム、およびそれらの類縁をスキップしたいのではないかと心配しています。ここでしっかりと把握していなければ、あなたはneverできるようになります"最も基本的なネストされたループ以外のもの"。
急いでいないでください、仕事は永遠にあります、途切れのない学習の時間はそうではありません。できる限りのことを、必要な順序で学んでください。
Jeff Oが提案するように、もしあなたが良いプログラマーになりたいのなら、学習をやめることは決してないでしょう。
プログラミングに関連したことを学べる可能性が非常に高いことを理解する必要があります。そのすべてを知り、それを上手にしたければ、何百万年もそこにいることになります。だから、あなたの人生を良くするものに焦点を当ててください。それが純粋な楽しみでも、お金でも、科学的な努力でも、あるいは理由の混合でも、それはあなたが選択し、あなたが時間を費やして眠るべきものです。
きちんとした開発者が何であるかを正確に自問し、それを実行してください。実際のプロジェクトでアートを実践し、時間を忘れさせます。
まともな開発者である私にとって、適切な要件を取得して書く方法、プロジェクト管理の方法、テストの方法、結果の提示方法、私を助けてくれる人とできない人(採用)を判断する方法、方法上司と顧客をどのように満足させるか、他の人とチームを組む。
技術レベルでは、私にとって優れた開発者であるとは、設計、レビュー、コード化、デバッグ、テスト、有用なユーザーマニュアルの作成、他の開発者向けのコードへのコメント、意味のある方法でのコメント、バージョンの管理、シミュレーション、そして常に見つけることができることを含みます。生産性を毎日改善し、タスクを自動化するソリューション(テスト、デバッグ、負荷予測のためのデータ分析など)。それは、必要または保証されたときに迅速でダーティーなコードを実行できることを意味しますが、コードを介してよく考えられたクリーンなことも実行できます。
そのために学ぶことではなく、そこにあるニーズを解決するための目的のために学ぶことによってすべてが得られます。そのために学ぶことはあなたにしっかりした基盤を与えることは良いですが、目的のために学ぶことはそれを現実にするために良いです。
結局のところ、優れた開発者は、目前のタスクに必要なものを選択できる人です。