Vadim Chistiakov | IT
1.85K subscribers
67 photos
2 videos
101 links
Сообщество разработчиков со всего мира: boosty.to/chistiakov
Менторство: https://vadim-chistiakov.github.io
Автор: @chvadim

Рассказываю о программировании и жизни разработчика в Лондоне на Global Talent Visa. Делюсь мыслями, опытом и знаниями.
Download Telegram
SwiftData

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

Досадно немного, но зато сэкономил себе пару часов времени.
https://habr.com/ru/companies/surfstudio/articles/742696/

Ссылки на сессии по SwiftData с WWDC23:
Meet SwiftData
Build an app with SwiftData
Model your schema with SwiftData
Migrate to SwiftData
Dive deeper into SwiftData

UPD: Если кто-то может подкинуть еще интересных сессий напишите в комменты

#ios #swift
Многопоточность

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

UPD: Изначально скрин был неправильный, сорри)
#interview #ios #swift
Выберите правильный ответ:
Anonymous Quiz
4%
1 2 3 6
24%
1 2 6 3
10%
2 6 3
44%
1 2 6 7 3
18%
1 2 6 3 7 5 4
И в дополнение к вопросу выше следующий вариант.
Выберите правильный ответ:
Anonymous Quiz
1%
1 2 3 6
4%
1 2 6 3
3%
2 6 3
37%
1 2 6 7 3
54%
1 2 6 3 7 5 4
Capture list 🤔

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

Начем с самого простого. Переменная cityClass в пункте 4 меняет свое значение поля name. Т.к классы относятся к reference type, то захват в capture list никак не повлияет на итоговое значение. В консоле мы увидем в обоих случаях "Liverpool".

Переменная cityStruct - cтруктура, поэтому в первом замыкании она будет скопирована при захвате в capture list, а во втором обращение произойдет в момент выполнения замыкания к уже обновленной переменной. Поэтому "London" и "Marseille" соответственно.

Последний случай может показаться самым неочевидным. Переменная cityClassOptional захватывается в первом замыкании по слабой ссылке. В пункте 4 сначала создается еще один указатель на cityClassOptional, а потом заниляется. В замыкании closure1 будет выведено Paris - счетчик ссылок у объекта еще не равен нулю (doubleClass удерживает объект по сильной ссылке), а вот closure2 обратится по указателю уже к пустому значению.

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

1 - my city is Liverpool
2 - my city is London
3 - my city is Paris
4 - my city is Liverpool
5 - my city is Marseille
6 - my city is nil


А что произойдет если применить weak к переменной с типом структуры? К счастью, компилятор поможет понять, что такое действие недопустимо. ARC не применим к Value Types

'weak' may only be applied to class and class-bound protocol types

#interview #ios #swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Войти вАйти 👨‍💻
 
Знаю, что многие ищут свою первую работу в качестве разработчика. Это всегда было непросто, в том числе и для меня. Расскажу свой путь вкатывания)

С информатикой познакомился лет в 12, участвовал в разных олимпиадах по спортивному программированию на Паскале и даже что-то выигрывал на районном и областном уровне.
Когда пришло время поступать в вуз, почему то не пошел на чисто кодерские специальности, а выбрал более аналитическую информационную безопасность. Пока учился в МИРЭА, мне особо не нравилось то, что преподают. Было очень много математических дисциплин, которые казались скучными и сложными. Программирование было слабым, да и тоже не цепляло особо своими задачами. Единственный проект за все время учебы, который мне понравился и запомнился, это ЭЦП методом RSA на С#.
 
На 4 курсе параллельно я работал в баре и думал, как и куда вкатываться. По ИБ предлагали меньше вакансий и мне это не заходило. Начал сразу, без какой-либо подготовки, откликаться на вакансии, в основном стажер-джун разработчик. Иногда даже не имея релевантных знаний по описанию вакансии, но с большим желанием получить первую работу. Сколько заняли поиски по времени уже не вспомню. Помню только, как купил Макбук на последние деньги в феврале 2017, в апреле пригласили пройти отбор на курсы по iOS от Сбертеха. Было 2 этапа интервью я их прошел, но не получил ответа. Подумал, что меня не взяли и оставили без фидбека, как это часто бывает в индустрии. Но оказалось интересней. Эйчар позвонила узнать почему я не прихожу на занятия и выяснилось, что письмо отправили моему однофамильцу, и в итоге я пропустил первые 3 урока на курсе)
 
