среда, 9 мая 2012 г.

Book: Программист-прагматик - 2, гл. 3-8

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

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

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

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

Поэтому любите командную строку, а в ней - cygwin или даже UWin.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Генерация текстов - Perl
    Системные дела - Cmd, Cygwin (теперь и PowerShell)
    Тестирование интерфейса - есть и для этого средства (в наше время - iMacro, AutoIt)

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

вторник, 8 мая 2012 г.

Script: скомпилировать все *.sln файлы

Ещё один CMD-скрипт. Делает Switch для tortoise, после чего перекомпилирует все *.sln в проекте.

@echo off
set MSBUILD=%WinDir%\Microsoft.NET\Framework\v3.5\msbuild
set PROJECT=d:\Projects\CSharp\MinesweeperProj\
TortoiseProc /command:switch /path:"%PROJECT%"
cd %PROJECT%
for %%f in (*.sln) do "%MSBUILD%" %%f
cd %~dp0.

К сожалению, switch с заменой ветки в текущей стабильной версии делать нельзя. В nightly версии у switch добавился параметр url, но бета-версии Tortoise на работе обычно не ставят.

Script: Скриптовая эволюция

Дано - написать скрипт, который кидает определённые файлы из локальной папки в папку на подключенном сетевом диске. Например, веб-проект, в котором мы изменили 2-3 dll. OS Windows.

На каком языке писать скрипт?

ActivePerl под Windows - иногда не принимает переданных параметров
Cygwin - нету
PowerShell - просто так даже Hello World не запустишь. Система будет ругаться, что он... не подписан (маразм? маразм!)

Похоже, технологии ушли слишком далеко. Нам остаётся только старый формат CMD файлов.

copydll.cmd:

@echo off
set FROM=d:\proj1\bin
set TO=W:\stable\proj1\bin
FOR %%A IN (%*) DO IF EXIST "%FROM%\%%A.dll" COPY /Y "%FROM%\%%A.dll" "%TO%\%%A.dll"

Добавляем папку в Path и вызываем

copydll Proj.Module1 Proj.Module2

А этот cmd можно кинуть на панель в Total Commander и просто перетаскивать туда нужный файл:

@echo off
set TO=W:\stable\proj1\bin
FOR %%A IN (%*) DO IF EXIST %%A COPY /Y %%A "%TO%\%%~nxA"

Конечно, можно просто перетащить на панель Total Commander'а саму папку, но тогда придётся дважды щёлкать мышкой (ОК в диалоге копирования и потом Replace All)

Да, ещё. Если написать в CMD-шке PAUSE, она в этом месте попросит Press any key to continue....

понедельник, 7 мая 2012 г.

Blog: Баг в ЖЖ

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

Дело в том, что если попытаться послать пост по e-mail (как это сделать - ищите в настройках. Там оно есть), то LJ то ли не будет проверять его размер, то ли будет проверять его по старому стандарту.

И пост благополучно уйдёт по назначению.

Писал на Хабр - НЛО статью отвергло. И правильно - неча умные вещи писать.

И, для изучение - Perl-скрипт для синхронизации Wordpress и Livejournal. Написано на Perl, запускать в cron.

Book: Программист-прагматик - 1. гл. 1-2

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

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

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

Полезное:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

11. Из 10 - подобные функции могут быть объеденены в Strategy, а глобальные данные - в Singletone

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

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

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

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

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

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

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

- Интерфейса

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

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

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

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

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

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

1-15 дней - дни

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

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

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

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

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

суббота, 5 мая 2012 г.

Blog: Постим в два блога одновременно

Не люблю ЖЖ, но эккаунт там всё-таки есть. И хочется, чтобы блоги были синхронизированы. Чтобы написал здесь - а там оно само появилось.
Для этого есть разные способы.
  • Поставить Firefox + Scribefire. Добавляем в него оба наших блога и, когда делаем пост, ставим флажок на том блоге, в который нужно отправить копию. По-моему, лучшее.

    Особенности
    • Когда добавляем блог, надо указать имя, тип (для livejournal - "Livejournal (old)") и нажать "Следующий". Тогда он правильно определит URL.
    • Если в вашем логине есть дефисы, надо вводить их нижним подчёркиванием, e.g.: rikki_mongoose.
    • Крайне желательно, чтобы блог был оформлен как чёрный текст на белом фоне. Editor, который встроен в Scribefire, любит вставлять стилистический мусор и явно задаёт цвет для каждого абзаца. В моём случае получался текст "углём по чёрной бумаге". Замучившись, я просто отказался от идеи использовать 2 блога.
    
    
  • Настроить перепост через почту. Это дыра в безопасности - четырёхзначный PIN скорее всего будет годом рождения где-то между 1900-2000. Да и забить ящик Livejournal'а письмами с PIN-кодом от 1000 и 9999 - дело одного дня.
  • Воспользоваться сторонним сервисом перепоста, вроде Пистона. Работоспособность никто не гарантирует. И название у них дурацкое.

пятница, 4 мая 2012 г.

Life: Музыка паттернов проектирования

В "Русских Ночах" Одоевского очень много разговоров о музыке. В те времена рассуждали примерно так: у животных нет понятия о красоте, хотя есть понятие о логической связности мира (т.е., разум). Но человеку красота доступна. Не в этом ли его тайна? И ещё - из всех искусств музыка выглядит наиболее "бесполезной" и ни на что в материальном мире не похожей, в отличии от архитектуры, скульптуры, литературы и живописи. Не в ней ли тайна прекрасного?

Может быть, именно способность воспринимать прекрасное сделала человека человеком? Прекрасное чувствует и европеец, и древний грек, и древний египтянин. Даже дикарь с далёких островов Полинезии замирает, очарованный величественным водопадом, а вернувшись в хижину, он делает их дерева нарядные украшения. Напротив, филистёр этого лишён - и потому ближе к животному, чем к человеку.

Неспроста так популярно в ту эпоху система Шеллинга, а главным героем романтической прозы очень часто становится музыкант. Про музыку пишут так проникновенно, что и не снилось современному искусствоведу. Даже меркантильный человек наших дней заинтересуется классикой после "Себастиана Баха" и "Последнего концерта Бетховена". Искусство классической музыки сложно, красиво и, самое гласное, её много. Стройное здание классической музыки похоже на дворец - а кто из людей не хотел бы хоть недельку пожить во дворце?

Будет здорово, если хотя бы один программист отнесётся к своей работе ка персонажи эры романтизма относились к музыке. Сел за клавиатуру - и начал творить симфонию или кантанту, изобретая, переделывая и что-то отбрасывая. Конечно, есть ещё и заказчик... но у музыки барокко, Баха и Бетховена тоже были заказчики.

Кто знает - может, ремесло программиста станет тогда более возвышенным. А их код - более гармоничным.

Ведь программирование - это тоже искусство. Это выражается, например, в том, что программисты обычно сами не могут объяснить, как они делают то, что делают. Как у композиторов или у исполнителей - у величайших есть своя манера. Для кого-то и Perl недостаточно гибок, а для кого-то - например, для Линуса Торвальдса - и C++ есть излишество, эксплуатирующее достоинства чистого C.