Добрин обнови решението на 13.01.2017 16:38 (преди почти 8 години)
+REPOSITORY = 'https://github.com/DobrinTs/ruby-retrospective-2016'
+
+# Двадесет неща, които научих.
+#
+# 1. Може задача да ти се струва много проста, много добре написана, да работи
+# според очакваното, но дори и най-простата задача има как да бъде подобрена.
+#
+# 2. Сливането на хешове с еднакви ключове, като новите стойности са хешове
+# от старите стойности, не трябва да ни плаши. Така няма да усложним логиката
+# на програмата, а напротив - ще я направим по-разбираема и по-компактна.
+#
+# 3. Стараейки се да улесня програмата чрез избягване на някои пресмятания,
+# винаги трябва да се замислям "Дали пък по този начин не правя излишни
+# проверки?".
+#
+# 4. Поредицата if-elseif-...-else прави кода труден за четене. Вместо това,
+# когато в условието пише нещо то сорта на "Няма да подаваме мерни единици,
+# различни от тези три.", може просто да оставя програмата да гръмне при
+# недефинирано поведение и да не усложнявам кода.
+#
+# 5. Колко полезни могат да са map, reduce и filter. Вместо да правя нов
+# масив(или друг вид контейнер), да обхождам оригиналния и в резултата да
+# слагам само някои елементи, може просто да напиша map/filter/reduce върху
+# оригиналния и да спестя памет и няколко реда.
+#
+# 6. Колко полезно е да седнеш и да разгледаш как няколко човека
+# решават един и същ проблем. В резултат собственото ти решение може да се
+# подобри многократно.
+#
+# 7. По даден ключ и контейнер(хеш или масив) в променливи как може да не правя
+# излишни проверки кое какво е, а просто да използвам Duck typing за
+# достъпване на желаната стойност.
+#
+# 8. Колко е важно да си си настроил добре средата, в която пишеш. Например аз
+# пиша кода в Sublime 3 и подкарвам програмата като натисна Ctrl+B, но явно
+# Sublime ми е настроен на по-стара версия на Ruby. В резултат bundle exec
+# rake check[2] в терминала минаваше всички тестове, но програмата, пусната
+# през Sublime, даваше грешка при метода Array#to_h.
+#
+# 9. Колко е трудно след като си се сблъскал с по-трудна задача и с
+# много усилия си успял да я решиш, да загърбиш старото решение, да спреш да
+# мислиш неща от сорта "Ама това си работи добре" и да пренапишеш половината
+# код.
+#
+# 10. Как изкарването на логика по класове може да направи програмата
+# по-разбираема. Например вместо да запазваме аргументи и опции чрез масиви
+# и само аз да си знам кой масив какво всъщност представлява, може да напиша
+# по един клас и да улесня живота на тези, които ще четат кода след това.
+#
+# 11. Пренаписването на код не винаги е страшно нещо. Старият код не е бил
+# просто загуба на време, а напротив - много идеи от стария код може да бъдат
+# взети и модифицирани така, че да работят в новия код.
+#
+# 12. Когато вече си си казал "Добре! Хората правят отделни класове за
+# аргумент, опция и опция с аргумент. И аз ще направя така.", вече ти се струва
+# напълно логично да има 3 отделни класа. Но трябва ли те да са напълно
+# отделни? Сядаш, гледаш кода на хората и аха - опция с аргумент наследява от
+# опция. Винаги трябва да се замислям дали мога да направя един клас наследник
+# на друг клас, за да преизползвам функционалност.
+#
+# 13. Колко е важно да тестваш абсолютно всички случаи, дори и да ти се струва,
+# че се повтаряш. Например тествайки Range, проверявам, че по-голяма стойност
+# не е в Range-a, но не правя същото за по-малка стойност. Още 1 ред, дори и
+# аналогичен на предишния, щеше да спести 1 гръмнал тест.
+#
+# 14. След като вече имаш написани някакви тестове, колко е лесно и удобно да
+# дописваш нови, без те по никакъв начин да указват влияние върху старите. Щом
+# е толкова удобно, защо да не пиша тестове успоредно с програмата?
+#
+# 15. Важно е не само какъв Exception е хвърлила програмата, а и какво точно
+# е съобщението му.
+#
+# 16. Чрез дефинирането на един простичък private метод може да си спестиш
+# многократно писане на неща от сорта на "self.class.method_name". Извод -
+# замисли се как да си направиш променливи и методи по-лесно достъпни.
+#
+# 17. Когато съм изправен пред проблем и имам някаква идея не трябва да мисля
+# само дали мога да я реализирам, а дали трябва. Няма ли някакъв по-лесен начин
+# да постигна същия резултат?
+#
+# 18. Instance_variable_get/set е лоша практика и защо да го използвам, когато
+# имам вече дефинирани методи, извикването на които ми дава достъп до същите
+# променливи?
+#
+# 19. Когато си дефинираме собствен клас Exception-и е хубаво да си направим и
+# метод initialize, за да сме сигурни, че exception-ите от този клас ще имат
+# коректно съобщение.
+#
+# 20. Когато решиш да приложиш map/select/reject и имаш
+# готов код, който ще ти свърши работата, е изключително важно да си дадеш
+# сметка дали за този ход е необходимо да филтрираш структурата или само keys,
+# или само values на структурата. Например в слайдовете имаше код за find
+# метода на хранилищата за данни - "@storage.select do |record| ..." и за
+# ArrayStore работи перфектно, но за HashStore е необходимо да се промени на
+# "@storage.values.select do |record| ...".