Програмистки митове, част втора

Миналия път представих една много смела теза.

C++ е некадърен език, защото е бавен.
Тази хипотеза беше потвърдена на практика тук. Показах, че технология отдавна приета за по-низша всъщност представя по-добри резултати.

Няколко човека ми потърсиха сметка за нахалството - до един ме заклеймиха като еретик.

Чух всички отговори, които можеше да се очакват.
Никой обаче не се сети за верния.

Ето го.

Тази статия е по-дълга от предишната. Все пак, надявам се да ти бъде интересна. Някъде в нея ще намериш отговори на въпросите, които задавам.

Първата статия е тук.

Но първо

Какви опровержения получих:

Ти си тъп

(може и да е вярно, не знам)

Не е възможно, аз съм чел кода на STL. Той е съвършен, чуваш ли ме - съвършен. Няма начин нещо там да не е оптимално.

(И все пак, числата казват друго).

Използвай потоци за низове (stringstream) и с тях всичко става перфектно. Петдесет пъти по-бързо от твоето, чел съм кода, той е…

(Това беше същият човек. Потоци и бързина не се използват в едно и също изречение. Освен това, защо трябва да намесвам и допълнителен клас? Просто искам да събера два низа, окей? Не е като да пиша софтуер за ракети.)

Аз все пак си харесвам C++. Него съм учила, него ще ползвам.

(Не мога да ти помогна. Никой не може да ти помогне, ако не искаш да се развиваш.)

Ако декларираш низ с предварително зададена големина(която се изчислява като сума на дължините на всички низове), след това събереш всички низове в първия със strcat, всичко ще работи много по-бързо отколкото на глупавия Питон.

(Да, това е вярно. Но е решение на чисто C, не на C++. Освен това е грозно. Не знам дали искам да работя с теб.)

В C има вградена функция sprintf - с нея може да се получи код красив почти колкото този на Питон, а освен това и ще бъде бърз колкото C.

(Вярно. Но отново, това е решение на C. C++ продължава да е закърнял израстък без приложение.)

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

Ето го:

Ти си тъп.

Попитах: Кой език трябва да избера за силно натоварена програма?

Правилният отговор всъщност беше:

Това не е правилен въпрос.

Макар че бих приел и Ти си тъп, няма никакво значение.

Съжалявам. Всичко, което казах миналия път беше вярно.
И въпреки това, изводът беше лъжа.
Казах го, за да заблудя C++ фанатиците. Да ги накарам устремено да защитят своята позиция, а след това да им покажа, че са паднали право в капана ми. И че това, което защитават е изначално грешно. Единственото ми съжаление е, че повечето хора решиха да се свържат с мен лично, или по Skype. Така че, нямам писмено доказателство за думите си. Но, нищо никога не е съвършено, а за думите си свидетелствам сам пред себе си с шестте часа прекарани в спорове, които няма да си върна :)
C++ е бавен. И освен това е гаден език. Но C++ не е гаден език, защото е бавен.

Поуката е:

Един програмист трябва да вижда отвъд това, което е отвъд очевидното

(Или беше нинджа? Все ги бъркам…)

За нещастие, малко програмисти, и въобще българи, са научени да мислят в едър мащаб. В числото на неуките вписвам и себе си. Тази статия не я измислих сам - подсказаха ми го.

Битието определя съзнанието

(Карл Маркс)
Съжалявам, трябваше да напиша комунистическия цитат.
За нещастие - верен е.

Един приятел, който учи във японистика във Велико Търново

наскоро ми дойде на гости за два дена в София. Не е програмист по образование, но има повече опит в програмирането(а и във всичко на тема компютри) от почти всички студенти във ФМИ. Защото започна да работи в десети клас. Три години опит като програмист, техник и дизайнер(3 различни работи) са по-добре от шестица по немски език. Макар че ако четеш това, то вероятно за теб вече е твърде късно, съжалявам. С едно изречение - човекът може да се изхранва с програмиране, особено Web.

Та, Иван(да го наречем Иван) дойде с мен на курса Ruby on Rails. Там водещите(твърде нескучни са, за този курс не мога да си изкривя езика да кажа преподаватели) два часа обясняваха аргументирано и образовано защо Рейлс е толкова хубава платформа за създаване на сайтове.

Защото всичко става бързо, лесно и качествено. Програмистът не трябва да се занимава с тривиалните детайли, а за същото време може да направи по-функционално приложение.

Наистина, програмирането на рейлс е мечта. За един ден - без преди да съм докосвал платформата - успях да направя сайт с:

  • login (потребителско име, парола, хеш на паролата + salt, различни нива на достъп, интерфейс за влизане/излизане)
  • функционалност (решаване на задачи по информатика онлайн, качване на нови задачи, показване на решения)
  • Тема, разделена на части (main, header, footer, sidebar)
  • Остана ми време за HTML разкрасяване, CSS и съобщения за грешки

И това за десет часа. При положение, че не знаех как става предварително.

Обаче

Какво ми каза Иван(както го нарекох, за да скрия истинската му самоличност от спамъри)?

Това всичкото е много яко. Супер е. Ама никога няма да го използвам.

А? Защо?

Руби е бавно. Рейлс е бавно. Един сървър за Рейлс винаги ще струва повече от един сървър за PHP. Вероятно трябва да е поне 20% по-мощен. Айде обясни на шефа си, че ти трябва по-скъп сървър.

Рейлс е бавно. Но не е толкова бавно. Освен ако сайтът ти не привлича някакъв милионен трафик. А дори и тогава - пак ще работи добре. Най-популярният сайт в България(Свежо.нет) се захранва именно от Рейлс.

Тъжното е, че беше прав…

Малко са програмистите, както и шефовете на програмисти, които въобще ценят човешкия труд. Дори и трудът на чистачи и хамали е ценен. По-ценен от машинния. Така де, струва ли си да си купиш машина за рязане на дърва, или просто ще оставиш работниците да ги цепят с брадви?
А какво остава за професиите, които изискват интелигентност, които не съвсем всеки може да върши?

И, колко точно ще струва един 20% по-мощен сървър? Най-много 500 лева отгоре на базовата цена. А ако ги дадеш, програмистът ще работи много по-бързо. В крайна сметка, ще спестиш от времето на програмиста, тоест ще печелиш повече от по-голямо количество нови продукти. Един програмист по-малко от петстотин лева ли струва?

И двамата знаем отговора на този въпрос.

Но не искам да го кажа.
В една бедна страна, хората мислят като бедняци. Наскоро гледах филм. За колосалния провал в Африка на компанията за електрически крушки ОСРАМ(както може би е очевидно от името, компанията не е българска).

Направили за два милиона долара електростанция на слънчеви батерии в Африка. Не е като да няма слънце там. И предлагат сделка на местните рибари. Те на седмица дават по десет долара(или каквато беше валутата) за бензин, за лампи, които използват за риболов. Слагат лампата във водата, тя свети, рибата отива към нея, рибарят я хваща. Да, знам, слагат бензин в езерото, от което ядат. Не казвам, че са най-умните рибари на света. Една слънчева лампа струва четиридесет долара, и на седмица харчи ток за два долара. За пет седмици се избива инвестицията, а оттам нататък е на огромна печалба.

Колко човека се включили в инициативата?

Двама.

Мдам. Двумилионна електроцентрала. Двама купувачи.
Защо?
Защото тези хора са бедни. Не мислят за бъдещето. Оцеляват ден за ден. На седмица печелят по десет долара. С новата лампа щяха да печелят по осемнадесет, но първо ще трябва да спестят четиридесет. Не занимавай тези хора с разсрочено плащане или каквото там. Те живеят в догми. За тях нещата не подлежат на промяна. Дори и когато е очевидно, болезнено очевидно, за добро.

Спри за секунда и се огледай

Ти така ли мислиш?
Избираш ли винаги само познатото?
Правиш ли компромиси, защото няма пари за хубавото?
Хабиш ли се ден след ден, защото вярваш, че толкова заслужаваш?


Обратно на основната тема

Миналия път публикувах едни данни. Симулация на конструиране на URL, триста милиона пъти.
Въпросът, който зададох беше:

На кой език е най-добре да се напише програмата за конструиране на URL при такъв голям трафик?

Но това беше въпрос уловка.

Правилният въпрос беше:

Кой е този сайт, който има по триста милиона посещения на месец?

Гугъл

