Если вы программист, не считайте себя «ученым-программистом»; Ученые-компьютерщики - это те, кто создает компьютеры следующего поколения, некоторые из которых по-прежнему являются научной фантастикой, пока не будет получено правильное сочетание материалов, миниатюризации и вычислительной теории. Они являются только началом трубопровода. Люди, которые разрабатывают программное обеспечение здесь и сейчас, являются «инженерами программного обеспечения»; они используют теории и инструменты, иногда наслоив практическую теорию и инструменты реального мира, чтобы использовать всю мощь этого сложного куска электроинического волшебства и заставить его делать то, что мы хотим. Это, в свою очередь, одна из специализаций в области «компьютерной инженерии», которая берет теории компьютерных ученых и применяет их, аппаратное и программное обеспечение, к реальным электронным решениям для конечных пользователей.
Это ИМО, где бизнес встречается с теорией. В таких случаях старую поговорку «враг лучшего достаточно хорош» можно легко развернуть, чтобы прочитать «враг хорошего - лучше». Считая себя «инженером», а не «ученым», и помещая то, что вы делаете параллельно с другими инженерными дисциплинами, вы облегчаете различия.
Допустим, к вам приходит клиент, инженер-строитель и просит вас построить мост. Мост должен простираться на 20 футов, выдерживать саму нагрузку и перевозить одну тонну груза, он должен прослужить 10 лет с обычным обслуживанием, и они хотят его в месяц за 20 000 долларов. Это ваши ограничения; Соблюдайте минимумы, не превышая максимумы. Делать это "достаточно хорошо" и получать зарплату. Было бы плохо для вас построить мост Золотые Ворота, который на несколько порядков превзошел бы как проектные характеристики, так и бюджет. Вы обычно в конечном итоге съедаете перерасход средств и платите штрафы за перерасход времени. Кроме того, было бы плохо спроектировать для вас веревочный мост, рассчитанный на вес 5 взрослых мужчин, даже если он стоил всего 1000 долларов во времени и материалах; Вы не получаете хорошие отзывы и отзывы клиентов,
Возвращаясь к программному обеспечению, скажем, у вас есть клиент, которому нужна система обработки файлов, созданная для того, чтобы переваривать входящие файлы и помещать информацию в систему. Они хотят, чтобы это было сделано за неделю, и он должен обрабатывать пять файлов в день, объемом около 10 МБ данных, потому что это весь трафик, который они получают в настоящее время. Ваши драгоценные теории в основном выходят в окно; Ваша задача состоит в том, чтобы создать продукт, который соответствует этим спецификациям в течение недели, потому что таким образом вы также соблюдаете бюджет расходов клиента (поскольку материалы, как правило, не годятся для контракта на программное обеспечение такого размера). Тратить две недели, даже в десять раз больше, это не вариант, но, скорее всего, это не программа, созданная за день, которая может обрабатывать только половину пропускной способности, с инструкцией для запуска двух копий.
Если вы думаете, что это крайний случай, вы ошибаетесь; это повседневная среда большинства домашних работников. Причина в рентабельности инвестиций; эта первоначальная программа не стоит много и, следовательно, очень быстро окупится. КОГДА конечным пользователям нужно больше или быстрее, код можно реорганизовать и масштабировать.
Это основная причина текущего состояния программирования; Предположение, подтвержденное всей историей вычислений, состоит в том, что программа НИКОГДА не является статичной. Он всегда должен быть обновлен, и в конечном итоге он будет заменен. Параллельно постоянное совершенствование компьютеров, на которых работают программы, позволяет снизить внимание к теоретической эффективности и повысить внимание к масштабируемости и распараллеливанию (алгоритм, который выполняется за N-квадрат времени, но который можно распараллелить для работы на N ядрах, будет кажутся линейными, и часто стоимость большего количества оборудования дешевле, чем стоимость разработки более эффективного решения).
Кроме того, существует очень простой принцип, что каждая строка кода разработчика - это что-то еще, что может пойти не так. Чем меньше пишет разработчик, тем менее вероятно, что то, что он пишет, имеет проблему. Это не критика чьего-либо "уровня ошибок"; это простая констатация факта. Возможно, вы знаете, как писать MergeSort вперед и назад на 5 языках, но если вы нажмете только один идентификатор в одной строке кода, вся сортировка не будет работать, и если компилятор не поймал ее, это может привести к часов, чтобы отладить его. Сравните это с List.Sort (); это там, это эффективно в общем случае, и, что самое лучшее, это уже работает.
Итак, многие особенности современных платформ и принципы современных методологий проектирования были созданы с учетом этого:
- ООП - встраивать связанные данные и логику в объект, и где концепция этого объекта является действительной, то есть это объект или более специализированный вывод.
- Готовые шаблоны - хорошие 60% или более кода являются синтаксической несоответствием и основами того, чтобы программа показывала что-то на экране. Стандартизируя и автоматически генерируя этот код, вы вдвое сокращаете рабочую нагрузку разработчика, что позволяет повысить производительность.
- Библиотеки алгоритмов и структур данных. Как и в предыдущем примере, вы можете знать, как писать стек, очередь, быструю сортировку и т. Д., Но зачем это нужно, когда есть библиотека кода, в которой все это встроено? Вы не будете переписывать IIS или Apache, потому что вам нужен веб-сайт, поэтому зачем реализовывать алгоритм QuickSort или объект красно-черного дерева, когда доступно несколько отличных реализаций?
- Свободные интерфейсы. В том же духе у вас может быть алгоритм, который фильтрует и сортирует записи. Это быстро, но, вероятно, не очень читабельно; Вашему младшему разработчику понадобится день, чтобы понять это, не говоря уже о том, чтобы внести хирургические изменения, необходимые для сортировки дополнительного поля в объекте записи. Вместо этого библиотеки, такие как Linq, заменяют множество очень уродливого, часто хрупкого кода одной или двумя строками настраиваемых вызовов методов, чтобы превратить список объектов в отфильтрованные, отсортированные, проецируемые объекты.