Дефицит модульного мышления

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

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

#include <iostream>

using namespace std;

int main()
{
  cout << "Enter two numbers:" << endl;
  int a, b;
  cin >> a >> b;
  if(a > b)
    cout << "max number is " << a << endl;
  else
    cout << "max number is " << b << endl;

  return 0;
}

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

Давайте на время забудем про std::max и подумаем, чем плоха эта программа? Она решает поставленную задачу? Решает. Что еще надо?

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

Мне могут возразить: в условиях задачи ничего не сказано про повторное использование кода. Да, это так. Но даже если ты просишь студентов оформить решение в виде отдельного класса, получается что-то вида этого:

#include <iostream>

using namespace std;

class Max
{
public:
  int a;
  int b;
  void GetMax()
  {
    cout << "Enter two numbers:" << endl;
    cin >> a >> b;
    if(a > b)
      cout << "max number is " << a << endl;
    else
      cout << "max number is " << b << endl;
  }
};

int main()
{
  Max max;
  max.GetMax();

  return 0;
}

Такое решение тоже нельзя использовать повторно.

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

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

Что с этим делать? Ответ на этот вопрос не прост и требует отдельного обсуждения.

2 ответы на “Дефицит модульного мышления”

  1. А как Вы видите пример правильного подхода? Отдельный метод класса вычисляет число, и более ничего не делает? Или речь про поддержку разных типов для сравнения?

    • Основная проблема «студенческих» решений в том, что они слишком привязаны к потокам ввода/вывода. Взгляните еще раз на предлагаемые решения. Что если я захочу найти максимум из двух чисел, которые хранятся у меня в разных переменных? Как мне передать их в Max::GetMax()? Или, если я хочу сохранить результат работы этого метода в свою переменную? Как мне это сделать?

      То минимальное решение, которое мне бы хотелось видеть, выглядит примерно так:

      int get_max(int, int);

      Здесь нет привязки к потокам ввода/вывода. Эту функцию можно повторно использовать практически где угодно.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *