On 09/05/14, Slavomir Kaslev wrote:
> Writing Software by DHH. <
https://www.youtube.com/watch?v=9LfmrkyP81M>
Изгледах презентацията и имам малко коментари. Определено я
препоръчвам, но с едно наум.
Първо, какво ми хареса:
* Computer Scientist vs. Information System Programmer. Отдавна смятам,
че колкото по-бързо разпознаем, че вършим фундаментално различни неща,
талкова по-бързо може да започнем да учим един от друг. Ала "какво
могат да научат JavaScript програмистите от C програмистите и
обратно".
* "Read a lot of software, write a lot of software" – определено
симпатизирам с възгледа, че само с четене не става.
* Целия паралел с пиането бе страхотен. Титлата "Software writer";
цитата на Паскал (или Твен) – "Ако имах повече време, щях да ти напиша
по-кратко писмо"; The Delete key is the №1 tool for writing good code.
Не е нова идея, но беше добра представена.
* DHH е много добър презентатор и определено човек има какво да научи в
представянето на идеи от него. Всеки път е фън.
Това бяха take-away-овете от началото и края. Сега, имам няколко неща
за казване по TDD атаката по средата. Дори да не ви интересува, аз имам
нуждата да го споделя някъде и това е as good as place as any.
DHH прави една много целенасочена атака, която намирам за пълна с
грешки. Схващам какво се крие зад нея, донякъде симпатизирам с целта
му, но е твърде краен и изхвърля бебето с мръсната вода (още "покрай
бълхата изгаря юргана" или както там се превежда този идиом).
Най-големия проблем е с понятията. Представя една картина на TDD, с
която нито аз, нито хората с които съм практикувал TDD се разпознаваме.
От неговата презентация излиза, че картинката е черно-бяла. По мои
наблюдения има цял спектър от това как могат да се прилагат практиките
зад това наименование. Той обаче си избира определени точки в спектъра
и представя тях като цялото нещо.
Например кода, който показа. Не мога да говоря за всички, но аз
определено съм съгласен с неговите примери (injection-а на Date.now като
default аргумент и command pattern-а в контролера [1]) – не са по-добър
код. Уверен съм, че както хората с които съм практикувал TDD, така и
тези от които съм го учил, биха се съгласили с това. Когато аз правя
TDD, не стигам до такъв дизайн.
Друга странна мисъл бе, че Law of Demeter (и другите ОО практики) се
получават, когато се опиташ да направиш писането на такъв код да
изглежда като наука. Аз поне съм възприемал Law of Demeter, Design
Pattern-ите и всичко такова като някакви loose guidelines, които са
подходящи само за определени ситуации. Нещо повече, изглежда ми сякаш
хората, от които съм учил тези неща, също ги възприемат като такива, а
не като hard science. Просто не виждам откъде тръгна с този аргумент
покрай "псевдонаука".
Финално, слага test-first и употребата на mock-ове под една шапка. Само
първото е "TDD" и двете са ортогонални – можеш да test-first-ваш
end-to-end тестовете си и да не напишеш нито един mock. Можеш да
направиш много индиректна система и да добавиш тестовете с mock-ове в
последствие.
Цялото нещо ми смърди на logical fallacies.
В стил на Getting Real, DHH си харесва враг и го напада. Лошо няма,
само дето аз не съм убеден кой е този враг. Имена не споменати. Аз
не се сещам за много хора, които практикуват TDD както DHH го описва и
имам чувството, че по-скоро си измисля врага, отколкото го избира.
Но все пак има няколко неща, на които не мога да симпатизирам:
* "Unless you're doing test-first you are not professional" – това
определено не е вярно. Както и всички други твърдения, които казват,
че нещата могат да станат само по един начин. Не знам кои са тези
консултанти, които той сравни с книги за диети (не мисля, че и той
знае), но "The One True Way" никога не е продуктивно.
* Правенето на TDD с mock-ове (популяризирано от Growing Object-Oriented
Software, Guided by Tests) определено (1) иска тренинг за прилагане и
(2) далеч не е подходящо за всички ситуации. Начинаещите често
постигат гаден код с него – или защото го прилагат на грешното място,
или защото не обръщат внимание на грешки в mock-овете. Ако някой
оставя впечатлението, че това е универсално правилния начин за писане
на код, то това е лошо.
И тъй.
[1]: Всъщност, зад втория пример с "командата" с контролера се крие
идеята за Hexagonal Architecture. Докато в този пример индиректния
подход само нанася щета, има случаи в които това ми изглежда по-добрия
дизайн. Не съм напълно сигурен кога бих подходил така и кога с
монолитнита архитектура на Rails, но разликата между двете ми е много
интересна като тема. За повече информация може да видите една
презентация на Jim Weirich, която илюстрира идеята:
https://www.youtube.com/watch?v=tg5RFeSfBM4
--
Stefan Kanev ¦ @skanev ¦
http://skanev.com/
For systems, the analogue of a face-lift is to add to the control graph an
edge that creates a cycle, not just an additional node.