A World of Scripts and Silos
To understand Terraform, you have to remember what managing infrastructure was like around 2013. On one side, you had configuration management tools like Chef and Puppet. They were brilliant at configuring servers that already existed, but they weren't built to create the servers, networks, and databases themselves. They were procedural, meaning you had to write step-by-step recipes for every action. On the other side were cloud-specific tools like AWS CloudFormation. It was powerful for AWS, but it locked you into a single ecosystem. If you used Azure or Google Cloud, you were out of luck. The world was a mix of brittle shell scripts and vendor-specific solutions, with no common language to describe the full lifecycle of a company’s infrastructure.
This was the problem HashiCorp co-founder Mitchell Hashimoto set out to solve.
Declarative, Not Procedural
The first and most fundamental design choice was making Terraform declarative. This is the difference between giving a taxi driver a destination versus giving them turn-by-turn directions. A declarative tool asks you to define the desired *end state*—three servers, a database, and a load balancer with specific settings. You don't tell it *how* to achieve that state. Terraform inspects what currently exists, compares it to your desired state, and calculates the most efficient way to bridge the gap. This was a radical departure from the procedural scripts of Chef or Puppet, where you had to manage the complex logic of creating, updating, and destroying resources yourself. By focusing on the “what” instead of the “how,” Terraform drastically simplified the cognitive load on developers and operations teams.
Planning Before Acting
One of the most terrifying aspects of early infrastructure automation was its unpredictability. Running a script often felt like a leap of faith. Would it tear down a production database by mistake? Would it make an unintended change that causes an outage? Terraform’s answer was the `terraform plan` command, and it was a stroke of genius. Before making a single change to your infrastructure, Terraform generates an execution plan that tells you exactly what it will do: which resources it will create, which it will update, and which it will destroy. This simple step transformed infrastructure automation from a high-risk activity into a predictable, reviewable workflow. Teams could now review plans in pull requests, get approvals, and run `terraform apply` with confidence. It built a level of trust that no other tool offered at the time.
A Bet on the Multi-Cloud Future
While AWS was the dominant cloud provider, Hashimoto and the HashiCorp team made a crucial bet: companies would not want to be locked into a single vendor. They rightly predicted a multi-cloud and hybrid-cloud future, where an organization might use AWS for its core compute, Google Cloud for its data analytics, and a service like Datadog for monitoring. Terraform was designed from day one to be cloud-agnostic. It achieved this through a provider-based architecture. A core engine understands the declarative syntax, while separate provider plugins handle the specific API calls for AWS, Azure, Google Cloud, or even non-cloud services like GitHub or PagerDuty. This decision was not just technical; it was a business masterstroke. It positioned Terraform not as an AWS tool or a Google tool, but as *your* tool, capable of managing your entire technology stack with a single, consistent language.
The Controversial State File
Finally, there’s the state file. For many users, managing Terraform’s state is the most painful part of the experience. It’s a JSON file that keeps a record of the resources Terraform manages. So why have it? Because without it, Terraform can’t work its magic. The state file is the linchpin that connects your configuration to the real world. It maps the resources in your code to the actual resources running in the cloud. It’s how Terraform knows which EC2 instance corresponds to `aws_instance.web`. It’s also how it detects “drift”—changes made outside of Terraform—and manages complex dependencies between resources. While it introduces its own challenges (like secure storage and locking), the state file was a deliberate trade-off, enabling the declarative planning and lifecycle management that make Terraform so powerful.











