• Как вы освоили шаблоны проектирования?

    dmitry_pavlov
    @dmitry_pavlov
    World-class .NET freelance contractor (remotely)
    Когда начался бум и восторг вокруг концепции паттернов проектирования, выкрики "GoF рулит!" и так далее, я озадачился тем, чтобы понять, что за шум?

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

    По аналогии в проектировании софта имееются свои архитектурные вопросы вроде разбиения приложения на компоненты/модули, организации зависимостей между ними, распределение функциональных обязанностей и т.п. Как ловко подметили авторы книжки из этой банды четырех (The "Gang of Four") в нашей индустрии можно также выделить некоторе количество типовых шаблонов, проверенных на практике, чтобы тем самым не наступать на уже обойденные другими грабли.

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

    Чтобы понять, где они нужны - нужен опыт. То есть (я лично убежден), что учиться на ошибках других может только крайне ограниченное число людей. Все остальные обязаны набить шишки самостоятельно :)

    К изучению паттернов я дам такие советы:

    1) Прочтите пару книжек, чтобы понять, что это за зверь и с чем его едят. Можно взять одну из вариаций книжки GoF или какие-то производные для вашего стека разработки - познакомиться с основными популярными шаблонами. Сразу после этого я посоветовал бы прочесть книжку "Горький вкус Java" (Брюс Тейт) - она про анти-паттерны. Это чтобы понять обратную сторону их использования. Мне понравилась и уберегла думаю от многих проблем. То что на примере Java - неважно. Речь идет о шаблонах, так что представителям других стеков (к которым отношусь и я) будет просто понять все равно.

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

    3) В новых проектах, держите в голове полученные по шаблонам знания - вдруг пригодятся.

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

    Я даже пожалуй посоветовал бы подойти к освоению айтишной архитектурной мудрости с другой стороны - со стороны нефункциональных требований или так называемых "-ilities" - их много. Тут вот описаны 7 штук. А вообще их десятки.

    Среди прочих - такие как maintainability (простая поддержка кода), scalability (масштабируемость), extensibility (расширяемость), availability (устойчивость ) и тп. Если, проектируя свое приложение, вы задумываетесь об этих "илитях" и стараетесь их обеспечить в необходимом проекту объеме, то, как правило, ваше приложение будет иметь отличную архитектуру. При этом шаблоны проектирования в ней появятся лаконично сами собой.

    Поскольку идея использовать шаблоны - это попытка опытных программных инженеров дать десяток готовых рецептов менее опытным, чтобы пока они не научились варить "вкусную кашу", они не варили уж что-то совсем несъедобное. :) Учитесь "готовить", разбирайтесь в -ilites :) и все будет хорошо
    Ответ написан
    6 комментариев
  • Как реализовать в MVC?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    1) За что обычно отвечают классы предки в MVC?
    За хранение базовых функций, как пример, давай рассмотрим Controller
    Предположим, что ядро фреймворка, вызывает всегда три метода, в такой последовательности:
    beforeAction - запустить что-то до выполнения экшена
    action - запустить сам экшен
    afterAction - запустить что-то после выполнения экшена

    ** экшн = метод класса контроллера

    так вот чтобы, ты мог не объявлять beforeAction и afterAction, они объявляются в каком-нибудь абстрактном классе Controller, от которого и идет дальнейшее наследование и все потомки получают эти методы

    Либо на примере модели, есть какой-нибудь класс ActiveRecord, ты наследуешь свою модель от него и все потомки получают разом всю его функциональность: например конструктор запросов через вызов цепочек:
    Posts::find()->where(['title'=>'hello world'])->orderBy(['id'=>SORT_DESC])->all();
    ну, а твоя модель выглядит так class Posts extends ActiveRecord{}
    т.е. вся логика скрывается в родителе

    2) По разному, тут надо смотреть конкретный фреймворк: бывает что сервис контейнер этим занимается, бывает DI, бывает просто вызывается фабрика, а внутри ей передается соединение которое хранится где-нибудь в "реестре" ядра... в общем по-разному.

    3) Опять же по-разному, но в целом принцип такой. Для каждой сущности есть своя модель, например есть отдельно модель Конкурсы, есть отдельно модель Участники и т.д. Тебе надо показать отдельно кол-во парней и девушек, тогда в контроллере отвечающим за вывод конкурса, ты обращаешься к модели Участников и получаешь необходимую информацию (что-то типа $boys = Paticipant->maleCount(); $girls = Paticipant->femaleCount(); ) и передаешь эти данные во view. А сам подсчет, работа с бд и т.д. идет уже в модели (Paticipant). В итоге получается что вся твоя логика делится на такие шаги:
    - ядро анализирует запрос и вызывает экшн контроллера
    - экшн контроллера, получает необходимые данные из модели и передает во вью
    - модель содержит всякую логику получения и обработки данных
    - контроллер или экшн контроллера рендерит вью и отдает код клиенту

    4) Ну, обычно на сайте фреймворка пишут что туда входит. Всякие плюшки для разработчиков (например хелперы по созданию форм, классы по работе с SSH, консолью и т.д.), тесты, документация и куча всяких, часто никогда не используемых, штук
    Ответ написан
    Комментировать
  • Как организовать Socket соединения?

    @ollisso
    > Понятно, что не получится создать одно соединение для всех.

    Почему нет ? :)
    Если же вы хотите отдельный сокет каждому, то вы ограничены около 64 000 комнат.
    плюс куча других проблем.

    Можно сделать проще: Websocket

    1. делаете серверную часть, которая будет принимать данные от одного клиента, и пересылать их дальше другому
    2. делаете клиентскую часть, которая будет работать с этой серверной частью
    3. профит.
    Ответ написан
    5 комментариев
  • Виджет Instagram в Wordpress- какой из плагинов наиболее вменяемый?

    @mais64
    Фронтенд разработчик
    Все что пробовал из бесплатного, ерунда.
    Себе делал на instafeed js. Там все быстро и понятно настраивается.
    Ответ написан
    Комментировать
  • Виджет Instagram в Wordpress- какой из плагинов наиболее вменяемый?

    Использовал эти два на разных проектах, вроде все нормально работало:
    InstaLink
    WordPress Social Board
    Ответ написан
    Комментировать
  • Как правильно отправить mediatopic.post с photo в attachment?

    0neS
    @0neS
    https://apiok.ru/wiki/display/api/photosV2.commit+ru

    Не вызывайте этот метод для фотографий, публикуемых в групповых медиатопиках.

    Получается, после photosV2.getUploadUrl нужно сразу делать mediatopic.post.
    Ответ написан
    Комментировать
  • Выдаётся ли сертификат о сдаче 70-483-Programming in C#?

    @asommer
    Если сдашь, то получишь на выбор или сертификат Certified Professional или Specialist. Сейчас эта сертификация называется и так и так. Сертификат можно скачать в pdf, а можно заказать примерно за 10$ бумажный вариант. Можно еще и карточку заказать пластиковую с фото. Я себе заказывал карточку.
    Ответ написан
    Комментировать
  • Выдаётся ли сертификат о сдаче 70-483-Programming in C#?

    @Mozli
    Смотря как Вы сдадите экзамен. Если провалите экзамен то Вы ничего не получите. А если Вы сдадите экзамен, то вполне сможете получить, электронную версию сертификата.
    Но как бы все хорошо не звучало, для начала его нужно хорошо сдать.
    Могу посоветовать хороший ресурс для подготовки к экзамену
    Ответ написан
    1 комментарий
  • Индивидуальные предприниматели, как Вы работаете с oDesk (upwork)?

    @IamG
    по себе (ип, усн 6%), работал через oDesk пока не перешёл на постоянного клиента.
    1) вывод денег через PayPal (бизнес аккаунт). всё официально. oDesk--$-->PayPal--руб-->счёт ИП в банке.
    соответсвенно никакого валютного контроля.
    2) платите налог 6% с упавших денег. Вы чисты.
    3) каких-то бумаг не надо, но у oDesk'а была кнопка типа получить pdf с подписью сколько они тебе денег переслали.

    а ну да - для бухгалтерии использую моедело, у них всегда можно задать вопрос бухгалтерам.
    Ответ написан
    6 комментариев
  • Литература для изучения C# с нуля?

    @Oxoron
    Шарпер
    Был подобный вопрос про книги на Тостере. Здесь мой развернутый ответ.
    Если вкратце: ты выбрал правильные книги и правильный порядок. Разве что, Шилдта стоит поискать 5 издание, а Троелсена читать на английском - перевод ругают.
    Кроме того, для работы вполне достаточно первой части Шилдта (до потоков).
    Так же обрати внимание, что в этих книгах рассматривается, в основном, сам язык, его синтаксис. Помимо этого программист частенько занимается тестированием (как минимум модульным), проектированием, работой с системами контроля версий, работой с БД. В случае с .NET (C#) БД скорее всего лежит на MS SQL Server.

    Так что после первой половины Шилдта рекомендую написать Unit-tests (модульные тесты) на один из своих проектов (в качестве литературы гугли Art of Unit Testing, для начала хватит первых нескольких глав), написать несколько модульных тестов с MS Fakes (Shims, Stubs), почитать про рефакторинг, например, тут, завести профиль на Гитхабе, закинуть туда один из своих проектов, сделать несколько коммитов. Для работы с БД используются либо родные классы .NET (C#), либо EntityFramework, NHibernate, etc.
    Важно все перечисленное в этом абзаце выполнять после освоения первой части Шилдта. До этого у тебя скорее всего не будет проектов, для которых нужны подобные навыки.

    .NET и C# в названиях подобных книг почти равнозначны. Если проводить (очень грубую) аналогию, платформа .NET - это ассемблер, в нем все кодируется байтами (ну, или ноликами и единичками). Так программировать неудобно. Поэтому есть несколько ЯП (C#, VB6, в некотором роде PowerShell), которые свой код переводят в байты .NET кода. Для начала можешь считать, что .NET и C# это одно и тоже, понимание разницы придет со временем (либо прочтением Троелсена).

    Удачи.
    Ответ написан
    1 комментарий
  • Gitflow мёртв? Какие есть альтернативы?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    https://guides.github.com/introduction/flow/
    И никаких расширений не надо
    Ответ написан
    Комментировать
  • Gitflow мёртв? Какие есть альтернативы?

    DmitryITWorksMakarov
    @DmitryITWorksMakarov
    Я не очень давно общаюсь с git, но у меня сложилось мнение, что git flow он не в расширениях, а в головах.
    Я полагаю можно выделить в команде роль хранителя git flow традиций. Если будет совсем тяжело, можно и самостоятельно рутинные сценарии автоматизировать.
    Хотя, признаюсь, я тут не очень чтобы компетентен. Я с git`ом пока работаю сольно "без ансамбля".
    Ответ написан
    2 комментария
  • Как сделать переключение с мобильной версии сайта на декстопную?

    PavelK
    @PavelK
    А в коде полной версии опять идёт проверка не мобильник ли это и снова перекидывает =)
    Устанавливайте дополнительно куки о том, что принудительно выбрана та или иная версия
    и проверяйте.
    Ответ написан
    Комментировать
  • Выдаётся ли сертификат о сдаче 70-483-Programming in C#?

    @velnick
    Бумажные сертификаты сейчас вообще не выдаются.
    В центре сертификации вам выдадут бумажку с вашими результатами.
    На портале mcp.microsoft.com у вас будет личный кабинет, в котором вы сможете просмотреть сданные экзамены. Там же вы сможете заказать бумажную версию сертификата или скачать электронную.
    В случае, если у вас будет сдан только экзамен Programming in C# там будет написано что-то вроде Microsoft certified professional или Microsoft certified technology specialist, что является младшим статусом на пути сертификации. Для получения сертификата о статусе MCSD, нужно сдать все экзамены на соответствующем пути.
    Ответ написан
    1 комментарий
  • Чем WCF лучше Remoting?

    В WCF можно создать прокси класс (студия умеет создавать автоматически) и работать с ним как с обычным локальным классом.

    По сути Remoting это реализация протокола SOAP поверх HTTP, в WCF пошли дальше, так есть понятия биндинга и привязок, что позволяет выполнять вызовы в том числе и по TCP, что хорошо для производительности.

    имхо WCF не столько новая технология сколько попытка объединить несколько ранее реализованных технологий (включая Remoting)
    Ответ написан
    Комментировать
  • Игровая экономика. Что почитать?

    @aleks_raiden
    Считается обычно в Excel-е и часто много вещей зависят от игры конкретной.

    Может вам помочь:

    gamesmaker.ru/industry/common/ekonomika-v-mmorpg-c...
    gamesmaker.ru/industry/common/ekonomika-v-mmorpg-c...

    и видео:

    https://www.youtube.com/watch?v=Uxzmwxw2xKA
    https://www.youtube.com/watch?v=xyD55aRtmlQ
    https://www.youtube.com/watch?v=UtWBjyV-CAQ
    https://www.youtube.com/watch?v=Aeiro5axWds

    И большинство статей отсюда - siliconrus.com/category/games (особенно там где переводы из блога Deconstruction of fun)
    Ответ написан
    1 комментарий
  • Какую книгу почитать по WCF 4.5?

    @smozhaykin
    В этом году выходит 4-е издание Programming WCF Services. Написано, что updated for .NET 4.5
    Ответ написан
    Комментировать
  • Куда лучше выводить деньги с elance/odesk?

    Arturische
    @Arturische
    Прошу прощения за столь длинный пост, совсем ~нет времени, сделать его короче~.
    P-PS. чтобы опус было легче прочитать, переписал, называя счёта PayPal "кошельками" (в отличие от банковского "счёта").
    --
    Не знаю как с ELance (полагаю, что не сильно отличается), но с oDesk вот так:

    PayPal не берёт никакой комиссии.
    Может принимать на корпоративный кошелёк (хотя были страшилки что не будет; тьфу-тьфу-тьфу) и выводить с него на банковский счёт (в моём случае расчётный счёт ИП). Не проверял, но "судя по кнопкам" должен так же переводить и на счёт физ. лица.
    С PayPal кошелька физ.лица можно (проверено) выводить на банковский счёт физ. лица (и только).
    Между корпоративным кошельком (ИП) и кошельком физ. лица можно переводить туда сюда (рубли) без комиссии(!).
    ! Есть нюанс ! Выводить с кошелька можно только рубли. Но! Вывод на расчётный счёт (банковский) ИП, происходит по курсу выше, чем если переводить на свой кошелёк физ лица! То есть, любое движение - перевод в рубли, но этот курс (по крайней мере, в период с ноября по январь (2015)) был выше, чем курс конвертации у любого из наблюдаемых мною банков. При том, что в банках, я наблюдал, за курсом конвертации при зачислении на расчётные счета, который обычно заведомо выше, чем при переводе на счета физ.лиц. То есть PayPal предлагал (что для меня было большим и приятным сюрпризом) самый выгодный возможный для меня курс!
    Через PayPal переводить было выгоднее, чем банковским переводом! Хотя следует учесть, что на PayPal есть несколько уровней "персонализации": без предоставления некоторых сканов (документов) будут установлены лимиты на суммы переводов и остатков - да-да, сейчас PayPal в России (в связи с попыткой соответствовать всем законам РФ) весьма изощрённый.

    Если переводить в долларах на банковский счёт, то
    - на счёт физ лица - точных цифр не скажу, но есть нормативы, в соответствии с которыми, банк некоторые сведения (читай "начиная с некоторых сумм") обязан передавать "дальше".
    - на расчётный счёт ИП (в ин. валюте) - Ох... мне оказалось проще забить на объяснения девушке из валютного контроля, что у oDesk нет печати, а каждый перевод денег не связан с конкретным контрактом. И это уже не вопрос "докладывания" дальше - пока банк не получит документы по каждому переводу - деньги просто не пройдут дальше транзитного счёта - вы их не получите! Банк не имеет право их пропустить и обычно сотрудники банка перестраховываются как могут, по всякому поводу и без повода. Есть, конечно, и другие банки (на досуге попробую), где-то даже можно присылать (?якобы!) сканы актов о выполненных работах. Степень "готовности пропускать платежи" очень хорошо коррелирует с компетентностью девушки из отдела фин.мониторинга (валютного контроля) и уровнем её грамотности в этом вопросе, что, к сожалению, редкость. Даже при самой обычной внешнеэкономической деятельности рекомендуется вначале "глаза-в-глаза" пообщаться с валютным контролем (фин.мониторингом) банка. А уж если речь идёт об oDesk/ELance/Apple/Google, нужно либо иметь заведомо неограниченный запас времени и нервов (по крайней мере, в большинстве случаев), либо ответственный сотрудник банка должен быть доктором Хаусом от фин.мониторинга, чтобы уметь отбиваться от (забивать на) вышестоящих. Часто они включают роботов (читай "дурачков"), просто чтобы отвадить клиентов, которые планируют делать переводы, где они не защищены на сто процентов.
    Это, конечно, для случая, если всё в соответствии с законами РФ (перевод выручки от предпринимательской деятельности на расчётный счёт), перевод на счёт физ.лица - это другой случай.

    Поскольку я плачу налоги, я не пользуюсь картой Payoneer, которой можно иногда пользоваться, если нужно получить деньги быстрее (PayPal на банковский счёт официально переводит 5-7 рабочих(!) дней - на практике чуть быстрее). И при пользовании которой, (если бы я ею пользовался) курс в банкоматах, как ни странно, на снятие наличных выше (по крайней мере был в декабре), чем при покупках. И даже с учётом комиссий это было на уровне банковского перевода.
    Иногда в Интерне можно найти адреса банкоматов "без лимита", и с высоким лимитов на снятие наличных за одну операции. Но дело в том, что эти лимиты очень часто меняются (даже мизерные: с одного мизерного на другой). На практике, в крупном городе можно легко найти банкомат с лимитом 10 т.р. недалеко от дома. Жаба по поводу комиссий придушивает, но если посчитать, получается совсем не так плохо, как может показаться.

    PS.
    Учтите, что привязки счётов к кошелькам PayPal, изготовление карт и прочее может сильно затянуться из-за разного рода защитных периодов, требований и проверок - я (с учётом возни с корпоративным кошельком PayPal и прочего) первые деньги получил только через 1.5 месяца (была вероятность, что будет и дольше)!
    Это я к тому, что, возможно, имеет смысл начать регистрироваться "по всем фронтам", а уж там разберётесь где выгоднее.

    PPS. Резюме. Если не горит по срокам, то PayPal с корпоративным кошельком "рвал всех". Мне было проще - у меня расчётный счёт ИП был давно. Комиссий от PayPal ни в одном из моих вариантов использования я не видел ни одной (но подозреваю, что сейчас условия обслуживая в России сильно отличаются от тех же за рубежом). А даже, если бы и были, курс решает(л)! При переводе на кошелёк физ.лица курс меньше (боюсь ошибиться, но где-то на 1.1-1.3 рубля). На кошелёк физ.лица напрямую с oDesk не переводил.

    Отвечая на вопрос , как поступаю я. Я поступаю следующим образом: oDesk -> корпоративный кошелёк PayPal -> расчётный счёт ИП -> счёт физ лица (она же карточка). Пару раз для общего развития было: oDesk -> корпоративный кошелёк PayPal -> кошелёк PayPal физ.лица -> счёт физ.лица (она же карточка)
    Если бы был готов уклоняться от налогов, то, если бы мне нужно было получить деньги на неделю пораньше, я бы пользовался картой Payoneer. Порядок потерь, если все комиссии пересчитать в курс, примерно такой: ~61руб/$ Paypal к ~~~(очень примерно) 59.5руб/$ Payoneer.
    Я надеюсь, что никто не будет брать эти цифры в качестве практического руководства без проверки, учитывать как часто и сильно сейчас меняется курс.

    PPPS. В PayPal видно, по какому курсу будет продажа, до нажатия решающей кнопки OK. Мне это давало возможность пару раз на +/-5% сумму подкорректировать, когда курс сильно скакал.

    "Получилось слишком много, но у меня не времени сделать это сообщение короче" ~(C)
    Всем хорошего дня и манны небесной!

    =========
    !!! UPDATE 27.01.2015 20:48:
    Сегодня уже на корпоративный кошелёк PayPal вывести с oDesk не удалось (тех. поддержка в это время у них не работает, поэтому подробностей нет).
    На кошелёк PayPal физ.лица перевести получилось без проблем.
    Вывод банковский счёт не делал, поэтому не ясно имеет ли практический смысл следующее число или нет, но в рублях он отображает сумму по курсу 64,369375р/$
    ------
    UPDATE
    MasterCard поменял комиссию за операции, и в след за этим, банки начали отменять лимиты. Знаю, что в Альфа-банке, по проверенной информации, лимит на снятие рублей теперь 200 т.р. за операцию.
    Ответ написан
  • Как определить свой уровень программирования?

    opium
    @opium
    Просто люблю качественно работать
    1000 часов Джуниор
    5000 часов мидл
    10000 часов сеньор
    Ответ написан
    6 комментариев
  • Как определить свой уровень программирования?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Эти уровни - абстракция, причем зависящая от компании. Пройдите несколько собеседований и спросите, что думает о вас интервьюер.

    Юниор чаще всего - это программист с в основном теоретическими знаниями, либо наоборот только практическими знаниями. Он умеет решать более-менее стандартные задачи. Юниора обязательно надо учить. При получении нового задания он "создает" свое решение.

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

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

    -----------------

    Многое зависит от интервьюера.
    У меня был случай, собеседование на php senior developer: поговорили про HL оптимизации, архитектурные предложения для решения неких задач, способы оптимизации и т.д., а потом:
    - перейдем к практике: что произойдет в таком коде:
    $a = 5 + '5abc' + 'abc5';
    - произойдет следующее: я посмотрю blame скрипта и поговорю с автором этой строчки, что бы узнать, что такого хренового в жизни может произойти, что бы он позволил себе это написать.
    - ну, тут вопрос на приведение типов
    - 10, но вы в своей практике с подобным сталкивались?
    - нет
    - вот и я не сталкивался...
    Ответ написан
    1 комментарий