Debug_Yourself – Telegram
Debug_Yourself
669 subscribers
87 photos
3 videos
7 files
80 links
Рассказываю про свой путь становления программистом.
Делюсь информацией, которую изучаю, проектами, которые делаю, шишками, которые набиваю. Также иногда проскакивает диванная философия.

Админ - @arutemu_su
Download Telegram
Ну что, в Питер?

Друзья, своим ли усердием, а может быть везением, я умудрился пройти по конкурсу "портфолио" в питерский универ ИТМО на магистратуру. Результаты были объявлены еще 20 июня, но я не спешил ими делиться тут.

Напомню, что подавал я на три программы:
1. Веб-технологии
2. Мобильные и сетевые технологии
3. Разработка ПО/Software Engineering

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

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

Казалось бы, прямой путь на ТЭЦ, иди и работай за небольшие деньги и большие негативные последствия для здоровья, да и жизни в целом. Будет стабильная жизнь, без корки хлеба, по крайней мере, не останешься. Но нет, разве это было бы самурайским решением? Знать, что ты способен на большее. Быть способным внести в эту жизнь гораздо больше полезного вклада, и пресечь это? Да это же просто преступление.

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

Многие обычно говорят "не бойтесь пробовать". Я же скажу, бойтесь. Бойтесь, но пробуйте. Чтобы чего-то достичь, вам не надо себя мотивировать (кстати, про это хочу потом отдельно написать), просто следуйте двум пунктам:
1. Берешь
2. Делаешь
и тогда, по крайней мере, в результате вы будете знать, что предприняли попытку. И как знать, к чему приведет эта попытка. Сказали бы мне год назад, что я поступлю в питер, серьезно я бы точно это не воспринял.
Тут в преддверии поступления подумал, что надо бы скилл то свой начать повышать, чтобы полным нулем не казаться. Пару дней проходил курс по python на stepik, получил сертификат уже на 80%. Хотел до 100% добить до отъезда, но что-то пошло не так. По приезду надо бы добить.

А касаемо курса и платформы в целом, всем настоятельно рекомендую. Доступные и бесплатные курсы - что может быть лучше? Кстати, на некоторых программах поступления в ВУЗы видел, как прохождение и наличие сертификатов со stepika ценились и даже вместо вступительных испытаний засчитывались (речь, конечно, про IT). Так что все удачи, а я отправляюсь в долгий тернистый путь. Да пребудет с вами бусидо.
Из точки с бесконечной плотностью и экстремальной температурой в сущности была соткана вселенная; миллиарды лет блуждали кварки, не имеющие ни цели, ни смысла, а лишь подчинялись установленным законам, чтобы в конечном итоге сотворить человека — существо столь слабое, трусливое и несовершенное по своей природе. И тем не менее это существо находит в себе отвагу, чтобы бросить вызов самому себе, чтобы бросить вызов самой вселенной, и даже самой жизни. Разве это не абсолют романтики?

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

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

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

"Я был рожден здесь поневоле.
Себя найти я вожделел.
И, четверть века побывав,
Теперь, мотив сей оборвав,
Живу терпенье есть доколе."

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

Хотя и помню то мгновенье,
Когда себя найти не мог:
Ты яко бездну созерцаешь;
Не яркой вспышкою сверкаешь,
А тлеешь словно уголек.

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

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

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

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

Собственно, кто помнит/знает, я таки поступил в ИТМО СПБ на веб-технологии, и сейчас стараюсь закрыть все пробелы как по вебу, так и по computer science в целом.

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

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

Итак. Статья Объясняем современный JavaScript динозавру.
Дата публикации: 27.10.17
Ее прелесть в том, что в ней очень простым языком на небольших примерах объясняется современный JS с кучей необходимых инструментов. К примеру:
– коротко освещается nodeJS;
– ипользование диспетчера пакетов npm;
– использование бандлера (Webpack), который предназначен для для сборки написанных модулей в единые пакеты;
– Что такое транспилирование, зачем оно нужно и как это помогает для использования будущих возможностей JS, а также про транспилятор babel;

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

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

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

Вдруг мы делали запрос к БД для получения большого количества данных, чтобы их вывести? Или же вызвана функция для обработки изображений? Такие запросы могут занять приличное количество времени и блокировать call stack. То есть блокировать дальнейшее выполнение программы. Именно здесь приходит на помощь асинхронность.

Опять же, насколько я понял, при асинхронном подходе выполнение кода как бы откладывается на какое-то время, позволяя не блокировать выполнение программы в целом. То есть когда код, ну или приведенная выше в качестве примера функция
someFunc() { ... };
вызывается, она не обязательно будет выполнена в момент вызова. Отсюда и идет асинхронность.

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

Как работает JavaScript
Дата публикации: 12.09.19
Эта статья поведует о том:
– что такое контекст выполнения (execution context - EC), в частности речь пойдет о контексте выполнения функции и глобального EC.
– Как EC создается движком JS и в чем разница между глобальным EC и EC функции. И как при этом ведет себя специальная переменная this (ссылка на текущий объект).
– Что такое Стек исполнения (Execution Stack) или, как его еще называют, Стэк вызовов (Call Stack). Разумеется, говорится, зачем он нужен.
– Что представляет из себя Очередь событий (Event Queue), что туда добавляется и в каком случае извлекается.
– Также рассказывается про два этапа контекста выполнения функции. Это этап создания и этап выполнения.
– Что есть область действия (Scope) и цепочка областей действия (scope chain).
– Совсем чуть-чуть уделили внимание замыканиям (Closure). Если хотите их понять, лучше почитать подробнее.
– Какие существуют способы задания функции и в чем и разница.
– И еще пару связанных со всем вышеперечисленным моментов.
Я к вам еще с одной хорошей статьей по JS, которая называется:
JavaScript: 12 вопросов и ответов

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

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

Итак, аннотация:
– Коротко о том, что есть «прототипное наследование»

– Коротко про всплытие и перехват событий

– Слегка затрагиваются «замыкания», и дается пару рекомендаций при их использовании

– Пояснение строки ‘use strict’. Если совсем коротко: она нужна, чтобы использование неоднозначных конструкций из ранних версий языка выбрасывало ошибку, а не работало магическим образом.

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

– Отличие стрелочных функций от обычных.

– Альтернатива var - let и const.

– Как и с чем есть функциональное программирование

– И в завершении автор пишет про улучшение производительности веб-страниц при помощи JS, а также про то, как писать код, который будет актуален. Кстати, тут он поднимает вопрос о том, что может стоит, по возможности, писать код, который будет меньше зависеть от фреймворков. Интересная мысля…

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

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

Так вот пару дней назад я наткнулся на ряд крутейших статей по тому «Как работает JS». Всего их 19 штук, каждая обозревает конкретные моменты/принципы работы JS. Я подумал, что ими определенно стоит поделиться с вами, но расскажу лишь про те статьи, которые мне показались самыми интересными, и сделаю это порциями, так как сам еще не все дочитал.

Свежесть статей: сентябрь-октябрь 2017, но актуальность высокая.

АННОТАЦИЯ:

Статья 1: «Обзор движка, механизмов времени выполнения, стека вызовов»

—> Автор, опираясь на статистику гитхаба, говорит о дикой популярности JS
—> Упрощенно представляет движок V8, который используется в браузере Chrome и в Node.js.
—> Также упоминаются API, предоставляемые браузерами, вроде DOM, AJAX и Timeout.
—> Под конец уделяется внимание именно работе «Стека вызовов» (Call stack), который входит в ранее упомянутый движок V8, и про проблемы блокировки пользовательского интерфейса при выполнении тяжелых вычислений.

Статья 2: «О внутреннем устройстве V8 и оптимизации кода»

