27 юли 2016 г.

Какво правя когато се чувствам УЖАСНО

Йо!

Не бях имал такъв ден отдавна, но днес просто като цяло настроението ми беше лошо. Без конкретна причина, но просто бях изтощен и отвътре чувствах, че не съм на кеф и просто ще ми се наложи да приема нещата каквито са.

В крайна сметка реших, че това е отлична възможност да споделя как ПРЕДИ виждах такива дни и как сега ги приемам като нещо не чак толкова лошо и дори ги приветствам като нова възможност.





В миналото често се депресирах за незначителни неща и понякога бях в такова настроение с дни - нямах енергия или желание да правя нищо, а иронията беше, че колкото повече бездействах и се самосъжалявах, толкова по-зле ставаше положението ми.

Едно и също нещо се случваше всеки път - изпадам в депресия заради нещо, от което не съм доволен в живота ми, самосъжалявам се и идва потока от мисли от рода "защо на мен", храня се повече от необходимото с нездравословна храна (това за жалост все още го правя, ха ха), това пък води до угризения и още негативни емоции, а низходящата спирала продължава и след известно време ми минава.

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

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

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

Това което научих е, че ние хората имаме 2 "режима" - режим на експанзия (разширяване) и контракция (свиване). Например сме будни 16 часа и спим приблизително 8. Здрави сме в единия момент, а в другия сме болни и се налага просто да изчакаме болестта да отмине. Аналогично и в природата има слънчеви дни и дни, в които вали, но пък това ни кара да оценяваме хубавото време.

Вярвам, че всяко изживяване има своето предназначение и по-важното е как го тълкуваме.

Имайки това предвид си изградих един вид "стратегия" за справяне с такива дни по-бързо от нормалното.

Мисля, че най-големият проблем НЕ беше, че се чувствам зле, а това, че НЕ ИСКАМ да се чувствам зле, което от своя страна пък ме караше да се чувствам още по-зле (дано разбрахте, ха ха).

Номер едно съветът, който мога да дам е...

1. Не се съпротивлявайте!




Не мислете за бели мечки. Дори преди да завърша това изречение в съзнанието ми изплува образа на полярната мечка от рекламата на Coca-Cola! Това, на което се съпротивлявате, ще продължава да ви дразни отвътре.

Когато не се чувствате добре, вместо да търсите начини да спрете симптомите с лоши навици като алкохол, наркотици, лоша храна, купуване на излишни неща и т.н., пробвайте да си кажете следното:

"Хмм... OK, чувствам се зле... да видим какво мога да свърша докато съм в това настроение".

С други думи - просто приемете как се чувствате.

Всяка емоция е временна (случвало ли ви се е да сте ядосани на някого, но на другия ден се събуждате и просто няма и следа от тези чувства?) - добра или лоша. 

Сега си спомням нещо, което една моя учителка по биология беше казала - "бъдете космополити", т.е. организми, които са способни да живеят във всякакви условия. Изключително вярно!


2. Използвайте това време за почивка и интроспекция!




През повечето време ние хората сме подчинени на навиците си и по-голямата част от дните ни минава на автопилот. 

Вместо да се самосъжалявате и да започвате да мислите като жертва, използвайте това време да се "събудите" от този автопилот, да си починете и да анализирате накъде ще отиде живота ви ако продължавате по този път като направите нужните корекции където е необходимо.

Замислете за всички решения, които сте направили и са ви довели до сегашното ви положение. Какво правихте вчера? А тази седмица? А този месец или ГОДИНА? Това е перфектното време да се замислите за тези неща, защото обикновено в такива моменти сме изключително съсредоточени върху това, което се случва в живота ни.


3. Бъдете проактивни!





Длъжен съм да препоръчвам супер яката книга The Upward Spiral, която разглежда депресията от научна гледна точка и предлага някои много много добри решения, които моментално могат да подобрят настроението ви!

Като цяло - правете нещата, които ви карат да се чувствате добре, но и са ПОЛЕЗНИ за вас. 

Най-лошото нещо, което можете да направите е да бездействате. Това може да ви се струва противоречиво на първия съвет, но всъщност значи следното - приемете как се чувствате и ДЕЙСТВАЙТЕ, за да подобрите настроението си.

Отново изключвам лошите навици споменати горе. 

За жалост сме програмирани така, че да предпочитаме моменталното удоволствие пред щастие в дългосрочен план, но като цяло е далеч по-добре да се стремим към второто. Не е нужно да се справяме перфектно, а просто да се опитваме да ставаме малко по-добри с всеки изминал ден.

