Нещодавно я отримав від читачів блогу кілька схожих питань. Мовляв, я хочу стати програмістом. і мені цікаво виключно функціональне програмування. З якої мови ви б порадили почати і де знайти матеріали по ньому? Так ось, на моє переконання, сувора дійсність така, що жоден з функціональних мов не підходить на роль першого.
Ні, ви цілком можете осилити Erlang чи іншої функціональна мова. Проблема полягає в тому, що вам буде нелегко знайти роботу, пов'язану з ФП, не маючи практичного досвіду в програмуванні. Бо зазвичай на функціональних мовами починають писати люди, вдосталь наївшись гівна з імперативними мовами. А значить, вони вже мають певний, ймовірно, досить великий, досвід в програмуванні. Таким людям не цікаво пояснювати новачкам, наприклад, як користуватися Git або як встановлювати пакети в Linux. Передбачається, що ви вже повинні знати ці речі.
Можливо, ви турбуєтеся, що, почавши з імператівщіни, ви будете гірше розуміти ФП. Це не так. По-перше, в наш час все програмісти починають свій шлях з Basic, Pascal і інших імперативних мов. Начебто, ще нікому це не завадило перейти на ФП. По-друге, ніщо не заважає писати на імперативних мовах в функціональному стилі. Наскільки я розумію, останнім часом це навіть стає модним. Програмісти на Java - і ті намагаються по можливості не використовувати успадкування та писати чисті функції. Нарешті, знання парадигм, відмінних від ФП, не завадить, а навпаки, допоможе вам в освоєнні ФП.
Виявляється, що чистих функціональних мов насправді не буває. Як, по всій видимості, і чистих об'єктно-орієнтованих мов. Програма повинна мати побічні ефекти, інакше вона нічого не робить і тому марна. Отже, в будь-якому функціональному мовою є елементи імператівщіни. Scala і OCaml - гібридні мови, в них є як ФП, так і ООП. У SML є посилання. У Haskell є монада IO. Clojure і інші Ліспі - це насправді Python з макросами і нормальної багатопоточність. Erlang - взагалі найчистіший об'єктно-орієнтована мова. куди чистіший, ніж, скажімо, Java або C ++.
Також слід зазначити, що для того, щоб почати по-справжньому цінувати ФП, потрібно на своєму досвіді відчути всі жахи імперативного програмування. Дізнатися, що це таке - намагатися виправити помилку в модулі, що складається з п'яти процедур, кожна з яких складається з 1000 рядків коду на Perl. Само собою зрозуміло, все це - із змінними даними, глобальними змінними і шестиповерховий ієрархіями класів. А помилка при цьому полягає в наявності дедлока, стану гонки або витоку пам'яті.
Так з якого імперативного мови програмування почати? Я б радив вибрати один з різних мов - Perl. Python або Ruby. Який саме вибрати - не має значення, вони приблизно однаково жахливі. Ці мови цікаві тим, що вони в будь-якому випадку стануть в нагоді вам для написання невеликих скриптів, що роблять за вас будь-яку рутинну роботу. Крім того, вони активно використовуються в великих веб-проектах на кшталт Яндекса, Рамблера, Mail.ru або LiveJournal. Не знаю, наскільки вам сподобається працювати в одній з цих компаній, але цінного досвіду ви там точно наберетеся сповна.
Можливо, вам не дуже цікава веб-розробка. Тоді вам можуть більше сподобатися Java або C #. У першому випадку вам буде набагато простіше перейти на функціональні мови під JVM, наприклад, Scala або Clojure. C # має сенс вибрати, якщо ви дуже любите продукти компанії Microsoft і вам цікавий мову F # або OCaml.
Настійно рекомендую орієнтуватися на функціональний мову, який реально десь використовується. До таких мов можна сміливо віднести Erlang, Scala і Clojure. Діалектів Лісп досить схожі один на одного, так що, можливо, вибрати один з них - непогана ідея. Ходять чутки, що десь пишуть на OCaml, але жодної вакансії мені до сих пір не траплялося. Достовірно відомо про існування вакансій для програмістів на Haskell, але останнім часом я погано розумію, як на ньому можна щось писати.
Haskell. проте, цікавий своєю здатністю ламати мозок. В хорошому сенсі. Пописав з півроку на Haskell, ви безперечно станете більш хорошим програмістом на Erlang, Java або на чому ви там пишете. Також в деяких книгах по функціональному програмуванню наводяться приклади коду на Haskell. Таким чином, знати його, по всій видимості, не зашкодить.
Конкретні матеріали по ФП радити не стану, так як тут все сильно залежить від вибору мови програмування. Книг по функціональному програмуванню дуже багато, до того ж, як на англійській, так і російською мовою. На мій погляд, в навчальних матеріалах не бракує.
Ну і на закінчення зазначу, що я не претендую на знання істини в останній інстанції. Можливо, саме зараз десь відкрилася вакансія хаскеліста з єдиною вимогою до кандидата - вміння користуватися Google, що знецінює більшу частину написаного вище.