선배님들 C언어의 실력을 올리는 방법은 무엇이 있을까요?! 한말씀부탁드려요(__)

baw518의 이미지

작년에 재대후에 잠깐 일하다가 올해 초부터 학교를 복학했지만, 프로그래밍은 5년만에 하는 학생입니다.

제대로된 프로그래밍은 솔직히 한번도 해보지도 않았는데 이번에 학교에서 팀프로젝트로 하는 네트워크 수업을 듣고

있습니다. 배우는내용들, 즉 TCP의 동기화라든지 UDP 방식이 뭔지는 대충 알겠는데 부모 - 차일드 프로세스와

파이프 라이닝 들어가는 부분에선 도통 뭐가 뭔소린지 모르겠어서 질문드립니다. 아무래도 팀과제이고, 제가

나이가 많다 보니 제 실력을 올려야 될 필요성을 강하게 느끼는데요.

자!! 서론이 너무 길었죠 저런거 안읽으셔도 됩니다. 질문좀 드릴게요

C언어 실력을 단기간에 향상시키는 방법!! 물론 노력도 중요하지만 방법도 전 중요하다고 생각합니다!!

그래서 질문드립니다

1.뭐라해도 기초가 최고다. 기초적인 서적부터 차근차근 밟아가라!

2.어려운 예제들을 분석하고 또 분석해서 실력을 키워라!

3.뭐라해도 C언어의 기본은 함수다 함수 부터 먼저 달달 외워라!(구조체 포인터 포함)

4.바닥부터하면 C언어 뿐 아니라 다른 언어도 문제없다. C 컴파일부터 배워라!

5.소켓이라면 바로 이책이지!! 이렇게 공부해봐라!

6.기타

의견좀 말씀해 주세요. 나이 많아 학교다니는것도 그런데 모르는애들한테도 눈총 받기 싫습니다 ㅠㅠ

----------------------------------------------------------------------------------
익명 사용자 6분 ,terzeron님,scriptx님,나빌레라님,jsk님,jachin님,지리즈님,kasworld님,hiseob님

주옥같은 답변들 정말 감사합니다. 일단 책으로는 c programming Language 가 도움이 많이 되고

예제라든가 소스를 읽고 또 읽으며 프로그램들을 많이 짜고 또 짜보라는 말씀들, 수리적인 능력을 키우는것과

같은 기능을 다른언어로 구현해 보는것. 도움이 많이 될 것 같습니다. 그럼 공부하다가 정말 안풀리는 것들

있으면 종종 부탁드리겠습니다. 성의있는 답변들 다시한번 감사드립니다. :D

익명 사용자의 이미지

책은 한두권 보셨으면..

자기가 구현할 프로그램에 필요한.. 함수들을 공부해보세요..

테스트 예제를 만들어 직접 궁금한점을 테스트해보세요..

terzeron의 이미지

일단 C의 기본 문법을 익히세요. 이게 안 되면 뒷 이야기는 소용없습니다.
이 수준은 넘는다면 애플리케이션 프로그래밍은 된다고 할 수 있습니다.

그 다음으로 어려워하시는 부분이 시스템 프로그래밍인 것 같습니다.
오라일리에서 나온 유닉스나 리눅스 환경에서의 시스템 프로그래밍 책이 있습니다.
번역본도 있는 걸로 아는데 이런 걸 한 번 훑어보세요. 시스템 프로그래밍의 바이블이라고
할 수 있는 Advanced Programming in Unix Environment도 괜찮습니다. 이 정도면 준비는
다 되었다고 할 수 있습니다.

보통 이런 책에는 코드 조각만 제시되기 때문에 실제로 동작하는 프로그램을 만들어보면서
경험을 쌓는 게 좋습니다. 생각보다 만만치 않아요. 모든 예제를 완성해서 돌려본다는
마음으로 책을 한 권 다 떼면 시스템 프로그래밍에 익숙해지실 겁니다.

scriptx의 이미지

저라면 수학을 하라고 말씀드리고 싶군요
공식을 써먹으라는 얘기가 아니라 수리적 능력과 프로그래밍 능력은 밀접한 관련이 있습니다
수학을 단련할수록 축적되는 계산력과 논리적 사고력 수학적 직관(이건 타고나야겠지만) 등은 많은 도움이 됩니다
실제 ACM 랭커들을 많이 배출한 학교는 수학을 베이스로 깔고 그위에 프로그래밍을 얹어서 교육한다고 하니까요

---------------------------------------------------------------------------------------
for the queen of the sciences

나빌레라의 이미지

제 생각에 프로그래밍 실력을 포함해서

어떤 한 언어(C, 자바 등)의 실력을 높이는 방법은

기간이 중요하지 않습니다.

양에 비례합니다.

단기간에 올리는 방법을 질문하셨는데, 단기간에 "많이" 타이핑해보면 됩니다.
많이 타이핑해보고, 컴파일해보고, 돌려보고, 디버깅해보고...

"왜 안돼지?"라는 생각을 계속 하면서, 가끔 disassembly도 해보면서 이것 저것 많이 시도해보면,
어느새 컴파일러의 원리까지 어느정도 알게 되면서 자연히 프로그래밍 실력은 물론,
특정 언어의 코딩 실력도 늘게 됩니다.

이건 어디까지나 저같은 일반 사람 기준이고요, 머리 좋은 천재는 많이 안해도 빠르게 실력이 늘더군요.

많이 해본 사람이 많이 알고 많이 아는 만큼 실력도 좋더라구요.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

jsk의 이미지

저도 많이 해보는게 최고라고 생각합니다.
그리고 다른 소스 코드를 많이 보는 것도 도움이 되더라구요.

jachin의 이미지

처음 기초를 하고도 진도가 안나가는 사람들에겐, 다른 사람들이 만든 소스코드를 읽는 것이 많은 도움이 되지요.
문법을 정말 모를리가 있을까요? 아주 명확한 규칙일 뿐인데, 왜 나는 모르는게 많은지 고민된다면,
콘솔 명령어로서 컴파일러의 옵션을 한 번 확인해보세요. -I 옵션 -L 옵션 등등... 옵션도 많고, 설정도 많습니다.
컴파일러를 어떻게 사용하는지 (혹은 링커를 어떻게 사용하는지) 공부하면 점점 좋아지리라 생각합니다. :)

지리즈의 이미지

C는 포인터만 완전히 이해하면 될 것 같아요.

저 같은 경우는 모 일본어 컴퓨터 강사가 내놓은 번역책인데
포인터 문제 500개만 나열되어 있는 책으로 공부했어요.
학력고사 시대라 그런지, 역시 문제 풀이가 도움이 -_-;;;

알고리듬 이런 거는 보면 좋기는 합니다.
사실, 이건 C만 해당되는게 아니라 다른 모든 언어에 공통적으로 들어가니까요.

하지만, 우선적으로는 C언어 자체에 대해서 이해하려면 역시 포인터라고 생각이 드네요.

이 언어만의 독특함이니까...

There is no spoon. Neo from the Matrix 1999.

kasworld의 이미지

the C programming language 를 처음부터 끝까지 한글자도 빼지말고 다 읽고
그 안의 문제들을 모두 풀어본다.

가 정답이라고 생각합니다.

전 C 를 할줄 안다고 하는 피 면접자들에게 volatile, setjmp, longjmp에 대해서 물어봅니다.

jsk의 이미지

스택정리 안하고 왔다 갔다 할수 잇네요?
(http://en.wikipedia.org/wiki/Setjmp.h#Cooperative_multitasking)

익명 사용자의 이미지

저는 약 10년동안 C/C++로 게임도 많들어보고 대용량 네트웍 서버도 만들어보고, PDA 어플도 많들어봤습지만,
아직 setjmp()와 longjmp()을 써본적이 단한번도 없으며, 쓰는사람을 옆에서 본적도 없습니다.

그 함수들이 필요없다는것은 아닙니다..뭐..어디선가 누군가 필요하면 쓰겠죠.
하지만, C언어에 대해 얼만큼 아느냐를 판단할 척도로 setjmp(), longjmp()를 얘기하는것은 kasworld님의 너무 주관적인 생각이 아닐까 생각이 드네요.
C언어가 아니라, setjmp()와 longjmp()가 유용하게 쓰이는 분야( 만약 있다면.. )에 대한 상황을 주고 그걸 어떤식으로 해결하느냐의
질문정도는 될수도 있어도...

volatile은 어느정도(살짝) 동의합니다만,
#1. 왜 많은 사람들이 volatile은 쓸모없다고 말하는것인지
#2. compiler-barrier와 memory-barrier의 차이 점,
#3. 더 나아가 CPU의 파이프라이닝을 얘기하면서

volatile을 얘기해야지...그런 주제없이 C언에서의 키워드 volatile만 얘기하면
대부분 volatile을 잘못사용하고 있을 가능성이 큽니다.

그리고, 그정도 설명을 하다보면 C언어가 아니라, 컴퓨터 구조와 운영체제, 컴파일러에 대한 이해가 더 중요하고요.

즉, 저는 단지 C언어 대한 (전반적인 프로그래밍이나 컴퓨터 전반 지식이 아닌)
지식을 평가할 때 volatile, setjmp, longjmp에 큰 비중을 두지 않을것 같군요.

baw518님에게 volatile, setjmp, longjmp가 뭔지 찾아보는것은 비추하고 싶네요.
운영체제와 메모리 구조에 대한 이해없이, 그런함수들 아는것은 아무 의미가 없습니다.

결국...
위에서 jachin님이 말씀하셨듯이
한만큼 나옵니다.

C언어가 아니라, 운영체제, 네트워크, DB, 컴파일러, 분산시스템 이런 *주제*들을 공부하세요.
지금 숙제못한다고 팀원들 눈치볼것 신경쓰기보다, 몇년동안 얼마나 착실하게 실력을 쌓아서
기본이 튼튼한 올바른 개발자가 될 수 있는지 생각해보세요.

kasworld의 이미지

네 써주신 글과 같은 내용을 답하는것이 volatile, setjmp, longjmp 질문에 대한 100점 짜리 답 입니다.
( 비꼬는게 아니라 정말로요. )
volatile, setjmp, longjmp 은 이러이러한 기능을 하는것인데 실제로는 별로 쓸일이 없었습니다.
정도의 대답을 해주길 기대 하는거지요.
( c 언어에 대한 지식을 묻는 질문이니까요. )

당연히 면접때는 그외의 다른 질문도 많이 합니다. ^^

익명 사용자의 이미지

왠지 정말 100점을 받은것 같아서 기분이 으쓱ㅋ. 농담입니다 :D

익명 사용자의 이미지

10시 시작 새벽2시 취침 하루종일 코딩하며 회사 프로젝트할때 실력이 올랐습니다.할땐 죽는줄알았지만, 이전에 짠 소스정리부터 분석하고 수정하고,
선임자가 옆에서 모니터 지켜보고 내가 코드를 짜면서 왜이런 로직으로 짜는지 설명하면서 코드짤때 진정 내 실력으로 붙는게 느껴졌습니다.
책에 나오는 내용은 그냥 좋은 정보일뿐 사용안하면 빛좋은 개살구 입니다.
그리고 막상 실무에선 그런 알고리즘 많이 안씁니다. 정해진 자신만의 코딩스타일로 남들이 봤을때 알기 쉽게 직관적을 짜는게 실력인것 같습니다.
테크닉이랑 꼼수는 그이후에 생각해보세요

익명 사용자의 이미지

개인적으로 야근 열심히 해서 실력 올랐다는 사람을 별로 신뢰하지 않습니다.
더군다나 책을 별로라고 생각하는 사람은 더 그렇고요.
주위를 보면 대부분 탄탄한 이론을 바탕으로 하는 것이 아닌 개인적인 경험만 우선시 하는 개발자들입니다.
경험도 물론 중요하지만 이론이 바탕되지 않은 경험은 그저 사상누각일 뿐입니다.
공부 열심히 하세요. 1년의 경험을 10번 되풀이 하지 마시고...

익명 사용자의 이미지

지금 말씀하신 네트워크 TCP UDP는 c언어에 관한게 아닙니다. 기술하는 형태가 c언어이기는
하지만 이것을 머릿속에 익히기 위해서 c언어를 통달해야 하는 것이 아닙니다.

프로그래밍언어, 네트워크 통신, 프로세스 쓰레드 등은 각각의 개념과 원리를 알아야 하는 것이지요.

제 경우에는 책을 보고 연습문제를 풀고 한 것보다는 다른 사람이 해 놓은 코드를 보고 원하는 형태로
고치거나 확장하는 일을 하면서 많이 배웠던것 같습니다. 예를 들어 c++을 배우고 싶어서 책을 한권
구해서 계속 읽고 다시 읽어 보고 했지만, 여러가지 개념들이 (inheritance, virtual, friend, template,
overloading, ...)피부로 와 닿지는 않았습니다. 그런데 아는 사람의 추천으로 Qt를 써보라고 해서
(아주 옛날입니다 ... Qt 1.3인가 1.4인가..) 그것을 써서 이것 저것 만들면서 말로만 듯던 것들이
이래서 필요한 거구나 하고 배우게 되었습니다. 아주 쉽게 배웠던거 같습니다. 책만 펴고 계속 해서 읽어도
그놈이 그놈같던게 좀 잘 보였습니다. Qt 자체 소스를 보면서도 배웠구요.

"c언어 실력을 올리는" 또는 좀 더 정확하게 "프로그램을 잘 만들수 있는" 사람은 위에서 말하는 개념들을
잘 이해하고 활용할 수 있는 사람이겠지요. 해리포터를 쓴 사람에게 "영어를 잘한다"고 말하지 않듯이 훌륭한 프로그램을
만든 사람에게 c언어를 잘한다 라고 말하지는 않지요...

약간 횡설수설이군요 ... :)

글을 올리신 분처럼 c언어를 (다른 언어도 마찬가지 입니다.) 배우기 시작하는
단계에서는 프로그램언어가 가지는 기본적인 요소나
개념에 대해서 잘 이해하시는게 가장 중요하도고 봅니다. c언어에 어떤 개념과 요소가 있는지
한눈에 보는 방법은 "The C Programming Language" 라는 책의 목차를 열어 보시면 됩니다.

거기에 보시면

Variable and Scope

Control Flow

Array and Pointer

...
등등의 말들이 나옵니다. 목차만 펴 놓고 이것들이 어떤 의미인지, 왜 필요한지 설명할 수
있다면 이 것들을 잘 이해하고 있다고 할 수 있을 것이고 만약 잘 설명할 수 없는 것이
있다면 해당 내용을 알려고 시간을 투자해야 할 것입니다.
(많은 분들이 말씀하신 것처럼, 연습문제 다른 사람 코드 보기 등등 "방법을 찾아서 어쩄든 해결")

한 언어를 잘 이해하면 다른 언어 (C++, c#, java, python, ...)를 이해하는 데도
많은 도움이 됩니다.

일단 위와 같인 c언어에 대하여 어느 정도 이해가 되었다고 생각되시면, 그다음 진도를 나가시면 됩니다.

c++ 과 OOP
Networking
Process and Thread
Algorithm
Data Structure
Parallel Processing
등등등...

(물론 그 깊이와 넓이에는 끝이 없겠지요 ... 그게 문제기는 합니다 ㅎㅎ)

하지만 이런 시간이 지나고 나면 지금 하고 계시는 팀프로젝트에서,

"TCP를 쓰는게 좋은 건지, 아니면 UDP를 쓰는게 좋은건지 결정" 하거나

"Multi Thread를 쓰는게 좋은지 아니면 Multi Process를 쓰는게 현재의 문제에 더 적합한지"

따져보고 결정하실 수 있게 됩니다.

그냥 가지지는 않습니다. 차근차근 가야 됩니다.

지금 느끼고 계신 그 답답함이 하나씩 하나씩 문제를 풀어가는 추진력이 되겠지요...

그 답답함이 풀리는 느낌을 즐기세요. 이만.

익명 사용자의 이미지

자신이 관심을 가지는 것들을 하나 하나 구현해 보세요.
또 재밌는 것은 C 말고 다른 언어로도 같이 구현해보면 오히려 C에 관한 이해도가 높아집니다.
처음에는 예제 위주로 공부하다가, 나중에는 레퍼런스 메뉴얼도 친숙해지고

또 다른 사람이 만든 코드를 읽는 것도 도움이 많이 됩니다. 그냥 읽는 것은 재미 없으니 자신이 고치고 싶은 오픈소스를 골라서
읽어보시는 것이 좋을 것입니다.

요새는 스크립트 언어가 관심이 많으니
php에 관심이 많다면 php모듈을 하나 만들거나 php모듈을 분석해본다던지, python이나 perl 등등의 바인딩 구현 등등
생각해보면 남들이 안하고 있는 재미있을 법한 것들이 많이 있습니다^^

hiseob의 이미지

전 프로그래밍 언어에 관한 책 (말그대로 언어에 대한 접근) TC++PL 이 그나마 많이 도움 되었구요,

지금 짧고 짧은 실력으로 쉘만들고 있는데 뭐가 뭔지 모르겠네요..