Д. Босуэлл, Т. Фаучер — Читаемый код, или программирование как искусство

Небольшая книжка, в которой много полезных мелочей.

Например, более точные варианты названий для типичных функций:

send — deliv­er; dis­patch; announce; dis­trib­ute; route
find — search; extract; locate;recover
start — launch; cre­ate; begin; open
make — cre­ate; set­up; build; gen­er­ate; com­pose; new

Именованные интераторы для циклов (ui лучше, чем просто i).

Дополнительные постфиксы — size_mb, html_utf луче, чем size и html.

first/last — это включающие, а begin/end — исключающие границы.

Пометы в комментах:

TODO - задумано, но не сделано.
FIXME - известно, что есть проблема
HACK - неэлегантное решение проблемы
XXX - серьёзная проблема

Уже второе недоумение насчёт цикла do-while (которые непонятно, зачем нужен).

Разоблачён миф о том, что из функции должен быть только один выход. Он тянется из чистого C, где нередко забывали вычистить память перед выходом. Но c тех пор появились исключения, деструкторы и очистка мусора. А в C простительно писать goto cleanup;

Вообще, если удаётся уменьшить количество отступов, — это хорошо.

Запутывают код: многопоточность, обработчики сигналов/прерываний, исключения, указатели на функции и анонимные функции, виртуальные методы.

В JavaScript и Python переменная, объявленная внутри цикла, будет видна и снаружи. Вообще, область видимости переменных надо сужать. А самые лучшие переменные — константы, поэтому лучше всего менять их один раз.

Переменные объявлять где используются, а не в начале блока. Объявлять всё в начале блока — дурная традиция из Pas­cal и раннего C (хотя в C99 уже разрешили объявлять где угодно).

Также есть приятные куски кода:

Макрос для C++, чтобы убрать warn­ing для неопределённого конструктора копирования или оператора присваивания.

#define DISALLOW_COPY_AND_ASSIGN(ClassName) 
  ClassName(const ClassName&); 
  void operator=(const ClassName&);

И потом писать:

class ClassName {
  private:
     DISALLOW_COPY_AND_ASSIGN(ClassName);
     ...
  public:
     ...
};

Georges Simenon – Le Chien jaune

Смысл некоторых страниц пока выглядит довольно мутным. Но я всё равно героически дошёл до конца и узнал, кто убийца.

Прочитал вот это издание:

Сам автор утверждает, что романы, вроде этого, он писал за 3 дня. Что ж, 3 дня “Жёлтого пса” оказались просто превосходными. Экранизировали книгу почти сразу, а в наши дни она читается ничуть не хуже, чем в 1931.

Так и появляется неожиданная классика жанра.

Jens Köhn – Die Etruskier. Kinder des Tunia

Ещё одна книга из серии “Alte Kul­turen am Mit­telmeer” – как и предыдущие про критян и микенцев. Книжки про финикийкев в магазине уже не было – только эти три.

Издана в 1991, ещё до орфографической реформы. Единственный серьёзный недостаток – на странице 4 в качестве примера этрусской письменности изображена лемносская стела, которую всё-таки относят к пеласгам или тирсенам.

Дж. Х. Рейнвотер – Как пасти котов

Книга об управлении программистами. Большинство советов либо слишком абстрактны, либо слишком мелочны чтобы их можно было запомнить. Начинается бодренько, а потом разочаровывает всё – даже немногочисленные коты на буквицах.

Где-то в книге скрывалась история о том, как проектный менеджер Джон завалил проект, потому что даже не пытался понять, что там происходит. Я так и не смог её разыскать. Видимо, она была не очень связана с той главой, в которую её поместили.

Зато я нашёл другую хорошую цитату и выписываю её отдельно, потому что она мне очень понравилась.

Поймите, других людей вам не исправить. Это очевидное, на первый вгляд, обстоятельство очень помогает в процессе взаимодействия с окружающими.

Возможно, ради неё и стоило читать всю книгу

Christian Bieniek – Karla mit großen Klappe

История про девочку, которая вдруг решила говорить только правду. Довольно неплохая, но мне не понравилась. Слишком много семейных скандалов.

И что-то не верится, что неугомонная Карла говорила неприятную правду просто в качестве эксперимента. По-моему, она просто вредина.

Но всё равно приятно читать про Грёнланд и наблюдать живую немецкую речь.