Гогле. Google.
Малко статистика.

Колко заявки обработва Гугъл на месец?

Опитах се да намеря колко заявки на месец обработва Гугъл. Преди четири-пет години са били по 300 милиона на месец. За януари 2008 са били около 6 милиарда. Източник
Предполагам, че в момента са още повече, но това не е от решаващо значение.

Колко компютъра има Гугъл?
Това е трудо да се каже, защото като всяка уважаваща себе си корпорация, Гугъл крие някои неща от публиката. Не одобрявам, но решението не е мое. Все пак, от време на време публикуват научни доклади с техни открития. Един такъв доклад е за алгоритъма MapReduce, който черпи идеи от функционалното програмиране. Според много хора този алгоритъм е най-печелившата идея на фирмата, и точно той им помага да продължават да предоставят качествени резултати, въпреки огромното нарастване на Интернет. За част от работата по него през септември 2007 са използвани 11 081 компютърни години. Източник

Единадесет. Хиляди. Години.

Представи си, че преди да си легнеш не си спреш компютъра, а го оставиш да смята нещо. Примерно да разчита някакви сложни молекули или някой да търси извънземни. Ако го оставиш цяло денонощие, това са 24 часа. Сега си представи четири милиона пъти по толкова. Е, това е времето, което е отделил Гугъл за смятане на MapReduce през септември 2007.

Това се равнява на 150 000 компютъра

Забележка: В доклада никъде не се казва, че това са всички компютри, които притежават. Аз залагам на поне двойно. А докладът е от 2006. Може би спекулирам, но предполагам, че днес имат поне един милион машини.


Аз проведох моите изчисления с 300 000 000 итерации, защото просто нямах три дена да отделя за 6 000 000 000.
Ето резултатите от миналия път:

Language - Time(s)
C - 44.91 
C_optimized - 20.16 
CPP - 508.57 
CPP_optimized - 474.38 
Python1.py - 405.32 
Python1.pyc - 405.95 
Python2.py - 229.71 
Python2.pyc - 235.57

Да сравним най-добрия с най-лошия вариант? Неоптимизирано C++ срещу оптимизирано C.
CPP е с осем минути по-бавно. Ако го пускаш на домашния си компютър, осем минути са значима разлика. Но.
Осем минути, разпределени на тридесет дни, прави по 16 секунди на ден. Шестнадесет секунди не са чак толкова фрапиращи дори и за един компютър.
Ами за сто хиляди?
Но да кажем, че не са 16 секунди. Нека бъдат 16 минути. Майната му, нека бъдат 24 часа. За да генерира низовете, един компютър трябва да се трепе по цял ден, всеки ден. Въпросът е:

Колко са 30 дни от 11 хиляди години?

В крайна сметка, излиза че няма абсолютно никакво значение на кой език е написано нещо.
Поне по отношение на скорост.
Но Оптимизираният код е грозен.

Малко въпроси за размисъл:

  • Програмистът, който напише десет хиляди реда оптимизиран код, дали ще се чувства добре след това? Или ще си потърси нова работа като гробар, за да си приповдигне настроението?
  • Програмистът, който наследи десетте хиляди реда код, дали няма да намрази предшественика си, а и света като цяло? Дали след това ще може да създава красиви неща?
  • Ако някой ден, по някаква причина, се появи бъг в кода, колко часа ще отнеме да бъде намерен и оправен този бъг? Или дни, седмици? Колко пари ще изгуби фирмата заради това, струвало ли си е? И само не ми казвай В моя код няма бъгове. Моля те.

Вече чувам как някой ми крещи в ухото:

А компютърните игри? Ако не беше C++, щеше да видиш компютърни игри през крив макарон! Всичко друго е твърде бавно за тях.

Това, естествено, не е вярно.

В третата, финална част от тази поредица, ще го покажа именно с игра.
Как се постига 1000% увеличение на производителността?
Коя всъщност е истинската причина C++ да смуче?
Защо в университета ни преподават неща, които просто не са верни?

Ще го оставя за следващия път.

Мое вдъхновение за текущия текст бяха една поредица от статии на Джеф Атууд по същата тема. Най-новата от тях може да бъде намерена |тук.

Мислиш, че нещо съм объркал? Да видим.

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License