Large systems are collaborative effort and it's a challenge to maintain the overal coherence. Some techniques might help you scale consistency, but some inconsistencies are also inevitable.
Implementing once a calendar app is a great design exercise, because this domain is simple enough for an exercices, but also subtely tricky.
You can abstract functionality, but not performance and failure modes.
In this classic book from De Bono, you learn techniques to generate ideas, not only vertically (using logical reasoning) but also laterally (using other triggers for thoughts).
Complex systems can’t be built from scratch, instead they evolve over time.
The power of unit is that it’s ridiculously simple but enormously effective to improve quality — from code correctness to better design.
Start small and find your niche, then grow, rather than aim at being mainstream from day one. This advice holds for startups, but programming languages too.
Often, the best thing for a product is taking something away from it. Only simple tools prevail.
All features in a programming language must integrate with each other correctly. The more features, the harder. Sometimes, things don't work as expected.
Models can be created along two axis: the abstraction level, or the meta level.