Doom3のソースコードの並外れた美しさ

これは、Doom3のソースコードとその美しさについての話です。はい、美しいです。説明させてください。

ビデオゲームDyadをリリースした後、少し休憩しました。私は本を​​読んだり、映画を見たりしました。私はヨーロッパ版のDyadに取り組んでいましたが、その時間は主にソニーの品質保証からのフィードバックを待っていたので、たくさんの自由な時間がありました。1ヶ月ほど歩き回った後、次に何をするのか真剣に考え始めました。新しいプロジェクトのために、Dyadの再利用可能な/エンジンのような部分を抽出したかったのです。

この記事はもともと2013年1月14日に掲載されました。

私が最初にDyadで作業を始めたとき、他のプロジェクトでの長年の作業の蓄積から作成した非常にクリーンでかなり機能的なゲームエンジンがありました。ダイアドの終わりまでに、私は恐ろしい混乱を経験しました。

Dyad開発の最後の6週間で、13,000行を超えるコードを追加しました。MainMenu.ccは24,501行に膨らみました。かつては美しいソースコードは、#ifdefs、無償の関数ポインター、醜いインラインSIMD、およびasmコードでいっぱいの混乱でした。私は、「コードエントロピー」という新しい用語を学びました。数十万行のコードを整理する方法を学ぶために使用できる他のプロジェクトをインターネットで検索しました。いくつかの大きなゲームエンジンを調べた後、私はかなり落胆しました。Dyadのソースコードは、他のすべてのものと比べて実際にはそれほど悪くはありませんでした。

不満、私は見て続け、見つかったのid Softwareのの非常に素晴らしい分析ドゥーム3のソースコードを、コンピュータの専門家ファビアンSanglardで。

ツイートしたとき、私は数日かけてDoom 3のソースコードを調べ、Fabienの優れた記事を読みました。

それは真実でした。私はこれまでソースコードを本当に気にかけたことはありません。私は自分自身を「プログラマー」とは思っていません。私はそれが得意ですが、私にとってはそれは目的を達成するための手段にすぎません。通って行くドゥーム3のソースコードは、私は本当に良いプログラマに感謝しました。

全体像を把握するには:Dyadには193k行のコードがあり、すべてC ++です。Doom 3には601k、Quake IIIには229k、QuakeIIには136kがあります。これにより、DyadQuakeIIQuakeIIIの間のどこかに配置されます。これらは大規模なプロジェクトです。

この記事を書くように頼まれたとき、私は他のゲームからより多くのソースコードを読んだり、プログラミング標準について読んだりするための言い訳としてそれを使用しました。何日も調査した後、私はこのすべてを始めた自分のツイートに混乱しました。ソースコードを参照するとき、実際には「見栄えの良い」、または「美しい」とはどういう意味ですか?私は何人かのプログラマーの友達に、それが何を意味すると思うか尋ねました。彼らの答えは明白でしたが、それでも述べる価値があります。

読む価値があると思うidTech4コーディング標準(.doc)があります。私はこれらの標準のほとんどに従い、なぜそれらが優れているのか、そしてなぜそれらがDoom3コードをとても美しくするのかを説明しようと思います。

Doomで見た中で最も賢いことの1つは、字句解析プログラム[ 1 ]とパーサー[ 2 ]の一般的な使用法です。すべてのリソースファイルは、スクリプト、アニメーションファイル、構成ファイルなどを含む統一された構文のASCIIファイルです。すべてが同じです。これにより、すべてのファイルを1つのコードチャンクで読み取って処理できます。パーサーは特に堅牢で、C ++の主要なサブセットをサポートします。統合されたパーサーとレクサーに固執することで、エンジンの他のすべてのコンポーネントは、そのためのコードがすでに存在するため、データのシリアル化について心配する必要はありません。これにより、コードの他のすべての側面がよりクリーンになります。

Const [ 3 ]に関して私の意見では十分に厳格ではありませんが、Doomのコードはかなり厳格です。Constは、あまりにも多くのプログラマーが無視していると私が信じているいくつかの目的を果たします。私のルールは、「不可能でない限り、すべてが常にconstである必要がある」というものです。C ++のすべての変数がデフォルトでconstであるといいのですが。運命はほとんどの場合、「出入りなし」のパラメータポリシーに固執します。つまり、関数のすべてのパラメーターは入力または出力のいずれかであり、両方ではありません。これにより、変数を関数に渡すときに、変数で何が起こっているのかを理解しやすくなります。例えば:

この関数定義これは私を幸せにします!

いくつかのconstから、私は多くのことを知っています。

constルール、および入出力パラメーターがないことは、私の目には、良いコードと美しいコードを区別する最も重要なことの1つです。これにより、システム全体が理解しやすくなり、編集やリファクタリングが容易になります。

これは文体の問題ですが、Doomが通常行う美しいことの1つは、過剰なコメントではありません。私は次のようなコードが多すぎるのを見てきました:

これは非常に苛立たしいことです。このメソッドが何をするのかはその名前でわかります。その名前からその機能を推測できない場合は、その名前を変更する必要があります。名前で説明するには多すぎる場合は、少なくします。単一の目的を説明するためにリファクタリングや名前の変更が本当にできない場合は、コメントしてもかまいません。プログラマーは学校でコメントが良いと教えられていると思います。そうではありません。コメントは、完全に必要であり、めったに必要でない限り、悪いものです。ドゥームはコメントを最小限に抑えるのに合理的な仕事をします。idSurface :: Split()の例を使用して、コメントの仕方を見てみましょう。

//サーフェスを前面と背面に分割し、サーフェス自体は変更されません
// frontOnPlaneEdgesとbackOnPlaneEdgesは、オプションで、分割平面上にあるエッジへのインデックスを格納します
// SIDE_?を返します。

最初の行は完全に不要です。関数定義からそのすべての情報を学びました。2行目と3行目は貴重です。2行目のプロパティを推測することはできますが、コメントによって潜在的なあいまいさがなくなります。

Doomのコードは、ほとんどの場合、コメントで司法であり、読みやすくなっています。これは一部の人にとってはスタイルの問題かもしれないことは知っていますが、それを行うための明確な「正しい」方法があることは間違いありません。たとえば、誰かが関数を変更し、最後にconstを削除した場合はどうなりますか?次に、関数内からサーフェス* COULD *を変更すると、コメントがコードと同期しなくなります。無関係なコメントはコードの可読性と正確性を損ない、コードを醜くします。

運命は垂直方向のスペースを無駄にしません:

t_stencilShadow :: R_ChopWinding()の例を次に示します。

画面の1/4でそのアルゴリズム全体を読み取ることができ、残りの3/4は、そのコードのブロックが周囲のコードと比較してどこに収まるかを理解できます。私はこのようなコードを見てきました:

これは、「スタイル」に該当するもう1つのポイントになります。私は後者のスタイルで10年以上プログラミングし、約6年前のプロジェクトに取り組んでいる間、よりタイトな方法に転換することを余儀なくされました。切り替えてよかったです。

後者は前者の11行と比較して18行かかります。これは、*正確な*同じ機能のコード行数のほぼ2倍です。これは、コードの次のチャンクが画面に収まらないことを意味します。次のチャンクは何ですか?

そのコードは、前のforループチャンクなしでは意味がありません。idが垂直方向のスペースを尊重していなかった場合、それらのコードは読みにくく、書きにくく、維持しにくく、美しくありません。

idが行うもう1つのことは、スタイルの問題ではなく「正しい」と私が信じていることです。オプションの場合でも、*常に* {}を使用します。中括弧をスキップするのは犯罪だと思います。私は次のようなコードを見てきました:

これは醜いコードであり、{}を自分の行に配置するよりも悪いです。{}をスキップしたidのコードの例は1つも見つかりませんでした。オプションの{}を省略すると、このwhile()ブロックの解析に必要以上の時間がかかります。また、編集が面倒になります。elseif(c> d)パス内にifステートメントブランチを挿入したい場合はどうなりますか?

idは、C ++の世界では大したことはありませんでした。彼らは必要なすべてのSTL [ 4 ]関数を書き直しました。私は個人的にSTLと愛憎関係にあります。でダイアドIデバッグにそれを使用して、動的リソースを管理するために構築します。リリースでは、すべてのリソースをベイク処理して、できるだけ早くロードし、STL機能を使用しないようにしました。STLは、高速な汎用データ構造を提供するので便利です。それを使用すると醜くてエラーが発生しやすいので、それは悪いことです。たとえば、std :: vector <T>クラスを見てみましょう。各要素を繰り返し処理したいとします。

それはC ++ 11で単純化されます:

私は個人的にautoの使用が好きではありません。それはコードを書きやすくしますが、読みにくくすると思います。今後数年で自動車の使い方に出くわすかもしれませんが、今のところ悪いと思います。std:for_eachやstd :: remove_ifのようないくつかのSTLアルゴリズムのばかげたことについては言及しません。

std :: vectorから値を削除するのもばかげています:

ねえ、それは毎回すべてのプログラマーによって正しく入力されるでしょう!

idは、すべてのあいまいさを取り除きます。独自の汎用コンテナー、文字列クラスなどをロールしました。おそらく理解しやすくするために、STLクラスよりもはるかに汎用性が低くなっています。それらは最小限のテンプレートであり、ID固有のメモリアロケータを使用します。STLコードには、テンプレートのナンセンスが散らばっているため、読み取ることができません。

C ++コードは、プログラマーの側の努力なしに、すぐに手に負えない醜いものになる可能性があります。悪いことがどのように発生するかを確認するには、STLソースコードを確認してください。MicrosoftとGCCの[ 5 ] STL実装は、おそらく私が今まで見た中で最も醜いソースコードです。プログラマーがテンプレートコードをできるだけ読みやすくするために細心の注意を払っていても、それは完全に混乱しています。見てみましょうアンドレイ・アレキのロキライブラリを、またはブーストライブラリの世界と細心の注意で最高のC ++プログラマのいくつかによって書かれている-これらは、可能な限り美しいとしてそれらを作るために撮影された、と彼らはまだ醜いと基本的には読めないです。

idは、物事を過度に一般的にしないことでこの問題を解決します。それらには、HashTable <V>クラスとHashIndexクラスがあります。HashTableはキータイプを強制的にconstchar *にし、HashIndexはint-> intペアです。これは不十分なC ++プラクティスと見なされます。それらは単一のHashTableクラスを持ち、KeyType = const char *の部分的な特殊化と、完全に特殊化された<int、int>を記述している必要があります。idが行うことは完全に正しく、コードをはるかに美しくします。

これは、ハッシュ生成の「優れたC ++プラクティス」とidがそれをどのように行うかを対比することでさらに調べることができます。

次のように、HashTableへのパラメーターとして特定の計算クラスを作成することは多くの人にとって良い習慣であると考えられます。

これは、特定のタイプに特化することができます。

次に、ComputeHashForTypeをHashTableのHashComputerとして渡すことができます。

これは私がやった方法と似ています。賢いようですが、男の子は醜いです!オプションのテンプレートパラメータがもっとあった場合はどうなりますか?多分メモリアロケータ?多分デバッグトレーサー?次のような定義があります。

関数の定義は残酷です!

それは一体何の意味ですか?積極的な構文の強調表示がないと、メソッド名を見つけることさえできません。ボディコードよりも定義コードの方が多いと考えられます。これは明らかに読みにくく、したがって美しくありません。

他のエンジンがテンプレート引数の仕様を無数のtypedefにオフロードすることで、この混乱を管理しているのを見てきました。これはさらに悪いです!ローカルコードを理解しやすくするかもしれませんが、ローカルコードと包括的なシステムロジックの間に別の切断層が作成され、ローカルコードがシステム設計を示唆しないようになります。これは美しくありません。たとえば、コードがあったとしましょう。

そして

両方を使用して、次のようなことをしました。

StringHashTableのメモリアロケータであるStringAllocatorがグローバルメモリに寄与しない可能性があり、混乱を招く可能性があります。コードをさかのぼって、StringHashTableが実際にはテンプレートの混乱のtypedefであることを確認し、テンプレートコードを解析し、別のアロケーターを使用していることを確認し、そのアロケーターを見つけます...何とか何とか醜いです。

Doomは、一般的なC ++ロジックに従って、完全に「間違った」ことを行います。つまり、意味のある場合にのみジェネリックを使用して、可能な限り非ジェネリックに書き込みます。何かのハッシュを生成する必要がある場合、DoomのHashTableは何をしますか?受け入れるキーのタイプはconstchar *のみであるため、idStr :: GetHash()を呼び出します。別のキーが必要な場合はどうなりますか?私の推測では、キーをテンプレート化し、key.getHash()を強制的に呼び出し、すべてのキータイプにint getHash()メソッドがあることをコンパイラーに強制させます。

idの元のプログラミングチームが会社にどれだけ所属しているかはわかりませんが、JohnCarmackは少なくともCのバックグラウンドを持っています。Quake III以前のすべてのidゲームはCで書かれていました。私は、強いCのバックグラウンドを持たない多くのC ++プログラマーがコードをC ++化しすぎているのを見つけました。前のテンプレートの例は1つのケースにすぎませんでした。私がよく見つける他の3つの例は次のとおりです。

idは、これらすべての場合において非常に司法です。

多くの場合、クラスを作成できます。

これは、コード行と読み取り時間の無駄です。以下と比較して、書き込みと読み取りに時間がかかります。

varをnずつ増やすことが多い場合はどうなりますか?

vs

最初の例は、読み取りと書き込みがはるかに簡単です。

idは文字列ストリームを使用しません。stringstreamには、おそらく私が今まで見た中で最も極端な演算子のオーバーロードが含まれています:<<。

例えば:

それは醜いです。これには強力な利点があります。クラスのvtableに触れることなく、クラスごとにJavaのtoString()メソッドに相当するものを定義できますが、構文は不快であり、idは使用しないことを選択しました。stringstreamの代わりにprintf()を使用することを選択すると、コードが読みやすくなるため、正しい判断だと思います。

ずっといい!

SomeClassの演算子<<の構文もばかげています:

[補足: John Carmackは、静的分析ツールにより、一般的なバグがprintf()でのパラメーターのマッチングが正しくないことが明らかになったと述べています。このため、Rageではstringstreamsに変更されたのだろうか。GCCとclangはどちらも-Wallでprintf()パラメーターの一致エラーを検出するため、これらのエラーを検出するために高価な静的分析ツールは必要ありません。]

Doomコードを美しくするもう1つの点は、演算子のオーバーロードの使用を最小限に抑えることです。演算子のオーバーロードは、C ++の非常に優れた機能です。それはあなたが次のようなことをすることを可能にします:

これらの操作をオーバーロードしないと、書き込みと解析に時間がかかります。運命はここで止まります。そうでないコードを見たことがあります。演算子 '%'をオーバーロードしてドット積または演算子Vector * Vectorをオーバーロードし、区分的ベクトル乗算を実行するコードを見てきました。クロス積の*演算子を作成することは意味がありません。これは、3Dにのみ存在するため
です。必要に応じて、some_2d_vec * some_2d_vecを実行します。どうすればよいですか?4D以上はどうですか?idの最小限の演算子のオーバーロードは、コードの読者にあいまいさを残しません。

Doomコードから学んだ最大のことの1つは、単純なスタイルの変更でした。以前は次のようなクラスがありました。

idのDoom3コーディング標準によると、4つのスペースである実際のタブを使用します。すべてのプログラマーに一貫したタブ設定を設定すると、クラス定義を水平方向に揃えることができます。

インライン関数をクラス定義内に配置することはめったにありません。私が見たのは、コードが関数宣言と同じ行に書かれているときだけです。この慣行は標準ではなく、おそらく嫌われているようです。クラス定義を整理するこの方法により、解析が非常に簡単になります。メソッドを定義するときに大量の情報を再入力する必要があるため、作成にはもう少し時間がかかる場合があります。

私はすべての余分なタイピングに反対しています。私はできるだけ早く作業を行う必要がありますが、これは、クラス定義をプログラマーが解析する必要があるたびに、クラスを定義するときに少し余分な入力が必要になると思う状況の1つです。で提供されるいくつかの他の文体の例がありますドゥーム3つのコーディング標準(.DOCの美しさに貢献)ドゥームのソースコードは。

Doomのメソッド命名ルールが欠けていると思います。私は個人的に、すべてのメソッド名は動詞で始まる必要があるという規則を強制します。

例えば:

よりもはるかに優れています:

この記事を書くことに本当に興奮しました。それは、美しいコードが何であるかを本当に考える言い訳を与えてくれたからです。私はまだ私が知っているとは思いません、そして多分それは完全に主観的です。少なくとも私にとって、2つの最大のことは、文体のインデントと最大の安定性だと思います。

文体の選択の多くは間違いなく私の個人的な好みであり、他のプログラマーは異なる意見を持っていると確信しています。使用するスタイルの選択は、コードを読み書きする必要がある人次第だと思いますが、それは確かに検討する価値のあることだと思います。

システムデザインから文字のタブスペースまで、完全なパッケージとして美しいコードを例示していると思うので、Doom3のソースコードをすべての人に見てもらうことをお勧めします。

Shawn McGrathは、トロントを拠点とするゲーム開発者であり、高く評価されているPlayStation3サイケデリックパズルレーシングゲームDyadの作成者です。彼のゲームの詳細をご覧くださいTwitterでフォローしください

脚注

[ 1 ]字句解析プログラムは、(関連するコンテキストで)ソースコードの文字を意味的に重要な一連のトークンに変換します。ソースコードは次のようになります。

x = y + 5;

字句解析プログラム(または略して「レクサー」)は、そのソースを次のようにトークン化する場合があります
。x=>変数
==>代入演算子
y =>変数
+ =>追加の演算子
5 =>リテラル整数
; =>終了ステートメント

このトークンの文字列は、ソースコードを実行中のプログラムに変換する多くのステップの最初のステップです。字句解析に続いて、トークンはパーサー、コンパイラー、リンカー、そして最後に仮想マシン(コンパイルされた言語の場合はCPU)に送られます。これらの主要なステップの間に中間ステップを挿入することができますが、リストされているステップが一般的に最も基本的であると考えられています。

[ 2 ]パーサーは、(通常)言語の機械理解における字句解析に続く次の論理ステップです(このコンテキストではコンピューター言語/ソースコードですが、同じことが自然言語にも当てはまります)。パーサーの入力は、字句解析プログラムによって生成されたトークンのリストであり、構文ツリー(「解析ツリー」)を出力します。

例:x = y + 5では、解析ツリーは次のようになります。

[ 3 ]「const」は、変数を変更できないようにする、またはメソッドがそのクラスの内容を変更しないようにするC ++キーワードです。「const」は「constant」の省略形です。C ++には、const_cast [T]またはCスタイルのキャスト(T *)による回避策が含まれていることに注意してください。これらを使用するとconstが完全に壊れます。議論のために、私はそれらの存在を無視し、実際には使用しないことを好みます。

[ 4 ] STLは「標準テンプレートライブラリ」の略です。これは、C ++プログラマーが一般的に使用するコンテナー、アルゴリズム、および関数のセットです。これは、さまざまなレベルの最適化およびエラー報告機能を備えたすべての主要なコンパイラベンダーによってサポートされています。

[ 5 ] GCC-GNUコンパイラコレクション:複数のプログラミング言語をサポートするコンパイラのセット。この記事の場合は、GNU C / C ++コンパイラーを指します。GCCは無料のコンパイラであり、完全なソースコードを無料で入手でき、さまざまなコンピュータやオペレーティングシステムで動作します。その他の一般的に使用されるコンパイラには、clang、Microsoft Visual C ++、IBM XL C / C ++、Intel C ++コンパイラが含まれます。

提案された投稿

PAXイーストモンスターハンターキャラバンのツアー

PAXイーストモンスターハンターキャラバンのツアー

ボストンのPAXEastで今週末、コンベンション参加者はモンスターハンターキャラバンを訪れることができます…または少なくとも、かなりまともなレクリエーションです。キャラバンはiam8bitと提携して作成され、いくつかのかなり素晴らしい小道具があります。

WWEスターは、月曜日の夜の生の間にファイナルファンタジーの勝利のテーマを2回再生します

WWEスターは、月曜日の夜の生の間にファイナルファンタジーの勝利のテーマを2回再生します

果てしなく面白いWWEタグチームのアクトTheNewDayのリーダーであるXavierWoodsは、昨夜の月曜日の夜の生のエピソードに2つのファイナルファンタジーイースターエッグを追加しました。彼は舞台裏のセグメントでトロンボーンでシリーズのシグネチャー勝利ファンファーレを演奏し、その後、彼のパートナーがジョン・シナと戦っているメインイベントで素晴らしい演奏をしました。

関連記事

モンスターハンターストーリーズは私が今までプレイした中で最高のポケモンゲームです

モンスターハンターストーリーズは私が今までプレイした中で最高のポケモンゲームです

モンスターハンターストーリーズは、人気のある狩猟シリーズを取り入れて、クールな生き物を孵化させることについての愛らしいロールプレイングゲームにそれを混ぜ合わせます。プレイヤーは、モンスターを細かく刻むのではなく、モンスターと仲良くなる「ライダー」の役割を果たします。

誰もが望んでいるわけではないペーパーマリオゲーム

誰もが望んでいるわけではないペーパーマリオゲーム

開発者は陽気でした。彼女が私にプレイさせたゲームは楽しかったです。

内なる悪は本当に一生懸命に試み、失敗する

内なる悪は本当に一生懸命に試み、失敗する

サイコブレイクのダウンロード可能なコンテンツは..

このニンテンドースイッチキーボードをチェックしてください

このニンテンドースイッチキーボードをチェックしてください

[画像:サイバーガジェット]今年9月に日本でNintendo Switchに登場する大規模マルチプレイヤーオンラインロールプレイングゲームのドラゴンクエストXに伴い、周辺メーカーはSwitch対応のキーボードを準備しています。このサイバーガジェットは別のものです。

MORE COOL STUFF

How to Buy Tickets for TXT’s ‘ACT: LOVE SICK’ Tour

How to Buy Tickets for TXT’s ‘ACT: LOVE SICK’ Tour

Here's how K-pop fans can try and purchase concert tickets for TXT's upcoming 'ACT: LOVE SICK' world tour.

ハルシーは彼らが新しいTikTokで「新しい音楽をからかい始める」かもしれないと言います

ハルシーは彼らが新しいTikTokで「新しい音楽をからかい始める」かもしれないと言います

新しいTikTokで、シンガーソングライターのHalseyは、ファンに「新しい音楽をからかい始めたい」と誘惑していることを明らかにしました。

カーリー・サイモンはロックの殿堂の殿堂入りのために「それは時間だ」と言います

