Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 1119 сообщений
Cообщения с меткой

теория заговора - Самое интересное в блогах

Следующие 30  »
lj_science_freaks

О форуме физфака

Четверг, 21 Апреля 2017 г. 00:21 (ссылка)

Re: Методология астрономии и физики (продолжение)

Номер сообщения:#17 morozov " 19 мар 2017, 08:50

Коллега из Тамбова писал(а): ↑
01 фев 2017, 10:27
Господа альты! Что Вы сидите у Морозова в оффтопике, как преступники в темнице? Идите на студенческий форум физфака МГУ! Там вы будете на первой полосе! Всем стало ясно, что официальная теоретическая физика обосралась по самые уши. Неудача с теорий струн и супер струн, а также с теорий квантовой гравитации показала полную неспособность ортодоксальной науки к развитию.

В связи с этим РАН и Высшая школа издала тайный циркуляр, по которому теперь разрешается критиковать ОТО и СТО, а подотчётным РАН и Высшей школе журналам предписывается публиковать все статьи альтов!

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

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

Господа альты, на форуме физфака МГУ уже много ваших. Там и Приставко, и Ущеко, и Романов 59, и Макеев, и Усачёв, и др. МГУ, на короткое время, станет светочем демократии в науке.

ФИАН - это институт мракобесов. Сколько раз я просил Колачевского, как специалиста по рентгеновскому излучению, доказать, что в проводниках нет свободных электронов, но он не захотел! Конечно ему не нужна Нобелевская премия, а на Россию ему плевать. Зачем ему премия, если он и без премии получает миллион рублей в месяц, которые он путём научных махинаций в науке забирает у народа?

morozov писал(а):Бездельники, дураки и идиоты еще ничего не сделали... и не сделают.

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

Кстати, все чем Вы пользуетесь компьютеры и мобильники появилось благодаря физикам, в том числе и Эйнштейну.
С уважением, Морозов Валерий Борисович

http://science-freaks.livejournal.com/2944037.html

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
ivapet

Украинский чернозем тысячами вагонов вывозится в Европу - эксперт

Пятница, 14 Апреля 2017 г. 20:59 (ссылка)
infopolk.ru/1/Z/news/vstran...9efd14bb02

Украинский чернозем тысячами вагонов вывозится в Европу - эксперт



Украинский чернозем тысячами вагонов вывозится в Европу - эксперт - Украинский чернозем тысячами вагонов вывозится в Европу

...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
nobudazi

Украинский чернозем тысячами вагонов вывозится в Европу - эксперт

Пятница, 14 Апреля 2017 г. 19:59 (ссылка)
infopolk.ru/1/Z/news/vstran...515a134e9d

Украинский чернозем тысячами вагонов вывозится в Европу - эксперт



Украинский чернозем тысячами вагонов вывозится в Европу - эксперт - Украинский чернозем тысячами вагонов вывозится в Европу

...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
lj_science_freaks

О вечном

Вторник, 12 Апреля 2017 г. 01:11 (ссылка)

Аватара пользователя individ
Кисантий писал(а):
06 мар 2017, 08:46 Только тебя неуч тута еще не хватало. :D
Все фрики одинаковые!
Им бесполезно, что либо объяснять. Своё несут. Силой хотят народ убедить, но это вряд ли получиться.

К тому же из моего опыта общения с доцентами понял...
Во первых они хотят слушать только правильных людей. Если тебя перестают слушать - значит тебя из этого круга исключают.
Можно даже повторять то же самое что и правильный доцент. Если рожа не та - будет всегда не верно.

Во вторых - человек проповедующий какую то идею воспринимает только вариации этой идеи.
Если ему предложить другой подход - он его практически всегда не примет. Будет агрессия и там все возванния к разуму бесполезны...

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

Зато мои формулы будут вечны!!! Ха-ха!!!!

http://science-freaks.livejournal.com/2942697.html

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
lebedev56

