Одна з перших проблем, яка здається дуже важливо: «Яку мову вибрати для навчання програмуванню?»

Перш, ніж відповісти на це питання, я скажу, що особливого значення не має, яка мова програмування ви виберете для початку. Зовсім не обов'язково намагатися «заощадити час» і вчити «корисний» мову. Професійні програмісти володіють не одним, а кількома мовами програмування, крім того, ця область динамічна і ситуація постійно змінюється - немає сенсу шукати інструмент, яким можна користуватися все життя. Для кожного завдання - свою мову. Зрозуміло, дуже багато мов вирішують одні й ті ж завдання, тому ще один критерій вибору - знайомство з мовою. Іншими словами ви використовуєте те, що підходить і те, що ви знаєте.

Для навчання основам програмування потрібно вибирати мови, які підходять для цього завдання, тобто будуть досить прості для початку, мають великі можливості, дозволяють отримати швидкий результат. Для вивчення програмування я можу порекомендувати кілька варіантів: VBA, Python, JavaScript, Pascal ABC.

Розгляну докладніше переваги і недоліки цих варіантів.

VBA = Visual Basic for Application- це мова для створення макросів, який включений в Microsoft Officeі деякі інші програми. Дуже зручно використовувати Excel. Натисніть Alt + F11 і ... вперед! Якщо у вас вже є MS Office, то нічого не доведеться встановлювати - все вже є для початку роботи. VBA - серйозний і «дорослий» мову, який широко використовується для автоматизації роботи в Excel та інших програмах. Основна перевага: найшвидший результат! Ви зможете зробити щось корисне ще на етапі навчання!

Python- це скриптова мова. Його характерна особливість полягає в тому, що він був створений однією людиною. Мова елегантний і вродливий настільки, що потім складно починати працювати з «класичними мовами для навчання» (С ++, Pascal / Delphi), вони здаються непоказними і незручними. Python використовується для веб-програмування і для написання фрагментів коду для ігор. Python використовується в тих же областях, де PHP, Perl, Ruby і т.д. Основна перевага: елегантність і багаті можливості для всіх рівнів програмістів.

JavaScript- мова, яка використовується для «оживлення» веб-сторінок. Він виконується в браузері, тобто на стороні клієнта. На стороні сервера працюють скриптові мови (PHP, Ruby, Python, ...), вони формують веб-сторінку. Після завантаження в браузер за роботу динамічних елементів відповідають два інструменти - JavaScript і Flash. Основна перевага: можна використовувати при створенні свого сайту. UPD: На JS + HTML5 можна писати програми для смартфонів (всі платформи), Google Chromeі Вконтакте.

Pascal ABC- навчальне середовище, заснована на мові Pascal. Зручно використовувати для початкового навчання програмуванню, для чого і була створена. Не можна створювати свої закінчені програми. Включає в себе задачник, нерідко використовується в ВУЗах і дуже часто в школах. Pascal - основна мова для ЄДІ з інформатики. Останнє і є основна перевага.

Напевно, існують і інші зручні середовища та мови програмування для навчання основам. Надсилайте назви і аргументи на користь тієї чи іншої системи і я включу їх в огляд.

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

В нашій школі на першому етапі навчання використовується VBA (якщо на вашому комп'ютері вже є Microsoft Office) або Python (якщо Ms Office немає або у вас на комп'ютері Linux). Повторюся ще раз: важливий не мова, а ті завдання, які в на ньому вирішуєте.

Тема №4 Мова програмування: еволюція, класифікація

(О.Л. Голіцина, І.І. Попов «Основи алгоритмізації та програмування» Стор. 38-45)

Еволюція Мов програмування

У розвитку інструментального програмного забезпечення(Тобто програмного забезпечення, що служить для створення програмних засобівв будь-якій проблемній області) розглядають п'ять поколінь мов програмування (ЯП). Мови програмування як засіб спілкування людини з ЕОМ від покоління до покоління покращували свої характеристики, стаючи, дедалі доступнішими в освоєнні непрофесіоналам.

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

покоління ЯП

ЯП першого покоління представляли собою набір машинних команд в довічним (бінарному) або вісімковому форматі, яким визначався архітектурою конкретної ЕОМ. Кожен тип ЕОМ мав свій ЯП, програми на якому були придатні тільки для даного типуЕОМ. Від програміста при цьому потрібно добрі знанняне тільки машинного мови, а й архітектури ЕОМ.

Другепокоління ЯП характеризується створенням мов ассемблерного типу (ассемблеров, макроассемблера), що дозволяють замість довічних і інших форматів машинних команд використовувати їх мнемонічні символьні позначення (імена). Будучи суттєвим кроком вперед, асемблерні мови все ще залишалися машинно-залежними, а програміст все також повинен був бути добре знайомий з організацією і функціонуванням апаратної середовища конкретного типу ЕОМ. При цьому асемблерні програми все так же скрутні для читання, трудомісткі при налагодженні і вимагають великих зусиль для перенесення на інші типи ЕОМ. Однак і зараз асемблерні мови використовуються при необхідності розробки високоефективного програмного забезпечення (мінімального за обсягом і з максимальною продуктивністю).

третєпокоління ЯП починається з появи в 1956 р першої мови високого рівня- Fortran, розробленого під керівництвом Дж. Бекуса в фірмі IВМ. За короткий час Fortran стає основним ЯП при вирішенні інженерно-технічних і наукових завдань. Спочатку Fortran мав досить обмеженими засобами забезпечення роботи з символьної інформацією і з системою введення-виведення. Однак постійний розвиток мови зробило його одним з найпоширеніших ЯВУ на ЕОМ всіх класів - від мікро- до суперЕОМ, а його версії використовуються і для обчислювальних засобів нетрадиційної паралельної архітектури.

Незабаром після мови Fortran з'явилися такі нині широко відомі язики поділені, немов Аlgol, Соbоl, Ваsiс, РL / 1, Раscal, АРL, АDА, С, Forth, Lisp, Моdula і ін. В даний час налічується понад 2000 різних мов високого рівня.

мови четвертого покоління носять яскраво виражений непроцедурного характер, який визначається тим, що програми на таких мовах описують тільки що, а не як треба зробити. У програмах формуються швидше співвідношення, а не послідовності кроків виконання алгоритмів. Типовими прикладами непроцедурних мов є мови, які використовуються для задач штучного інтелекту (наприклад, Рrolog, Langin). Так як непроцедурного мови мають мінімальне число синтаксичних правил, вони значно більш придатні для застосування непрофесіоналами в області програмування.

Другою тенденцією розвитку ЯП четвертого покоління є об'єктно-орієнтовані мови, що базуються на понятті програмного об'єкта, вперше використаного в мові Simulа-67 і склав згодом основу відомого мови Smalltalk. Програмний об'єкт складається з структур даних і алгоритмів, при цьому кожен об'єкт знає, як виконувати операції зі своїми власними даними. Насправді, різні об'єкти можуть користуватися абсолютно різними алгоритмами при виконанні дій, визначених одним і тим же ключовим словом (так зване властивість поліморфізму). Наприклад, об'єкт з комплексними числами і масивами в якості даних буде використовувати різні алгоритми для виконання операції множення. Такими властивостями володіють об'єктно-орієнтовані Pascal Basic, С ++, Smalltalk, Simulа, і ряд інших мов програмування.

Третім напрямком розвитку мов четвертого покоління можна вважати мови запитів, що дозволяють користувачеві отримувати інформацію з баз даних. Мови запитів мають свій особливий синтаксис, який повинен дотримуватися, як і в традиційних ЯП третього покоління, але при цьому простіше у використанні. Серед мов запитів фактичним стандартом стала мова SQL.

І, нарешті, четвертим напрямком розвитку є мови паралельного програмування (модифікація ЯВУ Fortran, мови Оссаm, SISAL, FР і ін.), Які орієнтовані на створення програмного забезпечення для обчислювальних засобів паралельної архітектури (багатомашинні, мультипроцесорні середовища та ін.), На відміну від мов третього покоління, орієнтованих на традиційну однопроцесорних архітектуру.

До інтенсивно розвивається в даний час п'ятого покоління відносяться мови штучного інтелекту, експертних систем, баз знань (InterLisp, ExpertLisp, IQLisp, SIAL і ін.), а також природні мови, які не потребують освоєння будь-якого спеціального синтаксису (в даний час успішно використовуються природні ЯП з обмеженими можливостями - Clout , Q & А, НАL і ін.).

Класифікація мов програмування

Для того щоб ЕОМ могла вирішувати завдання, складені людиною, вона повинна послідовно виконувати інструкції деякої програми-алгоритму. Сукупність таких інструкцій, спрямованих на вирішення конкретного завдання, називається комп'ютерною програмою.Але це ще не все.

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

Всі мови програмування можна розділити на мови низького, високого та надвисокого рівнів.

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

Наступна група - мови програмування високого рівня.Це мови, які допускають опис завдання в наочному, легко сприйманому вигляді. Їх відмітною особливістю є орієнтація не на систему команд тієї чи іншої ЕОМ, а на систему інструкцій, характерних для запису алгоритмів певного класу. До мов програмування високого класу відносяться Бейсік, Фортран, Алгол, Паскаль, Сі і ін.

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

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

Елементи мов програмування можуть розглядатися на наступних рівнях:

алфавіт - сукупність символів, що відображаються на пристроях друку і екранах і / або вводяться з клавіатури терміналу.

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

синтаксис - сукупність правил освіти мовних конструкцій, або пропозицій ЯП - блоків, процедур, складових операторів, умовних операторів, операторів циклу та ін. Особливістю синтаксису є принцип вкладеності (рекурсивность) правил побудови конструкцій. Це означає, що елемент синтаксису мови в своєму визначенні прямо або побічно в одній з його частин містить сам себе. Наприклад, у визначенні оператора циклу тілом циклу є оператор, окремим випадком якого є все той же оператор циклу;

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

транслятори

Програма, написана на будь-якій мові програмування, є вихідною програмою. Особливість таких програм, як ми пам'ятаємо, полягає в тому, що вони складаються з інструкцій, зрозумілих людині, але не зрозумілих процесору комп'ютера. Щоб процесор міг виконати роботу відповідно до алгоритму, записаним у вихідній програмі, ця програма повинна бути переведена на машинний мову -мова команд процесора. Такий переклад програми називається трансляцією,а виконується він спеціальними програмами - трансляторами.

Існує три види трансляторів: інтерпретатори, компілятори і асемблери.

інтерпретатор -транслятор, що переводить текст програми поетапно (покомандно) і відразу ж (тобто паралельно) виконує оттранслировать команду вихідної програми.

компілятортранслює текст програми в модуль на машинній мові, потім програма переписується в оперативну пам'ять і лише після цього виконується процесором комп'ютера. Саме з використанням трансляторів такого типу здійснюється переклад програми на багатьох мовах програмування в машинний код. Тому розглянемо його трохи докладніше.

Схематично роботу компілятора ілюструє рис. 1.6.

Цифрою 1 на схемі позначений блок синтаксичного контролю тексту програми, цифрою 2 - генератор машинного коду.


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

Останній вид трансляторів - асемблери.Вони призначені для перекладу програми, написаної на мові асемблера (автокодом), в програму на машинній мові.

Все транслятори, незалежно від їх виду, вирішують такі основні завдання:

Виконують аналіз і перевіряють синтаксис транслюється програми;

