Переваги C++ як першої мови для навчання програмуванню

Переваги C++ як першої мови для навчання програмуванню

Всім доброго часу доби!

Це стаття про те, чому ж все-таки варто вибрати C++ як першу мову програмування для навчання студентів, і трохи про проблеми викладання у ВНЗ. Частина судження, що стосується процесу навчання, ґрунтується на особистому досвіді викладання (три роки, під час навчання в аспірантурі), а також на спілкуванні з викладачами та студентами.

Розглядаються переваги мови програмування C++ саме для навчання і з точки зору кращого розуміння основних концепцій. Решта кандидатів на роль першої мови (Pascal/Python/C #/Java) не розглядаються, щоб не розпалювати холівар. Ще раз зазначу: не для промислової розробки і не з точки зору такого суб'єктивного критерію, як зручність.

Написано під враженням відверто рекламного поста «Delphi XE5 як основа для навчання програмуванню» (на момент написання, доступна тільки версія «від гугла»).

0 Введення

Для початку, хотілося б зазначити, що для студентів не профільних спеціальностей питання вибору першої мови програмування не розглядається. Основи алгоритмізації (якщо вони необхідні) можна освоювати хоч на Python, хоч на C++ (Java, C #, Pascal тощо). В даному випадку, чим простіша мова, тим вона краща: у людей необхідно сформувати хоч якусь культуру алгоритмічного мислення і розуміння базових конструкцій. Студентам деяких спеціальностей (юридичні, економічні, гуманітарні), вивчення ЯП зовсім не потрібно.

Незважаючи на всю очевидність написаного вище, багатьом студентам-економістам першого курсу викладають програмування на Pascal на практичних заняттях з інформатики. Студентам, які ще толком не вміють працювати з MS Word. Користь від таких занять вельми і вельми сумнівна. Точно так само, студентів-математиків можуть пару років вчити програмувати на C + +/C #/Java... але навіщо? Набагато корисніше для подальшого застосування своїх знань вивчити програми на зразок Mathcad, Simulink, Surfer тощо.

Враховуючи вищевикладене, розглянемо процес вибору першої мови виключно для студентів профільних спеціальностей (наприклад, «Програмна інженерія») і змішаних спеціальностей з ухилом у бік IT (наприклад, «Прикладна математика та інформатика»). По-перше, навчальний план таких спеціальностей передбачає достатню кількість лекцій і практик (оскільки розглядається перша мова, враховується тільки перший курс): для двох пов'язаних дисциплін (інформатика та програмування) близько 230 годин, залежно від спеціальності. По-друге, наявність зацікавленості і певного складу розуму у студентів. Такі студенти найчастіше вже пробували програмувати, а можливо навіть і написали сайт/іграшку. Дві ці причини, в сукупності, дають непогану базу для початку навчання і знижують поріг входження для навчання мови. До того ж, випускникам розглянутих спеціальностей належить надалі працювати в індустрії розробки ПЗ. Отже, вибір першої мови для них особливо важливий.

1 Чому ж C++?

На першому курсі закладається базис для подальшого навчання та формується підхід студента до подальшого отримання знань. Мова програмування відіграє тут не останню роль.

Щоб вибрати C++ як першу мову програмування, існує чотири причини:

  1. Компільована мова зі статичною типізацією.
  2. Поєднання високорівневих і низькорівневих засобів.
  3. Реалізація ОВП.

Розгляньмо ці причини докладніше.

Компілятор. Тут C++ постає у всій красі. Безліч компіляторів, консольні команди, етапи збірки програми... Так, першу програму потрібно написати в простому текстовому редакторі без підсвічування синтаксису і автокомпліту, знайти чим і як її можна запустити. Такий підхід формує у людини деяке розуміння того, як все влаштовано:

  • Код програми - це просто текст, який сам по собі не запрацює.
  • Компілятор - це окрема програма, якою слід вказати, що і як зробити з вихідним кодом, щоб він перетворився на виконуваний файл. Текстовий редактор - це також окрема програма, призначена для написання вихідного коду.
  • Існують параметри збирання, і існує не один компілятор.
  • Початковий код, написаний програмістом, може бути попередньо оброблений і змінений (наприклад, препроцесором).

Майбутній фахівець усвідомлює, що код сам по собі не запускається (надалі він бути може і зацікавиться, як працює, наприклад, інтерпретатор Python або JIT-компіляція). Людина ставитиме собі запитання: «А чому?», «А в чому відмінність?», «Як?». Не буде ілюзій з приводу того, що все працює за натисканням двох чарівних кнопок або в інтерактивному командному рядку. Студент буде знати, що процес складання програми можна налаштувати і що вихідний код може бути оброблений сторонніми програмами. У майбутньому, при використанні IDE, людина буде розуміти, що це всього лише зручний комплекс програм, що виконує більшу частину рутинних операцій і в разі недостатньої гнучкості від неї можна відмовитися або розширити.

Статична типізація. На прикладі мови зі статичною типізацією простіше зрозуміти, що таке тип даних, навіщо він потрібен і від чого залежить. Видно, що собою являє оголошення, визначення та ініціалізація. Використання мови C++ дає це явно побачити, що сприяє подальшому розумінню того, як працюють ці механізми в інших мовах. Крім цього можна на реальних прикладах зрозуміти, чим беззнакові цілі відрізняються від цілих зі знаком, чим відрізняються числа подвійної та одинарної точності, чим відрізняється символ від рядка тощо.

Високорівневі і низькорівневі засоби. Використання таких засобів, як покажчики та динамічне виділення пам'яті, дозволяє зрозуміти (або надалі сприяє розумінню), що таке стек, купа, стек викликів, розкрутка стеку тощо. Крім цього, на практиці закріплюється розуміння концепції адрес та адресної арифметики. На прикладах демонструється, що пам'ять треба виділяти, звільняти, тому що вона не нескінченна, що існують витоки пам'яті. У майбутньому, при вивченні мов з GC простіше буде зрозуміти, що ж це таке.

Окремо варто відзначити простий механізм передачі значень за посиланням, значенням, покажчиком та перенесення об'єкта. Що таке змінювані і не змінювані параметри. Надалі дані концепції можуть бути використані і при вивченні інших мов. Студент буде розуміти, наприклад, що об'єкт у мові N передається за посиланням, і якщо його значення змінити у функції-члені, то воно зміниться скрізь.

Реалізація ОВП. Це відносно чиста реалізація ОВП без жодного синтаксичного цукру (щодо деяких інших мов). Чітко розмежовані рівні доступу до членів класу, можливість множинного успадкування і динамічний поліморфізм дають можливість швидко засвоїти основні концепції ОВП (абстракція, спадкування, інкапсуляція і поліморфізм). Покажчики і динамічне виділення пам'яті дозволяють наочно зрозуміти такі важливі механізми, як upcasting і downcasting. Надалі, ґрунтуючись на цих знаннях, легко можна зрозуміти весь синтаксичний цукор в інших мовах. Необхідність контролю ресурсів (в тому числі і «правило трьох» або вже «правило п'яти», з урахуванням C++ 11), захоплення їх в конструкторі і звільнення в деструкторі також сприяють більш глибокому розумінню ОВП.

Варто відзначити такий важливий момент, як не примусове ОВП. Тобто цей підхід до програмування застосовується тоді, коли це зручно, і його можна змішувати, наприклад, з функціональним програмуванням. Це сприяє формуванню розуміння того, що засоби реалізації вибираються виходячи із завдання.

STL. Сама по собі концепція шаблонів C++, генерації коду і застосування широкого спектру алгоритмів до різних контейнерів позитивно впливає на процес навчання. Тут все на поверхні і зрозуміло, чому можна створити вектор цілих чисел і вектор об'єктів користувача на основі одного класу-контейнера. Чому можна застосувати певну операцію до послідовності об'єктів або як відсортувати об'єкти, для яких не передбачена вбудована операція порівняння. Можна зрозуміти, як здійснюється доступ до елементів, і дізнатися про категорії ітераторів. Крім цього закріплюється розуміння узагальненого програмування.

2 Трохи про проблеми навчання

Процес навчання, мабуть, одна з найбільш суттєвих перешкод, для того, щоб реалізувати все те, про що написано в попередньому пункті. Ймовірно, це питання не стосується топових IT-вузів, але якщо взяти рядові освітні установи, то відчувається дефіцит кваліфікованих кадрів і слабка мотивація студентів. Для більшої частини практичних дисциплін рідко залучаються фахівці, що займаються безпосередньо розробкою ПЗ. Наприклад, людина, яка не застосовувала STL в реальних проектах, навряд чи зможе пояснити, як це робити, і головне навіщо. Так само, як і викладач, який щиро вважає, що програмування на Delphi з формочками вже є справжнісіньке ООП, враховуючи, що весь код (без натяку на власні класи, абстракцію та інкапсуляцію) пишеться в обробнику натискання на кнопку з дуже зрозумілим ім'ям «Button1», не сприяє процесу навчання. Проблеми є і з боку студентів, які толком не зрозуміли, куди і навіщо вони вступили. Багато студентів, не мають мотивації до подальшого навчання і розуміння, а також і до самоосвіти. Не дивлячись на те, що такі студенти і викладачі чудово доповнюють один одного, в кінці навчання не вийде фахівець, який претендує на junior-вакансію.

3 Ув "язнення

Зараз у світі розробки програмного забезпечення склалася ситуація, що в ціні знання певних технологій і досвід їх застосування, а не розуміння. Сучасному суспільству необхідно багато програмістів, які можуть виконувати суворо визначені функції. Частково цьому сприяють і технології розробки, що розвиваються. Можливо, велика частина розробників, які вміють просто користуватися певним набором інструментів, ніколи не зіткнеться з «законом дірявих абстракцій». Однак людям, які претендують на посади провідних розробників, що займаються оптимізацією і питаннями архітектури, необхідно більш глибоке розуміння того, як все влаштовано. Одним з факторів, що призводять до такого розуміння, може відмовитися і вірний вибір першої мови програмування. На підставі цього, мова C++, що є статично типізованою, компільованою, підтримує низькорівневу роботу з пам'яттю і не перевантажену синтаксичним цукром реалізацію ОВП, можна рекомендувати як першу мову програмування.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND