첫 프로그래밍 과정을위한 언어 선택 기준


35

대학 수준의 CS 교육자로서 첫 번째 프로그래밍 과정에서 어떤 프로그래밍 언어를 가르 칠지에 대한 문제가 종종 논의됩니다. 선택할 수있는 언어는 수천 가지가 있으며 한 언어 캠프를 다른 언어 캠프를 지원하는 종교적 열병 (또는 열병)이 있습니다. 각 프로그래밍 언어를 둘러싼이 주관적인 편견 때문에 교육자가 하나를 선택하기가 매우 어렵습니다.

내 질문은 :

교육자가 첫 해의 대학 프로그래밍 과정의 기초로 사용할 프로그래밍 언어를 선택하기 위해 어떤 객관적인 기준을 사용할 수 있습니까? 이 기준의 기초는 무엇입니까?

참고 : 프로그래밍 언어 목록을 보지 않으려는 이유와 이들이 가장 적합한 이유는 무엇입니까? 질문은 최상의 언어에 관한 것이 아니라 언어 를 선택하는 기준에 관한 것입니다 . 그러나 특정 포인트를 설명하기 위해 프로그래밍 언어를 사용할 수도 있습니다.


이 질문은 다른 주제 인 https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language 에서 영감을 얻은 또 다른 질문에서 영감을 얻었습니다 .


1
이 질문이 온 / 오프 주제인지에 관한 메타 스레드를 열었습니다 : meta.cs.stackexchange.com/questions/362/…
Dave Clarke

7
<그랩 팝콘> 의역하려면 오토 노이게 바우어를 : 인간에게 알려진 없음 먼저 프로그래밍 언어 모두를 파괴 할 수 없다.
JeffE

3
@Raphael : Dijkstra의 답변은 " 사람에게 알려진 모든 최초의 프로그래밍 언어는 모든 사람을 망칠 수 있습니다."
JeffE

2
@ edA-qamort-ora-y는 여러 프로그래밍 패러다임에 노출되어야합니다. 아니요, 첫 번째 코스에서는 할 수 없습니다.
vonbrand

3
우리는 SML단순히 어떤 학생도 그 언어를 미리 알지 못할 것입니다. 이것은 모든 학생들이 코스를 시작하기 위해 같은 수준으로 균형을 잡았습니다.
Markus Malkusch

답변:


14

나는이 주제가 바닥이없는 구덩이라고 생각하지만, 내 자신의 2 센트를 던질 것이다. 나를 잘못 생각하지 마라, 그것은 매혹적인 질문이라고 생각하지만, 우리가 모든 사람의 만족을 위해 여기서 해결할 수있는 것은 아닙니다.

간단히 말해서, 나는 언어가해야한다고 말하고 싶지만 당신이 무엇을 원하는 A의, 단순 하고 명확한 가능한 한 방법, 그리고 하지 더 .

저 자신의 경험은 Oberon 프로그래밍 언어로 여러 세대의 1,2 학년 학생들을지도하는 데 있습니다 . 이 언어를 아는 사람들은 제 의견에 그 영향을 인식 할 것입니다. 이 언어는 "알고리즘 및 데이터 구조"를 가르치는 데 사용되었습니다. 그 당시 (그 당시), 기능 프로그래밍과 객체 지향 디자인은 2 학년부터 별도의 과정으로 진행되었습니다.

중요 : 그러나 모든 언어의 세부 사항에 들어가기 전에, 가장 중요한 것은 강좌의 목표가 무엇인지에 대해 자신과 학생들에게 절대적으로 명확해야 함을 강조하고 싶습니다. 프로그래밍 자체 를 가르치고 있습니까? 아니면 알고리즘과 데이터 구조? 아니면 소프트웨어 공학? 언어를 선택하기 전에 언어를 사용할 위치에 대해 잠시 생각해 보는 것이 좋습니다. 이 수준에서의 목표 (목표)는 아마도이 주제에 대해 대부분의 의견 불일치를 초래할 것입니다.

내가 중요하다고 생각하는 점은 이미 언급 한 여러 가지 사항과 겹칠 수 있지만 대부분 다음 네 가지 중 하나의 하위 집합이라고 생각합니다.

  • 단순성 : 학생들은 일반적으로 특정 프로그래밍 언어의 특징과 복잡성이 아닌 프로그래밍, 알고리즘 및 데이터 구조를 배웁니다. Wirth는 Oberon 디자인의 지침 원칙으로 아인슈타인의 인용문 인 "가능한 한 단순하지만 단순하지는 않다"를 사용했으며, 다른 언어들도 있습니다. 선택한 프로그래밍 언어는 강의에 필요한 모든 개념을 구현할 수 있어야하지만 가능한 최소의 기능 / 세부 사항으로 수행해야합니다. 프로그래밍 언어는 보통 목표가 아니라 도구 일뿐입니다.

  • 명확성 : 단순성의 밀접한 형제, 각 개념마다 가능한 한 중복이 거의없는 하나의 구성이 있어야합니다. 모든 개념을 구현하는 하나의 "올바른"방법이 있다고 생각하십시오. 의미 적으로 모두 같은 일을하는 세 가지 다른 유형의 루프? 또는 변수를 증가시키는 15 가지 방법? 안좋다. 또한 숙제를 수정하거나 일반적으로 학생들의 코드를 훨씬 쉽게 이해할 수 있습니다 . 당신의 교수 보조가 그것을 감사합니다.

  • 이식성 : 학생들은 Linux, Windows 및 OSX 기계를 사용하여 수업을 듣게되며 프로그래밍 환경은 세 환경에서 가능한 한 비슷해야합니다. 모든 프로그램의 결과도 동일해야합니다. 이것은 숙제를 표시하고 질문 / 문제를 처리 할 책임이있는 조교가 크게 높이 평가할 또 다른 요점입니다.

  • 업계 선호 : "업계"자체가 어떤 프로그래밍 언어를 가장 좋아하는지 결정하는 경우에만이 문제에 대해 걱정해야합니다. 컴퓨터의 발명 이후로 이것은 끊임없이 움직이는 목표였습니다. 현재 학생들이 실제로 프로그래밍하는 방법을 배우면 언어에 의존하지 않습니다. 그러나 업계가 표준에 동의하도록 관리하는 일부 영역 (예 : 회로 설계의 경우 VHDL 또는 데이터베이스 쿼리의 경우 SQL)이 있으므로 여전히 유효합니다.

