• Как писать много кода, оставляя его простым, как в начале?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ну в общем-то ответов много. Могу кое-что добавить от себя.

    Во-первых, голова не бесконечна во всех смыслах. Запихнуть в неё больше чем 10 объектов одновременно вряд ли получится, у многих начинаются огромные проблемы уже с 5. Лично я испытываю ДИКУЮ больше если собственный код становится больше чем большой. Для меня это где-то 15~20 сущностей, причём чем сильнее они связаны, тем сложнее они даются, так как становится сложно абстрагироваться. Что примечательно, при работе с чужим кодом таких проблем практически нет, ну у меня по крайне менее. Всё дело в том, что чужой код изначально воспринимается чёрным ящиком, поэтому если он не представляет из себя дикую лапшу, аккуратная работа с ним с минимальным вмешательством в проект получается легко.

    Во-вторых, не стоит делать код пушистым. Однообразность воспринимается лучше. Массивы некоторых объектов надо называть $названием_объекта + 's'. Классы с большой буквы, любой объект стоит называть так же, как класс, но с маленькой буквы. Конечно, если семантически прям просится по другому, то стоит правило нарушить, но в общем случае никаких выдумок не надо. Временная строка - str, временное число - tmp, временный объект - obj. И пробелов не жалей, внутри файла разделяй разные структуры двумя-тремя пробелами, стоит обособлять регионы, например, "глобальные" функции наверху, по середине структуры, потом классы. В C# есть #region.

    В-третьих, объём тоже воспринимать сложнее. Делай плоско. В том смысле, что меньше наследований, больше включений. Очень тяжело воспринимать архитектурную лапшу. Суть микросервисов - единственная, максимум две точки связи. То есть контроллер де должен склеивать всё и вся, это задача "простейшего" диспетчера событий, который крутится в своём цикле и распихивает поступившие сообщения. Микросервису надо думать чем меньше, тем лучше. Вообще, микросервисы не всегда хорошо подходят, они очень удобны в сверхраспределённых командах с высокой степенью самодисциплины, когда привычка смотреть в доки сильнее привычки звонить тимлидеру на каждый чих. В случае с самостоятельной разработкой они скорее зло, хотя в web поначалу довольно приятно, заливать чрезвычайно низкую производительность ресурсами, забивая каналы связи под завязку, не лучшая идея. Порой намного лучше сделать монолитно, но аккуратно, особенно когда вся жизнь продукта под ответственностью одного человека.

    В-четвёртых, внутри монолита также надо делать максимально растянуто, никаких супер-синглетонов бдящие за всем и вся. Равно как и с микросервисами, внутренние объекты должны иметь минимум точек входа. Они должны быть просты и понятны. Если какой-то класс выполняет слишком много задач, часть из них надо делегировать другим классам, возможно новым. Это по сути цикломатическая сложность, о которой упомянул Ivan Sokolov, но мне не нравится эта формальность. Да и некоторые вещи сложно формализовать ребром на графе.

    В-пятых, иерархия должна быть логически правильной, наивной, без выпендрёжа. Тоже самое, что и в третьем, плоское лучше объёмного.
    Плохо:
    3dbadffb7d954b2d93a5dfec863289be.png
    Лучше:
    1238e5c4d83340239a250116d4d2fa3a.png
    Пример немного утрирован, но суть, навроде, ясна. Не надо наследовать всё и вся от чего угодно, если есть возможность включить внутрь - включай. Всё остальное от лукавого и только в крайних случаях.

    В-шестых, используй UML, mind maps, блокнот и таск менеджеры. Эти инструменты словно манна небесная спасают дедлайны от полного уничтожения. Хотя UML спорен, им очень удобно следить за структурой проекта, представлять картину с высока, рисовать его стоит самому, учитывая неявные связи и убирая рудиментарные. Mind maps помогут собрать мысли в кучу. Блокнот банально запишит то, что постоянно забывается. Таск менеджеры сформируют привычный график, отобразят прогресс, помогут фокусироваться на текущих задачах, не растекаясь по проекту.

    В-седьмых, изучи декларативное программирование. Шикарная вещь, которая позволяет сконцентрироваться на задаче, а не на решении. Из коробки в функциональных (erlang) и логических (prolog) языках, однако многие элементы существуют и в монстрах вроде C#/Java, Python, особенно JavaScript. Насчёт Go не знаю, но на первый взгляд весьма декларативный.

    И наконец, сложность проекта в любом случае будет расти. Единственное, что с этим можно сделать - это смирится. Да, все эти способы помогают, но они лишь оптимизируют имеющееся, позволяя больше впихнуть в голову. Но с ростом проекта сложность расти будет всё равно, энтропия замкнутой системы не уменьшается. Именно поэтому её локально уменьшают в разных кусках кода, однако натыкаются на другие грабли - один винтик может дёргать тысячи классов. Сам-то винтик прост, однако он всё равно берёт на себя слишком многое.

    Ещё пара абзацев. Ну про вредные советы: методы надо делать ровно такими, какие они должны быть. 20 строк - это что-то вроде лакмусовой бумажки, однако это лишь один из параметров. Очень часто требуется сделать громадную функцию для работы со сложным API или подробить много разных чисел в циклах. Поэтому ориентироваться на это плохая идея. Равно как и папки-подпапки-подпапками погоняемы, максимум - два уровня в чрезвычайно сложных проектах. Иначе будет очень сложно ориентироваться. Ещё происходит странный возврат к комментариям. На мой взгляд, если это не продаваемая за большие деньги библиотека - нах*й надо. Документация в комментариях - рудимент кода, он нигде не используется, зато требует поддержки, на что приходится распылять внимание. Если нет условного рефлекса править комментарий после кода - выбрасывайте и не жалейте. Везде! Без исключений. Ещё есть много "архитектурных" паттернов. Снова вред, если вы не работаете в Google, где вашу зарплату надо оправдать умными словами. Самый эффективный способ - программировать наивно. Чем проще для вас сейчас, тем лучше для вас потом. Если думаете больше десяти минут - плохо думаете... Но об этом позже. Паттерны это некая систематизация неких знаний, причём совершенно не понимаю, зачем её вообще сделали. Да, архитектура в некотором роде нужна, но постоянно искать какой паттерн здесь надо использовать, если это не проект на 100500 лет вперёд - нельзя. Почти всегда будет дешевле в случае неуспеха отрефакторить всё и вся, чем переписывать с нуля или тратить месяцы на продумывание архитектуры... В которой также могут быть ошибки.

    И последнее. Отдыхайте. Если чувствуете, что задыхайтесь - пройдитесь, подышите. Если чувствуете, что мозги плывут - отвлекитесь, подумайте о другом. 8 часов в день для программиста - это дикость, но это реальность. Для разных людей наибольшая эффективность поддерживается где-то 3~6 часов, причём некоторым требуются перерывы каждые пол часа, другому хватит обеденного перерыва, а третьему вообще нельзя сегодня никаких отвлекающих факторов, ибо "волна". На самом деле, человек существо динамичное, так что будут разные дни. Но если не получается сейчас - не бесите самого себя. Отдохните, перекусите, пробежитесь, покурите, проверьте почту, послушайте музыку, почитайте статью. Не тратьте время бездарно и, что интересно, проблемы будут решаться, усилия будут прикладываться аналогичные, но вот ощущения от работы станут совершенно другими.
    Ответ написан
    7 комментариев
  • Как писать много кода, оставляя его простым, как в начале?

    @dmz9
    не знаю зачем тут пацаны советуют чистый код Р. Мартина
    https://www.ozon.ru/context/detail/id/5011068/
    вот что нужно на замену
    https://www.ozon.ru/context/detail/id/138437220/
    есть обе у меня, но красненькую купил раньше. в ней больше информации как внешне так и по сути.

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

    во многих конвенциях о code-style указываются очень грамотные вещи, и они не просто так там находятся. в общем смысл такой - код должен быть самодокументируемым/самоописательным, а комментарии к коду не должны быть в стиле "моё почтение, капитан!".
    • код должен напоминать хорошую прозу.
    • комменты описывают намерение (зачем?) а не реализацию (как?).
    • прими во внимание время жизни переменной. чем ближе переменная к "месту военных действий" тем лучше. перекликается со временем жизни переменной - чем быстрей "умирает" тем лучше, часто можно даже без переменной обойтись не в убыток читаемости.
    • люди советуют тут ограничиваться конкретным числом строк. имхо - вредный совет. метод не должен ограничиваться. метод должен быть такой длины, которая требуется. иногда без "супер-методов" не обойтись (это не о функциях на 100500 входящих параметров), невозможно просто разбить тяжелую функцию на более мелкие куски, не умножив число запоминаемых переменных/других методов. метод может быть в 3 строки, может быть даже в одну, а может быть в сто-двести строк и более. если из метода ничего нельзя выбросить и нечего добавить - значит он в точности занимает столько сколько нужно.
    • многословие приветствуется но без фанатизма. машине почти всё-равно какой длины у тебя функция (если вы понимаете о чем я), а для тех кому нет - есть минификаторы (для js например)
    • название метода должно однозначно говорить о его назначении. спрашивай себя - зачем этот метод? зачем это свойство? если ты не можешь ответить значит и запомнить/вспомнить не сможешь, значит у метода/свойства нет конкретного предназначения и потом (через какое то время) будет сложно разобраться для чего он вообще нужен.
    • визуально отделяй приватные/публичные методы. это тоже некоторая подсказка которая помогает разбираться в коде.
    • следуй одному стилю как минимум в отдельно-взятом файле. (кемелкейс отдельно, лодаш отдельно).
    • следуй принципу наименьшего удивления (программиста). т.е. поменьше роялей в кустах
    • соблюдай абстракции. если класс это не просто набор статичных методов - значит он описывает какие то действия вполне определенного объекта. не раздувай и не разбивай на несколько классов одну цельную и четкую абстракцию. это поможет сосредоточиться на отдельном куске кода в один момент.
    • старайся не писать рядом в одном классе методы, которые "проникают" во все аспекты приложения (антипаттерн - суперкласс/божественный объект).


    вообще стоит почитать про паттерны и антипатеррны, это конечно не библия но знать хотя бы основные стоит.
    Ответ написан
    2 комментария
  • Как распарсить JSON ответ VK.api?

    fastpars
    @fastpars
    json2struct.mervine.net
    mholt.github.io/json-to-go

    type MyJsonName struct {
    	Attachment struct {
    		Photo struct {
    			AccessKey string `json:"access_key"`
    			Aid       int    `json:"aid"`
    			Created   int    `json:"created"`
    			Height    int    `json:"height"`
    			OwnerID   int    `json:"owner_id"`
    			Pid       int    `json:"pid"`
    			Src       string `json:"src"`
    			SrcBig    string `json:"src_big"`
    			SrcSmall  string `json:"src_small"`
    			SrcXbig   string `json:"src_xbig"`
    			SrcXxbig  string `json:"src_xxbig"`
    			Text      string `json:"text"`
    			UserID    int    `json:"user_id"`
    			Width     int    `json:"width"`
    		} `json:"photo"`
    		Type string `json:"type"`
    	} `json:"attachment"`
    	Attachments []struct {
    		Photo struct {
    			AccessKey string `json:"access_key"`
    			Aid       int    `json:"aid"`
    			Created   int    `json:"created"`
    			Height    int    `json:"height"`
    			OwnerID   int    `json:"owner_id"`
    			Pid       int    `json:"pid"`
    			Src       string `json:"src"`
    			SrcBig    string `json:"src_big"`
    			SrcSmall  string `json:"src_small"`
    			SrcXbig   string `json:"src_xbig"`
    			SrcXxbig  string `json:"src_xxbig"`
    			Text      string `json:"text"`
    			UserID    int    `json:"user_id"`
    			Width     int    `json:"width"`
    		} `json:"photo"`
    		Type string `json:"type"`
    	} `json:"attachments"`
    	Comments struct {
    		Count int `json:"count"`
    	} `json:"comments"`
    	Date     int `json:"date"`
    	FromID   int `json:"from_id"`
    	ID       int `json:"id"`
    	IsPinned int `json:"is_pinned"`
    	Likes    struct {
    		Count int `json:"count"`
    	} `json:"likes"`
    	PostType string `json:"post_type"`
    	Reposts  struct {
    		Count int `json:"count"`
    	} `json:"reposts"`
    	SignerID int    `json:"signer_id"`
    	Text     string `json:"text"`
    	ToID     int    `json:"to_id"`
    }
    Ответ написан
    2 комментария
  • Как правильно верстать на чистом html css?

    zorro76
    @zorro76
    Плохой тон нынче это без фреймворков, препроцессоров.
    Ответ написан
    1 комментарий
  • Несколько вопросов по работе, что посоветуете?

    begemot_sun
    @begemot_sun
    Программист в душе.
    5 летний Senior это курам на смех. Кто же тогда 30 летний - это уже god-level ?

    Чтобы переехать в другую страну, вам нужен диплом по специальности + документированный опыт.
    Я не знаю, но в нашей стране не учат вебу. Я не знаю чему учат в нашей стране.

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

    Tiendil
    @Tiendil
    Разработчик ПО.
    Заработать можно, если команда состоит из профи. В одиночку тоже можно, но сложно — нужно быть мастером на все руки.

    Реклама нынче ооооочень дорогая — это главная проблема для независимого разработчика. Поэтому нужны либо деньги либо оригинальный продукт. Причём оригинальный для массовой аудитории, а не для узкого круга лиц.

    Заработать существенную сумму на offline игре (поиграл, прошёл и забыл), я бы сказал, почти невозможно — успешных примеров единицы. Поэтому такие игры приходится делать чуть ли не как на конвеере — по несколько в год. Никакого удовольствия от этого не будет — очень жестокий и тяжёлый бизнес.

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

    Я, собственно, последние 3 года этим и занимался, но игра вышла через чур оригинальной и полностью жить с неё нельзя, но что-то более массовое вполне может обеспечить создателя.

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

    saboteur_kiev
    @saboteur_kiev Куратор тега Разработка игр
    software engineer
    Если вы задаете такой вопрос, то нельзя.

    Разработка игры - это технический процесс.
    Заработок на разработке игры - бизнес процесс. Если вы задаете такие вопросы, то скорее всего вы не сможете заработать на разработке игры своими силами.
    Ответ написан
    4 комментария
  • Взаимодействие двух веб-страниц — какая прослойка?

    @Levhav
    Возьмусь за разработку проектов любой сложности.
    Вам нужно использовать технологию комет для этого.
    Ответ написан
    1 комментарий
  • Добавить стиль переменной javascript?

    varzin
    @varzin
    UI/UX дизайнер в instadev.ru
    Например вот так codepen.io/varzin/pen/rFfhH

    Обратите внимание, что мы теперь выводим не просто значения, а обрамляем их тегами. И вот их и оформляем через CSS.
    Ответ написан
    5 комментариев
  • Вставлять картинки или делать через CSS?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега CSS
    Картинки нужно сжимать и поддерживать, заморачиваться с адаптивностью.
    У меня в большинстве случаев меньше времени уходит на то, чтобы написать какие-то стили, чем вырезать картинку и правильно ее сохранять.
    Ответ написан
    Комментировать
  • Какое легкое решение для модальных окон вы используете?

    trevoga_su
    @trevoga_su
    своё написал и все.
    Ответ написан
    Комментировать
  • Чем обусловлена столь высокая стоимость интернета в роуминге?

    tema_sun
    @tema_sun
    Жадность.
    Ответ написан
    Комментировать
  • Чем обусловлена столь высокая стоимость интернета в роуминге?

    Radzhab
    @Radzhab
    Интернет в роуминге выгодней продавать чем кокаин
    Ответ написан
    Комментировать
  • Как работает валютная биржа (вроде btc-e)?

    ProRunner
    @ProRunner
    Stock_Spreadsheet.png
    Посмотрите на картинку отсюда. Слева количество биткоинов, сколько кто-то согласен купить по такой цене, справа количество биткоинов, которые кто-то согласен продать по такой цене. Как только находится покупатель/продавец, согласный на такую цену, сделка совершается. К примеру, вы согласны купить 500 биткоинов по цене не больше 132 - при выставлении этой заявки вы автоматом покупаете два предложения и встаете вверху покупателей за остальным. Текущая цена подскочит до 131,40 - величина последней сделки.
    Ответ написан
    2 комментария
  • Golang и highload

    EugeneOZ
    @EugeneOZ

    Недавно Cloudflare писали статью о том, как они попробовали Go и теперь всё переписывают на нём. Отличный пример highload. А также Iron.io и Disqus.

    1. Мгновенная компиляция, хорошая производительность, удобная параллелизация процессов.

    3. Динамично развивающийся язык, уровень вхождения сопоставим со скриптовыми языками, всё больше проектов из highload его хвалят.

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