• Overtime на работе за или против?

    saboteur_kiev
    @saboteur_kiev Куратор тега Организация работы
    software engineer
    Для начала с терминологией.
    Overtime - это работа на работе во внеурочное время, СОГЛАСОВАННОЕ и одобренное с заказчиком. Обычно оно оплачивается или компенсируется.
    А то, что вы просто задерживаетесь на работе по личным причинам - это просто ваше личное желание.
    Если у вас какая-то проблема, никто не мешает пойти домой, сесть за комп, и разобраться с технологией, проблемой.

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

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

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

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

    @nApoBo3
    Если один джун приводит к регулярным срывам дэдлайнов и что-то ещё должен доделать после увольнения иначе опять сроки сорвем, то наверно это ему повезло оказаться за бортом этой лодки, а не тем кто в ней остался.
    Оставьте человека в покое, пусть он с собой разбирается сам, у вас сами проблем по горло.
    Ответ написан
    1 комментарий
  • Какой стэк технологии выбрать для социальной сети?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    Добавьте HaProxy, Redis, Swoole и обязательно TensorFlow Serving с какой-нибудь нейросетью, иначе единственный клиент с иллюстрации не оценит масштаба.
    Ответ написан
    2 комментария
  • Продуктивно ли подобное обучение?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Возьми более базовые книги: по алгоритмам, паттернам, структурам, подходам итд. Не привязанные к конкретному языку. Это всегда будет полезно, и не потребует кодинга для практики.
    Эффективное же изучение конкретного языка - это наоборот чистая практика, чтение там должно идти только параллельно по мере необходимости.
    Ответ написан
    4 комментария
  • Как программировать электронные чернила?

    @d-stream
    Готовые решения - не подаю, но...
    Реально ли самому вывести на экран рисунок и держать там неделю?
    Да, реально. Вот посмотрел сейчас на электронную книжку, у которой лет 5 назад высадился в ноль аккумулятор - картинка не пострадала.

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

    3-минутный гуглеж говорить что большая часть "любительских" рулятся по spi и есть 100500 примеров для ардуинок и малинок
    Ответ написан
    3 комментария
  • Лучше развиваться или зарабатывать деньги?

    DevMan
    @DevMan
    лучше совмещать: можно и зарабатывать, и расти.

    постоянная учеба в ИТ – такой же миф как отсутствие таковой необходимости в других областях.
    да: учится надо. но эта учеба не требует 12 часов в день. а после определенного уровня, протекает вообще практически незаметно: тут почитал, тут ручками потрогал – готово.
    Ответ написан
    Комментировать
  • Как удалить с концами phpstorm в убунту, чтоб после новой установки активировать пробный период?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    можно
    это и есть награда за усидчивость и сообразительность

    а для хитрых с вопросами на тостере - только платить
    Ответ написан
    Комментировать
  • MacBook. Какую пленку на экран выбрать или использовать прокладку?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Никакую не надо. Клавиатура макбука не царапает экран. У них вдоль экрана есть ограничитель и все четко рассчитано
    Ответ написан
  • Что больше забирает нерабочего личного времени: работа Тестировщиком (QA) или Разработчик (Dev)?

    @majstar_Zubr
    C++, C#, gamedev
    Работа не может занимать нерабочее время по определению.

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

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

    Но вполне адекватно в первую очередь заниматься тем, что вызывает у вас меньше стресса, в вашем случае это направление QA.
    Ответ написан
    1 комментарий
  • Какую часть сервера лучше писать на PHP/Java/Go/C#/Rust вместо Node.js?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Максим, всё описанное ниже я пишу исходя из личного опыта, с некоторыми моими утверждениями можно поспорить :)

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

    Несколько лет назад я делал бенчмарки Python, PHP, Node, Go.
    Для меня были важны две вещи:
    1 - скорость ответа сервера/кол-во запросов в секунду
    2 - объём сервиса в памяти, т.к. от этого зависит стоимость ресурсов

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

    Но вся эта разница сошла на нет, как только добавился всего один простой SQL запрос в базу, в таблицу с 10 строками. И на этом фоне разница по скорости ответа была меньше 10%.

    Иными словами если ваш сервис работает с базой - критической разницы по скорости работы между Go/Rust/PHP/Node/Java, увы, не будет.

    Но другое дело если для нас важно сколько памяти "съедает" каждый сервис.

    Например у вас пошли нагрузки и вам нужно горизонтально масштабирватся, т.е. запустить, скажем 100-10000 эксемпляров вашего сервиса.

    Вот тут уже становится интереснее :)

    Один экземпляр Go занимал в памяти порядка 6мб, при том, что Pytho+Django порядка 60мб.
    Node уже не помню сколько, но что-то близкое к Python'у.
    Вот тут уже, когда серверов у вас будет много - количество серверов с Go у вас будет в 10 раз меньше :)
    Знаю случаи, когда с почти 40 серверов с API на Node перешли на 2 сервера с Go.

    От части по этому и еще по ряду причин, последние несколько лет я использую Go и Python.
    Лично я просто в мега восторге от Go :)
    Еще Go идеально подходит для написания сетевых сервисов, CLI утилит и т.д.
    Например Docker, Kubernetes и еще куча всего написаны на Go.
    Я делал подобные вещи на разных языках, и ни на чём, как на Go не получался такой красивый и понятный код, который при этом работает достаточно хорошо.

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

    На C# писать не довелось, сказать о нём ничего не могу.

    Писал на Java несколько лет, но она мне очень не нравится :) Особенно, когда есть Go :)
    Если будете учить Java - готовьтесь к тому, что вы будете обслуживать Legacy код, или скорее ...нокод :)
    Но вакансий с хорошей з/п по Java тоже много. Как минимум без денег не останетесь точно.

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

    С другой стороны, если у вас есть рабочий сервис на Node, то вместо перехода на Rust, явно буде лучше сделать просто модуль на C/C++ для Node и всё будет летать + полный контроль выделения и освобождения памяти.

    Я такую схему с модулями на C/С++ не раз использовал на Perl'е.
    Очень помогало особенно там, где нужно было чётко освобождать память, чтобы скрипты со временем не пухли.

    Надеюсь вам это как то поможет определиться :)
    Ответ написан
    4 комментария
  • Как работает сборщик мусор с колбеками Promise?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Сборщики мусора (далее GC) бывают разные, в том же v8 используется сразу 3 типа GC в зависимости от поколения объектов (упрощенно молодое, старое и сложные случаи), но в большинстве своем принцип работы сводится к просчету достижимости из некоторого корня в дереве объектов (например глобального объекта, но не только его). v8 не является исключением, и его GC содержит C++ api для создания таких корней. Из JS мы данным api можем воспользоваться лишь косвенно, через сущности языка предоставляемые либо самим v8 либо платформой (браузером, node.js, deno и т.д.)
    Чтоб было понятно давайте рассмотрим простой пример:
    const h = 'Hello world!';
    const n = 'nothing';
    setTimeout(() => {
      console.log(h);
    }, 1000);
    У нас есть строковые переменные h и n. Переменная n нигде больше не используется и ее память очистится при ближайшей работе GC. А вот переменная h оказалась в замыкании созданном стрелочной функцией. И хотя в JS мы не можем достучаться до h имея ссылку на эту функцию, сама функция все таки имеет ссылку на h, а значит h не может быть уничтожена пока не будет уничтожена сама функция. В терминах GC ссылка на h будет серой, то есть сама ссылка на h недоступна из корня напрямую, но сейчас мы проверяем объекты, которые на нее ссылаются и истина будет зависеть от них (подробнее можете погуглить "mark black white and gray memory in gc").
    Давайте посмотрим на саму стрелочную функцию, которая держит h в замыкании. Из кода видно, что мы ее передаем в функцию setTimeout, о которой известно, что это api предоставленное платформой (а значит вероятно какая-то часть написана на C++), а так же, что она асинхронная. Платформе реализующей setTimeout наша функция понадобится после асинхронного ожидания и никто платформе не сможет гарантировать, что во время этого ожидания не будет работы GC, поэтому ей ничего не остается, кроме как запросить у v8 создание нового корневого дерева объектов, в которое и будет положена ссылка на данную функцию.
    После же выполнения таймаута платформе больше не нужна наша функция, поэтому ссылка на нее будет удалена из дерева объектов. А так как других ссылок на функцию нет, и она больше не доступна ни из одного корня - GC удалит из памяти и функцию и строку связанную h, которая так же стала недоступна из корня.

    Посмотрим на пример из вопроса. У нас есть стрелочная функция, которая удерживает на себе инстанс компонента через this ссылку (так как стрелочные функции замыкают this). Саму функцию в памяти удерживает промис порожденный вызовом loader('url'), так как мы отдали её в метод then. Других ссылок на данную функцию нет, а значит и сама функция и ее замыкание (инстанс компонента) будут "жить" не менее "жизни" промиса.
    Скажем был отправлен запрос на сервер, но потом компонент в котором был объявлен промис и колбек был удален.
    И после удаления приходит ответ от сервера, и он выполнит колбек. Это значит что колбек остался в памяти со всеми переменными контекста
    Если других ссылок не осталось, то инстанс компонента будет удерживаться от очистки через промис.

    Теперь стоит разобраться с самим промисом. У него может быть 3 состояния - pending, resolved или rejected. После перехода в состояния resolved или rejected промис может выполнить сохраненные колбэки в ближайшем микротаске, а после он удалит на них ссылки из себя, в следствии чего, память удерживаемая замыканием колбэка может быть очищена (при отсутствии на нее других ссылок, достижимых из какого-либо корня).
    В состоянии pending промис может потенциально находится бесконечно долго, при этом ссылаясь на все колбэки переданные ему в методы then, catch или finally, а значит так же косвенно ссылаясь на их замыкания. И тут все зависит от того, кто ссылается на данный промис, и достижим ли он из корня. И да, промис вполне может быть удален из памяти так и не дождавшись своего завершения.
    интересное умозаключение
    Если Promise - это обещание, то в данном случае оно будет нарушено?


    В комментах к вопросу есть еще один интересный пример:
    function getSomething(){
      return new Promise((resolve, reject)=>{
        if(sys_condition){
           resolve();
        } 
      })
    }
    
    function testPromise(){
      let config = {....}
      getSomething().then(()=>{
         #use config
         goOn(...config)
      })
    }
    
    testPromise();
    У нас есть вызванная 1 раз функция testPromise, которая получает из функции getSomething промис, в который с помощью метода then сохраняет колбэк, удерживающий в замыкании переменную config. Сам промис она нигде не сохраняет, что здесь очень важно.
    В функции getSomething мы просто возвращаем промис созданный через его конструктор, который как мы уже знаем нигде больше не сохраняется. И на этом могло бы все и закончится, без вызова колбэка независимо ни от чего. Но конструктор промиса выполняет свой колбэк синхронно, а кроме того он передает в него 2 функции - resolve и reject, которые в своем замыкании ссылаются на только что созданный промис (а это уже 2 ссылки на него, хотя мы то его никуда не сохраняли). Переменная reject никак не используется, а значит спокойно может быть удалена после завершения колбэка. Переменная resolve просто вызывается как функция внутри условия, но более тоже никак не используется и никуда не сохраняется, а значит так же может быть удалена.
    В этом примере. если sys_condition = false и resolve не вызовется, это значит что создается утечка памяти
    Нет, утечки памяти не будет. Колбэк созданный в testPromise будет удален вместе с замыканием, так и не вызвавшись ни разу.
    Ответ написан
    3 комментария
  • Как передать пару десятков сайтов их владельцам?

    Lucian
    @Lucian
    https://t.me/BusinessAndFreelance
    Напишите владельцам что отходите от дел, чтобы найти решение, которое устроит обе стороны, у каждого может быть свое мнение, кому-то сайт не нужен, у кого-то есть админ который этим займется.
    Ответ написан
    Комментировать
  • На ком лежит натяжка шаблона?

    DevMan
    @DevMan
    как договоритесь, так и будет.
    четкого и однозначного деления нет.
    Ответ написан
    Комментировать
  • Кем можно работать?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Любые задачи, доступные вашим способностям: рисовать, переводить на разные языки, сочинять музыку/прозу, наполнять интернет-магазины/площадки товарами, рерайт статей/публикаций, проверка качества, тестирование, можете решать задачки/капчи, и т.д.
    Ответ написан
    Комментировать
  • Как правильно сделать аунтефикацию?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    1. JWT это не аутентификация, это формат токена. И за безопасность он не отвечает по тому что в нем не хранят ничего ценного
    2. пароли нигде храниться не должны
    3. Для простоты можно начать с куки и хранить там идентификатор сессии
    4. если хочется сразу хорошо и правильно - стоит почитать о том как работает OAuth2 и OpenID. Для того чтобы максимально просто начать потыкать - взять бесплатный акк на Auth0 и выполнить простой мануал минут за 15
    Ответ написан
    Комментировать
  • Хочу вкатиться в в веб-разработку, с чего начать?

    Morpheus_God
    @Morpheus_God
    Веб разработка в 2020 это не просто сверстать макет и выгрузить на хостинг.
    Помимо знания html и css нужно знать js. Знание js тянет за собой тройку фреймворков. React, Angular и Vue.
    Браузер сейчас как вторая операционная система в компьютере с некоторыми ограничениями.
    Это что касается фронта.
    На беке "сидят" PHP, Java, C#, NodeJs, Go, Python.
    Выбор широкий но в тоже время требует от специалиста хороших знаний.
    Если говорить о изучении JS то пожалуй можно начать с этого.
    Для HTML и CSS в качестве базовых знании может хватить и бесплатной части на этом сайте. А дальше только практика.
    Курсы я бы точно не советовал. Как правило там обещают золотые горы только ради того, что бы заработать на студентах деньги.
    Ответ написан
    Комментировать
  • Проблемы и решения в разработке приложений?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Вопрос слишком общий. Может у вас действительно технари плохо работают, может у вас менеджер плохо управляет рабочим процессом, может ваш шеф требует невозможно.
    Ответ написан
    Комментировать