들어가는 글
Comp1500 C# 강의와, Comp 1000 강의를 듣고 나서, 취업을 어떻게 할 것인지 고민을 할까 고민을 하게 되었습니다. 딱히 어떠한 개발자가 되어야 할지 막막했고, 부트캠프나 국비 학원처럼 POCU에서 취업에 도움을 직접 주지는 않기 때문에 더욱 고민을 하게 되었었습니다.
그래서, POCU 졸업생 분들이 계신 슬랙방에, 앞으로 어떠한 개발자가 되어야 할지 질문을 남겼더니, 선배 개발자 님들께서 원하는 분야를 개발 공부를 하라는 말씀을 듣자마자 바로 부트캠프에 지원하기로 마음을 먹었었습니다.
그렇게 찾아보게 된 교육기관들은 정말 많았고, 아래의 표처럼 여러곳을 비교해보고 선택을 하게 되었습니다.
저는 싸피와 코드 스쿼드를 지원했었었고, 지금은 안드로이드 반에서 안드로이드를 공부하게 되었습니다.
저수준 언어는 왜 배워야 할까?
우리나라는 JAVA 공화국이라는 말이 있듯이, 웹 서치를 하면 많은 분들이 JAVA 를 배우는 것이 개발자로서 취업을 하고 커리어를 쌓아가는데 굉장히 유리하다고 합니다. 그렇기에, C 언어 과목을 듣는 것이 과연 나에게 도움이 되는 일인지 정말 깊게 고민이 들 수밖에 없습니다. 자바 하나로 프로그래밍하기도 어려운데, 굳이 임베디드나 하드웨어에 가까운 C나 C++로 프로그래밍을 할 일이 없을 것 같기 때문입니다.
마치 옛날 개발자들이나 했을법한 메모리의 제약과 같은 부분들 때문에, C언어를 통해서 개발하고, 그들이나 메모리 관리를 하는데 말입니다.
C언어를 안쓰는 프로그래머가 되고자 하는데 과연 C를 배울 필요성이 있을까?
처음에 저도 C언어를 굳이 배워야 할까?라는 막연한 생각을 하게 되었습니다. 안드로이드 개발을 하는데 C언어에 대한 공부를 굳이 해야 하나 싶기도 하고, C언어를 배운다고 해서 코틀린 개발에 도움이 될까 라는 생각이 많았기 때문입니다. 특히 POCU C강의는 어렵기로 소문도 파다한데 말입니다.
그렇게, 인터넷 검색을 하다가 보게 된 글입니다.
그리고 다른 주장들을 하셨는데. C 언어를 배우지 말아야 하는 이유로서 저수준 언어를 배우는 게 시간이 많이 걸리며, 오래된 언어기 때문에 미래에 사용할 일이 없다면 C공부를 안 하는 것이 효율적이지 않냐고 말하셨습니다. 게다가, 구글에 c언어를 배워야 하나요?라고만 치더라도 아주 많은 글들이 나오는데, 몇몇 블로그들이 C언어를 배우는 것에 대해서 회의적이고, C언어를 배우는 것이 학습자를 고급 개발자로 성장시키는 것이 아니라고도 말을 하는 경우가 많았습니다.
차라리, C언어를 배우는기 보다는 시간이 많이 들기 때문에, 자기가 원하는 부분을 더욱 파보는 것이 중요하고, 앞으로 c언어와 같은 언 매니지드 프로그래밍 언어들을 주력으로 사용할 것이 아니라면, 굳이 공부를 해야 할 필요가 있냐고 대부분이 말을 하고 있었고, C를 통해서 얻을 수 있는 메모리 관리라던가 여러 지식들을 따로 배우면 되는 것이지 시간을 내서 고대 언어를 학습하는 데는 적절하지 않다고 주장들을 했습니다.
또한, 언메니지드 언어를 초보자들이 학습하다 보면, 너무 높은 러닝 커브 때문에 코딩에 대한 흥미가 떨어질 수 있다고 지적하고 있었습니다.
솔직히, 저도 또한 위의 주장들 때문에 C언어를 학습하는 것을 고민했고, 저도 C언어를 미래에도 쓸 것 같지 않은데 꼭 해야 하나?라는 많은 부정적인 시야를 가지고 있었습니다.
저수준 언어를 배워야 하는 이유
저수준 언어인 C언어를 배워야 하는 이유 는 어쩌면, 하드웨어에 가까운 언어기 때문입니다. 위의 표를 보면 아시겠지만 왼쪽으로 갈수록 하드웨어에 가까운 언어이고, 오른쪽으로 갈수록 추상화가 심한 언어입니다.
그리고 저의 주관적인 경험을 토대로 말하자면, C 와 같은 언 매니지드 언어는 꼭 사용할 줄 알아야 한다고 봅니다.
그렇다면 왜 C와 같은 언어를 배워야만 할까요?
위의 동영상을 보시면 포프님이 이러한 말씀을 하십니다.
탑 레이서들은 자동차의 엔진 구조와 같은 부분들을 이해하기 때문에, 남들보다 더 효율적으로 자원을 관리하고 더 좋은 결과를 낼 수 있다는 것이다. 이러한 일은 프로그래머도 정말 다르지 않다고 생각한다.
프로그래머 또한, 하드웨어가 돌아가는 것을 알아야 하고, 이를 사용해야만 더욱 실력 있는 개발자가 된다는 것을 알려주고 계십니다.
또한, 부트캠프 강의를 듣다가, 강사님이 이런말씀을 남겨주셨는데, 코딩을 하다 보면 지식을 찾기 위해 다음과 같은 과정을 거친다고 합니다.
- 블로그 검색
- 공식문서 검색
- 컴퓨터 지식을 통한 추론
블로그에서 지식을 찾고 블로그에 원하는 지식이 없다면, 공식문서에 있는 지식을 흡수하고, 공식문서에서도 답이 없다면, 기초 지식을 바탕으로 스스로 추론할 수밖에 없다 라는 말입니다. 그렇기 때문에, 서비스를 개발하다 보면 개발에 필요한 도구들에 OS, 네트워크 등 다양한 지식들이 들어가게 되고 전반적인 하드웨어 지식 또한 필요할 수밖에 없게 된다는 뜻이었습니다.
그리고 추상화가 이루어진 JAVA, 코틀린 같은 언어들은, 하드웨어가 어떻게 돌아가는지에 대해서 더욱 이해하기 어려워지고 어째서 이것들이 동작하는지 굉장히 어려워 지게 만듭니다. 항상 마법과 같은 일들을 프로그래밍 작성 시에 느끼게 되니, 하드웨어적으로 어떻게 프로그램이 돌아가는지에 대해서 관심이 없어질 수밖에 없고, 점점 궁금한 것들이 사라지게 될 것입니다
+ 덧붙이는 이유
앞서, 하드웨어적으로 필요하다는 말에 조금 더 부연설명을 하기 위해서 안드로이드 내부 구조를 가지고 왔습니다. 위의 표를 보면 아시겠지만, 안드로이드 OS도 리눅스를 기반으로 만들어 졌고, 오류나 에러를 해결해야 할 순간이 올 거라는 게 어렷품이 느껴집니다.
더욱 구체적인 예로, 안드로이드 시스템 중 클립보드 시스템을 예로 들자면, clipboard 메소드는 안드로이드 시스템을 활용하도록 되어있습니다. 하지만, 하지만, Clipboard 매니저가 느리게 작동한다거나, 에러가 계속 발생된다면 어떤 식으로 자료들을 저장하고 보내줄 수 있을까요? 물론, 다른 메서드를 활용해서 문제를 해결하면 되겠지만, 꼭 써야만 하는 기능이라면 프로그래머가 직접 OS레벨에서 고칠 수 있어야 할 것입니다.
그렇다면, 이를 할 줄 알려면 C, C++혹은 Rust 등 언 매니지드 언어를 알고 활용하는 것이 훨씬 나아 보이며, 앞으로의 개발에도 많은 도움을 줄 것임이 분명해 보입니다.
성장에 필요한 저수준 언어 지식
cs지식을 채워나갈수록 더욱 빠른 성장을 할 수 있다고 합니다. 물론 C언어를 배우는것이 CS지식은 아니지만, COMP 2200에서 배우는 C언어는 CS 메모리에 관련된 지식에 더욱 가깝다고 할 수 있습니다.
며칠 전 포프님께서 라이브에서 설명해 주신 부분을 적어 왔습니다.
공부를 해나가면서 새로운 기술들이 계속 나오고 신기술들을 배우는 것도 중요하지만, cs기초가 탄탄히 잡혀 있다면 남들이 보이기에는 늦어 보이지만 시간이 조금 지나면 남들보다 더욱 빠르게 성장할 겁니다.
즉, 위의 표에서 절망의 계곡에서 깨달음의 오르막까지 오르는 시간이, CS지식과 같은 기본적인 지식이 튼튼한 사람이 더욱 빠르게 성장한다고 말씀해 주신것입니다.
몇 개월밖에 프로그래밍을 해보지 않았지만, 위 말씀이 맞다고 생각이 든 것은, 프로그래밍에는 마법이 없기 때문입니다. 컴퓨터에서 실행되는 모든 것을 프로그래머가 만들었고, 그들이 필요한 것들을 프로그래밍을 통해 만든 것이기 때문입니다.
COMP 2200을 왜 수강해야 할까?
위의 블로그를 보면 다음과 같은 문구가 있습니다.
비율로 따지면 모 그룹의 신입사원은 80% 이상이 학부에서 C언어를 잘못 배운채 입사했었다. 특히 제대로 검증할 수 없는 인터넷 카페나 페북 등과 같은 곳에서 소개하는 나쁜 교재나 잘못된 공부 방법으로 시작한 경우에는 거의 99% 개념을 잘못 잡아서 초급에서 헤매다가 끝내 포기하는 경우가 많은 것 같았다.
c언어를 배우는 상책 은 고수한테 직접 배우는 것이다.
요즘, C언어를 배울 수 있는 곳은 많고, 질 좋은 강의는 많다고 생각합니다. 조금만 찾아보아도 구글링을 통해 많은 지식을 얻을 수 있으니까요. 하지만 C언어를 고수 (= 포프 님) 한테 직접 배우는 기회인데 POCU아카데미 또한 좋은 기회라고 저는 생각합니다.
그리고 미리 comp2200 수업을 들어보면 정말 놀랍게도 양질의 수업을 들을 수 있습니다. 강의를 해주시는 부분에서 이게 왜 그럴까?라는 질문이 들면 바로 다음 장에 포프 님께서 "이게 궁금하셨죠? 이걸 또 설명해 드릴게요" 라면서 궁금한 부분을 계속 긁어주십니다.
COMP 2200에서 배운 최고의 것들.
저는 정말 이 수업을 듣고, 자바 개발이던 어떤 언어이건 간에 프로그래머라면 이 과목을 꼭 들어야 한다고 생각하게 되었고, 고수준 언어를 쓰지만 C와 같은 저수준 언어를 배우는 것을 의심하는 분들을 위해 제가 이 강의에서 무엇을 배웠는지 공유하고 싶었고, 왜 들어야 하는지 설득하고자 합니다.
제가 배운 최고의 배움은 크게 두 가지가 있습니다.
- 포인터
- 자료구조 (특히, 링크드 리스트, 해시 맵)
최고의 배움 - 1. 포인터
코딩을 하다 보면, 포인터의 존재를 한 번쯤은 들어보았을 것입니다. 포인터는 무엇일까요?
쉽게 설명하자면 위의 그림처럼 어떠한 값을 가리키고 있는 주소입니다.
이를 활용하게 되면 값이 엄청 커지더라도 이 값을 계속해서 복사하여 사용하는 일이 없겠죠.
위의 동영상을 보면, 포프 님께서 포인터가 왜 중요한지 말씀해 주시는데, 두 가지 이유를 설명해 주십니다.
1. 포인터를 배움으로써 논리적인 사고를 확장시킬 수 있다.
2. 하드웨어를 잘 이해하는 프로그래머가 되기 위해서는 포인터 정도는 자유자재로 민잘 수 있어야 된다
C언어에서 사용하는 포인터를 학습하게 된다면, 전반적인 프로그래밍 언어들에서 마법처럼 돌아가는 부분들이 내부적으로는 어떻게 돌아가는지, 포인터는 어떤 역할들을 하는지 알 수 있기 때문에 배워둔다면 정말 중요한 개념이 될 것입니다.
고수준 언어에서의 포인터
그렇다면 간략하게 자바와 코틀린의 포인터는 어떤 것일까요? 가장 쉬운 예를 들자면 다음과 같습니다.
만약 당신이, 자바로 먼저 프로그래밍을 처음 시작했다면 다음과 같은 부분을 이해하지 못했을 것이다.
String str = "Test String"
String str2 = "Test String"
if(str == str2) {
println(true)
} else {
println(false)
}
위와 같은 코드가 있다면 어떤 값을 반환할까요?
당연히 true가 반환될 것 같지 않나요?
하지만, 결과는 당연하게도 false가 나옵니다.
그 이유는 무엇일까요? 자바에서는 String이 하나의 개체로 저장됩니다. 그리고 이 개체는 각각 다른 메모리를 사용하고 있기 때문에 str의 주소와 str2의 주소를 비교하게 되면 당연히 false값이 나오게 되는 것입니다. 그렇다면 자바에서는 문자열을 비교하려면 어떻게 해야 할까요? equals라는 함수를 이용해야 "Test String"을 직접 비교하게 됩니다..
위와 비슷한 예이지만 C언어와 같은 언 매니지드 언어를 이해하지 못했다면, 다음 예도 아마 이해하지 못했었을 수 있습니다.
위의 코드는 무엇을 출력할까요?
당연하게도
아무것도 출력되지 않습니다.
testList라는 주소 값이 cloneTestList에 전달되었기 때문에 cloneTestList.clear()는 testList의 모든 값을 지우게 되고 아무것도 출력하지 않게 되는 것이죠.
그렇다면, testList의 원소들이 지워지지 않고 복사되는 방법은 없을까요?
위의 코드처럼 cloneTestList에 직접 모든 값을 한번 더 넣어주면 됩니다. 즉 깊은 복사를 만들면 되는 것이죠
이렇게 코드를 작성하면 testList에 원소가 남아있는 것을 알 수 있습니다.
COMP 1500을 들을 때, 깊은 복사와 얕은 복사에 대해서 들어는 보았지만, 실제로 C강의를 듣기 이전까지는 왜 이러한 일들이 일어나는지 알 수 없었습니다. 하지만, 포인터의 개념을 학습하니 왜 이러한 문제들이 발생하는지 확실히 알 수 있었습니다.
이처럼 코틀린이나 자바와 같은 고수준 언어들도 포인터를 내부적으로 사용하고 있기 때문에, COMP2200을 배우게 된다면 이러한 부분들을 더욱 쉽게 이해하고 프로그래밍에서 잘 적용할 수 있게 도와줄 것입니다.
덧붙이는 예제 - 함수 포인터
함수 포인터는 또한 위의 포인터처럼 함수를 가리키는 포인터를 말합니다. 위에서 설명한 포인터처럼 주소값이 어떠한 변수를 가르키는것이 아닌 함수를 가르키는 포인터여서 함수 포인터라고 부릅니다. 그렇다면 이런 함수 포인터는 코틀린에서는 어떻게 활용이 되고 있을까요?
필자의 짧은 코딩 실력으로 들 수 있는 예는 두 가지의 예를 들어 드리겠습니다.
코틀린의 람다 함수를 인자로 보내기
함수의 인자로 함수를 전달하는 것을 보실 수 있습니다. 마치 C에서 함수 포인터를 사용하는 것과 비슷해 보이네요.
또한, 인터페이스도 비슷한 일을 하는 것 같이 보이는데.
인터페이스를 BreadMachine 클래스에서 상속받아 구현하는 것이 함수 포인터에 값을 대입해 주는 것과 비슷해 보입니다.
작은 예들이지만, 이 예들을 보면 포인터가 얼마나 많이 사용되고 있는지 조금은 감이 오실 거라 생각이 됩니다. 추상화가 많은 프로그래밍 언어들은 정말 어떤 것이 포인터인지 알기 쉽지 않습니다.
최고의 배움 - 2. 자료구조
링크드 리스트
처음 부트캠프에 와서 CS과정을 들으며 링크드 리스트를 학습했던 일이 있었는데, 도대체 왜 이러한 자료구조를 쓰는지 이해를 할 수 없었습니다. 메모리에 리스트를 할당해 주는 것이라는데, 그냥 Collection List를 사용하면 되는 일 아닌가?라는 생각이 지배적이었기 때문입니다.
이 강의를 들으면서 Linked List가 왜 중요한지 조금은 알았지만, 어디에 쓰이는 것인지 알 수 없었습니다. 하지만 C과목을 수강하고 직접 메모리 관리를 해주다 보니 어째서 이러한 링크드 리스트가 존재하는지 알게 되었고, 이를 왜 사용해야 하는지에 대한 감을 확실히 알 수 있었습니다. 링크드 리스트는 정말 중요한 자료구조임이 분명하고, 동적 메모리와 정적 메모리(stack) 이 어떻게 다른지, 왜 링크드 리스트를 활용해야 하는지를 이해하게 되었습니다.
class Video(number: Int) {
private val realNum = number + 1
private var order: String = "제목$realNum"
private var id: String = ""
private var length: Int = 0
var next: Video? = null
val info: String
get() {
return "$id $length"
}
fun ready() {
val a: Char = (97..122).random().toChar()
val b: Char = (97..122).random().toChar()
val c: Char = (97..122).random().toChar()
val d: Char = (97..122).random().toChar()
id = a.toString() + b.toString() + c.toString() + d.toString()
length = (1..15).random()
println("$order($id):$length")
}
}
처음 만들어 보았던 Linked List입니다. 부족한 코드이지만, 코틀린에서 만들어 볼 때에 이걸 왜 해야 하는지 알 수 없었습니다.
하지만 C언어에서 링크드 리스트를 만들면 동적할당을 통해서 어떻게 List처럼 만들 수 있는지에 대해서 충분히 이해를 하고 사용할 수 있게 됩니다. 그리고 면접문제로 많이 나온다고 합니다!. 충분히 익혀야 할 부분이라고 생각합니다.
큐
큐는 먼저 들어온 자료가 먼저 나가는 방식으로 이루어진 자료구조입니다
처음 들어온 원소가 제일 먼저 나가는 자료구조를 큐라고 합니다. 하지만 이를 C에서 구현을 하게 되면 아래처럼 원형 버퍼의 개념을 생각하여 만들게 되는데 이는, 정말 신선한 충격이었습니다. 이를 이용하면 메모리를 계속 늘리지 않고 큐를 사용할 수 있게 됩니다.
해시 테이블
해시 테이블 또한 이해하기 어려웠던 자료구조였는데, 어째서 O(1)이 되는 자료구조인지 한참 이해하지 못했었습니다. 하지만, 직접 해시 테이블을 작성해 보면서 이 자료구조를 사용하게 되면 어떻게 효율적으로 데이터를 관리할 수 있을지, 자료를 삽입 삭제 탐색 시 O(1)로 움직이는지 알 수 있었고 이러한 자료구조를 어디에 써야 할지 조금씩 감이 오기 시작했습니다.
해시 테이블 또한 언 매니지드 언어로만 개발을 했다면 왜 사용하는지에 대한 깊은 이해와 생각을 할 수 없었을 것이 분명하며, 그냥 알고리즘 문제를 푸는데 필요하니까 사용했을 것이었습니다.
+ 재미있는 문자열 해시함수
+ 메모리 관리에 대한 이해도 상승
다음 글을 한번 읽어보면 전반적인 JVM에서의 메모리 사용이 나와있습니다.
자바에서 스택에 어떠한 부분들이 들어가고, 어떤 것들이 힙 메모리에 저장이 되는지 설명이 잘 되어있기 때문에, Comp2200에서 충분히 메모리에대해 학습하셨다면, 자바에서 메모리들이 어떻게 이용되는지 더 잘 이해하실 수 있을 거라고 생각합니다.
위의 링크를 클릭해 보면 스택과 힙에 어떤 식으로 자료들이 저장되는지 보여주는 표입니다.
자바에서 가비지 컬렉터는 어떻게 사용될까요?
위 그림은 Mark&Sweep방식의 가비지 컬렉터인데, 개체들이 가리키는 reference를 따라가서 안 쓰는 메모리를 없애는 방식으로 진행이 됩니다. 하지만, 가비지 컬렉터가 돌아갈때마다 이러한 일들이 반복되기 때문에 어째서 jvm 위에서 구동하는 프로그램들이 c언어로 작성된 프로그램보다 느린지 이해할 수 있을 것입니다.
우리가 직접 메모리 관리를 안 해주는 대신에 뒤에서 어떻게 돌아가는지 이해하기가 수월해지고, 너무나 마법 같은 일을 해주는 프로그램을 제작한 프로그래머들에게 감사함이 느껴집니다.
아래는 Minor GC에 대한 설명글 입니다.
C수강 중 느꼈던 것들..
메모장 지옥...
코딩 지옥.. 정말 말 그대로 메모장 지옥이다. clang으로 컴파일을 하면.
알 수 없는 오류들을 뿜 뿜 내뿜어 주신다. 도대체 이것들이 뭐지?...
심지어 실습에서 실행되지 않음.. 오류를 심심치 않게 볼 수 있습니다.
테스트 - 크래시는? 매우 빈번하게 만날 수 있습니다. ㅎㅎ
또한, 메모장 코딩을 하다 보면, 정말 어디에서 오류가 발생했는지 알기 쉽지 않습니다... 메모장을 통해서 코딩을 해본 적이 한 번도 없었기 때문에, 정말 너무나 힘들었는데 아마 comp2200을 수강하시는 분들이라면 다들 공감하실 겁니다. 저의 꿈속에서 코딩을 하는 게 다 나올 지경이었니 말입니다... 하지만, 이러한 힘듦 속에서도 포프 님께서 머릿속으로 디버깅하는 정도는 기본 소양이라고 하셔서.. 내 실력이 얼마나 부족한지 느낄 수 있었습니다...
그리고, 가끔 프로그램이 정상적으로 돌면 프로그램이 왜 되지?라는 질문에 갇히곤 했습니다...
함수의 책임을 정하기
메모장 코딩을 하면서, 함수가 작게 잘라질수록 오히려 디버깅을 하기 힘든 경우가 많아졌는데, 하나의 함수가 바뀌면 다른 함수들까지 줄줄이 고쳐야 했기 때문이었습니다.
구글에 검색을 하다 보면 CleanCode와 같은 책을 언급하면서 에서 말하는 함수를 잘 만드는 법들을 알려주십니다. 특히 함수는 2줄 정도로 매우 작게 만들어야 한다고 하십니다.
하지만, 이처럼 작게 만들어야 한다고 하는데 이렇게 하게 되면, 하나의 함수가 가지는 책임이 너무 작아서 코드 유지보수가 너무나 힘들어지는 경우가 종종 발생했습니다.
그렇기에, 함수의 책임에 대해서 더욱 많은 고민을 했고, 하나의 함수가 여러 개로 잘게 자르는 게 좋은 것이 항상 좋은것이 아님을 깨닫게 되었습니다. 그래서 C#강의에서 포프 님이 중괄호를 통해서 함수의 부분을 나누어 작성하는 것이 좋다고 말씀해 주신 이유를 메모장 코딩을 하면서 조금은 알 수 있었고, 적절한 함수의 크기를 만드는 것을 깊게 고민할 수 있는 좋은 기회였습니다.
정말 긴 강의 시간
콜드 마이터님께서 보여주신 것처럼, C 언 매니지드 프로그래밍 과목이 38시간으로 정말 많이 시간이 들어가는 과목입니다. 그리고 38시간 동안 강의를 들으시면서 한 번에 이해된다면 모르겠지만, 저와 같이 초보자라면, 많다면 대략 38시간의 1.8배에서 3배에 가까운 시간이 필요할 것입니다. 강의시간에 직접 코드를 따라서 쳐보고, 공부하는 시간까지 더한다면 더 많은 시간이 필요합니다.
중간중간 언급해 주시는 좋은 프로그래밍 설계 팁
C강의를 듣는 중에 정말 좋은 부분이 있었는데 오류 처리에서 강의해주신 부분이었습니다.
저는 자주 함수를 작성할 때, 오류가 발생하면 위와 같이 함수에서 오류를 반환하지 않도록 임시방편을 해주곤 했습니다. 위처럼 swap함수에 null을 체크하는 if문을 넣는 게 정말 쉽고 익숙했기 때문입니다. 하지만 이는 정말 안 좋은 습관이라고 말씀해 주셨는데, 두꺼비집을 비유하여 설명해 주셨습니다.
이처럼, 두꺼비집이 집에 여러 개가 있다면 전기가 나갔을 때 어떤 곳의 퓨즈가 나갔는지 파악하기가 정말 어렵게 될 것입니다. 코드에서 이렇게 여러 개의 두꺼비집을 놓고 코드를 유지보수해나가는 것이 과연 맞는 것인지에 대한 생각을 할 수 있을 것입니다.
좋은 동료들
실제로 필자는 활발하게 활동하지 못하였지만, 많은 수강생 분들께서 많은 질문들을 서로 주고받으셨고, 이를 보는 것만으로도 공부에 많은 도움이 되었습니다. 특히 중간고사 기말고사가 되었을 때 많은 분들이 예상문제를 만들어 주셔서 시험을 보는데 조금 더 도움이 되었던 것 같습니다. COMP 2200에서 좋은 분들과 함께 정보도 공유하고 공부하면서 실력을 쌓아 나가시길 바랍니다.
마치며
개발자가 되는 건 정말 어렵다고 느껴집니다. 배울 건 많고, 끝이 없는 새로운 지식들이 쏟아지고, 저보다 잘하는 사람들을 보면 제 마음 소게 있는 열정이 꺾이곤 합니다. 저런 사람들과 어떻게 경쟁하고 이길까?라는 생각이 내 몸을 지배하는 경우가 많았으며, 우울한 날도 자주 있었습니다.
하지만, 저처럼 비전공자라고 해서 개발자가 안 되는 것은 아닐 겁니다. 태도를 가꾸고, 좋은 말들을 스스로 되뇌면서 알고리즘 문제를 하나 더 풀면서 앞으로 나아가야 할 것입니다. COMP2200은 정말 잘 만든 과정입니다. 저는 앞으로도 포큐에서 남은 강의들을 모두 들을 생각입니다. 하지만, 지금 부트캠프에서 진행 중인 프로젝트들에 쏟아야 하는 많은 시간이 필요하고, 취업을 위한 알고리즘 공부를 따로 해야 하기 때문에, 다음 풀코스는 한번 건너뛰고 갈 생각입니다.
저는 정말로, 프로그래머가 되고자 하는 많은 분들이 (특히 비전공자)가 이 수업을 듣기를 간절히 염원합니다. 정말 왜 배워야 하는지 제 글을 다 읽고도 알 수 없을지도 모르지만, 이 강의를 듣고 저의 시야가 한번더 넓어지는 경험을 했기 때문입니다.
포큐 아카데미에서 하나도 부족한 강의는 없지만, comp2200은 전공 필수 과목임을 증명해 주는 과목이기 때문입니다.
앱 vs 웹 어떤 개발자가 되어야 할까요?
처음 공부를 하시는 분들에게 도움이 되고자 좋은 영상 또한 가지고 왔습니다. 물론 찾아보신 분도 계시겠지만, 자신의 개발 분야를 어떤 것을 정해야 할지 선택의 기로에 계신 분들께 (앱 개발 웹 개발 혹은 백앤드 프런트 엔드 개발을 고민하시는 분들에게) 도움이 될만한 영상일 것입니다. 처음 발을 내딛는 것을 두려워하지 마셨으면 좋겠고, 어떤 분야를 해야 돈을 많이 받고, 유망한지에 대해서 너무 많은 고민을 하지 않으셨으면 좋겠습니다.
부트캠프 들어야 할까요?
POCU 아카데미를 열심히 수강하다 보면, 굳이 부트캠프까지 지원해서 공부해야 할까라고 생각할 수 있다고 생각합니다. 여기서 배우는 것이 너무나 많고, 다른 학원들은 별로 일 것 같은 느낌을 받았었었기 때문입니다. 게다가, 막연하게 코딩을 배워야겠다고 생각하고 포큐 아카데미에 들어왔던 저였기 때문에, 웹에서도 프런트 엔드를 배워야 할지, 백엔드를 배워야 할지 감을 잡지 못했었기에 더욱 고민의 시간을 가졌었습니다.
하지만, 어떤 서비스를 개발하는 개발자가 될것인지 정하는 것은 스스로 해야 하기 때문에, 프런트, 백엔드 등 여러 가지를 경험해보고, 부트캠프를 따로 듣는 것 또한 괜찮은 선택지라고 생각합니다. 포큐는 이름 그대로 대학교 과정과 더욱 유사하기 때문에 기초를 쌓는 작업을 하는 곳으로 분류하고, 실질적으로 어떤 개발자가 될 것인지 정하고 저처럼 비전공으로 개발을 접하고 취업을 준비하시는 분들이라면, 여러 부트캠프 중에 자신에게 맞는 곳을 찾아 이수를 하시기를 권장드립니다.
최근댓글