Original Post
"Programming" is just problem solving with computers. To be good at programming, a programmer needs to be a great problem solver. Thus, getting better at problem solving is getting better at programming. One problem/advantage for me is that I'm really lazy. I hate wasting time and effort on anything. Efficient software engineering is worth the investment of my time. I keep trying to solve problems that are really really hard to solve (for me anyways). Since I'm lazy, I want to make sure that before I even begin to start attempting to solve a problem, my approach to solving the problem is solid. Like design documents and pseudo code, I believe that time spent solving a problem on paper is inversely proportionate to the time spent coding... If I can't solve the problem on paper, then what hope do I have of solving the problem by writing out meandering code? So the question becomes: "What is the standard process you use to solve ambiguous problems, especially in the design phase?" Here's what I have so far: 1. Express the problem in as much detail as possible 2. Attempt to solve the problem on paper with preliminary & assumed solutions 3. Read about the methods you're going to use to solve the problems (get educated on the "how"). How have other people solved it? What challenges did they face? Is the problem possible to solve? Is the problem/solution overly ambitious with current knowledge/resources? 4. Break the problem down into small bite sized chunks, solve and test rigorously, return to step 1 until all chunks are solved 5. Assemble all the bite-sized chunks together and see if the step in #2 worked 6. Refine or toss out the designed solution to the problem. An example of my approach: 1. Express the problem in as much detail as possible I want to create an artificial intelligence which is self-learning in a similar way to human beings and other intelligent life. 2. Attempt to solve the problem on paper with preliminary & assumed solutions It seems that the best way to create an intelligent "thing" is to mimic other intelligences. The human brain is vastly intelligent with its flexibility and processing abilities. While using biological brain designs is limiting by the restraints found in biology, it's probably the best design so far. The best solution would be to use something along the lines of an artificial neural network which matches the biological brains. The limit I'd face is my lack of understanding of how brains work, how thought occurs, and what humanity knows about the mind so far. How does a thought occur? What is communicated from one neuron to another? 3. Read about the methods you're going to use to solve the problems (get educated on the "how"). How have other people solved it? What challenges did they face? Is the problem possible to solve? Is the problem/solution overly ambitious with current knowledge/resources? Nobody has been able to create a truly sentient AI...yet. For an individual, this problem may be overly ambitious to solve, so maybe solving a smaller chunk of the problem would be more feasible. I think though, that perhaps some of the qualities of a biological brain are being ignored with Artificial Neural Networks (ANN). Example: Every human brain comes pre-configured to perform certain tasks, with some parts of the brain which handle speech or eye sight. How would an ANN be pre-configured for that? How did human brains become pre-configured to be the way they are? Answer: Evolution through millions of generations. Do any ANN algorithms use evolution as a pre-configuration mechanism for their weights and connections? 4. Break the problem down into small bite sized chunks, solve and test rigorously, return to step 1 until all chunks are solved If I can just create an ANN for starters, I would be one step closer. Before I can create an ANN, I have to understand how neurons work and use a "node" type data structure to simulate them. A biological neuron is a node which has a nucleus and little pointer things that connect the nucleus to other nuclei. The nucleus 'fires' when some sort of input happens. What happens in the nucleus that causes it to 'fire'? What message does it send to the other nuclei? Does it send the message to all connected nuclei? How does it make new connections? With all this in mind, what is the BEST data structure to use to represent a neuron? I'm leaning towards a multi-way tree of some sort. The node will be a 'neuron' and it can have an infinite number of pointers to other nodes. Each pointer will have a connection weight associated with it. The weight of the connection increases if the connection is used, decreases if its rarely used. Adding in evolution, as each iteration of 'something' happens, the weights are adjusted, new connections are made/forgotten, and the ANN becomes pre-configured to solve a specific problem. To break the problem down even further, how should the node be represented? Most tree algorithms don't represent data like a brain's neural network (or is a brain simply a TON of inter-connected branching trees, with the root node being a weighted input node which either fires or doesn't, and leaf nodes being the root to other trees?) 5. Assemble all the bite-sized chunks together and see if the step in #2 worked 6. Refine or toss out the designed solution to the problem. I'd hate to toss out a solution because it's broken, so to avoid wasting time, it would be best to have a solution which works before trying to implement it. To find a working solution to an evolving ANN, I need more knowledge on both CS, Software Engineering, and the biology of a brain. :-/ Since this would be pushing the limits on current human knowledge, I'd have to advance it to make the problem solvable... and that sounds overwhelmingly tough. "Give up" or "go on"? Is my solution of evolution + ANN unique or has someone smarter tried it already and failed? Anyways, What is your process for solving a problem?