• Как удается получить заказ на бирже?

    @awdemme
    Отвечаю как заказчик, выставлял свои заказы, получал дебильные отклики:

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

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

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

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

    Сам я прекрасно брал работы, даже когда начинал обращение с предложением поднять оплату в 1,5-2-3 раза относительно желаемого заказчиком.
    Разумеется, это все было не с потолка, а с моих реальных оценок сложности работ.

    Не пиши отклик, если не видишь внятного описания задачи.
    С большой вероятностью сами не знают что хотят и не разбираются в том, кто им нужен.
    Больше времени потеряешь.
    Ответ написан
    19 комментариев
  • Как правильно выбирать позицию в разговоре с клиентом?

    ZERGE
    @ZERGE
    Основная точка: ищите то что нужно вам.
    Это фриланс, вы вольны выбирать как вам работать и с кем. Работайте так, как комфортно вам. Если вам что-то не подходит, говорите это заказчику, находите общий знаменатель, не находите - прощайтесь.
    Ответ написан
    Комментировать
  • Как правильно оценить стоимость своей работы?

    angrySCV
    @angrySCV
    machine learning, programming, startuping
    не правильно Дядя Федор, ты себестоимость своего труда считаешь.
    Даже если у тебя 500 рублей в час -> ты не учитывал накладные расходы, на поиск и обработку заказа (даже если тебе чувак сам написал), на тестирование, на всякие согласования и консультации, на сдачу / приемку. Ты не учитываешь что у тебя из переговоров только какая-то часть получается заказов (соответственно ты тоже должен это включать в расчет цены), и потраченное время на других потенциальных заказчиков тебе тоже кто-то должен возмещать, иначе ты с голоду помрешь при такой калькуляции что сейчас у тебя есть.
    но это все "себестоимость" - реальная цена труда - это столько за сколько ты можешь его продать (а это уже продавать нужно уметь), и я тебе говорю, можно продавать раз в 10 дороже чем ты это делаешь сейчас,
    пойми -> ты продавал продукт (в виде бота), а не 1 час программирования.
    Вобщем мой совет тебе обратится такой "желающий" за 500 рублей бота получить, говори ему сразу например 20 тысяч -> и пускай валит кулем, если нет столько бабок за разработку -> значит не дорос еще ботов покупать, пускай за 500 рублей себе конфеток купит.
    Тебе не нужно гнаться за КАЖДЫМ заказчиком, выставляй ценник от 20 тысяч например за пару дней работы, откажись от 90% заказчиков-нищебродов, и начни нормально работать. У кого есть бабки они тебе оплатят и больше за разработку, лучше работать 1 день в месяц с достойным заказчиком, чем весь месяц с какими-то нищибродами (которые изза 500 рублей еще торговаться будут).
    П. С.
    Сейчас фантастическое количество людей которые хотят например себе получить интернет-сервис, или там какого-нибудь бота за "500 руб", это неадекватные больные на всю голову люди, которые не ценят ни чужой труд, ни результаты этого труда, с ними даже разговаривать нельзя. Они вообще ко всем лезут, стучатся в лички, начинают уговаривают и тд. Посылай их сразу нахер.
    Ответ написан
  • Переход с постоянки на фриланс, стоит ли игра свеч?

    Epsiloncool
    @Epsiloncool
    Программер, веб-девелопер, гейм-девелопер
    Фриланс. Однозначно ДА. Сейчас объясню почему.

    Стабильность/офисная работа/работа с одним клиентом - прекращает твоё развитие как специалиста и как предпринимателя. Самое главное - ты не развиваешься в первую очередь как личность. За тебя кто-то несёт ответственность за весь проект, кто-то говорит тебе ЧТО делать и кто-то ищет тебе задачи в большом море, называемом "открытый рынок". В итоге все деньги получает твой начальник, а ты только $8.5 в час.

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

    У тебя есть сомнения? Смотри. Как только ты начнёшь фрилансить, можешь поставить себе часовую планку в $15 в час. Это нормальная цена для зарубежного рынка. Ты будешь некоторое время нереально впахивать по 8-10 часов в сутки, семья может быть даже тебя ненадолго потеряет. Но это всё временно. Потому что за это время ты должен научиться писать хорошие пропосаулы (а это и есть продажа себя). После того как накопишь некоторое портфолио, список положительных отзывов и научишься писать предложения - повышай планку. Ищи длинные заказы с часовой стоимостью в $20-30. Такие заказы встречаются реже, так что ты можешь потратить несколько дней в поисках, но это окупится с лихвой, т.к. ты можешь уменьшать количество времени на работу в день и вновь вернуться в нормальную жизнь. Через полгода вновь поднимай планку. $40-50 в час - совсем не предел.

    Такое случилось со мной после прочтения книжки "как работать 4 часа в неделю". Я тогда работал фрилансером на $10-15 в час и принял одно простое решение. После этого начала работать 2-4 часа в сутки и при этом моя прибыль увеличилась в 3 раза.

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

    Поэтому ещё раз - фриланс и ещё раз фриланс. Прими как лекарство.
    Ответ написан
    13 комментариев
  • Переход с постоянки на фриланс, стоит ли игра свеч?

    deenween
    @deenween
    Laravel
    Почему стоит переходить на фриланс?
    1. Месячную зарплату (в офисе) можно заработать за более короткое время.
    2. Можно работать в любое время. Для меня с 6 утро до 12(14ч) дня.
    3. Есть время на себя. И это здорово.
    4. В офисе помню, перед тем как уйти на фриланс, сильно уставал к 6 часам вечера. На фрилансе реже. Просто надо брать за правило - ЕСТЬ ВРЕМЯ - ДЕЛАЙ, НЕ ОТКЛАДЫВАЙ.
    5. Наверно самый важный пункт. Когда за свою работу начнешь получать хорошие деньги, ты будешь стараться делать качественно.

    ЗЫ: на твоем месте я бы уже начал искать проекты на фрилансе.
    Представляешь, тебе будет 40 лет, а ты все еще получаешь маленькую ЗП. И уже боишься менять свою жизнь. А мысли о том что мог все изменить не будут оставлять тебя в покое. Так что, пока молодой - вперед.))
    Ответ написан
    1 комментарий
  • Плохо ли создавать проекты с нуля? Что значит быть про?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Я понимаю, о чем вы пишите и почему. Ваш код работает, т.к. решает поставленные задачи и удовлетворяет потребности ваших клиентов. Имеет ли он право на жизнь? Да, но только в вашем отдельно взятом случае.

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

    Что если вам потребуется сделать блог, в котором нужно иметь комментарии, которые обновляются в режиме реального времени? И комментарии могут содержать HTML, но такой, чтобы ваш сайт не могли взломать?
    А еще комментарии короче 2000 символов по воскресеньям платные. Оплата через Яндекс.Деньги.
    Вы все это делаете, все работает.
    Затем заказчик вам говорит, я хочу запустить такую же систему другу, но с оплатой по понедельникам через WebMoney.
    Вы копируете сайт, переписываете функцию оплаты.
    Дальше ваш заказчик видит, что у друга больше денег, он просит добавить WebMoney к себе.
    Вы опять переписываете код. Добавляете условия.
    Потом к вам приходит друг заказчика и хочет другое оформление. Вы переписываете его функции.
    Затем он просит добавить поиск по названиям записей к себе на сайт. Вы делаете. Буквально на следующий день к вам приходит заказчик и тоже просит поиск, но не только по названиями, но и по телу статей и по комментариям. Вы делаете.
    Затем ваш заказчик видит, что дела у него идут в гору и он просит отменить платные комментарии и сделать просто платные аккаунты для всех. Вы переписываете.
    Тем временем друг просит вас сделать все тоже самое, но с его оформлением.
    Дела у заказчика идут в гору и сайт начинает тормозить. Вы делаете кэширование.
    Внезапно сайт заказчика попадает в топ и нагрузка резко увеличиваете настолько, что один сервер уже не справляется. Вы переносите все на самый мощный, но он его тоже мало.
    Нужно делать горизонтальное масштабирование.
    Для этого нужно переписать все функции, которые работают с базой данных. А их уже больше двухсот. И просто замена не подходит.
    Сайт открывается через раз, заказчик звонит вам каждые 2 часа и спрашивает, как там прогресс.
    И тут вам присылает письмо друг заказчика и говорит, что хочет перейти с MySQL на PostgreSQL.
    И вы понимаете, что вам надо будет переписать еще 300 функций, но на другом сайте. Вы его посылаете, поскольку вы и так в мыле.
    Друг жалуется на вас заказчику. Заказчик, не ставя вас в известность, нанимает другого исполнителя, у которого отваливается челюсть от того, что творится в системе. Он объясняет, что ему нужно будет потратить полгода, чтобы вникнуть в то, чтобы понять ваш код, но он может сделать все тоже самое за 4 месяца, причем для заказчика и его друга так, что это будет расширяемо и поддерживаемо не только им.
    Тем временем, спустя двое суток жизни на кофеине вы героически переписываете все функции заказчика и идете отсыпаться. После суток сна вы обнаруживаете на автоответчике сообщение, что вы уволены. А все потому, что забыли проверить функцию логина.

    А теперь разберем эту историю по частям. Почему же вас уволили?

    Незнание абстракций и шаблонов проектирования привело к тому, что вы вынуждены были поддерживать 2 разных проекта с практически одинаковой логикой.
    Например ORM смог вам помочь поддерживать 2 разные базы данных без каких-либо усилий. Сменить одну базу на другую стоило бы исправления конфигурации, а не переписывания 300 функций.
    Использование фреймворков позволило бы сократить время на реализацию подключений платежных систем. Многие из них имеют готовые реализации.
    Опять же в современных фреймворках, например в той же Doctrine реализован шардинг. В большинстве случаев ваши проблемы свелись к изменению настроек.
    Но даже если бы вы накосячили, то интеграционные тесты не позволили бы попасть говну в продакшен. А если бы оно и попало, ну накосячили вы с тестами тоже, то проблема была бы обнаружена на раннем этапе благодаря "сине-зеленому" развертыванию и она бы не затронула всех пользователей.
    И да, ваш код не прошел внешний аудит.

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

    Когда пишете свой код, почаще задавайте себе вопрос: А если бы это был код для моего кардиостимулятора? Это поможет.
    Это вам для общего развития.
    Ответ написан
    5 комментариев
  • Как разрешить небольшой конфликт с заказчиком на upwork?

    @kstyle
    отдайте 2 часа. это мелочи по сравнению с возможным конфликтом
    Ответ написан
    4 комментария
  • Плохо ли создавать проекты с нуля? Что значит быть про?

    @artem_music
    Отвечу со своей колокольни - пока вы пишите проекты для себя, то никаких проблем и вопросов, но как только вы начинаете продавать подобное клиентам, то им с этим в будущем как-то жить, с вами на поддержке или без вас.

    И в целом своя архитектура в проекте очень расслабляет, если она изначально четко и грамотно не описана. Много раз сталкивались, что от заказчика приходит проект на доработки, который сделали либо фрилансеры, либо студии на самописных движках, по сути похожих на то, что вы показали (процедуры, прямые обращения в базу и тд). Там прослеживается четкая последовательность - в первых-вторых-пятых версиях все еще более-менее адекватно и можно поддерживать (если вникнуть, конечно), но через пару лет развития своей рукописной CMS неизбежно появление говнокода, который появился "ненадолго, временно залатать пару ишьюсов". И это все тянется в новые версии, ставится заплатка на заплатку, и в итоге превращается в огромную вонючую неподдерживаемую кучу.

    И после поддержки таких проектов достаточно посмотреть на проекты, например, на рельсах, которые развиваются на протяжении 2-3 лет, и становится очень приятно, что не нужно ломать голову.
    Ответ написан
    Комментировать
  • Почему программа загружает процессор на 100%?

    @Otrivin
    junior full-stack сисадмин
    Вирусная атака?
    Нет, серьезно, как-то я около полугода обходился без антивиря, потом для каких-то целей установил. И тут понеслось! Почти каждый экзешник оказался заражен одним и тем же присоседившимся ширусом.
    Ответ написан
    1 комментарий
  • Автоответ на фрилансе?

    @lere
    При авто постинге низкий отклик от заказчиков...
    Ответ написан
    Комментировать
  • Upwork - в какое время больше всего заказов?

    sim3x
    @sim3x
    В рабочее время в той части планеты, где требуется решение задач
    Ответ написан
    Комментировать
  • Нормально ли начал на upwork?

    LazyTalent
    @LazyTalent
    Data Engineer, Freelancer
    Первый свой скрипт на апворке написал за 5 баксов, спустя 4 месяца стал топ рейтед
    Ответ написан
    5 комментариев
  • Что означают эти результаты экзамена на freelancer.com?

    @vism
    Это значит что вы не умеете использовать поиск
    https://www.google.ru/search?q=persentel&ie=utf-8&...
    Ответ написан
    Комментировать
  • Upwork - платный аккаунт обезопасит от автобана?

    opium
    @opium
    Просто люблю качественно работать
    доподлинно известно что только приблизит кончину бана.
    вообще нет смысла вкладываться в коннекты если ты не можешь получить работу, это лишняя трата денег и бестолковое расходование коннектов
    учитесь бидить правильно и у вас всегда будет много коннектов
    почитывайте на досуге upworkest.ru
    Ответ написан
    4 комментария
  • Todolist на javascript, что исправить?

    @kahi4
    может есть получше способ как это все сделать.


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

    Первое: безусловно нужно подсмотреть сюда todomvc за вдохновением.

    Второе:
    document.querySelector('.add-todo').addEventListener(...)

    Плохая идея. Вообще плохой код по нескольким причинам.
    - сам listener лучше вынести отдельно, проще отслеживать и рефакторить, а главное -- вот так созданную анонимную функцию потом отписать не получится от события, что порождает мало того что утечку памяти, так еще и неприятные эффекты, если вдруг все же понадобится это делать.
    - что, если элементов с .add-todo будет два?
    - вообще хороший тон (если не прибегать к библиотекам) является либо использование id (в данном случае это подходит, покуда кнопка может быть только одна, но тоже лучше не злоупотреблять, покуда когда-то может появиться вторая), либо класс js-add-todo (можно использовать другой префикс, главное -- однозначное понимание какой класс отвечает за стилизацию, а какой за логику. Практика показывает, что в процессе мелких правок по дизайну верстка может поменяться значительно и есть шанс запутаться в классах), либо ныне модно использовать data-аттрибут

    Дальше.
    function(e){
    	var field = document.querySelector('.field-todo');
    
    	if (field.value && field.value !== ' ') {
    		addTodo(field);
    		field.value = '';
    	}
    }


    Тут прям много чего плохо. Почему field ищется в доме каждый раз, а не сохраняется в скоупе приложения? (о нем еще поговорим). Проверка на равенство одному пробелу перестанет работать как минимум с двумя пробелами и так дальше. Так же было бы неплохо вообще создать метод isFieldClear, в котором инкапсулировать проверку. Почему в addTodo передается field, а не field.value? А что если input сменится на, не знаю там, div с contentEditable?
    Да и вообще, извлечение значения и его заполнение (обнуление в данном случае) лучше отделить от логики, вынеся в отдельный класс-объект-что угодно.

    Дальше.
    function addTodo(field) { /* */ }

    Тут, конечно, жесть полная. Помимо ошибок, которые я уже поминал, сама идея генерировать элементы в коде не через шаблон ужасна. Если ну никак не хочется использовать шаблонизатор, даже работающий на простом replace, можно уж прибегнуть к cloneNode, подменяя в нем значение в тех элементах, которые помечены как data-text, data-delete и так далее. Но лучше все же смотреть в сторону шаблонизатора.

    function allCheckList() { /* ... */ }

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

    И, как и обещал, про скоуп приложения. Как я где-то прочитал
    Люк, никогда не гадь в глобальный скоуп!

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

    Ну и теперь самое важное.

    Если задача звучит так: сделать на vanilajs todo-лист на коленках за 5 секунд и навсегда забыть о нем, даже не правя баги в нем -- да нормальное решение, можно катить в прод, исправив проверку на пустоту интпута. Если же задача сделать что-то качественное, поддерживаемое и масштабируемое -- все в корне не верное. Тут дело даже не в выборе библиотеки, фреймворка или чего бы там ни было. Тут просто максимально простое влоб решение, которое обернется невероятным количеством геммороя при дальнейшей разработки. И речь не о тех мелочах, до которых я придирался выше -- это все не так важно. Гораздо важнее что тут нет никакой методологии, правильного подхода, паттерна и это является фатальным недостатком. Как его исправить?

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

    Выбрав путь ООП дальше следует обратить внимание на семейство паттернов MVC, слабую связанность, модульность и много там всего, намека на что у вас нет. Собственно, создаете класс Todo, потом TodoList, который будет списком экземпляров Todo, потом контроллер, который как раз и будет проверять введено ли что-то валидное в поле ввода, потом View, который как раз и свяжет шаблон с данными, потом возникнет вопрос -- кто должен создавать экземпляр Todo, потом откроете для себя абстрактную фабрику, потом закроете ее обратно, покуда в js она никому не упала, в общем -- об MVC статей написано больше, чем о всем остальном программировании вместе взятом.

    Выбрав путь функционального программирования сперва появится некое хранилищи структур Todo, появится несколько чистых функций, которые будут изменять это хранилище и обрабатывать различные варианты, так же вынесется отдельно слой View, откроется паттер Observer (ну или как ныне более модно говорить -- реактивное программирование) - об этом тоже информации много.

    P.S. Счетчик активных туду, к слову, не пересчитывается при добавлении нового. Не зачет, в прод не идет.
    Ответ написан
    3 комментария
  • Как сделать itertools.combinations для словаря?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    from itertools import product
    d = {
        'param_abdomen': ['thin', 'normal', 'large'],
        'param_chest': ['strong', 'normal', 'corpulent'],
        'param_shoulders': ['straight', 'normal', 'fallen'],
        'param_stance': ['straight', 'normal', 'curved']
    }
    keys = sorted(d)
    variants = [dict(zip(keys, p)) for p in product(*(d[k] for k in keys))]
    Ответ написан
    Комментировать
  • Массив в GET-запросе - с индексами или без?

    anton_lazarev
    @anton_lazarev
    $query = http_build_query($params);
    $query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);
    $url = $url . '?' . $query;
    Ответ написан
    1 комментарий
  • Куда делся алиас narod.ru из Яндекс.Почты?

    devspec
    @devspec
    Помогло? Отметь решением
    В 2013 году Яндекс продал свой хостинг сервису uCoz - https://yandex.ru/blog/company/57916
    Видимо, поэтому и нельзя теперь зарегистрировать почту narod.ru на Яндексе, т.к. narod.ru больше Яндексу не принадлежит.
    Ответ написан
    2 комментария
  • Почему не останавливается таймер?

    Можно так:
    this.start = function() {
      	//console.log(interval);
      	if (working) return;
      
      	position = 0;
      	timer = window.setInterval(function(self) {
        	//console.log('timer');
        	position += step;
          on_step(position, from, to);
          if (position >= to) {
          	console.log('end1');
          	self.stop();
          }
        }.bind(null, this), interval);
        on_start();
        working = true;
        on_step(position, from, to);
      };


    Или так:
    this.start = function() {
      	//console.log(interval);
      	if (working) return;
      
      	position = 0;
      	timer = window.setInterval(function() {
        	//console.log('timer');
        	position += step;
          on_step(position, from, to);
          if (position >= to) {
          	console.log('end1');
          	this.stop();
          }
        }.bind(this), interval);
        on_start();
        working = true;
        on_step(position, from, to);
      };

    Во всех этих интервалах контекстом по умолчанию идет переменная window.
    Ответ написан
    Комментировать