Connect with us

Программирование

Программирование это новый пузырь?

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

Анна Гуляева

Опубликовано

/

     
     

Моя подруга недавно задала вопрос, который я слышал много раз в разных вариациях:

Не кажется ли вам, что некоторые низкоуровневые профессии программистов вымрут как птицы додо? Сейчас это похоже на большой пузырь, который рано или поздно лопнет. Мне кажется, что одна из причин “престижности” технологических и связанных с наукой (на низком уровне) профессий заключается в нелепом жаргоне индустрии и всеобщей компьютерной неграмотности, и оба этих фактора исчезнут в следующие десять лет […]

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

Следовать за меняющимся технологическим ландшафтом может быть сложно. Мы должны уметь предсказывать, какие профессии исчезнут с рынка, потому что их заменят технологии. Также мы должны следить за ростом количества людей, которые учатся программировать, чтобы предугадать, как изменятся зарплаты и спрос на определенные навыки. Как сказала Ханна, «всеобщая компьютерная неграмотность» влияет на размер зарплат программистов, но люди узнают больше о технологиях с каждым годом.

Движение к коммодификации

Страх того, что алгоритмы заменят людей на работе, — не нов и не беспричинен. В любой области, а особенно в технологии, силы рынка подталкивают корпорации к автоматизации и коммодификации. Один из способов изображения этого явления — циклы хайпа Gartner.

С течением времени специфичные идеи и технологии доходят до «плато продуктивности», где их автоматизируют. Взглянув в прошлое, можно подумать, что автоматизация может разрушать определенные рынки труда. В разных индустриях, от сбора урожая до сборки автомобиля, технологические открытия заменили и дополнили человеческий труд, чтобы сократить затраты. Один профессор во время курса по компиляторам однажды сказал: «Посмотрите на текстильную и металлургическую промышленности: вы хотите строить машины и инструменты или вы хотите ими управлять?».

Коммодификация (от англ. commodity — товар) – процесс, в ходе которого все большее число различных видов человеческой деятельности обретает денежную стоимость и фактически становится товарами, покупаемыми и продаваемыми на рынке.

В этой метафоре «машиной» является язык программирования. Этот профессор спрашивал: вы хотите делать сайты на JavaScript или вы хотите создавать движок V8 для JavaScript?

Создание веб-сайтов уже автоматизировано при помощи WordPress и других сервисов. С другой стороны, у V8 появляются конкуренты, некоторые из которых решают открытые вопросы. Языки приходят и уходят (сколько сейчас открыто вакансий для Fortran?), но всегда будут люди, создающие следующий язык. К счастью для нас, все реализации пишутся на языках программирования. Путь «оператора машины» в программировании делает вас «создателем машины» в том смысле, который оказался неверным для работников сталелитейных заводом в прошлом.

Растущее число языков, интерпретаторов и компиляторов показывает нам, что каждая разрушающая профессии машина приносит новые возможности улучшения и развития самой машины. Несмотря на то, что список уже несуществующих профессий растет, пока не настал этот момент в истории, когда человечество скажет: «Думаем, что больше работы для нас не осталось».

Коммодификация распространяется на всё, не только на программирование. Человеческий труд постоянно заменялся автоматизированным или дополнялся таким образом, что требовал меньше людей. Беспилотные автомобили и грузовики являются последним примером этой великой традиции. Если цикл создания и автоматизации является частью жизни, то естественно будет спросить: какие работы и индустрии находятся в зоне риска, а какие нет?

Кто автоматизирует кого?

AWS, Heroku и другие аналогичные хостинговые платформы навсегда изменили роль системного администратора и DevOps-инженера. Раньше интернет-бизнесу был необходим свой “мастер серверов”. Кто-то, кто был подкован в Linux, мог настроить сервер Apache или NGINX, подключить все физические компоненты и сделать все необходимое для того, чтобы сервер стал доступным в публичном вебе. Хотя некоторые люди по-прежнему применяют этот навык в работе, AWS делают некоторые из этих навыков устаревшими, особенно на уровне небольшого опыта и размещения оборудования. В Amazon, Netflix и Google существуют хорошо оплачиваемые вакансии для людей с глубокими знаниями в инфраструктуре сетей, но спрос в малом и среднем бизнесе на таких людей значительно упал.

