-프로그래밍 언어의 특성, 라이브러리의 특성 -프로그램이 동작할 H/W와 OS에 대한 지식 -라이브러리들의 유의사항들 -프로그램이 사용할 수 있는 최대 메모리 -사용자 대응 시간 제한 -재사용성이 높은 간결한 코드 =>프로그램 작성을 위한 많은 제약조건들과 요구사항들을 이해하고 최선의 방법을 찾아내는 능력. 프로그래머가 사용가능한 언어, 라이브러리, 자료구조, 알고리즘을 '적재적소'에 사용하는 능력 => 새로운 언어, 프레임워크, 개발 방법론의 조합방법을 배워야함. => 경험을 통해서 나아지지않음. 인위적이고 정제된 추상적인 문제를 제시하고 해결하면서 능력을 향상시키는 훈련 필요