metaclass: (Default)
[personal profile] metaclass
Вопрос на собеседование:
Вам дается 100 проектов, содержащих t4 шаблоны, написанные старообрядческими псоглавцами.
Ваша задача написать MSBuild скрипт, который перегенерирует весь код, созданный из этих шаблонов.

Смех тут в том, что студия перегенерирует код только если зайти в t4 шаблон и пересохранить его, чтобы время изменилось. А изменение файлов, включенных через include не вызывает перегенерацию.

Date: 2014-02-15 12:16 pm (UTC)
From: [identity profile] metaclass.livejournal.com
У меня обычно по другому задача ставится. Сделать новую функцию или новую подсистему в один из продающихся проектов.
Причем сделать так, чтобы при этом не сломались основанные на этом же коде еще пару десятков проектов, полученный код могли использовать коллеги, а в идеале - новая функция появилась сразу во всех проектах и чтобы это можно было поддерживать на много лет вперед.

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

Date: 2014-02-15 12:29 pm (UTC)
From: [identity profile] bydlorus.livejournal.com
> Причем сделать так, чтобы при этом не сломались основанные на этом же коде еще пару десятков проектов,

Я так понимаю, для этого обычно все эти десятки проектов и переписываются на функциях высшего порядка.

Date: 2014-02-15 12:41 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Они не переписываются, они изначально так пишутся.

А вообще - если я вижу что одной лямбда функцией можно заменить интерфейс+реализацию (до какого-то там дотнета не было лямбд и вывода типов нормального), то я так и делаю - меньше кода, меньше в голове держать.

Edited Date: 2014-02-15 12:42 pm (UTC)

Date: 2014-02-15 12:44 pm (UTC)
From: [identity profile] bydlorus.livejournal.com
> изначально так пишутся

Надо просто дождаться, когда придёт человек с установкой "надо всё переписывать" и другим языком, на котором он всё переписывает. К идеалу надо стремиться.

Date: 2014-02-15 12:52 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Я твои речи перестал понимать, можно переходить к инвективной лексике уже?:)

Если чо-то хочешь сказать, пиши прямо, а за ерничанием - к бостонскому в журнал, там такое любят.

Date: 2014-02-15 01:11 pm (UTC)
From: [identity profile] bydlorus.livejournal.com
Я тоже не понимаю, мы вроде говорили о желании некоторых переписать проект на 100 подпроектов (и очевидно набрать/переобучить 100 новых программистов), а тут внезапно перешли на обсуждение чего-то, что уже написано на их любимом языке и переписывать не надо. Ну это они наивно думают, что не надо, т.к. считают, что с их-то любимого языка никто переписывать не будет. А потом придут менеджеры и скажут - нам нужны подешевле программисты, заменить все эти лямбды на что-то более индусское.

Критерии - они разные бывают.

Date: 2014-02-15 01:24 pm (UTC)
From: [identity profile] metaclass.livejournal.com
100 проектов - это блин *.*proj в вижуал студии, средство разбиения проекта на подпроекты.
Никто ничего не переписывает, за исключением доработок с рефакторингом с вычищением накопившегося за десяток лет бреда. Или там например - зачем я буду использовать код 2005 года на .net 1.1, если он заменяется парой строчек на LINQ сейчас?

Если к тебе приходят менеджеры и говорят, на чем писать - у меня для тебя плохие новости :)

Date: 2014-02-15 03:30 pm (UTC)
From: [identity profile] bydlorus.livejournal.com
Как раз недавно перенесли проект с .net 1.1 на 2.0. Просто перекомпилировали. На лямбдах не переписывали, кложурь втыкать не стали. Зачем? Проект критический, управляет лицензиями, хипстеров к нему подпускать нельзя и новые баги там нежелательны.

Date: 2014-02-15 04:23 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Блядь, на улице 2014 год и 4.5 дотнет. Если уж перетаскивать то сразу на него, чтобы потом еще десять лет не ждать.

Date: 2014-02-15 04:50 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Для 4 дотнета срок выдержки для выпадания хипстерятины в осадок уже прошел, а трудозатраты по переносу между 1.1->2.0 и 1.1->4.0 совершенно однохренственны.
Кроме того, начиная с 3.5-4.0, имеются в меру полезные вещи. которых раньше не было - лямбды, LINQ, параметры по умолчанию, динамики и прочее такое.

У меня есть несколько сторонних либ в проекте, так они успешно все на 4.5 сбежали уже, впрочем для таких случаев я либо их пересобираю под свою версию, либо бэкпортирую новые фичи :)

Date: 2014-02-15 04:59 pm (UTC)
From: [identity profile] bydlorus.livejournal.com
На сервере 2-й. Собрали под 2-й и всё работает. Зачем нужно ставить на сервер 4-й, в этом какой-то профит? Чего ждать 10 лет? Вот не понимаю я. Зачем делать ненужную на данный момент работу, может, через год фирма разорится и ничего уже и не надо будет. Да мало ли что ещё может быть.

Date: 2014-02-15 06:47 pm (UTC)
From: [identity profile] vp.livejournal.com
Безусловно, если проект не развивается - нечего его трогать. Но если по плану проект проходит рефакторинг и человек на нем серьезно работает, то есть всегда 100500 мест, например, с обработками безумных списков, где не использовать всю мощь .нета, коя в linq - это ИТ преступление. Ибо после рефакторинга такого рода выражение читается почти как на человеческом языке, вместо того, что там раньше было. Вы не согласны?

Date: 2014-02-15 07:09 pm (UTC)
From: [identity profile] bydlorus.livejournal.com
Безусловно, согласен. Более того, linq на полную мощь я начал использовать сразу, как он только появился (ну, например, когда его поддержка в NHibernate ещё не была закончена, не говоря уже о повсеместно Linq-to-Objects в коде). Однако в данном случае я привёл конкретный пример и даже прямо указал, что проект критический, управляет лицензиями. Когда мы переписывали этих "червей и голоса из розеток" (а точнее код внутри MS Commerce Server) на что-то нормальное (я принял решение использовать появившийся тогда ASP.NET MVC и не прогадал), мы обсудили этот сервер лицензий и приняли решение оставить его как есть, а не то что переписывать. Даже на тот момент .NET 1.1 был устаревшим (пришлось ставить MSBee), но его работа была слишком критической, а т.к. это в общем-то веб сервис, то снаружи не важно, на чём он крутится.

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

Date: 2014-02-15 07:13 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
В чём понт употреблять жидовские обращения типа "ребе"? Жиды - это типа смешно?

Date: 2014-02-15 07:18 pm (UTC)
From: [identity profile] bydlorus.livejournal.com
Уважаемые ребе называют себя ребе. Я просто говорю с ними на их языке. Не называть же их мне жидовскими мордами, в самом деле?

Date: 2014-02-16 08:14 am (UTC)
From: [identity profile] vp.livejournal.com
Это выражение крайней степени уважения и почтения, с одновременным признанием ума и иных способностей собеседника.

Date: 2014-02-16 08:21 am (UTC)
From: [identity profile] berezovsky.livejournal.com
Нет, это рак мозга, порождённый библейским проектом.
Жиды, когда придумывали христианство как религию рабов, как раз ставили такую цель.
Поэтому, например, у многих православных наблюдается преклонение перед жидами вперемешку с завистливостью к ним же и критической неспособностью изменить положение.

Date: 2014-02-17 09:51 am (UTC)
From: [identity profile] osdm.livejournal.com
Читается отлично! Одна проблема - очень тормозит. LINQ можно использовать только там, где перформанс не критичен.

Date: 2014-02-17 10:27 am (UTC)
From: [identity profile] metaclass.livejournal.com
Почему он тормозит? Там же либо тупая функциональщина либо генерация SQL.

Date: 2014-02-17 10:32 am (UTC)
From: [identity profile] osdm.livejournal.com
С SQL не знаю, а в функциональщине постоянно создаются делегаты и классы для замыканий. Это само по себе притормаживает (по-моему, MS до сих пор не пофиксил баг, когда делегаты в дженерических классах ну очень долго создаются), но еще и засирает память, и garbage collector начинает занимать нереальное время. Естественно, это все важно только если LINQ вызывается по сотне тысяч раз в секунду, во всяких UI на это можно забить.

Date: 2014-02-17 11:16 am (UTC)
From: [identity profile] metaclass.livejournal.com
Хм, интересно.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 27th, 2025 10:36 am
Powered by Dreamwidth Studios