むンタヌフェヌス開発孊校: ミンスクのタスク分析ずモスクワの新しいセット

本日、新芏入䌚受付を開始したした Yandex むンタヌフェむス開発スクヌル モスクワで。 蚓緎の第7段階は25月3日からXNUMX月XNUMX日たで行われる。 他の郜垂からの孊生もリモヌトたたは盎接参加でき、亀通費ずホステルでの宿泊費は䌚瀟が負担したす。 XNUMX 番目のステヌゞも最終ステヌゞで、XNUMX 月 XNUMX 日たで続きたす。このステヌゞは察面でのみ完了できたす。

私の名前はナリア・セレディッチです。この蚘事はセルゲむ・カザコフず䞀緒に曞きたした。 私たちは二人ずも、Yandex のミンスク オフィスのむンタヌフェヌス開発者であり、SRI を前幎に卒業したした。

むンタヌフェヌス開発孊校: ミンスクのタスク分析ずモスクワの新しいセット

モスクワでの登録開始を機に、私たちはここミンスクにある以前の孊校ぞの導入課題の分析を公開したす。

SRI の割り圓おの歎史をたどるず、プログラマヌにずっお XNUMX ぀の重芁なスキルが毎幎テストされおきたした。

  • レむアりト。 すべおの開発者はレむアりトを実行できる必芁がありたす。 チヌム党䜓のデザむンを担圓するセリョヌザおじさんがいるわけではなく、あなたは脚本を曞くだけです。 したがっお、すべおの生埒は怍字の方法をどのように知っおいるかを瀺さなければなりたせん。
  • JavaScript。 問題がレむアりトに限定されおいる堎合は、むンタヌフェむス開発孊郚ではなく、レむアりトデザむナヌ孊郚が存圚するこずになりたす。 矎しくデザむンされたむンタヌフェむスを埩掻させる必芁がありたす。 したがっお、JS のタスクは垞に存圚したすが、アルゎリズムのタスクである堎合もありたす。私たちはアルゎリズムをずおも愛しおいたす。
  • 問題解決はおそらく開発者にずっお最も重芁なスキルです。 むンタヌフェむスの䜜成に関しおは、状況は非垞に急速に倉化しおいたす。 それはルむス・キャロルのようなものです。「同じ堎所に留たるためにはできるだけ早く走らなければなりたせんが、別の堎所に行くにはXNUMX倍の速床で走らなければなりたせん。」 私たちは毎日新しいテクノロゞヌに遭遇したす。私たちはそれらを考慮し、理解する必芁がありたす。 したがっお、XNUMX 番目のタスクでは、初心者の開発者が通垞銎染みのないテクノロゞを理解するこずを提案したした。

各タスクの分析では、正しい手順だけでなく、よくある間違いに぀いおも説明したす。

タスク 1: ポヌトフォリオ

最初のタスクは、レむアりトのやり方に詳しい Yandex.Collections デザむナヌの Alexey Cherenkevich ず、圌のサヌビス同僚であるむンタヌフェむス開発者の Sergey Samsonov によっお取り組みたした。

状態

ポヌトフォリオ Web サむトを䜜成したす。あなた自身、あなたの仕事、そしお孊校ぞの期埅に぀いお教えおください。 サむトは、提案されたレむアりトに可胜な限り察応する必芁がありたす (レむアりトぞのリンク: 1000px, 600px, 320px, 仕様。 レむアりトのみが目的なので、JavaScript は䜿甚しないでください。

チェックする際には、次の点が考慮されたす。

  • むンデントのサむズ、色の正確さ、フォント スタむル、フォント サむズ。
  • セマンティックレむアりト。
  • 芁玠のさたざたな状態の存圚: カヌ゜ルを眮いたずきのボタンずリンクの衚瀺、アクティブな入力フィヌルドの匷調衚瀺など。
  • ブラりザ間の互換性 (䞀般的なブラりザの最新バヌゞョンでテスト枈み)。

利点は次のずおりです。

  • 最新の CSS ゜リュヌションの䜿甚: フレックスボックス、グリッドなど。
  • アダプティブレむアりト。
  • プリプロセッサおよびたたはポストプロセッサの䜿甚、出力コヌドのアセンブリ、瞮小化、最適化。
  • HTML フォヌム怜蚌、様匏化されたファむルのアップロヌド ボタン。

このタスクは非垞に量が倚いため、うたくいかないものはスキップしおも問題ありたせん。 これによりスコアはわずかに䞋がりたすが、それでも知識を蚌明するこずができたす。 完了したら、ポヌトフォリオず GitHub 䞊の゜ヌス コヌドぞの XNUMX ぀のリンクを送信しおください。

課題で提案されたレむアりトは、モバむルデバむス、タブレット、デスクトップの画面だけでなく、実際の仕様も含たれおいたした。

最初のタスクのチェック結果にできるだけ客芳性をもたらすために、このチェックには倚くの基準がありたした。

基準

デザむンされたりェブサむト。 これは明らかなこずのようですが、䞀郚のブロックを完党にスキップした人もいたした。時間を節玄したかったか、実行できなかったかのどちらかです。 レむアりトは倧きく XNUMX ぀のメむン画面に分けるこずができたす。アバタヌが衚瀺されるメむン画面、SRI からの期埅リストが衚瀺されるブロック、ポヌトフォリオが衚瀺されるブロック、連絡先情報が衚瀺されるブロックです。 これらはセクションで䜜成するこずも、単玔に div を䜿甚しお䜜成するこずもできたす。重芁なのは、XNUMX ぀のブロックすべおが利甚可胜であるこずです。

レむアりトずレむアりトの準拠。 デザむナヌは、候補者が理解しやすいように、別の仕様 (色、タむポグラフィ、ボタンの状態などを含む) を䜜成したした。 䞀番䞋には、最初の画面のむンデントず機胜に関するヒントがありたした。 デザむナヌの芁望をすべお考慮に入れおくれた人たちにずおも満足したした。たずえば、最初の画面はビュヌポヌトの高さ以䞊でなければなりたせんでした。

アダプティブレむアりト - これは、むンタヌフェむスが単にレむアりトされおおらず、1920 ぀の解像床ですべおがピクセル単䜍でレむアりトされおいる堎合です。 䞭間状態でも、レむアりトが厩れおはいけたせん。 コンテナの最倧幅を制限するのを忘れおすべおを XNUMX ピクセルに蚭定する人もいれば、背景をめちゃくちゃにしおしたう人もいたしたが、党䜓ずしお候補者はこのタスクにうたく察凊したした。

セマンティックレむアりト。 リンクは、ボタンは ずしおデザむンされるべきだず、「圌らは䜕床䞖界に䌝えたこずでしょう」 。 幞いなこずに、ほずんどの候補者はこの芁件も満たしおいたした。 SRI が期埅しおいた div タグを䜿甚した非衚瀺リストを誰もが認識したわけではありたせんが、それほど悪いこずではありたせん。 必芁な堎所ず䞍必芁な堎所に、圌が知っおいるすべおの意味タグを挿入した候補者がいたした。 たずえば、リストの代わりに -ず を䜿甚したす。 結局のずころ、セマンティクス - ペヌゞの構成ず各ブロックの目的 (倧倚数はここで管理したした) ず、プリプロセッサおよび/たたはポストプロセッサの䜿甚 (ここで管理しおいる人は少数でしたが、これはポむントにも含たれおいたした - ほずんどの堎合、䜿甚量は少なく、scss。

䜜業スラむダヌ。 課題ではJSは䜿えないず曞きたした。 ここでは問題を解決する胜力がテストされたした - 束を䜿っおスラむダヌを䜜るこずができたしたそしお。 すべおの魔法はセレクタヌ レベル #button-N:checked ~ .slider-inner .slider-slides で発生したす。 入力チェックボックスの 33 ぀をクリックするず、チェックされた状態になりたす。 これを利甚しお、必芁な翻蚳をスラむドのあるコンテナに割り圓おるこずができたす:transform:translate(-XNUMX%)。 スラむダヌの実装が確認できたす ここで.

ドロップダりンリスト。 ここでもすべおが終わりたしたおよび同様のセレクタヌ: .accordion-item input:checked ~ .accordion-item__content。 実装が芋られたす ここで.

:hover、:active、および :focu* 状態の利甚可胜性。 非垞に重芁な点です。 むンタヌフェむスずの察話䞭の快適さはそれに䟝存しおいたした。 ナヌザヌは自分の行動に関するフィヌドバックを垞に受け​​取る必芁がありたす。 この項目は、アンケヌトずのやり取りを通じおチェックされたした。 [電話しおください] ボタンをクリックしおも (リク゚ストが送信されたにもかかわらず) 芋た目には䜕も起こらなかった堎合は、䜕床もクリックするこずになるため、これはよくありたせん。 その結果、XNUMX 件のリク゚ストが送信され、XNUMX 回コヌルバックされるこずになりたす。 モバむル デバむスにはマりスがないこずを忘れおはなりたせん。぀たり、ホバヌがあっおはなりたせん。 そしおもう XNUMX ぀の点は、意味論に関する点を満たした人には圱響したせんでした。 コントロヌルがむンタラクティブ芁玠ではない堎合、その䞊にマりスを移動するず、カヌ゜ルは暙準のたたになりたす。 ホバヌぞのリアクションを曞いたずしおも、非垞に乱雑に芋えたす。 カヌ゜ル、぀たりポむンタヌを過小評䟡しないでください。

アニメヌション。 芁玠で起こるすべおの反応がスムヌズであるこずが重芁です。 人生においお瞬間的なものは䜕䞀぀ありたせん。そのため、ホバヌ時やアクティブ時のトランゞションがあるだけで、むンタヌフェヌスをより快適なものにするのに十分でした。 たあ、スラむダヌずリストをアニメヌション化した人は抂しお玠晎らしいです。

最新のテクノロゞヌを䜿甚しお。 倚くの人が flex を䜿甚しおいたしたが、grid を䜿甚しおタスクを完了した人はいたせんでした。 フレックスが正しく䜿甚されおいればポむントがカりントされたす。 これらの非垞に柔軟なためにレむアりトがどこかで厩れた堎合、残念ながら、远加のポむントは埗られたせん。

フォヌムの怜蚌。 必芁なのは、フォヌムの各入力に必須の属性を远加するこずだけです。 メヌル欄をメヌルずしお認蚌しおいただいた方にポむントを加算させおいただきたした。

ファむルアップロヌドボタンのスタむル蚭定。 次のような組み合わせが期埅されおいたした。 ファむルを遞択したす。 次に、入力を非衚瀺にし、ラベルのスタむルを蚭定する必芁がありたした。 もう XNUMX ぀の䞀般的な方法は、透明な入力を䜜成しおボタンの䞊に眮くこずです。 ただし、すべおのブラりザでスタむル蚭定ができるわけではありたせん、そのような゜リュヌションは完党なクロスブラりザヌずは蚀えたせん。 そしお、ラベルを䜜成する方が意味的にはより正確です。

ブラりザ間の互換性。 最新の XNUMX ぀のブラりザヌ (IE なし - 参加者は幞運でした) の XNUMX ぀の最新バヌゞョン、および iPhone の Safari ず Android の Chrome ですべおが正垞であるこずを確認したした。

逆に、誰かが JS たたは Bootstrap を䜿甚した堎合は枛点したした。どちらもタスク党䜓の目的に反するこずになりたす。 さらに、Bootstrap を䜿甚した参加者はマむナスを獲埗しただけでなく、セマンティクスず実装された芁玠で倚くのポむントを倱いたした。

むンタヌネット䞊のどこかに自分のサむトをホストしおいる人には特にメリットはありたせんでしたが、レポゞトリをダりンロヌドしお自分のコンピュヌタ䞊でロヌカルに実行する必芁がなくなったので、レビュヌ担圓者は非垞に満足したした。 したがっお、これはカルマにプラスずしお機胜したした。

最初のタスクは、䞻に孊生にずっお非垞に圹立ちたした。 私たちが受け入れなかった人には、履歎曞が甚意されおいたす。誇らしげにすべおの回答に添付したり、GH ペヌゞに投皿したりできたす。

タスク 2: 茞送ルヌト

このタスクの䜜成者は、怜玢むンタヌフェヌス グルヌプの責任者である Denis Balyko です。

状態

星図はありたすか 各星の名前ず、その星から他の星たでの距離が光秒で衚瀺されたす。 解決関数を実装したす。これは XNUMX ぀の匕数を取る必芁がありたす。キヌが星の名前、倀が星たでの距離 (宇宙の䞀方通行)、および星の名前であるオブゞェクトです。パスの開始点ず終了点 - それぞれ開始点ず終了点。 この関数は、開始星から終了星たでの最短距離ずたどる経路を返す必芁がありたす。

関数シグネチャ:

const solution = function(graph, start, finish)  {
    // Ваше решеМОе
} 

入力デヌタの䟋:

const graph = {
  start: { A: 50, B: 20 },
  A: { C: 40, D: 20 },
  B: { A: 90, D: 90 },
  C: { D: 160, finish: 50 },
  D: { finish: 20 },
  finish: {}
};
const start = 'start';
const finish = 'finish'; 

出力䟋:

{
    distance: 90,
    path: ['start', 'A', 'D', 'finish']
} 

泚: ゜リュヌションのスケルトンは src/ フォルダヌにあり、゜リュヌションを solution.js に眮きたす。

XNUMX 番目のタスクの怜蚌は、最も自動化され客芳的でした。 ほずんどの人は、ダむクストラのアルゎリズムを実装する必芁があるず掚枬しおいたした。 その説明を芋぀けおアルゎリズムを JS で実装した人は、よくやったず思いたす。 しかし、課題を確認したずころ、同じ間違いのある論文が倚数芋぀かりたした。 私たちはむンタヌネットでコヌドの断片を怜玢し、参加者がアルゎリズムをコピヌした蚘事を芋぀けたした。 面癜いこずに、倚くの人がこの蚘事のコヌドを著者のコメントずずもにコピヌしたした。 このような䜜品は䜎いスコアを獲埗したした。 私たちは出兞の䜿甚を犁止したせんが、個人が自分の曞いたものを掘り䞋げおほしいず考えおいたす。

基準

テストでは䞻なポむントが付䞎されたした。 堎合によっおは、圌らがリポゞトリをいじったり、フォルダヌの名前を倉曎したりしおいるこずが明らかになり、必芁なファむルが芋぀からないずいう理由だけでテストが倱敗するこずがありたした。 今幎、私たちはそのような人たちを助けようず努め、圌らのためにすべおを元の堎所に戻したした。 しかし来幎からはコンテスト方匏に移行する予定で、これはもう蚱されない。

「人間的な」手動の基準もありたした。 たずえば、単䞀のコヌド スタむルの存圚です。 スペヌスの代わりにタブを䜿甚したり、その逆を䜿甚したりしおも枛点される人はいたせんでした。 既知のルヌルに埓っお䞀重匕甚笊ず二重匕甚笊を亀互に配眮し、セミコロンをランダムに配眮する堎合は、別の問題になりたす。

゜リュヌションの明瞭さず読みやすさは個別に考慮されたした。 䞖界䞭のあらゆるカンファレンスで、プログラマヌの仕事の 80% は他人のコヌドを読むこずで構成されおいるず蚀われおいたす。 孊童ですら、孊芞員や孊芞員同士でコヌドレビュヌを受けたす。 したがっお、この基準は非垞に重芁な意味を持ちたした。 XNUMX 文字を超える倉数がない䜜品がありたしたが、それはやめおください。 参加者からのコメントは、ステラ チャンのコメントず同じものを陀いお、非垞に勇気づけられるものでした。

最埌の基準は自動テストの存圚です。 それらを远加したのはほんの数人だけでしたが、党員にずっおそれはカルマに倧きなプラスずなりたした。

正しい解決策:

const solution = function(graph, START, FINISH)  {
    // Всё Ме бесплатМП в этПЌ ЌОре
    const costs = Object.assign({[FINISH]: Infinity}, graph[START]);

    // Первая вПлМа рПЎОтельскОх МПЎ
    const parents = { [FINISH]: null };
    Object.keys(graph[START]).reduce((acc, child) => (acc[child] = START) && acc, parents)

    const visited = [];
    let node;

    // ИщеЌ «ЎешёвПгП» рПЎОтеля, ПтЌечаеЌ прПйЎеММые
    do {
        node = lowestCostNode(costs, visited);
        let children = graph[node];
        for (let n in children) {
            let newCost = costs[node] + children[n];

            // Ещё Ме ПцеМеМа ОлО Машёлся бПлее Ўешёвый перехПЎ
            if (!costs[n] || costs[n] > newCost) {
                costs[n] = newCost;
                parents[n] = node;
            }
        }
        visited.push(node);
    } while (node)

    return {
        distance: costs[FINISH],
        path: optimalPath(parents)
    };

    // ВПзврат МазаЎ пП саЌыЌ «ЎешёвыЌ» рПЎОтеляЌ
    function optimalPath(parents) {
        let optimalPath = [FINISH];
        let parent = parents[FINISH];
        while (parent && parent !== START) {
            optimalPath.push(parent);
            parent = parents[parent];
        }
        optimalPath.push(START);
        return optimalPath.reverse();
    }

    // МОМОЌальМая стПОЌПсть Оз текущей МПЎы среЎО МепрПсЌПтреММых
    function lowestCostNode(costs, visited) {
        return Object.keys(costs).reduce((lowest, node) => {
            if (lowest === null || costs[node] < costs[lowest]) {
                if (!visited.includes(node)) {
                    lowest = node;
                }
            }

            return lowest;
        }, null);
    };
};

タスク 3: むベント カレンダヌ

これは、むンタヌフェむス開発者のセルゲむ・カザコフ氏ずアレクサンダヌ・ポドスクレブキン氏によっお䜜成されたした。

状態

ミニカレンダヌを曞いおスケゞュヌルを衚瀺したす。 奜きなスケゞュヌルで受講可胜です。 たずえば、2019 幎のフロント゚ンド カンファレンスのスケゞュヌル。

カレンダヌはリストのように芋えるはずです。 その他の蚭蚈芁件はありたせん。 むベントリマむンダヌを 3 日前、7 日前、14 日前に蚭定できるようにしたす。 むンタヌネットから最初にダりンロヌドした埌、カレンダヌが開き、オフラむンで機胜するはずです。

圹に立぀リ゜ヌス

フロント゚ンドカンファレンスのスケゞュヌル:
confs.tech/javascript?topics=javascript%2Bcss%2Bux

サヌビスワヌカヌ:
developer.mozilla.org/ru/docs/Web/API/Service_Worker_API/Using_Service_Workers
developers.google.com/web/fundamentals/primers/service-workers

通知API:
開発者.mozilla.org/ru/docs/Web/API/Notifications_API

XNUMX 番目のタスクは、考えられる解決策が非垞に倚く、それぞれに独自のものがあるため、テストするのが最も興味深いものでした。 私たちは、候補者がなじみのないテクノロゞヌをどのように扱うか、研究方法を知っおいるか、゜リュヌションをテストしおいるかどうかを確認したした。

基準

二぀折りカレンダヌ。 はい、ただレむアりトする必芁がありたした。 条件を文字通りに受け取りすぎお、CSS コヌドを XNUMX 行も挿入しなかった人もいたした。 芋た目はあたり魅力的ではありたせんでしたが、すべおがうたくいけばポむントは枛りたせんでした。

゜ヌスからむベントのリストを取埗する。 これはレむアりト タスクではないため、それに含たれるむベントのリストはカりントされたせんでした。 い぀でも䌚議をキャンセルしたり、スケゞュヌルを倉曎したり、新しい䌚議を远加したりできたす。 そのため、倖郚からデヌタを受け取り、受け取ったJSONに基づいおレむアりトをレンダリングする必芁がありたした。 䜕らかの方法 (fetch メ゜ッドたたは XMLHttpRequest を䜿甚) でデヌタを取埗するこずが重芁でした。 ナヌザヌがフェッチ甚のポリフィルを远加し、その遞択を Readme にマヌクした堎合、これはプラスずしおカりントされたした。

Service Worker の゚ラヌなしの登録 最初のダりンロヌド埌はオフラむンで䜜業できたす。 これが䞀䟋です。 最初の起動時にスケゞュヌルをキャッシュする Service Worker。 Service Worker、サヌビス ワヌカヌの機胜、およびサヌビス ワヌカヌずの連携方法 (キャッシュの操䜜、オフラむンでの䜜業の戊略) の詳现に぀いおは、ここを参照しおください。

リマむンダヌを蚭定する機胜実際に機胜するのは 3 日、7 日、14 日埌です。 通知 API を理解する必芁がありたしたが、 どのリンクぞのリンク 任務は正しかった。 プッシュする時期であるかどうかを確認するための特定の実装は期埅しおいたせんでした。 localStorage 内のストレヌゞ、IndexDB、たたは Service Worker による定期的なポヌリングなど、機胜するオプションはすべお受け入れられたした。 プッシュサヌバヌを䜜成するこずも可胜でしたここ 䟋)、ただしオフラむンでは機胜したせん。 ペヌゞを閉じた埌、しばらくしおから開いた埌にプッシュを受け取るこずも同様に重芁でした。 ペヌゞを閉じるず同時にリマむンダヌが終了した堎合、゜リュヌションはカりントされたせん。 スタッフがレビュアヌのこずを考えお、3 日も埅たずに今すぐプッシュできるようにしおくれたのは玠晎らしいこずです。

デスクトップにアむコンを配眮する機胜 (PWA)。 ファむルの存圚を確認したした manifest.jsonを 正しいアむコンを䜿甚しおください。 このファむルを䜜成した (たたは CreateReactApp で生成されたたたにした) 人もいたすが、正しいアむコンを远加したせんでした。 そしおむンストヌルしようずするず「別のアむコンが必芁です」のような゚ラヌが発生したした。

コヌドスタむルずプロゞェクト構造。 XNUMX 番目のタスクず同様に、(たずえそれが私たちのコヌドスタむルず䞀臎しないずしおも) XNUMX ぀のコヌドスタむルを調べたした。 リンタヌをねじ蟌んだ人もいたしたが、それは玠晎らしいこずです。

コン゜ヌル゚ラヌ。 䜕かが間違っおいるこずを瀺すむンゞケヌタヌがコン゜ヌルに衚瀺され、参加者がそれに泚意を払わなかった堎合は、枛点したした。

結果

参加者の決定の面癜いずころ:

  • あるアンケヌトには次のような文章が含たれおいたした。「プログラマヌの友人が React アプリケヌションの䜜成を手䌝っおくれたした。 私は圌にその理由ず方法に぀いお質問を济びせたした、そしお圌は私に蚀いたした。 すごく気に入ったのでもっず知りたいです。」 私たちはこの申請を心から応揎しおいたしたが、残念ながら、候補者の友人が申請の実珟にあたり協力しおくれたせんでした。
  • ある候補者は、RAR アヌカむブが保存されおいる GitHub にリンクを送信したしたが、これに぀いおコメントするのは困難です。 🙂
  • 別の候補者は、solution.js ファむルの最初の行のコメントで、アルゎリズムをコピヌしたこずを正盎に認めたした。

76名の応募があり、23名を決定したした。 ミンスクだけでなく、モスクワ、サンクトペテルブルク、さらにはタタヌルスタンからもアンケヌトが送られおきた。 圌らの䞭には、珟圚の職業に぀いお私たちを驚かせた人もいたす。XNUMX 人は法医孊の専門家で、もう XNUMX 人は医孊生です。

その結果、タスクの完了における成功率の興味深い分垃が埗られたした。 参加者は最初のタスクを平均 60% で完了し、50 番目のタスクを 40% で完了したした。XNUMX 番目のタスクは最も難しく、平均 XNUMX% で完了したした。

䞀芋するず、タスクは耇雑で時間がかかるように芋えたす。 その理由は、できるだけ倚くの候補者を排陀したいずいうこずではありたせん。 孊習䞭、孊生はチャットの䜜成、子䟛向けの Yandex.Music 、たたは倩候に巊右される人々向けの Yandex.Weather など、珟実のタスクに盎面したす。 このためには開始ベヌスが必芁です。

80幎前にSRIの入孊課題を芋お、絶察に解けないず思ったのを芚えおいたす。 珟時点での䞻なこずは、座っお条件を泚意深く読んで、それを開始するこずです。 この条件では、溶液のほが XNUMX% が含たれおいるこずがわかりたす。 たずえば、XNUMX 番目のタスク (最も難しい) の条件では、MDN 䞊のサヌビス ワヌカヌず通知 API ぞのリンクを远加したした。 リンクの内容を孊習した孊生は、難なく完了したした。

この蚘事は、将来SRIに入孊しようず考えおいる受隓生、ミンスクスクヌルに入孊できなかった受隓生、これから他の詊隓課題に取り組む受隓生にぜひ読んでいただきたいです。 ご芧のずおり、そうするこずは十分に可胜です。 自分を信じお、著者からのヒントをすべお聞く必芁がありたす。

出所 habr.com

コメントを远加したす