MetaProg

Описание: Разработка и отладка приложений. Упор на 3D-графику.

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#1 dyvniy » Чт, 15 мая 2014, 15:19:35

Группа статей//новостей
https://habrahabr.ru/hub/analysis_design/

O(x) сложность алгоритмов
http://bigocheatsheet.com/

Надо потренроваться
https://www.hackerrank.com/interview/interview-preparation-kit

Программерский юмор
http://developerslife.ru/
https://habrahabr.ru/post/311994/
https://habrahabr.ru/post/235281/

Грабли, на которые не стоит наступать
http://habrahabr.ru/post/219651/
Идея о том, что новый код лучше старого, явно абсурдна. Старый код использовался. Он протестирован. Множество багов было найдено и они были исправлены. И с этим все в порядке. Код не плодит баги просто валяясь на жестком диске. Как раз наоборот! Программное обеспечение — это что, старый Dodge Dart, который ржавеет просто простаивая в гараже? Это что, плюшевый мишка, который плохо выглядит, если не сделан исключительно из нового материала?
Спойлер
Наконец выходит первая публичная бета-версия Netscape 6.0. Версии 5.0 не существует. Предыдущий мажорный релиз — версия 4.0 — был выпущен почти три года назад. Три года — это невероятно большой срок в мире интернета. Все это время в Netscape сидели и беспомощно наблюдали за тем, как уменьшается их доля рынка.

Это немного подло с моей стороны критиковать их за столь долгое ожидание между релизами. Они ведь не специально это сделали, правда?

Неправда! Именно так они и сделали. И этим они совершили единственную самую большую стратегическую ошибку, которую когда-либо может сделать софтверная компания.

Они решили переписать код с нуля.

Netscape не была первой компанией, которая сделала такую ошибку. Borland совершила ее при покупке Arago, решив превратить ее в dBase for Windows — проект, который потребовал столько времени, что все вкусняшки достались Microsoft Access; и потом они совершила ее еще раз, переписав Quattro Pro с нуля и поразив всех тем, как мало программа умела. Microsoft сама почти повторила эту же ошибку при попытке переписать Word for Windows с нуля в обреченный проект под названием Pyramid, который был свернут, выброшен и забыт. На счастье Microsoft, работа над старым кодом не прекращалась, и у них было что выпускать, так что все это обернулось финансовой катастрофой, но не стратегической.

Мы — программисты. А программисты в душе — архитекторы, и первое, что они хотят сделать, когда попадают на дело, — пройтись бульдозером по всему и сделать что-то грандиозное. Мы не в восторге от последовательных улучшений: подкрутить, подправить.

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

Читать код сложнее, чем его писать

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

В подтверждение этой аксиомы можно спросить практически у любого современного программиста о коде, над которым он работает. «Это просто чертов бардак», — скажет он. «Все, что я хочу, так это выкинуть его к черту и начать заново».

Почему же бардак?

«Ну», — скажет он, «глянь вот на эту функцию. Она две страницы в длину! Тут почти все лишнее. Да я даже не знаю зачем здесь половина этих API-вызовов.»

Перед выходом нового менеджера таблиц для Windows от Borland пресса зацитировала до дыр похвальбы Филиппа Кана — основателя компании — о том, насколько Quattro Pro будет круче, чем Microsoft Excel, так как он был переписан с нуля. Полностью новый код! Как будто код ржавеет.

Идея о том, что новый код лучше старого, явно абсурдна. Старый код использовался. Он протестирован. Множество багов было найдено и они были исправлены. И с этим все в порядке. Код не плодит баги просто валяясь на жестком диске. Как раз наоборот! Программное обеспечение — это что, старый Dodge Dart, который ржавеет просто простаивая в гараже? Это что, плюшевый мишка, который плохо выглядит, если не сделан исключительно из нового материала?

Вернемся обратно к двухстраничной функции. Да, я знаю, это простая функция для отображения окна, но она обросла мусором и прочим барахлом, и никто не знает почему. Ну так я скажу почему: это фиксы багов. Этот кусок исправляет баг, который случился у Нэнси, когда она пыталась установить всё на машину без IE. Этот — тот баг, который происходит при нехватке памяти. А этот — когда файл находится на дискете, а юзер ее выдернул посреди всего. Вот этот вот вызов LoadLibrary ужасен, но благодаря нему код работает на старых версиях Windows 95.

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

Когда выбрасываешь код и пишешь его заново, ты выбрасываешь весь этот багаж знаний. Все эти пофикшеные баги. Годы работы программистов.

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

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

Это использование огромных сумм денег для написания кода, который уже есть.

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

Когда программисты говорят, что их код — ужасный бардак (а они всегда так говорят), это обычно означает три типа проблем.

Первая — проблемы архитектуры. Код неотрефакторен. Код, отвечающий за сетевые соединения, вдруг выбрасывает из ниоткуда собственные диалоговые окна; это должно обрабатываться в коде UI. Такие проблемы могут быть исправлены по одной: аккуратным рефакторингом и изменением интерфейсов. Это может сделать один программист работая аккуратно и внедряя свои изменения целиком, никому не мешая. Даже довольно внушительные изменения архитектуры можно сделать без выбрасывания кода. В проекте Juno мы однажды провели несколько месяцев переделывая архитектуру: просто перемещая все вокруг, подчищая все, создавая осмысленные базовые классы и интерфейсы между модулями. Но мы делали это аккуратно и с текущим кодом, мы не вносили новых багов и не выбрасывали работающий код.

Вторая проблема, по которой программисты считают своей код бардаком, — неэффективность. Считалось, что у Netscape плохой код рендеринга. Но это затрагивало только небольшую часть проекта, которую можно оптимизировать или даже переписать. Но не надо переписывать всё. При оптимизации ради скорости 1% работы дает 99% результата.

И третье — код может быть просто невероятно отвратительным. Однажды я работал над проектом, в котором всерьез использовался тип данных FuckedString. В другом проекте договорились начинать имена свойств с "_", но позже решили перейти к более стандартному «m_». Поэтому половина функций начиналась с "_", а половина с «m_», и это было отвратительно. Честно, это проблемы, которые решаются пятиминутным написанием макросов в Emacs, а не переписыванием с нуля.

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

Старая мантра "делай, чтобы выбросить" очень опасна в применении к масштабному коммерческому проекту. Когда экспериментируешь с кодом, можно выпилить функцию, написанную две недели назад, в связи с находкой лучшего алгоритма. Тут все в порядке. Можно отрефакторить класс, чтобы его было проще использовать. Тут тоже все в порядке. Но выбросить всю программу — это опасная ошибка, и если бы Netscape был под наблюдением компании с опытом в индустрии ПО, они, возможно, не выстрелили бы себе в ногу с таким рвением.

Лурк про страуступа, александровску и т.д.
Осторожно, маты!
http://lurkmore.to/_/118731#mws_GDP3wId
Спойлер
СТРАУСТРУП и ЛЯМБДА
Жил-был СТРАУСТРУП. Шел обычный, скучный день. СТРАУСТРУП занимался рутинными вещами, такими как ебля своей трехсоткиллограмовой матери в зад. Только успев кончить матери в пердак и вынуть измазанный в говне хуй, СТРАУСТРУП услышал стук в дверь. Не заметив, что его мать умерла от сердечного приступа еще 3 дня назад, он пошел открывать дверь и вышел на веранду. На веранде никого не было. СТРАУСТРУП, было, уже начал подозревать СТЕПАНОВА в очередной подъебке, но вдруг, из под крыльца что-то вылетело и понеслось на него. От перевозбуждения СТРАУСТРУП уронил скрепленнеые скотчем очки на пол и смиренно ждал, что будет дальше. ЛЯМБДА, с огромной скоростью пролетела мима СТРАУСТРУПА, квадратной скобкой отпихнула его и заползла в дом, крепко заперев дверь. ЛЯМБДА ясно дала понять, что она приняла дом в качестве аргумента, но отказывается возвращать функцию, которая принимает ПИЗДЮЛИ в качестве аргумента и возвращает дом. ЛЯМБДА заползла на стул перед компьютером и свернувшись в уютный клубок, зашла на ДВАЧ. СТРАУСТРУП знал ЛЯМБДУ. По крайней мере, это слово он точно слышал, но не знал, что оно значит. Он очень удивился, когда недавно узнал, что ЛЯМБДУ включили в НОВЫЙ СТАНДАРТ, принятый полгода назад. СТРАУСТРУП понял, что надо выгнять ЛЯМБДУ из дома, потому что желание в очередной раз залезть на мамочку было слишком велико. Будучи первоклассным инженером, СТРАУСТРУП начал искать решение проблемы. Для разминки он решил повторить таблицу умножения до 12 на 12. Он 2 часа стоял на одном месте и смотрел в никуда, потея как свинья. Пока он боролся с таблицей умножения, из за угла вышел измазанный в говне АНДРЕЙ АЛЕКСАНДРЕСКУ и осмотрелся. Рядом стояли несколько зданий, включая психбольницу для буйнопомешанных и тюрьму. АНДРЕЙ задумался и понял, что в округе нет ни одного настолько больного и гнилого человека, чтобы продать ему свою книгу. Небрежно посвистывая, АНДРЕЙ удалился. СТРАУСТРУП закончил разминку и начал думать, как прогнать ЛЯМБДУ. Вдруг его осенило. Его дом был скомпилирован последней версией GNU G++, которая поддерживает ЛЯМБДУ. Именно поэтому, ЛЯМБДА и смогла проникнуть к нему в дом. СТРАУСТРУП понял, что ему нужна более старая версия G++, которая не поддерживала ЛЯМБДУ и тогда, при попытке компиляции дома, ЛЯМБДУ выкинет вместе с СООБЩЕНИЯМИ ОБ ОШИБКАХ. Но старую версию было негде взять. СТРАУСТРУП нанял ФУНКЦИОНАЛЬЩИКА СО ШТАНГОЙ за 5 тысяч рублей. Так как компьютера у них не было, ФУНКЦИОНАЛЬЩИК вначале написал на бумажке компьютер в 1 строчку НА ХАСКЕЛЕ:
Computer = Computer
ФУНКЦИОНАЛЬЩИК сожрал бумажку и высрал работающий системный блок с ВОДЯНЫМ ОХЛАЖДЕНИЕМ и предустановленой WINDOWS 7. На компьютере уже был установлен АЛАН ВЭЙК и ХАСКЕЛЛ ПЛАТФОРМ. Корпус был красного цвета, с наклейкой ТУРБО на прозрачной боковой крышке. Затем ФУНКЦИОНАЛЬЩИК написал в 2 строчки старую версию G++:
Compiler :: [C++SourceCode] -> [ExecutableFile]
Compiler source =(Link . Compile) source
СТРАУСТРУП взял исходники своего дома и запустил компиляцию. Компилятор начал дристать СООБЩЕНИЯМИ ОБ ОШИБКАХ. СТРАУСТРУП попытался разобрать первую строчку, но увидев такое, дальше лезть не решился(таблица умножения и так вымотала его):
std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::less<std::basic_string<char, std::map<std::basic_string<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>,std::allocator<char> > const, std::basic_string<char, std::char_traits<char>,std::allocator<char> > > > >char, std::char_traits<char>, std::allocator<char> >,std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>,std::allocator<char> > const, std::basic_string<char, std::char_traits<char>,std::allocator<char> > > > >std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>,std::allocator<char> > const, std::basic_string<char, std::char_traits<char>,std::allocator<char> > > > >
Высрав 10 000 СТРОК СООБЩЕНИЙ ОБ ОШИБКАХ, компилятор скончался от ЛЕНИВЫХ ВЫЧИСЛЕНИЙ ПРЯМОЙ КИШКИ и из монитора вылетела ЛЯМБДА. Придерживая круглые скобки квадратными скобками, ЛЯМБДА в ужасе съеблась под ближайший камень. Ей еще долго не захочется принимать и возвращать значения. Довольный СТРАУСТРУП плюнул в руку, чтобы наслюнявить хуй и уже решился залезать на мамочку, но передумал и решил вначале запостить эту историю на ДВАЧ.
АЛЕКСАНДРЕСКУ
Жил-был АНДРЕЙ АЛЕКСАНДРЕСКУ. У АНДРЕЯ всё всегда было через ЖОПУ. Мать АНДРЕЯ была наркоманкой. Список ее психических расстройств, венерических заболеваний и наркотиков, на которых она сидела, был длиннее типичного ресторанного меню. Когда пришло время рожать, каково-же было удивление врачей, когда АНДРЕЙ вылез из ЖОПЫ и каким-то образом умудрился убить и частично съесть двух медсестер. АНДРЕЙ был трудным ребенком. Когда АНДРЕЙ еще находился на лечении, на пятнадцатом году шоковой терапии и после второй лоботомии, он вдруг направил свое внимание на языки программирования. Большую часть дня, АНДРЕЙ бился головой о стену, пытался откусить кусок своего тела и ел свои экскременты. Но в перерывах между приступами, АНДРЕЙ листал книги и искал... Он прочитал про десятки языков программирования, но они не вызывали у него никакого интереса, потому что, они не были достаточно извращенными для его тонкого вкуса. Внезапно АНДРЕЙ увидел ВЫЧИСЛЕНИЕ ЧИСЕЛ ФИБОНАЧЧИ ВО ВРЕМЯ КОМПИЛЯЦИИ НА C++ и замер. В его уставшей, больной голове что-то щелкнуло - он нашел, что искал. Он начал читать книги по C++. Чем дальше он проникал в тайны C++, тем больше он понимал, что этот язык создан для него. Мерзкие извращения, которые он наблюдал на страницах, глубоко резонировали с его истерзанной и едко ненавидящей все светлое душой. Его глаза наливались кровью от удовольствия и слезы текли по щекам, от осознания, что на свете есть люди, не намного менее больные, чем он. АНДРЕЙ понимал, что скоро ему сделают третью лоботомию и тогда он вряд ли сможет написать книгу. Времени до третьей лоботомии оставалось немного и АНДРЕЙ решил начать писать книгу прямо сейчас. "THE TIME IS NOW, ANDREI", сказал он вслух самому себе на ломаном английском с выблядски кривым акцентом и начал писать. Вначале он не знал, в чем суть того, что он пишет. Но со временем картина стала ясной как день. АНДРЕЙ взял самый гнилой, уродский и омерзительный язык программирования и решил довести его до уровня сумасшествия, до сих пор невиданного в мире людей. Первый (и последний) технический рецензент его книги, сошел с ума и убил всю свою семью, после прочтения нескольких глав. Узнав об этом АНДРЕЙ смеялся, пока не потерял сознание. АНДРЕЙ понимал, что все идет как надо. Сразу после того, как он дописал последнюю главу, ему сделали последнюю лоботомию и писать книги ему больше не хотелось. Представители издателя взяли книгу АНДРЕЯ и, согласившись ее издать, спросили у него, как бы он хотел ее назвать. На ломаном, кривом английском он ответил: "MODERN C++ DESIGN: GENERIC PROGRAMMING AND DESIGN PATTERNS APPLIED BY ANDREI ALEXANDRESCU". Его акцент был настолько уебищен, что представители издателя начали ржать, с такой силой, что моча начала струиться по их ногам. Но, слишком поздно они поняли, что это была моча АНДРЕЯ. Они не знали, что таким образом он помечает своих жертв, перед тем, как их убить. АНДРЕЙ успел убить одного, но другому удалось спастись, хоть он и лишился уха.
Через несколько лет АНДРЕЯ выпустили. 20 лет шоковой терапии и 3 лоботомии, все-таки, смогли немного успокоить его. Он, конечно продолжал убивать, но редко, и в основном мелких грызунов.
Наступил обычный, скучный день. Скучным он мог быть для кого угодно, но не для АНДРЕЯ. Ведь у него диагностировали шизофрению еще на внутриутробной стадии. Книга продавалась не особо хорошо. В мире оказалось не так уж много запредельно больных людей, готовых ее купить. Уже 2 месяца у АНДРЕЯ почти не было денег и он ел блюдо собственного изобретения - ТУАЛЕТНАЯ БУМАГА ПО ФЛОТСКИ. Блюдо представляло собой собачий корм с вареной туалетной бумагой. Роялти с продаж книги капали ему на банковский счет, но очень вяло. АНДРЕЙ уже отошел от третьей лоботомии и решил взять дело в свои руки. Он положил в сумку с десяток экземпляров MODERN C++ DESIGN и пошел на улицу, с надеждой продать хотя бы несколько. Хотя бы один. Если это удастся, то наконец можно будет купить КЕТЧУП. Подумав о КЕТЧУПЕ, АНДРЕЙ улыбнулся, но повернувшись, чтобы открыть дверь, увидел свое отражение в зеркале. Выражение лица, которое получилось из за улыбки, было настолько ужасающим, что АНДРЕЙ отшатнулся. Он вышел на улицу и стал бродить по улицам. АНДРЕЙ увидел здание, в котором было множество компаний по разработке программ и направился к нему. Там АНДРЕЯ уже знали и вызвали охрану раньше, чем он успел войти. АНДРЕЙ удивился, потому что он никогда не был здесь. Из здания вышел человек и сказал АНДРЕЮ, чтобы он убирался. Человек объяснил, что однажды, один из программистов, работавших в здании, купил себе MODERN C++ DESIGN и принес на работу. Прочитав 5 страниц, этот человек обезумел и успел убить трех коллег, до того как натолкал себе в жопу скрепок и повесился в полностью пустом помещении. После этого, запятнанную кровью книгу, подобрал другой разработчик и цепь событий повторилась. Как вирус, книга распространялась по всему зданию. В результате этой бойни, 30 человек погибли ужасными смертями, перед тем, как кто-то сообразил, что нужно уничтожить книгу. АНДРЕЙ понял, почему его не хотят пускать, но решил попытать судьбу и все-же проникнуть в здание. С раззадоренным еблом, он попытался пробежать в дверь, но охранник ударил его дубиной по еблу, выбив несколько зубов, после чего добил по яйцам, пнув достаточно много раз, чтобы наблюдающие сбились со счета. АНДРЕЙ сполз с крыльца и потерял сознание.
Очнулся он уже под вечер. Первый опыт продажи был не очень удачен, но может во второй раз повезет? АНДРЕЙ шел по улице, страстно разговаривая сам с собой и вдруг увидел двух человек. Подсознательно он узнал их, но не мог вспомнить. Трясясь от страха он подошел к ним и предложил купить книгу. ПОЛ ГРЭМ и ПИТЕР НОРВИГ взяли его книгу и стали листать. Они поняли, с кем они имеют дело. АНДРЕЙ смотрел куда-то в сторону и незаметил первого удара, который пришелся по голове. АНДРЕЙ даже в начале не понял, что происходит, потому что били его как никогда сильно. Удары сыпались со всех сторон и, услышав хруст своих ребер, АНДРЕЙ осознал, что вероятно, живым ему не уйти. Это осознание ввергло его в истерику, но он ничего не мог поделать, кроме того, как обосраться и изваляться в собственном говне. Увидев это ПОЛ ГРЭМ и ПИТЕР НОРВИГ побрезговали добивать жалкого РУМЫНСКОГО барана и оставили его в покое. Грязно выругавшись, АНДРЕЙ поднялся и пошел по улице. Завернув за угол, он увидел СТРАУСТРУПА, стоящего на одном месте и напряженно о чем-то думающего. АНДРЕЙ осмотрелся, но не обнаружив потенциальных покупателей, развернулся и пошел домой, насвистывая РУМЫНСКУЮ НАРОДНУЮ ПЕСНЮ.
СТЕПАНОВ
Править ShortUrl Внутренняя ссылка
Жил-был СТЕПАНОВ. СТЕПАНОВ был ШУТНИКОМ. Такова была его природа. Очень любил ШУТИТЬ. В отличии от СТРАУСТРУПА и АЛЕКСАНДРЕСКУ, СТЕПАНОВ был психически здоров, и, естественно, ненавидел C++ всем сердцем. Однажды СТЕПАНОВ ПОШУТИЛ очень крепко. Он упоролся чем-то очень серьезным и написал STL. Вещь получилась комично абсурдная. СТЕПАНОВ провел много времени смеясь над тем, какое-же убогое и тупое говно - язык C++ и рассматривал STL исключительно как гротескную шутку. СТЕПАНОВ уже успел забыть про STL, но вдруг его вызвали на заседание Коммитета Стандартизации. После того как СТЕПАНОВ вышел с заседания, он начал ржать как умалишенный. "Эти уебки...", думал СТЕПАНОВ, сотрясаясь от смеха, "...приняли STL и включили ее в стандарт, мать моя женщина". Он не мог остановиться и повалился на пол. Смех его не отпустил и на полу. Звучание его смеха из обычного человеческого, превратились в какую-то неземную смесь звуков карканья вороны, со звуками блюющего носорога. Из за смеха у СТЕПАНОВА началась аритмия и пришлось вызвать врача. Вернувшись домой, СТЕПАНОВ уже не смеялся, после того, как он представил себе последствия своей ШУТКИ. СТЕПАНОВ понял, что живые люди будут писать код на STL. А вдруг кто-то вдохновится примером STL и придумает что-то еще более идиотское? СТЕПАНОВ прекрасно знал, что STL является ШУТКОЙ, но ведь могут быть больные люди, которые воспримут все это всерьез... СТЕПАНОВ не знал, что делать. Но будучи ШУТНИКОМ, он решил отвлечься и исполнить свой классический номер: ПОСТУЧАТЬ-В-ДВЕРЬ-СТРАУСТРУПА-И-УБЕЖАТЬ. СТЕПАНОВ хихикал, уже при одной мысли о такой СМЕХОТЕ, потому что СТРАУСТРУП, как безмозглый баран, каждый раз велся. Он направился к дому СТРАУСТРУПА и спрятался за кустом. Вокруг никого не было и он уже было решился подойти и постучать, но увидел как ЛЯМБДА приближается к дому. СТЕПАНОВ любил ЛЯМБДУ. Они много раз вместе пили и были хорошими друзьями. Но СТЕПАНОВ не хотел портить свою ШУТКУ и не выдал своего местонахождения. К его удивлению ЛЯМБДА подлетела к двери дома, постучала и быстро спряталась под крыльцо. Увидев это, СТЕПАНОВ немного расстроился, что ЛЯМБДА украла у него фирменный трюк. Но потом вспомнил, что ЛЯМБДА предупреждала его, что собирается так поступить, чтобы отомстить за включение ЛЯМБДЫ в СТАНДАРТ. СТЕПАНОВ вылез из кустов и пошел домой. У него было очень мрачное настроение. Он знал, что СТРАУСТРУП творит зло, но пока не решался ничего с этим поделать. "По крайней мере этот выблядок АЛЕКСАНДРЕСКУ в психушке", думал СТЕПАНОВ. Он чувствовал, что после включения STL в СТАНДАРТ , нужно было принимать какие-то меры. Ему требовалась последняя капля... Вдруг он увидел своих друзей ПОЛА ГРЭМА и ПИТЕРА НОРВИГА. Все трое отошли в сторону и начали оживленно разговаривать, осматриваясь по сторонам. Они обменялись новостями. СТЕПАНОВ теперь знал, что АЛЕКСАНДРЕСКУ вышел из психушки, а ГРЭМ с НОРВИГОМ знали, что STL вошла в СТАНДАРТ. Они давно знали, что такое время настанет и решили пойти на самые крайние меры...
СТРАУСТРУП запостил историю на ДВАЧ и залез на мамочку. Он до сих пор не понял, что мамы уже давно нет в живых. Единственное, что он заметил - от мамы как-то странно стало пахнуть, но его это только возбуждало. К тому же мамочка стала в последние 3 дня страстно стонать, когда он особенно яростно ее трахал. Он не понимал, что эти "стоны" являются ничем иным, как газами гниения, со звуком выходящими из различных отверстий, под его напором. СТРАУТРУП почувстовал удар по голове и потерял сознание.
АЛЕКСАНДРЕСКУ, избитый и измазанный в говне, уже подходил к своему дому. Вдруг трое человек в масках схватили его. Последнее что он видел - марля пропитанная хлороформом приближалающаяся к его лицу. Затем темнота.
СТРАУСТРУП и АЛЕКСАНДРЕСКУ очнулись в темном, сыром подвале. СТЕПАНОВ заметил это и включил свет. НОРВИГ подошел к ним и снял картофельные мешки с их голов. СТРАУСТРУП и АЛЕКСАНДРЕСКУ все поняли. Осознание неминуемого конца пришло моментально. Между СТЕПАНОВЫМ и ГРЭМОМ произошел небольшой диалог:
- Выводи урода.
- Урод спит.
- Ну дак разбуди его.
ГРЭМ подошел к двери и открыл ее. За дверью было пространство метр на метр и лежал человек в кожаном костюме и маске. ГРЭМ небрежно пнул человека. Он очнулся и попросил воды. "Ну на, попей", издевательски сказал ГРЭМ, мочась ему на лицо. СТЕПАНОВ пинками выгнал человека на середину комнаты и дал в руки лопату. СТЕПАНОВ сказал : "Копай, сука." Человек начал копать яму. Прошло 10 минут и яма на одно тело была готова. СТЕПАНОВ достал крупнокалиберный магнум и наставил на человека. СТЕПАНОВ велел ГРЭМУ снять с человека кожаную маску. ГРЭМ снял маску. СТРАУСТРУП и АЛЕКСАНДРЕСКУ громко вдохнули от страха. Они знали этого человека. СТЕПАНОВ прицелился человеку в голову и выстрелил. Мозги разлетелись по всему полу и безжизненное тело упало в яму. СТЕПАНОВ смотрел на все это с улыбкой настоящего ШУТНИКА. Затем, он посмотрел на НОРВИГА и ГРЭМА и сказал:
"Закопайте САТТЕРА, а я кончу этих двух выблядков".
НОРВИГ и ГРЭМ взялись за работу, а СТЕПАНОВ, походкой Мэдсена из Бешеных Псов, подошел к СТРАУСТРУПУ и АЛЕКСАНДРЕСКУ. Они оба смотрели в пол и так и не издали не звука. СТЕПАНОВ достал КАТАНУ и с тщанием автора STL, зарубил обоих.
СТЕПАНОВ, НОРВИГ и ГРЭМ немного постояли над телами.
СТЕПАНОВ прервал молчание и сказал, чтобы трупы скормили свиньям. СТЕПАНОВ поднялся по лестнице на первый этаж дома и продолжил писать DSL на COMMON LISP.
Вложения
Грабли.docx
(22.49 КБ) 209 скачиваний
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#2 dyvniy » Вт, 20 мая 2014, 15:08:32

C++11
https://wiki.apache.org/stdcxx/C 0xCompilerSupport

Паттерны проектирования
http://cpp-reference.ru/

Добавлено спустя 19 минут 32 секунды:
Паттерны для игр)) Онлайн книжка
http://gameprogrammingpatterns.com/

Добавлено спустя 1 минуту 18 секунд:
что делать, чтобы своя любимая поделка не превратилась во Франкенштейна и дошла до вменяемого состояния
http://habrahabr.ru/post/197920/

umletino
http://www.umletino.com/
легенда UML
http://programador.ru/uml-class-diagram-relation/
Вложения
legend.png
legend.png (12.59 КБ) 1381 просмотр
quixplorer_2_2.zip
Для загрузки файлов на ftp
(89.77 КБ) 116 скачиваний
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#3 dyvniy » Чт, 29 мая 2014, 15:28:37

Характеристики языков, использующихся на GitHab
http://githut.info/
Спойлер
скаут уиллис протест
Изображение
Изображение
Спойлер
https://twitter.com/search?q=#FreeTheNipple&src=hash
https://twitter.com/freethenipple
Изображение
Изображение
Спойлер
Изображение
http://www.kindgirls.com/girls/lukki-lima/1157
Изображение

qwdfg
qwdfg

ashd

#4 qwdfg » Сб, 14 июня 2014, 16:10:06

Спойлер
phpBB [media] link

Олимпиады
http://www.problems.ru/view_by_source_new.php?parent=210846&start=5

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#5 dyvniy » Чт, 19 июня 2014, 11:56:28

Программирование как искусство
http://habrahabr.ru/post/120763/
Спойлер
Олимпиадное программирование как искусство из песочницы
Спортивное программирование*
«В наше время считается общепризнанным,
что из всего, так или иначе касающегося искусства,
ничто более не может считаться общепризнаным»
Теодор Адорно

Все началось с того, как один человек пытался выяснить решение задачи контеста, который проходил в данный момент. Задача была очень простая, всем было очевидно, что этот человек не займет хорошего места, не получит футболку и т.п. Но тем не менее ни один из 5000+ членов сообщества не дал ни одной подсказки (ну или хотя бы из 30+ человек, которые это видели и знали ответ). Мне такой результат уже давно кажется закономерным и я попробовал объяснить его в двух словах. Теперь попробую чуть более подробно. Заранее прошу прощения у людей, которые в это понятие вкладывают не то, что я. Я лишь хотел изложить свой взгляд.

Сначала немного теории из википедии: Программирование, Олимпиады по программированию, Искусство. Обратите внимание, в последней статье указано «Понятие искусства крайне широко — оно может проявляться как чрезвычайно развитое мастерство в какой-то определённой области».

Мне всегда казалось, что программирование, это своего рода искусство. Вот есть узкая область — класс олимпиадных задач по программированию. Умение быстро и точно решать задачи схоже со спортом, и часто олимпиадное программирование называют спортивным, ведь здесь, как и в спорте, сначала несколько лет тренируешься, потом один раз выступаешь, сливаешь все нафиг и забиваешь на программирование достигаешь некоторых результатов и радуешься им. Но с другой стороны спорт — не сильно творческое занятие. Обычно стратегии составляются не главными участниками и они не блещут оригинальностью и красотой. А в программировании все не так.

Никто не будет спорить, что стихи — искусство. А ведь, что такое стихи? Стихи — это умение вкладывать свои мысли в четкие рамки ритма и рифмы, стиля и словарного набора. Есть множество ограничений, которые не дают просто излагать то, что ты хочешь. Зачем же они? Это добавляет стиху красоты и изящества, это показывает, что автор вложил усилия, чтобы выразить свои мысли таким образом, соответственно, эти мысли были тщательно обдуманы автором, обточены и получили материальную форму в виде стиха. Кроме того, язык мыслей сильно отличается практически от всех языков мира, будь это язык слов, язык изображений, язык звуков или язык архитектуры.

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

Вот вы видите доску в городском доме творчества. На доске сверху ровными буквами написано «Выставка детских рисунков», а под надписью уже не столь ровно изображены различные эпизоды из детского быта. Попробуйте ответить — это искусство? Мой ответ — да, безусловно. Эти дети нашли свой способ общаться с миром, показывать ему свои мысли. Пусть они весьма примитивны и грубо изображены (хотя, бывает по-разному, некоторые дети способны на шедевры, которые и не снились взрослым художникам), но это искусство. Возможно, когда нибудь, один из этих детей будет писать легендарные картины, и люди со всего света будут приезжать, чтобы посмотреть на них. Все начинается с малого.

Я бы хотел, чтобы сайты вроде Topcoder или Codeforces были своего рода клубами искусства программирования(как, например, будетляне), в которых люди общаются, делятся секретами, творят вместе, помогают новичкам, но никогда не будут выдавать чужие мысли за свои.

Онлайн компиляция (online compile)
http://ideone.com/
Изображение

dyvniy M
Автор темы, Администратор
Администратор
Аватара
dyvniy M
Автор темы, Администратор
Администратор
Возраст: 41
Репутация: 1
Лояльность: 1
Сообщения: 3579
Зарегистрирован: Ср, 10 октября 2012
С нами: 11 лет 5 месяцев
Профессия: Программист
Откуда: Россия, Москва
ICQ Сайт Skype ВКонтакте

#6 dyvniy » Пт, 4 июля 2014, 12:30:24

Книжки по Java
http://ru-code-android.livejournal.com/6134.html

Как писать неподдерживаемый код?
https://learn.javascript.ru/write-unmain-code
Спойлер
Как писать неподдерживаемый код?
Познай свой код
Эта статья представляет собой мой вольный перевод How To Write Unmaintainable Code («как писать неподдерживаемый код») с дополнениями, актуальными для JavaScript.
Возможно, в каких-то из этих советов вам даже удастся узнать «этого парня в зеркале».

Предлагаю вашему вниманию советы мастеров древности, следование которым создаст дополнительные рабочие места для JavaScript-разработчиков.

Если вы будете им следовать, то ваш код будет так сложен в поддержке, что у JavaScript'еров, которые придут после вас, даже простейшее изменение займет годы оплачиваемого труда! А сложные задачи оплачиваются хорошо, так что они, определённо, скажут вам «Спасибо».

Более того, внимательно следуя этим правилам, вы сохраните и своё рабочее место, так как все будут бояться вашего кода и бежать от него…

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

Явно кривой код может написать любой дурак. Это заметят, и вас уволят, а код будет переписан с нуля. Вы не можете такого допустить. Эти советы учитывают такую возможность. Да здравствует дзен.

Соглашения — по настроению

Рабочий-чистильщик осматривает дом:
"…Вот только жук у вас необычный…
И чтобы с ним справиться, я должен жить как жук, стать жуком, думать как жук."
(грызёт стол Симпсонов)
Сериал «Симпсоны», серия Helter Shelter
Чтобы помешать другому программисту исправить ваш код, вы должны понять путь его мыслей.

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

Он рассматривает ваш код как бы через трубочку из туалетной бумаги. Это не даёт ему общей картины, он ищет тот небольшой фрагмент, который ему необходимо изменить. По крайней мере, он надеется, что этот фрагмент будет небольшим.

На что он попытается опереться в этом поиске — так это на соглашения, принятые в программировании, об именах переменных, названиях функций и методов…

Как затруднить задачу? Можно везде нарушать соглашения — это помешает ему, но такое могут заметить, и код будет переписан. Как поступил бы ниндзя на вашем месте?

…Правильно! Следуйте соглашениям «в общем», но иногда — нарушайте их.

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

Пример из jQuery

jQuery / DOM
Этот пример требует знаний jQuery/DOM, если пока их у вас нет — пропустите его, ничего страшного, но обязательно вернитесь к нему позже. Подобное стоит многих часов отладки.
Во фреймворке jQuery есть метод wrap, который обёртывает один элемент вокруг другого:

var img = $('<img/>'); // создали новые элементы (jQuery-синтаксис)
var div = $('<div/>'); // и поместили в переменную

img.wrap(div); // обернуть img в div
div.append('<span/>');
Результат кода после операции wrap — два элемента, один вложен в другой:

<div>
<img/>
</div>
А что же после append?

Можно предположить, что <span/> добавится в конец div, сразу после img… Но ничего подобного!

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

Как правило, методы jQuery работают с теми элементами, которые им переданы. Но не здесь!

Внутри вызова img.wrap(div) происходит клонирование div и вокруг img оборачивается не сам div, а его клон. При этом исходная переменная div не меняется, в ней как был пустой div, так и остался.

В итоге, после вызова получается два независимых div'а: первый содержит img (этот неявный клон никуда не присвоен), а второй — наш span.

Объяснения не очень понятны? Написано что-то странное? Это просто разум, привыкший, что соглашения уважаются, не допускает мысли, что вызов wrap — неявно клонирует элемент. Ведь другие jQuery-методы, кроме clone этого не делают.

Как говорил Учитель: «В древности люди учились для того, чтобы совершенствовать себя. Нынче учатся для того, чтобы удивить других».

Краткость — сестра таланта!

Пишите «как короче», а не как понятнее. «Меньше букв» — уважительная причина для нарушения любых соглашений.

Ваш верный помощник — возможности языка, использованные неочевидным образом.

Обратите внимание на оператор вопросительный знак '?', например:

// код из jQuery
i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
Разработчик, встретивший эту строку и попытавшийся понять, чему же всё-таки равно i, скорее всего придёт к вам за разъяснениями. Смело скажите ему, что короче — это всегда лучше. Посвятите и его в пути ниндзя. Не забудьте вручить Дао дэ цзин.

Именование

Существенную часть науки о создании неподдерживаемого кода занимает искусство выбора имён.

Однобуквенные переменные

Называйте переменные коротко: a, b или c.

В этом случае никто не сможет найти её, используя фунцию «Поиск» текстового редактора.

Более того, даже найдя — никто не сможет «расшифровать» её и догадаться, что она означает.

Не используйте i для цикла

В тех местах, где однобуквенные переменные общеприняты, например, в счетчике цикла — ни в коем случае не используйте стандартные названия i, j, k. Где угодно, только не здесь!

Остановите свой взыскательный взгляд на чём-нибудь более экзотическом. Например, x или y.

Эффективность этого подхода особенно заметна, если тело цикла занимает одну-две страницы (чем длиннее — тем лучше).

В этом случае заметить, что переменная — счетчик цикла, без пролистывания вверх, невозможно.

Русские слова и сокращения

Если вам приходится использовать длинные, понятные имена переменных — что поделать.. Но и здесь есть простор для творчества!

Назовите переменные «калькой» с русского языка или как-то «улучшите» английское слово.

В одном месте напишите var ssilka, в другом var ssylka, в третьем var link, в четвёртом — var lnk… Это действительно великолепно работает и очень креативно!

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

Будьте абстрактны при выборе имени

Лучший кувшин лепят всю жизнь.
Высокая музыка неподвластна слуху.
Великий образ не имеет формы.
Лао-цзы
При выборе имени старайтесь применить максимально абстрактное слово, например obj, data, value, item, elem и т.п.

Идеальное имя для переменной: data. Используйте это имя везде, где можно. В конце концов, каждая переменная содержит данные, не правда ли?
Но что делать, если имя data уже занято? Попробуйте value, оно не менее универсально. Ведь каждая переменная содержит значение.

Занято и это? Есть и другой вариант.

Называйте переменную по типу данных, которые она хранит: obj, num, arr…
Насколько это усложнит разработку? Как ни странно, намного!

Казалось бы, название переменной содержит информацию, говорит о том, что в переменной — число, объект или массив… С другой стороны, когда непосвящённый будет разбирать этот код — он с удивлением обнаружит, что информации нет!

Ведь как раз тип легко понять, запустив отладчик и посмотрев, что внутри. Но в чём смысл этой переменной? Что за массив/объект/число в ней хранится? Без долгой медитации над кодом тут не обойтись!

Что делать, если и эти имена кончились? Просто добавьте цифру: item1, item2, elem5, data1…
Похожие имена

Только истинно внимательный программист достоин понять ваш код. Но как проверить, достоин ли читающий?

Один из способов — использовать похожие имена переменных, например data и date. Бегло прочитать такой код почти невозможно. А уж заметить опечатку и поправить её… Ммммм… Мы здесь надолго, время попить чайку.

А.К.Р.О.Н.И.М

Используйте сокращения, чтобы сделать код короче.

Например ie (Inner Element), mc (Money Counter) и другие. Если вы обнаружите, что путаетесь в них сами — героически страдайте, но не переписывайте код. Вы знали, на что шли.

Хитрые синонимы

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

Например, если метод показывает что-то на экране — начните его название с display.. (скажем, displayElement), а в другом месте объявите аналогичный метод как show.. (showFrame).

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

По возможности, договоритесь с членами своей команды. Если Вася в своих классах использует display.., то Валера — обязательно render.., а Петя — paint...

…И напротив, если есть две функции с важными отличиями — используйте одно и то же слово для их описания! Например, с print... можно начать метод печати на принтере printPage, а также — метод добавления текста на страницу printText.

А теперь, пусть читающий код думает: «Куда же выводит сообщение printMessage?». Особый шик — добавить элемент неожиданности. Пусть printMessage выводит не туда, куда все, а в новое окно!

Словарь терминов — это еда!

Ни в коем случае не поддавайтесь требованиям написать словарь терминов для проекта. Если же он уже есть — не следуйте ему, а лучше проглотите и скажите, что так и былО!

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

Для обозначения посетителя в одном месте используйте user, а в другом visitor, в третьем — просто u. Выбирайте одно имя или другое, в зависимости от функции и настроения.

Это воплотит сразу два ключевых принципа ниндзя-дизайна — сокрытие информации и подмена понятий!

Повторно используйте имена

По возможности, повторно используйте имена переменных, функций и свойств. Просто записывайте в них новые значения.

Добавляйте новое имя только если это абсолютно необходимо.

В функции старайтесь обойтись только теми переменными, которые были переданы как параметры.

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

Цель — максимально усложнить отладку и заставить читающего код программиста построчно анализировать код и конспектировать изменения переменных для каждой ветки исполнения.

Продвинутый вариант этого подхода — незаметно (!) подменить переменную на нечто похожее, например:

function ninjaFunction(elem) {
// 20 строк кода, работающего с elem

elem = elem.cloneNode(true);

// еще 20 строк кода, работающего с elem
}
Программист, пожелавший добавить действия с elem во вторую часть функции, будет удивлён. Лишь во время отладки, посмотрев весь код, он с удивлением обнаружит, что оказывается имел дело с клоном!

Регулярные встречи с этим приемом на практике говорят: защититься невозможно. Эффективно даже против опытного ниндзи.

Добавляйте подчеркивания

Добавляйте подчеркивания _ и __ к именам переменных. Желательно, чтобы их смысл был известен только вам, а лучше — вообще без явной причины.

Этим вы достигните двух целей. Во-первых, код станет длиннее и менее читаемым, а во-вторых, другой программист будет долго искать смысл в подчёркиваниях. Особенно хорошо сработает и внесет сумятицу в его мысли, если в некоторых частях проекта подчеркивания будут, а в некоторых — нет.

В процессе развития кода вы, скорее всего, будете путаться и смешивать стили: добавлять имена с подчеркиваниями там, где обычно подчеркиваний нет, и наоборот. Это нормально и полностью соответствует третьей цели — увеличить количество ошибок при внесении исправлений.

Покажите вашу любовь к разработке

Пусть все видят, какими замечательными сущностями вы оперируете! Имена superElement, megaFrame и niceItem при благоприятном положении звёзд могут привести к просветлению читающего.

Действительно, с одной стороны, кое-что написано: super.., mega.., nice.. С другой — это не несёт никакой конкретики. Читающий может решить поискать в этом глубинный смысл и замедитировать на часок-другой оплаченного рабочего времени.

Перекрывайте внешние переменные

Находясь на свету, нельзя ничего увидеть в темноте.
Пребывая же в темноте, увидишь все, что находится на свету.
Гуань Инь-цзы
Почему бы не использовать одинаковые переменные внутри и снаружи функции? Это просто и не требует придумывать новых имён.




var user = authenticateUser();

function render() {
var user = anotherValue();
...
...многобукв...
...
... // <-- программист захочет внести исправления сюда, и..
...
}
Зашедший в середину метода render программист, скорее всего, не заметит, что переменная user локально перекрыта и попытается работать с ней, полагая, что это результат authenticateUser()… Ловушка захлопнулась! Здравствуй, отладчик.

Мощные функции!

Не ограничивайте действия функции тем, что написано в её названии. Будьте шире.

Например, функция validateEmail(email) может, кроме проверки e-mail на правильность, выводить сообщение об ошибке и просить заново ввести e-mail.

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

Главное — они должны быть неочевидны из названия функции. Истинный ниндзя-девелопер сделает так, что они будут неочевидны и из кода тоже.

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

Представьте, что другому разработчику нужно только проверить адрес, а сообщение — не выводить. Ваша функция validateEmail(email), которая делает и то и другое, ему не подойдёт. Работодатель будет вынужден оплатить создание новой.

Внимание.. Сюр-при-из!

Есть функции, название которых говорит о том, что они ничего не меняют. Например, isReady, checkPermission, findTags… Предполагается, что при вызове они произведут некие вычисления, или найдут и возвратят полезные данные, но при этом их не изменят. В трактатах это называется «отсутствие сторонних эффектов».

По-настоящему красивый приём — делать в таких функциях что-нибудь полезное, заодно с процессом проверки. Что именно — совершенно неважно.

Удивление и ошеломление, которое возникнет у вашего коллеги, когда он увидит, что функция с названием на is.., check.. или find... что-то меняет — несомненно, расширит его границы разумного!

Ещё одна вариация такого подхода — возвращать нестандартное значение.

Ведь общеизвестно, что is.. и check.. обычно возвращают true/false. Продемонстрируйте оригинальное мышление. Пусть вызов checkPermission возвращает не результат true/false, а объект с результатами проверки! А чего, полезно.

Те же разработчики, кто попытается написать проверку if (checkPermission(..)), будут весьма удивлены результатом. Ответьте им: «надо читать документацию!». И перешлите эту статью.

Заключение

Все советы выше пришли из реального кода… И в том числе от разработчиков с большим опытом.

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

