Обнаружил у себя в книжном шкафу сабжевую книжку. Не помню когда я её купил.
Перечитал по диагонали. Нашел внутри чек — июль 2007-го.
Автор — мужик, руководивший разработкой Visual C++ 1.0.
Описаны три стадии разработки (коробочного) ПО — начало, процесс, выпуск.
ТезисыПравила
12. Выпускайте обновления (новые версии) так часто, как только это возможно.
17. Бизнес ПО — отношения, а не продажа.
13. Не оглядывайтесь назад.
4. Не устанавливайте бит ничтожества.
32. Регулярно проводите сборку продукта.
40. Понравилось: «производитель собачьего корма должен есть свой собственный корм для собак». Приписывают Балмеру. Мне еще нравится другое его высказывание — «Над Windows мы пахали как лошади».
Правила предполагают командную разработку (тараканы в моей голове повернулись в сторону голоса). Относительно много плача про сложности выпуска качественного ПО в срок (тараканы пожали плечами).
В целом, интересно заново перечитать и сравнить полученную информацию с собственным опытом.
Пишу в заголовке «тестовая сборка …», а сам думаю «тестовая, угу».
В сборке удалены v5.2.0.30604 костыли устаревшие свойства инициализации и набора рядов «ado_exec_sp», «odbc_call_sp», «schema_sp_params», «check_cn_status».
После того как удалил, мелькнула мысль — «может надо было их сохранить и оставить только одно допустимое значение?».
Впрочем, умерла так умерла. Этот мусор будет только вводить в заблуждение.
Доступно новое обновление нашего ADO.NET провайдера — версия 1.11.
Это то самое изменение, которое спровоцировало выпуск IBProvider v5. Самое смешное, что ничего такого из v5 здесь не используется. Новый .NET провайдер будет работать и с IBProvider v3. Просто не надо было очень сильно задумываться над тем как все работает.
Но, как говорится, все что ни делается, все к лучшему. IBProvider v5 закрыл вопросы, которые у других даже не появлялись.
Внезапно обнаружил, что в стандартном диалоге «Data Link» для выбора OLE DB провайдера и настройки подключения починили поддержку свойства «Integrated Security». Раньше для выключения интегрированной аутентификации надо было в PropertyBag сохранять специальное значение «NONE», потому что EMPTY (пустое значение) конвертировалось в пустую строку.
Теперь можно писать EMPTY — не конвертируется. Это на Windows 10.
Я так удивился, что снова проверил на древней XP SP2 — там действительно EMPTY конвертируется в пустую строку. Поэтому специальное значение «NONE» пока будет жить.
Видать нарвались на собственные грабли и починили.
Но, для остальных свойств все осталось по прежнему!
Если писать в PropertyBag EMPTY-значение, то обратно он возвращает пустую строку.
Решил прогнать на кодовой базе v5 модульные тесты встроенного клиента к Firebird. В качестве жертв были выбраны FB3.0.4 и FB2.5.6.
100 лет уже эти тесты не запускал — ограничивался основными тестами. Они тоже неплохо так разные варианты перебирают.
В процессе перезапуска тестов на FB2.5.6 (дорабатывал их устаревший код) нарвался на тупняк сервера со списками запросов. Ну, думаю, сейчас тройку замучаю и если на ней тест «RemoteFB.WORK.013.StmtAllocate.v2.ptype__lazy_send.011.check_release_of_dropped_stmts» тоже будет тупить — держите меня семеро. (далее…)
Возникла забавная ситуация, в которой неправильное решение более притягательно, чем правильное. Отчасти «потому что могу».
В OLE DB запрещен вызов метода IDBInitialize::Uninitialize, если у источника данных есть открытые дочерние объекты (сессии, команды, наборы рядов).
It is an error to call IDBInitialize::Uninitialize when there are open sessions, commands, or rowsets on the data source object; that is, the consumer must release all interface pointers on all sessions, commands, and rowsets on the data source object before calling IDBInitialize::Uninitialize.
Я бы тут вместо «open» написал бы «not released», но поскольку дальше русским по-белому написано «the consumer must release all interface pointers on all sessions, commands, and rowsets on the data source object», то вроде как всякая двусмысленность исчезает.
Есть еще аналогичный метод IDBDataSourceAdmin::DestroyDataSource.
Any open OLE DB objects on this data source, such as sessions, commands, rowsets, rows, and views, must be released before calling this method.
IBProvider v3 кладет на эти правила и разрешает эти операции при наличии у Data Source дочерних объектов. Но к этому я вернусь чуть попозже.
Если собираетесь читать дальше, то приготовьте пару стаканов… (далее…)