Как пишут код индусы

Warning 1.png

К вашему сведению!

В этой статье мы описываем само явление интусского кота, а не составляем списки всех возможных примеров. Ваше мнение о кривых реализациях и копипасту очередного ZOMG TEH HINDU CODE!!111! читать здесь никому не интересно, поэтому все правки с упоминанием «Пример № 100500» будут откачены, а их авторы — расстреляны на месте из реактивного говномета, for great justice!

/**
* For the brave souls who get this far: You are the chosen ones,
* the valiant knights of programming who toil away, without rest,
* fixing our most awful code. To you, true saviors, kings of men,
* I say this: [[never gonna give you up]], never gonna let you down,
* never gonna run around and desert you. Never gonna make you cry,
* never gonna say goodbye. Never gonna tell a lie and hurt you.
**/

http://stackoverflow.com/questions/184618/

Хороший индеец — мёртвый индеец!

Слышано от senior software developer в международной компании после нескольких суток реfuckторинга

Индусский программист. «Пишу на C++ за еду!»

Генеральный директор Microsoft с 2014 года — индус. Это должно было случиться

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

По другой трактовке, индусский код — жаргонное нарицательное название для программного кода крайне низкого качества, использующего простые, но порочные принципы «copy-paste», «главное — завалить, а там запинаем», «шапкозакидательство». Также известен как «write only», или (в пику принципу «написано однажды — читается везде») — «написанное однажды — лучше не читать».

Почему именно индусский

Pro desu.gif

Code Nulch dem.jpg

xxx: странные в Индии программисты

xxx: глубокий индийский смысл кода
intQuanty = intQuanty + 0;

yyy: буддистское созерцание присваивания

Bashorgrufavicon.png 392993

В Индии с некоторых времен существует практика оценки производительности труда программиста на основе количества написанного кода. Чем больше кода, тем больше программист работает, и, следовательно, выше его оклад. Шустрые индусы быстро сообразили, как обманывать неквалифицированных заказчиков.

В результате чего можно встретить подобные шедевры (и это только цветочки!):

<source lang=»csharp»>
if (true) {

   // какой-то код

} else {

   // a вот тут чистый profit

}
</source>

Менее очевидный вариант:
<source lang=»csharp»>
if(var)
{

}
else if(!var)
{

}
else
{
// чистые деньги
}

</source>

Аутентичный индусский код иногда пишется на хинди и транслитерируется в C, C++ или Java. По некоторым сведениям, индусский код поют и танцуют, и только потом записывают на хинди. Есть народная примета: если программист поёт и танцует — значит, он написал индусский код.

При частой работе с этими «спецами», фраза «The only good Indian is a dead Indian» обрастает новым смыслом.

कोड में टिप्पणी — यह है कि उसने क्या कहा डिबगिंग के दौरान प्रोग्रामर, так-то!

Занимательная география

А на самом деле, китайцы ещё хуже, просто пришли в индустрию позднее, вот и проебали всю славу соседям по глобусу. Код, написанный индусами, обычно содержит в себе хоть какие-то зайчатки логики. Примеры выше это подтверждают (кто не понял, что там происходит, пусть первый бросит… курить, например). Код, написанный китайцами, парсится гораздо, гораздо сложнее. Переменная сколькоМнеЛетЕслиКрокодилБолееШирокийЧемЗелёный, не смотря на исчерпывающее название, считывается китайцем как 未知他妈的狗屎. Поэтому он смело может дописать пару строчек кода, которые копируют в эту переменную («А мы проверяли, она с этого момента нигде не используется, мы же хотим сэкономить память?») младшие 17 битов от хеша кук браузера, и считать, что сделал доброе дело. Некоторые антропологи связывают такие особенности китайского разума с необходимостью заучивать 100500 иероглифов. Хули им после этого какие-то там магические константы или порядок смены смысла у каждой из тысяч переменных.

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

<source lang=»csharp»>
int randomInt = 4; // 4 is random enough
</source>

…и спалится сразу, японец снабдит эту строку кучей кракозяблов, причём файл может быть сохранён вместо Юникода в какой-нибудь локальной кодировке, про которую беложопые чукчи должны самостоятельно погуглить, дабы было что совать в онлайновый переводчик. Сколько иероглифов ты выучил сегодня?

Выше некоторые граждане хитрожопо пытались выдать следующий кусок кода за индусский:

<source lang=»csharp»>

  1. define true false

  1. define true (Math.random()>0.05) // Как вариант

</source>

Что есть, на самом деле, жуткий поклёп. «Карма» для индуса не пустой звук: он верит, что за такое западло Шива отхуярит ему ручки молнией, а Кали насрёт после этого в обугленную глазницу. Если индус и пишет хуёвый (с точки зрения другого программиста) код, то не по злобе, а по совершенно другим соображениям. А вот кто в реальности любит такие приколы, так это братья-славяне (в ходе марксистского воспитания лишённые поповских предрассудков), которые считают, что им несправедливо заплатили. Кроме того, оставлять такие закладки в коде свойственно людям с менталитетом школьников младших классов, независимо от страны произрастания, которым такие вещи кажутся верхом хитрости (поскольку с понятием w:Code review не знакомы).

Но ваистену страшнее всех зверей русский с двумя высшими образованиями, вооружённый книгами Александреску, Чаушеску, Майерса и прочих парней, в жизни не написавших даже Doom’а. Такому дай стеклянный хуй — он из него сделает STL, а руки потом изрежешь себе ты, когда вместо myArray.Add(1488); будешь писать нечеловеческие заклинания типа my_std_vector.push_back(1488);.

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

Индусский дебаггинг

Частично является разновидностью индусского кодинга. Суть заключается в том, что при дебаггинге индус убирает видимое проявление проблемы, а не саму проблему (он её даже и не пытается искать). Например:

Проблема

При чтении одного конкретного ре́корда из базы прога падает в функции CalculateTaxes с ошибкой переполнения.

Человеческий фикс
  IF rs.fields("money") > 1e9 THEN
    Throw New System.Exception("Не может в нашей школе быть таких зарплат. В базе неправильное значение зарплаты для работника " + rs.fields("name") + ", исправьте.")
  END

  Call CalculateTaxes(rs)
Индусский фикс
  IF rs.fields("name") = "уборщица тётя люся" THEN
    ' Ну и похуй, что налоги для тёти люси не посчитаются. Зато софтина не упадёт!
  ELSE
    Call CalculateTaxes(rs)
  END

Примеры индусского кода

Пример № 1 (C#)

<source csharp>
uint i;

if (i.ToString().Length == 1)
{

 ...

}
</source>

Не сразу можно понять, что в этом коде просто-напросто выполняется проверка 0 <=i <10. Алгоритм достаточно прост: выполняется преобразование i в строку, после чего вычисляется её длина. Если число больше 9, то его десятичная запись содержит больше одного символа. Поскольку отрицательные числа переменная типа uint содержать не может, то проверку успешно проходят лишь числа от 0 до 9. Строка же, полученная из отрицательного числа, состоит как минимум из знака ‘-‘ и одной цифры, поэтому проверка справедлива и для знаковых целых (int). Алгоритм ресурсоёмок, неочевиден, и не поддаётся сопровождению даже теоретически.

Kитайский код

Герои Intel, Чайна-стайл!

Kитайский код — стиль написания программ, нарушающий принцип DRY. Китайский подход к программированию требует эксплиситного (явного) отказа от циклов, локальных переменных, любых процедур и условных выражений, а также использования технологии copy-and-paste чуть менее, чем везде. Такой подход точно увеличивает объём исходников и может увеличить производительность (ведь пропускаются такты на джамповые команды)[1].

Возьмём, к примеру, такой кусочек программы на C: 

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

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

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

Делфишколокод

Явление, наблюдаемое исключительно на просторах Этой Страны. Возникло из-за маниакального пристрастия «преподавателей» информатики Этой Страны преподносить неокрепшим школьным умам «основы программирования» на базе небезызвестной быдлокодерской RAD Delphi.
Особенностями такого кода являются стандартные автоматически сгенерированные RAD имена методов классов, событий, переменных (Form1, Button1, Button1Click и т. д.), отсутствие всякого форматирования, комментариев, документации. В случае, если делфишколокодер придумывает собственные названия методам, функциям или переменным — эти названия состоят из транслитерированных русских слов вперемешку с немногими известными школоло английскими, например CheckOplata. Либо — вообще лишены всякого смысла.
Примеры делфишколокода, а также примеры замечательных и очень полезных «программ», создаваемых нашими школьниками, можно найти на замечательном, зашкаливающем лулзами «Личном сайта Разработчика!» по адресу http://ykolchurin.narod.ru/. Лулзы от этого кода искать здесь: http://www.sql.ru/foru…d=708039

Оверинжиниринг

Кроме быдлокода и китайского кода, высокой пертинентностью к индусскому коду обладает т. н. «оверинжиниринг» — решение простых задач сложными методами. Да-да, просто чтобы повыёбываться, показать своё знание всех возможных приёмов, методов и конструкций (в чем и отличие от индусского кода) и произвести впечатление на человека, от темы далёкого, но зато платящего за это денежки. Как всегда, ничто не ново под луной: в 1920-е был крайне популярен карикатурный изобретатель с характерно громоздким именем «профессор Люцифер Горгонзолла Баттс», пародирующий первый виток явления, окружённый своими адскими механическими машинами, которыми познее вдохновились создатели досовской игрушки «The Incredible Machine». Сейчас то же самое наблюдается как в электронике, так и (особенно ярко) в сфере ПО. Причём опенсорс подвержен этому раку не менее, чем коммерческий код: там тоже пытаются произвести впечатление на пустом месте, но уже не на заказчика, а на тусовку. Такие дела.

Большой недоговоркой было бы умолчать, что сие явление не просто масштабно — оно всеохватно, о́бло, озо́рно, огро́мно, стозе́вно и ла́яй ©. Раком оверинжиниринга отрасль охвачена, пожалуй, полнее, чем рынок — быдлодевайсами, а телевизор — зомбопрограммами. Она охвачена им практически вся. Результаты, собственно, печальны и наблюдаемы невооружённым глазом. Умирающий от ожирения код пишется визуально генерируется умирающими от ожирения средствами разработки, а количество багов в результате просто астрономическое (преподносится этот бред как «средства, помогающие минимизировать людские ошибки» — быдломенеджеры по внедрению верят буклетам больше, чем визуально наблюдаемой картине). Скорость достижения результата тоже прямо противоположна заявам (на ассемблере и то было бы быстрее написать). Вопрос «нахуя?» вызывает в ответ тонны шизофазии про «прогрессивные методы и смелый взгляд в будущее». Запасаемся попкорном и ждём прорыва этого гнойника.

Пример кода: Hello world на PHP in da patterns.

Анналы истории

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

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

[1]

Олсо, 26 ноября 2009 года Александр Лукашенко выступил перед участниками специального заседания саммита «Соединим пространство СНГ» с почти дословным пересказом своего бывшего российского коллеги:

В Беларуси традиционно хорошо развита математическая школа, наши программисты — одни из лучших в мире. Поэтому нам есть что предъявить в качестве интеллектуального продукта

http://www.president.gov.by/press80066.html

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

Последствия

Ахтунг! Не всё из нижеприведённого на совести индийских расовых индусов, поскольку «индусский код» давно имя нарицательное.

Подводная лодка «Нерпа»

Российская подлодка, построенная для передачи в дружественную Индию, на пути к которой в 2008 году случайно система пожаротушения, в результате чего к Кришне отправились 20 человек экипажа.

Мичман также считает, что произошел сбой в компьютере. «Такую систему нельзя было запитывать на электронику. Раньше на всех лодках система пожаротушения была ручная, по приказанию. Дается команда: „Включиться в дыхательные аппараты!“, и только потом запускается система тушения. А тут уже фреон льется и одновременно аварийная тревога. У нас был пульт общекорабельных систем „Молибден-И“, индийский вариант», — сказал Кошеваров.
По его словам, экипаж во время аварии действовал грамотно. Многих из примерно 70 человек, находившихся во втором отсеке, спасли.

http://www.newsru.com/russia/12nov2008/podlodka.html

Кстати, кодовое имя пепелаца — Chakra («Чакра»), что несомненно символизирует.

Therac-25

Терак-25 (англ. Therac-25) — аппарат лучевой терапии, медицинский ускоритель созданный канадской государственной организацией Atomic Energy of Canada Limited. От него погибло как минимум шесть человек. А все это из-за сами знаете чего.

Обезьяны, пейсавшие код были довольно везучими и допустили около 3 ошибок. Среди них шедевры:

  • Одна и та же переменная применялась как для анализа введённых чисел, так и для определения положения поворотного круга. Поэтому при быстром вводе Therac мог иметь дело с неправильным положением поворотного круга.
  • Настройка положения отклоняющих магнитов занимает около 8 секунд. Если за это время параметры типа и мощности излучения были изменены, и курсор установлен на финальную позицию, система не обнаруживала изменений.
  • Установка булевской переменной (однобайтовой) в значение «истина» производилось командой «x=x+1». Поэтому с вероятностью 1/256 (если x=255, то сложение с единицей приводит к переполнению и обнулению переменной) при нажатии кнопки «Set» программа могла не пропустить информацию о некорректном положении диска.

Ariane 5

История о том, как можно написать одну строчку кода ценой в девять нулей после единицы. Долларов.

Виновница торжества

Анонимус

4 июня 1996 года в 9 часов утра вероломно, без объявления войны конвертация 64-битного вещественного числа в 16-битное знаковое целое закончилась арифметическим переполнением. Не вынеся такого позора, ракета Ariane 5, на чьём бортовом компьютере произошло сие безобразие, по-самурайски самовыпилилась на 40-й секунде полёта, прихватив с собой товарно-материальных ценностей (4 спутника ЕКА «Cluster», предназначенных для изучения магнитного поля Земли) на $350—500 млн. С учётом всех потерь (отложенные кирпичи запуски, подмоченная репутация и т.п.) общая сумма перевалила за гигабакс, сделав эту ошибку возможно самой дорогой в истории.

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

  • Соответствующий код был в лучших традициях индуизма копипастой c предыдущей ракеты Ariane 4. Копипакостники, ЧСХ, не удосужились проверить, работает ли он в новом окружении.
  • Потрясающая обработка исключительных ситуаций: при возникновении в аппарате странных результатов, считаем происходящее аппаратной ошибкой с отключением аппарата нахрен. Один из экспертов, проводивших вскрытие, сравнил такой механизм с врачом, без всякого осмотра пристрелившим пришедшего к нему с непонятными симптомами больного, дабы тот не мучился. Сюрприз-сюрприз, этот подход жив и поныне, и изредка являет миру свой лик в виде BSOD. Разница в том, что пекарня анона в таких ситуациях просто зависает, а управляющая система Ariane 5 после этого передала управление точно такому же компьютеру (!) с точно такой же программой (!!). Так как баг на самом деле был отнюдь не аппаратный, а самый что ни на есть программный, конец немного предсказуем, не так ли?
  • Комиссия, проводившая расследование, копнула глубже, и пришла к выводу, что за предыдущими пунктами скрывается принцип: «Программа считается работающей верно, пока не доказано обратное». В то время как должен применяться принцип: «Программное обеспечение нужно считать ошибочным, пока использование практических методов, признанных в настоящее время наилучшими, не докажет его правильность».

Коммерческие продукты, содержащие индусский код

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

  • Microsoft Windows. Исходники NT4, 2k, xp есть в сети. Найти в сорцах следы индусов не сложно. В 2014 M$ окончательно перестала притворяться, взяв генеральным директором индуса!
  • Symbian. Горячо любимая нокией. До открытия исходного кода писалась индусами. Я гарантирую это. Те, кому нужен пруф, могут посмотреть на обилие индийских знатоков symbian на форуме http://discussion.forum.nokia.com/forum/
  • Драйвера AMD/ATI. Эдакий эталон говнокода из парижской палаты мер и весов. Количество багов, глюков и недоделок перевалило за все мыслимые пределы (особенно на Линуксе). Радует также Catalyst Control Center, написанный на б-гомерзком Microsoft.NET. Впрочем, это не удивительно — сама контора анально зависит от мелкомягких. Алсо, ходили слухи, что последние версии драйверов видеокарт писали их ближайшие конкуренты — калифорнийская хлебопекарня nVidia.
  • Тысячи их.

См. также

  • Копипаста:Быдлокод-ГСР
  • Быдлокодер
  • Программист
  • Админ
  • Индийское кино
  • Yandere Simulator

Примечания

  1. То, что это шутка, должно быть очевидно. А вот чего ты мог и на самом деле не знать, так это того, что в Майкрософте одно время все продукты для пользователей собирались с ключом O1 — «оптимизация исполняемого файла по размеру» (после чего бинарник начинает состоять из джамповых команд чуть менее, чем полностью). Прикол в том, что субъективно он может восприниматься как более быстрая программа, ибо тупо меньше читать с диска и писать в память плюс меньше нагрузка на своп).

Ссылки

  • Блог о загадочных индийских техниках программирования.
  • ЖЖ-сообщество programmers_fun.
  • ЖЖ-сообщество code_wtf.
  • КодоБред на Хабре.
  • Русский код, бессмысленный и беспощадный.
  • The Daily WTH (бывшая The Daily WTF) (бывшая Worse than Failure (бывшая The Daily WTF)).
  • Пример индусского кода на БОРе.
  • И ещё.
  • Удаление аппендикса через рот.
  • Говнокодеры едут на работу по рабочей визе H1B.

Movax1010h.png

Языки программирования

  • ++i + ++i
  • AJAX
  • BrainFuck
  • C Sharp
  • C++
  • Dummy mode
  • Erlang
  • Forth
  • FUBAR
  • God is real, unless explicitly declared as integer
  • GOTO
  • Haskell
  • Ifconfig
  • Java
  • JavaScript
  • LISP
  • My other car
  • Oracle
  • Pascal
  • Perl
  • PHP
  • Prolog
  • Pure C
  • Python
  • RegExp
  • Reverse Engineering
  • Ruby
  • SAP
  • SICP
  • Tcl
  • TeX
  • Xyzzy
  • Анти-паттерн
  • Ассемблер
  • Быдлокодер
  • Выстрелить себе в ногу
  • Грязный хак
  • Дискета
  • ЕГГОГ
  • Индусский код
  • Инжалид дежице
  • Капча
  • КОИ-8
  • Костыль
  • Лог
  • Метод научного тыка
  • Очередь
  • Помолясь
  • Проблема 2000
  • Программист
  • Процент эс
  • Рекурсия
  • Свистелки и перделки
  • Спортивное программирование
  • СУБД
  • Тестировщик
  • Умение разбираться в чужом коде
  • Фаза Луны
  • Фортран
  • Хакер
  • Языки программирования

Еда

  • 11 сентября
  • Ache666
  • Alt-Right
  • Avatar
  • Beon.ru
  • Boku no Pico
  • Butthurt
  • Championat.com
  • Check you
  • Chris-chan
  • Cruel Addict
  • Du Volon
  • Fandom
  • He Will Not Divide Us
  • Leyla 22
  • Limp Bizkit
  • Lingqiyan
  • Linkin Park
  • Megadeth
  • MISS HOLLYWOOD
  • Noize MC
  • Project N.I.G.R.A.
  • Pussy Riot
  • Ray William Johnson
  • Rsdn.ru
  • Rutracker.org
  • SupLisEr
  • VIP
  • X не умер
  • Yandere Simulator
  • Zeitgeist
  • Аббатус
  • Авраам Болеслав Покой
  • Адольфыч
  • АлисА
  • Алкснис
  • Аллан999
  • Альбац
  • Альберт Акчурин
  • Андерс Брейвик
  • Андрей Лаптев
  • Андрей Сковородников
  • Анна Бешнова
  • Апач
  • Бабка АТС
  • Багиров
  • Бачинский
  • Белоцерковская
  • Белый Колонизатор
  • Бобби Котик
  • Бодибилдинг
  • Болашенко
  • Бурление говн
  • Валерий Назаров
  • Варракс
  • Леонид Василевский
  • Ватник
  • Веганы
  • Миша Вербицкий
  • Винилофилия
  • Виталик
  • Вован Метал
  • Высер
  • Геноцид армян
  • Германыч
  • Глобальное потепление
  • Гоблин Гага
  • Говнарь
  • Говно
  • Город Снов
  • Гринпис
  • Гутник
  • Дед ИВЦ
  • Джеттейм
  • Джигурда
  • Джипсилиля
  • Диванные войска
  • Доброволец
  • Друмба
  • Дэниел Петрик
  • Евровидение
  • Еда
  • Женя Духовникова
  • Жертвы пранка
  • Закон По
  • Змагар
  • Знаменитость российского уровня
  • Иван Гамаз
  • Иван Охлобыстин
  • ИГИЛ
  • Илья Фарафонов
  • Император двачей
  • Индусский код
  • Инна Жиркова
  • Кавказ-Центр
  • Кактус
  • Карикатуры на Мухаммеда
  • Карина Будучьян
  • Кинопоиск
  • Коммуняки

