コードを記述できる状態から優れた開発者になるにはどうすればよいですか?


10

スクリプト(bash、awk)から単純なアプリケーション(c、php、python)を記述して、より大きく複雑なソフトウェアを設計および開発する方法に至る具体的な説明がないことに私は不満を感じています。一方にはプログラミング言語の本があり、もう一方にはプログラマーのチーム向けに設計されたソフトウェアエンジニアリング/プロジェクト管理の本があるようです。

私は両方をたくさん読みました。私はXP / Agileの古典を読んだことがあり、ソフトウェア開発プロセスについて適切な理論的理解を持っています。私は他の人のコードを読むのが好きで、それをかなり順守できます。しかし、プロジェクトのアイデアがある場合、または「ここが問題/必要です」から「ここが解決策」に行きたいとき、私の心は空白を描き、どこから始めればよいのかわかりません。

私はそれをハックするだけですか?チームで働いていない個々の開発者や、大きなソフトウェア会社のための構造化されたワークフローはありますか?私はPMPを取得したり、ソフトウェア会社で働いたりすることを望んでいません。効果的、効率的、実用的なワークフローを探しています。


2
経験は良い先生です。
バーナード

大きくて複雑なソフトウェアは、単純で単純なソフトウェアのコレクションだけではないのですか?
リグ

5
「アートの最も重要なことは仕事をすることです。毎日座って試してみること以外に何も問題はありません。」-スティーブンプレスフィールド
ライアンキナル

カーネギーホールに行くのと同じ方法...
マイケルブラウン

1
カーネギーホールに行くのと同じ方法-練習!
Martin Beckett

回答:


11

私の意見では、経験持ち、さまざまな方法で作業することで、優れた開発者になります。「ここが私の考えです」から「ここが私の解決策」に至る問題があるとおっしゃっていました。それは、経験豊富な開発者であるだけでなく、ソフトウェア開発方法論に向けたものでもあります。

ソフトウェア開発方法論を使用することは、単に「コードをハッキングする」以上のものであり、これらの方法論は構造化されたワークフローを提供します。アジャイルファミリは、小規模な開発チーム(または個人)に適切な構造を提供し、「アイデア」フェーズから「最終製品」フェーズへの移行を支援します。

私が長年にわたって他の人から、そして次のようなさまざまなプロジェクトに取り組んでいる間に学んだいくつかのことがあります。

  • すべてをテスト可能にします。これにより、あなたの人生がずっと簡単になります。
  • 完璧なデザインを期待できず、エンタープライズアプリケーションを設計したり、次の最大のゲームタイトルをここに挿入したりすることができます。
  • あなたがそうした経験がなく、他の人から学んだことがなければ、良いソフトウェアを設計することは困難です。
  • 経験豊富な開発者であっても、初めて完璧なデザインになることは決してありません。あなたのデザインもそうかもしれません。
  • 物事を書き留める:書く/描く/ホワイトボード/ペイントする/それがあなたが快適に感じるものは何でも、書き留めておくと生活が楽になります。GUIデザイン、クラス図など。私の経験では、「何かを一緒にハックする」だけでは破滅的な失敗をする可能性があります。
  • ホイールを再発明しないでください。そうする必要はありません。独自のHashMapを実装しようとしている場合は、おそらく何かが間違っています。物事を研究し、コードを書く前に考えてください。

その一部がお役に立てば幸いです。


多分それは私が鉛筆と紙なしでやろうとするデジタル時代の症状です。マインドマップなどを作ったことを覚えています。いいアドバイス。

書き留めることに同意します。私は非常に小規模で大規模なチームでの作業にかなりの経験があり、最初に行うことは、ソフトウェア/モジュールの基本的な要件をリストアップすることです。それは何をするためのものか?ソフトウェア設計の原則を学びます。これは基本的には後のことです。最初に高度に構造化する必要はありません。言語やテクノロジーを参照せずに、方向性を集中するのに役立ついくつかの整理用のメモを用意してください。明確な方向性がある場合は、それを実装する方法を考え出します。

鉛筆や紙、ホワイトボードなど、スクラッチパッドがなければ何もデザインできないと思います。私はまた、プロジェクト設計のすべてのイテレーションを保持します。なぜなら、スクラップしなければならなかったその素晴らしいアイデアが突然実現可能になるときがわからないからです。
TMN、2011

私は非常に視覚的な人間なので、写真は常に物事を理解し、解決するのに役立ちます:-)
Deco

5

まあ、私の意見では、どんな職業でもそうですが、優れた専門家であるためには、理論的形成以外に必要なことはすべて経験です。

医者は中学校で受けたクラスだけでは上手くならないし、弁護士は学位だけで弁護士になるという政治的側面をすべて知ることができず、優れた開発者になるには経験と時間が必要です。

経験は、サードパーティのコードを読み取ることによっては得られません。あなたが医学生を手に入れたら、彼/彼女は多くの手順、病気、薬などを指摘することができますが、これらのものの実際の適用(1つの手順を適用するとき、診断するための病気など)は来るだけです監督と経験を持つ。

大企業(またはそのことについては他の企業)で働きたくないので、小さなアプリケーションを1つずつ開発することから始めることをお勧めします。自分でソフトウェアを開発するには、かなりの時間がかかります。

優れたソフトウェア開発者/エンジニアになるために私が提案する他のことは、オープンソースソフトウェアに貢献することです。多くの人が、オープンソースソフトウェアの開発を支援し、その後協議を行うことで、かなりの金額(および経験)を稼いでいます。彼らはオープンソースへの貢献で名を馳せました。

とにかく、経験を積む近道はないと思いますし、規律忍耐をもって追求しなければなりません。