Следуйте нескольким из них — и ваш код станет полон сюрпризов.
Следуйте многим — и ваш код станет истинно вашим, никто не захочет изменять его.
Следуйте всем — и ваш код станет ценным уроком для молодых разработчиков, ищущих просветления.
Спойлер
Robot_x • 20 дней назад
Вот уж не знал, что Евгений Ваганович изучает JScript )))
• Ответить•Поделиться ›
Аватар
Doc • месяц назад
Это все мне напомнило 3 часть Гарри Поттера, когда они в самом начале стали изучать защиту от темных сил всего на 3 курсе, хотя это вызвало волну недовольствия и они говорили что это слишком рано.
• Ответить•Поделиться ›
Аватар
Daniyar Kassymov Doc • месяц назад
улыбнуло :)
• Ответить•Поделиться ›
Аватар
Daniyar Kassymov • месяц назад
По моему, рановато такая статья в этом учебнике, это ведь учебник для новичков тоже, вроде, а не для того чтобы уже учиться писать свой стиль программирования... Когда полностью освою js,заново вернусь сюда.
• Ответить•Поделиться ›
Аватар
Doc Daniyar Kassymov • месяц назад
Согласен.
• Ответить•Поделиться ›
Аватар
Сергей Кунак • месяц назад
Открыв свой код через месяц, вы с удивлением воскликнете:"Где этот урод, который писал такое г-но".
• Ответить•Поделиться ›
Аватар
Gerrant • 2 месяца назад
Может какому-нибудь ниндзе пригодится. Два куска кода ниже на первый взгляд должны вести себя одинаково, но это не совсем так...

if (i === undefined) {
i = 1;
j = 1;
n = n -2;
}

i = (i !== undefined) ? i : n -= 2, j = 1, 1;

во втором случае операции n -= 2 и j = 1 выполняются всегда.
• Ответить•Поделиться ›
Аватар
Gerrant Gerrant • 2 месяца назад
Cам написал и сам себя поправлю.
Во втором блоке кода всегда, вне зависимости от условия, будут выполняться функции стоящие после первой запятой, а именно: j = 1, 1.

Функция n -= 2 будет выполняться только тогда когда i === undefined. При этом в i будет присвоено значение которое содержится в n, а вовсе не 1 которая является последним из выражений разделенных запятой.

В общем строку i = (i !== undefined) ? i : n -= 2, j = 1, 1; нужно читать как
i = (i !== undefined) ? i : n -= 2;
j = 1, 1;
1 • Ответить•Поделиться ›
Аватар
Guest Gerrant • 2 месяца назад
тернарный оператор для заданного условного:

i = (i === undefined) ? (n -=2, j = 1, 1) : i;
• Ответить•Поделиться ›
Аватар
Гость • 4 месяца назад
Еще когда учился в университете ВСЕ преподаватели проверяли мой код (неважно на каком языке) в три раза дольше чем у других, а код при этом исправно работал и успешно модифицировался мною. Может написать книгу с примерами и жить на продажи?
• Ответить•Поделиться ›
Аватар
Лалка Гость • 4 месяца назад
Они кагбэ намекали что ты говно кодишь:D
• Ответить•Поделиться ›
Аватар
Guest Гость • 4 месяца назад
Цукерберг позвонит. Держите нас в курсе.
1 • Ответить•Поделиться ›
Аватар
Андрей • 4 месяца назад
Лучше написать "как правильно надо", а не как "Не надо"... вбивается в голову..
2 • Ответить•Поделиться ›
Аватар
Виталий • 4 месяца назад
Рановато вставлена эта статья в учебнике...
7 • Ответить•Поделиться ›
Аватар
qwas1c • 5 месяцев назад
"В одном месте напишите var ssilka, в другом var ssylka, в третьем var link, в четвёртом —var lnk… Это действительно великолепно работает и очень креативно!"

---
:D классная статья, спасибо.
• Ответить•Поделиться ›
Аватар
Guest • 5 месяцев назад
Вредные советы, подражание Остеру.
Советам 3 (транслит)
и 12 (одинаковые имена для локальных и глобальных переменных)
не следовать очень сложно, даже сам автор кое-где у нас порой...
voprosnik-po-preobrazovaniyam-dlya-primitivov
объект счётчика + функция
• Ответить•Поделиться ›
Аватар
Саня • 5 месяцев назад
Отличная статья) Оценил всем сердцем))) аха :D
4 • Ответить•Поделиться ›
Аватар
IAROSLAV ANTROPOV • 6 месяцев назад
Статья зачитаешься... Беллетристика программиста, в хорошем смысле.
1 • Ответить•Поделиться ›
Аватар
Beshot • 6 месяцев назад
Как я понимаю автора, работая в небольшой конторке, сколько раз приходилось (постоянно) сталкиваться с подобным же творчеством в более простом деле - набрать грамотно документ в Word у нас не могут, центрирование? нет, не слышал, я просто сдвинул пробелами; списки? что это?!, пронумерую руками и т.д. и т.п.
Так хочется не разбираться в таком коде, а найти автора, прострелить ему колени, через полчаса запястья и потом добить контрольным. А вообще читал - наслаждался.
3 • Ответить•Поделиться ›
Аватар
Сергей • 6 месяцев назад
Да это сущая правда, ни где ещё не видел лучшего пособия по таким качественным правилам оформления, буду всецело им пользоваться и наставлять других на путь истинных. Да будет всем Лао Цзы!
1 • Ответить•Поделиться ›
Аватар
kapsh • 8 месяцев назад
Самая полезная глава!
3 • Ответить•Поделиться ›
Аватар
Guest kapsh • 6 месяцев назад
хорошая шутеечка братан)
16 • Ответить•Поделиться ›
Аватар
Олег • 8 месяцев назад
Замечательные "вредные советы", но введение сбивает с толку. Когда читал все по порядку и дошел до этой статьи, то не с первых строчек понял, что это ирония. На мой взгляд, стоит переписать введение. Возможно просто устал и не прочувствовал юмор введения.
2 • Ответить•Поделиться ›
Аватар
Павел Ковалев • 8 месяцев назад
Я так понимаю, написанное здесь - ирония? а то Я чувак серьезный, читаю серьезную работу серьезных людей, и могу принять за правду)
1 • Ответить•Поделиться ›
Аватар
Антон • 8 месяцев назад
Забавно :))
• Ответить•Поделиться ›
Аватар
cthutq58 • 8 месяцев назад
А "Как писать вредный код? -2" или "Ненаглядное пособие по кодописанию" ожидается?:)))
• Ответить•Поделиться ›
Аватар
Руслан • 8 месяцев назад
да да, вот только вчера просветлился - после двух дневной медитации:)))
• Ответить•Поделиться ›
Аватар
Евгений Журавлёв • 9 месяцев назад
да ладно, статья полна искромётного юмора и тонкой иронии.
не хочу просветления ТАКИМ путём. можно без медитаций над кодом?..
• Ответить•Поделиться ›
Аватар
Dima.Valuev • 10 месяцев назад
Не смешно, занудство. Это обычное дело, у чувака выгорание.
• Ответить•Поделиться ›
Аватар
Меф • год назад
Прочитал. Мало, что понял. Общая мысль понятна с первой строки, но отдельные эпизоды вымораживают мозг напрочь, тем более что jQuery мы ещё не проходили. Ладно, пойду читать Дао дэ Цзин.
1 • Ответить•Поделиться ›
Аватар
Стас • год назад
Краткость - на 0 делить нельзя!!!
• Ответить•Поделиться ›
Аватар
ffgravity • год назад
Статья смешная. До того момента когда понимаешь, что придется встретится с таким кодом лично.
5 • Ответить•Поделиться ›
Аватар
Art ffgravity • 10 месяцев назад
Скажу больше... на неделе пришлось править несколько js библиотек в проекте... и после прочтения этой статьи возникает поток мата) от понимания, что чел, который писал эти библиотеки, как раз таки пользовался всякими такими хитростями)
3 • Ответить•Поделиться ›
Аватар
Akmal • год назад
Жаль, что статья закончилась )
• Ответить•Поделиться ›
Аватар
Sergey Shchurko • год назад
очень надеюсь, что это сарказм... ибо не хотелось бы на такой код нарваться и уж точно писать его самому)
1 • Ответить•Поделиться ›
Аватар
Евгений Оленичев • год назад
"Вредные советы" для программера :)...
5 • Ответить•Поделиться ›
Аватар
Илья • год назад
А я делаю так: когда доходит до вычислений, я проводу эти вычисления через сложные математические алгоритмы, с переменными x,a,b,z,t и тд)) попробуйте прочитать мои ii крестиков-ноликов))в 2 рекурсивные функции на пайтоне) которые я укладывал через l-system
• Ответить•Поделиться ›
Аватар
Николай • год назад
У меня есть коллега, приличный программист, даже два программиста. Первый в одну строчку обычно пишет Var x, y : real; begin showmessage('Вчера мне шеф дал задание!');
try some code here finally end end; И таким макаром у него написаны сотни тысяч кода.
Без его присутствия в его коде разобраться нельзя. Но сам он очень в нем хорошо ориентируется. У него может встретить такое X.add('что это такое'), попробуй понять, что такое X.
Другой (уже не коллега, но вместе работали) имел привычку сверхструктурирования. У него можно было увидеть функцию X(a : real) : integer, а потом долго шагать по программе внутрь, и на самом последнем шаге увидеть Result := 25; Обычно части внутренности бывали разбросаны по разным модулям. Первый мой коллега раздражался от такого структурирования, и вообще они предпочитали не иметь дела с кодами друг друга.
8 • Ответить•Поделиться ›
Аватар
IvanB • год назад
Теперь понимаю ЗА ЧТО меня вчера чуть не убили более опытные коллеги :-)
• Ответить•Поделиться ›
Аватар
Mary • год назад
Posmejalas' ot dushi :-) - spasibo :-)
• Ответить•Поделиться ›
Аватар
Stunner • год назад
Отличная статья! И вообще респект Илье Кантору: лучший ресурс по JS в рунете, без вариантов.

Но я не совсем согласен с примером из первой главы о нарушении соглашений.

Метод .wrap() не «обертывает один элемент вокруг другого», а оборачивает КАЖДЫЙ элемент из набора jQuery, для которого вызван. В примере автора метод вызывается для набора, содержащего один элемент. В общем случае набор может содержать произвольное число элементов, и wrap специально создан для того, чтобы иметь возможность одной строкой завернуть, например, каждую картинку на странице в отдельный div с одним и тем же оформлением. Разумеется, требуется клонирование. Хотите менять обертку после заворачивания? А какую? Вы ж создали одну, а завернули много элементов. Вообще параметром .wrap() и .wrapAll() в нормальной ситуации является некий статичный шаблон, часто – просто строка HTML. Назначьте шаблону css-класс, например, да и меняйте все получившиеся обертки выборкой по этому классу; а вообще для такой ситуации в jQuery полно других средств, более разумных.

В приведенном примере логичней написать img.appentTo(div) и работать с переменной div дальше на здоровье. Ну не для того wrap, даже по имени функции видно. Кстати, .append(), .appendTo(), .insertAfter(), .before() и прочие методы вставки в DOM тоже клонируют элементы, если вызываются набором и/или в качестве параметра получают набор jQuery из более чем одного элемента. Тогда, например, набор, вызвавший метод .appendTo(), вставляется в последний элемент набора-аргумента, остальным же достаются клоны, а что делать?

Вывод: соглашение не в том, что «методы группы DOM insertion не должны клонировать элементы», а в том, что элементы клонируются тогда, когда это наиболее точно соответствует логике работы метода (которая ясна по его названию). Вообще jQuery – блестящий пример соблюдения интуитивно понятных соглашений.
4 • Ответить•Поделиться ›
Аватар
dskakk • год назад
Спасибо, посмеялся. :)
1 • Ответить•Поделиться ›
Аватар
Amhanter • год назад
На первом курсе меня учили не усложнять жизнь себе и другим людям а здесь все наоборот.Ведь на свои грабли сам можешь попастся открыв свой код через несколько лет. АААА - Я в замешательстве. )))
• Ответить•Поделиться ›
Аватар
prapor Amhanter • год назад
А у меня на первом курсе был препод(бывший капитан то-ли ДШБ, то-ли ГРУ, то-ли еще чего-то, в отставке по ранению), так вот, его любимым выражением было - Личный состав не желает думать?!!!
А еще меня учили не судить, не получив всей возможной информации, хотя бы первичной, которую можно получить, просто более внимательно изучив вопрос - например Вот ЭТО(можно просто немножко прокрутить вниз;) ).
А еще в детстве, в книжке "Три мушкетера" была такая фраза - "Не судите опрометчиво, говорит Евангелие и господин кардинал!" :))))
Вывод: Нужно стараться избегать поспешных суждений! :)))
P.S. А-а-а, есть еще русская поговорка - "Поспешишь - людей насмешишь!":)))
P.P.S. Amhanter не обижайся, но просто все как сговорились, воспринимать ироничную статью о "говно-коде", как серьезное руководство к действию. А потом с умным и осуждающим видом качать головой и говорить - "Нет, так писать нельзя!" А эта глава по вашему о чем???! ;)))
• Ответить•Поделиться ›
Аватар
Amhanter prapor • год назад
А эта глава по вашему о чем???! - "Нет, так писать нельзя!". "Не судите " - я где то осужевал? Я не хочу обсуждать зачем я написал "коммент выше" поэтому давайте остановимся на здесь.
• Ответить•Поделиться ›
Аватар
prapor Amhanter • год назад
Возможно, что тогда я Вас неправильно понял. Кстати, "не судить" я писал не в контексте Судить кого-либо, что-либо,...осуждать, а в контексте Судить о чем-либо, выражать мнение. Это разные вещи:)
И если получилось так, что Вы на самом деле прекрасно поняли весь юмористический смыл и ироничность данной статьи, а коммент написали по каким-то своим, особым причинам (должен признаться мне непонятным), то прошу извинить.
В любом случае, коммент для тех, кто всерьез думает, что здесь написано как НАДО писать код.
Еще раз Сорри если ошибся:)
2 • Ответить•Поделиться ›
Аватар
item2 • год назад
какая то паранойя)
1 • Ответить•Поделиться ›
Аватар
Grfit • год назад
Придерживаться такого стиля, хороший способ нажить себе геморой. Если кода строчек 100 - 300, то ладно. Но если это приложение со сложной логикой и там 3 - 5 тысячь строк, то потом сам потеряешься в том, что пишешь.
2 • Ответить•Поделиться ›
Аватар
1 Grfit • год назад
зануда
13 • Ответить•Поделиться ›
Аватар
Жаргал • год назад
От души посмеялся.
Изображение


Название раздела: Программирование (под Desktop и Android)
Описание: Разработка и отладка приложений. Упор на 3D-графику.

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения
:) ;) :hihi: :P :hah: :haha: :angel: :( :st: :_( :cool: 8-| :beee: :ham: :rrr: :grr: :* :secret: :stupid: :music: Ещё смайлики…
   

Вернуться в «Программирование (под Desktop и Android)»

Кто сейчас на форуме (по активности за 15 минут)

Сейчас этот раздел просматривают: 7 гостей