Книжка нашлась в Институте Гёте, раздел детской литературы.

Detlef Rössler – Mykene. Burg des Agamemnon

Книга из той же серии, что упомянутая раньше Kre­ta. Insel des Minos. Идём хронологически – сначала критяне, потом завоевавшие их минойцы, а дальше будут этруски из той же серии.
Скроена по тому же принципу, что предыдущая:

  1. Как раскопали
  2. Как жили цари
  3. Как велось хозяйство
  4. Как жил народ
  5. Каким богам поклонялись
  6. Как пришли завоеватели (в случае критян – минойцы, в случае минойцев – дорийцы) и всех завоевали

Reinhard Witte – Kreta. Insel des Minos

Книга про древних критян. Приятно, что авто не только пересказал все положенные легенды, но и хорошенько расписал порядок жизни царей и простых критян, включая их равзлечения и культуру.

Ввиду того, что интернета тогда не было, рапсод был таким же профессионалом, как кузнец или плотник. Поэтому народное творчество уже тогда творил не народ, а профессионалы. И вообще, профессия была уважаемая и доходная — другое дело, что и столетия спустя вполне себе подвижные арабы иной раз называли путешествие одной из тех мук, которые должны приготовить человека к жизни на том свете.

Интересно, что гомеровские цитаты я понимал легче, чем весь остальной текст.

Book: Достоевский — Игрок

Та самая книга, которую Достоевский надиктовал за 25 дней. Короче, чем “Село Степанчиково”, “Неточка Незванова” и “Двойник”, но длиннее, чем “Бедные люди”. Чтобы усилить жанровую чересполосицу — это считается романом (а иногда и “Белые ночи” считают романом), в то время как “Вечный муж” (такого же размера) — рассказ.

Сложно сказать, насколько каторжной была работа: Достоевский диктовал с 12 до 4, т.е. 4 часа в день.

fb2-версия оказалась на купленном в воскресенье букридере. Вот и прочитал.

Очень достойно и захватывающе. Радует la baboulin­ka и впечатляет раздолбайство главного героя, который может выиграть деньги, но тратит их на парижское житьё пресловутой made­moi­selle Blanche. Нету безысходного мрака и сырости, которым шибает нас из школьной программы, где “Белые ночи” и “Преступление и наказание”. Просто срыв резьбы и падение, падение, падение.

Словом, Достоевский, конечно, велик. Несмотря на школьную программу.

Book: Программист-прагматик

Книга довольно старая (эпохи, кажется, Win­dows 2000) и очень плохо переведена (есть глава “Мой исходный текст съел кот Мурзик”).

Набор инструментов типичен для того времени — C++, CORBA, Perl и т.п.

Внимательно читать не стоит, а вот просмотреть — надо. В книге есть мысли, которые просто в голову не приходили.

Полезное:

1. Предлагать варианты решения проблемы, а не отговорки.

2. “Закон разбитых окон” выполняется и для программ. Если есть ошибки и нестабильности — очень скоро их станет намного больше.

3. Качество должно быть одним из требований.

4. Читайте по одной технической книге ежеквартально. И другие книги — не относящиеся к технической литературе.

5. Экспериментируйте с различными операционными системами.

6. Оставайтесь в курсе событий — интернет и т.п.
(Советует журналы и news-группы — в духе времени. Сейчас закрылись и основной журнал по C++, и The Perl Jour­nal. Статьи из последнего можно найти в Интернете по метке TPJ).
и критически осмысляйте всё, что нашли и услышали.

7. “Лучше быть проигнорированным, чем недооценённым”. Беседуйте с гуру и с потребителями.

8. Принцип для выступлений WISDOM:

- Чему вы хотите научить?

- Какова их заинтересованность?

- Насколько искушена аудитория?

- Насколько детальным должно быть выступление?

- Кто должен обладать информацией?
 
- Как мотивировать слушателей?

9. DRY — Don’t repeat your­self. Важно писать код так, чтобы его было легко использовать повторно. Тогда отпадает большинство эпизодов с дублированием.

10. Ортогональность — следует исключать взаимодействие между объектами, не относящимися друг к другу. Искать баги становится легче, код — более удобным для повторного использования, и немного возрастает производительность.

11. Из 10 — подобные функции могут быть объеденены в Strat­e­gy, а глобальные данные — в Sin­gle­tone