それは良いアナロジーです。他の人のコードを読むことは私のスタイルに役立ちましたが、そうです、それは私に実際の経験を与えません。他の誰かがOSSルートに行くことを提案しました。調べてみます。

4

他の人のコードを拡張することから始めることができます。あなたが持っているいくつかのプロジェクトを取り、それに機能を追加します。機能が何をするのか、どのように行うのかを決める必要があります。既存のコードのフレームワーク内で作業して、ソリューションを設計します。

そして、ハッキングを恐れないでください。多くの新しい開発は、迅速で汚れたプロトタイプを洗練する(できれば書き直す)ことによって行われます。本の中で最悪の練習とアンチパターンをすべて使用して、あなたが望むことをする何かをクランクアウトしてください。次に、戻って適切に設計します。通常、800行の3プロシージャの怪物にいくつかの構成パラメーターをハードコーディングしているときに、「知っている、これを行うためのより良い方法は...」と思っています。

私はそれが現在流行していないことを知っていますが、構造化分析の技術は本当にソフトウェア設計のハンドルを握るのに役立ちました。いくつかのバブルチャートとDFDを作成して、問題を分解したり、システムのさまざまな部分を設計して連携したりする感覚をつかみます。


2

他の人が言ったように、経験はコードを書くことから来ます。ただし、可能であれば、他の誰かにコードをレビューしてもらってください。より経験豊富なプログラマーは、コードの問題を指摘し、より良い方法を示すことができます。オープンソースプロジェクトに貢献することで、両方を行う機会が与えられます。


1

私にとっては、大きなソフトウェアを小さなチャンクに分解するのに役立ちます。そして、それらのチャンクをさらに小さなパーツなどに分割します。すべてのソフトウェアプログラムは、小さなロジックの集まりです。

たとえば、ブログについて考えてみましょう。他のユーザーが閲覧できる投稿を作成および編集できるようにしたい。すぐにプロジェクトを管理セクションと公開セクションに分割できます。最低でも、管理者には管理者ユーザー、ログインページ、ブログを管理するためのセクションが必要です。ブログの管理セクションは、CRUD(作成、読み取り、更新、削除)インターフェースに分類できます。新しいブログ投稿を作成するには、管理者ユーザーが適切な権限、フォーム、フォーム検証、およびデータベースに保存する機能を持っていることを確認する必要があります。等々。

問題または機能を分解するほど、管理しやすくなります。それは分割統治です。このようにソフトウェアを作成できたら、ソフトウェアのさまざまな部分が互いにどのように相互作用するかを確認できます。どこでコードを繰り返しますか?何を抽象化できますか?これは、計画するときも、コード自体を書くときも、繰り返しのプロセスになるはずです。

他の要素を追加する前に、最低限の機能セットを理解し、それを実装することをお勧めします。将来の変更がそれほど難しくならないように防御的にコーディングする必要がありますが、同時に、決して完了しない可能性のあるハーフ機能を実装する必要はありません。柔軟な態度を維持することと、愛情を込めてあなたの最愛の人を殺そうとする意思との間を歩き、文学の参考文献を借りるのは難しいことです。その特定のバランスをとる行為で上手になることは、経験からのみ来る。

そして、それは他の答えが述べたように、その結​​果です:経験。それを取得する唯一の方法は、ただ始めることです。最初からそれを完璧にすることについてそれほど心配しないでください。最初にコードを機能させ、次に美しくし、次に高速にします。

また、この段落とは異なり、最後に後付けとしてセキュリティを追加しないでください。ソフトウェアが危険にさらされる可能性のある方法について考えるべきですが、最初はユーザー入力を信頼しないでください。


0

あなたはソフトウェア会社で働きたくないと言っているのは知っていますが、それは他の多くの答えが語る経験を得るのに良い場所です。そして、あなたが大きなプロジェクトに取り組みたいかどうかにかかわらず、他の人々の仕事やワークスタイルに触れることは良いことです。

たとえば、ペアプログラミングを自分で試すことはできません。そして、あなたがあなたよりも賢い人とペアになっている場合、その方法論の経験を積んでいる間、彼らからより良い実践を得るという追加の利益を得ます。

ところで、私は経験やスキルなどで平均を下回っていると感じているグループと一緒に仕事をすることを試みるようにしています。それは私のゲームをものすごく高めます。それを単独で、または「経験豊富な」人である場所で行うのははるかに困難です。


0

あなたが探しているのは、問題解決能力です。開発者がこれを既に実行できることが前提になっていることに気づきました。これはばかげています。幸いなことに、問題解決は数学、研究、日常生活などで使用される一般的なスキルです。

主に、あなたはいくつかのフリルで、科学的方法に従うことになるでしょう。

  1. 問題があります(これを定義するのに役立つツールとテクニックを使用してください)
  2. ソリューションの仮説を立てる(パターンと経験のヘルプ)
  3. 仮説をテストします(ここにコードさえないかもしれません)
  4. 仮説が成立するまで、手順2と3を繰り返します。あなたは今理論を持っています(問題を解決するための作業プログラム)
  5. 理論を強調する実験を開発し、穴を探します(テストケース!)
  6. テストケースが成立すれば、解決策があります!それ以外の場合は、すすぎ、繰り返します

これはかなり高いレベルであることに注意してください。各ステップには、通常、問題が実際に何であるかを判別するなど、いくつかのサブステップが含まれます。例として、数学の単語問題の解決を見てください。事実を収集し(ツール)、実際に必要なものを決定します。次に、事実を調べて、それらをソリューションにマッピングしようとします。

これは、主要な問題のサブ問題になることになります。したがって、手順を再度実行してください。最終的な結果を得るには中間アイテムが必要なので、それが新しい問題になります。これは、問題を小さな、簡単に理解できるセクションに分解します。各部分が解決されると、ソリューションがつなぎ合わされます。

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