Дополнение к посту “Мифология (Наемный рабочий vs Консультант)”, развенчивающему некоторые распространенные мифы о недостатках консультантов по сравнению со штатными сотрудниками.

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

Почему так?

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

  2. Чем выше квалификация специалиста, тем с большей вероятностью он будет заниматься консалтингом. Это дополнительно снижает вероятность найти такого специалиста в штат.

  3. У консультанта просто больше свободного времени. Ему, как правило, не надо бросать предыдущий проект, чтобы начать новый (хотя и не в режиме полной загрузки). Представьте, что всего в России 100 специалистов по какой-то редкой технологии. Допустим, 60 из них работают в штате, а 40 занимаются консалтингом. В произвольный момент времени готовы взяться за новый проект четверть штатных сотрудников и три четверти консультантов. Получается, что потенциальному заказчику нужно будет выбирать из 15 сотрудников и 30 консультантов, несмотря на то, что общее число последних меньше в полтора раза.

Небольшой пример рефакторинга ruby-кода.

Исходный вариант (взято из статьи Raking /etc/hosts For Sweeter Subdomainage)

hosts = []

# add all the site temporary domains
hosts << Site.find(:all).inject([]) do |collection, site|
  collection << site.harmony_url
end

# add all the account subdomains
hosts << Account.find(:all).inject([]) do |collection, account|
  collection << account.harmony_url
end

Как можно сделать лучше?

Программа-минимум:

# site and account subdomains
hosts = []
hosts << Site.find(:all).collect(&:harmony_url)
hosts << Account.find(:all).collect(&:harmony_url)

Улучшения здесь три:

  1. Заменяем низкоуровневый inject на collect. Нет смысла пользоваться inject и выставлять наружу переменную-счетчик, если можно легко сделать то же самое с более высокого уровня абстракции.

  2. Используем сокращенный способ вызова метода в блоке: (&:harmony_url) вместо {|element| element.harmony_url}. Это улучшение является частью ActiveSupport, так что вне рельс само работать не будет.

  3. Заменяем дословно повторяющие код комментарии на что-то хоть немного более высокоуровневое.

Дополнительная программа:

  1. То же самое чуть компактнее

    # site and account subdomains
    hosts = Site.find(:all).collect(&:harmony_url) + Account.find(:all).collect(&:harmony_url)
    

    Далее в коде нигде не используется факт, что массив хостов содержит два отдельных подмассива со значениями, поэтому можно просто запихать все в плоский массив. Что, кстати, избавит нас не только от инициализации hosts, но и от вызова flatten при использовании значений.

  2. Делаем код понятным без комментариев

    hosts =  Site.find(:all).collect(&:subdomain) +  Account.find(:all).collect(&:subdomain)
    

    … а в классах моделей пишем:

    alias_method :harmony_url, :subdomain
    

Next Page »