Имайте предвид, че емоциите са пристрастяващи. Ако сега някой ви попита "Искаш ли да си щастлив?", всеки би отговорил "Естествено!", но ако след това ви кажат, че трябва да вложите усилия, естествената ни реакция е да си кажем "Всъщност така ми е добре", защото е по-лесно да поддържаме текущото си емоционално състояние. 

Трябва да вложим усилия, за да постигнем някакъв резултат. Затова и смятам, че е изключително странно, когато някой е тъжен и вместо да търси веселие, той си пуска някой тъжен филм и се надява, че това някак си ще му помогне да се съвземе (не че аз някога съм го правил *покашляне*...).

Някои неща, които научих от книгата, които съм пробвал и НАИСТИНА помагат:
- спорт (особено кардио)
- поставяне на малки цели и постигането им (една постигната цел води до много други такива)
- сън (възстановява нивата на допамин в мозъка ни и това връща настроението ни към "нормално")
- усмивка на лицето ни (дори и да е фалшива... сериозно, работи)
- гледане на стари снимки от по-весели времена (увеличава серотонина ни)
- изразяване на благодарност за нещата, които имаме
- заобикаляне с хора (социални същества сме и ако само се заобиколим с хора, дори и да не общуваме с тях - това намалява риска ни от депресия).

---

Това са най-ценните съвети, които научих през изминалите няколко години по тази тема и които ми помагат до ден днешен! Надявам се да помогнат и на този, който стигне до този blog пост!

Peace! ;)

1 юли 2016 г.

Become A Collector To Fuel Your Awesomeness

Hey, how about a blog post in English?

What I wanted to share with you today is the power of... collecting! I hadn't thought about it until recently, but I really love collecting things, yet not the kind of things you might expect. Most people associate collecting with the hobby of a greasy overweight guy in his 30s with a passion for stamps. And sure, that's a valid form of collecting, but it's not really what I'm referring to.


I'm talking about collecting experiences

Now let me give you an example. I used to hate reading. Reading a few pages would make my head hurt and I would just drop the book, because it just seemed like a waste of time and it just reinforced the "dude, you can't finish this book" belief in my head.

So at first I started reading ridiculously short books, just to prove to myself that "woah, I can actually finish a book" and that gave me the confidence to keep on going. Then I discovered Goodreads, which is basically an online book database that allows you to keep track of what books you've read and create a list of them.

It felt pretty good to add a book to my list and increase the total number of books I've read. Slowly but surely, the number kept on rising and rising... and with each book I completed, I wanted to read more and more! At this point it's a habit and I would most likely continue to read even without logging the books I've read, but it just goes to show how the dopamine spike (the reward) from adding a new item to your "collection" can propel you towards an upward spiral.

Another example - work. Man, I was lazy. To be honest, I still struggle with this and I'm trying to develop a solid work ethic, but I would say that collecting is making this process significantly easier.

How did I combine work and collecting? Simple - whenever I made something (an article, a video, or perhaps I just reached a certain milestone like "solve 10 programming problems"), I would give myself a pat on the back and log it in a simple text document. As the list keeps growing and growing, my motivation to add more items to the list grows as well. It's even cooler when you look back on your accomplishments. Another upward spiral!

Lastly, I'm kind of an introvert by nature and I'm a huge fan of peace and quiet. But I also realize that nothing good in life comes from just sitting around in your little box of complete harmony. I want to travel more, get more experiences etc, but I'm scared. How can I get around that? Same principle.

Start a list (I actually did this for a number of weeks and called it my "excitement log") and commit to doing at least one new exciting and unusual thing each week, regardless of how small it is. Soon your list will grow, you'll look back on what you've done and you'll be able to rationalize that "hey, I'm just doing my weekly habit" and you won't fear the consequences as much, because regardless of what happens - you can just add the experience to your list and feel good about it.

Try it out and let me know if it works for you! Peace!

22 юни 2016 г.

Защо никой не признава грешките си?

Нещо, което забелязах наскоро, е, че ми е изключително трудно да призная грешките си пред себе си и пред другите. Понякога е толкова очевидно, че греша, но просто от вътре не искам да си призная вината. Защо?



Отговорът, който намерих, е прост, но плашещ. 

Според мен не искаме да признаем грешките си, защото това има потенциал да обърка представата ни за света, за нас самите и би предизвикало хаос във вярванията ни.

Да, звучи налудничаво, но преди да затворите тази страница - ето ви един пример.

