Русский
Русский
English
Статистика
Реклама

Учебный процесс в it

Пятьдесят лет на стезе программирования. Часть I. Начало пути. Отчий дом и Казанское суворовское военное училище

21.06.2021 16:11:25 | Автор: admin
Логотип статьи определяет три, как временные, так и географические, точки на моём жизненном пути, через которые лежал мой путь в страну под названием Программирование. В городе Чебоксары, на родине легендарного комдива Гражданской войны В.И.Чапаева, прошло моё детство (1954-1968 г.г.), там я закончил 8 классов средней школы 6. В 1968 году я переместился в следующую географическую точку, в г. Казань, в Казанское суворовское военное училище (КзСВУ). После окончания КзСВУ в 1971 году мой путь лежал в столицу нашей Родины в Москву, в Военную орденов Ленина, Октябрьской Революции и Суворова Академию им. Ф.Э.Дзержинского (сокращённое название ВА им. Ф.Э.Дзержинского или ВАД), которой в 2020 году исполнилось 200 лет со дня ее основания. И 22 июня в трагический для нашей страны день в 1941 году и знаковый для меня в 1976 году я окончил ВА им. Ф.Э.Дзержинского и получил диплом по специальности Программирование с присвоением квалификации военного инженера программиста:



Это случилось 45 лет назад. Но на стезю программирования я вступил ещё раньше, а именно, в 1971 году, когда после окончания КзСВУ и приехал в столицу нашей Родины поступать в ВАД. А это было ровно пятьдесят лет назад. И вот именно о том, как я попал на эту стезю и как шёл и иду по ней, и будет мое повествование. И посвящено оно моим родителям Орлову Николаю Егоровичу и Орловой (в девичестве Кулыгиной) Зое Федоровне:



I. Отчий дом


Мой выбор стези Программирования, я думаю, был не случаен. Он был обусловлен всем моим счастливым детством.
Детство моё прошло в небольшом провинциальном городе Чебоксары, населения в нём тогда было менее 100 000 человек. Семья наша была многодетной. У отца с матерью нас было четыре брата, слева направо, Гена, Юра, Вова, Серёжа:



А поскольку я был старшим, то мне приходилось много заниматься с ними.
Я подумал и получается, что моё повествование фактически о том, как люди жили в Советском Союзе. Сразу надо сказать, что наш отец, точно также как наша мама, были выходцами из простых крестьянских семей. Ниже дом, в котором родился и рос мой отец (он в центре, а перед ним я с братом Геной):



Именно из этого дома ушёл на войну мой дед Орлов Егор Михайлович и погиб под Москвой:



Мама росла без отца, а когда началась война, то на нее ушли и там погибли три её родных брата Борис, Владимир, Александр, мои дядья. И если бы не эти жертвы, то неизвестно как сложилась бы наша жизнь (если бы ещё она была).
Мои родители в Великую Отечественную войну, как сейчас принято говорить, сражались на трудовом фронте: отец работал в колхозе, а маму волей судеб занесло в Пензу на военный завод, где она стала стахановкой, чем очень гордилась.
В Чебоксары наша семья перебралась в 1954 году с Урала, где мать с отцом работали после войны на лесозаготовке и где родился я (на фотографии я в центре), а по дороге в г. Чебоксары и мой брат Гена:



Себя я помню с 3-4 лет. Особенно хорошо запомнил наши поездки в Москву в 1957 и 1958 годах. Самые яркие воспоминания посещение Мавзолея Ленина-Сталина, когда приходилось стоять в огромных очередях, берущих начало в Александровском саду, и тележки с горячими сосисками.
Первым нашим жильём в Чебоксарах была комната в бараке. Её дали маме от строящегося Чебоксарского завода тракторных запасных частей (сегодня это Агрегатный завод), куда она устроилась работать в горячий цех термистом.
Барак это обычно одноэтажное здание, чаще деревянное, с проходом во всю длину и разделённое перегородками на комнаты. Комнаты были по 12-16 квадратных метров. Туалет обычно находился во дворе, отопление было печным, а кухня общая. Вода в колонке на улице. К сожалению, мне не удалось найти фотографию именно нашего барака, но я нашел похожий:



После Великой Отечественной войны размер разрушений на территории СССР был колоссален, лишилось крова более 30 млн. человек, примерно, каждый седьмой по стране. Чернигов, Севастополь, Великие Луки, Белгород были разрушены полностью. В Сталинграде, Минске, Курске, Новгороде и многих других городах было разрушено более 90% зданий. В землянках оказались миллионы наших граждан. Строительство бараков было вынужденной и временной мерой как по расселению оставшихся без крова людей, так и по обеспечению жильем людей, прибывающих на строительство новых заводов. Так было и в Чебоксарах при строительстве Чебоксарского завода тракторных запасных частей.
Но если фотография нашего барака не сохранилась, то фотография нашей комнаты в этом бараке (и не одна) сохранилась:



Это где-то 1956-57 года. Посмотрите, какие счастливые лица у людей. На фотографии слева направо мой отец, из его подбородка выглядывает автор этой статьи, затем моя мама. Встреча состоялась по случаю приезда из Саратова брата отца с женой (пара в центре) и прихода в гости сестры мамы с мужем. Последние жили в Чебоксарах в своём доме на ул. Краснофлотской. Её сейчас нет, на её месте стоит Олимпийский стадион.
Как я уже сказал, бараки были временной мерой и уже в 1957 году мы переехали в более комфортабельное жильё, в коммунальную квартиру на Школьном проезде дом 4:



В СССР коммунальные квартиры, общежития и временные бараки были одним из основных типов жилья рабочих до начала массового жилищного строительства отдельных квартир в 1960-х, до начала строительства знаменитых хрущёвок.
Знаменитые стройки 70-х годов, такие как Нижнекамский и Чебоксарский химические комбинаты, КАМАЗ, Чебоксарская ГЭС, Чебоксарский завод промышленных тракторов (ЧЗПТ), уже возводились без бараков. Вместе с этими индустриальными гигантами вырастали современные города Нижнекамск, Набережные Челны, Новочебоксарск, а в Чебоксарах вырос Новоюжный район:



Но вернёмся в коммунальную квартиру. В коммунальной квартире уже были туалет, ванная, центральное отопление. Если мне не изменяет память, то в нашей квартире было четыре комнаты, в каждой из которых жила отдельная семья.
А поскольку родители работали, то мы часто дома оставались одни. Дверь в нашу комнату, естественно, всегда была открыта.
Однажды мы остались с братом одни и зашли с ним на общую кухню, где у каждой семьи был свой стол. Там нашли коробок со спичками. Кто-то из нас сказал, что они не настоящие и мы решили это проверить. Результат был плачевным, вспыхнула скатерть на одном из столов. Мы убежали с кухни в свою комнату. На наше счастье в одной из комнат дома была чья-то бабушка, которая одеялом потушила начинающийся пожар. С тех пор я на всю жизнь запомнил, что огонь можно потушить, накрыв источник огня, например, одеялом, и самое главное, что игры с огнём могут закончиться печально. Именно поэтому в те времени так был популярны плакаты на тему спичек и детей.
Отсюда я в 1960 году пошел в первый класс в школу 28, которая находилась на этой же улице рядом с домом. Здание школы сохранилось, но школы там нет:



Первый класс запомнился двумя знаменательными событиями. Первое, это полное солнечное затмение, когда нас вывели на улицу и мы первоклашки наблюдали как день становится ночью. А весной 1961 года я провалился под лёд в котлован, который находился во дворе школы. Надо сказать, что когда я пошёл в школу, то не умел ни читать, ни писать. Но этот недостаток скоро был устранён и чтение стало любимым моим занятием, особенно с фонариком под одеялом. Надо сказать, что вся наша семья много читала. У нас была хорошая библиотека. Я, например, зачитывался Карелом Чапеком (Средство Макропулоса, Война с саламандрами и др.) и, как ни странно, Емельяном Ярославским, его повествованием о Древнем Египте. Именно поэтому, наверное, у меня и появилась тяга к истории.
Как нам жилось в коммунальной квартире? Отвечу: хорошо. Вглядитесь в эти лица:



Они все счастливы. Я на фотографии в правом нижнем углу, мой брат Гена через одного человека левее, а за ним в белой кофточке наша мама. Посмотрите на эти лица. Сейчас вы таких лиц не найдёте.
Более того, ни у кого из них не было холодильников, но были сараи (на фотографии дома они были бы вместо забора). В этих сараях люди хранили дрова, кто-то держал кур и так распространённых в то время индюшек, а кто-то и поросят. В этих сараях рыли погреба, в которые по весне складировали лёд и которые служили холодильниками:



В первом ряду на этой фотографии два паренька в школьных фуражках это я (справа) и мой брат Гена.
В начале 70-х годов прошлого столетия мне довелось побывать в нашей коммунальной квартире. Только это уже была отдельная (я бы сказал шикарная) четырёхкомнатная квартира, в которой жила одна семья, наши соседи по коммуналке. Все остальные соседи получили бесплатно от государства отдельные квартиры и переехали в них.
Настал 1961 год, год первого полёта человека в космос. Эти человеком был гражданин Советского Союза Ю.А.Гагарин:



В этом же году наша семья в составе пяти человек (в 1960 году у меня появился второй брат Сергей) переезжает в отдельную со всеми удобствами квартиру по ул. Ярославская (сегодня ул. Энгельса, д.12, на фотографии первый дом справа):



Наша квартира была на шестом этаже (лифта не было) и как мы этим гордились. В те годы в Чебоксарах мало кто так высоко жил. Но самое главное было то, что весь первый этаж был отдан под Станцию Юных Техников (СЮТ). Сразу скажу, что сегодня этой станции там нет, и все помещения занимают коммерческие предприятия. И вот в один прекрасный день, уже учась во втором классе, я открыл дверь, переступил порог СЮТ и попал в волшебный мир. Меня приветливо встретили и провели по всей станции. Ребята (правда, они были постарше меня, я учился во втором классе) собирали модели кораблей и самолетов, строили планеры, печатали фотографии, а кто-то показывал фильмы. Глаза разбежались. В итоге я записался практически во все кружки: фото, авиа- и судомодельный. Записался и на курсы киномеханика. На курсах киномехаников нас учили крутить фильмы на кинопроекторе Украина.
Всё было абсолютно бесплатно. Как я успевал? Мне повезло, что СЮТ была в доме, в котором я жил, и школа 16 была рядом, в двух минутах ходьбы.
Я до сих пор с гордостью рассказываю, что уже во втором классе получил первое удостоверение киномеханика. Был случай, когда в клубе оказалось некому показать фильм Степан Разин. И тут моё удостоверение пригодилось. Пригодилось оно и в дальнейшем, когда в школе необходимо было демонстрировать учебный материал на Украине (видеомагнитофонов и компьютеров тогда не было).
А как народ сбегался смотреть, когда мы запускали в небо планеры, а тем более кордовые модели!
СЮТ была хорошей школой, она мне многое дала. Стацию юных техников я прекратил посещать после того, как мы переехали на новое местожительство.
А еще мне посчастливилось встречать в Чебоксарах в 1962 году Космонавта-3 А.Г.Николаева:



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



В момент следования кортежа я находился в первом ряду около детского мира (на фотографии второй дом справа от левого верхнего угла) и один из мотоциклов своим колесом проехал по моему ботинку. Вот такие воспоминания. Жизнь просто бурлила.
Мой отец всю жизнь гордился, что тоже был причастен к полёту А.Г.Николаева в космос. Где-то за месяц до полёта бригаду плотников, в которой работал и мой отец, отправили в командировку (они такого слова не знали) в глухую чувашскую деревню.
Оказалось, надо срочно построить дома для простой чувашской старушки. Никто ничего не понимал, но дом был построен, а вскоре и секрет открылся, это был дом для матери Космонавта-3.
В 1961 году у меня появился еще один брат, третий Юра.
А весной 1964 года мною была предпринята первая попытка пойти учиться в суворовское военное училище. Как я уже говорил, я много читал, в том числе и про суворовцев. В те времена военно-патриотическое воспитание было на высоте. Я знал, что в суворовские военные училища (СВУ) берут после четвертого класса. Со мной в классе учился мальчик, чей отец был летчиком-испытателем и погиб при испытании самолёта. Мы с ним дружили и хотели вместе идти в СВУ. Но именно в 1964 году было принято решение о приёме в СВУ только после восьмого класса. Наша детская мечта была отложена на целых четыре года.
В этом же 1964 году мои родители получили трехкомнатную квартиру на улице В.И.Чапаева, д.11. Эта улица знаменита тем, что стоит на месте деревни Будайки, в которой родился В.И.Чапаев знаменитый комдив времен Гражданской войны. На том месте, где стоял дом семьи Чапаевых, сегодня стоит такой монумент:



Надпись на мемориальной доске гласит:
Здесь стоял дом, в котором 9 февраля 1887 года родился В.И.Чапаев

После переезда пришлось сменить и школу. Теперь я посещал школу 6, которая тоже находилась недалеко от дома. Но, перестав ходить на СЮТ, я стал посещать в школе баскетбольную секцию и секцию самбо в спорткомплексе Динамо. На баскетбольном поприще мне врезался в память мой бросок с середины поля с попаданием в кольцо противника, когда мы играли на первенство города. Это было что-то. А в самбо также врезался в память финальный поединок на первенство города, когда я мог выиграть схватку на ковре, проведя болевой приём на локте соперника (рычаг локтя). Однако я так и не смог до финального гонга разорвать сцепленные в замок кисти рук противника.
Отдельно стоит сказать о шахматах. Муж сестры отца Николай очень хорошо играл в шахматы:



Они часто приходили к нам в дом, порой с ночёвкой. Именно они подарили мне шахматы и, самое главное, привили любовь к ним. Каждый их приход к нам начинался с игры в шахматы и не просто игры, а игры с разбором. И вот наступил момент, когда Николай мне сказал:
Всё, больше я тебе ничего здесь дать не могу. Ты превзошёл своего учителя
Кстати, всех сестер отца и младшего брата я звал по именам. Таково было их пожелания. Меня они всегда считали за равного. Это здорово.
А в начале 1968 году в Будайках, недалеко от нашего дома, был открыт Дом Спорта Спартак (его можно увидеть на фотографии ниже). И вот как-то, проходя мимо него, я увидел на доске объявлений, что проводится запись для участия в квалификационном шахматном турнире II разряда. Турнир организовывал и проводил международный мастер по шахматам В.Д. Сергиевский. Имя Сергиевского в те годы гремело в Чебоксарах и я следил за его успехами. А успехи у него были. В 1966 году он стал чемпионом России по шахматам, занял шестое место на мемориале М.И.Чигорина, выиграв в турнире и у будущего чемпиона мира Б.В.Спасского. Именно на мемориале М.И.Чигорина Сергиевский выполнил норматив международного мастера по шахматам.
Когда я увидел фамилию Сергиевский, сомнений у меня не осталосьи я вошёл в Дом Спорта записываться на турнир. Турнир я провёл хорошо, занял второе место. Победитель турнира, юноша старше меня года на 2-3, был значительно сильнее меня. Но надо иметь в виду, что я всё же был самоучкой. По условиям турнира за первое место давали II разряд, а за второе III разряд. Итак, я стал третьеразрядником по шахматам и, как окажется чуть позже, будет иметь свои последствия. По ходу турнира был курьёзный случай. Одну из партий я играл с мальчиком, который был младше меня года на четыре, но он занимался у самого Сергиевского и подавал большие надежды. До встречи со мной он у всех выигрывал, но мне проиграл. И тут случилось непредвиденное, он расплакался навзрыд, его никто не мог успокоить. В итоге ко мне подошёл сам Сергиевский и попросил меня переиграть партию. Для меня это было очень неожиданно: в шахматах переиграть партию Но Сергиевский нашёл какие-то слова и я согласился. Я думаю, Сергиевский всё же пожалел о своём поступке, паренёк снова проиграл. Я не помню сейчас, на каком месте он закончил турнир, но я своим вторым местом горжусь.
Отец мне с раннего детства привил любовь к периодической печати, к газетам и журналам. Родители мне выписали сначала газету Пионерская правда, где печаталась книга А.Волкова Урфин Джюс и его деревянные солдаты. О, как я ждал прихода газеты, чтобы прочитать продолжение!
Потом я их уговорил выписать журналы Юный техник, Техника молодёжи.
В пятом классе я увлёкся радиоделом и пришла очередь журнала Радио.
Откуда пошла тяга к радиоделу или, как сейчас сказали бы, к электронике, я не помню, но увлечение было серьёзное. Сначала детекторный приёмник, потом приёмники прямого усиления, потом супергетеродинный радиоприёмник да ещё с приёмом коротких волн. Вместо корпуса мыльница. Апофеозом стал магнитофон, где самое трудное было собрать лентопротяжный механизм, и миниатюрный телевизор. Последнее осталось незаконченным, хотя была разработана схема и изготовлена печатная плата. Проблема была в отсутствии кинескопа, электронно-лучевой трубки малого размера. Но когда я дома отремонтировал телевизор, мой авторитет в глазах родителей вырос до небес.
Вершиной нашего радиолюбительства я считаю создание радиосети в вашем квартале, которую можно было бы считать нашим детским прообразом современного Интернет. Нас было человек шесть, увлечённых радиоделом. Все мы увлекались радиолюбительством, собирали усилители, радиоприемники, ремонтировали телевизоры и т.д. Самое главное, обменивались новыми схемами и радиодеталями, которые было трудно достать. Главная проблема была в оперативной связи между собой. Телефонов ни у кого не было и приходилось чуть что, бежать друг к другу. Все мы жили в пределах одного квартала (6-й квартал, ул. Чапаева, г. Чебоксары) в новых пятиэтажках (как сейчас говорят в хрущевках). И вот кому из нас пришла идея: а почему бы нам не организовать радиосвязь между собой?! Нет, не собрать радиостанции, с этим было очень сложно. Нет, не собрать, а получить разрешение. И вот что мы придумали. Пробрасываем по крышам с дома на дом провода (не могу вспомнить, где же мы их взяли), каждый дома ставит усилитель, обзаводится микрофоном, присваиваем каждому позывной (про логин, естественно, тогда никто и не знал) и общаемся. Включаешь усилитель, берешь микрофон и говоришь, например: Первый, первый, вызывает пятый. Ответь. И заработало:



Более того, таким образом, мы на весь квартал включали музыку. Все было хорошо.
Но однажды, когда я был дома один, раздался звонок в дверь. Нет, звонили не сотрудники КГБ, в дверь звонил участковый милиционер. Он вежливо спросил, что это за провода идут с крыши соседнего дома к нам на балкон (мы жили на четвертом этаже фото). Пришлось ему все рассказать. Он попросил продемонстрировать, как все работает, и я связался с одним из своих товарищей. Больше всего его интересовал микрофон. В это время была просто напасть срезали телефонные трубки в телефонных будках, как правило, ради того микрофона и динамика. Но у меня был настоящий микрофон. Я как-то познакомился с главным инженером ДОСААФ (Добровольное Общество Содействия Армии, Авиации и Флоту), он взял над нами шефство и помогал радиодеталями. Так что никаких претензий ко мне и нашей группе у участкового не возникло. Он даже похвалил, что интересным делом занимаемся, а не бесцельно по улицам болтаемся. Еще добавил, что телефонные будки надо беречь. После того, как в 1968 году я уехал учиться в КзСВУ, то, приезжая в отпуск, всегда смотрел на наши провода и иногда даже пользовался этой связью. Но прошло несколько лет и в очередной приезд я увидел, что изоляция на проводах разрушается. Я дернул провода и они оборвались. Так перестала существовать наша сеть (ещё не вычислительная). Так заканчивалось моё детство.
Как я учился? Учёба мне всегда давалась легко. Я был твёрдый ударник и блистал в математике. В этом была большая заслуга нашей учительницы по математике Гавриловой Анны Порфирьевны. Но у меня было, как я говорю до сих пор, три недостатка: у меня отсутствует (или не развит?) музыкальный слух, я не умею танцевать, не пою, и еще я не умею рисовать. При этом я люблю музыку, с удовольствием хожу на концерты, люблю живопись и архитектуру. Эти недостатки не давали мне возможности быть круглым отличником. Да я и не стремился:



