A few weeks ago, I had a mini review board to look over the code I contributed to the pair project that I worked on with a fellow apprentice. After she rolled off the project, I spent an additional two weeks working on it solo, finishing up some stories in the backlog and adding some minor features. Then a group of six crafters, including my two mentors, as well as the two mentors of the apprentice with whom I paired, reviewed my code and gave me feedback on the project as well as on the status of my apprenticeship overall. It's called a "mini" review board because it's a much smaller preview of the review board that will ultimately review the work I do during the last two weeks of my apprenticeship to decide whether I will move on to be a software crafter.
Most of the feedback focused around object-oriented design. The app we built more or less followed the architecture of a traditional Rails app, with the accompanying weaknesses. In particular, there was a lot of refactoring that I could do on the controllers, extracting out the logic into interactors or service objects that could then be tested in isolation. Some of the logic in the views could be put in interactors as well, which sounded like a good move since there's a fair bit of functionality there that is currently only really being covered in acceptance tests, rather than in unit tests.
My mentor paired with me later to show me how to safely refactor and extract interactors from my controllers. Another advantage of this approach is that it also allows me to do a bit of dependency inversion and not require manipulation of ActiveRecord models in my unit tests. It's not quite the same as the Repository pattern, but it achieves a similar goal.
I would like to say that I've made a lot of progress on this task in the weeks since my mini review board was held, but alas, I've had my time taken up with a client project instead. I'm quite excited about this project actually, which involves data science and machine learning, but it's left me with no opportunities to wrap up loose ends. But I'm going to try to set aside a little time every day to work on implementing the suggestions I received.
The pair project was my introduction to Ruby and Rails. I have to admit that I'm not particularly thrilled by Ruby, and Rails is such a behemoth of a framework that it makes Django look quite small by comparison. Ruby looks deceptively similar to Python at first, but its underlying philosophy is almost the antithetical to the Pythonic style of coding. Nonetheless, so many modern web applications are built in Ruby and Rails that I appreciate the chance to gain experience with these tools, even if they wouldn't be my first choice on a personal project. I think it would be worthwhile to fiddle around with Ruby outside the Rails context. I mean, Ruby will still be Ruby, with its apparent belief that having multiple ways of saying the same thing actually makes developers "happy", but at least it might give me a chance to see the charms of the language beyond the limited scope of a Rails project.