Генерують машинний код програми;

Розподіляють пам'ять для вихідний програми.

Думки про те, яка мова краще викладати в школі, різняться: від того, що програмування вивчати не потрібно, а слід просто піднімати комп'ютерну грамотність і освоювати офісні програми(Як на Заході), до того, що потрібно вивчати операційні системи і кілька мов програмування різних рівнів абстракції та з різними парадигмами. Це крайні випадки, але золоту середину знайти непросто. В першу чергу, нам потрібно визначити мету. Навчити школярів логічно і алгоритмічно мислити? Ознайомити з комп'ютерами на побутовому рівні, щоб школярі вміли користуватися інтернетом, електронною поштоюі текстовими редакторами? Закласти базові знання, необхідні для майбутніх інженерів, математиків, фізиків і фахівців з інформаційних технологій? А може, нам потрібно кожного школяра познайомити з програмуванням як явищем, щоб він представляв потенціал комп'ютерних систем? Чи багато школярів стане програмістами? Трохи. Але синусами і рівняннями Кірхгофа в житті теж користується не кожен. Безумовно, в науці про програмування є фундаментальна складова, але визначити її не просто. Деякі вважають, що не так важливо, яку мову програмування взяти: на уроках інформатики потрібно вчити не мови програмування, а методам програмування і системного підходу вирішення завдань. Потрібно розвивати алгоритмічне мислення і на прикладах знайомитися з принципами побудови сучасних комп'ютерних систем.

Невже дійсно не так важливо, яка середовище і який конкретний мова програмування буде використаний для практичних занять? Виявляється, що у кожного викладача є свій список вимог до навчальному мовипрограмування. Наприклад: простий, інтуїтивний синтаксис, наявність високорівневих інструментів для виявлення і недопущення помилок і для налагодження програм, наявність якісної документації з прикладами, наявність доброзичливою середовища розробки, межплатформенному (наявність версій під різні платформи), ... У деяких викладачів цей список дуже короткий, наприклад : "Тільки Паскаль" або "Будь-який, крім Бейсика!" Спробуємо підійти до проблеми конструктивно.

Колись найбільш популярними мовами програмування в школах світу були Бейсік і Паскаль. Бейсік завжди вважався самим простою мовоюпрограмування, а Паскаль - самим відповідним мовоюдля навчання програмуванню. Але тепер це не так. Так, Бейсік простий. Але він створювався за часів, коли людство не мало ніякого досвіду створення комп'ютерних систем, і заснований на застарілих і не виправдали себе принципах. Власне, ніякої фундаментальної цілісної ідеї в основі Бейсика не лежить. Сьогодні є прості і при цьому більш наочні і ідейно замкнуті мови програмування, ніж Бейсік. Паскаль зручний в навчальних цілях; адже саме для них він і створювався. Студенти швидко вчаться вирішувати з його допомогою алгоритмічні завдання. Але так виходить, що вивчати Паскаль корисно тільки для того, щоб писати програми на Паскалe. А якщо потрібно створити справжній програмний продукт, Паскаль виявляється незручний. І студентам, які знають тільки Паскаль, доводиться переучуватися, що часто складніше, ніж вивчити правильні мови і технології з нуля. Часто чуєш від викладачів шкіл і вузів, що вже краще Паскаль, ніж Бейсік. І краще Java, а не Паскаль: в Java є прибирання сміття, а це дуже зручно для вивчення програмування. А ще краще який-небудь сценарний слабо нетипізований мову. Там і збірка сміття є, і в типах плутатися не будуть, все буде просто і зрозуміло. Але є й інші думки, перша мова програмування повинна бути вимогливим до учня. Необхідно, щоб учень мав чітке уявлення про те, що його програма робить на кожному кроці, і вміти записувати алгоритми на суворому формальному мові, без зайвих поблажок, які є, наприклад, в мові Перл, де можна писати круглі дужки навколо аргументів функцій, а можна не писати, і робити інші подібні речі. Перший мова повинна бути cтрого типізованим, бо змішання цілих чисел, дійсних чисел і текстових змінних призводить у початківців програмістів до неправильного уявлення про методи зберігання даних в пам'яті комп'ютера. Чим більше повідомлень про помилки учні побачать від компілятора, і чим більше з цих повідомлень вони зрозуміють, тим більше фундаментальних знань про програмування вони отримають. Паскаль - непоганий мову в цьому сенсі. Особливо приємно, що в ньому є перевірка на приналежність індексу масиву допустимому безлічі значень. Це школярам дуже корисно. Але в ньому немає покажчиків, і учні не розуміють простої речі - того, що у змінних є місце (адресу), де вона зберігається, і значення (то, що там зберігається). З мовою Сі інша проблема: в ньому багато відлякують конструкцій. З іншого боку, ніхто не змушує вчителів показувати все глибини Сі. З ним можна працювати на тому ж рівні, що і з Паскалем, не займаючись складними махінаціями c покажчиками і не використовуючи складних конструкцій.

Альтернатив багато. Нині є цілий зоопарк (екосистема) мов програмування, які постійно еволюціонують, розщеплюються і зливаються. Це вже згадані вище мови Форт, Ruby і Python. Перерахуємо ключові фактори, що керують відбором:

