• На собеседовании сказали, что не все функции - замыкания. Так ли это?

    greenkey
    @greenkey
    программист
    Не стоит ругаться и обвинять друг друга в некомпетентности ;-) не знать чего-либо совершенно нормально, даже если ты лет двадцать без устали кодишь. Настоящего профессионала отличает не то, что он знает вообще все, а то, что он прекрасно осознает, что много чего не знает, и его это нисколько не смущает - мы учимся постоянно. Для меня, например, некоторые моменты связанные с closures оказались новыми, и я решил, что надо поглубже погрузиться в данный вопрос.
    А он не так прост, как может показаться на первый взгляд, и содержит в себе целый ряд нюансов, поэтому чрезвычайно важно 1) оперировать одинаково понимаемыми терминами, 2) пойти в документацию, а именно в ecmascript, и, как правильно заметил dollar , проверить, как это было реализовано уже в реальной реализации javascript, в движке, например V8.
    Вопрос, хоть и теоретический, но очень важный, потому что проливает свет на понимание работы современных языков "изнутри", что безусловно важно хорошему программисту.
    Предлагаю всем, кого вопрос также заинтересовал, немного погрузиться в теорию, для начала вот это:
    https://262.ecma-international.org/12.0/#sec-abstr...
    более развернуто в статье, хоть и старой, но принцип closure не поменялся
    dmitrysoshnikov.com/ecmascript/chapter-6-closures
    Оно же на русском:
    dmitrysoshnikov.com/ecmascript/ru-chapter-6-closures
    Ответ написан
    Комментировать
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    Похоже вас поймали на том что в js кто-то решил переопределить термин "замыкание"... Т к javascript далеко не первый язык, в котором есть нечто, претендующее называться термином "замыкание", то следует в первую очередь рассмотреть общее определение. Возьмём его из википедии:

    Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своей области видимости.
    Замыкание, так же как и экземпляр объекта, есть способ представления функциональности и данных, связанных и упакованных вместе.
    Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. Синтаксически это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции.
    В случае замыкания ссылки на переменные внешней функции действительны внутри вложенной функции до тех пор, пока работает вложенная функция, даже если внешняя функция закончила работу, и переменные вышли из области видимости.[1]
    Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.


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

    In programming languages, a closure, also lexical closure or function closure, is a technique for implementing lexically scoped name binding in a language with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment.[1] The environment is a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.[b] Unlike a plain function, a closure allows the function to access those captured variables through the closure's copies of their values or references, even when the function is invoked outside their scope.


    О! А тут нет никаких "функций, вложенных в функцию" и нет никаких "создающихся каждый раз" Хм... Интересно. Ну за то есть абзац о том как появились замыкания:

    The concept of closures was developed in the 1960s for the mechanical evaluation of expressions in the λ-calculus and was first fully implemented in 1970 as a language feature in the PAL programming language to support lexically scoped first-class functions.[2]

    Peter J. Landin defined the term closure in 1964 as having an environment part and a control part as used by his SECD machine for evaluating expressions.[3] Joel Moses credits Landin with introducing the term closure to refer to a lambda expression whose open bindings (free variables) have been closed by (or bound in) the lexical environment, resulting in a closed expression, or closure.[4][5] This usage was subsequently adopted by Sussman and Steele when they defined Scheme in 1975,[6] a lexically scoped variant of Lisp, and became widespread.


    Ага. Оказывается первоначально они появились в такой не конвенциональной, с сегодняшней точки зрения VM, как SECD... И их создатель прямо говорит, что это код плюс данные. Далее термин применяют к лямбда-выражениям. Ничего не говорится, должны ли эти выражения возвращаться функцией, или достаточно того, что бы они захватывали переменные из своего лексического (или динамического, как в common lisp) окружения. Далее нам сообщают, что некие мистеры, Сасман и Стил, спустя каких то 11 лет добавили это в свой язык Scheme... Ну что же. Посмотрим замыкания в Scheme... А именно откроем книгу Сасмана и соавторов "Структура и интерпретация компьютерных программ" или "SICP" Первый раз (исключая содержание) слово "замыкание" встречается в главе 2 "Поcтроение абстракций c помощью данных"


    Важная идея в работе с составными данными — понятие замыкания (closure): клей для
    сочетания объектов данных должен позволять нам склеивать не только элементарные
    объекты данных, но и составные.


    Но, как выяснилось, это не те замыкания... Это замыкание в том смысле, что структуру одного типа (в данном случае пары) могут ссылаться на самих себя. И это то как термин "замыкание" понимают математики. Далее в SICP никаких других определений замыканий нет (несмотря на то, что само их использование конечно же есть) Ну ничего не остаётся как посмотреть что же сегодня называют замыканиями в языке Scheme... Гугл по этому запросу выдал первой ссылкой: https://www.cs.utexas.edu/ftp/garbage/cs345/schint....
    Цитирую:

    Procedures are Closures
    Scheme procedure's aren't really just pieces of code you can execute; they're closures.

    A closure is a procedure that records what environment it was created in. When you call it, that environment is restored before the actual code is executed. This ensures that when a procedure executes, it sees the exact same variable bindings that were visible when it was created--it doesn't just remember variable names in its code, it remembers what storage each name referred to when it was created.

    Since variable bindings are allocated on the heap, not on a stack, this allows procedures to remember binding environments even after the expressions that created those environments have been evaluated. For example, a closure created by a lambda inside a let will remember the let's variable bindings even after we've exited the let. As long as we have a pointer to the procedure (closure), the bindings it refers to are guaranteed to exist. (The garbage collector will not reclaim the procedure's storage, or the storage for the let bindings.)

    Here's an example that may clarify this, and show one way of taking advantage of it.

    Suppose we type the following expression at the Scheme prompt, to be interpreted in a top-level environment:

    Scheme> (let ((count 0))
               (lambda ()
                  (set! count (+ count 1))
                  count)))

    ##

    Evaluating this let expression first creates a binding environment with a binding for count. The initial value of this binding is 0. In this environment, the lambda expression creates a closure. When executed, this procedure will increment the count, and then return its value. (Note that the procedure is not executed yet, however--it's just created.) This procedure, returned by the lambda expression, is also returned as the value of the let expression, because a let returns the value of its last body expression. The read-eval-print loop therefore prints a representation of the (anonymous) procedure.


    Что имеем ? В Scheme - вообще любая функция - это замыкание! Т к она всегда захватывает контекст, даже если там пусто!. Что видим в коде ? Ну с точки зрения Scheme тут конечно вложенная функция, т к let - это на самом деле lambda, но так происходит потому, что в Scheme нет переменных в понимании js. В js же можно считать, что глобальный контекст - результат действия нечто, что эквивалентно let. Захватывает ли любая функция в js этот контекст ? Не знаю. Но точно знаю, что в вашем примере это определенно так - х часть контекста, который захватывается функцией. Кто хочет поспорить - идите спорьте с создателями Scheme (скажите, когда попкорн покупать, я посмотрю как вас пороть будут. Набежало тут вайтишников =)) Кто то может сказать "а вот у нас в js замыкания определяются не так" На что я отвечу: знаете, товарищи, а идите ка вы лесом! Если есть однажды созданный и определенный термин, нужны весьма веские причины что бы менять его определение. Желания левой ноги очередного вайтишника тут не достаточно.
    Ответ написан
    30 комментариев
  • Что почитать про парсинг?

    BadCats
    @BadCats
    К ответу datka - как к реальному и чисто прикладному - добавлю, что еще можно углубиться в теория формальных языков, грамматики (как работают компилятор, интерпретаторы) - что, возможно, позволит писать более универсальный код - не так сильно привязанный к верстке страницы - т.к можно пытаться анализировать html/xml - на уровне токенов и лексем, даже с кастомными классами и атрибутами для элементов. Но это очень сложная область и возможно, что "овчинка выделки не стоит".
    Ответ написан
    Комментировать
  • Conventional Commits - к чему относится создание структуры проекта?

    @mkone112
    Начинающий питонист.
    Я могу ошибаться, но основываясь на собственных измышлениях и ответах со stackoverflow - это refactor. Действуй методом исключения. Это явно не feature, не docs, не chore. По сути refactor, это не совсем про рефакторинг, это вообще все что меняет код, но не относится к другим типам изменений.
    Ответ написан
    Комментировать
  • Какой необходимый уровень знаний для junior React.js Разработчика?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    UPDATE: реальные тестовые задания и разборы здесь, ответы на все вопросы из поста в моем блоге об обучении react.

    не включая основы js

    Извините, но стандартная задача, про "напишите функуцию add, которая при вызове add(1)(2) вернет 3" - многих положила на лопатки =) Поэтому будьте готовы..

    React
    0) Какую проблему решает react ?
    1) Мгновенно ли срабатывает setState? Если нет, то как выполнить код, который 100% выполнится после того, как новый state будет установлен?
    2) Зачем многие постоянно пишут в constructor: this.FUNCTION_NAME = this.FUNCTION_NAME.bind(this) и отсюда вопрос вытекает чему равно this в разных местах вашего компонента...
    3) в каких методах жизненого цикла стоит выполнять xhr запросы? В каких стоит "обновлять state на основе props"?
    4) Что будет если вызвать this.setState в render методе компонента?
    5) зачем нужен componenWIllUnmount, приведите пример..
    6) Контролируемые, не контролируемые компоненты
    7) Как организовать роутинг в реакт приложении? (ответ: взять react-router - подходит, но было бы круто, если бы вы рассказали, как он примерно работает)*
    8) Зачем нужны propTypes? Что происходит с ними в production сборке?
    9) Как можно удобно "отлаживать" чужой код приложения, написанного на react (намек в сторону React devtools)
    ...

    Redux
    0) Какую проблему решает redux?
    1) Зачем многие создают типы действий NAME_REQUEST / NAME_SUCCESS ? А заодно, что такое "действие", а что такое "создатель действия"...
    2) Что такое редьюсер? Можете написать простой редьюсер без react/redux?*
    3) Для чего нужен redux-thunk? Как он работает? Напишите (можно псевдокод) асинхронный создатель действия (либо, если надоело говорить "терминами" - асинхронный aciton)
    4) Как компоненты приложения получают "пропсы" из "стора"?*
    5) Можно ли (и считается ли это нормальным) использовать state, если используется Redux?
    6) Почему в reducer'ax мы возвращаем новые объекты? Приведите пример, когда вы возвращаете новый объект, а когда тот же самый.
    6.5) А так же, "как в js вообще это работает?". Например:
    let obj1 { name: 'Test', age: 100 }
    let obj2 = obj1
    obj2.name = 'Test_new'

    Что будет в obj1, почему? В каких случаях объекты могут быть равны?
    7) Что возвращает функция connect (из react-redux)?
    ...

    Общее:
    0) package.json
    1) Webpack, gulp, etc...
    2) node.js
    3) promise

    Что-нибудь практическое:
    1) Как бы вы валидировали форму, если ошибки валидации приходят после submit'a ее на сервер..
    2) Почему не работает следующий код, сделайте чтобы работало
    ...
    На истину не претендую, но такие вопросы имели место быть на собеседованиях. В беседе можно многое разузнать дополнительными вопросами и так далее. Так же, если часть вопросов вам неизвестна - не беда, многие и на половину ответить не могут.

    p.s. возможно дополню...
    p.p.s. звездочкой отметил, на мой взгляд не самые необходимые для junior-собеседования вопросы.
    Ответ написан
    31 комментарий
  • Поздний старт в ИТ - есть ли шансы?

    @SanDiego8
    Мой батя пошел на врача в 25, а учится там 7 лет ! В 32 он только закончил учебу!
    Мой дед еще при советском союзе закончил высшую партийную школу в 43 года ! (там учился 5 лет!) После чего его направили на работу в совершенно незнакомую ему сферу деятельности. Начинать новое НИКОГДА не поздно !

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

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

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

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

    qonand
    @qonand
    Software Engineer
    Читать стоит классику жанра:
    Э.Фримен, Э. Фримен — Паттерны проектирования
    Э.Гамма, Р.Хелм, Р.Джонсон, Дж.Влиссидес. — Приемы объектно-ориентированного проектирования. Паттерны проектирования
    М.Фаулер - шаблоны корпоративных приложений

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

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    А просто со временем, до всех доходит, что программирование это не интересные исследования, познания неведомого как в фантастике, прикручивание двумя кликами новых движков.
    А на деле - это еще и множество рутинной и кропотливой работы, которая по сути - скучная, однообразная, И ее процентов 80.

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

    @kttotto
    пофиг на чем писать
    Во первых нужно закладывать время на разбор легаси кода, об этом сразу надо говорить с заказчиком. Зная задачу, всегда понимаешь, ЧТО надо написать, но в случае с легаси надо еще и понять КУДА это написать. Без этого никак и поэтому это время надо учитывать.

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

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

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

    А вообще чтение легаси, это дело опыта. Я помню первые свои чужие проекты, я думал, что попал в ад. Сейчас копаться в чужом коде, это мое любимое дело) Я могу часами сидеть разбирать чужой код, что начальству приходится меня попускать: "я понимаю, я тоже это люблю, но надо дело делать")) Люблю просто на гитхабе полазить по чужим проектам, посмотреть как люди думают.
    Ответ написан
    Комментировать
  • Как понять докер, если ничего не понятно?

    neuotq
    @neuotq
    Прокрастинация
    С Докером все просто, нужно только немного повернуть устоявшуюся логику в мозгах.
    Основная суть и идея это запуск каждого приложения (php, mysql и тд) в своем контейнере. При этом сам php будет думать что запущен как всегда в обычной полноценной ОС. Поэтому контейнер собирают так, чтобы удовлетворить минимальные требования программы которую он будет содержать.
    Вот так ты и запускаешь кучу контенейров и у тебя выходит сухогруз(у докера там кит) с контейнерами. Зачем это все? Для облегчения администрирования и обновления ПО, а так же для минимизации издержек при глюках/падения какой-либо программы.
    Все контейнеры максимально независимы друг от друга, при этом есть механизм когда контейнер завист от другого. Например контейнер phpmyadmin, нет смысл запускать без контейнера mysql или mariadb, работать он не будет.
    Общение происходит в основном через сеть, поднимается внутренняя сеть. Так же конечно через диск, все предусмотрено.
    Когда все сделано как нужно, с системного администратора снимается гигантский труд по отслеживанию обновлений, совместимости этих обновлений и тд.
    Нужна тебе версия php5.6, запустил коннтейнер с ней, нужна php7.1, запустил его, при этом не нужно никаких приключений с обновлением кучи пакетов, возможных конфликтов с другими нужными программами и тд.
    Так же удобно решаются вопросы масштабирования, появляются мелкие удобные бонусы по дополнительной автоматизации , уменьшаются риски падения ОС в целом, падает если что только контейнер и тд и тп, в результате есть реальная возможность даже небольшим проектам добиться у себя около нулевого даунтайма.
    Вот еще послушай Кирилл Мокевнин из Hexlet пытается понятным языком рассказать что это и зачем. И кстати он делает упор на понимания зачем понадобилось думать и какие проблемы решали когда пришли к Докеру, это ключ к пониманию всего другого.
    PS кстати и сам Hexlet крайне советую, они наверное лучшие в рунете для начинающих программистов
    Ответ написан
    1 комментарий
  • Есть ли стандарты обязательных требований для Front-End разработчика(junior, middle, senior)?

    Отличие джуна, мидла и сеньера не в количестве страшных узнаваемых ими слов, а в уровне постановки задач.
    джуну задача ставится - ну ка запили мне класс/функцию,
    мидлу - запили ка мне приложение,
    сеньеру или тимлиду - вот тебе требования, вот тебе документы по процессу, вот команда. пилите.
    утрированно как-то так
    Ответ написан
    1 комментарий
  • Как стать продвинутым сайтоклепателем (формоклепателем) и отправиться на каторгу, чтобы пахать за говяжий дошик и оплачивать сарай?

    @rpomo3eka
    Давайте тоже отвечу, такой же борщ варился и в моей голове. Сейчас мне 35, я програмлю только для заработка, и для того чтобы ездить зимовать в азию.
    Про личную жизнь. Ну я не был адским нолайфером, в 20 лет я познакомился со скромной хорошей девушкой, да так и остался с ней навсегда, периодически ссорились по началу, но до сих пор вместе, сыну 6 лет.
    Точно также как автор поста, я думал-гадал, не мог понять, что мне делать и куда податься. Работать я пошел примерно в 18 и сразу бросился в омут php, так как наврал на собеседовании, что я его знаю. Пришлось узнать. Тогда, конечно, было не особо много вариантов что учить, так как ничего из современных технологий еще не было, даже jquery. Я освоил php и яваскрипт и потом поплыл куда глаза глядят, увольняясь примерно раз в 2 года (так получалось, не планировал) и устраиваясь в крупные фирмы на такую вакансию как "специалист по сайту".
    Когда я уходил с работы, в перерывах я сидел дома по 2-3 месяца, готовя свои "стартапы" в попытках заработать. Как-то. Ну хоть как-то, но не идти в офис. НИЧЕГО не заработал вообще. Хотя даже сделал один сайт, на нем было 2 тысячи человек в день. Но время тикало, денег не было, и я опять шел искать работу. Потому что жена же, я же не могу совсем хикковать дома на хлебе и воде.
    И вот на одном из мест я реально задержался, аж на 5 лет. Пришел туда как спец по битриксу (которого ВООБЩЕ не знал). Но я освоился и освоил битрикс кое-как сам. Хорошая компания, зарплата тоже норм. Ну и как-то сидел-сидел, читал книжки по саморосту и улучшению свой жизни и как разбогатеть.
    И так мне все однажды на100пи3дело вдруг, что у меня начался кризис. Но начался он не просто так. Любой кризис рождается после реальных потрясений, обычно когда человек вдруг осознает, какое он г0вно.
    Я пошел искать работу по профессии PHP-программист на ЗП в два раза больше моей. Ну типа, я же пхп занимаюсь, битрикс же на пхп, я же не г0вно, я молодец, я красавчик. И вдруг оказалось, что я такое дерьмо, что на собеседовании не могу ответить на вопросы об ООП и о системах контроля версий... Фиаско.
    Я понял, что это просто пипец, надо что-то делать. Я решил бросил курить, я похудел на 10 кг, я прыгнул с парашютом, я устроился на работу в компанию, которая делает сайты на битриксе обычным программером. Директор - парень моего возраста, лет к 30 тогда, вдохновленный своим делом, обещал мне ЗП 80 минимум. Я получил в первом месяце 30, в следующем месяце 40. Мой испытательный срок закончился и он сказал "Ну вот, твой испытательный закончился, в следующем месяце ты делаешь вот этот проект и получишь 50 тысяч".
    А я такой на переменах весь, понимаете? Я худею, я не курю уже две недели, я с парашютом сиганул, я освободится из кабалы предыдущей работы, я искал ЗП от 70! А тут целый месяц ОЧЕНЬ муторного проекта и 50 т.р. Бюджет проекта 250 тысяч, а мне дадут из них 50! И сайт буду по факту делать я целиком, менеджер мудак, дизайнер тормоз, верстальщик не знает что такое bootstrap!
    Я ушел и повесил объяву на авито по сайтам.
    И через день мне позвонили первые клиенты, которым нужно переделывать меню на сайте. Сайт на битриксе. Были еще разные клоуны и разные проекты, много мусорной работы, но деньги капают и я удаленник, все ок.
    И я все заседал на сайте авд ру, читал отчеты о путешествиях, такое типа хобби. И тут жена говорит "А почему бы нам не уехать тоже в тай на месяцок?". И я такой "БЛИН, а чо бы нет то правда??? И почему на месяцок????" И мы уехали на первую зимовку на 4 месяца. Это было финансово не особо легко, денег было впритык, я не понимал как организовывать работу, как искать клиентов без возможности мне позвонить. Но нам хватило кое-как.
    И я все понял. Что я хочу, куда двигаюсь, как надо работать и как быть при этом в полной гармонии. Я понял что хочу путешествовать зимой на море. Для этого нужны деньги (небольшие, но все-таки). Я понял кто платит деньги и кто не платит. Деньги платят ТОЛЬКО те, кому твои услуги нужны для того, чтобы зарабатывать на этом деньги. Еще я понял, что они платят ОЧЕНЬ со скрипом, когда ты им уже все доделал. Что нужно портфолио, что нужно быть специалистом в какой-то области, которая нужна БИЗНЕСУ. Я выбрал битрикс, но вам не советую, просто я как-то давно встал на эту скользкую дорожку и меня теперь сами находят клиенты, я уже в нем как бы профи.
    Ну кроме этого, мне уже и 35, многое прочухал в жизни, научился себе не доверять, смотреть на себя как на другого человека - ленивого, слабовольного, не желающего работать. Я знаю когда я пашу - когда ДЕДЛАЙНБЛЯЗАВТРАСДАВАТЬ. Зато я меньше разочаровываюсь в себе, я честен с собой, я знаю что я говно, хоть и довольно смышленое в силу профессии - работаю головой все-таки.
    Так что, мой совет - выбирайте что-то, что будет нужно бизнесу и ищите клиентов в этом. Любая популярная система, которую использует бизнес в России - это деньги. 1С, Битрикс, CRMки популярные... Все всегда будут платить за то, что нужно для заработка денег - реклама, поиск персонала, системы оптимизации и развития бизнеса (CRMки, 1С), аренда помещений и т.д.
    Все остальное превращайте в хобби - выгорит так отлично, нет так нет.
    Ответ написан
    6 комментариев
  • Как выйти из рабочего коматоза?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    У Вас полностью отсутствует угроза ухудшения условий жизни: Вы в полном достатке и Вам всего хватает.
    Попробуйте улучшить свою жизнь с помощью своих знаний: ставите цель и работаете, чтобы её достигнуть через свой труд.

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

    Начните с малой цели: "доход не менее 100руб в день без перерывов 15 дней подряд" (НО не 1500 рублей однократно! Именно каждый день!).
    Уверен, что как только это получится - Вы уже вряд ли остановитесь.

    Ну и конечно, должно быть желание и стремление в достижении поставленной цели.
    Ответ написан
    2 комментария
  • Разъясните отличие между javascript developer и frontend developer?

    Я не встречал проект, на котором было рядом две вакансии JS и Frontend, так что вопрос скорее в названии. Даже если ты весь такой из себя фронтенд и брезгуешь нодой, все равно, при достижении определенного уровня, тебе прийдется копаться как минимум в билдере проекта, а это как раз нода.
    Ответ написан
    Комментировать
  • Как сделать один обработчик для всех менюшек?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Добавляем делегированный обработчик клика, где делаем следующие проверки:

    1. Если клик был за пределами какого-либо выпадающего меню - закрываем их все
    2. Если клик был по кнопке открытия - открываем соответствующее ей меню

    const cardSelector = '.post';
    const buttonSelector = '.post > img';
    const menuSelector = '.post-info';
    const activeClass = 'active';
    
    document.addEventListener('click', function(e) {
      if (!e.target.closest(menuSelector)) {
        document.querySelectorAll(menuSelector).forEach(n => n.classList.remove(activeClass));
      }
    
      if (e.target.matches(buttonSelector)) {
        e.target.closest(cardSelector).querySelector(menuSelector).classList.add(activeClass);
      }
    });
    Ответ написан
    2 комментария
  • Как удается получить заказ на бирже?

    @awdemme
    Отвечаю как заказчик, выставлял свои заказы, получал дебильные отклики:

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

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

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

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

    Сам я прекрасно брал работы, даже когда начинал обращение с предложением поднять оплату в 1,5-2-3 раза относительно желаемого заказчиком.
    Разумеется, это все было не с потолка, а с моих реальных оценок сложности работ.

    Не пиши отклик, если не видишь внятного описания задачи.
    С большой вероятностью сами не знают что хотят и не разбираются в том, кто им нужен.
    Больше времени потеряешь.
    Ответ написан
    19 комментариев
  • Как лучше сделать закрытое REST API?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    CORS не имеет ничего общего с API. Т.к. это - браузерная технология и используется для скриптов внутри браузеров.

    Простой принцип разделения:
    1. Для всех - список параметров без ключа.
    2. Для себя - список параметров с неким ДИНАМИЧЕСКИМ ключом (токен подписи) и формулой его генерации, которая известна только Вам.

    Теперь, защита от перехвата (лучше делать, даже если есть SSL):
    1. На сервере храним формулу генерации подписи запроса на основе входных параметров запроса к API и временной метки.
    2. При обращении к функциям "закрытого" API (для личных целей) Вы формируете подпись запроса, предварительно СИНХРОНИЗИРУЯ время с серверным, и затем, согласно формуле, отсылаете на сервер.
    3. Сервер, зная формулу делает тоже самое и сверяет значения присланной и полученной (по той же формуле на стороне сервера) подписи: если они не совпадают ИЛИ просрочена ИЛИ это дубликат - сервер запрос к API отклоняет, иначе - запрос исполняется.
    4. Сервер кэширует запрос на время погрешности синхронизации, чтобы предотвратить повторное использование идентичного запроса посредством MiTM-перехвата.
    Ответ написан
    Комментировать
  • Является ли nodejs полноценным сервером?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Сам по себе node.js - это всего лишь платформа для написания приложений на JS, в которой есть некоторое api написанное частично на JS, частично на C++
    Полноценным веб-сервером нода не является, но содержит много чего из коробки для упрощения жизни так сказать
    Если Вы не сильны в спецификациях HTTP, TCP, в сетях и тд, то проще поставить перед нодой nginx как реверси прокси
    Хотя у меня лично написан почти полноценный и весьма производительный веб-сервер на ноде, в отдаче статики совсем чуть-чуть уступает по производительности nginx, но в отдаче динамики резко обходит возможные альтернативы с nginx за счет отсутствия оверхеда на проксирование, если интересна эта тема - начать стоит с изучения RFC-7233
    Ответ написан
    4 комментария
  • Как правильно использовать паттерны проектирования?

    Привет, автор. Вот мои мысли по этому поводу:
    1. Понимание паттернов программирования приходит только с опытом. Чтение одной лишь книги, без практики, практически ничего вам не даст. Материал быстро забудется. Лично я прочитал примерно половину книги, после чего пришлось её на время отложить. Как я и говорил - без тренировки на примерах материал быстро забылся. Вновь вспоминаться он стал при чтении книги "Принципы, паттерны и методики гибкой разработки на языке c#". В книге достаточно много подробных примеров, и именно после их выполнения я стал осознавать суть некоторых паттернов.
    Разумеется нельзя считать, что паттерн - это какое-либо строгое правило. Часть паттернов мы реализуем сами ещё до прочтения каких-либо книг. Паттерн - это возможное и удобное решение, которое можно применить для решения какой-либо задачи. Не надо пытаться заучить паттерны или вставлять их везде, где можно. Нужно просто писать как можно больше кода, тогда уже автоматически начинаешь видеть ситуации, где можно применить паттерн.
    2. По-поводу слабой связанности. Во всех книгах, разумеется, пишут, что слабая связанность - это хорошо. Но на самом деле такая архитектура не всегда оправдана, и специалисты в области разработки ПО об этом периодически напоминают. На практике это означает то, что не нужно везде применять интерфейсы только потому, что можно это делать. Если вы уверены, что ваши классы вряд ли будут когда-либо заменены другими, то лично я считаю, что они могут быть смело использованы друг-другом без принципа инверсии зависимостей. Ну и вопрос к модульному тестированию. Разумеется сильная связанность мешает модульному тестированию, но если вы не планируете его проводить, то быть может и не стоит строить избыточные абстракции.
    Лично я также считаю, что вышесказанной в меньшей степени справедливо для прикладных и вэб-приложений (где действительно важна модульность и тестировании), и в большей степени справедливо для игровых приложений. Лично я вообще с трудом представляю игру, в которой каждый игровой объект (танк, самолёт например) будет реализовывать интерфейс, чтобы теоретически когда-нибудь мы заменили танк на био-робота. Но это так, лирика.
    3. По-поводу повторного использования. Один мой товарищ - senior developer, работавший в серьёзных организациях, говорит, что повторное использование кода - это миф. Лично я повторно использовал разве что какие-нибудь вспомогательные функции. Ну или в лучшем случае несколько классов и интерфейсов для поддержки модульности. На мой взгляд, говорить о том, что можно взять и перенести из проекта в проект всю архитектуру особо не приходится.
    4. По-поводу контроллеров. Насколько я понимаю (опыт в разработке небольшой) основной смысл делать контроллеры зависимыми от интерфейсов только в том, чтобы тестировать эти контроллеры (хотя я не совсем понимаю зачем). Контроллер - это действительно такая вещь, которая с большой вероятностью будет использоваться только на конкретном сайте. Также этот контроллер будет завязан на какой-то интерфейс, предоставляющий бизнес-логику. Опять же вероятность, что один класс бизнес-логики будет заменён другим классом с такими же методами - стремится к нулю, особенно если учитывать то, что класс бизнес-логики зависит от интерфейса, который предоставляет методы получения данных. (если вы хотите изменить способ получения данных - вы изменяете, К примеру, класс репозитория, бизнес логика остаётся той же). В связи с этим я вижу пока только одну причину завязывать контроллеры на интерфейсы, а не конкретные классы бизнес-логики - это тестирование. Вы стабите интерфейс бизнес-логики и тестируете контроллер независимо от всех остальных модулей. Если не прав, поправьте, конечно.
    Ответ написан
    5 комментариев
  • Каким вы видите будущее Ruby?

    @evikbook
    DevOps
    Программист это универсальное умение и привязки к технологиям иметь не должно. При качественных фундаментальных знаниях к 30 годам для Вас не должно вызывать проблем набирание кода на: php, python/django, RoR и тп Ибо столкнуться придется со всем. Можете начать свой путь с RoR, кандидат вполне достойный. А дальше смотрите по рынку, вполне возможно рынок фриланса потребует от Вас решения задач на PHP.
    Ответ написан
    Комментировать