Нужно ли высшее образование

Нужно ли высшее образование разработчику?

На этот раз я расскажу о состоянии дел связанных с высшим образованием при устройстве на работу.

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

Мое мнение

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

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

Факты

А теперь поговорим о фактах. Когда я стал прояснять этот вопрос, среди моих коллег, то выяснил, что в моей фирме нет программистов без высшего образования. Хочу подчеркнуть, я сейчас не говорю о других IT специалистах.

Как это можно объяснить? Думаю это связано с тем, что очень малый процент людей без высшего образования интересуются программированием. Лично я, когда был школьником, заинтересовался созданием сайтов. Я пытался сам изучать HTML и CSS. Даже начал учить язык Perl, но дальше темы массивов не продвинулся. После чего благополучно забил.

Я уверен на 100%, что если бы не пошел учиться на технический факультет, то ни когда бы и не стал изучать программирование. На факультете меня познакомили с моим первым языком программирования C++. Тогда я понял, что мне нравится программировать и получается у меня неплохо. Знакомство с Java произошло не по моей воле. Нам на втором году обучения преподавали курс прикладного программирования на Java и с тех пор понеслось :). Если бы не тот второй курс, скорее всего, Java я бы не знал.

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

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

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

Мнение HR-специалистов

Я поговорил с HR-специалистами из различных фирм. И все мне отвечали практически одни и те же вещи.

Приведу их сообщения как есть, без каких либо дополнений с моей стороны. Это Вам позволит оценить отношение всей сферы IT к сотрудникам не имеющих высшее образование. Кстати, я обещал не называть имен и названий фирм. Также уверен, что данную информацию можно перенести на все пространство СНГ.

HR-специалист номер 1:

Как вы относитесь к разработчикам без высшего образования?

По-разному. Конечно по опыту скажу, что с высшим образованием все же ребята в большем приоритете.

Сколько примерно у вас разработчиков без высшего образования? И сколько всего разработчиков? Какой штат у вас в целом?   

У нас компания чуть больше 50-ти человек, и никого нет без высшего)

HR-специалист номер 2:

Как вы относитесь к разработчикам без высшего образования?

Так как занимаюсь подбором персонала я, то скажу лично свое мнение, что образование для нашей компании не имеет никакой роли. Главное, чтобы был мозг. Бывает, что человек с техническим образованием знает меньше в разработке, чем я. Возможно, человек выбрал ВУЗ по желанию родителей, а в душе он гуманитарий. Поэтому для меня корочка с ВУЗа, это просто корочка.

Сколько примерно у вас разработчиков без высшего образования? И сколько всего разработчиков? Какой штат у вас в целом?   

В компании в основном все с высшим образованием. Есть один-два человека без высшего (средне-специальное/студенты). Около 85% с техническим образованием. Штат на сегодняшний день 59 человек.

HR-специалист номер 3:

Как вы относитесь к разработчикам без высшего образования?

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

Сколько примерно у вас разработчиков без высшего образования? И сколько всего разработчиков? Какой штат у вас в целом?   

На данный момент у нас работает около 5-ти разработчиков без высшего образования и 1 тестеровщик. Также у нас работают студенты 3-5 курса, которые пока также не имеют высшего образования. Их примерно 7 человек. Всего в штате около двухсот человек.

 

Также, один мой знакомый HR-специалист, в личной переписке, озвучил свое мнение:

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

Позволю себе пояснить. По словам этого специалиста, получить приглашение на собеседование намного проще если у Вас есть высшее образование. Дальше снова ее слова:

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

 

Чтобы разбавить эту бочку дегтя медом, я в группе провел опрос. Можете тоже поучаствовать.

Я спрашивал “Вы работаете программистом. У Вас есть высшее образование (любое)?”
Из уже работающих 47% проголосовавших не имеют высшего образования.

Итог

Подведу итог. Конечно же, если у Вас есть высшее образование, то найти работу намного проще. Но факты говорят сами за себя. Наличие не профильного высшего образования или его полное отсутствие не критический недостаток. Возможно, Вам просто немного больше придется потратить времени на рассылку резюме и хождение на собеседования, но в конце концов у Вас все получится. Рекомендую заранее придумать убедительную легенду почему Вы не получили диплом. Шутливые варианты мол пробухал весь семестр и меня исключили – не прокатит. Лучше скажите, что хомяк заболел и не с кем было оставить пока он не сдох.

Дополню еще тем, что у меня был начальник имевший высшее экономическое образование. Также знаю несколько примеров Java разработчиков уровня senior, которые имели высшее образование из области иностранных языков. Один из них переквалифицировался из QA. Сейчас живет где-то в Польше и работает кажется в luxsoft.

