본문 바로가기

Dev.World/Be 개발자

개발 입문자를 위한 짤막한 안내서 - Hello Coding World




이 글은 Coding의 C자도 모르는 분들을 위한 안내서입니다. 독자적으로 작성한게 아닌, 여러 선배 개발자분들의 글들을 읽어가면서 현재 상황에 맞게 ‘새로고침’도 하고, 제 개인적인 의견도 붙이면서 작성했습니다. 최대한 비 개발적인 언어를 사용하기 위해 노력했으며, 소프트웨어 개발에 대해 조금이라도 알아가게 되는 글이 되었으면 합니다.
0. Intro
1. 어떤 분야가 존재하는가
2. 무엇을 공부해야 하는가
3. 어떻게 공부해야 하는가


#0. Intro
막연하게 '난 소프트웨어 개발을 해야지' 하고 시작하는 사람은 없을 것이라고 생각한다. 스마트폰 보급이 대중화되면서 자주 사용하는 모바일 앱을 보고, 앱을 만들고 싶어져서 개발을 하고 싶을 수도 있고, 나만의 웹 사이트를 만들고 싶거나 커뮤니티를 기반으로 하는 웹 사이트를 만들고 싶어서 개발을 하고 싶을 수도 있다. 이것도 저것도 아니고 그냥 소프트웨어 개발자란 직업이 유망하다고 들어서 개발을 배우고 싶을 수도 있다. 또한 이미 특정 직업이 있는데, 개발자와의 협업하는 문제로 의사소통의 문제로 개발을 공부하고자 하는 사람들도 생겨나고 있다. 이러한 이유로 개발공부를 시작하는 디자이너, 기획자도 점점 늘어나고 있는 추세인 것 같다. 이처럼 개발 공부에 대한 관심은 점점 높아지고 있다. 막연하기만한 개발이라는 분야를 조금 나누어서 살펴보자.



#1. 어떤 분야가 존재하는가

우리가 사용하는 소프트웨어는 일반적으로 두 부분으로 나눌 수 있다. 우리가 일상적으로 사용하고 있는 '일반 사용자용 프로그램'(또는 애플리케이션, 응용 프로그램)와 사용자가 소프트웨어라고 생각해보지도 못할 시스템 소프트웨어. 서버 개발자, 클라이언트 개발자라고 분류되는 직군을 일반 사용자용 소프트웨어 개발자라고 부르고, 시스템 부분을 개발하는 직군을 시스템 소프트웨어 엔지니어라고 부른다. 아마 비전공자로서 개발을 생각하면 일반적으로 '일반 사용자용 애플리케이션'을 개발하는 쪽을 생각할 것이다. 만약 그렇다면 바로 다음 부분은 살짝 넘어가도 괜찮을 것이다. 그럼 소프트웨어의 근간을 이루고 있는 시스템 소프트웨어 개발 분야부터 하나씩 살펴보자.

시스템 소프트웨어 분야
운영체제
Microsoft 사에서 배포하고 있는 Windows. Apple에서 배포하고 있는 mac OS, 그리고 오픈소스로 운영되고 있는 여러 Linux 등이 여기에 해당한다. 개발자가 아닌 일반 사용자 입장에서는 windows가 컴퓨터 아니야?라고 생각할 수도 있겠다. 하지만 소프트웨어의 세계에는 여러 운영체제가 존재하고, 이러한 운영체제를 개발하는 개발자들도 존재한다. 국내 회사에서 배포되는 운영체제로는 Tmax라는 운영체제가 있는데 큰 호응은 얻지 못하고 있다. 운영체제 개발에 관심이 있다면 해외 취업을 생각해봐야 할 것이다. 운영체제를 만들고 배포하는 회사가 적기 때문에 자연스럽게 취업의 문도 좁아진다. 하지만, 컴퓨터 자체를 작동하게 만드는 일은 매력적인 일이라고 생각한다.

네트워크 엔지니어
이 부분에 대해서는 필자도 정확히 모른다. 보안이라는 분야와 밀접하게 연결되어 있고, 서로 통신을 주고받는 분야이기 때문에 해커의 침입에 가장 취약한 부분이다. 일반적으로 패킷이라는 단위로 서로 통신을 주고 받을 때 여러 방법으로 이 패킷을 훔쳐보거나 빼돌릴 수 있기 때문이다. 네트워크와 관련해서는 여러 자격증들도 존재한다. 네트워크 쪽으로 관심이 있다면, 어떠한 자격증들이 있는지 알아보면서 어떤 일을 하는지 파악할 수 있을 것이다.