Занятия проходили оффлайн в офисе Сбертеха примерно 3 раза в неделю часа по 2, поэтому я сразу бросил работу в баре и сконцентрировался на курсах по максимуму. Изучали Objective-C на протяжении 3 месяцев. Было набрано 2 группы, человек по 15 и по итогу работу получило человек 8-10 после собеседования в команды Сбербанк-Онлайн. Зп дали всем одинаковую (на сколько мне известно) 70к на руки. Мы были молодые зеленые и никто не торговался - все были рады такой возможности.
 
Сейчас это звучит как сказка, и такие, на первый взгляд, легкие вкатывания сложно представить на текущем рынке. Остается только верить, что те, кто пашет и работает над собой регулярно, смогут дойти до своей цели и не сдаться)

Вид из моего первого офиса прилагается)
 
#it #experience #random
Please open Telegram to view this post
VIEW IN TELEGRAM
Vibe собесов 😏
 
Посмотрел на днях интервью Антон проходит собеседование на iOS разработчика – оффер 550к. Оно навело меня на мысли о том, насколько важен именно вайб или ощущение от происходящего, для обеих сторон. Собственно многие позитивные флаги, поддержание правильной атмосферы и продемонстрировал Антон в этом, на мой взгляд, интересном интервью.
 
Теперь по порядку. Начинающие разработчики зачастую готовятся только по хард скиллам. Заучивают топ 100-150 вопросов по вставь_свой_язык_программирования и думают, что это оптимальный подход. На первых порах может быть так оно и есть, важно продемонстрировать свои навыки и компетенции, зачастую, выдавая заученные клише на популярные вопросы. Но когда речь заходить о высокой позиции, где от сотрудника будет требоваться намного больше, важно попасть в так называемый culture fit.
 
Бывает и такое, что интервью не задается, вопросы пошли душные и тд. Многие начинают нервничать, выдумывать, или говорят что-то невнятное. Люди поопытней могут сделать более хитрый маневр и постараться перевести поток мыслей и внимание интервьюеров в другую сторону, и попробовать порассуждать или даже убедить их в том, что вопрос не имеет прикладного значения или вообще бессмысленный. Собственно, похожие приемы и помогают выйти победителем по итогу.
 
Зачастую, после собеседования думаешь, что прошел его хорошо, ответил на все вопросы, но оффер так не получил. Но покопавшись глубже понимаешь - коннекта не было! Ты не смог убедить почему именно тебя должны позвать на работу. А бывает и наоборот. Вопросы сложные, ответы слабые, но получилось быстро понять, кого ищет компания, найти точки соприкосновения и дать им то, что они хотят в другом виде. 
 
Из своего опыта хочется вспомнить несколько моментов, для лучшего описания, что я имею ввиду. Однажды, я попал на собеседование в компанию, приложением которой я пользовался, и оно мне нравилось. Я понятия не имел, как там все устроено в техническом плане. Релевантного опыта тоже не было в этом бизнес направлении. После технической части, я думал, что провалил интервью и на эту позицию компания будет искать разработчика дальше. Но когда дело дошло до моих вопросов (я подготовил их заранее, что рекомендую делать всегда) диалог пошел намного бодрее, я смог продемонстрировать, что мне интересно, как я могу улучшить то, чем уже пользуюсь и люблю. Подсветил вопросы со стороны клиента и мобильного разработчика и даже некоторыми вопросами поставил в тупик интервьюеров. Я думаю, это сыграло ключевую роль при найме меня и я тоже, с радостью, согласился пойти работать в эту компанию.
 
Что еще важно продемонстрировать на интервью?
Рассуждения вслух. Телепатов среди нас нет, а вот умение переносить поток мыслей в поток вербальности - хороший навык. Любой, кто проводит собеседования обращает на это внимание.
Не сдаваться. Если не знаете, как ответить на вопрос или решить задачу, продолжайте набрасывать идеи и предлагать разные подходы. Важно осознавать, что в современных реалиях вся работа - командная, поэтому не обязательно вывозить все на своих плечах. Грамотный интервьюер всегда направит вас в нужное русло, чтобы вместе прийти к успешному успеху результату.
 
#interview #random #it
Please open Telegram to view this post
VIEW IN TELEGRAM
Method dispatch

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

Разберем несколько "tricky" примеров-вопросов с собеседований, которые могут действительно застать врасплох.
 
На первом скрине, у нас есть вызов метода сначала у структуры, а затем у структуры приведенной к протоколу. В случае если метод определен только в расширении протокола, мы получим ответы:
// In Struct
// In Protocol
Будет использована Static dispatch для метода из расширения протокола.
 
Если же мы добавим метод и в объявление протокола, то будет применен Witness table (скрин 2) и ответ станет:
// In Struct
// In Struct
 
На третьем скрине ситуация посложнее. Метод определен в протоколе и в его расширении. Есть класс B, который реализует протокол, но не перегружает метод из него. И есть класс С потомок класса B и переопределенный метод из протокола P. При вызове метода у класса С приведенного к протоколу, логично предполагать, что будет вызван переопределенный метод из класса С, но мы получаем вызов метода из расширения протокола 🤯.

Баг открыт много лет и пока не был поправлен. Собственно, как можно его закостылись смотреть там же)

#ios #swift #interview
Две работы 👨‍💻👨‍💻
 
Был у меня такой опыт и пришло время порефлексировать о нем и поделиться результатами эксперимента. Больше хотел попробовать для нового экспириенса и понять, как я себя буду ощущать при таком ритме жизни.

Работы были в разных часовых поясах, поэтому в совместительстве проблем не было. Созвоны и обязательные активности не накладывались друг на друга. На мой взгляд, такой вариант самый простой, иначе два компа и постоянные отмазки почему вы не придёте на митинг. Свободное время и силы на другие активности тоже оставались при правильном планировании дня и задач.
Если кто-то хочет прям жестко погрузиться в тему нескольких работ/проектов одновременно рекомендую https://overemployed.com. Тут найдете ответы на все ваши вопросы)
 
Суммарно выходило 11-12к$ в месяц - обе удаленки. Для себя решил, что мне это не подходит на тот момент точно, и не находил мотивацию продолжать.

Какие выводы я сделал?
Это история не масштабируема (хотя некоторым удавалось совмещать немыслимое количество работ) и не приносила никакого профита кроме денежного.
Некоторые, кто в теме, могут сказать, что 2 работы = 2 одновременных опыта. Да, но иногда этот опыт может быть негативный и полностью разъебать вас в лоскуты так, что за комп больше не захочется садиться)
Я не могу и не хочу заниматься вещами, которые не интересны, не драйвят и не дают ничего кроме денег. Деньги в чистом виде не делают счастливее. Если кто-то думает, что при росте зарплаты даже на 100% уровень счастья также вырастает в прямой зависимости, то это только первый месяц, а дальше привыкаете к новому уровню и опять мало)

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

Сейчас интересней развиваться как разработчик, менеджер и ментор, CEO, легенда и искать другие способы дополнительного заработка и пассивного дохода.
Знаю, что некоторые выбирают такой путь чтобы накопить котлету и все бросить (движение - FIRE) мне оно не близко. Почему бы просто не заниматься тем, что хочешь прямо сейчас, а не ждать еще 10-20 лет и не кайфовать в моменте. Мне ближе идея диверсификации доходов и инвестирование для спокойной жизни, но не так агрессивно, как FIRE.

Если есть вопросы пишите в коменты или личку. Если хотите рассказать о своем отношении или опыте в двух работах, то тоже велком
 
#It #random
Please open Telegram to view this post
VIEW IN TELEGRAM
Жизнь в Черногории 🏝

Прожил почти год тут. Самое время описать свои ощущения. Закинул на VC небольшую статью о моем опыте.

#random #experience
Please open Telegram to view this post
VIEW IN TELEGRAM
Было неожиданно, что на хабре так порвутся от безобидного взгляда на мой опыт жизни в Черногории. Уже нашитпостили овер 400+ комментов и 29к просмотров. Хотя на VC вообще всем ровно. Еще хабр додумался о каждом комменте сообщать мне на почту, сначала даже не понял, что с ней случилось. Хорошо хоть это мусорный адрес, как раз для спама)

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

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

P.S. Если у вас остались вопросы после прочтения, велком в комментарии. Если вы уже в Черногории пишите в личку - потусим)
Salary negotiation 🤑

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

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

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

🪙 10 правил переговоров о зарплате. Стоит всегда держать в голове.

💸 Level.fyi - можно узнать сколько платят известные компании своим сотрудникам на разных должностях. Полезно, когда вы ищите работу на новом для себя рынке. В том числе, предоставляет сервис по зарплатным переговорам. Готовы сделать все за вас)

🤑 Rora - отдельный продукт, который уже помог более 1к сотрудников увеличить оффер в топ компании FAANG+

🤑 Курс - Если вы планируете сменить работу или увеличить свой заработок, оставаясь на текущей работе, этот курс прокачает вас в этом моменте.

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

#interview #random #thoughts
Please open Telegram to view this post
VIEW IN TELEGRAM
Swift for Algorithm 👌

Swift - классный язык программирования, но он не очень удобен при решения алгоритмических задач на собеседованиях. Я не владею, на должном уровне, другими языками, поэтому выбора нет.
На алгоритмических секциях отводится ограниченное количество времени на решение задачи, обычно 30-50 минут, за это время нужно понять что от тебя хотят, придумать решение и написать его. Поэтому экономить приходится каждую минуту.
Хочу обратить внимание на несколько хаков, которые помогли мне ускорить и повысить качество решений на интервью в такие компании, как Yandex, Bloomberg и AliExpress.

1. Работа со строками
В Swift это какая-то мутота. Мы не можем спокойно обратиться по порядковому номеру символа в строке и получить объект типа Character. Нужно создавать объект типа String.Index и работать с ним.

⛔️
let myString = "Hello, Swift!"
let index = myString.index(myString.startIndex, offsetBy: 7)
let characterAtIndex = myString[index]
print(characterAtIndex) // "S"


Мне больше нравится работать со строкой, как обычным массивом. У меня это получается лаконичней и быстрее. Но уточните насколько критично для решения выделение доп памяти под новый массив. Например, на собеседовании в Яндексе такой прием был допустим и интервьюер согласился, что работа со строками не сильно место в Swift)

❇️
let collectionOfCharacters = Array(myString)
let characterAtIndex = collectionOfCharacters[7]
print(characterAtIndex) // "S"


2. Сложность стандартных операций
Системные методы могут работать не так, как мы предполагаем. Был случай, что я неправильно оценил сложность алгоритма, потому что не учел сложность метода removeAll у коллекций. В документации сказано, она О(n) я подумал, что константная. ⛔️

❇️ array = [] - решает проблему выше.

3. Сигнатура метода
Обычно алгоритмические задачи предполагают написание одного метода. Прежде чем ее решать нужно выяснить все требования. Часть из них можно поместить сразу в параметры (при условии, что вы пишите все с чистого листа без шаблона, как на LeetCode).
Допустим в задаче есть двумерный массив, тогда метод может выглядеть следующим образом:

⛔️
func testMethod(array: [[Int]]) -> Int {
let n = array.count
let m = array[0].count

...
}


Но можно лучше и вам уже не придется высчитывать границы этого массива:

❇️
func testMethod(array: [[Int]], n: Int, m: Int) -> Int { … }

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

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

var numbers = [0, 1, 2, 3]

⛔️
var sum = 0
for number in numbers {
sum += number
}
print(sum)

❇️
let sumFast = numbers.reduce(0, +)
print(sumFast)


Кода меньше, пишется быстрее - профит. Map, filter, compactMap, reduce и forEach пригодятся в 80% задач на собесах.

5. Работа со словарем
Первый вариант стремный, второй православный. Тут даже не обсуждается.

var dict: [Int: Int] = [:]

⛔️
if dict[0] != nil {
dict[0]! += 1
}

❇️
dict[0, default: 0] += 1


P.S. Если интересно узнать больше об алгоритмах и собеседованих - ставьте лайки. Расскажу, как я готовился и получил предложение о работе на One day offer в Яндексе.

#swift #interview #algorithm
Please open Telegram to view this post
VIEW IN TELEGRAM