Надання мовою високорівневих засобів контролю за цілісністю і безпомилковістю кодa на першому етапі складання проектів. Це стосується в першу чергу до мов Java, Haskell, і Python. Мови намагаються робити такими, щоб програміст просто не міг допускати помилок. А якщо помилки все-таки робляться, то на етапі компіляції (трансляції) вони повинні знаходитися. Зокрема, помилка в одному символі не повинна призводити до того, що програма Компільо і запускається (а таке буває, наприклад, в мовах Бейсік і Perl, якщо не вказано явно спеціальний режим strict. Мова Java створювався в контексті аналізу типових помилок і проблем, що виникають в проектах на мові Сі ++. Творці Java постаралися внести в синтаксис і базову парадигму такі обмеження, щоб типові помилкипрограмістів на Сі ++ просто не могли з'явитися в проектах на Java. Це дуже важлива ідея: якщо вміло укласти себе в рамки, можна отримати вигоду. Слід зазначити, що в великих корпораціях часто програмістам видається список правил оформлення програм і набір конструкцій, які не можна використовувати в коді, не дивлячись на те, що сама мова їх допускає. Зайва гнучкість мови іноді шкідлива, так як дозволяє програмістам писати каламутні і заплутані програми. Нові мови програмування роблять так, щоб не спокушати програмістів і не давати їм можливості писати плутано і з помилками.

Чистота і ясність коду, читаність коду. Далі все тут просунувся, мабуть, Рубі. Сьогодні на всіх офіційних сайтах програмних засобів серед перших достоїнств вказується "природність синтаксису" або "близькість до природної мови" (зазвичай англійської). Звичайно, це важливий фактор. Давно минув час, коли люди підбудовувалися під комп'ютери і копітко переводили свої ідеї та алгоритми в машинну мову нулів і одиниць. Сьогодні комп'ютери все більше і більше підлаштовуються під людську мову. Це зручно. Збільшується швидкість написання програм, хоча зазвичай це йде на шкоду швидкості виконання і взагалі раціональності получающейся програми.

Чистота і цілісність парадигми, закладеної в основу мови. Наприклад, мови Smalltalk і Ruby базуються на чистій об'єктно-орієнтованої парадигми, а Haskell - на чистій функціональній парадигмі. Ця чистота корисна, щоб програміст чітко уявляв модель, якої він обмежений, і в термінах якої йому треба думати при проектуванні програми.

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

Багатогранність і гнучкість, можливість писати складні програми коротко і красиво. Таким властивістю володіють зараз мови Perl, Ruby, Python. Але слід зазначити, що така універсальність мов може мати і недоліки, так як часто призводить до зайвого ускладнення синтаксису. Наприклад, дуже багатогранний Perl, він багатий різними конструкціями і хитрими штучками, які дозволяють записувати складну логіку дуже коротко ( "коротко про що"). В результаті дуже легко написати програми, які потім неможливо читати. Втім, те ж саме стосується і мов Сі і Сі ++. Мовам Ruby, Python багатогранність дається з меншими втратами, ніж Perl і С ++.

Наявність стандартних бібліотек і наявність коштів інтеграції проектів один з одним і з іншими системами і технологіями. Вчора всі поважають себе мови надають кошти для роботи з базами даних, для створення графічних інтерфейсів, Для роботи з мережевими протоколамиі створення додатків з архітектурою клієнт-сервер. Сьогодні йде безперервне змагання між скриптовими мовами програмування типу PHP, Ruby, Python, Perl та ін. В тому, наскільки добре розвинені в них кошти інтеграції з різними технологіями. Хтось уміє працювати з OpenGL, а хтось ні.

Можливість розробляти адаптивні системи. Мова має бути таким, щоб програми, написані на ньому, чи не були відсталими і неповороткими. Мова повинна допускати можливість внесення малих змін в код, щоб підлаштуватися під динамічно змінюється і ускладнюється завдання. Наріжними каменями адаптивності мовних програмних засобів є гнучка багаторівнева модульність (як у мов Java, Ruby, Python, Tcl) простота засобів експорту та імпорту функціональності (маються на увазі кошти, спрямовані на те, щоб проекти могли ділиться один з одним класами, об'єктами і функціями) і засоби підтримки рефакторинга - глобальних революційних змін коду, що проходять крізь модулі і спрямованих на поліпшення читання коду і позбавлення від нагромадилося в процесі еволюції вантажу непотрібної функціональності.

Є й інші номінації. Мова Pythonсьогодні переможець в номінації "простота синтаксису", а Perl більш, ніж будь-який інший мову зручний для обробки текстів і CGI-скриптинга. Мова Python в принципі створювався як мова інтегратор. З його допомогою можна інтегрувати різні додатки і створювати свої власні пакети і нові макромови.

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

Викладання програмування в школах з математичним ухилом переслідувало здебільшого спеціальні, професійно-спрямовані інтереси. Однак у цей же час наполегливо велося дослідження загальноосвітнього впливу ЕОМ і програмування як нової області людської діяльності на зміст навчання в масовій середній школі. З самого початку було ясно, що загальноосвітня сила ідей і методів, запозичених з області програмування, несе в собі величезний потенціал для розвитку нових фундаментальних компонентів змісту загальної шкільної освіти. Виявлення загальноосвітніх цінностей практичного програмування сприяла також відбувається якраз в цей час (60-70-ті рр. XX століття) швидка зміна його зовнішнього вигляду, спрямована на розвиток природних форм спілкування людини і ЕОМ. Що з загальноосвітніх цінностей програмування і нових підходів до вирішення завдань на основі застосування ЕОМ повинно увійти в загальну освіту і як воно може впливати на зміст і методику шкільного навчання? - ось питання, які викликали активний інтерес вчених-педагогів задовго до епохи персональних комп'ютеріві появи шкільної інформатики.

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

Фундаментальні основи алгоритмізації лежать в суто теоретичної області сучасної математики - теорії алгоритмів, однак, алгоритмізація в широкому практичному сенсі розуміється як набір певних практичних прийомів, заснованих на особливих специфічних навичок раціонального мислення про алгоритми. Добре відомо, що уявлення про алгоритмічних процесах і способи їх опису формувалися (хоча і неявно) в свідомості учнів при вивченні шкільних дисциплін ще до появи інформатики та обчислювальної техніки. Основна роль серед шкільних дисциплін при цьому випадала математики, в якій операційні та алгоритмічні дії спочатку становили один з істотних елементів навчальної діяльності. Дійсно, вміння формулювати, записувати, перевіряти математичні алгоритми, а також точно виконувати їх завжди складали найважливіший компонент математичної культури школяра, хоча сам термін "алгоритм" міг при цьому в шкільних навчальних програмахі не вживатися.

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

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

2. Поняття мови опису алгоритмів. Завдання опису алгоритму завжди передбачає наявність деякого мови, на якому має бути виконано опис. З цієї причини саме поняття алгоритму знаходиться в нерозривному зв'язку з поняттям мови як засобу вираження (подання) алгоритму. Вибір мови в кожному окремому випадку визначається областю застосування алгоритму, тобто, по суті, властивостями об'єкта (людини, автомата, комп'ютера), який виступає в ролі виконавця. Дотримання вимоги строго слідувати кордонів мовних можливостей в спілкуванні з тим чи іншим виконавцем служить до певної міри першоосновою алгоритмізації. Розуміння цієї обставини і точне дотримання можливостей використовуваних мовних засобів в кожній конкретній орієнтації опису також становить важливий компонент алгоритмічної культури.

3. Рівень формалізації опису. Поняття рівня формалізації опису нерозривно пов'язане з поняттям мови. Якщо опис складено для автомата, то використовуваний при цьому мову підпорядковується строгим обмеженням, які зазвичай можуть бути зведені в систему формальних правил, що утворюють синтаксис мови. Сама мова в подібних випадках стає, як кажуть, формалізованим. Однак на практиці в процесі розробки алгоритмів, особливо при побудові попередніх описів, можуть використовуватися мовні засоби, не обов'язково строго обмежені. Більш того, така ситуація можлива і не тільки в процесі попередньої розробки. Якщо, наприклад, алгоритм адресується людині, то і остаточний варіант алгоритмізації може мати неформальне, "розпливчасте" уявлення. Чимале безліч використовуваних на практиці алгоритмів "працюють" саме в неформализованном варіанті. Важливо лише, щоб алгоритм був зрозумілий виконавцю, тобто не використав засобів уявлення, що виходять за межі його можливостей. Таким чином, застосовувані на практиці рівні формалізації подання алгоритмів можуть варіюватися в досить широкому діапазоні: від рівня повної відсутностіформалізації до рівня формалізації "в тій чи іншій мірі" і, нарешті, до рівня "абсолютної" формалізації. Уміння працювати з мовами різних рівнів формалізації з урахуванням фактора зрозумілості алгоритму для виконавця також є істотним компонентом алгоритмічної культури.

4. Принцип дискретності (покрокова) опису. Побудова алгоритму передбачає виділення чіткої цілеспрямованої послідовності допустимих елементарних дій, що призводять до необхідного результату. Організована сукупність цих дій утворює певну дискретну структуру опису алгоритму, що повідомляє йому ясність і чіткість. В різних мовахтакі окремі етапи алгоритму подаються різні ми засобами. У словесних уявленнях алгоритму (природною мовою) - це окремі пропозиції, вказівки, пункти, в мові схем - це окремі блоки, в об'єктному мовою ЕОМ - це окремі команди, в алгоритмічній мові високого рівня - оператори.

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

а) детальне уявлення блоку поміщається в відповідне місце алгоритму, а сам блок, вичерпавши свою роль загального прийому пошуку алгоритму, як би "розчиняється" в ньому;

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

а) опис має передбачати всі можливі варіанти) вихідних даних і для кожної їх комбінації бути результативним;

б) для конкретних значень вихідних даних виконання алгоритму завжди проходить тільки по одному з можливих шляхів, який визначається конкретними умовами.

7. Принцип циклічності. Ефективність алгоритмічних описів в більшості випадків визначається можливістю неодноразового використання одних і тих же фрагментів описів при різних значеннях вхідних величин. Саме на цьому прийомі засновано побудову описів, що не подовжуються при збільшенні обсягу дій, що передбачаються цими описами. Повернення до повторного проходження одного і того ж фрагмента опису може бути організовано із застосуванням логічних засобів мови, проте мова може містити і спеціальні засоби організації циклічних алгоритмів(Наприклад, оператори циклу в мовах високого рівня). І в тому і в іншому випадку істотним компонентом алгоритмічної культури тут є розуміння загальної схеми функціонування циклічного процесу і, що особливо важливо, вміння виділяти при побудові алгоритмів повторювану (робочу) частину циклу.

8. Виконання (обгрунтування) алгоритму. Суттєво важливим компонентом алгоритмічної грамотності є постійно притягається в процесі алгоритмізації вміння сприймати і виконувати розробляються фрагменти опису алгоритму абстрактно від планованих результатів - так, як вони описані, а не так, як може бути, в якийсь момент хотілося б самому авторові чи виконавцеві. Говорячи іншими словами, потрібно розвинене вміння чітко зіставляти (і розділяти) то, що задумано автором, з тим, до чого призводить фактично написане. Цей компонент алгоритмізації примушує автора алгоритму постійно перевтілюватися в холоднокровного і педантичного виконавця і є, по суті справи, єдиним працюючим в процесі створення алгоритмічного опису (до передачі його виконавцю) засобом контролю правильності і обґрунтування алгоритму.

9. Організація даних. Вихідним матеріалом для алгоритму є інформація або вихідні дані, які слід обробити. Укладач алгоритму зобов'язаний думати не тільки про те, як і в якій послідовності проводити обробку, але і про те, де і як фіксувати проміжні та кінцеві результати роботи алгоритму. Ми перерахували компоненти алгоритмічної культури, оволодіння якими має основоположне значення для формування досвіду складання алгоритмів - алгоритмізації і, отже, програмування для ЕОМ. Однак особливість компонентів, що утворюють алгоритмічну культуру, в тому, що вони не мають вузької орієнтації виключно на взаємодію школяра з ЕОМ, а мають, взагалі кажучи, незалежне від програмування більш широке значення. Говорячи іншими словами, алгоритмічна культура школяра як сукупність найбільш загальних "допрограммістскіх" уявлень, умінь і навичок забезпечує деякий початковий рівеньграмотності школяра не тільки для його успішної роботи в системі "учень - комп'ютер", але і в неформальних безмашинних системах "учень - вчитель", "учень - учень" і т.п., тобто створює то операційне наповнення, яке, зокрема, обслуговує діяльність школяра в рамках навчальних дисциплін за межами "комп'ютерної" обстановки. Як відзначав академік Є. П. Веліхов в зв'язку з введенням в школу предмета Основи інформатики та обчислювальної техніки, "інформатика є частиною загальнолюдської культури, що не зводиться до використання комп'ютерів, а в рівній мірі відноситься, скажімо, до вміння пояснити приїжджому дорогу. Дослідження, спрямовані на виявлення загальноосвітнього матеріалу з програмування для середньої школи, зв'язувалися в кінцевому підсумку з педагогічної завданням формування загальноосвітнього предмета (розділу) з програмування для подальшого включення в навчальний план загальноосвітньої школи. Така спроба вперше була реалізована до середини 1970-х рр .: в курсі алгебри VIII класу з'явився матеріал для бесіди по темі "Обчислення і алгоритми", а пізніше 11-годинний розділ "алгоритми та елементи програмування".

Значення цього раптового "прориву" відомостей про програмування для ЕОМ в регулярне зміст шкільної освіти важко переоцінити, хоча в цілому ця акція виявилося явно невдалою і новий розділнезабаром був виключений з підручника алгебри. Причина в тому, що замість залучення напрацьованих на той час помірних навчально-методичних засобів наочно навчання алгоритмізації в підручник була введена формальна англомовна нотація мови Алгол-60, що, природно, шокувало непідготовленого масового вчителя математики. В результаті - розвивається ідея використання для формування фундаментальних компонентів алгоритмічної культури учнів навчальних (гіпотетичних) машин і мов алгоритмізації. У періодичної методичної? друку все наполегливіше ставиться питання про введення в школу загальноосвітніх курсів (розділів), присвячених вивченню елементів кібернетики, ЕОМ і програмування, в його обговоренні поряд з методистами беруть участь відомі математики. У той же час досліджуються змістовно-методичні аспекти міжпредметних впливу алгоритмізації на традиційні шкільні предмети і, перш за все, математику через мову, алгоритмічну спрямованість змісту, посилення уваги до прикладної стороні знань і т.п. Перспективна значимість цих робіт в тому, що вони розглядали саме ті аспекти глибокого впливу ідей і методів програмування на утримання і процес навчання, недолік яких в повній мірі став проявлятися в умовах рішучої експансії комп'ютеризації школи, гримнула десять років потому.

Наприкінці позаминулого тижня в Москві відбулося невелике виступ, де він повідав початківцям гікам про те, з якої мови варто почати свій професійний шлях і до якої майбутній кар'єрі з відповідними знаннями варто прагнути.

Деякі подробиці цієї зустрічі ви можете знайти в коментарях до запису, а поки давайте тут спробуємо з'ясувати: так яка мова вивчити першим?

Стара школа

Перші уроки інформатики, викладачі зі скрипом в серці підпускають дітей до шкільних комп'ютерів, щоб навчити їх першому мови програмування в їх житті. 15 років тому в більшості випадків це був процедурні мови Basic або Pascal, але, якщо вам дуже щастило з викладачем, могли заодно пізнати і C.

Останнє залишимо поки за дужками і розберемося: чи так добре починати навчання з сильно обмежених мов. Плюси очевидні: простий синтаксис, схожий зі звичайним англійською мовою, і можливість навчитися азам програмування всього за кілька годин. Але є і мінус: відсутність реального практичного застосування без вивчення подальшого розвиткуцих мов (Visual Basic і Object Pascal). Та й в цьому випадку ви опинитеся далекі від розробки повноцінних сучасних додатків.

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

сучасна школа

Як ви напевно знаєте, багато сучасних школярі починають свій шлях в програмування з деяких спрощених версій «великих» мов, таких як Scratch, Blockly або Logo. В цілому, плюси можна було б переписати з процедурних мов, якби не одне «але»: дані мови і додатки, побудовані на їх основі - розважальний сервіс для дітей.

Тобто єдине, що можна винести з такого програмування - загальна структурапрограми, поняття циклів і операторів. А значить, якщо вам вже виповнилося 12 років, то забудьте про ці дитячі мови, вам пора в світ дорослих.

Швидкий старт з перспективою

Припустимо, що, відкинувши всі прелюдії, ви хочете негайно приступити до вивчення одного з ходових мов програмування, заодно вивчивши всі основи програмування. Тоді варто відповісти лише на одне просте запитання: чому конкретно ви хочете займатися? Якщо програмувати «залізо», тоді тут навіть дискусії бути не може: відповідь C, тобто мова C. У ньому поєднується все що потрібно новачкові: простий синтаксис, великі можливості, як для продовження роботи в цьому середовищі, так і подальшої перекваліфікації на « не залізний »профіль. При цьому майже в будь-якому великому роздрібному магазині електротоварів ви зможете знайти налагоджувальні плати, стартові набори робототехніка і інші радощі для новачка.