カーリー・サイモンはロックの殿堂の殿堂入りのために「それは時間だ」と言います

カーリー・サイモンは、彼女がロックの殿堂入りするのに何がそんなに時間がかかったのか疑問に思いました–ヤーン・ウェナーがその理由でしたか?

「トゥデイショー」:ジェンナブッシュヘイガーの5月のブッククラブがスポットライトを選ぶ「予期せぬが驚くべき友情」

「トゥデイショー」:ジェンナブッシュヘイガーの5月のブッククラブがスポットライトを選ぶ「予期せぬが驚くべき友情」

「トゥデイショー」のジェンナブッシュヘイガーは、珍しい友情と未解決の謎を探求する彼女の5月の読書クラブの選択を共有しました。

アンライスのヴァンパイアクロニクルショーは、新しい生命を発見します

アンライスのヴァンパイアクロニクルショーは、新しい生命を発見します

彼女の拷問され、道徳的に対立する主人公のように、映画とテレビの世界は、アン・ライスの長年のヴァンパイア・クロニクルをひどくうまく扱​​っていません。インタビュー・ウィズ・ザ・ヴァンパイアは、トム・クルーズからライスの時代を超越したアンチヒーローのレスタット(そしてキルスティン・ダンストは悪質なベイビー・ヴァンプ・クローディア)としてなんとか楽しんでいましたが、最終的には混乱のようなものでした。より良い。

インクレディブル2はいくつかの興味深い新しいスーパーを紹介します

インクレディブル2はいくつかの興味深い新しいスーパーを紹介します

インクレディブルは、インクレディブル2の「The」を除いて戻ってきました。新しいトレーラーがリリースされたとしても、ピクサーの今後のインクレディブル2についてはまだ多くのことがわかっていません。

PAXイーストモンスターハンターキャラバンのツアー

PAXイーストモンスターハンターキャラバンのツアー

ボストンのPAXEastで今週末、コンベンション参加者はモンスターハンターキャラバンを訪れることができます…または少なくとも、かなりまともなレクリエーションです。キャラバンはiam8bitと提携して作成され、いくつかのかなり素晴らしい小道具があります。

Bowers&Wilkinsの最初のワイヤレスヘッドフォンは素晴らしい—1つのものを除いて

Bowers&Wilkinsの最初のワイヤレスヘッドフォンは素晴らしい—1つのものを除いて

私は通常、オンイヤーヘッドホンは好きではありません。それは主に快適なことです—それと孤独な人は外の世界から身を隠したいのです。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

ボビー・ブラウンの妻アリシアは彼の過去に焦点を当てていません:「ボビーとホイットニーは彼らの時間でした—私は彼のヤンの陰です」

ボビー・ブラウンの妻アリシアは彼の過去に焦点を当てていません:「ボビーとホイットニーは彼らの時間でした—私は彼のヤンの陰です」

5月31日発売の新しいA&EリアリティシリーズBobby Brown:Every Little Stepに先立ち、10年近くのカップルがラブストーリーを共有します。

生存者:タイ準優勝のクレイ・ジョーダンが66歳で死亡

生存者:タイ準優勝のクレイ・ジョーダンが66歳で死亡

サバイバーの第5シーズンで2位につけたクレイ・ジョーダンは、短い病気で木曜日に亡くなりました

Amazon TextractとNodeJSを使用して、フォーム画像をHTMLフォームに変換します

Amazon TextractとNodeJSを使用して、フォーム画像をHTMLフォームに変換します

この記事では、Amazon TextractとNodeJSを使用して、画像(単純なフォームを含む)をHTMLフォームに変換する方法を学習します。Amazon Textractは、スキャンしたドキュメントからテキストとデータを自動的に抽出するサービスです。

政治的妄想と幻想、左と右

政治的妄想と幻想、左と右

あなたはニューヨーク、LAに住むことによって彼らが共有する政治的妄想と幻想を認識することを学びます

サーバーアイコンの4つの基本

サーバーアイコンの4つの基本

これらは、Discordサーバーアイコンのために従うべき4つの基本です。ロゴまたはアイコンとは何ですか?アイコンは、現在ほとんどトレンドになっているものです。

《這樣設計》不要再問設計師需不需要學前端的技術了!

《這樣設計》不要再問設計師需不需要學前端的技術了!

