Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Что такое JUnit тесты и с чем они проводятся?

Лучший ответ:
Просто поучительный пример.
Вам нужно протестировать класс. Что это значит? Протестировать его поведение, хотя бы основное. Т.е. желательно все методы которые могут использовать. Как у черного ящика. (скрытые не тестируем и можно не тестировать getter&setter).
Как это сделать? 
Вы добавили один метод getFurst(). Вероятно, для тестирования. Но первым элементов не должна ограничиваться проверка. Поэтому нужен скорее метод getItem(int); Это приводит к изменению интерфейса вашего класса (замена не нужного метода нужным)
Сделали изменения, протестировали. Ок.
Далее пишете тест на insert. Несколько. И в конце у вас выскакивает исключение. Индекс превышает размер массива. Опа. Вы должны либо явно описать этот случай в документации (генерацию исключения), либо что-то еще сделать. Указать пользователю на этот скользкий случай.
Далее. Есть метод display
Как его протестировать автоматически? Никак. Это наводит на мысль "что-то не так". Не так, скорее потому, что этот метод не должен быть в этом классе. класс занимается сортировкой. Выводом на экран должен заниматься другой класс. Если вдруг понадобиться поменять вывод, то вам придется ковырять класс который уже работает и протестирован. И вы будете лапать снова весь код, с риском дернуть что-то что скрыто поменяет корректную работу. 
Дисплей в другой класс.
итак. убрали getFirst. display. добавили getItem. 
класс хорошо тестируется. и более удобный интерфейс.
Т.е. вывод из всего: Тестируемость класса зависит от хорошего интерфейса. Требует этого. 
Пригодный к тестированию класс практически всегда (чаще всего) это класс который будет легко использовать. Класс который трудно протестировать, чаще всего трудно будет использовать. 
Примерно так. 
Конкретно по теме.
Просто по коду тестов, вопросов нет. Вопрос про тестирование класса.

Худший ответ:
Вы хотите проверить правильность работы сортировки только через первое число в массиве? А если результатом сортировки будет "1 10 5 7 2 5", "1 5 7 10 2" или даже "1 2 5 10 7"? Это все разве верно?
Написание юнит теста у вас хорошее. Проверка условия отсортированности не правильная.
Вопрос: Как и можно ли писать искусственный интеллект для игр, например plants vs zombies?

Лучший ответ:
Можно, но не стоит разбрасываться.
Вы уже добились некоторых успехов в искусстве лени - развивайтесь и дальше в этом направлении.

Худший ответ:
Попробуй генетический алгоритм, это не ИИ, но алгоритм который подберет наилучшую стратегию для игры, методом проб
Вопрос: Где можно потренироваться в написании скриптов на Bash?

Лучший ответ:
виртуализация
virtualbox бесплатный, vmware workstation - есть бесплатная лицензия для учебных заведений и учащихся

Худший ответ:
Cygwin. Задания можно поискать в интернете или придумать самому.
Вопрос: Какой выбрать движок для киносайта?

Лучший ответ:
90% НЕдокиносайтов сделано на DLE.
Делайте и Вы на нем. Все равно не будет отличаться от миллионов других.
Но зато есть плагин парсера с других НЕдокиносайтов.PS: Каждый начинает свой путь в сети с мечты о киносайте :)))

Худший ответ:
На чем угодно. Обычно DLE/WP/Joomla
Вопрос: Востребован ли node.js?

Лучший ответ:
Если вкратце, то так: real-time (датчики, игры, управление и т.д.) и full-stack на js - выбор верный.
Иначе - есть много более удобных альтернативных инструментов.Вывод: всё зависит от направления узкоспециализированной сферы деятельности, для которой Вы собрались применять тот или иной инструмент.

Худший ответ:
Простая проверка, вбиваем на апворке в поиск магические слова:
Node.js – 1,193 jobs found
Python – 2,116 jobs found
Php – 8,314 jobs found
Вывод - если очень нравится то дерзай, а так то ты понял где проще.
Вопрос: В чём разница между фреймворк и cms?

