From 83b7b4a24239900988f59d4bdd4462194a78f394 Mon Sep 17 00:00:00 2001 From: Rail Batyrshin Date: Fri, 5 Aug 2022 23:03:34 +0600 Subject: [PATCH] Fix grammatical errors PR-URL: https://github.com/HowProgrammingWorks/Book/pull/158 --- content/ru/1-1-Approach.md | 4 ++-- content/ru/1-6-Engineer.md | 2 +- content/ru/2-1-Identifiers.md | 11 ++++++----- content/ru/2-2-Types.md | 8 ++++---- content/ru/2-5-Procedure.md | 2 +- content/ru/2-6-Function.md | 15 ++++++++++----- content/uk/2-3-Context.md | 3 --- 7 files changed, 24 insertions(+), 21 deletions(-) diff --git a/content/ru/1-1-Approach.md b/content/ru/1-1-Approach.md index cbcb465..4d0d924 100644 --- a/content/ru/1-1-Approach.md +++ b/content/ru/1-1-Approach.md @@ -4,7 +4,7 @@ > Главные навыки программиста — это чтение и исправление кода -Каждая тема содержит примеры хорошего кода и плохого кода. Эти примеры собраны из практики программирования и ревью проектов. Специально заготовленные примеры плохого кода будут работоспособны, но полны антипаттернов и проблем, которые нужно выявить и исправить. Даже сама первая практическая работа в курсе будет связана с исправлением кода, повышением его читабельности. Если давать традиционные задания (написать функцию по сигнатуре, алгоритм, класс), то начинающий, очевидно, реализует его не лучшим образом, но будет защищать свой код, потому что это первое, что он написал. А если задача будет "взять пример чужого плохого кода, найти проблемы и исправить", не переписать с нуля, а улучшить в несколько шагов, фиксируя и осознавая эти шаги, то включается критический подход. +Каждая тема содержит примеры хорошего кода и плохого кода. Эти примеры собраны из практики программирования и ревью проектов. Специально заготовленные примеры плохого кода будут работоспособны, но полны антипаттернов и проблем, которые нужно выявить и исправить. Даже самая первая практическая работа в курсе будет связана с исправлением кода, повышением его читабельности. Если давать традиционные задания (написать функцию по сигнатуре, алгоритм, класс), то начинающий, очевидно, реализует его не лучшим образом, но будет защищать свой код, потому что это первое, что он написал. А если задача будет "взять пример чужого плохого кода, найти проблемы и исправить", не переписать с нуля, а улучшить в несколько шагов, фиксируя и осознавая эти шаги, то включается критический подход. > Исправление плохого кода — один из самых эффективных способов обучения @@ -16,7 +16,7 @@ > Применяйте дружественное ревью кода, перекрестное ревью, линтеры и форматеры -Переходим к упражнениям на снижение зацепления между несколькими абстракциями, потом между модулями, т.е. сделать так, чтобы нужно было как можно меньше знать про структуры данных одной части программы из другой ее части. Снижение языкового фанатизма достигается параллельным изучением с самого начала нескольких языков программирования и переводами с одного языка на другой. Между `JavaScript` и `Python` переводить очень просто, а `C` посложнее будет, но эти три языка, какие бы они ни были, нельзя не включить в курс. +Переходим к упражнениям на снижение зацепления между несколькими абстракциями, потом между модулями, т.е. сделать так, чтобы нужно было как можно меньше знать про структуры данных одной части программы из другой ее части. Снижение языкового фанатизма достигается параллельным изучением с самого начала нескольких языков программирования и переводами с одного языка на другой. Между `JavaScript` и `Python` переводить очень просто, а `C` будет посложнее, но эти три языка, какие бы они ни были, нельзя не включить в курс. > С первых шагов не допускайте никакого фанатизма: языкового, фреймворкового, парадигменного diff --git a/content/ru/1-6-Engineer.md b/content/ru/1-6-Engineer.md index 7a8b35c..d39e537 100644 --- a/content/ru/1-6-Engineer.md +++ b/content/ru/1-6-Engineer.md @@ -1,5 +1,5 @@ ## 1.6. Обзор специальности инженер-программист -Вокруг программирования, как и вокруг любой сферы своей деятельности, человек успел построить огромное количество предрассудков и заблуждений. Первейший источник проблем, это терминология, ведь различные парадигмы, языки и экосистемы насаждают свою терминологию, которая не только противоречива между собой, но и нелогична даже внутри отдельного сообщества. Более того, многие программисты самоучки и одиночки, выдумывают самобытную, ни на что не похожую терминологию и концепции, дублирующие друг друга. Оголтелые маркетологи тоже деструктивно влияют на ИТ отрасль вцелом, на формирование мировоззрения и терминологии. Выкручивая очевидные вещи, запутывая и усложняя концепции, они обеспечивают неисчерпаемую лавину проблем, на которой только и держится весь софтверный бизнес. Переманивая пользователей и программистов на свои технологии, гиганты индустрии нередко создают очень заманчивые и правдоподобные концепции, приводящие в итоге к несовместимости, войне стандартов и к явной зависимости от поставщика программной платформы. Группировки, захватывающие внимание людей, десятилетиями паразитирую на их внимании и бюджетах. Ведомые гордыней и тщеславием, некоторые разработчики и сами распространяют сомнительные, а иногда и заведомо тупиковые идеи. Ведь делать программное обеспечение хорошо - совершенно не выгодно для производителя. Ситуация существенно лучше в сфере свободного ПО и открытого кода, но децентрализованные энтузиасты слишком разобщены, чтобы эффективно противодействовать мощной пропаганде гигантов отрасли. +Вокруг программирования, как и вокруг любой сферы своей деятельности, человек успел построить огромное количество предрассудков и заблуждений. Первейший источник проблем, это терминология, ведь различные парадигмы, языки и экосистемы насаждают свою терминологию, которая не только противоречива между собой, но и нелогична даже внутри отдельного сообщества. Более того, многие программисты самоучки и одиночки, выдумывают самобытную, ни на что не похожую терминологию и концепции, дублирующие друг друга. Оголтелые маркетологи тоже деструктивно влияют на ИТ отрасль вцелом, на формирование мировоззрения и терминологии. Выкручивая очевидные вещи, запутывая и усложняя концепции, они обеспечивают неисчерпаемую лавину проблем, на которой только и держится весь софтверный бизнес. Переманивая пользователей и программистов на свои технологии, гиганты индустрии нередко создают очень заманчивые и правдоподобные концепции, приводящие в итоге к несовместимости, войне стандартов и к явной зависимости от поставщика программной платформы. Группировки, захватывающие внимание людей, десятилетиями паразитируют на их внимании и бюджетах. Ведомые гордыней и тщеславием, некоторые разработчики и сами распространяют сомнительные, а иногда и заведомо тупиковые идеи. Ведь делать программное обеспечение хорошо - совершенно не выгодно для производителя. Ситуация существенно лучше в сфере свободного ПО и открытого кода, но децентрализованные энтузиасты слишком разобщены, чтобы эффективно противодействовать мощной пропаганде гигантов отрасли. Как только какая-то технология или экосистема развивается в достаточной степени, чтобы на ней можно было создавать хорошие решения, она обязательно устаревает или производитель прекращает ее поддержку или она становится чересчур сложной. На моей памяти уже сменилось больше пяти таких технологических экосистем. diff --git a/content/ru/2-1-Identifiers.md b/content/ru/2-1-Identifiers.md index 681550a..8452b60 100644 --- a/content/ru/2-1-Identifiers.md +++ b/content/ru/2-1-Identifiers.md @@ -12,17 +12,18 @@ - Функции: `calculateSubtotal`, `calculateTotal`, `validateExpenses` Примеры плохих имен рассмотрим подробнее: + - Глобальная константа `Maximum` - не понятно, максимум чего, без второго слова константа не может быть глобальной; нарушены конвенции использования строчных и заглавных букв, вместо `camelCase` тут использован `PascalCase` и такую константу сложно заметить при чтении кода; -- Таймайт запросов `request_timeout` - нарушены конвенции; +- Таймаут запросов `request_timeout` - нарушены конвенции; - Коды ошибок `ERCODE` - сложно читается; не понятно, что это коллекция кодов, а не один код; - Массив цен `numbers` - не нужно называть массивы именами типов данных, которые в них находятся, из этого названия очень сложно понять, что там цены; - Массив товаров `arrayOfGoods` - не добавляйте названия структур данных в имена переменных; - Слишком длинное имя для коллекции товаров: `orderItemsInShopBasket`; - Неочевидное сокращение `amt`; -- Кроме явного нарушения конценций `grp_N` еще и вводит в заблуждение, это плохое сокращение, не нужно экономить на буквах до такой степени; +- Кроме явного нарушения концепций `grp_N` еще и вводит в заблуждение, это плохое сокращение, не нужно экономить на буквах до такой степени; - Не называйте переменные транслитом, как `itogo2` и не используйте цифры для именования переменных с похожим смыслом, попробуйте учесть оттенки смысла, например: `total` и `subtotal`; - Если структура содержит два значения, как `tolalAndSubtotal`, то нужно назвать ее таким словом, которое обобщает их, например `order`; -- Кроме нарушения конвенций `BuyerCalculatins` еще и очень не точный, не понятно, какие именно вычисления; +- Кроме нарушения конвенций `BuyerCalculations` еще и очень не точный, не понятно, какие именно вычисления; - Короткие сокращения типа `VE` - совершенно неприемлимы в качестве имен, если только это не общепринятые `i` и `j` для циклов или, `x` и `y` для координат и еще несколько подобных случаев. > Объявление и присвоение (assignment) @@ -36,7 +37,7 @@ let migrationYear = 622; В C и C++ аналогичный код будет выглядеть так: ```c -int migrationYear = 622; // тут int обозначает целый тип +int migrationYear = 622; // тут тип int представляет целое число ``` В Python, как и в JavaScript, оператор присвоения не требует указывать тип, он определяется из типа литерала. А при присвоении, мы не можем запретить переприсвоить идентификатору другое значение. @@ -112,7 +113,7 @@ console.log(migration); // вывод числа - Число `-12000`, кроме обычной записи, может еще быть записано: `-12000n`; `-1.2e4`; `-12e3`; `-12e3f`; `-1.2e4d`; тут символы `n`, `f` и `d` обозначают тип, а `e` экспоненциальную форму;  в разных языках поддерживаются разные формы записи; - Булевы литералы: `true` и `false`; - Литерал массива: `[1, 2, 3]` в JavaScript и Python; в C и C++, Java, C# `{ 1, 2, 3, 4 }`; -- Литерал справочника: `{ 'uno': 1, 'due': 2, 'tre': 3 }` в Python; и `{ uno: 1, due: 2, tre: 3 }` в JavaScript; +- Литерал словаря: `{ 'uno': 1, 'due': 2, 'tre': 3 }` в Python; и литерал объекта `{ uno: 1, due: 2, tre: 3 }` в JavaScript; Эта книга не является руководством по какому-либо языку, а особенности конкретного языка можно узнать из его спецификации, учебника или из примеров кода, которых тут достаточно, чтобы освоить запись всех необходимых литералов JavaScript и Python. diff --git a/content/ru/2-2-Types.md b/content/ru/2-2-Types.md index e2aa841..5cc6258 100644 --- a/content/ru/2-2-Types.md +++ b/content/ru/2-2-Types.md @@ -19,13 +19,13 @@ console.log({ types }); > Ссылка (Reference) -Значение ссылочного типа (или ссылка) указывает на объект. Для `JavaScript` это все наследники типа `Object`, которыми явзяются все объекты, функции, массивы, типизированные массивы и объекты других встроенные классов (или встроенных прототипов). +Значение ссылочного типа (или ссылка) указывает на объект. Для `JavaScript` это все наследники типа `Object`, которыми являются все объекты, функции, массивы, типизированные массивы и объекты других встроенных классов (или встроенных прототипов). > Структурные типы (Composed types) -Композитные типы или структуры состоят из нескольких скалярных значений (для JavaScript все они объекты). Скалярные значения объединяются в одно таким образом, чтоб над этим объединенным значением можно выполнять набор операций. Например: объект, массив, множество, кортеж. +Композитные типы или структуры состоят из нескольких скалярных значений (для JavaScript все они являются объектами). Скалярные значения объединяются в одно таким образом, чтобы над этим объединенным значением можно было выполнять набор операций. Например: объект, массив, множество, кортеж. -> Перечислимый тип (Enumerated type) +> Перечисляемый тип (Enumerated type) > Флаг (Flag) @@ -37,4 +37,4 @@ let flagName = false; > Строка (String) -В большинстве языков к каждому символу в строке можно обратиться через синтаксис доступа к элементам массива, например, квадратные скобки. Но в некоторых языках отдельные символы можно так же и записывать, изменять строку. Есть языки, где строки неизменяемы, как JavaScript и Python. +В большинстве языков программирования к любому символу в строке можно обратиться через синтаксис доступа к элементам массива, например, квадратные скобки `[]`. Но в некоторых языках отдельные символы можно так же и перезаписывать, изменять строку. Есть языки программирования такие как JavaScript и Python, в которых строки являются неизменяемыми. diff --git a/content/ru/2-5-Procedure.md b/content/ru/2-5-Procedure.md index 6eeaec3..2a34a0d 100644 --- a/content/ru/2-5-Procedure.md +++ b/content/ru/2-5-Procedure.md @@ -10,7 +10,7 @@ Сигнатура функции (Function signature) включает в себя: имя (идентификатор), количество аргументов и их типы (а иногда и имена аргументов), тип результата. -> Метод — функция или процедура, связанная с объектным или классом. +> Метод — функция или процедура, связанная с объектом или классом. ```js { diff --git a/content/ru/2-6-Function.md b/content/ru/2-6-Function.md index 11d97e6..92e2851 100644 --- a/content/ru/2-6-Function.md +++ b/content/ru/2-6-Function.md @@ -75,15 +75,20 @@ const expr2 = add( const compose = (f1, f2) => (x) => f2(f1(x)); ``` -``` -const compose = (...funcs) => (...args) => - funcs.reduce((args, fn) => [fn(...args)], args); +```js +const compose = + (...funcs) => + (...args) => + funcs.reduce((args, fn) => [fn(...args)], args); ``` > Частичное применение (Partial application) -``` -const partial = (fn, x) => (...args) => fn(x, ...args); +```js +const partial = + (fn, x) => + (...args) => + fn(x, ...args); ``` > Каррирование (Currying) diff --git a/content/uk/2-3-Context.md b/content/uk/2-3-Context.md index 5dd7585..b975358 100644 --- a/content/uk/2-3-Context.md +++ b/content/uk/2-3-Context.md @@ -10,8 +10,6 @@ код - - > Лексичний контекст (Lexical environment) Набір ідентифікаторів доступний у локальному блоці або функції. Якщо ідентифікатор не знайдено в лексичному контексті, пошук продовжиться в батьківському контексті, адже контексти мають вкладену структуру. Якщо дійшовши до кореня ідентифікатора не знайдено, буде проведено пошук у глобальному контексті. Для JavaScript лексичні контексти обмежуються блоками '{}' і функціями, а Python — лише функціями. @@ -25,4 +23,3 @@ > Глобальний контекст (Global context) Якщо ідентифікатор не знаходиться у жодному з вкладених лексичних контекстів, то буде виконано його пошук у глобальному об'єкті-довіднику, який є глобальним контекстом (JavaScript `global` або `window`). -