문제

여름 동안 저는 운이 좋게도 Google Summer of Code에 참가할 수 있었습니다.나는 많은 것을 배웠습니다(아마도 제가 대학에서 배운 모든 과정을 합친 것보다 더 많을 것입니다).그런데 왜 학교에서 더 일찍 배운 것 중 몇 가지를 가르치지 않는지 정말 궁금합니다.몇 가지 예를 들면 다음과 같습니다.

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

제가 보기엔 그들은 데이터 구조나 알고리즘 같은 다른 것들을 미리 가르치는 데 상당한 시간을 소비하는 것 같습니다.나는 아직도 이것들이 초기에 배우는 것이 매우 중요하다고 생각하지만, 왜 그들은 그들보다 먼저 이 세 가지를 더 많이 가르치지 않습니까?아니면 우리 학교에서만 이런 것들을 많이 가르치지 않는 걸까요?

오해하지 마세요. 대학이 항상 최신 유행 프로그래밍을 가르치는 것은 바람직하지 않다고 생각합니다. 하지만 교수님께서 "코딩을 시작하기 전에 다이어그램을 그리세요" 이외의 다른 것을 가르쳐야 하지 않을까요?

도움이 되었습니까?

해결책

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

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

토목공학자들은 수천년의 교량을 살펴볼 수 있고 많은 정보를 가지고 있습니다.반면에 소프트웨어 개발자는 보유하고 있는 정보가 수십 년에 불과하며 그 중 대부분은 비밀로 유지됩니다. 왜냐하면 조직이 개발자의 효율성에 대한 정보를 수집하고 게시하더라도(대부분의 경우) 이를 수집하고 게시할 동기가 거의 없기 때문입니다. '티).

필드에 혼란이 있는 경우도 있습니다.소프트웨어 개발 또는 소프트웨어 "엔지니어링"은 실제로 컴퓨터 과학과 다릅니다.소프트웨어 개발자에게는 컴퓨터 과학에 대한 실무 지식이 필요하지만 알고리즘 복잡성의 경계에서 작업하거나 병렬성에 대해 추론하는 것은 현직 프로그래머가 매일 수행하는 작업이 아닙니다.마찬가지로, 실제 "컴퓨터 과학자"는 작동하지 않거나 흥미로운 작업을 수행하지 않고 실제 소프트웨어 제품이 제공하는 엄격한 종류의 혜택을 받지 못하는 수많은 일회용 코드를 작성할 것입니다.

인터넷과 오픈소스 커뮤니티의 출현은 이러한 질문에 대한 결정적인 답변을 시작하기에 충분한 데이터를 제공할 수 있지만, 내일 답변이 가능하더라도 모든 사람이 동의할 정도로 국제 사회에 침투하는 데는 아마도 100년이 걸릴 것입니다. 학교에서 가르쳐야 합니다.

마지막으로 몇 가지 경제적 고려사항이 있습니다.소프트웨어 개발에 참여하는 거의 모든 사람들이 원하는 개발 도구를 실행할 수 있는 전용 시스템에 저렴하고 쉽게 액세스할 수 있었던 것은 비교적 짧은 시간이었습니다.수십 년 전만 해도 테스트를 실행하는 데만 머신을 완전히 사용하거나 심지어 소스 코드의 무한한 기록을 저장하는 일이 많은 사람들에게 터무니없는 비용으로 느껴졌을 것입니다.

다른 팁

왜냐면 우리 선생님들은:

  1. 단위 테스트를 시도한 적이 없습니다.
  2. 버전 관리를 사용하는 방법을 모르고
  3. "민첩한 개발"이라는 말을 들어본 적도 없습니다.

학생들은 스스로 문제를 해결해야 합니다.우리는 그렇게 했고 결과는 괜찮았습니다, 그렇죠?

레오나르도 다 빈치는 이렇게 썼습니다.

과학없이 실천에 매료 된 사람들은 방향타 나 나침반없이 배에 들어가는 조종사와 같습니다.실천은 항상 이론에 대한 건전한 지식에 근거해야합니다.

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

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

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

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

나는 Oregon Institute of Technology의 겸임교수였을 때 이런 것들을 가르쳤습니다.그들은 드물게 가르쳐집니다.

모든 것은 지나가는 유행이다.당신은 대학에서 보낸 모든 시간보다 대학을 졸업한 첫해에 더 많은 것을 배우게 될 것입니다.컴퓨터 과학은 컴퓨터와 아무 관련이 없습니다.

College에서는 도구가 가득한 도구 상자를 제공합니다.이것은 드라이버, 즉 초승달 렌치입니다.대학에서 각 도구를 한 번만 사용할 수도 있습니다.현실 세계에 들어서는 순간, 자신이 갖고 있는 것이 무엇인지 알게 되는 순간이다.나머지 중에서 유용한 것, 만약을 대비해 집 작업대에 두고 싶은 것, 매일 주머니에 넣어두는 것 등을 분류합니다.