Инструменты бизнес-аналитики, такие как SalesForce, Tableau и SpotFire также начали занимать пространство, которое исторически занимали инженеры. Эти системы сократили потребность в штатных администраторах баз данных, но они увеличили спрос на понимание SQL. Они сократили потребность во внутренней технологии отчетности, но увеличили спрос на «инженеров интеграции», которые автоматизируют поток данных к сторонним платформам. Ранее этим полем правили Excel и таблицы, а теперь оно перешло к языкам вроде Python и R, а также SQL для управления данными. Некоторые профессии исчезли, но в целом спрос на разработчиков программ вырос.

Data Science — это ещё один интересный пример коммодификации, более близкой к программированию. Scikit.learn, Tensorflow и PyTorch — это библиотеки, которые упрощают людям задачу создания приложений с машинным обучением, устраняя необходимость создания алгоритмов с нуля. На самом деле, теперь возможно провести набор данных через многие алгоритмы машинного обучения с разными параметрами, практически не понимая работу этих алгоритмом (это неправильно, но возможно). Компании бизнес-аналитики, вероятно, будут пытаться интегрировать эти алгоритмы в свои инструменты в следующие несколько лет.

Во многом Data Science сейчас похожа на веб-разработку 5–8 лет назад. Это популярная область, в которую вы можете попасть с небольшим количеством знаний из-за «разрыва в навыках». Программы по веб-разработке закрываются, а программы по data science появляются на их месте. Kaplan, которая купила первый лагерь по веб-рзработке Dev Bootcamp и основала лагерь по data science Metis, решила закрыть Dev BootCamp и поддерживать Metis.

Системы управления контентом являются наиболее заметными инструментами, автоматизирующими работу разработчика. SquareSpace и WordPress являются одними из самых популярных таких систем. Эти платформы значительно снижают ценность людей с навыками фронтенд-разработки. Барьер для создания и запуска сайта снизился настолько, что люди с нулевым опытом программирования успешно запускают сайты каждый день. Они не создают сайты с глубоким взаимодействие для миллиардов людей, но они создают сайта для своих компаний и клиентов. Хороший лендинг с контактами и адресом более чем достаточен для местного ресторана, бара или магазина.

Если ваш бизнес не связан с интернетом в своей деятельности напрямую, то вам проще простого завести работающий веб-сайт. В результате, однажды процветающая область веб-разработчиков для быстрого создания простых сайтов становится все менее прибыльной.

В этом контексте нельзя проигнорировать и физический аспект. Как сказал Майк Актон: «Программное обеспечение — это не платформа, аппаратное — платформа». Разработчикам стоит немного изучить компьютерную архитектуру и электротехнику. Большой переворот случится при появлении потребительского квантового компьютера, он изменит многое в профессиональном программировании.

Квантовые компьютеры пока далеки от нас, но растущий интерес к графическим процессорам и движение к параллелизации — это неминуемый сдвиг. Скорости работы процессоров остаются неизменными уже несколько лет, а за это время возникла потребность в машинном обучении. Желание работать с OpenMP, OpenCL, Go, CUDA и другими языками и фреймворками параллельной обработки данных никуда не денется и будет только нарастать. В ближайшем будущем параллелизация станет всеобщим требованием и выйдет за пределы ниш операционных систем, инфраструктуры и видеоигр.

Все учатся кодить

Веб-сайты повсеместны. Опрос Stack Overflow 2017 года показывает, что около 15% профессиональных разработчиков работают в компаниях, связанных с интернетом или веб-сервисами. Бюро статистики труда ожидает ускорение роста в веб-разработке (24% между 2014 и 2024). Благодаря видимости отрасли, многие сосредоточены на «сокращении разрыва в навыках». Лагери программирования обучают практически только веб-разработке, а онлайн-курсы по этой теме заполнили Udemy, Udacity, Coursera и другие платформы.

Комбинация роста автоматизации в веб-разработке и приток новых программистов привели к тому, что некоторые предсказывают появление рынка «синих воротничков» для разработчиков. Другие даже предполагают, что это движение к рынку “рабочих” специальностей является стратегией больших технологических компаний. Остальные, конечно, считают, что мы движемся к очередному пузырю.