Лучший ответ:
CMS - готовая система, которой воспользоваться может не программист.
Ее можно программировать, но обычно предпочитают не заморачиваться с этим, а искать уже готовые (созданные программистами) модуля CMS под ту или иную задачу
Фреймворк - это сырая заготовка для программиста.
Без приложения более-менее значительных программистких усилий вы воооооооооообще ничего не получите, никакого результата.
CMS позволяют сэкономить время и деньги если речь идет о типовой задаче. Однако на все случаи жизни готовых решений наперед не напридумываешь (в любой сфере человеческой жизни).
На фреймворк начинают смотреть, если задача отличается от типовой.
MVC - это просто свойство. Которое может быть присуще любому типу ПО из этих двух. Это как зеленая легковушка и зеленый трактор. То что они оба зеленых не дает же вам основания говорить - "они оба зеленых, поэтому я буду пахать на легковушке"

Худший ответ:
В уровне готовности конечного продукта.
Вопрос: Как исправить ошибку Iptables?

Лучший ответ:
Перед этой командой надо добавить цепочкуiptables -t nat -N DOCKER

Худший ответ:
перед этим iptables -N DOCKER 
есть?  Похоже нет.
Вопрос: Возможно ли решить данную задачу?

Лучший ответ:
1018 — это обычное 64-битное целое. long long в Си, long в Java, int64 в Delphi.
Очевидно, задача переводная, спичка не только match (это слово у них очень многозначное), но и matchstick. Причём переводил то ли автомат, то ли редкий надмозг, пример неговорящий, и откровенно непонятно: то ли где находится число 11, то ли что на 11-й позиции. Будем решать 2-ю задачу: что на 11-й позиции.
1. Определить количество разрядов (для этого хватает несложного цикла) и какой номер у данного числа среди N-значных чисел.
2. А теперь находим, сколько есть N-значных чисел из M спичек. Рекуррентное соотношение:
Q[N, M] = sum{k = 1..9} (Q[N−1, M−q(k)]), если N — найденная нами значность, но не 1-ца,
Для остальных N формула та же, но суммирование 0…9.
q(0) = 6, q(1) = 2, q(2) = 5, и т.д. — кол-во спичек в цифре.
Граничное условие: Q[0, 0] = 1, Q[0, M] = 0 для остальных M.
«Методом выкручивания рук» также примем, что для отрицательных M все Q равняются 0.
Решаем рекуррентное соотношение динамическим программированием.
3. А теперь самое интересное: воспользовавшись таблицей динамического программирования, находить цифру за цифрой, начиная со старшей.
Например, у нас 15-е число. Первый шаг опустим, поверьте мне: это 4-е двузначное, начиная с нуля.
2-й шаг.
Q[1,2] = 1
Q[1,3] = 1
Q[1,4] = 1
Q[1,5] = 3
Q[1,6] = 3
Q[1,7] = 1
Q[2,4] = 1
Q[2,5] = 2
Q[2,6] не вычислял, главное — запредельно большое.
Q[2,0]…Q[2,3] равняются нулю.
Вычитаем Q[2,4] — получается 3.
Вычитаем Q[2,5] — получается 1.
Вычитаем Q[2,6] — не получается. Итого у нас шесть спичек, остаётся 1.
3-й шаг, работаем по цифре.
Ноль, Q[1, 6−6] = 0. Остаётся 1.
Единица, Q[1, 6−2] = 1. Остаётся 0.
Двойка, Q[1, 6−5] = 0. Остаётся 0.
Тройка, Q[1, 6−5] = 0. Остаётся 0.
Четвёрка, Q[1, 6−4] = 1. Не вычитается, остаётся 2 спички, 1 знак и номер 0. Записываем цифру 4.
Ноль, Q[0, 2−5] = 0. Остаётся 0.
Единица, Q[0, 2−2] = 1. Не вычитается, остаётся 0 спичек, 0 знаков и номер 0. Записываем цифру 1.
Итого получили 41.

Худший ответ:
Ненадо там ничего считать
для I от 0 до 9 на I-м месте число из одной цифры, для записи которой требуется I-е по счету кол-во спичек
поменяй так каждую из введенных цифр позиции
Вопрос: Как реализовать статусы пользователя online/offline — PHP?

Лучший ответ:
Пожалуйста, поднимите у себя websocket, ресурсов это много не займет, зато возможности у вас появятся огромные, вы сможете не только точно знать момент, когда пользователь закрыл страницу или отключил интернет, но и сможете со стороны сервера эффективно передавать сигналы клиентам (чат например)