데이터베이스 엔지니어
데이터를 다루는 부분은 굉장히 조심스러워야 한다. 사용자의 데이터를 다루기 때문에 실수를 하면 모든 데이터가 모조리 날아갈 수 있기 때문이다. 데이터베이스 관리자(DBA)라고 해서 전문적으로 데이터베이스만을 다루는 직군이 존재한다. 데이터베이스는 말 그대로 소프트웨어를 통해 서비스를 제공하는데 있어서 핵심적인 역할을 한다. 사용자가 회원가입을 하면 서비스에 회원가입한 사용자의 아이디와 패스워드를 저장하고 있어야 하고 그 외 각종 정보들을 입력하고 있는 공간이 필요한데, 그것이 데이터베이스인 것이다. 각종 이슈가 뒤따르는 부분이기 때문에 데이터베이스 전문가가 따로 존재한다. 대표적인 데이터베이스 기술들은  MySQL, MariaDB, MongoDB 등이 존재한다.

보안 전문가
이런 뉴스를 많이 본 적이 있을 것이다. 'OO사 개인정보 유출. 5만명 피해.' 이렇게 정보가 유출되었다는 것은 서비스를 이루고 있는 시스템, 또는 소프트웨어 자체에 보안 문제가 있다는 것이다. 소프트웨어가 적용되는 분야가 넓어질수록 보안에 대한 문제가 더 부각되고 있다. 하지만 이것은 이제와서 보안이 중요하구나 하는 문제가 아니다. 소프트웨어라는 것이 이 세상에 등장하면서 보안에 대한 이슈는 계속 거론되어왔고, 지금도 그대로 거론되는 것일 뿐이다. 즉 보안에 대한 문제는 한 때 이슈가 아니라는 것이다. 국내의 대표적인 회사로는 AhnLab이 있다.



일반 사용자용 소프트웨어 분야
일반적으로 개발자가 아닌 사람들에게 친숙한 소프트웨어를 말한다. 우리에게 친숙한 웹과 모바일 앱에 대해서 알아보자. 필자가 속해있는 분야이기에 이 부분에서만큼은 조금 더 깊이 살펴볼 수 있겠다.

서버
백엔드라고 부르는 분야로, 서비스를 제공하는데 있어서 핵심적인 역할을 수행하는 비즈니스 로직이 담겨져 있는 부분이라고 할 수 있다. 백엔드 분야에서 주로 하는 작업으로는 데이터베이스 관리가 있겠다. 데이터베이스를 만드는 것이 아니라 만들어진 데이터베이스를 조작하는 것이다. 여러 사용자가 한 서비스를 동시에 이용할 경우에 상황을 대비한다던가 어떻게 하면 조금 더 효율적으로 사용자에 대한 정보를 저장할 것인지 등을 고민한다. 또한 저장하고 있는 데이터를 사용자의 요구에 맞춰 알맞는 정보를 검색하고 보여줘야 한다. 이 보여지는 문제가 클라이언트 쪽으로 연결된다. 이 과정에서 네트워크 통신 기술이 사용된다. 클라이언트와 서로 정보를 주고 받으며 서비스가 수행되는 구조이기 때문이다. 주로 클라이언트와 서버의 관계를 갑과 을의 관계로 표현한다. 클라이언트는 정보를 요청하는 입장이고, 서버는 요청받은 정보를 주는 입장이기 때문이다. (물론 이 클라이언트라는 입장과 서버라는 입장은 상대적인 표현이기에 언제든 바뀔 수 있는 부분이다.) 정리하자면 서버 개발은 눈에 보이지 않는 부분을 프로그래밍 한다. 각종 로직이 포함되며 시스템과 조금 더 가까운 부분을 개발하게 되는 것이다. 사용할 때는 간단해보이는 기능들도 막상 구현하려면 방대한 양의 코드가 필요하다는 것을 느낄 수 있을 것이다.

