Як вивчати мови програмування



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

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

Через кілька років, під час навчання в університеті, я побачив у кіоску маленьку книгу «Мова програмування Сі», Брайана Кернигана і Денніса Рітчі. Купивши її, я одразу ж приступив до читання. І о диво! Все було ясно, легко і страшенно цікаво. Мова C дуже маленький, простий і елегантний (я так вважаю), а сама книга була написана нормальною людською мовою, не позбавленим однак строгості. Я перечитував її багато разів, виконував вправи, і, таким чином, незабаром освоїв цю мову і стандартну бібліотеку функцій.

Але на чистому Сі багато не напишеш, а мені хотілося писати серйозні програми з красивою графікою. Програмував я в Slackware Linux, бо в Windows як в середовищі програмування повністю розчарувався. В ті часи я взагалі багато експериментував з різними системами, включаючи QNX і NetBSD. Але у вільних Unix системах вибір адекватних графічних бібліотек був невеликий: GTK+ і Qt. Причому друга була написана на C++, з яким я не бажав зв'язуватися, а в першій не було ясно взагалі, як працювати. І, якщо мені не зрадила пам'ять, їх редактори інтерфейсів генерували величезний код, який ще треба було вставляти у свою програму, а не ресурсні файли, що здавалося мені абсолютно жахливим.

Так би я і не почав кар'єру, якби випадково не познайомився з Mac OS X, яку нещодавно портувати на процесори Intel. Попросивши у знайомого диск Mac OS X 10.5 Leopard, я встановив її на свій HackBook і перший раз відчув себе на Землі Обітованій.

Пам'ятаючи про свій невдалий перший раз, я ще довгий час скептично ставився до об'єктно-орієнтованого програмування. На початку навіть планував писати програми на чистому Сі, використовуючи бібліотеку Carbon. І, як з'ясувалося – даремно. Objective-C я вивчив за офіційним керівництву компанії NeXT – Object-oriented programming and the Objective-C language. В ті часи вивчають нову мову ще не вважали поголовно ідіотами або школярами, тому книга написана нормальною мовою, а автори припускають знання Сі та загальне уявлення про програмування. Виявилося, що ООП – це легко, цікаво і дуже зручно, а об'єкти – зовсім не абстрактні сутності, а лише структури, об'єднані з функціями. На мій погляд, саме так і потрібно розповідати основи об'єктно-орієнтованого програмування.

Xcode і основам Mac OS X я розібрався з чудовим уроків Олексія Борескова. Після чого одразу ж пірнув у Mac Developer Library, взявся за вивчення офіційних інструкцій з Cocoa та іншим бібліотекам, паралельно почавши писати програми.

Моїм першим серйозним проектом було портування уроків по OpenGL з Windows на Mac OS X, яке розтягнулося на цілий рік. Лише закінчивши його, я відчув себе достатньо впевнено, щоб влаштуватися на регулярну оплачувану роботу.

Вивчаючи Objective-C, не можна не почути про Smalltalk, бо на нього його дуже часто посилаються в матеріалах з Objective-C, мабуть, вибачаючись за незвичний синтаксис. Але Smalltalk був схожий на Невловимого Джо – всі про нього чули, але мало хто його бачив або використовував. Врешті-решт мені стало цікаво, звідки є пішла руська земля.

Дізнавшись, що компанія Cincom – лідер в сфері рішень на Smalltalk – в рекламних цілях надає свої інструменти для некомерційного використання, я відразу ж замовив їх. Менш ніж кілька тижнів в мої двері постукав кур'єр вручив мені фірмову коробку з декількома CD дисками і офіційним керівництвом. Все було абсолютно безкоштовно, навіть за доставку не довелося платити. На одному з дисків виявився VisualWorks – одна з найбільш потужних і швидких комерційних середовищ розробки на Smalltalk в світі.

Після я дізнався про Squeak – вільну реалізацію Smalltalk, засновану на оригінальній версії Smalltalk-80, і познайомився з багатьма її розробниками. Для навчання та досліджень він підходить набагато більше, ніж інші версії. До речі, співтовариство програмістів на Smalltalk дуже дружне.

