Эта серия статей основана на черновиках того, что я собираюсь в конечном итоге превратить в серию лекций и курсов для моих брокеров и сискрипторов. Обратная связь приветствуется, и если она окажется полезной, я буду рад указать вас в качестве соавтора.

ОБНОВЛЕНИЕ 2020 ГОДА: я составил курс по Java, который знакомит с концепциями, которые я описал в этих статьях, но с большей глубиной и ясностью. Если вам нравятся мои тексты, думаю, вам понравятся мои видеолекции:

Рабочий класс Java: руководство по объектно-ориентированному программированию и архитектуре программного обеспечения для новичков Udemy Link | Ссылка Skillshare с бесплатной пробной версией

СОДЕРЖАНИЕ

1. Что такое программа? - набор инструкций, выполняемых системой обработки информации.

2. Проблемная область - Как разработать программу / приложение

3. Хранение информации - Как моделировать информацию (данные) в системе обработки информации.

4. Логика и ошибки - два (основных) типа логики в системе обработки информации; как правильно обрабатывать ошибки

5. Разделение проблем - Самый важный принцип архитектуры программного обеспечения, с которым я когда-либо сталкивался.

6. Проверка программ с помощью тестов - объяснение теории, практики и преимуществ тестирования вашего программного обеспечения и применения разработки через тестирование

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

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

«Программа - это, по сути, набор инструкций для системы обработки информации»

В этой статье мы сосредоточимся на том, чтобы выяснить, что нужно программе для решения проблемы, для решения которой она предназначена. Другими словами, мы исследуем идею и процесс анализа «проблемной области» программы. Я знаю, что это может звучать расплывчато и эзотерически, но эта концепция не сложна (по крайней мере, так, как я ее объясняю), и на самом деле это процесс, который используется, чтобы начать начальный процесс создания новой программы.

Что делает программа?

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

Первый шаг в разработке любой программы - начать с объяснения того, что она делает, простым письменным языком. Технический термин для этого письменного объяснения - «Постановка проблемы». Теперь, как абсолютный новичок, я вспоминаю, что меня беспокоило, были ли мои постановки проблемы идеальными или нет, и правда в том, что попытка определить идеальную формулировку проблемы (и, в более широком смысле, область проблемы) с первой попытки - это дурацкая затея.

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

Пример 1. Примерная постановка задачи для программы калькулятора

«Моя программа решит основные математические выражения».

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

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

  • Математическое выражение
  • Решить выражение

Как упоминалось ранее, в том, что мы только что сделали, нет ничего даже отдаленно сложного; мы составили простое описание программы и посмотрели, какие вещи (существительные) и функции (глаголы) ей, вероятно, потребуются. Однако мой опыт подсказывает мне, что мы могли бы получить большую пользу, если бы конкретизировали нашу постановку проблемы. Вполне нормально начинать расплывчато (иногда вам придется потратить много времени на изучение и уточнение своего понимания предметной области), но нужно ответить на дополнительные вопросы, прежде чем мы будем готовы перейти к коду:

  • Какие математические выражения мы хотим, чтобы наша программа могла вычислять? Наша работа проста, если нам нужно просто сложение и вычитание, но как насчет логарифмов или кубических корней?
  • Со сколькими операндами (терминами) мы должны позволить пользователю работать?
  • А как насчет десятичных или отрицательных целых чисел?
  • А как насчет недопустимых выражений? Если мы попытаемся вычислить «1 ÷ 0», не рухнет ли Вселенная сама на себя? Как насчет того, чтобы пользователь набрал 0.0.0.0 + 1?

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

Пример 2: уточненная постановка задачи для программы калькулятора

«Моя программа отобразит результат решения действительных биномиальных выражений, ограниченных сложением, вычитанием, умножением и делением. Если выражение недействительно, вместо результата решения выражения будет отображаться сообщение об ошибке ».

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

  • Два операнда (терма), которые предположительно будут введены пользователем
  • Оператор для указания одного из операций сложения, вычитания, умножения или деления.
  • Сообщение об ошибке, сообщающее пользователю, если выражение оказывается недопустимым.
  • Результат решения выражения в предположении, что оно действительно

… И что нужно делать нашей программе с этой информацией:

  • Убедитесь, что выражение действительно
  • Решите правильное выражение
  • Показать результат решения допустимого выражения
  • Отображать сообщение об ошибке, если выражение оказывается недопустимым

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

В поисках середины между прагматизмом и перфекционизмом

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

Мы не будем повторять весь процесс снова, но если бы моей основной целью было создание совершенной программы-калькулятора, я, вероятно, хотел бы, чтобы она решала любое допустимое выражение, любое количество членов, с любым типом оператора, в любом виде базовая система подсчета (почему бы не двоичная и шестнадцатеричная!), с возможностями построения графиков, и этот список можно продолжить. Это было бы чертовски мощное приложение-калькулятор, не так ли?

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

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

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

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

Запомните мои слова, будьте готовы к тому, что формулировки ваших проблем / домены меняются с течением времени способами, о которых вы даже не догадывались, по разным причинам, начиная от технических ограничений (устройств, языков, операционных систем, библиотек) до того, чтобы заставить человека, подписывающего ваши зарплата счастлива, даже если их идеи - отстой. Научитесь быть гибким.

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

Резюме

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

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

Служба поддержки

Подпишитесь на сообщество мудрецов:
https://www.instagram.com/wiseassbrand/
https://www.facebook.com/wiseassblog/
https: // twitter.com/wiseass301
http://wiseassblog.com/
https://www.linkedin.com/in/ryan-kay-808388114

Если вы что-то узнали, подумайте о пожертвовании:
https://www.paypal.me/ryanmkay