Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Почему ElectronJS такой прожорливый?

Лучший ответ:
Это стандарт такой для ElectronJS?
Да. Программы на нём самые прожорливые, пушо запускается сначала огромный прожорливый Хром, а уже в нём ворочается прожорливый JS.

Худший ответ:
Самая большая проблема электрона в том, что большинство тех кто пишет на JS писать на нем не умеет...
Да небольшой оверхед у электрона присутствует, в виде порядка 15М оперативы на хромиум и ноду вместе, проц само по себе это все жрет разве что на старте.
Все остальное, за что электрон хейтят - кривые ручки так сказать программистов, которые на нем пишут...
P.S.
- если Вам нужно кросплатформенное десктоп приложение с UI и Вы при этом хорошо владеете JS+HTML+CSS - electron.js действительно лучший вариант
- если Вам нужно десктоп приложение под конкретную ОС и Вы при этом владеете только JS+HTML+CSS - electron.js хороший вариант, но все же лучше писать на нативных GUI (например на UWP для винды или на GTK+ для лини)
Вопрос: RDP доступ конкретным пользователям только из локальной сети?

Лучший ответ:
Windows Firewall позволяет оперировать доступом для пользователей или групп AD.
Как вариант - использовать вторую сетевую карту\второй ip и Firewall Windows разрешить вход на порт для одной группы.

Худший ответ:
Верно говорите что так нельзя, но сейчас как естьПочему нельзя?

Есть ли возможность запретить группе пользователей подключаться через проброс RDP, а оставить только локальные подключения?Да, в Windows Firewall найдите правило для входящего трафика разрешающее подключение RDP, перейдите на вкладку "общие" и убедитесь что разрешены только безопасные подключения, после чего перейдите на вкладку " удаленные пользователи" и там поставьте запрет на определенного пользователя или группу.

А вообще есть смысл использовать  Remote Desktop Gateway - удобная штука, и там все можно без проблем настроить.
Вопрос: Можно ли использовать JavaScript не только на сайтах?

Лучший ответ:
Десктоп приложения - electron
Мобильные приложения - cordova, react native, vue native и всякие там native
Фронтенд сайтов, ну тут ясно
Бекенд для сайтов и не только сайтов - node.js
Консольные утилиты (разные cli) - node.js
И по сути всё, что угодно

Худший ответ:
Десктоп приложения - electron
Мобильные приложения - cordova, react native, vue native и всякие там native
Фронтенд сайтов, ну тут ясно
Бекенд для сайтов и не только сайтов - node.js
Консольные утилиты (разные cli) - node.js
И по сути всё, что угодно
Вопрос: Как заработать если умеешь писать сайты?

Лучший ответ:
Можно листовки раздавать например.

Худший ответ:
Устроиться на работу
Вопрос: Брутфорс SSH, что делать?

Лучший ответ:
Поставить fail2ban ?  
Сменить порт ?
Настроить port knocking?

Худший ответ:
Если у вас "отваливается инет на VPS" именно по причине брутфорса, там вам ещё и ddos прилетает, а тут настройки впс никак не помогут, поскольку брут забивает канал до сервера. Как вариант, можно попробовать поставить перед вашим впс www.cloudflare.com, не знаю остался ли у них бесплатный тариф.
Вопрос: Можно ли сделать приложения на wpf?

Лучший ответ:
Возможно, конечно, закопайте Винформс обратно в землю.

Худший ответ:
Да только про MVVM паттерн почитайте ещё.
Вопрос: Не появляется картинка background?

Лучший ответ:
background: url(img/first-bg.jpg) no-repeat center top / cover;
илиbackground-image: url(img/first-bg.jpg);
background-repeat: no-repeat;
background-position: center top;
background-size: cover;

Худший ответ:
background-image
Внимательно почитайте пункт синтаксис.
Так же почитайте про:backgroundbackground-positionbackground-repeatbackground-size
Вопрос: Какими сервисами по мониторингу позиций в ПС вы используете при продвижении сайта?

Лучший ответ:
Я использую https://seranking.ru/.Поддерживает съем позиций в Яндекс, Google, Yahoo, BingПоддерживает съем позиций в Google во всех их элементах поиска: картинки, amp, видео, сеть знаний, быстрые ответы, карты, контекстной рекламе, также спрашивают и др.Поддерживает все языки и регионы, вплоть до города или почтового индексаВозможный съем позиций как в мобильной, так  и десктопной выдачиОсуществляет мониторинг позиций до 5 конкурентов без дополнительных оплатОпределяет позиции точноНесбоит как другие сервисыКонектится с вебмастерскими, счетчиками аналитикиСобирает и анализирцет бэклинкиЕсть история позиций, сниппетов и title в плоть до каждого отдельного запросаПлюс есть куча других интересных инструментовЕсть русскоязычная служба поддержки
Вообщем - огонь. Единственный минус - он платный, но не дорогой. Если проект не большое, главное - не выбирать тариф с ежемесячной оплатой. Вполне достаточно пополнять баланс раз 1,5-2 мес. на 1000 - 2000 р. Этого хватит на съем позиций при каждом апдейте ПС. Если обновлять вручную, то этой суммы хватит еще на дольше.

Худший ответ:
xseo.in/pos - бесплатно
https://ru.serpseeker.com/ - доступно позиции в мобильной выдаче, платный
Вопрос: Интернет магазин самописный или готовый шаблон?

Лучший ответ:
Время - деньги!

Худший ответ:
Здравствуйте!
Предполагается, что тему вы будете адаптировать под Woocommerce. 
Тут все зависит от бюджета и целей. Если вам платят за верстку и индивидуальный дизайн, то пожалуйста, адаптируйте тему под Вукомерц, а если нет, то тут и смысла нет заморачиваться. Берете премиум тему любую и подправляете его под себя и все.
Вопрос: Стоит ли указывать, что свойство — массив?

Лучший ответ:
Я следую такой логике:
- $var; если свойство будет инициализировано при создании (конструктор, boot и тд)
- $var = null; если свойство хранит значение по умолчанию, которое не требует инициализации. С точки зрения языка это идентично предыдущему варианту, но видя явное = null я понимаю, что именно это значение будет у конкретного экземпляра. Просто упрощает чтение кода.
- $var = []; вариант предыдущего, задает дефолтное значение которое поможет в дальнейшем избежать проверки is_array и дает возможность со старта юзать array_push например. Упрощает код. Ну и PhpStorm ругнется сразу если я попытаюсь в эту переменную записать данные другого типа.
Последние 2 правила касаются не только null и array, но и других типов.

Худший ответ:
По умолчанию свойства под null, т.е. никак не указаны, удобно пользоваться когда нужно сделать затратные действияpublic $vars;

public function getVars () {
    if($this->vars === null) {
        $this->vars = $this->loadVars();
    }
    return $this->vars;
}
Вопрос: Почему используют interface a не abstract class?

Лучший ответ:
Все зависит от того, что тебе действительно нужно. Либо тебе надо расширить функционал кнопки, и ты наследуешься от нее, либо тебе нужен функционал кнопки в твоем классе, и ты имплементируешь интерфейс кнопки.class Button;
class RedButton extends Button;interface Button;
class Image implements Button;

Худший ответ:
Абстрактный класс может реализовать некое базовое поведение, которое затем унаследуют потомки, а интерфейс это в чистом виде контракт, никакого поведения, только сигнатуры.
Если никакого базового поведения, которое могли бы использовать потомки нет, то нет смысла и использовать абстрактный класс.
Вопрос: Как правильно сделать пагинацию?

Лучший ответ:
Из приведенного кода не понятно как происходит
если я, например, нахожусь на проекте с id=5 (а id=6 еще нет) и при этом я нажимаю на кнопку "Вперед", то меня переносит на страницу с id=6, которой не существует и я просто получаю ошибку.

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

Худший ответ:
Да простят меня боги чистого кода.

/**
 * Следующий пост
 *
 * @param $post_id
 *
 * @return string[]|null
 */
function next_post($post_id)
{
    global $link;
    $sql      = "SELECT * FROM projects WHERE id > " . $post_id . " ORDER BY id ASC LIMIT 1";
    $result   = mysqli_query($link, $sql);
    $nextpost = mysqli_fetch_assoc($result);

    if (!$nextpost) {
        return first_post();
    }

    return $nextpost;
}

/**
 * Предыдущий пост
 *
 * @param $post_id
 *
 * @return string[]|null
 */
function prev_post($post_id)
{
    global $link;
    $sql      = "SELECT * FROM projects WHERE id < " . $post_id . " ORDER BY id DESC LIMIT 1";
    $result   = mysqli_query($link, $sql);
    $prevpost = mysqli_fetch_assoc($result);

    if (!$prevpost) {
        return last_post();
    }

    return $prevpost;
}

/**
 * Первый пост
 *
 * @return string[]|null
 */
function first_post()
{
    global $link;
    $sql    = "SELECT * FROM projects WHERE ORDER BY id ASC LIMIT 1";
    $result = mysqli_query($link, $sql);
    $post   = mysqli_fetch_assoc($result);

    return $post;
}

/**
 * Последний пост
 *
 * @return string[]|null
 */
function last_post()
{
    global $link;
    $sql    = "SELECT * FROM projects WHERE ORDER BY id DESC LIMIT 1";
    $result = mysqli_query($link, $sql);
    $post   = mysqli_fetch_assoc($result);

    return $post;
}
Вопрос: Передача API через REST framework к React-Redux?

Лучший ответ:
Можно использовать nginx. Пропишите в /etc/hosts хост приложения:127.0.0.1 my-app
В nginx.conf в секцию server:server {
  listen 80;
  server_name my-app;

  location ^~ / {
    proxy_pass http://localhost:3000/;
  }
  location ^~ /api/ {
    proxy_pass http://localhost:8000/api/;
  }
}
Обращайтесь к приложению в браузере как к my-app и к API в приложении как к /api.

Худший ответ:
С трудом понимаю, правильно ли Вы задеплоили свои приложения ( и это дев или прода), но с CORS все верно
Вопрос: Бред с кодировкой тегов mp3 в utf-8?

Лучший ответ:
Потому что зачастую там не UTF-8, а UTF-16 в тегах id3v2
проверяется через iconv
если увидите читабельный текст то значит там было utf-16
$tag_utf8 = iconv('UTF-16', 'UTF-8', $tag);

Худший ответ:
Да, есть такая проблема.

Решается настройкой / сменой парсера.

Я для своих PHP проектов пользовался вот этой либой:
https://github.com/JamesHeinrich/getID3
И там это можно настраивать. Автоматически не очень определяет.

Может где-то есть и более умная либа, которая умеет правильно определять автоматически.
Вопрос: Всегда ли нужно писать геттеры?

Лучший ответ:
Читайте что такое инкапсуляция и зачем она нужна.
Внутри класса обращайтесь напрямую. Снаружи класса - принято обращаться через геттеры/сеттеры - чтобы если вдруг вы будете что-то внутри класса менять, вам не нужно было искать где используется ваш класс и как исправить все эти вызовы - вы просто поправите геттер/сеттер в вашем классе.

Худший ответ:
Желательно конечно всегда... Это закон инкапсуляции, нежелательно если бы какой то рандомный человек изменил поле в вашем классе. Так что это по вашему усмотрению, когда у мея были маленькие знания языков, я тоже думал - "зачем это ООП? Зачем инкапсуляция вообще бред", а сейчас я понимаю зачем оно. Просто учитесь и в ходе изучения как и я поймёте всё. Ответ на ваш вопрос - надо. Геттеры и сеттеры всегда нужны. Это как ловить ошибки. (try, except)
Вопрос: Какой джентельменский набор вы используете для проектирования UI/UX?

Лучший ответ:
Очень короткий список, но очень полезный:
1. Axure - основной инструмент для разработки прототипов, иногда заменяет драгоценный блокнот.
2. Figma - для полноценной реализации того, что сделал в Axure, грубо говоря делать дизайны - там.
3. Adobe Photoshop - каждый раз когда нужно поработать с растровой графикой - иду туда, и импортирую позже в Фигму.
4. Adobe Illustrator - когда не хватает стандартных инструментов Figma для векторной графикой (а такое бывает не часто), открываю Иллюстратора.
5. Ну и конечно же, для вдохновения Behance, Дрибл и Themeforest.
Есть аналоги Figma, это Adobe XD и Скетч, но тут на вкус и цвет.

Худший ответ:
Только акшур и фотошоп. Пробовали иллюстратор - не пошло (кроме узких задач).
Карандашом вообще не пользовался никогда. 
Для вдохновения - сайты различных премий в области сайтов, и как выше сказали - беханс. 
У нас есть чат в телеграме, где скидываем повседневные сайты, с указанием что именно понравилось (лоадер, типографика, сетка, приемы).
Вопрос: Почему обе кнопки не могут работать одновременно?

