• Вероятно, хватит рекомендовать «Чистый код»
    0
    человеку покормить кошку, воспользовавшись кормушкой

    Некорректная формулировка. Это два разных действия — насыпать корм из человека в кормушку, пересыпать корм из кормушки в кошку.

  • Вероятно, хватит рекомендовать «Чистый код»
    +5

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


    Поэтому рекомендовал и буду рекомендовать.

  • Functional FizzBuzz на Scala
    0

    В вашем коде (как и в моем) нет повторно используемых компонентов, помимо, возможно, функции fizzBuz/row


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


    Ваш вариант fizzBuz нарушает I в SOLID — передаваемые тайпклассы избыточны и если клиент захочет использовать эту функцию со сторонним типом, у него будут проблемы. С другой стороны, эти тайпклассы не делают бизнес-логику более понятной — идеально написанный код по требованиям должен совпадать с требованиями построчно, вы же используете "особенность" — что FizzBuzz состоит из Fizz и Buzz

  • Functional FizzBuzz на Scala
    0

    Я бы не стал так делать, очень много букв, очень хрупкий код. Вот мой вариант, на Tagless Final:


    import simulacrum._
    import scala.language.implicitConversions
    
    // define operations on A required by FizzBuzz business logic
    @typeclass
    trait FizzBuzzNumber[A] {
      // return true if a is divisible by v
      def divisibleBy(a: A, v: Int): Boolean
    
      // format A according to FizzBuzz requirements
      def show(a: A): String
    }
    // import simulacrum-generated ops on A
    import FizzBuzzNumber.ops._
    
    // totally abstract business logic
    def row[A: FizzBuzzNumber](a: A): String = {
      val by3 = a.divisibleBy(3)
      val by5 = a.divisibleBy(5)
    
      if (by3 && by5) "FizzBuzz" 
        else if (by3) "Fizz"
        else if (by5) "Buzz"
        else a.show
    }
    
    //
    // implement FizzBuzz on ints
    //
    implicit val intInstance: FizzBuzzNumber[Int] = new FizzBuzzNumber[Int] {
      def divisibleBy(a: Int, v: Int): Boolean = a % v == 0
      def show(a: Int): String = a.toString
    }
    
    // lazy rows, to do not allocate memory for all 100 rows at once
    val rows: Iterable[String] = (1 to 100).view.map(v => row(v))
    
    rows.foreach(println)

    Запускаемый вариант: https://scastie.scala-lang.org/PlKt79BOQ6afkgHveSjyIA

  • Официальное заявление «Мастерхоста» о захвате дата-центра
    –2

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

  • Медицинская маска больше не спасает от распознавания лица
    +2

    Идея для бизнеса: продавать медицинские маски для лица, на которых нарисовано лицо

  • REST API должен основываться на гипертексте
    –2

    Нет, нет, нет.


    Основное достоинство rest api по сравнению с rpc over http — он понятнее и позволяет использование огромного количества клиентов — от curl и браузера до python/java/c++


    Если ваш рест апи непонятнее рпц или несовместим с чем-то из вышеперечисленного — никому он такой не нужен.

  • IT в системе школьного образования
    +2

    В статье так и не написали, что именно кажется неудовлетворительным. Я закончил школу в 2000м и у нас с информатикой всё было неплохо — бейсик, потом два года паскаль. Мы проходили массивы списки, деревья. Писали сортировки и поиски в массивах. Умели делать обход дерева.


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

  • Пять причин почему ИИ не сможет заменить людей, а сделает нас только лучше
    0

    Автор статьи путает капитализм с коммунизмом.


    Жизнь улучшится для потребителей и работников хайтека. А как насчет остальных?


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


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

  • Фреймворки — больше минусов чем плюсов
    0

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


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


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


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

  • Фреймворки — больше минусов чем плюсов
    +1

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


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


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


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

  • Миссия: найти работу с институтской скамьи
    +2

    Ох уж эта работа мечты, заставлющая пропускать пары на пятом!!! курсе.


    Опишу свой опыт:


    • работать надо начиная с 3-4 курса, зависит от того, как тяжело дается учеба
    • работа должна быть на полставки со свободной посещаемостью, в любое время с 9-00 до 20-00, важно только суммарно отработанное время
    • проще всего найти такую работу, спросив преподавателей. Они могут порекомендовать вас в подходящее место — где к набегающим студентам будут лояльны и даже доплачивать им за работу)
    • на 5-6 курсе, когда будет посвободнее со временем и будет опыт работы, можно начинать ходить на собеседования в серьезные компании.
  • Идентификация клиентов на сайтах без паролей и cookie: заявка на стандарт
    0

    Мне больше нравится идея аутентификации через OAuth2 на госуслугах, у них даже есть опция анонимной аутентификации, когда стороннему сервису передается только email.


    Сервера надежно защищены, гарантии существования сервиса дает государство, при потере пароля можно прийти с паспортом в ближайший МФЦ.


    Вот только подключиться к ним нельзя, отвечают отпиской, что подключение только для категорий организаций, явно указанных в каких-то ФЗ...

  • Новый проект братьев Дуровых: Telegram Open Network
    +1

    Я пессимист, я приведу два НО:


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

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


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


    Вот пример, как надо описывать свои идеи: https://habr.com/ru/post/235121/

  • Смертные грехи разработчика
    0

    вы использовали живые браузеры, не headless?

  • Смертные грехи разработчика
    0
    Я же запускал тесты, зачем тестировать руками приложение?

    Вот это неправильно. Доказывается очень просто — что можно прокликать вручную, то можно автоматизировать. Вручную можно прокликать 2-3 тесткейса, автотесты могут прокликивать сотни тесткейсов. Для проблем со сломанной версткой есть скриншоты и попиксельное сравнение с эталонной картинкой.

  • Не соглашайтесь разрабатывать то, чего не понимаете
    +1

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

  • Прекратите усердствовать с комментариями в коде
    +2

    Потому, что они профессионально пишут статьи, а не код

  • 10 принципов самодокументируемого кода
    –3

    Важная часть умения бить на подфункции — уметь не бить на подфункции

  • Не очередной язык программирования. Часть 1: Логика предметной области
    0

    Кстати, кто хочет сам потыкать:
    git clone https://github.com/lsfusion-solutions/timetracking
    mvn antrun:run -Pexec-client


    Появляется GUI на свинге, дальше продвинуться не удалось — нужен какой-то сервер, причем, похоже, не сервер БД.

  • Не очередной язык программирования. Часть 1: Логика предметной области
    0

    Отдельное спасибо за то, что не просто рассказываете о крутизне платформы, но и выложили исходный код старых, крупных проектов, написанных на этой платформе.


    Я правильно понял, что lsFusion код транслируется в SQL и хранимые процедуры?

  • Об ошибках, возникающих ниоткуда и в которых некого винить: Феномен Размазывания Ответственности
    +1

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


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

  • Об ошибках, возникающих ниоткуда и в которых некого винить: Феномен Размазывания Ответственности
    +3

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


    Разделение ответственности — это хорошо, но самый важный принцип в микросервисной системе — изоляция мутабельного состояния (базы данных и кеши) и максимально жесткая спецификация интерфейсов между микросервисами.

  • 10 принципов самодокументируемого кода
    +4

    ага, инициализацию локальных переменных в одну функцию, цикл в другую, оператор return — в третью.


    По статье по ссылке — посмотрите сами на его пример отрефакторенного кода. Разве не хочется добавить простора? между методами, внутри метода lines()?


    edit: вот ваше сообщение состоит из 3 предложений, и вы все равно разбили их на два абзаца. Чем код хуже?

  • 10 принципов самодокументируемого кода
    +1

    Вы неправильно понимаете назначение заголовочных комментариев. Как и в остальных комментариях, там должно быть не то, что уже написано в коде, а то, чего в коде, как минимум, явно, нет. Назначение класса (что вовсе не обязано совпадать с тем, что он делает), архитектурные ограничения, поддержка многопоточности, принятые в нем особенности работы с транзакциями и т.п.


    В Java-мире учиться писать комментарии можно на примере JRE и spring-core

  • Динамическое программирование в реальном мире: вырезание швов
    0

    Это, случаем, не разновидность задачи поиска кратчайшего пути во взвешенном графе?

  • 10 принципов самодокументируемого кода
    +4

    Логгирование предназначено немного не для этого. Если о предназначении кода можно догадаться только по текстовым строкам логгирования, то у меня плохие новости о качестве вашего кода...


    Логгирование не должно упрощать понимание кода, тем более сильно.

  • 10 принципов самодокументируемого кода
    +1

    У меня java background, мне можно. Там принято фигурную скобку на той же строке открывать.


    В C++, имхо, лучше не бежать поперек паровоза и использовать принятый там (и командой) стиль кода. Классика же — холиварность вопроса прямо пропорциональна его незначительности.


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

  • 10 принципов самодокументируемого кода
    +4

    Я бы сделал вот так:


    int fibonacci(int position) {
         if (position < 2) return 1;
    
         int previousButOne = 1, previous = 1, answer = 2;
    
         for (int n = 2; n < position; ++n)  {
             previousButOne = previous;
             previous = answer;
             answer = previous + previousButOne;
         }
    
         return answer;
    }
  • 10 принципов самодокументируемого кода
    +7

    11. Не стесняйтесь вставлять пустые строки, разделяя смысловые блоки в рамках одной функции
    12. Над каждым публичным классом и каждой публичной функцией должен быть комментарий. Да, код самодокументируемый и всё такое, но для этого его надо прочитать и осознать
    13. В сложных местах (особенно если у будущего читателя может появиться желание "упростить" код) должен быть комментарий, объясняющий, почему было сделано именно так
    14. самодокументируемого кода не бывает, бывает документированный код и недокументированный код

  • Как делать сайты в 2019 году
    0

    Это всё ужасно, но если этим пользуются, то, наверное, оно работает?

  • 13 самых заминусованных статей минувшего года
    –1

    Почему вы на незнакомых вам людей клеите ярлыки, искажете их слова и обвиняете их во лжи?

  • Пьеса для механического руководителя
    0

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


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

  • Королев. Лекарство для веба
    0

    Не думали про композитный подход? когда korolev component может содержать css/js? Когда первоначальный рендер происходит на сервере, а динамическое обновление html возможно как по инициативе сервере, так и по инициативе клиента — либо запросом ререндера с сервера, либо прямой манипуляцией DOM.

  • Почему только прокачка кодинга не сделает из тебя лучшего разработчика
    +1

    Это всё хорошо и правильно, но отнимает много времени, которое можно было бы потратить на любимое дело — на программирование.


    Программист с развитыми навыками менеджера — золотое дно для компании и первый кандидат на повышение в должности и зарплате. Но придется отказаться от программирования.

  • Ненаучно о монадах
    0

    Я планировал не усложнять статью математикой. Если что, формальное определение есть на википедии:
    https://en.wikipedia.org/wiki/Monad_(functional_programming)#Definition

  • Ненаучно о монадах
    0

    я тоже, я тоже...

  • Ненаучно о монадах
    0
    Он же не может генерировать строки, например, или бинарные деревья, иначе он уже не будет генератором чисел.

    Но это же функтор! Пример прямо из статьи — как из генератора случайных чисел сделать генератор случайных строк той же случайности.

  • Ненаучно о монадах
    0
    Функтор — это абстракция над способом структурной организации данных

    Вовсе нет. Функтор не обязан быть чистым или иммутабельным. Например, из функции InputStream.read(buff, off, len) можно сделать Functor.

    Функтор всегда параметризован типом.

    Да, типом данных, которые этот функтор генерирует. Не вижу проблемы, если честно