it-swarm-ko.tech

왜 학교에서 이런 것들을 가르치지 않습니까?

여름 동안 저는 Google Summer of Code에 들어갈 수있을만큼 운이 좋았습니다. 나는 많은 것을 배웠습니다 (아마도 모든 대학 교과 과정에서 배운 것보다 더 많은 것). 나는 그들이 왜 학교에서 빨리 배운 것들을 가르치지 않는지 정말 궁금합니다. 몇 가지 예를 들면 다음과 같습니다.

  • 단위 테스트
  • 버전 관리
  • 민첩한 개발

데이터 구조 및 알고리즘과 같은 다른 것을 가르치는 데 많은 시간을 소비하는 것으로 보입니다. 나는 아직도 이것들이 조기에 배우는 것이 매우 중요하다고 생각하지만, 왜 그들보다이 세 가지를 더 많이 가르치지 않습니까? 아니면 이런 것들을 많이 가르치지 않는 학교일까요?

내가 틀리지 말아라, 나는 대학이 항상 최신 유행의 유행을 가르치는 것이 바람직하지 않다고 생각하지만, 교수가 "코딩을 시작하기 전에 다이어그램을 그리는 것"이외의 다른 것을 가르쳐서는 안된다.

118
Jason Baker

귀하의 질문에 대한 가장 간단한 답변은 컴퓨터 과학 및 소프트웨어 개발 분야가 매우 새롭고 잘 이해되지 않는다는 것입니다. 모든 과학 및 공학 분야가 현대에서 더 빠르게 발전하고 있지만 다른 분야에서는 더 많은 경험을 쌓을 수 있으며 작동 방식에 대한 이해가 훨씬 넓습니다.

예를 들어, 최근 재료 과학의 발전에도 불구하고 토목 기술자는 약 2000 년 동안 쓰러지지 않는 아치를 만드는 방법을 알고 있으며, 이것은 비교적 논쟁이 적은 대학에서 가르치고 배울 수있는 것입니다. 소프트웨어 개발자가 배워야 할 기술에 대해서는 전적으로 귀하에게 동의하지만, 본 계약은 개인적인 경험과 비공식 추론에 근거합니다. 사회적으로 인정되는 "모범 사례"가 되려면 수집 비용이 매우 많이 드는 정량적 데이터가 필요합니다. 버전 관리가 얼마나 도움이됩니까? 어떻게 도움이 되나요? 단위 테스트? 우리는 다양한 기술의 효과에 대해 추론 할 수 있지만 실제로 그 효과를 결정적으로 증명하는 것은 매우 비쌀 것입니다. 우리는 서로 다른 기술을 사용하여 동등한 전문 지식을 가진 프로그래머 그룹과 함께 완전하고 현실적인 소프트웨어 프로젝트를 처음부터 끝까지 여러 번 실행해야합니다. 최소한 기존 프로젝트에 대해 발표하지 않으려는 기존 프로젝트에 대한 많은 데이터가 필요합니다.

토목 기사들은 수많은 정보와 함께 수천 년의 다리를 볼 수 있습니다. 반면, 소프트웨어 개발자는 수십 년에 불과한 정보를 보유하고 있으며, 대부분은 비밀로 유지됩니다. 조직이 개발자의 효율성에 대한 정보를 수집하고 게시하더라도 가장 효과적으로 수집하고 게시 할 동기는 거의 없기 때문입니다. '티).

필드가 혼동되기도합니다. 소프트웨어 개발 또는 소프트웨어 "엔지니어링"은 실제로 컴퓨터 과학과는 다릅니다. 소프트웨어 개발자는 컴퓨터 과학에 대한 실무 지식이 필요하지만 알고리즘 복잡성의 경계에서 작업하거나 병렬 처리에 대한 추론은 실제 프로그래머가 매일하는 일이 아닙니다. 마찬가지로, 실제 "컴퓨터 과학자"는 작동하지 않거나 흥미로운 작업을 수행하지 않는 수많은 버리기 코드를 작성하며 실제 소프트웨어 제품이 제공하는 엄밀한 이점을 얻지 못할 것입니다.

인터넷과 오픈 소스 커뮤니티의 등장으로 이러한 질문에 대한 답을 결정적으로 내릴 수있는 충분한 데이터가 제공 될 수 있지만, 내일 답변이 제공 될지라도 모든 사람이 무엇에 동의하는지에 대해 국제 사회에 침투하는 데 100 년이 걸릴 것입니다. 학교에서 가르쳐야합니다.

마지막으로 몇 가지 경제적 고려 사항이 있습니다. 소프트웨어 개발에 참여하는 거의 모든 사람들이 원하는 개발 도구를 실행하기 위해 전용 기계에 저렴하고 쉽게 액세스 할 수 있었기 때문에 비교적 짧은 시간이었습니다. 수십 년 전, 테스트를 실행하거나 무한한 소스 코드 히스토리를 저장하기 위해 기계를 완전히 헌신하는 것은 많은 사람들에게 엄청난 비용이 들었을 것입니다.

187
Glyph

우리 선생님들은 :

  1. 단위 테스트를 시도하지 마십시오.
  2. 버전 관리를 사용하는 방법을 모른다
  3. "민첩한 개발"에 대해 들어 본 적이 없습니다.

학생들은 스스로 문제를 해결해야합니다. 우리는 그렇게했고, 우리는 그렇게하지 않았습니까?

42
mislav

Leonardo da Vinci는 다음과 같이 썼습니다.

과학이없는 연습에 매료 된 사람들은 방향 타나 나침반없이 배를 타고 가고 어디로 가는지 확신 할 수없는 조종사와 같습니다. 실습은 항상 이론에 대한 건전한 지식을 바탕으로해야합니다.

좋은 학교는 이론 (데이터 구조, 알고리즘 등)과 실습 (단위 테스트, 버전 관리 등)을 모두 가르칩니다. 이를 위해서는이 동전의 양면을 제대로 가르 칠 수 있도록 적절한 교수진 조합이 필요합니다. 실제 경험이없는 이론적 유형으로 구성된 교수진은 그렇지 않습니다. 마찬가지로 전적으로 실무자로 구성된 교수진은 그렇지 않습니다. 당신은 혼합이 필요하고 좋은 학교가 있습니다.

42
Alan

컴퓨터 과학은 항상 다소 모순되었습니다. 컴퓨터에 관한 부분은 과학이 아니며, 과학에 관한 부분은 컴퓨터에 관한 것이 아닙니다.

대학은 '과학'의 끝 (알고리즘, 데이터 구조, 컴파일러 등)에 더 의존하는 경향이 있습니다. 왜냐하면 이러한 것들이 해마다 진화하고 변화하는 경향이있는 현재 업계 모범 사례보다 훨씬 '영원한'것이기 때문입니다. 예를 들어 Version Control은 지난 5 년에서 10 년 사이에 놀라운 변화를 겪었지만 big-O는 여전히 큰 O이며, 해싱, btree 및 재귀는 여전히 40 년 전만큼 유용합니다. 그들의 아이디어는 일반적으로 충분한 기초를 제공하여 git와 같은 도구를 선택하고 기본 데이터 구조가 SHA-1 해시의 비순환 지향 그래프이며 개발자가 열심히 일했다는 것을 알 때 의미를 이해하는 것입니다 io-bound되도록 syscall 수를 최적화합니다.

이제 마지막 문장을 이해하기 위해 알아야 할 모든 것을 어디서 배웠는지 생각해보십시오. 답이 '대학'이라면 괜찮은 일을하고 있습니다.

40
pjz

모든 것이 지나가는 유행입니다. 대학에 다니는 첫 해보다 대학에서 첫 해에 더 많은 것을 배우게됩니다. 컴퓨터 과학은 컴퓨터와 아무 관련이 없습니다.

College는 도구로 가득 찬 도구 상자를 제공합니다. 이 드라이버는 초승달 모양의 렌치입니다. 당신은 대학에서 한 번 각 도구를 사용할 수 있습니다. 당신이 현실 세계에 들어갈 때가 당신이 가진 것을 정말로 찾을 때입니다. 당신은 나머지를 위해 유용한 것들을 분류합니다. 당신이 원하는 경우를 대비하여 작업대에서 집에두고 싶은 것들과 매일 주머니에 넣는 것들을 정리하십시오.

Tqm, Iso, Cmm, Agile 등. 이들은 모두 사라질 것이며 사라질 것입니다. 성공적인 것들은 상식 이상의 것이 아닙니다. 모든 성공적인 엔지니어와 회사는 상식의 풍미를 사용합니다. 그것이 성공을 거두었으므로 그 이름을 거의 필요로하지 않았습니다. 문제는 상식을 팔 수 없다는 것입니다. 관리자는 눈에 띄지 않는 이름없이 상식을 훈련하고 구매함으로써 회사에 가치를 입증 할 수 없습니다. 뉴스 기사 나 잡지에서 상사들이 읽은 이름을 적어두고 관리자는 직무를 유지하고 당신은 자신의 일을 유지합니다. 이러한 관행을 따른다고 주장하는 회사는 거의 없습니다. 대부분 컨설턴트에게 수표를 쓰고, 클럽에 연례 및/또는 평생 증명서를 받으면 웹 사이트에 그래픽이나 제품 상자에 라벨을 붙일 수 있습니다. 많은 사람들은 이것이 드문 것이라고 주장합니다 ... 거기에 있었고, 그것을 보았습니다. 이것은 사업의 모든 부분이며, 때로는 수익성을 유지하고 문을 열어 놓고 조명을 켜려면 모서리를 잘라야합니다. 이 모든 관행에 대한 하드 코어 추종자들은 모두 마지막 것이 유행이라고 말했고, 마지막 것은 사라졌고, 마지막 것은 너무 비싸서이 것이 아니 었습니다. 마지막은 당신이 컨설턴트를 고용 한 가짜 였어요. 이건 진짜입니다. 프로그래밍 언어와 마찬가지로 이것도 진화 할 것입니다.

비즈니스 현실, 대학 시스템 및 그 역할에 대한 이해 능력이 핵심입니다. 인생의 어떤 것과 마찬가지로 전투를 선택하십시오. 대학이나 사업체, 정부 또는 다른 사람의 직업이 당신에게 필요하거나 알고 싶어하는 것을 가르치는 것은 아닙니다. 번호 하나를 찾는 것이 당신의 일입니다. 마찬가지로 당신은 당신에게 이것을 할 시간을 제공한다고 다른 사람을 비난 할 수 없습니다. 당신은 말에서 떨어지고, 당신은 희생자가 아니며, 일어나서 다시 변명하지 않으며, 삶은 그것에 공평하지 않습니다. 유인물을 이용하고 독립적 인 척하지 마십시오. 그리고 회비를 지불하고 회사에 유인물을 말리지 말고 대가로 무엇이든 (당시에 최고입니까?)주지 마십시오.

사람들이 왜 CMM 또는 민첩한 또는 다른 것 중 하나가 유행이라고 생각합니까? 왜 그들이 그렇지 않다고 생각합니까? 교수는 왜 그렇게 프로그램을 가르쳤습니까? 고 토스를 피하거나 상수를 피하거나 이것을 피하기 위해? 더 안정적인 코드를 생성하기 때문입니까? 더 나은 성능의 코드? 인적 오류를 줄입니까? 아니면 논문/프로그램의 등급을 매기는 것이 더 쉬워서 연구에 더 많은 시간을 할애하고 있습니까? 프로그래밍 방법을 모르고 주제에 대해 다른 사람의 책을 따르기 때문입니까? 유지 관리 가능하고 신뢰할 수있는 고성능 코드를 가질 수 없다고 가르쳤습니까? "두 가지 중 하나를 선택"해도 유지 보수가 안정적이고 고성능을 방해 할 수 없습니까? 때로는 성능의 안정성을 희생합니다. 때로는 신뢰성이나 성능에 신경 쓰지 않고, 또 다른 회계 소프트웨어 프로그램의 버전 117.34.2에서 버전 118.0.0으로 가져 가려고합니다. 귀하의 비즈니스 모델은 버전 업그레이드 및 기술 지원을 판매하는 것입니다. 소프트웨어 개발자는 모든 이전 로봇이 동일한 방식으로 동일한 코드를 작성할 수 있습니다. 타 버린 것을 새 것으로 교체하고 업그레이드 판매를 계속하십시오.

이 질문들에 대한 보편적 인 대답은 없습니다. 당신은 당신의 의견이 무엇인지 알아 내고 함께 살아가고 방어해야합니다. 당신의 마음을 바꾸고, 함께 살고, 변호하십시오.

모든 것에 의문을 제기하십시오 ... 난로의 냄비를 만지면 정말 화상을 입을 수 있습니까? 두려워하는 심리적 효과는 화상을 입는 것보다 더 많은 피해를 입히는가? 다 치지 않고 답변을 테스트하는 안전한 방법이 있습니까?

내가 그것을 감당할 수있을 때 나는 기숙사 방에서 트랜지스터, 캡, 저항 등을 사서 결국 녹일 것이다. 첫 번째 트랜지스터 클래스 이후 하루에 앰프를 제작하는 것보다 스테레오 앰프를 구입하는 것이 훨씬 저렴하고 쉽습니다. 물론 리누스는 운영 체제를 쓰는 것보다 운영 체제를 사는 것이 더 쉽다는 것을 제외하고는 ... 그 당시에 배운 내용이 리누스가 배운 것과 다를지라도 더 많은 일을 할 수 있습니다.

대학 내부와 외부의 세계는 문제를 해결하기 위해 이러한 공식 (cmm, agile 등)을 채택 할 것이며 다음 문제가 나오면 빨리 떨어 뜨릴 것입니다. 당신은 성공하기 위해 버전 관리를 사용할 필요가 없습니다.없이 성공했을 때와 마찬가지로 많은 성공이 있습니다 (실제로 업계의 시대 때문에 지금까지 버전 제어없이 많은 성공이있었습니다). 마찬가지로 최소한의 테스트만으로도 성공할 수 있습니다 (컴퓨터 업계에서 실제로 큰 이름을 예로 들어보십시오). 자신의 코드를 테스트하면 성공할 수 있으며 자신의 코드를 테스트해서는 안된다는 규칙을 따르면 성공할 수 있습니다. emacs를 사용하면 성공할 수 있고 vi를 사용하면 성공할 수 있습니다. 어떤 믹스가 효과가 있는지 결정해야하며 운이 좋으면 자신에게 맞는 직장을 찾으십시오. 시간이 지남에 따라 도구에서 언어, 프로그래밍 스타일, 두려움, 버전 관리, 문서화 등으로 변화 할 것입니다. 결혼을하고 자녀를 키우고 대기업의 모퉁이에 숨어 있기를 원할 것입니다. 지루한 직장에 건강 보험 패키지를 제공하고 소규모 스타트 업에서 핫샷 프로그래머가 아닌 자녀를 즐기십시오.

대학을 빠져 나와 현실 세계에 들어 서면 "오래된 타이머"에 귀를 기울여 작업하고 논쟁하십시오. 그들은 수십 년에서 수백 년의 결합 된 경험을 가지고 있으며, 함정을 피하고 스스로 테스트 할 수있는 함정을 가지고 있습니다 (뜨거운 냄비를 만지지 않아도 화상을 입을 수 있음을 알 수 있습니다). 대부분의 사람들은 이러한 유행 중 적어도 하나 또는 두 가지가오고가는 것을 보았을 것입니다. 사물을 테스트하는 여러 가지 방법과오고가는 테스트 스타일의 이름을 알고 있습니다. 작동하는 것, 그렇지 않은 것 위험이있는 곳과 접선에 시간을 낭비하지 않는 방법. 당신이 성숙하고 오래된 타이머가되면 앞으로 전달하십시오. 당신을 따르는 사람들을 가르치면서 배운 것을 지불하십시오. 그들에게 물고기를 가르치는 방법을 가르쳐주십시오. 때로는 성공하기 전에 실패하도록해야합니다. 너무 심하게 화상을 입지 않도록하십시오.

내가 여기서 정말로 말하고 싶은 것은 지금 우리가 평행 우주의 진화를 목격 할 수있는 희소 한 상황에 있다는 것입니다. 컴퓨터 과학은 물리학에 비해 젊은 과학입니다. 그러나 동시에 여러 번 진화했습니다. 어디서 일하고 누구와 함께 일 하느냐에 따라 하드웨어 엔지니어를 관찰 할 수 있습니다. 하드웨어 세계에서 프로그래밍 언어는 확실히 새로운 것은 아니지만 소프트웨어 세계만큼 빠르게 발전하지는 않았습니다. 소프트웨어는 수십 년 전에 시작되었습니다. 하드웨어는 항상 소프트웨어 엔지니어를 2 등 시민으로 생각했습니다. 우리의 일은 쉬우 며 그들의 일은 어렵습니다. (참고로 저는 실제로 하드웨어 및 소프트웨어 엔지니어입니다). 흥미로운 점은 지금 우리가 초등 또는 영아 문제를 고려할 것을 여전히 다루고 있다는 것입니다. 버전 제어를 사용해야하는 이유는이 칩에서 유일한 사람입니다. gcc 또는 다른 저렴한 컴파일러 또는 무료 IDE에 대한 귀하의 경험은 내가 사용하는 데 가치가 있다고 생각하거나 사용 방법을 알면 사본을 구입할 것입니다. 그리고 다른 변명들의 긴 목록. 나는 vhdl과 verilog를 배우고 일주일 이내에 하드웨어 엔지니어가 거의 감히했던 일로 생산성이 높아지는 것을 즐겼습니다 (전기 엔지니어는 내 직책은 소프트웨어 엔지니어라고 말하지만 졸업장). 이 언어를 배우고 싶었습니다. 도구를 사용할 수 있었을 때 나는 사무실에 밤새 머물면서 자신을 가르쳤습니다. 그 시점에서 엔지니어는 특히 내가 말한 것이 사실이고 언어는 구문이며 프로그래밍 기초는 동일하며 도구는 모두 같은 것을 수행한다는 것을 깨달았습니다. 사과와 사과가 아닌 사과와 사과.

일반적으로이 두 가지 병렬 산업 중 하나가 다른 언어보다 프로그래밍 언어, 프로그래밍 습관, 소스 제어, 테스트, 도구, 프로그래밍 환경 등에서 더 많은 경험을 가지고 있다는 메시지를 보내는 것은 여전히 ​​어렵습니다. 내가 해결하려고하는 문제는 하드웨어 디자인을 개발할 때 가져 와서 프로세서의 시뮬레이션 (가상 머신)과 연결할 수있는 저렴한 기능 시뮬레이터를 생성하여 하드웨어 테스트를 시작하고 테스트를 개발하는 것입니다. 실리콘에 오기 오래 전에 제공 가능한 소프트웨어. 이것에 대해 "새로운"것은 없지만, 우리는 최신 코드를 얻고, 코드의 변화를 추적하여 시간을 어디에 집중해야 하는지를 알 수있는 메커니즘이 없습니다. 하드웨어에 대한 사용자 (프로그래밍) 인터페이스를 정의하는 문서를 추적하는 메커니즘이 없습니다. 하나의 황금 사본은 누군가의 전자 메일받은 편지함에 바이너리 형식으로 있으며 변경 사항을 읽을 때 Verilog를 읽을 필요가없는 경우에만 변경됩니다. 잠깐만, 그 verilog는 몇 살입니까? 내가 일주일 내내 보낸 버그는 3 주 전에 알아 낸 것입니까? 하드웨어 담당자가 작업을 마치고 벽에 넘길 때까지 기다리는 6 개월 동안 휴가 장소와 파티에 가거나 참을성 있고 낙관적이며 그들에게 업무를 수행하고, 업무를 백업하고, 동료 검토를 위해 자료를 공유 할 수 있도록하는 방해가되지 않는 상식적인 방법이 있습니다 ...

하드웨어 엔지니어들은 당신과 마찬가지로 반짝이는 새로운 도구 상자를 가지고 대학을 떠났습니다. 당신은 당신이 하나만 사용할 수있는 17 가지의 다른 프로그래밍 언어를 배웠고, 당신의 커리어에서 나머지 언어는 대학을 떠난 후에 발명 될 것입니다. 그들이 대학을 떠났을 때 그들은 각 원소에 얼마나 많은 전자가 있는지 계산하고 상대성 이론에 대해 알고 가우시안 표면 주위의 전하를 계산할 수 있습니다. 그러나 그들의 경력의 대부분은 1, 0, 또는 아닙니다 (우리는 공통점이 있습니다. 하드웨어, 소프트웨어 엔지니어가 아닌 컴퓨터, 1, 0 및/또는 컴퓨터에 대해 실제로 알아야 할 모든 것). 물리학, 미적분학, 전자의 기본 법칙에 따르면 전자는 프로그래밍 언어만큼 빠르게 변하지 않을 것입니다. 그러나 프로그래밍의 기본은 모든 언어에서 동일하며 앞으로도 계속 될 것입니다. 대학에 그 사실을 알고 있었습니까? 아니면 Java이 C++보다 다르고 더 좋았습니다.)

다른 사업과 마찬가지로 대학의 직업은 수익성을 유지하는 것입니다. 그들은 올바른 학생과 올바른 연구비, 그리고 대학의 수익성을 높이기위한 올바른 종류의 연구를 모두 제공하기 위해 올바른 학계를 고용해야합니다. 그들은 올바른 학생들을 데려오고 올바른 졸업생을 배출 할 수있는 올바른 수업을 제공해야합니다. 그래야 수십 년간 대학 근처의 고용주가지나 감에 따라이 대학이 생산적이고 수익성있는 직원을 생산할 수 있다는 것을 알게 될 것입니다. (예, 때로는 적절한 스포츠 시간에 적절한 선수를 유치하여 적절한 시간의 TV 시간과 적절한 이름의 인식 및 스포츠 수익을 얻으십시오). 일부 대학에서는 C++ 및 Java를 가르치고 일부 대학에서는 절대 가르치지 않을 것입니다. 어떤 사람들은 CMM을 발명 할 것이고 어떤 사람들은 애자일을 가르 칠 것이고 어떤 사람들은 그렇지 않을 것입니다. 대학에 가치가 있다면 배울 점이 있습니다. 그들은 당신에게 배울 모든 것을 가르쳐주지는 않지만 유용한 것을 가질 것입니다. 당신이 거기있는 동안 무언가를, 도구 상자에 합리적인 수의 다양한 형태의 도구를 모으십시오. 대학을 떠나 직장을 구하십시오. 당신의 도구 상자가 짜증 나면 다른 대학을 찾아서 처음 언급하지 마십시오. 그것이 괜찮은 도구 상자라면 그 도구를 사용하여 자신의 시간에 새로운 도구를 만드십시오. 아주 좋은 도구 상자라면, 그 대학과 당신이 배운 것들과 그로부터 얻은 좋은 학문에 대해 좋은 것을 말하고 그들이 준 것에 대해 학교에 갚아주십시오. 유니버설 대학 도구 카탈로그에서 가능한 모든 도구를 얻지는 못했지만 특정 하위 세트로 이동합니다. 졸업하지 않아도 ...

12
dwelch

오리건 공과 대학 (Oregon Institute of Technology)에서 보조 교사 였을 때 이런 것들을 가르쳤다. 그들은 드물게 배웁니다.

12
Scott Hanselman

오 신 이시여

나는 유명한 대학의 cs 학장에게 객체 지향 프로그래밍이 단지 'fad'라고 말 했으므로 C++과 같은 환상적인 것을 전달하는 클래스를 제공하지 않았습니다.

그들이 왜 이런 것들을 가르치지 않는지에 관해서는, 대학은 당신에게 업계의 모범 사례가 아닌 징계의 기초를 가르치기 위해 있습니다.

11
Steven A. Lowe

가장 간단한 대답은 컴퓨터 과학을 공부하고 있으며 나열된 것들이 실제로 컴퓨터 과학의 학문 분야와 관련이 없다는 것입니다. 소프트웨어 개발은 ​​컴퓨터 과학과 관련하여 do 할 수있는 것, 배운 것의 블록을 기반으로하는 것입니다. 그러나 컴퓨터 과학과 소프트웨어 개발은 같은 것이 아닙니다.

버전 관리를 가르치거나 효과적인 단위 테스트를 작성하는 방법을 가르치는 클래스 ... 무역 , 즉 (좋은) 소프트웨어 개발 .