Tqm, Iso, Cmm, Agile 등이것들은 모두 왔다가 사라질 유행일 뿐이며, 성공한 것 중 어느 것도 단지 상식에 지나지 않습니다.모든 성공적인 엔지니어와 회사는 어느 정도 상식을 사용합니다. 그것이 그들을 성공으로 이끈 원동력이며, 그에 대한 이름이 필요한 사람은 거의 없습니다.문제는 상식을 팔 수 없다는 것입니다. 관리자는 눈에 띄는 이름 없이 상식을 교육하고 구매함으로써 회사에 자신의 가치를 증명할 수 없습니다.상사가 뉴스 기사나 잡지에서 읽은 이름을 붙이면 관리자가 직장을 유지하고 귀하도 직장을 유지합니다.이러한 관행을 따른다고 주장하는 회사 중 실제로 그렇게 하는 회사는 거의 없습니다.대부분은 컨설턴트에게 수표를 쓰고, 웹사이트에 그래픽을 넣거나 제품이 들어 있는 상자에 라벨을 붙일 수 있도록 일부 클럽에 연간 및/또는 평생 인증서를 받습니다.많은 사람들은 이것이 드물다고 주장할 것입니다... 거기에 가봤고, 본 적도 있고, 그런 일이 일어납니다.이것은 모두 사업의 일부입니다. 수익성을 유지하고 문을 열어두고 불을 켜두기 위해 때로는 모퉁이를 잘라야 합니다.이러한 모든 관행을 따르는 하드코어 추종자들은 모두 마지막 것은 유행이었고 이번은 그렇지 않다고 주장해왔습니다. 마지막 것은 따라가기에는 너무 비용이 많이 들었고 이번은 그렇지 않다고 주장했습니다.마지막 것은 방금 컨설턴트를 고용한 가짜였고, 이것은 진짜입니다.프로그래밍 언어와 마찬가지로 이들 역시 진화할 것입니다.

비즈니스의 현실, 대학 시스템, 그리고 그 안에서 자신의 역할을 이해하는 능력이 핵심입니다.인생의 모든 것과 마찬가지로 전투를 선택하십시오.당신이 필요로 하거나 알고 싶은 것을 가르치는 것은 대학이나 기업, 정부 또는 다른 사람의 일이 아닙니다.1위를 찾는 것이 당신의 임무입니다.마찬가지로 당신은 이것을 할 시간을 제공한 것에 대해 다른 사람을 비난할 수 없습니다. 당신은 그것을 해야 합니다.당신은 말에서 떨어질 것입니다. 당신은 희생자가 아닙니다. 일어나서 다시 타세요. 변명의 여지가 없습니다. 인생은 공평하지 않습니다.유인물을 활용하고 독립적인 척하지 마십시오.그리고 확실히 회비를 지불하고, 회사에 대가로 무언가(당시 최선을 다하는가?)를 주지 않고 유인물을 모두 빨아들이지 마십시오.

왜 사람들은 cmm이나 agile 또는 다른 것이 유행이라고 생각합니까?왜 그들은 그렇지 않다고 생각합니까?교수님은 왜 그런 식으로 프로그램을 가르치셨나요?gotos를 피하거나 상수를 피하거나 이것저것을 피하려면?더 안정적인 코드를 생성하기 때문일까요?더 나은 성능의 코드?인적 오류를 줄이나요?아니면 논문/프로그램을 평가하는 것이 더 쉽기 때문에 연구에 더 많은 시간을 할애할 수 있기 때문입니까?프로그래밍 방법을 모르고 해당 주제에 대한 다른 사람의 책을 따라하기 때문입니까?유지 관리가 가능하고 신뢰할 수 있는 고성능 코드를 가질 수 없다고 배웠습니까?유지 관리가 안정적이면서도 고성능을 방해하는 "둘 중 하나를 선택"할 수도 없습니까?때로는 성능을 위해 신뢰성을 희생하기도 합니다.때로는 안정성이나 성능에 신경 쓰지 않고 또 다른 회계 소프트웨어 프로그램의 버전 117.34.2에서 버전 118.0.0으로 전환하고 싶을 때도 있습니다.귀하의 비즈니스 모델은 버전 업그레이드 및 기술 지원 판매에서 비롯되며 소프트웨어 개발자의 경우 동일한 코드를 동일한 방식으로 작성할 수 있는 기존 로봇이 수행할 것입니다.타버린 것을 대학에서 갓 나온 것으로 교체하고 업그레이드를 계속 판매하세요.

이러한 질문에 대한 보편적인 답은 없습니다. 자신의 의견이 무엇인지 알아내고 그에 따라 생활하며 방어해야 합니다.마음을 바꾸고, 그에 따라 생활하고, 방어하십시오.

모든 것에 질문해 보세요... 난로 위의 냄비를 만지면 정말 화상을 입을까요?두려움으로 인한 심리적 영향이 단순히 화상을 입는 것보다 더 큰 피해를 입힐 수 있을까요?다치지 않고 답을 테스트할 수 있는 안전한 방법이 있나요?

여유가 생기면 나는 기숙사 방에 있는 트랜지스터, 커패시터, 저항기 등을 사서 녹이곤 했는데, 모두 특유의 악취가 났습니다.첫 번째 트랜지스터 수업이 끝난 다음 날 앰프를 만드는 것보다 스테레오용 앰프를 구입하는 것이 훨씬 저렴하고 쉽습니다.물론 Linus는 예외이므로 운영 체제를 작성하는 것보다 그냥 구입하는 것이 더 쉽습니다. 비록 그 당시 배운 내용이 Linus가 배운 것과 다르지만 더 많은 작업을 수행할 수 있습니다.

대학 안팎의 세계는 문제 해결을 위해 이러한 공식(cmm, agile 등)을 채택할 것이며 다음 공식이 나오면 그 공식을 빠르게 삭제할 것입니다.성공하기 위해 버전 제어를 사용할 필요는 없습니다. 버전 제어를 사용하지 않은 경우와 마찬가지로 많은 성공이 있습니다(실제로 업계의 시대로 인해 지금까지 버전 제어 없이 성공한 경우가 더 많습니다).마찬가지로 최소한의 테스트만으로 성공할 수 있습니다(예를 들어 컴퓨터 업계의 유명 기업을 살펴보세요).자신의 코드를 테스트하면 성공할 수 있을 뿐만 아니라 자신의 코드를 절대 테스트해서는 안 된다는 규칙을 따르면 성공할 수도 있습니다.Emacs를 사용하면 성공할 수 있고 vi를 사용하면 성공할 수 있습니다.당신은 어떤 조합이 당신에게 적합한지 결정해야 하며, 운이 좋다면 당신에게 맞는 일할 곳을 찾아야 합니다.시간이 지나면 도구에서 언어, 프로그래밍 스타일, 두려움, 버전 제어, 문서화 등 자신에게 맞는 것이 바뀔 것입니다.당신은 결혼하고 아이를 낳고 작은 스타트업의 인기 프로그래머가 되는 대신 큰 건강 보험 패키지를 갖춘 큰 회사의 구석에 숨어 지루한 직업을 갖고 아이들과 즐겁게 지내고 싶다고 결정할 것입니다.

대학을 졸업하고 현실 세계로 나가면 "늙은 사람들"의 말을 듣고 함께 일하고 논쟁하십시오.그들은 수십 년에서 수 세기에 걸쳐 경험을 쌓았고, 당신이 피하거나 스스로 테스트할 수 있는 함정에 빠졌습니다.대부분의 사람들은 이러한 유행 중 적어도 한두 가지가 왔다가 사라지는 것을 보았을 것이며, 특히 그것이 얼마나 심하게 화상을 입었는지, 그리고 그것으로부터 회복하기 위해 무엇을 했는지를 보았을 것입니다.그들은 사물을 테스트하는 다양한 방법과 이미 왔다가 사라진 테스트 스타일의 이름도 알고 있습니다.작동하는 것과 작동하지 않는 것.위험이 있는 곳과 접선에서 시간 낭비를 피하는 방법.당신이 성숙해지고 옛 타이머가 되면 그것을 앞으로 전달하십시오.당신을 따르는 사람들을 가르치려고 노력함으로써 배운 것에 대한 대가를 치르십시오.그들에게 물고기를 주는 방법을 가르치는 것을 잊지 마십시오. 단지 물고기를 주는 것이 아닙니다.때로는 그들이 성공하기 전에 실패하도록 내버려둬야 하고, 그들이 너무 심하게 화상을 입지 않도록 해야 합니다.

제가 여기서 정말로 말하고 싶었던 것은 지금 우리가 평행 우주의 진화를 목격할 수 있는(그리고 아마도 그것에 영향을 미칠 수도 있는) 드문 상황에 있다는 것입니다.그렇습니다. 컴퓨터 과학은 물리학에 비하면 젊은 과학입니다.그러나 동시에 그것은 여러 번 진화했습니다.일하는 장소와 함께 일하는 사람에 따라 하드웨어 엔지니어를 관찰할 수도 있습니다.하드웨어 세계의 프로그래밍 언어는 확실히 새로운 것은 아니지만 소프트웨어 세계만큼 빠르게 발전하지는 않았습니다.소프트웨어는 수십 년 앞서 시작되었습니다.하드웨어는 항상 소프트웨어 엔지니어를 2류 시민으로 생각했습니다.우리 일은 쉽고, 그들의 일은 어렵다.(참고로 저는 실제로 하드웨어 및 소프트웨어 엔지니어입니다.)흥미로운 점은 지금도 그들이 우리가 초등학생 또는 유아기 문제라고 생각하는 문제를 다루고 있다는 것입니다.버전 관리를 사용해야 하는 이유는 무엇입니까? 이 칩을 작업하는 사람은 저 혼자뿐입니다.gcc나 기타 저렴한 컴파일러 또는 무료 IDE에 대한 귀하의 경험은 제가 사용하는 값비싼 도구와 비교할 수 없습니다. 회사에서 귀하가 이를 사용할 만큼 가치가 있다고 생각하거나 심지어 사용 방법을 알고 있다면 사본을 구입할 것입니다.그리고 다른 변명의 여지가 많습니다.나는 VHDL과 Verilog를 모두 배우고 일주일 안에 두 가지 모두에서 생산성을 높일 수 있는 즐거움을 누렸습니다. 그런 하드웨어 엔지니어에게는 거의 감히 할 수 없는 일이었습니다(내 졸업장에는 전기 엔지니어가 내 직위가 소프트웨어 엔지니어라고 말했음에도 불구하고).저는 이러한 언어를 배우고 싶었고 도구가 제공되었을 때 밤까지 사무실에 머물며 스스로 가르쳤습니다.그 시점부터 그 엔지니어는 제가 말한 것이 사실이고 언어는 구문일 뿐이며 프로그래밍 기본 사항은 동일하며 도구는 모두 동일한 작업을 수행한다는 것을 깨달았습니다.사과와 사과는 사과와 오렌지가 아닙니다.

일반적으로 두 병렬 산업 중 하나가 다른 산업보다 언어, 프로그래밍 습관, 소스 제어, 테스트, 도구, 프로그래밍 환경 등에 훨씬 더 많은 경험을 가지고 있다는 메시지를 보내는 것은 여전히 ​​어렵습니다.제가 해결하려는 문제는 개발 중인 하드웨어 설계를 가져와 프로세서의 시뮬레이션(가상 머신)과 연결할 수 있는 저렴한 기능 시뮬레이터를 만들어 하드웨어 테스트를 시작하고 테스트 및 개발을 시작하는 것입니다. 우리가 실리콘으로 가기 훨씬 전에 제공 가능한 소프트웨어입니다.아니요, 이에 대해 "새로운" 것은 없지만 최신 코드를 가져오고 코드 변경 사항을 추적하여 어디에 시간을 집중해야 하는지 확인하는 메커니즘이 없습니다.하드웨어에 대한 사용자(프로그래밍) 인터페이스를 정의하는 문서를 추적하는 메커니즘이 없습니다.하나의 골든 카피는 바이너리 형식으로 누군가의 이메일 받은 편지함에 있으며, 무슨 일이 일어나고 있는지 알아내기 위해 Verilog를 읽을 필요가 없을 때만 변경됩니다.잠깐, 그 Verilog는 얼마나 오래됐나요?내가 일주일 내내 당신을 위해 썼던 그 버그가 3주 전에 알아내고 고쳤나요?그래서 우리는 하드웨어 담당자가 작업을 끝내고 벽 너머로 우리에게 던질 때까지 6개월 동안 휴가지나 파티로 날아갈까요, 아니면 이 기회를 이용하여 인내심을 갖고 낙관적으로 그들에게 가르칠까요? 업무를 수행하고, 작업을 백업하고, 동료 검토를 위해 공유할 수 있는 상식적인 방법이 있습니다.

하드웨어 엔지니어도 여러분처럼 반짝이는 새 도구 상자를 가지고 대학을 떠났다는 사실을 기억하세요.17개의 프로그래밍 언어를 배웠는데 그 중 하나만 사용할 수 있으며 나머지 언어는 대학을 졸업한 후에 개발하게 됩니다.대학을 졸업하면 미적분학 및 상대성 이론에 대해 알고 있는 내용을 알려주고 각 요소에 얼마나 많은 전자가 있는지 알려주고 가우스 표면 주위의 전하를 계산할 수 있습니다.그러나 그들의 경력의 대부분은 1, 0, 그리고 또는 그렇지 않습니다.물리학, 미적분, 전자의 기본 법칙이 프로그래밍 언어만큼 빠르게 변하지는 않을 것입니다.그러나 프로그래밍의 기본은 모든 언어에서 동일하며 앞으로도 계속 그럴 것입니다.그 사실을 알고 대학을 떠났나요, 아니면 이것저것 저것이 있기 때문에 java가 C++와 다르고 더 낫다고 생각하고 떠났나요?

다른 사업과 마찬가지로 대학의 임무는 수익성을 유지하는 것입니다.대학은 올바른 학생과 연구 자금, 그리고 대학의 수익성을 높이기 위한 올바른 유형의 연구를 모두 제공하기 위해 올바른 학자를 고용해야 합니다.그들은 적절한 학생을 데려오고 적절한 졸업생을 배출할 수 있는 적절한 수업을 제공해야 합니다. 그러면 수십 년이 지나면서 대학 근처의 고용주와 멀리 떨어진 고용주 모두가 이 대학이 생산적이고 수익성 있는 직원을 배출한다는 것을 인식하게 될 것입니다.(그렇습니다. 때로는 적절한 TV 시간과 적절한 인지도 및 스포츠 수익을 얻기 위해 적절한 스포츠에 적절한 운동선수를 유치해야 합니다.)일부 대학에서는 C++와 Java를 가르치지만 일부 대학에서는 절대 가르치지 않습니다.일부는 CMM을 개발할 것이고 일부는 Agile을 가르치며 일부는 둘 다 수행하지 않을 것입니다.대학에 어떤 가치가 있다면 배울 점이 있습니다.그들은 배워야 할 모든 것을 가르쳐주지는 않을 것이지만 뭔가 유용한 것은 있을 것입니다.그곳에 있는 동안 도구 상자에 합리적인 수의 다양한 형태의 도구를 수집하는 방법을 배우십시오.대학을 그만두고 취업을 하세요.도구 상자가 형편없다면 다른 대학을 찾아보고 첫 번째 대학은 언급하지 마세요.괜찮은 도구 상자라면 해당 도구를 사용하고 자신의 시간에 새로운 도구를 만드십시오.그것이 꽤 좋은 도구 상자라면, 그 대학과 당신이 이것저것 배웠던 훌륭한 학자들에 대해 좋은 말을 하고 그들이 당신에게 준 것에 대해 학교에 갚으십시오.대학 도구의 범용 카탈로그에서 가능한 모든 도구를 얻지 못하더라도 특정 하위 집합을 사용하게 될 것입니다.졸업은 못해도...

맙소사, 시작하지 마세요

나는 한때 평판이 좋은 대학의 CS 학장에게 객체 지향 프로그래밍은 단지 '유행'일 뿐이므로 C++와 같은 고급 기능에는 어떤 수업도 제공하지 않는다고 말했습니다.

왜 이런 것들을 가르치지 않는지에 대해 말하자면, 대학은 반드시 업계의 모범 사례가 아닌 학문의 기본을 가르치기 위해 존재합니다.

가장 간단한 대답은 귀하가 컴퓨터 과학을 공부하고 있으며 귀하가 나열한 내용이 실제로 컴퓨터 과학 분야와 관련이 없다는 것입니다.소프트웨어 개발은 ​​당신이 할 수 있는 일이 될 수 있습니다. 하다 컴퓨터 과학을 통해 배운 내용을 토대로 구축되는 것입니다.하지만 컴퓨터 과학과 소프트웨어 개발은 ​​같은 것이 아닙니다.

버전 관리나 효과적인 단위 테스트 작성 방법을 가르친 수업...그건 너한테 가르쳐 줄 거야 거래, 즉 (좋은) 소프트웨어 개발입니다.

대학의 문제는 실제로 보편적인 것을 가르쳐야 한다는 것입니다.애자일 개발과 같은 것은 여전히 ​​매우 새로운 것이며 인터넷에서 아무리 많이 이야기되고 있음에도 불구하고 모든 곳에서 사용되지는 않으므로 전체 학생에게 이를 가르치는 것은 잠재적으로 애자일 매장에 도착한 소수의 사람들에게만 도움이 될 것입니다.

그러나 버전 관리는 요즘 변명할 수 없는 일입니다.이는 컴파일러만큼 유용한 도구이며 CVS는 약 20년 이상 사용되어 왔다는 점을 모든 사람이 이해해야 합니다.대학을 떠나는 프로그래머는 최소한 개념을 이해해야 합니다.다행스럽게도 대학에서 그룹 작업을 수행하는 경우 버전 관리에 대해 이미 알고 있고 그룹에서 이를 사용하도록 설득하는 사람과 만날 수 있는 행운이 있을 수 있습니다.그 사람이 내 그룹에 있어서 다행이라는 걸 알아요.

단위 테스트 역시 변명의 여지가 없습니다.내가 말하고 싶은 유일한 것은 이 책이 여전히 테스트 중심 개발에 관한 것이며 100% 코드 적용 범위를 추구하는 것은 때때로 가치보다 더 많은 문제가 될 수 있다는 것입니다.그러나 단위 테스트는 매우 중요하므로 소프트웨어 엔지니어링 과정에서 다루어야 합니다.나는 이러한 것 중 일부가 일부 대학에 진출하고 있지만 아직 모든 대학에 도달하지 못했다고 생각합니다.

실제로는 왜 안 됩니까?CS 학위를 취득한 경험도 거의 같았습니다.그 이유는 제가 아는 한 프로그래밍을 가르치는 사람들은 프로그래밍을 하지 않기 때문입니다.인증을 받기 위해 그런 것들을 가르칠 필요는 없고, 교사들은 그것에 익숙하지 않으며, 학생들은 교과 과정의 일부로 어떤 중요한 프로젝트도 개발하지 않습니다.CS 이론이나 Java 구문을 가르치는 것과 달리 실제로 프로그래밍을 가르치는 동기는 없습니다.

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

그들은 단위 테스트를 자세히 다루지 않았고 단지 한 강의에 대한 서비스를 통과하는 데 비용을 지불했습니다.단순히 "단위 테스트란 무엇인가"보다는 효과적인 단위 테스트 작성 방법을 배웠다면 좋았을 것입니다.

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

저도 Glyph의 말에 크게 동의합니다.CS는 정말 미성숙한 분야입니다. 실제로 지난 50년 동안만 해도 우리는 무엇을 배워야 할지, 무엇이 일시적 유행인지 모릅니다.150년이 지나면 상황이 더 안정될 수도 있습니다.실패한 실제 프로젝트의 수는 이 산업이 미성숙한 산업이라는 것을 명백히 보여줍니다.건축 프로젝트의 80%가 실패했다고 상상해보세요!

컴퓨터 과학자들은 자신들이 엔지니어가 아닌 수학자라고 생각하므로 엔지니어링 부분보다 수학 부분을 가르치는 것을 선호합니다.테스트, 버전 제어 및 문서화는 다른 엔지니어링 분야와 마찬가지로 유행을 따르지 않습니다.

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

내가 듣는 수업에서 버전 관리에 대해 한 번도 언급한 적이 없음에도 불구하고 대부분의 친구들은 개인 프로젝트, 수업 과제 등에 버전 관리를 사용하고 있었기 때문에 우리가 버전 관리에 노출되지 않은 것 같지는 않습니다.스스로 주우지 못한 사람들은 팀 과제 과정에서 동급생이 강제로 사용하게 되었습니다.

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

수업 외에도 대학에서 뭔가를 배울 수 있는 방법이 많다는 것을 기억하세요.그것을 활용하십시오.수업에 참석하고 시설을 사용하는 데 많은 비용을 지불하고 있으므로 그만한 가치가 있는 모든 것을 짜내고 LUG 및 ACM 회의에 가거나 프로젝트 팀에 참여하거나(프로그래머가 필요한 로봇을 만드는 ME가 항상 일부 있습니다) 인문계열 서버를 관리하는 일.재료 공학 건물의 로딩 도크에서 컴퓨터를 쓰레기로 줍고, 빠른 기숙사 인터넷 연결을 통해 Linux ISO를 다운로드하고 놀아보세요.

내 생각에 문제는 대학이 전문가가 되도록 가르쳐야 한다고 생각하지 않고 대신 프로그래밍의 학문적 측면에 집중한다는 것입니다.최소한 업계에서 사용되는 최신 방법과 기술에 대한 언급이 있어야 한다고 생각했습니다. 이러한 것들은 학술적 관심 사항이기도 하기 때문입니다.

우리 과정에서 우리는 프로젝트에 소요된 시간 기록, 좋은 댓글 작성 등과 같은 내용을 다루는 개인 소프트웨어 프로세스를 배웠지만 버전 관리와 같은 전문적인 기본 사항에 대해서는 언급하지 않았습니다.

나는 그 모든 것을 대학에서 배웠습니다.아마도 그것은 당신이 선택하는 코스에 따라 다를 것입니다.제가 수강한 강좌는 매우 다양했습니다(소프트웨어 디자인, UI 디자인, 전자상거래, AI, 기능적 프로그래밍 등).소프트웨어 디자인은 디자인 패턴과 단위 테스트(다양한 일을 포함하는 하나의 대규모 프로젝트)에 노출되었습니다.UI 디자인...우리는 프로젝트를 진행하는 세 사람의 그룹이었습니다.버전 관리 없이는 아무것도 할 수 없었기 때문에 그렇게 했습니다.그리고 애자일 개발은 우리 교수님들이 계속 말씀하셨는데, 사용은 각 그룹에 맡겼어요.

나는 많은 대학생들이 "쉬운" 과목이나 높은 GPA를 받을 수 있는 과목을 수강한 것을 발견했습니다.다른 사람들은 자신이 배우고 싶은 것에 초점을 맞추고 어떤 분야에 관심이 있는지 찾기 위해 주로 탐구하고 있습니다.그리고 자신이 관심을 갖고 있는 것이 무엇인지 정확히 아는 사람들도 있습니다. 코스를 다양화하지 않는 경향이 있다는 점을 제외하면 좋은 일입니다.

이러한 것들이 왜 가장 먼저 가르쳐지지 않는지 대답하려면 다음과 같이 하십시오.학부 프로그램은 일반적으로 석사 과정 학생이 될 수 있도록 교육합니다.자신만의 강좌를 선택하기 시작한 후에만(일반적으로 나중에 발생함) 학계 외부에서 사용되는 내용을 배우도록 선택할 수 있습니다.이것이 그들이 알고리즘, 데이터 구조, 해결되지 않은 문제 제시 등에 초점을 맞추는 이유입니다.

개인적으로 이런 일을 하는 것이 좋다고 생각합니다.프로그래밍은 우리 중 많은 사람들이 생각하는 것만큼 쉽지 않습니다.많은 사람들이 그것으로 어려움을 겪습니다.나는 이 사람들이 Perforce라는 괴물을 파악하기 전에 먼저 for 루프가 어떻게 작동하는지 이해하기를 바랍니다.

대부분의 학교가 무역이 아닌 학문적이기 때문에 그러한 주제를 가르치지 않습니다.즉, 경력을 쌓도록 훈련하는 것이 아니라 아이디어와 이론을 가르치기 위해 고안되었습니다.QA의 전체 개념은 수학적 증명을 통과하는 것 외에는 컴퓨터 과학과 아무 관련이 없습니다.게다가 QA 관행과 개발 워크플로는 개발 회사마다 크게 다르기 때문에 학교에서 이를 가르치는 것은 시간과 돈 낭비입니다.

나는 애자일 개발을 제외하고 신입생 때 모든 것을 배웠습니다.

IMHO는 올바른 학교를 선택하는 것입니다.상위 10위 안에 들면 그 모든 것을 빨리 배울 수 있습니다.

일반적으로 CS 교육에 관해 우리는 기본적으로 교수들에게 많은 것을 가르쳐달라고 요청합니다(모든 취향의 언어, 데이터 구조, 런타임 효율성, 비트 수준에서 실제로 작동하는 방식).저는 질문을 드리고 싶습니다. 왜 아이들이 스스로 소프트웨어 엔지니어링에 대해 더 많이 배우는 것이 어떨까요?

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

단위 테스트도 마찬가지입니다. 단위 테스트를 선택하는 이유는 무엇입니까?확실히 사용성 테스트, 시스템 테스트, 사용자 승인 테스트 및 공장 승인 테스트가 더 중요합니까?글쎄, 코드가 유지 관리 부서에 전달되면 작업이 완료되었다고 생각하지 않는 한 그렇습니다. :)

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

  • 좋은 댓글 작성 관행
  • 표준 준수(국제 표준뿐만 아니라 팀 코딩 표준)
  • 선적 서류 비치
  • 변경 제어(차이점을 저장하는 버전 제어와 반드시 동일할 필요는 없습니다. 무엇을 변경했는지, 왜 변경했는지에 대한 자세한 내용입니다)
  • 유용성 개발

위의 내용은 모두 당신이 할 수 없는 "소프트 스킬"입니다. 필요 좋은 코드를 작성하는 것.

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

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

이는 데이터 구조와 알고리즘이 컴퓨팅의 핵심을 구성하므로 훨씬 더 중요하기 때문입니다.단위 테스트, 버전 제어 및 민첩한 방법론은 업무용 도구일 뿐입니다(필요한 경우 업무 중에 이러한 도구를 사용할 것으로 예상됩니다).

나는 좋은 CS 프로그램이 미래의 모든 프로그래밍 교육의 기초가 될 기초를 가르쳐야 한다고 생각합니다.Agile 및 버전 제어 도구와 같은 개발 방법론은 유행과 같습니다.그들은 왔다가 갑니다.또한 학문적인 분야가 아닌 산업 분야에서 사용되는 경향이 있기 때문에 직장에서 배울 수 있는 내용을 대학에서 다루는 경우는 거의 없다고 생각합니다.꼭 옳다고는 할 수 없지만 그게 학문적 사고방식인 것 같아요.

나는 당신이 말하는 것에 동의합니다.저는 최근에 소프트웨어 개발 분야에서 일하기 시작했고 대학에서 한 번도 배운 적이 없는 애자일 개발에 대해 이미 배우기 시작했습니다.

문제는 대학 교수들이 최신 개발 기술을 필요한 만큼 따라잡지 못한다는 사실일 수 있습니다.그들은 또한 그들의 커리큘럼에 다른 더 중요한 것들이 있다고 느낄 수도 있습니다.

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

우리가 진정으로 프로그래밍을 탐내는 학자들을 얻게 된 것은 오직 Titus와 같은 사람들 덕분입니다. 여기에서 해당 주제에 대한 그의 의견을 읽어보세요.

내가 학생이었을 때 나는 도서관에서 익스트림 프로그래밍에 관한 책을 읽었고, 우리는 수업 시간에 그것에 대해 간략하게 논의했습니다. 같은 수업에서는 "컴파일"이 개발의 한 단계인 소프트웨어 개발의 "폭포수 모델"을 따르도록 요구했습니다. 소유하다.

당신의 경력에 ​​행운이 있기를 바랍니다. 학위를 졸업하길 바랍니다. 당신의 이름 뒤에 글자가 있다는 것은 좋은 일입니다.:)

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

전공을 전환하기 전 CS 프로그램에서 제한된 경험과 대규모 소프트웨어 회사에서 인턴으로 일했던 경험을 바탕으로 작성되었습니다.생성해야 하는 대부분의 프로그램은 자동화된 테스트가 필요할 만큼 크지 않기 때문에 단위 테스트를 가르치지 않으며 특정 입력 세트를 보장하므로 모든 것을 수동으로 테스트할 수 있습니다.대부분의 프로젝트는 자동화된 테스트를 실행하는 스크립트로 등급이 매겨지고 int foo1;int foo2;적절한 들여쓰기를 사용합니다.

버전 관리를 왜 가르치지 않는지 모르겠지만 그 중 일부는 아마도 프로젝트 규모일 것입니다.저는 버전 관리를 할 만큼 큰 프로젝트를 해본 적이 없습니다. 즉, 코드가 1000줄이 넘고 작성하는 데 한 학기 전체가 걸렸다는 의미입니다.필요하다면 스스로 가르쳐줄 것이라고 생각하는 것 같아요.제가 진행한 모든 그룹 프로젝트는 쌍 프로그래밍 프로젝트로 되어 있었는데, 두 프로젝트가 같은 컴퓨터에 있다면 왜 버전 제어를 사용합니까?

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

주된 이유는 많은 (대부분?) 대학이 직업 학교와 다른 목표를 가지고 있다고 생각하기 때문입니다.그래서 그들은 학생들을 가르치고 싶어한다. 배우는 방법, 그리고 규율의 기본 원칙.또한, 알고리즘과 데이터 구조는 모든 프로그래밍 언어에 적용되며 특정 도구(졸업할 때까지 사용되거나 사용되지 않을 수 있음)에 종속되지 않습니다.

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

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

나는 당신이 속한 컴퓨터 과학 프로그램의 유형에 따라 연구 및 과학 측면을 목표로 하는 프로그램과 구현 측면을 목표로 하는 프로그램이 있다고 생각합니다.저는 학계에 교수만 남아 있는 특정 학교를 특별히 거부했습니다.자신이 가르치는 내용을 "사용"하지 않은 교수가 없다면 문자 그대로 모든 것이 머리 속에 있습니다.

플러그:DePaul University에서 Comp Sci 학사 및 Soft Eng 석사 학위를 취득한 저는 주로 파트타임으로 가르치는 강사/교수들에게 배웠습니다. 전날의 일화를 들고 와서 관련을 맺는 편이 낫기 때문에 괜찮았습니다. 수업에 해요.또한 이 학교는 대부분 통학/시간제 학교이므로 대부분의 학생들은 자신이 배우는 내용을 활용하여 직업을 가지고 있습니다.

학습 과정은 여전히 ​​모든 이론으로 시작하지만, 우리는 보통 "얼마나 많은 사람들이 실제로 당신의 직업에서 이것을 사용합니까?"라고 묻습니다. 그리고 전형적인 대답은 "우리는 그것을 사용하지만 제거되거나 단순한 방식으로 사용하고"실용적인 실제 시나리오로 들어갑니다.

내 학교 단위 테스트 중에는 항상 존재했습니다.Java로 시작하더라도 모든 프로젝트에 ANT와 JUnit을 사용하도록 했습니다.빌드 구성 및 단위 테스트를 시작하는 것이 좋았습니다.

그리고 제가 수강한 수업 중 3~4개 정도에는 익스트림 프로그래밍이 포함되어 있었습니다.나는 그들이 모두 쌍 프로그래밍에서 단위 테스트(위 참조)에 이르기까지 12가지 다른 측면으로 시작했다는 것을 기억합니다.그리고 이제는 Agile에 초점이 맞춰진 것 같습니다.

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

단위 테스트와 버전 제어는 제가 대학에 다녔던 2학년 컴퓨터 공학 과정에서 가르쳤습니다.단위 테스트는 화이트 박스와 블랙 박스의 차이도 포함하는 테스트 부분에 속했으며 3학년 프로그래밍 과제의 상당 부분은 단위 테스트에서 쉽게 발생할 수 있는 오류 처리를 잘하는 데 사용되었습니다.

애자일 개발은 학문적 환경에서 가르치기가 다소 어려울 수 있다고 생각합니다.이론적으로는 폭포수 방법을 배웠지만, 졸업하고 학계와는 상당히 다를 수 있는 현실 세계로 이사하기 전까지는 현장에서 그것을 볼 수 없었습니다.3학년 때 나는 이상한 오류 사례를 모두 처리하고 세마포어에 대해 나에게 가르쳐주려고 했던 과제의 핵심을 전혀 건드리지 않은 과제를 거의 통과할 뻔했습니다.

또한 애자일이 나온 지 얼마나 되었으며 어떤 형태의 애자일을 의미하시나요?내가 본 것과는 다양한 구현이 있습니다.

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

버전 제어 및 단위 테스트 방법은 언어나 이를 정의하는 사람에 따라 계속 변경되고 종속됩니다.

데이터 구조와 알고리즘은 수업 환경에서 작업할 수 있는 것입니다.솔직히 말해서 단위 테스트 및 버전 관리를 이해하는 데 훨씬 더 많은 노력이 필요합니다.대학의 일부는 스스로 가르치는 법을 가르치는 것임을 기억하십시오.콜라주에는 동일한 권한이 없습니다.아니면 적어도 같은 정도는 아닙니다.IMHO.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top