/**
* For the brave souls who get this far: You are the chosen ones,
* the valiant knights of programming who toil away, without rest,
* fixing our most awful code. To you, true saviors, kings of men,
* I say this: never gonna give you up, never gonna let you down,
* never gonna run around and desert you. Never gonna make you cry,
* never gonna say goodbye. Never gonna tell a lie and hurt you.
**/

http://stackoverflow.com/questions/184618/

Хороший индеец — мёртвый индеец!

Слышано от senior software developer в международной компании после нескольких суток реfuckторинга

Индусский программист. «Пишу на C++ за еду!»

Генеральный директор Microsoft с 2014 года — индус. Это должно было случиться

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

По другой трактовке, индусский код — жаргонное нарицательное название для программного кода крайне низкого качества, использующего простые, но порочные принципы «copy-paste», «главное — завалить, а там запинаем», «шапкозакидательство». Также известен как «write only», или (в пику принципу «написано однажды — читается везде») — «написанное однажды — лучше не читать».

Почему именно индусский[править]

Pro desu.gif

Code Nulch dem.jpg

xxx: странные в Индии программисты

xxx: глубокий индийский смысл кода
intQuanty = intQuanty + 0;

yyy: буддистское созерцание присваивания

Bashorgrufavicon.png392993

В Индии с некоторых времен существует практика оценки производительности труда программиста на основе количества написанного кода. Чем больше кода, тем больше программист работает, и, следовательно, выше его оклад. Шустрые индусы быстро сообразили, как обманывать неквалифицированных заказчиков.

В результате чего можно встретить подобные шедевры (и это только цветочки!):

Подробнее… 

if (true) {
    // какой-то код
} else {
    // a вот тут чистый profit
}

Менее очевидный вариант:

if(var)
{
...
}
else if(!var)
{
...
}
else
{
// чистые деньги
}

Аутентичный индусский код иногда пишется на хинди и транслитерируется в C, C++ или Java. По некоторым сведениям, индусский код поют и танцуют, и только потом записывают на хинди. Есть народная примета: если программист поёт и танцует — значит, он написал индусский код.

При частой работе с этими «спецами», фраза «The only good Indian is a dead Indian» обрастает новым смыслом.

कोड में टिप्पणी — यह है कि उसने क्या कहा डिबगिंग के दौरान प्रोग्रामर, так-то!

Герои Intel

Занимательная география[править]

А на самом деле, китайцы ещё хуже, просто пришли в индустрию позднее, вот и проебали всю славу соседям по глобусу. Код, написанный индусами, обычно содержит в себе хоть какие-то зайчатки логики. Примеры выше это подтверждают (кто не понял, что там происходит, пусть первый бросит… курить, например). Код, написанный китайцами, парсится гораздо, гораздо сложнее. Переменная сколькоМнеЛетЕслиКрокодилБолееШирокийЧемЗелёный, не смотря на исчерпывающее название, считывается китайцем как 未知他妈的狗屎. Поэтому он смело может дописать пару строчек кода, которые копируют в эту переменную («А мы проверяли, она с этого момента нигде не используется, мы же хотим сэкономить память?») младшие 17 битов от хеша кук браузера, и считать, что сделал доброе дело. Некоторые антропологи связывают такие особенности китайского разума с необходимостью заучивать 100500 иероглифов. Хули им после этого какие-то там магические константы или порядок смены смысла у каждой из тысяч переменных.

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

int randomInt = 4; // 4 is random enough

…и спалится сразу, японец снабдит эту строку кучей кракозяблов, причём файл может быть сохранён вместо Юникода в какой-нибудь локальной кодировке, про которую беложопые чукчи должны самостоятельно погуглить, дабы было что совать в онлайновый переводчик. Сколько иероглифов ты выучил сегодня?

Выше некоторые граждане хитрожопо пытались выдать следующий кусок кода за индусский:

#define true false

#define true (Math.random()>0.05) // Как вариант

Что есть, на самом деле, жуткий поклёп. «Карма» для индуса не пустой звук: он верит, что за такое западло Шива отхуярит ему ручки молнией, а Кали насрёт после этого в обугленную глазницу. Если индус и пишет хуёвый (с точки зрения другого программиста) код, то не по злобе, а по совершенно другим соображениям. А вот кто в реальности любит такие приколы, так это братья-славяне (в ходе марксистского воспитания лишённые поповских предрассудков), которые считают, что им несправедливо заплатили. Кроме того, оставлять такие закладки в коде свойственно людям с менталитетом школьников младших классов, независимо от страны произрастания, которым такие вещи кажутся верхом хитрости (поскольку с понятием w:Code review не знакомы).

Но ваистену страшнее всех зверей русский с двумя высшими образованиями, вооружённый книгами Александреску, Чаушеску, Майерса и прочих парней, в жизни не написавших даже Doom’а. Такому дай стеклянный хуй — он из него сделает STL, а руки потом изрежешь себе ты, когда вместо myArray.Add(1488); будешь писать нечеловеческие заклинания типа my_std_vector.push_back(1488);.

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

Индусский дебаггинг[править]

Частично является разновидностью индусского кодинга. Суть заключается в том, что при дебаггинге индус убирает видимое проявление проблемы, а не саму проблему (он её даже и не пытается искать). Например:

Проблема

При чтении одного конкретного ре́корда из базы прога падает в функции CalculateTaxes с ошибкой переполнения.

Человеческий фикс
  IF rs.fields("money") > 1e9 THEN
    Throw New System.Exception("Не может в нашей школе быть таких зарплат. В базе неправильное значение зарплаты для работника " + rs.fields("name") + ", исправьте.")
  END

  Call CalculateTaxes(rs)
Индусский фикс
  IF rs.fields("name") = "уборщица тётя люся" THEN
    ' Ну и похуй, что налоги для тёти люси не посчитаются. Зато софтина не упадёт!
  ELSE
    Call CalculateTaxes(rs)
  END

Примеры индусского кода[править]

Пример № 1 (C#)
uint i;
...
if (i.ToString().Length == 1)
{
  ...
}

Не сразу можно понять, что в этом коде просто-напросто выполняется проверка 0 <=i <10. Алгоритм достаточно прост: выполняется преобразование i в строку, после чего вычисляется её длина. Если число больше 9, то его десятичная запись содержит больше одного символа. Поскольку отрицательные числа переменная типа uint содержать не может, то проверку успешно проходят лишь числа от 0 до 9. Строка же, полученная из отрицательного числа, состоит как минимум из знака ‘-‘ и одной цифры, поэтому проверка справедлива и для знаковых целых (int). Алгоритм ресурсоёмок, неочевиден, и не поддаётся сопровождению даже теоретически.

Пример № 2 (C#)
double rest(float a, float b)
{float res=a*b;
for (int i=0; i<999999999; i++)
 if (i<=res && i+1>res) {res = res-i; break;}
return res;
}

Далеко не сразу можно понять, что этот код выделяет дробную часть произведения a*b. Кроме того, функция выдаст ошибочное значение при a*b>999999999 или a*b<0.
Также зависимость времени выполнения от величины целой части тоже не радует.
К тому же, компилятор выдаст ошибку о несовпадении типов.

Пример № 3 (C#)
bool IsNumber (string str)
{
return (str.Replace ("0", "").Replace ("1", "").Replace ("2", "").Replace ("3", "").Replace ("4", "").Replace ("5", "").Replace ("6", "").Replace ("7", "").
Replace ("8", "").Replace ("9", "").Length == 0);
}

Хотя в данном случае алгоритм вполне очевиден, не менее очевидно и то, что для его выполнения конструктор класса string будет вызван не менее десяти раз (т.к. любое изменение класса String в C# приводит к созданию нового экземпляра и передачей старого экземпляра сборщику мусора) со всеми вытекающими из этого последствиями. И всё только потому, что какому-то индусу было лень придумать менее ресурсоёмкую альтернативу.

В случае множественных замен надо использовать StringBuilder.Replace(), а в данном — int.TryParse(). Не изобретайте велосипед! Кроме того, сам алгоритм содержит ошибку: он будет некорректно обрабатывать отрицательные числа. Добавление еще одного Replace(«-«,»») к win не приведет, функция может вернуть труъ для строки «-«.

Пример № 4 (C#)
bool value;



if (value.ToString().Length == 4)
{ 
  ...
}
else if (value.ToString().Length == 5)
{
  ...
}
else
{
   // внимание! кто-то хочет нас наебать подсунув некачественный (по всей вероятности, протухший) bool, но мы ему не дадим:
   throw new ArgumentException();
   // у некоторых племенных индусов бывает и продолжение, на случай если throw вдруг не сработает:
   return !true && !false;
   // надо же вернуть какую-нибудь хуйню, чтобы заказчик не ныл
}

В этом примере проверка истинности значения логической переменной производится с помощью длины её текстового представления. Если длина равна четырём („True“), значение истинно, если пять („False“) — ложно, если ни то, ни се — тогда включаем panic mode и начинаем жарить карри. Правда злобный компилятор вяло ругнется ворнингом. Но какой дурак их читает?

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

Алсо, кошерный вариант примера доставляет не меньше:

bool value;

switch (value)
{ 
  case true: ... break;
  case false: ... break;
  default: throw new ArgumentException();
}
Пример № 5 (PHP)
if ($_POST["end_oplata"]!="sending" and $_POST["continue_oplata"]!="prodoljit" and $_POST["prov"]!="proverka") { 
... 
}
elseif ($_POST["continue_oplata"]!="prodoljit" and $_POST["prov"]!="proverka") {
...
}
elseif ($_POST["continue_oplata"]=="prodoljit") {
...
}

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

К тому же, это пример ужасного стиля именования переменных, containing as English words, Tak i transliterirovannye Russkie. Видимо, сказался author’s poor английский словарный запас.

Пример № 6

На этой странице есть ссылки на страницу Индус. Если перейти на эту страницу, то Вы окажетесь опять же здесь. Пожалуйста, не правьте эти ссылки — они сделаны специально для примера.

Пример № 7

TurDuckEn Code — разновидность быдлокода, чаще всего встречающаяся в веб-приложениях. Как спагетти-код, только хуже.
ТурДукен (en.w:Turducken) — пиндосская нямка, cостоящая из индейки (turkey), нафаршированной уткой (duck), зафаршированной курицей (chicken).
Турдукен Код, например, состоит из PHP, фаршированным SQL, нафаршированным HTML, вперемешку с CSS и зафаршированным Javascript. Вот так.

Пример № 8 (С++)

Вычисление интеграла

#include <math>

double f(double d){
return fabs(cos(d));
}

double integralrect(const double& a, const double& b, const double& epsilon)
{
double result;
int i;
int n;
double h;
double s1;
double s2;

n = 1;
h = b-a;
s2 = h*f((a+b)/2);
do
{
n = 2*n;
s1 = s2;
h = h/2;
s2 = 0;
i = 1;
do
{
s2 = s2+f(a+h/2+h*(i-1));
i = i+1;
}
while(i<=n);
s2 = s2*h;
}
while(fabs(s2-s1)>3*epsilon);
result = s2;
return result;
}

и, собственно, нахождение самого интеграла:

double s=integralrect(0,M_PI,0.0001);
s++;
Пример № 9 (Java)
public void write(){
     System.out.print("(");
     if (a.getHard()!=null){
      a.write();
     }
     else if (a.getConst()!=null){
      Const t=a.getConst();
      System.out.print(t);
     }
     else if (a.getVal()!=null) {
      Val t=a.getVal();
      System.out.print(t);
     }
     System.out.print(op.getOp());
     if (b.getHard()!=null){
      b.write();
     }
     else if (b.getConst()!=null){
      Const t=b.getConst();
      System.out.print(t);
     }
     else if (b.getVal()!=null) {
      Val t=b.getVal();
      System.out.print(t);
     }
     System.out.print(")");
    }

А нормальные люди пишут так:

public void write(){
     System.out.print("(");
     a.write();
     System.out.print(op.getOp());
     b.write();
     System.out.print(")");
}

А ещё более нормальные вот так:

public void write() {
    System.out.print("(" + a.getVal() + op.getOp() + b.getVal() + ")");
}
Пример № 10 (SQL)
SELECT CASE WHEN a>b THEN 1 ELSE NULL END

«Далеко не сразу можно понять», что ELSE является избыточным в данном контексте.
Оператор CASE при отсутствии верных условий возвращает NULL.

Пример 11 (С/C++)

Настоящий индус добьется втрое больше случайности генератора чисел:

RANDOM = (rand() + rand() + rand()) / 3;

На самом деле, согласно центральной предельной теореме, итоговое распределение будет гораздо ближе к нормальному, чем к равномерному.

Пример 12 (PHP)
echo ("<form action='' method='POST'>");
echo ("<input type='text' name='username' /><br />");
echo ("<input type='password' name='password' /><br />");
echo ("<input type='submit' name='submit' value='submit' />");
echo ("</form>");

include "config.php";
$pass = (isset($_POST["password"])) ? $_POST["password"] : NULL;
$user = (isset($_POST["username"])) ? $_POST["username"] : NULL;

$password['0'] = (!empty($_POST["password"])) ? $_POST["password"] : 1;
$username['0'] = (!empty($_POST["username"])) ? $_POST["username"] : 1;

$password['1'] = (!empty($_POST["password"])) ? $_POST["password"] : 2;
$username['1'] = (!empty($_POST["username"])) ? $_POST["username"] : 2;
 
$query = mysql_query("SELECT * FROM admins WHERE password='".$pass."' AND username='".$user."'") or die(mysql_error());
$row = mysql_num_rows($query);
 
$query1 = mysql_query("SELECT level FROM admins WHERE username = '".$username."'");
$row1 = mysql_fetch_row($query1);  
   
if (isset($_POST['submit'])) {
    if ($pass == NULL || $user == NULL) {  
        die("ERROR");
    }
}

Nuff Said

Пример 13 (Python)
list = [0,1,2,3,4,5,6,7]
LisT = [0]
LisT = LisT * len(list)
var = list[0]
for i in range(len(list)):
    LisT[i] = list[len(list)-i-1]
LisT[len(list)-1] = var
print LisT

Для сравнения:

list = [0,1,2,3,4,5,6,7]
print list[::-1]

или даже

Пример 14 (1c)

Из реального коммерческого ПО, защищаемого железными ключами.
Получение текущей даты:

Документ = СоздатьОбъект("Документ.ПКО");
Документ.Новый();
Документ.Записать();
ТекДата = Документ.ДатаДок;
Документ.Удалить(1);

Кроме того, что это «не совсем красиво», так еще и операции с документом приводят к манипуляции с записями в БД, что отнюдь не прибавляет скорости, да и надежности всей системы в целом. Особенно если учесть, что DBF версия записи фактически не удаляет, а просто помечает их внутри файла и тот пухнет, пока его не сжать спец утилитой.

А ведь можно немного проще:

Пример 15 (С#)

Также несколько байтоцентов аутсорцеры получают, дополнительно используя try … catch:

private String GetCustomersList(out String error)
{
  try
  {/* check database */
    DataItem dataItem = (DataItem)m_appConfig_dataBase.GetDataItem("item_customerslist");
    if(dataItem == null) throw new NullReferenceException(); //4/11/2010--chupi21: no darta found 
    return dataItem.ToString();
  }
  catch(NullReferenceException nullReferenceException)
  {
    error = "Data not found!";
    return nullReferenceException.ToString();
  }
}

Енто еще не все! Так вот проверяют на ошибку методом:

String getCustomerListError = "Success";
String customerList = GetCustomersList(out getCustomerListError);//  get customer list
if(getCustomerListError == new NullReferenceException().ToString())
   return new ArrayList();

Да… вот так можно запутаться в собственном шедевре. Счастливчиком таки оказался наш мистер Чупи: список клиентов в базе таки создается при создании самой базы… Иначе SuxxAss бы он получил, а не Success.

Kитайский код[править]

Герои Intel, Чайна-стайл!

Kитайский код — стиль написания программ, нарушающий принцип DRY. Китайский подход к программированию требует эксплиситного (явного) отказа от циклов, локальных переменных, любых процедур и условных выражений, а также использования технологии copy-and-paste чуть менее, чем везде. Такой подход точно увеличивает объём исходников и может увеличить производительность (ведь пропускаются такты на джамповые команды)[1].

Возьмём, к примеру, такой кусочек программы на C: 

int arr[10];
int i;
for (i = 0; i < 10; i++)
{
  arr[i] = 0;
}

Который, кстати, вполне мог бы выглядеть и так:

Типичный программист в китайском стиле напишет это так:

int a0 = 0;
int a1 = 0;
int a2 = 0;
int a3 = 0;
int a4 = 0;
int a5 = 0;
int a6 = 0;
int a7 = 0;
int a8 = 0;
int a9 = 0;

…и в дальнейшем будет использовать a0, a1, a2, a3, a4 и т.д. Например, вместо прекрасного:

будет:

if (x == 0)
{
  a0 = x;
}
else if (x == 1)
{
  a1 = x;
}
else if (x == 2)
{
  ...
}

Пример № 1, приведённый выше:

uint i;
...
if (i.ToString().Length == 1)
{
  ...
}

…приверженец китайской методы перепишет так:

if (i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 8 || i == 9)
{
  // произвести ещё одну бессмысленную операцию
}

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

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

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

Делфишколокод[править]

Явление, наблюдаемое исключительно на просторах Этой Страны. Возникло из-за маниакального пристрастия «преподавателей» информатики Этой Страны преподносить неокрепшим школьным умам «основы программирования» на базе небезызвестной быдлокодерской RAD Delphi.
Особенностями такого кода являются стандартные автоматически сгенерированные RAD имена методов классов, событий, переменных (Form1, Button1, Button1Click и т. д.), отсутствие всякого форматирования, комментариев, документации. В случае, если делфишколокодер придумывает собственные названия методам, функциям или переменным — эти названия состоят из транслитерированных русских слов вперемешку с немногими известными школоло английскими, например CheckOplata. Либо — вообще лишены всякого смысла.
Примеры делфишколокода, а также примеры замечательных и очень полезных «программ», создаваемых нашими школьниками, можно найти на замечательном, зашкаливающем лулзами «Личном сайта Разработчика!» по адресу http://ykolchurin.narod.ru/. Лулзы от этого кода искать здесь: http://www.sql.ru/foru…d=708039

Оверинжиниринг[править]

Кроме быдлокода и китайского кода, высокой пертинентностью к индусскому коду обладает т. н. «оверинжиниринг» — решение простых задач сложными методами. Да-да, просто чтобы повыёбываться, показать своё знание всех возможных приёмов, методов и конструкций (в чем и отличие от индусского кода) и произвести впечатление на человека, от темы далёкого, но зато платящего за это денежки. Как всегда, ничто не ново под луной: в 1920-е был крайне популярен карикатурный изобретатель с характерно громоздким именем «профессор Люцифер Горгонзолла Баттс», пародирующий первый виток явления, окружённый своими адскими механическими машинами, которыми познее вдохновились создатели досовской игрушки «The Incredible Machine». Сейчас то же самое наблюдается как в электронике, так и (особенно ярко) в сфере ПО. Причём опенсорс подвержен этому раку не менее, чем коммерческий код: там тоже пытаются произвести впечатление на пустом месте, но уже не на заказчика, а на тусовку. Такие дела.

Большой недоговоркой было бы умолчать, что сие явление не просто масштабно — оно всеохватно, о́бло, озо́рно, огро́мно, стозе́вно и ла́яй ©. Раком оверинжиниринга отрасль охвачена, пожалуй, полнее, чем рынок — быдлодевайсами, а телевизор — зомбопрограммами. Она охвачена им практически вся. Результаты, собственно, печальны и наблюдаемы невооружённым глазом. Умирающий от ожирения код пишется визуально генерируется умирающими от ожирения средствами разработки, а количество багов в результате просто астрономическое (преподносится этот бред как «средства, помогающие минимизировать людские ошибки» — быдломенеджеры по внедрению верят буклетам больше, чем визуально наблюдаемой картине). Скорость достижения результата тоже прямо противоположна заявам (на ассемблере и то было бы быстрее написать). Вопрос «нахуя?» вызывает в ответ тонны шизофазии про «прогрессивные методы и смелый взгляд в будущее». Запасаемся попкорном и ждём прорыва этого гнойника.

Пример кода: Hello world на PHP in da patterns.

Анналы истории[править]

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

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

[1]

Олсо, 26 ноября 2009 года Александр Лукашенко выступил перед участниками специального заседания саммита «Соединим пространство СНГ» с почти дословным пересказом своего бывшего российского коллеги:

В Беларуси традиционно хорошо развита математическая школа, наши программисты — одни из лучших в мире. Поэтому нам есть что предъявить в качестве интеллектуального продукта

http://www.president.gov.by/press80066.html

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

Последствия[править]

Ахтунг! Не всё из нижеприведённого на совести индийских расовых индусов, поскольку «индусский код» давно имя нарицательное.

Подводная лодка «Нерпа»[править]

Российская подлодка, построенная для передачи в дружественную Индию, на пути к которой в 2008 году случайно система пожаротушения, в результате чего к Кришне отправились 20 человек экипажа.

Мичман также считает, что произошел сбой в компьютере. «Такую систему нельзя было запитывать на электронику. Раньше на всех лодках система пожаротушения была ручная, по приказанию. Дается команда: „Включиться в дыхательные аппараты!“, и только потом запускается система тушения. А тут уже фреон льется и одновременно аварийная тревога. У нас был пульт общекорабельных систем „Молибден-И“, индийский вариант», — сказал Кошеваров.
По его словам, экипаж во время аварии действовал грамотно. Многих из примерно 70 человек, находившихся во втором отсеке, спасли.

http://www.newsru.com/russia/12nov2008/podlodka.html

Кстати, кодовое имя пепелаца — Chakra («Чакра»), что несомненно символизирует.

Therac-25[править]

Терак-25 (англ. Therac-25) — аппарат лучевой терапии, медицинский ускоритель созданный канадской государственной организацией Atomic Energy of Canada Limited. От него погибло как минимум шесть человек. А все это из-за сами знаете чего.

Обезьяны, пейсавшие код были довольно везучими и допустили около 3 ошибок. Среди них шедевры:

  • Одна и та же переменная применялась как для анализа введённых чисел, так и для определения положения поворотного круга. Поэтому при быстром вводе Therac мог иметь дело с неправильным положением поворотного круга.
  • Настройка положения отклоняющих магнитов занимает около 8 секунд. Если за это время параметры типа и мощности излучения были изменены, и курсор установлен на финальную позицию, система не обнаруживала изменений.
  • Установка булевской переменной (однобайтовой) в значение «истина» производилось командой «x=x+1». Поэтому с вероятностью 1/256 (если x=255, то сложение с единицей приводит к переполнению и обнулению переменной) при нажатии кнопки «Set» программа могла не пропустить информацию о некорректном положении диска.

Ariane 5[править]

История о том, как можно написать одну строчку кода ценой в девять нулей после единицы. Долларов.

P_M_DERIVE(T_ALG.E_BH) := UC_16S_EN_16NS (TDB.T_ENTIER_16S
                                   ((1.0/C_M_LSB_BH) *
                                   G_M_INFO_DERIVE(T_ALG.E_BH)))
Виновница торжества

4 июня 1996 года в 9 часов утра вероломно, без объявления войны конвертация 64-битного вещественного числа в 16-битное знаковое целое закончилась арифметическим переполнением. Не вынеся такого позора, ракета Ariane 5, на чьём бортовом компьютере произошло сие безобразие, по-самурайски самовыпилилась на 40-й секунде полёта, прихватив с собой товарно-материальных ценностей (4 спутника ЕКА «Cluster», предназначенных для изучения магнитного поля Земли) на $350—500 млн. С учётом всех потерь (отложенные кирпичи запуски, подмоченная репутация и т.п.) общая сумма перевалила за гигабакс, сделав эту ошибку возможно самой дорогой в истории.

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

  • Соответствующий код был в лучших традициях индуизма копипастой c предыдущей ракеты Ariane 4. Копипакостники, ЧСХ, не удосужились проверить, работает ли он в новом окружении.
  • Потрясающая обработка исключительных ситуаций: при возникновении в аппарате странных результатов, считаем происходящее аппаратной ошибкой с отключением аппарата нахрен. Один из экспертов, проводивших вскрытие, сравнил такой механизм с врачом, без всякого осмотра пристрелившим пришедшего к нему с непонятными симптомами больного, дабы тот не мучился. Сюрприз-сюрприз, этот подход жив и поныне, и изредка являет миру свой лик в виде BSOD. Разница в том, что пекарня анона в таких ситуациях просто зависает, а управляющая система Ariane 5 после этого передала управление точно такому же компьютеру (!) с точно такой же программой (!!). Так как баг на самом деле был отнюдь не аппаратный, а самый что ни на есть программный, конец немного предсказуем, не так ли?
  • Комиссия, проводившая расследование, копнула глубже, и пришла к выводу, что за предыдущими пунктами скрывается принцип: «Программа считается работающей верно, пока не доказано обратное». В то время как должен применяться принцип: «Программное обеспечение нужно считать ошибочным, пока использование практических методов, признанных в настоящее время наилучшими, не докажет его правильность».

Коммерческие продукты, содержащие индусский код[править]

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

  • Microsoft Windows. Исходники NT4, 2k, xp есть в сети. Найти в сорцах следы индусов не сложно. В 2014 M$ окончательно перестала притворяться, взяв генеральным директором индуса!
  • Symbian. Горячо любимая нокией. До открытия исходного кода писалась индусами. Я гарантирую это. Те, кому нужен пруф, могут посмотреть на обилие индийских знатоков symbian на форуме http://discussion.forum.nokia.com/forum/
  • Драйвера AMD/ATI. Эдакий эталон говнокода из парижской палаты мер и весов. Количество багов, глюков и недоделок перевалило за все мыслимые пределы (особенно на Линуксе). Радует также Catalyst Control Center, написанный на б-гомерзком Microsoft.NET. Впрочем, это не удивительно — сама контора анально зависит от мелкомягких. Алсо, ходили слухи, что последние версии драйверов видеокарт писали их ближайшие конкуренты — калифорнийская хлебопекарня nVidia.
  • Тысячи их.

См. также[править]

  • Копипаста:Быдлокод-ГСР
  • Быдлокодер
  • Программист
  • Админ
  • Индийское кино
  • Yandere Simulator

Примечания[править]

  1. То, что это шутка, должно быть очевидно. А вот чего ты мог и на самом деле не знать, так это того, что в Майкрософте одно время все продукты для пользователей собирались с ключом O1 — «оптимизация исполняемого файла по размеру» (после чего бинарник начинает состоять из джамповых команд чуть менее, чем полностью). Прикол в том, что субъективно он может восприниматься как более быстрая программа, ибо тупо меньше читать с диска и писать в память плюс меньше нагрузка на своп).

Ссылки[править]

  • Блог о загадочных индийских техниках программирования.
  • ЖЖ-сообщество programmers_fun.
  • ЖЖ-сообщество code_wtf.
  • КодоБред на Хабре.
  • Русский код, бессмысленный и беспощадный.
  • The Daily WTH (бывшая The Daily WTF) (бывшая Worse than Failure (бывшая The Daily WTF)).
  • Пример индусского кода на БОРе.
  • И ещё.
  • Удаление аппендикса через рот.
  • Говнокодеры едут на работу по рабочей визе H1B.
Achtung troll.png Тролли любят это дело
Основы Высер • Говно • Диванные войска • Еда • Жертвы пранка • Закон По • Карикатуры на Мухаммеда • Ктулхирование • Лулз • Политика • Правила демагога • Священная корова • Стёб • Тролль (Mr. Trololo • Троллефобия • Троллинг) • Хомячки
Сети общепита Avatar • Boku no Pico • Check you • Project N.I.G.R.A. • Rsdn.ru • Rutracker.org • X не умер • Бодибилдинг • Ватники • Веганы • Винилофилы • ВКонтакте • Геноцид армян • Говнари • Город Снов • Гринпис • Евровидение • Змагары • Зоозащитники и догхантеры • Кавказ-Центр • Кинопоиск • Коммуняки • Компьютерно-техническая экспертиза • Лавхейт • Либерасты • Мой мир • Моралфажество • Научный креационизм • Оппозиция • Оскорбление чувств верующих • Педоистерия • Плацента • Поцреоты • Рэперы • Свидомиты • Сериал «Школа» • Скорбящие • Смайлофаги • Тверкинг • Телегония • Турникмены • Фанаты • Фингербокс • Финский армейский тест • Хаббо • Холокост
Хорошие, годные столовые Ache666 • Alt-Right • Chris-chan • He Will Not Divide Us • Leyla 22 • Shiitman • YandereDev • Аббатус • АлисА • Болашенко • Брейвик • Вован Метал • Гутник • Джигурда • Дорожный контроль • Духовникова • Жириновский • Знаменитость российского уровня • Кузина • Кутейкин • Лаптев • Лоза • Мастейн • Матильда • Моргенштерн • Мулдашев • Нахема • Нордика • Павленский • Пейсатель • Перумов • Петрик • Стиллавин • Тимати • Токио Готель • Чёрный кофе • Чудинов • Шмуклер • Эвтаназия
Надкусанные Pussy Riot • Арви • Багиров • Белоцерковская • Варракс • Гоблин • Дёрст • Доброволец • ИГИЛ • Кочергин • Ксюшадь • Назаров • Новодворская • Нос МЦ • Охрим • Сковородников • Скримикс
Невкусные Адольфыч • Альбац • Вербицкий • Германыч • Петренко • Дворкин • Джипсилиля • Лебедев • Linkin Park • Минаев • Михалок • Моптюк • Номад • Онкель Ханс • Охлобыстин • Паркер • Покой • Умориарти • Фриц Морген • Чавес • Чирков • Шиитман • Школьница-тян
Съеденные Du Volon • MISS HOLLYWOOD • SupLisEr • Агещев • Акчурин • Алкснис • Апач • Бабка АТС • Бачинский • Белый Колонизатор • Бешнова • Будучьян • Василевский • Виталик • Гамаз • Гоблин Гага • Дед ИВЦ • Джеттейм • Друмба • Жертвы плаща и волшебной шляпы • Жестокий Влиятель • Жиркова • Задорнов • Император • Коваль • Колесникова • Коносевич • Макар • Мальгин • Маска-тян • Машинист Магомадов Ильяс • Медбрат • Мицгол • Носик • Очковская • Парашный дед • Паук • Пионер лжи • Посетители отеля «Оригами» • Прибыловский • Саакашвили • Семененко • Тинувиэль • Турецкий султан • Уральский • Фарафонов • Яроврат
Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программирования Промышленные: 1С • BAT • C# • C • C++ • Java • JavaScript (AJAX) • Pascal • Perl • PHP • Python • Ruby • ABAP • Ассемблер • Васик • Фортран
Эзотерические: BrainFuck • Erlang • Forth • Haskell • LISP (My other car) • Prolog • Tcl • ΤΕΧ • Oracle
Профессии Быдлокодер • Программист • Тестировщик • Хакер • Хеллоуворлдщик
Методы и стили Reverse Engineering • Анти-паттерн • Выстрелить себе в ногу • Грязный хак • Код (индусский) • Костыль • Метод научного тыка • Помолясь • Свистелки и перделки • Очередь • Спортивное программирование
Прочее ++i + ++i • Deadline • %s • 640 килобайт • CMS • Dummy mode • ЕГГОГ • Foobar • God is real, unless explicitly declared as integer • GOTO • Ifconfig • KISS • RegExp • SICP • sql.ru • Xyzzy • Дискета • Инжалид дежице • КОИ-8 • Лог • Ман • Рекурсия • СУБД • Тест Тьюринга • Умение разбираться в чужом коде • Фаза Луны • Фатальный недостаток • Проблема 2000

Индусский код в Микрочипе

Время на прочтение
8 мин

Количество просмотров 62K

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

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

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

Индусский код (не индийский или индейский) — жаргонное нарицательное название для программного кода крайне низкого качества, использующего простые, но порочные принципы «copy-paste».
Почему именно индусский?
По слухам в Индии с некоторых времен существует практика оценки производительности труда программиста на основе количества написанного кода. Чем больше кода, тем больше программист работает, и, следовательно, выше его оклад. Шустрые индусы быстро сообразили, как обманывать неквалифицированных заказчиков.
Полезное замечание от kaladhara
Житель Индии — индиец, а индус — это последователь любого направления индуизма. Таким образом даже чукча преклонных годов, исповедующий шиваизм (и, вероятно пишуший на с++) — индус.

Итак, если вы хотите научиться программировать так как это делают в микрочипе следуйте следующим простым советам…

0. Больше кода — больше профит!

Самое важное, что надо запомнить

нанимаясь

получив работу в микрочипе: «Они-таки платят за строки кода!». Поэтому любыми способами увеличивайте объемы исходных текстов. Совет общий, так что без примеров, включайте фантазию.

1. Классика жанра

Классика жанра индусского

кино

кода незыблема со времен его появления, для разминки попробуйте угадать что скрывается за этим куском кода, содержащемся в файле «MDD File SystemSD-SPI.c» на строчке 1042:

if(localCounter != 0x0000)
{
    localPointer--;
    while(1)
    {
        SPIBUF = 0xFF;
        localPointer++;
        if((--localCounter) == 0x0000)
        {
           break; 
        } 
        while(!SPISTAT_RBF);
        *localPointer = (BYTE)SPIBUF;
    }
    while(!SPISTAT_RBF);
    *localPointer = (BYTE)SPIBUF;  
}  

не спешите заглядывать в ОТВЕТ — это просто:

// в данном контекте (если значение счетчика на выходе не важно) сойдет и такое
while (localCounter--)
{
	SPIBUF = 0xFF;
	while (!SPISTAT_RBF);
	*localPointer++ = SPIBUF;
}

// а это полный аналог, имеющий на выходе то же значение счетчика
// правда на одну строчку длиннее - чуть менее эффектно
while (localCounter)
{
	localCounter--;
	SPIBUF = 0xFF;
	while (!SPISTAT_RBF);
	*localPointer++ = SPIBUF;
}

2. Копипаст

В отсутствии фантазии подойдет и копи-пейст, хотя по слухам многие работодатели проверяют код на копипаст, микрочип видимо не из их числа. Запомните, для срубания бабла индусским кодом никогда не используйте макросы — они зло и безобразно уменьшают код. В пример кусок, повторяющийся раз двадцать в файле «MDD File SystemFSIO.c»:

ctrl+v

if (utfModeFileName)
{
	utf16path++;
	i = *utf16path;
}
else
{
	temppath++;
	i = *temppath;
}

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

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

#define getnextpathchar() ( utfModeFileName ? *++utf16path : *++temppath ) // где-то в начале
	...
	i = getnextpathchar(); // там где надо

Соотношение 10:1 в пользу первого варианта, а с учетом двадцатикратного повторения в абсолютных величинах это несколько сот рупий!

3. Линейный код

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

не стесняйтесь делать так

fileFoundString[fileFoundLfnIndex--] = lfnObject.LFN_Part3[1];
fileFoundString[fileFoundLfnIndex--] = lfnObject.LFN_Part3[0];

fileFoundString[fileFoundLfnIndex--] = lfnObject.LFN_Part2[5];
fileFoundString[fileFoundLfnIndex--] = lfnObject.LFN_Part2[4];
fileFoundString[fileFoundLfnIndex--] = lfnObject.LFN_Part2[3];
fileFoundString[fileFoundLfnIndex--] = lfnObject.LFN_Part2[2];
fileFoundString[fileFoundLfnIndex--] = lfnObject.LFN_Part2[1];
fileFoundString[fileFoundLfnIndex--] = lfnObject.LFN_Part2[0];

tempShift.byte.LB = lfnObject.LFN_Part1[8];
tempShift.byte.HB = lfnObject.LFN_Part1[9];
fileFoundString[fileFoundLfnIndex--] = tempShift.Val;
tempShift.byte.LB = lfnObject.LFN_Part1[6];
tempShift.byte.HB = lfnObject.LFN_Part1[7];
fileFoundString[fileFoundLfnIndex--] = tempShift.Val;
tempShift.byte.LB = lfnObject.LFN_Part1[4];
tempShift.byte.HB = lfnObject.LFN_Part1[5];
fileFoundString[fileFoundLfnIndex--] = tempShift.Val;
tempShift.byte.LB = lfnObject.LFN_Part1[2];
tempShift.byte.HB = lfnObject.LFN_Part1[3];
fileFoundString[fileFoundLfnIndex--] = tempShift.Val;
tempShift.byte.LB = lfnObject.LFN_Part1[0];
tempShift.byte.HB = lfnObject.LFN_Part1[1];
fileFoundString[fileFoundLfnIndex--] = tempShift.Val;

Инициализация структур должна быть побайтной, не надо писать простые инициализаторы типа:

const somestruct mystruct = {"Field1", 2, 4, 8 .... };

не стесняйтесь делать и так, memset для лузеров, а это живые деньги

gDataBuffer[0] = 0xEB;         //Jump instruction
gDataBuffer[1] = 0x3C;
gDataBuffer[2] = 0x90;
gDataBuffer[3] =  'M';         //OEM Name "MCHP FAT"
gDataBuffer[4] =  'C';
gDataBuffer[5] =  'H';
gDataBuffer[6] =  'P';
gDataBuffer[7] =  ' ';
gDataBuffer[8] =  'F';
gDataBuffer[9] =  'A';
gDataBuffer[10] = 'T';
gDataBuffer[11] = 0x00;             //Sector size 
gDataBuffer[12] = 0x02;
gDataBuffer[13] = disk->SecPerClus;   //Sectors per cluster
gDataBuffer[14] = 0x20;         //Reserved sector count
gDataBuffer[15] = 0x00;
disk->fat = 0x20 + disk->firsts;
gDataBuffer[16] = 0x02;         //number of FATs
gDataBuffer[17] = 0x00;          //Max number of root directory entries - 512 files allowed
gDataBuffer[18] = 0x00;
gDataBuffer[19] = 0x00;         //total sectors
gDataBuffer[20] = 0x00;
gDataBuffer[21] = 0xF8;         //Media Descriptor
gDataBuffer[22] = 0x00;         //Sectors per FAT
gDataBuffer[23] = 0x00;
gDataBuffer[24] = 0x3F;         //Sectors per track
gDataBuffer[25] = 0x00;
gDataBuffer[26] = 0xFF;         //Number of heads
gDataBuffer[27] = 0x00;
// Hidden sectors = sectors between the MBR and the boot sector
gDataBuffer[28] = (BYTE)(disk->firsts & 0xFF);
gDataBuffer[29] = (BYTE)((disk->firsts / 0x100) & 0xFF);
gDataBuffer[30] = (BYTE)((disk->firsts / 0x10000) & 0xFF);
gDataBuffer[31] = (BYTE)((disk->firsts / 0x1000000) & 0xFF);
// Total Sectors = same as sectors in the partition from MBR
gDataBuffer[32] = (BYTE)(secCount & 0xFF);
gDataBuffer[33] = (BYTE)((secCount / 0x100) & 0xFF);
gDataBuffer[34] = (BYTE)((secCount / 0x10000) & 0xFF);
gDataBuffer[35] = (BYTE)((secCount / 0x1000000) & 0xFF);
gDataBuffer[36] = fatsize & 0xFF;         //Sectors per FAT
gDataBuffer[37] = (fatsize >>  8) & 0xFF;
gDataBuffer[38] = (fatsize >> 16) & 0xFF;         
gDataBuffer[39] = (fatsize >> 24) & 0xFF;
gDataBuffer[40] = 0x00;         //Active FAT
gDataBuffer[41] = 0x00;
gDataBuffer[42] = 0x00;         //File System version  
gDataBuffer[43] = 0x00;
gDataBuffer[44] = 0x02;         //First cluster of the root directory
gDataBuffer[45] = 0x00;
gDataBuffer[46] = 0x00;
gDataBuffer[47] = 0x00;
gDataBuffer[48] = 0x01;         //FSInfo
gDataBuffer[49] = 0x00;
gDataBuffer[50] = 0x00;         //Backup Boot Sector
gDataBuffer[51] = 0x00;
gDataBuffer[52] = 0x00;         //Reserved for future expansion
gDataBuffer[53] = 0x00;
gDataBuffer[54] = 0x00;                   
gDataBuffer[55] = 0x00;
gDataBuffer[56] = 0x00;                   
gDataBuffer[57] = 0x00;
gDataBuffer[58] = 0x00;                   
gDataBuffer[59] = 0x00;
gDataBuffer[60] = 0x00;                   
gDataBuffer[61] = 0x00;
gDataBuffer[62] = 0x00;                   
gDataBuffer[63] = 0x00;
gDataBuffer[64] = 0x00;         // Physical drive number
gDataBuffer[65] = 0x00;         // Reserved (current head)
gDataBuffer[66] = 0x29;         // Signature code
gDataBuffer[67] = (BYTE)(serialNumber & 0xFF);
gDataBuffer[68] = (BYTE)((serialNumber / 0x100) & 0xFF);
gDataBuffer[69] = (BYTE)((serialNumber / 0x10000) & 0xFF);
gDataBuffer[70] = (BYTE)((serialNumber / 0x1000000) & 0xFF);
gDataBuffer[82] = 'F';
gDataBuffer[83] = 'A';
gDataBuffer[84] = 'T';
gDataBuffer[85] = '3';
gDataBuffer[86] = '2';
gDataBuffer[87] = ' ';
gDataBuffer[88] = ' ';
gDataBuffer[89] = ' ';

4. Изобретаем велосипед или деньги из пробелов

На очередную мысль меня навела идея функции FileObjectCopy в файле «MDD File SystemFSIO.c» на строчке 6065, подозреваю что если бы у них было больше разных структур то появились бы и другие SomeObjectCopy

сама функция

void FileObjectCopy(FILEOBJ foDest, FILEOBJ foSource)
{
	int size;
	BYTE* dest;
	BYTE* source;
	int Index;

	dest = (BYTE*)foDest;
	source = (BYTE*)foSource;

	size = sizeof(FSFILE);

	for (Index = 0; Index < size; Index++) {
		dest[Index] = source[Index];
	}
}

Описание очаровывает простотой:

The FileObjectCopy function will make an exacy copy of a specified FSFILE object.

Если «exacy» == «exact» как следует из кода, то это профитная замена прямого присвоения структур — стандартной операции в ANSI C, a сделанное компилятором, оно должно быть и быстрее и компактнее так как используются аппаратные FSR/INDF регистры. Для разных объектов подойдет memcpy(d, s, sizeof(s)) и работает он тоже быстро, во всяком случае его ассемблерная реализация.

не прибыльная версия FileObjectCopy, дизассемблированный вариант от HITech C18

; *FileObject1 = *FileObject2; // Одна строчка на С
; Загружаем индирект регистры
MOVLW FileObject1 >> 8
MOVWF FSR1H
MOVLW FileObject1
MOVWF FSR1L
MOVLW FileObject2 >> 8
MOVWF FSR0H
MOVLW FileObject2
MOVWF FSR0L
; Копируем
MOVLW sizeof(*FileObject)
loop:
MOVFF POSTINC0, POSTINC1 ; Три команды процессора на скпированный байт
DECFSZ WREG, F
BRA loop

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

int FSerror (void)
{
    return FSerrno;
}

Даже если это исключительно для того чтобы сделать переменную read-only то такого макроса вполне достаточно, чтобы компилятор выругался где надо:

#define FSerror() ( FSerrno )

5. Комментарии с фанатизмом

Комментируйте все подряд, кроме самых не очевидных кусков (см пример 1.) Если вы еще не достигли полного просветления и в вашей индусской программе случайно осталось две-три функции — создайте «шаблон описания функции», включите туда умные слова-разделы, в разделе «Description» перечислите еще раз все что было написано выше, но развернуто. Особенно эффект умножения строк кода проявляется с функциями типа «FSerror()» из примера выше.

даже пустой такая шапка смотрится значимо

/**************************************************************************
  Function:
    void func (void)
  Summary:
    Does a hard work
  Conditions:
    This function should not be called by the user
  Input:
    None
  Return Values:
    None
  Side Effects:
    None
  Description:
    This function will do <a hard work>, with <none> input parameter....
  Remarks:
    Optimize code later
**************************************************************************/

6. Используйте особенности архитектуры

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

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

Еще раз удвоить количество кода вам поможет то, что указатели RAM и ROM в компиляторах под PIC разные, то есть «char*» не может быть преобразован явно или неявно к «const char*» в хайтеке или «const rom char*» в микрочипе. Что вобщем-то проблем в хайтеке не вызывает совсем, так как void, far и const указатели могут адресовать всю память и применяться как к ROM так и RAM. Но в микрочиповской реализации си это может привести к созданию двух функций: одной работающей с ROM, а второй с RAM — чистый профит. Никогда не следует довольствоваться одной функцией, работающей с оперативной памятью (а при необходимости загружающей туда константы из ROM).

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

Вместо заключения

Попытавшись заставить заработать микрочиповское чудо (их сайт все-таки поднялся) я потратил чуть больше времени чем то, за которое написал свою реализацию работы с SD и портировал файловую систему, взятую здесь, о чем и вас предупреждаю — аккуратнее: «glitch inside».

Меня много спрашивали что такое «индусский код» и почему все ак на него матерятся. Вот, спёр несколько примеров, наслаждайтесь, коллеги :)
Особо мне нравится пример №4 :)

Индусский код

Алсо аутентичный индусский код пишется на хинди и транслитерируется в C, C++ или java.
Настоящий индусский код

Примеры индусского кода

Пример № 1 (C#)
uint i;

if (i.ToString().Length == 1)
{

}

Не сразу можно понять, что в этом коде просто-напросто выполняется проверка i < 10. Алгоритм достаточно прост: выполняется преобразование i в строку, после чего вычисляется её длина. Если число больше 9, то его десятичная запись содержит больше одного символа. Отрицательные числа переменная типа uint содержать не может. Проверку проходят лишь числа от 0 до 9.

Алгоритм ресурсоёмок, не очевиден и не поддается сопровождению даже теоретически.
[Еще чуток]
Пример № 2 (C#)
double rest(float a, float b)
{float res=a*b;
for (int i=0; i< 999999999; i++)
if (i<=res && i+1>res) {res = res-i; break;}
return res;
}

Далеко не сразу можно понять, что этот код выделяет дробную часть произведения a*b. кроме того, функция выдаст ошибочное значение при a*b>999999999 или a*b<0. Также зависимость времени выполнения от величины целой части тоже не радует.

Пример № 3 (C#)
bool IsNumber (string str)
{
return (str.Replace («0», «»).Replace («1», «»).Replace («2», «»).Replace («3», «»).Replace («4», «»).Replace («5», «»).Replace («6», «»).Replace («7», «»).
Replace («8», «»).Replace («9», «»).Length == 0);
}

Хотя в данном случае, вообще говоря, алгоритм вполне очевиден, не менее очевидно и то, что для его выполнения конструктор класса string будет вызван не менее десяти раз, со всеми вытекающими из этого последствиями. И всё только потому, что какому-то индусу было лень придумать менее ресурсоёмкую альтернативу.

Пример № 4 (C#)
bool value;

if (value.ToString().Length == 4)
{

}
else if (value.ToString().Length == 5)
{

}
else
{

// внимание! кто-то хочет нас наебать подсунув некачественный (по всей вероятности, протухший) bool, но мы ему не дадим:
throw new ArgumentException();
// у некоторых племенных индусов бывает и продолжение, на случай если throw вдруг не сработает:
return !true && !false;
// надо же вернуть какую-нибудь хуйню, чтобы заказчик не ныл.
}

В этом примере проверка истинности значения логической переменной производится с помощью длины её текстового представления. Если длина равна четырём („True“), значение истино, если пять („False“) — ложно, если ни то, ни се — тогда включаем panic mode и начинаем жарить карри.

Пример № 5 (PHP)
if ($_POST[«end_oplata»]!=»sending» and $_POST[«continue_oplata»]!=»prodoljit» and $_POST[«prov»]!=»proverka») {

}
elseif ($_POST[«continue_oplata»]!=»prodoljit» and $_POST[«prov»]!=»proverka») {

}
elseif ($_POST[«continue_oplata»]==»prodoljit») {

}

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

К тому же, это пример ужасного стиля именования переменных, containing as английские слова, так и transliterated russian ones. Видимо, сказался author’s poor английский словарный запас.

Пример № 6

TurDuckEn Code — разновидность быдлокода, чаще всего встречающаяся в веб-приложениях. Как спагетти-код, только хуже. ТурДукен (en.w:Turducken) — декадентская расовая пиндосская нямка, cостоящая из индейки (turkey), нафаршированной уткой (duck), зафаршированной курицей (chicken).

Турдукен Код, например, состоит из PHP, фаршированным SQL, нафаршированным HTML, зафаршированным Javascript’ом. Вот так.

Почему именно индусский

В Индии с некоторых времен существует практика оценки производительности труда программиста на основе количества написанного кода. Чем больше кода, тем больше программист работает, и, следовательно, выше его оклад. Шустрые индусы быстро сообразили как обманывать неквалифицированных заказчиков.

©

[И еще примерчик]
Говорят что программистам из Индии деньги платят за количество строчек кода которые они написали(редко обращая внимание на качество).
Вот пример одной из конструкций:
if ($x == 0) {
// Do 1….
}
elseif ($x!=0) {

// Do 2…..
}
else {

//
// А вот здесь чистые деньги :)
//
}

Ну и еще примеров можно посмотреть на лурке

Удачи, вам, коллеги, и поменьше иметь дел с индусским кодом

«Если программист поёт и танцует — значит, он написал индусский код»

(Народная примета)
1

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

По другой трактовке, индусский код — жаргонное нарицательное название для программного кода крайне низкого качества, использующего простые, но порочные принципы «copy-paste», «главное — завалить, а там запинаем», «шапкозакидательство». Также известен как «write only».

Проблема назревала, назревала, да и вызрела.

Толерантный до невозможности сайт BBC прорвало: «Почти двухмиллиардная Индия – глобальный центр оффшорного программирования. Дешевизна – вот что привлекает клиентов кодеров-индусов. Программирование приносит компаниям страны более $25 млрд. ежегодно. Тюрем в Индии, впрочем, тоже достаточно. И сидят там сотни тысяч человек, которые проедают заработанные непосильным трудом соотечественников миллиарды долларов. Сметливые индийские чиновники сообразили, как можно направить энергию заключенных на благо общества. Вместо урановых рудников и рытья канала из Индийского океана до Атлантического их отрядили оказывать услуги IT-аутсорсинга. Так уголовно-исполнительная система страны принимает участие в реализации всеиндийской национальной идеи — стать величайшей IT-державой мира.

Подразделение «аутсорсеров в полосочку» будет создано в одной из тюрем южного штата Андхра-Прадеш. Штат подразделения будут комплектовать только из образованных зэков, которые знают грамоту и умеют считать – их в тюрьме, где развернут эксперимент, аж 40%. На начальном этапе в IT-специалисты возьмут 200 человек. Их научат азам обращения с компьютером, после чего заключенные в три смены бригадами по 70 человек заступят на трудовую вахту – будут обрабатывать данные, выполняя контракт некоего банка.

К вопросам оплаты труда заключенных чиновники подошли с прямо-таки буддистской мудростью. Новоиспеченным IT-специалистам в день будут платить по 100-150 рупий ($2,2-3,32). Это поистине царское вознаграждение. Зэки, занятые менее интеллектуальным трудом типа изготовления стальных коек, получают по 15 рупий (чуть больше 30 центов). Вполне возможно, что IT-аутсорсинг руками заключенных примет действительно промышленные масштабы. Авторы проекта не исключают, что будут комплектовать «сидельцами» даже колл-центры. В общем, конкурентам Индии в области оффшорного программирования (среди них есть и Россия) нужно готовиться к худшему. Использование труда заключенных уронит цены на IT-аутсорсинг буквально ниже плинтуса.

Вне всякого сомнения, даже простейшие операции по обработке данных, которыми нагрузили индийских заключенных, есть труд намного более благодарный, чем прочие занятия, которые пенитенциарная система придумывала для лиц, отбывающих наказание. Комментируя свое начинание, идеологи проекта не без гордости замечают: на свободу – не только с чистой совестью, но и с новой профессией, которая в Индии считается престижной. Вот только интересно: как кадровые менеджеры IT-компаний Бангалора отнесутся к судимостям кандидатов?»

Чем же так достали индийские айтишники остальных тружеников клавы и мыши?

Да всем.

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

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

Фантастическая дешевизна рабочей силы служит основным фактором приема  на работу этих неприхотливых и покладистых смуглолицых людей. Я даже не хочу думать, что есть еще какие-то стимулы, позволяющие главам HR департаментов выгонять на улицу профессионалов, родившихся, выросших,  получивших образование в Канаде и проработавших в фирме десять-пятнадцать лет, и брать на их места парочку-другую плохо говорящих по-английски людей с подозрительными дипломами и одинаковыми, написанными под копирку, резюме. Откаты? Какие откаты? Да вы что! И не я это сказала, заметьте!

И люди из индийских провинций, оплатив наскоро сделанные липовые дипломы, нескончаемым  журавлиным клином летят по маршруту «Индия – Канада», зажав в кулачках временные рабочие визы и заселяют целые кварталы в Скарборо, снимая квартиры по 5-6 человек на радость лендлордам. Курочка по зернышку клюет, а владелец дома по 300 долларов  собирает с индийца, который много не требует, исправно платит и живет кучно,  –  неплохая в итоге с дома сумма собирается.

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

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

Средства массовой информации Канады предпочитали закрывать глаза на эту проблему, но она достигла таких размеров, что оставаться индифферентным стало невозможно. Пару месяцев назад по всем канадским каналам прошли новостные сюжеты о Royal Bank of Canada (RBC), в котором были уволены постоянные сотрудники, а на их место приняты на работу индийцы, приехавшие по временной трудовой визе.

29 апреля  журналистка CBC NEWS Kathy Tomlinson опубликовала нашумевшую статью, собравшую  около тысячи комментариев,  под названием «Insiders say Canada ‘scammed’ by foreign worker industry», в которой вскрыла возмутительные  факты, касающиеся ввоза в страну и работы в канадском бизнесе программистов из Индии: «Инсайдеры утверждают, что канадские менеджеры, принимая на работу индийцев,  получают бонусы за то, что закрывают глаза на их низкую квалификацию и явные нарушения в оформлении рабочих виз, по которым они прибыли в Канаду».

Комментирует эксперт — профессионал, работающий на рынке IT Канады более пятнадцати лет:

Можете ли вы поделиться  фактами дискриминации канадских программистов?

— Да, конечно. Я работал с 2008 по 2010 и с 2012 по 2013 годы в компании AVIVA (Canada Insurance), это очень крупная страховая компания, имеющая около десяти дочерних фирм. В сентябре-октябре 2010 года AVIVA  уволила около 300 постоянных сотрудников. Около 200 из них  были уволены по причине замены их на аутсорсинг. В марте 2013 около  10 человек из IT-департамента  были вынуждены от двух недель до месяца тренировать индийские кадры, обучая их элементарным азам программирования, после этого тренинга их уволили, заменив на «обученных» новых сотрудников. На моих глазах разворачивался конфликт одного из менеджеров с руководством компании. Менеджер на общем собрании заявил, что AVIVA поступает неправильно, лишая рабочих мест канадцев и заменяя их непрофессиональными кадрами из Индии. Его выгнали с работы  через три недели после этого собрания, и начальник сказал на прощание: «Если бы ты молчал, тебя бы не уволили».

Так чем же программисты из Индии насолили канадским коллегам?

— Понимаете, эти люди  — в основном неквалифицированные программисты. Они не соответствуют параметрам канадских компаний. Кроме того, они не проходят секьюрити проверку и клиренс чек (и работают потом  с банками, имея доступ к приватной финансовой информации клиентов). Качество их программ очень низкое, и это создает опасность не только для вашего кошелька, когда вы покупаете некачественный товар или к вам приходит неправильный счет за газ или воду, но и для жизни. Вы, наверное, помните нашумевшую историю с Therac-25 — аппаратом лучевой терапии, медицинским ускорителем, созданный канадской государственной организацией Atomic Energy of Canada Limited. Тогда из-за ошибки, допущенной в коде, погибло как минимум шесть человек.

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

IT-индустрия в Канаде умирает, потому что корпорации заменяют профессионалов на дешевый аутсорсинг, имеющий иностранное происхождение. Все заказы уходят на оффшор, в страны с дешевой рабочей силой, в частности, в Индию, и мы никак не можем этому помешать – действуют законы рынка и, видимо, откаты, но об этом не принято говорить вслух, слишком агрессивно в последнее время преследуется критика, высказанная по этой проблеме. Задействованы целые адвокатские конторы. Собственно, поэтому я не раскрываю свое имя – я не хочу преследований за свои слова.

Как вы считаете, существуют ли пути выхода из сложившейся ситуации?

Да, они есть. Прежде всего необходимо создать организацию, защищающую права работников IT-индустрии. Мы сейчас лишены элементарной правовой и финансовой поддержки государства и юридической защиты от действий работодателя, выкидывающего профессионалов на улицу. В наших услугах нуждаются все – но когда тебя увольняют, тебе некуда жаловаться. Кроме того, такая организация, сочетая профессионализм и независимость,  – назовем ее профсоюз – могла бы осуществлять экспертные функции, тестируя программы при необходимости, определяя профессиональный уровень принимаемых на работу айтишников и выступая экспертом в спорных вопросах. Я со своей стороны готов принять участие в этом экспертном совете, если понадобится.

Наверное, существуют еще какие методы борьбы с проблемой, например, бойкотирование предприятий, дискриминирующих канадцев и использующих дешевую рабочую силу?

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

Нет ли опасности увести проблему в сторону дискриминации по национальному признаку?

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

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

По другой трактовке, индусский код — жаргонное нарицательное название для программного кода крайне низкого качества, использующего простые, но порочные принципы «copy-paste», «главное — завалить, а там запинаем», «шапкозакидательство». Также известен как «write only», или (в пику принципу «написано однажды — читается везде») — «написанное однажды — лучше не читать».

В Индии с некоторых времен существует практика оценки производительности труда программиста на основе количества написанного кода. Чем больше кода, тем больше программист работает, и, следовательно, выше его оклад. Шустрые индусы быстро сообразили, как обманывать неквалифицированных заказчиков.

В результате чего можно встретить подобные шедевры (и это только цветочки!):

if (true) {
// какой-то код
} else {
// a вот тут чистый profit
}
Менее очевидный вариант:

if(var)
{

}
else if(!var)
{

}
else
{
// чистые деньги
}
И особенно весело получается, когда где-нибудь вверху скромно стоит


#define true false

Ну и уж совсем замечательно, когда


#define true (Math.random()>0.5)
… Поговаривают, что последний пример уже из области какого-то стохастического программирования.

Также аутентичный индусский код пишется на хинди и транслитерируется в C, C++ или Java. По некоторым сведениям, индусский код поют и танцуют, и только потом записывают на хинди. Есть народная примета: если программист поёт и танцует — значит, он написал индусский код.

Также при частой работе с этими «спецами», фраза «The only good Indian is a dead Indian» обрастает новым смыслом.

http://lurkmore.to/%D0%98%D0%BD%D0%B4%D … 0%BE%D0%B4

А что думает народ по этому поводу?

August 24 2015, 19:08

Categories:

  • Литература
  • IT
  • Cancel

Индусский код и китайский код

Прочитал на Луркморе, чем индусский код отличается от китайского. Индусский код происходит от построчной оплаты, поэтому внутри него можно найти тонны кода, которые никогда не будут использованы. И вот сегодня как раз увидел такой пример — что характерно, внутри open-source библиотеки:

Тут, если непонятно, вся конструкция if-else — лишняя. Величина задана в лоб, делать ветки в зависимости от неё — бессмысленно.

Я всем (двум людям) этот код показал, посмеялся, а потом обнаружил, что это магия, а не индусский код. Дело в том, что я смотрел код в контексте проекта, и это число — 480 — видел только в контексте данного проекта. В других проектах, с другими размерами в Project.xml, это число будет другим. В исходном коде библиотеки вместо числа стоит ::WIN_HEIGHT::. Это такие макросы, Карл!

Отсюда мораль — не спеши смеяться, последним будешь. Или — хорошо смеётся тот, кто смеётся над собой.

PS: китайский код — это брутальное решение алгоритма без использования циклов, массивов и прочих изящных конструкций. Строк получается тоже много. Но главное отличие от индусского, что все они рабочие, просто тупые. Пример китайского кода — когда вместо одной строки
var a = new Array[12,24,36,22];
все пишется так
var a1 = 12;
var a2 = 24;
var a3 = 36;
var a4 = 22;
// Тут надо добавить еще 10-15 таких же переменных, чтобы код приобрел законченный китайский вид :)

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