최근에, AC2에서 디버거 활용하여 디버깅을 하신 세션을 공유한 세션을 듣고 나의 생각이 있어 적어 봅니다저는 개발자이고 싶은 관리자(^.^)이기 때문에 사례의 경우 동료들의 같이 하는 고민으로 이해 해주시면 됩니다. Android Phone Framework System Service 주로 개발하는 저와 동료들의 경우도, 요사이 디버깅은 로그 베이스일 밖에 없다는 생각이 들었습니다. 디버깅을 10번한다면, 9 이상이지요. 이유는 번개 때에 지나가듯 이야기 해주시는 부분에 있다고 생각했습니다. 그래서, 빠르게 생각을 정리해 보았습니다.

 

제가 생각하기에 디버거가 예전 같이 많이 사용되지 않는 것은 리눅스와 같은 우선 멀티프로세스(Multi-process) 상황이기 때문이란 생각이 들었습니다. 주로, 디버거로 확인 가능한 것은 하나의 프로세스에서 관련된 심볼(High level language machine language 연결 시켜주는 정보) 읽어와서 보여주며 실행하여야 하기 때문이라고 생각됩니다. 우리가 담당하지 않는 다른 프로세스로 넘어가게 되면 확인이 어려워 집니다. 상황에서 타이밍 이슈가 있는 부분이라면, 로그와 같은 디버깅 코드를 추가하면서 문제가 사라지는 경우도 발생하게 됩니다. 것은 번개에서 언급되었던 것으로 기억합니다. 실재로 동료들과 이야기 나눠 봐도 디버거를 아예 모르는 분도 계시고 경력이 많은 분도 실재 기기에서는  Watchdog 같은 제약도 많아 로그 기반으로 접근한다고 하네요.

 

디버거로 가능한 것들은 어떤 것들일까요? 우선 디버거가 있으면 1. 원하는 코드 부분에서 멈추게 있습니다. 그것만 가능한 것이 아니고 2. 멈춘 후에, 상황에서의 변수들의 값을 확인할 있습니다. 그리고, 3. 함수를 불렸을 , 어떤 함수에서 호출한 것인지(call stack) 있습니다. 그리고 4. Call stack 따라 호출한 시점으로 변수의 (물론 호출하여 관련 변수들이 변경되었다면 최신 상태) 확인해 있습니다. 세션에서도 설명하셨지만, 5. 원하는 코드가 특정 변수의 상태일 멈추게하는 것과 같은 고급 스킬도 가능합니다. 세션에서도 시연을 시도하셨죠.

 

다시 돌아와 디버거를 언제 써야 할까요? 10번에 1번이 될까 말까 하는 기술을 알아 두는 것은 좋을까요? 세션에서 공유해주신 사례에 적절하다고 생각됩니다. 저도 이쪽 도메인을 몰라서 이상한 이야기일 있습니다. 제생각에 방법을 모르셨다면, 사용하시는 Framework 뒤지고 로그를 넣어가며 확인하셔야 했을 가능성이 있어 보입니다. , 우리가 사용하는 모듈의 복잡성이 높은 부분에서 필요한 부분을 적응적으로 찾아 봐야할 때가 디버거를 사용을 고민해야 하는 아닌가 조심스럽게 추측해 봅니다. 저의 요즘 화두인 탐색이 필요하겠다는 생각을 잠시 했습니다. 망치를 쓰는 법을 알았으니, 망치를 쓰는 것이 좋겠다 싶은 곳을 탐색도 하고 연습도 해야죠. 그리고, 여기 저기 망치질을 하고 다니는 아닌가 고민해야 하겠네요.

들어가며...

Rust언어를 들어 보기는 했지만, 그나마 최근에 Linux 6.1에서 채용하기 시작한다는 기사[1]를 보고 다시 보기 시작했다. 최근에는 새롭게 시작한 프로젝트와 관련한 Open Source가 Rust를 채용하고 있어서 더 관심을 가지게 되었다. 최근에 살펴본 TIOBE Index[2]에서 보면 20위에 진입했다. 올해 말, 내년까지는 조금 씩은 보게 될 것이라 생각되니 익숙해 져보자는 생각에 이 것 저 것 뒤져 보다가, 바이블이라고 하는 The book[3]도 찾아 보고 읽어 보았다. 총 20장까지 있는데 현재는 10장 정도까지 어렵게 읽은 상태이다. 부족하지만, 기억나는 것을 정리하고 우선 멈추려고 한다. 이 후에, 정말 필요할 때 더 읽어 보려고 한다.

 

변수, 스코프 그리고 소유 

Hello World 프로그램을 보고 몇 가지 예제를 보고 가장 먼저 눈에 띄는 것은 mutable, immutable 개념이다. Rust에서는 변수를 만들면 값의 변경이 불가능한 immutable이 된다. 상수(constant)와는 다르다. 다시 같은 이름으로 선언할 수 있기 때문이다. 변경하기 위해서는 let mut x = 1;과 같이 mutable로 만들어야 한다. 쉐도우잉이라는 개념도 있는데 이는 Python등과 유사한 것 같다. 이는 같은 이름의 변수를 다시 선언해서 사용하는 것이다. 즉, let x = 1; let x = x +1;과 같이 사용한다는 것이다.


그 다음에 새로웠던 것이 소유권(Ownership)이다. Rust가 메모리 관리에 우수하다고 해서 Java 처럼 가비지 컬렉터가 있는가 했다. 하지만, 다른 방법으로 이 부분을 강화 했는데 그 중 하나가 소유권이라는 것이다. 이 것이 C나 다른 언어에서 알고 있는 스코프(Scope)과 관련이 있다. 즉, 변수의 Visibility와 관련된 것으로 같은 레벨이나 그 하위에서 보이는 것이라 알고 있을 것이다. 그런데, Rust에서는 Heap에 관리하는 변수의 경우 얕은 복사(Shallow Copy)의 경우는 같은 스코프라고 하더라도 유효하지 않을 수 있다.

 

또한 함수의 인자로 전달된 변수의 인자의 소유권이 넘어가 다시 복귀하게 되더라도 유효하지 않을 수 있다. 좀 더 상세히 이야기 하면, 메소드가 인자를 단순히 읽기만 하여 함수 처리 후 복귀했을 때 유효하기도 하다 (&self). 혹은 함수 내부에서 변형시키기도 하다(&mut self). 여전히 복귀 후에 사용이 가능하다. 아니면 소유권을 호출하는 함수에 넘겨 함수가 소비하고 함수 호출 이후에는 유효하지 않게 하기도 (self)한다. 즉, 인자를 어떻게 사용할지 결정론적으로 정하게 되는 것이다. 

 

Android와 Rust

Google도 Rust를 지원하는 큰 기업 중에 하나이고, Android에도 적용한다고 한다[4]. 이 부분도 관심과 시간을 가지고 살펴 볼 부분이다. Android에 Sandboxing이 도입되고 있음에도 메모리 관련 관리에 어려움이 있는 것[5]으로 보인다. 2019년도 부터 채용되고 있는 것으로 보아 조금이라도 적용되는 부분이 증가하지 않을까 생각된다. 

 

정리하며...

여전히 성능적 측면의 우려와 학습 곡선이 가파르다는 비판도 있는 것으로 보이지만, 2022년도에 Linux 커널에 도입되는 것을 보았을 때에는 추이를 계속 지켜봐야할 부분으로 보인다. 한국에서도 채용이 되고 있고 사용자 모임[5]이 있다. Discord도 상당히 활발해 보인다.

 

참고 내용

[1] Linus Torvalds: Rust will go into Linux 6.1, https://www.zdnet.com/article/linus-torvalds-rust-will-go-into-linux-6-1/?taid=6329bce71c8e3300010028ae&utm_campaign=trueAnthem%3A%20Trending%20Content&utm_medium=trueAnthem&utm_source=twitter

[2] TIOBE Index for November 2022, https://www.tiobe.com/tiobe-index/

[3] 러스트 공식 안내서 "The Rust Programming Language", https://rinthel.github.io/rust-lang-book-ko/ch00-00-introduction.html

[4] Android Rust 소개, https://source.android.com/docs/setup/build/rust/building-rust-modules/overview?hl=ko 

[5] Rust in Android Platform, https://security.googleblog.com/2021/04/rust-in-android-platform.html

[6] 한국 러스트 사용자 그룹, https://rust-kr.org/

 

내가 사용하고 있는 컴퓨터 언어에는 C/C++, Java, Python이 예전에 사용하던 Perl등도 포함할 수 있겠지만 너무 사용하지 않고 있다. 최근에 관심이 가는 언어는 Go Lang이다. Google의 개발자인 로버트 그리즈머, 롭 파이크, 켄 톰슨 세사람이 개발한 언어이다. [1]에서 설명하는 특징은 다음과 같다.

 

  • 정적 타입, 강 타입 ...
  • 컴파일 언어 ...
  • 가비지 컬렉션 ...
  • 병행성(Concurrency) ...
  • 멀티코어 환경 지원 ...
  • 모듈화 및 패키지 시스템npm, pip, gem 이나 Maven과 같은 모듈 의존성에 따른 패키지 관리를 언어 차원에서 지원. ...
  • 빠른 컴파일 속도

이 언어를 개발한 이유가 C/C++이 사용하기 어려워서 개발하기 시작했다고 한다. 그래서, 서버, 브라우져, 데이터베이스등 큰 응용을 개발하는데 유용하다고 한다. 하지만, 시스템 레벨 프로그래밍에는 적절하지 않다고 한다. 

 

대략적인 문법이나, 특징은 책에서도 볼 수 있지만 인터넷에 자료가 많고 특히 [2]에서 보게 되었다. 

 

내가 이 언어를 보게 된 가장 큰 이유는 Android의 Build Systemdp Ninja[3]로 바뀌고 Blueprint(.bp)[4]로 변경되기 시작하고 이다. 이 bp파일들이 Go lang으로 쓰여 지고 있다.

 

참고 문헌

[1] GO 언어란? - 주요 특징,  https://goodjoon.tistory.com/241

[2] A Tour of Go, https://tour.golang.org/welcome/1

[3] Ninja, a small build system, https://ninja-build.org/

[4] Soong 빌드 시스템, https://source.android.com/setup/build

C언가 다시 떠오른다고 한다[1]. 물론 1위는 아니지만, 여전히 2위이고 성장세가 3위인 Python을 앞선다는설래발이다. 이유는 사물인터넷(IoT)과 최신 스마트 기기에 적합하기 때문이라고 이야기 한다.

 

알려진데로[3], C언어는 저수준 디바이스 드라이버, 커널 등에 대한 작업에 필요하다. 최근의 Android와 같은 곳에 사용되는 Linux는 이 C를 기반으로 한다. 오래되기도한 이 언어는 많은 시스템에서 사용이 가능하고, 포인터를 통한 메모리 접근이 간편하다. 하지만, 이러한 특징들이 단점으로 다가오고, 오래되었기 때문에 최신 언어들이 가지는 연구 성과들이 포함되지 않아 약점이 있다. 앞의 기사[1]에서 이야기 하는 부분은 위의 장점들을 살리는 특징 때문이라고 볼수도 있다.

 

하지만, 여전히 단점은 있다. 그렇기 때문에 MS는 다른 언어[3]를 개발하여 공개한다고 하고, Google은 Go라는 언어를 릴리즈한 것이 아닌가하는생각이 든다.

 

개인적인 생각으로는 초보자라면 한가지 언어를 결정하고 배우고 활용한다. 처음 추천하는 언어는 Java이다. Object Oriented Programming의 개념을 배울 수 있는 언어이며, 서버쪽이나 안드로이드쪽에서 활용이 가능하다. 이후에 다른 언어를 배우기도 좋다. 예전에 비전공자로 다른 업무를 하면서 프로그래밍을 배우겠다면 Python을 추천한 적도 있다.

 

그리고, 다른 환경에서 필요한 언어가 있다면 추가적으로 배우는 것이 좋겠다. 우선 현재 자신이 필요한 환경에 필요하면 배우면 된다. 이 때, C를 배우는 것도 좋다.

 

나는 C언어를 주로 썼다. 가장 오랫동안 썼고, 마치 내 Native Langauge와 같은 언어이다. 그래서, 알고리즘 연습을 하거나 간단한 프로그램을 구현하는 경우는 이를 기반으로 한다. 현재 업무가 안드로이드 개발이므로 Java도 많이 보게 된다. 그리고, 최근에는 업무 자동화 등으로 Python을 배워서 활용하고 있다. Android의 빌드 시스템이 Go언어 기반으로 바뀌어서 관심을 가지고 있다. 그리고는, 최근에는 Node.js로 팀원이 작업한 내용이 있어 Javascript도 최근에는 관심을 가지고 조금씩 살펴 보고있다. 

 

이렇 듯, 주력 언어가 하나 있고 필요에 따로 다른 언어를 익히고 있고 있다. 

 

참고 문헌

[1] C언어, 2019 올해의 프로그래밍 언어...상승세 파이썬 제쳐, 

http://m.zdnet.co.kr/news_view.asp?article_id=20200110021453&re=zdk#imadnews

[2] C 언어를 배워야 할 것 같아요?!, https://technical-leader.tistory.com/43 

[3] MS, C언어 대체할 신규 프로그래밍 언어 연구, http://www.zdnet.co.kr/view/?no=20200119172404

 

아들과 아들 친구에게 방학을 이용해서 Python을 가르쳤다. 벌써 한두해 전이라 컴퓨터는 게임이나 그림 그리는데 관심이 있는 아들은 거의 다 잊었던 것 같다. 지나가 듯, 자신이 배우면 C 언어를 배워야 할 것 같다는 이야기를 한다. 요인 즉은 컴퓨터를 잘아는 친구는 C를 알고 있고, 경시 대회 등의 알고리즘 대회에서는 C여야 한다는 것이 주장의 논지이다.

 

그러다가, 최근에 아래 기사를 보았다[1]. 주장에 틀린 바는 없으나, 내 생각과 다르니 정리해 보고 나의 입장을 한번 정리해 두는 것도 필요해 보인다.

 

주장의 요지는?

[1]이 그리 길지 않으나, 읽어 봐도 좋겠다. 요지는 새로운 언어들이 장점은 있지만, 여전히 C를 써야 하는 이유가 있다는 것이다.

 

우선 C는 C++대비해서 C는 미니멀리즘을 가지고 있다는 것이다. 결국 C++은 새로운 언어 특징을 가지도록 성장하고 변화하고 있어서 복잡하다는 것이다. 물론 나도 Simple is best라는 생각을 가지고 있는 사람이기는 하다. 하지만, C는 예전에 읽기 복잡할 정도로 짧게 간략하게 쓰는 것을 특징으로 가지기도 했다는 측면에서 이 미니멀리즘이 읽기 쉽고 이해하기 쉽게 코딩할 수 있게 한다는 것을 의미하지 않는다는 것을 명심하자. 하지만, C가 가지는 간략함은 C++이나 Java로 계승되고 있지 않나 생각한다.

 

Java나 C#등은 성능 혹은 메모리 관련 비판을 많이 받는다. 이러한 비판이 있다는 것은 시스템 이식성 혹은 메모리 관리의 간편성등의 장점이 있다는 뜻이기도 하다. 이렇다면, C가 가지는 반대편은 바로 메모리 관리 및 성능일 것이다.

 

Go는 Google에서 발표 하고 최근에 관심을 많이 받는 언어 중에 하나이다. 컴파일 언어로서 웹서비스나 Commandline Utility, Network Service등을 만드는데 채용되고 있다. 하지만, 글에서는 저수준 디바이스 드라이버, 커널 등에 대한 작업에는 C가 필요하다고 주장하고 있다. 사실이다. 하지만, 이런 작업을 하는 시장의 인력 요구는 얼마나 될까? 

그렇다면, 결론은???

나는 여전히 같은 결론이다. 컴퓨터 언어를 알고 그것을 어디에 어떻게 사용할 것인가를 따져 봐야 한다. 자신이 시스템이나 성능에 민감한 시스템을 만드는 사람이라면 C를 알아야 한다. 하지만, 그렇지 않고 자신의 분야가 따로 있고, 그 분야가 Software를 전문으로 하는 분야가 아니라고 해보자. 하지만, 원하는 작업을 위한 존재하는 솔루션이 제품으로 제공되지 않는다고 해보자. 그럼, 그것을 만들어야 할 것이다. 이 때, 이 무엇인가 만들어야 하는 초보자라면 Python을 고려하는 것이 좋을 것이다.

 

위에서 이야기 한 것 처럼 C를 배우기 마음 먹고 기본 사항을 익힌다고 하자. 그렇다면 거기서 멈출 것인가? 새로운 언어를 배우면서 자신을 확장해야 한다. 그렇지 않는다면, 위와 같은 비판을 한다고 하더라도 공허한 주장일 수 있지 않을까?

참고 문헌

[1] C 프로그래밍 언어가 여전히 최고인 이유 : 개발언어 일대일 비교, http://www.itworld.co.kr/news/124767?page=0,1

Python을 배우면서 2.x대와 3.x의 버전이 있다는 것을 들었고 더 이상 .2.x대의 업그레이드는 없다고하여 많은 고민 없이 3.x대를 쓰기 시작했다. 하지만, 실재로는 여러 이슈가 있다. Android는 여전히 2.x대를 쓰고 있다. 그래서 상황에 따라서는, 2.x 과 3.x를 병행해서 쓰게 한다거나 개발 환경을 Windows와 Linux로 나누어 PC를 2대로 운용한다던지 해야 하는 상황이 있다. 그럼에도 지금까지는 2.x는 그래도 강건너 불구경이었다.


도움 요청

네트워크 성능 최적화가 주요 업무인 후배는 network에서 실재로 전송하고 받는 packet을 캡춰해 놓은 pcacp 데이터를 많이 분석한다. 관련해서 이야기도 많이 하고 나에게 조언을 구하기도 한다. 한번은 python 이야기를 하길레 내 경험을 이야기 하고 python 강습을 듣도록 권유했다. 그래서, 나름 작업을 시작했던 것 같다. 관련된 조언을 몇번씩 구해서 같이 고민하고 간단히 답을 구하기도 하고 혹은 못 도와주기도 했다. 하지만, 이번에는 좀 더 심각해 보였다. 우리 집까지 찾아 오겠다는 것이었다.


내용은 python의 pcap 분석 툴인 captcp[1]의 포팅을 도와 달라는 것이었다. 이 툴은 dpkt[2] 모듈을 이용해서 TCP/IP 패킷을 분석하는 툴이었다. 예전에 몇번 질문한 것도 결국은 이 것과 관련 된 것이었다. 추가적인 문제점은 운용 환경이 Windows였다는 것에서 시작해서, 결국은 Python 3로 포팅해야 한다는 것이었다.


간단한 변환

새롭게 알게 된 것은 python 2 스크립트를 3로 변환하는 툴이 있었다. 기본적으로 python 3를 설치하면 [python 3]\Tools\scripts에 설치 되어 있는 툴이다. 이를 이용하여 기본 변환을 하면 된다.



아래와 간단히 명령어를 입력하면 변환이 일어난다.



미궁을 해매기

위와 같이 변환해도 Logical하게 문제가 발생하는 부분을 모두 처리해주지 못하기 때문에 바로 동작하지는 않는다. 결국에는 이 코드를 가지고 작동 시켜보면서 디버깅을 해야 하는 상황이었다. 이미 여러 이슈를 해결했지만, 최종 결과에는 이슈가 있었다. 테스트로 사용했던 동작은 statistic 옵션 이었다.



하지만, 지속적으로 error가 발생하면서 이슈를 파악하기 어려웠다 이 부분을 같이 살펴 보면서 Logical한 이슈가 무엇인지 분석을 하였다. 


결과 부터 이야기 하면, python 3로 오면서 Object의 연산자 overloading에 대한 구현 부분이 바뀐 것이다. Object의 비교 연산자가 Override 구현이 정확하게 동작하지 않고 단순 주소 비교로 되면서 처리가 완료되지 못하고 오류가 발생하는 건이었다.


근본 원인이 밝혀 지니 수정 방향도 수립이 되었다. __cmp__가 적절하지 못하는 것이 예상되었고, googling해 보니 이미 관련된 설명[3]이 있다. 이를 기반으로 __eq__로 대체 구현하였더니 동작함을 확인할 수 있었다.



돌아보며

결국은 Python2의 결과물을 Python 3로 변환하는 것은 쉬운일이 아니다. 또한, Open Source의 특성 상 지원이 있을 수도 있고 없을 수도 있기 때문이다. 하지만 또 하나의 장점은 내가 직접 변환할 수도 있다는 것이다.


최종 결과물은 내 github repsitory[4]에 저장되어 있다. 원본 Project가 2016년 부터 멈추어 있고, python 3과 연계가 어떻게 될지 불분명해 보인다. 그래서, 원본으로 pull request를 보내지는 않을 예정이다. 대신, 내 repository에 유지해 보는 것이 여러 방향으로 괜찮지 않을까 하여 유지해 보려 한다.


사족이지만 방금 찾은 것인데, python 2.7은 2020년에 퇴역(EOL)한다[5].


[1] captcp, https://github.com/hgn/captcp

[2] dpkt, https://github.com/kbandla/dpkt

[3] cmp method in python 3, https://stackoverflow.com/questions/8276983/why-cant-i-use-the-method-cmp-in-python-3-as-for-python-2

[4] captcp for python 3, https://github.com/blcktgr73/captcp

[5] Python 2.7 will retire in..., https://pythonclock.org/





나의 기억 속의 Java

Java는 C/C++만 알고 있던 나에게는 새로운 언어라고 보다는 개념을 도입하는 언어였다. 이는 Java의 언어 형태가 C/C++과 매우 흡사하기 때문이다. 코드 일부만 보면, 어떤 언어인지 판단하기가 쉽지 않을 수도 있다. 처음 배울 때가 Java가 Public하게 처음 소개 될 때였다. 그 당시에는 Sun Microsystem에서 릴리즈 하였다. 대학원 당시 랩에서 Sun Spark 워크스테이션을 처음 접해 본 터라 컴퓨터를 만드는 회사에서 도입한 컴퓨터 언어라는 것이 신기하고 Object-Oriented 개념으로 만든 언어라는 것이 신기했다.


그리고는 , Java 1.2가 Java 2로 소개 되고, J2SE, J2ME와 같이 Profile을 가지고 소개되었다. 단말을 하였었기 때문에, 옆 부서에서 J2ME의 여러 모듈들을 포팅하는 것을 기억하고 있다. 이 당시는 J2ME라도 상당히 무겁고 응용도 많지 않은 상태여서 Mobile에는 적용이 어렵다는 생각을 많이 하였고, 심지어는 모바일에는 Java는 절대로 보편화 되지 못할 것이라는 나름대로의 판단이 있었ㄴ다.


다시 안드로이드를 시작하면서, Java로 어플리케이션을 작성하는 부분에 대해서 놀랐다. 그리고, 이야기 듣던 JNI로 C++단이나 커널과 연결되어 Platform을 구성하는 것에 대해서 많은 놀라울 수 밖에 없었다. 그리고도, 시간이 흘러 보니 내가 알고 있던 Java와는 많은 차이가 있었고 처음 부터 다시 다져봐야 할 이유가 충분하였다.


또 다시 시작.

Android를 하기 때문에, Java를 다시 봐야 하는 것은 자연 스러웠다. Python도 강좌를 통해서 익힌 터라 강좌를 찾았다[1]. 2가지 과정으로 되어 있었지만 첫번째 강좌만 들었다. 이후는 응용인데, Android에는 큰 도움이 되어 보이지 않아서였다. 전반적으로 IDE로 Eclipse를 쓰고 있어서 툴을 배우는데는 유용했다. 다른 언어와 유사한 데이터 타입, 연산자, 입출력, 루프 그리고 함수까지는 평이했고 C++을 했기 때무에 객체 지향관련 Class와 다형성까지 크게 문제가 없었다. Interface와 C++과 다른 부분들은도 예전과 크게 다르지 않았다고 느껴서 어렵지않았다. 하지만, 이 것을 마무리 하고나서는 많이 부족한 생각이 들었다.





책으로 보는 Java

결국은 책을 찾게 되었고, C++ 책의 같은 저자가 만든 책이 있는 것을 알고 그 책을 찾아 보았다. 이책은 Java 8기반으로 작성되어 있어서 Android를 기반으로 하고 있는 나도 더 도움이 되겠다 싶어 보게 되었다. 다 보고 난 후 총평은 새로운 개념들을 설명하면서는 정리가 좀 덜 된 듯 한 느낌을 들기는 하였다. 요리를 해야 하는 재로는 다 들어갔는데 잘 어울어지지 않는다는 느낌이었다. 물론, 내가 개념들을 깊이 이해하지 못해서이기도 하지만, 설명을 잘 하는 책이라면 충분히 그 느낌을 덜어주지는 않았을까 한다.


나의 관점에서 새로운 개념들은 Chapter 21부터 설명되는 Generic그리고 이를 활용한 Collection Framework였다. 이 후, Lambda와 Method 참조, 그리고 스트림까지이다. 특히, Android에서도 적용되는 Java 8의 신규 기능이라 할 수 있는 것은 Lambda와 Stream이다. 새로운 Android 코드들에는 이를 활용한 코드가 적용[3]되고 있으니, 반복해서 확인하고 몸에 익혀야 할 내용들이다.


Android와 Java

Android는 Java와 때려고 해도 때기 어렵다. Google이 Android 작성하는 언어으로 Kotlin을 발표하였다. 또한, Java의 현재 주인인 Oracle과 Android의 주인인 Google의 전쟁의 승자가 Oracle로 결정이 되어 더욱 암울해 보인다[4]. 하지만, 나는 여전히 처음 시작하는 언어로서 Java를 추천한다. 아직도 Java가 Android에서 계속 사용되어야만할 이유가 충분해 보이기 때문이다.

우선 Android 개발자 입장에서는 Java를 버릴 이유가 없다. 왜냐하면, 이미 Java를 기반으로 한 Android Phone들이 많이 팔렸고, 여기에 App들을 Java로 만들어서 배포한다. 극단적인 가정으로, Google이 Java를 포기하고 새롭게 Android2를 만든다고 하더라도 새로운 폰들이 바뀌는데는 상당한 시간이 걸린다. 아직까지 5년전 발표된 Kitkat까지 해야 94%휴대폰 커버(2018년도 1월 18일 기준)되니까. 비슷한 논리로 내년에 완전 Java를 사용하지 않는 플랫폼 만들어서 배포해서 유사한 시간이 걸린다고 하더라도 5년은 걸릴 것이다. 추가 참고 자료로 [5]를 보면, 시간 상으로 어떤 Version의 안드로이드 플랫폼들이 변화 하는지 볼 수 있다. 또한, 사람들의 스마트폰 교체 주기도 점점 길어 지고 있다. 이렇게 보면, 지금 Android가 가지고 있는 Market과 사용자들이 그렇게 쉽게 Java에서 다른 언어로 넘어갈까? 이 부분에 판단은 글을 읽으시는 분께 맏긴다.

공부라는 측면에서의 의견도 나는 Java를 계속 권한다. 위에서도 설명했듯이 Object Oriented Programming Paradigm을 근간으로 하고 있는 언어로서 이를 배우기 위한 최적의 언어이다. 그렇기 때문에 Java가 가지고 있는 여러 툴이나 도구이 아주 많다. 뿐만 아니라, 언어를 배우시고 배워야 할 Architecture 관련된 분야들이 Java를 기반으로 시작된 것들이 상당히 많다. Refactoring, Design Pattern 그리고 Unit Testing 등이 그 예이다. 그렇기 때문에, 이를 가장 잘 설명하는 책 및 Practice들이 Java를 기준으로 한 것이 차고 넘친다. 그리고, 사족으로 컴퓨터 언어 한두가지 정도는 더 하야 한다. 그렇기 때문에, Java로 시작해서 Java로 끝난다고 생각해서는 안되고, 여기서 필요에 따라 여기서 발전된 언어를 적어도 한 두개는 더 한다고 생각해야 한다.

그럼, Java는 없어질 언어인가요?

개인적으로는 C를 주로 사용했고, 거기서 C++, Java, Python 등의 다른 언어로 가지치기를 하고 있다. Java는 현재 정말 Popular하게 전개 되어 있는 프로그래밍 패러다임인 Object-Orient를 기반으로 만들어진 언어이다. 그리고, Android의 기반이 되고 있는 언어이다. 위에서도 이야기 했지만, 이를 바꾼다고 해도 시간이 소요된다. 그런 의미에서 Java는 위의 여러 사실을 바탕으로 Programmer의 First Language로 적극 추천할만한 언어이다. 물론 이것은 현재의 내 판단이고, 이는 또 바뀔 수 있다. 하지만, 적어도 5년 길면 10년까까지도 이 의견은 유효하리라고 판단한다.


[1] Java 배우기 Part 1(기본), http://www.credu.com/main/credu/user/course/zu_course_detail_R.jsp?p_subj=C69401

[2] 윤성우, "윤성우의 열헐 Java 프로그래밍", 2017년 7월

[3] Android Java 8 Support, https://developer.android.com/studio/write/java8-support

[4] 8년 전장 오크랄 웃고, 구글 울었다. http://www.zdnet.co.kr/news/news_view.asp?artice_id=20180328141031

[5] Android version history, https://en.wikipedia.org/wiki/Android_version_history



Python을 처음 들었을 때에는 Linux Shell Script 혹은 Windows에서 Bat 파일과 함께 Perl을 사용해서 업무 자동화를 주로 할 때였다. 이 때의 자동화는 Software 빌드를 자동으로 하는 업무가 주여서 주어진 내용으로 충분했고, Perl의 경우도 필요한 내용만 찾아서 사용하는 정도의 수준이었다. Python도 이와 유사항 언어였고 필요성을 느끼지 모해서 배우지 않았던 것이 사실이다. 


최근에 컴퓨터 언어의 Ranking들을 살펴 보다 보니, 순위가 엄청나게 높아져 있었다. 용처도 많고, 옆의 동료가 온라인 과정을 통해서 배우고 있고 이를 통해서 자신의 업무 자동화에 활용하고 있는 것을 보고 자극이 되어서 사내 온라인 강좌를 통해서 기본적인 내용을 듣게 되었다. 목표도 어렴풋이 사내 웹싸이트에 있는 정보를 모아서 주기적으로 보고하는 것을 주기적으로 해야 하는데, Web Page의 테이블에 있는 내용들을 지속적으로 손으로 정리해서 보고 하게 되면 과제 진행하는 2~3개월 동안 보고 하게 되면 업무 효율이 나지 않았다. 그래서, 반드시 자동화를 해야하기는 했는데 어떻게 해야할지 막막했다.



온라인 강좌로 시작하다.

내가 들었던 강좌는 멀티캠퍼스의 2개의 강좌[1-2] 였다. 첫번째 수강한 강좌는 활용 보다는 전체 내용을 처음 부터 하나씩 설명하는 구조였기 때문에 지루하였다. 하지만, 책을 보고 공부하는 것도 습관이 붙어 있지 않은 상태여서 매일 조금씩 강좌를 보는 것은 꾸준히 진도를 나가는 도움이 되었다. 컴퓨터 언어를 전혀 하지 않았다면 첫번째 구조와 같은 강좌가 도움이 될 것 같고, 이미 다른 언어를 알고 있다면 [2] 강좌가 응용 예가 더 많이 소개 되기 때문에 도움이 될 것이다. 두 개의 강좌에서 살펴 보면, 크게는 다음 항목들을 다루고 있다.


0. 설치, 환경 설정 및 IDE

어느 언어든 기본적인 환경 설정이 필요하다. Python도 다운로드 받아서 설치를 해야 한다. 또한, 개발을 편리하게 해주는 Integrated Development Environment (IDE)가 있다. 모든 강좌에서는 기본적인 Python 설치를 다룬다. [2] 강좌에서는 Python 개발자들이 상당히 많이 사용하는 PyCharm[3] 을 설정하는 법을 설명한다.


1. Basic Language

어떤 언어를 배워도 다루게 되는 기본 자료형(Default Data Type, 연산자(Operator), 변수(Variable), 표준 입출력, 제어문, 함수가 우선 이 부분에 해당되었다. [1]에서는 2~6장이 여기에 해당되고, [2]에서는 2~8장까지가 여기에 해당된다고 볼 수 있다.


3. OOP, Module 과 예외 처리

Python은 OOP를 지원한다. 하지만, 간략화 된 클래스, 상속과 다형성을 포함한다. [1]에서는 7장, 8장이 여기에 속하고 [2[에서는 16장에서 설명한다. 또한, 기능들을 분리하여 관리하기 위해 모듈 기능을 제공한다. 추가적으로 예외 처리 관련 항목도 설명한다.


4. 확장 기능

기본적인 개념을 바탕으로 파일 처리, XML, 네트워크, 데이터 베이스 뿐 아니라 그래픽 관련 모듈 설명도 한다. 특히, Tkinter는 Python이 설치되면 기본적으로 제공되는 기능으로 UI를 쉽게 구성할 수 있다. Python에서는 Regular Expression, 정규식도 많이 사용된다. 2개의 강의 모두 Regular Expression을 다루지만, [2[에서는 2개의 챕터를 할애해서 설명한다.


5. 응용

[2]의 강좌가 좀 더 응용에 집중하고 있다. 엑셀, JSON을 포함한 Open API 활용, Web Scrapping, 날짜 및 자동화 기능, 메일 발송/수신까지 광범위하게 다룬다. 위에서 설명한 특정 웹 페이지에 접속해서 정보를 받아 정리하는 기능이 Web Scrapping으로 볼 수 있는데, 내가 필요로 했던 자동화 기능도 바로 이를 활용하면 가능하였다.


아들에게 가르치기: Python for Kids

일주일에 한번씩 아이들이게 가르치는 기회가 생겼다. 방학에 중학교 1학년인 아들과 아들 친구과 관심을 보였고, 어떻개 진행할까 고민하다가 책[4]을 발견하였다. 원래는 영문판을 먼저 발견했다가 번역을 하려 하다가 번역본이 있다는 것을 알게 되어 이 책을 선정하였다. 강의 계획은 아래와 같았다.


12/09: Python 소개, 기본 설정. Ch1 책소개 Ch2

12/16: 복습, Ch3, 4: Data types & Turtle graphics

12/23: 복습, Ch5, 6 (if/loop)

12/30: 복습, Ch7, 8 (function, class)

01/06: 복습, Ch9, 10 (Built-ins and useful modules)

01/13: 복습, Ch11, 12 (Graphics), Project 논의

01/20: 복습, Ch13, 14 (Bounse Ball), Project 계획

01/27: 복습, Ch15, 16 (Game2)

02/03: 복습, Ch17, 18 (Game2)





한번에 2시간 혹은 2시간 30분 정도 소요 되었다. 중간에 쉬는 시간을 가지면서 했다. 복습을 시키면서 새로운 단원을 나갔고 실습 위주로 진행하였다. 이해하지 못하는 것은 이론 설명을 충분히 하였지만, 책에 포함된 코드를 이용하여 실습에 더 많은 시간을 할해했다. 그래서 인지, 두 아이는 큰 무리 없이 따라 왔었다. 이책이 좋았던 부분은 설명 자체도 실습이 가능한 구조여서 입력하여 결과를 볼 수 있었고, 마지막에 Game을 다루기 때문에 흥미를 이끌어 내기 쉬웠다.


추가적인 부분으로, PyCharm을 처음 부터 설치하게 해서 인터프리터 기능 보다는 코딩 개념으로 설명하였다. 강의, 실습도 2명이 하기 때문에 더 진도가 잘 나갔던 것 같다. 원래 계획으로는 위의 강습 후에 Project 같은 것을 할 계획이었지만, 시간 부족으로 진행하지는 못했다. 나중에 또 기회가 있다면, 프로젝트를 하면서 여러 명이 함께 기획하고 구현하고 발표하는 시간도 3주 정도 가져보면 더 발전이 있을 것으로 예상한다. 그렇다면, 총 12주 정도의 시간이 필요했다.


업무 자동화에 활용: Web Scrapping

Python은 C++/Java와는 다르게 인터프리터를 사용하는 언어이다. 내가 가장 먼저 사용해본 인터프리터 언어는 Basic이었다. 그 당시는 마치 지금의 Windows 명령어 프람프트(Cmd.exe) 와 유사한 인터페이스였다. 다른 것은 컴퓨터를 켜면 항상 그 화면이 떴고, 수행할 내용을 입력하고 얻는 방식, 즉 인터프리터 방식이 기본이었다. 옛날 방식의 기술이 항상 나쁜 것은 아니고 상황에 따른 선택이라는 생각이 든다. 즉, 이렇게 하게 되면 컴퓨터의 동작 방법을 몇가지는 알지 않더라도 컴퓨터 언어에 접근하게 해주는 것이 장점이 되고, 그래서 Python을 비전공자에게 권하게 된다고 생각된다. 고급 사용자의 경우는, 실행할 내용을 text파일로 저장해 놓는 Script도 사용할 수 있으니 이 또한 유연한 접근 방법이다. Android에서는 2.x를 사용하지만, 나는 우선 자동화와 추후를 위해서 3.x대를 선택하여 사용하였다.


위에서 설명하였듯이 Web 페이지에 접속해서 필요한 내용을 추출해 해는 것이라고 간단히 말할 수 있겠다. 내가 필요했던 업무도 사내 홈페이지들에 흩어 져 있는 우리 부서의 정보를 원하는 형태로 취합 정리하는 것이었다. 인트라넷 홈페이지는 로그인 처리가 필요했고 개별 링크에 관련 정보들이 흩어져 있었고, Java Script를 이용한 Dynamic Web이었다. 강좌에서 소개한 Library는 Beautiful Soup이였다. 이 라이브러리는 디테일한 컨트롤이 어려웠고, 사내 홈페이지에 접속하는 것이 매우 어려웠다. 결국 Googling을 많이 하다 보니, Selenium이라는 모듈을 알게 되었고, [5]에 포함된 내용과 Googling을 통해서 원하는 기능을 구현할 수 있었다.




돌아 보며.

새셈 느낀 것이지만 필요한 목적이 있으면 배움이 더 유용하다. 그래서, 업무와 연계 시키거나 혹은 다른 목적을 찾으면 좋다. 특히, 가르치는 것은 더 많은 배움을 동반한다. 현재는 이러한 목적을 넘어선 다른 것 또한 찾고 있다. 그것이 더 좋은 공부라는 것을 알기 때문이다.


[1] 파이썬으로 배우는 실전 프로그래밍, http://www.credu.com/main/credu/user/course/zu_course_detail_R.jsp?p_subj=C90113

[2] 파이썬을 이용한 자동화 스크립트, http://www.credu.com/main/credu/user/course/zu_course_detail_R.jsp?p_subj=CB6392

[3] JetBrains PyCharm, https://www.jetbrains.com/pycharm/

[4] 제이슨 R. 브리그스 et. al, "누구나 쉽게 배우는 파이썬 프로그래밍 (Python for Kids)", BJPUBLIC. 2013

[5] Ryan Mitchel, "Web Scrapping with Python", O'Reilly 2015


우선 C++에 대해서 보수 학습을 고민하게 된 것은 처음에도 이야기 했던데로 내가 C를 학습했었고 Object Oriented Paradigm/Programming(OOP)을 접하게 되면서 C++이 C를 기반으로 OOP를 접목한 언어로 소개 받았기 때문이다. 1998년 경으로 기억한다. 이 당시에는 어렴풋한 기억이지만 이 Template 개념이 없었다. 이후 Template이 적용된 C++ 코드를 보았었고, 이 후에 C++에서도 여러 버전이 만들어 지고 있다는 사실을 알게 되었다.


마지막으로 C++에 대한 보수 교육을 하기로 마음 먹게 된 이유는 내 업무에 이 부분이 아직도 많이 활용되기 때문이다. 내 업무는 Android 어플리케이션에서 동영상과 음악 파일을 재생하게 하는 Multimedia Framework이다. Android의 경우, Application이 Java로 이루어 있다. 하지만, Linux Kernel위에 여러 Service와 Framework를 이루는 기본적인 언어는 C++이다. 이 부분이 예전 부터 사용되어 오고 있는 Open Source 레거시 코드(Legacy Code)들이 있기 때문이기도 하다. 또 다른 이유는 하드웨어 (Hardware, HW)와 연동하는 코드들의 경우, 성능을 이유로 C/C++로 작성되는 경우가 많다.


이와 같은 이유로 C++에 대해서 공부하기로 했고, 우선 학습 방법은 기존 부터 가지고 있던 윤성우 저자의 "열혈 C++ 프로그래밍 개정판"이었다. 이 책은 내가 보기에는 C++03 기준으로 설명하고 있는 것으로 보여진다. 책의 서문이나 내용 중에서 이에 대해서 명확하게 하고 있지는 않다. 발행일이 2011년도인 것으로 보아도 C++11의 내용을 담기에는 어려움이 있어 보인다. 그렇더라도, 아직 내가 보는 코드들에서 C++11까지 이해해야 할 정도가 아니기 때문에 이책으로도 충분히 필요한 내용은 포함된다고 생각했다. 이 부분도 일독을 마친 후에 나중에 알고 되고 추가 공부할 내용을 알게 된 점에 대해서도 분명히 한다.



학습 내용

책을 일독하고, 2번 정도 Sample Code를 살펴 보면서 알게 된 것은 사람들이 많이 이야기 하고 있는 Standard Template Library(STL)과 Lambda등에 대한 내용은 책에서 다루고 있지 않다는 부분이었다. 그래서, 인터넷등을 통해 알게 된 다른 자료까지 학습한 내용을 포함하여 정리해 보면 다음과 같다.


1. Procedural Programming Paradigm 

이 부분은 컴퓨터 언어의 개요서를 보게 되면 일반적으로 가장 먼저 다루게 되는 부분이다. 하지만, 이 책[1]에서는 C를 안다는 가정으로 시작한다. 나는 오랫 동안 사용한 언어가 C여서 크게 문제 될 부분은 없었다. 혹시라도 C를 잘 모르는 거나, 컴퓨터 언어를 처음 배우는 사람은 다른 C++책을 보는 것이 좋겠다. 


2. Objected Oriented Paradigm/Programming (OOP)

이 책에서는 Encapsulation에서 시작하여 OOP를 설명하면서, 상속(Inheritance), 다형성(Polymorphism)까지 설명하고 있다. C++이 다른 객체 지향 언어와 다르게 혼동을 주고 있는 virtual keyword에 대해서도 Chapter를 하나 할해하여 설명하고 있다. Chapter 11까지의 내용이 여기에 포함된다.


3. Template

구지 분리할 필요는 없지만, OOP와 Template를 분리하는 것은 내가 이 부분에 대한 이해가 낮기 때문이다. 책에서는 2개의 Chapter를 할당하여 개념 설명, Class Template, Class Template Specialization, Template Parameter (템플릿 인자)등을 설명하고 있다. Chapter 13, 14 이다.


4. Standard Template Library (STL)

책에서는 이 부분을 설명하지 않고 있다. 하지만, 알고리즘 등을 설명하는 등의 여러 웹싸이트 등에서 설명할 때, STL을 가정하고 코딩을 하는 경우가 종종 있기 때문에 이 부분에 대해서는 알아 둘 필요가 있다. 좋은 자료로 처음 찾은 것은 Topcoder의 Tutorial이었다. 현재 내가 봤던 Tutorial은 찾기가 어려워 현재 검색되는 Tutorial[2-3] 최신 관련 링크를 추가해 둔다.


5. Lambda와 C++11 관련 내용

특히 여기서는 Lambda에 관한 내용을 [4-6]으로 학습했다. 전반적인 C++11 내용은 [7]에도 잘 요약되어 있다. 이 부분은 특별히 필요한지 공감이 되지는 않아서 우선 다 살펴 보지는 않았다.


기존에 이해한 내용에 대해서 상기하는 부분과 이해가 부족한 부분에 대한 학습 그리고 STL, Lambda에 대한 학습은 쭉 살펴 본 상태이다. 하지만, 계속 쓰지 않으면 잊게 되어 코드를 시간 날 때 타이핑해보거나 다시 살펴 볼 생각이다. 여라가지 항목에 관련해서 하나씩 정리도 가능하다. C의 레거시 항목은 포인터도 다른 언어에서는 c++에서 Reference라는 개념이 도입되면서, 대부분의 언어에서는 사용하지 않지만, Object Pointer만이 아닌 Function의 Pointer등도 Lambda등과 같이 고민해 보면 흥미로울 듯 하다. 다른 항목 중, 추가로 작성 해보고 싶은 내용은 나에게는 신규 항목인 Template 부터 Lambda까지는 따로 글을 써서 정리해 보는 것도 재미 있을 것 같다. 특히, C++, Java, Python에서 공통되는 부분도 있어 글을 써보면 매우 흥미로울 것 같다.


참고자료

[1] 윤성우, "열혈 C++ 프로그래밍", Orange Media 2011

[2] "Power up C++ with the Standard Template Library: Part 1", https://www.topcoder.com/community/data-science/data-science-tutorials/power-up-c-with-the-standard-template-library-part-1/

[3] "Power up C++ with the Standard Template Library: Part 2", https://www.topcoder.com/community/data-science/data-science-tutorials/power-up-c-with-the-standard-template-library-part-2/

[4] "씹어먹는 C++ 토막글 ② - 람다(lambda) 함수", http://itguru.tistory.com/196

[5] http://ciere.com/cppnow12/lambda.pdf (링크 깨진 듯 합니다.)

[6] http://pages.cs.wisc.edu/~gerald/cs368/resources/Lambda.pdf

[7] "C++ 11 특징 및 사용 예제 정리", https://duragon.gitbooks.io/c-11/content/

사람들이 많이 쓰는 컴퓨터 언어

소프트웨어 개발자로서, 가장 먼저 배우게 되는 것이 컴퓨터 언어 (Computer Language)이다. 여기서 고민 되는 사항은 두가지 이다. "만일 내가 현재 처음 컴퓨터를 접하게 되었다면 어떤 언어를 배울 것인가?"와 "지금까지 컴퓨터 언어를 배운 것을 돌아 본다면 어떤 언어를 어떻게 공부할 것인가?" 일 것이다. 첫 번째는 내가 생각하는 컴퓨터 언어에 대한 추천이고, 두 번재는 내가 알고 있는 것을 기반으로 어떻게 확장할 것인가 이다.


우선 첫번째 질문에 대해서 고민을 해보자. 2018년 6월 6일 기준으로 구글 검색 결과 제일 처음에 나오는 3가지가 TIOB Index[1], IEEE Top Programming Language[2], 그리고 The RedMonk Programming Language Rankings [3] 이다. TIOBE Index에서는 2위가 C, 3위가 C++로 사실 둘을 합치면 1등인 Java 보다도 높다. IEEE Spectrum은 미국의 전자 공학회가 발행하는 주요 잡지에서 설문 조사한 결과로 공학자들이 많이 쓰는 언어라고 볼 수 있다.  여기에는 C가 2위 C++은 4위에 랭크하고 있다 하지만, C++이 97.1%로 대부분 이 사용하고 있다 이 링크로 알 수 있는 재미있는 사실은 많은 사람들이 한가지 언어만 하고 있지 않고 여러 컴퓨터 언어를 사용하고 97% 이상이 Python, C, Java 그리고 C++까지 사용한다고 하고 있다.



TIOBE Rank 

Spectrum Rank



이제 부터는 개인적인 의견이다. 위의 내용의 결론은 여러 언어를 배우는 것이 좋겠다는 것이다. 하지만 한꺼번에 4개를 다 시작하는 것은 좋지 않다. 우선은 목표를 고민해 보는 것이 좋겠다. 컴퓨터 관련 전공자가 될 것인지, 혹은 내 분야는 다르지만, 컴퓨터를 더 잘활용하기 위한 목적인지가 결정 포인트가 될 것이다. 



나의 추천: 비전공자 vs 전공자

만일 비전공자라면 Python으로 시작하는 것이 좋겠다. 가장 큰 이유는 Python은 컴퓨터 언어의 기본 구조는 다기지고 있으면서, 배우기가 상대적으로 쉬운 언어이다. 그럼에도 불구하고 Python은 정말 관련된 라이브러리도 많아 사무 자동화 등 여러 곳에 활용될 수 있다. 여기서 그치지 않고, 요즘 화두가 되고는 Machine Learning관련해서도 사용되고 있기도 해서 여러 활용처를 고민해 볼 수 있다. 아들에게 Python을 방학 동안 가르쳐 본 것도 이러한 판단 때문이다. 





전공자라면 Java를 추천한다. 오래된 언어이지만, 많은 대학에서 Java를 전산전공자의 처음 언어로 가르치고 있는 것으로 알고 있다. 요즘은 Smart Phone이 화두가 되고 있다. PC에서 동작하는 SW 제품을 만들기도 하지만, Web이나 Mobile에서의 SW를 만든다고 하면 Java를 기반으로 좀 더 학습하면 쉽게 접근할 수 있다.  


또한, 처음 컴퓨터 언어를 익히고 여러 프로젝트를 하면서 접하게 되는 설계 관련(Architecturing) 관련한 분야로 Design Pattern, Refactoring, Unit Testing이 Java 기반으로 설명하고 있기 때문에 내가 강하게 추천하는 이유이기도 하다.





나는 어디로?

두 번째, 지금까지 경력을 쌓았던 나의 경우 어떻게 보수 학습을 할 것인지에 관한 질문이다. 아주 개인적인 질문이다. 하지만, 기본적으로는 내가 어떤 언어들을 주로 사용했고, 현재 시점에서는 어떻게 학습해 나갈 것인지에 관한 것기 때문이다. 방향은 어찌 보면 위와 같다. 즉, Python, Java, C/C++여러 언어를 배울 것이다. 하지만, 어떤 순서로 어떤 것을 살펴 볼 것인지가 더 중요하겠다. 왜냐하면, 처음 시작하는 사람들과 같이 처음 부터 다시 다 봐야할 필요가 있지 않을 수도 있기 때문이다.


내가 가장 먼저 배운 언어는 초등학교 때, 컴퓨터를 처음 접하면서알게된 Basic언어였다. 그리고는, 대학에 입학하고 나서 학교에서는 내가 전공한 전자공학에서는 관련 언어라는 이유로 FORTRAN이 과정에 포함되어 있었다. 또한, 전산과에서는 PASCAL을 가르쳤었다. 하지만, 나는 이때에 이러한 언어들이 유행이 지났다고 생각해서, 따로 독학한 언어는 C 언어였다. 이 때에 보았던 책들을 기억해 보면 정말 함수를 만들고 문제를 해결하는 형식의 Procedural Programming Paradigm을 활용한 접근 방식이었다. 대표적으로 Main Menu가 있고 키를 눌러서 해당 함수로 호출 되게 해서 요구 사항을 만족시키는 방식이다.


회사에 입사하기 시작하면서, C++과 Java가 소개되기 시작했다. 매우 초기 버전이기 때문에 Object Oriented Paradigm이 소개 되고 이를 위한 개념들이 녹아 있는 버전의 언어들었다. 하지만, 아직, 휴대폰에는 이를 활용한 개발들이 더디게 적용 되고 있었다. 그래서, 컴퓨터 언어와 관계해서는 더 배우게 된 것이 Perl이나 Unix Shell Script, Makefile 등이었다. 실재로 프로그램하는 방식도 Procedural에서 Event-Driven으로 바뀌었다. 이는 Event Handler에서 Event의 종료를 구분하여 처리하는 구현 접근 방법이다.


Android를 시작하면서, 실재로는 Java와 C++을 더 봐야하는 입장이었지만 실재로 더 이론들을 탄탄히 하면서 진행하지 못했다. 그러면서, 결국에는 C++을 좀 더 봐야겠구나 하고 정리하게 되었고, 동료가 Python 온라인 강의를 듣는 것을 보고 배우기 시작해서 아들과 아들 친구에게 가르치는 일까지 하게 되면서 Python을 알게 되었다. 이 후, Java에서도 내가 교육을 통해 마지막으로 배웠던 것 이후에 바뀐 부분이 많다는 생각에 다시 학습하게 되었다.





사족이기는 하나, 위와 같이 공부하게 된 것도 고민을 하면서 바뀌게 된 것이다. 사실 지금돌아 보면, 역시 Java를 먼저 보강하고 C++ 그리고 Python을 다시 하는 것이 좋지 않겠나 생각하지만 이렇게 진행한 것도 나쁜 선택이라고 생각되지는 않는다.


[1] TIOBE Programming Community Index, https://www.tiobe.com/tiobe-index/

[2] The 2017 Top Programming Languages - IEEE Spectrum, https://spectrum.ieee.org/computing/software/the-2017-top-programming-languages

[3] The RedMonk Programming Language Rankings, http://redmonk.com/sogrady/2018/03/07/language-rankings-1-18/



+ Recent posts