プログラマーとしてのキャリアと人生を振り返ると、プログラミングスキルを向上させるさまざまな方法がありました。コードを読む、コードを書く、本を読む、ポッドキャストを聴く、スクリーンキャストを見るなどです。
私の質問は、あなたがプログラミングスキルを向上させた最も効果的なことは何ですか?改善したい他の人に何をお勧めしますか?
私はここでさまざまな答えを期待しており、「1つのサイズですべてに適合する」答えはありません。
プログラマーとしてのキャリアと人生を振り返ると、プログラミングスキルを向上させるさまざまな方法がありました。コードを読む、コードを書く、本を読む、ポッドキャストを聴く、スクリーンキャストを見るなどです。
私の質問は、あなたがプログラミングスキルを向上させた最も効果的なことは何ですか?改善したい他の人に何をお勧めしますか?
私はここでさまざまな答えを期待しており、「1つのサイズですべてに適合する」答えはありません。
回答:
順不同...
自分よりはるかに賢い人々と働く
後輩、中級者、先輩、または第一人者であるかどうかに関係なく、他者の発言を常に聞いてください。役職は何の意味もありません。
他のフレームワーク/言語を学習し、それらがどのように動作するかを見て、それをすでに知っているものと比較する
パターン、ベストプラクティスについて読んでから、古いものを調べ、必要に応じてそれらのパターンを適用する
ペアプログラミング
ジョエルが言うことすべてに反対する。;)
決定TO「三面六臂」であります
かなり早い時期に、特定のデータベースとプログラミング言語の専門家でした。残念ながら、その特定のデータベースは「データベース戦争」を失い、私のキャリアの選択肢は限られていることがわかりました。その後、私は意識的に、二度とそのような状態に陥ることは決してないと決めました。そこで、Windows、Unix、C、C ++、Java、C#、Perl、Python、Access、SQL Server、Oracle、Informix、MySQLなど、手に入れることができるすべてのものを研究しました。 「ゴーツーガイ」になりました-「クレイグに聞いて、彼がそれを知らないなら、彼はそれを学ぶでしょう。」その結果、環境テレメトリ用の組み込みシステムからミサイル防衛用の指揮統制システムまで、あらゆる種類のプロジェクトに取り組みました。
私が今まで経験した唯一の問題は、私の専門がジェネラリストであるときに、ピジョンが私を専門に引き込むことを主張する企業に関するものです。[編集:PolymathまたはRenaissance Manまたはマルチスペシャリストとしても知られています。]
心に留めておくべきこと...ハイテクの知識の半減期は?それはムーアの法則に従って追跡します:あなたが知っているすべての半分は18-24ヶ月で廃止されます。間違った規律を選択する専門家は、テクノロジーのプレスによって簡単に損なわれます。ジェネラリストは、いくつかのスキルを追加し、それらのスキルを適用する際の過去の教訓を覚えるだけです。
私はいつも自分をかなりホットなプログラマーだと思っていました。それから彼をアーロンと呼ぶ新しい男が私たちのチームに雇われました。アーロンは、ほとんどの分野で明らかに私よりもはるかに優れていました。彼も私より若かった。彼は私が過去数年間あまり改善していないことに気づきました。私はその場限りのハッカーであり、平凡なハッカーでした。
これは、意識的に自分自身、特に私が書くコードの品質を改善しようとするように警告しました。
アーロンは私に多くのことを学ぶように導きました。彼は、私が書いたコードの大部分を少なくとも数年間維持および拡張する必要があることを教えてくれたので、それを念頭に置いてコードを書く必要があります。コードの自動テストを作成する必要があります。アーロンは常に、最初の作業バージョンで停止するのではなく、コードがエレガントになるまでリファクタリングおよび改良する方法について話していました。私が使用していた言語とツールには、改善の余地があることがわかりました。
アーロンから学んだ最も重要なことは、決して学習を止めないことでした。
数年後、アーロンは会社を辞めました。空っぽに感じました。彼との過去数年間は、私をまったく新しいレベルのスキルに引き上げ、私は今やチームの他のチームよりもはるかに優れていることに気付きました。彼らはまだ悪いコードを書いていて、以前と同じ間違いをしていました。私は彼らに教えようとしましたが、彼らは学ぶことに興味がありませんでした。実際、彼らは誰かが彼らがしているどんな間違いを彼らに伝えるためにとても慢であることに腹を立てていました。
それで、数ヶ月後、私も会社を辞めました。私は非常に才能のあるチームを持つ小さな会社に移りました。みんながもっと学びたいと思っていたので、とても気に入りました。
アーロンに会えてよかった。彼がいなければ、私はおそらくまだ古いギャングと古い会社で働いていて、どこにも行かず、自分自身について考えすぎていたでしょう。
2つのこと:
コードの記述は非常に簡単です。私が知っている他のすべての人がそれを行うことができます。しかし、他の誰かのコードを読んで、それが何をするかを理解することは、私にとって全く新しい世界でした。
定期的にジムに行きます。
真剣に、私の脳は、私が体調を整えているとき、ずっと良く機能します。問題が簡単になり、圧倒されることはなくなり、グーフオフは誘惑になりません。ステップバイステップで作業することは、このような骨の折れる作業ではありません。
プログラミング。興味深いプロジェクトに取り組んでいます。何かに乗り込んで作業するようなものは何もありません。特にプレッシャーの下で。私はいつもプログラムの作り方を尋ねる人には誰でも教えます-クールなプロジェクトを見つけて(それを作り上げなければならないとしても)それに取り組みます。
私の大学でCSの学生を指導するアルバイトをしました。何か他の人に説明しなければならないとき、まったく違うレベルで何かを理解するように強制します。
私は「毎年1つのプログラミング言語を学ぶ」システムの大ファンです。1年で「大丈夫、構文を知っているので、今は言語を知っている」というバイアスを乗り越え、その言語の利点を理解し、ネイティブ言語のスタイルでプログラムすることを強制するその言語(つまり、Ruby構文を使用してJavaアプリケーションを作成することになりません)。各言語はプログラミングに対するあなたの考え方を変えます-私は再帰の使い方を知っていましたが、プロローグのクラスをとるまで再帰の考え方は起こりませんでした(MLのような関数型言語は同じ効果があると思います)。
ペットプロジェクトを開始します。良いペットプロジェクトのための私の個人的な方程式は、あなたが経験したもの+あなたが役に立たないアプリ=あなたが役に立たないアプリです。たとえば、Migratr(私のカフェイン付きの週末になった進行中のプロジェクト)は、「c#を知っていますが、Web APIに対してコーディングしたことはありません。すべての写真をZooomrに移動したい」として始まりました。「Web APIに対して以前にコーディングしたことがありますが、C#がわかりません」と同じくらい簡単にできたはずです。
ペットプロジェクトの公開は、それ自体がすばらしい教育体験です。突然、事実上誰も教えていないことは誰でも知っていますが、誰もが知っているはずです(私にとっては、独自のテストシステムをセットアップし、バージョン管理システムを最大限に活用し、誰もあなたの期限を設定していないときに自分のペースを合わせる方法、あなたとやり取りする方法ユーザーと機能リクエストに「いいえ」を言うタイミングを知る方法)、すべてのものが表面にバブルし、あなたが以前にはなかったレベルで自己教育することを強制します-少なくともdzoneでフレームウォーを読んで「foo」対「bar」のやり方の長所/短所。
これら2つのことを行うことで、スペクトルの両端がカバーされます。新しい言語を学ぶことで、あなたはより良いコーダーになります。ペットプロジェクトはあなたをより良い開発者にします:P
自分で組み立てを教えた。私が13歳のときに古い6502チップでそれをしましたか?14?遠い昔。しかし、ビットレベルに到達する以上に開発を改善できるものは考えられません。
アセンブリを学習することで、コンピューターが根本的に低いレベルで「考える」方法についての洞察が得られます。このレベルでの優雅さは驚くべきことです。このレベルで開発すると、効率性が向上し、クリティカルシンキングとロジックスキルが向上します。また、あなたが持っているずさんな習慣をかなり早く治します!
65xxチップには3つのレジスタ(アキュムレータ、X、およびY)があり、乗算または除算のためのマシンレベルの命令はありませんでした。戦闘ダメージを計算するためのルーチンをコーディングし、本に目を通し、突然自分の数学ライブラリを書かなければならないことに気づいたのを覚えています。数週間かけて、ノートブック全体に1と0を走り書きし、「分割」と「小数点位置」が本当に何を意味するのかを理解しようとしました。
それ以来、C ++、pascal、.NET、その他多くのことを学びました...しかし、どれも私にそれほど教えてくれず、興味をそそられませんでした。 。
私が書いた古いものを振り返ると、それらがどれほど悪いのかを実感しました。
プログラミング。
真剣に、本があり、コーディングカタがあり、このようなサイトがありますが、開発者として改善する最善の方法は、実際のプロジェクトで作業することであると信じています問題。経験に代わるものはありません。
あなたができる最も重要なことは、改善するための意識的な努力をすることだと思います。単一の特効薬はありません。新しい情報源、新しい経験、およびより多くの練習を探し続ける必要があります。
そして2番目に重要なことは、あなたが何をしているのか、なぜそれをしているのか、どうすればそれを改善できるのかを考えてください。以前のプロジェクトと同じこと。あなたがやったことを振り返り、今どのようにそれを違うやり方で行うことができるかを振り返ってください。何がもっとうまくできたのか、どこで改善できるのかを考えてください。
私は毎日仕事でこれの2つの素晴らしい例を見る。私には、学ぶことが大好きで、最高の開発者になりたい同僚がいます。彼はダウンタイムを利用して、ブログを読んだり、本を読んだり、プログラミング手法について話し合ったり、たくさんの質問をしたりしています。また、彼はこの1年間で非常に顕著に改善されました。別の同僚が仕事をしていて、かなりうまくやっています。しかし、それは彼がするすべてです。彼は自分の知っていることに固執し、改善するために多くの努力をせず、既存のプロジェクト以外のプロジェクトには取り組みません。彼。
プログラマーとして私を助けた基本的なこと:
プログラマーの入力は不可欠です。誰もが2人の指で正確に入力する「プログラマー」の同僚を持ち、すべてをキーボードで確認する必要がありました。楽しくない。タイプをタッチすることを学ぶと、プログラマーとしての生産性が大幅に向上します。
そして、あなたが尋ねなければ、誰もあなたに話すつもりはありません。
好きな本、コード、オープンソースプロジェクトをすべて読むことができますが、ソフトウェア開発のエンドユーザーの側面を理解する必要があります。エコーチャンバーから出る必要があります。そこで、あなたの技術的なキャリアを支援する非技術的なポイントをいくつか取り上げます。
キーボードから離れてエンドユーザーと対話し、目を通してソフトウェアの使用方法を確認します。通常、エンドユーザーは技術的ではないため、ソフトウェアは魔法のような作業であると見なされますが、ソフトウェアは論理的なステップのセットと見なされます。2つの世界は完全に異なっています。したがって、あなたにとって簡単で論理的に見えるものは、他の人にとっては不可解で威圧的だと思われるかもしれません。
テスト、テスト、テスト。大企業で見たソフトウェアの多くはテストケースを使用しています。地獄、彼らはJUnit、xUnit、および他のすべての単体テスト言語を使用しています。しかし、私が見た問題は、ほとんどのプログラマーがプロダクションでソフトウェアがどのように見えるかを決して見ないということです。ユーザー(またはシステム(バッチジョブの場合))がアプリケーション、ライブラリ、またはインターフェイスとどのようにやり取りして、ユーザーがどのような忌まわしい情報をスローするかを調べます。これにより、適切なテストケースを生成し、プログラムに常に正しいデータセットが供給されると仮定するのをやめることができます。
正規表現を学ぶ。
最後の仕事をやめる。
あなたが何をしているのかを常に質問することが最大のことだと思います。あなたのコードが完璧だとは思わないで、常に改善に努めてください。
私は自分のコードが完璧だと思ったとき、2、3回経験したように見えますが、それから私は長い道のりがあることに気付きました。
最大のことは、自分のコード自体がマシンではなく他のプログラマーによって消費されていると見始めたときだったと思います。マシンで処理できるコードを書くのは簡単ですが、DRYで理解しやすいコードを書くのは困難です。
また、「この行の機能」を理解するだけでなく、「このクラスが他のすべてのクラスとどのように適合するか」を理解することを簡単にすることを意味します。誤用します。
彼らは、良いコードの70%がエラーのチェックと処理であると言っています。そのようにプログラミングを始めたとき、私のコードはずっと良くなりました。何がうまくいかないかを考えて、すぐにそれを処理することは大きな違いをもたらしました。それは感じているすべてのことをチェックするだけで、コードのアップを取得し、実行しているの邪魔になっているが、それは2〜4倍の開始から終了までの時間を短縮することのように。
これらの人々は「彼ら」とは誰であり、「彼ら」はどこに住んでいるのでしょうか?
学んだことを常に学び、実践します。
によって:
個人プロジェクト:プログラミングを始めて以来、私は個人プロジェクトをやっています。小さなゲーム、画像処理、ステガノグラフィ、ファイルタイプの仕様の実装、さまざまなプロトコルのゼロからの実装、またはさまざまなプログラムの長期にわたる実装。
本を読む: 私は暇なときにさまざまな本を読んでフォローすることにしました。読むのを待って座っているだけの専門家による書かれた本がたくさんあります。本から得ることができる深さは、たとえばさまざまなフォーラムの投稿を読むことによって比類のないものです。
これは通常、新しいテクノロジーを学習する私の年代順です。
定期的に良いブログ(Atwood、Martin Fowlerなど)を読んだり、テクノロジーニュースを最新の状態に保ち、興味深い新しいテクノロジーに関する情報をフォローしてください。これらの手順により、さらに探求するために興味深いものが見つかったかどうかを判断できます。
適切な本や他のリソースを読んで、あなたのレベルについて学んでください(例えば、初心者向けにデザインパターンを学びたい場合は、「Head First Design Patterns」をお勧めします)。また、本の特定の好みがあります。
私が学んだことを使用して、おもちゃプロジェクトを 1つまたは2つ展開します。プロジェクトの有用性について心配する必要はありません。私の意図は、私の学習を活用することです。(たとえば、OOPの計算プロジェクトは問題ありません)
仕事で使用できるかどうかを確認します。(たとえば、職場ではSubversionを使用しませんが、ローカルリポジトリとして使用し、単調すぎて時間がかかるタスクにはRubyを使用しました)
これは、ほとんどの人が見逃していると思う最高の部分です。ナレッジ共有セッション。たとえば、仲間のチームメンバーに1つまたは2つのセッションを提供します。教えることは、テクノロジーを実際に学ぶ最良の方法の1つだと思います。視聴者がテクノロジーを理解するかどうかに関係なく、テクノロジーに対する理解のレベルが複数になることを保証します。:-)