When it comes to performing technical work—such as designing, building, and testing software—the primary focus should generally be on an individual's technical skills and their ability to deliver on the job requirements. However, in industries like finance, retail, and gaming, domain knowledge is often highly valued, sometimes even prioritized over technical expertise. This emphasis on domain knowledge is understandable, as it takes significant time and resources to train someone in industry-specific concepts and workflows. Even a technically skilled person might struggle to showcase their potential in an environment where everyone else speaks a specialized industry "language."
On the other hand, I’ve seen many companies take the opposite approach, emphasizing domain knowledge to ensure their technical teams understand the business context and communicate effectively with other departments. While this approach can facilitate smoother cross-functional interactions, it often leads to teams and technology solutions that may not be as technically strong as they could be.
I’m not advocating exclusively for either approach. However, I believe that, when building high-quality software, technical expertise in software development may be more critical than industry-specific knowledge. Even if it adds some complexity in communication and training, a strong foundation in technical skills will likely yield better results.
Let's first explore the pros and cons of developing software based primarily on domain knowledge versus a foundation of pure technical expertise:
Developing Software with Domain Knowledge
- Better Requirement Understanding: Developers with domain expertise are more likely to understand complex requirements intuitively. This reduces the risk of misunderstandings and ensures the software aligns with real user needs.
- Improved User Experience: Familiarity with the domain allows developers to design user interfaces and experiences that fit naturally into users' workflows. For example, in finance or healthcare, domain-aware software often leads to better usability and compliance.
- Efficient Communication: Developers with domain knowledge can communicate more effectively with stakeholders, as they already understand key concepts and jargon. This can speed up the development process and reduce miscommunication.
- Increased Problem-Solving Speed: Knowing the domain means a developer may already know common issues and best practices, leading to faster problem resolution and more robust design.
- Higher Quality Solutions: With domain understanding, developers can anticipate user needs more accurately, design relevant features, and avoid pitfalls unique to the field, leading to higher-quality products.
- Potential for Bias: Familiarity with the domain can lead to assumptions and biases, which may hinder creativity and out-of-the-box solutions. Developers may overlook innovative features or approaches because they’re too used to “the way things have always been done.”
- Higher Hiring Costs: Developers with both software and domain expertise are in high demand, often commanding higher salaries and making recruitment more challenging, especially in specialized fields.
- Narrow Focus: If the development team is too focused on the domain, they might not consider broader software engineering principles that could improve the product’s scalability, maintainability, or adaptability.
- Time-Consuming Training: While beneficial, gaining domain expertise takes time. If developers don’t have pre-existing knowledge, the learning curve can slow down initial progress.?
Developing Software without Domain Knowledge
- Fresh Perspective: Developers without domain-specific preconceptions may approach problems creatively and develop innovative solutions that experts might overlook.
- Focus on Core Engineering Principles: Without the constraints of domain knowledge, developers can focus on fundamental software engineering practices, potentially leading to cleaner, more maintainable code.
- More Flexibility in Team Composition: Hiring developers without domain knowledge broadens the talent pool, allowing organizations to focus more on technical expertise and less on finding a specific skill set.
- Reduced Risk of Bias: Without preconceived notions, developers are likely to rely on data and user feedback for decision-making, which can lead to better user-centered design and functionality.
- Extended Ramp-Up Time: Developers need time to learn about the domain, which can slow down the project, especially if it requires detailed industry regulations or compliance (like finance or healthcare).
- Higher Risk of Misunderstandings: Developers without domain knowledge are more prone to misunderstand requirements, leading to incorrect implementations or missing functionality.
- Increased Dependency on Subject Matter Experts (SMEs): Without domain expertise, developers need to rely more heavily on SMEs for clarification, which can create bottlenecks and communication challenges.
- User Experience Gaps: Developers unfamiliar with the domain may struggle to design intuitive solutions, leading to lower user satisfaction if they don't fully grasp how end-users work.?
Having domain knowledge in software development can lead to more tailored, higher-quality software that aligns closely with user needs, but it can also limit innovation and inflate costs. Conversely, developing without domain expertise allows for creative, engineering-focused solutions but may increase the learning curve, dependency on SMEs, and risk of misalignment with user expectations.?
Benefits of deep technical knowledge over domain knowledge?
As mentioned though, deep technical expertise offers several unique advantages over domain knowledge, especially in projects that require robust engineering and complex problem-solving. These things are transferrable regardless of industry and form the foundation of all good software design – regardless of industry.
Here are some key benefits of technical expertise:
Strong Problem-Solving Abilities
- Focus on Fundamentals: Engineers with deep technical skills tend to approach problems from a foundational perspective, making them adept at breaking down complex issues into manageable pieces and designing solutions that are efficient and scalable.
- Efficient Debugging and Optimization: Technically proficient engineers are usually faster at identifying root causes of issues and implementing effective solutions, resulting in higher-quality software and lower time spent troubleshooting.
Ability to Build Scalable and Maintainable Solutions
- Architectural Skills: Engineers with strong technical expertise can design systems with scalability, maintainability, and performance in mind. They tend to create architectures that can evolve and scale, reducing the need for costly rewrites down the line.
- Emphasis on Best Practices: Experienced engineers understand the importance of clean code, modularization, and design patterns. This leads to maintainable codebases that are easier to understand, extend, and refactor.
Innovation and Agility in Tool Selection and Usage
- Familiarity with Advanced Tools and Techniques: Technical experts often stay up-to-date with the latest tools, frameworks, and methodologies. This knowledge allows them to leverage new technologies and tools that improve efficiency, security, and performance.
- Adaptability to New Challenges: Because they understand technology deeply, these engineers can quickly adapt to new requirements or technologies, making them versatile and valuable in a fast-paced development environment.
Improved Development Speed and Efficiency
- High Productivity: With strong technical knowledge, engineers are more productive, as they can write efficient code faster and require less time for troubleshooting and bug fixing.
- Reduced Technical Debt: Technical experts often follow best practices rigorously, resulting in cleaner code and reduced technical debt, which improves long-term project health and lowers maintenance costs.
Enhanced Collaboration with Other Technical Stakeholders
- Seamless Communication with Technical Teams: Technical experts can communicate complex concepts clearly with other engineers, DevOps teams, and architects, facilitating better collaboration and alignment on technical decisions.
- Influence on Technical Decision-Making: Their expertise allows them to play a key role in technical decision-making, helping to set best practices, choose the right tools, and design efficient solutions.
Adaptability to Cross-Domain Projects
- Cross-Domain Transferability: Deep technical expertise is highly transferable across industries. While domain knowledge is often specific, technical expertise can be applied to different projects, making engineers more adaptable to cross-domain work.
- Quick Ramp-Up for New Domains: Skilled engineers with strong technical foundations can often pick up new domain knowledge more easily. They can grasp complex domain-specific requirements once they understand the technical components and data involved.
Foundation for Developing New Technical Leaders
- Mentorship and Knowledge Sharing: Experienced engineers can effectively mentor junior developers, share technical skills, and promote best practices, which is beneficial for the growth of the engineering team as a whole.
- Pathway to Technical Leadership Roles: Technical expertise forms a solid foundation for engineers to step into technical leadership roles, like architects or technical leads, where they can guide the team in making sound engineering decisions.
While domain knowledge allows engineers to build solutions closely aligned with business needs, deep technical expertise provides a strong foundation for creating robust, scalable, and maintainable software. Technical experts excel in building resilient systems, fostering innovation, and adapting to new challenges and technologies. This expertise can lead to faster development, higher code quality, and a future-ready software architecture that can support evolving business needs and changing technologies.
How to better onboarding engineers who don’t possess domain knowledge
So, while it's clear I prefer a strong focus on actual technical skills when it comes to building teams and developing engineering talent, I do think that the best approach is not trying to ignore the importance of this domain knowledge but rather look at ways companies can better improve their onboarding to allow people to better learn their domain and ensure they have the right skills to build the best software possible without losing out too much on the benefits deep domain knowledge provide.
Onboarding engineers without domain knowledge into a complex business space is all about setting up a structured, supportive learning process that enables them to understand the business context and effectively contribute to the project. Here are several strategies to streamline this onboarding process:?
Structured Onboarding Plan
- Create a Learning Roadmap: Develop a structured curriculum that introduces engineers to essential domain knowledge. Start with high-level concepts and work toward deeper details.
- Milestone-Based Goals: Set incremental goals that allow engineers to progressively build their understanding. This gives them a clear sense of progress and helps avoid overwhelm.
Engagement with Subject Matter Experts (SMEs)
- Assign a Mentor: Pair new engineers with a mentor who has strong domain knowledge. This person can answer questions, provide context, and help interpret requirements in real-time.
- Organize Regular Q&A Sessions: Arrange recurring sessions with SMEs where new engineers can ask questions about domain-specific challenges and edge cases.
Domain Knowledge Documentation
- Develop a Domain Wiki or Glossary: Create a knowledge base that explains core business concepts, industry terms, workflows, and specific processes that are relevant to the project.
- Use Real-World Examples and Case Studies: Supplement documentation with practical examples that illustrate how the business operates. This can include case studies, project retrospectives, or even user personas.
Business Context in Technical Requirements
- Provide Context with Requirements: When handing off requirements, include background on why a feature or functionality is needed, how it benefits the business, and who will be using it. This helps engineers understand the "why" behind their work.
- Use Real-Life Scenarios: When reviewing requirements, use scenarios that engineers can relate to. This helps ground abstract concepts and makes it easier to grasp complex workflows.
Training on Business Tools and Data
- Hands-On with Business Tools: If possible, allow engineers to interact with the same tools the business uses. Experiencing these tools first-hand can deepen their understanding of the workflows and user expectations.
- Analyze Real Data: Provide sample data sets that allow engineers to see patterns, common use cases, and typical challenges within the business. Make sure this is done securely, using anonymized data if necessary.
Encourage Cross-Functional Collaboration
- Cross-Functional Workshops: Organize workshops that bring together engineers, product owners, and business stakeholders to discuss specific features, pain points, or new initiatives.
- Shadowing Key Processes: Arrange for engineers to shadow business processes (e.g., sitting in on client calls, and observing service workflows) to gain firsthand exposure to the business's operations.
Use Domain-Specific Learning Modules
- Interactive Learning Modules: Use platforms like e-learning courses, quizzes, or interactive simulations that cover business-specific topics. For regulated industries, consider training modules that cover compliance requirements.
- Microlearning Approach: Break down learning content into small, manageable segments that engineers can absorb gradually. This could be a quick 5-10-minute lesson on specific business concepts or processes.
Feedback Loops and Continuous Learning
- Establish Feedback Mechanisms: Regularly check in to see how well engineers are grasping the domain concepts, and adjust training based on their feedback. Continuous learning should be encouraged as domain understanding deepens with time.
- Encourage Continuous Knowledge Sharing: Foster a culture where engineers are comfortable asking questions and where domain experts actively share knowledge. Encourage them to use messaging channels or knowledge-sharing sessions to stay engaged.
9. Emphasize the Importance of Domain Knowledge in Context
- Link Domain Knowledge to Project Impact: Show engineers the tangible benefits of domain knowledge, such as reduced bugs, better-designed features, and a clearer understanding of project goals.
- Highlight Success Stories: Share examples of how past domain knowledge has directly contributed to project success, demonstrating the value of their investment in learning.
Conclusion
In software development, there’s an ongoing debate about the relative importance of technical skills versus domain knowledge. Technical expertise is crucial for building scalable, efficient, and maintainable software. Engineers with strong technical skills can solve complex problems, innovate, and create robust architectures that withstand evolving requirements. Conversely, domain knowledge—especially in specialized industries like finance, retail, or gaming—adds value by enabling engineers to design solutions aligned with business needs and communicate effectively with other teams.
Balancing these priorities is essential, as overemphasis on either side has drawbacks. A focus solely on technical skills can lead to challenges in understanding the business context, while prioritizing domain knowledge too heavily may result in a technically weaker team.
Effective onboarding becomes critical in bridging this gap. Structured onboarding helps engineers without domain experience gain the industry-specific knowledge they need, enabling them to apply their technical skills in a meaningful context. A well-designed onboarding process should include mentorship, accessible domain documentation, real-world examples, and cross-functional collaboration to ease the transition. This balanced approach leverages technical expertise while building domain understanding, leading to stronger teams and better software outcomes
Partnering to deliver application speed and agility through data innovation
2 周Great insights Craig. In one of the start-ups I worked for, we had a great way of short-cutting the acquisition of domain knowledge: We “made” our engineers do “time” on the support desk as part of their progression. Solving the problems and issues of users highlighted how their code was used in a business context. It also highlighted the damage, pain and huge cost of dropping bugs into production. A stint in support was always transformative on individuals and made them far, far better engineers. Even the most ardent technologists agreed in the value of the exercise, begrudgingly in some cases. ?? Of course, some of the real genius engineers wouldn’t be seen dead in support, they were rarely seen in daylight ?? but they often created works of art and solved intractable problems. Mind you they could drop bombs because they got bored quickly once the interesting problem solving had been achieved, which the “finishers” (and support engineers) had to clean up! As ever rounded individuals, teamwork and a safe, accountable environment always wins. Thank you for the article and insights.