metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-05-09 09:13 pm

Показательные выступления на льду.

Но надо сказать, что последние пляски с Qt, glibc и дебианами, а так же закономерная реакция линукс-френдленты на описание оного хорошо демонстрируют почему с софтом под линукс все так "хорошо".
Софт для end-юзеров и прочие приземленные вещи далеко не всегда пишут отмороженные гики с десятилетним опытом решения бессмысленных безумных проблем. Достаточно походить по форумам по .NET например - там огромное количество вопросов, показывающих, что в ИТ работает много _начинающих_ людей. И вот оным начинающим развлечения, подобные тому, чем я занимался вчера - совершенно ни к чему. Не должен обобщенный "программист кульных прог для бухгалтерии Вася Пупкин" сразу разбираться в тонкостях библиотек, порядка их поиска, версий компиляторов и прочей хреновине. Это должно идти потом, когда софт уже заработал, был продан и надо его улучшать, выпускать новую версию и есть на этот бабки, полученные от продажи первой версии.

Я так понимаю, не всем очевидна конечная цель работы: "написать софт, внедрить клиентам, получить бабки". И что чем меньше времени уйдет на это - тем больше бабок в единицу времени получится. И что время на "чтение гугла и манов", "пересборку QT", "изучение тонкостей поиска shared objects" - это все кем-то должно оплачиваться. Я не знаю, по моему, видеть во всем в первую очередь бизнес-смысл и енд-юзеров - достаточно полезная вещь, хорошо вправляет мозги и компенсирует техно-гиковские перегибы.

Не говоря уже о факапах вроде "приехали показывать софт тендерной комиссии, а там НИЧЕГО не запустилось, потому что линукс не той системы" - такое вообще недопустимо, между прочим.

[identity profile] zamotivator.livejournal.com 2009-05-11 11:49 am (UTC)(link)
Ну это из поста следовало, из последней его фразы.
Значит прочитал невнимательно =)

Ну они не юзают с++ные извращения. А совсем правильное использование с++ - это не использовать его совсем.
У меня перед глазами есть production использование "С++-извращений". Самая близкая аналогия - Haskell type classes. Написана на boost.mpl (metaprogramming library) - Александреску, превед!
Польза от неё несомненная - она уже съэкономила человеко-месяцы, а то и человеко-годы - а занимается эта хрень кодогенерацией и статической верификацией.
Задача - реализация вычислителей SQL-выражений.

Так что у меня есть положительный опыт промышленного использования так называемых "извращений" - и польза от них несомненная, а то, что нужна редко и готовить её толком мало кто умеет - дело десятое.
Я написал кодогенератор (eDSL) в рамках С++, остальные просто пользуют интерфейсы и радуются жизни.

Не-а. Тут проблема в том что красноглазые (в основном бебианисты) преподносят их как ПРЕИМУЩЕСТВА.
В сравнении с системой манифестов или idl - это ПРЕИМУЩЕСТВО.
А то, что с ней пришлось столкнутся - не является НЕДОСТАТКОМ, а является признаком ДРУГИХ ИНСТРУМЕНТОВ.

Особенно у того у которого rhel :))) Ну ладно - тут уже поняли что не поняли друг друга сразу :)
Ну в этом мы разобрались, слава богу.

[identity profile] vp.livejournal.com 2009-05-11 12:00 pm (UTC)(link)
А можно пример что понимаете под С++ извращениями? :)

[identity profile] zamotivator.livejournal.com 2009-05-11 12:04 pm (UTC)(link)
struct CompareScheme
{
	bool operator()( const impl::Scheme< qd::common::eChar >& a_left, const impl::Scheme< qd::common::eChar >& a_right ) const
		{
			return a_left.size() == a_right.size();
		}
	bool operator()( const impl::Scheme< qd::common::eVarchar >& a_left, const impl::Scheme< qd::common::eVarchar >& a_right ) const
		{
			return a_left.size() == a_right.size();
		}
	bool operator()( const impl::Scheme< qd::common::eDecimal >& a_left, const impl::Scheme< qd::common::eDecimal >& a_right ) const
		{
			return ( a_left.precision() == a_right.precision() ) && ( a_left.scale() == a_right.scale() );
		}
    template< qd::common::EType dataType >
    bool operator()( const impl::Scheme< dataType >& , const impl::Scheme< dataType >& ) const
    {
        return true;
    }
    template< qd::common::EType leftDataType, qd::common::EType rightDataType >
    bool operator()( const impl::Scheme< leftDataType >&, const impl::Scheme< rightDataType >& ) const
    {
        return false;
    }
};

typedef qd::dsd::Function< bool, const CompareScheme&, 
qd::mpl::vector< const qd::pplan::Scheme&, const qd::pplan::Scheme& > >
CompareSchemeFunction;

namespace
{
	CompareSchemeFunction g_compareSchemeFunction;
}

bool operator==( const qd::pplan::Scheme& a_left, const qd::pplan::Scheme& a_right )
{
	return g_compareSchemeFunction( CompareScheme(), a_left, a_right ); 
}

[identity profile] zamotivator.livejournal.com 2009-05-11 12:07 pm (UTC)(link)
В предыдущем комменте был пример использования.
Вот мааааааленький кусочек реализации dsd::Function

	template< typename Argument, typename Tag = typename tag< Argument >::type > struct size;

	template< typename Argument >
	struct size< Argument, other_tag > : public mpl::integral_c< RuntimeIndex, 1 >
	{
	};

	template< typename Argument >
	struct size< Argument, enum_tag > : 
        public mpl::integral_c< RuntimeIndex, 
            mpl::size< 
                typename get_values< Argument >::type >::value >
	{
	};

	struct template_size_step
	{
		template< typename CurrentSize, typename CurrentDepende >
		struct apply
		{
			typedef mpl::integral_c< RuntimeIndex, CurrentSize::value * size< CurrentDepende >::value > type;
		};
	};

	template< typename Argument >
	struct template_size
	{
    private:
        typedef typename get_dependes< Argument >::type Dependes;
    public:
		typedef typename mpl::fold< Dependes, mpl::integral_c< RuntimeIndex, 1 >, template_size_step >::type type;
    };

	template< typename Argument >
	struct size< Argument, template_tag > :
		public template_size< Argument >::type
	{
	};

[identity profile] theiced.livejournal.com 2009-05-11 01:32 pm (UTC)(link)
Во во. При виде такого кода у меня начинается мигрень и моск отказывается работать вообще.

[identity profile] zamotivator.livejournal.com 2009-05-11 01:35 pm (UTC)(link)
А этот код Вам никогда не придётся смотреть.
Он весь спрятан как детали реализации.

[identity profile] theiced.livejournal.com 2009-05-11 01:40 pm (UTC)(link)
Я про пример использования в том числе:

typedef qd::dsd::Function< bool, const CompareScheme&,
qd::mpl::vector< const qd::pplan::Scheme&, const qd::pplan::Scheme& > >
CompareSchemeFunction;


Всё. Моск выключился. Тут спецсимволов больше чем в типичном перловом коде.

[identity profile] zamotivator.livejournal.com 2009-05-11 01:45 pm (UTC)(link)
bool operator==( const qd::pplan::Scheme& a_left, const qd::pplan::Scheme& a_right )
{
	typedef qd::dsd::Function< /* Return Type */; bool, const CompareScheme& /* Function object for call */, 
	qd::mpl::vector< const qd::pplan::Scheme& /* Argument 1 */, const qd::pplan::Scheme& /* Argument 2 */ > >
	CompareSchemeFunction;
	static CompareSchemeFunction g_compareSchemeFunction;

	return g_compareSchemeFunction( CompareScheme(), a_left, a_right ); 
}


Так понятней?
Это уже детали реализации функции сравнения =)

[identity profile] theiced.livejournal.com 2009-05-11 01:49 pm (UTC)(link)
Не - честно - не могу сосредоточиться и вникнуть в этот код. Руби/жава/схема меня хорошоооо так расслабили.

[identity profile] zamotivator.livejournal.com 2009-05-11 01:52 pm (UTC)(link)
Эта хрень - qd::dsd::Function - вытаскивает из Scheme impl::Scheme-что-то там.

Типа множественного dynamic_cast. Паттерн-матчинг многих аргументов, другими словами - мультиметоды

[identity profile] metaclass.livejournal.com 2009-05-11 01:53 pm (UTC)(link)
"Как писать неподдерживаемый код", часть вторая.
Я примерно понимаю, как во всем этом можно разобраться, но все таки на месте руководства я с такой чорной магией связываться бы опасался - это ж потом гурей не наберешься, продукт развивать.

[identity profile] theiced.livejournal.com 2009-05-11 01:55 pm (UTC)(link)
Дык - я о чём говорю. А особенно опасны дети которые с++ных книжек умных начитались и начинают ТАКОЕ городить... Насмотрелся, ага.

[identity profile] zamotivator.livejournal.com 2009-05-11 04:31 pm (UTC)(link)
Говорили это уже не раз. Резонный аргумент - как сделать тоже самое без "чёрной магии"?
Предлагали там всякие варианты, все оказались ХУЖЕ

[identity profile] metaclass.livejournal.com 2009-05-11 04:41 pm (UTC)(link)
Вообще, менеджеры должны были выбрать вариант, который был бы хуже, но позволил бы тебя выгнать и заменить десятком обобщенных индусо-таджиков :) Это просто еще не дошли видимо до вашей конторы последние веяния в области управления сильно умными.

Я тут читал про один enterprise-level софт, так в статье в вики про него упоминается типа "пришел дядя из силиконовой долины, стал CEO и превратил technology-driven startup в high-tech enterprise, а потом под это дело стал получать венчурное финансирование". Расшифровывается это так: технарей загнали в подвалы и посадили на цепь, въябывать, упор с технических решений перевели на организационные. И это суко дико эффективнее чем черная магия с метапрограммированием - софт сейчас продается за совершенно нереальные бабки, которые идут в карман дядям, а не сильно умным гикам.

[identity profile] zamotivator.livejournal.com 2009-05-11 04:44 pm (UTC)(link)
Такие решения помогают поддерживать весь код (весь модуль) двум людям.
Раньше было пять человек.
Снижение трудозатрат налицо.

А теперь товарищ, скажи ка мне - кто там за Haskell вещал? м? Что ж таджиков то не нанимаешь?

(no subject)

[identity profile] metaclass.livejournal.com - 2009-05-11 17:09 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2009-05-11 17:14 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2009-05-11 18:51 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2009-05-11 18:54 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2009-05-11 20:22 (UTC) - Expand

(no subject)

[identity profile] zamotivator.livejournal.com - 2009-05-11 20:24 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2009-05-11 20:35 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2009-05-11 20:36 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2009-05-11 18:50 (UTC) - Expand

[identity profile] blacklion.livejournal.com 2009-05-11 09:00 pm (UTC)(link)
Вот по этому и хочется другой глобус — что на этом важнее как продавать, чем что продавать :(

(no subject)

[identity profile] theiced.livejournal.com - 2009-05-11 21:35 (UTC) - Expand

(no subject)

[identity profile] blacklion.livejournal.com - 2009-05-11 21:42 (UTC) - Expand

(no subject)

[identity profile] blacklion.livejournal.com - 2009-05-11 21:44 (UTC) - Expand

[identity profile] vp.livejournal.com 2009-05-11 02:55 pm (UTC)(link)
До этого было понятнее, но как увидел вставленные в параметры комментарии - сразу расстроился. Такой стиль комментировани очень туго воспринимаю.
А так вроде все понятно

[identity profile] theiced.livejournal.com 2009-05-11 03:14 pm (UTC)(link)
Ребе, осторожно. А то того и гляди тоже скоро такой код выдавать будете.

[identity profile] vp.livejournal.com 2009-05-11 03:55 pm (UTC)(link)
У меня другие мотивы. Код должен быть понятным мне не только сегодня, но и через 10 лет. Или же я потом сам себя буду ругать :)

[identity profile] theiced.livejournal.com 2009-05-11 06:52 pm (UTC)(link)
И не только `мне` - но ещё и сферическому среднеквалифицированному кодеру.

[identity profile] theiced.livejournal.com 2009-05-11 01:37 pm (UTC)(link)
>В сравнении с системой манифестов или idl - это ПРЕИМУЩЕСТВО.
А то, что с ней пришлось столкнутся - не является НЕДОСТАТКОМ, а является признаком ДРУГИХ ИНСТРУМЕНТОВ.

Я вообще то про плесень которая начинает произрастать при попытке сделать our-mighty-propietary-app.installer который будет ставиться и рабоать везде. Да - для OS софта это не проблема - есть майнтэйнеры дистров, есть исходники, ... - другая проблема, другие решиения.

[identity profile] zamotivator.livejournal.com 2009-05-11 01:39 pm (UTC)(link)
Мы практически во всём нашли взаимопонимание и общий язык.
Это не может не радовать =)

[identity profile] theiced.livejournal.com 2009-05-11 01:42 pm (UTC)(link)
А это потому что ты уже БЫВШИЙ бебианщик. Был бы активно действующим - не нашли бы ;)

[identity profile] zamotivator.livejournal.com 2009-05-11 01:46 pm (UTC)(link)
*пожал плечами*
Для меня линуксы и С++ - инструменты, а не религия.

[identity profile] theiced.livejournal.com 2009-05-11 01:53 pm (UTC)(link)
Для меня тоже инструменты. А для бебианщиков - религия. Это беда и беда большая.