Лучший ответ:
Потому что после создания новых кнопок вы добавляется только один обработчик события.
Внутри ваших обработчиков должно бытьclone.querySelector('.btn-add').addEventListener('click', addHandler);
clone.querySelector('.btn-delete').addEventListener('click', addHand);

Худший ответ:
Потому что после создания новых кнопок вы добавляется только один обработчик события.
Внутри ваших обработчиков должно бытьclone.querySelector('.btn-add').addEventListener('click', addHandler);
clone.querySelector('.btn-delete').addEventListener('click', addHand);
Вопрос: Как лучше исполнить алгоритм подбора строительных материалов?

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

Худший ответ:
работать однозначно удобнее с mysql, вот только зачем все завязывать на excel и для чего этот велосипед с цветом ячеек? А хранить составленные сметы вы где собираетесь а как потом работать с уже составленными сметами?  
я бы сделал так:  табл mysql id группа услуги наименование услуги ед.измерения объем необходимые материалы json массив стоимость за ед.измерения с материалами и видами работ и их стоимостью табл mysql id Контрагент массив в json со списком всех сохраненных услуг в заказе id услуги название услуги стоимость услуги -да, сюда дублируем стоимость услуги, для того, чтобы в случае изменения ее в базе, закрытые сметы оставались с теми суммами, которые вы получили по факту. Это пригодится в случае построения отчетов объем услуги ед. измерения стоимость работ дата составления запланированная дата начала работ запланированная дата окончания работ  с сохраненными расчетами
сделал бы фронт-енд на js, чтобы по первым введенным буквам в форму добавления услуги производился поиск по названию и вывод информации, добавление дополнительной услуги к заказу - тоже интерактивно через Js
на бек повесил бы обработчики на php, оптимизировал бы это дело для мобильных платформ, получится что прораб сможет в полях поднять смету или составить новую.
ну и данный можно легко редактировать + куча потенциально возможного функционала, например: уведомления на почту, можно прикрутить и смс о подходящих датах, можно сделать отправку сметы на почту в виде xml или pdf файла, календарь запланированных работ. Подсчет дохода за выбранный период времени или выборка по контрагенту.
могу набросать за 2-3 дня рабочий вариант, а то чет поиздержался, а нг на носу )
Вопрос: Как сделать смайлы (эмоции) на CSS?

Лучший ответ:
вообще не согласен с "эсвэгэ" комментаторами, непонятно почему нельзя рисовать на css, теоретически любой свг можно описать css стилями.
практически, примеры
www.tortorse.com/demo/css3angrybirds.html
jsfiddle.net/AlexanderN/onjsw3kv/2
https://bennettfeely.com/csscreatures/

Худший ответ:
svg, спрайты, разные картинки в png, canvas...
Вопрос: Как мне соеденить компьютер с другой подсетью?

Лучший ответ:
А ну, марш Олиферов читать! :) 
Из этого вопроса понятно и очевидно только я только начинающий системный администратор
все остальное просто поток сознания какой-то...
Схему сначала нарисуй - что куда включено, что куда приходит и откуда уходит - пригодится...

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

Лучший ответ:
В ноутбуках стоят стандартные винчестеры 2,5", чаще всего (то есть уже давно) только SATA, то есть их можно подключить к любому компьютеру, стандартными кабелями. Можно не "вытаскивать инфу", а просто подключить диск и пользоваться, будет дополнительным.

Худший ответ:
Я хотел бы выкрутить HDD оттуда, и каким-то образом подцепить его к своему нынешнему ноутбуку, как внешний HDD, чтобы перенести информацию оттуда. Скажите, это возможно сделать в домашних условиях?Можно, и весьма несложно. Надо лишь приобрести USB-боксик под стандартный типоразмер диска 2,5", зарядить в него диск, вытащенный из дохлого ноута, и подключить его хвост к любому компу, имеющему соответствующую втычку. Полученное изделие пригодится не только для разового случая спасения инфы, но и вообще как носимое хранилище, "очень большая флэшка", нужно лишь (после спасения инфы, конечно) очистить диск.
Цена вопроса - 500...700 руб здесь или 300 руб у китайцев на Али (но месяц ждать, пока приедет). Брать с USB-2.0 смысла не имеет, лучше - с USB-3.0
Вопрос: Discord.py bot Приветствие?

Лучший ответ:
Сервер в discord.py это guild, а не server, прочитай ошибку - тут написано что member не имеет атрибута server. Используй member.guild! https://discordpy.readthedocs.io/en/latest/api.htm...

Худший ответ:
@client.event
async def on_member_join(member):
    server = member.server
    channel = server.default_channel
    retStr = str("""```yaml\nПривет!\nДобро пожаловать на наш сервер!\nНадеюсь тебе тут понравится.\nЕсли заблудешься пиши !help,кстати у нас все команды пишутся с !\nДля получения роли зайди в чат получения роли\nудачи тебе```""")
    embed = discord.Embed(title="Welcome",colour=discord.Colour.blue())
    embed.add_field(name="Привет",value=retStr)

тут нету ошибок
Вопрос: Чем восстановить жесткий диск на Mac (APFS)?

Лучший ответ:
Странный вопрос.
В тегах говорится про восстановление данных, в вопросе про восстановление диска. Понятия это взаимоисключающие, поэтому непонятно что же вам все-таки нужно?
Данные восстановить и выкинуть диск на помойку?
Восстановить диск уничтожив все данные на нем?Стандартная "Дисковая утилита" находит ошибки, но не исправляет их,Стандартная дисковая утилита восстанавливает файловую систему.
Если вам нужно восстановить данные - ее ни в коем случае запускать нельзя, у нее другая задача.
Если вам нужно восстановить диск - утилита тут не поможет.Знаю, что в теории можно удалить диски, отформатировать, что бы избавиться от ошибок, а потом попытаться восстановить данные, но не уверен, что это сработает с APFS дискомСработает! какие могут быть сомнения.
1)Форматируете - этим уничтожается файловая система.
2)Потом можете годами пытаться восстановить данные - увлекательный процесс.
У некоторых иногда даже получается что-то восстановить.

Худший ответ:
Наилучшие условия для восстановления данных будут у компании по восстановлению данных.
Если данные настолько дороги, то не стоит рисковать самостоятельным восстановлением данных.
Вопрос: Фриланс недобросовестный заказчик не заплатил за работу, что делать?

Лучший ответ:
Привет, жаль конечно, но такова жизнь, я в свое время похожим способом 100к потерял, но мне уже окупилось многократно, т.к. с тех пор больше таких случаев небыло. Рассматривайте эти 10к рублей как получение опыта, по сути вы купили эти знания дешевле чем я в 10 раз. Двигайтесь вперед, там возможностей больше. Посчитайте сколько часов вы потратите чтобы вернуть эти деньги и умножте на свою ставку, оно того точно не стоит.

Худший ответ:
У вас есть запись вашего рабочего стола или ещё какие доказательства что 18 часов вы реально возились в легаси ? Да и с ней помогут только в спортлото.
Вопрос: Что делать с модулями NPM для Сайта?

Лучший ответ:
Это потому, что require() не существует в JavaScript на стороне браузера / клиента.
Как решить проблему: 
1) requirejs 
2) Импортируйте, используя <script> тег
3) Собирайте проект сборщиком, типа webpack

Худший ответ:
Сбилдить проект
Вопрос: Экспорт fig в XD (или как проще перегнать макет фигмы в After)?

Лучший ответ:
Самый быстрый способ, это выделить все слои в Figma, нажать правок кнопкой мыши -> copy as -> copy as svg и в открытом окне Adobe XD, нажать CTRL + V. Проблема лишь в том, что все шрифты переведутся в вектор, и их нужно будет переносить вручную. С другой стороны, мы не часто, создавая анимацию, редактируем текст.

Худший ответ:
Сохраняешь в SVG, открываешь в Illustrator, ну а люстра с афтером очень хорошо дружит.
Вопрос: Vue Cli неправильные пути в сборке build?

Лучший ответ:
Невнимательно читал документацию, проблема описана тут

Худший ответ:
Невнимательно читал документацию, проблема описана тут
Вопрос: Как на react.js взаимодействовать с php?

Лучший ответ:
Ты делаешь напрямую запросы к файлу, который лежит на диске. По крайней мере, если судить по вот этой ошибке Access to XMLHttpRequest at 'file:///C:/Users/%D0%9E%D0%BB%D0%B5%D0%B3/esktop/React+Redux/new-react/public/update.php'. Так не прокатит.
Тебе надо веб-сервер настроить (Nginx или Apache, например), а также настроить интерпретатор php. Запросы из React делать надо к серверу, а не к файлу на жестком диске. То есть урл для запросов у тебя будет типа такого: 127.0.0.1/update.php.

Худший ответ:
Ты делаешь напрямую запросы к файлу, который лежит на диске. По крайней мере, если судить по вот этой ошибке Access to XMLHttpRequest at 'file:///C:/Users/%D0%9E%D0%BB%D0%B5%D0%B3/esktop/React+Redux/new-react/public/update.php'. Так не прокатит.
Тебе надо веб-сервер настроить (Nginx или Apache, например), а также настроить интерпретатор php. Запросы из React делать надо к серверу, а не к файлу на жестком диске. То есть урл для запросов у тебя будет типа такого: 127.0.0.1/update.php.
Вопрос: Почему не принимает height:100%?

Лучший ответ:
Тут надо разобраться что такое 100%  и вообще что такое %.
Проценты это относительная величина.
То есть, если у вас есть блок-родитель с фиксированной высотой, допустим 300px, то дочерний блок с свойством height 100% будет иметь величину 300px соответственно.
Но если у  блокa с высотой 100% не будет ни 1ого родителя с фиксированной высотой, то по умолчанию, все эти блоки наследуют от html и body  высоту auto, то есть не имеют никакую высоту, если нет контента.
Пример одного и того же блок с родителем с фиксированной высотой и без - https://codepen.io/you_web/pen/Zomvxa
Что бы сделать высоту 100% от размера экрана, достаточно задать 100vh (можете погуглить поточнее,  но в общем это новые свойства, где 1vh - 1% высоты от экрана, 1vw - 1% ширина от экрана)
Так же, что бы эти свойства (vh и vw) корректно отображались на мобильных устройствах необходимо указать вьюпорт (тоже обязательно погуглите)

Худший ответ:
Попробуй так
html, body {    height: 100%;    min-height: 100%;}
Вопрос: Как такой упростить js код?

Лучший ответ:
Получили объект всех свойств элемента. Перечислили свойства, которые нужно сложить. Средуцировали массив, прибавляя к накапливаемому значению (начальное = 0) очередное, приведённое к числу. function fullWidth(el) {
  const style = window.getComputedStyle(el);
  
  return 'width,margin-left,margin-right,padding-left,padding-right'
    .split(',')
    .reduce((p,c) => p + parseFloat(style[c]), 0)
  ;
}

Худший ответ:
Вот необходимый тебе пример jsfiddle.net/FvRAm/15
Вопрос: Как проектировать приложение с нуля?

Лучший ответ:
Я бы посоветовал книгу Крэга Лармана "Применение UML 2.0 и шаблонов проектирования".
Ну а так можно начинать проектировать простые приложения с Базы Данных, думаю для начинающих это проще и эффективнее. Можно конечно посоветовать почитать Эрика Эванса про его методологию DDD (Domain Driven Design - проектирование на основе предметной области), но думаю мозг сломаешь и на ранних этапах от нее пользы точно не будет.
Что касается проектирования UI, то здесь могу посоветовать паттерн MVP (Model-View-Presenter).
А то, что прочитанный вами материал неполный, то интересно как вы это определили? Спросили у экспертов?
Вообщем в книге Крэга Лармана много чего есть, сначала следует начать с нее.

Худший ответ:
Начинаю с мокапов экранов на бумажке, чтобы понять, что именно я собираюсь делать. 
Потом делаю прототип, почти без логики, в основном вьюшки с захардкожеными данными.
Становится понятно, что за сущности мне будут нужны. 
Берусь за MVP, т.е. превращаю прототип в рабочее приложение, т.е разбиваю вьюшки прототипа на компоненты, добавляю модели, слой логики, привожу в порядок структуру приложения.
Дальше "наращиваю мясо" на MVP, пока не наберётся критическое количество изменений, потом делаю большой рефакторинг, после - "релиз".
Мне нравится книга «Getting Real» от 37 signals, бесплатная, вроде уже перевели.