4. Код и разработка - о разделе
О разделе
Готовьтесь к обучению магии программирования. Что такое программа - уже ясно. Но что такое код, как он работает, как его пишут? И только ли в коде вся сложность?
Вообще, лучше воспользуйтесь содержанием или перейдите к Базе знаний. Но для удобства, я размещу здесь ссылки на основные главы раздела:
Алгоритмы
- 4.01. Алгоритмы
- 4.01. Основные алгоритмы сортировки и поиска
- 4.01. Алгоритмическая сложность и анализ эффективности программ
- 4.01. Нотация Большое O
- 4.01. Классы времени выполнения и скорость работы программ
- 4.01. Линейное, квадратичное и логарифмическое время выполнения
- 4.01. Итоги
- 4.01. Чек-лист самопроверки
Что такое код и как он работает
- 4.02. Что такое код и как он работает
- 4.02. Теория кодирования
- 4.02. Ключевые слова
- 4.02. Операторы
- 4.02. Функции
- 4.02. Null
- 4.02. Циклы
- 4.02. Уровень языка и виды кода
- 4.02. Синтаксический сахар
- 4.02. Стили кода
- 4.02. Приёмы написания кода
- 4.02. Рефакторинг и его приёмы
- 4.02. Виды задач в кодировании
- 4.02. Итоги
- 4.02. Чек-лист самопроверки
Выполнение кода
- 4.03. Выполнение кода
- 4.03. Неопределенное поведение
- 4.03. Как работают функции
- 4.03. Как работают циклы
- 4.03. Как работают условные операторы
- 4.03. Как работают переменные
- 4.03. Как выполняется код
- 4.03. 0x и шестнадцатеричные числа
- 4.03. Сложное железо
- 4.03. Регистры
- 4.03. Машинное слово
- 4.03. Расположение данных в памяти и директивы компилятора
- 4.03. Как исполняется байт-код
- 4.03. Дизассемблирование и декомпиляция
- 4.03. Итоги
- 4.03. Чек-лист самопроверки
Проект и фреймворки
- 4.04. Проект
- 4.04. IDE
- 4.04. Библиотека
- 4.04. Сборка, публикация, компиляторы и интерпретаторы
- 4.04. Фреймворк
- 4.04. Микрофреймворк
- 4.04. Модульность и компонентность
- 4.04. Работа с размером приложений
- 4.04. Итоги
- 4.04. Чек-лист самопроверки
Асинхронность
- 4.05. Процессы и потоки
- 4.05. Управление потоками
- 4.05. Асинхронность и синхронность
- 4.05. Обмен данными
- 4.05. Итоги
- 4.05. Чек-лист самопроверки
Архитектура выполнения
- 4.06. Архитектура выполнения
- 4.06. Битовые операции и представление данных в памяти
- 4.06. Итоги
- 4.06. Чек-лист самопроверки
Парадигмы и уровни абстракции
- 4.07. Парадигмы
- 4.07. Уровни абстракции
- 4.07. Метапрограммирование
- 4.07. Основы SOLID
- 4.07. Итоги
- 4.07. Чек-лист самопроверки
ООП
- 4.08. ООП
- 4.08. Абстракция
- 4.08. Инкапсуляция
- 4.08. Наследование
- 4.08. Полиморфизм
- 4.08. Некоторые инструменты
- 4.08. Итоги
- 4.08. Чек-лист самопроверки
Зависимости
- 4.09. Зависимости
- 4.09. Dependency Inversion
- 4.09. Dependency Injection
- 4.09. Итоги
- 4.09. Чек-лист самопроверки
ORM и работа с данными
- 4.10. Базы данных
- 4.10. Взаимодействие программ с БД
- 4.10. ORM
- 4.10. Основные принципы ORM
- 4.10. Подходы к ORM
- 4.10. Миграции
- 4.10. Нормализация и денормализация
- 4.10. Проблемы ORM
- 4.10. Итоги
- 4.10. Чек-лист самопроверки
Десктопные приложения
- 4.11. Как устроены десктопные приложения
- 4.11. Десктопные приложения
- 4.11. Особенности разработки десктопных приложений
- 4.11. Работа с графами в коде
- 4.11. Итоги
- 4.11. Чек-лист самопроверки
Мобильные приложения
- 4.12. Мобильные приложения
- 4.12. Элементы UI на Android
- 4.12. Сборка приложений на мобильные устройства
- 4.12. Супераппы
- 4.12. Итоги
- 4.12. Чек-лист самопроверки
Основы работы с Git
- 4.13. Основы работы с Git
- 4.13. Установка Git
- 4.13. Как работать с Git?
- 4.13. Ветки и слияния
- 4.13. Основные рекомендации
- 4.13. Итоги
- 4.13. Чек-лист самопроверки
- 4.13. Справочник-шпаргалка по Git
Разработка и отладка
- 4.14. Разработка
- 4.14. Традиции и обычаи разработки
- 4.14. Отладка
- 4.14. Анализ и оптимизация производительности
- 4.14. Как создать свою библиотеку
- 4.14. Пет-проект
- 4.14. Список для развития
- 4.14. Структура кодовой базы
- 4.14. Расширения для браузера
- 4.14. Итоги
- 4.14. Чек-лист самопроверки
Сборка мусора
Программирование охватывает не только команды и код (собственно, поэтому я не особо люблю термин "программист" и больше склоняюсь к термину "разработчик"). Сама по себе разработка — это искусство создания новых решений из простых абстрактных идей. Мы уже прошли важный этап подготовки и у нас есть фундамент, который позволит уверенно двигаться дальше.
Программирование требует практики. Мы будем заниматься практикой умеренно. Как я заметил, практического материала в сети и литературе очень много, так как каждый автор считает, что нужно просто практиковаться.
Знаете почему говорят практика, практика, практика? Потому что проблемы и сложности возникают не из-за кодирования, а из-за различных инструментов, отладки, поиска проблем, поиска решений, изучения возможных методов в библиотеках, анализ производительности и исправления ошибок - вот в чём вся сложность, которая познается на практике — это и есть 90% времени работы программиста. Написать легко, да и запустить легко, а вот сделать четко, быстро и без ошибок - уже искусство. А потом тестировщики находят ошибку и всё по новой. Самое страшное, когда у тебя рабочее решение, но заказчик или руководитель захотел что-то подправить, и именно это "поправить" потом сжирает многие часы страданий. Но как можно научиться читать код, к примеру, на Java, не разобравшись в базовых основах ООП? Это главное упущение, с которым я столкнулся. Мы попробуем значительную часть провести за "разжёвыванием" фундамента, чтобы потом было легко, и будем отталкиваться в первую очередь от алгоритмического языка.
На практике всё будет сложно, и даже очень. Первая задача определённого типа заставит застрять с вопросом "Как это реализовать?" и здесь кому-то повезёт и рядом окажется хороший наставник, который покажет и объяснит, а кому-то придётся разбираться самому. Сложнейшим этапом будет поиск способа решения вопроса - искать в интернете, советоваться с коллегами, изучать документацию. ИИ, кстати, здесь не поможет - ведь он попытается решить проблему, а не научить вас работать с такими задачами. Поэтому сначала надо справиться с такой задачей, и когда вам дадут новую задачу похожего типа - уже будет проще, ведь вы уже реализовывали такое и знаете как делать! Причем не важно, запомнили ли вы в голове или записали себе где-то алгоритм решения, но факт - вы уже знаете, что делать и у вас не возникает того самого "застревания".
Таков цикл обучения:
Испугался - Нашел решение - Научился - Научил других.
Шаг "испуга" крайне стрессовый, который будет нагонять мысли вроде "это не моё", "я не смогу", "у меня не получится". Главное преодолеть, а потом будет проще. Причём, следующей проблемой, с которой столкнётся разработчик — это внимательность. Забыл тут дописать, пропустил ошибку там, не исправил здесь - всё это и правится опытом, который помогает набирать хороший наставник. Поэтому настоятельно рекомендую - не только изучайте книгу, но и найдите себе наставника, если есть такая возможность. Попросите выделить время и объяснить вещи, которые "ну никак не лезут в голову".
Разбирайте код. Разбивайте то, что видите, на логические блоки, можете расписывать для себя аналог на алгоритмическом языке (Шаг 1 - объявляем переменную, Шаг 2 - присваиваем значение, Шаг 3 - вызываем метод и так далее). Но давайте пока не будем торопить события и начнём с самых фундаментальных знаний.
Печатайте чаще. Если раньше вы редко печатали, то потренируйтесь в наборе текста на английском языке. Идеальный вариант - если вы будете перепечатывать код, который находите в примерах в ходе обучения. Не копировать, а именно ручками, букву за буквой, символ за символом, и вчитываться, вникать в то, что печатаете. Это замечательная практика.
Повторяйте материал. Человеку свойственно забывать изученное, поэтому не стесняйтесь зубрить - учите, повторяйте, перечитывайте снова и снова. И старайтесь не бежать гуглить решение, а уделить 10-15 минут на то, чтобы сначала попытаться вспомнить.
Тренируйте вспомогательные навыки: алгоритмизация, системное, критическое, творческое мышление, прогнозирование, индукция (делать выводы), дедукция (применение правил), внимательность, концентрация, терпение, рефлексия.
К сожалению, как бы не говорили в различных книгах и курсах - одного обучения и практики вам будет мало, нужно конкретно учиться решать задачи и перед решением получить теоретическую базу. Цель данного тома - научиться разрабатывать, получить теоретическую базу - а в конце книги будут и задачи для разработки своих проектов.