Представете си, че кажете на 80-годишен човек, който цял живот се е хранил нездравословно, "Остави пържените картофи и пробвай салата!". Макар логически този човек напълно да съзнава, че не прави правилния избор, ако той е свикнал до такава степен да се храни по такъв начин и изведнъж му се наложи да забрави сегашните си вярвания и да премине към нови - това би обезсмислило прекалено голяма част от неговия живот.

Това пък би създало нови съмнения у него - "Ако не съм бил прав за това, за колко ли други неща вероятно съм сгрешил? Какво значи това за мен?". Повечето хора не искат да се сблъскат с тази реалност, просто защото тя създава хаос в представите им за света и се изисква прекалено много енергия, за да "наместят" новите вярвания.

По същата причина повечето хора избягват всякакъв вид новости. Всичко ново е и неизвестно, а това значи, че с това може да последват и неприятни чувства. По-лесно е просто да си останем каквито сме си... Превръщаме се в растения! След като сме си осигурили най-важните неща - храна, вода, място за живеене и т.н., нямаме особено желание да поемаме рискове, тъй като нуждите ни са задоволени.

Най-плашещата част е, че мозъкът ни винаги може да намери причина, с която да обясним действията си, колкото и неправилни да са те. Много често съм чувал хора да ми говорят как с радост искат да пробват някакво ново изживяване, но когато действително имат тази възможност, си измислят оправдание, само и само да не им се налага да изразходват енергия ("ще го направя после" познато ли ви е?).

Това са т.нар. "бариери на успеха". Всеки ги има и всъщност до известна степен са здравословни - благодарение на тях развитието ни тече с нормална скорост (противоположен пример са някои деца, които стават известни като малки, психиката им не може да издържи на напрежението и често стават алкохолици или употребяват наркотици). Но идва момент, в който трябва да действаме противоположно на това, което ни казват емоциите ни...

Виждам това поведение в себе си и в почти всички около мен... всеки ден.

Какво е решението? 


Решението е изключително просто, но не и лесно. Понеже обичам всичко да е в 3 стъпки (нека даже всяка стъпка започва с буквата 'П')...

1. Признайте, че сте сбъркали
2. Планирайте как бихте предотвратили повтарянето на същата грешка
3. Приемете и забравете грешката

Никога няма да спрете да правите грешки. Аз правя грешки всеки ден, понякога за неща, които си мисля, че вече съм усвоил. Дори и да имате план за предотвратяване на грешки - пак ще правите грешки. Приемете го!

Освен това, не правете грешката (това не беше умишлено) да се съдите или да се ядосвате когато сгрешите, защото това всъщност увеличава шанса да ПОВТОРИТЕ същата грешка (ако някой е бил на диета и му се е случвало един път да се провали - знаете докъде води това).

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

Това е от мен! А сега отивам да направя следващия си провал... :)

24 май 2016 г.

Как да подобрим алгоритмичното си мислене (в 3 стъпки)

Е, признавам си, не съм особено добър в решаването на сложни задачи по програмиране. Започнах преди едва 2 години и истината е, че все още изпитвам затруднения и се чувствам сякаш едва прохождам.

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

Но въпреки това имам прогрес. Тази година за пръв път се пуснах на олимпиада по програмиране и (по чудо!) дори се класирах за национален кръг (с отбора ми).

Искам да ви споделя как точно стана това.



Credits: http://class-central.com/



В първия семестър на първата година в университета (реално когато започнах да програмирам) се чувствах все едно съм попаднал в джунглата. Не мислех, че ще очакват от нас да "знаем" какво правим, но се оказа противоположното. Напълно липсваше този период, в който те "държат за ръката" и те потупват по рамото ако успееш да изведеш на конзолата "Hello World".

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

На края на семестъра имахме контролно за освобождаване от изпит по програмиране. Явих се на това контролно и изживяването се оказа като шамар в лицето, защото не можах да реша нито една от задачите. Тогава осъзнах, че ако го карам по този начин, няма да стигна до никъде. Затова седнах и си казах, че активно ще решавам задачи и ще чета теория, свързана с програмирането, само и само да подобря уменията си малко или много (а и да взема успешно изпита си, разбира се), всеки ден.

Имах късмет, че поне от университета ни бяха предоставили изключително много задачи. Проблемът беше, че не знаех какво правя, нямаше кой да ми каже как и защо нещата работят по определен начин. Дори имах трудност да формулирам въпрос, който да напиша в Google (ако някой преподавател чете това - това е причината студентите никога да нямат въпроси). Самите задачи нямаха решения и като цяло ми липсваше насока...

Започнах с елементарни задачи, изискващи използването на условни конструкции, цикли, въвеждане/извеждане на информация на конзолата, масиви. Дори и това ми се стори трудно в началото, но успях да си изградя една скромна основа, с която да продължа напред. Процесът беше доста предсказуем - започвам да решавам задачата, стигам до някъде, опитвам се да намеря решението за известен период от време и търся обяснения в интернет, успешно решавам задачата или просто продължавам със следващата.

Проблемът беше, че често просто не ми идваха никакви идеи за решение на задачите. Макар да мисля, че практиката (т.е. писането на програми) е хиляди пъти по-важно от теорията, няма как да направиш асоциация от рода на "аха, тук трябва да използвам масив!" ако никога не си чувал за подобно нещо. Така че, малко или много - теорията е необходима. Но за жалост не винаги теорията ми беше поднесена в линеен, последователен вид, а често ми се налагаше да я намирам частица по частица и по този начин да оформям решението на пъзела в главата си.

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

И така... първото и най-основно нещо, е, разбира се...


1. Решавайте задачи (дори трудните)!


Сигурно до болка сте чували вече, че за да станеш добър в каквото и да било, се изисква много практика. Програмирането, от това, което съм видял, не е никакво изключение. 

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

Важно е да започнете с елементарните задачи. Причината е, че това просто повдига самочувствието и дава увереността, която е нужна, за да се опитаме да решим по-сложна задача. Лично при мен - ако започна със сложна задача и забележа, че не мога да я реша - това ме отказва и от лесните задачи. Моят съвет е - почнете с лесните задачи.

Другото ключово нещо е, че НЕ Е важно дали ще успеете да решите конкретната задача. Знанията ви се развиват дори и без да стигнете до крайния отговор. 

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

Решаването на задачи е страхотно, защото едва когато имаме задача пред себе си, мозъкът ни автоматично започва селективно да се фокусира върху нея и да търси решения. Започват да ви идват въпроси, които пък ви водят до решения. Е, ако не сте решавали много задачи, както казах, няма да ви идват много качествени въпроси или решения, но всичко това се гради с времето.

Един страхотен сайт, който в момента ползвам, за да развия собствените си умения, е HackerRank.


2. Погледнете решенията на другите!


Не е достатъчно само да пишем код, трябва и да свикнем да четем този на другите. Това е нещо, от което аз все още не съм се възползвал достатъчно, но е много добър инструмент. 

Особено за по-сложни задачи, да видиш решението на друг е много полезно, защото ти позволява да проследиш логиката ред по ред и това, от своя страна, води до тези "аха" моменти, в които просто започваме да разбираме дадена идея и можем да я приложим в собствените си програми.

Понякога имам лошия рефлекс да видя някое по-сложно решение, което не разбирам, и да търся по-просто, защото първото е някак си "плашещо". Но това, според мен, е грешен подход. 

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

Отново искам да напомня, че не е важно да разберем всичко и да го разберем на сто процента - достатъчно е да влезем малко по-дълбоко от това, с което сме свикнали и пак ще развием знанията си.


3. По-малко четене на теория (но все пак я четете)!


От моя опит, алгоритмите (и измислянето на алгоритми) не се научават с четене на теория. Разбира се, както казах, трябва да имаме някаква предварителна основа и да имаме понятие за какво става въпрос, но обикновено ни трябва много по-малко информация, отколкото си мислим.

Изключително грешно е мисленето от рода на "ако само прочета достатъчно теория ще съм перфектно подготвен и ще мога да реша всяка задача". Е, не става така, пробвах! Обикновено вместо това прочитате теорията и се заблуждавате, че разбирате материала, но когато седнете да решавате конкретна задача осъзнавате, че едва ли не сте си загубили времето във всичкото това четене, когато сте можели просто да решавате...

Истината е, че не сте загубили времето си когато сте чели теорията. Теорията е полезна. Просто без да сте решавали задачи, мозъкът ни не може да направи връзката с прочетеното. Чак когато се помъчите малко ще започнете да си спомняте прочетеното и да ви идват по-качествени идеи и решения.

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

Може би едно от най-важните неща - разписвайте алгоритмите на хартия - стъпка по стъпка. Много по-трудно е да разберете как работи даден алгоритъм само от код. На хартията може да си драскате, рисувате и е просто много по-лесно да видите визуално какво се случва. Това разбрах именно когато учих за изпита си по СДП - гледах усилено в тетрадката си примерни разписвания на алгоритми и не можех да разбера какво се случва, но седнах да го направя няколко пъти сам и лампичката в главата ми светна - всичко беше ясно.

