Раньше, когда читал такие же статьи, как и What are the most important design patterns that software engineers should know to work at Google, Amazon and Facebook? с критикой применения патернов проектирования, я считал, что это какой-то крик души отдельного человека. Сейчас, когда я слушаю, почему человек выбрал ту или иную схему решения задачи, я понимаю, откуда взялись эти крики.
Никакие. Их все.
Очень неудачно, что многие школы программирования делают акцент на патернах, как на одной из самых выжных концепций в компьютерной науке. Они вбивают в своих студентов эту мысль и даже заставляют заучивать главы Банды Четырёх.
Для ясности: я не критикую тех, кто спрашивает про патерны, я критикую систему обучения, которая делает упор на их бездумное использование.
Для тех, кто просто заучил патерны в качестве основы программирования, их использование не будет казаться чем-то очевидным. Патерны - это наблюдения, а не правила. Люди заметили, что разработчики решают схожие проблемы похожими путями в различных приложениях и решили, что было бы здорово составить словать с такими решениями, для того чтобы обобщить знания. Так появились общие решения, которым потом дали имена типо "Наблюдатель".
Конечно, есть польза от того, чтобы изучать патерны: она приблизительна такая же как важность прослушивания хорошей музыки для того чтобы выработать слух - разработчик должен смотреть чужой код и чужие решения, чтобы улучшать себя. Если группа умных людей решает какой-то класс проблемм схожим образом, то будет полезно разобраться почему они именно так сделали, а не считать что то что они написали - это единственно правильное решение.
Во всём этом самая главная часть - это "почему". Навык который необходимо культивировать для того чтобы быть отличным разработчиком и притягивать к себе топовые компании - это не знать состав библиотек и плагинов, а понимание того, как эти библиотеки работают внутри, какие проблемы они решают и почему эти решения хороши. И когда вы встречаетесь с похожей, но незнакомой проблемой, постараться понять и разобрать её, а не стараться впихнуть проблему в какой-то знакомый вам патерн.
Именно за последний пункт, я особенно критикую курсы по программированию: вместо короткого решения они учат создавать вавилонскую башню из различных абстракций и патернов, и как результат программа становится только слишком сложной. Конечно, есть определенное количество компаний для которых самое важное это умение сделать правильно-патерно-ориентированный дизайн, но Google не относится к этой категории.