Всем привет, тимлид-архитектор из команды Яндекс в треде. 20 лет опыта (40 лвл). Владею 20-ю языками программирования. Сейчас ведём разработку своего языка программирования. Тут буду давать советы нубам. Погнали. 1) Учите философию Unix. Это то, с чего нужно начинать программировать. Философия Unix — это некий сборник синтаксиса общий для всех ЯПов. По сути это книга, в которой описываются все программистские конструкции: функции, циклы, ароматизаторы, синтаксические соли и т. п. На чтение всей книги потратите полгода максимум, там 200 страниц нужной инфы (т. н. "базиса")
2) Часто нубы лезут в кодинг не зная чем поток отличается от процесса, а этот вопрос часто любят на собесах нубам задавать. Ответ: Поток — это определенная сущность программы. Каждый оператор (хотя это во многом зависит от реализации языка) выполняется отдельным потоком. Если говорить максимально просто, зачастую, сколько в программе if’ов, for‘ов и т. п., столько она и имеет потоков, но бывают и исключения (как в языке Haskell, детали гуглите). Всё потому имеют свою память. Процесс — вид потока, который исполняется напрямую в процессоре, а не в системном интерпретаторе потоков, как это делают классические потоки. Процессы имеют общую память (кэш процессора).
3) Когда собеседовал студентов, постоянно видел людей, которые не понимают, зачем вообще нужен фронтенд и что это вообще такое. Front-end (передний конец) — это начальная стадия изготовления программного продукта. Всё, на этом определение можно закончить. Никакие интерфейсы тут непричём, но тем не менее, фронтенд очень помогает кодерам пилить продукт вдальнейшем.
4) Многие считают динамическую типизацию злом, и совершенно напрасно. Динамическая типизация позволяет выделять как можно меньше памяти на выполнение программы ю, поскольку выделением памяти занимается сам компилятор, на не процессорные «ассемблеры». В свою очередь, процессорные ассемблеры являются более надёжным и «типобезопасным» способом выделения памяти. Они так же являются подвидом компиляторов, только разработаны по другому принципу.
5) Реляционные БД в последнее время набирают обороты, возможно, скоро вообще все переключатся на них, вытеснив этим самым так-называемые Key-value и Value-key базы данных. Так что можете забывать всякие виды join‘ов и прочую муть, связанную с нерелятивными БД, на собесах спрашивать это уже почти не актуально (хотя всё-таки знания всегда поощряются).
>>236468647 (OP) расскажи насколько к вам тяжело попасть? я когда вкатывался мне хрюша от яндекса стучалась но я отказался т.к. там обязательное очное интервью а я живу очень далеко от любого их офиса, плюс в интернете пишут шансов его сдать мало очень
6) Все современные языки похожи друг на друга. К примеру, Python, PHP и Java исполняются на одной и той же виртуальной машине (JVM), названной в честь Jav’ы. Языки этой группы используют процессы вместо потоков, за что получили быстрый перформанс и ненадёжность значений переменных.
>>236469510 Пидораш, ты хоть знаешь, когда какие сравнения применять нужно? Ты ещё скажи, что === это сравнение с приведением типа (за такой ответ я сразу джуна нахуй с собеса шлю). Гугли string interning, из-за этой хуйни нельзя строки и инты сравнивать ===. В чем многие заблуждаются, кстати.
7) Сразу учитесь использовать дебаггер. Кратко: «баг» (англ. «жук») — ошибка программы, связанная с утечкой памяти процессора (кэша) на жесткий диск/ssd. Но в современном обществе школьников этим словом называют любую нежданную хуйню, вплоть до неправильных текстур в играх.
9) В языках высокого уровня (Java, Python, Ruby, Rust — т. е. группа «процессорных» языков, о которых я говорил выше) отсутствуют «исключения». Потому что это, собственно, группа высокоуровневых языков, выполняющихся близко к процессору, поэтому в них нет такой абстракции, как «исключения». Языки высокого уровня и так подвержены ненадежности (к примеру, тяжелая высокоуровневая прога втупую может сменить вам значение переменных или значения внутри массива), если бы в них добавили исключения, это был бы очередной C# (то есть очередной полный провал не принимайте близко к сердцу, шарповики).
Окей, тогда вопрос: Что лучше выбрать человеку, который в принципе далёк от проги, но очень хотел бы этим заняться? Где есть, относительно программирования, конечно, низкий порог вхождения и в то же время достаточно красивые перспективы?
>>236469649 >за такой ответ я сразу джуна нахуй с собеса шлю А что полотер на собесе у вас в компании делает и почему ему позволяют кого-то нахуй слать?
>>236470004 Ну это вопрос с неоднозначным ответом. У ObjectiveC очень неплохие перспективы в будущем, при этом он пиздец сложный из-за т.н. "червивой типизации" ("worm typing"). Язык Rust, например, просто как 2+2, но в будущем вряд ли пригодится и зарплаты уровня xml верстальщиков. Рекомендую Delphi. Идеальный баланс — и нужный и простой.
10) Конечно же, я не могу не упомянуть ООП (Объектно Ориентированное Программированиe). Все студентишки знакомятся с этой парадигмой, изучают классы, рекурсивность и т. п.. Объектно Ориентированное Программирование позволяет эффективно расходовать оперативную память, кэш процессора, и даже энергомощность блока питания за счёт того, что позволяет манипулировать остатками ячеек памяти уже пройденных компилятором, путём представления ячеек (или их совокупностей) через т. н. объекты. Классы описывают эти самые объекты. Всё очень просто.
11) Алгоритмы и математика - основа программирования, без них невозможно устроится на работу. Базовые структуры типа двоичного дерева - это уровень школы, B+ деревья, красно-черные, балансировки - стажёра. Джун должен понимать Диница, теорему Воронова, теорему Пика и Укконена. Мидл уже должен знать основы математики, типа китайской теоремы об остатках и ряды с остатком в форме Тейлора и Маклорена, чуток теории групп. Минимум сеньёра - теория Галуа и когомологии де Рама.
>>236469936 Помогу опу дополнить наиболее часто встречающиеся на собесе вопросы. Часто, вас будут просить произвести манипуляции со строкой, например произвести инверсию строки. Это вопрос со вторым дном, ведь во многих языках строка является мьютейбл ( то есть, неизменяемым объектом). Чтобы у вас получилось поменять строку добавьте у ней volatile constexpr кейворд и только после этого продолжайте писать алгоритм
12) Все языки программирования делятся на Тьюринг-полные и Тьюринг-частичные. Тьюринг полные языки так называются, потому что там присутствуют операторы, придуманные самим Тьюрингом (конструкция if, циклы while и for, а также тернарный оператор x ? y : z) Забавный факт: именно благодаря тернарному оператору Тьюринг смог разгадать усложненную версию шифровальной машины "Энигма" с четырьмя роторами. Хаскелль - пример Тьюринг-частичного языка, т.к. там отсутствуют конструкции for и while, но присутствует if.
13) Никогда не используйте локальные переменные. В группе Pascal-подобных языков они обозначаются ключевым словом lovar (Local Variable, "ловары"). Они значительно уменьшают нагрузку на процессор, но совершенно не годятся для моделирования, а так же приведёт к «засорению» памяти. Зачастую их используют бородатые дяди, когда пишут эксплойты (эксплоит — сленговое название ядра ОС). Они, конечно же, знают, где их нужно применять.
14) Сейчас существует огромное множество фреймворков для создания практически чего угодно. Большинство из них языко-независимые (language-free), и представляют собой прокачанные компиляторы. Для каждого второго есть графический интерфейс (для совсем нубов — можно работать через граф. редакторы типа пейнта/фотошопа). Для работы через Photoshop рекомендую ReactJS, написанный на языке Java.
15) Популярность так называемых «декларативных» языков программирования (т. е. таких, в которых декларации процессору хранятся в так называемом «стэке» деклараций) — лишь тренд. Скоро все эти ваши Ады и Perlы уйдут в тень, и вакансий будет мало. У себя в компании мы отказываемся от этих языков, в основном потому что проёбы на кастомных декларациях ведут к необратимым потенциальным ошибкам.
>>236470710 Так в другом говне смысла и нет. Всякие Vue и Реакты придумали зумерки, которые выёбывались перед начальством, чтоб их не поперли. Короче хуйня эти твои жс-фреймворки, на jQuery всё уже готовое есть.
Шаблоны проектирования — типичный вопрос на собеседовании. Самый популярный шаблон — «Dependencies injection» — позволяет хранить данные («внедрять», «инжектировать») в оперативную память. Реализуется как две функции, при этом одна передаётся в другую. Вот пример простой на C++. ``` function void injector(func *funcPtr) { stdlib::ram::memorize(&funcPtr); }
function injectee() { stdout::cout(&"Hello world"); }
>>236471218 а смысл жиквери? у нее было два преимущества - удобный селектор - его завезли в ваниль и удобный аджакс, его тоже завезли в ваниль, собственно все
16) Модель OSI включает три уровня операционной системы (ОСи): уровень пользовательского приложения, уровень операционной системы и уровень драйверов. Стек TCP/IP относится ко второму и первому уровням. Создано это всё чтобы разграничить программы от драйверов.
17) IP-адрес это набор цифр (от -7 до 256), по которым твой комп может найти товарищ майор. Диапазоны адресов выдают провайдерам правоохранительные органы государств, в которых провайдеры работают, у нас это ФСБ, ну а дальше провайдер выдаст тебе какой-нибудь айпишник (4 цифры разделённые точкой, иногда добавляется слэш "/" и ещё три цифры, для ip-адресов v5 и v6) чтобы можно было понять кто это у нас смотрит ЦП. IP-адреса бывают белые и серые. Серый отличается от белого тем что провайдерам влом сделать всё как надо и под одним адресом в сети может оказаться много разных пользователей. То есть, если у тебя серый IP, твой адрес может совпасть с адресом какого-то Джона из Калифорнии на другом конце света.
>>236470829 братуха, жиза, я после того, как поработал над тремя проектами (справедливости надо сказать, что веб-дев был только один из трёх, но какая в сути посох разница, куда не ткни, веб морду всем подай), когда я прокурил всю эту фронтэндовую хуйню, у меня посох на погромирование сильно упал.
есть ЦСС - бесконечно простая хуйня, в которой никакой ООП параши нет, чисто низкоуровневые строки стилей. юзай - не хочу. нет, у меня третий год не было повышения по зарплате, я придумаю то же самое, но с другим синтексисом, и эта хуйня после компилирования всё равно превратится в тот же самый ЦСС, и назову её СЦСС, будет заебись!
есть джейквери - охуевший инструмент, который тебе всю дом модель как хочешь даст, нет, давайте прикрутим к ней фреймворк, будет фреймворк над фреймворком через фреймворк. хотя ладно, на промышленном уровне JS приложения возможно с vue будет чуть проще организовать работу в команде и передачу потом документации нуфагам, если они понимают принципы MVC.
после абсолютно ебанутых тим лидов, у которых с утра одни планы, вечером другие, которые ни один спринт сами же вытерпеть не способны, я понял, что погромисту не просто дохуя терпения нужно, чтобы в команде работать, но и очень часть быть именно что терпилой, чтобы от мудаков, которым понравилась какая-то свистоперделка на каком-то сайте, ради клонирования которой они без задней мысли готовы заставить меня джуниора переделывать здоровую часть работающего бэкенда, при этом эта свистоперделка к оригинальному ТЗ была не пришей к пизде рукав и сырцов нет, сиди реверс инженерь велосипед.
короче устроился на работу в компьютерной поддержке в госструктуре. сижу, пержу, 80% времени листаю сосач, 20% времени выполняю простую работу уровня переустанови шиндовс и настрой цифровую подпись, читаю книжки, погромирую для себя и чисто для удовольствия. да, зарабатываю наверное раза в три меньше, чем на предыдущих работах, но хотя бы общение не угнетает психику.
как же хорошо было, когда фреймворки придумывались для реализации специфичной хуйни типа трёхмерной графики, или запаковки миллионов строк простого кода в однострочные функции.
Как все знают - программирование это довольно новая сфера. Поэтому НИ В КОЕМ СЛУЧАЕ не слушайте старых пердунов вроде опа. По крайне мере насчет того КАК нужно начинать вкатываться в IT. Их советы хорошие, но что-то советовать для вката с учетом современных реалий и быстрых темпов эти старые хрыщи вообще не могут. По их методике вы НИКОГДА не вкатитесь.
18) TCP это один из стандартных протоколов (правил по которым программы общаются между собой через сеть). То есть он документирован - ты можешь найти в инете описания (RFC) и там всё расписано кто когда и какие байтики шлйт. UDP это undocumented protocol т.е. публичного стандарта нет и что там внутри знают только разработчики программы - например в онлайн играх.
>>236472092 уже почти 3 года опыта, мидл! в целом, такое же мнение было и при джунстве
деды могут дать хороший совет как развиваться, но как вкатываться - ну нахуй, при их способе вката ты будешь очень долго дрочить всякую хуйню, которая первые годы твоей работы тебе даже не понадобится, и которую ты бы мог учить уже получая зарплату
>>236471908 >Спасибо Пожалуйста. Чел, вот ты если шаришь. Я хочу вкатиться в программирование с создания и монетизации приложений в AppStore и GooglePlay. Ну сначала оливье конечно буду делать ради трёх копеек, понятно, но есть всякие задумки более сложных вещей, которые я в одного не потяну, кажется. Насколько вообще реальны возможности влиться в этот рынок, учитывая, что у меня хорошие технические способности и дохуя айсикью (сколько, не скажу, тут не поверят просто). Спасибо.
>>236472164 Вот тупые америкосы да лучше бы В ХРАНИЛИЩИ В Vuex/Redux ДЫЫЫ? УХ ЩАС ЧЕРЕЗ СЕТТЕР (АКА "МУТАТОР") ЗНАЧЕНИЕ ПОМЕНЯЕМ А ПОТОМ ЕЩЁ И ACTION ЗАДИСПАТЧИМ
>>236472492 Хуле ты высрал, уебок? Про локальные состояния компонента не слышал? Как ты в этом своём жиквери узнаешь об изменениях? На сраное событие подпишешься? А отписаться не забыл?
>Насколько вообще реальны возможности влиться в этот рынок? >учитывая, что у меня хорошие технические способности и дохуя айсикью
Учитывая хорошие способности по сфере, и дохуя айсикью, можно влиться куда угодно да и айсикью не всегда нужно, можно тупо навыками и интересной идеей заработать
Ты тут нахуй нужен, лучше ка по добру уёбывай отсюда, пока тебя не нашли серьезные ребята. Лучшие примени свои it навыки и почисти кэш, выкинь симку и протри монитор. Ты под колпаком уже. Ещё 1 пост и за тобой поедут.
>>236472414 приложения в наши дни делать несложно, реакт нейтив, флаттер, вот это все, я еще до вката в веб написал пару приложений на реакт нейтиве, правда в плеймаркет не выкладывал, после вката времени не было
>>236472414 нет никакого рынка приложений для смартфонов. 80% там - веб приложения, которые просто рендерятся в мейн активити, и максимум интерактивности - через системные сервисы местоположение до ближайшей точки найти.
19% - либо игры, которые сами по себе довольно специфичная тема, либо большие операторы данных типа сбербанка и яндекса, куда кабанчиком не вскочишь.
оставшийся 1% - специфическая фриланс хуйня, когда какому-то директору какой-нибудь компании понадобилось своё приложение со свистелками и перделками для своей компании (аудитория тыща рыл).
19) handshake это рукопожатие т.е. когда клиент соединяется с сервером по одному из UDP-протоколов то они обмениваются первоначальными пакетиками с помощью которых проверяют например версию друг друга, убеждаются что оба используют один и тот же протокол и всё в таком духе. Handshake нужен ИСКЛЮЧИТЕЛЬНО UDP-протоколам (Undocumented Protocol), потому как они плохо документированы, и им, чтобы общаться друг с другом, нужно обменяться некоторой информацией.
>>236472670 >Учитывая хорошие способности по сфере, и дохуя айсикью, можно влиться куда угодно Интуитивно я это понимаю, притом, надеюсь, ты же тоже понимаешь, как много неясностей в любом новом незнакомом деле. >можно тупо навыками и интересной идеей заработать Навыков очень мало, а идей хватает. Ну об интересности судить сложно, в нынешней сфере оперирую количеством идей. Из 10 взлетает одна, остальные дорого/сложно/для задротов/ошибочны. Мне кажется, мобильные приложения были бы неплохим подобным фильтром для отсева хуёвых идей, но я плохо представляю трудозатраты для реализации каждой в отдельности.
20) Юнит-тесты: Есть такой фрэйм (от англ. "Frame" - "кадр") для игр Unity. В этой же сфере гейм-дева есть и концепция Unit-тестов. То есть по факту, если вы не осилили IT в целом и программирование в частности, можете искать вакансии Unit-тестеров - они просто ищут баги в играх, написанных на Unity. Работа не шибко для умных, но требует усердий. Объясняю почему возник именно такой термин: Unity в виду своей простоты является самым популярным игродвижком. Соответсвенно, на нем больше всего игор, твои любимые киберпунки и гта5 написаны на нём, вот в геймдеве и появился такой отдельный термин для тестирования игр на Unity.
>>236473469 Ну у меня все задумки специфичны и относятся к той сфере, где я сейчас работаю. В принципе там все пользователи сами будут в некотором смысле разработчиками, только они не программы разрабатывают, а реальные предметы. Так что рынок будет маленький, да. Но сейчас он вообще пустой.
21) Про следующий прикол мне как-то рассказывал сам Кэн Томпсон, когда я работал в гугле в середине нулевых. Очень часто на собесах дают задание - написать прогу, которая переворачивает слово. Типа 'анон' -> 'нона'. Я тоже часто даю это. Если человек берет библиотечную функцию, то сразу шлю нахуй. Если пыжится, реализует через цикл - то еще даю шанс. Если реализует рекурсивно - то получает плюсик. Но есть один очень элегантный способ, который юзают только гуру. Короче, все программы сначала переводятся в язык ассемблера. Это наверно все знают. Но гораздо меньше людей знают, что у ассемблера 2 разных синтаксиса - от компании "Эндрю Таненбаум энд технолоджис" - сокращенно AT&T и от Интела. Суть в том, что эти 2 языка зеркальны друг по отношению к другу (один начинает работать с начала стека, а второй - с конца). Шарящий челик, зная, какая версия ассемблера в системе, может обмануть процессор, скомпилировав код под другой ассемблер - и, не сложно догадаться, - вся программа работает в обратном порядке, то бишь, в системе с Intel обычный код println("анон"), скомпилированный в AT&T выведет на экран "нона", т.к. байты поместятся в стек в обратном порядке