LeetCoding

In a similar vein to competitive programming, LeetCoding is like a muscle that can be trained. Here are what I have learned from LeetCoding:

Practice Topics
A lot of people make the mistake of practicing random questions on LeetCode. While this may simulate a coding interview, it's not the most optimal way to practice for learning new concepts. My suggestion is to learn the concepts first by practicing all the topics (sliding window, heaps, graphs, etc.). Then simulate a coding interview by practicing random problems. This is a more efficient use of your time and resources. By this learning technique you can easily determine your weaknesses and strengths and focus on improving your weaknesses. Doing random problems won't help you improve in the areas you are weak at. Moreover, it's really helpful to categorize problems into different 'buckets'. Putting problems into buckets helps you uncover similarities between different problems and develop a toolset to tackle new problems.

System Design
This is a tricky one, system design is a little tougher to get good at since it's not really a DSA type problem and LeetCode is not a helpful tool to practice these types of problems. However, these types of problems are becoming more and more common in today's interview process. I would suggest 'Grokking the System Design Interview' to prep for these problems.