—> Сначала в статье упоминаются популярные JS-движки, такие как: V8 - написанный на С++ движок от Гугла с открытыми исходниками; Rhino - написанный на Java также с открытыми исходниками движок, поддерживаемый Mozila Foundation. SpiderMonkey - самый первый JS-движок, сейчас используется в Firefox; Chakra - движок для IE и M-t Edge и др.
—> Непосредственно о работе V8, его отличительной черте, заключающейся в том, что он не использует при исполнении JS-программ байт-код или любой другой промежуточный
—> Какие компиляторы использовались в V8 и потоки, занимающиеся оптимизацией кода
—> Совсем немного про встраивание кода: грубо говоря, первая оптимизация исполняемого кода заключается в том, что команды вызова функций заменяются на их тела.
—> Поясняется использование V8 «скрытых классов» для выяснения адресов свойств объектов в памяти и дается рекомендация по инициализации динамических свойств объектам.
—> Еще один механизм оптимизации, используемый движком - «Встроенное кэширование».
—> В двух словах объясняется механизм «Сборки мусора».
—> В конце статьи даются 5 подходов к оптимизации JS-кода для V8.
Ну что, дебаггеры, продолжаю делиться статьями.

Свежесть статей: сентябрь-октябрь 2017, но актуальность высокая.

АННОТАЦИЯ:

Статья 3: «управление памятью, четыре вида утечек памяти и борьба с ними»

—> Для начала в статье обращается внимание на то, что в JS управление памятью происходит автоматически, то есть она сама выделяется, когда объекты/строки/прочее создаются, и когда созданное перестает использоваться, то память освобождается в ходе процесса, называемого сборщиком мусора), но несмотря на это, большой ошибкой будет полагать, что разработчик совсем не должен заботиться об управлении памятью.
—> Коротко о жизненном цикле памяти (выделение->использование->освобождение) и о том, что такое «память» в принципе (концептуально - это огромный массив битов, которые можно считывать и записывать).
—> Чуть-чуть о разнице между динамическим и статическим выделением памяти
—> Более подробно о том, как происходит освобождение памяти: основной фокус на работе «сборщика мусора».
—> Раз пошел разговор о памяти, не забыли уделить внимание «утечке памяти»
—> Автор затронул «Замыкания» (это внутренняя функция, у которой есть доступ к переменным, объявленным во внешней по отношению к ней функции) в контексте работы сборщика мусора и утечки памяти.

Статья 4: «цикл событий, асинхронность и пять способов улучшения кода с помощью async/await»

—> Начало данной статьи является продолжением размышлений, которые были в первой статье: какие ограничения у однопоточной модели выполнения кода (напомним, что JS однопоточен). Также говорится, почему нужна асинхронность.
—> Приводится очень хорошая для понимания схема работы движка, исполняющего JS код, и браузера. Особое внимание уделяется «циклу событий»(Event Loop). Прочитав этот кусок статьи, вы точно поймете, как там исполняется написанный вами код, хотя бы в общих чертах.
—> Коротко о том, как работает setTimeout(…)
—> Раз речь идет об асинхронности, разумеется не забыли про Коллбэки и про то, за что их не любят (коллбэковый ад)
—> Вторая часть статьи полностью посвящена промисам: почему в них появилась нужда, как с ними работать (с примерами), и про новшество ES8: async/await, которое позволяет писать синхронный код, работающий асинхронно.
—> В конце дается 5 советов по написанию надежного асинхронного кода, который легко поддерживать.
Кодинг в радость. Так как выходной, то предлагаю отвлечься от фундаментальных вещей и посмотреть на статью, предлагающую 13 приемов и трюков эффективной работы с массивами в JS. Хотя статья написана на довольно простом английском, я позволил себе перевести ее и дать более подробное объяснение. Более того, все примеры и пояснения выложены в codepen, так что вы можете «поковырять» код сами

Статья: «13 полезных советов и приемов для работы с массивами в JavaScript, которые вы должны знать»

Свежесть статьи: октябрь 2019

АННОТАЦИЯ:

—> Удаление повторяющихся элементов
—> Замена элементов в массиве
—> Функционал map() без map
—> Очистка всего массива
—> Конвертация массива в объект
—> Создание заполненного данными массива
—> Слияние 2х и более массивов
—> Поиск пересечений в двух массивах
—> Удаление «ложных» значений из массива
—> Получение рандомного элемента массива
—> Разворот массив
—> Поиск последнего вхождения элемента в массив
—> Сумма всех элементов массива

Оригинал статьи

Стоит ли продолжать постить подобный материал?
R E F L E C T I O N S

Что я знаю о жизни? Все и ничего.

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

Ничего - это об ограниченности моего личного опыта.

Концентрируясь и зацикливаясь на конкретных ситуациях и людях, я ограничиваю своё «все»-знание. Я отделяюсь от потока и накапливаю своё «ничего».

Думая о вечном, я отделяюсь от эго и соединяюсь со всем остальным, всем, что вне меня.

Жизнь должна протекать в балансе и чередовании этих двух составляющих. Ибо дихотомия – неизменный и постоянный признак всего сущего: «life implies death, self implies other..»

Пространство между этими полярно-финальными точками – спектр жизни, её процесс, она сама.
Может быть кому-то будет интересно, как я попробовал устроиться в одну IT компанию.

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

Тем более когда у них буквально написано, если ты увлекаешься прогой и хочешь быть в тренде, то дуй к нам. Требований нет, лишь пожелания (опыт работы с JS, HTML/CSS, NodeJS, ES6, ООП и знание HTTP протокола). Также указали, что большим плюсом будет наличие опыта работы с React.js, WebRTC, web-sockets.

Не стал тянуть питона за хвост, откликнулся и в этот же день мне перезвонили. Можно сказать, что сходу начали небольшое техническое собеседовение. Вопросов было около 10 штук, если по памяти:
– Как объявить переменную в JS (ответил)
– Что такое DNS (ответил)
– Что такое HTTP (ответил)
– Что такое Синглтон и MVC (ответил)
– Что такое веб-сокеты (не ответил)
– На каком порту работают серверы (ответил)
– Что такое NodeJS (ответил)
– Что такое ReactJS (ответил)
– Какой командой выполнить промисы параллельно (ответил)
– В теге <head> располагается скрипт, который обращается к div элементу в <body>. Вылезает ошибка, потому что div не успевает прогрузиться. Как исправить это (не ответил).

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

Вроде все справедливо… Судя по вопросам задание не должно быть сложным - именно так я думал, пока не открыл письмо на почте. Оказалось, что меня попросили сделать чат. И не простой, а JS-ной. Главные требования были примерно такими:
– User вводит свой ник
– Выбирает какую-нибудь комнату (да, их должно быть несколько)
– Должна быть возможность инвайтить в чат-комнату по ссылке
– Разумеется, сообщения должны отправляться и приниматься всеми участниками комнаты (и должно быть видно кто и когда отправил)
– User должен видеть, кто в данный момент сидит в чат комнате.
– И самое сладкое: должна быть видео связь (опционально, но будет большим плюсом)

Также ввели ограничения: писать преимущественно на JS с хорошими комментариями и используя ООП практики. Сервер на Node, UI на React, для коммутации использовать socket.io, а для видео связи WebRTC.

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

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

Во-первых, так или иначе компетенцию я поднял. Я пощупал React, почувствовал его классовые и функциональные компоненты, а также работу с их состояними. Во-вторых, мне показалось, что я разобрался с тем, что такое веб-сокеты, побаловался с библиотекой socket.io и уловил суть. Ну и в конце концов я смог подружить сервер и клиента. Да, получилось довольно просто, но получилось. Чтобы прийти к этому состоянию я пересмотрел много чужих репозиториев, изучил много чужого кода, вынимая оттуда необходимое мне. А ведь где-то я слышал, что это полезный и необходимый навык.
В общем даже несмотря на отказ я рад, что не опустил сразу руки. Тем более что мне не просто отказали, а проверили мой код и указали на ошибки. Лишь одно тревожит: на позицию джуна за 40 (ну может быть 50к чеканных монет) они ищут явно мидла, который должен получать за такую фулстэк разработку куда больше, или я не прав?