Задать вопрос
Ответы пользователя по тегу Программирование
  • Является ли абстрактная фабрика способом динамически создавать классы?

    bingo347
    @bingo347
    Crazy on performance...
    Пример бы привели, который увидели.
    Если кратко - ответ нет, абстрактная фабрика отличается от обычной, тем что создает объекты не конкретного типа, а более абстрактного (любого типа удовлетворяющего интерфейсу например).
    Динамически создавать классы не во всех ЯП можно, а паттерны абстрагированы от ЯП.
    Ответ написан
    1 комментарий
  • Для каких примерно целей программисту нужен computer science?

    bingo347
    @bingo347
    Crazy on performance...
    Ну начнем с того, что computer science - это очень широкое понятие, которое включает в себя множество различных областей, как теоретических так и практических. Вопрос "нужен ли программисту computer science?" из той же оперы, что и "нужна ли программисту математика?", кому-то и арифметики хватает (а это тоже математика как не странно), а кому-то нужен углубленный бэкграунд в мат.анализе, тер.вере и мат.статистике. Так же и с computer science, кому-то хватит базового понимания, почему 0.1 + 0.2 != 0.3, а кому-то нужен углубленный бэкграунд в алгоритмы, в теорию типов и в слабые модели памяти. Все сугубо индивидуально и сильно зависит от сферы, для которой ведется разработка.
    Многим совсем не обязательно знать как реализуются те или иные алгоритмы или структуры данных, вполне можно пользоваться готовыми. Но вот иметь представление, какие вообще бывают алгоритмы и структуры данных, какая у них алгоритмическая сложность - это полезно всем, просто чтобы знать что гуглить и какие вообще есть возможности решить ту или иную задачу. Так же полезно уметь считать ту самую алгоритмическую сложность из составных частей произвольного алгоритма и понимать чем отличается нотация O-большое от нотации Ω-большое. Какая от этого практическая польза? Для самого программиста - это возможность решать задачи проще и быстрее, выдавая при этом более оптимальные решения. Для бизнеса - это деньги, от банального "ускорив некое действие в N раз мы повысили конверсию в M раз", до насущного "сократив потребление ресурсов на N в прошлом месяце мы заплатили за облако на M млн. рублей меньше в этом месяце при той же нагрузке".
    Та же архитектура, всем не обязательно уметь строить огромные решения с запасом прочности на десятки лет. Но понимать базовые принципы и паттерны, какие у них плюсы и минусы, где и что применять - полезно. К сожалению здесь все плохо в большинстве своем, порой доходит до того что стоимость поддержки небольшого проекта вырастает в 300-500 раз всего лишь за год поддержки. Для бизнеса это опять таки деньги, и если бизнес не планирует через год-другой либо продаться либо свернуться, как делают многие стартапы, то бизнес будет это оптимизировать. А на программистах такая оптимизация скажется на прямую, те кто умеет писать код на года будет получать выше рынка, иногда значительно. Хотя и те кто вообще в архитектуре не шарит без работы не останутся, так как работодателей с принципом "продали и забыли" просто банально больше.
    Ответ написан
    Комментировать
  • Как повысить свои навыки в построении архитектуры сложных приложений?

    bingo347
    @bingo347
    Crazy on performance...
    Если по теории, то мне в свое время вот эта книга помогла:
    https://www.litres.ru/robert-s-martin/chistaya-arh...

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

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

    Еще через пол года прочел третий раз, опять же с оглядкой на личный опыт. И тут я кажется уже совсем въехал. По крайней мере многие проблемы с организацией взаимодействия между компонентами стали разрешаться. И вообще появилось достаточно четкое понимание, как структурировать приложение и где разбивать его на компоненты.
    Ну и после 3 прочтения еще помог момент: мне дали с нуля проектировать новое, достаточно крупное приложение на Rust. Притом заказчик кричал "микросервисы - это круто, хочу, хочу, хочу", а тимлид мне сказал "давай монолит, но так чтоб потом легко было распилить, а то все сроки про**ем". Вот тут прямо вообще понимание пришло. Ну и плюс в Rust архитектурные компоненты очень хорошо ложатся на отдельные крейты (это такая единица компиляции в Rust), а компилятор в принципе не дает делать циклические зависимости между крейтами.

    Ну и недавно решил освежить память и перечитать еще раз. И на этот раз уже были мысли вроде "так если делать по другому, потом проблемы вылезут тут и тут".
    Ответ написан
    1 комментарий
  • Верно ли это утверждение?

    bingo347
    @bingo347
    Crazy on performance...
    Тут можно с разных сторон смотреть.

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

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

    Увлекаюсь программированием
    если действительно увлекаетесь, то есть Вам по кайфу сам процесс разработки, то можете не переживать, навыки они приобретаются и развиваются, а когда работа приносит удовольствие, то необходимые для нее навыки развивать в разы проще.
    Ответ написан
    2 комментария
  • Почему принято писать пробелы вместо табов?

    bingo347
    @bingo347
    Crazy on performance...
    Заходишь ты такой на удаленный сервак, по быстрому код или конфиг поправить, открываешь vim, который никто конечно там не настраивал, и радуешься чуду сохранившему файл с табами вместо пробелов...
    qsb96gmeipstteh5wmjk7u_nxl8.png
    Думаешь, ну может хоть nano настроили... но и он с настройками по умолчанию...
    fkqekzsjqotfscd_auronmlwu-0.png

    А на счет eslint, так в нормальных командах конфиг под себя пишут, а не берут разное готовую х.. (от гугла, air bnb и тд), явно не для читабельности сделанную, особенно с отступами в 2 пробела, которые вообще не различимы с 13" ноута с QHD... зато при callback-hell позволяют позже горизонтальным скроллом воспользоваться... И ведь callback-hell у них явно присутствует, так как eslint имеет встроенные правила для его контроля, но в готовых конфигах они поголовно отключены...
    Ответ написан
    5 комментариев
  • Узнать данные из библиотеки .so?

    bingo347
    @bingo347
    Crazy on performance...
    Ответ написан
    Комментировать
  • Как правильно сделать авторизацию и шифрование для TCP соединения?

    bingo347
    @bingo347
    Crazy on performance...
    TLS поддерживает механизм, когда обе стороны предоставляют сертификаты. Вы можете создать свой CA (корневой сертификат) и подписать им сертификаты каждой из сторон, наличие этой подписи защитит от подделки и каждая из сторон сможет проверить другую. Естественно соединения без клиентского сертификата или подписанные не нашим CA обрываем на этапе рукопожатия.
    При успешном рукопожатии у нас есть сессионный ключ, которым шифруется трафик.
    Так же в целях безопасности я бы ограничил поддержку только протокола TLS1.3, учитывая, что и клиент и сервер - наши приложения, проблем точно не возникнет
    Ответ написан
    1 комментарий
  • Что такое обратный вызов в программировании?

    bingo347
    @bingo347
    Crazy on performance...
    Что такое обратные вызовы?
    Я знаю только что это функция которая передается как аргумент в другую функцию.
    В принципе, можно и так сказать. Если быть более точным - это вызов функции переданной в качестве аргумента.
    Почему они так называются?
    Это игра слов. На английском callback - это не только обратный вызов, но и обратный звонок (по телефону). Данная абстракция позволяет вызываемому коду вызвать вызывающий код, подобно тому как собеседник может перезвонить Вам позднее, если Вы сообщите ему куда.
    В чем их смысл и зачем нужны?
    В принципе я уже ответил, они нужны для возможности вызываемому коду вызвать вызывающий код. Это позволяет строить высокоуровневые абстракции, вроде обобщенных функций или асинхронных функций.
    Обобщенные функции позволяют не писать однотипный код, снижая тем самым вероятность ошибок, а с помощью обратных вызовов они могут принимать в себя фрагменты кода, которые могут меняться от использования к использованию. Для примера, абстрагируем цикл от 0 до n на C:
    // абстракция цикла
    void each(int n, void (*callback)(int, void*), void* closure_data) {
      if(n <= 0) { return; }
      for(int i = 0; i < n; i++) {
        (*callback)(i, closure_data);
      }
    }
    
    // колбэк - тело цикла, вариант 1
    void cb_body1(int i, void*) {
      printf("%d", i);
    }
    
    // колбэк - тело цикла, вариант 2
    void cb_body2(int i, void* acc) {
      int* normalized_acc = (int*)acc;
      *normalized_acc += i;
    }
    
    int main() {
      each(10, cb_body1, null); // напечатает строки 0, 1, ...9
    
      int result = 0;
      each(10, cb_body2, &result); // посчитает в result сумму чисел от 0 до 9
      printf("%d", result);
      return 0;
    }

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

    Так же стоит заметить, что во многих высокоуровневых языках наряду с обратными вызовами используется механизм замыканий, который позволяет объявлять функции внутри других функций и захватывать окружающие переменные. Но нужно понимать, что это лишь компиляторный сахар, и на самом деле в функцию просто передаются указатели на захваченные переменные в качестве аргументов, подобно тому, как я сделал это руками в примере выше, с помощью аргумента closure_data в функции each. Обычно компилятор создает для этого анонимные структуры (C++, Rust) или анонимные классы (C#), которые хранят указатель на функцию и указатели на окружение. А в некоторых языках, например в js, замыкания возведены в абсолют, и каждая функция является замыканием.
    Ответ написан
    2 комментария
  • Какой язык программирования?

    bingo347
    @bingo347
    Crazy on performance...
    Вот все рекомендуют Python как первый язык, а я порекомендую Rust
    - Очень строгий компилятор будет доходчиво объяснять, что Вы делаете не так, когда Вы пишите плохой код
    - Компиляция в wasm из коробки (можно для браузера код писать)
    - Если научитесь делать что-то полезное и рабочее на Rust - научитесь более-менее программировать
    Ответ написан
    1 комментарий
  • Как работают WebSockets?

    bingo347
    @bingo347
    Crazy on performance...
    WebSocket - постоянное соединение поверх http(s)
    При установлении соединения происходит рукопожатие с помощью специальных http заголовков, после любая сторона в любой момент времени (пока соединение не прервется) может писать в тело запроса сообщения. Каждое такое сообщение представляет из себя передаваемые данные + мета-данные

    1. Можно найти сходство с tcp, только вместо пакета у нас сообщение. Так как ws работают поверх http, который в свою очередь работает поверх tcp, то формально одно сообщение может быть разбито на несколько tcp пакетов, а в одном пакете может содержаться несколько сообщений, однако единицей данных для ws является именно сообщение
    2. ws - это постоянное соединение, которое будет висеть пока любая из сторон не закроет его либо пока не оборвется связь. Так как сокет формально может простаивать (когда нет обмена данными), то tcp соединение для него нужно открывать с опцией keep-alive, а так же желательно отправлять http заголовки для keep-alive в рукопожатии.
    3. Любая сторона может в любой момент времени может отправить любое количество сообщений. Получающая сторона получит данные, когда до нее дойдут все tcp пакеты самого раннего из сообщений (это гарантирует, что сообщения придут в том же порядке, в котором они были отправлены)
    Ответ написан
    6 комментариев
  • С помощью чего сделать сервер посредник?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    используйте nginx
    на node.js настройте реверси прокси
    если url динамический, почитайте о заголовках ответа от бэкенда для отдачи статики nginx'ом после обработки запроса бэкендом (node.js)

    P.S.
    но как известно она не прям идеально подходит для отдачи статики
    У меня на сервере нода торчит наружу и отдает статику, притом делает это шустрее nginx и жрет меньше памяти, все зависит от рук программиста
    Ответ написан
    Комментировать
  • Какие инструменты вы используете в команде для сохранения единообразия кода?

    bingo347
    @bingo347
    Crazy on performance...
    editor-config + eslint (с четко прописанными правилами оформления кода)
    и жесткое требование установить соответствующие плагины в IDE
    Ответ написан
    2 комментария
  • Какая математика нужна програмисту?

    bingo347
    @bingo347
    Crazy on performance...
    Что может пригодится практически в любом направлении: алгебра, мат. анализ, дискретная математика, численые методы
    В работе с графикой понадобится знание геометрии
    Но самый главный навык - алгоритмическое решение, т.е. способность выразить задачу в виде алгоритма
    Ответ написан
    1 комментарий
  • Алгоритм поиска последовательности выпадения числа. Возможно ли такое реализовать?

    bingo347
    @bingo347
    Crazy on performance...
    Создайте нейронную сеть типа перцептрон, обучайте пока результаты не станут удовлетворительными
    Ответ написан
    Комментировать
  • На чем писать программу под Windows?

    bingo347
    @bingo347
    Crazy on performance...
    electron.js
    И не слушайте тех, кто рекомендует nw.js - она кривая
    Ответ написан
    Комментировать
  • Функция генерирующая 5 случайных значений в определённом диапазоне без повторений. Объясните суть?

    bingo347
    @bingo347
    Crazy on performance...
    Вот читаешь в списке вопрос, смотришь его теги... рассчитываешь, что сейчас поможешь человеку с хитровыдуманной задачей на применение фильтра Блума... открываешь, смачно сплевываешь от отвращения... и кидаешь в ответ ссылку, не вдаваясь в подробности...

    https://developer.mozilla.org/ru/docs/Web/JavaScri...

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

    bingo347
    @bingo347
    Crazy on performance...
    для полноценной реализации понадобится нейронная сеть

    примитивно же можно анализировать окончания, задать список соответствий окончаний для разных падежей
    разбиваем по словам, анализируем окончание, заменяем на его соответствие в зависимости от нужного падежа
    Ответ написан
    Комментировать
  • Штатные программисты или аутсорсинг?

    bingo347
    @bingo347
    Crazy on performance...
    Штатные программисты:
    + работают в долгосрочной перспективе (после разработки будет поддержка теми же людьми)
    + сидят у Вас в офисе (коммуникации в команде проще и больше)
    - им нужно платить фиксированую зп (как правило, например в СПб Вам это обойдется от 50 (джуниор) до 150 (сеньер) тыс в месяц на человека)
    - нужно предоставить рабочее место (стол, стул, комп и т.д.)
    - редко работают больше рабочего дня (хотя если будете доплачивать за переработки, то будут)

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

    Выбирайте
    Ответ написан
    11 комментариев
  • Как представляется отрицательное число в дополнительном коде?

    bingo347
    @bingo347
    Crazy on performance...
    Старший бит обозначает знак, 0 - для нуля и положительных, 1 - для отрицательных
    для смены знака нужно инвертировать двоичную запись числа и добавить к ней 1
    например 127 в двоичной записи 0111 1111
    инвертируем - 1000 0000 и добавим единицу - 1000 0001 - будет запись числа -127
    снова инвертируем полученное число - 0111 1110, добавим единицу - 0111 1111 - снова получили 127
    Ответ написан
    3 комментария