다시 말하지만,이 목록에 맞는 언어는 가르치려는 내용에 따라 크게 달라집니다!


4
실제로 VHDL과 Verilog 사이에는 회로 설계가 분리되어 있습니다.
avakar

@avakar : 아, 쓰레기. 내 답변 에서이 문제를 해결해 주셔서 감사합니다.
페드로

Yikes, 이것을 읽고 내 강사 중 한 명이라고 생각했습니다. 소문자 키워드 사용 스위치가 자동으로 활성화되어있는 한 Oberon의 경우 +1; 쓰기 때문에 고통 WHILE expr DO stmts END
캘럼 로저스

3
"코스 목표가 무엇입니까?"에 +1 그리고 추가 참고 사항은 철자가 아닌 경우에도 가장 일반적인 목표 중 하나는 프로그래밍 필수 조건으로 다른 것들 (과정 및 인턴쉽)에 대한 기본 사항을 제공하는 것입니다.
AProgrammer

(적어도 오늘은) 한 가지 중요한 점은 학생들이 시각적으로 매력적인 프로그램을 빠르고 쉽게 만들 수 있다는 것입니다. 그들은 그래픽을 많이 사용하는 많은 응용 프로그램과 게임에 노출되어 있으므로 컴퓨터가 사람들과 상호 작용해야한다고 생각합니다.
vonbrand

13
  • 문제를 주요 목표로 해결하기위한 알고리즘 적 사고 개발 : 첫 번째 과정에서 객체 지향 패러다임을 사용하는 것에 대한 한 가지 나쁜 점은 새로운 학습자를 상속, 다형성 등과 같은 것들에 빠지게하여 위에서 언급 한 주요 목표를 방해한다는 것입니다. 실제로, 소프트웨어 엔지니어링, 이식성, 산업 유용성 등과 같은이 핵심 목표 이외의 2 차 고려 사항의 도입은 언급 된 이유로 비생산적입니다.

  • 객체 지향 언어가 아님 : 오늘날 대부분의 대학은 객체 지향 언어로 프로그래밍을 가르치기 시작합니다. 나는 이것이 실수라고 생각한다. 세상에는 정반대와 반대로 만 진정으로 이해 될 수있는 것들이 있습니다. 프로그래밍의 절차 적 패러다임 (데이터와 기능은 프로그램의 두 가지 측면으로 기능)에 노출되지 않고, 객체 지향의 기본 아이디어 (데이터와 행동이 본질적으로 묶여있는 것으로 간주 됨 )를 놓칠 수 있습니다. 그리고 객체 지향 프로그래밍이 매우 중요하기 때문에 기본 개념이 빠진 것은 작은 일이 아닙니다. 게다가, 대부분의 상급 과정에서 CS 학생들은 주로 OO로 프로그램 할 것이기 때문에 절차 적 측면에도 노출되어야합니다.

결국에는 알고리즘 사고를 개발하는 데 중점을 둔 고급 기능을 피하면서 절차 적 언어를 사용합니다. 그러나 고급 기능을 피한다고해서 어려운 문제를 피하는 것은 아닙니다. 어려운 문제라도 학생들은 첫 번째 원칙, 간단한 도구를 사용하여 문제를 해결해야합니다.


절차 적 스타일을 보여주기 위해 Java의 하위 집합으로 쉽게 시작할 수 있습니다. 그런 다음 Pandora의 상자를 열고 OOP에서 동일한 항목이 어떻게 보이는지 보여줍니다.
Raphael

3
@Raphael : public static void main()Java에서는 피할 수 없으며 , 일부 클래스의 컨텍스트 내에 있어야합니다. 이로 인해 Java는 모국어로서 이상적이지는 않지만 물론 장애물은 그리 크지 않습니다.
Dave Clarke

좋은 IDE는 public static void main()오랫동안 연기 할 수 있습니다 . BlueJ는 학생들이 단일 프로그램 없이도 프로그램을 작성할 수있는 IDE의 좋은 예입니다 main.
베리 브라운

2
OOP의 문제점은 첫 해 또는 그 이상의 프로그래밍에서 다루어 진 장난감 문제의 범위에 대해 분명한 이점없이 방해가된다는 것입니다. 프로그램이 수천 줄 정도이면 OOP가 중요해집니다. "OOP가없는 자바"는 끔찍하고 완전히 불투명 한 많은 것들인데, "이러한 방식으로 작성되어야한다"는 것은 앵무새가 아니라 배우는 사람들에게 불리하다 .
vonbrand

11

우리는 컴퓨터 과학 프로그램의 첫 번째 프로그래밍 과정에 대해 이야기하고 있기 때문에 가장 중요한 측면은 CS의 기본 개념이 학생들에게 무엇을 가르 칠 것인가입니다. 모든 개념을 한 번에 가르 칠 수있는 언어가 없기 때문에 어떤 개념이 더 필요할지 고려해야합니다.

나는 산업 관련성이 중요하다는 @Kaveh의 개념에 동의하지 않는다. 보너스일지도 모르지만 여기서는 그다지 중요하지 않습니다. CS 원칙의 탄탄한 토대를 갖추면 이후 과정에서 "산업"언어를 배우는 것이 상대적으로 쉽습니다.

참고로, 첫 번째 언어로 선택된 언어에 관계없이 가능한 빨리 다른 언어를 사용하는 것이 중요합니다.


1
업계 관련성은 부차적 인 것으로 간주 될 수 있지만 이것이 사소한 문제라고 생각하지 않습니다. 이것은 프로그래밍 과정에 대한 소개이기 때문에 왜 모든 개념을 가르치고 싶어하는지 알지 못합니다. 프로그래밍의 두 번째 과정과 다양한 언어가 논의되는 프로그래밍 언어 주제에 대한 또 다른 과정이 있습니다. 웹 프로그래밍 등 특정 응용 분야에 중점을 둔 과정
Kaveh

@ Kaveh : 그것은 기술 대학의 커리큘럼처럼 들립니다.
Raphael

6
"학생들에게 가능한 빨리 다른 언어를 사용하는 것이 중요합니다." -절대적으로 맞습니다. 우리는 함수형 프로그래밍을 먼저 도입하여 프로그래밍 할 수 있다고 생각하는 신입생들을 먼저 설정했습니다.
Raphael

3
@Kaveh : 실세계에서 완료하기 위해 설계된 언어가 개념을 가르치거나 기술을 개발하기 위해 반드시 최적 인 것은 아닙니다. 목표는 매우 다릅니다.
JeffE

1
@Kaveh : 업계에서 사용되는 언어에 대한 지식이 중요하지 않다는 글은 결코 쓰지 않았습니다. 제 말은 탄탄한 첫 프로그래밍 언어가 주어지면, 나중에 수강하는 과정에서 학생들이 졸업 할 때 실제로 무엇을하는지 가르치는 데 아무런 문제가 없을 것입니다. 몇 가지 입문 과정을 직접 (TA로) 가르치는 과정에서 산업계에서 필요로하는 기술과는 전혀 다른 기술이 없다고 말합니다 (시간이 너무 적습니다). 이 경우, 단지 $ LANGUAGE- 프로그래머가 아닌 더 나은 프로그래머가 될 수 있도록 확실한 개념을 제공하는 것이 좋습니다.
evilcandybag

8

저의 주요 관심사는 프로그래밍 언어 를 배우는 것이 학생이 대부분의 프로그래밍 언어를 다룰 수있게해야 한다는 점에서 보편성 입니다.

유감스럽게도이 기준은 순수한 기능적 언어를 배제합니다. 또한 언어의 이국적인 기능을 사용해서는 안되는 과정에도 적용됩니다.

...하지만 이것은 상식입니다.


1
Haskell에서와 같이 모나드를 사용하면이 기준이 더 이상 순수 기능 언어에는 적용되지 않을 수 있습니다.
Dave Clarke

@DaveClarke : 모나드는 비 기능적인 일을하는 아주 좋은 방법입니다. 그러나 직접 모나드 오버 헤드로이 내용을 배우는 것이 너무 위험하지 않습니까? (아마도, 모르겠다!)
jmad

2
@jdam : 당신 말이 맞을 것입니다. 문제는 모나드 자체가 아니라 일반적이며 프로그래머에게 좋은 오류 메시지를 표시하는 데 어려움이 있습니다. Haskell 변형 헬륨 은 이러한 문제를 해결하며 1 학년 학생들에게 성공적으로 사용되었습니다.
Dave Clarke

@DaveClarke : 와우. 정말 멋지다! 불행히도 그것은 하스켈 학습에 매우 유용하지만 다른 언어를 배우는 데 도움이되지 않는 문제는 해결하지 못합니다.
jmad

4
@Ben : 제 생각에는 수동 메모리 관리는 오늘날 프로그래밍의 기본적인 것 이상으로 일부 언어에만 적용되는 것입니다. 동의하지 않으면 C (또는 C ++)를 가리키는 것 같습니다.
jmad

8

첫 번째 프로그래밍 언어를 선택할 때 고려해야 할 많은 문제가 있습니다. 이 중 많은 부분이 위의 답변에서 고려되었습니다. 이들은 원래이 질문에 영감을 얻은 비공개 질문 ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language )에 대한 답변의 일부이므로 3 개를 더 포함합니다 . 비공개 질문 삭제 정책에 따라 답변을 여기에 복사하고 수정했습니다.

다음은 몇 가지 프로그래밍 언어를 예로 사용하여 고려해야 할 3 가지 사항입니다.

큰 프로그래밍과 작은 프로그래밍

프로그래밍을 처음 배우는 경우 프로그래밍 을 배우는 메커니즘을 배우기 전에 작게 프로그래밍 하는 방법을 배워야합니다 .

소규모로 프로그래밍한다는 것은 100 줄 미만의 프로그램을 작성하는 것을 의미합니다. 이러한 프로그램에는 간단한 데이터 구조를 조작하고 간단한 제어 흐름을 가지며 간단한 문제를 해결하는 알고리즘이 포함됩니다. 이들은 일반적으로 응용 프로그램 으로 간주되지 않습니다 .

대규모로 프로그래밍한다는 것은 많은 구성 요소 / 클래스로 구축 된 API를 기반으로 GUI, 데이터베이스, 아마도 클라이언트-서버 구성으로 구축 된 대규모 프로그램을 작성하는 것을 의미합니다.

소규모로 프로그래밍 할 때 프로그래머가 고려해야 할 사항은 대규모로 프로그래밍 할 때와 매우 다릅니다. 큰 프로그래밍은 프로그래머가 모듈성, 우수한 인터페이스, 우수한 디자인, 재사용 성 및 기타 여러 문제에 대해 생각해야합니다. 현대의 프로그래밍 언어는 대규모로 프로그래밍하는 데 도움이되는 많은 구성을 제공합니다. 이러한 구성에는 클래스, 모듈, 인터페이스, 정보 숨기기 등이 포함됩니다. 소규모로 프로그래밍 할 때는 이러한 문제가 훨씬 덜 중요합니다.

C ++과 같은 프로그래밍 언어에는 대규모 프로그래밍을 도와주는 많은 기능이 있지만 아주 간단한 프로그램을 작성하기 시작하기가 더 어렵습니다. 자바도 비슷하다.

반면에 Python, Ruby, Scheme 또는 Haskell과 같은 언어는 프로그램을 직접 작성하는 것이 훨씬 쉽습니다.

높은 수준 대 낮은 수준

C ++ 및 C와 같은 언어는 다소 낮은 수준의 언어입니다. 이를 통해 프로그래머는 참조를 메모리로 직접 조작 할 수 있습니다. 이렇게하면 매우 효율적인 코드를 작성할 수 있지만 초보 프로그래머가 언어를 배우기 위해서는 상세 수준이 낮을 수 있습니다. 어떤 사람들은 이러한 낮은 수준의 세부 사항이 문제를 해결하기 위해 논리를 작성하는 방식에 도달한다고 주장합니다.

파이썬과 같은 고급 언어를 사용하면 문제 영역의 관점에서 개념을보다 직접적으로 표현하기가 더 쉽습니다.

정적 유형과 동적 유형

C ++, Haskell, Java 및 더 많은 언어가 정적으로 유형이 지정되었습니다. 이는 컴파일러가 코드의 각 위치에서 예상되는 값 유형을 기반으로 잠재적 오류가 발생하는 위치를 자동으로 찾습니다. 정적 타이핑이 좋은지 아닌지에 대한 약간의 종교적인 전쟁이 있지만, 나는 그것을 피할 것입니다. 새로운 프로그래머를위한 정적 타이핑의 한 가지 문제점은 컴파일러가보고 한 오류 메시지를 이해하기 어렵다는 것입니다. 특히 C ++ 템플릿과 Haskell 프로그램의 경우에 특히 그렇습니다.

Python, Ruby 및 Scheme은 동적으로 입력됩니다. 이것은 프로그램이 실행되는 동안 오류가 감지되었음을 의미합니다. 오류를 감지하기에는 너무 늦었다 고 주장 할 수 있습니다 (그러나 오류를 피하기 위해 테스트를 사용할 수도 있습니다). 다시 말하지만, 종교적 주장을 피하면서, 동적으로 유형이 지정된 프로그래밍 언어로 간단한 프로그램을 작성할 때 발생하는 오류의 이점은 이 객체가이 작업을 수행하는 방법을 알지 못하는 것 입니다. 작은 프로그램의 맥락에서 이러한 오류를 이해하고 추적하기 쉽습니다.

C와 같은 언어는 타이핑이 약하므로 컴파일러가 일부 오류를 해결할 수 있지만 런타임은 유효하지 않은 메모리 액세스와 같이 발생하는 다른 언어를 트랩하지 못합니다. 결과적으로 프로그래머에게 반환 된 오류 메시지는 "프로그램 충돌"과 유사합니다. 동적으로 입력 된 언어는 이러한 오류를 포착하여보다 이해하기 쉬운 오류 메시지로 변환합니다.

기타

다른 언어의 경우 프로그래밍 환경에서 제공하는 지원, 사용 가능한 API, 서적 품질 및 온라인 자습서 등과 같은 다른 고려 사항이 발생할 수 있습니다.


진심으로 동의합니다.
vonbrand

1
또한 "정적 및 동적 유형"경합에 대한 선호도도 있습니다. 그러나 일반적인 CS 프로그램에서 둘 다 어느 시점에서 가르쳐지는 한 순서는별로 중요하지 않다고 생각합니다. 그러나 동전의 한 면만 제시된다면 그것은 큰 문제입니다.
chi

8

입문서로서 하나 이상의 언어를 제시 할 가능성을 고려하십시오 (한 코스에서). 첫 번째 용어로 SML과 Java를 모두 보여주었습니다. 대조는 그 자체의 중요한 메시지를 가지고있었습니다. 작업에 적합한 도구를 선택하십시오.

그러나 이제는 임의의 순서로 기준에 대해 설명합니다.

난이도 배울 수는 주관적인 문제가 있지만 중요하다 : 당신이 당신의 학생이 언어 학습에 있지만, 시간을 낭비하고 싶지 않아 하고 함께 일을. 루비와 같은 역동적 인 언어가 이길 수 있습니다. 무엇이든 먹이를 줄 수 있으며 웹에는 훌륭한 "더미"튜토리얼이 있습니다. 내가 정확하게 기억한다면, 전에 프로그래밍하지 않은 학생들이 다른 언어보다 기능적 언어로 더 나은 결과를 얻는다는 연구 결과도 있습니다.

풍부함 : 언어는 당신이 가르치고 자하는 모든 개념에 대해 충분히 풍부해야합니다. 예를 들어, 고차 함수에 대해 논의하려면 함수가 기능 언어 또는 스칼라와 같이 값이있는 언어가 필요합니다.

확장 성 : 학생들이 자신이 보여주는 것보다 더 많은 언어를 스스로 배우지 못할 가능성이 있습니다. 따라서 선택한 언어가 학습 과정에서 확장되기를 원합니다. 이제 애완 동물 운동을 작성해야하지만 나중에 중간 규모의 프로젝트를 공격 할 수도 있습니다. 자바와 생태계가 비슷한 언어가 여기에 좋은 선택입니다.

도구 지원 : 확장 성과 관련이 있습니다. 학생들이 언어를 사용하여 생산성을 기대하고 싶다면, 좋은 IDE, 빌드 관리자 및 라이브러리가 있어야합니다. 대화식 쉘 (Ruby, Scala)도 특히 초보자에게 좋습니다. 도구는 모든 주요 플랫폼에서도 작동해야합니다.

문서화 : 당신은 아마 실제로 언어를 가르치고 싶지는 않지만 학생들이 당신의 (추상적 인)지도로 스스로를 가르치게합니다. 따라서 좋은 문서가 중요합니다. 논쟁의 여지가 많을수록 언어가 대중적 일수록 문서가 더 좋습니다. 예를 들어, Scala의 문서는 상당히 열악하지만 개선되고 있습니다. Hoogle 과 같은 도구 는 장점입니다.

가용성 : 실제로 Matlab 또는 Visual C ++를 사용하여 가르치는 사람들이 있습니다. 모든 사람에게 필요한 프로그램을 실행할 수있는 라이센스 나 시스템이있는 것은 아닙니다. 다양한 플랫폼에서 실행되는 무료 언어를 선호해야 할 것입니다.

청결 : 당신은 아마도 학생들이 생각하는 방식을 만들고 싶을 것입니다. 언어가 더 지저분하고 생각이 더 지저분 해집니다. 나는 코스에서 PHP를 제안하지 않을 것입니다. 동적 언어는 일반적으로 여기에 단점이 있습니다.

다른 기준보다 귀하에게 더 중요한 기준은 무엇 을 가르치고 싶은가에 달려 있습니다. 이것은 문자 그대로 프로그래밍 과정입니까? 알고리즘과 데이터 구조 과정입니까? 다른 패러다임에서 프로그래밍 언어의 개념을 소개하는 과정입니까? 소프트웨어 개발에 관한 과정입니까?


For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ... 또는 C 또는 Pascal은 둘 다 거의 영원히 함수 포인터를 가지고 있습니다. 실제로이 기준이 실제로 종료하는 유일한 (주류) 언어는 Java입니다.
메이슨 휠러

초보자에게 다른 구문과 기본 개념의 혼란을 가르치려고하는 것은 단지 두뇌 혼란입니다.
vonbrand

6

매혹적인 질문; 객관적인 기준에 중점을두고 있습니다. 신입생이 배우기를 바랍니다.

프로그래밍 개념 : 첫 번째 프로그래밍 언어는 함수 호출, 반복, 재귀를 지원해야합니다.

기본 아이디어 : 첫 번째 프로그래밍 언어는 배열을 지원해야합니다 (메모리가 실제로 어떻게 작동하고 포인터가 어떻게 작동하는지에 대한 간단한 소개의 첫 단계)

실용적인 프로그래밍 기술 : 디버거 사용 방법, 프로파일 러 사용 방법, 큰 문제를 해결하는 방법 (고급 언어), 큰 시스템을 구성하는 방법, 문제를 분해하는 방법 (문제의 분해), 작성을 피하는 방법 복잡한 코드, (암호적인) 일련의 실행 가능한 문장 뒤에 의도 를 인간 에게 전달하는 방법 .

미리 작성된 라이브러리가 sort ()와 같은 것들에 대해 존재한다는 것과 그것을 사용하는 방법, 즉 처음부터 모든 것을 쓸 필요가 없다는 사실.

모국어에 대한 다른 기준 :

해석 됨 (빠른 피드백이 학습 과정에 도움이 됨).

학습, 테스트 및 디버깅을 가속화하는 대화식 환경.

학생들이 해당 언어로 읽을 수있는 고품질 소스 코드

"읽기 쉬운", "자연어에 접근하는 구문"(SourceCode를 더 쉽게 읽고 채점 할 수 있도록)

휴대용 (Mac OS, Windows, Unix에서 실행) 언어의 하나 이상의 자유 소프트웨어 구현.

예를 들어, "[첫 번째 OOPL로서 Java보다는 초급 Python과 Java를 먼저 가르치는 것이 더 빠를 수도 있습니다." - "객체 지향 프로그래밍 언어의 비교"TelescopeRule

Matthias Felleisen은 초보자를 대상으로하는 오류 메시지가 포함 된 프로그래밍 언어를 개발했습니다. 그는 특정 언어 선택이 좋은 디자인 방법론을 가르치는 것만 큼 중요하지 않다는 점을 강조합니다. 실제로, 그는 첫 번째 CS 과정을 비판적 수업으로 비판적 사고, 문제 해결 및 세부 사항에 대한 관심을 가르치고 있습니다.

두 번째 프로그래밍 언어의 기준

우리는 학생들이 배우기를 원하지만 아마도 이것은 두 번째 프로그래밍 언어를 기다릴 수 있습니다.

"너무 난해하지 않은"관련 언어; "업계에서 인기있는"

복잡성 이론 : 현재 기술로는 불가능한 작업을 인식하는 방법.

더 높은 수준의 물건 : 작업에 적합한 도구선택하는 방법, 컴파일러 사용 방법, 구조, 객체 지향 프로그래밍, 기능 프로그래밍, 논리 프로그래밍, 컴파일러 디자인, 함수 구성 및 조작 (Lisp / ML 의미) 동시 및 분산 프로그래밍

저수준 물건 : 포인터 산술, 컴퓨터 아키텍처. 메모리 관리, 스택 프레임, 어셈블리 프로그래밍, 기계 아키텍처, 장치 드라이버 및 운영 체제 설계 (기계는 "침투 할 수없는 무서운 블랙 박스처럼 보이지 않습니다")

편집 : 나는 다른 많은 사람들과 협력하여 "합법적 인 게시물이 아닐 수도 있습니다"라고 쓴 내용의 요약을 게시하는 것이 실망 스러웠습니다.

그래서 나는 이전의 비공식 링크에 공식적인 인용 을 추가하고 공정한 사용 및 기타 위키 저작권 문제 를 준수하려고 합니다.

이 답변은 포틀랜드 패턴 리포지토리에서 Freshman 's First Language (Anon 2011)를 요약 한 것입니다 .

(Anon 2011) 많은 익명의 작가들. "Freshmans First Language". 포틀랜드 패턴 리포지토리. 2011 년 9 월 27 일. http://c2.com/cgi/wiki?FreshmansFirstLanguage .


원본 작성자에게 콘텐츠 재생이 허용되는지 확인 했습니까? 소스는 회사 웹 사이트이며 내용이 무료라는 선언을 찾을 수 없으므로 법적 게시물이 아닐 수 있습니다!
Raphael

1
@Raphael 출처는 위키입니다 (따라서 많은 저자가있을 수 있습니다). 이 자료의 저자 (공저 저자)가 여기에 포함시키지 않으려면 DMCA 게시 중단 통지를 [이 페이지 하단에 나열된 연락처 주소] (mailto : team+cs@stackexchange.com)로 보내야합니다. . 또한이 정보는 저작권의 보호를받지 않으며 정보의 표현 방식에만 적용됩니다. 약간의 리팩토링과 WordsRunTogetherWikiWikiStyle 제거는이 답변을 개선하고 저작권 위반의 위험을 제거합니다.
Gilles 'SO- 악마 그만'

1
+ 좋은 대답이지만 선택해야 할 니트가 하나 있습니다. 그들 뒤에는 이론이 없습니다 – "공통 지식". 일반적으로 학계에서 발견하지 못한 많은 문제가 있으며 다른 기술은 이해하지 못합니다. 이 링크를 확인하십시오.
Mike Dunlavey

5

저는 단순성과 학습 용이성이 주요 기준 중 하나라고 생각합니다. 프로그래밍 입문 과정에서 불필요한 프로그래밍 장애물을 피하고 가능한 한 프로그래밍 원칙과 알고리즘 문제 해결에 중점을 둡니다. 첫해에 학생들은 종종 문제에 대해 알고리즘 적으로 생각할 수있는 능력이 결여되어 있기 때문에이 과정은 알고리즘 사고를 가르치는 것에 관한 것이기도합니다.

또 다른 기준은 업계 언어의 유용성입니다. 우리는 업계에서 사용되지 않는 언어를 가르치고 싶지 않습니다. 대다수의 학생들이 업계에서 일하게 될 것이므로 업계에서 사용되고있는 (그리고 학생들이 졸업 할 때 사용될) 것에 주목해야합니다.

세 번째 기준은 학생들이 나중에 수강 할 과정입니다. 코스, 특히 필수 코스는 자체적으로 설계된 것이 아니라 다른 코스와 함께 설계되었습니다.

내가 지금 생각할 수있는 마지막 것은 jmad의 대답과 동일하며 언어는 다른 중요한 언어를 쉽게 배울 수 있어야합니다. 충분히 풍부해야하며 나중에 중요한 언어를 선택하는 것이 쉬울 것입니다 (여기서 학생들의 관점에서 중요한 수단이 중요 함).

많은 대학들이 종종 다른 언어로 프로그래밍에 대한 소개를 제공 할 수도 있지만 (일반적으로 전기 공학 전공의 경우 C와 같은) 다른 언어로 프로그래밍에 대한 소개를 제공 할 수도 있지만 프로그래밍 과정에 대한 기본 소개를 Java / C ++ / C에서 Python으로 전환했다고 생각합니다. 강사가 다른 언어를 한 번에 가르치는 실험을하고 싶다면 유연성을 보여줄 수 있습니다.


3
입문 프로그래밍 과정에서 업계에서 유용성이 크게 평가되지는 않습니다. 성공한 프로그래머는 아마도 경력 중에 많은 언어를 배워야 할 것입니다. 일부는 "직업 중"이므로 새로운 언어를 배우고 배울 수있는 능력 은 가르쳐야 할 핵심 기술입니다. 결과적으로 나는 대학 과정의 첫 번째 언어가 졸업 할 때 반드시 가장 강할 것으로 기대하지는 않을 것입니다.
Ben

1
@Ben : 학생들이 CS를 전공하지 않을 경우 업계의 유용성이 특히 중요합니다. 많은 사람들이 생물학이나 다른 과학에 대해 공부하고, 많은 언어를 배울 시간이 없다면, 파이썬과 같은 생태계에서 공통적 인 것을 배우는 것이 ML, Java 또는 C보다 유용 할 것입니다.
hugomg

1
산업계의 누군가 (일부 산업계 일 필요는 없음)라고 말하면 미래의 Tier-1 프로그래머에게 산업계의 관련성이 중요한 요소라고 생각하지 않습니다. 여러 패러다임에 노출되면 내 도메인 (임베디드 프로그래밍)에서 대부분 C를 사용하더라도 프로그래머가 더 잘됩니다. 언어의 특정 내용은 수동으로 배울 수 있으며 일반적인 개념은 학교에서 더 잘 가르칩니다. 우발적 인 프로그래머 (예 : 과학자)의 경우 우선 순위가 달라 지지만 Fortran에 너무 집중하면 사람들이 Numpy를 무시할 수 있습니다.
Gilles 'SO- 악의를 멈추십시오

5

Lisp이 옳은 일이기 때문에 SICP 를 통해 프로그래밍을 배워야한다는 것입니다.

언어를 선택하기 위해 이미 제공된 많은 좋은 기준이 있습니다 ... 단순성이식성 이 가장 중요합니다. 그러나 나는 또한 프로그래밍을 처음 접하는 학생들이 현대 언어를 사용하여 무대 뒤에서 무슨 일이 일어나고 있는지에 대해 잘못된 생각을 얻지 못하거나 알지 못하는 것이 중요하다고 생각합니다.

이러한 다른 게시물 중 일부는 훌륭한 기준을 제공했지만 '기준을 충족하는 것'이 어떻게 보이는지 설명하기 위해 특정 언어를 사용하고 싶습니다.

이러한 문제 중 일부는 Joel Spolsky의 블로그 게시물 인 The Perils of JavaSchools에서 다루어졌습니다 . Java 또는 Python과 같은 언어를 선택하면 CS에서 가장 어려운 두 가지 개념 중 하나 이상이 닫힙니다. 즉, 포인터와 재귀.

물론 C에서 인트로 코스를 가르치는 것은 엄청나게 밀도가 높지만 재귀와 관련된 많은 중요한 개념을 놓칠 수도 있습니다. 마찬가지로, 리스프에서 배운 과정은 내부적으로 주소 포인터를해야합니다, 같은 carcdr언어 핸들에게 세부 사항을시키는 동안, 연결된 목록에 관련된 중요한 개념을 의미한다.

기본적으로, 내가 얻는 것은 학생들이 실제 구현뿐만 아니라 데이터 구조와 알고리즘의 기본을 이해해야한다는 것입니다.

나는 또한 객체 지향 언어를 사용 하지 말라는 제안에 동의하지 않는다 . 임피던스 불일치가 분명하고 객체 지향 언어가 많은 패러다임 인 한, 객체 지향 언어를 사용하여 실제 세계를 모델링하는 것은 새로운 프로그래머에게 긍정적 인 자산이라고 생각합니다.

루비 (다른 게시물에서도 가능성이 제 안됨)는 프로그래밍 과정의 입문에 사용할 언어로 찾을 수있는 많은 특성을 보여줄 것을 제안합니다.

나는이 주장을 잠깐 정당화 할 것이다. 그러나 먼저 소개 CS 과정을 방해하는 한 가지 경향에 대해 언급하고 싶다. 저는 많은 학교와 마찬가지로 최근 소개 과정에 Python을 사용하기로 전환 한 대학에서 일하고 있습니다. 필자는 파이썬이 새로운 기본이라고 믿으며 언어의 경향은 최근에 다른 곳에서 논했듯이 힘과 표현력에 대해 새로운 친근감을 선택하는 것 입니다. 이것은 장애이며, 우리는 그들이 현재의 새로운 것이 아니라 그들이 될 프로그래머에 대해 생각할 필요가 있습니다.

어쨌든 루비를 입문 언어로 정당화하는 것은 ...

  • Ruby는 꼬리 호출에 최적화되어 있지는 않지만 재귀를 잘 수행합니다. 그게 있습니다.
  • 루비는 다중 패러다임입니다. 순수한 객체 지향 언어이지만 기능적 프로그래밍뿐만 아니라 명령형 C 파생 훈련 휠을 사용합니다. 이것을 OO에 고정 된 절차 적 언어 인 Python (볼트가 표시되어 있음에도 불구하고)과 일부 기능적 요소 (Python의 BDFL이 반복적으로 소비하려고 시도한 )와 비교하십시오.
  • CRuby (일명 MRI 또는 ​​'Ruby Classic')는 C로 작성되고 확장됩니다. C malloc()에서 언어를 확장하도록 지시함으로써 학생들에게 포인터, 메모리 관리 및 무서운 신 에 대해 가르 칠 수 있습니다 .
  • 높은 수준의 동적 언어라고 생각하더라도 데이터 구조, 유형 등에 대해 많은 것을 가르 칠 수 있습니다. 적갈색의 나무부터 오리 타이핑으로 이상한 일을하는 것에 이르기까지 상상할 수있는 모든 라이브러리 (gems)가 있습니다.

어쨌든, 전문적으로 사용하든 아니든 많은 패러다임에서 많은 언어를 배우는 것에 대한 대안은 없습니다. 기본적으로 C와 Lisp를 사용 하지 않으면 모두 이해해야 한다고 생각합니다 . 루비는 입문 학기 동안 내가 생각할 수있는 최고의 절충안입니다.

어쨌든 ... 그건 내 US $ .02입니다. 나는 당신이 루비를 사용하도록 설득하려고 노력하지 않고 있습니다. 여러분에게 ... 인트로 코스를 가르치기위한 언어로 찾기 위해 훌륭한 특성으로 사용하는 것입니다.


2
"저는 파이썬이 새로운 기본이라고 굳게 믿습니다." "CS에서 더 어렵고 가장 중요한 두 가지 개념, 즉 포인터와 재귀"-포인터를 명시 적으로 다루는 언어를 배우지 못했으며, 결코 놓친 적이 없습니다. 컴파일러가 어떻게 작동하는지 배웠을 때 포인터가 충분히 빨리 설명되어 있습니다.
Raphael

나는 다중 패러다임 언어가 매력이 있다는 데 동의하지만 (2 ~ 3 개의 "순수한"언어를 가르치는 것이 더 나을 수도 있지만) 그런 이유로 루비를 선택하지는 않을 것입니다. 특히 기본 라이브러리와 관련하여 더 나은 작업에 임하는 다른 언어. 예를 들어 스칼라는 불변 컬렉션의 전체 라이브러리를 가지고 있습니다.
Raphael

3
또한 파이썬은 새로운 기본이라고 생각합니다. 그런데 왜 그 인수 인 에 대한 파이썬은?
JeffE

1
@Raphael, 포인터는 C로 시작할 때만 어려워서 너무 많은 것들이 해결되지 않고 배열과 혼동되는 관계가있는 경우 포인터에 노출되도록합니다. 내가 스스로 파스칼을 가르쳤을 때 포인터는 힘들지 않았습니다. Algol 68에서 그들에게 가르쳐 진 우리 반의 사람들에게는 포인터가 어렵지 않았다. C 서브셋을 가르치는 것으로 시작하지 않으면 C ++에서는 포인터가 어렵지 않습니다.
AProgrammer

1
@DaveClarke : 공백을 들여 쓰기 때문에 그보다 더 많은 공간을 차지합니다.
Raphael

5

내 첫 프로그래밍 언어는 장난감 조립 언어였습니다. 두 번째는 포트란이었다. 그 사이에, 나는 대략 Algol 60 인 "알고리즘"표기법을 배웠다. 나는 꽤 괜찮았다. 사실, 제가 배운 것은 거의 완벽하다고 생각합니다.

함수형 프로그래밍을 처음 보았을 때, 구현 된 언어는 아니지만 연구 논문에서 "와우, 이것은 완전히 다릅니다. 상당히 수학적입니다!" 함수형 프로그래밍을 배우는 대부분의 사람들은 여전히 ​​같은 종류의 "wow"경험을 가지고 있습니다. 나는 그것이 훌륭하다고 생각합니다.

명령형 프로그래밍과 함수형 프로그래밍은 세상을 보는 완전히 다른 두 가지 방법이라고 생각합니다. 우리는 학생들에게 다양한 경험을 빼앗아 나가면 장애를 겪을 것입니다.

가장 좋은 첫 번째 프로그래밍 언어는 가능한 한 단순하고 가능한 명확한 언어이어야하며 학생들이 명확하게 생각하는 방법에 집중할 수 있어야합니다. 불행히도, 어셈블리의 단순성과 명확성, Fortran과 Algol 60은 현대의 프로그래밍 언어와 비교할 수 없습니다. 하스켈은 좋은 예외입니다. 그러나 Haskell은 제 1 프로그래밍 언어가 아닌 이상적인 제 2 프로그래밍 언어를 만들 것입니다. 에펠 탑 또는 오베론은 아마도 그 법안에 맞을 수 있습니다.


5

에서 과학 및 수학의 노스 캐롤라이나 학교 , 우리가 능력이 짧은 쓰고 있다고 생각하기 때문에 우리는 절차 적 프로그래밍을 가르치기 위해 사용 2004 년부터 파이썬에 학생을 도입, 정확한 절차는 무거운 도구를 나중에 진행 OO를 포함한 생명이다 프로그램 작성.

우리는 이러한 이유로 그것을 좋아합니다.

  1. 파이썬은 자유 형식 언어가 아닙니다. 들여 쓰기를 사용하여 학생들이 블록으로 코드를 작성하도록합니다. 기술적 인 설명으로 vim 텍스트 편집기를 사용하고 [ set tabstop=4 set et. 우리 학생들은 공백으로 구분 된 프로그램의 계층 구조를 보는 데 익숙합니다. 결과적으로 다른 언어로 프로그래밍 할 때 형식 습관이 매우 좋은 경향이 있습니다.

  2. 파이썬의 문법적 단순성은 초보자에게 친숙합니다. 간단한 프로그램은 최소한의 비전 키워드와 마법의 주문으로 작성 될 수 있습니다. 우리는 보통 프로그래밍을 생각하지 않는 학생들이 그것을 시도하기를 원합니다. 파이썬의 사랑스러운 단순성에 주목하십시오 hello.py. 무슨 일이 일어나고 있는지 분명합니다.

  3. 파이썬은 동적으로 타이핑되고 덕 타이핑됩니다. 이렇게하면 변수를 쉽게 도입 할 수 있습니다. 나는 학생들에게 변수는 단지 레이블이라고 말합니다. 그들은 물건을 가리킨다. 누군가 전화로 전화를 걸어 메시지를 보내는 것처럼 변수 이름을 사용하여 객체에 메시지를 보냅니다.

  4. 파이썬은 야심 찬 학생들이 자라지 않을 도구입니다. 유용한 것들을 호스트하는 정교한 라이브러리가 있습니다. 초보자도 이용할 수있는 강력한 독창적 인 도구입니다.

  5. 파이썬은 무료이며 모든 주요 플랫폼에서 실행됩니다. 우리 학교는 모든 종류의 기계가있는 이기종 OS 환경입니다. 호환성 문제와 같은 두통에 대해 걱정할 필요가 없습니다. 거의 모든 컴퓨터에서 실행됩니다.

  6. 파이썬에는 훌륭한 문서가 있습니다. 우리는 학생들이 선 밖에서 탐구하고, 색을 칠하고, 색을 칠하도록 권장합니다. 그들은 파이썬 문서를 일찍 사용하는 법을 배우고 종종 수업 밖에서 멋진 것들을 탐구합니다.

우리는 파이썬에 매우 만족했습니다.


1
환영! 이것은 훌륭한 사례 연구이지만 선택 기준 인 imho 후에 질문에 대답하는 것은 거의 없습니다. 항목을 거꾸로 읽으면 친절 할 수 있지만 그렇게 의도했는지 확실하지 않습니다.
Raphael

특별한 명령은 없었습니다. "and"입니다.
ncmathsadist

3

나는 언어 (일부 제한 하에서)가 언어로하는 것만 큼 중요하지 않다고 말하고 싶습니다. 대부분의 언어로 소프트웨어 개발, 알고리즘, 객체 지향 프로그래밍, 컴퓨터 하드웨어 등에 대해 배울 수 있습니다. 핵심은 이러한 모든 개념을 활용하는 흥미로운 것을 개발하는 것입니다.

( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ 에서 마이그레이션 된 답변 )


1

TL; DR : 배후 기준에 대한 객관적인 근거가 없기 때문에 객관적으로 대답할 방법이 없습니다. 청색이 객관적으로 빨강보다 "더 나은"색상이거나 바닐라 아이스크림이 객관적으로 초콜릿보다 "맛있는"경우 토론을 시도하는 것만 큼 자의적입니다.


나는 이미 멋진 게시물이 있다고 생각하지만 내 자신의 2 센트를 추가 할 것입니다.

교육자가 첫 해의 대학 프로그래밍 과정의 기초로 사용할 프로그래밍 언어를 선택하기 위해 어떤 객관적인 기준을 사용할 수 있습니까?

이 질문은 아이스크림을 처음 방문 할 때 다른 사람이 먼저 시도해야 할 아이스크림 맛 을 객관적으로 선택할 수 있는 방법이 있는지 묻는 것과 비슷합니다 . 아니요, 본질적으로 주관적인 것을 선택하는 객관적인 방법 은 없습니다 .

왜? 페드로의 대답 에서 언급 된 합리적인 기준을 살펴 보더라도 모든 사람이 다른 사람의 견해에 대해 각 요인이 어떻게 "유지"되는지에 대한 주관적인 견해를 가질 수 있기 때문 입니다.

예를 들어, Ruby가 객관적으로 Python보다 "단순"합니까? 어떤 의미에서 더 간단합니까? 무엇에 관해서? "간단하게"무엇을 의미합니까 당신 ? "더 적은 코드 줄"을 의미합니까? "읽고 이해하기 쉽다"는 뜻입니까? 다른 사람들은 어떻습니까? 왜 여기에서 특정 선택에 동의해야합니까? 나는 우리가 그 질문에 객관적으로 대답 할 수 있다고 생각하지 않습니다 .

이것은 다음 질문으로 이어집니다.

이 기준의 기초는 무엇입니까?

일부 기준이 합리적이라면, 이것이 다른 어떤 것보다 주관적인 선호에 근거한다고 생각합니다 . 예를 들어, 페드로의 단순성 , 모호성 , 이식성산업 선호도 에 대한 페드로의 기준을 수용해야하는 이유는 없습니다 . 실제로 산업 선호 는 정의에 따라 주관적이며 단순히 악순환으로 이어질 것입니다. (모두가 훈련을 받으므로 모든 사람이 업계에서 사용하므로 모든 사람이 훈련을받습니다. ...)

예를 들어 왜

  • 효율성 : 실행 시간과 메모리 공간을 실제로 측정 할 수 있습니다.
  • 크기 : 예약어가 가장 적 으면 언어를 쉽게 배울 수 있습니다.
  • 기능 세트 : 지원되는 다양한 기능 (예 : 람다, 제네릭, 객체 지향, 연산자 오버로드 등)을 사용하면 언어를 전환하지 않고 더 많은 개념을 가르치고 다시 정사각형으로 돌아갈 수 있습니다.
  • 상호 운용성 : 다른 언어 및 기본 시스템 (예 : C # 또는 Python의 Win32 API 등)과 쉽게 작업 할 수있는 언어는 장기적인 투자 향상으로 향상 될 수 있습니다.

요점은 다른 평가 기준을 제시 할 수 있지만 여전히 합리적이라고 생각할 수 있지만, 타인에 비해 객관적으로 우월하다고 주장 할 수는 없다는 것 입니다.

결론적 으로 기준에 대한 객관적인 근거는 없습니다 . 청색이 객관적으로 빨강보다 "더 나은"색상이거나 바닐라 아이스크림이 객관적으로 초콜릿보다 맛이 좋은 경우 토론을 시도하는 것만큼이나 자의적 입니다.

그것은 당신이 당신의 선호를 정당화 할 충분한 이유 를 가질 수 없다고 말하는 것이 아니라, 하루가 끝날 때, 그들은 단지 당신의 선호입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.