• Как в Agile обходят вопрос с тем, что задача была оценена очень амбициозно?

    Sir_Waat
    @Sir_Waat
    Business Analytics, Scrum Master
    Я конечно может поздно спохватился, но Вы простите меня, таких глупостей в комментариях не читал уже давно.
    Для Вашего вопроса есть 3 основных правила (перечислю их, если кто-то еще наткнется на него в будущем):
    1) разбивка на подзадачи
    Любая задача больше 20 сторипойнтов должна разбиваться на подзадачи для контроля и нормального выполнения. Вплоть до 1. Сделаь первую часть 2. Сделать вторую часть 3. Собрать все вместе
    2) 40 часов - человеко-неделя? Пффф! Вздор!
    Если вы считаете, что возможно работать эффективно 40 часов в неделю (не отвлекаясь, простите, на туалет или попить воды), то вы глубоко ошибаетесь. Возможно причина заложена в этом. Статистика и горькой опыт говорят нам, что идеальный, повторюсь, идеальный человеко-день подразумевает 6 часов вовлеченного рабочего процесса. Так что возможно проблема как раз в неправильном понимании.
    3) Оценка задач
    Оценка задач нужна для планирования, а не для отчетности. Если вы неравильно оценили задачу, то в конце спринта Вы переоцениваете её не для того, чтобы начальник выдал Вам зарплату за каждый час работы, а для того, чтобы понять 2 вещи: 1. У Вас есть проблема с оценками задачи. 2. Вы неправильно формируете кол-во задач на спринт. Как дальше танцевать с этой информацией - выбор каждого отдельного менеджера.
    Надеюсь мой ответ был не слишком резок и еще хоть кому-то полезен.
    Всех благ! (:
    Ответ написан
    Комментировать
  • Как зарабатывать 1000$ на фрилансе верстальщику?

    php666
    @php666
    PHP-макака
    А кто сказал, что на фрилансе вы должны зарабатывать 1000$?
    Все идет от вашего же непонимания простых вещей. Вы сами же пишите:
    Конкуренция большая, даже при наличии отзывов тяжело конкурировать с кучей людей, демпингуюших цены.
    Я вообще удивляюсь людям, кто свято верит в сказки, которые непонятно кем выдуманы насчет фриланса.

    У меня знакомый недавно на фрилансе решил поработать. В итоге в ужасе сбежал обратно в офис.
    Ответ написан
    7 комментариев
  • Как закрыть служебный файл в корне сайта?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Не надо хранить служебные файлы в директории, доступной из web.
    Ответ написан
    Комментировать
  • Есть ли сервис, где обычный заказчик сможет создать себе приблизительное представление, каким должен быть сайт, который нужно разработать?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    обычный заказчик сможет создать себе приблизительное представление

    Есть лишь единственный вариант - карандашик + бумажка.
    Ответ написан
    Комментировать
  • Что посоветуете или какой визуальный редактор (конструктор) на python?

    longclaps
    @longclaps
    Врут, особенно про профессионалов.
    Про визуальный редактор (конструктор) на python советую забыть. Всё это лажа и нае**лово.
    Учитесь программировать путём написания программ.
    Ответ написан
    1 комментарий
  • Как мягко слить заказчика или попросить поторопится?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    В данном случае, цикл такой:
    1. заказчик что-то решает
    2. просит поправить
    3. смотрит результат
    4. GOTO 1
    И всё это мелкими порциями.

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

    В любом другом случае - говорите, так:
    "Извините, но я не занимаюсь доделками или доработками на уровне рядового фрилансера и не работаю в таком "растянутом" темпе.
    Предлагаю Вам на выбор два варианта:
    1. Если хотите, чтобы я Вам делал эти простые доработки - копите пул из 10-ти (или более) задач и давайте мне их на исполнение в виде кратких описаний в DOC-документе.
    2. Найдите более свободного (не загруженного) и менее квалифицированного фрилансера на эти простые задачи.
    Выбирайте любой из предложенных мной вариантов."

    Это будет лучшим вариантом для решения вопроса по продолжению сотрудничества для всех сторон!
    Ответ написан
    Комментировать
  • Это заказчики такие скупые пошли или я чего-то не понимаю?

    Moon_Lobster
    @Moon_Lobster
    Инвестор
    Есть много людей готовых это сделать за низкий прайс. Вот собственно и вся история.
    Ответ написан
    2 комментария
  • Как въехать в программирование (ООП, паттерны)?

    @Wentixon
    Шаблоны проектирования с человеческим лицом
    К сожалению, не успел к началу вопроса, многое уже посоветовали, но эту статейку вроде не успели еще кинуть. Недавно нашел ее и просто поразился как просто и доступно это изложено + с примерами кода на php. Просто шикарный перевод великолепной статьи!

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

    Так что посоветую 2 варианта изучения.
    1) Тупо работаешь над сложные проектами, только действительно сложными, а не сайтиками на cms. И со временем ты начинаешь встречаться с проблемами. Тогда открываешь паттерны и тебе не придется даже как то их особо понимать, потому что это будет естевственно для тебя. Я думаю ты используешь ide вместо редактора кода. Но к примеру я помню тот момент, когда я пользовался саблаймом и знал, что есть ide, но я писал на тот момент простые вещи и когда мне говорили, почему я не юзаю ide, ведь в ней столько всего, я не понимал их потому что мне и саблайма за глаза хватало. Но пришло время, когда надо было то и се и саблайма стало мало. И тут открываю ide, а там уже есть все необходимое и думаешь в такие моменты, как я раньше этим не пользовался. А дело в том, что раньше и не надо было. Может неудачный пример, но вы поняли ) Конечно, этот вариант изучения не совсем реален, по скольку сложный проект еще найти надо, да еще попасть в команду, которая не говнокодит, так как и крупные проекты бывают достаточно плохо написаны. Но можно как вариант к примеру делать свою cms и применять в ней как можно больше паттернов.

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

    Также советую четко понять uml диаграммы. Таким образом, чтобы освежить паттерн вы не будете читать примеры, а просто посмотрите диаграмму и сразу вспомните, зачем он нужен и как его можно реализовать.
    Вот пожалуй и все
    Ответ написан
    1 комментарий
  • Как въехать в программирование (ООП, паттерны)?

    GTRxShock
    @GTRxShock
    Full-stack developer (Symfony, Angular)
    если программируете на php 2-3 года, то пора бы перед сном почитать РНР: объекты, шаблоны и методики программирования (Зандстра) желательно в бумажном варианте.

    + Паттерны проектирования (Фримен) для общего/наглядного понимания паттернов
    + www.phptherightway.com основные тезисы
    + Рефакторинг: улучшение проекта существующего кода (Фаулер) & https://refactoring.guru/ru на будущее, к чему стремиться :)
    Ответ написан
    4 комментария
  • Можно ли выполнить JS код на странице(Без селениума)?

    sim3x
    @sim3x
    Нет

    Разберите, что жс делает и емулируйте запрос из питона
    Ответ написан
    Комментировать
  • Может ли проект быть собран с низким качеством кода, и пользоваться большим спросом?

    BojackHorseman
    @BojackHorseman
    ...в творческом отпуске...
    пользователю нет никакого дела до кода
    Ответ написан
    Комментировать
  • Как мотивировать себя делать скучную работу?

    tema_sun
    @tema_sun
    Правильный ответ - делегировать. А самому заняться тем, что нравится.
    Ответ написан
    1 комментарий
  • Можно ли на Upwork регистрировать вымышленную фамилию?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Зарегистрируйте свою бабушку.
    Ответ написан
    Комментировать
  • Что значит "возвращение" в python?

    @vashaaa
    Юх с горы
    Функция это такой автомат. Ну знаешь к примеру с газировкой или музыкой. Есть автоматы с газировкой , ты им денюжку (переменные ) они тебе газировку, это пример функции которая что то возвращает. Есть автоматы с музыкой , вроде ничего не возвращают но играют музыку. Это пример функции без возвращения, ты вызываешь эту функцию она что то делает но ничего тебе не возвращает. Ещё есть игровые автоматы, это как вызывать функцию которая нихрена не делает и нихрена не возвращает.
    Ответ написан
    4 комментария
  • Как писать тесты?

    jkd
    @jkd
    1)Если не можешь не пиши. Значит еще не нужно...
    Начинают писать, или когда проект действительно большой, и сложно отследить, что и как падает в результате твоих модификаций. Или когда над проектом работают несколько человек и нужно контролировать целостность проекта.
    2)Просто прочитай и пока забудь. Когда понадобится - ты просто почувствуешь это. Что нужно написать для контроля какого-то места. Возникнет потребность, а на вопрос как ты уже примерно будешь знать ответ.
    3)В любом случае это дополнительные накладные расходы на проект. И если тестирование не решает каких-то задач - то в нем смысла нет...

    Тестирование ради тестирования - потеря времени.. Укрупняй проект.. И как то ты проснешься и поймешь, что без него нельзя. И задачи у тебя будет конкретные.
    Ответ написан
    5 комментариев
  • Почему происходит рекурсия в getattr?

    @fireSparrow
    Когда вы инстанцируете новый экземпляр объект, то это происходит в таком порядке
    1. Новый экземпляр создаётся
    2. Созданный экземпляр инициализируется в соответствии с __init__

    Таким образом, __init__ сработает только после того, как экземпляр уже создан со всеми его методами. Соответственно, и метод __setattr__ (если он объявлен в классе), у этого экземпляра уже есть.

    Поэтому, когда в __init__ вы пишете self._defs = defaults интерпретатор уже не будет делать это стандартным способом, а полезет в метод __setattr__.
    Там он идёт по ветке else, выполняет pass и на этом успокаивается. В итоге атрибут _defs так и не был записан.

    А после этого, когда вы вызываете __getattr__, интерпретатор видит, что он должен обратиться к _defs, пытается найти его, не находит, и опять вызывает __getattr__, чтобы понять, как ему поступить в этом случае. И там он опять видит, что нужно обратиться к _defs. И получается бесконечная рекурсия.

    А если __setattr__ не определён, то в __init__ нормально создаётся _defs, и ничего такого не происходит.

    Решение:
    замените строчку в __init__ на
    self.__dict__['_defs'] = defaults
    Ответ написан
    1 комментарий
  • Насколько у меня правильный код ООП php?

    @D3lphi
    Здесь плохо всё, к сожалению.

    Начнем с того, что вы неверно наследуете классы. Почему у вас класс, отвечающий за подключение к базе данных является родителем класса, работающим с заказами? Наследование применяется, если можно сказать, что что-то является чем-то. Например, разработчик является работником; компьютер является устройством и тд. Здесь же у вас вообще близко такой логике не получится следовать. Вы должны передавать хотя бы объект для работы с бд через инъекцию, например, в конструктор. В идеале, нужно использовать паттерн репозиторий для работы с базой данных.

    Класс SearchOrder у вас не только выполняет запросы, но еще и работает с данными, хранит состояние этих самых данных, фильтрует данные (strip_tags()). Непорядок. Это все нужно разделять. У вас вообще получаются какие-то богообъекты, которые умеют во все.

    Вы каждый раз повторяете строки с подготовкой запроса, биндингом параметров, отправкой запроса и тд. Не думали, что неплохо бы было написать какую-нибудь обертку и выполнять запросы как-нибудь так:
    $result = $wrapper->select("SELECT * FROM `tablename` WHERE `id` = :id", ['id' => 5]);

    ?

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

    Зачем вы используете свойства, если можно обойтись обычными локальными переменными:
    $this->orderID = (int) strip_tags($orderID);
    $this->column = (string) strip_tags($column);
    $this->value = (string) strip_tags($value);

    ?

    Почему вы стриппите тэги у идентификатора? вы настолько не уверены в том, что влетает в функцию:
    strip_tags($orderID);
    ?

    Если вы не используете php 7 и, как следствие, скалярный тайпхинтинг, то должны делать проверки на тип входящего аргумента. Если что-то не так с типом, бросаем исключение (А не приводим его к нужному)! Например:
    if (!is_string($arg)) {
        throw new InvalidArgumentTypeException('string', $arg);
    }

    Это в идеале. Вы не обязаны это делать, конечно же. Но вот такие проверки делают приложение безопаснее. Хотя, опять же, повторюсь, в 2017 нужно начинать новые проекты на php 7.1+.

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

    Кроме всего прочего, почитайте про стандарты оформления кода. Вы им не следуете.

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

    Желаю успехов!
    Ответ написан
    1 комментарий
  • Почему не устанавливается YAML в Perl?

    shoorick
    @shoorick
    программист
    Вам принципиально ставить именно через cpan? Попробуйте штатный метод установки ПО, используемый вашей операционной системой. В дебианоподобных линуксах (Debian, Ubuntu, Mint) — sudo apt install libyaml-perl
    Ответ написан
    Комментировать
  • Фриланс снг с нормальными ценами, существует?

    @gyladti
    Первое правило работы на ру-фриланс биржах -
    Не работать на них. Подтянуть английский за месяца 3 в хорошем темпе вполне возможно. Нечего делать в этом мусоре, не уважают тут хороших специалистов, оставьте эти биржи голодным школьникам и студентам.
    Ответ написан
    1 комментарий
  • Как перевести широту и долготу в пиксели?

    fedorez
    @fedorez
    Хатуль мадан
    в общем да.
    а если точность нужна то всё посложнее будет.
    земля не круглая, она геоид, на практике юзают эллипсоид. от поставщика данных зависит какой.
    географические координаты переводят в плоские по довольно громоздким формулам согласно ГОСТ Р 51794-2008

    ну а потом согласуете эти плоские координаты со своими пикселями в зависимости от разрешения и окна просмотра

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

    spoiler
    /// <summary>
    		/// Возвращает плоскую координату X для пары угловых координат (зона проекции определена константой)
    		/// </summary>
    		/// <param name="Bd">Широта, град</param>
    		/// <param name="Ld">Долгота, град</param>
    		/// <returns></returns>
    		static public double flat_x(double Bd, double Ld)
    		{
                int N = 6;
                //int N = GetProjectionZone(Ld);
    
    			return flat_x(Bd, Ld, N);
    		}
    
    		/// <summary>
    		/// Возвращает плоскую координату X для пары угловых координат в заданной зоне проекции
    		/// </summary>
    		/// <param name="Bd">Широта, град</param>
    		/// <param name="Ld">Долгота, град</param>
            /// <param name="N">Зона проекции</param>
    		/// <returns></returns>
    		static public double flat_x(double Bd, double Ld, int N)
    		{
    			double b, L, l_rad;
    			b = Bd * Math.PI / 180;
    			L = Ld * Math.PI / 180;
    			l_rad = (Ld - (3 + 6 * (N - 1))) / 57.29577951;
    			double Result, R1, R2, R3, R4, M1, M2;
    			R1 = 1594561.25 + 5336.535 * Math.Pow((Math.Sin(b)), 2) + 26.79 * Math.Pow((Math.Sin(b)), 4) + 0.149 * Math.Pow((Math.Sin(b)), 6);
    			R2 = 672483.4 - 811219.9 * Math.Pow((Math.Sin(b)), 2) + 5420.0 * Math.Pow((Math.Sin(b)), 4) - 10.6 * Math.Pow((Math.Sin(b)), 6);
    			R3 = 278194 - 830174 * Math.Pow((Math.Sin(b)), 2) + 572434 * Math.Pow((Math.Sin(b)), 4) - 16010 * Math.Pow((Math.Sin(b)), 6);
    			R4 = 109500 - 574700 * Math.Pow((Math.Sin(b)), 2) + 863700 * Math.Pow((Math.Sin(b)), 4) - 398600 * Math.Pow((Math.Sin(b)), 6);
    			M2 = (R2 + (Math.Pow(l_rad, 2)) * (R3 + (Math.Pow(l_rad, 2)) * (R4)));
    			M1 = (R1 + (Math.Pow(l_rad, 2)) * M2);
    			Result = 6367558.4698 * b - Math.Sin(2 * b) * (16002.89 + 66.9607 * Math.Pow((Math.Sin(b)), 2) + 0.3515 * Math.Pow((Math.Sin(b)), 4) - Math.Pow(l_rad, 2) * M1);
    			return Result;
    		}
    
    		/// <summary>
            /// Возвращает плоскую координату Y для пары угловых координат (зона проекции определена константой)
            /// </summary>
    		/// <param name="Bd">Широта, град</param>
    		/// <param name="Ld">Долгота, град</param>		
    		/// <returns></returns>
    		static public double flat_y(double Bd, double Ld)
    		{
                int N = 6;
                //int N = GetProjectionZone(Ld);
    			return flat_y(Bd, Ld, N);
    		}
    
    		/// <summary>
            /// Возвращает плоскую координату Y для пары угловых координат в заданной зоне проекции
            /// </summary>
    		/// <param name="Bd">Широта, град</param>
    		/// <param name="Ld">Долгота, град</param>
    		/// <param name="N">Зона проекции</param>
    		/// <returns></returns>
    		static public double flat_y(double Bd, double Ld, int N)
    		{
    			double b, L, l_rad;
    			b = Bd * Math.PI / 180;
    			L = Ld * Math.PI / 180;
    			l_rad = (Ld - (3 + 6 * (N - 1))) / 57.29577951;
    			double Result, R1, R2, R3, R4, M1;
    			R1 = 6378245 + 21346.1415 * Math.Pow((Math.Sin(b)), 2) + 107.159 * Math.Pow((Math.Sin(b)), 4) + 0.5977 * Math.Pow((Math.Sin(b)), 6);
    			R2 = 1070204.16 - 2136826.66 * Math.Pow((Math.Sin(b)), 2) + 17.98 * Math.Pow((Math.Sin(b)), 4) - 11.99 * Math.Pow((Math.Sin(b)), 6);
    			R3 = 270806 - 1523417 * Math.Pow((Math.Sin(b)), 2) + 1327645 * Math.Pow((Math.Sin(b)), 4) - 21701 * Math.Pow((Math.Sin(b)), 6);
    			R4 = 79690 - 866190 * Math.Pow((Math.Sin(b)), 2) + 1730360 * Math.Pow((Math.Sin(b)), 4) - 945460 * Math.Pow((Math.Sin(b)), 6);
    
    			M1 = Math.Pow(l_rad, 2) * (R2 + Math.Pow(l_rad, 2) * (R3 + Math.Pow(l_rad, 2) * (R4)));
    			Result = (5 + 10 * N) * Math.Pow(10, 5) + l_rad * Math.Cos(b) * (R1 + M1);
    			return Result;
    		}
    
            /// <summary>
            /// Возвращает значение зоны проекции для заданного значения долготы
            /// </summary>
            /// <param name="Ld">Долгота, град</param>
            /// <returns>Значение зоны</returns>
            static public int GetProjectionZone(double Ld)
            {
                return Convert.ToInt32(Microsoft.VisualBasic.Conversion.Fix((6 + Ld) / 6));
            }
    
            /// <summary>
            /// Возвращает значение зоны проекции, пригодное для проецирования большинства из массива долгот
            /// </summary>
            /// <param name="longitudes">Массив долгот, град</param>
            /// <returns></returns>
            static public int GetProjectionZone(double[] longitudes)
            {
                // Значения зон
                List<int> lst_values = new List<int>();
                // Количество вхождений
                List<int> lst_valueCounts = new List<int>();
    
                foreach (double longitude in longitudes)
                {
                    // Зона для текущей долготы
                    int currentN = GetProjectionZone(longitude);
    
                    // Если значение новое, то занесем его в список и создадим нулевой счетчик этого значения
                    if (!lst_values.Exists(p => p == currentN))
                    {
                        lst_values.Add(currentN);
                        lst_valueCounts.Add(0);
                    }
    
                    int index = lst_values.IndexOf(currentN);   // Иднекс этого значения
                    lst_valueCounts[index] += 1;                // Увеличим счетчик этого значения
                }
    
                // Индекс значения с максимальным вхождением
                int maxIndex = lst_valueCounts.IndexOf(lst_valueCounts.Max());
    
                return lst_values[maxIndex];
            }
    
    		static public double DegreesMinutesToDouble(int degrees, double minutes)
    		{
    			return DegreesMinutesSecondsToDouble((double)degrees, minutes, 0);
    		}
    
    		static public double DegreesMinutesSecondsToDouble(int degrees, int minutes, double seconds)
    		{
                return DegreesMinutesSecondsToDouble((double)degrees, minutes, seconds);
    		}
    
            static public double DegreesMinutesSecondsToDouble(double degrees, double minutes, double seconds)
            {
                minutes += seconds / 60;
    
                degrees += minutes / 60;
    
                return degrees;
            }
    }

    Ответ написан
    Комментировать