신입 서비스 기획자가 프로그래밍 언어보다 먼저 배워야 할 것
'프로그래밍 언어를 배워야 하나? 파이썬 많이들 배우던데...'
나는 서비스 기획자/Product Manager애게 필요한 개발 지식 수준에 대해 늘 의문이 있었다. 개발자랑 일을 해봤다면 감이라도 올 텐데, 그럴 계기가 마땅치 않았다. 스웨덴에서의 인턴 기간 3개월은 내가 제안한 안이 구현되어 배포되기에는 너무 짧았기 때문에, 개발자와 직접적으로 일하는 환경을 접해볼 수는 없었다.
한 번은 날 잡고 개발자와 상의해서 개발자는 무슨 일을 하는지 옆에서 관찰한 적이 있다. 근데 지켜봐도 도통 잘 모르겠고, 나한테 이런저런 설명을 해주는데 비전공자 입장에서 작업하는 화면을 지켜보고 설명을 들어본다한들 이해가 되지 않는 게 절반 이상이었다. 또 ‘어떤 PM이랑 일하고 싶으신가요’ 물었을 때 프로그래밍 언어 자체를 배워보라는 개발자는 없었다. 그럼 나 같은 신입 혹은 주니어 기획자에게 필요한 개발 지식은 뭐지? 1도 모르는 난 어떻게 살아가라고... 하는 생각이 늘 발목을 잡는 느낌이었다.
그러다가 쿠팡의 Product Manager 부트캠프에 참여하면서 그에 대한 해답을 조금 얻을 수 있었다. 배운 것을 토대로 결론부터 말하자면, 주니어 서비스 기획자는 우선 개발 환경이 돌아가는 시스템을 아는 것이 중요하다. 내가 기획한 것을 개발하기까지 어떤 과정을 거치게 되는지, 이건 왜 개발까지 시간이 오래 걸리는지, 개발 단계에서 문제가 발생했을 때 기획자는 어떤 대안을 내놓을 수 있는지 등을 판단할 수 있는 기본기가 먼저다. 기본기가 있으면 개발자와 '말이 통하기 시작'하고 보다 효율적이고 생산적으로 일할 수 있는 기획 환경을 나 스스로 마련할 수 있게 된다.
개발 지식의 기본기를 쌓는데 도움이 되는 주제 및 질문 몇 가지를 소개하고, 내 나름대로 해석한 내용을 덧붙이려고 한다. 최-대한 쉽게 풀어쓰려고 노력했는데, IT 지식이 전혀 없는 비전공자 기획자가 쉽게 정의 내리기에는 어려운 부분들이 많았다. 앞으로 더 보완해나가야지. (혹시 틀린 부분이 있거나 추가적으로 덧붙이고 싶으신 게 있다면 자유롭게 의견 주세요!)
참고. 하단의 주요 질문은 정원영 창작자님께서 집필하신 <비전공자를 위한 이해할 수 있는 IT 지식>에 소개된 내용을 기반으로 하고 있습니다.
오늘 다룰 주제는 Operating System/프로그램, 네트워크/클라이언트/서버, API/JSON 이다.
*긴글주의*
1. Operating System / 프로그램
컴퓨터는 무엇으로 구성되어 있을까?
워밍업부터 해보자. 기본적으로 코딩, 개발은 컴퓨터를 가지고 '무언갈 하는 것'이다. 그럼 그 무언가가 이루어지는 컴퓨터는 무엇으로 구성되어 있는지 짚고 넘어가면 좋을 것 같다. 난 컴퓨터를 조립해본 적도, 컴퓨터 본체 속을 궁금해해 본 적도 없다. 그냥 그런 게 있겠거니 하고 살아왔는데 이번 기회에 처음으로 내용을 정리해봤다. 각 구성요소 하나하나를 분석하기보다는, 컴퓨터가 어떤 시스템으로 이루어져 있고 각 요소는 어떤 역할을 하는지 간략히 알아보자.
다들 아는 내용이지만, 컴퓨터는 크게 하드웨어/소프트웨어로 나누어져 있다. 뻔한 클리셰를 잠깐 빌려와 사람에 비유해본다면 몸과 정신이다. 이런 건 초등학교 때 잠깐 배웠던 것 같다...
컴퓨터의 겉모습만 보다보니 의식하지 못하는 부분이지만, 컴퓨터를 가지고 뭔가를 할 땐 위에 나와있는 입/출력장치, 응용소프트웨어, 중앙처리장치, 기억장치 등이 유기적으로 연결되어 내가 원하는 작업을 수행한다.
(CPU가 어떻고 기억장치가 뭐고 이런 내용은 우선은 넣어두자. 참고로 기억 장치의 경우, 단기 기억장치(램)와 장기 기억장치(하드디스크)로 나뉘는데 이것은 2편에 나올 이야기인 데이터와 관련된다.)
하드웨어 자체는 스스로 생각하거나 무언갈 할 수 없기 때문에 컴퓨터에 대고 나 이거 인쇄하고 싶어 라고 말해도 컴퓨터는 아무것도 해주질 못한다. 내가 원하는 걸 컴퓨터가 알아들을 수 있는 언어로 바꿔서 대신 명령해주는 게 소프트웨어다.
프로그래밍 언어는 왜 이렇게 많을까? C, JAVA, JS, Python...
위에 살짝 언급되었지만 컴퓨터는 사람의 언어를 이해하지 못한다. 사람이 아니니까! 컴퓨터가 이해할 수 있는 언어가 바로 '프로그래밍 언어'이다. 이렇게 컴퓨터가 알아들을 수 있는 언어(코드)를 작성하는 것이 코딩이고 코딩은 곧, 컴퓨터가 알아들을 수 있는 언어로 컴퓨터한테 명령하는 것을 의미한다. 우리가 아는 파이썬, 자바스크립트, 씨언어 등이 프로그래밍 언어 중 일부이다. 현재 프로그래밍 언어는 수백 개가 넘는다.
국가마다 언어가 다양하듯, 프로그래밍 언어도 다양하다. 그 이유는 목적과 용도에 따라 특화된 프로그래밍 언어가 다르기 때문이다. 자신이 컴퓨터에게 무엇을 명령해서 어떤 작업을 할 지에 맞게 프로그래밍 언어를 선택할 수 있다. 예를 들어 데이터 분석을 목적으로 한다면 파이썬, 웹사이트를 개발하고 싶다면 자바스크립트, 안드로이드 앱을 개발하고 싶다면 자바 혹은 코틀린을 선택한다.
그림을 그릴 때 단순 스케치를 할 땐 연필을, 수채화를 그리고 싶으면 물감을 유화를 그리고 싶으면 유화를 고르는 것처럼 목적에 따라 사용하는 언어가 다른 것으로 이해하자.
왜 프로그래밍 언어는 계속 업데이트될까?
현재 우리가 쓰는 프로그래밍 언어가 개발되기 전, 초기 컴퓨터와 소통하는 방법은 0, 1을 조합해서 명령어를 입력하는 것이었다. 이렇게 0,1로만 이루어진 언어를 '기계어'라고 한다. 하지만 매번 컴퓨터에 010100010 100101011을 입력해서 작업을 하는 데에는 한계가 있었을 것이다. 그러면서 인간이 쓰기 쉽고, 외우기 쉬운 기호나 알파벳, 수식을 사용해서 명령어를 입력하는 방식으로 발전되어온 것이다. 지금도 계속 새로운 프로그래밍 언어들은 개발되고 있다.
프로그래밍 언어의 발전에 대한 내 개인적 견해를 한 마디로 정리하면 '효율성의 증대'이다. 세계는 비효율보단 효율을 추구하며 발전해왔다. 프로그래밍 언어도 마찬가지다. 기계와 소통을 하게 된 것 자체로도 엄청난 혁신이었지만 그 후로도 '더 효율적인 프로그래밍 언어'에 대한 고민을 끊임없이 해왔고, 그에 대한 결과로 더 쉽게, 빠르게, 원활하게 컴퓨터와 소통할 수 있는 방향으로 프로그래밍 언어도 발전되고 있는 것 아닐까?
또한 프로그래밍 언어가 쉬워질수록 사람이 다루기 편해질수록, 불필요한 작업 및 실수를 줄일 수 있다. 옛날처럼 기계어를 써서 01000110으로 컴퓨터에게 명령을 내려야 한다면 실수하기는 쉽고 실수를 알아차리기는 어려울 것이다. 실수를 줄임으로써 불필요하게 낭비되는 시간을 줄이고 개발 효율성을 높이는 방향으로 프로그래밍 언어는 계속 업데이트되고 있는 것 같다.
2. 네트워크 / 클라이언트, 서버
웹은 어떻게 이루어져 있고 어떻게 동작할까?
인터넷 브라우저 주소창에 특정 URL을 복붙+엔터를 누르면 해당 웹페이지로 이동한다. 나는 복붙+엔터 라는 매우 단순한 행위를 했지만, 내 눈에 보이지 않는 곳에서 컴퓨터는 많은 것들을 처리하고 있다. 이 처리 과정을 간략히 알아보자.
웹은 기본적으로 요청-응답 의 방식으로 작동한다. 우린 늘 한 대의 컴퓨터를 가지고 인터넷을 하지만 사실 인터넷이 작동되기 위해서는 최소 2대의 컴퓨터가 필요하다. 컴퓨터1(내가 쓰고 있는 컴퓨터)에서 필요한 정보를 컴퓨터2에게 요청해서 해당 정보를 받는 것이 인터넷의 기본 원리이다. 한 예로 우리가 언제 어디서나 구글링을 할 수 있는 이유는 구글이 갖고 있는 데이터 혹은 구성요소를 어떤 컴퓨터(컴퓨터2)에 올려놓고, 사용자가 정보를 달라고 할 때마다 언제든 그 정보를 찾아서 내 컴퓨터(컴퓨터1) 화면에 띄워주기 때문이다.
흔히 우리가 쓰는 컴퓨터 혹은 사용하는 웹브라우저를 '클라이언트'라고 하고, 우리에게 정보를 주는 또 다른 컴퓨터를 '서버'라고 한다. (고객과 서비스 제공자 정도로 이해하면 된다. 뭘 달라고 하는 클라이언트, 그걸 주는 서버.) 또 정보를 달라고 하기 때문에 정보 '요청', 해당 정보를 주기 때문에 '응답'이라는 용어를 사용한다. 즉 클라이언트가 정보를 요청하고 서버가 이에 응답하여 해당 정보를 주는 것이다.
우리가 인터넷에서 무언갈 검색하거나, 로그인을 하거나, 글을 올리거나 쇼핑을 하는 등의 모든 일은 '요청'을 하고 응답을 받는 것으로 이루어진다. 물론 그 안에서 일어나는 더 세세한 프로세스가 있겠지만 우선 간략히 이렇게 이해하고 넘어가자.
반응형 코딩? 그게 뭐죠.
반응형 코딩은 왠지 들어본 것 같은 느낌이 들 것이다. 이때의 '반응'은 화면의 크기에 반응한다는 맥락으로 이해하면 된다. 예전에는 엄청 뚱뚱한 모니터 화면만 보면서 인터넷을 했지만 지금은 핸드폰, 태블릿 PC, 노트북 등 다양한 디바이스로 인터넷을 하고, 각 디바이스마다 화면 크기도 제 각각이다. 이러한 여러 가지 디바이스 환경에 유연하게 대응하는 웹 개발 방법이 반응형 코딩이다. 사용자가 사용하는 디바이스가 100개여도, 하나의 웹페이지만으로 각 디바이스 화면에 맞게 반응하고 동작한다.
아니 앱에 있는 이 부분 얘기하는데, 왜 자꾸 웹 개발자한테 가라고 하는 거죠?
이 질문은 해석하기가 참 어려웠다. 검색을 해봐도 와 닿는 부분이 없어서 주변 개발자 분에게 여쭈어보았다. 기본적으로 웹, 앱의 개발 환경이 다르다는 것을 이해하면 되는 부분이다. 우선, 앱과 웹은 겉모습이 같더라도 다르게 구현하는 경우가 많다. 기본 웹, 안드로이드, iOS 각 환경마다 개발하는 방법이 다르기 때문에, 기획자는 이러한 차이점을 인지해야 한다. 요즘에는 하나만 개발해서 세 가지 환경에서 모두 배포할 수 있게 하는 방법도 있다고 하는데 이건 회사by회사이고, 이런 방법은 한계가 있기 마련이라 아주 최적화된 개발은 하기 어렵다고 한다.
웹, 앱 모두 클라이언트-서버 구조로 이루어져 있다는 것은 같지만 개발 과정은 상이하다. 그중 가장 큰 차이점을 하나 꼽자면, 업데이트 과정이 있느냐/없느냐이며 이 차이는 변경 사항을 즉각적으로 반영할 수 있느냐, 아니냐로 나타난다. 예를 들어, 웹은 변경 내용이 서버에 저장되면 사용자가 새로고침을 할 때마다 변경 사항이 적용된 웹페이지가 화면이 나타난다. 하지만 앱은 '업데이트'라는 과정이 있다. 앱스토어에서 앱을 검색하면 '버전 히스토리'를 볼 수 있는데, 각 내역을 보면 어떤 점이 수정 혹은 개선되었는지 확인할 수 있다. 이처럼 앱은 수정 후 배포(업데이트)되기 전 심사를 받아야 하며, 이 심사를 거쳐 수정사항이 앱에 반영되었다고 하더라도 사용자가 해당 앱을 업데이트하지 않으면 사용자는 바뀐 내용을 볼 수가 없다. 이러한 예시를 참고로 웹, 앱 개발환경에 차이가 있다는 점을 염두에 두자.
3. API & JSON
API 문서는 왜 있죠?
API(Apllication Programming Interface)는 쉽게 말해, 요청을 하고 응답을 받기 위해 정의된 룰 같은 거라고 생각하면 된다. 사람-컴퓨터, 기계-기계뿐 아니라, 소프트웨어와 소프트웨어 사이에서도 수많은 의사소통이 일어나고 있다. 컴퓨터 시스템끼리 정보를 교환할 수 있게 하는 형식 혹은 창구가 API다. 코드들끼리 서로 소통하기 위해 지정된 형식으로 명령, 요청할 수 있는 수단이 필요하기 때문에 API 문서가 있는 것이다.
예를 들어, 각 기업의 재무 정보를 제공하는 주식투자 서비스는 Dart 서버로부터 기업별 재무제표 정보를 요청하고 받아간다. 이때 Dart 서버에 정보를 요청하는 형식이 필요하다. 이때, OOO를 이렇게 써서 보내면 ㅁㅁㅁ가 올거야. 라고 알려주는 게 API다.
즉, 일종의 '주문서' 같은 거다. 음식을 주문하기 위해선 메뉴판에 써져 있는 대로(형식) 주문(요청)을 해야 한다. 메뉴판에는 김밥이 쓰여 있는데 아파트 주문서를 넣으면 식당 주인은 해줄 수 있는 게 없다.(No응답)
JSON이 뭔데요? (JavaScript Object Notation. 제이슨)
JSON도 일종의 형식이다. 웹상에서 서로 다른 시스템 간 데이터를 주고받을 때 그 데이터를 표현하는 방법이다. 예를 들어 엑셀을 사용할 때 함숫값을 얻기 위해 기입하는 수식 같은 것이다. 엑셀이 알아들을 수 있게 데이터를 표현해서 수식(=데이터 포맷=JSON)을 기입하면 내가 원하는 함숫값을 얻는 것과 비슷하다. 이 내용은 2편에서 다룰 내용과 이어지는데, 그것도 함께 읽으면 더 이해가 잘 될 것이다.
요청과 응답을 주고받을 때의 형식?
대충 웹이 작동되는 원리는 요청-응답으로 이루어진다는 것을 위에서 확인했다. 요청과 응답을 주고받는 형식도 간단하다. '정해진 절차에 따라 텍스트 메세지를 적어 보낸다'고 생각하면 된다. "나 이거 이거 필요하니 이거 이거 해줘."라고 주문서를 보내면 "너가 말한 이거 이거 여기 있다." 영수증을 주며 응답해오는 것 정도로 이해하자. (물론 이 안에선 복잡한 일들이 일어나고 있지만..)
이 포맷에 맞게 텍스트를 작성해서 주고받는다고 생각하면 된다.
설명이 길어졌는데 우선 1편은 여기서 마무리! 이번 편에서는 프로그래밍 언어, 웹이 동작하는 방식 위주로 소개했다. 다음 편에서는 데이터 베이스, 프레임워크, 협업 관련 내용으로 채울 예정이다. 내 생각 정리가 다른 누군가에게도 도움이 되길 바라며! 다음 편에서 만나요. (부족한 지식을 쉽게 설명하고 비유를 하려니 틀린 것이 있을까 걱정되는 부분이 있습니다. 있다면 꼭 알려주세요!)
참고
비전공자를 위한 이해할 수 있는 IT 지식
생활코딩
http://www.epnc.co.kr/news/articleView.html?idxno=79569
http://blog.naver.com/PostView.nhn?blogId=allstar927&logNo=90161699998
https://sambalim.tistory.com/16
https://de-developer.tistory.com/20
https://de-developer.tistory.com/20http://bitly.kr/v6FH2e0Su