Автор: Nikita
От 15 години се занимавам с програмиране. Но последно време никой не мисли за ефективността, простотата и съвършенството на кода. Вече ми е притеснено и тъжно за моята кариера и за целия IT сектор.
Съвременните автомобили например, работят с 98% от възможностите, които предлага самата конструкция на двигателя. В модерните сгради се използва точно колкото трябва материал, за да изпълняват своята функция и да бъдат безопасни. Всички самолети започнаха да си приличат, защото бяха постигнати оптималните размер, тегло, форма и натоварване.
Единствено при софтуера се приема за нормално, когато една програма работи с 1% или дори с 0,01% от възможната производителност. И като че ли никой не възразява и няма нищо против. Има хора, които дори се гордеят, колко неефективно работи тяхната програма. Така де, „какво има да му мислим, компютрите са достатъчно бързи“.
@tveastman: Всеки ден стартирам и използвам програма, написана на Python, която се изпълнява за 1,5 секунди. Трябваха ми шест часа, за да я препиша на Rust и сега тя се изпълнява за 0,06 секунди. Това подобрение на ефективността означава, че тези шест са се излели в 41 години и 24 часа време.
Може би сте чували мантрата, че „Времето на програмиста е по-скъпо от компютърното време„. Това означава, че харчим компютърно време в безпрецедентни мащаби. Бихте ли закупили автомобил, който гори 100 литра на 100 километра? А какво мислите за 1000 литра? При компютрите това е ежедневие.
Всичко е непоносимо бавно
Огледайте се наоколо: днешните преносими компютри са хиляди пъти по-мощни от тези, които заведоха човека до Луната. И все пак половината уебсайтове в интернет не могат да осигурят плавно превъртане на страницата при 60 кадъра в секунда на най-съвременния MacBook Pro. Мога да играя игри, мога да гледам 4К видео, но не мога да скролвам уеб страниците! Това нормално ли е?
Уеб приложението Google Inbox, създадено именно от Google, има нужда от 13 секунди, за да отвори писмо с умерен размер.
This is, in real time, how long it takes for Google Inbox running in Google Browser to open an email. Not the shortest one, but still, it’s just text and pictures! Go Web Stack go! pic.twitter.com/CvqsFiIUuc
— Nikita (@nikitonsky) February 28, 2018
То дори анимира празните бели полета, вместо просто да покаже тяхното съдържание, защото това е единственият начин да се анимира нещо в уеб страниците с прилична производителност. Не, няма 60 Hz, а „колкото изобщо е възможно за тази уеб страница“. Нямам търпение да видя какво ще предложи уеб-обществото, когато 120 Hz дисплеи станат масови.
Обновяването на Windows 10 отнема 30 минути. Какво толкова се върши през това време, че продължава толкова дълго? Това време е достатъчно, за да форматирам изцяло своя SSD, да изтегля най-новата версия на тази операционна система и да я инсталирам 5 пъти подред.
Павел Фатин: набирането на текст в текстовия редактор е относително прост процес и дори компютрите с древните 286 процесори осигуряваха плавното въвеждане на текста.
Само че в съвременните текстови редактори задръжката при въвеждането е по-голяма, отколкото в 42-годишния Emacs. Текстови редактори! Кое би могло да бъде по-просто? При всяко натискане на клавиш е необходимо само да се обнови малка правоъгълна област на екрана, но съвременните текстови редактори не могат да направят това за цели 16 милисекунди. А това е много време. МНОГО. Днешните 3D игри запълват екрана със стотици хиляди полигони (!) за същите тези 16 милисекунди, като през това време се обработва управлението на играта, пресмята се нейния свят и динамично се зареждат и освобождават ресурси. Как може така?
Тенденцията е такава, че софтуерът не става по-бърз и по-функционален. Ние си купуваме бързи компютри, на които софтуерът със същите функции се влачи по-бавно отпреди. Всичко работи многократно по-бавно, отколкото е възможната максимална скорост. Не сте ли замисляли, защо вашият смартфон стартира за 30 или 60 секунди? Защо не може да зареди примерно за 1 секунда. За това няма никакви хардуерни ограничения. Лично на мен това би ми харесало. Бих искал разработчиците да достигат предела и да използват всеки бит за постигането на по-висока производителност.
Всичко е ОГРОМНО
И раздуто. Уеб приложенията биха се стартирали десет пъти по-бързо, ако просто се блокира рекламата. Google вече умолява всички да използват AMP, за да намалят това забавяне. AMP е технологично решение, за което не са необходими някакви сложни съвременни технологии, а просто здрав смисъл. Ако премахнем раздуването, интернет ще работи с огромна скорост. Нима е толкова сложно да се разбере това?
ОС Android без приложенията заема почти 6 GB. Замислете се за малко, колко огромно е това число. Какво има там, филми с HD качество? Мисля си, че там са поставени ядрото и драйверите. Е, разбира се и някои други ресурси, но не могат да бъдат чак толкова големи. От колко драйвера имате нужда за телефона?
Windows 95 заемаше 30 MB. Днес има уеб страници, които са по-тежки от тази операционна система! Windows 10 вече заема 4 GB – тоест, 133 пъти повече. Но нима е 133 пъти по-добра? Искам да кажа, че функционално те са практически еднакви. Вярно, вече има Cortana, но се съмнявам, че тя заема 3970 MB. Но хайде, това е Windows 10, нима Android трябва да е един и половина пъти по-голям?
Приложението Google keyboard изяжда цели 150 MB. Тази програма рисува 30 клавиша на екрана, но нима е пет пъти по-сложна от цялата Windows 95? Google app, който в основни линии е програмен пакет за Google Web Search заема 350 MB. Услугата Google Play, която аз лично не използвам (не купувам оттам книги, музика или филми) е голяма 300 MB и просто си стои, без да мога да я махна.
След инсталирането на всички необходими приложения (социални мрежи, чатове, карти, банкиране и т/н/) в телефона остават едва 1 GB за снимки. При това въобще без игри и музика. А помните ли времената, когато всички ваши данни се побираха само на една дискета?
Вашата програма за съставяне на разписания навярно е написана в средата на Electron и разбира се включва драйвер за контролерите на Xbox 360, може да показва 3D графика, да възпроизвежда аудио и да снима с помощта на уеб камера.
Обикновения текстови чат винаги се е славил със своята висока скорост и малка консумация на памет. А Slack е приложение, което консумира твърде много ресурси. Имам предвид, че текстовият редактор и чатът са най-базовите неща и трябва да изразходват най-малко ресурси. Добре дошли в 2018 година.
Можете да кажете, че те все пак работят. Но увеличаването на размера съвсем не означава подобряване. Всичко това означава, че вече няма контрол. Ние вече не знаем какво точно се случва. Увеличаването на размера означава увеличаване на сложността, намаляване на производителността и надеждността. Това не е нормално и не трябва да става норма. На твърде раздутия размер веднага трябва да се обръща внимание и да се стои по-далече от него.
Всичко гние
Преди три години, Android смартфонът с 16 GB бе прекрасен. Днес, под управлението на Android 8.1 той едва работи, понеже всяко едно приложение е станало двойно по-голямо. Без видими причини. Допълнителни функции няма. Приложенията не са станали по-бързи и техният външен вид си е същият. Те просто са се раздули.
iPhone 4s излезе с iOS 5, но едва работи под управлението на iOS 9. И това не е, защото iOS е станала много добра – в основни линии тя не се е променила. Но новият хардуер е по-бърз и те направиха софтуера по-бавен. Не се тревожете – вие получихте спиращи дъха нови възможности, като например… работата на същите приложения със същата скорост! Не знам каква друго да добавя.
iOS 11 спря поддръжката на 32-битовите приложения. Това означава, че ако разработчикът не намери време и не обнови своето приложение, то навярно вече няма да видите тази отлична програма.
@jckarter: Програмата за DOS може без никакви промени да работи на всеки компютър, направен след 80-те години. Но JavaScript приложението може да спре да работи заради утрешното обновяване на Chrome.
След 10 години днешните уеб страници няма да работят в нито един браузър (а може и по-рано).
„Трябва да бягаме с всички сили, за да останем на едно място“. А смисълът в този случай? Мога като всички да си купувам най-новите смартфони и лаптопи, но да правя това само за да стартирам и използвам все същите приложения, които са станали толкова бавни?
Мисля че можем и сме длъжни да оправим това положение на нещата. Сега всички пишат програми за днешния ден и много рядко за утрешния. Но би било много по-добре, ако започнем да правим неща, които издържат по-дълго.
По-лошо означава по-добре
Днес никой нищо не разбира. И не иска да разбира. Ние просто предлагаме боклуци, надяваме се на по-доброто и наричаме това „здрав смисъл за стартъпа“.
Уеб страниците искат опресняване, ако нещо не потръгне както трябва. И кой има време да търси причината за дефекта?
Всяко едно уеб приложение генерира непрекъснат поток от „случайни“ JS грешки, дори и на съвместимите браузъри.
Цялата архитектура на уеб базите данни се гради на предпоставката (дори надеждата), че никой няма да промени данните, докато гледате отворената уеб страница.
Повечето приложения за съвместна работа са ги направили „както могат“ и в тях има редица сценарии, какво да се прави, когато се губят данни. Виждали ли сте надписа „Коя версия да запиша?“. Днес летвата е толкова ниско, че потребителите дори се радват на този въпрос.
Не, в моя свят не е нормално да име приложение, което да ми съобщава: „Аз ще унищожа част от твоята работа, ти само си избери коя„.
В Linux се спират случайните процеси, а това е най-популярната сървърна операционна система.
Всяко едно от моите устройства така или иначе дава дефект. От време на време мониторът Dell трябва му се направи хардуерен ресет, понеже в него има някакъв софтуер. AirDrop? Ще имате късмет, ако открие устройството. Bluetooth? Спецификациите са толкова сложни, че устройствата не могат да изградят надеждна връзка помежду си, като оптималният вариант е периодичното рестартиране.
Дори не ми се говори за концепцията Интернет на нещата. Там всичко е толкова извън границите на разумното, че няма какво да допълня.
А аз искам да се гордея със своята работа. Искам да създавам надеждни и стабилни неща. За тази цел е необходимо добре да разбираме, какво разработваме – отвътре и отвън. А това е невъзможно да се направи в едни прекомерно раздути и извънредно усложнени системи.
В програмирането е същият хаос
Струва ми се, че вече никой повече не е заинтересован от качествени, бързи, ефективни, дълготрайни и стабилни решения. Дори и отдавна да са известни най-ефективните решения, ние продължаваме да се борим със същите проблеми: управлението на програмните пакети, компилаторите, езиковите конструкции, IDE.
@przemyslawdabek: струва ми се, че rm-rf node_modules е неразривна част от работния процес в Node.js/JavaScript проектите.
А времето за компилиране? Никой не счита за проблем, че компилаторът работи десетки минути и дори часове. Нали времето на програмиста е по-скъпо? Почти всички компилатори, предпроцесори и постпроцесори работят твърде бавно и понякога катастрофално увеличават времето на компилирането, без да дават нещо ново.
Машинното обучени и ИИ превърнаха софтуера в гледане на кафе. Те дават ненадеждни и непредсказуеми резултати, които трудно могат да бъдат обяснени.
Ние натикаме виртуални машини в Linux, а след това натикахме Docker във виртуалните машини. И сега никой не може да се оправи с бардака, който създават повечето програми, езици и среди. Започнахме да покриваме боклука с одеяла, за да не го почистваме. Така например, „Single binary“ си остава едно огромно преимущество в Go. Където няма бардак, идва успехът.
Програмите не могат да работят няколко дни без рестартиране. Понякога дори и два-три дни са много нещо. Изникват случайни дефекти и никой не знае защо.
И което е по-лошо, никой няма време да се спре и да си изясни, какво се е случило. Защо да го мислим, като има и друг начин. Да се рестартира процеса. Да се спре и пусне базата данни. Да се напише скрипт, който ще рестартира бъгавото приложение на всеки 20 минути. Просто се използват всички ресурси и надве-натри всичко е готово и излиза на пазара. Давай, бързай, няма време за оправяне на грешки.
Това не е инженерна работа. Това е мързеливо програмиране. Инженерната работа изисква дълбоко разбиране на производителността, структурата и ограниченията на това, което създавате. Комбинирането на лошо написани неща с още по-лошо написан код е точно обратното. За да се развиваме, трябва да разбираме за какво и защо правим тези неща.
Заседнали сме
По този начин, това е просто една купчина едва работещ код, добавен към написан по-рано едва работещ код. Той продължава да расте по размер и сложност, и намалява шансовете за промени.
За да имаме здрава екосистема трябва да се върнем назад. Понякога трябва да се изхвърля боклука и да се избере по-добра алтернатива.
Но кой има време за това? Нови ядра за операционни системи не са писани от 25 години. Това е твърде сложно, за да се заеме някой и да го създаде наново. В браузърите има толкова прецеденти, че едва ли някой ще се осмели да напише енджин от нулата.
Заседнали сме и никой не може да ни спаси.
На бизнеса му е все едно
На потребителите също. Те свикнаха да приемат това, което правим. Ние (специалистите) казваме, че всяко приложение за Android заема 350 MB? Добре, ще си живеят с това. Казваме, че не можем да осигурим плавно превъртане на страницата? ОК, ще търпят телефоните, които лагват. Казваме: „Ако не работи, рестартирай“. И те рестартират. Понеже нямат избор.
Конкуренция също няма. Всички създават все едни и същи бавни, раздути и ненадеждни продукти. Случайният качествен скок напред дава конкурентно преимущество. Например iPhone/iOS срещу другите смартфони, Chrome срещу другите браузъри. Това кара другите да се прегрупират, но за малко.
Нашата мисия на специалисти е да покажем на света потресаващите възможности на съвременните компютри от гледна точка на производителността, надеждността, качеството и удобството на използване. Ако на нас не ни е все едно, хората ще разберат. Няма кой друг освен нас да им покаже, че това е възможно.
Не всичко е толкова зле
Има няколко ярки примера, които показват, че подобряването на ситуацията в съвременните технологии е възможно.
- Работата на Мартин Томпсън (LMAX Disruptor, SBE, Aeron) е впечатляваща, освежаващо лека и ефективна.
- Редакторът Xi на Раф Ливиен изглежда е изграден на базата на правилните принципи.
- Джоната Блоу специално за своята игра разработи език за компилиране, който компилира 500 000 реда в секунда с помощта на стандартен лаптоп. Това е реална студена компилация, без междинно кеширане и без междинни билдове.
Не е необходимо да си гений, за да пишеш бързи програми. Това не е някаква магия. Единственото, което се изисква е да не се създава софтуер на базата на огромния куп боклук, с които се предоставят съвременните софтуерни инструменти.
Манифест за един по-добър свят
Искам да виждам прогрес. Искам промени. За да може съвременният софтуер да става по-съвършен и да не стои на едно място. Не искам отново да изобретявам едни и същи неща и всеки път да предлагам все по-бавен и по-раздут продукт. Искам да повярвам в едно бъдеще, което е по-добро от това, което имаме днес и че ще се появи една нова общност от специалисти, които споделят това мнение.
Това което виждаме днес не е прогрес. Ние едва достигаме бизнес целите с тези твърде лоши инструменти. Ние просто заседнахме и свикнахме с това.
Ето защо искам да кажа, че сегашната ситуация е ужасно глупава. Като специалисти ние можем, длъжни сме и ще направим всичко по-добре. Ние можем да създаваме по-добри, по-бързи, предсказуеми и по-надеждни приложения, които използват по-малко ресурси, при това десетки и стотици пъти по-малко ресурси. Можем и трябва да се гордеем със своята работа.
Надявам се, че не съм сам. Надявам се, че има хора, които искат същото. Ще се радвам, дори и ако само започнем да говорим за това, колко абсурдно нелепа е днешната ситуация в софтуерната индустрия. А след това, напълно е възможно да измислим как да решим проблема.