Относно избора на език за програмиране
Честно казано, въпросът за избора на език за програмиране никога не е стоял пред мен, с други думи изборът на език за програмиране винаги е бил очевиден за мен. Никога не съм участвал в холивари като C++ vs. Java, толкова популярна в края на 90-те години в същия Novosoft. Наистина, когато видите в собствената си кожа увеличение на производителността на моменти, всякакви спорове стават безсмислени.
И като цяло, както забелязах, в такива спорове участват само хора, които са били само от едната страна на предмета на този спор, което може би не е лошо, когато става дума за еднополови бракове, но е напълно непрофесионално (може би това е провалът на всички опити за създаване на неформални свърталища на програмисти във формат алкохол-холивар - невъзможно е да се съберат професионалисти в този формат).
Е, въпросът за избора на език за програмиране ме измъчва през последната седмица и за първи път от 20 години моя професионална дейност (да, момчета, програмирах за прехраната си от 20 шибани години и само програмиране). Защо сега? Отговорът се крие в една дума – Scala.
Разбира се, не чух за Scala миналата седмица, през 2008 г. ние в офиса започнахме да чувстваме, че Java вече не е торта (всичко естествено се познава в сравнение) и започнахме да мислим за езика за програмиране, на който можем да влезем в следващото десетилетие, всъщност стратегически въпрос и е пряко свързан с бъдещето на компанията. По същото време през 2008 г. купихме първата книга на Одерски, все още недовършена, в електронна форма и веднага намерихме Fantom ...
Възходът на Fantom
Fantom беше и е шибано страхотен. Продукт на Brian & Анди Франк (никога не се уморявам да се възхищавам на тези момчета) попада в същата ниша като Groovy, Ceylon и Kotlin, но от всички по-горе определено гласувам за Fantom. И аз имамима ясни аргументи за това (които са извън обхвата на тази публикация). Всъщност Fantom определено спечели сърцето ми преди 5 години и дори направихме IDE за Fantom (основно за нашите собствени нужди), като се предполага, че това ще бъде основният език за разработка в компанията за 10 години напред.
Тук не съм никак уникален и ми се струва, че JetBrains са направили Kotlin по абсолютно същите причини, пичовете от itemis - Xtend, Guidewire - Gosu, а Brian (SkyFoundry) - Fantom. Те искат да бъдат по-продуктивни и за това се нуждаят от език за програмиране, който ще им позволи да бъдат по-продуктивни. Всички тези езици, според мен, лежат в една и съща ниша и наистина ви позволяват да бъдете 2-3 пъти по-продуктивни, отколкото при програмиране на Java (това е моята субективна оценка), на което затворих въпроса за езика за програмиране. Ще пишем във Fantom и това е добре.
О, да, забравих да спомена Scala. През същата, не толкова далечна 2008 г., след като бях малко прецакан от бегъл прочит на недовършената книга на Одерски, разбрах, че няма да съберем екип, способен да пише на Scala, и без значение къде по света ще ги съберем. По-точно, със сигурност ще намерим програмисти, които могат да *използват* Scala, което се случва сега в много хипстърски стартиращи компании, които възприемат Scala като някаква подсладена версия на Java и не виждат отвъд синтактичната захар, но слава Богу, че не сме от този тип „програмисти“.
Език, като библиотека, рамка, технология, инструмент и т.н. трябва да увеличи производителността ви. Използването на Scala a la Java намалява продуктивността ви, защото инструментите са скапани, екосистемата е куца, компилаторът е бавен и т.н., и т.н. Отнема ни години, за да съберем екип от достойни програмисти, които могат да пишат на Java, да съберем екип от достойни и способниписането в Scala ще отнеме десетилетия - областта на търсене се стеснява.
Като цяло мнението ми за Scala в този момент беше доста скептично. Езикът, както ми се стори, излезе от академичната среда и където, както ми се стори, имаше повече изследвания по темата за системата от типове, отколкото в реалния живот, веднага получи минус в книгата на момчето, в сравнение с езика, създаден от практикуващи софтуерни инженери, които отлично разбират от какво се нуждаят и защо, опитвайки се да решат практически проблеми, които са доста разбираеми за мен.
Така Fantom и само Fantom. Нещо повече, ние бързо съчетахме Fantom Runtime с Eclipse Equinox (OSGi), научихме се да пишем добавки за Eclipse изключително върху него и започнахме да правим базирана на Eclipse IDE върху него, което направи Fantom отличен език за текущата част от бизнеса, който носи пари. Освен това се срещнахме лично със създателите на езика и се уверихме, че в този случай можем да повлияем на неговото внедряване и бъдещето.
Бъдещето изглеждаше безоблачно и светло и тази светлина се наричаше Фантом...
Scala отвръща на удара
От птичи поглед тези езици попадат в същата ниша като JVM-базирани Groovy, Fantom, Kotlin и други, но само родени не да летят, а да плуват. Което като цяло не променя класата им. Ако искате, можете да мислите за Ruby и Python като за делфини, а за неща, базирани на JVM, като за примати (макаци, горили и орангутани) ... добре, има и подигравка с природата като JRuby и Jython - те са като пълзящи делфини.
И на фона на цялото това животинско разнообразие – тя. Ако имах тумор, щях да го нарека Скала. Малка раничка в небцето, която би зараснала, ако не я пипаш безкрайно с език. Кучка… нещо се отдалечих от темата… Така че, смятам Scala за настоящия връх в еволюцията на езиците за програмиране в момента(разбира се, гледайки сега много по-далеч от лекциите на Одерски) и трябва да се направи нещо по въпроса. Същинският въпрос е много прост: струва ли си да пишем следващите си неща на най-мощния език за програмиране, създаден в момента, или не. Отговорът на този прост въпрос далеч не е прост.
Не ме интересуват никакви второстепенни глупости по този въпрос, като ниво на развитие на екосистемата, наличие на персонал, подкрепа от индустрията и т.н. Чудя се дали си струва да залагам на Скала при равни други условия.
Също така не се интересувам от популярното днес възражение, че вече е възможно да се пише на всеки език и многоезичните проекти са по-скоро норма, отколкото изключение, знам това, както и вие, но също така знам колко непродуктивно е да прецаквате например Fantom с Gosu или Scala с JRuby, въпреки факта, че са базирани на JVM. всъщност всичко, което имат общо, са JVM класове и всички сношения са ограничени до това ниво. С други думи, това е приблизително същото като това, което имахме преди 20 години, свързване с обектни файлове, написани на Pascal, Fortran, различни sya и плюсове. Нивото на „интеграция“ е приблизително същото.
Спирала на историята
Всеки знае, че историята се движи по спирала. Тъй като съм стар, видях голяма част от предишния завой на спиралата, завоя на професионалните компилирани езици с общо предназначение и тяхната еволюция от структурно-ориентирани към обектно-ориентирани. Отново, от птичи поглед и от гледна точка на практикуващ инженер, не се интересувам от никакви академични глупости като Haskell и т.н. Индустрията в предишния кръг се основаваше на C и C ++, което не трябва да предизвиква съмнение. Има и междинна, успешна връзка - Objective C (въпреки че не бих казал, че индустрията е базирана на нея :)), много е важно да споменем тази междинна връзка.
Така имамеследващата еволюция на предишния цикъл (още веднъж: разглеждам само победителите в хранителната верига, безусловните алфа мъжки в тяхното местообитание):
C (процедурно ориентиран) -> Цел C (с OO елементи) -> C++ (обектно ориентиран към ушите)
Само три от тези езици представляват интерес. Умишлено не включвам Smalltalk тук например. Smalltalk - беше началото на следващия кръг от историята, основната разлика между настоящия кръг и предишния (C / C ++) е управляваното време за изпълнение и събирането на боклука.
Така че еволюцията в предишната итерация беше от C към C++, от процедурен език, към обектно ориентиран (и все още процедурен в същото време), като върхът на еволюцията в предишната итерация. Това, което е интересно по този път, се появи и успешно зае своята ниша, доста добри междинни опции като Objective C (които, между другото, някои shkolota и хипстърски програмисти погрешно смятат за върха на развитието на човешката PL мисъл, но няма да ги разстроя тук).
Сега към настоящия ход. Текущият кръг на развитие на езиците за програмиране е просто копие на предишния. Мястото на C в текущата итерация е заето от Java (е, и C #, за да не обидя .NET хората, въпреки че това няма значение за мен - все едно да спориш за разликите между PowerPC и Intel в миналото - интересно, но безсмислено).
Както казах, настоящата итерация е фундаментално различна от предишната чрез наличието на управлявано време за изпълнение и различна начална парадигма. Ако предишната итерация започна с простия процедурен език C и завърши с безумно сложния обектно-ориентиран език C++, то тази започна с простия обектно-ориентиран език Java. Забележете, много по-просто от върха на развитието на предишния кръг (C ++), и този кръг се движи, което вече е очевидно,към безумно сложния функционален език за програмиране Scala (който в същото време е обектно-ориентиран, както C++ остана процедурно ориентиран). По време на това движение се появяват междинни езици с елементи на функционално програмиране, като вече наречените Groovy, Fantom, Kotlin и др.
Гледайки всички тези глупости, не се съмнявам, че Scala ще бъде върхът на развитието на езиците за програмиране в този кръг и ще заеме същото място, което C ++ зае в предишния. Всички междинни неща ще заемат нишата на Objective C. Java вече е заела своята ниша.
Интересното е, че все още не виждам езици, които биха маркирали началото на следващия кръг, както някога направи Smalltalk, но знам със сигурност, че ще бъде по-прост от Scala (прост като C и Java), но появата му ще бъде придружена от някаква фундаментална промяна, като управлявано време за изпълнение. Наскоро, когато повдигна тази тема в офиса, @_komaz каза, че може би ще бъде разпространен (с което съм съгласен с удоволствие, добре, или някаква фундаментална поддръжка за паралелни изчисления) ...
Връщайки се към „наболелия въпрос“
Не напразно изразих всички тези мисли по-горе, тъй като при аналогии въпросът за избора на език сега е още по-прост за мен (някак го прехвърлих в миналото и не се съмнявам в цикличността на историята): какво да облека? В Objective C или C++? Fantom или Scala?
Отговорът не е толкова очевиден, колкото може да изглежда. Следното е очевидно: скапан облак от огромни проекти се прави на C (ние не разглеждаме въпроса за производителността). Java е не по-малко облак от огромни проекти. Определено няма да сгрешите, ако заложите на Java. Ако разчитате на „междинни“ езици, вие също няма да загубите - те обикновено не променят парадигмата и носят само полезни елементи. Може да страдате леко от слабекосистеми, но от друга страна ще имате добър ритъм на производителност. Като цяло опцията да направиш основен език в офиса нещо от Groovy, Fantom или Kotlin ми се струва умен ход и безрисков вариант (поне аз не съм виждал такива рискове през последните 4 години).
Идеята да направя Scala основен език ме вълнува и плаши едновременно (колкото можеш да се вълнуваш и плашиш на моята възраст). Все едно да кажеш в началото на 90-те години: „момчета, сега ще напишем всичко на C ++“. Разбира се, ако ми казаха това в началото на 90-те години, щях да напия стените с вряща вода и да кажа „готино“, пишем. Но сега е страшно.
C++ и големи проекти
За съжаление нямам опит в голям плюс проект. Не негови и мои приятели (така, набързо), с които можех да говоря. Или по-точно, куп мои приятели го имат, но това преживяване не е интересно и не е от значение за мен. По правило те или не стояха в началото на проекта и не се занимаваха с проблеми на комуникацията между разработчиците, въпроси, свързани с библиотеки на трети страни и т.н., или „завършиха“ тези проекти на последните етапи (реанимация на смъртта).
Тези. Срам ме е, но не знам колко лош или добър е C++ като основен език в офиса. Със сигурност е добре за малък (екип, който комуникира на една и съща дължина на вълната) и индивиди. Тъй като всеки екип има свой собствен C ++, всеки проект придобива някои индивидуални характеристики. Java няма това свойство, както и C (освен ако, разбира се, не правите бизнес с макро замествания). Използвайки Scala, не се съмнявам, че всеки отбор ще измисли свой собствен Scala диалект, което ще се отрази в болка в задника.
Всъщност очаквам същия списък от проблеми, който се вижда в проекти на C ++, и това дори не е за вътрешни проблеми, а за отношенията с външния свят (помнетеколко реализации на низове сте виждали в плюс проекти? Залагайки на Scala, ще очаквам нещо подобно, но на малко по-различно ниво на абстракция)
И накрая, можете да погледнете списъка с проекти, написани на C ++ от дядото на Stroustrup - не е толкова впечатляващ списък, поне съм сигурен, че подобен списък с проекти на C би бил с порядък по-дълъг.