Знакомых без высшего образования у меня нет. Но, до меня доходили слухи, что без вышки проще пробиться в большие фирмы со штатом от 1000 человек. Просто по тому, что у них очень большая потребность в разработчиках. Называть такие компании я не буду. Их немного – около 10 наверно. И их итак все знают.

Дополнение

А теперь подумайте вот о чем. Если Вам сейчас 17-18 лет и Вы твердо решили, что хотите быть программистом, то высшее образование Вас замедлит. На получение высшего образования Вы потратите лет 5 и предположим, что курсе на 3 Вы устроитесь на работу. 3-й курс это очень рано. Лично я не знаю людей, которые так рано нашли себе работу. И получаем, что Вы, с таким планом, потратили на все 3 года. Хотя большинство потратит 4, а то и 5 лет. Это я имею виду, что Вы еще пытаетесь учиться в универе.

С другой стороны, если Вы в 17-18 лет не пошли в ВУЗ, а начали учить программирование, то программистом станните за 1-2 года, в худшем случае за 3 года. И отсутствие высшего образования не сильно бы Вас замедлило. Но так можно только, если Вы чрезвычайно в себе уверены. Большинство будут учиться не эффективно или быстро сдадутся. А может Вы сапоги еще будете носить 1-2 года :)

Вот и получается, что Вам диплом только помешал. На мой взгляд, самый лучший вариант будет пойти в ВУЗ и изучать программирование и делать это так, чтобы не Вылететь. Тогда может у Вас и получится за те же 1-3 года устроиться на работу. Но такой вариант выглядит сомнительно. Не факт, что так удастся сделать. Например, я мог бы в своем ВУЗе так вилять яйцами, может в другом нет. Решать Вам!

Все.

Подробнее

HashMap часть 2

Вопросы на собеседовании. HashMap. Часть 2

Пару дней назад один мой друг сходил на собеседование в одну из Минских фирм. Там ему задали вопрос про HashMap, сейчас попробуем его разобрать. Кстати, прошлый выпуск про HashMap тут.

Предположим, что в мапку, созданную данным способом (Код 1), нужно добавить 1 миллион объектов. Что тут плохого? Давайте подумаем.

Как обычно, видос для ленивых:

Что произойдет, когда выполнится данный код? Создастся массив на 16 элементов с loadFactor = 0.75. Получаем, что после добавления 12 элементов произойдет удвоение длинны массива. Напомню, что это число получается перемножив loadFactor и текущее количество корзинок или длину массива.

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

Добавили 12. Потом эти 12 снова добавили, после увеличения массива. Грубо говоря добавили всего 24. Что получаем? В следующий раз, удвоение числа корзинок произойдет после добавления 24-го элемента, а в мапке уже 12.

Добавили еще 12 + снова перераспределение и еще 24, получаем 36.
Представляете сколько нужно будет выполнить работы, пока мы не закончим добавлять все 1 миллион объектов. Нарисовал небольшой график внизу 18 столбиков высота каждого равняется количеству добавлений и перераспределений по корзинкам при добавлении объекта под номером, который указан под столбиком.

Рис. 1. График добавления 1М объектов.

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

В каком случае может быть потерян элемент в HashMap?

После добавления элемента в HashMap, у объекта, который выступает в качестве ключа, изменяют одно поле, которое участвует в вычислении хеш-кода. В результате, при попытке найти данный элемент по исходному ключу, будет происходить обращение к правильной корзине, а вот equals (ведь equals и hashCode должны работать с одним и тем же набором полей) уже не найдет указанный ключ в списке элементов. Тем не менее, даже если equals реализован таким образом, что изменение данного поля объекта не влияет на результат, то после увеличения размера корзин и пересчета хеш-кодов элементов, указанный элемент, с измененным значением поля, с большой долей вероятности попадет совсем в другую корзину и тогда он уже совсем потеряется.

На этом все!

Подробнее

HashMap

Вопросы на собеседовании. HashMap. Часть 1

Почему я выбрал эту тему? Ее нужно знать обязательно если Вы пришли на собеседование. Не знаете = не готовы!
Ниже я перечислил наиболее популярные вопросы по этой теме. Для тех кому лень читать – можно посмотреть видос.

Расскажите про устройство HashMap?

Во-первых что такое HashMapHashMap – это ассоциативный массив. Если вкратце, то ассоциативный массив – это структура данных, которая хранит пары ключ-значения.

