From 1e848512f05724ed59d9548d47f3da296825a92f Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Wed, 27 May 2026 19:03:42 +0500 Subject: [PATCH 1/2] update 10-basics: adapt content from Python, add BEGIN/END, improve structure - 10-hello-world: comprehensive rewrite with quotes/case explanation, diagram, browser console reference - 20-comments: add BEGIN/END section; update exercise to TODO comment pattern - 40-instructions: add order/sequence sections and complex example - 45-testing: rewrite to modern style with vitest error format; update exercise (print 10) - 50-syntax-errors: add structured sections, diagram, 'what to do' guide; update exercise Co-Authored-By: Claude Sonnet 4.6 --- modules/10-basics/10-hello-world/ru/README.md | 53 ++++++++++++-- .../10-hello-world/ru/assets/hello-world.png | Bin 0 -> 33900 bytes modules/10-basics/20-comments/index.js | 2 +- modules/10-basics/20-comments/ru/EXERCISE.md | 10 ++- modules/10-basics/20-comments/ru/README.md | 20 ++++++ .../10-basics/40-instructions/ru/README.md | 65 +++++++++++++++--- modules/10-basics/45-testing/index.js | 2 +- modules/10-basics/45-testing/ru/EXERCISE.md | 8 +-- modules/10-basics/45-testing/ru/README.md | 44 ++++++------ modules/10-basics/45-testing/test.js | 2 +- modules/10-basics/50-syntax-errors/index.js | 2 +- .../10-basics/50-syntax-errors/ru/EXERCISE.md | 12 +++- .../10-basics/50-syntax-errors/ru/README.md | 50 ++++++++++++-- modules/10-basics/50-syntax-errors/test.js | 2 +- 14 files changed, 218 insertions(+), 54 deletions(-) create mode 100644 modules/10-basics/10-hello-world/ru/assets/hello-world.png diff --git a/modules/10-basics/10-hello-world/ru/README.md b/modules/10-basics/10-hello-world/ru/README.md index e8a14923..6d295157 100644 --- a/modules/10-basics/10-hello-world/ru/README.md +++ b/modules/10-basics/10-hello-world/ru/README.md @@ -1,9 +1,52 @@ -Изучение нового языка программирования традиционно начинается с 'Hello, World!'. Это простая программа, которая выводит приветствие на экран и заодно знакомит с новым языком — его синтаксисом и структурой программы. Этой традиции уже больше сорока лет, поэтому и мы не будем ее нарушать — в первом же уроке напишем программу `Hello, World!`. - -Эта программа будет выводить на экран текст: +Изучение нового языка программирования традиционно начинается с программы 'Hello, World!'. Это простая программа, которая выводит приветствие на экран и знакомит с синтаксисом и структурой нового языка. ```text - Hello, World! +Hello, World! +``` + +![Hello World](./assets/hello-world.png) + +Этой традиции уже больше сорока лет, и мы тоже начнем с нее. В первом уроке мы напишем программу `Hello, World!`. На JavaScript эта программа выглядит так: + +```javascript +console.log('Hello, World!'); +``` + +Команда `console.log()` выводит на экран текст, указанный в скобках. Вместо примера можно написать любой другой текст. + +```javascript +console.log('Хекслет - школа программирования'); +``` + +Команда остается той же, меняется только содержимое скобок. Чтобы программа понимала, что это именно текст, он заключается в кавычки. Можно использовать одинарные `'...'` или двойные `"..."`, но открывающая и закрывающая кавычки должны совпадать. + +```javascript +console.log("Хекслет - школа программирования"); ``` -Чтобы вывести что-то на экран, нужно дать компьютеру специальную команду. В языке JavaScript такая команда — `console.log()`. +## Значение символов + +Код состоит из команд, и каждая из них должна быть написана в определенной форме. Помимо букв, в коде важны кавычки `'` и `"`, скобки `()` и знаки препинания. Пропущенный или перепутанный знак приведет к тому, что программа не запустится. Попробуйте определить, какую ошибку допустили в каждой из строк? + +```javascript +console.log("it's JavaScript" +console.log(it's JavaScript") +consol.log("it's JavaScript") +console.log('it's JavaScript") +consolelog("it's JavaScript") +``` + +Даже небольшое отличие, например одна лишняя буква или другой знак, может привести к тому, что программа не будет работать. Это относится и к регистру, то есть к различию между большими и маленькими буквами. Если в обычном тексте `Привет` и `привет` выглядят одинаково, то для JavaScript это разные слова. JavaScript считает `console.log`, `Console.Log` и `CONSOLE.LOG` разными командами, и сработает только первый вариант. + +## Где практиковаться + +Теория усваивается лучше, когда параллельно запускаешь код и видишь результат. Для этого подходит консоль браузера (DevTools), где команды выполняются построчно. Все, что встречается в уроке, стоит пробовать [в консоли браузера](https://developer.chrome.com/docs/devtools/console/). + +Как это работает технически? Любой написанный код передается в движок JavaScript, который этот код выполняет и выводит на экран результат его работы. + +```text + Код Движок JS Экран + ┌──────────────────┐ ┌───────────┐ ┌──────────────┐ + │ console.log(…) │──→│JavaScript │──→│ Hello, World!│ + └──────────────────┘ └───────────┘ └──────────────┘ +``` diff --git a/modules/10-basics/10-hello-world/ru/assets/hello-world.png b/modules/10-basics/10-hello-world/ru/assets/hello-world.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf2299f0288ee9e13ed7b271a87ea6f149dab52 GIT binary patch literal 33900 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 +// END +``` + +Увидев *BEGIN* и *END*, пишите свой код между ними, остальное оставляйте без изменений. diff --git a/modules/10-basics/40-instructions/ru/README.md b/modules/10-basics/40-instructions/ru/README.md index ed2d22a6..e244e4b3 100644 --- a/modules/10-basics/40-instructions/ru/README.md +++ b/modules/10-basics/40-instructions/ru/README.md @@ -1,27 +1,72 @@ -Инструкция — это команда для компьютера выполнить какое-то действие. +Команду `console.log('Hexlet')` мы можем назвать инструкцией, она говорит интерпретатору JavaScript, что нужно делать. Таких инструкций может быть сколько угодно. Каждая из них выполняется после того, как закончилась предыдущая, и так мы из простых элементов получаем сколь угодно большую и сложную программу. -Программа на JavaScript состоит из набора инструкций. Чаще всего каждая инструкция записывается с новой строки. Иногда инструкции дополнительно разделяют точкой с запятой `;`, но во многих случаях её можно не ставить. +```text + Инструкция 1: console.log('Hello') → выполнена + ↓ + Инструкция 2: console.log('World') → выполнена + ↓ + Инструкция 3: console.log('!') → выполнена +``` -Вот пример кода с двумя инструкциями. +Вот пример кода с двумя инструкциями. Эти строки говорят компьютеру вывести фразы на экран. ```javascript -console.log('Mother of Dragons.'); -console.log('Dracarys!'); +console.log('Mother of Dragons.'); // Первая инструкция +console.log('Dracarys!'); // Вторая инструкция ``` -При запуске этого кода, на экран последовательно выводятся два предложения: +Результат выполнения: ```text Mother of Dragons. Dracarys! ``` -Теоретически, инструкции можно написать друг за другом без переноса на новую строчку: +## Порядок имеет значение + +Интерпретатор JavaScript выполняет код строго в том порядке, в котором вы его написали. Если поменять строки местами: ```javascript -console.log('Mother of Dragons.'); console.log('Drakarys!'); +console.log('Dracarys!'); +console.log('Mother of Dragons.'); +``` + +на экране они тоже поменяются: + +```text +Dracarys! +Mother of Dragons. ``` -Результат на экране будет таким же, но такой код неудобен для чтения, поэтому инструкции располагают друг под другом. +## Альтернативная форма записи -Почему это важно знать? Инструкция — это единица исполнения. Интерпретатор, программа которая запускает код на JavaScript, выполняет инструкции строго по очереди. И мы, как разработчики, должны понимать этот порядок и уметь мысленно разделять программу на независимые части, удобные для анализа. +Обычно инструкции пишут на отдельных строках, но их можно записать и на одной строке через `;`: + +```javascript +console.log('Mother of Dragons.'); console.log('Dracarys!'); +``` + +Обе версии работают одинаково, но второй вариант читать сложнее. Поэтому инструкции почти всегда пишут по одной на строку. + +## Зачем это нужно + +Сейчас мы пишем очень простые программы, но со временем они начнут усложняться, и один из самых важных навыков, который поможет их понимать, — это способность разбивать (в голове) программу на независимые инструкции. Только так можно разобраться в том, что в коде происходит. Ниже пример для привлечения внимания, понимать его пока не надо: + +```javascript +const isPrime = (number) => { + if (number < 2) { + return false; + } + + let divider = 2; + + while (divider <= number / 2) { + if (number % divider === 0) { + return false; + } + divider += 1; + } + + return true; +}; +``` diff --git a/modules/10-basics/45-testing/index.js b/modules/10-basics/45-testing/index.js index d215cac5..86e391c5 100644 --- a/modules/10-basics/45-testing/index.js +++ b/modules/10-basics/45-testing/index.js @@ -1 +1 @@ -console.log(9780262531962); +console.log(10); diff --git a/modules/10-basics/45-testing/ru/EXERCISE.md b/modules/10-basics/45-testing/ru/EXERCISE.md index d03be933..898cf13d 100644 --- a/modules/10-basics/45-testing/ru/EXERCISE.md +++ b/modules/10-basics/45-testing/ru/EXERCISE.md @@ -1,7 +1,3 @@ -Просто тренировка. Выведите на экран число 9780262531962. +В магазине на полке осталось 10 яблок. Напишите программу, которая выводит это число на экран. -```text -9780262531962 -``` - -Поэкспериментируйте с выводом. Передайте туда другое число или строку. Посмотрите на ответ системы, попробуйте его перевести и понять. +Затем попробуйте вывести другое число и посмотрите, что покажет система проверки. Это поможет научиться читать сообщения об ошибках тестов. diff --git a/modules/10-basics/45-testing/ru/README.md b/modules/10-basics/45-testing/ru/README.md index d4ff5cca..b445a63b 100644 --- a/modules/10-basics/45-testing/ru/README.md +++ b/modules/10-basics/45-testing/ru/README.md @@ -1,35 +1,39 @@ +Наш сайт автоматически проверяет ваши решения. Как это работает? -Сайт автоматически проверяет ваши решения. Как это работает? +В самом простом случае проверка запускает ваш код и сравнивает вывод на экран с ожидаемым результатом. Например, если задание звучит так: «Выведите число 10 на экран», то ваш код на JavaScript может выглядеть так: -В самом простом случае, система просто запускает ваш код и смотрит на то, что вывелось на экран. А потом сверяет с тем, что мы «ожидали» по заданию. +```javascript +console.log(10); +``` -В следующих, более сложных уроках, вы будете писать функции — некие мини-программы, принимающие информацию из внешнего мира и производящие какие-то операции. Проверка ваших решений в таких случаях выглядит немного сложнее: система запускает ваше решение и передаёт какую-то информацию. Система также знает — «ожидает» — какой именно ответ должна дать правильная функция при таких входных данных. +Проверка запустит этот код и убедится, что на экране действительно появилось `10`. Если вывод совпадает с ожидаемым, решение засчитывается. Иначе вы увидите ошибку: -Например, если ваша задача — написать функцию сложения двух чисел, то проверочная система будет передавать ей разные комбинации чисел и сверять ответ вашей функции с реальными суммами. Если во всех случаях ответы совпадут, то решение считается верным. +```bash +AssertionError: expected '9' to be '10' -Такой подход называется тестированием, и он используется в реальной повседневной разработке. Обычно программист сначала пишет тест — проверочную программу, а потом уже ту программу, которую хотел написать. В процессе он постоянно запускает тесты и смотрит, приблизился ли он к решению. +- Expected ++ Received -Именно поэтому наш сайт говорит «Тесты пройдены», когда вы правильно решили задачу. +- 10 ++ 9 +``` -Вот простой пример: в одном из будущих уроков вам нужно будет написать функцию, которая производит вычисления и выдаёт ответ. Предположим, вы допустили небольшую ошибку, и функция выдала неправильное число. Система ответит примерно так: +Строка с `-` показывает ожидаемый результат, а строка с `+` — фактический, который вернул ваш код. -```text - ● test +В следующих, более сложных уроках вы будете писать функции. Они принимают данные и возвращают результат. В таких задачах проверка работает немного иначе: она вызывает вашу функцию с разными аргументами и заранее знает, какой ответ должен получиться в каждом случае. - expect(received).toBe(expected) // Object.is equality +Например, если нужно написать функцию сложения двух чисел, проверка будет передавать ей разные пары чисел и сравнивать результат с правильной суммой. Если во всех случаях ответы совпадут, решение считается верным. - Expected value to be: - "Hello, World!" - Received: - "ello, World!" -``` +Такой подход называется тестированием, и он используется в реальной разработке. Тесты помогают проверить, правильно ли работает программа, и быстро заметить ошибку после изменений. + +Именно поэтому наш сайт говорит «Тесты пройдены», когда вы правильно решили задачу. -Expected – ожидаемое значение, а Received, то которое выдал ваш код. +## Моя ошибка или нет? -Кроме наших тестов, будет крайне полезно экспериментировать с кодом в консоли [браузера](https://developer.mozilla.org/en-US/docs/Tools/Browser_Console). В любой ситуации, когда вы недопоняли, или хотите попробовать разные варианты использования, смело открывайте консоль и вводите туда код. +Иногда в процессе решения будет казаться, что вы сделали все правильно, но проверка не принимает решение. Подобное случается крайне редко. Тесты автоматически запускаются после каждого изменения, поэтому сломанная проверка обычно не попадает на сайт. ---- +В подавляющем большинстве таких случаев ошибка содержится в коде решения. Она может быть очень незаметной: вместо английской буквы случайно ввели русскую, вместо верхнего регистра использовали нижний или забыли вывести запятую. Бывают и более сложные ситуации. Например, решение работает для одного набора входных данных, но не работает для другого. -Иногда в процессе решения будет казаться, что вы сделали все правильно, но система "капризничает" и не принимает решение. Подобное поведение практически исключено. Нерабочие тесты просто не могут попасть на сайт, они автоматически запускаются после каждого изменения. В подавляющем большинстве таких случаев, (а все наши проекты в сумме провели миллионы проверок за много лет), ошибка содержится в коде решения. Она может быть очень незаметной, вместо английской буквы случайно ввели русскую, вместо верхнего регистра использовали нижний или забыли вывести запятую. Другие случаи сложнее. Возможно ваше решение работает для одного набора входных данных, но не работает для другого. Поэтому всегда внимательно читайте условие задачи и вывод тестов. Там почти наверняка есть указание на ошибку. +Поэтому всегда внимательно читайте условие задачи и вывод тестов. Там почти наверняка есть указание на ошибку. -Однако, если вы уверены в ошибке или нашли какую-то неточность, то вы всегда можете указать на нее. В конце каждой теории есть ссылка на содержимое урока на гитхабе (этот проект полностью открытый!). Перейдя туда, вы можете написать issue, посмотреть содержимое тестов (там видно, как вызывается ваш код) и даже отправить pullrequest. Если для вас это пока темный лес, то подключитесь в наше сообщество [Telegram] (https://t.me/hexletcommunity), там в канале *Обратная связь* мы всегда поможем. +Если же вы уверены, что проблема в задании или нашли неточность, напишите в наше [сообщество](https://t.me/hexletcommunity), в канал _'Обратная связь'_. diff --git a/modules/10-basics/45-testing/test.js b/modules/10-basics/45-testing/test.js index f397a9a1..7fce79c4 100644 --- a/modules/10-basics/45-testing/test.js +++ b/modules/10-basics/45-testing/test.js @@ -8,5 +8,5 @@ test('hello world', async () => { const firstArg = consoleLogSpy.mock.calls.join('\n'); - expect(firstArg).toBe('9780262531962'); + expect(firstArg).toBe('10'); }); diff --git a/modules/10-basics/50-syntax-errors/index.js b/modules/10-basics/50-syntax-errors/index.js index affc8ebb..f7830cd6 100644 --- a/modules/10-basics/50-syntax-errors/index.js +++ b/modules/10-basics/50-syntax-errors/index.js @@ -1 +1 @@ -console.log('What Is Dead May Never Die'); +console.log('Программа успешно запущена'); diff --git a/modules/10-basics/50-syntax-errors/ru/EXERCISE.md b/modules/10-basics/50-syntax-errors/ru/EXERCISE.md index aff6b2fd..65effb6c 100644 --- a/modules/10-basics/50-syntax-errors/ru/EXERCISE.md +++ b/modules/10-basics/50-syntax-errors/ru/EXERCISE.md @@ -1,4 +1,12 @@ +Программа запускается и сообщает о результате. Напишите программу, которая выводит: -Это задание не связано с уроком напрямую. Но будет полезным потренироваться с выводом на экран. +```text +Программа успешно запущена +``` -Выведите на экран *What Is Dead May Never Die* +После того как программа заработает, намеренно сломайте её — допустите одну из синтаксических ошибок: + +- уберите закрывающую кавычку; +- уберите закрывающую скобку. + +Запустите код и прочитайте сообщение JavaScript. Такие сообщения вы будете видеть часто — важно научиться их читать. Затем верните рабочий вариант, чтобы упражнение прошло проверку. diff --git a/modules/10-basics/50-syntax-errors/ru/README.md b/modules/10-basics/50-syntax-errors/ru/README.md index 89cf54d7..fecaadc7 100644 --- a/modules/10-basics/50-syntax-errors/ru/README.md +++ b/modules/10-basics/50-syntax-errors/ru/README.md @@ -1,14 +1,54 @@ +Если программа на JavaScript написана с нарушением правил, интерпретатор остановит выполнение и выведет сообщение об ошибке. В этом сообщении указывается: -Если программа на JavaScript написана синтаксически некорректно, то интерпретатор выводит на экран соответствующее сообщение, а также указание на файл и строчку в нём, где, по его мнению, произошла ошибка. *Синтаксическая ошибка* возникает в том случае, когда код был записан с нарушением грамматических правил. В человеческих языках грамматика важна, но текст с ошибками чаще всего можно понять и прочитать. В программировании всё строго. Любое мельчайшее нарушение, и программа даже не запустится. Примером может быть забытая `;`, неправильно расставленные скобки и другие детали. +- тип ошибки, +- строка, в которой она произошла, +- и (часто) точка, где интерпретатор «споткнулся». -Вот пример кода с синтаксической ошибкой: +## Что такое синтаксическая ошибка? + +Синтаксическая ошибка (SyntaxError) — это нарушение правил написания кода (грамматических правил) в конкретном языке программирования. Такие ошибки возникают, если код написан с отклонением от ожидаемого формата: не закрыта строка, пропущена скобка, нарушен порядок символов и т.д. + +В отличие от естественных языков, где текст с ошибками можно понять по контексту, в программировании даже малейшее отклонение делает код неработоспособным. + +```text + Код с ошибкой Интерпретатор Результат + ┌────────────────────┐ ┌───────────┐ ┌──────────────────────┐ + │ console.log('Hi' │──→│JavaScript │──→│ SyntaxError: │ + └────────────────────┘ └───────────┘ │ missing ) after args │ + └──────────────────────┘ +``` + +Рассмотрим простой пример с синтаксической ошибкой: ```javascript +// Правильный вариант такой: console.log('Hodor') +console.log('Hodor' +``` + +В этом коде не закрыта скобка, что делает программу некорректной с точки зрения синтаксиса. Попробуем запустить программу, и интерпретатор выдаст ошибку: + +```bash +node index.js +index.js:2 console.log('Hodor' + ^ + +SyntaxError: missing ) after argument list ``` -Если запустить код выше, то мы увидим следующее сообщение: `SyntaxError: missing ) after argument list`, а также указание на строку и файл, где возникла эта ошибка. Подобные синтаксические ошибки в JavaScript относятся к разряду SyntaxError. +Текст с непривычки может быть непонятен, но это нормально — чем больше вы будете сталкиваться с такими ошибками, тем быстрее научитесь понимать, что произошло. + +## Почему такие ошибки считаются простыми? + +Синтаксические ошибки: + +- легко заметить: код часто подсвечивается в редакторе; +- легко исправить: достаточно вернуть пропущенный символ или поправить структуру. + +Но есть ложка дёгтя. Интерпретатор не всегда указывает точно то место, где допущена ошибка. Иногда проблема находится несколькими строками выше. Например, открытая, но не закрытая скобка на одной строке может «сломать» весь следующий код. -С одной стороны, ошибки SyntaxError — самые простые, потому что они связаны исключительно с грамматическими правилами написания кода, а не с самим смыслом кода. Их легко исправить: нужно лишь найти нарушение в записи. +## Что делать при синтаксической ошибке? -С другой стороны, интерпретатор не всегда может чётко указать на это нарушение. Поэтому бывает, что забытую скобку нужно поставить не туда, куда указывает сообщение об ошибке. +- Читай сообщение об ошибке. Оно почти всегда содержит полезную информацию. +- Проверь строку, указанную в сообщении, и строку до неё: иногда ошибка «спрятана» чуть раньше. +- Используй [редактор с подсветкой синтаксиса](https://code.visualstudio.com/): он поможет сразу заметить проблемы (например, незакрытые кавычки или скобки). diff --git a/modules/10-basics/50-syntax-errors/test.js b/modules/10-basics/50-syntax-errors/test.js index 8480819f..24c26d68 100644 --- a/modules/10-basics/50-syntax-errors/test.js +++ b/modules/10-basics/50-syntax-errors/test.js @@ -8,5 +8,5 @@ test('hello world', async () => { const firstArg = consoleLogSpy.mock.calls.join('\n'); - expect(firstArg).toBe('What Is Dead May Never Die'); + expect(firstArg).toBe('Программа успешно запущена'); }); From 175ffae66593b061ae85c13501be7d7e37a4b3e6 Mon Sep 17 00:00:00 2001 From: Nikolay Gagarinov Date: Wed, 27 May 2026 20:00:49 +0500 Subject: [PATCH 2/2] fix 45-testing: use correct vitest error format matching platform output Co-Authored-By: Claude Sonnet 4.6 --- modules/10-basics/45-testing/ru/README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/10-basics/45-testing/ru/README.md b/modules/10-basics/45-testing/ru/README.md index b445a63b..2bd91a33 100644 --- a/modules/10-basics/45-testing/ru/README.md +++ b/modules/10-basics/45-testing/ru/README.md @@ -8,17 +8,18 @@ console.log(10); Проверка запустит этот код и убедится, что на экране действительно появилось `10`. Если вывод совпадает с ожидаемым, решение засчитывается. Иначе вы увидите ошибку: -```bash -AssertionError: expected '9' to be '10' +```text + ● test -- Expected -+ Received + expect(received).toBe(expected) // Object.is equality -- 10 -+ 9 + Expected value to be: + "10" + Received: + "9" ``` -Строка с `-` показывает ожидаемый результат, а строка с `+` — фактический, который вернул ваш код. +`Expected` — ожидаемый результат, а `Received` — тот, что вернул ваш код. В следующих, более сложных уроках вы будете писать функции. Они принимают данные и возвращают результат. В таких задачах проверка работает немного иначе: она вызывает вашу функцию с разными аргументами и заранее знает, какой ответ должен получиться в каждом случае.