Майже всі серйозні проекти є кросплатформним, і їх ядра написані на C++, бо Objective-C дуже мало поширений за межами Apple екосистеми. Головним чином через відсутність зручних засобів розробки. (Будемо сподіватися, що завдяки LLVM ситуація невдовзі поліпшиться). Так що мені довелося вивчити C++, незважаючи на явну нелюбов до нього. На щастя, до цього часу я вже навчився відокремлювати зерна від плевел.

Втім, хакером я так і не став.

Порядок вивчення мов

C – перша мова

Це маленький (всього 32 ключові слова C89, 37 слів в C99 і 44 слова в C11) імперативний мову, і його первинне вивчення не займе у вас багато часу. У той же час C – дуже потужний промисловий мову. Головним чином використовується в системному програмуванні, написанні апаратно незалежних компонент операційних систем, компіляторів та трансляторів мов, бібліотек, програмування мікроконтролерів. За версією TIOBE Programming Community Index Сі все ще лідирує по використанню, зрідка ввічливо поступаючись першістю Java.

/* Hello world in C */

#include < stdio.h>
#include <stdlib.h>

int main(void)
{
printf("Hello World!\n");
return EXIT_SUCCESS;
}

Objective-C – друга мова


Він являє собою дуже тонкий шар поверх чистого Сі. Всі знання, отримані при вивченні Сі знадобляться вам в Objective-C. Причому об'єктно-орієнтована парадигма концептуально і синтаксично відокремлена від процедурної: у ньому ви ніколи не сплутаєте виклик функції та надсилання повідомлення. Основне його застосування – створення користувальницьких програм на пристроях компанії Apple.

/* Hello world in Objective C */

#import <Foundation/Foundation.h>

int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSLog (@"Hello, World!\n");
[pool drain];
return 0;
}

Smalltalk – третій мова


Після Objective-C він здасться вам дуже знайомим. І не дарма, адже саме його синтаксис і об'єктна модель були покладені в основу Objective-C. Цікавий насамперед чистою реалізацією об'єктно-орієнтованої парадигми. Всі конструкції мови, включаючи умови, цикли, керуючі структури і оператори, реалізовані через механізм повідомлень і винесені в стандартну бібліотеку класів. Незважаючи на мале поширення він використовується у великих складних проектах, де важлива масштабованість, гнучкість і можливість змін під час роботи. Наприклад, у фінансовій сфері (Kapital – система оцінки та управління ризиками в JPMorgan), управління виробництвом (CIM Texas Instruments), логістиці (IRIS-2 Orient Overseas Container Lines), страхуванні (Desjardins General Insurance Group) і інших.

"Hello world in Smalltalk" 

Transcript show: 'Hello World!'; cr.


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

C++

Дуже надлишковий (число ключових слів превалило за 100), заплутаний і складний у вивченні мову, з безліччю виключень і масовими порушеннями ОО парадигми. Але якщо ви хочете працювати в індустрії, знати його треба, бо альтернативи йому не передбачається. На C++ написані більша частина наукових та інженерних програм, ігор, фото — відео — аудіоредакторів і багато чого ще. Після того, як Objective-C і Smalltalk сформували у вас правильне уявлення про ООП і програмування, C++ вже не зможе пошкодити ваш розум. Але все одно будьте дуже обережні. Взагалі, слово «знати» у застосуванні до C++ має дещо інше значення, бо знати його в тому ж сенсі, в якому можна знати, наприклад, Objective-C або Java мало реально. Гарна новина: у більшості випадків для успішної роботи вам потрібно освоїти лише невелику підмножину мови. Чудовим прикладом грамотного використання C++ є IOKit – інтерфейс програмування драйверів в Mac OS X.

// Hello world in C++ 

#include < iostream>

int main()
{
std::cout << "Hello World!\n";
return 0;
}

Assembler


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

# Hello World in GNU Assembler on Mac OS X 10.8 using System V AMD64 ABI calling convention

.data
_hello:
.asciz "Hello world!\n"

.text
.globl _main
_main:
subq $8, %rsp

movb $0, %al
leaq _hello(%rip), %rdi
call _printf

movq $0, %rdi
call _exit

JavaScript


Мабуть, головний мова програмування Всесвітньої Павутини. Основне його застосування – створення динамічних web сторінок на клієнтській стороні. Кожен браузер забезпечений інтерпретатором і засобами для аналізу і розробки на ньому. Якщо ви хочете займатися web програмуванням, JavaScript – ваш вибір. У ньому реалізовані щонайменше три парадигми: процедурна, функціональна, об'єктно-орієнтована, причому остання заснована на прототипах. На перший погляд він здається дуже легким, бо дозволяє писати в C-подібній манері, але в реальності дуже складний. Більшість JavaScript розробників програмують не з використанням мови і навіть не на мові, а на одній з бібліотек.

// Hello world in JavaScript

document.write("Hello World!");

Мова Ada


Принаймні його варто вивчити, щоб шокувати знайомих священиків гучною заявою. Жартую. Завдяки правильному дизайну, численним вбудованим механізмів і перевірок Ada є одним з найбільш безпечних мов програмування. Навряд чи ви будете регулярно використовувати його (якщо, звичайно, вам не пощастило працювати в Міністерстві Оборони США, авіаційній або космічній сфері), але ознайомитися з ним вкрай корисно. Після її вивчення ви дізнаєтеся, яким повинен був бути C++.

-- Hello world in Ada

with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
Put_Line ("Hello, world!");
end Hello;

Scheme


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

;; Hello world in Scheme

(begin (display "Hello, World!")
(newline))

Знання різних мов дозволить вам вибирати потрібний мова під конкретну задачу, а не навпаки.

Особлива думка
Багато автори радять починати вивчення програмування з скриптових мов високого рівня, таких, як Shell, Perl, JavaScript або Scheme. Але особисто я рекомендую першою мовою вчити саме Сі. Скриптові мови з автоматичним управлінням пам'яттю, приховують всю складну роботу з покажчиками глибоко в надрах програми, справді легше в освоєнні, але всі їх переваги, можна повною мірою зрозуміти й оцінити лише після вивчення мови рівнем нижче.

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

За схожою причини ряд учених пропонує вивчати фізику не за класичною, а за спрощеною версією квантової механіки. Щоб у студентів відразу формувалося правильне уявлення про світ.

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

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

Хороший приклад об'єктної моделі, реалізованої на мові C – бібліотека CoreFoundation Mac OS X.

Як вчити мову?
Вивчення мови програмування дуже схоже на вивчення звичайного людського мови спілкування. Щоб вивчити нову мову вам знадобляться:

По-перше, хороший підручник. Не «Для чайників» і не «За 21 день». Краще, якщо це буде саме підручник з мови, а не керівництво по створенню і викладання гри в App Store (в якому процесу викладання присвячено більше часу, ніж самому програмування). По-друге, стандарт ANSI/ISO і довідник по стандартній бібліотеці. І, в-третіх, навчальні і реальні приклади, які можна знайти в Мережі.

Читайте підручники, виконуйте вправи, вивчайте чужі і пишіть свої навчальні приклади. Експериментуйте з мовою, наприклад, спробуйте реалізувати на ньому невластиві йому парадигми. Корисна вправа не тільки допоможе вам краще відчути мову, його достоїнства і недоліки, але і приведе вас до правильної думки – не існує універсальних мов. Бувають мови добре чи погано спроектовані.

Краща вправа – це написання невеликих програм, що реалізують різні структури даних і алгоритми – дерева, списки, таблиці, пошук, сортування, графи з книги «Алгоритми. Побудова і аналіз», Томас Кормен, Чарльз Лейзерсон, Рональд Рівестом, Кліффорд Штайн (Introduction to Algorithms by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest Clifford and Stein). Нескладні функції стандартної бібліотеки або утиліти командного рядка. Не потрібно намагатися відразу писати великі і складні програми, все одно ви ще погано знаєте мову.

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

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

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

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

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

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

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

0 коментарів

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