It limits useful things that can be done, but comes up with worse way to do the same.<p>Code&#x2F;view reuse for example is done through partials in template languages: you can either learn `&lt;%= render partial: &quot;filename&quot; %&gt;` syntax for ERB (with Rails), or `include filename` syntax for JADE, or the `{% include template_name %}` syntax in Django.<p>Or you could simply use functions: compose them, curry them, put them in objects and call them, and even remote execute them; it is all code.<p>Logic is similar: every template language has their own syntax for conditionals and loops. Learning these does not teach us anything new nor make us better at our craft. These are simply useless tediums.<p>Another pet peeve is Template Inheritance. Jade has `block` and `extends` keywords; RABL similarly has an `extend` keyword. Programming languages have an arguably better way to do inheritance.<p>This is my rule of thumb: if a library&#x2F;template language brings its own semantics for inheritance, be wary.