Худший ответ:
При каждом запросе пользователя просто пишешь в таблицу. Если не активен более 5 минут то Офф. Без сессий и печений.
А вот уже подсказывали кстати https://ru.stackoverflow.com/a/61419
Вопрос: Как выделить все символы русского алфавита на странице, при условии, что атрибуты некоторых элементов могут содержать его?

Лучший ответ:
Нужно рекурсивно обойти всё DOM дерево и рассматривать только текстовые узлы. Регуляркой заменять один-или-несколько-подряд символов из кириллического алфавита (+пробелы, пожалуй) на них же, в обёртке из тега форматирования.Примерно такfunction replacer(el){
  var i, node, span;
  if(el.hasChildNodes()) {
    for(i=0; i<el.childNodes.length; i++) {
      node = el.childNodes[i];
      if(node.nodeType === Node.ELEMENT_NODE) {
        if( !!~['SCRIPT','NOSCRIPT'].indexOf(node.nodeName)) continue;
        replacer(node);
      } else if( node.nodeType === Node.TEXT_NODE) {
        if(node.nodeValue.match(/^\s+$/)) continue;
        span = document.createElement("span");
        span.innerHTML = node.nodeValue.replace(/([а-яА-Я]+)/ug, '<i>$1</i>');
        el.insertBefore(span, node);
        el.removeChild(node);
      }
    }
  }
}

replacer(document.body);
Тут для простосты схалтурил и вообще каждый текстовый узел заменяю на <span>, чтобы просто innerHTML ему заменить.Fiddle

Худший ответ:
Нужно рекурсивно обойти всё DOM дерево и рассматривать только текстовые узлы. Регуляркой заменять один-или-несколько-подряд символов из кириллического алфавита (+пробелы, пожалуй) на них же, в обёртке из тега форматирования.Примерно такfunction replacer(el){
  var i, node, span;
  if(el.hasChildNodes()) {
    for(i=0; i<el.childNodes.length; i++) {
      node = el.childNodes[i];
      if(node.nodeType === Node.ELEMENT_NODE) {
        if( !!~['SCRIPT','NOSCRIPT'].indexOf(node.nodeName)) continue;
        replacer(node);
      } else if( node.nodeType === Node.TEXT_NODE) {
        if(node.nodeValue.match(/^\s+$/)) continue;
        span = document.createElement("span");
        span.innerHTML = node.nodeValue.replace(/([а-яА-Я]+)/ug, '<i>$1</i>');
        el.insertBefore(span, node);
        el.removeChild(node);
      }
    }
  }
}

replacer(document.body);
Тут для простосты схалтурил и вообще каждый текстовый узел заменяю на <span>, чтобы просто innerHTML ему заменить.Fiddle
Вопрос: Как сказать браузеру, что сайт изменился, и надо обновить кеш?

Лучший ответ:
Там где подключается ваш js-файл добавьте в параметрах номер версии. Например так:<script src="/my/script.js?v=1"></script>
При желании можете это дело автоматизировать

Худший ответ:
https://developers.google.com/web/fundamentals/per...
Т.е. для index.html вообще запрещаем кеширование, а js файлы кешируем (можно навсегда).
При сборке к js/css файлу добавляем hash, который будет меняться при изменении файла. Таким образом index.html будет всегда забираться. Если там будет ссылка на новую сборку, то новые скрипты/стили скачаются, иначе возьмутся из кэша браузера.
Вопрос: Нейронные сети вместо юристов?

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

Худший ответ:
Казалось бы недавно, а с другой стороны уже и давно, была такая профессия — счетовод, или на немецкий манер — бухгалтер.  Но потом появились ЭВМ — сначала большие и дорогие, а потом все компактнее и дешевле.  Обо всяких нейронных сетях тогда приходилось только мечтать, но вот считать они уже умели очень хорошо и быстро, а вскоре научились и всю отчетность по шаблонам составлять, и профессия бухгалтера отмер...  Wait! Или не отмерла вовсе, а напротив — размножилась так, что теперь бухгалтеров в несколько раз больше, чем тогда?
Вопрос: Как работать с postgresql в python?

Лучший ответ:
https://postgrespro.ru/media/2018/01/10/introbook_...
repo.postgrespro.ru/doc/pgsql/10.1/ru/postgres-A4-...Разжевано все тут как всегда:
https://www.digitalocean.com/community/tutorials/p...