Чтобы было проще понять что это такое, можно представлять HashMap как пронумерованные корзинки, в которых хранятся какие-то данные (Рис. 1). При добавлении нового объекта в HashMap, мы помимо самого объекта передаем еще и ключ, по которому в дальнейшем, его можно будет отыскать.

Рис. 1. HashMap

Как по ключу можно определить положение искомого объекта? Для этого нам нужно знать hashCode ключа. Где же его взять? Все очень просто, если понимать, что в качестве ключа, может выступать любой объект в java. Все знают что класс Object реализует метод hashCode(), это означает что он будет унаследован или переопределен самим “ключом”. Т.к. все в java наследуются от класса Object. Теперь понятно откуда у ключа берется hashCode!

После того как в hashMap, был передан ключ + сохраняемый объект, специальная hash-функция вычисляет то в какую корзину отнести наши данные.

Как вы понимаете, никаких корзинок в HashMap-е нет. Вместо них есть массив, который хранит ссылки на связанные списки в которых хранятся наши данные. Каждому элементу массива соответствует один список.

Какое начальное количество корзин в HashMap?

Данный вопрос мне ни разу не задавали я его нашел на хабре. Ответ – 16. Но как и с ArrayList-ом в конструкторе можно задать другое количество.

Что такое коллизия? Способ решения коллизий.

Этот вопрос так же часто встречается. Коллизия это когда два разных объекта попадают в одну корзинку(связанный список). Причиной этому служит то, что они имеют одинаковый hashcode. Для более эффективной работы с HashMap, hashcode не должен повторяться для не эквивалентных объектов.

Как я уже упомянул выше, все данные хранятся в списках. Почему так? Почему не хранить всего один объект? Ответ прост. Все потому, что это способ разрешения коллизий. Как происходит добавление? Смотр код 1

  • Первое – мы выясняем то какая корзина соответствует ключу объекта. Затем проверяем, есть ли в ней уже какие-то объекты, если нет – то добавляем текущий. Если да, то это случилась коллизия.
  • Тогда мы начинаем сравнивать ключ и hashcode текущего объекта и тех которые внутри (если конечно их там несколько).
  • Сначала проверяем равны ли hashcode ключей.
  • Если да, то сравниваем их ключ методом equals.
  • Если equals возвращает true, значит ключи совпадают по “значению” и hashcode – производится замена, новый объект заменяет тот который уже там находится под тем же ключом,
  • Если hashcode и “значение” ключа неравны – новый объект добавляется в конец списка.

Как и когда происходит увеличение количества корзин в HashMap?

HashMap имеет поле loadFactor. Оно может быть задано через конструктор. По умолчанию равняется 0.75.  Для чего оно нужно? Его произведение на количество корзин дает нам необходимое число объектов, которое нужно добавить, чтобы состоялось удвоение количества корзин. Например, если у нас мапка с 16-ю корзинами, а loadFactor равняется 0.75, то расширение произойдет когда мы добавим 16 * 0.75 = 12 объектов. Мапка увеличивается вдвое.

Какая оценка временной сложности операций с HashMap? Гарантирует ли HashMap указанную сложность выборки элемента?

Рассмотрим сначала случай в котором нет коллизий. В этом случае добавление, удаление и поиск объектов по ключу выполняется за константное время O(1). Разумеется, не учитывается случай с расширением количества элементов. Вообще говоря, когда Вы работаете с HashMap, лучше сразу указать в конструкторе, сколько корзин нужно для работы и хорошо если оно равняется числу уникальных объектов с которыми Вы будите работать. В таком случае не придется тратить время и ресурсы на создание нового HashMap с удвоенным количеством bucket-ов. Почему такая хорошая производительность? Тут все просто. Повторюсь что коллизий нет – в таком случае нет никакой зависимости от других элементов из этой мапки. Удаление, Вставка, Поиск выполняются примерно по одной схеме. Берется HashCode ключа, вычисляется корзинка, и производится удаление, вставка или поиск. Все! Нигде не встречаются другие объекты. Но это лишь в том случае, если нет коллизий.

Теперь поговорим о случае когда коллизии все-таки присутствуют. Теоретически работая с HashMap в котором могут присутствовать коллизии, мы получаем временную сложность O(log(n)) на операции вставки, сохранения и удаления. В самом худшем случае, когда все объекты возвращают один и тот же HashCode, а значит попадают в одну корзину. На самом деле это связный список и тогда временная сложность как у LinkedList O(n).

На этом пока все. Удачи.

Некоторые источники:

Продолжение

Знай сложности алгоритмов

Структуры данных в картинках. HashMap

Подробнее