Last week my Makers cohort and I moved on from core work in Ruby and started developing web applications. Whilst being fun and different, it also exposed us to a range of add-ons to our programs from a host of different sources, which provided meaningful functionality, but where we had no idea how they worked. Using Capybara to automate our browser-based tests was a key example of this. We knew it worked like Rspec and was very useful, but when pressed for exactly how it performed, we were all left grasping for even the most theoretical reasons.
When we mentioned this to our coach Roi, he warned us to brace ourselves for this week, as we would encounter this struggle for understanding on a daily basis. He was right. This week we have been working on databases, and specifically how to use DataMapper to update and manipulate database objects using Ruby. It has been challenging and fascinating, and I have no idea how almost any of the applications I have been using work under the surface. To name a few of these phenomena:
- DataMapper enables us to transform our classes in Ruby into tables in our database.
- We use Rake (another piece of magic) to automatically build these tables and/or wipe their data.
- Relations between database tables are created automatically by ‘Collections’. I thought I had this down when I expressed the idea in terms of relation-tables. However the DataMapper interface has ensured this concept is that much easier to use and simultaneously harder to understand.
- Add-ons to DataMapper to facilitate encryption and password confirmation are even more mysterious to me than DataMapper. Enough said.
Learning so many new and mysterious concepts in a short space of time made me realise that once you get used to a particular method, it stops seeming magical very quickly, even if you don’t really develop your understanding of how it works on a deep level. For instance, I was struggling to get my head around Datamapper at first, however just two days later, it seems like second nature to administer my tables using classes. The new mystery I am facing is how the add-ons to add specific functionality (such as password encryption) work.
This week has been more challenging on an intellectual level than any of the first three weeks. At the end of the days, I have felt like I needed to chill out and occupy my mind with something else. I am really enjoying the intensity of the learning and the amount of theory behind each exercise that I do. Despite feeling like each component of our program runs on magic, I have noticed myself being able to identify how different parts fit together in order to identify and solve blockers that we have encountered. Fixing these problems is immensely rewarding, and makes me feel like I am seeing a concrete improvement in my skills. At just four weeks in, this is very encouraging.
I have definitely encountered a temptation to understand how each part of a program I am building works, but I am not sure how I feel about it in general. Ultimately I want to be in a position where the set of actions and methods that I build feel consistent and make sense to me. This often does not mean mentally tracing every element of the software back to first principles, but becoming familiar with how to use the tools available for me to achieve certain goals. More practice and experience is what i going to help me achieve this, and I feel like this fact shows to some extent why practical work is one of the best ways to learn hard skills. Not to belittle theory — it has a very important place — but one of the main things I feel like I am learning this week is the benefits that can be achieved in a short space of time when applying your brain to solving problems in practice. I look forward to wrapping my brain around a lot more in the coming weeks!