12. Обратимость. Вытекает из предыдущего. Помним, что не существует окончательных решений. Если чтобы заменить MS SQL на Ora­cle надо переписывать всё — это не порядок.

13. Чтобы стрелять ночью прицельно, используют трассирующие пули, которые светятся в темноте. Куда попадёт трассирующая — попадёт и обычная. Используйте “трассирующие” предложения, чтобы понять, что от вас хотят.

14. Прототипы (не работает, но показать можно):
- Архитектуры (классы-заглушки)

— Новых функциональных возможностей для системы (интерфейс, который не работает)

— Структуры или содержания внешних данных

— Компонентов

— Рабочих характеристик

— Интерфейса

15. “Границы моего языка есть границы моего мира”.

(Неспроста Хайдеггер искал истину в языке, иногда получая слова в духе Хлебникова)

Программируйте как можно ближе к предметной области вашей задаче. Если команды можно упаковать в классы-“пакеты” — пакуйте! Т. ж. хорошо писать мини-языки, там, где они могут пригодиться.

Если язык парсится, его лучше описать в BNF, которая годится для всех контекстно-свободных грамматик (Perl, например,ей не опишешь)

Т.к. срок службы большинства прикладных программ превышает ожидаемый, лучше, чтобы язык был гибче и удобочитаемей. Ближе к настройкам rc, чем к настройкам send­mail.

16. Проводите оценки по следующим градациям:

1–15 дней — дни

1 — 8 недель — недели

8 — 30 недель — месяцы

> 30 недель — надо хорошенько подумать

Если вы уверены, что проект займёт 125 рабочих дней (= 25 недель) — говорите “примерно 6 месяцев).

Если просят оценить сразу — говорите “надо подумать”. Ведите журнал оценок, чтобы знать свою точность. И по возможности сдвигайте график в ходе проекта — по мере работы он не растягивается, а уточняется.

17. Сохраняйте данные в виде простого текста. Так проще править руками

18. Графические интерфейсы:

преимущество — WYSIWYG — получаешь то, что видишь

недостаток — WYSIAWYG — получаешь только то, что видишь

Поэтому любите командную строку, а в ней — cyg­win или даже UWin.

19. Используйте 1 редактор, но по максимуму. Требования: настраиваемость, расширяемость, программируемость

20. Отлаживать без паники. Не обвинять, а исправлять. Не предполагайте — доказывайте.

21. Добиться воспроизводимости, и только потом чинить. Метод “резинового утёнка”

22. Используйте язык обработки текстов, чтобы сгенерировать данные и или даже текст самой программы.

23. Совершенных программ не бывает. Бывают программы, которые легко поддерживать.

24. Пользуйтесь исключениями только в исключительных случаях.

25. Если запутались — применяйте закон Деметера. Но без фанатизма.

26. Настройка лучше интеграции. Текст программы — абстракция, метаданные — подробности.

27. Проектируйте, не забывая о службах — некоторые процессы так и просятся, чтобы их распараллелили. Для распределённых приложений — концепция доски объявлений.

28. Реорганизуйте чаще, раньше, регулярней.

29. Проектируйте с учётом тестирования. Тестируйте сами, иначе это будут делать пользователи. Применяйте, если надо, журнал или даже секретное отладочное окно (пользователю не говорить).

30. Работайте с пользователем, чтобы говорить на его языке.

31. Абстракции живут дольше потребностей. Поэтому, например, проекту нужен иногда глоссарий — что как называется.

32. Не размышляйте вне ящика — найдите его. Все возможные решения, включая безумные — в список и на проверку. Так же выпишите ограничения.

33. Вопросы, если упёрлись:

Можно ли сделать проще?
Мы решаем проблему, или увязли в деталях?
Почему это проблема?
Что делает её сложной?
Нужно ли это?

34. Начинайте, когда знаете, что будете делать. Иначе дров наломаете.

35. Автоматизируйте всё.

Генерация текстов — Perl
Системные дела — Cmd, Cyg­win (теперь и Pow­er­Shell)
Тестирование интерфейса — есть и для этого средства (в наше время — iMacro, AutoIt)

36. Тестируйте беспощадно. Тестируйте в т.ч. сами тесты — специально поставьте неправильный вывод и т.п. и проверьте, найдёт ли его текст.