learning software engineering principles with rubyonrails