Научете всички езици за програмиране
Когато бях първокурсник, а след това се запознах с друг студент, който твърди, че е в състояние да пиша код на всеки език за програмиране, който мога да се обадя. Бях малко шокиран от странното поведение и каза:
- Какво, дори и в този тежък за четене езотерична език, където има само няколко отбора, които едва се симулират Тюринг машина?
- Да, този език се нарича brainfuck. Знам brainfuck.
И това не е трик - ние проверихме. Обадих се, че знам, че един език за програмиране, той прекарва няколко минути в интернет, за да се гарантира, че на опресняване знанията си върху него - и е в състояние да пиша за работа на алгоритъма на този език. Не можах да го разбера. Той, като мен, а след това е бил на около 18 години - колкото можеше на тази възраст знаят всички тези езици?
Brainfuck преводач, написани на brainfuck
Днес, аз все още предизвиква респект е демонстрация на възможностите на моя съученик, но аз не бях шокиран от това. След Самият аз научих повече от един език, стана ясно, че се различават един от друг, те са значително по-малко от това може да се очаква. В един момент в обучението си, са обърнали внимание не толкова на синтаксиса на езика за програмиране, а по-скоро на основните идеи, модел памет, на принципите на изпълнение на инструкции. Всичко това може да се нарече теорията на езици за програмиране, от гледна точка на различните езици, които просто изпълняват няколко различни версии на едни и същи идеи.
И веднага - отказ от отговорност :)
- Никога не съм казал, че трябва да се проучи наистина 500+ (или колко вече са налице действителна?) езици за програмиране. Говоря за това, което трябва да се разбере основните парадигми и модели за изпълнение, които ви дават възможност да се реализират почти всеки проект в почти всеки език. А zabyvsheesya ключова дума или функция от стандартната библиотека винаги може да надникнем в документацията
- Това не е на пет минути работа. Може би ще се придвижи до момента по този начин в продължение на няколко години. Но, знаете ли, може и да оставите и десетилетие
- Ще трябва да научите някои от тях вече е остаряла, или все още не са включени в модна концепция
- В зависимост от основната си работа (или цели в живота), всичко това може да сте абсолютно никога не дойде по-удобно
Тогава защо го направи?
Ако видите някои значителна част от кариерата си, свързано с писането на софтуера, вие ще да е добра идея да бъдат запознати с езици за програмиране:
- Дори и без да избирате всеки конкретен език за програмиране (или изберете само един) от няколко години работи като програмист ще откриете, че вече са написани (или чете) кода на няколко езика. Така че, защо винаги се случва нещо
- Ще откриете, че като познаването на няколко програмни езици, вие ще искате да всеки път, можете да изберете един от тях за решаването на определени проблеми
- Езиците за програмиране, цъфтят и остарели. Познаване на някои от тях ще ви даде възможност да остане на гребена на напредъка, да имат достъп до по-интересни проекти или добра компания
- Много от важните проекти изискват основно разбиране на съставителите и владеене на повече езици за програмиране. Това изпълнение на инструменти за разработка, стандартни библиотеки, обектно-ориентирани езици, IDE, браузъри, бази данни, статичен анализ, и т.н.
Лично аз мисля, че е много важно последна точка. Рас Bodik добре подчерта този момент в своята лекция пред студенти от Бъркли, когато той обясни значението на изучаването на курса на развитие на компилатори:
Не се шаблон разработчиците на софтуер за масово потребление. Вместо това, опитайте се да се разработят нови инструменти за потребителите и други програмисти. Ако се направи историческа аналогия, какво би вече не иска да бъде: работник в стан, извършване на ежедневните задачи или разработчик на новите модели на тези машини?
Стъпка номер 0: Спри, наричащ себе си "програмист на релси (замени вашия език \ платформа)"
Това е проста, но важна стъпка. Да, най-вероятно вече имате някаква специализация и може да се гордее с него и да продължи да я подобрим - това е добре. Но в същото време, такъв самоидентификация създава психическа бариера в главата ти. Всяка нова технология, всеки нов език се възприема с нотка на скептицизъм или критика, а може би пренебрежение - и това е лошо. Започнете да се наричат просто "развитие инженер софтуер" или "програмист".
Един пример ще бъде Алекс Гейнър - чудесно за Python експерт, един от основните разработчици неща като Django и PyPy, член на борда на директорите на Python Software Foundation. Но след като го е помолил за съдействие САЩ Digital Service - и Алекс прекарва няколко години в проекти ASP (дори не е ASP.NET, но на стария ASP). Знаеш ли защо? Защото той - "Развитие на инженер софтуер", а не "на Python-разработчик."
Стъпка 1: Отидете на мета-ниво
Има такова стар виц за това как приложна физика случайно удари на конференцията теоретични физици. Той се обърна към един от говорителите и попита как той дори успява да се мисли за всички тези неща, които се провеждат в 11 измерения? Теоретичен физик отговорил: "О, това е лесно. Само си представете, N измервания, след което заключва N е равно на 11 ".
Един добър програмист може да използвате една и съща работа. Можете да слушате всички тези истории за търговци, които «Отиди - е нов и амбициозен език за програмиране" и просто да го определи за себе си като статично компилиран език нетипичен с боклукчията и конкуренция CSP-стил. Swift може да бъде "нов и внимателно проектирани" добре, или просто компилиран multiparadigm език с общо предназначение осъществява въз основа на LLVM.
каноничен справочник за около компилатори: «компилатори: принципи, техники Инструменти ». Тя - Книга на Дракона. Както всички книги на това ниво, има и двата бесни фенове и непримирими критици. Лично аз мисля, че е отличен материал, но да бъдат подготвени за факта, че някои части от него, ще трябва да прочетете отново няколко пъти, преди пълно разбиране. Там са по-прости и насочена към практикуващите на книгата - това е Езикови тенденции на усвояването. Ако вашия интерес е ограничен до определен практически проблем от малък мащаб (като писане на домейн-конкретен език), тази книга е подходяща по-добре от класическата книга на Дракона.
Стъпка номер 2: Започнете с основните източници
С добра теоретична основа тя ще бъде по-лесно да се научат нови езици, но все пак не е толкова лесно да се вдигне и да се научат всички 500+ повече или по-малко значение днес езиците за програмиране. Поради това, можете да започнете с определянето на езици, които за първи път са проучени и изпълнява някои радикално нови идеи. Въз основа на изследването си на подобни актове в по-нови езици ще има тривиална задача.
Петър Norvig дава няколко съвета за това какво парадигма е наистина важно, и в какви езици са били приложени за пръв път:
Научете най-малко 5 езика. В магазина на знания трябва да включва поне един език с класическите "класове" абстракция (тя може да бъде Java или C ++), функционален език (като Lisp, ML или Haskell), на език, който поддържа синтактично абстракция (като Lisp) декларативен език (Prolog или C ++ шаблони), един език с разширена поддръжка за едновременност (Clojure или Go).
Мисля, че този съвет е добра отправна точка, но можете да тръгнем по този път и в бъдеще. Първо, предлагам ви да научите езика С възможно най-скоро. Тя е толкова вездесъщ и важно, че тя просто не може да се избегне. В допълнение, изследването ще го направи много по-лесно с учебни и други езици, както и, така че много от тях имат някаква идея или част от синтаксиса е S.
Аз също препоръчвам да се разгледат някои асемблер. Това може да бъде MIPS (ако искате да прекарате малко време за обучение) или x86 (ако искате да има практическа употреба). Това ще ви даде повече знания за компютърна архитектура и процесор устройство, отколкото на езици за програмиране, но ако в бъдеще искате да напишете компилатор, това е точно това знание и имате нужда от тях. Може би, някой ден, вместо на събранието ще бъде да препоръча изследване формат LLVM междинен код.
Петър Norvig препоръчва изследване на декларативни езици, но аз ще бъда по-конкретен и тук бих препоръчал да изследва езика на логиката програмиране. Това може да бъде класически Prolog и miniKanren.
В секцията "Езици с поддръжка на едновременност", за да по-горните варианти, бих добавил още и CUDA. Това е качествено различен мащаб паралелизъм, защото стотиците GPU ядра не може да бъде сравняван с конвенционалните 4-ядрени процесори. Вие не само ще разберете по-добре GPU устройство, но също така да положи за себе си добра основа за по-нататъшно проучване на машинно обучение (има паралелизъм и GPU изчисления е много полезно). Но е важно да се разбере, че имате нужда като знания CUDA, и един от тези езици за паралелен процесор (като Go, Clojure и Erlang).
Vector програмиране е друг мощен парадигма. Norvig напразно пропусна езици с подкрепата си, тъй като те разполагат с достатъчно конкретни приложения на. Класическите примери могат да бъдат APL / J / K / Q, както и Matlab.
Също така, има такова нещо като високо специализирани езици. Понякога създаването на високо специализиран език за някои конкретни задачи може да бъде правилното решение. Но, за да се вземе решение за това, че е необходимо да се разгледат конкретни примери, при които този подход е бил успешен. Аз съветвам да погледнете този тип неща Фринк.
Стъпка 3: практика
Просто направете списък на езици, които искате да се разгледа. Но тук е наистина в движение и да разгледате - ще отнеме известно време. Ако имате късмет, някои от тях ще бъде в състояние да прилага в основната им работа. Но дори и да не се случи това, трябва да се опита да намери свой собствен начин да научат нов език не е само теоретичен, но също така и от практическа гледна точка. Без теория на напредъкът е бавен, но без практика можете да се заяжда.
Един добър начин да започнете да учите нов език е да се прочете кратко свиване на Hyperpolyglot или Научете X в Y минути. Това ще даде приблизителна разбиране на основните понятия на езика и ще премахне страха от непознатото синтаксис. Ако вече сте запознати с някои подобен език, Hyperpolyglot има много удобна функция за сравнение на езици - това изненадващо бързо може да ви тласне в изучаването на нов език.
Най-бързият начин да се присъедини към новия език, по мое мнение, е да се намери група от по-малки задачи и постепенно ги решим. Добър източник може да бъде Exercism.io. Освен проблемите там, дори има тестове, които дават възможност за бързо оценка на качеството на процеса на внедряване. Решение на малки задачи, е в съответствие с изучаването на теорията и основната работа по други проекти.
След като се запознаете с синтактични и малки задачи, вече няма да ви доведе до проблеми, аз ви съветваме да намерите голям проект на този език. И това трябва да бъде един проект, който е в областта, за която е създаден този език. Например, ако се научите C или Go - пише командния ред помощна програма с голям брой системни функции на. Ако се научите Python или Ruby - опитайте се да напиша нещо алгоритмично и не е много взискателна към изпълнението (AI за кръстове нули :)) и т.н.
Дръжте копаене
Като се има предвид броя на езиците в света и на факта, че ние наистина се използва дори много стари езици като C, че е лесно да се заключи, че човечеството е измислил всичко необходимо езиците за програмиране. Но е много съмнителни предположения. Има една много значителна разлика между това, което се смята за възможно да се програмира и на факта, че ние днес сме се научили да програма. Проблемът не е в изчислителни ресурси - с всички текущи хардуерни платформи и днес, и облаците, където ние трябва да карам код. Проблемът е в начина ни на комуникация с компютъра, така че можем да не винаги е удобно да изразят това, което искаме да се получи на изхода на програмата и как трябва да бъде изчислена.
Джералд Джей Съсман обърна внимание на това в доклада си за зашеметяването Ние наистина не знам как да се изчисли. Той използва малко остарели инструменти, но също и инструменти на разположение днес не ни даде никакви качествено нови подходи към решаването на проблемите им осветена.
Триъгълник илюзия. Мъжът веднага вижда в тази цифра триъгълник, но ще трябва да прекарат наистина трудно да се учи компютърна програма да го направя.
Един от хората, които работят на върха на науката в посока на развитието на езиците за програмиране, е Крис Грейнджър, работещи на Ева. Той иска да се развива не само езика, но и всички съпътстващи инструменти. Езикът е само един от най-важните компоненти на цялостната платформа. Аз не знам дали това ще бъде ново поколение Ева основните платформи, но аз вярвам, че този подход се разпростира и допълва инструменти за езикова помощ, може да стане част от бъдещето. Най-малко, това ще даде възможност за по-добро каже на компютъра, което искаме от него. Както бе споменато по-горе, Рас Bodik (и аз казах), бих искал да бъда част от този прогрес. Научете всички програмни езици, а не един на всеки език. Разбиране на основите и принципите на което ви позволява да видите повече и да бъдат бдителни за появата на новото.