Худший ответ:
https://postgrespro.ru/media/2018/01/10/introbook_...
repo.postgrespro.ru/doc/pgsql/10.1/ru/postgres-A4-...Разжевано все тут как всегда:
https://www.digitalocean.com/community/tutorials/p...
Вопрос: При подключении свича, отрубается интернет в роутере, что делать?

Лучший ответ:
Очень похоже по симптомам на петлю.
Опишите подробнее структуру сети, точно петли нигде нет?отрубается интернет в роутере, даже вай-фай не работаетА точнее?
Роутер пингуется по проводу, по WiFI? Админка доступна?
Шлюз провайдера пингуется? Соседний компьютер через свич доступен в это время?
Многие роутеры пишут логи - там смотрели?

Худший ответ:
Воткните один из ПК напрямую в тот разъём роутера, куда втыкаете свитч и посмотрите.
Если всё будет работать - проблема в свитче, если нет - проблема в роутере.
Вопрос: Повышает ли подключение Google Analytics позицию сайта в поисковой выдаче Google?

Лучший ответ:
Гугл учитывает поведенческие факторы только со страницы поисковой выдачи. Гугл аналитикс на ранжирование не влияет.
Вот здесь хорошо описано с отсылками на официальные источники https://1ps.ru/blog/dirs/2018/chem-povedencheskie-...

Худший ответ:
Нет конечно
Вопрос: Как искать html лендинги для копирования?

Лучший ответ:
Краткий обзор авторского права в Беларуси и России.
А вот черпать вдохновение, чтобы сделать самостоятельно, можно на Бехансе, Пинтересте, Дриббле, Инстаграмме и т.д. И еще больше, можно научится верстать самостоятельно по справочникам, текстовым и видеоурокам и даже под бдительным надзором личного или группового ментора.

Худший ответ:
Themeforest. Правда, как по мне, они там одинаковые.
Вопрос: Какие есть готовые CMS по сайтам недвижимости?

Лучший ответ:
Вы ресурсом ошиблись

Худший ответ:
У Авито спросите или у Циан. Не рекомендовал бы делать очередной проект, который загнется через первый месяц.
Вопрос: Правильно ли так работать с git и phpStorm?

Лучший ответ:
Вести разработку вне системы контроля версий - зло;Править прод - зло;Не уметь писать тесты с моками - горе.

Худший ответ:
Там можно работать как угодно в phpStorm. Это просто редактор.
C Git можно и нужно работать из командной строки. Там так же есть встроенная утилита для работы с ним. Так же там есть и «своя» система контроля версии – урезанная.
phpStorm может работать и на удаленном хосте -  с базой данных и файлами. Так и скачать все себе поправить и залить назад. Так и автоматически любое изменение отлавливать и заливать.
Обычно в таком режиме работают не с продакшенном. А на продакшен все обновляют, когда есть новая версия, которая прошла тесты.  Не обязательно файлы заливать в продакшен по SFTP, если у вас там git, то git и обновитесь.
Вопрос: Как сделать чтобы не пропадали иконки svg?

Лучший ответ:
Хз, кода много, разбирать я его конечно же не буду. Залей лучше куда нибудь, на jsfiddle, codepen. Что б проше было в консоли отследить ошибки
Возможно скрипты какие то сторонние влияют, всякое мб

Худший ответ:
проблема решилась с помощью пары строк в файде .htaccess
AddType image/svg+xml svg
AddEncoding gzip svgz
Вопрос: Как ловить людей, которые из поиска попадают на PDF?

Лучший ответ:
Как сделать так, чтоб люди попадали на какую-то все же страницу сайта со ссылкой на скачивание pdf, а не сразу на pdf?Отдавать PDF через какой-то скрипт-прокладку, которая будет проверять по каким-то параметрам (refer, user-agent или каким-то другим) и либо отдавать сам PDF либо соотв. страницу, в зависимости от условий.

Худший ответ:
https://www.nginx.com/blog/securing-urls-secure-li...
Способ с куками уже озвучили
Вопрос: Как через AJAX передать $_FILES?

Лучший ответ:
Под вашу задачу можно так:$('.add').on('submit', function(){
    var formData = new FormData(this);
    $.ajax({
          type: "POST",
          url: "engine/ajax/my_addotziv.php",
          data:  formData,
          processData: false,
          contentType: false,
          success: function(data){
            // -- code ---
          }
     });
    return false;
});
И смотрим доки по FormData https://developer.mozilla.org/ru/docs/Web/API/FormData

Худший ответ:
Никак. Ajax не передаёт файлы.
Лучше найти библиотеку которая это так или иначе делает.
с помощью iframe или как-либо ещё.
Библиотеку выбирайте под задачи.
Вопрос: На какой площадке разместить заказ на выполнение работы?

Лучший ответ:
на сайтах фриланса и подобных площадках только 5% реально хороших спецов.
Но писать вам будут все, и цены будут писать даже порядка 50К рублей за проект.
Если вы хотите некую выборку составить - она будет крайне ошибочна и за среднюю цену вы получите 10% от продукта и весь забагованный.

Худший ответ:
на этой
Вопрос: Флешка стала read-only и не открывается, ей кранты?

Лучший ответ:
Трындец. 
Переход в read-only - это характерный признак того, что ей вот-вот придет пушной зверек.

Худший ответ:
Открой gparted, выбери раздел с флешкой, обычно /dev/sdb. установи новую разметку диска потом отформатируй ее  в FAT32 . должна заработать
Вопрос: Какие есть паттерны или алгоритмы для обработки текста?

Лучший ответ:
Предложу вот такой порядок действий: Лексический анализатор разбивает поток входящих лексем на токены. Далее, набор токенов подается на вход парсеру, который выполняет построение "сырого" DOM-дерева, в котором могут присутствовать невалидные теги и тд. Производится обход сырого DOM-дерева и его нормализация. Изменяем имена тегов на максимально приближенные к ним валидные имена, проставляем пропущенные теги, удаляем запрещенные и т.д. По нормализованному дереву теперь можно делать обход и преобразовывать текст. Преобразовываем готовое дерево в html-документ.

Худший ответ:
1. Вначале нужно "собрать" корректное/валидное DOM-дерево.
2. Затем, добавить все нужные теги
3. Удалить все запрещённые теги
4. Затем, рекурсивно обойти все ветки DOM-"дерева", выполнив текстовые преобразования.Порядок в общем виде (строго соблюдая последовательность действий!):
Валидация структуры, добавление нужных элементов, удаление запрещённых элементов, модификация "тела" оставшихся элементов.
Вопрос: Можно ли использовать div совместно с переменными из php?

Лучший ответ:
да, возможно:<div class="<?if($a):?>privet1<?endif?>">
     аля улю
</div>

//или так

<?
if($a) $class = 'privet1';
?>

<div class="<?=$class?>">
    аля улю
</div>

Худший ответ:
все возможно , показывай код
Вопрос: Как сделать такой INPUT?

Лучший ответ:
Меняютсяlabel.error, .b-select:focus~.b-form__placeholder, .b-select.b-input_not-empty~.b-form__placeholder, .b-select.valid~.b-form__placeholder {
  font-size: 11px;
  top: 4px;
  font-family: 'MCW XX Light Regular';
}

Худший ответ:
Вариантов много, самый простой способ накидал 
Можно использовать js, можно без него, все зависит от конкретной верстки и требований. В моем варианте просто css изменяет font-size и line-height при фокусе.
Можно изменять top относительно родительского блока, можно играться через transform: scale() в общем суть думаю понятна..
Вопрос: При перезагрузке nginx, ошибка duplicate upstream «php-fpm» in /etc/nginx/common/upstream:2?

Лучший ответ:
Значит такой же upstream задан где-то ещё, либо /etc/nginx/common/upstream у вас инклудится несколько раз.
Можно поискать так:grep -r upstream /etc/nginx

Худший ответ:
В каком-то другом конфиге у вас уже определён апстрим с таким названием
Вопрос: Как узнать, кто заходил на мою страницу вконтакте?

Лучший ответ:
никак. это невозможно

Худший ответ:
Мои гости (у моих 74 друзей стоит, вообще с дубу рухнули)
https://vk.com/app638461_24407178
Вопрос: Отступ от img, откуда он?

Лучший ответ:
Если я правильно понял задачу, нужно выставить выcоту изображения кратную высоте строки тега p (с учетом маргинов). 
например: img {
height:100px;
width: auto;
}
p {
line-height: 20px;
}

Худший ответ:

При line-height: 18px; всё ок. Просто верхняя граница строки не вышла за пределы высоты изображения и переносить браузер не решается, потому что будет некрасивый межстрочный пробел.
Вопрос: Картографический сервис можно использовать бесплатно в закрытой сети?

Лучший ответ:
Только этот и можно. Только не выкачать, а цивилизованно скачать.

Худший ответ:
Можно. Только его точность не всегда примлемая. Пришлось много данных править, чтобы они были пригодны.
Вопрос: Вы работете спеша (особенно если горит дедлайн)?

Лучший ответ:
Во всём должен быть баланс и равновесие...
1. Быстрее сделаете - быстрее сдадите и возьмёте ещё работы.
2. Спешка не должна влиять на качество и здоровье.
3. Всегда оставляйте себе 30% запас по времени и стремитесь завершить проект к этой дате.
4. Старайтесь использовать наработки с предыдущих проектов и оптимизировать свои рутинные рабочие процессы и операции для уменьшения времени работы.
5. Старайтесь делать так, будто делаете это себе: так Вы быстро получите новые заказы через "сарафанное радио".

Худший ответ:
С практикой придет и скорость.
Вопрос: Какую книгу читать по компьютерным сетям?

Лучший ответ:
1) Фокус на алгоритмы, физику процессов, научная литература. Очень мало про протоколы маршрутизации.
2) Судя по содержанию, голопом по европам и ничего глубоко описанного нет.
3) Преимущественно TCP/IP, больше про протоколы, чем про 
Если надо глубоко познать TCP/IP, мне вот эта понравилась. 
Если средне надо TCP/IP - очень хороший цикл СДСМ.
А вообще вот хороший обзор сетевых книжек.

Худший ответ:
Батенько ... Сети вещь простая. Это вам не прикладная биокибернетика. В любой книге есть необходимый уровень для практически полноценного понимания данного вопроса. Поэтому читайте что вам больше нравится по стилю
Вопрос: Почему не работает метод length?

Лучший ответ:
Для того, чтобы ArrayList знал, какие объекты в нем хранятся, нужно указать их класс явно:ArrayList<String> list = new ArrayList<>();
Тогда list.get(i) будет возвращать String и желаемый код заработает.
Запись же ArrayList list = new ArrayList()
эквивалентна записиArrayList<Object> list = new ArrayList<>()
В таком случае, list.get(i) возвращает не String, а Object, у которого метода length() просто не существует

Худший ответ:
Вы используете не массив а ArrayList т.е. Коллекцию 
в Коллекциях вместо lenght() есть метод size() - который возвращает количество елементов в коллекции 
list.get(i)  вы получаете конкретный елемент из коллекции  и пытаетесь вызвать у него метод lenght() т.е. не длинну массива а длинну конкретного елемента
Вопрос: Парсинг веб страницы на стороне пользователя (client side), возможно?

Лучший ответ:
Такое невозможно из-за безопасности браузера.
Вы бы хотели, чтобы любой сайт в интернете мог обратиться к вашему сайту, используя ваши куки, прочитать личные данные и отослать неизвестно кому? Вся приватность бы рухнула во всём мире в один миг. Магазины, на которые вы заходите, читали бы ваши пароли и постили бы за вас сообщения во вконтакте.
Единственный выход - делать это на стороне сервера.
Правда, есть всякие извращения, расширение можно написать своё, но это уже выходит за рамки вопроса.

Худший ответ:
В виде расширения для браузера - очень легко, есть такие :)
Я частенько парсил сайты через расширение браузера, и причем громадные сайты по 20к страниц
Вопрос: На чем писать сервер чтобы усложнить декомпиляцию?

Лучший ответ:
Переписывать все - не круто.
Достаточно небольшой кусок с ключевыми алгоритмами. 
Не обязательно весь сервер целиком.
Декомпиляция возможна всегда, но вопрос - на каком уровне будет декомпилированный код. Если ты получишь почти что ассемблер - смысла в декомпиляции мало.
Любой компилируемый в native подходит - Go, C/C++, Pascal, Haskell на порядки лучше, чем Python, Java, NodeJS.
Не забудь застрипать дебужные символы.
После чего декомпиляция из этого способна возродить назад такой ужас, в котором мало кто захочет разбираться задешево.
Но в конечном итоге все упирается насколько занитересован человек.
Если продукт очень массовый или очень дорогой - больше интереса взламывать.
А что, заказчик идиот?
Если он хочет заполучить сервер как некий гарант, то разве он не хочет еще и исходники?
Имхо, поддержка разработчика (устранение багов, которые и год спустя могут быть выявлены) существенный плюс, чтобы оставаться с вами.

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