10
matt b

대학이 가진 것은 실제로 보편적 인 것을 가르쳐야한다는 것입니다. 민첩한 개발과 같은 것은 여전히 ​​새로운 것입니다. 인터넷에서 그것이 얼마나 많이 이야기 되더라도 어디서나 사용되지는 않으므로 전체 클래스의 학생들에게 가르치는 것은 민첩한 상점에 ​​착륙 한 소수의 사람들에게만 이익이 될 것입니다.

그러나 버전 관리는 요즘 변명 할 수없는 일입니다. 모든 사람들이 컴파일러만큼 유용하고 CVS는 약 20 년 이상 사용되어 온 도구라는 것을 모든 사람들이 이해해야하는 것입니다. 적어도 개념은 대학을 떠나는 프로그래머가 이해해야합니다. 다행히도 대학에서 그룹 작업을하는 경우 버전 관리에 대해 이미 알고 있고 그룹에서 사용하도록 설득하는 사람과 착륙 할 수있을만큼 운이 좋을 수 있습니다. 나는 그 사람이 내 그룹에 있다는 것이 기쁘다는 것을 안다.

단위 테스트도 변명 할 수없는 수준입니다. 내가 말하고 싶은 유일한 것은 책이 여전히 테스트 중심 개발에 관한 것이고 100 % 코드 적용 범위로가는 것은 때때로 가치보다 더 어려울 수 있다는 것입니다. 그러나 단위 테스트는 매우 가치가 있으며 소프트웨어 엔지니어링 과정에서 다루어야합니다. 이 것들 중 일부가 일부 대학에 들어가고 있지만 아직 모든 대학에 도달하지는 않았다고 생각합니다.

8
William

실제로는 어떻습니까? CS 학위를받는 경험은 거의 같습니다. 그 이유는 프로그래밍을 가르치는 사람들이 내가 알 수있는 한 프로그래밍하지 않기 때문입니다. 인정을 위해 물건을 가르치는 것은 필요하지 않으며, 교사는 그것에 익숙하지 않으며, 학생들은 수업 과정의 일부로 중요한 프로젝트를 개발하지 않습니다. CS 이론이나 Java 구문을 가르치는 것과는 달리 실제로 프로그래밍을 가르치는 동기는 없습니다.

6
Allen

대학에 따라 다릅니다. 2003 년 호주의 한 학부에서 졸업했습니다. 그 당시 우리는 Z, 알고리즘 및 데이터 구조, 운영 체제 등과 같은 모든 공식적인 것들과 함께 UML, 단위 테스트, XP (및 기타 민첩한 방법론))을 배웠습니다.

그들은 단위 테스트에 대해 자세히 다루지 않았으며 한 강의를 위해 서비스를 통과하여 지불했습니다. 단순히 "단위 테스트 란 무엇입니까"보다는 효과적인 단위 테스트를 작성하는 방법을 배운 것이 좋았을 것입니다.

버전 관리에 관한 한, 우리는 2 년부터 프로그래밍 프로젝트에서이를 사용하고있었습니다 (CVS).

나도 글리프의 말에 강력하게 동의합니다. CS는 지난 50 년 동안의 미숙 한 분야로, 우리가 무엇을 배워야하는지, 그리고 지나가는 유행은 무엇인지 모릅니다. 150 년을 주면 상황이 더 악화 될 수 있습니다. 실패한 실제 프로젝트의 수는 이것이 미성숙 한 산업임을 분명히합니다. 건축 프로젝트의 80 %가 실패했다고 상상해보십시오!

6
Rob Gray

컴퓨터 과학자들은 그들이 엔지니어가 아니라 수학 자라고 생각하기 때문에 공학 부분보다 수학 부분을 가르치는 것을 선호합니다. 테스트, 버전 제어 및 문서화는 다른 엔지니어링 분야보다 더 이상 유행하지 않습니다.

5
Martin Beckett

이 모든 것은 소프트웨어 개발 관행에 대해 단일 클래스에서 쉽게 (얕게) 다룰 수 있습니다. 그것은 CS에 관한 것이 아니기 때문에 대부분의 CS 커리큘럼의 일부는 아닙니다.하지만 그 내용에 대해 다루는 것이 유용하다고 생각합니다. 우리 학교에는 그런 수업이있었습니다. 버전 관리는 다루지 않았지만 UML, 요구 사항 수집, 개발 방법론 (다양한 민첩 및 폭포), 단위 테스트, 통합 테스트 등을 다루었으며 프로젝트를 개발하기 위해 4-5 명의 팀에서 작업해야했습니다. (Java에서 다소 간단한 Clue rip-off). 추가 소프트웨어 엔지니어링 수업이 필요하다고 생각되면 선택 과목으로 제공됩니다.

내가 선택한 수업에서 버전 관리를 한 번도 언급하지는 않았지만 대부분의 친구는 개인 프로젝트, 수업 과제 등을 위해 그것을 사용하지 않았으므로 마치 노출되지 않은 것처럼 보이지 않습니다. 스스로 집어 들지 않은 사람들은 팀 배정 과정에서 급우가 그것을 사용하도록 강요당했습니다.

대학은 개념과 이론을 가르치기위한 것입니다. 왜냐하면 그것들은 스스로 선택하기 어렵 기 때문입니다. 버전 관리는 도구이며, 매우 쉽게 선택할 수 있습니다. 조금 사용하고 웹에서 튜토리얼을 읽으면 모든 준비가 완료됩니다. SVN에서 무언가를 확인하는 방법을 알아 내기 위해 강의와 숙제가 필요하다면 실제로 어려운 일에 많은 어려움을 겪을 것입니다.

대학 밖에서 수업 이외의 것들을 배울 수있는 방법이 많이 있음을 기억하십시오. 그것을 활용하십시오. 수업에 참석하고 시설을 사용하기 위해 많은 비용을 지불하고 있으므로 가치가있는 모든 것에 우유를 바르고 LUG 및 ACM 회의에 참석하거나 프로젝트 팀에 참여하거나 (프로그래머가 필요한 로봇을 구축하는 일부 ME가 항상 있습니다) 인문학과 서버를 관리하는 직무. 재료 공학 건물의 로딩 도크에서 컴퓨터를 선택하고 빠른 기숙사 인터넷 연결로 Linux iso를 다운로드 한 후 놀아보십시오.

4
Adam Jaskiewicz

당신은 3이라고 이름을지었습니다. 그 중 일부는 컴퓨터 시스템 (예 : 버전 제어)을 이해하는 데 거의 중요하지 않다고 생각합니다. 이것들은 직업의 일부이며, 당신은 그것을 알 필요없이 훌륭한 프로그래머/컴퓨터 과학자가 될 수 있습니다.

단위 테스트와 유사하게 왜 단위 테스트를 선택해야합니까? 사용성 테스트, 시스템 테스트, 사용자 승인 테스트 및 공장 승인 테스트가 더 중요합니까? 코드가 유지 보수 부서에 배송되면 작업이 완료된 것으로 간주하지 않는 한 :)

제가 매일 사용하는 다른 개념을 생각해보십시오. 소프트웨어와 컴퓨터 시스템의 기본 원리를 익히는 학생에게는 거의 쓸모가 없습니다.

  • 좋은 주석 달기
  • 표준 준수 (국제 표준뿐만 아니라 팀 코딩 표준)
  • 선적 서류 비치
  • 변경 제어 (차이를 저장하는 버전 제어와 반드시 같을 필요는 없으며, 무엇을 왜 변경했는지에 대한 자세한 내용)
  • 유용성 개발

위의 내용은 좋은 코드를 작성하기 위해 필수가 아닌 "소프트 스킬"입니다.

그러나 데이터 구조 및 알고리즘과 같은 "하드"기술이 누락 된 경우 좋은 코드를 작성할 가능성이 거의 없습니다.

3
gbjbaanb

문제는 대학이 당신에게 전문가가되기 위해 가르 칠 필요가 없다고 느끼는 대신 프로그래밍의 학문적 측면에 집중한다는 것입니다. 나는 업계에서도 사용되는 최신 방법과 기술에 대해 언급해야한다고 생각했을 것입니다. 이러한 것들도 학문적으로 관심이 있기 때문입니다.

이 과정에서 개인 소프트웨어 프로세스를 배웠습니다. 개인 소프트웨어 프로세스는 프로젝트에 소요 된 시간을 기록하고, 주석을 달아주는 등 버전 관리와 같은 전문적인 기본 사항은 언급하지 않았습니다.

3
Deeksy

민첩한 개발을 제외하고 신입생 한 해를 배웠습니다.

올바른 학교를 선택하는 것이 중요합니다. IMHO. 톱 10에 가면 모든 것을 빨리 배울 수 있습니다.

CS 교육에 관한 한, 우리는 기본적으로 교수들에게 (많은 풍미, 데이터 구조, 런타임 효율성, 실제로 비트 레벨에서 작동하는 방식의 언어)를 가르쳐달라고 요청하고 있습니다. 소프트웨어 엔지니어링에 대해 더 배우기 위해 왜 아이들이 스스로 질문을하지 않습니까?

2
Alex Gartrell

데이터 구조와 알고리즘이 컴퓨팅의 핵심을 구성하므로 훨씬 더 중요하기 때문입니다. 단위 테스트, 버전 관리 및 민첩한 방법론은 거래의 도구 일뿐입니다 (필요한 경우 작업에서 선택해야합니다).

2
CaptainHastings

나는 대학의 모든 것을 배웠다. 아마도 선택한 과정에 따라 다릅니 까? 저의 과정은 매우 다양했습니다 (소프트웨어 디자인, UI 디자인, 전자 상거래, AI, 기능 프로그래밍 등). 소프트웨어 디자인은 디자인 패턴과 단위 테스트 (다양한 것을 포함하는 하나의 큰 프로젝트)에 노출되었습니다. UI 디자인 ... 우리는 프로젝트를 수행하는 3 인 그룹입니다. 버전 관리 없이는 아무것도 할 수 없었습니다. 민첩한 개발은 우리 교수들이 지속적으로 말한 내용이지만, 각 그룹에 맡겨서 사용했습니다.

많은 대학생들이 "쉬운"과정이나 높은 GPA를 줄 수있는 과정을 수강 한 것으로 나타났습니다. 다른 사람들은 배우고 자하는 것에 초점을 맞추고 어떤 분야에 관심이 있는지를 찾기 위해 주로 탐구하고 있습니다. 그리고 그들이 관심있는 것을 정확히 아는 사람들이 있습니다 ... 그들은 코스를 다양 화하지 않는 것을 제외하고는 좋습니다.

2
Swati

학생들과 마찬가지로 각 대학은 다릅니다. 일부 대학 또는 더 정확하게는 일부 교수는 변화에 저항력이 있거나 게으르다. 다행히도 대부분은 그렇지 않습니다. 이론, 개념, 역사 등은 모든 CS 커리큘럼에 중요하고 중요합니다. 그러나 학생들의 작업 환경을 준비하고 있습니다. 당연히 우리 지역의 커뮤니티 칼리지가 최신의 해당 CS 과정을 제공합니다. 크고 유명한 대학은 그리 많지 않습니다.

2
Matthew Sposato

그들은 대부분의 학교가 교역이 아니라 학문이기 때문에 그러한 주제를 가르치지 않습니다. 즉, 그들은 당신을 직업으로 훈련시키지 않고 아이디어와 이론을 가르치기 위해 고안되었습니다. QA의 전체 개념은 수학 증명을 통과하는 것 외에는 컴퓨터 과학과 아무 관련이 없습니다. 또한 QA 실무 ​​및 개발 워크 플로는 개발 하우스마다 크게 다르므로 학교에서 가르치는 것은 시간과 돈을 낭비합니다.

2
Nathan Strong

왜 이런 것들이 가장 먼저 배우지 않는지에 대한 답을 찾기 위해 : 학부 프로그램은 일반적으로 석사 과정 학생이되도록 훈련시킵니다. 자신의 코스를 선택하기 시작한 후에 만 ​​(일반적으로 나중에 발생 함) 학계 밖에서 사용되는 것들에 대해 배울 수 있습니다. 이것이 알고리즘, 데이터 구조에 중점을 두어 해결되지 않은 문제 등을 제시하는 이유입니다.

나는 개인적으로 그들이 이것을하고있는 것이 좋다고 생각합니다. 우리 중 많은 사람들이 프로그래밍을하는 것처럼 프로그래밍은 쉽지 않습니다. 많은 사람들이 그것으로 고투합니다. 오히려이 사람들은 퍼 포스가있는 몬스터를 알아 내기 전에 for 루프가 어떻게 작동하는지 먼저 이해하고 싶습니다.

2
Swati

언급 한 세 가지 사항 (단위 테스트, 버전 제어, 민첩한 개발)은 Groningen 대학의 컴퓨팅 과학 프로그램에서 어느 정도 학습됩니다. 그것이 좋은 것인지 아닌지 나는 공개적인 질문으로 남겨 둘 것입니다. 그러나 "실용적인 물건"을 가르치는 대학이 없다는 것은 사실이 아닙니다.

1
Thomas

이것들은 전공을 바꾸기 전에 CS 프로그램에 대한 제한된 경험과 대규모 소프트웨어 회사에서 인턴으로 일한 경험을 바탕으로합니다. 자동화해야하는 대부분의 프로그램이 자동 테스트를 수행하기에 충분하지 않기 때문에 특정 입력 세트를 보증하여 모든 것을 수동으로 테스트 할 수 있기 때문에 단위 테스트는 학습되지 않습니다. 대부분의 프로젝트는 자동화 된 테스트를 실행하는 스크립트로 등급을 매기고 int foo1이 없는지 확인하기 위해 코드를 한 눈에 볼 수 있기 때문에 테스트 자동화 방법을 가르치면 프로젝트의 등급에 영향을 줄 수도 있습니다. int foo2; 적절한 들여 쓰기를 사용합니다.

왜 버전 제어가 가르쳐지지 않을지 모르겠지만 그 중 일부는 아마도 프로젝트의 크기 일 것입니다. 나는 버전 제어를 위해 충분히 큰 프로젝트를 한 번도 가지고 있지 않았으며, 1000 줄 이상의 코드를 의미하며 전체 학기를 작성했습니다. 나는 그들이 당신이 그것을 필요로 할 때 당신이 스스로에게 가르 칠 것이라고 생각합니다. 내가 만든 모든 그룹 프로젝트는 페어 프로그래밍 프로젝트 였고 같은 컴퓨터에서 둘 다 버전 제어를 사용하는 이유는 무엇입니까?

민첩한 개발이 왜 가르쳐지지 않을지 모르겠지만 아마도 프로그램 크기와 같은 것으로 되돌아 갈 것입니다. 개인용 컴퓨터 및 소형 서버에서 실행되는 새로운 소프트웨어에서는 공격적인 개발이 일반적이지만 IBM 메인 프레임과 같은 시스템이나 은행이나 의료와 같은 문제가있는 도메인에서는 일반적으로 사용되지 않습니다. 또한 많은 교수들이 훈련을 받았을 때 20 년 전쯤에 무질서한 발달이 아니었다는 사실과 관련이있을 것입니다.

1
Jared

나는 민첩한 프로그래밍이 유행이라고 생각하지 않지만, 동시에 교사가 당신에게 그것을 배울 수 있도록 프로젝트를 줄 수있는 방법을 생각하기가 어려울 것입니다. 프로젝트 B는 a를 확장합니다. 문제는 시간과 범위입니다. 4 개월 코스에서는 힘들 것입니다.

버전 관리 및 단위 테스트 방법은 항상 언어 또는 언어를 정의하는 사람에 따라 변경되고 의존합니다.

데이터 구조와 알고리즘은 클래스 설정에서 작업 할 수있는 것입니다. 솔직히 말해서 단위 테스트와 버전 관리를 이해하기 위해서는 약간의 노력이 필요합니다. 대학의 일부를 기억하려고 노력하는 것은 자신을 가르치는 것입니다. 콜라주에는 동일한 권한이 없습니다. 또는 적어도 같은 정도로는 아닙니다. 이모.

1
baash05

좋은 CS 프로그램은 미래의 모든 프로그래밍 교육의 기초가 될 기초를 가르쳐야한다고 생각합니다. Agile과 같은 개발 방법론 및 버전 제어 도구는 유행과 유사합니다. 그들은오고 갔다. 또한 그것들은 학계가 아닌 산업 환경에서 사용되는 경향이 있기 때문에 대학에서 직업에 대해 배우게 될 것들과 같은 것들을 다루는 일은 드물다고 생각합니다. 나는 그것이 옳다고 말하지는 않지만 아마도 학문적 인 사고 일 것입니다.

1
Bullines

당신의 말에 동의합니다. 저는 최근에 소프트웨어 개발 분야에서 일하기 시작했으며, 이미 대학에서 배운 적이없는 민첩한 개발에 대해 배우기 시작했습니다.

이 문제의 사실은 대학 교수들이 새로운 개발 기술을 따라야 할만큼 많은 노력을 기울이지 않을 수 있습니다. 또한 교과 과정에 다른 중요한 것들이 있다고 느낄 수도 있습니다.

1
Dave

대학 강사들은 소프트웨어 작성 방법에 대해 알지 못하고, 연구하고, 가르치고, 논문이 출판 될 때까지 작동해야하는 일부 코드를 때리기 만합니다.

Titus와 같은 사람들 덕분에 우리는 프로그래밍을 정말로 좋아하는 학자들을 얻었습니다. 여기에서 그 주제에 대한 의견을 읽으십시오

내가 학생이었을 때 나는 극단 프로그래밍에 관한 도서관에서 책을 읽었습니다. 우리는 클래스에서 그것을 간단하게 논의했습니다. 소프트웨어 컴파일의 "폭포 모델"을 준수해야하는 것과 동일한 클래스입니다. 여기서 "컴파일"은 단계입니다. 개인적인.

당신의 경력에 ​​최선을 다하고, 나는 당신이 학위를 졸업하길 바랍니다, 그것은 당신의 이름 뒤에 편지를 갖는 것이 좋습니다. :)

1
Jerub

나는 그것이 어떤 유형의 컴퓨터 과학 프로그램에 달려 있다고 생각합니다. 연구 및 과학 측면을 목표로하는 프로그램이 있고 구현 측면을 목표로하는 프로그램이 있습니다. 나는 학계에 머물렀던 교수 만있는 특정 학교에 대해 특별히 거절했다. 당신이 가르치는 것을 "사용"하지 않은 교수가 없다면, 그것의 모든 것은 그들의 머리 속에 있습니다.

Plug : DePaul University에서 Comp Eng와 BS의 Soft Eng에서 학사 학위를 취득한 후, 주로 파트 타임을 가르친 강사/교수들이 가르쳤습니다. 그것을 수업과 관련시킵니다. 또한 이것은 대부분 통근/파트 타임 학교로, 대부분의 학생들은 자신이 배우는 것을 사용하는 직업을 가지고 있습니다.

학습 과정은 여전히 ​​모든 이론으로 시작되지만, 우리는 보통 "직장에서 실제로 몇 명을 사용합니까?"라는 질문을받습니다. 일반적인 대답은 "우리는 그것을 사용하지만 간단하게 또는 더 간단하게 사용하는 것"입니다. 그리고 나서 실제 실제 시나리오로 들어갑니다.

학교 수업 중에는 항상 시험이있었습니다. Java로 시작하더라도 모든 프로젝트에 ANT 및 JUnit을 사용합니다. 빌드 구성 및 단위 테스트에서 좋은 시작이었습니다.

그리고 익스트림 프로그래밍은 제가 수강 한 약 3-4 개의 수업에 포함되었습니다. 그것들은 모두 쌍 프로그래밍에서 단위 테스트에 이르기까지 12 가지 측면에서 시작한 것을 기억합니다 (위 참조). 이제는 애자일에 중점을 둔 것 같습니다.

따라서 빠른 대답은 그렇습니다. 다른 학교보다 실용적인 접근 방식을 가진 학교가 있습니다.

1
Glennular

대부분의 대학 소프트웨어 프로젝트는 단일 클래스의 범위에 맞아야합니다. 즉, 1 ~ 4 명의 합리적인 경험이없는 프로그래머가 참여하는 5-6 주 프로젝트를 효과적으로 의미합니다. 단위 테스트 및 소스 제어는 그 이상으로 더 많은 사람들이 참여하는 장기 프로젝트로 확장 한 후에 만 ​​확실하게 효과적입니다. 결과적으로 이러한 기술을 무의미한 요구 사항처럼 보이지 않는 방식으로 클래스 프로젝트에 구축하는 것은 어렵습니다.

1
Shalmanese

주된 이유는 많은 (대부분의) 대학들이 무역 학교와 다른 목표를 가지고 있다고 생각하기 때문입니다. 따라서 그들은 학생들에게 학습 방법과 학문의 기본 원리를 가르치기를 원합니다. 또한 알고리즘 및 데이터 구조는 모든 프로그래밍 언어에 적용되며 특정 도구 (졸업에 의해 여전히 사용 중이거나 사용되지 않을 수 있음)에 의존하지 않습니다.

Computer Science에서 이는 알고리즘, 데이터 구조, 컴퓨터 이론, 컴파일러 이론 등을 의미합니다. 나열하는 내용은 프로그래밍 방법 이해, 문제 해결 방법 등이 아닙니다. 프로그래밍 실습에 관한 것입니다. 우연히도 프로그래머로 일하려는 의도를 가진 대학의 모든 사람들에게 놀라운 책입니다). 이제이 중 상당수가 엔트리 레벨 코드 원숭이 위치에서 사용되지 않아 일부 사람들은 이것이 유용하지 않다고 생각하게됩니다. 동의하지 않습니다. 나는 그것이 매우 유용 할 수 있다고 생각합니다. 그러나 CS 학위를 취득한 후 프로그래머로 일하기 위해 필요한 모든 것을 알고 있다는 의미는 아닙니다.

또한 언급 한 내용이 유용하지 않다고 말하지 않습니다. 그들은. 배우지 않으면 프로그래머로 일하는 데 어려움을 겪을 것입니다. 적어도 어느 정도는 대학에서 가르쳐야한다고 생각합니다. 나는 예술에서 학부 프로그램을 보는 것과 같은 방식으로 버전 관리, 단위 테스트 등을 가르치고, 페인트 브러시가 무엇인지, 그리고 어떤 경우에 어떤 브러시를 사용해야하는지에 대해 가르칩니다.

1

단위 테스트와 버전 관리는 제가 대학에 진학한 2 학년 컴퓨터 과학 과정에서 진행되었습니다. 단위 테스트는 화이트 박스와 블랙 박스 사이의 차이를 포함하는 테스트의 일부로 떨어졌으며 3 년차 프로그래밍 과제에서 마크의 좋은 덩어리는 단위 테스트에서 쉽게 얻을 수있는 좋은 오류 처리를 위해 왔습니다.

민첩한 개발은 내가 생각하는 학문적 환경에서 가르치기가 다소 어려울 수 있습니다. 이론적으로 워터 폴 방법에 대해 배웠지 만, 졸업 후 학계와는 상당히 다른 실제 세계로 옮길 때까지 현장에서 볼 수 없었습니다. 3 학년에 나는 모든 이상한 오류 사례를 수행하고 과제가 세마포어에 대해 가르쳐 주려고 한 과제의 핵심을 결코 만지지 않은 과제를 거의 통과했습니다.

또한 민첩성이 얼마나 오래 지속되었으며 어떤 형태의 민첩성을 의미 했습니까? 내가 본 것과는 다른 많은 구현이 있습니다.

1
JB King

이상적으로는, 나는 그들이 그런 것들을 가르 칠 시간이 없거나, 대부분의 학생들이 배우기 힘든 것들을 알고와 언어를 가르치는 것이 더 중요하다고 생각합니다.

학교는 자기 학습의 반대이며, 이러한 것들 (버전 제어, 단위 테스트)은 배우기 가장 쉬운 것이기 때문에, 가장 능력이 적은 학생이라도 가장 중요한 기본 프로그래밍 및 알고리즘을 수행 할 수 있어야합니다. 나중에 "주변"을 수행하십시오.

시간이 지남에 따라 변화에 대해 이야기하고 도구 등을 변경하는 것은 어렵습니다. 대규모 교육 구조는 단순하게 유지하는 것을 좋아합니다.

0
jokoon