WebTalks — cообщество разработчиковVPS на DigitalOcean и $10 в подарок за регистрацию
Контакты
Местоположение
Россия, Татарстан, Казань

Достижения

Все достижения (24)

Наибольший вклад в теги

Все теги (107)

Лучшие ответы пользователя

Все ответы (107)
  • Насколько важную роль при устройстве на работу программистом играют собственные OpenSource проекты?

    askhat
    @askhat
    SDE @ Akvelon
    Наличие публичных репозиториев как минимум покажет, как вы работаете с VCS. А если вы не умеете работать в VCS, значит компании придётся тратить ресурсы на ваше обучение, что снижает вашу ценность. Тим лид будет очень зол, если в первый же рабочий день вы запушите в мастер.
    Во-вторых это покажет, что вы не стыдитесь своей работы—не пишете говнокод. Здесь не идёт речь о благотворительности, вы не лишаетесь прав на свою работу, она по прежнему принадлежит вам. К тому же, вы ведь тоже используете открытые библиотеки, т.е. благотворительностью не занимаетесь, но активно её получаете.
    И последнее, ваши репозитории иллюстрируют ваш кругозор. Даже если вы устраиваетесь на позицию скажем верстальщика, и параллельно поддерживаете библиотеку для скажем нейро-сетей, это увеличит количество опций которые могут ожидать вас на новом рабочем месте.
    Ответ написан
  • Чем заменить функцию .map() в моем случае?

    askhat
    @askhat
    SDE @ Akvelon
    На вопрос ответил автор вопроса, я в свою очередь попытаюсь объяснить что произошло.

    Рендер в реакте всегда идёт по наименее трудозатратному пути, а именно вычисляет дельту (разницу) между новым стейтом и предыдущим, если таковой имеется. Например:

    class TodoList extends React.Component {
      state = {
        todos: [
          'Commit',
          'Push'
        ]
      }
      render() {
        return <ul>
          {this.state.todos.map(item => {
            return <li>{ todo }</li>
          }
        </ul>
      }
    }


    Если стейт компонента изменится, скажем при добавление элемента в начало списка todos, так что он станет таким:

    const todos = [
      'Init',
      'Commit',
      'Push'
    ]


    Реакт вычислит два древа shadow dom:

    // Начальный стейт
    <ul>
      <li>Commit</li>
      <li>Push</li>
    </ul>
    // Добавлен элемент
    <ul>
      <li>Init</li> // <- разница начинается здесь и до конца древа
      <li>Commit</li>
      <li>Push</li>
    </ul>


    Здесь выполняется работа которой можно было бы избежать. К примеру если бы элемент был добавлен в конец списка:

    const todos = [
      'Commit',
      'Push',
      'Merge'
    ]


    То реакт получил бы на сравнение другие два древа элементов:

    // Начальный стейт
    <ul>
      <li>Commit</li>
      <li>Push</li>
    </ul>
    // Добавлен элемент
    <ul>
      <li>Commit</li>
      <li>Push</li>
      <li>Merge</li> <- разница начинается здесь, от начала и до сих по ничего не менялось
    </ul>


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

    Совершенно очевидно что <li>Commit</li> и <li>Push</li> не менялись, однако реакт недостаточно умён чтобы это понять. Чтобы помочь ему следует воспользоваться специальным пропом key={}. Он может быть значением любого типа, единственно требование — значение должно стабильно идентифицировать соответствующие данные.

    Если бы компонент выглядел так:

    class TodoList extends React.Component {
      state = {
        todos: [
          { id: 0, text: 'Commit' },
          { id: 1, text: 'Push' }
        ]
      }
      render() {
        return <ul>
          {this.state.todos.map(item => {
            return <li key={todo.id}>{ todo.text }</li>
          }
        </ul>
      }
    }


    То добавление элемента в начало массива, породило бы следующий стейт:

    const todos = [
      { id: 2, text: 'Init' },
      { id: 0, text: 'Commit' },
      { id: 1, text: 'Push' }
    ]


    И, снова, два древа элементов:

    // Начальный стейт
    <ul>
      <li>Commit</li> // id 0
      <li>Push</li> // id 1
    </ul>
    // Добавлен элемент
    <ul>
      <li>Init</li> // id 2 новый элемент отобразится в начале
      <li>Commit</li> // id 0
      <li>Push</li> // id 1 
    </ul>


    Благодаря подсказке, реакт не учтёт в дельте элементы чьи идентификаторы не изменились, и, как следствие, не будет делать лишних действий.

    Таким образом использовать индекс в массиве в качестве ключа — не лучшая идея, особенно если массив будет меняться. По той же причине не следует использовать Math.random() в качестве ключа, так вы почти гарантировано будете всегда получать нестабильные идентификаторы.

    Подробнее об этом можно почитать здесь — Reconciliation.
    Ответ написан
  • XMLHttpRequest или fetch?

    askhat
    @askhat
    SDE @ Akvelon
    В идеальном мире у вас есть абстракция http клиента в которой вы легко меняете реализацию без изменений в остальном коде
    Ответ написан
  • Что учить вдобавок к Ruby on Rails?

    askhat
    @askhat
    SDE @ Akvelon
    Полагаю вы будете работать в сфере web и, как следствие, производить сайты. Тогда рекомендую посмотреть в сторону других фреймворков, например Sinatra, так как Rails по причине громоздкости не всегда лучшее решение, особенно для небольших и даже средних проектов. Абстрагируясь ниже, очень полезно понимать принципы работы rack и http-серверов в целом.
    Помимо обслуживания данных, важно уметь эти данные моделировать и хранить, поэтому без понимая релятивной и документальной модели нельзя считаться полноценным разработчиком. Я не призываю учить SQL, кажется это уже бесполезно учитывая многообразие data mapper'ов, однако необходимо четко понимать что такое foreign key и когда использовать relates trough resource.
    На фоне общий тенденции к созданию распределенных систем, крайне полезным окажется знание REST и методов построения API. Здесь хорошей практикой окажется Grape.
    Изучив эти абстракции понимание принципов MVC, и иже с ними, в JS на front-end покажется тривиальной задачей, (а может и нет). В любом случае JavaScript - обязательный навык.
    Ну и самое главное - изучать библиотеку языка. Ведь самое главное в ЯП даже не лексические конструкции и прочий синтаксический сахар, а его расширения - в нашем случае RubyGems.
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (32)