champMan
458
2019-03-15 21:06:13
49
3409

c언어에 대해 다시 생각해봐야 하나봅니다..


밑에글을 썼는데 c에 대해 다시 생각이든게

보통 c언어가 1학년때 배우는 언어라서

다른언어를 배우는데 가장 기본이 된다고 생각했는데

그래서 좀더 다른언어에 비해 쉽다라는 생각을 해봤었는데 그게아닌걸까요?

좀더 깊게 c를 다루면 쉽다고 볼수는 없는거죠?

그리고 많은 기업에서 현재 c언어로도 개발을 실제로 많이 하고있을까요?

자바나 뭐 c++보다는 덜 하겠지만요



2
3
  • 댓글 49

  • defult
    797
    2019-03-15 21:09:59 작성 2019-03-15 21:20:39 수정됨

    임베디드의 경우 c와 c++병행해서 개발 많이 합니다.

    경우에따라서 c단독이기도 하고요.


    컴퓨터공학의경우 하드웨어 제어관련도 교과에 포함되는경우도 많기에 c가 시작언어로 사용되는건 쉽게 안바뀔겁니다.

    0
  • fender
    12k
    2019-03-15 21:34:58 작성 2019-03-15 21:38:00 수정됨

    언어간의 관계는 보통 분야가 나뉘는 것이지 1단계로 이 언어를 마스터하고 2단계로 다른 언어를 하는 것이 정석이라던지 그런 식으로 갈리지는 않습니다.

    C언어는 윗분 말씀대로 임베디드나 리눅스 커널 개발 등의 분야에서 지금도 주력으로 사용하고 있습니다.

    반면, 분야와 무관하게 아직 C언어가 '기본'이라는 인식이 남아있다면 아마 역사적인 이유일 것 같습니다. 과거엔 개발 분야가 덜 복잡하고, 분화도 덜되었고, 널리 쓰이는 언어 종류도 많지 않아서 C언어를 알면 두루두루 써먹을 수 있는 그런 분위기이긴 했습니다.

    0
  • 삽삽
    182
    2019-03-15 21:44:16

    역사적인 이유라기보다는 c가 그나마 기계랑 제일 가까운 언어이기때문이죠. 따라서 다른 언어나 프레임워크 등을 생각할때  C에 대한 지식이 있으면 그게 어떻게 만들어졌고 내부는 대츙 어떻게돌겠구나하는 감이 생긴다고 봅니다. 그런 목적이 아니라면 굳이 c를 첨부터배울필요는없죠.

    1
  • fender
    12k
    2019-03-15 21:49:52 작성 2019-03-15 21:51:26 수정됨

    삽삽 // 제가 볼 땐 그런 접근 자체가 어느 정도 역사적 유물인 것 같습니다. 과거엔 하드웨어 윗 쪽으로 계층이 별로 없었기 때문에 저수준 지식을 알면 말씀대로 다른 분야에도 감이 생기는 경우가 많았지만, 지금 시점에선 그건 보편적이기 보단 꽤 예외적 상황으로 보아야 합니다.

    하드웨어나 C 언어를 하면 스프링부트의 구조가 잘보인다던지 리액트를 빨리 배운다던지 머신러닝을 더 근본적으로 이해할 수 있다던지 하는 건 아니니까요.

    1
  • 더미
    11k
    2019-03-15 23:24:36

    c언어 쉽지않아요.

    0
  • 삽삽
    182
    2019-03-15 23:32:44
    글쎄요. 결국 리액트나 스프링 말씀하셔서 얘기해보자면 자바스크립트건 자바건 결국 기반이 C일텐데요. 물론 스프링이나 리액트 사용법정도 익혀서 써먹는거라면 상관없겠죠. 머신러닝 자체는 개발하곤 크게 관련없고 순전히 모델링과 해석이 주라서 케이스에 맞지않습니다.
    0
  • 삽삽
    182
    2019-03-15 23:34:35

    기반이 C라는건 문법얘기하는게 아니라 메모리 할당 해제같은 기저동작들을 말하는거였습니다

    0
  • champMan
    458
    2019-03-15 23:50:15

    삽삽 c가 기계랑 제일 가까운 언어라는것은 c가 메모리와 관련된 부분이 많아서 그런건가요?

    0
  • champMan
    458
    2019-03-15 23:52:11

    아 그리고 자바는 c언어를 기반으로 해서나왔다고는 볼수 있는거같은데

    만약 자바를 주력으로 공부한다면 c언어를 같이 공부할시 시너지효과는 좀있으려나요

    만약 초심자가 아무언어도 안했다면요..

    0
  • fender
    12k
    2019-03-15 23:58:07 작성 2019-03-16 00:02:27 수정됨

    삽삽 // 그렇게 따지면 모든 전자기기는 다 전기로 돌아가니 전기만 공부하면 컴퓨터에 관한 건 모두 마스터할 수 있다는 것이나 같은 차원의 이야기가 됩니다.

    JVM이나 자바스크립트 엔진 내부가 C라고 해서 C를 배우면 의존성 주입이나 반응형 아키텍쳐 같은 걸 조금이라도 쉽거나 깊이있게 이해할 수 있는 것도 아닙니다.

    리액트나 스프링이나 어차피 익혀서 써먹는 거 간단하다라고 생각하실지 모르겠습니다만, 문법 알고 예제 따라치는 수준에서 말하자면 C이건 어셈블리건 별거 없긴 마찬가지입니다.

    2
  • fender
    12k
    2019-03-16 00:08:09 작성 2019-03-16 00:44:41 수정됨

    champMan // 개인적으로는 자바를 주력으로 공부하신다면 C보다는 코틀린, 자바스크립트, 또는 C# 정도를 권해드리고 싶습니다.

    C와 자바는 개념적으로나 분야로 보나 큰 접점은 없지만, 코틀린이나 스칼라 같은 경우 같은 JVM에서 구동 되면서 좀 더 언어에 대한 시각을 넓힐 수 있는 기회를 제공할 수 있습니다. 특히 코틀린은 개발도구 지원도 좋고 모바일 쪽 입지도 강화될 가능성이 높기 때문에 자바 개발자가 배워두기에 좋은 언어라고 생각합니다.

    반면 자바스크립트나 타입스크립트는 자바로 웹 관련 실무를 할 경우 점점 접할 일이 많아질 것이고 여차해서 자바가 해외와 마찬가지로 기세가 꺾인다면 차선으로 고려해볼 수 있는 언어이기도 합니다.

    C#의 경우 국내는 특수한 환경탓에 시장 상황이 별로 좋지 못해서 마지막에 적었지만, 자바와 개념적으로 가장 흡사하면서 자바와는 달리 데스크탑 응용프로그램이나 게임까지 다양하게 활용할 수 있고, 향후 크로스플랫폼 쪽으로도 어느 정도 영역을 확장할 가능성이 있다고 봅니다.

    1
  • void__
    91
    2019-03-16 01:54:28 작성 2019-03-16 02:23:03 수정됨

    정확히 말하면 C언어 자체보다는 컴파일러 종속 기능들과 개발환경 (아키텍쳐, 주변장치 레이아웃) 이해가 제일 시간 걸리고 까다롭죠. 정밀제어를 위한 GNU 매크로들만 해도 C언어 기초 배우는 시간에 비할 바가 아닙니다. 분명 프로그램 로직은 올바른데 처음하는 사람은 이해 못할 동작을 하는 경우도 많고 (최적화 방지의 부재 등) 결국엔 이슈들을 로우레벨 디버깅으로 해결하는 수밖엔 없습니다. 올바른 인라인 방식만 해도 C 스탠다드 별로 (또는 가끔 프로세서 제조사별로) 다르는 등 정말 크리티컬한 오류가 없으려면 읽어야 할 자료 양이 많습니다. 기초 지식만으로 실무에 들어가면 '프로그램 로직은 문제 없는데 왜 이렇게 돌아가지?'라는 질문을 수없이 해야 할 겁니다. 뭐 제 의견은 언어 자체는 매우 쉽지만 volatile이 프로그램 동작에 중요한 영향을 끼치게 되는 순간 이후부터 난이도 상승폭이 크다고 봅니다.  C 몆천줄보다 링커 100줄이 더 시간걸리는 시점부터는 C가 쉽다고 말 절대 못하죠.


    자바와 병행에 관해선 아래 유튜버분과 생각이 같습니다.


    다만 웹 분야라면 이런 말은 걸러 들어야 할수도 있겠죠. 웹쪽에서 저수준이나 메모리 관리를 알아야 할 필요가 있는지는 저는 모릅니다.

    0
  • 웅이와함께
    338
    2019-03-16 03:34:48 작성 2019-03-16 03:37:42 수정됨

    C언어 쉬워서 제일 먼저 배우는거 아니에요.. C언어를 기본으로 배운다는 이유는 C언어가 현대 언어들의 베이스이고 C언어는 로우레벨을 다루는 언어이기 때문에 C를 하면 자연스럽게 컴퓨터구조라던가 메모리에 대한 개념 같은 컴퓨터사이언스 전반을 익힐 수 있기 때문에 C를 기본으로 배우는 겁니다. 깊이 들어가면 C가 제일 어렵습니다..

    2
  • fender
    12k
    2019-03-16 08:43:20 작성 2019-03-16 09:48:47 수정됨

    우선, 반복되는 주제이고 초보 개발자분들이 중요하게 생각하실 내용이니 조금 강하게 주장을 하는 걸 양해 바랍니다.

    소프트웨어 공학은 기본적으로 복잡도와의 싸움입니다. 초창기 PHP와 같이 특별히 접근성을 강조해서 쉽게 만드는 언어도 있긴 합니다만, 보통 프로그래밍 언어나 API가 '쉽다'는 것은 그 기술이 초보자를 위한 것이란 뜻이 아니라, 해당 계층 아랫쪽의 복잡도를 감추어 줄테니 대신 그 윗쪽으로 더 높고 복잡하게 상부 구조를 올려보라는 의미입니다.

    초창기에야 어셈블리 알고 C언어 알면 못하는 게 없었습니다만, 소프트웨어가 발전하면서 복잡도가 폭발적으로 증가하는 바람에 더 이상 하드웨어를 직접 제어하는 수준에서 보통 인간의 두뇌로 감당할 수 없는 단계가 되었습니다. 그래서 다들 추상화니 계층화니 하는 것을 고려하게 되었고, 그 결과 객체지향이니 디자인패턴이니 하는 소프트웨어공학적 고려가 발전했으며, 다시 추상화의 방식을 놓고 함수형 같은 시도가 나오고 단방향 아키텍쳐니 반응형이니 하는 고려를 하고, 언어 윗쪽으로도 마이크로서비스니 서버리스니 이벤트 소싱이니 하는 다양한 고민을 하는 것입니다.

    C언어가 가장 근본이고 기계를 알아야하고 메모리를 직접 다루니 제일 어렵다는 이야기는 단지 그 계층 윗쪽으로 얼마나 높은 탑이 쌓여 있는지 인지하지 못하기 때문에 하게되는 주장입니다.

    특히 우리나라의 경우 자바 의존도가 비정상적으로 높고 SI라는 묘한 관행이 시장을 잠식해서 자바로 웹개발하면 그냥 문법 좀 익히고 프레임워크 몇 번 따라 해보고 페이지 막 찍어내는 그런 부류의 개발만 보다보니 자바나 자바스크립트 같은 '쉬운' 언어들을 무시하는 경향이 고착화된 면도 있습니다.

    그렇다고 C언어로 하는 일이 더 쉽다는 말은 아닙니다. 위에서 언급된 개발 환경 상의 어려움이나 하드웨어 의존성으로 인한 복잡성은 분명 존재합니다. 다만 이는 앞서 이야기한 대로 C개발자나 자바 개발자나 두뇌가 처리할 수 있는 복잡성이라는데는 한계가 있기 때문에, C언어의 복잡성이 그런 부분에서 발생한다면 자바 언어에선 더 윗쪽 계층에서 발생한다는 차이일 뿐입니다.

    언어 자체만 봐도 C언어 포인터 이해하기 어렵다지만 그게 스칼라 타입시스템 같은 걸 이해하는 것보다 어려운 것도 아니고, 언어 외적으로도 하드웨어 특성 고려하고 제한된 환경에서 개발하는데 어려움이 있다지만 그게 고가용성 클러스터 구축하고 병렬처리 시스템 만드는 등의 작업보다 근본적으로 복잡한 내용도 아닙니다.

    오히려 굳이 따지자면 깊게 파고 들면 고수준 언어들을 다루는 분야가 저수준 보다 복잡하면 복잡하지 더 단순하진 않습니다. 왜냐하면 바닥은 정해져 있지만 위로는 한계가 없기 때문에, 아래로는 결국 하드웨어에서 끝나지만 윗쪽으로는 기술 발전 등으로 지금 하는 일이 쉬워지면 그걸 바탕으로 이전엔 하지 못했던 일을 하게 해주는 상부 계층이 계속 생겨 나기 때문입니다.

    피상적 언어 특성 가지고 C언어가 저수준이라 가장 근본적이고 복잡하다고 하는 건 보통 그 보다 더 위로는 단순 CRUD 시스템 이상으로 복잡한 것을 접해본 적이 없기 때문에 생기는 편견일 뿐입니다.

    제가 이 주제에 민감하게 반응하는 이유는, 그런 편견이 특히 자바와 같은 고수준 언어를 주력으로 삼는 초보 개발자들에게 부정적인 영향을 줄 수 있기 때문입니다.

    언어나 기술을 다양하게 공부하는 것은 매우 바람직한 일이긴 합니다만, 시간 역시 중요한 자원인 이상 이왕 공부를 한다면 가능하면 주력으로 삼는 분야와 상승 작용을 할 수 있는 주제를 선택하는 것이 중요할 것입니다.

    문제는 C와 자바의 경우 계층상 꽤나 멀리 떨어져 있으며 일반적인 업무에서 흔히 접접을 찾기 어려운 관계라는 것입니다. 예컨대 자바를 하면서 자바스크립트를 하면 프론트엔드까지 확장해서 풀스택 개발자를 노려볼 수도 있지만, 자바를 하면서 하드웨어를 잘 안다고 특별히 시너지가 되는 일은 흔하지 않습니다.

    차라리 언어 바깥 쪽 구동 환경을 고민한다면 클라우드 환경에서 가상화 시스템 구축 같은 주제를 공부하는 게 커리어 상으로도 훨씬 큰 도움이 됩니다.

    안타깝게도, 막연히 어떤 '근본 기술' 같은 게 존재한다는 생각에 객체지향 설계도 못하는 자바 개발자가 운영체제, 메모리를 배우고 디자인 패턴은 몰라도 알고리즘 문제 풀이에만 천착하는 식의 접근으로 정작 자신의 주력 분야에선 커리어 내내 특정 프레임워크 가지고 CRUD 코드만 뽑아내면서 무언가 저수준을 더 깊게 공부했으면 지금보단 더 고차원적인 코딩을 할 수 있지 않았을까 하는 환상에서 벗어나지 못하는 경우를 자주 보는 듯 합니다.

    자바 언어가 주력이고 단순히 일반적인 SI 수준에서 써먹는 기술 이상의 기반을 쌓고 싶다면 하드웨어나 운영체제 같은 주제에 집착할 것이 아니라 차라리 사용하는 스프링 부트 같은 프레임워크를 직접 만들어 보려면 어떤 종류의 지식이 필요한가를 화두로 공부해보아도 괜찮다고 봅니다. 그게 자바 개발자가 알고리즘 문제만 푸는 식의 공부보다는 훨씬 실력 향상에 도움이 되는 방향입니다.

    물론 하드웨어부터 클라우드까지 못하는 게 없는 개발자가 아예 존재하지 않는 건 아닙니다만, 그건 C 같은 '근본 기술'을 열심히 해서 그렇게 된게 아니라 그냥 그 사람들이 천재이기 때문입니다. 그 정도 재능이면 어디서 시작해도 그런 성과를 낼 수 있습니다.

    11
  • 시빛
    167
    2019-03-16 08:49:35

    간단하게 말하자면 컴공이기 때문입니다. ㅎㅎ

    씨언어가 그나마 하이레벨 언어 중에서 가장 기계에 가깝기 때문이고, 가장 기저에 깔린 언어이기 때문이겠죠.

    사실 메모리 관리 등의 지식 자체는 분야에 따라 작동방법을 몰라도 상관없을 수 있지만 컴공은 학문이기 때문에 아마 패러다임이 바뀌지 않는 한은 계속 C를 배울 것 같습니다.

    c 자체는 어려운 언어죠. 문법의 문제가 아니라 관리측면에서 난점이 많아서 어렵다고 볼 수 있겠네요. 문법이 어려운건 c++정도??

    1
  • 삽삽
    182
    2019-03-16 09:00:28

    비유를 이상하게하셨네요. 전기를 알면 전자기기마스터하는건 아니지만 최소한 전자기기를 만드는 사람이라면 납땜이랑 조립만 할줄아는게 아니라 전기의 원리를 알아야하지않을까싶은데요. 이분 축구선수들 훈련할때 축구만열심히하면되지 꼬깔놓고 점프 이런건 뭐하러하냐고 하실듯. c가 어렵다고얘기하는게아니라 기본기익히기 유용하다고 말하고있습니다 저는. 그리고 그게 아니라고 생각하신다면 그거에 대해서는 뭐 다른 드릴말씀은없네요.

    1
  • fender
    12k
    2019-03-16 09:06:53 작성 2019-03-16 09:19:24 수정됨

    삽삽 // 축구 선수들이 기초 체력 연습을 하는 정도는 자바 언어를 하면서도 컬렉션 API 등을 통해 자료구조 같은 내용을 어느 정도 익힐 수 있다는 수준의 이야기입니다.

    반면에 C언어가 자바보다 더 근본이거나 더 어렵고, 자바를 잘하려면 결국 그런 걸 우선 잘해야 한다는 이야기는 어차피 축구든 야구든 근육으로 하는 운동이니 피트니스부터 보디빌더 수준으로 배워야 한다는 차원의 주장입니다.

    야구 선수도 기본적인 수준의 피트니스는 합니다만, 보디빌딩이 야구의 기본도 아니고 야구 프로 선수가 되고 싶은 학생이 타격이나 수비 기본기 배울 시간에 피트니스를 더 많이 한다면 결국 야구 선수도 보디빌더도 못될 확률이 높습니다.

    1
  • 앙앙이
    3k
    2019-03-16 10:19:13 작성 2019-03-16 10:22:24 수정됨

      관계형 DB 갖고 게시판을 설계할때 ER 모델과 sql 이 가장 중심에 있지만

    각 DB 별 특성도 알아야 설계를 제대로 할 수 있습니다.


    DB 특성의 대표적인 경우가 mysql DB 에서 select count(*) 와 검색 범위 설정하는 방법 입니다.

    게시판 설계에서 이 비중은 참 작지만 이거 무시하고 설계를 하여 구현해서 실행하여 실제 DB 데이터가 많이 쌓인후 그 부작용을 알고 수정을 하고자 할때에는 많은 비용이 발생합니다.


    c 언어를 공부하라는 말은 거창하게 c 언어만 죽어라 깊이 파라는 말이 아닙니다.

    자료구조 기초 과정 정도 구현 할 줄 아는 단계까지 학습을 말합니다.

    자료구조 기초 과정으로는 정렬, 스택, 링크드 리스트로 구현한 큐, 원형큐 정도를 말합니다.

    진짜 포인트가 무엇인지 경험할려면 이거 갖고는 부족하다 할 수 있지만 c 언어 입문자라면 이 정도까지로 충분하다고 생각합니다.

    1
  • fender
    12k
    2019-03-16 10:23:24 작성 2019-03-16 10:27:07 수정됨

    앙앙이 // 자료구조 배우는 것과 C언어는 별 상관없습니다. 당장 지금 구글에서 영어로 자료구조 강의 검색했을 때 가장 먼저 나오는 두 코스에서 사용하는 언어는 파이선, 자바, C++입니다.

    여담이지만 컴퓨터 사이언스나 공학 관련 전공자가 C를 우선 배우는 것도 지금 시점에서는 다분히 역사적인 이유입니다.

    국내 추세는 어떤지 모르겠습니다만, 해외 학교들은 한 번 자바가 대세가 된적이 있고 지금은 파이선을 많이 쓰는 것으로 알고 있습니다.

    예를들어 미국의 상위 컴퓨터 사이언스 학부 20개 중 파이선을 가르치는 곳이 13군데, 자바가 11군데인 반면 C는 4군데에 불과합니다.

    0
  • 앙앙이
    3k
    2019-03-16 10:33:43

    // fender

    프로그래밍 입문자한테 자료구조 기초 과정을 c 언어로 구현하는 정도까지만 c언어 학습을 강조한것입니다. c 언어 어디까지 공부해야 하는가 라는 기준이 있어야 하지 한다고 생각하여 그 기준을 제시한것 뿐입니다.

    1
  • 삽삽
    182
    2019-03-16 10:34:00 작성 2019-03-16 10:40:03 수정됨

    이미 강한 신념을 가진사람을 설득하는건 불가능하다고봅니다. 덧붙여 여담으로 체육학 석사밟다온 사람으로 말씀드리자면 탑급으로 갈수록 기본적인 피트니스 수준이 아닌 하드코어한 피지컬 트레이닝 겸합니다. 물론 c를 하드코어하게 하라는건 아닙니다. 그리고 탑급 플레이어들은 자기 필드 스포츠 뿐만아니라 웨이트 트레이닝이나 드릴들에 대한 지식도 가지고있습니다

    1
  • fender
    12k
    2019-03-16 10:53:39 작성 2019-03-16 11:01:22 수정됨

    앙앙이 // 지금 논의의 주제는 주력 언어가 자바인데 C가 자바보다 '기본'이니 먼저 배워야할 이유가 있는가입니다.

    그런 목적으로 C를 배운다면 그 정도 수준에서 자료구조를 배우는게 유용할 수는 있습니다. 그런데 애초에 자료구조를 배우겠다고 C를 직접 사용하지 않는 분야의 커리어를 생각하는 개발자가 C를 배울 이유가 없다는 것이 핵심입니다.


    삽삽 // 제가 무슨 혼자서 소수 의견을 우기고 있다고 생각하시는 듯 한데, 위에서 언급한 내용들은 우리나라 경계만 벗어나면 거의 보편적으로 받아들여지는 내용입니다.

    주류 의견이 자바 같은 언어를 하기 위해서 C를 먼저해야 한다는 것이라면 왜 미국 주요 컴퓨터 사이언스 학부에서 C를 안가르친다고 보시나요?

    제가 신념이 강해서 설득이 안되는 것이 아니라, 학부에서 아직 C 중심으로 가르치고 자바라면 그냥 스프링으로 웹 화면이나 뽑아내는 게 전부인 환경에 다들 익숙해서 추세에 무지한 것 뿐이라고 봅니다.

    참고로 스택 오버플로우에서 관련 주제로 검색하면 가장 처음 나오는 내용입니다:


    정리하면, C 언어가 기본이라는 식의 인식이 외국이라고 없는 것은 아니지만 지금은 소수 의견일 뿐이고, 대학이나 실무나 더 이상 그런 저수준 지식을 모든 분야의 기본으로 인식하지 않고 있습니다.

    지금 시점에서 C 언어는 고수준 분야의 개발자 입장에서는 배워두면 재미있거나 유용할 수 있는 여러 기술 중 하나일 뿐, 무언가 더 기본이 되거나 필수적인 기초 쯤 되는 그런 입지가 아닙니다.

    1
  • fender
    12k
    2019-03-16 11:06:35
    0
  • 삽삽
    182
    2019-03-16 11:30:20 작성 2019-03-16 11:31:34 수정됨

    하하...자꾸 논지에서 빗나가시는데 교육기관인 대학에서는 당연히 가르치기쉽고 흥미도 생기고 실무에서 접하는 파이선 자바 위주로하겠죠. 세상이 변했으니까요. 제 주장은 일관되게 "c가 기본기를 익히고 사고하는데 도움이된다" 였지 무조건 c를 배워야한다가 아니였을텐데요. 애초에 그럴이유가 아니면 굳이 배워야할필요없다고 까지했구요. fender님이 주장했던건 "그건 단지 역사적 잔재일뿐이고 현재는 해당사항없다" 였습니다. 대학에서 c를 덜배운다고해서 c가 기본기에 도움이된다는 사실자체는 변하지않습니다.

    1
  • 더미
    11k
    2019-03-16 11:31:25

    씨를 처음 배우는건

    교수들이 귀찮은 이유도 있고

    그냥 절차지향적 언어라서 그렇습니다.

    0
  • fender
    12k
    2019-03-16 11:40:56 작성 2019-03-16 11:47:59 수정됨

    삽삽 // 제 생각엔 논지에서 빗나간 것은 삽삽님인 것 같습니다.

    이 토론의 주제는 "C 언어가 기본기에 해당하기 때문에 다른 언어에 비해 먼저 배워야 하는가" 였지 단순히 "C를 배우면 좋은가"가 아니었습니다. C가 도박이나 도둑질도 아닌데 배워서 나쁠리가 있나요? 그게 과연 다른 중요한 내용을 제쳐두고 우선시할 가치가 있는 내용인가가 핵심이죠.

    삽삽님이 처음 주장하신 내용을 정확하게 인용하면 이렇습니다:

    다른 언어나 프레임워크 등을 생각할때  C에 대한 지식이 있으면 그게 어떻게 만들어졌고 내부는 대츙 어떻게돌겠구나하는 감이 생긴다

    이 주장이 그럼 "C언어는 기계에 가까워서 배우면 다른 언어나 해당 언어의 프레임워크를 이해하는데도 그 언어만 배우는 것보다 도움이 된다"라는 내용이 아니라 "다른 언어 프레임워크 익히는데는 그냥 그 언어를 제대로 배우면 충분하지만 C를 배워도 조금은 도움이 된다"는 말씀이셨던가요?

    교육기관인 대학에서는 당연히 가르치기쉽고 흥미도 생기고 실무에서 접하는 파이선 자바 위주로하겠죠... 대학에서 c를 덜배운다고해서 c가 기본기에 도움이된다는 사실자체는 변하지않습니다.

    그리고 C가 아직 프로그래밍의 '기본기'라는 주장도 계속하고 계신데, 그럼 삽삽님이 보시기에 미국의 주요 대학들은 프로그래밍의 기본을 가르치는데 단지 C는 가르치기 힘들고 학생들이 지루해하니 그런 기본기를 무시하고 있다고 생각하시나요?

    참고로 요즘에 프로그래밍 언어에서 '기본기'라고 생각하는 것들은 객체지향적 사고나 함수형의 이해 같은 내용들이지 포인터 다루거나 하드웨어 제어하는 그런 내용이 아닙니다.

    그래서 파이선 같은 고수준 멀티 패러다임 언어가 대학에서 각광을 받는 것이고, 객체지향이나 함수형 같은 패러다임 적용이 까다로운 C를 첫 언어로 가르치지 않는 것입니다.

    2
  • 삽삽
    182
    2019-03-16 11:49:11 작성 2019-03-16 11:50:52 수정됨

    "C언어는 기계에 가까워서 배우면 다른 언어나 해당 언어의 프레임워크를 이해하는데도 그 언어만 배우는 것보다 도움이 된다" 가 맞습니다. 저 주장에 아니라고말씀하시는거라면 할말이 없습니다. 그리고 C를 통해 기본기를 익히기 "유용"하다고 주장했자 "C자체"가 기본기이므로 배워야한다고 말한적은 없습니다. 그리고 대학얘기는 바로 위에서도 얘기한것처럼 교육효율의 문제이지 그렇다고해서 제가 주장하는 C의미가 달라지진않습니다. C가 기본기익히기 유용한건 사실입니다. 하지만 저도 학생가르치라면  파이썬가르칩니다. 계속같은얘기만 하는거같은데 저는 여기까지하겠습니다. 이겼다고 생각하시던 유익했다고 생각하시던 알아서하시길바랍니다.

    0
  • fender
    12k
    2019-03-16 11:57:09 작성 2019-03-16 12:10:07 수정됨

    삽삽 // 내용을 오독하신 것 같습니다. 그 주장이 아니라는 게 아니라 그런 주장이니 반박을 한 것이라는 내용입니다. 다시 한 번 읽어보세요.

    솔직히 저는 "C는 언어와 무관하게 프로그래밍 기본기를 익히기 위해 유용하다"와 "C는 언어와 무관한 기본이니 배워야 한다"가 지금 논의 맥락에서 얼마나 유의미한 차이가 있는지 모르겠습니다. 그게 그렇게 중요한 차이라고 생각하시면 전자로 주장을 바꾸셔도 무방합니다.

    어느 쪽이건 하드웨어나 메모리 관리 같은 주제가 분야와 무관한 '기본기'라는 1-20년 전 쯤에 통용되던 상식에 기반한 주장이라는 건 동일하니까요.

    참고로 저는 이런 문제에는 다양한 이견이 있을 수 있다고 생각해서 다른 주장도 근거만 있다면 충분히 존중할 의향이 있습니다.

    하지만 "내가 이렇게 생각한다"와 "너 빼고 다들 그렇게 생각한다"의 차이는 큽니다. 후자의 주장이라면 객관적인 근거가 있어야지요.

    해외의 추세를 근거를 들어 소개해도 그게 "니가 신념이 강해서 인정 못하는거야"로 퉁쳐버리고 미국 대학들이 더 이상 C를 기초로 안가르친다고 해도 "대학이 어떻든 아무튼 C는 기본기 익히는데 좋은게 사실임"하고 주장해 버리면 더 이상 건설적인 토론이 의미가 없다고 봅니다.

    1
  • 심심한사부
    927
    2019-03-16 12:35:37

    c언어는 하드웨어와 시스템을 다루는곳에 어셈블리어를 대신해 많이 사용되기 때문에

    현재에는 임베디드 전공자와 리눅스 커널을 고치거나 그 주변에서 개발하는 사람들이 주로 실무에서 많이 사용합니다.

    30년전에 c언어를 쓸때는 책 앞장에 하이레벨이는 말이 어느정도 타당했지만 지금 사용처를 보면

    c언어는 낮은 단계의 고급 어셈블리어라는 말이 더 설득력이 있습니다.


    일반인이 c언어를 기초과정이라고 배우는건 많이 잘못된 방법이라고 보여지고

    차라리 Java, python, c# 등의 입문 과정을 배우는게 더 좋은 선택이라고 생각됩니다.


    세상 어디 배워서 도움 안되는게 있나요.

    하지만 영어를 배우는데 라틴어부터 시작하는 사람은 많이 돌아가는거에요...



    1
  • EF
    898
    2019-03-16 12:49:47 작성 2019-03-16 13:00:39 수정됨

    fender님이 해외 추세를 예로 드셨는데, "시작"언어가 python, Java일뿐이지 대부분의 학교는 저학년 필수과정에 어셈블리어나 C를 포함하고 있습니다. 오히려 C를 필수과목으로 가르치지 않는 학교를 찾기가 힘들겁니다.

    물론 예전보다는 하드웨어 지식에 대한 의존도가 많이 줄어든 것은 사실이나 결국 프로그램이라는 것은 메모리에 로드 되어서 프로세서에서 구동되는 것입니다. 알지 못해도 개발자는 될 수 있습니다. 좋은 개발자가 되지 못할 뿐이죠.

    '"너 빼고 다들 그렇게 생각한다"의 차이는 큽니다. 후자의 주장이라면 객관적인 근거가 있어야지요.'

    라고 말하셨는데 전혀 "너 빼고 다들 그렇게 생각한다"고 생각하진 않습니다. 대부분의 전문가가 그렇게 생각한다고 생각할 뿐입니다. 위에서 말했다시피 해외 대학에서 C로 교육을 시작하지 않는다고 해서 C를 과정에서 빼버렸다는 것은 이상한 주장입니다. 첫 과목이 C가 아니더라도 두번째나 세번째 필수과목은 대부분 로우레벨 과정으로 되어있습니다.

    1
  • fender
    12k
    2019-03-16 12:57:43 작성 2019-03-16 13:02:52 수정됨

    EF // 저는 거기서부터는 조금은 다른 이야기라고 생각합니다. 컴퓨터 공학이나 사이언스에서 운영체제나 네트워크 등 관련 분야 전반을 두루두루 다루어 보는 것은 이해할 수 있는 것이고, 그런 관점에서 보면 C 언어를 배우는 것은 의미가 있습니다.

    하지만 과연 C에서 주로 다루는 메모리나 하드웨어 지식들이 다른 프로그램 언어를 배우는 데도 기본기가 되는 것인가는 다른 관점의 이야기라고 봅니다.

    예를들어 데이터베이스도 이 분야의 주요 주제이니 학부 때 강좌를 개설하겠다는 것과 데이터베이스를 배우면 자바언어나 스프링 같은 기술도 보다 '근본적'으로 이해하는데 도움이 되거나 필수적이다라는 것은 다른 종류의 이야기니까요.

    특히 아직 분야가 정해지지 않은 학부생이라면 저수준, 고수준을 가리지 않고 시간이 허용하는 한 최대한 다양한 분야를 경험해 보는 것이 바람직하다는 데는 저도 전적으로 동의할 수 있습니다.

    하지만 예를들어 C 언어의 제반 지식, 또는 하드웨어나 메모리 관리 등 주제가 자바나 파이선 같은 언어를 주력으로 배우는데 근본적인 기본기가 된다는 것은 동의하기 어렵습니다. 그리고 대학에서 말씀처럼 "시작"언어로 더 이상 C를 선택하지 않는 것도 그런 관점의 반영이라고 봅니다.

    특히 실무에 바로 뛰어든 비전공자의 입장이라면 배우면 좋은 것과 배워야 하는 것 사이에 적절한 우선 순위를 설정하는 것은 더욱 중요할 것입니다.

    그런 관점에서 전자에 속하는 것이 단지 관행이나 추세를 따라가지 못해서 후자에 속하는 것으로, 더욱이 그 중에서도 가장 '근본'이 되는 무언가로 인식하는 현상은 경계해야할 필요가 있다고 봅니다.

    1
  • EF
    898
    2019-03-16 13:02:41 작성 2019-03-16 13:11:37 수정됨

    운영체제, 네트워크, 데이터베이스 등과는 성격이 다른게 그 과목들은 필수 과목이 아닌 선택과목으로 되어있는 경우가 대부분입니다.

    컴퓨터 구조, 자료구조등은 다시 한번 말하지만 저학년들이 반드시 거쳐야 되는 "필수 과목"입니다.


    증거 찾아오시라고 하셨으니 증거:

    스탠포드 CS107가 코어 필수과목 https://cs.stanford.edu/degrees/ug/Requirements.shtml#Core

    하버드 Basic Software 3과목중 한개 C61 https://handbook.fas.harvard.edu/book/computer-science

    UC버클리 61c https://eecs.berkeley.edu/resources/undergrads/cs/degree-reqs-lowerdiv

    카네기 멜론 15-213 https://www.csd.cs.cmu.edu/academic/undergraduate/bachelors-curriculum-admitted-2017


    1
  • fender
    12k
    2019-03-16 13:37:54 작성 2019-03-16 13:54:37 수정됨

    EF// 제 기억에 미국 관련 학부들에서 C나 어셈블리를 따로 '필수 과목'으로 지정하는 건 거의 본 적이 없습니다. 반면 데이터베이스나 운영체제는 대학에 따라 들어가는 경우가 꽤 많은 것으로 알고 있습니다. (당장 

    애초에 언어 자체는 앞서 언급한 프로그래밍 입문 같은 경우가 아니면 필수과목으로 잘 지정하지 않습니다. 보통 타입 이론이든 자료구조든 그런 추상적 내용들이 주로 필수 과목에 해당하고, 운영체제 같이 저수준이 필요한 과정이 있다면 해당 과정 내에서'prerequisite' 정도로 필요한 만큼 다루는 수준일 겁니다.

    글을 쓰고 보니 내용을 추가하셨기에 확인하고 이어 적습니다만, 하바드의 경우 해당 과정은 C 언어 자체가 아니라 머신 프로그래밍에 특화된 과정이고 3중에 2개를 고를 수 있는 선택 사항입니다.

    UC 버클리의 해당 과정 역시 확인해보면 역시 C 언어 자체를 배우는 것이 아니라 컴퓨터 구조에 대한 과정에서 어셈블리와 함께 연관 내용이 포함되어있을 뿐입니다.

    카네기 멜론은 상세 내용이 자세히 나오지 않아 확인은 어렵습니다만, 제목으로 보면 역시 컴퓨터 시스템에 대한 과정으로 보입니다. 한 편 같은 목록에 있는 '함수형 프로그래밍의 이해'라는 필수 과정은 보다 직접적으로 프로그래밍에 대한 내용이 맞을 겁니다.

    다시 강조하지만 저는 C는 더 이상 배울 필요가 없다는 식의 주장을 한 적이 없습니다. C 언어나 저수준 지식이 자바나 파이선 같은 고수준 언어나 관련 프레임워크를 다루는데 있어서 '기초'나 '기본'이 아니란 뜻이지, 학부에서 필수 과정에 네트워크로부터 확률론까지 들어가는 마당에 저수준 지식만 콕 집어서 빼버리자는 따위의 주장이 아니란 겁니다.

    0
  • fender
    12k
    2019-03-16 13:51:19 작성 2019-03-16 14:09:15 수정됨

    그리고 EF님도 저수준을 모르면 "좋은 개발자가 되지 못한다"라고 하셨는데, 어딜 봐서 객체지향, 디자인 패턴 모르고 C와 어셈블리 잘하는 자바 개발자가 반대의 경우보다 '좋은 개발자'인지 이해를 못하겠습니다.

    함수형 언어를 주력으로 하면서 고차함수 같은 걸 몰라도 CPU 구조를 이해하면 그걸 모르고 고차함수를 잘 다루는 사람보다 '좋은 개발자'인가요?

    "결국 프로그램이라는 것은 메모리에 로드 되어서 프로세서에서 구동되는 것"이니 메모리 다루고 프로세서 구조 알면 모든 프로그램을 더 근본적으로 잘할 수 있다는 이야기는, 다른 분야는 다 그런 '근본지식'의 응용일 뿐이니 필요할 때 배우면 그만이라는 식의 무지 또는 만용의 표현입니다.

    물론 저런 학부에서 다루는 필수 과정을 다 배운 개발자가 그렇지 않은 개발자보다야 좋은 개발자일 가능성이야 높을 겁니다.

    그런데 그렇게 따지면 대부분의 대학에서 C언어는 컴퓨터 구조 등에 곁다리로 들어가도 파이선 자바는 시작 언어로 들어가 있습니다. 그럼 그 과정을 다 배우면 당연히 파이선, 자바, C 다 할 수 있다는 거니 그게 C와 관련된 내용이 더 '근본적'이라는 주장의 근거가 되나요?

    "이것도 배우면 도움이 된다"와 "이 걸 모르면 다른 걸 아무리 잘해도 좋은 개발자는 못된다"는 다른 차원의 주장입니다.

    0
  • 박가사탕
    95
    2019-03-16 14:27:21

    C/C++은 컴파일언어입니다.

    델파이, 코볼등 다른 언어도 있지만

    중요한건 컴파일 언어란 점입니다.


    IT시장은 제품을 만들어도 로컬시장과는 달리

    분야별 1등독식이고 최고기술의 제품만이 살아남구요.

    100명의 회원을 받을때와 달리 1만, 1억이 되고

    네트워크 비용도 기술력에 따라 1000배 이상의

    절약이 가능한 다양한 방법이 존재합니다.


    유명한 오리집은 독점공급이 가능한 농장을

    가지고 있습니다. 동네 오리집은 품질과 가격면에서

    그들을 절대 이기지 못하는데 로컬시장이라 그나마

    살아남는 겁니다.


    결국 VM언어는 사업 초기에 서비스를 맛보기에는

    좋아도 사업이 성공할 경우 반드시 최적화에 돌입하게

    되며 그걸 못해내면 천운을 잃고 그걸 하게되면

    권력의 중심에는 C/C++ 개발자가 자리잡는 겁니다.

    게다가 C#/Java는 디컴파일 다 됩니다.

    사업 좀 될 것 같으면 알고리즘을 빼앗깁니다.

    그럼 서버에서 전부하면? 서버비용때메 망하죠.


    명심하셔야 합니다. 인생이 걸린 문제입니다.

    VM언어를 주력으로 삼으면 개발인생 망칩니다.

    0
  • EF
    898
    2019-03-16 14:32:20

    저는 C를 "C와 어셈블리 잘하는 자바 개발자가 반대의 경우보다 '좋은 개발자'" 라고 이야기 한적이 전혀 없습니다. "상위계층 주제들은 무슨 C언어만 하면 자동으로 쉽게 배워지는 만만한 내용들"이라고 한적도 한번도 없습니다. C 를 배우는 것이 파이선, 자바를 배우는 것보다 중요하다고 한적도 없고, 디자인, 아키텍쳐가 중요하지 않다고 한적도 한번도 없습니다. 저뿐만 아니라 위에 댓글 다신 어떤 분들도 그런식의 막되먹은 주장은 아무도 안했습니다.

    다른 사람이 주장하지 않은 것을  자꾸 반박하려는 것을 "허수아비 때리기의 오류" 라고 부릅니다. 이런 소모성 대화에 끼어들고 싶지 않았으나 해외 대학은 C를 가르치지 않는 추세라는 자료를 가져오시길래 매우 잘못된 방향으로 흘러가는 것 같아서 한마디 드리고자 한것이었습니다.

    제가 말하고자 하는 바를 분명하게 하자면, 하드웨어-로우레벨, 컴퓨터 구조에 대한 교육이 "좋은" 개발자를 양성하는데에 있어서 필수적이고 예나 지금이나 C와 어셈블리어가 그 교육에 적절한 언어이며 국내외 대학 커리큘럼이 이를 증명한다는 것입니다.

    "UC 버클리의 해당 과정 역시 확인해보면 역시 C 언어 자체를 배우는 것이 아니라 컴퓨터 구조에 대한 과정에서 어셈블리와 함께 연관 내용이 포함되어있을 뿐입니다." 제가 UC버클리 학부졸업생이라 잘 알고 있습니다. 다른 학교, 다른 과목, 다른 언어도 마찬가지. C뿐만이 아닙니다 Java도 그렇고 Python도 그렇고 언어 자체를 배우는게 아니라 좀더 근본적인 것을 배우려는 것의 일환 일 뿐입니다. 맨처음 Python을 배웠지만 그렇다고 해서 파이선 장고로 무언가를 만든다거나 Java로 안드앱을 만드는 것을 배운것이 아닙니다. 학문으로서 프로그래밍과 자료구조를 배운 것이죠.  C는 그냥 사이드로 배우는 거라고 생각하시면 Python도 그렇고 Java도 똑같은 논리를 적용하는 것이 가능하다는 겁니다.

    대학이 무조건 옳다! 고 주장하는게 아닙니다. 하지만 대부분의 대학이 어떤식으로든 컴퓨터 구조와 C등을 저학년 때부터 필수 과목으로 가르치고 있다면 그걸 주목해 볼만한 가치는 있다는 겁니다. 하버드에서 3개 중에 2개만 선택해야 된다고 하는데, 이게 우리나라 수능 마냥 좋아하는거 2개 고르는 게 아닙니다. 기초과목 전부 안 들어도 된다고 해서 진짜로 안듣는 학생은 거의 없습니다. 많은 대학들이 컴퓨터 구조 과목을 필수과목 중에 하나로 분류했다는 것의 의미는 "이거 모르면 졸업장은 꿈에도 생각하지 마라" 라는 겁니다.


    4
  • fender
    12k
    2019-03-16 14:40:44

    박가사탕 // 서버 시스템의 성능이나 최적화에 대해 조금이라도 이해를 하신다면 (구체적으로 스케일 업과 스케일 아웃의 차이, 또는 입출력과 언어 자체에서 발생하는 오버헤드의 차이 등) 얼마나 그런 주장이 잘못된 것인지 이해하실 것 같습니다.

    이는 10년 쯤 전에도 완전히 틀린 이야기였지만 클라우드와 가상화의 시대에 와선 거의 괴담 수준의 주장입니다.

    디컴파일 관련해서도 솔직히 현업에서 그런 문제가 개발자 인생을 좌지우지할 만큼 중요했던 적은 한 번도 없었습니다. 자바는 거의 전적으로 서버에서 구동되는 것이고, 클라이언트 프로그램은 보통 완성도라던가 기능으로 승부하지 무슨 대단한 '비밀 알고리즘' 같은 걸 핵심으로 하는 경우는 많지 않습니다.

    차라리 게임같이 해킹이 실질적 위협이 되는 분야라면 이런 저런 해킹 방지 솔루션을 달고 말지 단지 디컴파일이 위험하다고 예컨대 C#을 쓰는 엔진을 C++로 바꾸는 식의 사례는 별로 없습니다.

    그리고 디컴파일 가능성이 그렇게 치명적이라면 애초에 프론트 엔드라는 분야 자체가 지금처럼 뜨지를 못했을 겁니다.

    어떤 소스에서 그런 내용들을 접하셨는지 모르겠습니다만, 둘 다 이제까지 업계의 역사나 추세와 완전히 동떨어진 이야기로 보입니다.

    0
  • fender
    12k
    2019-03-16 14:53:55 작성 2019-03-16 14:58:54 수정됨

    EF // "C와 어셈블리 잘하는 자바 개발자가 반대의 경우보다 '좋은 개발자'라고 한적이 없다"고 강변하셨는데, 직접 쓰신 내용 그대로 인용합니다:

    물론 예전보다는 하드웨어 지식에 대한 의존도가 많이 줄어든 것은 사실이나 결국 프로그램이라는 것은 메모리에 로드 되어서 프로세서에서 구동되는 것입니다. 알지 못해도 개발자는 될 수 있습니다. 좋은 개발자가 되지 못할 뿐이죠.

    이게 "자바 개발자라도 저수준 모르면 좋은 개발자가 못된다"라는 주장이 아니면 도대체 어떻게 해석해야 하나요?

    제가 말하고자 하는 바를 분명하게 하자면, 하드웨어-로우레벨, 컴퓨터 구조에 대한 교육이 "좋은" 개발자를 양성하는데에 있어서 필수적이고 예나 지금이나 C와 어셈블리어가 그 교육에 적절한 언어이며...

    이게 "정말 좋은 개발자가 되려면 반드시 프로세서나 메모리를 등 저수준을 알아야 하며 그래서 C와 어셈블리를 해야한다"는 주장이 아니면 어떻게 해석해야 하나요? 그리고 그런 주장이 맞다면 그걸 뒤집으면 바로 "자바 같은 언어를 아무리 잘 알아도 저수준 지식이 없으면 좋은 개발자가 아니다"가 되는 게 아닌지... 이건 기초 논리의 문제입니다.

     C뿐만이 아닙니다 Java도 그렇고 Python도 그렇고 언어 자체를 배우는게 아니라 좀더 근본적인 것을 배우려는 것의 일환 일 뿐입니다...  C는 그냥 사이드로 배우는 거라고 생각하시면 Python도 그렇고 Java도 똑같은 논리를 적용하는 것이 가능하다는 겁니다.

    당연히 그렇습니다. 제 주장의 핵심을 오해하신 것 같은데, 제가 이야기하는 바는 C는 핵심이 아니지만 자바나 파이선은 그자체가 핵심이라는 것이 아니라, 현 추세상 자바나 파이선으로 가르치고자 하는 내용은 더 이상 C를 사용하기에 적절하지 않다는 것입니다.

    즉, 대학에서 처음 언어로 파이선이나 자바를 통해서 가르치고자 하는 기초지식은 저수준 메모리 제어 같은 내용이 아니라 자료구조 같은 공통 사항은 물론 객체지향이나 함수형 접근 같은 고수준 개념이 주가 된다는 게 핵심이고, 아시다시피 C는 그런 내용을 가르치기에 적합하지 않으니 첫 언어로 잘 가르치지 않는 것 뿐입니다.


    C 를 배우는 것이 파이선, 자바를 배우는 것보다 중요하다고 한적도 없고, 디자인, 아키텍쳐가 중요하지 않다고 한적도 한번도 없습니다.

    저수준이 지식이 좋은 개발자가 되려면 필수라고 누차 강조하시고도 "그래도 그게 디자인이나 아키텍쳐보다 더 중요하지 않다는 것은 아님"이라고 이야기하면, 그건 논리적으로 그냥 가장 낮은 수준부터 가장 높은 수준까지 안중요한게 없다는 이야기가 되버립니다.

    그리고 세 번째 강조합니다만, 저는 저수준이 필요없다고 주장한 적이 없습니다. 애초에 이 토론의 주제 자체가 과연 자바, 객체지향, 디자인 패턴, 아키텍쳐 등등을 배우는데도 C언어나 C로 주로 다루는 저수준 지식이 보다 근본적인 기초나 선행지식인가라는 것입니다.

    입문 단계에서 뭘 먼저 공부할지 고민하는 사람에게 "저수준에서 아키텍쳐까지, 그리고 수학까지 모두 안중요한게 없으니 다 잘해라"하는게 과연 이 토론의 취지였는지 한 번 생각해보시고, 과연 님이 말씀하신 '허수아비'는 누가 때리고 있는지 자문해보시기 바랍니다.


    1
  • 박가사탕
    95
    2019-03-16 14:56:52

    자존심이 상하셨나 봅니다.

    그게 잘못된 겁니다.


    무슨 개발자세요? “자바개발자”입니다.

    아니요. 틀린 대답이죠.

    그냥 모두가 프로그래머입니다.

    자격증이 있는 것도 아니고 우리는 원하면

    언제든지 어떤 언어든 금방 적응하고 짤 수 있어요.


    그렇기에 특정 언어를 비난한다고 해서

    자존심이 상할 필요가 없습니다.

    자바개발자가 C언어를 배운다고 해서

    자바만 했던 내 경력을 똥으로 만드는 것도 아닙니다.


    주력언어의 프레임에 갇혀있지 마세요.

    윈도우 개발자도 윈도우를 까고, 맥도 까고,

    VS개발자도 VS를 까는게 원래 정상입니다.

    나와 “내 도구”를 분리해서 사고할 줄 알기 때문이죠.

    0
  • fender
    12k
    2019-03-16 15:09:43 작성 2019-03-16 15:26:02 수정됨

    박가사탕 // 거의 괴담 수준의 잘못된 정보의 사실 관계를 바로 잡는게 왜 '자존심'과 엮이는 지 모르겠습니다.

    그리고 도대체 무슨 근거로 제가 자바만 하면서 자바에 엄청난 자부심을 가지고 있는 개발자 쯤으로 착각하셨는지 모르겠습니다만, 전 자바도 오래했지만 지금은 주력 언어로 스칼라를 쓰고 오픈소스는 주로 C#으로 하고 있습니다.

    왜 저와 반대되는 주장을 하는 분들은 "저수준 지식이 근본/필수이다"와 "저수준도 알면 좋다"는 논리를 유리한 쪽으로 그 때 그 때 바꾸어 적용하시는지 모르겠습니다.

    정말 여러차례 반복하지만 C언어든 저수준이든 배워서 나쁘지 않습니다. 또한 저수준 필요없으니 자바만 하라는 따위 주장은 한 번도 한적이 없습니다. (물론 추천을 한다면 상술한 이유로 C보다야 코틀린이나 자바스크립트 등을 고르겠습니다만).

    단지 "자바를 하려면 C를 먼저 봐야하나요?"라고 누가 묻는다면 "아니오"가 답이라는 것 뿐입니다.

    그리고 "자바를 아무리 잘해도 C나 저수준 지식을 모르면 반쪽짜리 개발자"라는 부류의 주장은 고수준 영역의 복잡도나 방대함이 어느 수준인지 감이 없어서 나오는 근거없는 자부심이란 것입니다.

    흔히들 '언어는 도구일 뿐'이라고 하는 데 맞는 말입니다. 그런데 망치질 톱질하나 못하는 사람이 미장도 어설프게 한다고 숙련된 목수보다 우월하다고 착각하진 말아야겠죠.

    자바 언어 하면서 C 배우면 당연히 좋습니다. 그런데 그 개발자가 디자인 패턴을 모르고 객체지향으로 복잡한 시스템 설계 못하고 람다가 뭔지 모르고, 자바를 배포하는 환경의 아키텍쳐에 대한 이해가 없다면 C를 아무리 잘해도 자바 개발자로서는 쓸모가 없는 것입니다.

    개인적 경험상 '언어는 도구일 뿐'이라고 당당하게 주장하는 사람 중에 정말 풀스택 폴리글랏에 해당하는 사람은 극소수라고 생각합니다. 보통은 '뭐 언어야 제어문 알고 함수 호출하는 문법 알면 다 비슷하지' 수준의 제한된 이해를 하기에 나오는 근거없는 자신감인 것 같습니다.

    반면, 정말 폴리글랏/풀스택에 해당할 정도의 재능이 있는 개발자라면 솔직히 C 뿐 아니라 무슨 언어를 어떻게 먼저 배워도 그 수준에 도달했을 것이라고 봅니다.

    1
  • 박가사탕
    95
    2019-03-16 16:27:21

    사실 디자인패턴에 대하여 할 말이 아주 많습니다.

    새 글로 쓰죠.


    0
  • 하마
    5k
    2019-03-16 17:09:38 작성 2019-03-19 08:04:00 수정됨

    하~~ fender님 고생하시네요. 이 주제는 몇개월 주기로 항상 재 생성되는지.. :-) 

    1. 첫언어로 c 를 하냐 python을 하냐는 무엇이 더 좋다기 보다는 트레이드 오프 문제입니다. 무엇을 선택하든지 얻는게 있고 잃는것도 있겠지요?  C 보다는 성능 이슈에 대한 지식을 흥미삼아 계속 보면 좋긴합니다만 이 시간에 다른 것에 더 열중해도 상관없습니다. 역시 트레이드 오프에요.  

    2. C는 C를 하는 직업을 가진 사람들이 하는 영역일뿐입니다. 모든 소프트웨어 개발자가 C  (or 메모리관리) 를 기본으로 해야한다든지, C가 사용되는 도메인의 지식을 알고 있을 필요가 없습니다. 물론 많이 알면 다 좋죠. ㅎㅎ 근데 지금 2019년입니다. 세상은 너무 거대하며 복잡하여 자신이 추구하는 방향으로 가기에도 바빠요. C개발자들은 그들의 영역에서 그들 끼리 경쟁하시면 됩니다. 그 영역이 다른 영역보다 더 중요하다거나 더 어렵거나 하지 않습니다. 물론 더 쉽지도 않겠지요.

    3. 김포프님의 동영상은 그냥 저 분의 우물에 대한 이야기로 한귀로 듣고 한귀로 흘리십시요. 비관리언어를 하는것은 프로그래머로 살아남는거랑 별 관계가 없으며, 예를들어 메모리 직접 관리에 의해 성능이나 어떤 현상을 향상시켜야 할 필요가 있으면 아키텍트는 그런 쪽의 인력을 사용하면 됩니다. 아키텍트의 종류 또한 세분화 되고 있고요. 자신의 주력분야에 매진하는 사람들은 저런 세상 단순화 시키는 말에 신경 쓸 여력도 없습니다. 


    너무 상식적인 이야기인거 같네요. ^^

    p.s

    저는 10년간 C/C++ 만 하다가 그 후에 수년간 python,scala,golang 등을 하다 최근에는 1ms의 속도라도 줄여야 해서 다시 C/C++ 로 하고 있습니다. (사실 C/C++로 줄이는 속도 보단  FPGA나 ASIC 으로 줄이는게 큽니다만)  즉  C/C++은 그냥 선택지 중 하나이며 하드웨어 지식을 알아야 좋은 개발자?? 80년대 발상은 이제 그만. 

    7
  • 올빼미
    56
    2019-03-16 17:14:20

    임베디드 개발을 15년 가량 해왔습니다. TDD 설정을 위해 C++을, 디버그를 위해 어셈블리를 약간 다룰 때를 제외하면 펌웨어 개발은 거의 C로 이루어집니다.

    개발 경력 초기, 회로 설계자 선배들이 항상 하던 말이 전자공학을 하던 사람이 프로그래밍을 할 수는 있어도 반대로는 어렵다는 것이었습니다. 원리를 이해하고 있으면 응용은 쉬운 법이며 전자공학이 컴퓨터 공학과 비교해 원리에 가깝기에 당연한 이야기처럼 들렸습니다. 그들끼리는 다시 아날로그 설계하던 사람이 디지털 설계는 해도 역은 어렵다고도 했지요.

    그로부터 15년이 지난 지금, 부품 선정, 회로 설계, 펌웨어 개발, 웹/앱 서비스 개발까지 모두 손대본 결과 무엇이 무엇보다 원리에 가깝다고 보기는 어렵다는 생각입니다. 한번은 C로 개발하기 전에 프로토타입을 만들고자 파이썬을 사용하다가 'C는 프로그래밍의 본질을 다루기에 적합한 언어가 아니구나'라는 것만 느끼고 파이썬으로 개발을 완료한 경험도 있습니다. 내가 서 있는 곳에 따라 '원리'라고 여기는 것이 달라집니다. 

    웹메일 서비스를 만들 때와 전자밥솥을 만들 때 공통으로 적용되는 원리도 있겠습니다. 그러나 그것은 대부분 공대 커리큘럼 바깥에 있습니다.


    2
  • byungil
    165
    2019-03-18 16:33:22

    fender 님 의견에 한표 던집니다. ㅎ

    0
  • 전재형
    4k
    2019-03-18 16:50:56

    여러 얘기가 오갔는데, 분야에 따라 공부할 언어가 달라진다가 맞는 말같네요.

    C언어를 하면 C언어로 해결해야 하는 문제가 너무 복잡해서 패턴에 관심이 없어지고, 자바로 개발을 하면 자바로 해결해야 하는 문제가 너무 복잡해서 저수준 동작에 대한 이해에 관심이 없어지는거겠죠.


    학부에서 c가 기본인 이유는 단순합니다. C를 공부해서 써먹을수 있는 개발 분야가 많으니까요.

    학부에서 oop 언어 하나를 거의 반드시 공부하는 이유 또한 동일하겠죠.


    다만 이것저것 다 경험하고 싶거나 학부생이 아니라 산업에 이미 종사하고 계신 분이 아닌이상 자신이 필요로 하는 지식을 먼저 습득하게 되는게 정상인것같습니다.


    세상어디에도 c언어 짱짱맨 이런건 없구요. 반대 경우 또한 없을 거라 생각합니다.

    1
  • 거북왕
    28k
    2019-03-18 23:53:11

    이 주제 너무나 돌고도네요ㅋㅋ

    토론에 몰입하는 것은 좋지만

    인신공격은 하지않으셨으면 좋겠습니다

    논지와 거리가 먼 이야기를 하는 것은

    토론과는 거리가 멀어보입니다


    이런 답글때문에 쉽게 토론하기 어렵기도 하죠

    0
  • 구르마
    316
    2019-03-19 10:09:12 작성 2019-03-19 10:24:57 수정됨

    우연히 보게 되었는데...fender님 넘 고생하시네요...

    저는 임베디드10년 하면서 한 때 저도 그렇게 생각했죠. 포인터없고, 메모리 직접 다루지 못하고, 드라이버 작성하지 못하고, OS 만들지 못하는, 자바같은 언어 따위가 과연 언어냐...하면서... 그 당시에는 꽤나 자바를 업신여겼습니다.(이 자리를 빌어 그 당시 제게 갈금을 당했던 자바 플머들에게 죄송하다는 말씀드립니다.)


    그후 안드로이드 세상으로 바뀌면서 처음 자바를 하게 되면서 자바의 신세계를 알게 되었고, 5년 후 다시 클로저를 알게 되면서 지금까지와는 전혀 다음 프로그래밍 언어의 세계의 심묘함을 맛보고 있습니다. 함수형/관계형/논리형 프로그래밍 패러다임, CSP, 데이타의 본질과 그리고 데이타 참조에 대한 논쟁, continuation/fiber/coroutine/generator의 관계, 모나드 등


    fender님 말씀대로 각 언어는 자신만의 분야가 있는 것이 맞다고 생각합니다. 그 용도가 다른거죠.


    C/C++언어 하시는 분들 자만하신다면, 그만큼 자신이 무식하다는 이야기일 뿐입니다.(boost 라이브러리의 continuation 클래스가 왜 one-shot continuation인지 알고 쓰시는 분 정도라면 조금 인정해 줄 수 있음.)


    아직도 C언어가 기본이고 근본이다라고 하는 무식한 이야기 그만합시다! (이런 이야기는 좀 과격하게 얘기하자면, PDP-11 메인프레임 시절부터 어셈과 C플밍했던 50년 경력의 로버트 씨 마틴에게 귓방망이 얻어맞을 이야기입니다.)

    강호의 세계는 넓고도 넓다. 이말만 기억하고 자중하고, 공부합시다.


    C언어 안다고 클로저에 크게 도움되는거 없습니다. 그리고 클로저 하는 사람들이 C언어 영역에 속하는 그런 지식을 굳이 배울 필요도 없구요...배워서 나쁠 것도 물론 없지만요.

    3
  • 가가멜리
    1k
    2019-03-19 11:12:57 작성 2019-03-19 11:13:10 수정됨

    제가 전자공학을 전공해서 전동 드릴의 원리를 왠만한 사람보다 잘 압니다.

    토크는 어떻게 결정나고 모터와 프레임만 주면 직접 기판 회로를 설계해서 제작도 가능합니다.


    아쉽게도 저는 시공업체분들보다 나사를 전동드릴로 잘 못박습니다.

    벽도 잘 못뚫고요. 





    1
  • sam works
    8
    2019-03-22 15:09:47

    오오 재밌는 주제니 또 한마디 안할수가 없습니다 ㅋㅋ


    일단 질문부터 다시 

    -------

    다른언어를 배우는데 가장 기본이 된다고 생각했는데

    그래서 좀더 다른언어에 비해 쉽다라는 생각을 해봤었는데 그게아닌걸까요?

    좀더 깊게 c를 다루면 쉽다고 볼수는 없는거죠?

    -------

    러프하게 요약하자면 

    "C가 쉬운가?"


    이질문에 대한 답은 할 수 있을것같아요.

    먼저 쉽냐 안쉽냐는 비교 대상이 누구냐에 따라 달라요. 

    자 C의 문법.. 어렵다고 볼순없죠.  사실 너무나 직관적이고 저수준이라 이게 어려우면 다른 쪽에 재능을 가지신 분이에요.


    사실 C 뿐만이 아니라 모든언어 포함해서 프로그래밍을 하면서 어려운 점은 아래 두가지 이유때문입니다. 

    첫번째는  컴퓨터의 구조 때문이고

    두번째는 본인이 다루려고 하는 비즈니스 로직의 복잡성이에요.

    이 두가지문제를 어떻게 잘 다뤄가면서 서로 트레이드 오프를 하는냐가 개발자가 하는 일이라고 생각합니다.


    C는 컴퓨터의 동작과 아주 밀접하게 관련이 있어요.  따라서 컴퓨터의 구조를 잘 알고 있어야하고 어떤식으로 동작하는지도 이해를 하려면 C를 통해서 배우는게 쉬운편입니다.  왜냐면 다른 선택지의 경우 (어셈블리 라든가) ... 바로 덮는다에 오백원.

    따라서 C 를 잘한다는 이야기는 컴퓨터의 구조와 동작을 잘 알기 때문에 10분걸리는거 10초에 끝낼수 있는 최적화가 가능하다는 의미구요. 

    즉 컴퓨터의 동작원리 및 구조를 잘 알고 하나하나 세밀하게 사용할 수 있기때문에 성능을 뽑아 낼 수 있어요.  이덕분에 C나 C++이 앞으로도 죽을 수 가 없는 언어라고 생각합니다.  뭐 양자컴퓨터가 나오기전 현재와 같은 CPU 아키텍쳐의 폰노이만 구조의 경우에는요. 


    다만, 두번째 문제

    다루려고 하는 업무의 복잡성을 다루기위해서는 컴퓨터의 구조와 최대한 멀리 떨어뜨려놔야해요.  어려운말로 추상화라고 합니다. 

    왜냐하면 이게 강하게 서로 연관이 되면 될수록 뭐좀할려고하면 컴퓨터의 하드웨어 종류와 OS종류,  버전별 시스템콜이 발목을 잡습니다.  난 단지 곱하기를 하고싶은데 왜 리눅스인지 윈도운지 알아야하는가?  또한 메모리가 어디부터 어디까지 뭐고 보이지도 않는데 메모리 주소 따지다가 빡치죠.    한글을 바이트단위로 다루다가보면 세종대왕님은 왜... 이런 생각이 들때가 많아요.  난 단지 한글로 메시지를 보내고 싶다고;  웹에서 한글이 안나와요 


    또한 절차형 언어 특성으로 중간에 이런저런 예외 상황이 등장하는 경우 이걸 제대로 처리하기가 무척 어렵습니다. (if - else  중첩해서 3단계... )    또 어느 정도 이상 코드가 길어지기 시작하면, 도저히 따라잡을 수 없어요.  이건 머리가 좋아도 안되고 시간이 많아도 안되고 그냥 인간두뇌 특성상 불가능한 영역이 있어요. 


    그래서 두번째 문제를 잘 다루려면 컴퓨터 구조보다 객체지향이나 함수형이니 하는 언어 패러다임부터 디자인패턴, MVC니 MVVM이니 하는 여러 모델기법들을 알아야해요. 


    첫번째와 두번째문제는 사실 떨어뜨릴수 없는 문제지만, 서로 관심사가 다르기 때문에 분리해서 봐야하고 각각 공부하려고 들면 끝도 한도 없이 나옵니다.  지금도 나오고있습니다. 


    너무 길어지는군요. 요약;

    C는 쉬운가? 아닐껄? (관심사가 다르기때문)

    제대로 접근하는 질문하기 위해서 해야하는 질문 


    "나는 프로그램으로 뭘하고 싶은가? "


    이 질문에 대한 본인의 답변을 달아주시면 뭐하는게 좋을지 어느정도 정해진 테크트리가 있어요.


    일단 프로그램의 세계를 오신것을 환영합니다. 

    골라주세요

    1. 전사

    2. 마법사

    3. 사제

    이걸 고르지 않고



    "전사가 기본이니까 나중에 힐배울 때 도움이 되겠죠? " 

    라는 질문같은거에요. 









    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.