Угроза существованию России, а также некоторые события и даты, находящиеся в причинно-следственной зависимости

Понедельник, 10 Апреля 2017 г. 19:06 (ссылка)


 





Сказать, что статья длинная - ничего не сказать! Кто-то сочтет ее сомнительной, кто-то нелепицей или бредом. Есть несомненное преимущество этой статьи. Здесь собрано много исторических данных по России, как по империи. Здесь есть некие факты того, что считается в мире правовым... и если судить по этим фактам, по суверенному праву и т.д., то очень многие события на нашей планете за последние несколько десятилетий - обретают смысл. В общем читайте, или смотрите.



Читать далее:  http://voskhodinfo.su/shokamptrepet/teoriya-zagovora/22138-ugroza-suschestvovaniyu-rossii-a-takzhe-nekotorye-sobytiya-i-daty-nahodyaschiesya-v-prichinno-sledstvennoy-zavisimosti.html
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
NewsPR1987

Теория заговора (06.04.2017) - смотреть онлайн HD 720

Четверг, 06 Апреля 2017 г. 17:31 (ссылка)
hddom.net/news/teorija_zago...04-06-8292

Убийство двух полицейских в Астрахани и нападение на воинскую часть в Чечне. Всего за 10 дней Россия подверглась сразу трем атакам террористов.
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
lj_science_freaks

А действительно, почему?

Вторник, 04 Апреля 2017 г. 16:28 (ссылка)

Почему не внедряют БЕЗТОПЛИВНЫЕ ГЕНЕРАТОРЫ

Академик Салль С А

http://science-freaks.livejournal.com/2941136.html

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
ГалинаБирюковаКИРИЛЮК

Теория заговора. Таблетки, которые нас убивают. Выпуск от 02.04.2017

Воскресенье, 02 Апреля 2017 г. 17:19 (ссылка)






 



Задумывались ли вы над тем, что лежит в вашей аптечке? Что-нибудь от простуды, от головной боли, от сердца, от диареи, ну и, конечно, успокоительные, куда без них в наше время. В принципе, в этот набор у нас входят одни и те же препараты. И многие лекарства из этого набора не лечат, а калечат! От каких препаратов лучше навсегда отказаться, а какие реально работают?



Лекарства от простуды делятся на два типа: те, которые снимают симптомы, и те, которые борются непосредственно с вирусом. Препараты, которые снимают симптомы, - это чаще всего порошки. Хоть на них и написано, что они от гриппа и простуды, они всего лишь на время улучшают наше самочувствие, не более. Чем они могут быть опасны?



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



 

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Несколько аргументов против Dependency Injection и Inversion of Control

Суббота, 01 Апреля 2017 г. 11:09 (ссылка)

Помнится, во времена .NET 1.1 и 2.0 можно было часто увидеть пророчества майкрософтовских евангелистов, мол, скоро любая домохозяйка сможет создавать сайты и писать программы. Большинство программистов посмеялось, но, как выяснилось, кто-то отнёсся к этому серьёзно. Во всяком случае, это объясняет, почему шаблоны проектирования IoC/DI получили второе дыхание в 2000-х, причём даже внутри самой MS (желаю Вам никогда в жизни не столкнуться с SCSF).



С точки зрения теории разработки ПО лично мне гораздо чаще приходилось читать или слышать хвалебные статьи и отзывы об IoC/DI, но, как всегда, критика тоже есть. Можно ознакомиться, например, здесь (англ.), здесь (англ.), тут (хабр), ещё (англ.). В частности в вину ставится нарушение принципа инкапсуляции в ООП.



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

Действительно, много ли Вы встречали книг или статей по программированию, где указывалось бы на то, что код всегда содержит ошибки (даже калькулятор невозможно покрыть 100% тестированием) и нужно в него вставлять возможности диагностирования ошибок в продуктивной среде, где Вам никто не даст поставить Studio и отладиться? Что если продукт окажется достойным и найдёт своего пользователя, то он обязательно будет дорабатываться, но делать это, вполне вероятно, будут другие люди, с не известно каким уровнем подготовки? Вот я ни одной не могу вспомнить.



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



