Детский лепет или C++ тоже с чего-то начинается

в 10:20, , рубрики: c plus plus, c++, обучение программированию, первые шаги, Программирование, студентам, метки: , , ,

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

Собственно, я рассчитываю на то, что читатель обладает каким-никаким знанием программирования, иначе странно, что он (или она) это читает.

Итак, начнем.

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

Забегая вперед скажу, что ни в одной книге по объектно-ориентированному программированию не сказана самая простая вещь, которая становится очевидной сразу же при переходе с учебного языка на тот же С++, а именно: «Пока не попробуешь, не узнаешь». Кстати, опять же, о книгах — все справочники по языку, учебники «С++ для чайников», лекции в интернете, ресурсы и все прочее не имеет никакого значения, если не понимать самого смысла. Это вполне очевидно программисту, освоившему несколько языков, да и вообще программисту — но начинающему это не очевидно более чем. То есть поначалу кажется — синтаксис, функции, операции… Ужас, сколько учить! Паника-паника-паника начинается именно с этого, с объема, с предстоящего адского и каторжного труда.
И самое забавное в том, что это в корне неверно.

Синтаксис не имеет значения, если ты понимаешь логику языка. Иначе говоря, если ты понимаешь суть объектно-ориентированного (и комбинированного) подхода, ты сможешь сделать хоть что-то.

И это начинается с воистину правильной фразы нашего преподавателя: «Пользователь — идиот, поэтому программист должен думать за него». Это было еще в то время, когда мы не понимали, какую мудрость изрек наш властитель умов. а вот сейчас аукается. Поясню на примере своей курсовой:

Конструктор для класса «многочлены». Смысл основного конструктора — диалог с пользователем, заполнение с клавиатуры. Вводится коэффициент и степень при нем. Для тех, кто тут же хочет вставить «А почему нельзя просто напечатать 3x^4 + 5x + 7?» — покамест будет так, потом уже начну извращаться с удобством пользователя тк это, все же, мой первый опыт общения с С++. Итак, вроде бы все тихо и мирно, но тут же появляется нормальный вопрос — а как пользователь будет вводить коэффициенты и степени? По порядку, от старшей к младшей, от младшей к старшей, или же вообще хаотично?

И тут математик скажет: надо написать пользователю, чтобы он вводил, скажем, от младшей к старшей, и забыть об этом. В принципе, любой адекватный человек так и скажет. А это все потому, что человек думает о том, чтобы ему самому было проще. А студент так тем более.

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

Иными словами, я представила, что сама пользуюсь этой программой. И первая мысль была такая: «Что? Вводить не как попало? Да ну, найду что-нибудь еще». Ясное дело, я не нацеливаюсь на коммерцию (да и вообще на распространение, но тенденция показательна.

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

Едем дальше. Есть еще одна вещь, которую не пишут в учебниках — точнее, пишут, но не во всех. Здесь хочется вставить небольшое лирическое отступление.

Иногда мы верим, что интернет даст нам гораздо больше, чем учебник. Иногда это даже верно. Иногда мы пропускаем советы преподавателей мимо ушей, считая, что уж в чем, в чем, а в поиске информации нам равных нет. Так вот, это верно, но в случае программирования и, зачастую, математики эти простые правила не работают. Возможно, это наследие школы, не знаю. Но когда вам говорят «прочтите такую-то такую-то книгу, там все подробно написаоно» и ничего больше не объясняют — идите читать! Для С++ и, мне кажется, вообще всего объектно-ориентированного программирования такая книга — Бьёрн Страуструп, «Язык С++». Ну логично, что автор языка может рассказать о смысле языка и вообще о том, откуда ноги растут у страшного слова «классы». Лучше подхода к вопросу мне еще не встречалось, хотя перелопатила я порядочно.

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

Возьмем, к примеру, стол. Объект такой — стол. И у объекта этого есть свойства. Какие-то. Ну, материал — стеклянный, деревянный, пластиковый; цвет — черный, кремовый, сине-буро-малиновый; форма — квадрат, круг, овал и так далее. Это, вроде бы, интуитивно понятно и этим все уши всем прожужжали, так?

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

Например, нужно составить класс «студент» для таблицы посещаемости. У студента есть цвет глаз, цвет кожи, вероисповедание, болезни, успеваемость, семейное положение, родственники… Масса свойств у студента. Но конкретно в этой задаче важно, что студент носит или не носит носки, как целует бабушку и прочее?

Самое интересное, что эти вроде бы понятные факты как-то уплывают, если не с той стороны начать знакомиться с предметом. Есть такая фраза «даже зайца можно научить зажигать спички». Иными словами, даже филолога (при известных усилиях) можно заставить написать что-нибудь на С++ и есть вероятность, что это «что-нибудь» будет работать. Но если не начать обучение с правильной стороны, задача может внезапно задавить своей величиной.

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

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

Если понимать, как что-то сделать, ты сможешь это сделать. И идти от просто к сложному. Это напоминает постройку будки ля собаки — сначала берется один кирпич, потом второй кирпич, третий, раствор… Если же не дробить задачу на составные части ее и решить невозможно.

Что, кстати, применимо не только к программированию.

А вот когда не знаешь, как в С++ пишется функция, возводящая в степень — интернет и справочники в помощь.

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

Автор: Aelyth

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js