• Три года назад нужно было изучать Docker, два года назад — Kubernetes. Сейчас — Serverless
    +11

    Закон дырявых абстракций никто не отменял.


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


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


    Дурак напишет вам серверлесс функцию, которая удалит вашу серверлесс базу данных. И бекапа у вас не будет, ведь все серверлесс)


    Есть крутая книга на эту тему, "Мифический человекомесяц", и глава оттуда "Серебряной пули нет". Вкратце, не видно технических средств (языков, компиляторов) и т.д., которые смогут глобально ускорить разработку.


    Потому что проблема не в том, чтобы записать алгоритм, а в том, чтобы его придумать. Задача же языка программирования — не мешать. Как здесь поможет серверлесс — мне непонятно. Как будет мешать — вполне понятно. Например, отсутствие нормальной IDE, которая будет показывать связи между различными частями кода уже будет тормозить вас.

  • Односторонние и двусторонние отношения в Hibernate
    +3

    Из интересных моментов, которые я сталкивался — это работа с каскадным удалением связанных сущностей.


    Например, по дефолту hibernate при удалении связанных сущностей вначалей делает update связанной сущности, присваивая внешнему ключу значение null, а лишь потом удаляет связанную сущность. Фиксится поведение указанием updatable=false в аннотации @JoinColumn.


    Ещё один момент — если мы указываем каскадное удаление связанных сущностей, то мы отдаем это на откуп hibernate, в БД ограничения указываются без on delete cascade. Как результат, мы не можем удалить главную сущность, не удалив всех родителей. Не всегда это нужно, и часто удобней чтобы БД контролировала ссылочную целостностность. Лечится это поведение прописыванием явным constraints в аннотации @ForeignKey.

  • Древний костыль на старом костыле
    +9

    В чем особенность передачи именно картинки? Любой файл прекрасно передается, ведь его можно представить в виде байтового потока, и запихнуть в сокет.


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


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

  • Выбираем лучший бэкенд-фреймворк 2021 года
    +4

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


    В node.js про ошибку же мы узнаем лишь после запуска, точнее как до соответствующего места кода дойдет исполнение. В худшем случае код исполнится без ошибок, но неправильно (например, передали функции меньше параметров чем нужно).


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

  • Почему разработчики влюбляются в функциональное программирование?
    +1
    Это не значит, что Java — плохой язык. Но он не создан для решения тех задач, для решения которых отлично подходит функциональное программирование. Например — для управления базами данных или для разработки приложений из сферы машинного обучения.

    Эм, джава, которая в куче энтерпрайз софта, и которая отлично работает с базами данных, оказывается не для этого создана?


    Как мне кажется, для работы с базами данных джава отлично подходит. По логике в статье метод, в котором вставляются данные в БД (insert) уже не будет чистым — ведь он ничего не возвращает. Но в реальной жизни у нас есть изменяемое состояние (та же БД), и пример выше кажется надуманным.

  • Объектно-ориентированное программирование – катастрофа за триллион долларов. Часть 1
    +1

    "Наш мозг развивался в сторону «делания чего-то», а не в сторону выстраивания сложной иерархии из абстрактных объектов"


    Эм, так человек же социальное животное, и для выживания строил сложные социальные схемы в голове, когда ещё обезьяной был. Тот вожак, того не тронь, того почеши, с тем за ягодами сходить можно завтра.


    То есть, как раз на обработку достаточно большого количества объектов и связей мозг заточен. Есть число Данбара, согласно с которым 150-200 обьектов и связей между ними человек в голове удерживает.

  • Как я автоматизировал разворачивание приложений на Linux на коленке с помощью Bash скриптов и Java
    0

    Почитал комментарии, и понимаю что да, костыльное решение получилось. Могу сказать, что поскольку никто не знал как правильно — делали как умеем.


    Я так понимаю, что у вас была такая же ситуация (проходили похожий путь).


    К чему вы все же пришли, к какому стеку?


    Я склоняюсь пока к варианту поднять Jenkins, и делать что-то вроде:


    1) Jenkins из jenkinsfile собирает на той же машине, где запущен jenkins билд — это jar файл.
    2) Дальше jar файл копируется на целевую машину
    3) Каким-то скриптом убиваем старый процесс, запускаем новый.


    Пока до конца не понимаю, зачем использовать ansible, например, если процесс билда — это mvn package.

  • Как я автоматизировал разворачивание приложений на Linux на коленке с помощью Bash скриптов и Java
    +1

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


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

  • Как я автоматизировал разворачивание приложений на Linux на коленке с помощью Bash скриптов и Java
    +1

    Я хорошо знаю Java, и очень базово — bash. Выбрал инструмент, на котором смог сделать решение. Согласен с вами, что исключительно bash + утилиты получше решение, по крайней мере с точки зрения потребляемых ресурсов.

  • Как я автоматизировал разворачивание приложений на Linux на коленке с помощью Bash скриптов и Java
    0

    Да, отдельное приложение мониторит раз в минуту доступность сервисов, и если какой-то упал — перезапускается. В статье упомянул.

  • Microsoft признала, что из-за ошибки в обновлении для Windows 10 может происходить принудительная перезагрузка ПК
    +1

    Перешел два месяца назад полностью на Linux Mint (хотя покупал ноутбук с установленной Win 10). Но тормоза и постоянные перезагрузки из-за обновлений задолбали.


    Два дня назад поставил на ноутбук жене тоже linux — ноут начал нормально работать.


    Вспоминаю время windows xp, когда все работало быстро на слабом железе и не перезагружалось по каждому чиху. Кажется, Microsoft начала заниматься чем-то не тем.

  • Из Java-разработчика — в директора филиала IT-школы
    0

    Да, у меня обратный свитч. Хотя он неполный. По факту получилось так:


    разработчик->менеджер->разработчик.


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

  • Из Java-разработчика — в директора филиала IT-школы
    0

    А какие цифры вы хотите? За полгода работы мы набрали примерно 50 студентов в городе с населением 350 000 жителей. По финансам скажу только, что операционно вышли в плюс, но еще минус по P&L.


    Проблем было множество, парочка:


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

    В Телеграм-канале преимущественно пишу свой опыт о своем переходе и текущей работе. Есть и мои субъективные мысли по поводу IT в общем.

  • Из Java-разработчика — в директора филиала IT-школы
    0

    Я не оцениваю себя как сеньора. В моем понимании сеньор — это опытный (5+ лет) разработчик, у которого есть также хотя бы год управления командой. У меня специфический опыт, я много программировал, но никем не управлял.


    Поэтому я оцениваю себя как мидл разработчика, который частично исполняет сеньорские обязанности. За зарплату — если сравнивать с предыдущим местом работы, она выросла в 2.5 раза. Я был на госслужбе, не забывайте :)

  • E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами
    0

    Спасибо! Если продолжим развивать проект — попробуем gitlab

  • E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами
    0

    А, ну бывает и такое:) Действительно глянул логотип — похожий.

  • E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами
    0

    Да, вы правы, операция отнимала и отнимает мало времени. Обновление проекта занимает меньше пяти минут.


    За все время разработки проект обновлялся на VPS не больше пяти раз. Остальное время тестировалось локально все.

  • E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами
    0

    Информацию о добавках сейчас берем из сайта http://dobavkam.net. Это первый сайт, который попался нам на глаза.


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


    За эмблему не совсем понял :) Вы про эмблему сайта или про favicon? Если favicon, то это стандартная иконка Spring.

  • E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами
    0

    Я ни разу не пользовался gitlab, только читал про эту штуку, хочу попробовать. Согласен, что это лучше, чем набор bash скриптов.


    Может и попробуем gitlab чуть позже.

  • E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами
    +5

    Только средства Spring Boot.


    Если кратко, примерно так:


    1) Генерируется SSL сертификат, преобразуется в понятный Спрингу формат. Делал по этому туториалу — https://dzone.com/articles/spring-boot-secured-by-lets-encrypt
    2) Меняется server.port: 8443 на server.port: 443. Это дефолтный для HTTPS порт
    3) Теперь ваше приложение будет доступно по HTTPS, но недоступно по HTTP. Чтобы это исправить, добавляете редирект с HTTP на HTTPS:


    @Configuration
    @Profile("prod")
    public class RedirectHttpComponent {
        @Bean
        public ServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
                @Override
                protected void postProcessContext(Context context) {
                    SecurityConstraint securityConstraint = new SecurityConstraint();
                    securityConstraint.setUserConstraint("CONFIDENTIAL");
                    SecurityCollection collection = new SecurityCollection();
                    collection.addPattern("/*");
                    securityConstraint.addCollection(collection);
                    context.addConstraint(securityConstraint);
                }
            };
            tomcat.addAdditionalTomcatConnectors(redirectConnector());
            return tomcat;
        }
    
        private Connector redirectConnector() {
            Connector connector = new Connector(
                    TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
            connector.setScheme("http");
            connector.setPort(80);
            connector.setSecure(false);
            connector.setRedirectPort(443);
            return connector;
        }
    }

    Аннотация Profile("prod") указывает, что эта конфигурация применится лишь при запуске приложения в продакшн режиме.

  • E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами
    +2

    Ну счетчики добавил я сам. А по факту вы в любом случае, особенно в случае коммерции, будете с ними сталкиваться. Вот спросят у вас простой вопрос — "Сколько людей за месяц зашло на наш сайт? А на вот эту страничку?". Так что или будете свои писать, либо готовые возьмете, с аналитикой уже готовой.

  • E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами
    0

    Не совсем понимаю, о чем вы.


    Если о счетчиках посещаемости — да, добавлен счетчик Яндекс.Метрики и счетчик Google Analytics. Добавлены, потому что интересно посмотреть, сколько людей пользуются сайтом, по каким ключевым словам приходят.

  • E-Dobavki — веб-сервис поиска пищевых добавок на Java и Spring Boot, написанный моими студентами
    +1

    Пожалуйста!


    Возраст — от 18 (студенты в ВУЗе) до 45 примерно. Медианно где-то 25-30.


    Как определил — субъективно. Студент более собранный становится, задает больше вопросов. Остальные студенты внимательней смотрят, подсказывают товарищу. Ну как бы не препод что-то там пишет, а ваш коллега. Ну и такой эффект включается, что тебя могут вызвать самого что-то написать, волей-неволей больше вдумываешься.


    Гуглдок вот — https://docs.google.com/document/d/1Of9u0tJ6hrSde2LiJ9nyWBMbTXJIuzuKZizA204RBdA/edit


    Задачей тимлида была выдача заданий, приемка пулл реквестов. А при приеме пулл реквеста он проверял, что проект запускается и работает. Ну и каждый, кто делал фичу, проверял, что она работает. Так и писал в чат — "сделал пулл реквест. Запустил, работает". Конечно это не назвать полноценным тестированием, но более-менее работало.


    За расшевеливание:
    1) Ежедневные отчеты. Кажется фигней, но отлично мотивирует. Эту штуку я подглядел, когда сам проходил онлайн-курсы (не по программированию).
    2) Ежедневное общение в чате. Отвечал на все комменты, задавал вопросы. То есть, было ощущение, что проект живет, развивается, пишется.
    3) Когда видел, что от кого-то долго нет отчетов и сообщений, писал ему лично, спрашивал, все ли нормально, есть ли таски. Помогало — были моменты, что человек что-то сделал, но стеснялся залить на гитхаб, даже так :)
    4) Как только появилась первая версия проекта, почти без ничего — залил на VPS, и показал, что оно шевелится. Появилось ощущение не "пишем пет-проект в стол", а "делаем сервис для людей"

  • Cocos2d-x — Обработка действий
    0

    В libGDX тоже есть система Actions, пишутся очень похоже. Например, для перемещения обьекта на 50 пикселей влево за 1 секунду:


    actor.addAction(moveBy(50, 0, 1f));


    Прочитал статью — практически все Action-ы есть в libGDX. Судя по тому, что поддержка Action в libGDX появилась где-то три года назад, разработчик libGDX вдохновлялся Cocos-2d в этом плане :)

  • Как набить кучу шишек и выпустить игру
    0

    Когда мы начинали писать эту игр, еще была возможность использования Unity. Другой парень собрал демку на Unity быстро, но поскольку она даже не запустилась на моем телефоне (на то время у меня был Samsung Galaxy Gio), то решили делать на проверенной технологии.

  • Как набить кучу шишек и выпустить игру
    0

    По поводу графики — это субьективно. Многим нравится текущая графика, на гугл плей наоборот отмечают, что дизайн приятный.

  • Как набить кучу шишек и выпустить игру
    0

    Да, ошибки в дизайне возможны. В свое оправдание скажу лишь, что дизайном занимался художник. А вообще поддерживаю alrdev — если напишете статью, где "на пальцах" обьясните основные ошибки в дизайне — будет очень круто, с удовольствием почитаю.

  • Как набить кучу шишек и выпустить игру
    0

    Монетизация — реклама + покупки (отключение рекламы, покупка платных уровней). За выхлоп — еще ничего не скажем, потому что игра лишь несколько дней в Google Play.

  • Как набить кучу шишек и выпустить игру
    0

    Вы правы, и я упомянул про этот момент в статье. Для действительно правдивого движения нужно было бы использовать (или писать свой) 3D физ. движок + использовать 3D модель. Увы, на тот момент у меня не было необходимых знаний.

  • Начинать программировать никогда не рано: взгляд девятилетнего
    0

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

  • Я заглянул в папку node_modules, и вы не поверите, что произошло
    +1
    Если мы заглянем в зависимости эмбера, то увидим библиотеку под названием glimmer. Сама эта библиотека весит 95KB (или 95% кода эмбера)

    Не 95%, а (95/112*100) = 85%

  • Долгожданная проверка CryEngine V
    0

    Скорей всего, дело в том, что крайний левый бит отвечает за знак. А побитовый сдвиг сдвигает все биты (в том числе и знаковый), и непонятно, что будет в этом крайнем бите после сдвига.


    P.S. Я тоже не C++ программист, поэтому это лишь мои догадки

  • История языков программирования: что помогло языку Java «войти в каждый дом»
    +1
    Это должно быть очевидно из названия.

    Семантика переменной должна определяться по ее названию, а не по типу (и уж точно не по тому, какой тип коллекции использован для переменной).


    Я с вами абсолютно согласен. Но здесь такой момент, что далеко не все программисты обладают достаточной квалификацией (а иногда и желанием) писать такой хороший код. И часто так бывает, что переменным присваивают неподходящие имена. Тогда хотя бы знание типа помогает разобрать такой код. Такой код встречается у многих проектах — например, я использую популярный движок libGDX — он opensource, поэтому я часто заглядываю в кишки, посмотреть как и что делается. Так там много чего попадается, что не попадает под определение «хороший код». Где-то красоту приносят в жертву оптимизации. В общем, надеяться на то, что в переменных всегда будут правильные имена нельзя :)
  • История языков программирования: что помогло языку Java «войти в каждый дом»
    +4
    Если я вижу запись вида a[4] = 5, здесь есть два варианта: Dict или массив. Если я читаю незнакомый мне код, это однозначно заставит меня на секунду задуматься (вспомнить) две вещи: 1) что же такое «a» (какую роль играет эта переменная) 2) Какой тип этой переменной. В зависимости от типа эта переменная может играть разную роль.

    UPD: Еще момент — приходится удерживать в памяти лишнюю сущность — знание, что из нескольких вариантов типов «а» является каким-то конкретным типом. Учитывая, что кратковременная память способна удерживать не так уж и много, разумно предположить, что лучше максимально освобождать ее на другие задачи.

    Как по мне, лучше пусть язык не заставляет над таким задумываться. В какой-то мере это напоминает ситуацию из JavaScript — там вообще можно что угодно делать, но народ потихоньку пытается отходить на что-то более строгое — TypeScript, CoffeScript.
  • История языков программирования: что помогло языку Java «войти в каждый дом»
    +8
    C# у меня оставил впечатление некой перегруженности (это лишь мое субьективное мнение). Например, в Dict доступ к обьекту можно получить, используя квадратные скобки — a[«key»]. Вроде бы приятно, но если, например, ключами будут числа — то запись вида a[4] уже однозначно нельзя трактовать — a это массив или Dict?

    Я понимаю, что это с какой-то стороны мелочи, и это дело привычки, и IDE покажет тип обьекта. Но именно строгость и прямолинейность Java в этих вопросах (ах, программист, хочешь удобную работу с Map — окей, держи — map.put(«key», value"), value = map.get(«key»)) мне нравится. Мне нравится, что в большинстве случаев мне не нужно задумываться про то, что я пишу — я лишь переношу мысли с головы в код. Из C# у меня такого ощущения не возникало.

    Опять-таки, я осознаю, что это очень субьективное мнение. Возможно, если бы я еще год-два писал на C#, я бы изменил свою точку зрения.

    P.S. А еще в Java шикарнейшие enum.
  • История языков программирования: что помогло языку Java «войти в каждый дом»
    +6
    Простота и логичность. Я писал на Java порядка 5-7 лет (до этого стандартные турбо паскаль, делфи), потом немного писал на C#. Как по мне? Java являет собой именно ту средину между нужными возможностями и ненужными усложнениями языка. На java можно написать мобильную игрушку, и производительный сервер на netty, и в обеих случаях будет ощущение, что язык тебе помогает, а не мешает.
  • Осторожно — Бульдозер (сборка apk пакетов в Kivy)
    +2
    И все же, 5 секунд — это очень много для запуска Android-приложения (разве что относительно тяжелая игра). Что вы имеете в виду под запуском — время от нажатия иконки (и появления черного экрана) до появления какого-то сплеш-скрина?
  • Как мобайл обогатит ритейл?
    0
    А зачем вы делаете такой ужасный заголовок, из которого ничего не понятно? Что такое «Мобайл», что такое «Ритейл» (уверен, есть много людей на этом сайте, которые это тоже не знают)?
  • Android N: как Google «закручивает гайки»
    +1
    В статье написано «Игровой движок Vulkan» — может, все же API для 2D\3D графики?
  • Гуру слов, проблемы с Unity3d, и счастливый финал в итоге
    0
    Такое уже есть — кинг, деберц, и т.д. Принцип один и тот же — брать взятки. А очки считаются по разному. Получились разные игры, в которых разная стратегия игры.

    За втюхаем задорого — мы ничего никому не втюхиваем, ваш сарказм неуместен. Игра бесплатна, без in-apps. Есть реклама — я это упомянул в статье. Сейчас мы наращиваем словарь и добавляем новые возможности, когда все будет готово — задумаемся о монетизации. То есть, у нас сначала игра, в которую интересно играть, а потом монетизация.