- PVSM.RU - https://www.pvsm.ru -

Джефф Этвуд (автор Stack Overflow) предсказал [1] этот феномен ещё в 2007 году. Он тогда сформулировал так называемый закон Этвуда:
Любое приложение, которое можно написать на JavaScript, будет в итоге написано на JavaScript.
Так и вышло.
А если серьёзно, то это явный тренд в софтверной разработке, который наблюдается уже два десятилетия. Сейчас большинство GUI-приложений разрабатываются на платформе HTML/CSS/JavaScript.
Для разработки кросс-браузерных приложений на веб-стеке чаще всего используется платформа Electron [2], которая стала своеобразным стандартом.
В наше время на «Электроне» сделано практически всё [3]:
… и десятки других популярных десктопных программ.
Люди смирились и просто смотрят, как одна за другим нативные программы переходят на Electron со всеми вытекающими последствиями. Дело даже не в общей тормознутости и излишнем пожирании памяти (хотя это неизбежно в браузерной оболочке). В реальности производительность JS-кода по части UI даже обогнала типичный .NET за счёт многолетней тщательной оптимизации выполнения JS в браузерах. Нормально спроектированные JS-приложения сейчас гораздо быстрее, чем раньше. Но они по определению не могут сравниться с нативным софтом. Поэтому раздувание софта идёт полным ходом [4].
Почему так происходит? Логика абсолютно понятна. Фирме выгоднее разрабатывать и поддерживать одну платформу (веб) вместо N (веб+разные десктопные и мобильные ОС). Это чисто экономический вопрос: банально требуется меньше программистов.
Преимущества нативных приложений совершенно не очевидны для компании. Да, они могут быть быстрее. Но для этого нужно приложить усилия по оптимизации. И разница в скорости не так велика, чтобы обращать на неё внимание.
JavaScript проще, чем C++, так что и с этой точки зрения веб-платформа кажется привлекательнее. Происходит своеобразная коммодитизация разработки, когда создание приложений ставится на конвейер. Все они становятся похожи друг на друга, и производятся в «фабричном» стиле с помощью фреймворков типа Angular JS и Vue.JS. Правда, со временем становятся видны недостатки такого подхода [5]:
В итоге большие кодовые базы оказываются заблокированы в рамках определённой архитектуры/реализации. В некоторых ситуациях остаётся единственный вариант — переписать всё с нуля. С годами кодовая база начинает так пахнуть, что уже никто не хочет к ней прикасаться.
Программисты старой школы не поддаются на новые веяния. Если посмотреть на творения лучших разработчиков [6], то там код максимально оптимизирован, GUI зачастую отсутствует, а производительность — наивысший приоритет. Вот список крутых опенсорсных программ [7], которые выбиваются из общего ряда. Это принципиально другой, «антипотребительский» подход к разработке. К сожалению, таких образцов становится всё меньше. Последние могикане. Упомянем некоторые из них:
ranger, написанный на Gonoice с большим количеством функцийvi, написанный на Python, с очень приятным интерфейсом

ranger
sxiv, зависимости: xlib и imlib2ffmpeg, которому нужен для работы mplayerdunst, который передаёт нотификации в STDOUT, так что пользователь может обрабатывать их на своё усмотрение, как в панели dwmtpmmupdf) и PDF (с mupdf или poppler)/bin/sh, оптимизированная на минимально возможный размерksh из OpenBSDmg, поддерживается командой OpenBSDpico, маленький и простой в использованииneatvi с дополнительными функциямиviedvim и samvi:set go+=c для блокировки всех всплывающих окон) может быть скомпилирован в предельно минималистичном стиле, как vim-tiny в репозиториях Debianvimacme для POSIX
youtube-dl для скачивания видео и звука с YouTube и других платформПолный список см. на сайте Stuff That Rocks [7].
Практически любое стандартное приложение можно оптимизировать. Например, для мобильных аппликаций критический параметр — время первоначального запуска, то есть промежуток между нажатием кнопки и загрузкой интерактивного интерфейса. Это тем более важно, поскольку первый запуск создаёт первое впечатление о приложении. Даже небольшая оптимизация будет заметна.
Люди очень чувствительны к задержке интерфейса. Пятнадцать лет назад Amazon выяснила [90], что каждые 100 мс задержки веб-сайта уменьшают продажи на 1%. С тех пор требования публики значительно ужесточились.
В 2017 году Akamai констатировала, что каждые 100 мс задержки снижают конверсию уже на 7% [91].
В 2018 году Google опубликовала статистику [92] по загрузке мобильных страниц. Выяснилось, что пользователи на мобильных устройствах менее терпимы к задержкам. Так, при росте задержки с одной до трёх секунд количество отказов от загрузки возрастает на 32%, при росте до пяти секунд количество отказов увеличивается на 90%, и так далее.
Поэтому так важно оптимизировать мобильные сайты и приложения. И есть стандартные способы оптимизации, доступные каждому. Например, разработчики DoorDash рассказали [93], как ускорили первоначальную загрузку iOS-приложения на 60%:

Трассировка стека, показывающая три возможности оптимизации

Трассировка стека String(describing:) API
Замена идентификации типов String(describing:) на простой указатель типа ObjectIdentifier сразу ускорила загрузку приложения на 11%, а это всего одна строчка кода!


Эта простая оптимизация (опять одна строчка кода) ускорила запуск приложения ещё на 29%, а выполнение команд — на 55%.

Разработчики подкрутили динамический линкер (dyld), чтобы он пропускал эти вызовы при запуске.
Все сделанные оптимизации в целом ускорили запуск приложения DoorDash примерно на 60%.
Эта история наталкивает на мысль, что большинство мобильных приложений абсолютно не оптимизированы. Они включают в код внешние библиотеки, которые 90% времени выполняют ненужные операции, как String(describing:) [96] выше, добавляя задержку на пустом месте.
В результате даже самая простая программа типа hello, world! с внешними модулями и зависимостями начинает неизбежно лагать на любом, даже самом быстром устройстве.

Есть мнение, что пользователям не нужен быстрый софт, потому что они якобы «ленивы и туповаты» [98]. Мол, пипл «схавает» всё, что дадут. Даже ужасной прилагой с задержкой десять секунд на каждое нажатие будет кто-то пользоваться. Люди привыкают к ужасу — и начинают считать его нормой. Однако адаптивный механизм психики — не оправдание для создания плохих продуктов.
Так или иначе, но фронтенд на HTML/CSS/JavaScript стал стандартом на всех платформах: и на десктопных, и на мобильных. Даже инструменты для разработчиков выпускаются в том же стиле. Например, Visual Studio Code [99] на КДПВ — это браузер (Chromium) с сервером Node.js и файлами HTML/CSS, скомпилированными в исполняемый бинарник. Все переходят на веб-платформу. Ничего не поделаешь, таков путь.
Автор: Анатолий Ализар
Источник [100]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/383829
Ссылки в тексте:
[1] предсказал: https://www.quora.com/Why-do-people-write-GUI-desktop-apps-in-JavaScript-making-them-just-glorified-web-pages-C-is-much-faster-and-Python-is-much-easier-to-use/answer/Ainun-Nazieb
[2] Electron: https://electronjs.org/
[3] практически всё: https://www.electronjs.org/apps
[4] раздувание софта идёт полным ходом: https://tonsky.me/blog/disenchantment/
[5] недостатки такого подхода: https://gerrysweeney.com/why-do-write-desktop-gui-desktop-apps-in-html-css-javascript-making-them-just-glorified-web-pages/
[6] творения лучших разработчиков: https://bellard.org/
[7] список крутых опенсорсных программ: https://suckless.org/rocks/
[8] moc: https://moc.daper.net/
[9] mpd: https://www.musicpd.org/
[10] mus: https://sr.ht/~q3cpma/mus/
[11] vorbis-tools: https://www.xiph.org/
[12] btpd: https://github.com/btpd/btpd
[13] newsraft: https://codeberg.org/grisha/newsraft
[14] ncurses: https://invisible-island.net/ncurses/
[15] sfeed: https://codemadness.org/sfeed.html
[16] sfeed_curses UI: https://codemadness.org/sfeed_curses.html
[17] snownews: https://github.com/kouya/snownews/
[18] zs: http://r-36.net/scm/zs/
[19] lf: https://github.com/gokcehan/lf
[20] mc: https://midnight-commander.org/
[21] nnn: https://github.com/jarun/nnn
[22] noice: https://git.2f30.org/noice/
[23] ranger: https://ranger.github.io/
[24] rover: https://lecram.github.io/p/rover/
[25] sfm: https://github.com/afify/sfm/
[26] stagit: https://git.codemadness.org/stagit/
[27] stagit-gopher: https://git.codemadness.org/stagit-gopher/
[28] stagit-gemini: https://git.milotier.net/stagit-gemini/
[29] feh: https://feh.finalrewind.org/
[30] imv: https://sr.ht/~exec64/imv/
[31] lel: https://git.codemadness.org/lel/file/README.html
[32] meh: https://www.johnhawthorn.com/meh/
[33] qiv: https://spiegl.de/qiv/
[34] sxiv: https://github.com/muennich/sxiv
[35] nsxiv: https://codeberg.org/nsxiv/nsxiv/
[36] xli: http://web.aanet.com.au/gwg/xli.html
[37] xwallpaper: https://github.com/stoeckmann/xwallpaper
[38] xzgv: http://sourceforge.net/projects/xzgv/
[39] ffplay: https://www.ffmpeg.org/ffplay.html
[40] mplayer: http://www.mplayerhq.hu/design7/news.html
[41] mpv: https://mpv.io/
[42] herbe: https://github.com/dudik/herbe
[43] tiramisu: https://github.com/Sweets/tiramisu
[44] oathtool: https://www.nongnu.org/oath-toolkit/oathtool.1.html
[45] pinentry-dmenu: https://github.com/ritze/pinentry-dmenu
[46] dmenu: https://tools.suckless.org/dmenu
[47] pass: https://www.passwordstore.org/
[48] spm: https://github.com/BioBox/spm
[49] tpm: https://github.com/nmeum/tpm/
[50] mupdf: https://mupdf.com/
[51] zathura: https://pwmt.org/projects/zathura/
[52] dash: http://gondor.apana.org.au/~herbert/dash/
[53] mksh: https://www.mirbsd.org/mksh.htm
[54] oksh: https://github.com/ibara/oksh
[55] yash: https://yash.osdn.jp
[56] acme: http://acme.cat-v.org
[57] plan9port: https://9fans.github.io/plan9port/
[58] ed: https://9fans.github.io/plan9port/man/man1/ed.html
[59] «стандартный текстовый редактор»: https://www.gnu.org/fun/jokes/ed-msg.html
[60] ired: http://www.radare.org/r/
[61] mg: https://homepage.boetes.org/software/mg/
[62] mle: https://github.com/adsr/mle
[63] nano: https://www.nano-editor.org/
[64] neatvi: https://github.com/aligrudi/neatvi
[65] nextvi: https://github.com/kyx0r/nextvi
[66] nvi: https://sites.google.com/a/bostic.com/keithbostic/vi
[67] micro: https://micro-editor.github.io/
[68] sam: http://sam.cat-v.org/
[69] sim: https://sim.ssnf.xyz/
[70] traditional vi: http://ex-vi.sourceforge.net/
[71] vim: https://www.vim.org
[72] vis: https://github.com/martanne/vis
[73] wily: http://www.cse.yorku.ca/~oz/wily/
[74] csvquote: https://github.com/skeeto/scratch/tree/master/csvquote
[75] json2tsv: https://codemadness.org/json2tsv.html
[76] md4c: https://github.com/mity/md4c
[77] CommonMark: https://commonmark.org/
[78] abduco: https://www.brain-dump.org/projects/abduco/
[79] dvtm: https://www.brain-dump.org/projects/dvtm/
[80] entr: https://eradman.com/entrproject/
[81] mrandr: https://gitlab.com/mhdy/mrandr
[82] mtm: https://github.com/deadpixi/mtm
[83] tine: https://github.com/deadpixi/tine
[84] nq: https://github.com/chneukirchen/nq
[85] pv: https://www.ivarch.com/programs/pv.shtml
[86] smenu: https://github.com/p-gen/smenu
[87] snore: https://github.com/bitsmanent/snore
[88] yt-dlp: https://github.com/yt-dlp/yt-dlp
[89] zbar: http://zbar.sourceforge.net/
[90] выяснила: https://www.gigaspaces.com/blog/amazon-found-every-100ms-of-latency-cost-them-1-in-sales
[91] каждые 100 мс задержки снижают конверсию уже на 7%: https://web.archive.org/web/20190628162811/https://www.akamai.com/uk/en/about/news/press/2017-press/akamai-releases-spring-2017-state-of-online-retail-performance-report.jsp
[92] опубликовала статистику: https://www.thinkwithgoogle.com/consumer-insights/consumer-trends/mobile-page-speed-new-industry-benchmarks/
[93] рассказали: https://doordash.engineering/2023/01/31/how-we-reduced-our-ios-app-launch-time-by-60/
[94] Performance Analysis: https://www.emergetools.com/product/performanceanalysis
[95] Проверка соответствия протоколу Swift: https://github.com/apple/swift/blob/244ca4e2426260e7b9161c2fd6534dc350983cdf/stdlib/public/runtime/ProtocolConformance.cpp#L970
[96] String(describing:): https://developer.apple.com/documentation/swift/string/init(describing:)-67ncf
[97] AnyHashable: https://developer.apple.com/documentation/swift/anyhashable
[98] пользователям не нужен быстрый софт, потому что они якобы «ленивы и туповаты»: https://buttondown.email/hillelwayne/archive/maybe-people-do-care-about-performance-and/
[99] Visual Studio Code: https://code.visualstudio.com/
[100] Источник: https://habr.com/ru/post/725602/?utm_source=habrahabr&utm_medium=rss&utm_campaign=725602
Нажмите здесь для печати.