---

Това са най-важните неща, които научих досега за развиването на алгоритмичното мислене! Както казах, и аз тепърва навлизам в дълбоките води... и на мен ми е трудно. Но смятам, че няма никаква магия в това да подобрим алгоритмичното си мислене, което е ключово за всеки програмист. Никой не се е родил научен и само с практика можем да станем по-добри.

Peace out!

19 март 2016 г.

CODE TIPS #4 - Именуване на идентификатори (aka "Спрете с 'br' и подобни")

Всеки знае, че има значение как именуваме променливите си когато пишем код. Едно просто правило - кодът трябва да е лесно четим и разбираем, защото в реалността големите проекти се разработват от екипи хора и шансът да сме единствените "свидетели" на гениалния си код е минимален. Всеки знае това... нали?

Чудех се как точно да демонстрирам някои лоши практики в именуването на идентификатори (именуване на променливи, класове, функции).  И ето че открих чудесен пример - една програма, която беше пример от учебник, който целеше да ми покаже основите на обектно-ориентираното програмиране. Страшното беше, че дори и в неграмотно състояние виждах, че това е просто бъркотия!


Просто гледайте.

  1. #include <iostream>
  2. using namespace std;
  3. class Student {
  4. public:
  5.     char Ime[11];
  6.     short Ocenki[10];
  7.     float Uspeh;
  8.     void SrUspeh();
  9.     // ...
  10. };
  11. void Student::SrUspeh()
  12. {
  13.     float s = 0;
  14.     for (int i = 0; i<10; i++) s += Ocenki[i];
  15.     Uspeh = s / 10;
  16. }
  17. class newStud {
  18.     // ...
  19. };
  20. void main()
  21. {
  22.     char KodOp; int BrLica = 0; Student Grupa[10]; newStud newGrupa[10];
  23.     do {
  24.         cin >> KodOp;
  25.         // ...
  26.     } while (KodOp != '0');
  27. }

Нека игнорираме:
- използването на именното пространство std
public нивото на достъп на член-данните
- използването на char масив вместо std::string
постинкрементацията на брояча във for цикъла
- декларирането на променливи от различен тип на 1 ред
- факта, че main() е от тип void, а не int, както е по конвенция

Нека забравим всичко и това и се съсредоточим само върху имената на идентификаторите.

Бих казал, че единствено името на класа Student си е OK, но това, предполагам, е абсолютна случайност.

1. Не използвайте български имена!


BAD
  1. char Ime[11];
  2. short Ocenki[10];
  3. float Uspeh;

GOOD
  1. char name[11];
  2. short grades[10];
  3. float average;

Ако бяхте от друга страна и не знаехте български език - каква щеше да е реакцията ви когато ви сервират първия вариант? Просто използвайте имена на английски. Английският е единственият универсален език в света на програмирането.

2. Не съкращавайте имената!


BAD
  1. char KodOp; 
  2. void SrUspeh();
  3. int BrLica = 0;
  4. float s = 0;

GOOD
  1. char operationCode; 
  2. void getAverage();
  3. int numberOfStudents = 0;
  4. float sum = 0;

Няма нужда от съкращения в повечето случаи. По-ценно е кодът да е лесно разбираем, отколкото да е кратък. Постоянно виждам в примери променливи с имена по една буква. Понякога това е допустимо - ако искаме да илюстрираме някаква концепция от програмирането или пък да приложим някаква математическа формула, но в повечето случаи няма нужда от това. 

Също така бих казал че изключение могат да направят например променливите за брояч във for цикъл, които имат малък обхват и няма да затруднят съществено четимостта на кода, тъй като съществуват единствено в цикъла.

3. Спазвайте конвенциите и бъдете постоянни!


Първоначално мислех да напиша за това, че обикновено класовете започват с главна буква, но проблемът се свежда до нещо по-общо - просто спазвайте конвенциите на езика, с който програмирате!

За всеки език е различно и задължение на програмиста да се информира за конкретните конвенции.

Още по-важно - бъдете постоянни. Ако ще пишете camelCase имена на променливи - добре, но се опитвайте да използвате този стил за всички променливи.

---

Това май са най-важните правила, които научих до този момент относно именуването... а сега отивам да бомбардирам всеки, който все още декларира променлива с име "br".