Recent advances in intelligent systems have emphasized the use of "expert knowledge" to solve problems. This paper describes a plan for attacking problems impeding development of such systems. The authors identify two chief problems as knowledge programming and learning. The task of knowledge programming is to create an intelligent system that does what an expert says it should. The learning problem requires criticizing and expanding current knowledge to improve system performance. In this view, learning produces new knowledge which must be accommodated to implement an improved system. This accommodation requires a capability for incremental knowledge programming. Research proposed to achieve these objectives is described. Examples are drawn from a heuristic program that plays a card game (hearts). Appendices provide details on technical issues, including: representation of knowledge and structure of knowledge bases; design of a knowledge programmer; various control methods, including caching and demons; design of a learning workbench; an illustrative learning scenario; and various learning heuristics.