Якщо ж ви вважаєте своїм покликанням веб, то тоді необхідно почати свій шлях стандартно з HTML і CSS. Це дозволить створювати статичні сторінки і отримати приблизне уявлення про те, з чим доведеться мати справу. Далі настійно рекомендується взятися за Python. По-перше, тому що ця мова дійсно легко вивчити. По-друге, за деякими даними, Python найпопулярніший мову, якщо брати до уваги тільки статистику навчаються з 2011 року. По-третє, можливості цієї мови такі, що сьогодні з його допомогою ви створюєте веб (як DropBox або Google), а завтра приступаєте до розробки гри (Civilization IV).


Важко в навчанні легко в бою

Не відпускаючи тему інтернету, в якості першого мови (фактично третього після HTML і CSS) програмування ви можете вибрати JavaScript. Саме так поступали на уроках інформатики 15 років тому і в цьому був цілком певний сенс: у статичних сторінок з додаванням буквально 4-5 рядків з'являється активна складова, що піднімає мотивацію працювати саме в цьому напрямку. При цьому працездатність не залежить від браузера або від операційної системи. І це не кажучи про перспективи подальшого розвитку в бік Node.js.

Також почати свій шлях в інтернеті можна з PHP або Ruby, але якщо ви ніколи не займалися програмуванням, то краще йти по шляху найменшого опору, а ці дві мови залишити на майбутнє вивчення. Заодно порівняйте.

Ну і нарешті до розробки додатків. Три шляхи: Java, Swift, C #. Бажання почати своє навчання програмуванню з них - вельми серйозний виклик, який в разі відсутності працьовитості може виявитися дурістю, адже на кожен буде потрібно кілька місяців посиленого вивчення. Втім, перспективи теж можуть служити стимулом, будь то успішна кар'єра в мобільній сфері (Java - Android, Swift - iOS) або ігровий (C # + Unity).

Сьогодні писав відповідь Ніні Шуміліну з Твері, на питання про Python, як першому мовою програмування в школі.

Вона цитувала Костянтина Полякова, висновок його статті у вересневому номері "Інформатики":
З цих причин автор схильний підтримати думку І.А. Сучого: Python хороший для професійних програмістів, але його використання в якості першої мови програмування може бути невдалим рішенням. Як зізнаються вчителі, які викладають на Python, ті, хто навчався програмувати на Python, не хочуть переходити на інші (більш низькорівневі) мови. Навчивши школярів сортувати масиви викликом методу sort, складно потім пояснити, навіщо написані цілі томи про алгоритми сортування. А це може призвести до появи плеяди "програмістів-тільки-на-Python", не готових до подолання додаткових обмежень заради підвищення ефективності програми. Фактично вчитель потрапляє в ситуацію, яка добре описується фразою "У Python такі можливості є, але вчити так не можна!" (Є. Андрєєва). У той же час, було б корисним вивчення Python в якості другої мови програмування в класах з поглибленим рівнем вивчення інформатики (наприклад, після Паскаля або C).

Моя відповідь явно переріс за формат листа, тому поки опублікую його тут, а потім, можливо, допрацюю до статті.

Несомнено, ставлення до Python різний. Дійсно, висловлюються побоювання, що динамічна типізація і занадто велика "високорівневих" мови шкідлива для навчання, що не можна підміняти поняття "масив" високорівневими списками, так як "ошукані" легкістю операцій зі списками школярі не будуть розуміти принципів внутрішньої організації і т.д.

Але на мій погляд подібна критика виходить в основному від "теоретиків", які жодного разу не пробували вчити програмування саме на Python, то ж Поляков хоча і почав публікувати в "Інформатики" статті про Python, але, схоже, ніколи його не використав для навчання . А ось що критикують Python практиків, тобто людей, які спробували б навчати дітей на Python хоча б рік, а потім би відмовився, мені невідомо.

Наприклад, нібито процитована Поляковим Е.В.Андреева три роки тому вирішила спробувати вчити школярів 6-7 класу в "інтелектуали" на Python. До цього ставилася до цієї затії досить скептично, але вирішила спробувати. Через півроку вона вже виступала на конференціях і говорила, що школярів в середній ланці найкраще вчити на Python, що вона в це не дуже вірила, але ось спробувала і за кілька місяців її погляди змінилися. Так що не знаю, що саме цитував Поляков і скільки років цій цитаті, але ось вчора я спеціально показав цю переписку Андрєєвої і попросив відповісти, на що вона написала "Відповідь Шуміліну - школярів середньої ланки безумовно треба вчити на Python".

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

a = * 1000
ніж
var a: array of integer;
...
for i: = 1 to 1 000 do
a [i]: = 0;

Результат для програміста - однаковий, виходить масив, заповнений нулями, але на Python - один рядок замість трьох, а сенс не змінюється. І тут скептики, звичайно, будуть говорити, що ось не можна так писати, як на Python, що школяр повинен розуміти, що масив - це безперервний фрагмент пам'яті, що ми повинні повинні його оголосити, тобто зарезервувати для нього місце, що ми повинні його проинициализировать, заповнивши його нулями ... Ну а наша відповідь скептикам - це те, сенс для початківця програміста не змінюється, навпаки, рядок a = * 1000 краще відображає те, що школяр хоче отримати і відразу ж (хочу список з одного числа 0, повтореного 1000 разів), набагато простіше пишеться і дозволяє вирішити більше завдань!

Просто подивіться на два наведених вище фрагмента, який з них зрозуміліше? Який з них Вам подобається більше?

Отже, для початківців, безсумнівно, краще Python. Причому слабкі діти можуть тут і зупинитися, отримавши загальне уявленняпро програмування. А ось сильні школярі можуть рухатися далі, і в їх розпорядженні буде сучасний універсальна мова програмування, реально використовуваний для розробки програмного забезпечення в провідних світових компаніях. Ось, наприклад, статистика - "На що пишуть в Яндекс": http://blog.yandex.ru/post/ 77617 /. На Python можна писати веб-сайти, комп'ютерні ігри, GUI, клієнт-серверні додатки, ну тобто все, що завгодно.