클라이언트
프론트엔드라고 불리며 여러 분야가 존재한다. 인터넷이라고 알고 있는 웹이라는 분야가 있으며 모바일 환경에서는 모바일 애플리케이션으로 iOS, Android 분야가 있겠다. 또한 데스크탑 환경에서 제공되는 데스크탑 애플리케이션들(프로그램)의 화면을 구성하는 부분도 클라이언트라고 할 수 있다. 즉 사용자에게 직접적으로 보여지는 화면을 구성하는 것이 클라이언트에서 하는 역할이다. 사용자로부터 어떠한 입력들을 받는 곳이며 그 입력에 맞는 정보를 백엔드로부터 받아온다. 이것을 어떻게 화면에 보여줄지를 고민하는 것이 클라이언트 개발자들의 고민이다. 사용자에게 직접적으로 보이는 부분이기 때문에 사용자 경험이라는 부분을 특별히 신경쓰게 된다. 클라이언트 개발자들은 디자이너들과 협업하는 일이 잦다. 어떤 디자인을 통해 서비스를 제공해야 더 보기 좋고, 전달하고자 하는 바를 확실히 전달할 수 있는가를 함께 논의해야 하기 때문이다. 클라이언트 부분의 중요성이 증대되면서 UI, UX 분야의 수요도 증가하고 있다.

시스템 관리
서비스를 제공하는데 있어서 필요한 것은 결국 컴퓨터다. 어떤 컴퓨터를 기반으로 서비스를 제공해야 사용자들이 그 서비스를 이용할 수 있는 것이다. 그렇기 때문에 항상 작동되고 있는 컴퓨터가 필요하며 그 컴퓨터를 관리할 사람이 필요하다. 일반적인 사용자들도 컴퓨터를 사용하다가 이유없이 꺼져버리는 경우가 종종 있을 것이다. 만약 서비스를 제공하고 있는 서버 컴퓨터가 이러한 에러로 가동이 중지되면 큰일이 난다. 얼마 전 카카오톡이 트래픽 과부하로 서버가 다운되었것처럼 복구전까지 서비스 이용이 불가능 할 뿐만 아니라 저장되어 있는 데이터가 손실될 위험도 존재한다. 그렇기에 더욱 중요한 부분이라고 할 수 있다. 네이버의 경우 따로 데이터 센터를 보유하고 있으며 직접 관리하고 있다. 최근에는 이러한 물리적인 컴퓨터를 통해 서비스를 제공하는 방식 말고도 여러 신 기술들이 등장하면서 개발자들이 서비스를 제공하는데 있어서 편의를 제공하고 있다. Amazon Web Services가 그 단적인 예다. AWS(Amazon Web Services)는 기존에 물리적인 컴퓨터에서 서비스를 제공했던 방법이 아닌 ‘클라우드'라는 형식으로 서비스를 제공하게 해준다. AWS이외에도 Microsoft의 Azure, Google의 App Engine 등이 존재한다.


그 외
빅데이터
빅데이터에 대한 관심이 최근에 높아졌다. 정보화 시대를 거쳐가면서 우리는 데이터의 풍요 속에 살고 있다. 검색 한 번이면 길을 찾을 수 있고, 맛집을 알아낼 수 있고, 전시회의 입장료를 알아낼 수 있다. 이러한 단순한 데이터 뿐만 아니라 사용자가 서비스를 이용하는 흔적들도 데이터가 된다. 기업들은 이러한 사용자, 소비자들의 소비패턴을 파악해, 소비자에게 특화된 서비스를 제공하거나, 시시각각으로 바뀌어가는 소비자들 형태에 맞게 서비스를 변형시키고는 한다. 이러한 데이터들을 다루는 것이 바로 빅데이터 분야이다. 데이터 사이언티스트라는 새로운 직업도 등장하면서 데이터에 대한 관심은 앞으로도 계속 중요할 것으로 보인다. 주로 파이썬(Python)이라는 언어와 R이라는 언어가 이 분야에서 각광을 받고 있다. 이 빅데이터와 함께 등장하는 이슈는 바로 머신 러닝이다. 

