*irony*Майкл Хартл — самый ужасный программист в мире!*/irony*

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

Posted by Марк Мельник on November 18, 2012

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

Собственно из-за того бросания в меня ссылками на Хартла и родилось это название <irony>Майкл Хартл — самый ужасный программист в мире!</irony>. Я надеюсь, что использование тега <irony></irony> спасет меня от «Ты сам мудак! Хартл — няша!» ибо, как показывает практика, людей обидчивых и не понимающих иронию очень много. К Майклу Хартлу я отношусь очень хорошо, он написал хорошую книгу, которую я рекомендовал бы к прочтению всем и хотя у меня есть несколько мелких разногласий с автором, я все же считаю его отличным программистом, а его книгу обязательной для прочтения.

Предыстория (совсем кратко и скучно)

Обратился ко мне один человек с просьбой о помощи — необходимо было найти одну багу. Этот человек дал мне ссылку на репозиторий на Github и там я увидел такой код:

def authorized_user
  @micropost = current_user.microposts.find_by_id(params[:id])
  redirect_to root_path if @micropost.nil?
end

Очевидно, что метод назван неправильно ибо делает он совсем не авторизацию пользователя. Естественно я сделал замечание касательно названия метода, а в ответ получил в лоб вот этим — «Этот метод, как и все остальное относящиеся к microposts позаимствован из руководства Майкла Хартла».

Разумеется, святость Хартла непоколебима, и я не мог поверить в то, что Хартл мог назвать так метод, который проверяет не пытается ли пользователь удалить микропост, который уже существует. И, естественно я решил проверить. Потратив 3 минуты времени я нашел в книге Хартла следующий код:

class MicropostsController < ApplicationController
  before_filter :signed_in_user, only: [:create, :destroy]
  before_filter :correct_user, only: :destroy
  .
  .
  .
  def destroy
    @micropost.destroy
    redirect_to root_url
  end

  private

    def correct_user
      @micropost = current_user.microposts.find_by_id(params[:id])
      redirect_to root_url if @micropost.nil?
    end
end

Очевидно, что correct_user — это совсем не authorized_user.

А теперь вернемся к уроку

  1. Все тот же культ карго — подражание без понимания сути — это зло.
  2. Небрежное чтение тех. литературы — еще большее зло, чем то зло, когда вы вообще не заглядываете в нее, ибо, как говорил пророк Исаия (а может и не он) — Чтение документации по диагонали рождает необоснованную уверенность в том, что вы все делаете правильно.
  3. Есть соглашения (и даже принцип легший в основу Rails — CoC — Convention over Configuration) в том числе об именовании методов и переменных. authorized_user — это абсолютно неверное название метода. Судя по названию метод должен возвращать авторизированного пользователя, но делает он совсем другое — выполняет поиск микропоста, который пользователь хочет удалить и если такого не найдено, то выполняет редирект на главную страницу (это необходимо, например, для защиты от двойного клика по ссылке «Удалить», когда по второму клику выполняется повторный запрос на удаление, но записи, которую необходимо удалить уже нет). Соглашениям необходимо следовать иначе код превратится в яму наполненную миазмами, а вам, как программисту, придется в этой яме плавать.
  4. За ваш код несете ответственность только вы сами, а не Hartl, DHH или Matz.