Тепер щодо висловлення, що в мові багато високорівневих речей, і виникає спокуса їх використовувати, замість того, щоб вивчати, як це влаштовано. Ну так це проблема - методична, а не проблема мови програмування. Загальний методичний підхід тут такий - спочатку ми розуміємо, як це працює, потім дозволяється використовувати відповідний елемент мови. Наприклад, спочатку написали обмін значень двох змінних через допоміжну змінну, потім я показую, як це робиться за допомогою кортежів (a, b) = (b, a). Спочатку написали максимум з двох, трьох чисел, потім можна використовувати функцію max. Потім написали програму пошуку максимуму в
послідовності (масиві), після цього можна використовувати функцію max для списку. Спочатку написали сортування самі, потім можна користуватися функцією sort, і я навіть наполягають на тому, щоб школярі користувалися стандартною функцією sort - це швидше і зручніше, і дозволяє вирішити більше завдань, але тільки після того, як вони навчилися самі писати sort.

Насправді, вбудована сортування є в будь-якому сучасній мовіпрограмування (Java, C ++, PHP), бо зараз так прийнято. Немає її тільки в класичному Pascal (а ось в сучасному Delphi - є), ні в старих Бейсік (а в Visual Basic - є), але це ж не означає, що всіма цими мовами можна користуватися, бо в них є вбудована сортування? І нікому ж в голову не прийде забороняти вивчення цих мов в школі тільки тому, що "а раптом учитель навчить дітей користуватися вбудованою сортуванням, а потім цим дітям не поясниш, навіщо потрібно вивчати складності алгоритмів сортування". Тому проблема не в тому, якщо в мові програмування sort чи ні, а проблема в тому, ЯК цим користуватися. Якимось школярам досить пояснити, що таке "сортування вибором" - вона зрозуміла і дуже легко пишеться на тому ж Python, а з кимось можна обговорювати і ефективні алгоритми сортування, і наявність вбудованої сортування цьому не заважає. Більш того, якщо я дітей вчу програмування на тому ж C ++, то я намагаюся навчити дітей і користуватися сортуванням sort з STL, причому ефективно її використовувати, і це не заважає вивченню алгоритмів сортування. У MIT (Massachusetts Institute of Technology) все початкові курси програмування кілька років тому перевели на Python. На новому факультеті комп'ютерних наук ГУ ВШЕ, створеному в 2014 році за участю компанії "Яндекс", саме Python є першою мовою програмування, який вивчають студенти. Тут я привожу саме новий факультет як приклад, тому що в вузах з уже сформованими програмами важче що-небудь змінити, наприклад, на факультеті ВМК МГУ спроба замінити Pascal на C, як перша мова програмування, виявилася безуспішною через небажання змінювати сформовані програми і контингент викладачів.

Далі подивимося на висловлювання "А це може призвести до появи плеяди "програмістів-тільки-на- Python", не готових до подоланнядодаткових обмежень заради підвищення ефективності програми. ". У якомусь сенсі, нічого поганого в цьому немає. Програмування стає все більш і більш масовою професією, і багато навичок програміста не відносяться до того, що є вищою освітою, тобто більшості програмістів і не потрібно вивчати томи, присвячені алгоритмам сортування. Складнощі алгоритмів сортування - це вже, безсумнівно, сфера вищої професійної освіти, ну а програмісти, які вміють написати сайт на PHP або програму для бухобліку
в 1С теж потрібні, і їх потрібно дуже багато. Таким програмістам в цілому необов'язково розбиратися в алгоритмах сортування, їм якраз необхідно вміти користуватися стандартною функцією sort для будь-яких завдання і знати, що вона вміє сортувати масиви краще, ніж якби вони це написали самостійно (і вже зовсім дивно вимагати від web-програміста знання алгоритмів швидкого сортування, звичайно, нічого поганого не буде в цьому знанні, але для роботи йому це абсолютно непотрібно). Так що система навчання програмістів повинна включати в себе і середню професійну освіту (на якому вчать прикладним речам і технологіями), і систему вищої освіти (де якраз доречно обговорювати питання складності алгоритмів сортування), точно так же, як це є в багатьох галузях, наприклад, в медицині (медик із середньою спеціальною освітою виконує стандартні медичні процедури, а медик з вищою освітою вміє призначати лікування, тобто аналізувати причини і приймати рішення). Так, спеціальності, пов'язані з програмуванням є і в середній спеціальній освіті, і у вищій освіті, але система тут не так збудована, як в тій же системі МЕДИЧНИЙ освіти. І, якщо чесно, я погано уявляю, що відбувається в середню професійну освіту з навчанням програмування.

Одна з аналогій, яку я люблю тут наводити - це прогрес в поширенні автомобілів. На початку і середині XX століття водій автомобіля повинен був знати пристрій автомобіля і сам виробляти досить складний ремонт. Будь-який водій повинен бути в значній мірі механіком. Зараз багато водіїв ну якщо і мають загальне
уявлення про будову автомобіля, то вже точно ніколи не займаються його ремонтом, вважаючи за краще виконувати все технічне обслуговування в автосервісі. Добре це чи погано? Це, на мій погляд, неминуче. Широта поширення автомобілів стала такою, що складно вимагати від всіх автолюбителів навичок ремонту та глибокого пізнання пристрою автомобіля. Широке поширення автомобіля неминуче призведе до того, що у більшості водіїв не буде глибоких пізнань про пристрій автомобіля. А автомобілі, в свою чергу, стають зручніше і надійніше, тому використовувати їх можна і без спеціальних навичок.

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