머신러닝
구글에서 개발한 알파고가 이세돌을 상대로 승리를 거두면서, 머신러닝이라는 단어를 개발자가 아닌 사람들도 관심을 갖기 시작하였다. 좀 더 비 개발적인 언어로 표현하자면 인공지능이 될 수 있을까? 이 부분은 조금 애매한 부분이다. 필자도 이 부분에 대해서는 자세히 알아보지 못했고, 공부해본 경험도 없고, 흘려들은 부분 뿐이지만, 지극히 수학적인 부분이라고 생각된다. 머신러닝과 관련되서도 여러 오픈소스들이 속속히 등장하고 있다. 데이터를 기반으로 어떠한 행동을 예측한다던가, 인간과 비슷한 사고 방식까지 만들어낼 수 있을지도 모른다. 미래에는 영화 '마이너리티 리포트'가 현실화 될 수 있지 않을까?

IoT
internet of thing의 줄임말로, 사물인터넷이라고 부르기도하며 IoE(Internet of Everything)이라고도 부른다. 사물 각각에 인터넷을 연결한다는 의미로 소프트웨어가 본격적으로 일상에 침투하기 시작했다. 많이 들어봤겠지만 집 밖에서 집 보일러를 끈다던가 이런 것이다. 자동차에도 인터넷이 연결되어 자동 주행 자동차가 개발되고 있으며, 웨어러블 기기의 발달로 기기들의 특성을 활용한 각종 신기술이 등장할 것이다. 구글에서도 야심차게 준비한 구글 글래스도 스마트 폰을 대체할 웨어러블 기기로 각광을 받았으며 각종 기기들의 발전과 함께 계속 발전될 분야이다. 최근에는 드론들과 연동하여 무인 택배 시스템도 개발하고, 각종 하드웨어와 연결하려는 시도들이 보인다. 헬스케어 분야와도 함께 발전되는 분야로 앞으로도 계속 주목받을 분야라고 생각한다.

VR(Virtual Reality)/AR
얼마 전 '포켓몬 고'가 전 세계를 강타했다. 증강 현실 기술을 바탕으로 현실 세계에서는 보이지 않지만 스마트폰 액정을 통해서 포켓몬을 잡을 수 있는 게임이다. 단순한 게임이 어린 시절 추억과 최신 기술이 결합되어 온 세계를 강타한 것이다. 증강 현실은 말 그대로 현실 세계에 소프트웨어를 입혀 좀더 확장된 세계를 사용자에게 제공하는 것이고, 가상현실은 아예 가상적인 공간을 만들어 사용자에게 제공한다는 차이가 있다. 아직 가상현실 기술은 어지러움증을 동반한다는 문제점이 존재한다. 그래서 오히려 증강 현실이 더 주목받고 있는 듯 하다. 기술적인 문제는 언젠가 해결될 거라 가정한다면, 기술이 우리에게 가져다 줄 일상의 변화는 이 분야에서 엄청난 파급 효과를 가져올 것이라고 생각한다.

게임
국내에도 수많은 게임 기업들이 존재한다. 개인적으로 생각하기에 게임은 소프트웨어 기술의 집약체이다. 그만큼 여러가지 소프트웨어 기술들이 사용되고 수학적인 지식들을 요구한다. 현실 세계와의 이질감을 덜기 위해 각종 물리 엔진도 사용되는 것으로 알고 있다. 하지만 게임 개발 분야에서도 각종 게임 엔진들과 프레임워크들이 개발되면서 게임 개발자들이 개발하는데 있어서 편의를 제공되었다. 대표적인 예로는 Cocos2d, 언리얼 엔진, Unity 등이 존재한다. 물론 이러한 엔진들이 개발되면 그 엔진을 어떻게 사용해야하는지 익히는 과정이 필요하게 된다. 이미 게임 분야도 소프트웨어의 다른 분야들과 결합이 시도되고 있다. 위에서 언급한 '포켓몬 고’가 적절한 예라고 볼 수 있겠다.



많은 이야기를 한 것 같은데, 그래서 어떻게 접근해야할지를 모르겠다. 여기서는 일반 사용자용 애플리케이션 부분을 집중적으로 알아보자. 서버, 클라이언트에서 어떠한 프로그래밍 언어들이 쓰이는지 알아보자. 언어에서 더 나아가 각종 언어들로 구성된 라이브러리 또는 프레임워크에는 어떠한 것들이 있는지도 알아보자.


#2. 무엇을 공부해야 하는가

서버(백엔드)
Java
정말 여러 가지 언어로 구현될 수 있는 부분이다. 국내에서 가장 많이 사용한다고 볼 수 있는 언어로 JAVA가 있다. 전자정부 표준 프레임(대한민국의 공공부문 정보화 사업 시 플랫폼별 표준화된 개발 프레임워크)로 Spring Framework 기반으로 만들어졌기 때문이다. (Spring 프레임워크는 Java라는 언어를 기반으로 구성된 프레임워크이다.) 그렇기 때문에 국내에는 자바 개발자가 많다. 컴퓨터 공학 관련 전공을 한다면 한번쯤은 다뤄봤을 만한 프로그래밍 언어 중 하나라고 생각한다. 객체지향 패러다임을 이해할 필요가 있으며, 처음 프로그래밍을 접하는 사람에게는 다소 어렵지 않을까 라는 생각이 드는 언어이다. IDE(통합 개발 환경, 개발자 도구)로는 Eclipse 를 주로 사용하게 되고 Intelli J IDEA라는 유료 IDE도 많이 사용한다.

Python
입문자에게 추천되는 Python이라는 언어가 있다. Python은 데이터 분석 분야에서도 많이 쓰이는 언어로 간결한 문법과 직관적인 문법으로 프로그래밍 입문자에게 권장되는 언어이다. 국내에서 파이썬에 관련된 책이 많이 번역되서 나오고 있으며 각종 검증된 프레임워크들도 속속히 등장하고 있다. 가벼운 웹 애플리케이션을 만들어볼 수 있는 Flask라는 프레임워크부터 서비스를 위한 웹 애플리케이션 프레임워크로 Django까지 서버를 구축할 수 있는 한 언어로 자리매김한 언어이다. IDE(통합 개발 환경, 개발자 도구)로는 PyCharm이 있다.

Ruby
파이썬에 비해 상대적으로 관심을 덜 받은 RoR(Ruby on Rails)로도 서버를 구축할 수 있으며 서울대학교 동아리에서 시작된 ‘멋쟁이 사자처럼’이라는 프로그래밍 단체(?), 동아리에서 교육하는 언어이다.

PHP
예전부터 널리 쓰여왔던 PHP 라는 언어도 존재한다. 배우기 쉬워 많은 사람들이 배웠던 언어로 알고 있다. 현재는 예전만큼 그 인기가 덜한 것 같다. 하지만 PHP에서도 문법을 정제하는 등의 노력을 보이면서 프레임워크가 등장하기 시작했고 대표적으로 Lalavel이라는 프레임워크가 있다.

Node.js
JavaScript로도 서버를 구축할 수 있다. 바로 Node.js 의 등장으로 가능해진 일이다. JavaScript의 영향력은 점점 더 커지고 있다. Node.js는 JavaScript 문법을 기반으로 둔 서버사이드 기술이다. 아직도 JavaScript라는 언어를 팝업을 띄우고, 시덥잖은 애니메이션이나 주는 장난감 언어(toy language)로 생각하는 개발자가 있는데, 매우 시대에 뒤떨어진 개발자이므로 그 사람의 말은 귀담아듣지 않아도 된다. 기존과는 약간 다른 서버사이드 프로그래밍 방식으로 엄청난 속도를 자랑한다. 대규모 애플리케이션을 제외한 모바일 백엔드 분야에서는 가장 사랑받고 있는 백엔드 기술 중 하나이다. IDE(통합 개발 환경, 개발자 도구)로는 VS Code, Atom, Webstorm을 주로 사용한다.

정리>> Java (-> Spirng ), Python (-> Django, Flask), Ruby On Rails, JavaScript(Node.js), PHP(->라라벨) + C#( -> .NET)


클라이언트(Web)
HTML/CSS
기본적으로 HTML/CSS 라는 언어로 정적인 웹 페이지를 만들 수 있다. 사실 HTML/CSS는 프로그래밍 언어라고 부르기 보다는 마크업 언어라고 부른다. 웹 페이지를 구성하는 요소들을 작성하는 일이기 때문이다. 로직을 담당하는 부분이 전혀 없기 때문에 컴퓨터에 대한 기본적인 지식이 없어도 충분히 도전해볼만한 언어이다. 물론 당장 마크업 전문가처럼 간결하고, 구조적인 웹 페이지를 구성할 수는 없겠지만, 눈 앞에서 나타나는 부분이 확실하게 보이는 부분이라 처음 소프트웨어 개발 공부를 시작할 때 가장 흥미를 붙일 수 있는 언어이다. 많은 비전공자들이 배우려고 하는 언어이고, 그만큼 진입장벽이 낮다. 하지만 처음부터 우리가 평소에 접속하던 웹 사이트와 같은 구조를 만들고 싶어하면 큰 좌절감을 느낄 수 있다. 이와 관련된 정말 많은 강좌가 있다. 밑에 링크로 첨부하는 사이트에서 배울 수 있다.

JavaScript
HTML과 CSS라는 언어로 웹 페이지를 구성했으면 사용자와 상호작용할 수 있는 부분을 추가해야하는데 이 역할을 하는 언어가 바로 JavaScript이다. 클라이언트 부분을 구성하는데 있어서 JavaScript는 빠질 수 없는 언어다. JavaScript의 위상은 날로 높아지고 있다. 문법이 정제되면서(2016년 기준) 간결한 코드를 작성할 수 있고 위에 서버 쪽에서 언급한 것처럼 서버를 구축할 수도 있다. JavaScript를 기반으로하는 여러 파생 언어들까지 나오고 있다. TypeScript, CoffeeScript가 바로 그 예이다. TypeScript는 기존의 JavaScript 문법에 여러 제약사항을 추가한 버전으로 개발자들에게 주로 사용되며 CoffeeScript는 보다 간결한 문법으로 디자이너들에게 주로 사용되는 듯하다. 여러 프레임워크들도 속속히 등장하면서 JavaScript의 세계가 열리고 있다. 대표적인 예로 구글에서 개발하고 있는 Angular 프레임워크가 있다. (현재 2016.9 기준 Angular 2가 정식 release 되었다. 그 반응이 기대된다.) 또 프레임워크보다는 라이브러리의 특징을 갖고 있는 페이스북에서 개발한 React가 있다. 이 외에도 JavaScript를 기반으로 만들어진 프레임워크 또는 라이브러리들이 정말 많다. 말 그대로 춘추전국시대이다. 결정장애를 동반할 수 있으므로  JavaScript에 대한 부분은 다음 포스팅을 참고하기 바란다.

정리 >> HTML, CSS, JavaScript(-> Angular, React)



모바일 iOS Application
Objective-C / Swift
전통적인 iOS 프로그래밍은 Objective-C라는 언어로 한다. 이름에서도 알 수 있듯이 이 언어는 C언어를 기반으로 만들어졌다. 전통적이라고 말한데는 이유가 있다. 바로 Swift라는 언어의 등장 때문이다. 얼마 전, Swift 3.0 버전이 정식 release 되면서 주목받고 있다. 하지만 개인적인 생각으로는 Swift로 완전히 이전되는데에는 시간이 조금 걸릴 것 같다. swift 개발자가 그만큼 적고 더군다나 Objective-C와 swift를 동시에 다룰 수 있어서 기존의 Objective-C로 구성되어있던 코드를 swift로 바꾸기가 쉽지 않기 때문이다. 그렇기 때문에 현재 포스팅 시점으로 봤을 때는  iOS 개발자가 되기 위해선 Objective-C와 Swift 두 언어를 함께 배워나가야 할 것이다. Swift의 앞날이 기대된다. 벌써부터 서버 사이드 프레임워크들이 하나둘 등장하기 시작했다. 그만큼 세련되고 현대적인 문법을 갖춘 언어로, iOS 개발 이외에도 널리 사용될 가능성이 높은 언어이다.

Mac
iOS 개발을 하기 위해서는 준비사항이 하나 더 필요하다. iOS 개발을 위한 도구로 Mac을 구입해야 한다. Window 환경에서는 불가능하며 Mac OS에서 Xcode라는 개발자 도구를 활용해야 iOS 개발이 가능하다. 국내에 아이폰 유저가 상대적으로 적어 iOS개발을 기피하는 경향을 보이는데, 이 때문에 iOS 개발자 수요가 더 늘고 있다고 들었다. 적어도 iOS 유저를 포기할 수 없는 것이다. (이를 전략으로 iOS 개발자에 도전해보는 것은 어떨까!)

정리 >> Objective-C, Swift


모바일 Android Application
Java 언어를 기반으로 만들어진 ADK(Android Development Kit)를 이용하여 안드로이드 개발을 할 수 있다. IDE로는 안드로이드 스튜디오를 주로 사용한다. Java이외에도 ionic이라는 프레임워크를 사용하여 하이브리드 애플리케이션을 만들 수 있다. 최근에는 JetBrain에서 개발한 Kotlin이라는 언어를 구글에서 안드로이드의 공식 언어로 지정하면서 주목받고 있다.

정리 >> Java ADK, Kotlin


React Native / ionic / Xamarin
또 다른 한 가지 언어로 앱을 개발할 수 있는데 바로 자바스크립트다. 분야 하나 하나를 소개할 때마다 매번 등장하고 있는 자바스크립트이다. 페이스북에서 개발한 React Native란 라이브러리로 App을 개발할 수 있다. 국내에서 React Native에 관련된 서적이 번역되어 나오고 있을 정도로 그 관심도가 높다.  ionic이란 JavaScript 언어를 기반으로 만들어진 프레임워크로 안드로이드 플랫폼에서 JavaScript로 하이브리드 애플리케이션 프로그래밍을 위해 개발되었다. 정말 JavaScript의 범위가 넓다는 것을 알 수 있다. JavaScript의 유용성에 대해서는 따로 언급하지 않겠다. Xamarin(자마린)은 C#기반의 모바일 크로스 개발 플랫폼으로 MS에서 인수하면서 각광받고 있다.




#3. 어떻게 공부해야 하는가
기본부터 공부하는게 좋을까? 아니면 직접 무언가를 만들어보고 그 원리를 파악하는게 좋을까?
일반 대학들의 컴퓨터과학 또는 컴퓨터공학 전공의 커리큘럼을 살펴보면 다음과 같다.
전공자들의 커리큘럼>>



비전공자들도 이와 같은 접근을 해야하는가? 필자는 아니라고 본다. 지금부터 지극히 개인적인 의견이다. 만들고 싶은 것, 자신이 개발해보고 싶은 분야를 결정하고나서 일단 무엇인가를 만들어보는 것이 중요하다. 무엇인가를 만들려면 프로그래밍 언어를 먼저 익혀야한다. 어떤 언어라도 상관없다. 물론 만들고 싶은 분야의 프로그래밍 언어를 선택해야 하며 그 중에서도 입문자에게 적합한 언어가 존재한다. 웹 프론트엔드 분야라면 HTML/CSS가 될 것이고, iOS라면 Swift도 적합한 대안이 되겠다. 안드로이드 같은 경우에는 선택사항이 없다. Java 언어를 공부해야 한다. 비전공자로서 개발자가 되기 위한 학습 방법으로는 소프트웨어 개발의 한 주기를 다 돌아보고 나서 개발 과정에서 필요한 기초적인 개념을 알아보는 공부 방법이 적합하다. 처음부터 기초적인 개념을 학습하다가는 흥미가 떨어질 가능성이 다분하다고 보기 때문이다.

물론 이러한 학습 방법이 맞지 않는 사람들도 존재하겠지만, 필자는 아니었다. 필자 또한 비전공자 출신으로, 기초적인 개념부터 공부하다가 개발의 어느 부분에서 쓰이는지 와 닿지 않으면, 도대체 이 개념을 왜 이해해야하고, 학습해야 하는지 동기부여가 되지 않았다. 내적 동기로부터 유발되는 학습이 아니면 그만큼 효과가 떨어진다고 생각한다. 그래서 프로그래밍의 기본이 되는 프로그래밍 언어 학습을 우선시 하고 무엇인가를 개발하는 것을 우선적으로 학습하였다. 그리고 나서 기초적인 개념들을 살펴보고 있다. 아는 만큼 보인다고, 기초적인 개념들이 내가 개발하는 것들에서 보이기 시작했다. 

계속해서 기초적인 개념이라는 표현을 사용했는데, 필자가 생각하는 개발이라는 분야의 기초적인 개념이란 운영체제, 네트워크, 데이터베이스, 자료구조, 알고리즘 이와 같은 내용들을 말한다. 한 가지 더 추가하자면 C 프로그래밍에 대한 부분이다. 모든 프로그래밍 언어의 모체가 되는 C 언어는 익혀두면 프로그래밍 언어가 작동하는 원리를 이해하는데 도움이 된다.



그렇다면 어떤 프로그래밍 언어로 개발 공부를 시작해야할까?
관련된 좋은 글이 있어서 링크를 걸어두었다.

웹 개발자로 진로를 결정한다면, HTML/CSS를 먼저 익히라고 권하고 싶다. 첫 진입장벽도 낮고 눈 앞에 바로바로 나타나는 웹 페이지를 보며 흥미를 유지할 수 있을 거라 생각한다. 그러면서 JavaScript를 통해 여러 인터랙션을 추가하면서 흥미를 유지할 수 있길 바란다. 위에서도 언급했듯이 한 사이클을 도는 것이 중요하다고 생각한다. 이에 완벽한 강의가 하나 있는데, 생활코딩의 웹 애플리케이션 만들기 수업이다. 비 전공자가 한 사이클을 경험하는데 이만한 강의가 없다고 생각한다. PHP로 서버를 구축하는 점이 조금 아쉽긴 하지만, HTML/CSS/JavaScript/PHP 그리고 데이터베이스까지 다루니 추천할만한 강의이다. JavaScript가 다소 난해할 수 있다. 처음 보는 로직에, 초심자에게는 허술하다고 느껴지는 문법의 유연함이 JavaScript의 양날의 검이다. 하지만 웹 개발자로의 진로를 결정했다면 JavaScript는 더이상 선택사항이 아니다. 서버를 구축하는 경험으로는 Python이라는 언어로 처음 접근하는 것도 나쁘지 않다고 본다. 프로그래밍 경험이 있다면 Java를 공부하면 좋겠지만, 개인적으로는 비전공자에겐 진입장벽이 조금 높다고 생각된다. 다시 한 번 언급하지만, 한 사이클을 경험해보는 것이 가장 중요하다고 생각한다.


모바일 애플리케이션 개발자로 진로를 결정한다면, 안드로이드의 경우에는 Java일테고 iOS의 경우에는 Objective-C보다 Swift가 더 낫지 않을까 조심스럽게 생각해본다. Swift로 서버 프레임워크들이 만들어지고 있다. Swift언어만으로 하나의 모바일 애플리케이션을 만들 수 있는 것이다. Swift에 대한 극찬이 여기 저기서 쏟아져 나오고 있다. 하지만 관련 자료가 부족하다는게 가장 큰 문제점이다. 개발 공부를 하다보면 책만으로는 해결되지 않는 문제들이 허다하다. 이럴 땐 구글링을 통해서 이미 겪어본 사람들의 내용을 듣는게 중요한데, 그 부분에 있어서 Swift가 조금 아쉽다.

어느 프로그래밍 언어를 선택하는 것은 그렇게 중요하지 않다. 만약 Java라는 언어를 깊게 공부했다면 다른 언어를 공부하는데 있어서는 처음 Java를 공부할 때의 반의 반 정도?의 (혹은 그보다 더 짧은)시간이 걸린다. (필자도 처음엔 반신반의 했는데 정말 그렇더라.) 패러다임이 비슷한 언어들은 약간의 문법사항만 다를 뿐 프로그래밍 기법이라든지, 필요한 센스 같은 건 거의 비슷비슷하다. 한 언어를 결정했으면 한 번 끝까지 공부해보길 바란다!
이 부분이 가장 관심있어 할 부분이라고 생각하여 간략하게만 말하고 따로 포스팅을 할 예정이다!
(언제가 될 지는 모르겠다...)

# 사족
내가 생각하는 개발자란 사회적인 문제를 파악하고 이를 기술적으로 해결할 수 있는 사람이다. 문제를 해결하는 과정에 있어서는 혼자 모든 일을 해내는 것이 아니라, 기획자와 디자이너와 같은 다른 분야의 전문가들과 함께 협업을 통해서 해결한다. 협업의 과정에 있어서는 커뮤니케이션이 가능할 정도의 상대방의 분야에 대한 지식이 있어야 하고, 뿐만 아니라 문제 해결을 위한 적합한 기술 도구를 상대방의 언어로 제시할 수 있어야 한다. 물론, 그 도구를 ‘개발’할 수 있는 능력 또한 당연히 갖추고 있어야 한다. 자신이 개발한 도구를 공개하는데 거리낌이 없으며, 배움의 목적을 궁극적으로 나눔에 두는 그런 사람이다.



Happy Coding!
개발 입문자에게 도움이 될 만한 글과 제가 참고한 글들이 링크를 함께 올려둡니다.