Skip to content

Latest commit

 

History

History
258 lines (198 loc) · 8.47 KB

index.adoc

File metadata and controls

258 lines (198 loc) · 8.47 KB

Master programming
Лекция №1 (Вводная)

1. Введение

1.1. Из чего состоит курс

  • Вводные понятия

  • Система контроля версий

  • Система сборки и отладки

  • Тестирование

  • Обзор STL

  • Обзор Boost

  • Паттерны проектирования (GoF)

  • Современный C++

  • Разработка в команде

  • Домашняя лабораторная работа

1.2. План лекции

  1. Операционная система

  2. Редакторы

  3. Системы сборки

  4. Отладка и тестирование

  5. Системы контроля версий

  6. Программирование

  7. Заключение

2. Операционная система

2.1. Основные компоненты ОС

  • Планировщик задач

  • Распределение памяти

  • Изоляция (страничная адресация)

  • Ресурсы

2.2. Объекты ядра ОС

  • Процессы, потоки

  • Файлы, каналы (pipes)

  • Семафоры, мьютексы

  • Проекции в память (mmap)

2.3. Linux

  • Основан на Unix

  • Только ядро и компилятор

  • Linux ≠ Unix

  • Virtual File System (VFS) — представление всех объектов в виде файлов

$ ls /
bin  boot  dev  etc  home include lib  lib64 proc  root  run  sys  tmp  usr  var

2.4. Жизнь в консоли

  • GNU Coreutils

    • текстовые утилиты: sort, tr, tail, cat, wc, uniq, …​

    • файловые утилиты: ls, cp, dd, chmod, ln, mv, rm, …​

    • скриптовые утилиты: basename, echo, pwd, tee, …​

  • GNU Binutils

    • as, ld, ar, objcopy, strip, gprof, …​

    • nm, objdump, readelf, strings, addr2line, c++filt, …​

  • GNU Debugger

  • Базовые утилиты: grep, sed (1974 г.), awk (1977 г.), bash, perl, python

2.5. Linux в использовании

  • xorg-server, протокол X11

  • window-manager: оконный, тайловый

  • демоны (daemons)

  • драйверы:

    • обычные файлы, которые умеют обрабатывать вызов ioctl

    • находятся в папке /dev/

    • и в /sys/class/

    • работают в режиме ядра

  • драйверы в режиме пользователя: fuse, cuse, uio

3. Редакторы

3.1. Популярные редакторы

  • ed (1971 г.)

  • sed, vi, vim, neovim

  • emacs

  • sublime

  • notepad++

  • gedit

  • IDE ≠ Editor

3.2. Процесс редактирования

  1. Перемещение по тексту, поиск, скроллинг (view-mode)

  2. Разделение области просмотра/редактирования

  3. Подсветка синтаксиса

  4. Редактирование, замена, удаление, вставка

  5. Поиск-замена

  6. Поддержка пользовательских плагинов

  7. Использование уже готового функционала сторонних программ

3.3. Пример: Vim

  • 3 режима: normal, insert (replace), visual

  • Программируемая панель

  • Буферы, табы, окна

  • Большое многообразие плагинов (VimL)

  • Подсветка синтаксиса, цветовая схема — тоже плагин

  • Орфография

  • Использование ctag для перехода по функциям (любого языка, даже LaTeX)

    • Отображение дерева функций

  • Автодополнение (несколько видов)

  • Запуск интерактивной оболочки вместо буфера

  • Встраиваемое GUI

  • Возможность использования без GUI

  • Холивары: neovim

4. Системы сборки

4.1. Известные системы сборки

  • make (1977 г., Bell Labs)

  • ninja

  • scons

  • meson

  • cmake

  • свой велосипед НЕТ!

4.2. Makefile

SRC := $(wildcard src/*.cpp)
HDR := $(wildcard include/*.h)
OBJ := $(patsubst src/%.cpp,build/%.o,$(SRC))

%.o: %.cpp
»»»»@g++ -c $< -o $@

lib.a: $(OBJ)
»»»»@ar -c $@ $^

app: main.cpp lib.a
»»»»g++ $^ -o $@

all: app

clean:
»»»»@rm -f $(OBJ) app *.a

4.3. CMake

  • Шаг конфигурации (аналогичен старому подходу ./configure)

  • Сборка привычными инструментами (make, ninja, MSBuild, …​)

  • Запуск тестов через ctest

  • Пакетирование через cpack (tar.gz, deb, rpm, zip, …​)

  • Тьюринг-полный скриптовый язык

  • Абстрагирование от операционной системы

5. Отладка и тестирование

5.1. Отладка программ

  • gdb

  • nm, readelf, objdump

  • valgrind

  • gprof, gcov

  • логирование

5.2. Тестирование

  • TDD, BDD — способы написания программы

  • Юнит-тестирование → интеграционное тестирование → продакшен-тестирование

  • Статистика, бенчмарки

  • Fixture, test suite, mock, stub, …​

  • Тестовые данные: генерация на месте, хранение в репозитории или брать удалённо с сервера?

  • Границы между разными формами тестирования

6. Системы контроля версий

6.1. Разновидности

  • Version Control System (VCS)

  • cvs

  • subversion (svn)

  • git

  • mercurial (hg)

  • лучше я в архивах, по старинке НЕТ!

  • необходимо учитывать версионность продукта

6.2. Основные понятия VCS

  • Концепция diff-patch

  • Изменения

  • Коммит: изменения + сообщение + автор

  • Ветка разработки

  • Слияние (merge)

  • Конфликты слияния

  • pull, checkout, fetch, push

centr decentr@2x

7. Программирование

7.1. Программирование на C++

  • Новый стандарт лучше старого?

  • Лучше на C писать: понятнее и проще

  • Соблюдение стиля кода

  • Исключения — это зло! Но надо быть аккуратнее

  • Концепции стабильного кода vs. понятный код

  • Разработка по спирали

7.2. Документация

  • Зачем нужна документация, если её никто не читает?

  • Пример документации — http://libfuse.github.io/doxygen

  • doxygen

  • Написание презентаций, статей и книг

  • LATEX, groff, docx, reStructuredText, HTML, AsciiDoc, DocBook, markdown — в чём писать документацию?

  • Генерация linux-документации man

  • Свой велосипед?

7.3. Разработка в команде

  • Что такое команда и зачем она нужна?

  • Распределение ролей в команде?

  • Зачем нужен тот чувак, который ничего не делает?

  • Стендапы, планнинги, грумминги, ретроспективы — зачем они нужны?

  • Deadline, sprint, milestone, release, post-mortem — а это зачем?

  • CTO, CEO, IPO, PM, PO — кто это такие?

  • Agile — выход из всех проблем

  • Психология разработки

8. Заключение

8.1. Бесплатные ссылки

Бесплатные книжки про программирование в целом:

8.2. Лабораторная работа

  1. Заводим аккаунт на github

  2. Возвращаемся на главную страницу проекта и переходим по ссылке с заданиями

  3. Задания можно делать в любом порядке