「自分のテクノロジーをすべて忘れるのに数年かかりました。それが私が良いチームを率いるようになった理由です。」この文章は15年前にIBMの幹部から言われました。当時、私はいつもそうではないと感じていました。チームの全員を説得する能力が必要ですか?私自身も就職・仕事学科を卒業したデザイナーで、社会を離れる前からUIUXデザイナーとして働き始めました。10年近く働いた後、徐々に就職や就職の経歴を忘れてしまいました。部門を超えたコミュニケーションがどんどん進んでいます。順調に進んでいます。15年前に先輩が教えてくれたことを理解しています。次の質問を考えれば、おそらく共鳴すると思います。実際には、デザイナーの立場はさまざまです。企業が異なれば、市場も異なります。多くの企業は、フロントエンドの技術的能力をボーナスポイントの条件と見なす可能性があり、出力の価値を迅速に実現する必要があります。これらの追加のポイントをすでに知っている場合は、ポジションを選択する機会が増えたことを祝福します。このフィールドに入るのをためらっている場合は、フロントエンドを勉強する必要がありますか?または、エンジニアとのコミュニケーションで障害に遭遇した場合は、この記事を通じてそれについて学びたいと思うかもしれません。現実には、誰もが時間に限りがあります。フロントエンドの学習にリソースを投資すると、分析、設計、テストを試す機会は言うまでもなく、設計の分野での時間は比較的少なくなります。専門分野の場合、フロントエンドの条件は、体系的に考えてプロセスを実装するのに役立ちますが、実際には「問題を解決」できない場合があります。少し前にWangYanboの記事で「インタビューポートフォリオでUXの考え方を示す方法」を説明したデザイナーの価値。使用理論の観点から、ソフトウェア会社は次の目的でデザイナーを雇うことを望んでいます。 「製品」の場合「サービスを計画するとき」-「ユーザーが使いやすく、理解しやすいサービスを手に入れたい」-「価値を創造し、ビジネスモデルの成功を支援」できるようにするもちろん、この説明は当てはまりません。すべてのビジネス。2021年にUXTWが実施した統計調査によると、企業の3分の1近くがまだUXを理解している段階にあります。専攻を理解している指導教員に会えれば、設計プロセスは比較的スムーズになります。専門外のスーパーバイザーに出会ったら、おめでとうございます。上向きのコミュニケーションを学ぶ機会が増えます。プロのデザイナーの仕事の一部は、社内の人員やマネージャーのトレーニングから生まれ、将来のコミュニケーションがスムーズになります。会社がこのポジションを採用した理由を別の観点から考える方法を知っていれば、デザインへの道を進む方法をよりよく知ることができます。すべてのデザイナーは、「ゲーム」全体を理解している場合にのみ、自分の価値を強調する機会があると思います。存在するものには理由があるはずです。現状では、個人的な興味(やりたいこと)を脇に置いて、組織内でデザイナーを配置する上司の役割を理解してください。組織はドラゴンボートを漕ぐようなものですが、目標は前進することです。、優れた能力や別の専門家を雇うと、ボートのバランスが不均一になり、上司はバランスに多大な労力を費やします。フロントエンドテクノロジーを学ぶことで、チームメンバーはあなたに依存するようになりますか?このレベルから考えることに加えて、インタビューを通してそれについて学ぶこともできます。実際、組織には善悪はありません。チームはそれぞれの立場に立って、お互いに最も合理的な専門的価値を提供します。会社における私自身の価値は、ユーザーと協力して最も合理的な価値を見つけることです。客観的な視点。問題点を特定し、解決可能な解決策と実践を提供します。これまで、私は促進する方法としてフロントエンドテクノロジーを使用していません。デザイン思考を使って価値を創造する企業は、今でもUIUXデザイナーを「美容編集者」として扱っています。デザイナーと美的編集者の違いは、問題を解決する能力にあり、美容はその一部にすぎません。問題を解決する方法、私の最大の影響力とは、デザインについて考える能力です。デザイン思考には、論理的思考、批判的思考、その他の合理的な左脳思考、および右脳の想像力と組み合わせる能力が含まれます。これは、共感、調整、全体性、デザイン、ストーリーテリングに基づいており、デザイナーは各リンクを明確にし、あいまいな状態で新しい視点を作成する可能性を示します。デザイン思考を通じて提供できる価値は、「調査」、「分析統合」、「コンセプト形成」、「プロトタイピング」のいずれの段階であっても、継続的に派生する多くの新しい方法やテクノロジーがあります。 10年前はイラストレーターをプロトタイプのツールとして使っています。5年前にSketchが登場した後、学ぶためにMacを購入しなければなりませんでした。過去3年間、Figmaに焦点を当てており、部門間のコミュニケーションのコストを削減するのに役立っています。 。限られた時間の中で、デザイナーは最も重要なデザイン思考を通して自分の価値と発展を理解する必要があります!2.ポイント、ライン、サーフェスでキャリアを見るデザインのバックグラウンドがある場合は、バウハウスデザインスクールが教えているポイント、ライン、サーフェスに精通している必要があります。ポイント、ライン、サーフェスは、日常生活と私たちの生活を構成します。ドット、ライン、サーフェスの概念は、デザイナーがレイアウト、効果、革新的な要素を使用するのに役立ちます。ここでは、ドット、ライン、サーフェスの概念を使用してキャリア開発を選択する方法を紹介します。ディアンディアンは地面にある石のようなもので、私たちの視点から見ると目立たないです。今日の小さなアリなら、石は小さな丘のようなものです。ポイントは、人々に「気持ち」を表現することです。さまざまな立場や視点が気持ちに影響を与えます。「デザイナー」の役割と同様に、会社の規模、開発段階、市場はすべて、デザイナーの配置に影響を与えます。線は他の位置(ドット)との連携のようなものです。ドット間の距離は、デザインのプッシュがスムーズかどうか、さらに重要なことに、ドット間に接続があるかどうかに影響します。大企業への参入を期待する場合、デザインは個人の能力に依存するだけでなく、プロジェクトは通常、「システム」、「プロセス」、「組織」と相互作用します。小規模企業への参入を期待する場合は、それからそれはしばしば単なるネジではなく、解決するためにさまざまな問題に対処する準備ができている、3つのヘッドと6つのアームの能力を必要とします。デザイナーのスキルを包括的に見ると、情報アーキテクチャ、ユーザーリサーチ、ターゲット分析、インターフェイスデザイン、アイコンの構成などはすべて異なるポイントです。より包括的に成​​長したい場合は、フロントエンドのテクニカルポイント、私がつながり、成長するのを手伝ってくれませんか?ここでは、考えるのに役立つ3つのポイントを要約します。スキルツリーをより広く、より遠くから見て、フロントエンドを学習する未来はありますか?あなたが選んだ業界はあなたの発展に影響を与えます、あなたはどのトラックでレースをしていますか?あなたの能力はどのように上昇しますか?基本的な判断方法があります。ここを参照してください。以前の記事を読んだ場合は、点、線、表面、およびSimon Sinekのゴールデンサークル理論に焦点を当て、「表面から設計する理由(WHY)」を明確に理解できるはずです。 "、「ライン」からデザインを行う方法(HOW)と、目標を達成するために「ポイント」から何をするか(WHAT)を明確に理解します。デザイナーに興味がある場合は、私の記事「デザイン」も参照してください。このように」。あなたが解決するのは、問題は何ですか?3.「次の10億の仕事は、「T字型の才能」の5つの主要な能力を蒸発させ、H字型の才能の世界誌の記事であなたが排除されるのを防ぎます。単一の分野の専門知識とスキルは絶えず更新され、過去に学んだ知識やスキルは将来の仕事に適用できない可能性がありますが、能力の横軸は、位置に関係なく、単一の仕事と産業の分野から独立しています仕事と産業はこれらの能力を必要とし、時間や状況によって変化することはありません。現在の専門能力開発は「I字型の才能」だけではなく、競争力を維持したいのであれば、「T字型の才能」に向けて成長する必要があります。自分の専攻で、少なくとも他のページについては少し知っていますが、「T字型の才能」の概念は1980年から存在しています。それは2022年でもまだ適用できますか?フロントエンド専攻の勉強を始めた皆さん、おめでとうございます!あなたは「π型の才能」に向かって成長しているかもしれません。それは、複合、開発、革新、競争の4つの特徴を持つ少なくとも2つの専攻を持つことを指します。21世紀は比較的適用可能です。フロントエンドを学ぶことが「piデザイナー」になるのに役立つかどうかにかかわらず、考えるのに役立つ3つの側面があります。デザインを促進するために、デザイナーはアイデアから実装までを開始します。直線。しばらく作業すると、線を曲げるのが複雑になることがあります。私自身のB2B業界には、促進し協力する多くの利害関係者がいます。時には、彼らの興味、ニーズ、つながりを見つけて、デザインを促進するための最も適切な方法を見つける機会が必要です。情報爆発の時代にさかのぼると、製品の開発とマーケティング5.0の戦略を見ることができます。「人」に焦点を当てたものに焦点を当て、「人」と「人」のつながりを実現することができます。世の中変わったんだよ。デザイナーが特定のネットワークと知識を持ち、さまざまなバックグラウンドを持つ人々とコミュニケーションを取り、自分以外の人々を理解できる場合、他の職業を統合することができます。最後に、優れた設計者は、絶えず変化する世界でより多くの柔軟性と接着性を維持し、より良い設計価値を反映するために専攻間の距離(コスト)を短縮する必要があると思います。。

Tags

Categories

Top Topics

Language