О том, что хорошая учёба нужна, прежде всего, мне и только мне, я усвоил уже в первом классе, когда принёс домой двойку. Я имел беседу с отцом, который сказал, что им с мамой некогда заниматься с нами, да и образования у них нет для этих занятий, и что моё будущее только в моих руках. Это был урок на всю жизнь. С тех пор мне было стыдно приносить в дневнике не то что двойки, а и тройки. Двойки и колы я всё приносил, но это были оценки не за мои знания, а так учителя пресекали мои подсказки и шпаргалки на уроках.
На родительские собрания отец никогда не ходил. А мама очень редко. Но один раз они пошли вместе на собрание. С чем это было связано не помню. Это был шестой-седьмой класс. Причём отец надел костюм с галстуком, осеннее пальто, шляпу.
Я стоял в подъезде на лестнице со своим товарищем Толей Ганиным, с которым мы вместе занимались радиолюбительством, когда в подъезд вошли мои родители, возвращающиеся после собрания. Отец шёл довольный, но увидев нас с Толей, сразу стал мне выговаривать: с кем ты дружишь, со шпаной какой-то, двоечником и т.д. Да, Толя не блистал в учёбе и был, как тогда говорили, хулиганом, рос без отца, но в радио разбирался хорошо и был верный товарищ. Вообще нас было трое, я, Толя и Саша Никитин. И каково было моё удивление, когда в разговор вмешалась моя мама. Она сказала, обращаясь к отцу, чтобы он сейчас же прекратил. А дальше сказала то, что я запомнил на всю жизнь, если ты доверяешь сыну, то доверяй и его друзьям. Если твой сын не может сделать плохого, то и друзья его это не сделают. Отец удивлённо и молча всё это выслушал и позвал всех домой пить чай. Инцидент был исчерпан. А Толя Ганин стал частым гостем в нашей квартире. В школе на собрании меня, как правило, всегда хвалили, а вот Толе доставалось от классного руководителя. Но зато я разглядел ещё одну сторону своих родителей.
Я заканчивал восьмой класс. Большинство из нашего класса уже решили, что покидают школу и идут кто в техникум, кто работать, кто в художественное училище, а я собирался в девятый класс. Но в один день всё перевернулось. Однажды, когда прозвенел последний звонок, в класс вошёл классный руководитель и попросил всех мальчиков задержаться, девочкам тоже не возбранялось остаться. В класс вошёл военный (я тогда не разбирался в званиях) и стал рассказывать про суворовские военные училища. И тут во мне всё всколыхнулось и я вспомнил свой четвёртый класс. Всё в одну минуту было решено, я иду в суворовское военное училище. Сразу после рассказа я подошёл к офицеру и расспросил, что нужно делать. Он рассказал, куда и когда подойди, какие документы принести и т.д.
Самым сложным было объявить своё решение дома. Когда о своём решение я сказал, то ни у кого не возникло даже мысли, что я могу не поступить. Мама расплакалась, как ты там, а как мы здесь без тебя и т.д. Но потом все успокоились и было решено, что я поступаю. Был ещё отбор в военкомате, была медкомиссия, были самые настоящие проводы в армию, на которых собрался практически весь мой класс, все родственники и даже моя учительница математики. К сожалению, фотографии с этих проводов нет. Но есть фотография моих проводов в академию им. Ф.Э. Дзержинского после окончания КзСВУ, на ней все те же лица, включая Гаврилову А.П. (вторая слева и слева от меня), которая привили мне любовь к математике:



Обилие овощей, солений, салатов, яблок на столе заставили вспомнить, что мои родители в 1957 году получили участок в 6 соток в садовом товариществе Заря. С тех пор все выходные летом, как правило, проводились, как гордо говорили мы, на даче:



На фотографии третий слева это я, а центре мои родители. Вообще дача в советские времена, а для многих и сейчас, была существенным подспорьем в семейном бюджете.
И ранним июльским (или июньским?) утром 1968 года я и ещё несколько мальчишек взошли по трапу на теплоход на подводных крыльях Ракета, который должен был умчать нас в светлое будущее:



Из взошедших по трапу на борт теплохода Ракета, окончить суворовское училище посчастливилось только четверым: Володя Орлов, Саша Усов, Саша Кленин и Ордяков.

II. Казанское суворовское военное училище


Через пару часов нас встречала Казань. А спустя ещё немного времени мы входили на территорию КзСВУ:



По приезде в КзСВУ нам дали несколько дней на подготовку к экзаменам. Экзамены мы сдавали по математике и русскому языку. Сдавали и письменный экзамен и устный. С этим проблем не оказалось. И мне объявили, что я зачислен в училище. Но был ещё и пятый экзамен, вернее, не экзамен, а собеседование по иностранному языку. Это было связано с тем, что в суворовских училищах в те времена изучению иностранных языков предавали серьёзное значение. По окончанию училища можно было получить удостоверение военного переводчика.
В училище велось обучение на двух языках: английском и французском. В школе я учил английский язык, и у меня была твердая четвёрка. Каково же было моё удивление, когда на собеседовании мне сказали, что у меня нулевые знания и что я буду учить французский язык. Удивление было, но расстройства не было. Учить французский язык язык Великой Французской революции, Парижской Коммуны! Что может быть лучше!,- думал я. А еще вспомнилось, как в пятом классе я очень хотел учить испанский язык, язык свободный Кубы, язык, на котором разговаривали Фидель Кастро и Че Гевара. И здесь мне казалось, что французский язык намного ближе к испанскому, чем английский. К французскому языку мы ещё вернёмся чуть ниже.
Я был зачислен в 3 взвод 7 роты (на фотографии третий ряд снизу, восьмой справа). Командиром роты был подполковник Харченко Б.К. (второй ряд снизу, шестой справа), а командиром взвода майор Беседин А.Г. (второй ряд снизу, четвертый справа):



На фотографии наш командир ещё в звании майора. Подполковника он получит чуть позднее, в октябре 1968 года.
Начальником Казанского суворовского военного училища был генерал-майор Смирнов А.П., участник Великой Отечественной войны, участник Сталинградской битвы. Мне на всю жизнь запомнились его слова, звучащие как напутствие:
Посеешь поступок пожнёшь привычку.
Посеешь привычку пожнёшь характер.
Посеешь характер пожнёшь судьбу
Сколько раз по жизни мне приходилось видеть подтверждение этих пророческих слов.
Когда экзамены были позади, когда мы получили форму и удостоверения суворовцев, было ещё одно собеседование, на этот раз на спортивную тему. Меня спросили, занимался ли я спортом и каким, я рассказал что занимался в баскетбольной секции и в секции самбо, а также получил III разряд по шахматам. Мне сказали, что баскетболист из меня с моим ростом так себе, а борцов в училище хватает. А вот то, что у меня разряд по шахматам, это здорово. Меня включили в группу шахматистов, которые после занятий, а также в выходные дни ходили в Дом Офицеров в шахматную секцию. Это, конечно, было что-то, у всех трехмесячный карантин без права выхода в город (без увольнительных), а ты имеешь это право выхода. А навыки самбо, естественно, пригодились на занятиях по рукопашному бою.
Но моя спортивная эпопея имела продолжение. Пришло время сдавать нормативы по ВСК (военно-спортивному комплексу). Это аналог комплекса ГТО (Готов к Труду и Обороне).
После забега на дистанцию 100 метров меня подзывает к себе преподаватель капитан Дергоусов Ю.И. и спрашивает, где я занимался бегом. Мой ответ, что это мой первый забег на 100 метров, его очень удивил. В этот момент мне было 15 лет, время я показал 12 секунд и бежали мы на стадионе по гаревой дорожке в обыкновенных кедах. С этого момента я стал тренироваться на спортивной дорожке. Пришлось мне выступать и на центральном стадионе г. Казани. Но особенно запомнился выигрыш нашей команды майской легкоатлетической эстафеты, посвященной Дню Победы (я в первом ряду третий слева):



Немножко было обидно, что нам за первое место выдали Кубок, а за второе и третье места участникам команд выдали спортивные костюмы. Но посмотрите на наши лица мы все счастливы.
Если говорить о физической подготовке, то надо всё же сказать и о лыжах. Когда наступала зима, мы начинали бегать на лыжах 5 и 10 километров и бегаешь до тех пор, пока не выполнишь норму II разряда. У нас во взводе был Серёжа Лазарев (на фотографии он на переднем плане, а я справа), родом из г. Сочи:



При этом у него были определённые успехи в легкой атлетике. Например, в высоту он брал 175 сантиметров. Но вот лыжи ему не давались, до училища он ни разу не становился на лыжи. Парень он был упёртый (в хорошем смысле этого слова) и с утра до ночи ходил и ходил на лыжах, а мы ему помогали. И он выполнил норматив. После училища он отказался от военной карьеры и в итоге стал парапсихологом, мало в чём уступающим Чумаку и Кашперовскому. Написав о Сергее, я вспомнил случай, произошедший со мной в училище. Как-то я прогуливался по нашему парку и вдруг как наяву вижу, как у моего родного брата Сергея лопается аппендицит. Я остановился как вкопанный. Что делать, как сообщить домой? Сотовых телефонов тогда не было. Да что сотовые, обыкновенные телефоны были ещё редкостью! В итоге, я решил, что это просто блажь, а через три дня (именно столько шли письма из дома в училище) получил письмо от родителей, в котором они сообщали, что у Сергея вырезали гнойный аппендицит, хорошо, что скорая помощь приехала быстро и успели отвести его в больницу. Может, мне тоже надо было в экстрасенсы податься?
Надо сказать, что все офицеры училища имели отличную физическую подготовку. Вот несколько примеров. Начальник училища генерал-майор Смирнов выезжал вместе с нами зимой в лагеря, вместе с нами рыл в заснеженном поле окопы и бросался вместе с нами в атаку вслед за танком. При этом он часто рассказывал, что именно отменная физическая подготовка спасла его от гибели под Сталинградом. Рассказывал он так, показывая рукой на левую грудь, где у него был шрам: когда сердце сжалось, в грудь вошла пуля, которая пролетела мимо сердца. После того как пуля вылетела, сердце разжалось и он продолжил бой.
Или наш ротный подполковник Харченко Борис Кузьмич. Как-то кто-то из нас что-то натворил и в воспитательных целях была объявлена тревога (дело было летом в летних лагерях и в 30-градусную жару). Рота была построена в полной выкладке (скатка шинели, автомат, противогаз). После этого прозвучала команда одеть противогазы и начался марш-бросок на 3 километра. Наш командир роты бежал вместе с нами и при этом следил, чтобы никто не снимал противогаза. Можно сказать, что это жестко, но мы так не считали. И какое было удовлетворение, когда мы это сделали и нас распустили. Можно много рассказывать, а ещё лучше написать отдельную книгу.
А теперь вернёмся к французскому языку. Обучение велось в хорошо оборудованных лингафонных кабинетах по группам. В каждой группе было не более 12 человек. Мне хорошо запомнилось первое занятие. Наше первое занятие началось с того, что преподаватель Милорадовская Е.А. предложила надеть наушники и послушать текст с пластинки. Я тоже внимательно слушал, но смог, как мне казалось, понять только два слова: Илья и Баку. И когда меня преподаватель спросила, о чём шла речь на пластинке, я ответил, что про какого-то Илью, приехавшего или жившего в Баку. Меня ждало разочарование. Оказывает Баку это не Баку, а beaucou в смысле много, а Илья тоже не Илья, а предложение il a в смысле он имеет. Так началось мое изучение французского языка. Учили нас прекрасно. Вообще мы стремились учиться, была какая-та хорошая состязательность. У меня был спарринг партнёр (если так можно выразиться) Серёжа Оглоблин, с которым мы соревновались, кто больше из нас получит отличных оценок за день, неделю и т.д.:



Сергей окончил училище с золотой медалью. А меня подвёл русский язык, несмотря на все старания нашего любимого преподавателя Смирновой Ноны Владимировны. Каждый день задавали выучить наизусть несколько страниц текста. Мы сами стремились пополнить свой словарный запас. Ряд предметов (например, астрономия, география) нам давали не на русском языке, а на том языке, который изучаешь. Естественно, была иностранная литература и военный перевод. В итоге, я выпустился из училища с удостоверением военного переводчика:



Помимо удостоверения переводчика я получил водительское удостовение и даже охотничий билет. К взрослой жизни по окончании КзСВУ я был готов, мог работать киномехаником, водителем и даже переводчиком.
Были и другие и комические, и трагические, и трагикомические случаи. Тут нашлась одна из моих записных книжек (дневник), там много чего интересного есть.
Первый мой отпуск домой в декабре 1968 года мог завершиться трагедией. Вместе со мной поступил в КзСВУ еще один юноша Кленин Саша, сын одного из офицеров Чебоксарского военкомата. Кстати, впоследствии он был участником той победной эстафеты (на фотографии второй справа в первом ряду).
Так вот, отец Саши Кленина на зимние каникулы прислал за ним машину ГАЗ-69 (газик/козлик), в которой приехали его мама и мой отец. Это было неожиданно и приятно.
И вот мы впятером отъехали от училища в сторону Чебоксар, а перед самым выездом из Казани решили пообедать в придорожном кафе (стекляшке, как их тогда называли). После обеда, удобно устроившись в машине, тронулись в сторону Чебоксар. Но мы не проехали и ста метров, как вдруг, кувыркаясь, полетели в кювет. Что же произошло? Был яркий солнечный и морозный день. Только что прошел снегопад. А вслед за снегопадом пошли грейдеры, которые расчистили не только дорогу, но и сравняли с дорогой кювет. А обрыв был приличный. И водитель, не подозревая этого подвоха, чуть-чуть прижался к правому краю дороги и мы полетели вниз. Первое, что я запомнил, это крик моего отца (машина лежала на крыше):- Володя, ты жив? Когда я откликнулся, он сумел выбраться из машины и вместе с водителем помог выбраться с заднего сидения и нам. Зрелище было печальное, машина лежит на крыше, лобового стекла нет, а у нас все лица залеплены осколками стекла. Но никто ничего не сломал, никто не порезался и кроме синяков никаких увечий никто из нас не получил. А наверху, на дороге, уже остановилось несколько машин и среди них был подъёмный кран. Когда стоящие наверху люди поняли, что с нами всё нормально, то стали думать, как нас вытащить. Решение было простым, кран опустил стрелу, водитель подцепил машину и её вытащили. Мы выбирались сами по заснеженному откосу. Оказалось, что машина на ходу, завелась с полоборота. Встала дилемма, ехать дальше в Чебоксары, но нет лобового стекла, на улице 20-градусный мороз и скоро начнёт темнеть. Либо где-то искать возможность достать и вставить стекло. Сколько на это уйдет времени неизвестно. Не забывайте на дворе 1968 год, Мы решили ехать в Чебоксары. А поскольку стекла не было, то ехали медленно. У Саши Кленина стали замерзать ноги. Как сейчас помню, как его мама всю дорогу их отогревала у себя на груди. Но худо-бедно мы добрались до Чебоксар. Мы с отцом поднялись на четвёртый этаж и позвонили в дверь. Дверь открыла мам и тут же присела, увидев нас, только и сказала:- Что с вами? Наши лица были синие, сплошной синяк. Но стол был накрыт, бульон для пельменей кипел. Жизнь продолжалась.
В суворовском училище нам, естественно, запрещали употреблять спиртные напитки и курить. Причём, наш взводный майор Беседин А.Г. говорил так:- Лучше выпить сто грамм водки, чем выкурить сигарету. Сам я курить начал только в 20 лет. Но любители побаловать сигаретой у нас во взводе были. И вот как-то утром после завтрака, но перед занятиями два моих товарища Андрей Николаев и Игорь Шишов, дают мне ключ от туалета, в котором шёл ремонт, и просят их закрыть там минут на десять, что я и сделал (третий слева я, четвёртый Игорь Шишов и пятый Андрей Николаев):



Но случилось непредвиденное я забыл про них. Удивительно и то, что за весь день, пока они сидели в туалете, никто про них не вспомнил. Ведь, когда начинались занятия, дежурный всегда докладывал преподавателю о наличии личного состава. И вспомнил я о них, когда рота строилась на вечернюю поверку. При выходе на них было жалко смотреть. Это я о вреде курения.
Был и неприятный случай, связанный с водкой. Однажды в расположении нашей роты нашлась бутылка с водкой и никто не хотел сознаваться, чья это бутылка. А поскольку в город мог свободно в рабочие дни (помните шахматы, Дом Офицеров) мог ходить только я, то волей неволей тень подозрения пала и на меня. Но спустя несколько дней отцы-командиры всё же разобрались кто и что. Этим человеком оказался суворовец, у которого были проблемы и с успеваемостью. В итоге он был отчислен из училища. Фамилию его называть не буду, но он есть на предыдущей фотографии и это не я.
Пить и курить запрещали, а жениться нет (при достижении 18 лет). И у нас был трагический случай. Один из суворовцев встречался с девушкой и она забеременела. Суворовец оказался не тот и отказался жениться на ней. Девушка бросилась под трамвай. К счастью (хотя о каком счастье может идти речь) она осталось жива, но без ступни. Суворовца отчислили, отправили служить в армию. Это о том, что за свои поступки надо отвечать.
Расскажу ещё один поучительный случай (а таких случаев было много). Летом мы выезжали в лагеря и жили в палатках:



Там, в лагерях у нас проходила и топографическая подготовка. На одном из занятий командир взвода майор Беседин раздал нам топографические карты, предупредив, что они секретные, и поставил всем задачу: какой маршрут пройти, что найти и т.д. Перед выходом на маршрут все карты мы сдали командиру. Но оказалось, не все. Когда я вернулся с маршрута, то увидел бледного своего командира, который первым делом спросил, не брал ли я карту с собой. Тут я узнал, что одной карты не хватает. Тот, кто имел дело с секретным делопроизводством, понимает, о чём идет речь. Но в итоге карта нашлась, один из нас, самый умный, взял карта с собой на маршрут в надежде, что это поможет ему лучше пройти маршрут. Оказалось, не помогло, он пришёл одним из последних, но нервы командиру потрепал. С тех пор я знаю цену секретному делопроизводству. Случались неприятные случаи и при обращении с оружием. Например, однажды наш первый стрелок кандидат в мастера спорта выпустил очередь из автомата перед носком сапога командира роты подполковника Харченко Б.К., когда тот шёл вдоль бруствера окопа, в котором с автоматами наизготовку находились мы, проверяя готовность нас к стрельбе по мишеням.
Приятными моментами нахождения в летних лагерях были заготовка берёзовых веников для отцов командиров и ловля карасей трёхлитровыми банками. Не обходилось и без самоволок до ближайшего посёлка Дербышки на танцы.
Суворовское училище было только ступенькой во взрослую жизнь. Надо было думать, кем же я хочу стать? В 1968 году выходит фильм Мертвый сезон, а в газете Комсомольская правда публикуется серия статей о советских разведчиках, если мне память не изменяет, об Абеле и Киме Филби. В 1969 году произошли кровавые события вокруг острова Даманского на Дальнем востоке. Как мы все рвались туда, на Даманский. Я решил для себя, что должен стать разведчиком. Всё шло к тому, что так и будет. Командир роты и командир взвода знали о моём заветном желании. Когда началась учёба в 11 классе, меня вдруг вызвали на собеседование. Как я потом узнал, пришла разнарядка в Приволжский военный округ на два места в высшую школу КГБ. Просмотрено было 600 (шестьсот) кандидатов и выбор пал на меня и еще одного суворовца, у которого отец служил в Комитете. Я был счастлив. Но когда в суворовском училище узнали, что я согласился идти в высшую школу КГБ, началось что-то для меня непонятное, преподаватели стали отговаривать. Кто говорил, что надо идти в академию связи, кто в академию химзащиты, кто в Можайку и т.д. И все говорили, что я зарываю свой талант, кто в математике, кто в физике, кто в химии и т.п. Но я стоял на своём и проходил различные комиссии. Однажды приехал ко мне отец и как обычно остановился у родителей Андрея Николаева. Его родители преподавали в ветеринарном институте, отец был профессором, мать доцентом (по крайней мере, так у меня отложилось в памяти) (слева на право моя мама, мама Андрея Николаева, Андрей, мой отец, внизу мой брат Сергей) и дружили с моими родителями:



И вот, когда я пришел к ним в гости и мы все сели за обеденный стол, опять поднялся разговор о том, где мне дальше учиться. Николай Сергеевич, отец Андрея, сказал: Представляешь, Володя, пройдет время и ты окажешься вот также за столом, но как только ты сядешь за стол, все замолчат и ты почувствуешь себя очень неуютно. И сейчас ты не горячись, а подумай хорошенько. Когда мы остались с отцом вдвоём, он мне сказал: Володя, а может они правы, они же грамотные люди в отличие от нас с матерью, может, правда не стоит туда идти. Эта была последняя капля. Я сказал, что хорошо, я откажусь от предложения учиться в вышке, но куда я пойду, пока не знаю. Потом у меня состоялся тяжелый разговор, тяжелый для меня, что я не оправдал оказанного мне доверия, с направленцем, который курировал отбор кандидатов в вышку. Мне кажется, он понял меня и когда он спросил, а кто, если не я, то я, не задумываясь, назвал Сережу Оглоблина. Так и случилось, Сергей пошёл вместо меня. Позже в Москве мы с ним встречались, а потом потерялись.
Надо было решать куда идти. Была мысль податься в медицинскую академию им. С.М.Кирова, то тут на глаза в газете Красная Звезда попалось объявление о наборе слушателей в Военную Академию им. Ф.Э.Дзержинского. Я срочно написал туда письмо с просьбой прислать условия приёма. И мне пришла бандероль с буклетом и программой вступительных экзаменов. Надо сказать, что в училище никто ничего не знал про эту академию. Но для меня всё было решено. Это учеба в Москве, есть факультет связи и радиоэлектроники, и самое главное это название им. Ф.Э.Дзержинского, где-то рядом с моей мечтой о подвигах разведчика. Да, о подготовке программистов там не было ни слова. Да я ещё и слова такого не знал. Меня опять стали отговаривать, но я уже не обращал внимания. Предпринял попытку меня отговорить и наш командир взвода майор Беседин А.Г. Он говорил следующее: Володя, у меня товарищ служил на острове Земля Франца Иосифа, там, куда продукты питания завозят раз в полгода. И вот настал момент, когда ему удалось вырваться оттуда и поступить именно в академию Дзержинского. Каково же было его разочарование, когда после окончания академии его снова направили на этот остров. Я не знал, что академия им. Ф.Э.Дзержинского готовил ракетчиков. Но теперь уже ничто меня не могло заставить сменить решение. Перед самым окончанием училища наш преподаватель математики Егорова Л.Ф. сказала, что сразу после выпускного начинаем готовиться к экзаменам. Но я ответил, что сразу после выпускного еду к родителям, а оттуда в академию. К поступлению я готов. Мне показалось, что её обидел мой отказ. Но в итоге я оказался прав.
В один из последних дней пребывания в училище вдруг ко мне подходит суворовец из соседней шестой роты, золотой медалист Женя Арсентьев. Он спросил: Это правда, что ты едешь в академию Дзержинского? Получив положительный ответ, он предложил идти в академию вместе. Оказалось, что его родной старший брат преподает в академии химию, имеет воинское звание полковник и ученую степень доктора наук. Мы договорились встретиться у академии, дай бог памяти, числа 30 июня 1971 года. Я всё ещё не знал, что с сентября 1971 года в академии начинается подготовка военных инженеров-программистов
Сейчас я понимаю, что у меня было три реперных точки, которые привели меня на стезю программирования: поступление в КзСВУ, отказ от учебы в высшей школе КГБ и встреча с Женей Арсентьевым. Но самое главное, это те глубокие знания, которые я получил в Казанском суворовском военном училище. Огромное спасибо нашим педагогам:



Перед выпуском из КзСВУ нас переодели в новенькую парадную курсантскую форму, выдали проездные, предписания и мы убыли во взрослую жизнь.

III. Поступление в Военную академию им. Ф.Э.Дзержинского


По дороге в ВАД я на несколько дней впервые в курсантской форме заскочил к родителям домой:



Но отпуск летом 1971 года был чисто символическим. И уже через несколько дней меня провожали в аэропорт на самолёт до Москвы. Отец настоял как всегда (за что я ему глубоко благодарен) на общей фотографии:



И вот я уже в Москве стою у КПП (контрольно пропускной пункт) академии им. Ф.Э.Дзержинского, жду Женю Арсентьева:



На этой фотографии ещё слева видна гостиница Россия. Подошёл Женя и сказал, что брат предложил пожить пару дней у него дома, пока в академии всё устаканится с приёмом абитуриентов. В Москве я был в самом раннем детстве в далёких 1957-58 годах. Поэтому для меня всё было вновь. Как оказалось, многое и для Евгения. Всё началось у нас с ним с комического случая. Когда мы приехали в дом брата Жени, то надо было подниматься на лифте (до этого на лифте я ездил раз-два и то на один-два этажа). Здесь надо было подниматься повыше. Когда мы вошли в лифт, то пол, естественно, но не для нас, опустился. Мы нажали нужный этаж и поехали, но тут кто-то из нас предложил давай подпрыгнем! И мы сделали это. Как результат, лифт остановился. Вокруг никого. Что делать, не знаем. На наше счастье минут через тридцать мимо проходила старушка, увидев нас, запричитала, опять сломался. Сейчас я вызову лифтера. Пришёл лифтер, открыл дверь и мы выползли (именно выползли) из лифта. Никто и не подумал, что это мы по своей провинциальной безграмотности сломали лифт. Вечером из академии вернулся полковник Арсентьев, мы поужинали и он сказал:-
В академии открыт новый факультет, на котором будут готовить специалистов по программированию.

Что это такое он толком не понимает, но чувствует, что за этим стоит большое будущее и его нам совет держать путь на второй факультет на специальность Программирование. Но если младшему Арсентьеву как золотому медалисту требовалось только его желание, то мне еще предстояло сдать экзамены.
Через три дня я прихожу в академию и начинаю искать приёмную начальника II факультета. Заблудиться в коридорах академии не составляет труда. И тут навстречу мне идет курсант в повседневной форме, сапоги блестят, форма отутюжена и самое главное с суворовским знаком. Мне показалось, что этот курсант учится здесь уже не первый год и я обратился к нему за помощью, спросив, куда и как пройти. Это сейчас я сразу вспоминаю Фросю Бурлакову из кинофильма Доживём до понедельника, а тогда этот курсант всё уверенно мне рассказал и показал и мы расстались. Каково же было моё удивление, когда на письменном экзамене по математике (я уже по традиции собирался сдавать работу и выходить из аудитории) меня кто-то потрогал сзади по плечу. Я оглянулся и увидел того курсанта, который так толково мне всё объяснил. Он меня попросил не сдавать работу, не уходить и помочь решить его задачу. Я выполнил его просьбу. Николай Гудим (на фотографии он слева), именно так его звали, в итоге тоже поступил в академию:



Мы с ним учились в одном отделении. Он стал старшиной курса (сержантом), а я заместителем командира взвода (младшим сержантом). Но об этом в следующей части. В итоге я сдал все экзамены отлично:



Всего в 1971 году было набрано два отделения программистов, которые с сентября 1971 года начали обучение по этой специальности. А еще было три отделения, где готовили инженеров по эксплуатации электронно-вычислительных комплексов.
На фотографии ниже моё отделение (я третий слева во втором ряду снизу, Коля Гудим второй справа во втором ряду сверху):



IV. Послесловие к первой части


После окончания академии наши пути с Колей Гудимом разошлись. Но спустя шесть лет, после того как я послужил в ГРУ (так или иначе, но я следовал своей мечте), защитил в 1982 году диссертацию по системам управления распределёнными базами данных в той же Дзержинке, мы с ним встретились в 4-м Центральном научно-исследовательском институте Министерства Обороны (4 ЦНИИ МО). Но об этом речь пойдет в следующей части:



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

История о том, как я иду к должности JS разработчика через обучение на курсах в Skillbox

21.06.2021 14:12:41 | Автор: admin

Как пришел я к тому чтобы вообще начать учить JS

В 2019 году, 1 сентября, в дождливый осенний день, я решил навсегда завязать с прошлым. Последние 5 лет работы менеджером не приносили удовольствия и не несли перспектив. Увольняюсь с должности менеджера вино-торговой компании, подумал я. И погружаюсь в программирование!

Три месяца до декабря я упорно изучал HTML + CSS и верил, что легко попаду в разработчики, стоит мне только захотеть! Каким же большим было моё разочарование, когда я понял что в этом мире не все так просто. Первое тестовое задание я получил от компании Тензор это была разработка игры на чистом JavaScript либо с применением любого фреймворка:

  • Angular.js;

  • Vue.js;

  • React.js;

Что вы думаете? Конечно я не смог написать и строчки, точнее строчку я конечно написал, одну или две. Но в функции не умел и не понимал как объединять код. Всё сказал я себе, иду изучать программирование на курсы, так как самостоятельно я ничего не добьюсь. Я слишком мало понимаю. Мне нужны менторы, задания, последовательность обучения.
Поиграть в морской бой можно тут.

Морской бой тестовое задание в ТензорМорской бой тестовое задание в Тензор

Мой первый купленный курс

В Феврале 2020 года, работаю курьером в пиццерии. Мечтаю о ноутбуке что бы параллельно кодить. Всем рассказываю про свой путь. Но все еще одинок в этом.

Принимаю решение вложить 13 тысяч рублей в курсы по верстке сайтов. Стоит сказать что такую смешную сумму, мне пришлось просить разбить на 4 платежа по 3 250 рублей. Ибо в додо я делал 20 тысяч в месяц максимум.

Моя морда на работе в феврале 2020Моя морда на работе в феврале 2020

К тому моменту, я имел за спиной 1 2 кривых пет-проекта по верстке, но основ все еще не понимал до конца. На курсе познакомился с такими инструментами как: HTML, CSS Bootstrap, SASS Git, Gulp Autoprefixer, Pixel perfect, БЭМ JavaScript, Ajax, PHP

Нужно сказать что было крайне интересно и не сложно. Хорошая подача материала и трудолюбие сделали свое дело. Но почему-то дальше все мое продвижение встало мертвым грузом. Как будто я застрял и не знал как выбраться, как продолжить увеличивать знания?! Основные ошибки новичка (на моём опыте).

Ошибка 1 Не закреплял полученные знания

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

Ошибка 2 Дал слабину, расслабился

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

Ошибка 3 Начал искать новую информацию для изучения не имея четкого плана

Еще 3 месяца я читал, пытался кодить, изучал JavaScript. Но не по учебнику или по плану, а просто так, хаотично, без примеров и задач, чаще просто смотря видео. А без базы понять что такое prototype или методы перебора массивов было почти нереальной задачей.

Ошибка 4 Мало теории, еще меньше практики

Просмотр видео 2 раза в неделю, без четких целей и совсем не понимая о чём речь, при этом совсем почти не повторяя код. Не делая пет-проектов и не закрепляя знания.

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

Книга по JS для начинающихКнига по JS для начинающих

Вот я и на полпути к мечте! подумал про себя и начал искать работу снова

Редактирование резюме, вставка парочки кривых учебных проектов и подача на все вакансии в своем городе. Из 30 откликов 25 игноров, 3 отказа и 2 тестовых задания. Два тестовых задания были мне не по зубам и я честно признаться, сразу писал что-то типа:

Прошу меня простить, но я еще видимо не дорос до уровня чтобы выполнить этот тест и вернусь к Вам, как только у меня появится понимание как решать.

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

Олицетворения меня как трусаОлицетворения меня как труса

Я же поступал как удобно мне. Ведь я был вынужден где-то работать. У меня ребенок, кредиты, я как обычный среднестатистический человек устаю в течении дня и приношу домой копейки чтобы хватало на оплату еды, жилья и дешевых вещей. А тут вечером нужно еще позаниматься JavaScript + верстка, а лучше React поучить и всякие там видеоуроки посмотреть (обязательно с практикой). Одним словом не до тестовых заданий, особенно которые не знаешь даже как решать.

Все эти мысли натолкнули меня на очевидный вывод. Рано куда-то рыпаться, необходимо учиться дальше. А прошел уже год как я принял для себя решение изменить свою жизнь. На работу не связанную с кодом я уже даже смотреть не мог. Спал и видел, как в кругу разработчиков я самый отсталый, но счастливый и замотивированный делаю легкие задачи, которые не интересны остальным. И я погнал учиться! Как вы думаете куда? В Skillbox.

Сразу скажу это не реклама для Skillbox, это лично мое мнение

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

Это junior с задатками team lead! Наш мальчик! Браво!.

Мой пыл спустя восемь месяцев подостыл, но я все еще фигачу и двигаюсь дальше. Кто знает, может я действительно поеду защищать диплом в МСК.

Несколько выводов для сомневающихся:

  • покупка курса в кредит (точнее в рассрочку) не сделала меня более мотивированным. Однако, у меня появился структурированный материал по стеку Frontend по которому я в свободное время мог теперь двигаться и не тратить время на поиск инфы;

  • общение с преподавателем не супер дружеское конечно, но присутствует. Если вы просите фидбек по примерам, задачам или домашней работе вы его получаете;

  • чат таких же сокурсников как вы, в телеграмм, где можно спросить, подсказать или просто увидеть, что сложно не только вам, или что кто-то уже впереди;

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

Моя шкала прогресса Моя шкала прогресса

Как лучше проходить курс на Skillbox по моему мнению

Сложно сказать однозначно. Типа так делай, а так не делай. Ведь все мы разные. Кто-то обладает 12 часами свободного времени в день и тонной мотивации. А кто-то только 1 час вечером и абсолютно без сил.

Но скажу следующее. Важно ежедневно, от 30 минут до 2 часов (хотя бы) заниматься каждый день.

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

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

  3. Алгоритмы третий день у вас пусть пройдет в просмотре и понимании алгоритмов, крутая и нужная вещь. Расставляет по местам знания, которые не усваиваются. В моем случае даже домашек нет. Просто смотри, вникай, наслаждайся!

  4. Фреймворк тут на ваше усмотрение какой выбрать. Главное начинайте освоение хотя бы после прохождения основ.

Представим что у вас 30 уроков в каждом разделе. При ежедневных вложениях по чуть-чуть, уже через 90 дней вы сможете сделать от 30% до 50%. А это всего 3 месяца. Еще 3 месяца и можно приступать к фреймворкам.

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

Мотивация на результатМотивация на результат

В процессе обучения мои амбиции росли и я вместе с ними.

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

У вас есть личный менеджер подбора персонала. Который раскидывает ваше резюме по вакансиям, на которые вы просите это сделать. А резюме составляете, конечно вы сами. По рекомендациям. Если уделить время и не стесняться, то получится грамотный и интересный такой дайджест про вашу личность. Делайте по гайдам и модернизируйте!

Представьте, вам звонят днем, вы поднимаете трубку с незнакомого номера телефона, а там:
Добрый день, это HR компании войтиВайти, ваше резюме нам прислали из центра подбора персонала компании Skillbox, вас рекомендовали как разработчика и так далее.
Помню когда получил первый раз такой звонок, чуть не выпал в осадок. Хорошо стул был неподалеку. К сожалению, у меня не вышло устроиться пока что никуда.
НО отмечу, что я прошел 8 собеседований. Выполнил несколько тестовых заданий, вспотел на нескольких технических интервью. С вопросами про reduce, map, filter, работу с объектами и про жизненный цикл компонент (и массу чего еще).

Получил ссылки на книги которые лучше бы прочитать. Получил ссылки на источники которые лучше бы изучить.

Вот и фидбек. Получается я стал и стану еще опытнее и умнее. А получилось бы это если бы я ничего не делал. А просто пытался учиться самостоятельно? Не знаю.

Напишите в комментариях что вы думаете по этому поводу!?

И вот в очередной раз, я убедился, что нужно сделать паузу и углубиться в обучение, а не в тестовые задания. Тратить время на изучение моего любимого JSa с добавками React и приправами Redux. А не серфить просторы инета в поисках сладких вакансий.

Вот я и на Хабре, благодаря обучению и постоянному желанию поймать свою первую компанию за хвост и устроиться Junior разработчиком.
Здесь научился заполнять аккаунт таким образом, чтобы быть не привлекательным, а техничным. Смешно, конечно, когда смотря на резюме Senior разработчика, там написано только знание 2-3 технологий и нет волшебных слов, которые можно скопипастить себе в профиль.
Но главное писать то в чем ты точно разбираешься. Я так и сделал! Жаль что Junior специалистов ищут крайне редко, в наше время. Сейчас скорее возможно устроиться middle. Но это другая тема для следующего разговора.

В итоге мое резюме выглядит следующим образом:

Резюме мое первая страничкаРезюме мое первая страничка

Как это все организовало меня как личность и изменило в лучшую сторону

В итоге, друзья, две попытки устроиться куда-либо показали, что порог входа в IT-индустрию на 2021 год серьезно так подрос!

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

Между нами говоря. я как будто очень медленно двигаюсь. Учусь, пишу что-то, читаю книги, но движение все равно медленное! Проанализировав все что делаю и делал, понял, видимо мало реализовал пет-проектов, мало практики. Нужно больше!

Сейчас план такой:

  • делать 1 пет-проект в неделю, чтобы их было больше. Это плюс для работодателя понять мой уровень, а для меня, набить руку на практике;

  • изучать алгоритмы 1 в неделю, с закреплением на практическом примере;

  • читать 10 страниц в день разнообразных книг по JavaScript, таким образом если 1\10 от всей информации прилипнет это уже победа;

  • 1 метод в неделю изучать, усваивать и закреплять на примере.

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

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

Изучая React по гайдам Димыча IT-kamasutra путь самурая, в каком то 6 или 8 выпуске, в комментах нашел инстаграм не равнодушного человека изучающего JS + React. Попав к нему на канал телеграмм, познакомился с ребятами из разных уголков мира и все хотят что то уметь, и умеют в чем-то больше меня, а в чем-то меньше.

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

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

Спасибо Андрею из Питера за помощь в освоении сложных моментов и Тимуру из Владикавказа за легкое менторство. Это очень ценно парни!

Учусь писать на ReactУчусь писать на React

Точно не пожалел о своем пути

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

Я уверен, что важно не сдаваться! В любом случае нас неминуемо ждет успех если очень долго и упорно идти к цели. И если ежедневно уделять этому время!

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

Тогда еще в 2019 году я задался целью, изучать JavaScript минимум три года. И только после этого времени оглянуться и спросить себя на верном ли я пути?! Знаете, в нашем мире сегодня все достается очень быстро. Кредит пожалуйста за 15 минут. Пицца доставка от 30 минут. Телевизор доставим на дом.

Мы привыкли, что все чего бы не захотели, достигается быстрым путем. И это ошибка. Ведь скорость и доступность создает в нас иллюзию простоты. И когда у нас что-то не получается быстро, мы расстраиваемся и бросаем начатое. Я же готов еще 3 года положить на изучение Frontend. Сразу сегодня, готов продлить данное себе же обещание!

Радость за успехРадость за успех

На протяжении трех лет, все неудачи или успех не принесут мне каких-то плохих эмоций, ведь я не жду результата быстро! Я понимаю, все сложности на моём пути это нормально, ведь я учусь. А это не так быстро. И тогда плохие эмоции не трогают меня. А успехи заряжают и приободряют!

Продолжайте учиться каждый день, друзья.

Продолжайте делать, даже когда не понимаете.

Продолжайте стараться, даже когда нет сил.

И мы вместе однажды достигнем результата ради которого начинали.

Подробнее..

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

02.06.2021 14:09:29 | Автор: admin

JetBrains поддерживает образовательные программы для разработчиков в лучших университетах страны. Мы предоставляем экспертную и финансовую помощь разным направлениям в НИУ ВШЭ, Университете ИТМО, СПбГУ, МФТИ, НГУ и ЛЭТИ. Но несколько программ особенные, они реализуются в тесном партнерстве с компанией. JetBrains участвует в формировании учебного плана, подбирает преподавателей, выплачивает студентам спонсорские стипендии, помогает с организацией практик и стажировок.

В преддверии приемной кампании в вузы рассказываем о наших самых ближайших партнерах бакалаврских программах Современное программирование в СПбГУ и Прикладная математика и информатика в петербургском кампусе НИУ ВШЭ.

Занятие у Александра ХраброваЗанятие у Александра Храброва

Современное программирование появилось на рынке образования Петербурга в 2018 году. Прикладная математика и информатика формально открылась в Питерской Вышке также в 2018 году, но фактически переехала из Академического университета, где реализовывалась с 2014 года.

Программы имеют довольно много общего:

1. Тесное партнерство с индустрией

В реализации обеих программ принимают участие ведущие IT-компании. Учебные планы регулярно обновляются в соответствии с потребностями индустрии. Программистские курсы читают разработчики, а математические действующие ученые и заслуженные преподаватели: Денис Москвин, Александр Храбров, Даниил Березун, Богдан Бугаев и др.

2. Индивидуальный подход

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

3. Проектная деятельность

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

4. Обратная связь

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

5. Кураторы

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

6. Стипендии

JetBrains выплачивает студентам спонсорские стипендии до 15 тысяч рублей в месяц. Также с этого года будут введены дополнительные стипендии для студентов-участников школьных международных олимпиад IOI и IMO. Так, члены сборных получат по 10 тысяч рублей в месяц, а медалисты от 15 до 25 тысяч рублей в месяц в зависимости от уровня награды. Стипендия присуждается на два года первый и второй курсы университета.

Если обе программы такие классные, как же тогда выбрать, куда поступать? Расскажем про особенности каждой из программ.

Программа Современное программирование МКН СПбГУ

Особенности программы: Несмотря на высокий конкурс, набор на программу по-прежнему небольшой всего 30 бюджетных и 5 платных мест. Делается это для того, чтобы, с одной стороны, уровень поступающих был равномерно высоким, а с другой чтобы уделять каждому студенту как можно больше внимания. Например, проводить студентам регулярные ревью кода, принимать лично решения математических задач, выезжать всем набором на природу. Всё это создаёт особую камерную атмосферу, в которой студенты всех курсов, преподаватели и организаторы свободно общаются и вместе формируют свою образовательную программу. Со многими студентами СП можно пообщаться в соцсетях.

Вторая особенность программы тесное слияние с практикой разработки и живой наукой. Преподаватели МКН не только преподают, они работают в той области, о которой рассказывают и ставят студентам актуальные задачи на практических занятиях и в семестровых проектах. Прямо на факультете проходит много научных событий, в которых можно участвовать по желанию: семинары, встречи со специалистами, воркшопы и конференции. Студенты участвуют ассистентами в проведении олимпиад (ММО 2020 и 2021), на программах МКН в Сириусе (зимняя научная школа и майская проектная смена), и при желании смогут оказаться в самом центре Всемирного конгресса математиков 2022.

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

Программа СП делает акцент на преподавание различных языков и стилей программирования, что позволяет студентам свободно себя чувствовать в любой сфере ИТ и не бояться выйти за пределы традиционных подходов. В обязательных дисциплинах программы студенты изучают и используют такие языки программирования как Kotlin, Python, C/C++, Assembler, Haskell, Prolog, Go, а в рамках дисциплин по выбору также имеют возможность познакомиться с языками Java, Scala, C#, Rust, Javascript и PHP. Поближе познакомиться с учебным планом программы можно здесь.

Преподаватели: Александр Куликов, Виталий Брагилевский, Евгений Линский, Михаил Сенин и другие. Плейлист с представлениями всех курсов первого семестра от лекторов по ссылке.

Как поступить: Для абитуриентов доступны две траектории поступления:

  1. По ЕГЭ. Нужно сдать математику на 76 и более баллов, информатику на 75 и более, русский язык на 55 и более баллов. Учитываются индивидуальные достижения, подробнее о правилах приема: joinmkn.ru/rules.

  1. Без вступительных испытаний по результатам олимпиад: Всероссийской олимпиады школьников по математике, информатике, физике и астрономии, а также олимпиад РСОШ из списка, доступного по ссылке.

Количество мест: 30 бюджетных и 5 платных.

Где проходят занятия: Все пары проходят в центре Санкт-Петербурга на Васильевском острове. Общежитие квартирного типа (Дом студента) расположено там же, в двадцати минутах ходьбы.

Полезные ссылки:

Факультет математики и компьютерных наук СПбГУ объединяет три бакалаврские программы: кроме СП, это программа Математика, возникшая на базе исследовательской лаборатории им. П.Л. Чебышева, а также программа Науки о данных, поддерживаемая компанией Яндекс. Студенты разных направлений часто пересекаются за время учебы, помогая друг другу формировать широкий кругозор и изучать разные варианты карьеры.

Программа Прикладная математика и информатика в НИУ ВШЭ Санкт-Петербург

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

не в теории, а на практике. В первый же год студенты проходят двухсеместровый курс по C++, семестровый курс по Python и Unix, большую часть полуторагодового курса по алгоритмам и структурам данным. Также с самого начала обучения студентов погружают в проектную деятельность. На первом курсе все работают над учебными проектами на С++, на втором пишут на Java или Kotlin. О некоторых проектах можно почитать в блоге факультета на Хабре: анализатор C++, приложение для визуализации аттракторов, гексагональные шахматы, футболка с контролем осанки.

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

Следующая особенность программы это специализации на старших курсах. Сейчас студенты могут выбрать одно из пяти направлений: машинное обучение, промышленное программирование, теоретическая информатика, теория языков программирования и биоинформатика. В каждой специализации есть обязательные дисциплины (например, для машинного обучения это Базы данных, Методы оптимизации, Численные методы, Deep learning, Обработка естественного языка, Анализ изображений и Глубокое обучение с подкреплением), но часть предметов студент выбирает самостоятельно или вместе с научным руководителем. Полный список дисциплин есть на странице.

Еще одна особенность, характерная для всей Высшей школы экономики майноры. Если кратко, это дополнительное направление обучения, которое не должно совпадать с мейджером основным направлением (в нашем случае, это прикладная математика и информатика). Майнор изучается на втором и третьем курсе бакалавриата, состоит из четырех последовательных дисциплин. Например, студенты могут изучать предпринимательство, UX-дизайн или бизнес-коммуникации. Со следующего года все майноры в Вышке станут общекампусными, т.е. студенты могут учиться у ведущих преподавателей из Москвы, Нижнего Новгорода или Перми. Многие майноры читаются на английском языке. Полный каталог майноров для 2020/2021 года.

И последняя, но одна из самых приятных особенностей: набор в Питерской Вышке больше, чем в СПбГУ, что делает программу более доступной для абитуриентов, поступающих по результатам ЕГЭ. Если же все бюджетные места займут абитуриенты с БВИ, Вышка традиционно добавляет 25% мест за счет собственных средств для поступающих по ЕГЭ.

Преподаватели: Александр Омельченко, Сергей Копелиович, Егор Суворов, Тимофей Брыксин, Алексей Шпильман, Иван Ямщиков и др.

Как поступить: Тут также две траектории поступления:

  1. По ЕГЭ. Нужно сдать математику и информатику на 75 и более баллов, русский язык не менее, чем на 60 баллов. Проходной балл в 2020 году 297 за три экзамена.

  2. Без вступительных испытаний по результатам олимпиад. Подробная информация о льготах, доступных олимпиадникам, есть на странице.

Количество мест: 60 бюджетных и 40 платных.

Где проходят занятия: Все занятия проходят в новом корпусе университета по адресу ул. Кантемировская, д.3А, в десяти минутах на транспорте от Петроградской. Студенческое общежитие расположено на улице Герасимовской, в получасе езды от корпуса университета.

Полезные ссылки:

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

Подробнее..

Как я дважды пытался, но ни разу не смог получить высшее ИТ-образование в российской провинции

15.06.2021 16:19:06 | Автор: admin
Пензенский Государственный УниверситетПензенский Государственный Университет

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

Творец из "7В"

Начал программировать я еще в школе. На уроках информатики в седьмом классе я познакомился с Turbo Pascal. Программирование практически сразу же стало моей страстью, меня очаровывала приобретенная мною власть над компьютером. Я чувствовал себя почти что Богом - я мог собственноручно создавать из ничего целые системы, работающие согласно моему, как мне тогда казалось, исключительно гениальному замыслу. И первым делом я сделал то, что сделал бы на моем месте любой другой семиклассник - я взялся за создание собственной RPG-игры "World of Plus", которая должна была стать убийцей популярного тогда World of Warcraft.

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

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

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

Атлант не хочет учиться

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

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

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

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

Первая попытка - Пензенский Государственный Университет

Мой путь к становлению инженером-программистом начался 1 сентября 2012 года на центральной площади города Пензы, названной, как это принято в российских провинциальных городах, в честь вождя Великой Октябрьской революции Владимира Ленина, чьи слова "Учиться, учиться и еще раз учиться" обрели бессмертие в сознании любого постсоветского человека и грели душу новоиспеченного студента в тот волнительный осенний день.

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

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

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

Лекции по программированию на C у нас вел действительно разбирающийся в своем деле преподаватель, ведь помимо собственно преподавания он работал программистом в местной ИТ-компании. Как я помню, он был единственным, кто действительно понимал предмет, которому учил. Но ничего кроме краткого введения в синтаксис C мы от него не получили.

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

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

  • Средний возраст около 60 лет.

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

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

  • Полное незнание английского - lingua franca современной науки и индустрии, а следовательно отсутствие знакомства с мировыми образовательными и индустриальными стандартами. Даже преподавательница английского языка была очень далека от хорошего знания английского.

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

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

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

Я продержался в этом университете всего около года...

Начало работы

Выход от бессмысленности обучения в университете я нашел в своего рода эскапизме - по вечерам после возвращения из университета я учился разработке Android-игр на почившем ныне движке AndEngine.

Первую свою игру я выпустил в паре с бывшим одноклассником. Он рисовал графику, а я программировал логику. Игра называлась Strawberry Tower - игрок должен был построить башню из коробок, чтобы поставить на ее вершину кубок и собрать клубничку.

Strawberry towerStrawberry tower

Следующей игрой стал платформер Speedy Flyer, в котором игрок управлял двумя червяками, синхронно летящими в космосе, и должен был уворачиваться от препятствий. Издателя для игры я нашел на Хабре, им стал автор популярных тогда Android-игр @coder1cv8

Speedy FlyerSpeedy Flyer

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

Speedy Flyer 2Speedy Flyer 2

Эти любительские проекты помогли мне найти работу в небольшой местной геймдев-студии, которая занималась разработкой игр для социальных сетей. Их самым популярным проектом была игра для маленьких девочек "Аватария", я же попал на разрабатываемую с нуля онлайн-стратегию под названием "Королевства".

Несмотря на то, что мой тимлид несколько раз умолял директора уволить меня, а сам директор впоследствии зарекся нанимать малолеток, они не без труда но научили меня писать хороший код - после каждого код-ревью моих пулреквестов меня заставляли перечитывать от корки до корки книгу Боба Мартина "Чистый код" и делать выводы из совершенных мною ошибок.

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

Осада замка в игре КоролевстваОсада замка в игре Королевства

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

Вторая попытка - Пензенский Государственный Технический Университет

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

Но что касается именно специализированных программистских дисциплин там царил такой же мрак, как и в предыдущем университете, а количество левых предметов и абсурда зашкаливало за любые разумные пределы. Программирование ограничивалось простейшими программами на C, преподавательница предмета "Базы данных" никогда не слышала про существование нереляционных баз, плохо знала устройство реляционных и SQL за пределами простых селектов. Преподавательница психологии выпрашивала взятку за экзамен, преподавательница английского делала ошибки в элементарных словах и грамматических конструкциях, предмет "Основы ведения бизнеса" вела бывшая преподавательница марксизма-ленинизма, и даже существовал предмет "Основы пенсионного обеспечения".

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

Замена формального образования

Реальные знания мне приходилось получать параллельно "учебе" в университете. Основными источниками стали только набирающие в то время популярность Coursera и Udemy.

На Coursera я получил базовые теоретические знания по алгоритмам, структурам данных, функциональному программированию. Особенно я благодарен курсу Мартина Одерски по программированию на Scala. Именно этот курс по-настоящему научил меня писать простой и эффективный код. На Udemy же я приобрел более практические навыки по конкретным языкам и технологиям. Эти два ресурса заменили мне формальное образование и дали знания достаточные для построения успешной карьеры в ИТ.

Бессмысленность и беспощадность провинциального ИТ-образования

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

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

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

Подробнее..

Бесплатная Школа наставников для разработчиков, тестировщиков и аналитиков стартует 5 июля

04.06.2021 12:23:32 | Автор: admin
Школа наставников это онлайн-интенсив из 5 занятий, где обучают будущих наставников сервиса онлайн-образования Яндекс.Практикум.

Наставники это опытные IT-специалисты, которые отвечают на вопросы студентов и проводят воркшопы по особенно сложным темам курса. Специалисты совмещают наставничество с основной работой, в зависимости от курса это занимает от 6 до 12 часов в неделю. Это оплачиваемая занятость.



Наставники это как преподаватели в университетах?


Нет. Это не та система онлайн-образования, где преподаватель разрабатывает программу, проверяет работы студентов и проводит вебинары. У нас наставники помогают студентам преодолевать сложности в обучении: общаются со студентами в Slack, объясняют сложные темы, проводят групповые вебинары и поддерживают мотивацию.

Кроме наставников у студентов в Практикуме есть целая команда сопровождения на протяжении обучения:

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

Подробно о том, чем занимаются наставники можно почитать в посте Наставничество в IT: растём сами и помогаем расти другим.

Или посмотрите доклад руководителя факультета backend-разработки Сони Техажевой Наставничество, или как вернуть огонь в свои отношения с программированием (с 4:15:00).


Зачем Практикуму нужны наставники со стороны? Почему нельзя обойтись силами специалистов Яндекса?


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

Какие требования есть к наставникам?


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

Все наставники проходят Школу наставников: мы обучаем их перед тем, как они начинают общаться со студентами, и снабжаем всеми материалами.

Как происходит отбор в Школу наставников?


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

Как выглядит и сколько времени занимает Школа наставников?


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

В Школе наставники отрабатывают типичные образовательные ситуации и получают обратную связь. Вы научитесь работать с потребностями студентов и их мотивацией.

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

Всем, кто успешно пройдёт Школу, мы предлагаем работу наставником.

Подробности


Наставничество можно совмещать с основной работой, оно занимает от 6 до 12 часов в неделю. Вознаграждение от 35 до 50 тысяч рублей в зависимости от курса и потраченного времени.

Прямо сейчас мы ищем наставников на направления:

  • Java-разработчик
  • Go-разработчик
  • Python-разработчик
  • Мидл фронтенд-разработчик
  • Инженер по автоматизации тестирования
  • Аналитик данных
  • Специалист по Data Science
  • Дизайнер коммуникаций
  • Менеджер проектов в IT

Старт новой Школы наставников 5 июля 2021 года. До этого необходимо оставить заявку и выполнить тестовое задание.
Подробнее..

Рабочее место в кафе, улучшение фотографий и команды для хакатонов выпускные работы наших студентов

10.06.2021 20:10:36 | Автор: admin

2 июня прошли защиты выпускных проектов у студентов образовательных проектов Mail.ru Group. Ребята шли к этому моменту два года, и последний семестр был почти полностью посвящен реализации этих идей. Свои работы в защищали 8 команд из Технопарка (МГТУ им. Н. Э. Баумана) и 3 из Технополиса (СПбПУ им. Петра Великого). Все они реализовали разные проекты, объединенные одной целью улучшить жизнь людей с помощью технологий.

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

TeamUP Online как найти лучшую команду


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

Существующие решения больше похожи на маркетплейсы для хакатонов. Они решают проблему для организаторов: тот покупает лицензию, и быстро создает мероприятие. Но для участника подобного решения нет. Команда Фиксики решила поставить интересы хакатонщиков в приоритет. В их проекте TeamUp человек может просто указать хакатон, в котором хочет попробовать свои силы, и быстро подобрать себе команду по духу.



Поиск здесь работает, как в Тиндере: если кто-то понравился, можете послать запрос на то, чтобы объединить свои силы. Вы видите его навыки, интересы, предыдущие места работы. Даже Гитхаб и профили в соцсетях (если он их указал). Там же, на сервисе посмотреть на состав сформированной команды и провести голосование за тимлида. Тимлид может управлять входящими заявками, удалять людей или менять название команды.





Студенты Технопарка использовали современный и общепринятый стек технологий React Golang. В дизайне отталкивались от Material-UI и VKUI, и сделали крутую мобильную верстку (отбирать заявки в команду можно даже на бегу).



Команда проекта: Сергей Куклин, Михаил Балицкий (miksti.me) и Олег Елизаров.

Умные визуальные эффекты к фотографиям


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

У ребят из Технополиса появилась идея: почему бы не сделать систему, способную создавать эти эффекты на основе метаинформации. А отсюда увеличить активность пользователей сервиса (в данном случае Одноклассников). Всем ведь интересно посмотреть на фотографии с красивыми и необычными эффектами. Откуда брать метаинформацию? Во-первых, из самого фото. Например, из EXIF или XMP. Во-вторых, её можно генерировать, используя методы машинного обучения.

Фокусировка на главном объекте и размытие фона достигается за счет карты глубины, Depth Map (той же технологии, благодаря которой работает Face ID у iPhone). Depth Map также помогает достичь эффекта параллакса и эффектов dolly zoom in/zoom out, когда главный объект остается статичным, а остальные приближаются или удаляются.


Depth Map получают или из фото, если камера смартфона поддерживает построение карты глубины. Или с помощью ML (в итоге команда остановилась на MidasNet). Всё это происходит со стороны сервера, так что девайс пользователя не нагружен.


Основная программа Технополиса Java-разработчик высоконагруженных приложений, поэтому под капотом у проекта Javа, а также Android, OpenGL и другие вспомогательные технологии.

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

Команда проекта: Елисей Василевский, Илья Гусаров, Владислав Зыбкин.

Сервис Рабочее место


Многие из нас устали от работы из дома. Хочется что-то поменять. Или просто сделать так, чтобы домочадцы не отвлекали. Решением может показаться кафе. Но и тут не всё просто. Бывает, пришли, открыли ноутбук, уже хотите хорошо погрузиться в проект а тут оказывается, что розетки по соседству нет. И Wi-Fi запаролен. Или очень слаб. Вы просто зря потеряли ещё полчаса на дорогу.



Команда студентов Технопарка придумала решение: сервис Рабочее место. В приложении собраны все кафе и рестораны вашего города, где можно спокойно прийти и поработать. С информацией о времени работы, адресе, освещенности, Wi-Fi, розетках. Можете по фото проверить дизайн. А если взять подписку вам там даже бесплатно нальют чай/кофе или сделают скидку на заказ.



Для кафе это выгодно, ведь они получают постоянных клиентов. И можете периодически менять рабочее место, не рискуя попасть туда, где удаленному сотруднику никто не рад.

Для разработки фронтенда использовались React, MobX, TypeScript, SCSS. Бэкенд Django, Docker, PostgreSQL, Grafana, Nginx.



Состав команды: Александр Аверкиев, Дмитрий Болдин, Сергей Петренко, Артур Потапчук.

Проекты, которые показали другие студенты:

Технопарк:

  • Телеграм-бот ассистент для календаря Mail.ru
  • Ежедневник для самозанятых
  • Конструктор системы лояльности для кафе
  • Мобильное приложение для взаимодействия клиента с кафе/рестораном
  • Платформа для ведения спортивных чемпионатов
  • Приложение для заказа еды из столовых МГТУ.

Технополис:

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

Полное видео с этой защиты можно посмотреть у нас во ВКонтакте.

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

Если вы уже давно не студент или не хотите ждать нового набора образовательные проекты Mail.ru Group делятся ИT-знаниями безвозмездно на ютуб-канале Технострим. Смотрите, подписывайтесь, ставьте лайки!
Подробнее..

Перевод Матёрый программист

12.06.2021 00:22:22 | Автор: admin
image

1. Матёрый программист


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

Когда я начинал в Oddworld, я наблюдал, как многие игровые компании устраивают соревнования у кого лучший домашний графический движок, и я также наблюдал, как многие инди-разработчики тратят огромное количество времени на свой единственный настоящий продукт и никогда не запускают его. Я решил, что мы не попадем в эти ловушки мы будем скромными и не будем заходить слишком далеко, мы не позволим нашему эго помешать нам лицензировать код или использовать старомодные решения проблем, мы будем сосредоточены на конечном продукте любой sexy code, который не давал видимых преимуществ в запуске реальной игры, был исключен. По большей части, я думаю, нам это удалось (было несколько отступлений, в основном из-за меня).

Но путь матёрого программиста может оказаться ловушкой, в которую можно попасться.

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

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

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

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

Я думаю, что нужно учитывать два фактора: во-первых, матёрость и продуктивность может вызвать выгорание, что в конечном итоге сказывается на вашей производительности, или это может просто сделать кодинг неприятным, так что вы будете тратить на него меньше часов. Большинство матёрых программистов хвастаются тем фактом, что они могут сделать столько же за 6 часов, сколько они делали за 14 часов. Но эти 14 часов были ВЕСЕЛМИ, вы так долго кодили, потому что вам это нравилось, вы не могли заснуть ночью, потому что вы хотели больше писать код; теперь эти 6 часов неприятны, потому что вместо того, чтобы разворачивать собственное решение, вы просто связываете вместе несколько пакетов java и perl. Во-вторых, продуктивность не единственная цель. Мы пишем код, чтобы выполнить какую-то задачу и заработать деньги, но мы также пишем код, потому что нам это нравится, и на самом деле быть менее продуктивным, но получать большее удовольствие от кодинга может быть чистым + EV. (EV в покере это сокращение от expected value означающего математическое ожидание от розыгрыша руки или определенного действия.)

2. Здоровое противодействие продюсера


Многие программисты, выполняющие обычную работу по кодингу, ненавидят вмешательство продюсера (или корпоративного руководства, или издателя, или кого-то еще). Этот человек навязывает глупые графики и не позволяет нам выполнять функции, которые мы хотим выполнять, и мы их ненавидим! Эти кодеры хотят иметь возможность составлять свое собственное расписание, выбирать свои собственные задачи и быть свободными.

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

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

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

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

3. Стандарты кодинга


Для меня просто поразительно, сколько опытных программистов до сих пор не понимают программирования. Большая сложность в программировании состоит в том, что количество способов написать что-то слишком велико. Мы можем потеряться в этом пространстве.

Одна из проблем просто интеллектуальная перегрузка. Умные кодеры могут ошибочно полагать, что они справятся с этим, но это бремя для всех. Каждый раз, когда вы пишете строку кода, если вы должны думать: Следует ли мне использовать строчные или смешанные заглавные буквы?, или Мне сделать это функцией или просто написать в строке? ваш мозг тратит массу энергии на синтаксические решения и не имеет полной мощности для выполнения функций. Строгие стандарты кодинга на самом деле являются интеллектуальным облегчением, потому что они устраняют все эти решения и дают вам определенный способ выполнения синтаксиса. (То же самое, конечно, относится к чтению чужого кода ваши глаза могут сразу начать смотреть на функциональность, а не пытаться выяснить текущий синтаксис).

Другим большим преимуществом стандартов кодинга является создание метаязыка, который меньше, чем базовый язык, и обеспечивает соблюдение определенных инвариантов. Поступая так, вы снова уменьшаете пространство, которое мозг должен учитывать. Например, вы можете потребовать, чтобы все макросы C вели себя как функции (например, не использовали области видимости и не объявляли переменные). Теперь, когда я вижу одного, я знаю, что мне не нужно беспокоиться об этих вещах. Или вы можете потребовать, чтобы глобальные переменные никогда не извлекались из внешнего источника и были доступны только через функции, называемые GetGlobal_blah. На самом деле не имеет значения, что они собой представляют, если они просты, ясны, единообразны и строго соблюдаются, потому что, только если они полностью надежны, вы можете перестать думать о них.

4. Ловушка перезрелого программиста


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

Я считаю, что они/мы в основном ошибаются.

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

Это почти всегда неправильно. Лимпить АА почти всегда неправильно, открытие 72o с UTG почти всегда неверно возможно, вы провели некоторый анализ и решили, что это правильно за этим столом в данный момент (например, лимпить АА, потому что люди, стоящие за вами, атакуют лимперов слишком много, и они думают, что вы никогда не будете лимпить АА, поэтому они легко застрянут). Это не правильно.

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

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

То же самое и в кодинге. Перезрелый программист знает ценность инкапсуляции некоторой функциональности в структуру + помощники (или класс), но они думают, что достаточно умны, могут решить не делать этого в данном конкретном случае. Нет! Неправильно. Я имею в виду, что, может быть, вы действительно правы в данном конкретном случае, но для принятия этого решения не следует использовать энергию вашего мозга, и вы будете делать это несколько раз неправильно.

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

То же самое происходит с принятием жизненных решений. Стандартный набор клише:

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

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

В покере после стадии уверенного игрока правильная правильная корректировка крайне мала. Вы не идете все время на дикие игры, это чрезмерная уверенность в своих силах и просто spew. Правильно развитый игрок в основном придерживается сплошной линии и стандартного способа оценки, но знает, как определять ситуации, в которых правильна очень небольшая корректировка. Возможно, стол играет слишком тайтово на префлопе, поэтому в позиции с угоном вы начинаете открывать первые 35% рук вместо 25% лучших рук. Вы не просто начинаете открывать каждую руку. Вы остаетесь в рамках хорошей игры, которую понимаете и можете обойтись без переосмысления всего своего подхода.

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

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

16.06.2021 22:19:34 | Автор: admin

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

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

В результате родился проект Объясняем код. Посмотреть, что это такое можно на code-explained.com. Код проекта выложен на Гитхаб.

Чем я вдохновлялся

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

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

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

Как сегодня изучают алгоритмы

Преподаватель записывает на доске код, а потом по шагам объясняет, как он работает.

В видео на Youtube происходит нечто подобное ведущий берет код алгоритма и отрисовывает этапы его работы

На ИТ-ресурсах создают анимации.

А кто-то даже пытается объяснить работу алгоритма через танец.

Почему эти подходы казались мне неэффективными

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

Как я перешел от технозависимости к человечности

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

Вместе с командой мы разработали проект Объясняем код. Это такой интерактивный учебник, который с помощью визуализаций объясняет, как работают алгоритмы.

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

Как это технически реализовано

Для кода на Python написан аналогичный код на JS, который после выполнения каждой строчки сохраняет состояние. Такой трюк помогает исполнять код на фронтенде без тяжелого интерпретатора. Чтобы убедиться, что код на JS делает то же самое, что и на Python, есть автотестер он прогоняет код на обоих языках и сравнивает результаты.

Чтобы сэкономить на копировании данных, я применил Immutable.js. Immutable.js это библиотека неизменяемых коллекций. Модификации таких коллекций всегда возвращают новую коллекцию, которую легко сохранить. Так я избегаю глубокого копирования. Не буду вдаваться в подробности, на Хабре про immutable.js уже писали. Для примера кусочек кода с итерированием по хеш-таблице:

while (true) { // Итерируемся по списку    this.addBP('check-not-found'); // Метод сохраняем состояние    if (this.newList.get(this.newListIdx) === null) {        // this.newList -- это немутабельный список        break;    }    this.addBP('check-found'); // Выполнена очередная строчка, сохраняем состояние    if (EQ(this.newList.get(this.newListIdx), this.number)) {        this.addBP('found-key');        return true;    }    this.fmtCollisionCount += 1; // Для динамических комментариев иногда нужно сохранять статистикуу    this.newListIdx = (this.newListIdx + 1) % this.newList.size; // Переходим к следующему индекксу    this.addBP('next-idx');}

В любой момент пользователь может отмотать время слайдером, и мы должны быть готовы анимировать переход. Поэтому анимации сделаны декларативно на React и CSS. На React описываются нужное состояние, а CSS transitions автоматически высчитывают и анимируют переход. Это позволяет избежать совсем сложного императивного кода с запутанным состоянием и ручными вычислениями. Получается тоже не просто, и в итоге анимациями заведует огромный класс на 1000 строк. Но я уверен, что императивно реализовать то же самое у меня вообще не получилось бы.

Много строк возникает из-за особенностей браузерных API и производительности в разных браузерах. Например, большой проблемой оказалось сделать так, чтобы браузеры не склеивали последовательные изменения друг с другом. Если добавить div с определённой начальной позицией, и потом сразу же поменять координаты на конечные, то браузер склеит эти два изменения в одно. Div сразу окажется в конечной позиции без анимации. Чтобы такое не происходило, приходится вставлять задержку в два фрейма анимации с помощью window.requestAnimationFrame().

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

Код проекта на гитхабе

Что дальше?

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

Подробнее..

Перевод Навыки Senior Engineer, помимо программирования (неполный список)

08.06.2021 22:04:34 | Автор: admin
  1. Как провести собрание. И нет, не болтать больше всех на собрании, а именно провести его.
  2. Как написать проектную документацию, получить отзывы и довести ее до решения в разумные сроки
  3. Как наставлять младшего коллегу по команде, инженера в середине карьеры, нового менеджера, которому нужен технический совет
  4. Как порадовать старшего менеджера, который хочет поговорить о технических вещах, которых он на самом деле не понимает, не закатывая глаза и не заставляя его чувствовать себя глупо
  5. Как объяснить техническую концепцию за закрытыми дверями высокопоставленному лицу, слишком смущенному, чтобы открыто признать, что он ее не понимает
  6. Как убедить другую команду использовать ваше решение вместо написания собственного
  7. Как заставить другого инженера сделать что-то для вас, попросив о помощи таким образом, чтобы он почувствовал, что его ценят
  8. Как вести проект, даже если вы не менеджерите никем из людей, работающих над ним
  9. Как заставить других инженеров прислушиваться к вашим идеям, не заставляя их чувствовать угрозу
  10. Как прислушиваться к идеям других инженеров, не чувствуя угрозы
  11. Как отказаться от своего детища, от того проекта, который вы превратили во что-то великое, чтобы вы могли заняться чем-то другим
  12. Как научить другого инженера заботиться о том, что вас действительно волнует (операции, правильность, тестирование, качество кода, производительность, простота и т.д.)
  13. Как сообщить о статусе проекта заинтересованным сторонам
  14. Как убедить руководство в том, что нужно вкладывать деньги в нетривиальный технический проект
  15. Как создавать программное обеспечение, принося при этом дополнительную ценность в процессе
  16. Как составить проектное предложение, социализировать его и получить поддержку для его реализации
  17. Как повторять свои мысли достаточно, чтобы люди начали слушать
  18. Как выбрать битву/Как расставлять приоритеты
  19. Как помочь кому-то продвинуться по службе
  20. Как получить информацию о том, что на самом деле происходит (как сплетничать, как общаться)
  21. Как найти интересную работу самостоятельно, а не ждать, пока кто-то ее вам принесет
  22. Как сказать кому-то, что он неправ, не заставив его стыдиться
  23. Как изящно воспринимать отрицательные отзывы
Подробнее..

PM-школа от CS центра итоги первого года в онлайне глазами выпускников

14.06.2021 20:18:14 | Автор: admin

Два года назад Computer Science Center провел экспериментальный запуск курса по управлению продуктами, о результатах которого мы рассказывали ранее. Эксперимент удался, и в 2020-21 учебном году прошла уже полноценная годовая программа повышения квалификации с поправкой на новые идеи и вынужденный онлайн-формат. Сегодня выпускники нашей программы поделились своими историями: почему они решили развиваться в продакт-менеджменте, как совмещали учебу и работу и с какими результатами вышли с курса.

До 20 июня открыт набор на третий поток обучения по направлению Product Management с преподавателями и наставниками из ведущих мировых IT-компаний. Подробнее о школе смотрите в записи Дня открытых дверей онлайн и на нашем сайте.

До и После: зачем вы изначально подавали заявку на конкурс и что получилось в результате?

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

Я дважды пытался запустить стартап и дважды спотыкался о собственную некомпетентность. Профессия Product Manager предполагает, что ты знаешь как из пункта А привести продукт в пункт Б. Когда я увидел, что на продакта будут учить в Computer Science Center, я сразу подал заявку: все мои знакомые, которые проходили курсы в CS центре, говорили о лучшем опыте обучения в своей жизни.

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

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

Я хотел изменить карьерную траекторию это очень значимое для меня решение. Раньше я работал в сфере ядерной энергетики: занимался как инженерными задачами, так и развитием бизнеса. Понимал, что хочу качественных изменений: новых знаний и практики для старта в IT. Обучение в школе по управлению продуктами от CS центра было для меня этой возможностью. С одной стороны, что-то близкое и знакомое (менеджмент, инженерия и бизнес-анализ), с другой новая сфера инженерии (цифровые продукты).

Результат сейчас обучение завершено. Закрыв одну дверь, я открыл две новые: Business Аnalysis и Product Management. Сейчас я работаю в IT-компании и двигаюсь по треку управляющего цифровыми проектами, потому что мне нужен базовый опыт. После перейду в управление продуктами. Рассчитываю совершить карьерный маневр в течение этого года.

Сначала был конкурс: первое впечатление от знакомства и советы бывалых будущим абитуриентам.

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

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

Самое сложное в отборе ответить на три довольно глобальных вопроса в двухминутном видео. Съемка этого видео заняла у меня пару часов: хотелось сделать что-то задорное, но информативное о себе и моем опыте. В итоге все получилось: благодаря видео я попала на собеседование, а после него и на курс. Если у вас совсем нет знаний о работе IT-продуктов, для подготовки к интервью рекомендую послушать лекции из Школы менеджеров Яндекса.

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

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

В процессе: как справлялись с учебной нагрузкой и какие изменения происходили с вами в течение учебного года?

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

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

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

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

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

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

Второй семестр был менее динамичным, однако тут настало время прохождения индивидуальной практики в компаниях. Мне повезло попасть к хорошему ментору Матвею Брыксину, Product Lead в Arrival. Нагрузка была умеренной, в этот раз я успевал делать задачки хорошо, а не в режиме стартапера, которому нужно было вчера. Работая для корпорации, я получил совершенно другой опыт. Мне было интересно заниматься реальной проблемой бизнеса.

Атмосфера на курсе: ощущения от взаимодействия с организаторами, преподавателями и друг другом.

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

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

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

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

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

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

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

Знания, которые я получил в процессе обучения, помимо собственно понимания, какие процессы и фреймворки существуют в области создания продуктов, значительно расширили мой профессиональный и общий кругозор. Хоть я и не планирую в ближайшее время переходить на позицию продакт-менеджера, многое я смогу применить в роли Lead-engineer. Большая часть вопросов относительно ожиданий бизнеса и прогнозирования хода проекта стали разрешимы с меньшим объемом коммуникаций. Да и возможность видеть что-либо на большем уровне абстракции само по себе прекрасно и интересно.

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

Новые идеи для работы и жизни

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

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

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

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


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

Заявки принимаются до 20 июня на https://pmcsc.ru/ ;)

Подробнее..

Перевод Как объяснить детям, что такое Apache Kafka за 15 минут с картинками и выдрами

19.06.2021 04:20:24 | Автор: admin


Я учусь иллюстрировать сложные процессы с помощью комиксов. Нашла себе в копилку крутой кейс: как с помощью комиксов про милых выдр можно ребенку объяснить такую сложную штуку как Apache Kafka, и сделать мир немного добрее.

Легко по течению легкое введение в потоковую обработку и Apache Kafka. Группа выдр обнаруживает, что они могут использовать гигантскую реку для общения друг с другом. По мере того, как все больше выдр перемещается в лес, они должны научиться адаптировать свою систему, чтобы справиться с возросшей активностью леса.

Под катом 25 слайдов, объясняющие основы Kafka для детей и гуманитариев. И много милых выдр.



Легко по течению



image

Поначалу, в лесу было тихо, и только две семьи выдр жили среди деревьев и рек.

image

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

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

image

Со временем, все больше и больше выдр переселялось в лес.

И точно так же росло количество происходящих в лесу событий.

image

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

image

Это не только занимало много времени, но было чревато ошибками.

Что если какая-то выдрячья семья была на пикнике, и не могла получить уведомление о предстоящем событии?

image

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

image

Поскольку остальные выдры общались друг с другом лично, говорили, что они Тесно Связаны.

Быть тесно связанными супер мило, но это делает коммуникацию с другими сложнее. Это называется Проблема Масштабирования.

image
Именно тогда у одной маленькой выдры по имени Никси, появилась идея, которая навсегда изменила лес.

По лесу текла огромная река Кафка, и Никси знала, что выдры могу использовать эту реку для общения.

Вы можете установить Kafka в своем лесу:

# clone the repositorygit clone \https://github.com/round-robin-books/gently-kafka.git# start kafkadocker-compose up


image

Она даже сочинила песню, чтобы объяснить, как это работает:

События свои
В реку ты опусти,
Река их отнести
Сможет выдрам другим.

Что о событиях,
Плывущих в потоке,
Этот путь удивителен,
Мы все тут в шоке.

image

Не отстанешь ли ты? вмешался дельфин
Нельзя оставлять все на милость глубин!

Не будет в доставке такого.
Мы командой реку разделим,
На множество мелких потоков
И вместе достигнем цели.

Давайте посмотрим, как это рабоnает



image

Во первых, выдра наблюдает Событие, что-то, что произошло в определенный момент времени.

К примеру, Сегодня вернулись пчелы это событие.

image

Дальше, выдра создает Запись о событии.
Записи (которые иногда называют сообщения) включают время события (отметка о времени) и дополнительную информацию о событии.

image

Тогда выдры смогут решать в какую часть реки направить это сообщение.

Река делится на потоки, которые называют Топики, которые делают организацию сообщений проще.

image

В итоге, выдры бросали свои сообщения в потоки (топики), чтобы другие выдры могли их найти.

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

image

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

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

2 типа выдр



image

Выдры, которые помещают сообщения в реку, называются Продюсеры.

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

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

image

Выдры, которые читают события в потоке называются Консьюмеры.

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

Например, выдры Первой помощи следят за топиком с лесными алертами, так что они могут реагировать в чрезвычайных ситуациях (как в ситуации с пчелами).

image

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

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

image

Тогда, один член семьи, так называемый Лидер Группы, назначает подмножество мелких потоков (разделов) каждому члену семьи.

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

image

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

image

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

Поскольку кто-то всегда был рядом, выдры были Высоко доступными.

И поскольку они могли справляться с Незапланированными Ситуациями, они были Отказоустойчивыми.

image

Еще существовала магическая часть леса, Земля Потоковой Обработки, где выдры могли делать реально классные вещи с событиями в реке.

image

Целая книга написана об этом магическом месте: Mastering Kafka Streams and ksqlDB

image

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

image

Кафка продолжала помогать многим другим во всем мире. И возвращалась обратно в лес.

Жизнь шла своим чередом многие годы, а выдры жили долго и счастливо.



Я не удержалась, вот вам несколько фактов про выдр:



Выдрята, или щенки выдр, спят у мам-выдр на груди.



Взрослые выдры держат друг друга за лапки во сне, чтобы их не разделило течение.



А одинокие выдры, чтобы не дрейфовать, заворачиваются в водоросли.

Строго говоря, автор использует термин otter, что переводится как выдровые, и включает себя 13 видов животных с распространением по всему миру, кроме Австралии.

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

В недрах тундры выдры в гетрах тырят в ведра ядра кедров. Выдрав с выдры в тундре гетры, вытру выдрой ядра кедра, вытру гетрой выдре морду ядра в вёдра, выдру в тундру.
Подробнее..

Я 8 лет работал сисадмином в провинции но ушел в Devops, когда меня снова попросили чинить клавиатуры

01.06.2021 18:16:36 | Автор: admin

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

На втором курсе после практики в одной из двух IT-компаний моего города я напросился к ним на работу. Меня взяли на зарплату в 15 тысяч рублей. Шел 2012 год, понятие девопс только зарождалось, а я начал работать помощником системного администратора. Задачи в течение дня сводились к обслуживанию Windows серверов, установке поставок, написанию инструкций и проверке того, что сделали программисты. Я крутился между серверной и институтом во вред учебе, в приоритете было удержаться на полученном месте.

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

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

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

Только к 2019 году в моей работе появилось хоть какое-то развитие. Пришел Линукс, на слуху уже был девопс. Мы стали писать микросервисы, можно было поковыряться с Docker-файлами, пособирать контейнеры из CI/CD. К тому моменту у меня прибавилось много обязанностей, навалилось командировок. Я работал свой дневной график и сидел в серверной вечерами. Паренек-сисадмин, я настолько приелся в офисе, что мое мнение никому не было интересным. Но случись любой факап крайним, конечно, становился я. Мне это совершенно не нравилось.

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

8 лет я проработал в провинциальной компании сисадмином. Потом руководство сменилось, и я стал старшим сисадмином. Понимаете?

Зарплата специалиста с 7 летним опытом и высшим образованием еле-еле дотягивала до 50 тысяч рублей. Я понятия не имел, что такое айтишная зарплата. В другом регионе в таком же провинциальном городе у меня жил знакомый. Он был моим кумиром: работал в IT, схватывал все на лету, вместо того, чтобы сменить регион на Москву, уехал в Беларусь и попал в EPAM Systems. Прошел собеседование на английском с кодингом.

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

Но я быстро понял, что мои знания в девопс не рыночные.

Мой большой опыт в индустрии сводился к винде и поверхностным знанием Docker. Работая с Ansible я больше оперировал shell-командами, нежели использовал модули. Тем не менее, набравшись смелости, я попал на собеседование. Гуру Линукса я себя не считал, но ответил на все вопросы по нему. Человек, который меня собеседовал, даже отметил, что по Линуксу у меня и правда все хорошо. Но вот стек девопса и автоматической развертки, к сожалению, был слабоват для этой вакансии.

На работе все начало надоедать. Последней каплей стала очередная задача: срочно починить кому-то клавиатуру.

Это что насмешка над трудом сисадмина, который проработал в компании столько лет? Тогда я решился, взял практикумы Ребрейна в рассрочку, и этого момента у меня закончилось свободное время. Исчезли выходные и вечера. Я много работал и параллельно осваивал курсы. Спустя три месяца я закончил Git, прошел Terraform, прокачал связку Terraform + Ansible. Понял, как пользоваться модулями, скачивать плейбуки в Ansible Galaxy. И самое главное начал все это дело хоть как-то читать и понимать. Позже я защитил практикум по Docker. Это было похоже на дипломный проект. Мне дали задание, я его сделал, потом отстаивал работоспособность, отвечал на вопросы. Параллельно я начал проходить практикум по Кубернетису. И решил, наконец, сменить работу.

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

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

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

Я расправил плечи и успешно прошел собеседование на девопса в немецкую компанию. Для этого я подтянул английский, наняв себе репетитора. По ТЗ нужно было запустить приложение в Кубернетесе, с зависимым чат-сервисом, postgresql, и чтобы базы данных хранились на хостовом пути. Правда, совмещать две работы у меня не получилось. Немцы учинили жесткий контроль за моей активностью, даже за тем, как у меня дергается мышка. Каждые 3 минуты около 15 раз скринился экран. Я подумал, что это не дело. Да и оффер, если честно, был копеечный. 7 долларов в час, около 70 тысяч рублей в месяц и вывести их было адски сложно.

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

Так я набрался еще немного опыта, и через пару месяцев рискнул пройти собеседование в Fevlake. Теперь я работаю у них на позиции девопс-инженер. По сути в компании, которая меня вырастила. Испытательный срок скоро закончится. Конкурентов в моем городе с такой зарплатой нет.

На предыдущей работе все сидели и пыхтели в свой мониторы.

Дружеского общения не было. А здесь мы на удаленке, но такое ощущение что я всех знаю не один год.

Часто вспоминаю тот день, когда решил вкладывать в свое развитие. Все произошло довольно быстро, за два года. Переломный момент попробовать учиться дистанционно. Если бы так и сидел в серверной, наверняка бы ничего не достиг. При этом у меня нет ощущения, что я потерял время. Все таки я познакомился за это время с многими интересными людьми. Тот парень из EPAM переехал в Амстердам и работает в Google Cloud. У меня бывают вопросы по работе с клиентскими облаками на гугле. Я набираю его и мы общаемся, он меня прокачивает по клауду. Я ни разу не видел этого человека вживую, но дружба с ним дала мне очень многое.

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


Мы в Fevlake давно поняли, что искать специалистов на рынке очень и очень трудно. Поэтому мы решили растить их сами. История Ильи только один пример. Людей с похожими историями полным полно в нашем сообществе в Телеграме одном из самых больших в сфере девопс. Заходите, там мы постоянно разбираем различные проблемы и задачи обсуждаем вещи, которые пригодятся и на собеседованиях, и в работе.

Подробнее..

Обучение с подкреплением в Super Mario Bros. Сравнение алгоритмов DQN и Dueling DQN

17.06.2021 10:17:44 | Автор: admin

Этой весной Питерская Вышка и JetBrains впервые провели проектную смену для старшеклассников Школу по практическому программированию и анализу данных. В течение пяти дней 50 участников со всей страны работали над групповыми проектами по машинному обучению, NLP, мобильной и web-разработке.

Первое место заняла команда Deep Q-Mario ребята создали нейронную сеть, которая использует reinforcement learning для обучения агента играть в Super Mario Bros. В этом посте они рассказывают, какие алгоритмы использовали и с какими проблемами столкнулись (например, в какой-то момент Марио просто отказался прыгать).

О нас

Мы Владислав и Дмитрий Артюховы, Артём Брежнев, Арсений Хлытчиев и Егор Юхневич учимся в 10-11 классах в разных школах Краснодара. С программированием каждый из нас знаком довольно давно, мы писали олимпиады на С++. Однако почти все члены команды раньше не работали на Python, а для написания проекта в короткий пятидневный срок он был необходим. Поэтому первым испытанием для нас стало преодоление слабой типизации Python и незнакомого синтаксиса. Но обо всем по порядку.

Немного теории

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

Reinforcement Learning

В основе RL алгоритмов лежит принцип взаимодействия агента и среды. Обучение происходит примерно так: агент совершает в среде действие и получает награду (в нашем случае Марио умеет прыгать и перемещаться вправо); среда переходит в следующее состояние; агент опять совершает действие и получает награду; подобное повторяется, пока агент не попадет в терминальное состояние (например, смерть в игре).

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

Q-learning

В основу нашей модели лег алгоритм Q-learning. Q-learning это модель, которая обучает некоторую функцию полезности (Q-функцию). Эта функция на основании текущего состояния и конкретного действия агента вычисляет прогнозируемую награду за весь эпизод (Q-value).Агент совершает действия на основании некоторого свода правил политики. Политика нашего агента называется Epsilon-Greedy: с некоторой вероятностью агент совершает случайное действие, иначе он совершает действие, которое соответствует максимальному значению Q-функции.

# implementation of Epsilon-Greedy Policy:def act(state):rand_float = random.random() # returns random float in range: [0, 1)if rand_float <= EPS:action = random_action()else:action = model.get_action(state) # returns action that brings max Q-valuereturn action

В классической реализации алгоритма Q-learning формируется таблица из всех возможных состояний среды и всех возможных действий. Задача заключается в том, чтобы посчитать значения Q-values для каждой пары состояние действие.

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

Q(s_t,a_t):=Q(s_t,a_t)+(Q_{target}(s_t,a_t)-Q(s_t,a_t))Q_{target}(s_t,a_t)=r_t(s_t,a_t)+ maxQ(s_{t+1},a)

Где Q(s, a) значение Q-функции для состояния и действия;

Qtarget(s, a) это оптимальное, по нашему предположению, значение Q-функции, к которому мы пытаемся свести текущее значение Q-функции;

st, at состояние среды и выбранное действие в момент времени $t$;

rt(st, at) награда за текущее состояние среды и совершенное действие;

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

коэффициент обучения. Он определяет насколько сильно мы изменим текущее значение Q-функции.

Deep Q-Learning

Часто среда имеет слишком много состояний и действий, поэтому составить таблицу в явном виде невозможно. Для решения этой проблемы используют нейронные сети, чтобы не хранить значения полезности, а предсказывать их. На вход нейросети поступает текущее состояние среды, а на выход она дает прогнозируемую награду для всех действий.Для изменения Q-value мы обновляем параметры нейронной сети, чтобы предсказывать более точные значения. Обновление весов нейронной сети осуществляется градиентным спуском это метод нахождения минимального значения функции (в этой статье можно почитать подробнее)

Deep Q-learningDeep Q-learning

Experience Replay Buffer

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

# implementation of transition collecting:transition = (state, action, next_state, reward, done)replay_buffer.append(transition)  

Target network

Для того, чтобы весь алгоритм обучения работал, необходимо иметь вторую нейронную сеть target model, которая определяет оптимальное значение Q-функции (Q-target) и является копией модели, взаимодействующей со средой (online model). Единственное отличие этих сетей друг от друга заключается в том, что веса target model обновляются несколько реже, чем у online model у нас это примерно каждый 500-й эпизод. Это нужно для корректного обучения модели: если online model будет производить вычисления Q-target и Q-функций самостоятельно, при изменении весов сети следующие значения Q-target и Q-функций изменятся примерно одинаково, то есть разница между ними останется такой же, и мы не будем сводиться к оптимальному значению.

Существуют два метода обновления весов target model: hard update и soft update. Первый копирует online model в target model каждую n-ую итерацию обучения. Во втором методе веса target model также пересчитываются при обучении, но медленнее, как взвешенное среднее весов двух сетей

Q_{target}:=Q_{target}+(Q_{agent}-Q_{target})

Работа над проектом

Стоит отметить, что до школы никто из нашей команды не делал проекты по машинному обучению. За несколько недель нам сообщили тему проекта, и мы заранее, еще в Краснодаре, начали готовиться. Мы читали статьи, смотрели видео по машинному обучению и нейронным сетям, изучали математику, которая нам может пригодиться. Поэтому можно сказать, что на смену приехали уже подготовленными. Конечно, мы не знали нюансов, но во время школы наш куратор Дмитрий Иванов каждый день давал задания, благодаря которым мы смогли разобраться с деталями.Первые дни после начала школы мы занимались тем, что изучали необходимую теорию по нейронным сетям и обучению с подкреплением вместе с Дмитрием. После настало время кодинга: первая наша попытка реализовать DQN (Deep Q-learning Network) алгоритм и научить агента играть в Марио успехом не увенчалась. После девяти часов обучения прогресса не было, и мы не знали, в чем, собственно, дело. После тщетных попыток дебаггинга на питоне, командой было принято единственное разумное решение переписать код с нуля, что принесло свои плоды. Имея рабочую реализацию DQN, мы решили на этом не останавливаться, а написать модификацию Dueling DQN, сравнить ее со стандартным алгоритмом и посмотреть, какой агент лучше покажет себя в игре после обучения.

Dueling DQN

Основная идея Dueling DQN заключается в том, что нейронная сеть предсказывает не значения Q для всех действий, а отдельно средневзвешенное значение Q-функции по всем действиям (так называемое V-value), а также преимущества для каждого действия, которые определяются как разность между Q-функцией и средневзвешенным значением (подробнее можно почитать здесь).

advantage(s,a)=Q(s,a)-V(s)Визуализация архитектуры модели Dueling DQN (где-то на просторах интернета)Визуализация архитектуры модели Dueling DQN (где-то на просторах интернета)

Дополнительный функционал

Помимо алгоритмов обучения, нам необходимо было сделать еще несколько полезных вспомогательных фич: saver, logger, plotting, visualization.

Saver

Для того, чтобы в случае необходимого приостановления расчетов для изменения гиперпараметров нейронки иметь возможность продолжить обучение на сохраненной версии сети, мы реализовали функционал периодического сохранения весов обучаемой нейронки. Данная возможность была особенно полезна, когда мы столкнулись с проблемой в обучении DQN агента (подробнее о ней расскажем ниже).

Logger and Plotting

Также было реализовано логирование: на каждом n-том эпизоде мы сохраняли вычисляемые метрики функцию средней потери (это функция, которую минимизирует нейронная сеть) и функцию средней награды за эпизод в отдельном файле, чтобы иметь возможность строить их графики, не прерывая вычислительный процесс.

Visualization

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

Возникшие проблемы

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

Возникшая проблема с трубамиВозникшая проблема с трубами

Мы считаем, что эта особенность поведения связана с тем, что отрицательная награда от исхода времени на прохождение эпизода была меньше, чем отрицательная награда от смерти Марио при ударе с врагом. Другими словами, Марио "считал", что завершить уровень из-за истечения времени для него более предпочтительно, чем смерть.Эта проблема действительно поставила нас в тупик: мы не знали, как заставить агента проходить уровень. Мы бились над решением в течение многих часов, пока Арсений Хлытчиев не придумал модификацию функции награды, названную Punishment-оптимизацией (за что мы всей командой выражаем Арсению благодарность!) Он предложил добавлять отрицательную награду за "простой" Марио, чтобы восстановить значимость передвижения агента вперед по уровню. Это улучшение оказало сильное влияние на поведение агента в среде: Марио больше не застревал перед трубами.

Решение проблемы с трубамиРешение проблемы с трубами

Результаты

К окончанию школы мы получили агента, который неплохо справлялся с частичным прохождением первого уровня игры: Марио сумел пройти около 50%. При этом каждый член команды сумел одолеть Марио, дойдя до второго уровня.

Лучший gameplay МариоЛучший gameplay Марио

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

Функция потери

 DQN (слева) и Dueling DQN (справа) DQN (слева) и Dueling DQN (справа)

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

Функция награды

DQN (слева) и Dueling DQN (справа)DQN (слева) и Dueling DQN (справа)

Функция средней награды постепенно возрастает, это свидетельствует о том, что агенты узнают о среде больше, то есть проходят дальше по уровню. Из графиков видно, что агент с моделью обучения Dueling DQN в среднем получает такую же награду, что агент с DQN, однако модифицированной версии понадобилось практически в два раза меньше итераций, чтобы научиться получать такое среднее количество награды.

Заключение

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

За время школы мы получили много опыта в командной разработке и базовые знания о машинном обучении, на основе которых можем создавать свои собственные ML-проекты. А еще мы познакомились с большим количеством интересных людей, которые также хотят развиваться в сфере IT. Поэтому хотим выразить безмерную благодарность организаторам смены, нашему куратору и всем, кто принимал участие в школе. Это был незабываемый и очень полезный опыт.

Подробнее..

Перевод Как Replit отжимает мой open-source проект

07.06.2021 22:20:16 | Автор: admin
Я думаю, вам следует закрыть проект и прекратить работать над ним. Я привлеку наших адвокатов в понедельник, если к тому времени вы не выполнитте условия. [...] Мы были крошечной компанией, когда вы стажировались у нас [...] К счастью, сейчас мы намного больше, и, что очень важно, у нас есть много денег, чтобы заплатить за лучших юристов, если мы будем вынуждены пойти по этому пути.
из переписки с CEO Replit


image


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

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

Про Replit


Replit делает веб-приложение, которое вы можете использовать для запуска кода в Интернете на разных языках программирования. В этом нет ничего нового (загуглите запустить python онлайн для доказательства), поэтому ценностное предложение Replit это дополнительные функции, такие как совместная работа, установка сторонних пакетов и размещение веб-приложений.

Я работал в Replit летом 2019 года, где меня попросили переделать стек управления пакетами Replit и сделать его open-source. Если вам нравится читать о технических вещах, вот мой пост для блога Replit, и вот код на GitHub.

Летом 2020 года я устроился на работу в другом месте, но все еще время от времени общался с ними по электронной почте, когда они обращались ко мне, чтобы рассказать о чем-то крутом, разработанном Replit.

Про мой open-source проект


image
В Replit мне действительно понравилась поддержка множества различных языков программирования. (Я написал еще один пост в блоге Replit о том, как они это делают.) И я задумался: сколько языков программирования можно запихнуть в один веб-сайт?

Чтобы изучить этот вопрос, я собрал свое собственное небольшое веб-приложение, которое могло бы запускать код в Интернете. Примерно через день у меня появилось кое-что, что заработало. (Если вам интересно, почему это было так быстро оказывается, вам нужно всего 30 строк кода, чтобы люди могли запускать Python в веб-приложении! Возможно, именно поэтому существует так много веб-сайтов для запуска Python в Интернете )

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

2020-06-05 df9ba38 Initial commit 0 (количество языков)
2020-06-05 5e3a4a4 Install some packages into a Docker image 0
2020-06-05 e937c8f Simple Express server with Hello world 0
2020-06-06 0961498 Embed terminal on frontend app 0
2020-06-06 c66cf63 Embed Monaco editor on frontend 0
2020-06-06 27ab1f7 Add run button 0
2020-06-06 f417858 You can run Python code now 1
2020-06-07 d543081 You can run many languages now 8
2020-06-07 e2a3e71 All languages 17 working now 17
2020-06-07 473c50c ALL THE LANGUAGES 25
2020-06-08 3718315 even more languages 33
2020-06-08 548c1c1 repl.it superiority!!! 38
2020-06-08 1ae424f More languages, we need all the languages 48
2020-06-09 c34ccf2 A lot more languages 77
2020-06-09 846caf2 At this point the number of languages is absurd 79


В конце концов я добавил 216 языков, включая все 38 языков из Replit, все 100 языков из Quine Relay Юсуке Эндо и многое другое. Вы можете спросить: почему я потратил так много времени на добавление непонятных языков программирования в веб-приложение, которое никто не собирался использовать? Ну, позвольте мне сказать так: это ли самое странное хобби 2020 года, которое вы видели?

Что произошло, когда я рассказал о своем проекте сотрудникам Replit


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

image

Сначала я получил позитивный оклик. Но потом, 30 минут спустя, из ниоткуда, Replit обвинил меня в неэтичном поведении и краже их дизайна:

image

Ни одна из идей, которые я использовал в своем проекте с открытым исходным кодом, не была внутренними дизайнерскими решениями: все они были опубликованы публично в блоге Replit (я знал это, потому что меня попросили написать некоторые из этих постов в блоге во время моей стажировки). И мой проект был больше похож на клон Replit, не больше, чем любой другой веб-сайт на первых нескольких страницах выдачи Google для run python online, большинство из которых выглядят точно так же:

image

Но я подумал, что я что-то пропустил, поэтому запросил подробности:

image

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

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

image

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

image

Я хотел бы отметить две вещи об этом письме:

  • Замечание о commits like this это на самом деле вводит в заблуждение. В моем проекте есть только один коммит, в котором упоминается Replit, и это тот, который я уже показывал вам ранее, начиная с моего третьего дня кодирования, когда я только что добавил все 38 языков, поддерживаемых Replit, прежде чем перейти к 178 другим языкам, которые я хотел добавить.
  • Замечание о том, что я demanding стажер я на самом деле не уверен, что это означает, тем более, что Replit только что пытался завербовать меня ранее в тот же день (см. Скриншот их первого письма). Но я оставлю это в покое, потому что это не имеет отношения к рассматриваемому вопросу.


Что произошло после того, как Replit пригрозил подать на меня в суд


Естественно, я сразу скрыл свой проект, подождал некоторое время, чтобы чувства остыли, и послал Replit извинения. Я подумал, что, возможно, что-то было потеряно по электронной почте, поэтому попросил созвониться:

image

Увы, Replit проигнорировал это письмо, поэтому отправил им еще одно. Этот получил ответ, но не тот, на который я надеялся:

image

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

Другими словами, позиция Replit прежняя: если я переопубликую свой проект с открытым исходным кодом, они подадут на меня в суд с топовыми юристами.

Прав ли Replit


Replit утверждал, что мой проект с открытым исходным кодом был:

  1. клоном Replit
  2. основывался на их коммерческой тайне (внутреннем проектном решении)
  3. неэтичен


Разберем эти утверждения по частям:

  1. Разрабатывая свой проект, делал ли я клон Replit?
  2. Разрабатывая свой проект, я использовал какие-либо коммерческие секреты Replit?
  3. Было ли неэтично с моей стороны разрабатывать проект с открытым исходным кодом, похожий на Replit, после работы на них?


Вопросы 1 и 2 содержат довольно много технических деталей, поэтому я поместил их в отдельный пост. Вот TL;DR по этим вопросам:

  1. Мой проект не более похож на Replit, чем 15 других (коммерческих!) проектов, которые вы можете найти в Google, вбив в поиск run python online или online programming environment.
  2. Любое сходство между моим проектом и Replit можно объяснить, взглянув только на репозитории GitHub и сообщения в блогах, которые были опубликованы в Интернете самим Replit, что очевидно делает не секретными.


Давайте ответим на вопрос 3 здесь:

Вопрос: Было ли неэтично с моей стороны разрабатывать проект с открытым исходным кодом, похожий на Replit, после работы на них?


На мой взгляд, ответ на этот вопрос нет, на то есть ряд причин:

  • Riju полностью некоммерческая организация. В отличие от Replit, я не искал финансирования из какого-либо источника, рекламы, пожертвований, сбора средств, подписки, чего угодно. Я не заинтересован в ведении бизнеса и никогда не хотел, чтобы Riju стал слишком популярным, так как именно я оплачивал счет за сервер.
  • Riju не крал клиентов у Replit. Основываясь на моих аналитических данных, в феврале у Riju было 38 посещений. (Половина из них, вероятно, была моих.) Между тем, у Replit более 7 миллионов пользователей. Очевидно, нет никакого смысла в конкуренции Riju с Replit.
  • Riju также не был построен как конкурент для Replit. Поскольку архитектура была ограничена запуском на одном сервере, любой мог вывести из строя всю систему, просто введя fork bomb и один из моих друзей сделал это, просто чтобы посмотреть, что произойдет. (Система вышла из строя.) Если бы я разрабатывал продукт, чтобы конкурировать с Replit, я, конечно, не выбрал бы архитектуру, которую можно масштабировать до размера игрушечного проекта.
  • Основная ценность Replit не про запуск код онлайн (вы можете сделать это в десятках мест бесплатно). Их конкурентное предложение это функции, которые они предлагают помимо запуска кода. Riju категорически не хватало всех этих функций, включая: наличие учетной записи пользователя, сохранение вашей работы, совместное использование вашей работы, публикацию веб-приложений, постоянные рабочие пространства, дискуссионные форумы, интеграцию с GitHub и так далее.
  • У меня не было злого умысла по отношению к Replit, когда я разрабатывал Riju, и я не пытался ничего скрывать. В качестве доказательства этих утверждений я напоминаю, что я с самого начала опубликовал проект на своем GitHub. Обратите внимание, что Replit узнал о моем проекте, потому что я открыто поделился им с ними по собственной воле, предложив им черпать вдохновение из моей работы.
  • Riju никогда не задумывался как продукт. Он был задуман как личное пространство для игры, или как произведение искусства. В качестве доказательства этого утверждения я предлагаю тот факт, что я потратил десятки часов на добавление таких языков, как Hexagony и SNOBOL, а не на то, чтобы вы могли сохранить свою работу(!).


Я не бизнесовый человек. Я просто open-source разработчик, который любит создавать странные вещи для удовольствия. (Если вы сомневаетесь в моем опыте создания вещей, которые не приносят денег, просто ознакомьтесь со списком на моем веб-сайте и обратите внимание на заметное отсутствие чего-либо, что когда-либо приносило хоть цент дохода.)

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

Если вы хотите сами решить, кто прав, я с удовольствием выложу все доказательства в открытую (за исключением кода, потому что Replit все еще обещает подать на меня в суд, если я это сделаю). Опять же, у меня есть отдельный пост со всеми техническими деталями. И вы также можете прочитать всю переписку между мной и Replit, в полном и сокращенном виде, на Imgur, зеркало в Internet Archive). (Технические подробности о Replit были отредактированы, а также любое утверждения, которые могут косвенно раскрыть такие детали.)

Зачем Replit это сделал?


Replit заявляет следующие идеалы:



Однако действия Replit в данном случае свидетельствуют о лицемерии:

  • они говорят, что они поощряют open-source разработку, но когда мой проект с открытым исходным обидел их, они закрыли его, впав в предрассудки
  • они утверждают, что помогали open-source сообществу, постили сообщения в блоге, но когда я попытался использовать эти идеи в общественном проекте, они угрожали подать на меня в суд
  • они говорят, что они позволяют легко распространять, перерабатывать, исправлять свои творения, но когда я попытался сделать ремикс Replit под себя, я стал персоной нон-грата


В письмах Replit ко мне их угрозы основывались на том факте, что я работал на них в прошлом. Однако я считаю, что это рассуждение ширма. Чтобы понять почему, давайте взглянем на некоторые твиты, которые CEO Replit, Amjad, опубликовал сразу после того, как угрожал мне по электронной почте:

image


image


Позже Амджад удалил эти твиты, потому что они оказались противоречивыми:

image


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

Существует явное сходство между комментариями Амджада по поводу Athens Research и его юридическими угрозами в отношении моего собственного проекта. Он даже использовал в обоих случаях одно и то же слово copycat. В случае с Athens Research Амджад ничего не мог сделать, чтобы выразить свое презрение, кроме как очернить их в Твиттере. Но в моем случае, поскольку я раньше работал в Replit, у Амджада был повод бросить мне обвинения обвинения, которые, если вы не знакомы с фактами, звучат так, как будто они могут быть законными.

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

Перевод Что делать, если всё ваше существо противится поставленной задаче

07.06.2021 20:11:26 | Автор: admin
image

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

Мне поручают реализовать фbxe, обычно расплывчатую, и что-то, что, как мне кажется, добавляет ненужной сложности в кодовую базу. Я пытаюсь урезонить своих менеджеров, но обычно их решение уже принято. Затем я часами борюсь с собой, чтобы заставаить себя доделать фичу. Не потому, что код занимает так много времени, а потому, что я не могу заставить себя это сделать. Я трачу часы на то, чтобы уговориь себя сделать это. Кроме того, я трачу много времени, пытаясь сделать что-то максимально читаемым, удобным в обслуживании и простым. Это означает взвешивание достоинств различных решений и выбор какого-то одного. Я очень колеблюсь, когда принимаю решения, что приводит к большему количеству потраченных впустую часов.

Самое главное мои менеджеры меня не увольняют. Они не видят, сколько часов я потратил зря, насколько я демотивирован. Вместо этого они относятся ко мне как к одному из своих самых ценных сотрудников (вот это ирония!). (На данный момент я не могу сменить работу. Я помогаю стартапу моего лучшего друга, выполняя эту работу.)

Вы бывали в таких ситуациях? Как вы погружаетесь в работу и делаете это, когда все ваше существо восстает против задачи?

Ответ Джонатана Блоу: Я 42-летний очень успешный программист, который за свою карьеру уже прошел через множество ситуаций, многие из которых сильно демотивировали. И лучший совет, который у меня есть для вас, прекратить то, что вы делаете. Серьезно. Даже если вам кажеся, что вы не в состоянии сделать это, то знайте вы можете. Это нормально. Вы свободны. Хорошо, вы помогаете стартапу своего друга, но какова соответствующая стоимость этого? Она бы заставила вас сделать это, если бы вы знали, что это растопчет вашу душу (crushing your soul)?

image

Я не использую фразу растопчет твою душу легкомысленно. Когда это происходит медленно, как в этих случаях, трудно увидеть масштаб происходящего. Но это очень серьезная ситуация, и если ее не остановить, это может повредить вашему потенциалу хорошо работать всю оставшуюся жизнь. Причины:

  • Правы комментаторы, предупреждающие о выгорании. Выгорание очень серьезная ситуация. Если вы сильно выгорите, будет сложно эффективно выполнять любую будущую работу, на которую вы пойдете, даже если это якобы прекрасная работа. Относитесь к выгоранию как к физической травме. Однажды я выгорел, и мне потребовалось не менее 12 лет, чтобы полностью восстановить свою продуктивность. Не делайте этого.
  • В более широком смысле лучшая и самая творческая работа берет свое начало в радости и восхищении. Если вы потеряете способность испытывать радость и восхищение по поводу вещей, связанных с программированием, вы не сможете работать наилучшим образом. Эта проблема стоит отдельно от эмоционального выгорания и параллельна ему! Если вы выгорите, вы все равно сможете ненадолго почувствовать радость и волнение в начале проекта/идеи, но это быстро исчезнет по мере того, как наступит реальность повседневной работы. Или же, если вы не выгорели, но и у вас нет чувства изумления, скорее всего, вы никогда не начнете хорошо работать.
  • Чем раньше вы начинаете карьеру, тем важнее это время для вашего развития. Программисты учатся на практике. Если вы поместите себя в среду, в которой вы постоянно сталкиваетесь с проблемами и работаете на пределе своих способностей, то по прошествии нескольких лет ваши навыки значительно возрастут. Это все равно, что интенсивно изучать кунг-фу в течение нескольких лет или пройти обучение на морского пехотинца или что-то в этом роде. Но это не просто разовое постоянное повышение. Чем быстрее вы сделаете что-то и чем оно будет более тщательным и безошибочным, тем больше идей вы сможете воплотить в жизнь, а это значит, что вы будете быстрее учиться и в будущем. В долгосрочной перспективе навыки программирования подобны сложным процентам. Больше сейчас означает НАМНОГО больше позже. Меньше сейчас означает НАМНОГО меньше позже.


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

Если бы я мог вернуться к своей ранней карьере, я бы безжалостно стёр все свои дерьмовые работы (а их было много).

Еще кое-что о личности. Вначале как программист я часто попадал в описанные вами ситуации. Мне не нравилось то, что я делаю, я думал, что руководство глупое, я просто не думал, что моя работа очень важна. Я был очень подавлен из-за проектов, продвигался медленно, временами попадал в режим, в котором я большую часть времени притворялся, что у меня есть прогресс просто потому, что не мог заставить себя выполнить работу. У меня просто не хватало духа на это. (Я знаю, что многие здесь знают, о чем я говорю.) Со временем я впал в депрессию из-за этого: у меня ужасная трудовая этика? Неужели я просто плохой программист? Плохой человек? Но эти вопросы не были так выражены словами или интеллектуализированы, они были больше похожи на общее недомогание и разочарование в том, куда движется жизнь.

Позже я узнал, что у меня совсем не плохая трудовая этика и что я не плохой человек. На самом деле я довольно свиреп и проделываю огромное количество хорошей работы, когда считаю, что то, что я делаю, важно. Оказалось, что для того, чтобы уловить это чувство важности, мне пришлось работать над своими собственными проектами (и даже тогда мне потребовалось много времени, чтобы найти идеи, которые действительно меня тронули). Но как только я это обнаружил, это фактически превратило меня в другого человека. Если это работает для вас, разница между этими двумя образами жизни ОГРОМНА.

Хорошо, это было долго и бессвязно. На этом я остановлюсь. Желаю вас удачи.

Еще


Подробнее..

Самообучение в организации и как сделать эффективный тренинг

10.06.2021 14:04:32 | Автор: admin

Коллеги, всем привет!

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

Сразу отмечу, что если хочется получше разобраться с тем, как создаются тренинги, то стоит прочитать интереснейшую и полезнейшую книгу Д.А Григорьева Бизнес-тренинг: как это делается.

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

Условно работу над тренингом можно разделить на три этапа:

  • Подготовка.

  • Проведение.

  • Оценка успешности.

Ниже подробнее рассмотрим каждый из них.

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

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

Проиллюстрирую эту мысль на примере. Как вы думаете, в каком случае тренинг будет интереснее:

  • Мы приходим, рассказываем какую-то теорию, а потом просим сделать какие-то упражнения.

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

Подсказка - во втором случае:) Это и есть реализация цикла Колба.

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

Этап 1. Подготовка и проектирование тренинга

Шаг 0. Определить цели тренинга и критерии их достижения.

Прежде чем проектировать любой тренинг, необходимо четко ответить на ряд вопросов:

  • Какую проблему мы хотим решить, почему считаем, что она актуальна?

  • Какую цель мы хотим достичь?

  • Кто является нашей основной аудиторией?

  • Какие критерии достижения цели, и как мы проверим, что мы их выполнили?

От ответов на эти вопросы будет зависеть следующее:

  • Какую именно информацию необходимо донести до аудитории в ходе тренинга.

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

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

Шаг 1. Определить, как мы будем формировать запрос на обучение у будущих участников.

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

  • Деловые игры, в ходе которых участники моделируют различные ситуации и в процессе осознают, что у них есть проблемы.

  • Разбор какой-то типовой рабочей ситуации, где проявляется проблема.

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

  • Дать участникам возможность смоделировать идеальную ситуацию и сравнить с текущей.

И т.п.

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

  • Какой вывод можно сделать из этой ситуации?

  • Что было самым сложным в упражнении? Почему?

  • Что получилось лучше всего, а что хуже? Почему?

  • Насколько эффективен полученный результат?

И т.п.

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

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

Шаг 2. Подготовить теоретическую часть тренинга.

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

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

Шаг 3. Подготовить упражнения для закрепления навыков.

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

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

Шаг 4. Продумать, как подвести участников к осознанию и осмыслению результатов.

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

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

  • Что полезного вы выносите с сегодняшнего тренинга, и как хотите применить это в работе?

  • Как то, что вы сегодня изучили, повлияет на вашу работу? Что изменится?

  • Что для вас было самым ценным в сегодняшнем тренинге? Почему?

И т.п.

Шаг 5. Продумать, как мы будем собирать обратную связь и оценивать эффективность тренинга.

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

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

  • Контрольное тестирование спустя какое-то время после тренинга, где мы проверим то, насколько участники овладели необходимой информацией и навыками.

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

  • Оценка изменения продуктовых метрик, KPI и т.п. Например, если мы проводили тренинг по освоению какой-то техники, которая должна повысить эффективность процесса, то можно сравнить метрики этого процесса до тренинга и спустя несколько месяцев.

И т.п.

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

Этап 2. Проведение тренинга

После того, как мы выполнили подготовку, можно проводить тренинг. Ниже типовой сценарий:

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

  2. Знакомство. Если команда уже хорошо знакома, этап можно пропустить. Если нет, то необходимо рассказать несколько слов о себе (почему именно вы проводите этот тренинг), и попросить участников рассказать в двух словах о себе и своих ожиданиях от тренинга. Например, в формате Имя- чем занимаюсь сегодня по итогам тренинга я хочу узнать. С одной стороны, мы уже рассказали участникам про цели, но здесь мы даем возможность им сформировать эту цель уже самим для себя, что повышает вовлеченность и ответственность.

  3. Определить и зафиксировать правила работы. Важно в самом начале тренинга определить базовые правила работы (не перебивать, отключать телефоны, как задавать вопросы, взаимное уважение и т.д. и т.п.), чтобы все их понимали, и в процессе проведения тренинга можно было на них ссылаться.

  4. Формирование запроса на обучение. Тут предлагаем команде выполнить те задания, которые мы разработали на этапе проектирования тренинга.

  5. Теория. В формате мини-лекции рассказываем теорию, которую хотим донести до команды.

  6. Практика. Отрабатываем те упражнения, которые мы разработали на этапе проектирования.

  7. Завершение (осознание). Спрашиваем участников, что ценного они вынесли для себя с тренинга, а также просим их дать обратную связь по самому тренингу.

Этап 3. Оценка результатов

Как уже говорил выше, спустя какое-то время после проведения тренинга необходимо оценить его эффективность. Для этого мы воспользуемся теми инструментами и подходами, которые определили на этапе планирования тренинга.

Вот собственно и всё. Надеюсь, что описанные выше идеи будут полезны в подготовке ваших тренингов.

Подробнее..

Автоматическая генерация сообщений к коммитам

31.05.2021 20:20:52 | Автор: admin
Привет! Меня зовут Александра Елисеева, я студентка Computer Science Center. В рамках практики в осеннем семестре 2020 года я участвовала в проекте BERT for Source Code под руководством Тимофея Брыксина и Ярослава Соколова из JetBrains Research. Я исследовала решение задачи автоматической генерации сообщений к коммитам с помощью языковой модели BERT. Что получилось, а над чем еще предстоит поработать, расскажу в этом посте.



О проекте


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

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

Недавние работы (1, 2, 3) показали, что если обучить модель BERT на большом датасете программного кода, то она и в этой области неплохо справляется с несколькими задачами (среди них, например, локализация и устранение неправильно использованных переменных и генерация комментариев к методам).

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

О задаче


Почему мы выбрали эту задачу?

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

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

  • в существующих работах (4, 5, 6) данные собираются из открытых источников и требуют серьёзной фильтрации, поэтому примеров для обучения остаётся немного. Здесь может пригодиться способность BERT дообучаться на небольших датасетах;
  • state-of-the-art результат на момент работы над проектом был у модели архитектуры Transformer, которая достаточно специфичным способом предобучена на небольшом датасете (6). Нам интересно было сравнить его с моделью на основе BERT, которая предобучена по-другому, но на гораздо большем количестве данных.

За семестр мне нужно было сделать следующее:

  • изучить предметную область;
  • найти датасет и выбрать представление входных данных;
  • разработать пайплайн для обучения и оценки качества;
  • провести эксперименты.

Данные


Существует несколько открытых датасетов для этой задачи, я выбрала наиболее отфильтрованный из них (5).

Датасет собирался из топ-1000 открытых GitHub репозиториев на языке Java. После фильтрации из исходных миллионов примеров осталось около 30 тысяч.

Сами примеры представляют собой пары из вывода команды git diff и соответствующего короткого сообщения на английском языке. Выглядит это как-то так:



И изменения, и сообщения в датасете короткие не более 100 и 30 токенов соответственно.

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

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

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

BERT для sequence-to-sequence задач


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

Для решения подобных задач обычно используют архитектуру энкодер-декодер, состоящую из двух компонент:

  • модель-энкодер на основе входной последовательности строит векторное представление,
  • модель-декодер на основе векторного представления генерирует выходную последовательность.

Модель BERT основана на энкодере из архитектуры Transformer и сама по себе для такой задачи не подходит. Возможно несколько вариантов, чтобы получить полноценную sequence-to-sequence модель, самый простой - использовать с ней какой-либо декодер. Такой подход с декодером из архитектуры Transformer хорошо себя показал, например, для задачи нейронного машинного перевода (7).

Пайплайн


Для проведения экспериментов необходим был код для обучения и оценки качества подобной sequence-to-sequence модели.

Для работы с моделью BERT я использовала библиотеку HuggingFaces Transformers, а для реализации в целом фреймворк PyTorch.

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

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

Эксперименты


В ходе экспериментов нам хотелось понять, позволяет ли использование предобученной на программном коде модели BERT улучшить state-of-the-art результат в этой области.

Среди обученных на коде моделей BERT нам подошла только CodeBERT (1), так как только у неё в примерах для обучения присутствовал язык программирования Java. Сначала, используя CodeBERT в качестве энкодера, я попробовала декодеры разных архитектур:

  1. Я предполагала, что с этим вариантом удастся быстро получить какой-нибудь базовый результат. GRU не так часто используют с архитектурой Transformer, поэтому было не до конца понятно, чего ожидать.
    В итоге какого-либо разумного качества получить не удалось даже после подбора нескольких влияющих на процесс обучения гиперпараметров.
  2. Я попробовала второй вариант, используя для этого предобученную на английском языке GPT-2 (8) модель на основе декодера из архитектуры Transformer, часто применяемую для задач генерации, а также её более маленькую версию distilGPT-2 (9).

На дальнейшие эксперименты времени в осеннем семестре не хватило, я продолжила их уже зимой. Мы рассмотрели несколько других способов представления входных данных: попробовали выравнивать последовательности до изменений и после, а еще просто подавать git diff.

Основные результаты экспериментов выглядят следующим образом:





Подводя итоги


В целом предположение о пользе применения CodeBERT к данной задаче не подтвердилось, во всех случаях обучаемая с нуля модель Transformer показала качество выше. Лучшим методом в этой области остаётся модель CoreGen6: это тоже Transformer, но дополнительно предобученный с использованием предложенной авторами целевой функции.

Для решения этой задачи можно рассмотреть еще много идей: например, попробовать представление данных на основе абстрактных синтаксических деревьев, которое часто применяется при работе с программным кодом (10, 11), попробовать другие предобученные модели или провести какое-нибудь специфичное для этой области предобучение, если есть необходимые ресурсы. Мы же в весеннем семестре сосредоточились на более практическом применении полученных результатов и занимались автодополнением сообщений к коммитам. Об этом расскажу во второй части :)

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

Спасибо за внимание!

Источники


  1. Feng, Zhangyin, et al. Codebert: A pre-trained model for programming and natural languages. 2020
  2. Buratti, Luca, et al. Exploring Software Naturalness through Neural Language Models. 2020
  3. Kanade, Aditya, et al. Learning and Evaluating Contextual Embedding of Source Code. 2020
  4. Jiang, Siyuan, Ameer Armaly, and Collin McMillan. Automatically generating commit messages from diffs using neural machine translation. 2017
  5. Liu, Zhongxin, et al. Neural-machine-translation-based commit message generation: how far are we?. 2018
  6. Nie, Lun Yiu, et al. CoreGen: Contextualized Code Representation Learning for Commit Message Generation. 2021
  7. Rothe, Sascha, Shashi Narayan, and Aliaksei Severyn. Leveraging pre-trained checkpoints for sequence generation tasks. 2020
  8. Radford, Alec, et al. Language models are unsupervised multitask learners. 2019
  9. Sanh, Victor, et al. DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter. 2019
  10. Yin, Pengcheng, et al. Learning to represent edits. 2018
  11. Kim, Seohyun, et al. Code prediction by feeding trees to transformers. 2021
Подробнее..

Морской бой на Java для новичков. Level 1

17.06.2021 10:17:44 | Автор: admin

Всем привет!

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

Для начала давайте обсудим, какие требования "бизнес" предъявил к нашему приложению. После долгих переговоров заказчик утвердил следующий сценарий игры:

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

  2. Одновременно в игре могут участвовать только два человека.

  3. В самом начале игроки "представляются" - программа "спрашивает" (предлагает пользователям ввести), какие у них имена

  4. У каждого игрока есть своё поле - квадрат 10х10 клеток

  5. Затем игроки по очереди расставляют свои корабли. Как и в "бумажной" версии - каждый может поставить 4 однопалубных корабля, 3 двухпалубных, 2 трехпалубных и 1 четырёхпалубный.

  6. Корабли можно располагать только по горизонтали или по вертикали.

  7. Игроки не видят расположение кораблей друг друга.

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

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

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

    Второй вариант, если игрок не попал ни в какой корабль, то ход переходит второму игроку.

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

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

Как и в любом Java приложении нам потребуется класс (не умаляя общности назовём его Main), в котором будет объявлен, я думаю уже всем известный, метод main.

public class Main {public static void main(String[] args) {  //your code will be here}}

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

Опираясь на пункты 1-3 утвержденного сценария, реализуем функционал приложения, который будет предлагать игрокам ввести свои имена. Здесь нам придётся использовать класс java.util.Scanner, который умеет считывать введенные значения в консоли.

public class Main {    static Scanner scanner = new Scanner(System.in);    public static void main(String[] args) {        System.out.println("Player 1, please, input your name");        String player1Name = scanner.nextLine();        System.out.println("Hello, " + player1Name + "!");        System.out.println("Player 2, please, input your name");        String player2Name = scanner.nextLine();        System.out.println("Hello, " + player2Name + "!");    }}

Подробнее о коде:

В строке 2 создаем статичное свойство класса Main scanner.

Нестатический метод nextLine() класса Scanner (строки 6 и 11) обращается к консоли и возвращает строку, которую он еще не считывал.

После получения имени пользователей, программа выводит приветствие в консоль - "Hello, {username} !"

В консоли будем видеть следующее, если запустим код сейчас.

Player 1, please, input your nameEgorHello, Egor!Player 2, please, input your nameMaxHello, Max!

Поговорим о том, как мы будем отображать поле боя и заполнять его кораблями. Пожалуй, что наиболее логичным будет использование двумерного массива char[][] buttlefield. В нем мы будем отображать расположение кораблей. Договоримся, что удачное попадание в корабль противника будем отображать символом #. Неудачный выстрел будем помечать символом *. Таким образом изначально, массив будет проинициализирован дефолтовым для примитива char значением ('\u0000'), а в процессе игры будет заполняться символами # и *.

public class Main {static final int FILED_LENGTH = 10;    static Scanner scanner = new Scanner(System.in);public static void main(String[] args) {    System.out.println("Player 1, please, input your name");    String player1Name = scanner.nextLine();    System.out.println("Hello, " + player1Name + "!");    System.out.println("Player 2, please, input your name");    String player2Name = scanner.nextLine();    System.out.println("Hello, " + player2Name + "!");        char[][] playerField1 = new char[FILED_LENGTH][FILED_LENGTH];    char[][] playerField2 = new char[FILED_LENGTH][FILED_LENGTH];    char[][] playerBattleField1 = new char[FILED_LENGTH][FILED_LENGTH];    char[][] playerBattleField2 = new char[FILED_LENGTH][FILED_LENGTH];}}

Подробнее о коде:

В строке 2 мы создаем константу FIELD_LENGTH, которая будет содержать размер поля - согласно требованию 4 - проинициализируем FIELD_LENGTH значением 10.

В строках 14-18 создаем двумерные массивы char. playerFiled1 и playerField2 - массивы, в которые будем записывать расположение кораблей каждого игрока. Размеры массивов равны размерам поля - логично, ведь эти двумерные массивы фактически отображают поля.

Перейдём к написанию логике по заполнению полей игроков своими кораблями. Предлагаю создать метод fillPlayerField(playerField), который будет спрашивать у игрока позиции корабля и записывать в массив новый корабль.

public class Main {    static final int FILED_LENGTH = 10;    static Scanner scanner = new Scanner(System.in);    public static void main(String[] args) {        System.out.println("Player 1, please, input your name");        String player1Name = scanner.nextLine();        System.out.println("Hello, " + player1Name + "!");        System.out.println("Player 2, please, input your name");        String player2Name = scanner.nextLine();        System.out.println("Hello, " + player2Name + "!");        char[][] playerField1 = new char[FILED_LENGTH][FILED_LENGTH];        char[][] playerField2 = new char[FILED_LENGTH][FILED_LENGTH];        fillPlayerField(playerField1);        fillPlayerField(playerField2);    }}private static void fillPlayerField(char[][] playerField) {// your code will be here}

Метод fillPlayerField должен быть статическим (static), так как вызываться он будет из метода main, который по определению должен быть статическим. fillPlayerField не будет возвращать никакого значения (void). В этом методе будет реализована логика по получению координат корабля от пользователя и запись в массив playerField нового корабля.

Поговорим о том, как пользователь будет задавать координаты кораблей. Будем размещать корабли по убыванию палуб, то есть первым разместим четырёхпалубный корабль, затем все трёхпалубные корабли, все двухпалубные корабли и все однопалубные. Программа будет принимать от пользователя координаты начала корабля и его положение (см. бизнес-требование 6) - по горизонтали или по вертикали.

Приведу вывод программы в консоль, который мы ожидаем увидеть после создания метода fillPlayerField:

Расставляем 4-палубный корабль. Осталось расставить: 1Input x coord: 1Input y coord: 11. Horizontal; 2. Vertical ?1

Наконец-то приступаем. На данный момент имеем:

private static void fillPlayerField(char[][] playerField) {    // your code will be here}

Нам нужно расставить корабли с палубами от 4 до 1. Здесь дело идёт к циклу. Предлагаю без лишнего пафоса использовать for. Заметим, кораблей с одинаковым числом палуб может быть несколько, поэтому нам нужно ещё как-то контролировать, чтобы пользователь мог разместить лишь определенное число кораблей с заданным количеством палуб (см. бизнес требование 5) - эта задача также эффективно решается с помощью цикла - без пафоса также используем for.

private static void fillPlayerField(char[][] playerField) {// i - счётчик количества палуб у корабля    // начинаем расстановку с корабля, которого 4 палубы, а заканчиваем кораблями с одной палубой    for (int i = 4; i >= 1; i--) {      // см. подробнее о коде под этой вставкой    for (int k = i; k <= 5 - i; k++) {          System.out.println("Расставляем " + i + "-палубный корабль. Осталось расставить: " + (q + 1));        // some your code here        }    }}

Подробнее о коде:

На 5 строчке мы создаём цикл for (int k = 0; k <= 5 - i; k++). Объясню, откуда такая магия. Нам нужно как-то понимать, сколько кораблей каждого типа (с определенным количеством палуб) пользователь может поставить.

Мы можем создать еще один двумерный массив, в котором мы захардкодим что-то в духе:

int[][] shipTypeAmount = {{1, 4}, {2, 3}, {3, 2}, {4, 1}};

Мы бы в первом цикле (см. строку 4) перебирали значение количества палуб, потом искали бы в двумерном массиве, какое количество кораблей соответствует данному типу. На мой взгляд, такое решение качественное, однозначно, если бы мы писали коммерческую программу, то сделали бы именно так, но сейчас такая красота выглядит сложной - оставим это как задачу со звёздочкой, для тех, кто захочет "причесать" свой код.

Я же предлагаю отметить особенность, что сумма количества кораблей и количества палуб - величина постоянная. Действительно, 1 + 2 = 5; 2 + 3 = 5; 3 + 2 = 5; 4 + 1 = 5 . Поэтому, зная количество палуб у корабля (зная тип корабля), мы можем посчитать, сколько кораблей такого типа может быть установлено одним играком. Например, 5 - 1 = 4 - таким образом, каждый игрок может поставить 4 однопалубных корабля. В цикле for на строке 6 реализована проверка условия цикла "лайтовым" способом - на основе этого интересного свойства.

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

private static void fillPlayerField(char[][] playerField) {        for (int i = 4; i >= 1; i--) {            // растановка самих кораблей            for (int k = i; k <= 5 - i; k++) {                System.out.println("Расставляем " + i + "-палубный корабль. Осталось расставить: " + (q + 1));                System.out.println("Input x coord: ");                x = scanner.nextInt();                System.out.println("Input y coord: ");                y = scanner.nextInt();                System.out.println("1 - horizontal; 2 - vertical ?");                position = scanner.nextInt();                // если корабль располагаем горизонтально              if (position == 1) {                    // заполняем '1' столько клеток по горизонтали, сколько палуб у корабля                    for (int q = 0; q < i; q++) {                        playerField[y][x + q] = '1';                    }                }                            // если корабль располагаем вертикально                if (position == 2) {                  // заполняем столько клеток по вертикали, сколько палуб у корабля                    for (int m = 0; m < i; m++) {                        playerField[y + m][x] = '1';                    }                }              // печатаем в консоли поле игрока, на котором будет видно, где игрок уже поставил корабли              // о реализации метода - см. ниже                printField(playerField);            }        }    }

Подробнее о коде:

Корабль помечаем символом '1' столько раз, сколько палуб он имеет - если корабль четырёхпалубный, то он займёт 4 клетки - помечаем 4 клетки значением '1'.

Нам неоднократно потребуется печатать поля игроков, либо поля их выстрелов по вражескому флоту. Для того, чтобы сделать это - создаём метод printField.

static void printField(char[][] field) {        for (char[] cells : monitor) {            for (char cell : t) {              // если значение дефолтовое (в случае char - 0), значит в данной клетке              // корабль не установлен - печатаем пустую клетку                if (cell == 0) {                    System.out.print(" |");                } else {   // если клетка непустая (значение отличается от дефолтового),                  //тогда отрисовываем сожержимое клетки (элемента массива)                    System.out.print(cell + "|");                }            }            System.out.println("");            System.out.println("--------------------");        }    }

На экране метод будет так отображать расстановку кораблей:

 | | | | | | | | | |-------------------- |1|1|1|1| | | | | |-------------------- | | | | | | | | | |-------------------- | | | | | | | | | |-------------------- | | | | | | | | | |-------------------- | | | | | | | | | |-------------------- | | | | | | | | | |-------------------- | | | | | | | | | |-------------------- | | | | | | | | | |-------------------- | | | | | | | | | |--------------------

Вот игроки уже заполнили свои корабли на карте, и теперь мы можем приступить к реализации пунктов 8-10 бизнес-требований заказчика.

Логику по получению от пользователя координат выстрела, обработки выстрела и передачи хода опишем в методе playGame. Дабы придерживаться (или пока только стараться) принципа single responsobility - не забываем делить логику на методы (1 функциональность - 1 метод, но тоже держим себя в руках, код, в котором 100500 однострочных методов тоже не комильфо) - примерно из этих соображений получились еще методы handleShot и isPlayerAlive. Реализация обоих приведена ниже

/*** Метод реализует логику игры: выстрел и передача хода.*/private static void playGame(String player1Name, String player2Name, char[][] playerField1, char[][] playerField2) {        // "карты" выстрелов - создаём двумерные массивы, которые содержат все выстрелы  // удачные (#) и неудачные (*)  char[][] playerBattleField1 = new char[FILED_LENGTH][FILED_LENGTH];        char[][] playerBattleField2 = new char[FILED_LENGTH][FILED_LENGTH];  // вспомогательные переменные, которым будут присваиваться значения текущего игрока -   // игрока, чья очередm делать выстрел. Сначала играет первый игрок, прошу прошения  // за тавтологию        String currentPlayerName = player1Name;        char[][] currentPlayerField = playerField2;        char[][] currentPlayerBattleField = playerBattleField1;  // внутри цикла происходит смена очередности игроков, выстрел, его обработка.  // код внутри цикла выполняется до тех пор, пока "живы" оба игрока - пока у двух игроков  // "частично" цел (ранен) ещё хотя бы один корабль        while (isPlayerAlive(playerField1) && isPlayerAlive(playerField2)) {          // принимаем от пользователя координаты выстрела            System.out.println(currentPlayerName + ", please, input x coord of shot");            int xShot = scanner.nextInt();            System.out.println(currentPlayerName + ", please, input y coord of shot");            int yShot = scanner.nextInt();          // обрабатываем выстрел и получаем возвращаемое значение метода handleShot            int shotResult = handleShot(currentPlayerBattleField, currentPlayerField, xShot, yShot);            // если выстрел неудачный, и не один корабль не повреждён, то очередь переходит к следующему игроку          if (shotResult == 0) {                currentPlayerName = player2Name;              currentPlayerField = playerField1;              currentPlayerBattleField = playerBattleField2;            }        }    }/**    * Метод обрабатывает выстрел. Если выстрел удачный, то есть снаряд достиг цели -    * в клетку записывается значение '#' (отображается к в массиве игрока, так и в массиве соперника),    * а также на экран выводится сообщение 'Good shot!'. В этом случае метод возвращает значение 1.    * В случае неудачного выстрела - в массив battleField записывается значение '0' в элемент [y][x], и    * и возвращается значение 0.    * Возвращаемые значения нам нужны для того, чтобы в методе, внутри которого вызывается метод handleShot,    * мы могли понимать, успешно или неуспешно прошёл выстрел. На основе этого мы принимаем решение, * переходит ход к другому игроку или нет.    */    private static int handleShot(char[][] battleField, char[][] field, int x, int y) {        if ('1'.equals(field[y][x])) {            field[y][x] = '#';            battleField[y][x] = '#';            System.out.println("Good shot!");            return 1;        }        battleField[y][x] = '*';        System.out.println("Bad shot!");        return 0;    }/***Метод определяет, не проиграл ли еще игрок. Если у игрока остался хотя бы    * один "раненный" корабль, тогда пользователь продолжает игру.    * То есть, если на карте у игрока остался хотя бы один символ '1', которым мы отмечали    * корабли, то игра продолжается - возвращается значение true. Иначе false.*/    private static boolean isPlayerAlive(char[][] field) {        for (char[] cells : field) {            for (char cell : cells) {                if ('1' == cell) {                    return true;                }            }        }        return false;    }

Думаю, что к комментариям в коде мне добавить нечего. Единственное, обращу внимание на тонкий момент. Мы привыкли в математике к записи (x, y) - где первой идёт координат абсцисс, а второй - координата ординат. Казалось бы, чтобы обратиться к элементу двумерного массива (иногда срываюсь и называю в тексте элемент клеткой, но суть не меняется) нужно написать arr[x][y], но это будет неверно, и чтобы это доказать воспользуемся неопрвергаемым методом пристального взгляда. Для примера рассмотрим следующий двумерный массив:

int[][] arr = {{1, 2}, {7, 4}, {8, 3, 5, 9}, {1}}System.out.println(arr[0][1]); // ?System.out.println(arr[1][0]); // ?

Теперь вопрос из квиза "Программирование и мир" - что выведется на консоль в строках 3 и 4?
Вспоминаем, что двумерный массив - это не совсем таблица (нам так проще его воспринимать и детектировать его в задачах) - это "массив массивов" - вложенные массивы. Если в одномерных целочисленных массивах элементом является целое число, то в случае двумерного массива - элементом является массив (а в случае трёхмерного массива - элементом является двумерный массив). Таким образом, первый индекс указывает, какой по счёту массив мы выбираем. Второй индекс указывает, какой элемент по счёту мы выбираем в выбранном ранее массиве. Запись arr[1][2] указывает, что мы обращаемся к элементу с индексом 2 (то есть 3 по порядку) в массиве с индексом 1 (или второму по порядку). Соответсвенно, в строке 3 в консоль выведется значение 2, а в строке 4 - 7.

Постепенно подбираемся к концу. Что нам осталось реализовать?

  1. Вывод имени победителя

  2. Проверка клетки, которую пользователь указал как начало корабля

Первое кажется проще, стартанём с него. Потопали в метод playGame - как вы помните, там есть цикл while, в условии которого есть проверка - живы ли еще оба игрока. Напомню, что если игрок "мёртв", то есть у него не осталось ни одного корабля, то игра прекращается, а выживший игрок считается победителем. Собственно, единственное, что добавилось - строчка 36 - вызов метода System.out.println()

/*** Метод реализует логику игры: выстрел и передача хода.*/private static void playGame(String player1Name, String player2Name, char[][] playerField1, char[][] playerField2) {// "карты" выстрелов - создаём двумерные массивы, которые содержат все выстрелы    // удачные (#) и неудачные (*)    char[][] playerBattleField1 = new char[FILED_LENGTH][FILED_LENGTH];    char[][] playerBattleField2 = new char[FILED_LENGTH][FILED_LENGTH];    // вспомогательные переменные, которым будут присваиваться значения текущего игрока -     // игрока, чья очередm делать выстрел. Сначала играет первый игрок, прошу прошения    // за тавтологию    String currentPlayerName = player1Name;    char[][] currentPlayerField = playerField2;    char[][] currentPlayerBattleField = playerBattleField1;    // внутри цикла происходит смена очередности игроков, выстрел, его обработка.    // код внутри цикла выполняется до тех пор, пока "живы" оба игрока - пока у двух игроков    // "частично" цел (ранен) ещё хотя бы один корабль    while (isPlayerAlive(playerField1) &amp;&amp; isPlayerAlive(playerField2)) {      // перед каждым выстрелом выводим в консоль отображение всех выстрелов игрока      printField(currentPlayerBattleField);        // принимаем от пользователя координаты выстрела        System.out.println(currentPlayerName + ", please, input x coord of shot");        int xShot = scanner.nextInt();        System.out.println(currentPlayerName + ", please, input y coord of shot");        int yShot = scanner.nextInt();        // обрабатываем выстрел и получаем возвращаемое значение метода handleShot        int shotResult = handleShot(currentPlayerBattleField, currentPlayerField, xShot, yShot);        // если выстрел неудачный, и не один корабль не повреждён, то очередь переходит к следующему игроку          if (shotResult == 0) {            currentPlayerName = player2Name;              currentPlayerField = playerField1;              currentPlayerBattleField = playerBattleField2;        }    }  System.out.println(currentPlayerName + " is winner!");}

Переходим ко второму пункту наших "остатков" - реализуем проверку клетки, которую указал пользователь - начало корабля.

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

Окрестность с радиусом одна клетка. Красным кругом помечена стартовая клетка - начало корабля.Окрестность с радиусом одна клетка. Красным кругом помечена стартовая клетка - начало корабля.

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

Какие нюансы есть в этом алгоритме? Снова посмотрим на рисунок.

Неэффективность нашего простого алгоритма. Некоторые клетки проверяем несколько раз.Неэффективность нашего простого алгоритма. Некоторые клетки проверяем несколько раз.
private static int validateCoordForShip(char[][] field, int x, int y, int position, int shipType) {        // если пользователь хочет расположить корабль горизонтально  if (position == 1) {            for (int i = 0; i < shipType - 1; i++) {if ('1' == field[y][x + i]                                || '1' == field[y - 1][x + i]                                || '1' == field[y + 1][x + i]                                || '1' == field[y][x + i + 1]                                || '1' == field[y][x + i - 1]|| (x + i) > 9) {                    return -1;                }            }        } else if (position == 2) {          // если пользователь хочет расположить корабль вертикально            for (int i = 0; i < shipType - 1; i++) {                if ('1' == field[y][x + i]                        || '1' == field[y - 1][x + i]                        || '1' == field[y + 1][x + i]                        || '1' == field[y][x + i + 1]                        || '1' == field[y][x + i - 1]|| (y + i) > 9) {                    return -1;                }            }        }        return 0;    }

Не забываем проапгрейдить метод fillPlayerField - напомню, что в этом методе реализована логика по расположению кораблей игроками.

private static void fillPlayerField(char[][] playerField) {        for (int i = 4; i >= 1; i--) {            // растановка кораблей            for (int k = i; k <= 5 - i; k++) {                System.out.println("Расставляем " + i + "-палубный корабль. Осталось расставить: " + (q + 1));              // иницализируем переменную начальным значением              int validationResult = 1;            while (validationResult != 0) {              System.out.println("Input x coord: ");            x = scanner.nextInt();            System.out.println("Input y coord: ");            y = scanner.nextInt();            System.out.println("1 - horizontal; 2 - vertical ?");            position = scanner.nextInt();                  // если координата не прошла валидацию (проверку), то метод возвращает отрицательное// значение, конечно, оно не равно нулю, поэтому пользователю придётся ввести координаты                  // ещё раз                  validationResult = validateCoordForShip(playerField, x, y, position, i);                }            // если корабль располагаем горизонтально              if (position == 1) {                // заполняем '1' столько клеток по горизонтали, сколько палуб у корабля                for (int q = 0; q < i; q++) {                    playerField[y][x + q] = '1';                }            }                        // если корабль располагаем вертикально            if (position == 2) {                  // заполняем столько клеток по вертикали, сколько палуб у корабля                for (int m = 0; m < i; m++) {                    playerField[y + m][x] = '1';                }            }              // печатаем в консоли поле игрока, на котором будет видно, где игрок уже поставил корабли              // о реализации метода - см. ниже            printField(playerField);        }    }}

Вот мы и написали игру "Морской бой" - level 1. Начали с простого - простых конструкций, идей и методов. Один класс, нет коллекций - только массивы. Оказывается на циклах и массивах можно написать игру.

Мы удовлетворили все требования бизнеса. Доигрывая до конца, получили отличную оценку от заказчика, он полностью доволен приложением. Ждём, когда он опробует игру и вернётся снова за апгрейдом. А тут и будет level - 2.

Всем спасибо, всегда рад обратной связи!

Подробнее..

Перевод Неполный список навыков, необходимых senior-разработчикам, помимо написания кода

14.06.2021 06:17:19 | Автор: admin

Для различных уровней от senior до staff и выше.

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

  2. Как писать проектную документацию, получать фидбек и доводить её до реализации в разумный промежуток времени

  3. Как менторить нового junior-коллегу, middle-инженера, нового менеджера, которому нужен технический совет

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

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

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

  7. Как попросить другого инженера сделать что-то для вас, попросив о помощи так, чтобы он почувствовал, что его ценят

  8. Как руководить проектом, даже если вы не руководите ни одним человеком, работающим над ним

  9. Как сделать так, чтобы другие инженеры слушали ваши идеи и не чувствовали угрозу

  10. Как слушать идеи других инженеров и не чувствовать угрозу

  11. Как отказываться от своего детища проекта, который вы сделали чем-то великим, чтобы вы могли заняться чем-то ещё

  12. Как научить других инженеров заботиться о том, что вас реально волнует (процессы, корректность, тестирование, качество кода, производительность, простота и т.д.)

  13. Как сообщать заинтересованным сторонам статус проекта

  14. Как убедить руководство в том, что им нужно инвестировать в нетривиальный технический проект

  15. Как разрабатывать продукты, итерационно показывая ценность в процессе

  16. Как описать предложение проекта, рассказать всем о нём и получить согласие на его реализацию

  17. Как повторять столько раз, чтобы люди начали вас слушать

  18. Как выбрать, за что сражаться

  19. Как помочь кому-то получить повышение

  20. Как получить информацию о том, что происходит на самом деле (как сплетничать, как заниматься нетворкингом)

  21. Как самому находить интересные задачи, а не ждать, кто кто-то вам их принесёт

  22. Как сказать кому-то, что он не прав, не устыдив его

  23. Как изящно принимать негативный фидбек


Перевёл автор канала о работе в команде, коммуникациях, развитии и менеджменте Saturday Night Hack подписывайтесь.

Подробнее..

ИТМО. Первый классический?

15.06.2021 00:15:33 | Автор: admin

Вместо вступления

Что бы мои слова не были голословными хочется уточнить некоторые детали. Я закончил ИТМО совсем недавно по направлению Программная инженерия. Сейчас я являюсь Middle разработчиком и совмещаю эту деятельность с преподаванием в университете в должности младшего преподавателя.

Как проходило мое обучение

Первый год

Когда ты только приходишь из школы ты зелен и плохо понимаешь что тебя ждет. И университет вообще не имеет переходного периода, ты с головой попадаешь в студенческую жизнь. Есть огромное количество всяких движух (студ организации и прочее, но сил и времени на это хватает очень у немногих). Но перейдем же к учебе. Сразу же ты сталкиваешься с предметами такими как программирование, системная разработка математика и физика. У каждого преподавателя свои требования. И только приходя на предмет, пытаясь сдать первое домашнее задание ты разбиваешься о требования твоего наставника. В ИТМО большой акцент поставлен на самообразование и на первых домашних заданиях кажется, что если ты выполнил задание, ты сделал все что от тебя хотели. Но это совсем не так. Когда преподаватель спрашивает не только работает ли твоя работа, но и почему она работает, это очень усложняет сдачу. Вследствие чего, на одного студента может уходить до получаса времени. Так что на практических занятиях образуются очереди, возникают на этой почве конфликты с одногруппниками, иногда появляются шоковые ситуации, когда студенты могут приходить за много часов до пары, чтобы гарантированно попасть к преподавателю.

Второй год

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

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

По воспоминаниям этот год был самым тяжелым, но наиболее полезным для обретения работы.

Третий год

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

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

Четвертый год

В этот год студент встретится с различными дополнительными предметами: экономика программной инженерии, введение в нейросети, системы управления базами данных и тд Данные предметы скорее расширяют кругозор, нежели дают полезные продуктивные знания. А большую часть времени студенту предлагается потратить на подготовку к диплому. Хотя реально учеба заканчивается только в мае и к этому моменту большая часть ВКР должна быть готова. Так что почти всем приходится совмещать работу, учебу и написание выпускной работы.

Что изменилось

В данном разделе хочется описать, что изменилось с моего времени, и что встретит будущего первокурсника. Из приятных мелочей в университете сделали ремонт, кабинеты выглядят приятно и современно, везде появились розетки, отдельно выделили коворкинг, где студенты могут пользоваться своей или университетской техникой 24\7. Больше нет проблемы Где бы посидеть в универе, что бы что-то сделать.

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

Ужесточилась система отчислений, стали отчислять меньше, но если уже добрался до этого вспять повернуть невозможно, и даже восстановиться не дадут.

Что я вынес из университета

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

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

Заметки, которые никуда не влезли

ЕГЭ не решает. Если для поступления важен каждый балл, то после разница уже стирается. Забавно сложилось, что в моей группе, все кто обладал баллом более 290, покинули стены ИТМО без диплома.

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

Вместо заключения

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

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

P.S.

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

Подробнее..

Категории

Последние комментарии

  • Имя: Murshin
    13.06.2024 | 14:01
    Нейросеть-это мозг вселенной.Если к ней подключиться,то можно получить все знания,накопленные Вселенной,но этому препятствуют аннуннаки.Аннуннаки нас от неё отгородили,установив в головах барьер. Подр Подробнее..
  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru