Написание программного обеспечения, я считаю, состоит из двух частей:
- Идея и
- Реализация.
Идея о мышлении: "У меня есть эта проблема, как ее решить?" и далее: "Как я могу решить это изящно?" Ответы на эти вопросы можно получить, если подумать об алгоритмах и архитектуре. Идеи приходят частично через анализ, а частично через проницательность и интуицию.
Идея обычно является легкой частью. Вы разговариваете со своими друзьями и коллегами, и вы гасите его на встрече или за кофе. Это займет час или два, плюс изменения, которые вы реализуете, и находите новые проблемы.
Этап внедрения разработки программного обеспечения настолько сложный, что мы шутим об этом. "О, - говорим мы, - остальное - это простая проблема кода". Потому что это должно быть просто, но это никогда не будет.
Раньше мы писали наш код на перфокартах, и это было сложно: ошибки были очень трудными для обнаружения, поэтому нам пришлось потратить дополнительные усилия, чтобы каждая линия была идеальной. Затем у нас были последовательные терминалы: мы могли сразу увидеть весь наш код, выполнить поиск по нему, упорядочить его иерархически и создать вещи, абстрагированные от исходного машинного кода.
Сначала у нас были ассемблеры на один уровень от машинного кода. Мнемоника освободила нас от запоминания машинного кода. Затем у нас были компиляторы, которые освободили нас от запоминания инструкций. У нас были виртуальные машины, которые позволяют нам отойти от деталей, специфичных для машины.
И теперь у нас есть расширенные инструменты, такие как Eclipse и Xcode, которые выполняют анализ нашего кода, чтобы помочь нам быстрее писать код и избегать распространенных ошибок.
Но писать код по-прежнему сложно. Написание кода - это понимание больших, сложных систем и инструментов, которые мы имеем сегодня, просто не очень далеко, чтобы помочь нам в этом. Когда я нажимаю "найти все ссылки" в Eclipse, я получаю список из них в нижней части окна. Я нажимаю на один, и я оторван от того, на что я смотрю, и вынужден переключиться на контекст. Архитектура Java обычно имеет несколько уровней глубины, поэтому я должен переключаться и переключаться и переключаться, пока не найду то, что я действительно ищу - к этому моменту я забыл, откуда я пришел. И я делаю это весь день, пока не понял систему. Это налогообложение умственно, и Eclipse не делает многого, чего нельзя было сделать в 1985 году с помощью grep, за исключением того, что есть сотни мегабайт ОЗУ.
Код записи едва изменился, так как мы смотрели на янтарь на черном. У нас есть теоретическая основа для гораздо более продвинутых инструментов, которые действительно помогают нам понять и расширить сложные системы, с которыми мы работаем каждый день.
Так почему же писать код все еще так сложно?