Изменение спроса на определенные технологии — это не новость. Языки и фреймворки всегда то набирают силу, то теряют популярность. Веб-разработка в своей текущей инкарнации (JS — король) рано или поздно пройдет путь веб-разработки в начале 2000-х (помните Flash?). Новым является то, что многие люди изучают исключительно современные фреймворки веб-разработки. Прежде чем вы назовете себя React-разработчиком, вспомните, что были люди, которые идентифицировали себя как Flash-разработчиков. Полагаться на определенный язык, фреймворк или технологию в своей карьере рискованно. Конечно, сложно предсказать, какие технологии останутся релевантными, но если вы собираетесь пойти ва-банк, я рекомендую положиться на эффект Линди и выбрать что-то вроде C, который уже перенес испытание временем.

У следующего поколения будет такой уровень врожденной технологической грамотности, которого нет у поколения X и миллениалов. Одним результатом этого станет то, что CMS будут использоваться по умолчанию. Сами инструменты станут лучше, и молодые сотрудники будут лучше ими пользоваться. Эта комбинация определенно снизит ценность низкоуровневых навыков IT и веб-разработки, когда молодые специалисты войдут на рынок труда. Школы следуют за этим трендом, предлагая курсы программирования и информатики, и образованные ученики смогут сразу после окончания стать стажерами-программистами.

Другая большая группа потенциальных программистов включает выпускников MBA и аналитиков данных. В предложениях о работе, в которых прежде доминировал Excel, начинает использоваться SQL. Веб-метрики заменят таблицы в роли главного инструмента создания отчетов. Если это продолжится, все больше аналитиков данных будут сразу учить SQL, потому что он позволит проще экспортирования данные в таблицы.

Люди, желающие опередить своих сверстников в этих ролях, проходят онлайн-курсы для изучения баз данных и статистических языков программирования. С этими новыми навыками они смогут позиционировать себя как data scientists с навыками машинного обучения и статистических библиотек. Примером этого пути может быть программа обучения Metis.

Число людей с образованием в информатике и программировании продолжает расти. Университет Пердью сообщает, что количество заявлений на направление информатики удвоилось за пять лет. Корнелл сообщает об аналогичном росте числа выпускников по этому направлению. Этот тренд неудивителен в свете распространения ПО. Молодые люди не представляют будущего без компьютеров, поэтому хотят изучать то, что даст им уверенность в трудоустройстве.

Редкость и ожидание

В индустрии сейчас распространена идея о том, образование по направлению информатики в большинстве случаев является ненужным. Противоположная точка зрения также популярна, а некоторые даже говорят, что «все программисты должны получить степень магистра».

Как и Эрик Эллиотт, я считаю, что существует много хороших вариантов попасть в программирование, и степень бакалавра для некоторых может быть не лучшим вариантом. В то же время я согласен с Уильямом Бейном о том, что базовые навыки критически важны для долговременной карьеры, и эту информацию пока сложно найти вне университета. Ранее я писал о том, какие навыки я считаю фундаментальными для будущих инженеров, и поэтому я присоединился к школе Bradfield.

Школ программирования становится больше – и это не просто так. Вы можете многое узнать о программировании без знаний о большом «О», неясных структурах данных и деталей об алгоритмах. Иногда выпускники Стэнфорда соперничают с выпускниками Hack Reactor, но это верно только для одной или двух областей. Выпускники курсов программирования пока не работают в области встроенных систем, криптографии, безопасности, робототехники, инфраструктуры сетей или в разработке и исследовании искусственного интеллекта. Хотя эти области быстро растут.

Некоторые навыки уже превращаются из редких навыков в базовое ожидание. Понимание механизмов, вроде AWS, становится довольно распространенным. Но большие компании, развивающие технологии, обычно не ищут людей с «базовым пониманием JavaScript». AWS обслуживают миллиарды пользователей каждый день. Чтобы поддерживать такую инфраструктуру инженер должен понимать протоколы сетей, компьютерную архитектуру и иметь несколько лет аналогичного опыта работы. Как и в любой области, здесь есть любители и мастера.

Эти престижные фирмы исследуют проблемы и создают системы, которые действительно двигают границы возможного. Но они по-прежнему испытывают дефицит кадров, несмотря на то, что базовые навыки программирования достаточно распространены. Люди, которые могут писать алгоритмы для прогнозирования изменений в генах, которые дадут желаемый результат, будут очень ценными в будущем. Люди, которые могут программировать спутники и космические аппараты и автоматизировать машины, будут по-прежнему высоко цениться. Это не те области, для работы в которых достаточно «трехмесячной интенсивной программы», как в веб-разработке.

Предполагается, что молодые люди будут обладать врожденным пониманием компьютеров к 2025 году. К несчастью, распространенность компьютеров не привела к новому поколению людей, которые так же бы понимали математику, информатику, структуру сетей, электротехнику и так далее. Компьютерная грамотность не означает знание вычислений. Несмотря на то, что математика существует очень давно, по-прежнему только немногие люди обладают хорошим знанием статистики. Информатика почти так же стара, Эвклид изобрел несколько алгоритмов, один из которых используется при отправке HTTPS-запросов, но тот факт, что мы используем HTTPS каждый раз при входе на сайт, не означает, что все понимают работу этих протоколов.

Бимодальные распределения заработной платы

Во многих областях действует бимодальное распределение заработной платы: небольшое количество сотрудников зарабатывают большие деньги, а остальные получают неплохую зарплату, но не входят в верхний процент. NALP визуализирует этот феномен абсолютно понятно. Многие юристы зарабатывают между 45 и 65 тысячами долларов. Это хорошая зарплата, но мы не можем ассоциировать её с «топовыми профессионалами».

Мы думаем, что все новоиспеченные юристы стремятся месту партнера в фирме, хотя в реальности существует множество путей: помощник юриста, чиновник, общественный защитник, судья, юрист для бизнеса и т.д. У выпускников направления информатики существует столько же вариантов для профессиональной деятельности: от веб-разработки до встроенных систем.

Так как базовый уровень программирования становится распространенным требованием, я думаю, что похожее распределение возникнет и среди программистов. Всегда будет существовать группа программистов, получающих большие деньги за продвижение технологий вперед, но будет расти и количество программистов среднего уровня, которые будут обслуживать экономику. Средняя зарплата веб-разработчиков со временем будет падать, но количество профессий для программистов в общем продолжит расти.

Зарплаты мобильных разработчиков 2017: деньги, платформы, стаж и регионы

Независимо от того, в какой группе программистов вы будете находиться, карьера в технологиях означает обучение на протяжении всей жизни. Если вы хотите быть во второй группе высокооплачиваемых профессионалов, вам стоит учиться создавать машины, а не просто управлять ими.

Комментарии
Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement
Click to comment

You must be logged in to post a comment Login

Leave a Reply

Обучение

Истории разработчиков, получивших первую работу после 30, 40 и 50 лет

Куинси Ларсон, преподаватель в freeCodeCamp, собрал более 300 историй разработчиков, которые доказывают, что начинать учиться программированию никогда не поздно.

Анна Гуляева

Опубликовано

/

Почему я это сделал

Каждый день я получаю письма от начинающих разработчиков со всего мира, в которых задаётся один и тот же вопрос:

Мне __ лет. Мне уже поздно учиться разработке?

Это один из самых распространенных вопросов в разработке в целом. Чтобы показать вам, сколько разработчиков волнует их возраст, я зашёл на Quora. Конечно, я нашел людей всех возрастов, которые переживают из-за того, что они «слишком старые», чтобы учиться программированию и становиться разработчиком: 60, 59585756555453, 52, 51504948474645444342414039383534333231, 29282726252423222120191817161514.

Что вы скажете кому-то, кто переживает, не слишком ли уже поздно? Многие люди ограничатся старой цитатой Уолта Диснея: «Если вы можете представить это, вы можете сделать это!»

Но я понимаю эти переживания. Я работал учителем и не умел программировать до 30 лет. До этого возраста я не мог написать даже простой код на JacaScript. Я не мог установить Linux. Да, я даже не мог настроить роутер без помощи жены.

Я получил первую работу в качестве разработчика в 31. И, конечно, я верю, что возраст — это просто число. И что все, кто могут вложить в обучение свои силы, могут научиться программировать и получить работу.

Но как мне убедить всех этих людей, задающих этот вопрос каждый день? Просто говорить «не переставайте верить» — неэффективно.

Я собрал доказательства, чтобы убедить людей расслабиться по поводу возраста

Я знал нескольких людей, которые были старше меня, когда впервые устроились на работу разработчиком.

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

Но моих нескольких историй было недостаточно, чтобы убедить людей перестать беспокоиться. Они видели фильмы, в которых все люди моложе 30 были компьютерными гениями, а люди старше 30 не знали о технологиях ничего.

Поэтому однажды, после очередной попытки успокоить тревоги людей, я пересмотрел свой подход. Я подумал: «Возможно, я смогу найти список разработчиков, которые получили первую работ в 30, 40 или больше лет. Может быть, это убедит людей перестать так беспокоиться о возрасте».

