Joeに、<xyz>を実行する簡単なプログラムを作成するように依頼しました。 数時間、最悪の場合は1日、仕事がありました。 彼には数日かかり、そのために必要以上に複雑なフレームワークを作成しました。 なぜ彼は再び洗練されたのですか?
おそらく、ジョーは抽象指向プログラマー( AOP )であるという事実でしょう。
テンプレートフレーズ( snowclones )をいくつか紹介します
プログラムを頻繁にオーバーエンジニアリングする場合は、 AOPである可能性があります。
現在の問題よりも明日の問題に多くの時間を費やすなら、あなたはAOPかもしれません。
深い関係を探したい、無意識の洞察から心地よい振戦を感じたい、または類推による理由があるなら、あなたはAOPかもしれません。
抽象化の必要性
ソフトウェア開発は、抽象化に常に対処しなければならない数少ないアクティビティの1つです。 プログラミング言語、データ型、グラフィック表現、制御フローなど 実世界の抽象化、ハードウェアの抽象化、そしてしばしば抽象化の抽象化です。
プロセッサのパフォーマンスが( ムーアの法則に従って)急激に向上すると、抽象化の必要性が生じます。 私は、プロセッサーのあるコンピューターでプログラミングを開始しましたが、トランジスターの数は数百になりました。 Motorolla 6800には4100個のトランジスタがあり、クロック周波数は1〜2メガヘルツでした。 Zilog Z80には8500個のトランジスタと2〜8 MHzの周波数がありました。 プロセッサのレジスタ、割り込み、ある意味では物理プロセスの動作を理解することは、これらのコンピューターに本当に役立つことをさせる必要があるときに大いに役立ちました。
数十億個のトランジスタを搭載したプロセッサは現在量産中です。 たとえば、Intel Core i7には約10億個のトランジスタが含まれ、クロック周波数は2〜3.5 GHzです。
これは30年前のコンピューターの計算能力の約10億倍です。 しかし、人間はそれほど大きく進化することができませんでした。 プロセッサの電力の増加を効果的に使用する必要がありました。 その後、コンパイラ、仮想マシン、複雑なインターフェース、あらゆる種類のオプティマイザー、高レベルのプログラミング言語、その他のツールが登場しました。 ハードウェアと最新のソフトウェアの間には、多くの抽象化層があります。 そして、もちろん、それらは必要です。
したがって、プログラミングが抽象的思考の傾向を持つ人々を引き付けることは驚くことではありません...そして、おそらく、抽象的思考を持つ人は仕事を楽しみ、この分野で成功を収めるより多くの機会を持っています。
しかし、このように推論すると、すべての人が抽象的な思考によって特徴付けられるわけではないことを忘れがちです。 すべてのプログラマーが抽象指向であると結論付けることも、抽象思考が彼らにとって最良の選択肢であると誤って結論付けることさえできます。
抽象的思考
まず、定義を検討します
アブストラクト(形容詞)
- 抽象、実世界の直接的な知覚とは関係ありません(つまり、事実)
- 適用または実用的ではない、理論的
アブストラクト(名詞)
- 特定の例のセットから共通のプロパティまたはパターンを抽出することにより、一般化されたアイデアまたは概念を定式化するプロセス
抽象化は、定義により、情報の単純化であり、多数の例を調べて、それらを共通のテンプレートに圧縮することにより達成されます。
抽象的思考が自然な人もいれば、特定の事実を好む人もいます。 抽象的に言えば、それは人々が情報を処理する方法についてです。
ビジネスで広く使用されているMyers-Briggsパーソナリティタイプインジケータを検討してください。 このインジケーターを使用すると、直感と常識(タイポロジー表記を使用する場合はNとS)、それぞれ抽象的な思考と具体的な思考に基づいた4つのタイプの性格を識別できます。 (性格タイプの同様の分離を持つ他の心理学的研究があります)
抽象的かつ具体的な思考で明らかにされるいくつかの機能をリストします。
多くの人が自分の行動を状況に適応させるという事実により、与えられた情報を抽象的または具体的な意識の現状として解釈することもできますが、すべての人が支配的な傾向を持っていると考えられています。
抽象的/直感的な思考の兆候
- 思考とアイデア
- 行間を読む
- 未来への人生-将来の機会に関してより大きな関心が示されます
- テンプレート、コンテキスト、および関係はよりよく記憶されます。
- 曖昧なぼやけたデータの意味を推測する必要がある場合、それらのデータを使用して快適に作業できます。
- 抽象的または理論的な情報、関係、およびパターンに大きな自信が示されます。
特定の思考の兆候
- 実際のオブジェクトともの
- 行自体を読む
- ここと今に焦点を当てる
- 多数の詳細と事実がメモリに保存されます。
- 明確で正確な情報が望ましい。明確な事実がない場合は推測しない
- 現在時制の情報が優先されます。これは、5つの感覚のいずれかで感じることができます。
- どこから来たと思われる推測の不信感。
ジョーに戻る
この記事が始まったJoeの話に戻りましょう。彼は(オーバーエンジニアの)コードを複雑にしました。 抽象指向のプログラマーにとって、すべては論理的です
- 今日、問題Xがあります
- Xはより一般的なクラスの問題の別の例で、YとZも含まれます
- YとZの問題が将来発生しないように、X、Y、Zを解決するコードを作成する必要があります
しかし、ジョーと話をしたとき、私は彼に問題Xだけを解決するように頼みました。彼はYとZは将来避けられないことを知っていましたが、質の悪い仕事や将来の自信のために彼にフラストレーションを非難しました極端にします。
ここで、現在の状況が前面に出ます。 先を考える能力はあなたをヒーローにすることができます。 また、先を考える能力は簡単にあなたを負担に変えます。 瞬間的な問題に専念することで、あなたはヒーローになります...または負担になります。
秘trickは、特定の状況でどのアプローチが適切かを理解することです。
また、選択した戦略を同僚と調整する、つまりコミュニケーションすることも非常に重要です。
抽象指向のプログラマーについて聞いたフィードバックをお聞かせください...
ポジティブ
- 彼女は不十分に割り当てられたタスクを引き受け、それらに完全に対処します。
- 彼は問題を深く考え、エレガントな解決策をもたらしました。
- 彼女は常に、より良いアプローチを求めてさまざまなトリックを試みています。
- チーム( AOP )は予想外に多くの素晴らしいアイデアを提案しました
負
- 彼は常に将来の問題に苦しんでいます。私は彼に必要なときに簡単な編集をさせることができません
- 多くの場合、コードが非常に複雑になります(オーバーエンジニア)。 簡単なハックが必要な場合もあります。
- 彼は常にコードベース全体を書き直そうとしています。 継承コードは機能します-そのままにしておきます。
- なぜ彼女は一般的な作業計画に従わないのですか
- 私たちのチーム( AOP )の会議は、差し迫った問題から絶えず移行しています。 もちろん、議論は興味深いものですが、当面のタスクに集中する必要があります。
...そして、特定指向のプログラマー( CPC )についても同じこと
ポジティブ
- 彼は長い間議論していません。 それはただタスクを取り、それを解決します。
- 彼女は私たちの技術的プロセスを認識し、それに従います。
- 彼は常識を示しています。
- このチーム( CPC )は、できることとすべきことを常に行っています。
負
- そのコードは、狭い範囲のタスクを解決します。 これはテストに合格するには十分ですが、実際の使用には十分ではありません。
- 彼女のコードは柔軟性がなく、保守が困難です。 新しい関数を追加するたびに、すべてを書き直す必要があります。
- 彼は現在のタスクの外に何も見ません。 彼のコードは長続きしません。
ミニテスト
リストA.その中のどの項目があなたを最もよく説明していますか? (ためらうことなく答える)
- あなたはその実装の微妙さよりも一般的なアイデアに興味があります
- 人類の運命についてよく考えますか
- 特定の例から一般的なパターンを簡単に識別できます。
- あなたはしばしば人生の複雑さについて話します。
- ほとんどすべてを分析できると思う
- 新しい理論的原理を簡単に理解できます。
- あなたはしばしば、もっと良いことをする方法について考えることに時間を費やします。
- 状況が発生するさまざまな方法を簡単に把握できます。
リストB.その中のどの項目があなたを最もよく説明していますか?
- あなたは理論的な本を読んで退屈しています
- 理論的な選択肢よりも経験に頼ることを好む
- あなたが自分で何かをしようとすることが重要です
- 状況を分析し、起こりうる結果ではなく、現在の状態に焦点を合わせます
- 原則として、現在のクラスは将来の計画以上にあなたを興奮させます。
リストAのアイテムの数がBよりも多いことに同意する場合は、抽象指向でなければなりません。 逆に、リストBのステートメントが優先される場合は、特定のタイプの人格に関係します。
[すぐに予約したい。 まず第一に、性格タイプは運命ではありません。 多くの場合、人生は家族、仕事、友人などのために私たちの行動を適応させる必要があります。 第二に、現在の状況に応じて、同じ質問にさまざまな方法で答えることができることがわかります。 第三に、それはあなたの支配的な考え方を説明することです-これを行動を促すフレーズとしてとる必要はありません。]
適応思考
数年前、私は良いアナロジーを聞いた。 右利きでも左利きでも構いません。 ほとんどの人は、片手をプライマリとして使用し、一部は両方に堪能です。 しかし、誰かがより頻繁に右手を使用するという事実から、彼はまったく左を必要としないということにはなりません。 さらに、一部のタスクでは特定の手を使用する必要があります。右手で左手でハサミを使用するか、自動車を運転して、間違った手で速度を切り替えてみてください。
私たちは皆、事実と一般化されたパターンの両方を処理する方法を知っていますが、多くの場合、私たちは一つのことをする傾向があります。 同様に、特定のタイプの思考がより適切なソリューションのタスクがあります。 私自身の経験から言えば、プログラマーは自然な傾向を理解すると強くなりますが、必要に応じて適応することを学びます。
特定の種類の思考が優先されるタスクの例を次に示します(すべて一般化されています)
- UIデザインには多くの詳細に注意が必要です
- 仕様は幅広い思考から恩恵を受けますが、具体的な例でサポートできます(一般化テストとして、特定の例が与えられると読みやすさが向上し、一般化が現実との接触を失わないことを確認できます)
- スケーラブルなシステムと長寿命のアーキテクチャには抽象化が必要です
- 抽象化のためのオブジェクト指向プログラミング
- プログラマーでも顧客でもない同僚は、特定のタイプの思考に気付くかもしれません。 特別に考えている人とコミュニケーションをとる抽象的に考えている人は、誤解されるリスクを負い、雲の中を飛んでいるような印象を与えます。 抽象的に考えると、理解できる言語で他の人とコミュニケーションをとる方法を学ぶのはいいことです。
どのスタイルの考え方が優れているかを示すという目標を自分自身に設定しませんでした。 代わりに、私は思考とコミュニケーションにおける自己認識とトレーニングの柔軟性のアイデアを提唱します。
絶対抽象主義者である私は、抽象的な思考の素晴らしい例で終わりたい
すべての一般化は偽です。 これを含む。 マーク・トウェイン
そして、マーク・トウェインは抽象志向の作家でした...