Программировать элементарно. Ну точнее алгоритмировать. По крайней мере в школе этому обучают и те 15 операторов паскаля вполне может выучить даже самый отсталый ученик за учебный год. И даже написать вполне полезную программку для себя, калькулятор, напоминалочку, блокнотик. Ну или игрушку.
Однако откуда такой недостаток программистов? И при том что институты, онлайн учебники, книжки PHP для чайников миллионами штампуют каких то невнятных кодеров.
Потому что нужно разбираться с этой алхимией и заставлять её решать вполне реальные инженерные и бизнес задачи. И программисты нужны как раз для того чтобы знать стопицот решений проблемы и мог выбрать правильное в этом контексте. Как это не странно именно этим занимаются те самые настоящие «инженеры программисты». Не кодят а решают проблемы. Иногда даже удаётся их решать посредством кодинга, да.
Вообщем когда вы принимаете инженерные решения нужно учитывать много факторов. От этих факторов зависит и выбор языка программирования, стека технологий да и процесса разработки (ну там SCRUM, Kanban, RUP). И про эти факторы и желаемое свойства ПО я хочу поделится своими наблюдениями, всего лишь информация к размышлению. Ну начнём с простого, очевидного и самого популярного у начинающих программистов…
Скорость работы программы.
Имеется ввиду увеличение скорости за счёт архитектурных особенностей компьютера. Т.е. скорость аппаратная.
Примеры: разворачивание циклов, арифметика указателей, битовые операции, инлайнинг функций, безусловные переходы goto, быстрый обратный квадратный корень.
Актуально для игр, баз данных, какого нибудь специфичного софта для обработки потоков информации (видео, сеть).
Языки лучшие для достижения этого свойства: Си/Си++, местами возможен ассемблер.
Тут прийдётся очень туго — увеличение скорости как правило достигается усложнением системы, переход на чуть ли не процессорный уровень абстракции. Это очень портит жизнь: сопроводительность программы осложняется, размер программы увеличивается, масштабируемость, скорость разрабтки падает, короче ухудшается ВСЁ.
Скорость работы на деле же оказывается самым ненужным параметром, скелет которого только изредка вываливается из шкафа. Поэтому как это не парадоксально, скорость программы это то на что нужно твёрдо забить и лишь оптимизировать самые тормознутые участки и только когда возникла практическая нужда. Если у вас сильно большие проблемы со скоростью, то скорее всего вам нужно поработать над алгоритмами, масштабируемостю и архитектурой приложения (возможно поменяв стек технологий).
Самое интересное, что компиляторы зачастую сами умеют делать нужные оптимизации. Вы же привязываетесь жёстко к железу и своими хаками-оптимизациями только мешаете компилятору помочь вам.
Быстрого кода не существует. Так или иначе мы дойдем до железа, оперируя тактами процессора. И тем не менее, всегда найдутся условия, при которых алгоритм отработает не на максимально возможной скорости и будет являться главной причиной тормозов.
Попытка учитывать максимальное число таких случаев ни к чему хорошему не приводит — ты начинаешь терять контроль над кодом. Попытка абстрагирования от железа так же не приведет нас ни к чему хорошему. Каждый уровень абстракции будет отталкивать нас все дальше и дальше. Поэтому второе правило совершенного кода — код не может быть быстрым всегда и везде. Нет смысла оптимизировать его весь. Преждевременая оптимизация корень всех зол, сосредоточтесь только на наиболее часто вызываемых участках.
Скорость алгоритмическая
Правильно подобраные алгоритмы могут существенно увеличить скорость.
Например: фильтр Блума, двоичный поиск, контрольные суммы.
Вот это предпочтительней, правильно подобраные структуры и алгоритмы позволят вам неплохо увеличить скорость. Тут тоже главное не переусердтсовать.
Масштабируемость и высоконагружаемость
Ну или как это назвать. Это возможность увеличить производительность системой просто добавив ещё один сервер (node — узел) в кластер. Здесь стоит отметить что масштабируемость бывает вертикальная (интенсивная), когда мы увеличиваем мощность одного серера, и горизонтальная (экстенсивная) когда мы просто рядом ставим ещё один слабенький сервачок.
Чтобы так разрабатывать софт нужны совершенно другие подходу к софту.
Стек технологий: NoSQL, алгоритм Map/Reduce.
Точность
Это нужно для научного софта (математического, физического).
Ну прийдётся все константы увеличивать намного, плясать с бубном над вычислениями с большими числами. Для всего этого есть специальные математические библиотеки, в том числе и Matlab.
Стандартность
Соответствие всяким RFC, J2EE спецификациям, прохождение ACID тестов броузерами, ANSI SQL.
Это хроническая проблема майкрософта которую они превратили в своё конкурентное преемущество.
Обфускационность.
Иногда нужно сделать так чтобы никто не смог узнать как утсроена твоя программа. Яркий пример - скайп.
Защищённость и безопасность
В разработке банковского софта, сайтов, много сил уходит на закрыватие всех потенциальных дыр чтобы не случилось беды.
Яваскрипт, например, потому очень сильно обрезан и ограничен чтобы избежать возможности подхатить пользователям вирус. Но IE умудряется и тут просрать все полимеры.
Обратная совместимость.
Особенно актуально во всяких open source библиотеках, платформах, операционных системах.
Майкрософт этому очень большое внимание уделяет и спустя 20 лет вы до сих пор можете запустить большинство MSDOS программ даже на семёрке.
Качество (отсутсвие дефектов)
Например ворд не может себе позволить иметь багов. Люди покупают офисный пакет и потом возможно ещё долго его не будут обновлять. Поэтому фиксы багов накапливаются в некие сервис паки.
Понятность
Вот самый важный параметр. Был. Сейчас уступил тестируемости и отошёл на второе место.
Вашу программу потом будут читать так что постарайтесь уж её сделать грамотно.
Так же стоит отметить что понятность это не обязательно «Идеальный код» или «Чистый код». Адский говнокод может быть вполне понятен.
Тестируемость
Самый важный параметр. Важнее чем понятность, хотя на самом деле тестируемость как правило улучшает архитектуру и понятность. Но не всегда. Чтобы оттестировать часто нужно тоже создавать немного дополнительной сложности. Но это себя оправдывает.
На сегодняшний день всё чаще можно услышать что тестируемость - главный показатель качества кода.
Юзабилити
Вас утомляет ждать перезагрузки всей страницы когда вы отправляете комментарий? Ага, ну тогда нужно делать пляски с аяксом. Значит увеличиваем сложность системы.
Юзабилити это отдельная наука со своими противоречивыми принципами. Например карандаш имеет очень простой интерфейс, но научится им пользоваться довольно тяжело (вспомните ваши калякул маракули в детстве или коптение над чертежами в институте). И другой пример: приборная панель самолёта, она тоже на самом деле обладает удобным интерфейсом.
Юзабилити обычно путают с красотой. На самом деле вещи разные и даже более, юзабилити может очень сильно ударить по красоте.
Продолжение следует…