Существовали списки разработчиков старшего возраста, многие из которых имели десятки лет опыта. Но я не мог найти списки людей, получивших первую работу в качестве разработчика. Поэтому я отправил этот твит.

Оказалось, что многие разработчики получили первую работу в 30, 40 или 50 лет. Вот несколько историй:

Я создал список из 300 разработчиков, которые начали после 30, чтобы показать, сколько людей начали переход к разработке ПО в более старшем возрасте. Я буду и дальше вести этот список. Поэтому, если вы разработчик, получивший первую работу после 30, твитните мне с хэштегом #DevAfter30, и я добавлю вас в список.

И если вы учитесь программировать позже, чем другие, не сдавайтесь. Знайте, что такое бывает часто. И знайте, что вы в хорошей компании.

Комментарии
Продолжить чтение

Программирование

50 вопросов и ответов для собеседования iOS-разработчиков: часть 1

iOS-разработчик Дурул Далканат собрал распространенные вопросы с собеседования iOS-разработчиков и, конечно, дал ответы на них.

Анна Гуляева

Опубликовано

/

1. Как настроить Live Rendering?

Атрибут @IBDesignable позволяет Interface Builder обновлять конкретные элементы.

2. Чем отличаются синхронная и асинхронная задача?

Синхронная: ждет, пока задача завершится. Асинхронная: завершает задачу в фоновом режиме и уведомляет вас о завершении.

3. Что такое b-деревья?

Это поисковые деревья, которые предоставляют упорядоченное хранилище ключевых значений с отличными характеристиками производительности. Каждый узел хранит отсортированный массив своих собственных элементов и другой массив для своих дочерних элементов.

4. Что такое объект NSError?

Существует три части объекта NSError: домен, код ошибки и словарь с пользовательской информацией. Домен — это строка, которая идентифицирует, к какой категории относится эта ошибка.

5. Что такое Enum?

Enum – это тип, который в основном содержит группу связанных значений.

6. Что такое ограничивающий параллелепипед?

Ограничивающий параллелепипед — это термин, используемый в геометрии; он означает наименьшую меру (площадь или объем), в пределах которой находится набор точек.

7. Почему мы не используем strong для enum в Objective-C?

Поскольку enum не являются объектами, мы не указываем здесь strong или weak.

8. Что такое @synthesize в Objective-C?

Synthesize генерирует методы getter и setter для вашего свойства.

9. Что такое @dynamic в Objective-C?

Мы используем dynamic для подклассов NSManagedObject. @dynamic сообщает компилятору, что геттер и сеттеры реализованы где-то в другом месте.

10. Почему мы используем synchronized?

Synchronized гарантирует, что только один поток может выполнять этот код в блоке в любой момент времени.

11. В чем разница strong, weak, read only и copy?

Атрибуты свойства strong, weak, assign определяют, как будет управляться память для этого свойства.

Strong означает, что в сгенерированном сеттере счетчик ссылок на присваиваемый объект будет увеличен и ссылка на него будет поддерживаться в течение жизни объекта.

Weak означает, что мы указываем на объект, но не увеличиваем счетчик ссылок. Он часто используется при создании родительских-дочерних отношений. Родитель имеет сильную ссылку на ребенка, но ребенок имеет только слабую ссылку на родителя.

Read only —  мы можем установить свойство изначально, но затем его нельзя будет изменить.

Copy означает, что мы копируем значение объекта при его создании. Также предотвращает изменение его значения.

Больше подробностей вы можете узнать здесь.

12. Что такое Dynamic Dispatch?

Dynamic Dispatch — это процесс выбора реализации полиморфной операции, которая является методом или функцией для вызова во время выполнения. Это происходит, когда мы хотим вызывать наши методы как метод объекта. Swift по умолчанию не выполняет Dynamic Dispatch.

13. Что такое покрытие кода?

Покрытие кода — это метрика, которая помогает нам измерять ценность наших юнит-тестов.

14. Что такое обработчик завершения?

Обработчики завершения очень удобны, когда наше приложение вызывает API, и нам нужно что-то сделать, когда эта задача будет выполнена: например, обновить пользовательский интерфейс, чтобы отобразить данные из вызова API. Обработчики завершения можно найти в API Apple, например, dataTaskWithRequest, и они могут быть очень полезными в вашем коде.

Обработчик завершения принимает код с тремя аргументами: (NSData?, NSURLResponse?, NSError?), который ничего не возвращает: void. Это означает завершение.

Обработчики завершения должны быть помечены @escaping, так как они выполняются после выполнения функции.

15. Как определить место юзабилити в дизайне?

Для этого нужно разбить процесс дизайна на четыре шага:

  • Думайте, как пользователь, а потом создавайте UX.
  • Помните, что пользователи — это люди, а не их демографические данные.
  • При продвижении приложения подумайте обо всех ситуациях, в которых оно будет полезно.
  • Продолжайте работать над удобством приложения даже после запуска.

Разница между UI и UX-дизайном

16. В чем разница между рамкой и границами (frame и bound)?

Границы в UIView — это прямоугольник, имеющий местоположение (x, y) и размер (ширина, высота) относительно собственной системы координат (0,0).

Рамка в UIView это прямоугольник, имеющий местоположение (x, y) и размер (высота, ширина) относительно элемента, в котором он содержится.

17. Что такое Responder Chain?

Responder Chain — это иерархия объектов, которые могут ответить на полученные события.

18. Что такое регулярные выражения?

Регулярные выражения — это специальные строки-шаблоны, которые описывают, как искать в строке.

19. Что такое перегрузка операторов?

Перегрузка операторов позволяет нам изменять взаимодействие существующих операторов с существующими типами.

20. Что такое TVMLKit?

TVMLKit — это связь между TVML, JavaScript и нативным tvOS-приложением.

21. Какие ограничения существуют у платформы tvOS?

Во-первых, tvOS не поддерживает браузеры, и поэтому вы не сможете использовать WebKit или другой веб-механизма рендеринга. Это означает, что ваше приложение совсем не сможет ссылаться на веб-браузер, включая веб-ссылки, OAuth или сайты социальных сетей.

Во-вторых, приложения tvOS не могут явно использовать локальное хранилище. При запуске продукта устройства поставляются с жестким диском либо на 32 ГБ, либо на 64 ГБ, но приложениям не разрешается напрямую сохранять файлы на устройство.

Бандл tvOS-приложения  не может превышать 4 ГБ.

22. Что такое функции?

Функции позволяют нам группировать серии утверждений, чтобы выпонить какое-либо задание. Как только функция будет создана, её можно использовать в коде снова и снова. Если вы находите повторяющиеся утверждения в коде, функция может стать средством от этого повторения.

Совет: хорошие функции принимают входные данные и возвращают выходные. Плохие функции устанавливают общие переменные и полагаются в работе на другие функции.

23. Что такое ABI?

ABI (двоичные интерфейсы приложения) важны, когда речь идет о приложениях, которые используют внешние библиотеки. Если программа создана для использования определенной библиотеки, и эта библиотека будет позже обновлена, то вам надо будет перекомпилировать это приложение (а с точки зрения конечного пользователя у вас вообще может не быть исходника). Если обновленная библиотека использует один и тот же ABI, то ваша программа не будет нуждаться в изменении.

24. Почему шаблон проектирования очень важен?

Шаблоны проектирования — это повторно используемые решения для распространенных проблем в создании приложений. Эти шаблоны созданы, чтобы помочь вам писать простой код, который можно будет использовать снова и снова. Самые распространенные шаблоны проектирования Cocoa:

  • порождающий — одиночка (Singleton);
  • структурные — декоратор (Decorator), адаптер (Adapter), фасад (Facade);
  • поведенческие — наблюдатель (Observer) и хранитель (Memento).

25. Что такое одиночка (Singleton)?

Такой шаблон проектирования гарантирует, что для данного класса существует только один экземпляр и что для этого экземпляра есть глобальная точка доступа. Обычно он использует ленивую загрузку для создания единственного экземпляра, когда это необходимо в первый раз.

 

Комментарии
Продолжить чтение

Программирование

10 сайтов с задачами и соревнованиями для программистов 2018

Обновленный список из 10 сайтов, на которых вы можете порешать задачи для программистов, подготовиться к интервью или просто улучшить свои навыки кодинга.

Леонид Боголюбов

Опубликовано

/

1. Coderbyte

Сложность: начинающие – среднего уровня

Задачи и туториалы по JavaScript, Python, Ruby, PHP, Java, Swift, Go, C++, C# и C. Плюс подготовка к интервью и задачи от компаний.

2. Codewars

Сложность: начинающие – среднего уровня

Двадцать языков, онлайновое решение задач и мировой рейтинг программистов.

3. CodeFights

Сложность: начинающие – среднего уровня

Аркадное программирование, турниры, интервью, программирование с ботом или наперегонки с напарником – и все это для нескольких десятков языков.

4. CodinGame

Сложность: начинающие – среднего уровня

Сайт, на котором вы обучаясь программируете игру и сражаетесь с другими программистами.

5. TopCoder

Сложность: среднего уровня – продвинутые

Алгоритмические задачи для самостоятельного решения или в соревновании с другими.

6. HackerRank

Сложность: среднего уровня – продвинутые

Задачи из разных областей кодинга, платформа найма инженеров и крупнейшее соревновательное сообщество для разработчиков.

7. LeetCode

Сложность: среднего уровня – продвинутые

Продвинутые алгоритмические задачи, требующие достаточной подготовки.

8. CodeChef

Сложность: среднего уровня – продвинутые

Индийский сайт с задачами, руководствами, соревнованиями и сообществом.

9. GeeksforGeeks

Сложность: среднего уровня – продвинутые

Собрание статей, руководств и решений. Плюс онлайновый редактор кода, в котором можно сразу попробовать написать программу.

10. Codeforces

Сложность: продвинутые

Российские соревнования и олимпиады по программированию.

Комментарии
Продолжить чтение

Программирование

Как решить задачу Google про бросание яиц со здания

Марцин Москала рассказал об алгоритмическом подходе к решению любых задач на примере задачи с собеседования в Google.

Анна Гуляева

Опубликовано

/

На собеседованиях для программистов бывает много отличных задач. Моя любимая также нравится и рекрутерам Google:

Вы работаете в 100-этажном здании и у вас есть два одинаковых яйца. Вам нужно определить наивысший этаж, с которого можно уронить яйцо и не разбить его. Найдите алгоритм, который минимизирует количество бросков в худшем сценарии развития событий.

Мы можем сделать несколько предположений:

  • Если при падении с конкретного этажа яйцо не разбивается, то оно не разобьется и при падении с более низких этажей.
  • Если яйцо не разбилось, его можно использовать снова.
  • Разбитое яйцо нужно исключить.
  • Эффект падения одинаков для всех яиц.
  • Если яйцо разбивается при падении, то оно разобьется и при падении с более высокого этажа.

Многие люди написали алгоритм для решения этой задачи (и мы напишем свой), но здесь есть простое решение.

Простой ответ

Простой способ получить минимальный этаж — начать бросать яйцо с первого этажа, потом со второго и так далее. Когда яйцо разобьется, мы будем знать, что это этаж, который мы ищем. Это надежный способ, но в худшем случае он потребует 100 бросков.

Важно заметить, что это единственный доступный алгоритм, когда у вас есть только одно яйцо. Поэтому вам нужно начать использовать его, когда вы разобьете первое яйцо.

Интуитивный ответ

Наше первое яйцо нужно использовать, чтобы разделить сто этажей на более мелкие диапазоны как можно эффективнее. Тогда первое яйцо нужно бросить с 1/n этажа, например, ⅓. Тогда алгоритм будет выглядеть так:

  • Бросаем яйцо с 33 этажа. Если оно разбивается, проверяем первые 32 этажа вторым яйцом.
  • Если оно не разбивается, бросаем яйцо с 33 + (67 * ⅓) = 55 этажа. Если разбивается, проверяем этажи 34–55 вторым яйцом.

В худшем случае для ⅓ (33, 24,…) — это 33. Так мы можем найти идеальный n, который оптимизирует количество бросков при помощи динамического программирования. Это хорошее решение, которое показывает программистское мышление, но оно не является оптимальным.

Идеальное решение

Чтобы понять идеальное решение, нам нужно понять равенство, которое используется для вычисления количества бросков в худшем случае:

Где F(n) — это следующий этаж, с которого мы бросаем первое яйцо.

Если мы введем такую переменную:

То равенство будет выглядеть так:

Оптимальным решением является такое, когда все аргументы этой максимальной функции равны. Как этого достичь? Если смотреть с конца, последним D(n) должно быть 1, потому что так мы дойдем до точки, в которой для первого яйца останется только один этаж. Тогда D(n-1) должна быть равна 2, потому что она отличается одним броском первого яйца.

