вторник, 14 февруари 2012 г.

IDE...less

В огромна част от случаите готовите IDE-та са кофти идея. Ако човек иска да пише на един единствен език цял живот и да не напуска IDE-то създадено да обслужва тоя език, няма да усети неудобство от това. Но повечето хора, които искат да се занимават с програмиране, обикновено имат интерес да се учат постоянно и не искат да ползват само един език. Разумният вариант за такива хора би бил да спрат да ползват класическите IDE-та. Това обаче като че ли не се случва винаги. Даже по-често май не се случва хич. Самият аз доста късно стигнах до извода, че ако искам да съм програмист трябва да се откажа от "комфорта" на някое стандартно IDE и да се науча да ползвам нещата, които повечето хора описват като "hardcore"(т'ва са глупости). Често(предвид малкото време изминало от както съмна това мнение) съм се изкушавал да казвам, че IDE-тата са глупост, която пречи повече, отколкото помага. Но започвам да се замислям, че всъщност те имат нещо много хубаво в себе си, фактът, че създават навици, позволяват ти да вкараш в "мускулната" си памет много важни повтаряеми действия. Аз например сейввам това, което пиша грубо по веднъж на минута, правя го без да мисля(както и почти всичко друго в живота ми, но това е друга бира). Неща като компилиране/стартиране на написания код могат да се превърнат в елементарно действие, което правите без да се замисляте, прескачайки нивото на абстракция свързано с натискане на копчета от клавиатурата. Мозъкът казва "искам да го пусна" и ръцете ви правят нещо, което съзнателно не контролирате, няма го момента с "искам да го пусна, за това ще натисна Ctrl+S и после лявата ми ръка ще се отмести 5 сантиметра нагоре по клавиатурата до F5, за да го пусна", защото всичко след първата запетайка в това изказване не е релевантно, а е само досадна подробност. Това, което ме подтикна преди година и нещо да се науча да ползвам vim и като цяло да свикна да работя възможно най-много в командния ред, беше твърдото ми убеждение, че това е правилният и дори единствен начин да разбера как наистина работят нещата, които ползвам. Все още смятам, че съм прав в това си разбиране. За досадните домашни/проекти в началото на обучението ми в университета, ползвах Visual Studio. Основната причина за това беше незнанието, че съществува алтернатива, за която има разумни аргументи, че си заслужава. Никой никога в няколкото години до тогава, в които ми е било преподавано програмиране под различни форми не ми беше казал, че мога да не ползвам такова IDE и да постигам същите резултати, без да се налага да страдам от това по някакъв начин. И днес виждам хора разбиращи от писане на код(което е все пак малко по-различно то програмиране), които не знаят каква точно е разликата между текстов редактор и компилатор. Такъв тип куриози се получават точно поради тая причина. Факт е че за езици като C# и Java например, схемата с независими текстов редактор и компилатор, вместо IDE, води до болезнени резултати. Дали това не е проблем на езиците обаче?

*В крайна сметка с времето се убеждавам в правотата си, да се откажа от класическите IDE-та. На няколкото курса посветени на конкретни езици, които съм посещавал в университета важна част е изборът на среда. За много хора това е стресиращо. Ако до днес си писал на C++ ползвайки Visual Studio и сега трябва да ползваш Eclipse за Java или пък PyCharm за Python, това може да се окаже проблем. Необходимостта да се адаптираш към съвсем нов вид workflow често е стресиращо, особено ако си поставен пред срокове(било то сесия, или проект във фирмата, където работиш). Допирните точки в поведението на различните среди за разработка, включително такива за един и същи език, могат да бъдат драстично различни, а в живия живот рядко си програмист на езика X, активно ти се налага да ползваш поне два. Две различни среди за разработка, с различни shortcut-и, дори ако щете различни оцветявания на кода(това също може да е дразнещо, дори не е необходимо да сте крайно педантични) могат да пречат сериозно на това колко програмирате и колко се борите с инструментите си. Това е може би основната причина да смятам, че съм открил по-добрия workflow, такъв който позволява пълна независимост от езика/фреймуърка, който ползвам, като ми дава редица благинки и глезотии. Силата в отказването от големите enterprise решения за програмиране идва най-вече от decouple-ването на задачите. Ако средата за разработка A има страшно яки възможности що се отнася до писане на код, цветови схеми, code compleation и прочее, но пък ползва кофти компилатор/интерпретатор за езика, значи не ми върши добра работа. От друга страна, ако средата B ползва страхотен компилатор/интерпретатор, но откъм редактиране на текст е сравнима с cat очевидно също не е добър избор. Ако се отърси човек от желанието да ползва тежък enterprise, това му позволява да сглоби най-добрата среда за себе си съвсем сам и то без особена трудност. Няма да се лъжем, първите няколко седмици във vim бяха тежки, нещо тривиално като да разбера, а после и свикна с мисълта, че ctrl+s заключва терминала бяха леко фрустриращи, но за кратко. След един не толкова дълъг период обаче, нещата потръгват изумително лесно. След като човек схване основите на инструмента, който си е избрал от там нататък започва да вижда възможности навсякъде. Факт е, че vim(за разлика от emacs) не е толкова функционален out-of-the-box. Но ако човек смята да му отдели повече от две седмици, това не би трябвало да го притеснява. Смея да твърдя, че в момента с vim за езиците, които ползвам най-често мога да правя далеч повече неща за далеч по-малко време от колкото немалко кодери с дълъг опит, ползващи да речем Eclipse или PyCharm, а далеч не смятам, че съм твърде опитен и можещ вимаджия, познавам не един и двама далеч по-изкусни в тая работа от мен. Vim те задължава да разбираш поне концепцията на нещата, които ползваш и това те прави много по-добър. Разбира се, че можеш да изпонасваляш на поразия една сюрия плъгини и да накараш vim не просто да е по-функционален от което и да е IDE, ами и завидно по-ресурсоемък. Ако си падаш по тия неща може и просто да отвориш github и да наточиш vim файловете на някой виден(или пък не) вимаджия и да си стопиш главата при положение, че не ти е ясно що са то регистри и буфери, каква е разликата между команда и функция и прочее дребни неща, които обаче е важно да знаеш, за да можеш да прецениш какво искаш от редактора си всъщност.

Не дълго след като се захванах да ползвам vim сериозно установих, че един shell рядко е достатъчен. След кратко лутане и опит да ползвам gnu screen(едно от камъчетата, които ем научиха да подхождам с резерви към нещата, чиито имена започват с 'gnu') стигнах до tmux. Честно казано бях очарован. Отне ми няколко дена да свикна съвсем и да започна да го ползвам активно. От самото начало ми се виждаше безумно да ползвам табовете на гномския терминал, не знам защо. Простичките неща като pane-ове, прозорци и отделни сесии в tmuz доста бързо ми станаха наобходимост.

Това води до ред полезни неща. Човек започва по-добре да разбира и осъзнава какъв е процесът на създаване на някакво приложение, разбира къде свършва писането на кода и започва компилирането/интерпретирането, разбира много добре идеята за т'ва що е то input/output и прочее. И целият този процес е много забавен и интересен(поне на ми е силно забавен и интересен), през цялото време има възможност да надгражда и променя средата си според разбиранията си и това какво му е удобно, има възможността да бърка епично и след това да се плясва шумно по челото разбирайки какво е направил и осъзнавайки много по-добре концепции, които биха му убегнали като някакъв дребен детайл, за който някой друг се е погрижил вместо него.

Всичко това е свързано с низ от дребни удобства, които комбинирани се оказват далеч по-приятни и полезни от това, което може да получи човек от един продукт асмеблиран и конфигуриран то някой друг с цел да се хареса на всеки. Сесиите в tmux(мисля, че същата функционалност има и в screen) както и възможността те да се пазят активни, дори когато няма вързан клиент към тях дават редица удобства. Фактът, че мога да остава tmux-а в офиса отворен с три прозореца за vim, django сървър и един за гнерални bash нужди и след това от произволно място да вържа един ssh до машината в офиса и да се закача към същата tmux сесия, с всичките ми необходими файлове отворени във vim, работещия сървър и на практика целия контекст, който съм оставил няколко часа по-рано тръгвайки от работа, това е невероятно удобство.

В крайна сметка простичката комбинация от tmux и vim се оказва изключително мощна "среда за разработка", зависеща разбира се от още ред други неща като ctags, ack-grep, git, които обаче не изискват особено конфигурация от своя страна, а интеграцията им в "IDE"-то ми е работа на операционната ми система.

Друго крайно приятно следствие от един такъв setup, е времето необходимо да си осигуря комфорт на нова машина/операционна система. Инсталирането на 5-6 програми, като всичките са в хранилищата на всяка смислена unix-подобна дистрибуция, последвано от клониране на github repo-то с vim конфигурацията ми и набавяне на tmux конфигурацията ми(която сега се досещам, че е крайно глупаво от моя страна да нямам под формата на gist). Всичко това се случва в рамките на 20-30 минути в условията на разумна интернет връзка и неща, които да ме разсейват, за да се забавя повече от необходимото. За сравнение, последния път когато инсталирах VS2010(OH GOD WHY...) процесът на сваляне, инсталиране и подкарване ми отне малко над час. И разбира се не е маловажен и факта, че ако не дай си боже някой ден дебеловратите чичковци успеят да прокарат поредния наследник на SOPA/ACTA, моите инструменти са напълно легани без да съм дал и стотинка за тях.

И тъй като всеки луд е с номера си, а според общоприетите стандарти на обществото, повечето програмисти не са еталон за нормалност и психическо здраве, този подход въщност не е обвързан с почти нищо, освен една много обща абстракция, която обаче е лесна за реализиране. Ако човек смята модалните редактори за изобретение на Сатанаил, може да ползва emacs, SciTe, Kate, Sublime, даже екстри като Yi и прочее, възможностите са ефективно безкрайни. Ако си падате по тия неща може да смените tmux със screen, или пък просто да ползвате табовете на любимия си терминален емулатор. Ако имате религиозен проблем с ползването на unix системи, нещата, от които има смисъл в widnows контекст работят безупречно и там(tmux и screen не знам за какво бихте ги ползвали, предвид колко commandline ориентиран е widnows), въпреки че според мен с изключение на windows-специфичните неща, програмирането в unix-like среди е далеч по-приятно, забавно и обучително, от колкото в нещо друго.