Понятия

Наскоро ми разказаха за едно островно племе, което няма в езика си думи за числа. Когато им показвали снимки с по пет и с по седем камъка, те не правели разлика - за тях купчините представлявали едно и също. Във френския език има две различни думи за стол и стол с облегалки за ръце. Ако един французин ви дойде на гости, има много по-големи шансове да запомни какви са били столовете в къщата ви. Все симптоми на един интересен факт - думитете с които боравим моделират начина ни на мислене и на възприемане на света. А когато става въпрос за софтуерно разработване, моделират и начина ни на работа…

Преди година взехме на работа един човек, който беше невероятно умен, но нямаше “теоритичен” опит с програмирането. Веднъж беше много впечатлен - “Я, виж колко интересно този метод се вика сам себе си”. Наистина, можем доста да си говорим за методи които викат сами себе си, за условия при които терминират и за тяхната ефективност, но това е защото някой е разпознал една обща схема и й е дал име - рекурсия. Само наличието на понятието ни позволява да мислим едно ниво по-нагоре - да си изградим общи правила за нея (трябва да има дъно, да го достига с краен брой стъпки и че не повече от едно рекурсивно обръщение във функцията - иначе става неефективно), както и да я разпознаваме и да се ориентираме в нея. Също така, ако като тръгна да пиша някакъв код ще се замисля над предимствата и недостатъците на итеративно и рекурсивно реализация. На моят колега тази идея едва ли щеше да му хрумне, просто защото той няма такова понятие в главата си - съответно, има един инструмент по-малко от мен.

Това далеч не важи само за рекурсията. Има редица понятия, с които смятам че всеки програмист трябва да е запознат - представяне, инвариант, кохезия, fan-in/fan-out, гранулярност, интерфейс, абстракция и редица други. И това не са някакви развлечени неща взети от книги като Code Complete, а понятия за неща които реално се случват в кода ви и трябва да имате предвид, за да избягате евентуални проблеми. И макар да съм далеч от идеята, че всеки трябва да е терминологичен речник, то определено помага човек да има идея от концепциите, които други са решили че заслужават имена. Ако видите някъде някаква такава концепция, не бягайте от нея - опитайте се да я проумеете и дори да я вкарате в начина си на мислене. Девет от десет случая ще е за добро.

Disclaimer: въпреки, че колегата ми не знаеше какво е рекусия, беше един от най-бързо възприемащите хора които познавам. Теоритичните му пропуски се коменсираха донякъде с бърза и чиста мисъл, както и добро умение да анализира проблемите. И все си мисля, че ако си беше поиграл да създаде добра система от теоритични познания в главата си щеше да е много по-ефективен в работата.

One Comment

  1. Posted August 4, 2007 at 3:36 pm | Permalink

    че не повече от едно рекурсивно обръщение във функцията - иначе става неефективно

    Е тук не си прав :-) Ако трябва да обходиш дърво по колко пъти се обръща функцията към себе си? И има ли по-ефективен начин? Отговорите са съответно: колкото наследника има съответния връх и не.

    Иначе като цяло съм съгласен с теб — умерено количество теоретични познания може да разшири много кръгозора на един програмист, въпреки че на повечето алгоритми, хватки и теореми няма да се намери пряко приложение в практиката му.

One Trackback

  1. By Codito ergo sum » Думи от занаята on January 25, 2008 at 11:39 am

    […] съм го и по-рано - думите които използваме са важни. Трябва да внимаваме с употребата им за да можем да се […]

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*