Правила разработки программного обеспечения

Обнаружил у себя в книжном шкафу сабжевую книжку. Не помню когда я её купил.

Перечитал по диагонали. Нашел внутри чек — июль 2007-го.

Автор — мужик, руководивший разработкой Visual C++ 1.0.

Описаны три стадии разработки (коробочного) ПО — начало, процесс, выпуск.

Тезисы Правила

12. Выпускайте обновления (новые версии) так часто, как только это возможно.

17. Бизнес ПО — отношения, а не продажа.

13. Не оглядывайтесь назад.

4. Не устанавливайте бит ничтожества.

32. Регулярно проводите сборку продукта.

40. Понравилось: «производитель собачьего корма должен есть свой собственный корм для собак». Приписывают Балмеру. Мне еще нравится другое его высказывание — «Над Windows мы пахали как лошади».

Правила предполагают командную разработку (тараканы в моей голове повернулись в сторону голоса). Относительно много плача про сложности выпуска качественного ПО в срок (тараканы пожали плечами).

В целом, интересно заново перечитать и сравнить полученную информацию с собственным опытом.

Тестовая сборка IBProvider v5.2.0.30604

Привет всем.

Пишу в заголовке «тестовая сборка …», а сам думаю «тестовая, угу».

В сборке удалены v5.2.0.30604 костыли устаревшие свойства инициализации и набора рядов «ado_exec_sp», «odbc_call_sp», «schema_sp_params», «check_cn_status».

После того как удалил, мелькнула мысль — «может надо было их сохранить и оставить только одно допустимое значение?».

Впрочем, умерла так умерла. Этот мусор будет только вводить в заблуждение.

.Net provider v1.11

Доступно новое обновление нашего ADO.NET провайдера — версия 1.11.

Это то самое изменение, которое спровоцировало выпуск IBProvider v5. Самое смешное, что ничего такого из v5 здесь не используется. Новый .NET провайдер будет работать и с IBProvider v3. Просто не надо было очень сильно задумываться над тем как все работает.

Но, как говорится, все что ни делается, все к лучшему. IBProvider v5 закрыл вопросы, которые у других даже не появлялись.

В процессе написания новостей про v1.11 заглянул на страницу со списком информационных свойств подключения и для себя отметил, что надо было сразу добавить в DataSourceInformation публикацию о размере страницы базы данных и версии ODS базы данных. В ближайшее время добавлю. IBProvider v7 для этого выпускать не понадобится.

«Data Link» и «Integrated Security»

Внезапно обнаружил, что в стандартном диалоге «Data Link» для выбора OLE DB провайдера и настройки подключения починили поддержку свойства «Integrated Security». Раньше для выключения интегрированной аутентификации надо было в PropertyBag сохранять специальное значение «NONE», потому что EMPTY (пустое значение) конвертировалось в пустую строку.

Теперь можно писать EMPTY — не конвертируется. Это на Windows 10.

Я так удивился, что снова проверил на древней XP SP2 — там действительно EMPTY конвертируется в пустую строку. Поэтому специальное значение «NONE» пока будет жить.

Видать нарвались на собственные грабли и починили.

Но, для остальных свойств все осталось по прежнему!

Если писать в PropertyBag EMPTY-значение, то обратно он возвращает пустую строку.

Повбывав бы.

Вести с полей

Сегодня, в порядке эксперимента, упаковывал файлы с логами тестов релиза IBProvider v5.

Потом подумал — «не пропадать же добру» и выгрузил их наружу 🙂

Ссылка действительна в течении двух недель.

Передача пароля по сети

Смотрю на код (в собственном клиенте для FB) упаковки пароля в буфер, который будет отправлен на сервер:

 m_dpb.AppendMbcString
  (isc_api::ibp_isc_dpb_password_enc,
   L"isc_dpb_password_enc",
   dpb_type::mbc_str_box_type(password_b,password_sz));

И думаю…

1. Пароль передается в «зашифрованном» виде.

2. В FB3 с его SRP, шифрование «поинтереснее».

3. Но пришлось libtommath затащить в код.

4. А в родном NetProvider для FB это «затаскивание» не асилили, поэтому SRP оно не поддерживает.

5. А интересно — «isc_dpb_password_enc» хотя бы используется?

6. Нет, не используется. Пароль передается как есть (через isc_dpb_password):

protected override void SendAttachToBuffer(DatabaseParameterBuffer dpb, string database)
{
	XdrStream.Write(IscCodes.op_attach);
	XdrStream.Write(0);
	if (!string.IsNullOrEmpty(Password))
	{
		dpb.Append(IscCodes.isc_dpb_password, Password);
	}
	dpb.Append(IscCodes.isc_dpb_utf8_filename, 0);
	XdrStream.WriteBuffer(Encoding.UTF8.GetBytes(database));
	XdrStream.WriteBuffer(dpb.ToArray());
}

7. Забавно, забавно …

Вести с полей посттестирования v5

Решил прогнать на кодовой базе 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» тоже будет тупить — держите меня семеро.
(далее…)

Релиз IBProvider v5

Сегодня официально выпущен IBProvider v5.

А двадцать лет назад была зарелизена штука, с которой все началось:

База работала на InterBase 5.x. IB4 мои идеи уже не тянул.

Вести с полей

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

То есть, с помощью строки подключения вида «file name=employee.ibp». Где employee.ibp — это UTF8-файл со строкой инициализации IBProvider.

UDL-файлы не поломаны и с ними проблем нет. (далее…)

Дилемма

Возникла забавная ситуация, в которой неправильное решение более притягательно, чем правильное. Отчасти «потому что могу».

В 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 дочерних объектов. Но к этому я вернусь чуть попозже.

Если собираетесь читать дальше, то приготовьте пару стаканов…
(далее…)