Если первое яйцо в последний раз сбросить с 99 этажа, то до этого мы получим 99-2=97, 97-3=94, 90, 85, 79, 72, 64, 55, 45, 34, 22 и 9 этажи. Это оптимальное решение! Так, в худшем случае, нам нужно будет сделать 14 бросков (меньшая разница равна 13, но нам нужно сделать ещё один бросок с 9 этажа).

Проверка

Ок, у нас есть решение, и мы можем вычислить его без посторонней помощи. Время проверить его правильность. Для этого мы напишем простую программу на Kotlin. Сначала выразим, как посчитать количество бросков для какого-либо решения. Когда у нас есть 2 или меньше этажей, нам нужно сделать столько бросков, сколько осталось этажей. В ином случае мы должны использовать уже представленное равенство:

fun maxThrows(floorsLeft: Int, nextFloor: Int): Int =
  if (floorsLeft <= 2) floorsLeft
  else maxOf(nextFloor, bestMaxThrows(floorsLeft - nextFloor) + 1)

Мы использовали функцию bestMaxThrows. Это гипотетическая функция, которая возвращает количество бросков, если следующие решения идеальны. Вот как мы можем её определить:

fun bestMaxThrows(floorsLeft: Int): Int =
  maxThrows(floorsLeft, bestNextStep(floorsLeft))

Мы делегировали обязанность оптимизации следующего этажа функции bestNextStep. Она дает нам лучший следующий шаг. Мы можем определить её просто — когда осталось 2 этажа или меньше, мы бросим яйцо с первого этажа. В ином случае нам нужно проверить все варианты и выбрать оптимальный.

val bestNextStep(floorsLeft: Int): Int = 
  if (floorsLeft <= 2) 1
  else (1..floorsLeft)
        .toList()
        .minBy { maxThrows(floorsLeft, it) }!!

Эта функция использует maxThrows, поэтому у нас возникает повторение. Это не проблема, потому что, когда bestNextStep вызывает MaxThrows, она всегда вызывает ее со значением меньше, чем floorsLeft (потому что nextFloor всегда больше нуля). Перед использованием добавим буферизацию для ускорения вычислений:

val bestNextStep: (Int) -> Int = memorise { floorsLeft ->
  if (floorsLeft <= 2) 1
  else (1..floorsLeft)
        .toList()
        .minBy { maxThrows(floorsLeft, it) }!!
}

fun maxThrows(floorsLeft: Int, nextFloor: Int): Int =
  if (floorsLeft <= 2) floorsLeft
  else maxOf(nextFloor, bestMaxThrows(floorsLeft - nextFloor) + 1)


val bestMaxThrows: (Int) -> Int = memorise { floorsLeft ->
  maxThrows(floorsLeft, bestNextStep(floorsLeft))
}

fun <V, T> memorise(f: (V) -> T): (V) -> T {
    val map = mutableMapOf<V, T>()
    return { map.getOrPut(it) { f(it) } }
}

Теперь мы можем проверить, возвращает ли функция тот же результат, что мы вычислили:

fun main(args: Array<String>) {
    print(bestMaxThrows(100)) // Prints: 14
}

Хороший ответ. Проверим следующие шаги:

fun main(args: Array<String>) {
    var floor = 0
    while (floor < 100) {
        val floorsLeft = 100 - floor
        val nextStep = bestNextStep(floorsLeft)
        floor += nextStep
        print("$floor, ")
    }
}

Результат: 9, 22, 34, 45, 55, 64, 72, 79, 85, 90, 94, 97, 99, 100, как мы и вычислили.

Большая перспектива

Теперь у нас есть хороший алгоритм для решения похожих проблем. Например, мы можем немного изменить его, чтобы вычислить количество бросков в самом вероятном сценарии. Мы можем проверить, как минимальное число бросков будет зависеть от высоты здания. Вот график с ответом на этот вопрос:

Заключение

Теперь вы лучше подготовлены для собеседования в Google, но, что важнее, вы лучше знакомы с общим алгоритмическим мышлением. Этот алгоритм представляет хороший функциональный подход, который можно использовать для разных проблем в нашей работе.

Комментарии
Продолжить чтение

Наша рассылка

Каждому подписавшемуся - "1 час на UI аудит": бесплатный ускоренный курс для разработчиков!

Нажимая на кнопку "Подписаться" вы даете согласие на обработку персональных данных.

Вакансии

Популярное

X

Спасибо!

Теперь редакторы в курсе.