15 август 2008

Тренинг на умът

Днес ще поразсъждавам върху някой идеи които ми се въртят в главата от няколко дни. Тази седмица започнах кормуване и за сега върви добре. Това което ме впечатли най много от управлението на автомобила, е че мисълта е бавна, няма време за мислене, необходимо е основните неща да се запаметят на по ниско ниво, така че да стават автоматично. Когато наближа светофар, първоначално започвах да мисля, какво трябва да правя. Сега вече се замислям по рядко. Автоматично натискам спирачката, когато скоростта падне натискам съединителя, спирам на червено, изключвам от скорост, пускам съединителя, чакам жълто, включвам на първа, давам постоянна газ, полу-съединител, потеглям, сменям на 2-ра, ускорявам, сменям на 3-та. Това не се мисли вече, а се изпълнява автоматично, сложността на някой обстановки не може да се осмисли ако човек мисли за всички тези детайли, когато шофира. Шофирането е сложно изкуство, когато овладееш простите неща, без да мислиш започваш да извършваш по сложни действия. Когато се научиш да убиваш скоростта, ад сменяш предавки и да ускоряваш, вече е лесно да преминаваш през светофари и кръстовища, защото не трябва да се замисляш за това как да намаляваш, да сменяш предавките и да ускоряваш.

При програмирането е същото. Веднъж усвоиш ли простите конструкции и идеи започваш да градиш по сложни идеи, и не ти се струват сложни защото мозъкът ти изолира сложните детайли от теб, не е нужно да ги знаеш, не е нужно да знаеш как +-а събира две числа, и как преобразува типовете, ако събираш различни типове, трябва да знаеш само че събира две числа, за да го използваш в по сложни комбинации с други действия. Може да знаеш перфектно синтаксиса на даден език, но ако нямаш умствената способност да игнорираш ненужните детайли и да ги прикриваш с методите за абстракция, не ставаш за програмист, освен ако не пишеш на асемблер. Как се определя даден език? Как се учи? Първото нещо което научаваш е примитивните оператори, основните неща от които е изграден езикът, след това са методите за комбинация, това са начините да навържеш тези примитивни оператори заедно, и накрая са методите за абстракция, това са конструкциите които помагат да скриваш ненужните детайли и да градиш слоеве на абстракция. Абстрактните езици са добри, не само защото кодът им е по кратък, но и защото са по стабилни. Абстракциите са на слоеве, всеки слой знае възможно най малко за другия, така приложения написани по този начин са стабилни, защото не са чувствителни към промени. Това е позната концепция от функционалното програмиране, вместо да пишеш приложението си директно в езика си, пишеш език с който да напишеш приложението си. Така прочутите Domain specific languages са доста полезна концепция, в lisp се използват постоянно, на практика самия lisp е DSL написан в самия себе си. Всеки път когато използвате функция или класот някоя библиотека, използвате някаква форма на DSL език. Връщаме се на аналогията с шофирането, вместо да мислите каква последователност от действия да извършите когато шофирате в трудна ситуация, просто извършете това за което сте подготвени, когато искате да завиете на ляво в кръстовище, вместо да мислите първо спирачка, после съединител и смъквам предавка... просто намалете, да, ще извършите и другите действия, но няма да ги мислите, защото мозъкът ви е трениран да не се занимава с ненужни подробности, които идват автоматично. просто намалете, и се подгответе според ситуацията да спрете, или да преминете, тези действия, намаляване, спиране или преминаване, се състоят от по малки действия, но детайлите не са важни. Абстракцията от тези действия е мощен инструмент, представете си да трябваше да програмираме само на асемблер, мозъците ни нямаше да се справят със сложността, за жалост сме идиоти и недоразвити маймуни, и за щастие абстрактните езици са нашите мозъчни протези, защитаващи крехките ни мозъци от сложната машина наречена компютър.

Няма коментари: