-
Язык программирования Си
В магистратуре пришлось писать лабы на Си, поэтому прочел классику. Очень, очень крутая книга. Материал подан так грамотно и умело, как не видел до этого ни в одной книге. Если придется писать образовательное пособие, возьму книгу за эталон. Подобраны хорошие примеры, листинги краткие – по половине странички. Объяснения логичны и убедительны.
Очень мотивирует обращение к читателям: “Мы сохранили краткость первого издания. Язык Си простой, поэтому незачем писать о нем длинные книги”. С таким настроем освоишь книгу и язык за неделю.
Из минусов издания – не хватает шнурка-закладки. Я уже привык к ним после Удовольствия и Яндекса. Это же тупость – таскать в книге фиговый листочек, чтобы не потерять страницу. Из плюсов – в книге удобный указатель, которым не раз пользовался. Может, потому что в книге полно указателей? =)
-
Черно-белый режим
Провожу эксперимент – как долго смогу проработать в черно-белом режиме. Хотел проверить еще на винде, но там нет штатных средств для черно-белого режима. В няшном маке – опция “Use grayscale”. Вот что теперь я вижу:
Минус – непривычно. Из плюсов, полагаю – меньше устают глаза. Кто знает, есть ли в этом смысл?
-
Яндекс
После событий с Кинопоиском убедился, что Яндекс – очередная русская компания. Русская в том смысле, что сочетает безответственность и невнимание к клиентам.
Во-первых, я нигде не видел, чтобы Аркадий Волож, глава и основатель Яндекса, выступил с извинениями. Извинялись какие-то менеджеры, маркетологи, но не глава компании. Типично для России - царь не признает ошибок, это бояре плохие. Для сравнения, в 2012 году Тим Кук официально извинился за косячные карты.
Во-вторых, Яндекс самым подлым образом слил некую Светлану, которой не повезло оказаться в центре ненависти к Кинопоиску. Порядочной женщине засрали соц. сети угрозами, пишут оскорбления в почту. Трудно даже представить, что может испытывать неподготовленный человек. Со стороны Яндекса нет никаких шагов, чтобы публично защитить Светлану от мудаков. Бросили неугодного боярина на растерзание толпе.
Кстати, Светлана уволилась. Слышал, что из Яндекса и до Кинопоиска начали сваливать ценные кадры, а теперь процесс только усилится. Возможно, начало этому положила смерть Ильи – может, именно он был тем, кто сдерживал баланс между технарями и “эффективными менеджерами”.
UPD: Уволились члены команды старого Кинопоиска.
Комментарии из старого блога
10/14/15 Дмитрий Шишкин: Яндекс не признал ошибок, но вернул все как было. Где-то что-то не так.
10/14/15 Иван Гришаев: В этом плане Яндекс недалеко ушел от Почты России. Сделали, как должны были, но по-хамски, без извинений, наплевав на своих же сотрудников.
10/14/15 Дмитрий Шишкин: Не соглашусь. Очень много было написано. Как в разных пабликах Кинопоиска, так и в интервью различным изданиям. Что касается сотрудников — это не стоит обсуждать. То что находится внутри Яндекса знает только Яндекс. Всплыл один небольшой кусок правды, но нельзя судить о поведении компании прочитав только интервью одной из сотрудниц.
10/14/15 Иван Гришаев: Дмитрий, я вбиваю “волож кинопоиск” и вижу материалы за 2014 год. Где извинения? Прочтите, пожалуйста, эту статью: https://thebigplans.ru/failed
10/14/15 Дмитрий Шишкин: А причем тут Волож? Ошибки признает компания, а не человек.
10/14/15 Иван Гришаев: Что такое компания? Стены, вывеска на фасаде? Компания – это люди. За ошибки такого уровня должен извиняться не маркетолог, а главный руководитель.
10/14/15 Дмитрий Шишкин: Почему?
10/14/15 Иван Гришаев: Потому, что только в этом случае люди компании в полной мере осознают провал.
10/14/15 Дмитрий Шишкин: А из-за тысяч негативных отзывов и затравленной пользователям коллеги провал не осознается?
10/14/15 Иван Гришаев: Откуда нам знать – высшее руководство Яндекса ничего не говорит.
10/14/15 Дмитрий Шишкин: Выходит, что мы ничего на самом деле не знаем, но Яндекс все равно плохой.
-
О чем не нужно спрашивать на собеседовании
Соглашусь с тем, что на собеседовании нельзя спрашивать о религии, политике и сексуальной ориентации. Эти вопросы – вторжение в личную жизнь кандидата, и обсуждать нечего. Личное существует вне работы.
Однако, кроме этих вопросов существуют другие, которые тоже нельзя задавать. Они входят в другую категорию, которую я называю категорией лжи. Задавать можно, но не нужно, потому что ответом почти гарантированно будет ложь.
Ложь – худшее, что может происходить между людьми. Наша цель – провести собеседование в максимально честной среде. Если задаете вопрос, догадываясь о том, что кандидат произнесет заготовленную неправду, срочно переводите разговор в другое русло. Еще хуже, если ожидание лжи становится нормой – вы точно проводите собеседование неправильно.
Вопросов из категории лжи достаточно много, но пока что готов рассмотреть только три.
1) Почему вы ушли с предыдущей работы?
Подвох вопроса в том, что любой прямой ответ – неудачный. Неважно, был ваш прошлый начальник идиот или лапочка, коллеги – гениями или кретинами. Перечисление прошлых проблем и обид создает репутацию человека мелочного, злопамятного, с бабским характером. В лучшем случае звучит как оправдание собственных неудач. На каждый ответ интервьюер задаст три новых вопроса – почему не сделали так, как пытались решить проблему, не считаете ли, что рано сдались? Закончится тем, что кандидат тупо уйдет в психологическую защиту и не пройдет собеседование.
Примерно таким я вижу удачный ответ:
– Вениамин, к сожалению, я не готов обсуждать причины моего ухода. Считаю неэтичным обсуждать начальство и коллег за чужими спинами. Согласитесь, вы бы не хотели, чтобы кто-то из коллег обуждал вас на собеседовании у конкурента. Могу поделиться тем, что за время работы я достойно решал спорные ситуации и расстался с коллегами друзьями. Бывший начальник готов дать рекомендацию, вот его контакты.
В этом ответе сплошные плюсы. Первое – оставили в секрете то, о чем не хотели говорить. Второе – показали, что умеем хранить тайну. Очень ценное качество. Пусть собеседник не узнал что хотел, но стал вас больше уважать.
Разумеется, вариант хорош только в том случае, если правдив. Если вы уволились безобразным способом, подставив коллег и менеджеров, врать не стоит – сделаете хуже. Увольняться нужно правильно. Кстати, если вы действительно сходу готовы перечислить обиды на прошлых коллег – это реально плохо, срочно отпустите дурные воспоминания.
2) Какие у вас слабые стороны?
Бредовость вопроса строится на постулате, что люди не идеальны, поэтому никто не имеет права сказать, что у него нет недостатков. Сознательный человек знает, что недостаток – штука относительная и существует только по соседству с определенными людьми. Например, на прошлой работе кандидат курил, потому что все курили. Запаха дыма в кабинете никто не замечал. На новой работе коллеги не курят, жалуются на неприятный запах после того, как новый сотрудник вернулся из курилки. Недостатка не было, а теперь появился.
В лучшем случае кандидат произнесет заготовленную ложь. Но наше правило – всегда говорить правду:
– Михаил, я не знаю, как ответить на этот вопрос в точности. Я не могу продиктовать список недостатков. Считаю, взрослому человеку должно быть стыдно признавать за собой откровенные недостатки и ничего не делать чтобы исправиться. Полагаю, вы задали вопрос с целью узнать, насколько мои ценности соответствуют ценностям коллектива? Я бы и сам хотел узнать об этом подробней. Расскажите, какие качества ценят ваши сотрудники. Если они соответствуют моим качествам, уверен, мы сработаемся, если же нет – никаких обид. Думаю, нам обоим лучше выяснить это до того, как официально устроюсь на работу.
Плюсы: опять сохранили в тайне то, о чем не хотим говорить. Задали контрвопрос, пусть теперь отвечает собеседник. Задача кандидата – слушать, он получит много полезной информации. Интервьюер оценит внимание к собственной персоне и компании в целом. Травим леску – позволяем сказать “нет”, демонстрируем спокойствие и отсутствие нужды.
3) Почему вы выбрали именно нашу компанию?
У каждого человека цель. Кто-то устраивается в контору, чтобы набраться опыта и уехать. Другой работает в полсилы, а по ночам пилит проект, надеясь снискать успех. Третий тупо хочет стабильно зарабатывать и не париться. Правда в том, что истинные намерения при устройстве на работу могут быть настолько интимны, что их не вытянуть никакими усилиями. Поэтому оценивать кандидата нужно по другим критериям.
Парадокс вопроса в том, что ответ в духе “набраться опыта и свалить в Гугл” считается чем-то вроде преступления. А ответ “ценю ваш продукт и готов пахать по гроб жизни” – крутым. В действительности все наоборот! Человек, который хочет набраться опыта, будет работать вдвое продуктивней того, кто намерен просиживать штаны годами. У первого явная цель – опыт, а значит, он будет брать ответственность и в итоге сделает за полгода то, что до него пытались сделать годами.
– Елена, не стану скрывать, что рассматриваю не только вашу компанию, но и некоторые другие. Мне важно знать, что не только я подхожу компании, но и компания мне. Будет очень неудобно, если уже после трудоустройства выяснится обратное. Расскажите, пожалуйста, о принципах и методологиях команды?
Опять: вежливо уходим от прямого ответа, заставляем говорить собеседника, храним спокойствие.
Неважно, по какую сторону стола вы сидите, следите за уровнем лжи в разговоре. Меняйте вопросы, если кажется, что кандидат говорит неправду. Вы готовы честно ответить на этот же вопрос кандидату? Если вы кандидат и чувствуете, что подталкивают ко лжи – дважды подумайте, стоит ли связываться с этой организацией.
Комментарии из старого блога
10/14/15 Дмитрий Шишкин: Вы рассматриваете только один сценарий ответа на вопрос «Почему вы уволились с прошлой работы?». Еще варианты: «Я решил сменить направление своей деятельности», «Мне важно работать удаленно, но на предыдущем месте работы это было невозможно», «У меня были личные конфликты с руководителем», «Я работал в маленькой компании, но всегда мечтал работать в большой».
Не вижу ничего плохого в вопросе о слабых сторонах. На него важно отвечать ретроспективно: говорить о проблемах и их решениях. Или говорить о текущих проблемах и рассказать о том как вы с ними боретесь. Этот вопрос про саморазвитие и самосовершенствование, по-сути. А вот трусливо уходить от вопроса и «переводить стрелки» на другую тему не очень хорошо. Отвечать вопросом на вопрос тем более.
Вопрос «Почему вы выбрали именно нашу компанию» сложен только для того, кто подает резюме во все компании без разбора. Всегда нужно понимать где ты хочешь работать, а где не хочешь и почему. Подобный вопрос недопустим в том случае, если компания сама нашла вас и пригласила на собеседование. В таком случае можно ответить в стиле: «Я вас еще не выбрал, пока что мы только знакомимся».
10/14/15 Иван Гришаев: Дмитрий, вас завалят вопросами о том, какие были конфликты и кто был неправ. Это то же самое, что вопрос про коньяк по утрам. Как не отвечай, станет хуже.
Вы готовы перечислить список личных недостатков в ответе на этот комментарий?
Отвечать вопросом на вопрос – очень хорошо и полезно.
10/14/15 Дмитрий Шишкин: Меня не заставляют и не заставят. Если я действительно ушел из-за конфликтов, то так и скажу: «У меня были личные конфликты с коллективом, но я не готов это обсуждать».
А никто не просит список недостатков. Не надо писать «Я забываю делать задачи и опаздываю с реализацией тасков». Это провальный путь. Надо отвечать по-другому: «У меня была проблема, я забывал о некоторых небольших задачах, если мне о них не напоминали, но недавно начал вести Вандерлист и все устаканилось. А еще я иногда ошибаюсь в оценке сроков, как правило на длительные проекты. Но я работаю над этим и за последний год ошибки становятся все меньше».
Нет ничего плохого в недостатках, идеальных людей не существует. Главное с ними бороться.
10/14/15 Иван Гришаев: Не пойму, если вы не готовы обсуждать конфликты, зачем вообще о них упоминать? Насчет недостатков – очень прохладный вариант. Вы автоматом признали, что за вами водятся косяки, при этом ваш собеседник продолжает атаковать. Мой вариант предполагает, что теперь он должен делиться информацией.
10/14/15 Дмитрий Шишкин: Атаковать? Собеседование — не война, а знакомства кандидата и компании. Если вы воюете не собеседовании, то компания не для вас. Нет ничего плохого в том, чтобы рассказать о косяках. Лучше о недостатках рассказать сразу, чтобы потом они не были внезапными. Интервьюер ответит на ваши вопросы при любом исходе. в случае если вы зададите интересующие вас вопросы.
-
Ходи на лекции
Я учусь в магистратуре на прикладной механике и математике. Ну, как учусь – прихожу раз в неделю, остальное время изучаю материалы дома. Стало сюрпризом, что преподаватели проверяют посещаемость, ставят энки, плюсики, словом, детский сад. Ладно в школе, ладно когда учишься на бакалавра, но магистры, Карл – люди работающие, с семьями, какие энки?
Дай лекции, пусть подготовятся и расскажут. В ответ слышу говно про то, что должен ходить, это для твоего же блага. Подумал две вещи.
Первая – уровень образования в России низок в том числе из-за этого. Вместо лекций магистры добывают суррогаты, читают не то, сдают кое-как.
Второе – причиной этому ревность. Препод хочет замкнуть людей на себе, подчеркнуть важность, поднять ЧСВ, как выражаются на Лурке.
Заметил, преподы крайне болезненно реагируют на знания, которые ты получил со стороны, даже в школе. Женская ревность! Решил не тем методом, на другом языке, обвел не в овал, а в прямоугольник, подчеркнул не сплошной, а пунктиром – тебя не так учили, переделывай! Мы учимся делать так!
Другие расскажут плохо, в интернете материалы плохие, дома ты отвлекаешься – зато здесь, в институте с дрянными лавками и вонючим туалетом я пробубню тебе два часа не поднимая глаз – и ты все поймешь.
Я на триста процентов уверен, что если поступил в универ, тебя должны закидать материалами – учись, кадров не хватает. Знания должны быть доступны всем! Но вижу, как староста ходит за преподом и выпрашивает презентацию, которую он показал с флешки и унес с собой.
Хватит жопить знания. Все лекции, примеры, задачи должны быть онлайн – без регистраций и ограничений. Студенты должны тянуться не к сайтам, где все можно скачать за смс на бесплатный номер, а к преподавателям, которые понятно объяснят материалы.
Будь моя воля, обязал бы все школы и университеты хранить учебные материалы в едином банке знаний – с открытым доступом для всех.
-
Назначьте на капс контрол
Клавиша капс-лок совершенно бесполезна. Занимает много пространства, располагается между двумя полезными соседями. Писать капсом невежливо. Почему бы не задать функцию поважней? Я назначил контрол, выбирал из вариантов:
-
назначить переключение раскладки. Нажал капс – раскладка русская, отжал – английская. Отлично работает для двух раскладок. Лампочка на клавише помогает запомнить.
-
назначить контрол, особая фича для программистов. Когда набираете код, четыре основных пальца каждой руки не должны уходить далеко от клавиш
asdf
иjkl;
. При этом если контрол стандартный, нажимать комбинации типа Ctrl-R не выворачивая руку нереально. И напряг, и позиция пальцев теряется. А с капсом в роли контрола – легко. В Емаксе и Виме работать иначе невозможно. -
назначить шифту контрол, а капсу – шифт, то есть проподнять клавиши на одну вверх. Интересный вариант, еще не пробовал. Своего рода компромисс между высоким и низким контролом.
Словом, назначьте хоть что-то, станете продуктивней работать. Бонус – как переназначить служебные клавиши в Маке без специальных программ.
Откроем настройки системы, опции клавиатуры:
Нажмем кнопку “замена клавиш”:
В диаложке нажначим клавишам альтернативы:
Готово!
Комментарии из старого блога
10/14/15 Дмитрий Шишкин: У меня капс лок вызывает терминал.
-
-
Совы и лентяи
Спорим, у вас на работе есть коллега, который приходит на работу в 12 с заспанным лицом? Пьет кофе до часу, обходит коллег, с каждым обсуждает пробки на дорогах. Садиться работать ближе к двум, чтоб через полчаса сорваться на обед. Каждые полчаса заглядывает на сайты смешных картинок. Уходит поздно. Коллегам объясняет – ну, я же программист, я же сова.
Твердо убедился, что нет жаворонков и сов, но есть неорганизация и лень. Важные дела совершают утром, потому что голова работает лучше. Без обсуждений. Детские сады, школы, вузы начинают занятия с
8:00
. В госучреждениях пиковая нагрузка в первые часы работы. У дверей поликлиник очередь занимают в7:30
.Мне приходилось работать и в утреннее, и в вечернее, даже в ночное время. У каждого режима свои недостатки и преимущества. Но главное – организм способен привыкнуть к любому режиму. Коллеги просят приходить пораньше – начни ложиться и вставать на час раньше, и ничего с тобой не станет.
Проследим за программистом в течение вечера. Вот он приволокся домой после очередного неэффективного дня. Поел, покурил, сел за комп в 21:00. Думает, два часика посижу и спать. Ага. Час поиграл в свой Колл оф Дьюти, посмотрел Ютуб, открыл Хабр, узнал про новый фреймворк, скачал, написал Хеллоу Ворд, проверил почту, посрался на форуме… Ну вы поняли. Компьютер – это бесконечный источник развлечений. Как только надоест одно, можно начать другое. Еще фильм скачать, музыку послушать. В кровать программист отправляется в три ночи. Утром никакой тащится на работу, кофе, сигареты, и все по-новой. Сова такая сова.
Человек становится совой или жаворонком сам. Режим он тоже меняет сам, если захочет. Профессия роли не играет (за исключением ночных дежурств, конечно).
Нет ничего постыдного в том, чтобы тупить за компом по вечерам. Я, например, вчера лег поздно, потому что читал Википедию и смотрел Ютубчик. Но встал как обычно, потому что, сука, такой режим. Стоит три раза кряду недоспать, как организм скажет – сегондя никаких Ютубов, марш в кровать.
Допускаю, что из сотни человек есть пара тех, у кого действительно организм настроен на другой график от природы. Да, имя тяжело. Но когда каждый второй объясняет, что он, видишь ли, программист и вообще сова, я сатанею. Что ты сделал, чтоб измениться?
-
Сервис хранения ссылок и заметок?
Пользовался Эверноутом, но не могу больше, ибо:
- веб-морда часто требует пароль. Галочка “Запомнить меня” увеличивает срок сессии ненадолго.
- нет (или я не вижу) авторизации через соцсети
- после входа показывают баннер с тарифными планами
- после тыка на бесплатный план показывают второй экран, где написано, что я выбрал бесплатный план (кэп)
- веб-морда тормозит и требует лишних кликов (а мне всего лишь урл скопировать)
- расширение для хрома делает пять аякс-запросов и тормозит
Только не Эверноут. Лучше уж файлик в Дропбоксе.
Комментарии из старого блога
10/07/15 Andrew Karavaev: Google keep?
10/07/15 Иван Гришаев: Даже не знал, спасибо!
10/08/15 Сикорский Павел: Raindrop.io например. Многих описанных минусов можно избежать, если поставить нативное приложение Эверноута.
10/08/15 Иван Гришаев: Спасибо, попробую. Если честно, уже почти отдался в пользу Гугл-кипа.
10/29/15 Арсений Швечков: alternoteapp.com Есть такой десктопный клиент для Эвернота. Меня он спас хотя бы отчасти. С веб-интерфейсом правда никак не поможет.
11/16/15 Рыжак Максим: Пользуюсь checkitlink.com, узнал про него из статьи http://coolinfoo.ru/obzor-servisov-hraneniya-zakladok-i-ssylok. Удобно, функционально, ссылка добавляется почти мгновенно, а разрабы ещё обещают новый дизайн и кнопку в браузере
11/16/15 Денис Верницкий: Пользуюсь сервисом https://checkitlink.com/. Работает недавно. Т.к был одним из первых - попал под акцию: разрабы мне позволяли пользоваться и тестить фичи, которых нет на продакшне. Скоро обещают запилить расширения для браузеров, возможность сохранять заметки и цитаты прямо с текстов веб сайтов, сохранять картинки со страниц и еще много чего. Мне главное - что сервис стабильно работает, есть доступ всегда. Да и число пользователей стремительно растет.
-
Выучите реквизиты паспорта
Мы указывам реквизиты паспорта часто. В банке, при покупке симки, когда подключаем интернет, на почте, в детском саду, на работе, в школе. Меня так задолбало каждый раз открывать корочки, что выучил реквизиты наизусть и теперь заполняю бланки с реактивной скоростью.
Это прорыв! Экономит минут пять на каждый бланк. А сколько раз паспорт был не при вас? Теперь с сочувствием смотрю на людей, которые при виде бланка начинают бормотать: блин, а паспорт, кажется, я сегодня не взял…
Если пойти еще дальше, отсканьте все документы и положите в Дропбокс. Тоже не раз спасало: показать какую-то справку, флюорографию, планировку квартиры. Если чиновник требует распечатку, не вставая с кресла отправляю файл ему на емейл.
Однако, паспорт указываем намного чаще, поэтому он заслуживает хранения в особом месте – в мозгу.
Комментарии из старого блога
10/07/15 Алексей Будаев: Давно помню наизусть реквизиты своего паспорта, включая “код подразделения”, который зачем-то всем пару лет назад стал нужен. Но таскать с собой этот документ всё равно нужно, потому что после заполнения бланков, как правило, чиновнику нужен оригинал, чтобы удостовериться, копия из Дропбокса (которая тоже у меня давным-давно хранится) тут не спасёт.
И ещё с нынешнего года всем госструктурам вдруг понадобились наши пенсионные удостоверения - зелёная заламинированная карточка, в которой из информации только Ф.И.О. и номер - его тоже запоминать?
Так я к чему: давно созданы и работают базы, чиновники высокого уровня говорят о снижении всяческих барьеров и бюрократии (точнее, при Медведеве говорили) - почему бы не привязать к одному номеру того же пенсионного страхования (номеру паспорта, прав) ВСЕ ДОКУМЕНТЫ гражданина? Чтобы я показал карточку или назвал номер - а в базе уже все копии, все удостоверения, всё.
10/07/15 Иван Гришаев: Вы правы, чаще всего паспорт показывать нужно. Но и тут вы экономите время – сунули паспорт в окошко, и пока заполняете бланк, оператор набивает паспорт в компьютер. А сегодня, например, заполнял в школе договор – паспорт никто не проверял, учителю не до этого, но половина родителей заполнить не смогли – документ-то дома.
Зеленая карточка называется СНИЛС – не могу сказать, что ее везде просят. И как правило, просят только номер, я как-то раз продиктовал с телефона, и прокатило. Как ИНН, короче.
Слышал, работа по созданию единого айди в России идет, но очень медленно. В Украине, кажется, уже вводят такие карты.
10/07/15 Алексей Будаев: 1. Я и не спорил - просто дополнил вашу мысль, что кроме мозга и Дропбокса, неплохо бы с собой паспорт иметь всегда и везде. На всякий случай.
-
СНИЛС, да, её подъём начался с появлением портала государственных и муниципальных услуг - там аккаунты привязаны к номеру СНИЛС. Теперь карточка (не НОМЕР СНИЛС, а копия и оригинал документа) требуется при сделках с недвижимостью, например, так что “по телефону” с Росреестром не прокатит, хотя, казалось бы, зачем?
-
Да, единая электронная карта “на подходе” уже несколько лет. Регионы, кстати, вправе создавать такие карты на уровне “единого проездного” + банковской карты. Видимо, ждём национальную платёжную систему, потом уже объединяющая электронная карта появится.
10/07/15 Иван Гришаев: Согласен во всем, разве что единого айди и национальной платежной системы можем не дождаться. У правительства в последнее время совсем другие интересы.
10/14/15 Дмитрий Шишкин: Отсканировал все документы и храню их в облаке. Это очень удобно и экономит массу времени. Кроме паспорта: права, военник, ИНН и СНИЛС.
-
-
Я не понимаю ООП
Не боюсь признаться в том, что не понимаю ООП в том виде, что существует сейчас. То есть, я понимаю его формально, механически. Поскольку в проекте сплошное ООП, пишу классы наравне со всеми, но не вижу, какие проблемы это решает – наоборот, замечаю больше проблем. Вовсе не стараюсь закосить под Дейкстру, который говорил, что ООП – худшее, что придумали в Калифорнии (хотя факт, что сей ученый муж на моей стороне, неистово льстит).
Защитники ООП-подхода говорят, что парадигма возникла в момент, когда стало чрезвычайно трудно поддерживать системы, написанные в процедурно-модульном стиле. Бизнес потребовал быструю разработку, назрел кризис роста индустрии. В ответ создали ООП. Важно понять, что абсолютно никто не мог сказать, во что это выльется. Примерно как вы не сможете сказать, чем закончится путешествие в сердце Африки. Люди хотели перемен, так вышло. Если бы придумали другую методологию, какой-нибудь ППО, мы бы писали сегодня на ППО.
Хочу проговорить абзац выше другими словами. ООП вышло в лидеры по историческим причинам, а вовсе не потому, что это такая классная вещь. Кто-то показал презентации лучше, картинки ярче, будущее – счастливей. По тем же причинам фаворитами в своих областях стали христианство, коммунизм, Виндоуз и тд. Важно, что постепенно розовый экран осыпается, и мы должны подумать, что делать дальше.
Сегодняшнее ООП далеко от первоначального замысла. Мы имеем объекты с методами, и каждый объект дергает методы других. В оригинальной задумке объекты ничего не знают о внутреннем устройстве соседей. Они шлют сообщения по идентификатору. Получив сообщение, объект с таким айди решает, как его обрабатывать (и стоит ли вообще), может послать что-то в ответ или далее по цепочке. Такая схема в Эрланге, но никак не в Джаве, Питоне, Си++ и других промышленных языка. Иначе говоря, сегодняшнее ООП является совсем не тем, что пытались разработать авторы.
Рассмотрим на практике, что не так с ООП. Решим задачу о сложении чисел а и б. Приводить код в процедурном подходе, полагаю, нет смысла. Версия ООП:
class Summator: a = None b = None def set_a(self, a): self.a = a def set_b(self, b): self.b = b def get_sum(self): return self.a + self.b sum = Summator() sum.set_a(2) sum.set_b(3) print sum.get_sum()
Бросается в глаза размер кода. Защитники ООП скажут, что пример нелепый, потому что в ООП числа складываются операторами, а не классами. Отчасти верно, но в случае с классами кода всегда будет больше хотя бы потому, что помимо описания класса должен быть еще код, который создает класс и приводит к нужному состоянию. Класс – мертвая абстракция, которая оживает позже.
Второй момент, ООП-подход обязует вызывать методы в определенном порядке. Этим он берет за горло мертвой хваткой. Если вызвать метод
get_sum
строкой выше или выкинутьset_a
, суммирование упадет со странной ошибкой. Уйдет время, чтобы понять трейс. В реальных ситуациях шансы нарушить порядок методов возрастают. С функциями этого не случиться по определению. Невозможно вызвать вторую функцию, если она принимает словарь, полученный из первой функции.Даже если порядок методов соблюдается строго, поведение объекта невозможно предсказать в параллельном исполнении. Представьте, что каждый тред вызывает методы в нужном порядке, но обращение их к классу никак не согласовано. Потребуются доработки, чтобы класс работал правильно. Скорей всего, исправлять придется не сам класс, а код, который к нему обращается: создавать по экземпляру на тред, обкладывать локами. Сути это не меняет.
Пример демонстрирует, что корректность программы зависит от состояния класса. Чем больше состояний, тем больше их комбинаций. Хороший программист стремиться свести состояния к минимуму. Так, функция
def sum(a, b): return a + b
лишена перечисленных недостатков. В ней нет состояния: два значения однозначно преобразуются в одно, поэтому функцию можно выполнять в тредах. К ней можно применить декоратор memoize, чтобы отдавать результат из оперативной памяти.
Нас учат, что краеугольные камни ООП – инкапсуляция, наследование и полиморфизм. Все это есть в современных языках без привязки к ООП. Инкапсуляция – замыкание или словарь, где ключи хранят не только данные, но и функции для работы с ними. Весь Джаваскрипт так работает, еще Луа. В Кложе есть расширение протоколов: разработчик может добавить в существующий протокол свой тип данных. В Гоу разработчики наследуют структуры. Полиморфизм встроен в любой функциональный язык – Хаскел, Эрланг, Кложу.
Говорят, ООП оперирует объектами, поэтому лучше отражает окружающий мир. Это видно в примерах, когда от класса Animal наследуют классы Cat и Dog. Потом заменяют метод голоса (мяу и гав) и т.д. Проблема в том, что мир вокруг нас неописуемо сложен. Природе потребовались миллионы лет, чтобы обуздать хаос и породить первый белковый комочек. Действительно считаете, что ООП может описать сложность окружающего мира?
Проверьте код и убедитесь, что лишь малая часть классов отражает те сущности, которые есть в окружающем мире. В остальном это всевозможные менеджеры коннектов к БД, классы
Utils
, обертки логирования, то есть вещи, которые существуют только в голове программиста. Реальным миром здесь и пахнет.Объекты скрывают явное. Предположим, вызываю метод
.get_data()
у классаFoo
. Знаю, что он унаследован отBar
, а тот отBaz
. Как понять, из какого класса будет вызван метод? Был ли он переопределенFoo
илиBar
? Наоборот, когда вызываю функциюget_data()
из модуля foo, ошибки быть не может – это именно та функция, не одноименная из модуляbar
.Любопытно, что в природе нет наследования, какое видим в ООП. Набор генов формируется с учетом генов родителей, но затем особь становится полностью автономной и не зависит от предков. Вы видели, чтобы детеныш терял лапу от того, что папаша-самец попал в капкан? Или если мать сменит пол, то и ребенок тоже? Это же бред. В ООП происходит подобное – потомки прибиты гвоздями к предкам. При изменении цепочки где-то в середине изменения передаются по ниспадающей. В результате все ломается.
Два класса, унаследованные от предка, обречены на страдания сиамских близнецов. Ни один не может претендовать на независимость. Согласно медицине, разделение сиамских близнецов – невероятно трудная задача, во всем мире считаные врачи делают эти операции. Разделение классов с наследниками протекает мучительно. Напротив, объединить функции в класс очень легко. Функция автономна по своей природе. Ей неважно, где находиться – на уровне модуля или класса. В следующий раз перед тем, как объявлять класс, начните с небольшого набора отдельных функций. Возможно, их окажется достаточно.
Глобальный объект, на который ссылаемся через переменные
self
,this
– ни что иное как читерство. Еще в школе рассказывают, что глобальные переменные – плохо и использовать лучше только для чтения. В ООП этот моветон гипертрофирован и возведен культ.Self
– жирная глобальная переменная, методы меняют ее поля. Например, на уровне класса объявлено полеdata = None
. В каком-то методе автор невозбранно итерируется по нему как списку. Подразумевается, что перед этим будет вызван метод set_data, который заполнит поле data. Теперь представьте, что в объектеself
двадцать полей. Как это контролировать?Конечно, с такой точкой зрения на ООП не избежать насмешек и споров с коллегами. Приведу типичные выпады и ответы.
– Все современные языки исполнены в ООП, какой ни возьми.
Неправда. Недавно появились Раст, Гоу, Кложа, Ним, где классов либо нет, либо они не являются центральной концепцией языка. Создатели поняли, что грамотные коллекции и структуры важней классов. В Гоу и Ним вызовы методов ни что иное, как синтаксический сахар. В Кложе классов и объектов нет, в Лиспах ООП строится поверх языка. В Тикле (TclTk) ООП-систем вообще пять.
– Функциональные языки непригодны для промышленной разработки, только в академической среде.
Неправда. Вакансии на Кложе, Хаскеле есть. Гуглите на Стековерфлоу. Для Скалы еще больше – проходите собеседование и работайте. К слову, обеспокоенность трудоустройством выдает нужду и играет на руку работодателю. Заказчик не заинтересован в вашем росте. Он хочет принять программиста за 50 тыс. руб. в месяц и держать на одном уровне много лет. Он горячо поддержит вас в том, что ООП – стабильность и уверенность, а ФП – удел академиков НИИ.
– Все пишут на ООП, потому что альтернатив нет.
Программированию всего 50-60 лет. Это меньше одной человеческой жизни, и не идет ни в какое сравнение с медициной или астрономией. В программировании все еще очень мало точек, на которые можно опираться как на непреложные истины подобно аксиомам в геометрии. Поэтому в исторических масштабах то, что видится трендом, окажется зигзагом кривой. Мыслите шире.
– Ты писал на функциональном языке? Или только рассуждаешь?
Да, веду личный проект на Кложе – большая нагрузка, БД, Редис, сетевые вызовы в социалные сети, прием платежей через Пейпал. Вначале мозг рвался, затем в голове щелкнуло и пришло понимание, как обходиться без изменяемых переменных, классов и того другого, без чего ООП-программисты себя и не мыслят.
Надеюсь, эта статья поможет кому-то отказаться от подхода ООП-онли. Есть много парадигм, нужно знать если не все, то многие. Начните изучать функциональное программирование! Разнообразие парадигм сделает вас настоящим инженером.
Комментарии из старого блога
10/06/15 Корейша Виктор: Очень круто. У меня подобные мысли пару лет крутятся в голове. Но нет такого опыта на разных языках, что бы отвечать на выпады. Спасибо.
10/06/15 Иван Гришаев: Джо Армстронг, создатель Эрганга, высказывается в похожем ключе: http://sotnyk.com/2012/05/19/pochemu-oop-polnyiy-otstoy/
10/08/15 Павел Заикин: Каждому методу свои задачи. В чем-то хорош ООП в чем-то функциональный подход.
Не бывает идеальных методов.
10/08/15 Иван Гришаев: Осталось понять, кому какие =)
10/08/15 Павел Заикин: ООП хорош там где нужно хранить состояния. Там где много однотипных сущностей с немножко разным подходом к выполнению алгоритмов. Там где нужно сделать часть данных недоступным для изменения из других частей программы. Да много где ООП хорош. Но ФП тоже хорош особенно для простых, линейных задач.