Итак.



Сложность для понимания



Где-то читал в своё время – то ли у Брукса, то ли у Листера с ДеМарко, точно не помню, – что языки программирования придуманы не для машин, а для людей. Машине, в конце концов, без разницы, забьёте ли вы руками в файл нолики и единички или сначала напишите текстовые команды, а затем откомпилируете в исполняемый код. Компилятору всё равно, будет ли программист вставлять комментарии в свой код или посчитает, что тот является самодокументированным. Интерпретатор JavaScript одинаково обработает обфусцированный, сжатый скрипт и отформатированный, с человекопонятными названиями переменных и функций.



Про архитектуру и парадигмы программирования можно сказать то же самое: всё это придумано для человека, а не для машины, чтобы облегчить ему задачу написания программ, повысить уровень их сложности. Поэтому первым и самым главным минусом, по моему глубокому убеждению, шаблонов IoC/DI является распределение логики по разным кускам проекта, что сильно усложняет понимание и восприятие решения в целом. Точнее – проблема не в собственно разорванности, а в том, что очень сложно всё это связать воедино в статике, только в рантайме.



Если ваша программа состоит из десятка-другого объектов (т.е. это не более 100 файлов с описанием классов и интерфейсов), то воспринять всё это вместе в виде единого целого относительно просто. Мне в своё время довелось сопровождать настольное приложение, созданное на основе Microsoft Smart Client Software Factory (потом ему на смену MS запустила Prism, но уверен, что IoC/DI там так же плотно задействованы), по своему функционалу не такое уж сложное, но состоявшее из пары десятков проектов (в терминах Visual Studio), а это сотни и сотни классов, отвечающих и за DAL, и за логику, и за пользовательский интерфейс, и за событийную модель под ним. Каждый раз, когда на горизонте появлялась задача по добавлению новой фичи, меня начинало слегка колотить изнутри, т.к. всплывала перспектива увлекательно провести несколько дней, чтобы догадаться, куда нужно «воткнуть» обработку нового поля объекта из БД, точнее – по каким классам распиханы зависимости. При слабой связанности классов, поверьте, это не самая тривиальная задача.



Возможно, мой мозг начал костенеть и стал менее восприимчив к новым идеям (хотя IoC/DI были придуманы, кажется, в начале 90-х), но мне сложно понять, чем стал неугоден принцип инкапсуляции из ООП.



Малоинформативные отладочные данные



Вспоминается цитата с башорга:



#define TRUE FALSE //счастливой отладки, уроды (*)


(*) фраза была несколько смягчена, дабы не навлекать на Ресурс.



Смешно, не правда ли? А вот такие шутки штуки я встречал в своём проекте на этапе запуска в ПЭ (и было мне не совсем смешно):



Stack Trace
StructureMap.StructureMapException: StructureMap Exception Code: 202

No Default Instance defined for PluginFamily System.Func`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

at StructureMap.BuildSession.<.ctor>b__0(Type t)

at StructureMap.Util.Cache`2.get_Item(KEY key)

at StructureMap.BuildSession.CreateInstance(Type pluginType)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)

at lambda_method(Closure, IArguments )

at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.b__0(IArguments args)

at StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)

at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)

at StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)

at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)

at StructureMap.BuildSession.CreateInstance(Type pluginType)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)

at lambda_method(Closure, IArguments )

at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.b__0(IArguments args)

at StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)

at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)

at StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)

at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)

at StructureMap.BuildSession.CreateInstance(Type pluginType)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)

at lambda_method(Closure, IArguments )

at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.b__0(IArguments args)

at StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)

at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)

at StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)

at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)

at StructureMap.BuildSession.CreateInstance(Type pluginType)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)

at lambda_method(Closure, IArguments )

at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.b__0(IArguments args)

at StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)

at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)

at StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)

at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)

at StructureMap.Container.GetInstance[T](String instanceKey)

at NNN.BBB.Integration.Uvhd.Dispatcher.Start() in j:\.projects\DDD\trunk\NNN.BBB.UvhdIntegrationService\Dispatcher.cs:line 30





Очень информативно, согласитесь? BBB, DDD, NNN – это я намеренно изменил название проектов и пространства имён, которые указывали на наименование компании-субподрядчика. Но там ничего интересного для отладки не было. Dispatcher.Start() – это запуск службы MS Windows, точка входа в программу. StructureMap – это библиотека IoC. Ни единого упоминания какого-либо из бизнесовых методов, т.к. было сделано всё, чтобы исключить контекст из стека вызова.



Впрочем, причину ошибки удалось всё равно выяснить по методу «что изменилось по сравнению с прошлой рабочей версией?», но ей хочу посвятить отдельный аргумент, идущий следующим.



Нивелирование достоинств компилируемых языков



Как говорится, беда не приходит в одиночку. Так и IoC/DI идут рука об руку вместе с шаблоном Service Locator, который тесно связан с идеей позднего связывания. При этом при компиляции решения не проверяется, соответствует ли сигнатура методов требованиям в точке вызова.

Так и случилось в моём случае из примера выше. В один из бизнесовых методов был добавлен новый параметр. Проект успешно скомпилировался, но отказался запускаться. Мне повезло.



Во-первых, в данном проекте было всего лишь около 50 классов и методом [научного] тыка удалось относительно быстро установить, что нужно ещё доработать класс загрузки конфигурации.



Во-вторых, исключение выбрасывалось в самом начале работы программы, и мимо этого было не пройти. К сожалению, не смог найти другой реальный пример и жизни из этого же проекта, т.к. сразу не отложил «в мемориз», а потом всё затерялось в килотоннах логов. Но инстанцирование обработчиков может производиться не сразу при старте приложения, а по мере необходимости – когда появятся пользовательские данные, требующие соответствующей обработки. Это может произойти спустя часы, дни и даже недели. Однако эффективность упомянутого выше метода поиска ошибок «было – стало» обратно пропорциональна времени, прошедшему с момента проблемного релиза, и количеству релизов, последовавших за ним.



Повышенные требования к уровню подготовки специалистов



Сами по себе сложность восприятия кода и трудности отладки не смертельны. Беда в том, что для целей внедрения, сопровождения и развития продукта нужны люди из плоти и крови. И очевидно, чем сложнее продукт, тем выше требования к уровню подготовки специалистов. А тут уже встают проблемы рынка труда и сферы образования, о которых, полагаю, не нужно никому тут рассказывать: грамотных, опытных спецов найти занимает много времени, содержать не дёшево, удержать и того сложнее. Да и на изучение «матчасти» уходят недели и даже месяцы.

Как следствие из данного аргумента хотел бы выделить ещё 3 уточнения.




  1. Я на своей практике не раз сталкивался с ситуацией, когда первоначальную команду разработчиков постепенно сменяла другая, с менее продвинутыми знаниями в теории программирования и передовых методах разработки софта. Просто потому, что после запуска продукта, бывает, на первый план выходит знание предметной области (например, законодательство, бизнес-процессы целевой аудитории, коммуникативные навыки), а не технологий кодирования. В такой ситуации чем сложнее код, тем быстрее продукт «эволюционирует» в замысловатое ожерелье костылей и заплаток.

  2. Чем сложнее код, тем дольше длится погружение в проект новичка.

  3. Не менее очевидно, что сужается круг участников команды, кто может внести свой вклад в код. Кто-то посчитает это даже плюсом. Но я сошлюсь даже не на свой опыт, а на книгу Рейнвотера «Как пасти котов. Наставление для программистов, руководящих другими программистами». Там приводится история ПМа и его программиста накануне дедлайна, когда обоих уволили из-за провала, хотя, скорее всего, они успели бы в срок, если бы руководитель помог своему программисту.





Заключение



В начале статьи были приведены ссылки на статьи, в некоторых из коих приводятся условия, когда можно применять DI/IoC, а когда этого лучше не делать. Я предлагаю дополнить список, когда НЕ надо использовать эти шаблоны, правилами, скорее, управленческого уровня, нежели из области компьютерных наук. Не используйте таковые шаблоны, если:


  • Вы не уверены на 100%, что на этапе запуска проекта, его стабилизации, опытной и даже промышленной эксплуатации будут оперативно доступны разработчики этого продукта.

  • Проектировщиком и разработчиком системы является один-единственный человек, который (не удивительно) не ведёт подробного документирования архитектуры своего детища.

  • У вас нет основания полагать, что на этапе проектирования Вы предусмотрели все варианты использования продукта и на этапе сдаче проекта или даже после его запуска не возникнет острой потребности в спешном порядке «допиливать» бизнес-логику; или если бизнес-среда, в которой предстоит плавать продукту, слишком изменчива, например, частые изменения регуляторов, конкуренция на рынке, отсутствие чётких стандартов/рекомендаций/практик в отрасли.


Original source: habrahabr.ru.

https://habrahabr.ru/post/325092/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Несколько аргументов против Dependency Injection и Inversion of Control

Суббота, 01 Апреля 2017 г. 11:09 (ссылка)

Помнится, во времена .NET 1.1 и 2.0 можно было часто увидеть пророчества майкрософтовских евангелистов, мол, скоро любая домохозяйка сможет создавать сайты и писать программы. Большинство программистов посмеялось, но, как выяснилось, кто-то отнёсся к этому серьёзно. Во всяком случае, это объясняет, почему шаблоны проектирования IoC/DI получили второе дыхание в 2000-х, причём даже внутри самой MS (желаю Вам никогда в жизни не столкнуться с SCSF).



С точки зрения теории разработки ПО лично мне гораздо чаще приходилось читать или слышать хвалебные статьи и отзывы об IoC/DI, но, как всегда, критика тоже есть. Можно ознакомиться, например, здесь (англ.), здесь (англ.), тут (хабр), ещё (англ.). В частности в вину ставится нарушение принципа инкапсуляции в ООП.



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

Действительно, много ли Вы встречали книг или статей по программированию, где указывалось бы на то, что код всегда содержит ошибки (даже калькулятор невозможно покрыть 100% тестированием) и нужно в него вставлять возможности диагностирования ошибок в продуктивной среде, где Вам никто не даст поставить Studio и отладиться? Что если продукт окажется достойным и найдёт своего пользователя, то он обязательно будет дорабатываться, но делать это, вполне вероятно, будут другие люди, с не известно каким уровнем подготовки? Вот я ни одной не могу вспомнить.



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



Итак.



Сложность для понимания



Где-то читал в своё время – то ли у Брукса, то ли у Листера с ДеМарко, точно не помню, – что языки программирования придуманы не для машин, а для людей. Машине, в конце концов, без разницы, забьёте ли вы руками в файл нолики и единички или сначала напишите текстовые команды, а затем откомпилируете в исполняемый код. Компилятору всё равно, будет ли программист вставлять комментарии в свой код или посчитает, что тот является самодокументированным. Интерпретатор JavaScript одинаково обработает обфусцированный, сжатый скрипт и отформатированный, с человекопонятными названиями переменных и функций.



Про архитектуру и парадигмы программирования можно сказать то же самое: всё это придумано для человека, а не для машины, чтобы облегчить ему задачу написания программ, повысить уровень их сложности. Поэтому первым и самым главным минусом, по моему глубокому убеждению, шаблонов IoC/DI является распределение логики по разным кускам проекта, что сильно усложняет понимание и восприятие решения в целом. Точнее – проблема не в собственно разорванности, а в том, что очень сложно всё это связать воедино в статике, только в рантайме.



Если ваша программа состоит из десятка-другого объектов (т.е. это не более 100 файлов с описанием классов и интерфейсов), то воспринять всё это вместе в виде единого целого относительно просто. Мне в своё время довелось сопровождать настольное приложение, созданное на основе Microsoft Smart Client Software Factory (потом ему на смену MS запустила Prism, но уверен, что IoC/DI там так же плотно задействованы), по своему функционалу не такое уж сложное, но состоявшее из пары десятков проектов (в терминах Visual Studio), а это сотни и сотни классов, отвечающих и за DAL, и за логику, и за пользовательский интерфейс, и за событийную модель под ним. Каждый раз, когда на горизонте появлялась задача по добавлению новой фичи, меня начинало слегка колотить изнутри, т.к. всплывала перспектива увлекательно провести несколько дней, чтобы догадаться, куда нужно «воткнуть» обработку нового поля объекта из БД, точнее – по каким классам распиханы зависимости. При слабой связанности классов, поверьте, это не самая тривиальная задача.



Возможно, мой мозг начал костенеть и стал менее восприимчив к новым идеям (хотя IoC/DI были придуманы, кажется, в начале 90-х), но мне сложно понять, чем стал неугоден принцип инкапсуляции из ООП.



Малоинформативные отладочные данные



Вспоминается цитата с башорга:



#define TRUE FALSE //счастливой отладки, уроды (*)


(*) фраза была несколько смягчена, дабы не навлекать на Ресурс.



Смешно, не правда ли? А вот такие шутки штуки я встречал в своём проекте на этапе запуска в ПЭ (и было мне не совсем смешно):



Stack Trace
StructureMap.StructureMapException: StructureMap Exception Code: 202

No Default Instance defined for PluginFamily System.Func`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

at StructureMap.BuildSession.<.ctor>b__0(Type t)

at StructureMap.Util.Cache`2.get_Item(KEY key)

at StructureMap.BuildSession.CreateInstance(Type pluginType)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)

at lambda_method(Closure, IArguments )

at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.b__0(IArguments args)

at StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)

at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)

at StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)

at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)

at StructureMap.BuildSession.CreateInstance(Type pluginType)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)

at lambda_method(Closure, IArguments )

at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.b__0(IArguments args)

at StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)

at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)

at StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)

at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)

at StructureMap.BuildSession.CreateInstance(Type pluginType)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)

at lambda_method(Closure, IArguments )

at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.b__0(IArguments args)

at StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)

at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)

at StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)

at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)

at StructureMap.BuildSession.CreateInstance(Type pluginType)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)

at lambda_method(Closure, IArguments )

at StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.b__0(IArguments args)

at StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)

at StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)

at StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)

at StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)

at StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)

at StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)

at StructureMap.Container.GetInstance[T](String instanceKey)

at NNN.BBB.Integration.Uvhd.Dispatcher.Start() in j:\.projects\DDD\trunk\NNN.BBB.UvhdIntegrationService\Dispatcher.cs:line 30





Очень информативно, согласитесь? BBB, DDD, NNN – это я намеренно изменил название проектов и пространства имён, которые указывали на наименование компании-субподрядчика. Но там ничего интересного для отладки не было. Dispatcher.Start() – это запуск службы MS Windows, точка входа в программу. StructureMap – это библиотека IoC. Ни единого упоминания какого-либо из бизнесовых методов, т.к. было сделано всё, чтобы исключить контекст из стека вызова.



Впрочем, причину ошибки удалось всё равно выяснить по методу «что изменилось по сравнению с прошлой рабочей версией?», но ей хочу посвятить отдельный аргумент, идущий следующим.



Нивелирование достоинств компилируемых языков



Как говорится, беда не приходит в одиночку. Так и IoC/DI идут рука об руку вместе с шаблоном Service Locator, который тесно связан с идеей позднего связывания. При этом при компиляции решения не проверяется, соответствует ли сигнатура методов требованиям в точке вызова.

Так и случилось в моём случае из примера выше. В один из бизнесовых методов был добавлен новый параметр. Проект успешно скомпилировался, но отказался запускаться. Мне повезло.



Во-первых, в данном проекте было всего лишь около 50 классов и методом [научного] тыка удалось относительно быстро установить, что нужно ещё доработать класс загрузки конфигурации.



Во-вторых, исключение выбрасывалось в самом начале работы программы, и мимо этого было не пройти. К сожалению, не смог найти другой реальный пример и жизни из этого же проекта, т.к. сразу не отложил «в мемориз», а потом всё затерялось в килотоннах логов. Но инстанцирование обработчиков может производиться не сразу при старте приложения, а по мере необходимости – когда появятся пользовательские данные, требующие соответствующей обработки. Это может произойти спустя часы, дни и даже недели. Однако эффективность упомянутого выше метода поиска ошибок «было – стало» обратно пропорциональна времени, прошедшему с момента проблемного релиза, и количеству релизов, последовавших за ним.



Повышенные требования к уровню подготовки специалистов



Сами по себе сложность восприятия кода и трудности отладки не смертельны. Беда в том, что для целей внедрения, сопровождения и развития продукта нужны люди из плоти и крови. И очевидно, чем сложнее продукт, тем выше требования к уровню подготовки специалистов. А тут уже встают проблемы рынка труда и сферы образования, о которых, полагаю, не нужно никому тут рассказывать: грамотных, опытных спецов найти занимает много времени, содержать не дёшево, удержать и того сложнее. Да и на изучение «матчасти» уходят недели и даже месяцы.

Как следствие из данного аргумента хотел бы выделить ещё 3 уточнения.




  1. Я на своей практике не раз сталкивался с ситуацией, когда первоначальную команду разработчиков постепенно сменяла другая, с менее продвинутыми знаниями в теории программирования и передовых методах разработки софта. Просто потому, что после запуска продукта, бывает, на первый план выходит знание предметной области (например, законодательство, бизнес-процессы целевой аудитории, коммуникативные навыки), а не технологий кодирования. В такой ситуации чем сложнее код, тем быстрее продукт «эволюционирует» в замысловатое ожерелье костылей и заплаток.

  2. Чем сложнее код, тем дольше длится погружение в проект новичка.

  3. Не менее очевидно, что сужается круг участников команды, кто может внести свой вклад в код. Кто-то посчитает это даже плюсом. Но я сошлюсь даже не на свой опыт, а на книгу Рейнвотера «Как пасти котов. Наставление для программистов, руководящих другими программистами». Там приводится история ПМа и его программиста накануне дедлайна, когда обоих уволили из-за провала, хотя, скорее всего, они успели бы в срок, если бы руководитель помог своему программисту.





Заключение



В начале статьи были приведены ссылки на статьи, в некоторых из коих приводятся условия, когда можно применять DI/IoC, а когда этого лучше не делать. Я предлагаю дополнить список, когда НЕ надо использовать эти шаблоны, правилами, скорее, управленческого уровня, нежели из области компьютерных наук. Не используйте таковые шаблоны, если:


  • Вы не уверены на 100%, что на этапе запуска проекта, его стабилизации, опытной и даже промышленной эксплуатации будут оперативно доступны разработчики этого продукта.

  • Проектировщиком и разработчиком системы является один-единственный человек, который (не удивительно) не ведёт подробного документирования архитектуры своего детища.

  • У вас нет основания полагать, что на этапе проектирования Вы предусмотрели все варианты использования продукта и на этапе сдаче проекта или даже после его запуска не возникнет острой потребности в спешном порядке «допиливать» бизнес-логику; или если бизнес-среда, в которой предстоит плавать продукту, слишком изменчива, например, частые изменения регуляторов, конкуренция на рынке, отсутствие чётких стандартов/рекомендаций/практик в отрасли.


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/325092/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Екатерина_Москалюк

Движение противников вакцинации (антиваксеры — anti-vaxxers)

Понедельник, 27 Марта 2017 г. 14:38 (ссылка)

Это цитата сообщения Екатерина_Москалюк Оригинальное сообщение

Движение противников вакцинации (антиваксеры — anti-vaxxers)



https://vk.com/feed?w=wall-38532412_119775




История правды о вакцинах

Движение противников вакцинации (антиваксеры — anti-vaxxers) зародилось в рядах американской праворадикальной политической организации Общество Джона Бёрча. Участники группы позиционируют себя как противников грядущего «мирового правительства» и впервые привлекли к себе внимание кампанией за выход США из ООН. По мнению членов общества, вакцинация, к которой принуждает граждан различных стран Всемирная организация здравоохранения, является частью программы мирового правительства по депопуляции Земли и снижению уровня интеллекта у последующих поколений. Впоследствии в связи с распространением идеологий альтернативного образа жизни и философских учений нью-эйдж в конце 1980-х — начале 1990-х годов движение против вакцинации стало самостоятельным и освободилось от политической окраски.



В середине 2000-х годов оно окончательно вышло из тени Общества Джона Бёрча, анархо-примитивистских коммун и нью-эйджерских культов. Известная американская актриса и телеведущая Дженни Маккарти в 2007 году заявила, что причиной развития аутизма у её сына Эвана стало присутствие тяжёлых металлов в вакцинах, которыми его прививали с младенческого возраста. Её поддержали несколько американских врачей, которые подтвердили, что в состав многих вакцин действительно входят потенциально опасные соединения, а 30 прививок до двухлетнего возраста являются огромной нагрузкой на организм младенца. Тогда многие мейнстримные СМИ отметили, что заявления Маккарти основываются на исследованиях британского врача Эндрю Уэйкфилда, который был исключён из реестра практикующих врачей в Соединённом Королевстве. Позднее противников вакцинации поддержал и популярный актёр Джим Керри.



Впоследствии, в 2013 году, один из ведущих авторов журнала Time Джеффри Клугер обвинил Маккарти в том, что её кампания против вакцин привела к возникновению в США вспышек коклюша, паротита (свинки) и кори.

Читать далее...
Метки:   Комментарии (4)КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
Ротмистр

ВЕЧНО СОГЛАСНЫЕ, ВЕЧНО БЕЗГЛАСНЫЕ

Понедельник, 13 Марта 2017 г. 23:53 (ссылка)


 




 







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


Этот намертво вшитый государственный инстинкт – вместо отсутствующего национального.




Вместо раздумья на вопросом: "А хорошо ли это для всех нас?" – молниеносное "Так точно!"


Эрдоган враг? Так точно.


Эрдоган друг? Так точно.
Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Аноним

Среда, 01 Декабря 1970 г. 03:00 (ссылка)

Комментарии ()КомментироватьВ цитатник или сообщество
lebedev56

Большой брат следит за тобой

Четверг, 09 Марта 2017 г. 20:39 (ссылка)


 





В ряду терминов цифрового новояза (blockchain, bitcoin, big data, virtual corporation, peering net и т.д.) термин big data (большие данные) относится к числу немногих, имеющих вполне достоверную дату рождения - 3 сентября 2008 г., когда вышел специальный номер старейшего британского научного журнала Nature, посвящённый поиску ответа на вопрос «Как могут повлиять на будущее науки технологии, открывающие возможности работы с большими объемами данных?».

Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
NewsPR1987

Теория заговора (09.03.2017) - смотреть онлайн HD 720

Четверг, 09 Марта 2017 г. 16:01 (ссылка)
hddom.net/news/teorija_zago...03-09-7563

Предпринимают беспрецедентные меры по борьбе с запрещенной в России террористической организацией ИГИЛ.
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<теория заговора - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda