해당 문서는 프로그래밍/개발에 입문하려는 뉴비분들(컴퓨터학과 신입생, 비전공 개발 입문자 등)과 새로운 공부 리소스를 찾으려 하는 모든 분들을 위한 지침서입니다.
프로그래밍은 다른 분야와 비교하여 선수지식이 적은 편이라고 생각하지만, 그럼에도 불구하고 알아두면 좋은 선수지식이 있습니다. 특정 프로그래밍 분야들은 심도 있는 선수지식이 필요한 때도 있긴 하지만, 아래 내용 하나만큼은 일반적으로 도움이 되는 선수지식입니다:
개발 공부를 시작하면서 가장 처음 접하게 되는 것은 아무래도 컴퓨터 언어일 것입니다. (간혹가다가 컴퓨터구조 같은 것들을 공부하며 입문하는 예외적인 케이스도 보긴 했습니다만..) 컴퓨터 언어는 말 그대로 컴퓨터에서 동작하는 소프트웨어(프로그램)를 작성하기 위한 언어입니다. 처음 공부하는 분들의 입장에서는 정말 수많은 컴퓨터 언어 중에 무엇을 공부하는 것이 가장 좋을지 막막할 수도 있습니다. 또, 어떤 분은 대체 왜 이렇게 많은 컴퓨터 언어가 존재하는지 의아해할 수도 있습니다. (이런 의문을 품는 것은 매우 좋습니다)
컴퓨터 언어들은 저마다 고유한 특색을 가지고 있고, 장단점이 있습니다. 이러한 언어의 특성 때문에 특정 컴퓨터 분야에는 특정 언어가 어울리게 됩니다. 예를 들어, 안드로이드 앱 개발을 할 때는 Java와 Kotlin이라는 언어를 주로 쓰게 됩니다. (NDK개발을 한다면 C/C++도 많이 쓰게 됩니다) 웹 개발자라면 Javascript와 Java를 많이 다루게 될 것이고, 게임 개발자라면 C++이나 C#을 많이 사용할 것입니다. 시스템 개발자라면 C와 C++를 주로 쓰게 될 것이며, 윈도우 응용 프로그램 개발자라면 C#과 일부 C++을 쓸 것입니다. 혹은, 정말 어쩌면, 매니악한 분야를 좋아하여 로우 레벨 개발을 하게 된다면 C와 어셈블리를 사용하게 될 것입니다.
이처럼 많은 분야와 많은 언어가 있는데 이들을 모두 공부해야 하는 것은 아닌가 걱정이 될 수 있습니다. 하지만, 언어는 어디까지나 도구일 뿐이며 해당 언어를 사용하여 무언가를 만들어내는 능력이 중요합니다. (물론, 컴파일러나 언어론 자체를 전공하는 예외적인 케이스는 제외합니다) 그리고 보통 하나의 언어에 숙달하고 나면 다른 언어를 익히는 시간은 굉장히 줄어듭니다. 제 경우 처음 공부한 언어가 C언어였는데, 언어를 처음 공부한 시점부터 해당 언어로 무언가 그럴싸한 프로그램을 만들어내기까지 거지는 6개월이라는 시간이 걸렸던 거 같습니다. 반면, 자바를 공부하기 시작한 지 1주일 만에 정부 사업으로 진행한 앱을 만들었고, 파이썬을 공부한 지 이틀 만에 그럴싸한 프로그램을 만들어냈습니다. 이러한 극단적인 시간 축소에는 언어의 특성적인 측면도 있긴 하지만 프로그래밍 자체에 대한 숙련도 증가로 인한 학습 속도 향상이 지대했습니다. 즉, 여러분은 (취미로 여러 언어를 공부하는 경우를 제외하면) 여러 언어를 공부하는 데에 시간을 과투자할 필요가 없습니다.
그렇다고 언어를 익히는 것이 중요하지 않다는 것은 아닙니다. 도구 자체의 사용법을 익히는 것 또한 필요합니다. 개인적으로 주 무기로 사용할 언어 하나와 보조 무기로 사용할 언어 하나 정도 익혀두는 것을 추천합니다. 자신이 어떤 분야에서 일을 하게 될지, 어떤 분야를 세부적으로 전공할지 미리 정할 수 있다면 그에 맞춰서 주 무기를 구성하는 게 베스트지만, 그렇지 않은 경우가 더 많을 것입니다. 그렇다면 한국에서 일할 것이라면 Java를 주 무기로 삼고, Python을 보조 무기로 삼는 것을 추천합니다. Java는 한국에서 가장 많이 사용하는 언어이고, Python은 범용적으로 쓸 수 있기 때문입니다. (코딩 테스트에 유리한 것은 덤이지요.) 참고로 위에서 주 무기라고 하면 해당 언어로 자신이 원하는 로직을 자유롭게 짤 수 있으며 해당 언어의 장단점이 무엇인지 알고 특색을 살려 프로그래밍 할 수 있는 수준을 말하고, 보조 무기라고 하면 해당 언어로 쓸만한 프로그램을 구현할 수 있는 수준을 말합니다.
그 외에도 어떤 언어로 입문을 할 것인지도 매우 많은 분들이 궁금해하는 토픽 중 하나입니다. 컴퓨터공학과 신입생이라면 학교 커리큘럼 상 처음 배우는 언어로, 비전공자분들 중 원하는 분야가 있다면 해당 분야에 적합한 언어가 있기에 해당 언어로 시작하면 되지만, 그렇지 않은 분이라면 Python으로 입문하는 것을 굉장히 추천합니다. Python은 굉장히 범용적이며 언어에 내장된 기능이 다양하고 프로그램을 빠르게 만들어낼 수 있는 효율적인 언어입니다. 그뿐만 아니라 익히기도 쉽고 코드 생김새 자체가 깔끔하여 입문용으로 제격인 언어입니다.
이제 아래에는 대표적인 언어들을 공부하기 위한 소스들을 추천해드릴 것입니다. 그런데 이는 세부 설명을 보면 알겠지만, 입문서부터 고급서까지 다양하기 때문에, 필요에 따라 선택하여 학습하면 됩니다. 해당 언어로 입문하여 주 무기로 사용할 예정이라면 전부 읽으면 좋겠지만, 보조 무기로 사용할 것이라면 기초 서적만 봐도 무방합니다. 혹은, 이미 프로그래밍에 익숙해졌는데 특정 언어를 사용하게 됐다면 입문서를 건너뛰고 레퍼런스 북을 볼 수도 있습니다.
print('Hello world!')
파이썬은 바로 위에 말한 대로 굉장히 범용적으로 쓰이는 언어입니다. 귀찮은 수작업을 자동화하기 위한 개인 툴부터 요즘 인기 많은 AI 분야나 대규모 네트워크 프로그램을 만드는 데에도 사용됩니다. 또한, IT 회사 입사를 위한 코딩 테스트에서 사용하면 가장 효율적이고 유리한 언어 중 하나입니다. 굉장히 장점이 많은 언어긴 하지만, 몇 가지 한계점 때문에 보조 무기로 익혀 두는 것을 추천합니다.
#include <stdio.h>
int main() {
puts("Hello world!");
return 0;
}
C언어는 태생이 UNIX라는 운영체제를 만들기 위하여 태어난 언어입니다. C언어가 세상에 나온 이후 오랜 시간 동안 많은 개발자에게 사랑을 받아왔으며, 지금도 임베디드나 시스템 분야에서 압도적인 점유율을 자랑하고 있습니다. 이후에 생겨난 매우 많은 언어들에 영향을 미쳤으며, 따라서 C언어를 익히고 나면 그로 인해 파생된 많은 언어를 좀 더 쉽게 익힐 수 있습니다. 또한, 굉장히 컴팩트한 문법 체계를 추구하여 언어의 문법 자체는 간결하기 때문에 많은 사람이 C언어를 입문용 언어로 배웠으며, 지금도 많은 대학에서 신입생들에게 첫 언어로 C언어를 가르치고는 합니다. 하지만 이 컴팩트한 문법 때문에, 사실 함정이 매우 많은 언어입니다. C언어로 프로그램을 작성할 때 자칫 잘못하면 내 컴퓨터 환경에서의 동작 결과와 친구 컴퓨터 환경에서의 동작 결과가 달라질 수 있습니다. 초보자 때는 별로 신경 쓰이는 내용이 아닐 수도 있지만, 사실 이런 것은 산업적으로 매우 큰 문제를 야기할 수 있기 때문에, C언어를 배운다면 다른 언어들보다 좀 더 신경 써서 정확하게 배워야 합니다. 이와 관련되어 좋은 포스트가 하나 있기에 링크를 첨부하는데, C언어를 공부할 분이라면 꼭 한 번쯤 읽어보길 권장합니다. C언어로는 주로 디바이스 드라이버, Board Support Package, OS, 미들웨어, 시스템 소프트웨어 등을 만들게 됩니다.
#include <iostream>
auto main() -> int {
std::cout << "Hello world!\n";
return 0;
}
처음에는 C언어에 Simula 언어의 객체지향 개념을 추가하여 만들어진 언어입니다. 그런데 이 언어는 시간이 지나며 너무 많은 기능을 추가하려고 하였고 결국 괴물이 되었습니다. 이제는 절대로 단순히 C언어에 Class를 추가한 언어가 아닌, 각종 패러다임을 집어넣은 만능 지향 언어라고 생각해야 합니다. 특히 C++11이라는 표준안부터는 정말 많은 신개념 패러다임과 기능들이 탑재되어 Modern C++이라고 불립니다. 언어적인 기능이 너무나도 방대하며 언어 자체의 난이도가 상당하기 때문에 입문용 언어로는 추천하지 않습니다만, 이 언어 하나만 정말 잘하면 다른 언어들을 좀 더 쉽게 익힐 수 있습니다. C++은 주로 성능이 중요시되는 프로그램을 만들 때 사용합니다. 영상 처리, 게임 제작, 고성능 서버, 웹 브라우저, GUI 데스크톱 환경 등 정말 다양한 곳에 사용합니다.
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Java는 대표적인 객체 지향 프로그래밍 언어입니다. JVM이라는 가상 머신 위에서 돌아가기 때문에 크로스 플랫폼 언어라고도 합니다. 이 언어의 가장 주요한 특징으로는 한국에서 압도적으로 많이 사용하는 언어라는 것입니다. 한국에서 개발자로 취업하기 위해서는 몇 분야를 제외하고는 거의 필수적으로 잘 알아야 하는 언어입니다. (특히 Spring Framework와 함께 잘 알아둬야 합니다) 자바는 주로 웹 서비스를 개발하거나 안드로이드 애플리케이션을 개발할 때 사용합니다.
console.log("Hello world!");
포탈의 메인 화면에서 광고 배너가 움직이고, SNS에서 스크롤을 할 때마다 새로운 글이 계속해서 나타나는 모습을 보신 적 있으신가요? Javascript는 그러한 동적인 웹 페이지를 개발하기 위해 만들어진 프로그래밍 언어입니다.
처음엔 웹 브라우저 위에서만 작동했었으나, Node.js (Javascript 런타임 환경)가 등장하며 환경의 제약에서 벗어나게 되었습니다. 그로 인해 서버, 데스크톱 앱, 모바일 앱 등 다양한 분야에서 사용되고 있습니다.
자바와는 이름과 구문의 유사성만 있을 뿐, 직접적인 관련이 없는 별개의 언어입니다. (Mocha -> LiveScript -> Javascript 로 여러번의 개명이 있었습니다. 이유가 궁금하시다면 여기를 참고하세요.)
웹 페이지에서 작동하는 Javascript에 대해 더 알고 싶으시면 여기를 참고하세요.
Node.js에 대해 더 알고 싶으시면 여기를 참고하세요.
using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello world!");
}
}
}
C#은 마이크로소프트에서 개발한 객체지향 언어입니다. C 계열의 언어는 맞지만, 오히려 Java 언어와 비슷합니다. 여러 언어의 장점을 흡수해 언어적인 완성도가 우수하며, 지속해서 업데이트 되는 새로운 기능 또한 MS DOCS에서 쉽게 확인할 수 있습니다. 태생이 .NET이라는 프레임워크의 한 부분으로 만들어진 언어여서 .NET 플랫폼에 크게 의존하지만, Unity 등의 스크립트 언어로도 사용합니다. 따라서, C#은 주로 .NET 프레임워크를 이용하여 윈도우 애플리케이션을 개발하거나, Unity에서 게임을 개발할 때 사용합니다. 물론, Mono와 .NET Core 덕분에 범용성이 많이 증가하여 다양한 곳에서 사용할 수는 있습니다.
import Foundation
print("Hello world!")
Swift는 안전성, 성능, 소프트웨어 디자인 패턴에 대한 현대적 접근으로 개발된 범용 프로그래밍 언어로, 기존 Apple 기기에서 동작하는 프로그램을 개발하기 위해 사용되던 Objective-C 라는 언어를 대체하기 위해 2014년에 공개된 Apple의 프로그래밍 언어입니다. 다시 말해, 주로 Apple 기기의 운영체제(iOS, MacOS, WatchOs, tvOS) 위에서 작동하는 응용 프로그램을 개발하기 위한 언어입니다.
하지만 범용 프로그래밍 언어인 만큼 Apple 기기를 위한 응용 프로그램 뿐 만 아니라 서버 개발에 사용되기도 합니다. Apple 기기 응용 프로그램 개발을 위해선 Apple 머신(MacBook, iMac, Mac mini ...)이 필요하지만, 다른 용도로 사용한다면 Windows나 Linux 운영 체제에서도 사용할 수 있습니다. 공식 문서인 Swift.org에서 변경 사항이나 자세한 내용을 확인 할 수 있습니다.
컴퓨터공학/컴퓨터과학의 뼈대를 이루는 기술들이 있습니다. 흔히 컴퓨터 학과 학부 과정의 전공과목인 알고리즘, 컴퓨터구조, 운영체제 등으로 이를 기반 기술이라고 하겠습니다. 사실 요새는 개발 프레임워크 / 개발 플랫폼 등이 너무나도 많이 발전하고 하드웨어 및 최적화 기술의 엄청난 향상에 힘입어 굉장히 추상화된 컴포넌트들을 가지고 간편하게 개발할 수 있게 되었습니다. 그러다 보니 이런 기반 기술들보다는 점유율 높은 프레임워크 사용법이나 요새 핫한 신기술에 좀 더 관심을 두는 양상이 보입니다. 그런 일이 잘못된 것은 아니지만, 기본의 중요성을 간과하지 말았으면 합니다. 후술할 공부 방식 중 Top-Down 방식의 학습을 한다면 기본적인 내용을 뛰어 넘어가며 필요할 때 필요한 내용을 공부하게 될 텐데, 그렇다 하더라도 최종적으로 기본들에 대한 지식이 없다면 속이 빈 강정이 되어 속히 말하는 야매 개발자가 될 확률이 높습니다. 그리고 사실 최신 기술들도 하늘에서 뚝 떨어진 것이 아니라 이런 기반 기술들로부터 영향을 받아 만들어지고 발전한 것입니다. 알고리즘 공부를 열심히 하다가 인공지능을 공부하면 똑같은 내용이 그대로 등장하며, 컴파일러를 공부하고 자연어 처리를 보면 친숙한 내용이 반갑게 맞아줍니다. 운영체제를 공부하며 숨 쉬듯이 보던 컨셉들을 응용 프로그램 개발에서 그대로 볼 수 있습니다. 그러니 최신 기술들에 현혹되어 컴퓨터학과에 입학하신 분 중 이러한 과목들을 공부하며 재미가 없다고 실망하시는 분이 있다면 결국 이러한 내용이 기반이 되는 것들이므로 생각을 다잡으시기 바랍니다.
알고리즘은 어떠한 문제를 해결하기 위한 절차의 표현으로 Computer Science의 큰 기초가 되는 과목 중 하나입니다. 효율적인 프로그래밍의 근간이 되어주고, AI와 같은 다양한 분야의 근본적인 기술입니다. 특히나 MS와 Google로 시작한 Coding Interview(코딩 테스트)가 국내에도 크게 유행하고 있기에 입사를 위해서 신경 써 공부해야 할 과목입니다. 그런데 학술적인 연구를 위한 알고리즘, 실무에서 사용하는 알고리즘, PS(Problem Solving) 대회를 위한 알고리즘, 코딩 테스트를 위한 알고리즘 등 분야별로 다루는 내용이 크게 달라지기 때문에 목적에 맞춰서 효율적인 공부가 필요합니다. 실무에서 사용하는 알고리즘은 어떤 회사에서 어떤 제품을 개발하는지에 따라 천차만별이기에 제외하고 아래에는 학술, 코딩 테스트, 대회를 위한 공부 리소스들을 설명하겠습니다. 사실 코딩 테스트와 대회를 위한 알고리즘은 공부하는 내용이 굉장히 유사하지만, 대회를 위한 공부가 훨씬 넓은 범위를 깊게 파고들어야 한다는 차이가 있습니다.
SwiftUI, MVVM 패턴 등을 다룹니다. edwith에 iOS11 기준으로 강의한 이전 버전의 [스탠포드]Swift를 활용한 iOS11 앱 개발, 인프런에 iOS9 기준으로 강의한 Stanford iOS 한글자막 강의가 있기 때문에 영어 강의에 어려움이 있을 경우 번역본을 들으시면 좋습니다. 번역본을 들으신다면, 비교적 최신 강의인 edwith의 강의를 수강하시는걸 추천합니다.안타깝게도 필자가 게임 개발 경력이 없기에 시니어 개발자 분들의 PR을 기다리겠습니다.
컴퓨터 학과에 입학하신 분들 중에 보안/해킹 쪽 진로를 생각하며 오신 분들도 적지 않을 겁니다. 일반적으로 보안 분야는 공부하는 내용이나 방법이 미묘하게 달라집니다. 예를 들어 (정말 간단하게 설명하자면) C언어의 함수를 공부할 때만 해도 개발자라면 함수는 언제 사용하며, 어떻게 만드는 것이 좋고, 프로토타입은 어떻게 정의해야 효율적인지 등을 중점적으로 공부할 겁니다. 그런데 보안쪽에 진로를 잡고 있다면 그보다 함수 스택 프레임은 어떻게 구성되는지, 호출자와 피호출자간에 정보 전달은 어떤 식으로 이루어지는지, 콜링 컨벤션에 따라 메모리가 어떻게 변화하는지 등에 초점을 맞추게 됩니다.
그 외에도, 디자인패턴이나 개발방법론 같은 내용은 사실 별 도움이 되지 않을 수 있습니다. 소스 코드 오디팅하는 데에는 조금이나마 도움이 될 수도 있겠지만, 그 시간에 다른 공부를 하는 것이 훨씬 이득입니다. (물론 보안 솔루션을 개발하는 쪽으로 간다면 예외입니다.)
하지만 보안쪽을 공부한다고 해도 CS 기본기는 매우 도움이 됩니다. 포너블을 하는데 있어 시스템 프로그래밍이나 운영체제에 대한 지식은 기본입니다. 마찬가지로 웹해킹을 하는데 기본적인 웹이나 데이터베이스에 대한 이해가 없으면 진행하기가 어렵습니다. 따라서 기반기술 내용만큼은 잘 공부해두시면 도움이 됩니다.
아래에는 보안쪽 공부를 하는데 있어 도움이 될만한 자료나 사이트들을 몇 가지 소개해드리겠습니다. 사실 필자는 와우해커나 해커즈랩이 주력이던 때에 달고나 문서 등으로 공부했던지라 최신 트렌드를 잘 모르기 때문에 고수분들이 PR을 주시면 굉장히 감사드리겠습니다.
로드맵은 직접 작성하기에는 너무 케이스가 많고 양이 많다보니 이미 시니어 개발자분들이 만들어주신 로드맵 중 개인적으로 추천하는 로드맵의 링크들을 걸어두겠습니다. 만약 추후에 시간이 된다면 시스템 개발 분야 로드맵은 직접 작성도 해보도록 하겠습니다.
여러가지 프로젝트나 대외 활동 등에 대하여 설명하는 챕터입니다.
기타 프로그래밍 공부를 하며 알아두면 좋은 조언들을 적는 챕터입니다.
커뮤니티 리스트 혹은 이용법 등에 관한 챕터입니다.
ISSUE에 올라온 질문 등에 대해 대답하는 챕터입니다.
각 분야의 시니어 개발자 분들이 주니어 개발자 혹은 뉴비분들에게 드리고 싶은 조언란입니다.
시니어 개발자님들의 PR 감사히 받겠습니다.
ex)
한국에서 취업하려면 자바, 스프링, AWS 공부하고 코테 준비 잘 하세요 - 익명
이곳은 고인물 파티야, 도망치세요 - 익명
프로그래밍은 단거리 경주가 아닌 마라톤입니다 - 익명
406 followers · starred Mar 2021
89 followers · starred Jun 2023
105 followers · starred Mar 2023
670 followers · starred Jun 2024
해당 문서는 프로그래밍/개발에 입문하려는 뉴비분들(컴퓨터학과 신입생, 비전공 개발 입문자 등)과 새로운 공부 리소스를 찾으려 하는 모든 분들을 위한 지침서입니다.
프로그래밍은 다른 분야와 비교하여 선수지식이 적은 편이라고 생각하지만, 그럼에도 불구하고 알아두면 좋은 선수지식이 있습니다. 특정 프로그래밍 분야들은 심도 있는 선수지식이 필요한 때도 있긴 하지만, 아래 내용 하나만큼은 일반적으로 도움이 되는 선수지식입니다:
개발 공부를 시작하면서 가장 처음 접하게 되는 것은 아무래도 컴퓨터 언어일 것입니다. (간혹가다가 컴퓨터구조 같은 것들을 공부하며 입문하는 예외적인 케이스도 보긴 했습니다만..) 컴퓨터 언어는 말 그대로 컴퓨터에서 동작하는 소프트웨어(프로그램)를 작성하기 위한 언어입니다. 처음 공부하는 분들의 입장에서는 정말 수많은 컴퓨터 언어 중에 무엇을 공부하는 것이 가장 좋을지 막막할 수도 있습니다. 또, 어떤 분은 대체 왜 이렇게 많은 컴퓨터 언어가 존재하는지 의아해할 수도 있습니다. (이런 의문을 품는 것은 매우 좋습니다)
컴퓨터 언어들은 저마다 고유한 특색을 가지고 있고, 장단점이 있습니다. 이러한 언어의 특성 때문에 특정 컴퓨터 분야에는 특정 언어가 어울리게 됩니다. 예를 들어, 안드로이드 앱 개발을 할 때는 Java와 Kotlin이라는 언어를 주로 쓰게 됩니다. (NDK개발을 한다면 C/C++도 많이 쓰게 됩니다) 웹 개발자라면 Javascript와 Java를 많이 다루게 될 것이고, 게임 개발자라면 C++이나 C#을 많이 사용할 것입니다. 시스템 개발자라면 C와 C++를 주로 쓰게 될 것이며, 윈도우 응용 프로그램 개발자라면 C#과 일부 C++을 쓸 것입니다. 혹은, 정말 어쩌면, 매니악한 분야를 좋아하여 로우 레벨 개발을 하게 된다면 C와 어셈블리를 사용하게 될 것입니다.
이처럼 많은 분야와 많은 언어가 있는데 이들을 모두 공부해야 하는 것은 아닌가 걱정이 될 수 있습니다. 하지만, 언어는 어디까지나 도구일 뿐이며 해당 언어를 사용하여 무언가를 만들어내는 능력이 중요합니다. (물론, 컴파일러나 언어론 자체를 전공하는 예외적인 케이스는 제외합니다) 그리고 보통 하나의 언어에 숙달하고 나면 다른 언어를 익히는 시간은 굉장히 줄어듭니다. 제 경우 처음 공부한 언어가 C언어였는데, 언어를 처음 공부한 시점부터 해당 언어로 무언가 그럴싸한 프로그램을 만들어내기까지 거지는 6개월이라는 시간이 걸렸던 거 같습니다. 반면, 자바를 공부하기 시작한 지 1주일 만에 정부 사업으로 진행한 앱을 만들었고, 파이썬을 공부한 지 이틀 만에 그럴싸한 프로그램을 만들어냈습니다. 이러한 극단적인 시간 축소에는 언어의 특성적인 측면도 있긴 하지만 프로그래밍 자체에 대한 숙련도 증가로 인한 학습 속도 향상이 지대했습니다. 즉, 여러분은 (취미로 여러 언어를 공부하는 경우를 제외하면) 여러 언어를 공부하는 데에 시간을 과투자할 필요가 없습니다.
그렇다고 언어를 익히는 것이 중요하지 않다는 것은 아닙니다. 도구 자체의 사용법을 익히는 것 또한 필요합니다. 개인적으로 주 무기로 사용할 언어 하나와 보조 무기로 사용할 언어 하나 정도 익혀두는 것을 추천합니다. 자신이 어떤 분야에서 일을 하게 될지, 어떤 분야를 세부적으로 전공할지 미리 정할 수 있다면 그에 맞춰서 주 무기를 구성하는 게 베스트지만, 그렇지 않은 경우가 더 많을 것입니다. 그렇다면 한국에서 일할 것이라면 Java를 주 무기로 삼고, Python을 보조 무기로 삼는 것을 추천합니다. Java는 한국에서 가장 많이 사용하는 언어이고, Python은 범용적으로 쓸 수 있기 때문입니다. (코딩 테스트에 유리한 것은 덤이지요.) 참고로 위에서 주 무기라고 하면 해당 언어로 자신이 원하는 로직을 자유롭게 짤 수 있으며 해당 언어의 장단점이 무엇인지 알고 특색을 살려 프로그래밍 할 수 있는 수준을 말하고, 보조 무기라고 하면 해당 언어로 쓸만한 프로그램을 구현할 수 있는 수준을 말합니다.
그 외에도 어떤 언어로 입문을 할 것인지도 매우 많은 분들이 궁금해하는 토픽 중 하나입니다. 컴퓨터공학과 신입생이라면 학교 커리큘럼 상 처음 배우는 언어로, 비전공자분들 중 원하는 분야가 있다면 해당 분야에 적합한 언어가 있기에 해당 언어로 시작하면 되지만, 그렇지 않은 분이라면 Python으로 입문하는 것을 굉장히 추천합니다. Python은 굉장히 범용적이며 언어에 내장된 기능이 다양하고 프로그램을 빠르게 만들어낼 수 있는 효율적인 언어입니다. 그뿐만 아니라 익히기도 쉽고 코드 생김새 자체가 깔끔하여 입문용으로 제격인 언어입니다.
이제 아래에는 대표적인 언어들을 공부하기 위한 소스들을 추천해드릴 것입니다. 그런데 이는 세부 설명을 보면 알겠지만, 입문서부터 고급서까지 다양하기 때문에, 필요에 따라 선택하여 학습하면 됩니다. 해당 언어로 입문하여 주 무기로 사용할 예정이라면 전부 읽으면 좋겠지만, 보조 무기로 사용할 것이라면 기초 서적만 봐도 무방합니다. 혹은, 이미 프로그래밍에 익숙해졌는데 특정 언어를 사용하게 됐다면 입문서를 건너뛰고 레퍼런스 북을 볼 수도 있습니다.
print('Hello world!')
파이썬은 바로 위에 말한 대로 굉장히 범용적으로 쓰이는 언어입니다. 귀찮은 수작업을 자동화하기 위한 개인 툴부터 요즘 인기 많은 AI 분야나 대규모 네트워크 프로그램을 만드는 데에도 사용됩니다. 또한, IT 회사 입사를 위한 코딩 테스트에서 사용하면 가장 효율적이고 유리한 언어 중 하나입니다. 굉장히 장점이 많은 언어긴 하지만, 몇 가지 한계점 때문에 보조 무기로 익혀 두는 것을 추천합니다.
#include <stdio.h>
int main() {
puts("Hello world!");
return 0;
}
C언어는 태생이 UNIX라는 운영체제를 만들기 위하여 태어난 언어입니다. C언어가 세상에 나온 이후 오랜 시간 동안 많은 개발자에게 사랑을 받아왔으며, 지금도 임베디드나 시스템 분야에서 압도적인 점유율을 자랑하고 있습니다. 이후에 생겨난 매우 많은 언어들에 영향을 미쳤으며, 따라서 C언어를 익히고 나면 그로 인해 파생된 많은 언어를 좀 더 쉽게 익힐 수 있습니다. 또한, 굉장히 컴팩트한 문법 체계를 추구하여 언어의 문법 자체는 간결하기 때문에 많은 사람이 C언어를 입문용 언어로 배웠으며, 지금도 많은 대학에서 신입생들에게 첫 언어로 C언어를 가르치고는 합니다. 하지만 이 컴팩트한 문법 때문에, 사실 함정이 매우 많은 언어입니다. C언어로 프로그램을 작성할 때 자칫 잘못하면 내 컴퓨터 환경에서의 동작 결과와 친구 컴퓨터 환경에서의 동작 결과가 달라질 수 있습니다. 초보자 때는 별로 신경 쓰이는 내용이 아닐 수도 있지만, 사실 이런 것은 산업적으로 매우 큰 문제를 야기할 수 있기 때문에, C언어를 배운다면 다른 언어들보다 좀 더 신경 써서 정확하게 배워야 합니다. 이와 관련되어 좋은 포스트가 하나 있기에 링크를 첨부하는데, C언어를 공부할 분이라면 꼭 한 번쯤 읽어보길 권장합니다. C언어로는 주로 디바이스 드라이버, Board Support Package, OS, 미들웨어, 시스템 소프트웨어 등을 만들게 됩니다.
#include <iostream>
auto main() -> int {
std::cout << "Hello world!\n";
return 0;
}
처음에는 C언어에 Simula 언어의 객체지향 개념을 추가하여 만들어진 언어입니다. 그런데 이 언어는 시간이 지나며 너무 많은 기능을 추가하려고 하였고 결국 괴물이 되었습니다. 이제는 절대로 단순히 C언어에 Class를 추가한 언어가 아닌, 각종 패러다임을 집어넣은 만능 지향 언어라고 생각해야 합니다. 특히 C++11이라는 표준안부터는 정말 많은 신개념 패러다임과 기능들이 탑재되어 Modern C++이라고 불립니다. 언어적인 기능이 너무나도 방대하며 언어 자체의 난이도가 상당하기 때문에 입문용 언어로는 추천하지 않습니다만, 이 언어 하나만 정말 잘하면 다른 언어들을 좀 더 쉽게 익힐 수 있습니다. C++은 주로 성능이 중요시되는 프로그램을 만들 때 사용합니다. 영상 처리, 게임 제작, 고성능 서버, 웹 브라우저, GUI 데스크톱 환경 등 정말 다양한 곳에 사용합니다.
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Java는 대표적인 객체 지향 프로그래밍 언어입니다. JVM이라는 가상 머신 위에서 돌아가기 때문에 크로스 플랫폼 언어라고도 합니다. 이 언어의 가장 주요한 특징으로는 한국에서 압도적으로 많이 사용하는 언어라는 것입니다. 한국에서 개발자로 취업하기 위해서는 몇 분야를 제외하고는 거의 필수적으로 잘 알아야 하는 언어입니다. (특히 Spring Framework와 함께 잘 알아둬야 합니다) 자바는 주로 웹 서비스를 개발하거나 안드로이드 애플리케이션을 개발할 때 사용합니다.
console.log("Hello world!");
포탈의 메인 화면에서 광고 배너가 움직이고, SNS에서 스크롤을 할 때마다 새로운 글이 계속해서 나타나는 모습을 보신 적 있으신가요? Javascript는 그러한 동적인 웹 페이지를 개발하기 위해 만들어진 프로그래밍 언어입니다.
처음엔 웹 브라우저 위에서만 작동했었으나, Node.js (Javascript 런타임 환경)가 등장하며 환경의 제약에서 벗어나게 되었습니다. 그로 인해 서버, 데스크톱 앱, 모바일 앱 등 다양한 분야에서 사용되고 있습니다.
자바와는 이름과 구문의 유사성만 있을 뿐, 직접적인 관련이 없는 별개의 언어입니다. (Mocha -> LiveScript -> Javascript 로 여러번의 개명이 있었습니다. 이유가 궁금하시다면 여기를 참고하세요.)
웹 페이지에서 작동하는 Javascript에 대해 더 알고 싶으시면 여기를 참고하세요.
Node.js에 대해 더 알고 싶으시면 여기를 참고하세요.
using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello world!");
}
}
}
C#은 마이크로소프트에서 개발한 객체지향 언어입니다. C 계열의 언어는 맞지만, 오히려 Java 언어와 비슷합니다. 여러 언어의 장점을 흡수해 언어적인 완성도가 우수하며, 지속해서 업데이트 되는 새로운 기능 또한 MS DOCS에서 쉽게 확인할 수 있습니다. 태생이 .NET이라는 프레임워크의 한 부분으로 만들어진 언어여서 .NET 플랫폼에 크게 의존하지만, Unity 등의 스크립트 언어로도 사용합니다. 따라서, C#은 주로 .NET 프레임워크를 이용하여 윈도우 애플리케이션을 개발하거나, Unity에서 게임을 개발할 때 사용합니다. 물론, Mono와 .NET Core 덕분에 범용성이 많이 증가하여 다양한 곳에서 사용할 수는 있습니다.
import Foundation
print("Hello world!")
Swift는 안전성, 성능, 소프트웨어 디자인 패턴에 대한 현대적 접근으로 개발된 범용 프로그래밍 언어로, 기존 Apple 기기에서 동작하는 프로그램을 개발하기 위해 사용되던 Objective-C 라는 언어를 대체하기 위해 2014년에 공개된 Apple의 프로그래밍 언어입니다. 다시 말해, 주로 Apple 기기의 운영체제(iOS, MacOS, WatchOs, tvOS) 위에서 작동하는 응용 프로그램을 개발하기 위한 언어입니다.
하지만 범용 프로그래밍 언어인 만큼 Apple 기기를 위한 응용 프로그램 뿐 만 아니라 서버 개발에 사용되기도 합니다. Apple 기기 응용 프로그램 개발을 위해선 Apple 머신(MacBook, iMac, Mac mini ...)이 필요하지만, 다른 용도로 사용한다면 Windows나 Linux 운영 체제에서도 사용할 수 있습니다. 공식 문서인 Swift.org에서 변경 사항이나 자세한 내용을 확인 할 수 있습니다.
컴퓨터공학/컴퓨터과학의 뼈대를 이루는 기술들이 있습니다. 흔히 컴퓨터 학과 학부 과정의 전공과목인 알고리즘, 컴퓨터구조, 운영체제 등으로 이를 기반 기술이라고 하겠습니다. 사실 요새는 개발 프레임워크 / 개발 플랫폼 등이 너무나도 많이 발전하고 하드웨어 및 최적화 기술의 엄청난 향상에 힘입어 굉장히 추상화된 컴포넌트들을 가지고 간편하게 개발할 수 있게 되었습니다. 그러다 보니 이런 기반 기술들보다는 점유율 높은 프레임워크 사용법이나 요새 핫한 신기술에 좀 더 관심을 두는 양상이 보입니다. 그런 일이 잘못된 것은 아니지만, 기본의 중요성을 간과하지 말았으면 합니다. 후술할 공부 방식 중 Top-Down 방식의 학습을 한다면 기본적인 내용을 뛰어 넘어가며 필요할 때 필요한 내용을 공부하게 될 텐데, 그렇다 하더라도 최종적으로 기본들에 대한 지식이 없다면 속이 빈 강정이 되어 속히 말하는 야매 개발자가 될 확률이 높습니다. 그리고 사실 최신 기술들도 하늘에서 뚝 떨어진 것이 아니라 이런 기반 기술들로부터 영향을 받아 만들어지고 발전한 것입니다. 알고리즘 공부를 열심히 하다가 인공지능을 공부하면 똑같은 내용이 그대로 등장하며, 컴파일러를 공부하고 자연어 처리를 보면 친숙한 내용이 반갑게 맞아줍니다. 운영체제를 공부하며 숨 쉬듯이 보던 컨셉들을 응용 프로그램 개발에서 그대로 볼 수 있습니다. 그러니 최신 기술들에 현혹되어 컴퓨터학과에 입학하신 분 중 이러한 과목들을 공부하며 재미가 없다고 실망하시는 분이 있다면 결국 이러한 내용이 기반이 되는 것들이므로 생각을 다잡으시기 바랍니다.
알고리즘은 어떠한 문제를 해결하기 위한 절차의 표현으로 Computer Science의 큰 기초가 되는 과목 중 하나입니다. 효율적인 프로그래밍의 근간이 되어주고, AI와 같은 다양한 분야의 근본적인 기술입니다. 특히나 MS와 Google로 시작한 Coding Interview(코딩 테스트)가 국내에도 크게 유행하고 있기에 입사를 위해서 신경 써 공부해야 할 과목입니다. 그런데 학술적인 연구를 위한 알고리즘, 실무에서 사용하는 알고리즘, PS(Problem Solving) 대회를 위한 알고리즘, 코딩 테스트를 위한 알고리즘 등 분야별로 다루는 내용이 크게 달라지기 때문에 목적에 맞춰서 효율적인 공부가 필요합니다. 실무에서 사용하는 알고리즘은 어떤 회사에서 어떤 제품을 개발하는지에 따라 천차만별이기에 제외하고 아래에는 학술, 코딩 테스트, 대회를 위한 공부 리소스들을 설명하겠습니다. 사실 코딩 테스트와 대회를 위한 알고리즘은 공부하는 내용이 굉장히 유사하지만, 대회를 위한 공부가 훨씬 넓은 범위를 깊게 파고들어야 한다는 차이가 있습니다.
SwiftUI, MVVM 패턴 등을 다룹니다. edwith에 iOS11 기준으로 강의한 이전 버전의 [스탠포드]Swift를 활용한 iOS11 앱 개발, 인프런에 iOS9 기준으로 강의한 Stanford iOS 한글자막 강의가 있기 때문에 영어 강의에 어려움이 있을 경우 번역본을 들으시면 좋습니다. 번역본을 들으신다면, 비교적 최신 강의인 edwith의 강의를 수강하시는걸 추천합니다.안타깝게도 필자가 게임 개발 경력이 없기에 시니어 개발자 분들의 PR을 기다리겠습니다.
컴퓨터 학과에 입학하신 분들 중에 보안/해킹 쪽 진로를 생각하며 오신 분들도 적지 않을 겁니다. 일반적으로 보안 분야는 공부하는 내용이나 방법이 미묘하게 달라집니다. 예를 들어 (정말 간단하게 설명하자면) C언어의 함수를 공부할 때만 해도 개발자라면 함수는 언제 사용하며, 어떻게 만드는 것이 좋고, 프로토타입은 어떻게 정의해야 효율적인지 등을 중점적으로 공부할 겁니다. 그런데 보안쪽에 진로를 잡고 있다면 그보다 함수 스택 프레임은 어떻게 구성되는지, 호출자와 피호출자간에 정보 전달은 어떤 식으로 이루어지는지, 콜링 컨벤션에 따라 메모리가 어떻게 변화하는지 등에 초점을 맞추게 됩니다.
그 외에도, 디자인패턴이나 개발방법론 같은 내용은 사실 별 도움이 되지 않을 수 있습니다. 소스 코드 오디팅하는 데에는 조금이나마 도움이 될 수도 있겠지만, 그 시간에 다른 공부를 하는 것이 훨씬 이득입니다. (물론 보안 솔루션을 개발하는 쪽으로 간다면 예외입니다.)
하지만 보안쪽을 공부한다고 해도 CS 기본기는 매우 도움이 됩니다. 포너블을 하는데 있어 시스템 프로그래밍이나 운영체제에 대한 지식은 기본입니다. 마찬가지로 웹해킹을 하는데 기본적인 웹이나 데이터베이스에 대한 이해가 없으면 진행하기가 어렵습니다. 따라서 기반기술 내용만큼은 잘 공부해두시면 도움이 됩니다.
아래에는 보안쪽 공부를 하는데 있어 도움이 될만한 자료나 사이트들을 몇 가지 소개해드리겠습니다. 사실 필자는 와우해커나 해커즈랩이 주력이던 때에 달고나 문서 등으로 공부했던지라 최신 트렌드를 잘 모르기 때문에 고수분들이 PR을 주시면 굉장히 감사드리겠습니다.
로드맵은 직접 작성하기에는 너무 케이스가 많고 양이 많다보니 이미 시니어 개발자분들이 만들어주신 로드맵 중 개인적으로 추천하는 로드맵의 링크들을 걸어두겠습니다. 만약 추후에 시간이 된다면 시스템 개발 분야 로드맵은 직접 작성도 해보도록 하겠습니다.
여러가지 프로젝트나 대외 활동 등에 대하여 설명하는 챕터입니다.
기타 프로그래밍 공부를 하며 알아두면 좋은 조언들을 적는 챕터입니다.
커뮤니티 리스트 혹은 이용법 등에 관한 챕터입니다.
ISSUE에 올라온 질문 등에 대해 대답하는 챕터입니다.
각 분야의 시니어 개발자 분들이 주니어 개발자 혹은 뉴비분들에게 드리고 싶은 조언란입니다.
시니어 개발자님들의 PR 감사히 받겠습니다.
ex)
한국에서 취업하려면 자바, 스프링, AWS 공부하고 코테 준비 잘 하세요 - 익명
이곳은 고인물 파티야, 도망치세요 - 익명
프로그래밍은 단거리 경주가 아닌 마라톤입니다 - 익명
406 followers · starred Mar 2021
89 followers · starred Jun 2023
105 followers · starred Mar 2023
670 followers · starred Jun 2024