Go як мова для навчання програмуванню

tl;dr: Go досить багатослівний і строгий мову програмування з дуже передбачуваною і стрімкої кривий навчання, що робить його вкрай вдалою технологією для навчання програмуванню новоприбулих!
Я тільки приїхав зі штатів, після Google Code-In Grand Prize 2012 Trip, відпочилий і веселий. Якийсь час думав написати звіт про те, чим призери там займалися, як нас прийняли в Mountain View і про все це, але в якийсь момент зрозумів, що все це абсолютно марно. Зовсім недавно я по волі випадку повинен був допомогти своєму товаришеві з домашкой з інформатики (там було щось на зразок selection sort). Реалізація потрібна на паскалі, а я паскаль знаю дуже погано, як втім і інші неактуальні, по більшій мірі, мови програмування, начебто Ada.

У мене вдарила блискавка і вкусив гофер, після чого моє тіло мутували в якусь кунг фу Go дурня. Іншими словами, я задумався про можливий потенціал мого улюбленця серед нових технологій, Go, в якості мови для навчання програмуванню новоприбулих (читай: школярів). Мені здається, Go є все, що в принципі може бути потрібно подібній програмі і навіть трішки більше (наприклад, у школі могли б зачіпати тему паралельного, ні в якому разі не concurrent, програмування, яку не зачіпають, просто тому що FPS взагалі не вміє ганяти два шматки коду одночасно). Під катом, власне, мої думки на цей рахунок. До речі, користуючись нагодою, хочу передати привіт divan0! Велике спасибі за твою просвітницьку діяльність у тематичному хабі: Go дійсно потребує розголосу, адже багато людей досі вважають, що це якась страшна виріб рівня Plan9 з 80-х і до того ж, без узагальненого програмування (в кожному жарті є частка жарту), а ти розповідаєш людям дуже правильні речі на зрозумілій для них мові! Ніякого дисклаймера не буде, але я настійно не рекомендую сприймати вміст статті абсолютно серйозно, адже я людина, у якого є цілих два гофера: синій і рожевий!


Аргумент №1. Багатослівність і строгість

Мене шалено дратує слово «багатослівність», але якщо я вже взявся писати статтю, то треба переводити verbose на російську. Чому багатослівність це добре? Багатослівність спрощує розуміння коду на екрані, так як при недостатній многословности у читає можуть виникати питання рівня «А що ця штука взагалі робить?». Можна довго впиратися в крайнощі типу Haskell vs Cobol, але суть і так зрозуміла. Чому багатослівність це погано? Адепти релігії DRY неодноразово нагадують мені про те, що в Go немає генериків (узагальнене програмування). Замість генериків пропонують бутсрапинг або кодогенерацию. Тим не менш, архітектура мови програмування це завжди певні операції: ручне керування пам'яттю проти збирача сміття, генерики проти бутстрапинга, динамічна типізація проти статичною, це можна продовжувати вічно.

Що стосується строгості, то тут Go мене дуже радує. Компілятор ніколи не йде на поступки з програмістом і будь-яка, здавалося б, дрібниця, яка в компіляторах інших ЯП виллється в непримітний warning, тут буде помилкою компіляції. Не граєш за правилами специфікації мови — не отримаєш бінарники, все просто. Компілятор до того прискіпливий, що валить компіляцію при вигляді невикористаного модуля. По-моєму, це просто обосраться, як чарівно, особливо якщо тобі 15 років, ти тільки прийшов в програмування і хочеш зробити все «по-швидше». Я сплю і бачу школяра за комп'ютером, який намагається скомпілювати програму, але зазнає фіаско; потім, промовляючи в голові мати, які він тільки знає, повертається в редактор, щоб прибрати modulename з include-списку. Жорстко? Ще б! Але знаєте, така жорсткість, вона виховує!

Аргумент №2. Грандіозна крива навчання

В архітектуру Go закладена простота. Пайк десь говорив, я вже не пам'ятаю де, що вони дійсно вирізали все, що можна було вирізати. Заради цієї простоти, Go немає трьох типів циклів (C-way), а всього один (і це без втрати виразності!), в Go немає просунутої системи типів (але є чарівні інтерфейси!) і в такому дусі. Я впевнений і навіть готовий поставити на це свої тапки (дорогі тапки, до речі, закордонні), що звичайний такий школяр не стане читати специфікацію мови, так що не буду згадувати про неї. Так чи інакше, мова, через свою простоту і помірною многословности, забезпечує стрімку і передбачувану криву навчання. Але хоча б факт того, що пам'ять managed, вже знімає купу проблем рівня «так це що виходить, ось ця функція у мене протікає? не може бути!».

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

В Go пам'ять управляється автоматично, а значить, накосячілі тут складно. В Go немає покажчиків, а тільки посилання. Існує правило, яке дозволяє чітко визначити (у більшості випадків), передавати змінну за значенням або за посиланням: «Якщо ти збираєшся передати право володіння над змінною, то треба передавати за посиланням, інакше — за значенням. Стандартний набір проблем з ООП не з'явиться, тому що Go вдався до дуже красивим рішенням щодо об'єктно-орієнтованого програмування. А саме, Pike & Co. випиляли класи, всяке „ambiguous“ спадкування та іншу інкапсуляцію, пропонуючи структури, интерфес, embedding. Проблему інкапсуляції вирішили до неподобства цікаво: всі поля структури, які починаються з символу верхнього регістру йдуть назовні, а все інше залишається всередині.

Я змалював картину, а вже робити висновки вам. Мені здається, що все дуже навіть чарівно.

Аргумент №3. Багатопоточне програмування

Я вважаю, що дітям уже в школі дуже важливо давати навички роботи з багато-додатками. Знаєте, мало прикольного в тому, що студент, досвід якого так чи інакше зводиться до проектів рівня laba3, потрапляє в реальний проект, де одночасно виконується багато коду, всі ресурси треба закривати на м'ютекси, до того ж це все треба ще покрити тестами… Комп'ютери вже давно можуть паралельно виконувати кілька завдань (parallel != concurrent), за рахунок архітектури процесорів і цим треба користуватися. Я вважаю, що поряд з деякими класичними реалізаціями деяких алгоритмів треба також давати паралельні їх реалізації. Того ж selection sort, наприклад.

Go позбавився від злих і страшних потоків, на заміну яким прийшли горутины. Я думаю, що працювати з корутинами (=завданнями), на рівні розуміння, куди легше, ніж з потоками. Канал, здавалося б, просто черга, але плюхи на рівні синтаксису роблять роботу з ним інтуїтивно зрозуміліше і куди очевидніше. Як би довго я не нахвалював корутины, канали і select, так чи інакше, ми все одно впираємося в м'ютекси. Тим не менш, я думаю, що це все одно краще, ніж те, що ми бачимо сьогодні в інших мовах, особливо говорячи в контексті навчання.

Трохи про Python

Якийсь час пайтон вважається дуже хорошим мовою для навчання. Аргументи: інтерпретується, типізація, curly brackets — gotta go! Я не хочу зайвий раз піднімати срач, але можу сказати, що по частині кривої навчання, Python дуже підла штука. А ще у мене є думка, що програміст починає цінувати переваги і поважати недоліки динамічної типізації тільки після певного часу проведеного зі статичною типізацією. Я не вважаю, що новоприбулого варто велосипедить-куралесить з динамічними типами, поки він не зрозуміє, що таке тип взагалі. На жаль, для талановитого програміста Альоші з 8А це не так очевидно.

Кінець

Ну, це все. Спасибі всім, хто осилив цей дамп моєї свідомості, сподіваюся, що комусь це було цікаво. Прикольно буде, якщо якась ініціативна чувак з викладацькими навичками прочитає і надалі народить робочу освітню систему! Ні, це правда буде відмінно! Ах так, не соромтеся задавати у мене питання: в коментарях і навіть в приват!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.