Опять же, курс разработчиков. Спустя более года после того, как я начал курс, мне удалось приступить к последнему заданию 4-й недели. Моя история такова, что в настоящее время я немного подавлен всеми происходящими вещами, о которых мне нужно позаботиться. Я постоянно нахожусь на грани выгорания.

Я работаю полный рабочий день в качестве фрилансера, и этот проект довольно сложен, поскольку требует глубоких технических навыков, которым нельзя научиться ничем, кроме как изобретать.

Потом наш дом. Мы решили реконструировать его в конце 2020 года. Верхний этаж с крышей пришлось полностью снять и заменить новой крышей, что позволило полностью использовать верхний этаж как место для жизни. появилась идея добавить солнечные батареи, что потребовало определенной переделки электропроводки в доме. Затем во время ужасного шторма у нас сломалась труба, и из-за климатических изменений мы решили, что больше не хотим отапливаться сжиганием ископаемого топлива. Поэтому мы установили тепловой насос для воды и инфракрасные обогреватели для отопления.

И я решил привести своего старшего сына в свою компанию, чтобы он начал учиться программировать. Он закончил школу среднего уровня (в Германии она называется Realschule). Поскольку у него была определенная склонность ко всему компьютерному, это казалось хорошей идеей. Но все же существует огромная разница между увлечением компьютерами и желанием научиться программировать. Посмотрим, как это получится.

И из-за всего этого, а также некоторых проблем со здоровьем и бушующей вокруг пандемии, я как-то потерял энергию, чтобы продолжать курс на всех парах.

В июле я решил приступить к последнему заданию слабой четверки — написать приложение-калькулятор для iOS. И мне очень хотелось это сделать. В глубине души я до сих пор хардкорный программист, несмотря на то, что моя профессия программиста началась около 35 лет назад, когда мне было около 15. Я очень люблю программировать. Так что создание внутренних компонентов калькулятора казалось хорошей идеей и долгожданным изменением.

Поставленная задача была довольно простой. Возьмите обычное приложение-калькулятор. Сделайте кнопки для 10 цифр, некоторых основных операторов и кнопку для выполнения вычислений. А затем распечатать результат.

И пока я думал об этом маленьком приложении, мне в голову начали приходить идеи, как улучшить этот калькулятор. Как обычно, я начал копать себе кроличью нору. На самом деле я не знаю, в каком порядке появлялись эти дополнительные идеи, но они появлялись.

Было бы неплохо иметь возможность написать полные термины, прежде чем позволить калькулятору их вычислить. Так что не только «1+2», но и «1+2–3*4».

Для этого требуется механизм калькулятора, способный принимать входную строку, содержащую термин, и возвращать результат термина. Кажется довольно простым. Слушай, я еще не так глубоко в кроличьей норе.

Кроме того, было бы неплохо иметь возможность добавлять подтермины через скобки. Типа «1+(2–3) * 4». Приложение не сильно усложняется. Только немного. Может быть, какая-то рекурсивная магия. И, черт возьми, я до сих пор вижу вход в кроличью нору, куда я попал. Но всегда ли он был таким маленьким?

Кроме того, было бы неплохо иметь вложенные скобки. Типа «1 + 2 — (3*(4–5))». Поскольку к этому моменту механизм расчета уже должен быть довольно продвинутым, это, безусловно, не будет большой проблемой.

И возможность рассчитать только следующий шаг расчета. Таким образом, выполняется только текущий самый внутренний термин, а не полный термин. Это означает, что «1 + 2 — (3*(4–5))» приводит к «1 + 2 — (3*-1)».

Хм, в этой дыре уютно. Был ли когда-нибудь вход? В любом случае, возвращение никогда не вариант, по крайней мере, для такого тупоголового, как я. Пробивание стен головой всегда было моей специальностью. Поэтому более важный вопрос: будет ли когда-нибудь выход, или эта кроличья нора поглотит меня.

Создание движка калькулятора для всего этого оказалось довольно сложной задачей:

  • Необходимо учитывать распространенность оператора
  • "-" - это минус или он начинается с отрицательного числа?
  • Как вы перемещаетесь по строке туда и обратно в swift со всеми этими несколько странными выражениями диапазона?

Большим подспорьем в таких вещах являются модульные тесты. Тестирование всех возможных комбинаций типов вычислений, которые могут возникнуть. И затем, когда вы думаете, что проверили их все и подумали о каждом странном расчете, вы играете с калькулятором только для того, чтобы обнаружить, что вы забыли этот действительно важный тип расчета. И чтобы исправить это, вы должны переписать дырочный движок.

На самом деле это часть отношений любви-ненависти между мной и программистом. И эти отношения любви-ненависти, пожалуй, единственное, что мне действительно нравится в программировании. Стоять перед проблемой, которая кажется неразрешимой, и затем решать ее. Снова и снова преодолевая желание _не_ решить проблему. Оставить это людям после меня. Хоть раз по большой широкой дороге, по которой ездят все. А потом решив, что эта широкая дорога не для меня. Осознать, что я не тот человек, который идет по этой широкой дороге, по легкому пути. Нет. Идти по дороге, где она каменистая, неровная и малолюдная. Самостоятельно. Не использовать какую-то причудливую библиотеку, а изобретать новые идеи на лету. Это сложно, отнимает много времени, иногда болезненно и утомительно и требует определенного количества энергии. Но затем кроличья нора заканчивается. Едва заметная дорожка переходит в поляну, окруженную симпатичным лесом, а посередине очень симпатичное озеро. Теплый. Расслабляющий. Законченный. Приложение работает. Делает то, что я хочу.

И прибытие в эти места, наполненные красотой, спокойствием и умиротворением, — это действительно единственная награда, к которой я стремлюсь. И нет такого места, как код, где я могу найти эти места.

В конце концов, я мог бы продолжать улучшать и совершенствовать это приложение все больше и больше. Дайте ему красивую оболочку, заверните дизайн. Но на данном этапе, в конце 4-й недели, он не должен быть готов к работе в магазине приложений.

Поэтому я решил представить приложение в состоянии, когда оно работает и выполняет все ожидаемые вычисления с вложенными подтермами, пошаговой функциональностью, историей вычислений.

Но можно было бы еще полировать. Двойное нажатие на историю может вернуть элемент обратно в строку расчета. Было бы неплохо редактировать расчет не только в конце, но и в середине. И еще несколько доработок пользовательского интерфейса. Забота о переполнении линии.

Я выбрался из кроличьей норы. И это был очень приятный опыт. Но чему я научился?

  • Я все еще очень плохо даю оценки. Это, вероятно, никогда не сработает.
  • Придерживаться первоначального плана может быть достойной идеей. Хотя хорошо улучшать программу на лету, я должен научиться более точно придерживаться реальной задачи. Калькулятор, в котором вы можете ввести несколько цифр, а затем оператор, а затем некоторые другие цифры, а затем «=» для получения результата, отличается от калькулятора, который может обрабатывать вложенные подтермины, предоставляет историю и прочее.
  • Когда я вкладываюсь в код, он действительно может стать хорошим. Даже когда я перегружаюсь и пытаюсь сделать намного больше, чем ожидалось.
  • Найти конец полезно, а иногда и труднее всего.
  • То, что важно для меня, может быть важным для меня. Поэтому я буду больше придерживаться этих важных для меня вещей.