First of all, Forth is not a programming language. It is an idea of how we can best use a computer to solve a particular problem. As such, Forth programs evolve to meet your criteria and can become anything. It is possible because Forth looks like a virtual machine assembler. The same virtual assembly code that is hidden from you in portable bytecode interpreters like Python, Java or Smalltalk.
Forth also teaches you the fundamentals of programming. Those fundamentals you will never learn if you work in a typical corporate environment or if you constantly rely on other people's libraries, or if you always rely on an IDE like Visual Studio and it's IntelliSense. Think about it, you need code-completion because you don't know the library and it is full of code that you don't use.
Forth is unsafe and untyped, and this is a good thing. How many times do you end up raging at the compiler for not letting you do, what you mean to do (void *) ? Don't get me wrong, there is value in trying to catch errors at compile-time and run-time. However, the cost in complexity and loss of flexibility is also a part of the equation. Programming without a safety net, is the best way to get good anyways.
- less complexity (keep it simple - KISS)
- less code (you ain't gonna need it - YAGNI)
- more reuse (don't repeat yourself - DRY)
Not only, it is a pleasure to write code in Forth, but you will realise that you don't have to believe the lies and myths of popular modern programming culture. Proprietary software often uses techniques such as:
This reduces innovation rate considerably by making it impossible for people to see how things are done. (Netscape is the most well-known example). Even open source projects can reach size of hundreds thousands of lines of code, at which point it is not really possible for a new team member to understand the existing codebase completely.
Not every project requires abstractions and bloated frameworks that kill the machine performance and your ability to understand, modify and test the code.
Consider that you don't always need a garbage collector, a complex compiler, or an operating system... especially in the era of embedded and portable devices. You can and should implement your own solutions to become a better programmer. Reinventing the wheel is good, there is no shortcut to mastery.
Besides, implementing the functionality that you actually need is easy in an interactive and iterative environment. I have stretched the Forth interpreter in many different directions. Every single time the real limit was my understanding of the problem to solve. Some examples are FFI, round-robin multitasking, run-time code generation, functional programming, serialization, etc.
Compared to other programming environments, that get in your way and cripple you pretending to protect you from your inevitable mistakes, or perform complex optimizations that you won't be able to do manually... you'll find Forth so simple and flexible, that you can spend more time on actual design and debugging. Below is a list of my favorite learning material.