Programming Language
An abstract system for expressing instructions to computers that provides syntax, semantics, and abstractions.
Classification
- ComplexityMedium
- Impact areaTechnical
- Decision typeTechnical
- Organizational maturityIntermediate
Technical context
Principles & goals
Use cases & scenarios
Compromises
- Wrong choice increases maintenance effort and cost
- Insufficient tooling leads to slower development
- Performance bottlenecks due to unsuitable runtime models
- Decide based on concrete measurements and prototypes
- Validate tooling and tests before broad adoption
- Check ecosystem governance and licenses
I/O & resources
- Functional and non-functional requirements
- Team skills and learning capacity
- Operational environment and target platform
- Chosen language and rationale
- Toolchain and library list
- Proof-of-concept or migration plan
Description
A programming language is a formal system for expressing algorithms and data structures, enabling developers to write precise instructions for computers. It defines syntax, semantics, and abstractions, influencing performance, maintainability, and tooling. Language choice affects architectural decisions, development cost, and team capabilities.
✔Benefits
- Enables explicit modeling of problems
- Influences runtime behavior and resource usage
- Determines available ecosystem and tooling support
✖Limitations
- No universal language for all requirements
- Legacy dependencies can hinder migration
- Language choice can affect talent availability
Trade-offs
Metrics
- Time-to-Market
Time until a feature reaches production, influenced by language and tooling.
- Runtime latency
Measurement of response times of critical paths under real load.
- Defect density
Number of defects per lines of code or module, influenced by type system and testability.
Examples & implementations
Web API in Go
Go was chosen for simple concurrency models and fast compilation, suitable for scalable microservices.
Data analysis with Python
Python provides extensive libraries for statistics and ML and enables rapid prototyping.
Real-time control in C
C enables fine-grained resource control and is widely used in embedded systems.
Implementation steps
Collect and evaluate requirements
Identify candidates and build prototypes
Set up toolchain, tests and CI
Organize training and knowledge transfer
Perform incremental migration or rollout
⚠️ Technical debt & bottlenecks
Technical debt
- Outdated dependencies due to long-term use of a language
- Growing spaghetti code bases with unclear typing concepts
- Partial migrations that increase interface complexity
Known bottlenecks
Misuse examples
- Using a dynamic language for hard real-time requirements
- Skipping tests due to familiarity with the language
- Selecting a language without considering existing libraries
Typical traps
- Underestimating required training effort
- Overlooking license or compliance constraints
- Lack of long-term maintenance for the toolchain
Required skills
Architectural drivers
Constraints
- • Platform and hardware constraints
- • Regulatory requirements (e.g., safety/cert)
- • Existing legacy dependencies