Понятия

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

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

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

2 thoughts on “Понятия

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

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

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

  2. Codito ergo sum » Думи от занаята

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *