-
Notifications
You must be signed in to change notification settings - Fork 0
Home
This wiki is an exploration of a concept that I'm calling "knowledge centric software engineering".
The idea comes from an observation on the fundamental nature of software development:
- Computer code is precise, encoded knowledge. Precise because a computer can run it, encoded because it is written in a way that allows a computer to understand it, and knowledge because it contains everything of relevance related to that particular program
- When starting a software product, we start from fuzzy needs and wants
- Therefore the fundamental activity in software development is refining knowledge from vague to very precise.
We can test this idea by taking in account the negative scenario: imagine a team that has the source code but it has difficulties understanding it, and they have lost all the knowledge related to the product (for example they took over from another team who did no knowledge transfer and aren't available for answering questions). This situation is well-known to be extremely difficult to recover. The reason is that knowledge has to be rebuilt from scratch.
Given this fundamental nature of software development, it makes sense to focus every activity of a development team around knowledge transfer, building knowledge, and storing knowledge. It also makes sense to look at other disciplines that do knowledge management and whether we can learn anything from them.
Here are a few areas of exploration that can be pursued when using this lens:
- Why do certain counter-intuitive practices work with software? (eg. mob programming)
- Why do certain intuitive practices fail in software? (eg. visual programming languages)
- How can we store knowledge in a way that's easier to retrieve?
- How can we retrieve knowledge when it's garbled or obfuscated?
- What other practices can we imagine that should work based on this reasoning?