직업은 선물 트레이더

컴퓨터공학과 학생이 들려주는 코딩 잘 하는법

잊어버린 과거

코딩 잘 하는법 이라고 대단한 이야기를 하는 것 처럼 하긴 했는데 별거없을지도 모르니 주의를 요한다. 단순히 지금까지 텀 프로젝트(약 15~20회)나 졸업작품을 진행하면서 느낀바를 적는 정도 수준이니 이해 바란다. 대략 기억나는걸 죽 적어보자면 다음과같은 사안들을 다루었었다. 멀티쓰레드, 인공지능, 소켓통신, 유닉스 쉘, 그래픽, 이벤트드리븐, 비동기프로그래밍, 웹페이지&디자인(HTML5, Node.js, JSP), 안드로이드 앱, 시스코 네트워크 프로토콜, 아웃메모리 B트리, 소프트웨어 설계, DB모델링및 활용 등 학부 수준의 프로젝트들...

 

코딩에서 먼저 중요한건 해당 언어의 문법을 아는 것이다. 근데 별로 그렇게 어려워할 필요는 없다. 내가 생각할 때 요 정도만 알면된다. 언어의특징(객체지향인지 등), 툴 사용법, 해당 언어의 변수와 if와 for문 사용법. 이외 나머지 까다로운 문법들은 책을 뒤적거리거나 인터넷 API문서를 참고하며 코딩을 하면된다. 솔직히 아주 대단한 프로그램이 아니고서야 딱히 switch문등을 사용하지 않아도되며 언어별로 상이한 특성 때문에 나같은경우는 잘 사용하지 않는다. 실제로 if와 for문으로 모든 알고리즘을 표현할 수 있다. 고 본다. 물론 이 때문에 코드의 효율이 떨어질 수 도 있다.

 

 

(전체 프로그램 그림은 대충이라도 그려놓자. 그게 다이어그램이 되었든 차트가 되었든간에.)

 

근데 위 얘기는 단순히 코드를 짜는데 관련된 이야기이고 실제로 프로그램을 짜려거든 그 전에 가능한 상세한 설계를 해야한다. 분명히 완벽한 설계는 3~4명이 모인다 하더라도 힘들기 때문에 가능한 융통성있게 설계를 해야한다. 그러니까 아얘 설계같은게 없더라도 최소한 어디에 뭐가 있는지 정도는 알 수 있도록 파일들의 네이밍과 위치를 명확히 하여야한다. 한마디로 구조화다. 가능한 프로그램이 한눈에 들어오도록 하여야한다. 실제로 1만라인 정도만 코드량이 되도 그 복잡도를 이기지 못하고 머리를 아파하는 학생이 많다. 복잡도를 이길 생각보단 아얘 애초부터 그 복잡함을 제조하지 않도록 생각을 많이해야 한다.

 

그런데 정말 중요한건 설계 이전에 프로그램 자체를 이해하는 것이다. 아래는 실제 12년 우리학교 프로그래밍 경진대회에서 나왔던 문제중 하나인데 무슨 프로그램을 짜야되는지 이해하는 것 부터가 난제이다. 조건은 GNU C로 컴파일이 가능해야 한다는 것.

 

Graph(V, E) 가 주어져 있다고 하자. 가중치는 없다. 중요한 몇 개의 지점이 center역할을 할 수 있다. n개의 정점 중 센터 개수인 c개가 입력으로 주어지고 k가 주어지면 모든 일반정점이 k-hop 이하로 센터 중 하나에 연결될 수 있도록 하려면 어느 정점들이 center가 되어야 하는 지 구하는 알고리즘을 구현하시오.

ex) Input : n c k (정점과 센터개수, k의 입력)

               1 3 (1번 정점과 3번 정점이 연결되는 간선 입력)

               3 6 ....

 

단순히 해당 언어의 문법만 안다고, 설계를 잘한다고 해서 풀 수 있는 문제가 아니다. 만들어야하는 프로그램을 이해할 수 있어야 한다. 보통의경우 머리속으로만 잔뜩 생각할 뿐이어서 복잡한 프로그램을 구상하는 경우 이걸 생각하면 저걸 까먹고 저걸 생각하면 이걸까먹는 경우가 많다. 명대사가 있다. "아 내가 뭐할려고 했더라?", "아 맞다 그거다", "근데 그게 뭐지?", "아 근데 나 지금 뭐하고 있는거지?"의 잦은반복.. 쓰자. 확실히 기록하며 프로그래밍하면 햇갈리지 않는다.

 

 

그리고 느꼈겠지만, 알고리즘이나 개념이 단순한 프로그램이면 따로 공부하지 않아도 문법만 알면 쉽게 코딩을 할 수 있다. 그러나 계산작업이 많은 프로그램, 조직적이고 효율적인 동작이 딱딱 맞아들어야 하는 프로그램의 경우 기반지식이 다소 필요하다. 대표적으로 자료구조지식이 되겠고 코딩 환경에따라 기기의 사양, 운영체제, 시간복잡도, 프로그램 효율 등 종합적으로 고려해야한다. 위 경진대회 문제의 경우 알고리즘이나 자료구조 수업에서 그래프를 공부하지 않았다면 도대체 뭘 원하는 문제인지 모를 수 있다.

 

그리고 마지막으로 주석이 필요하다. 설령 혼자 작업하더라도 코드양이 자기가 수용할 수 있는 분량을 넘어서게되면 도대체 뭐 때문에 이 부분의 코드를 적은지 알 수 없기도 하다. 이럴 때 필요한게 주석이다. 주석만 보고도 해당 부분이 어떤 역할을 하는지 알 수 있어야 한다. 명사형으로 끝나도록 짧게 쓰는게 중요하기에 함수나 변수 네이밍센스만큼이나 주석도 작성하는데 센스가 필요하다.

 

 

 

이외에 들여쓰기라던가 디버거 사용법이라던가하는 비교적 작은 이슈들은 어깨넘어 배우거나 직접 당하면서 배우면 된다. 대체로 비슷하기 때문에 한두번 해보면 금방 익힐 수 있다. 나 같은경우는 GDB라는 디버거라는게 있는지 경진대회나가서 알았다.. 진짜 빨리풀더라 사람들... 여기까지 생각나는데, 궁금한게 있으면 댓글을 달아주어도 좋다.

 

 

ps. 해당 포스트는 티스토리 메인페이지 IT부분에 등록되었다.