예외 처리에 대한 6 가지 화두..

 

 일단 예외에 대한  글을 쓰려고 마음은 먹고 편집기를 연후 리얼타임으로 생각하면서  손가락을 움직거려 본다. 따라서 생동감은 넘치는 글이 될거 같긴한데 오류도 있을 수 있겠고 내 밑천이 그닥 많지 않아서 높은 수준의 글은 되지 못할것이다.  그리고 문법을 말하는 글이 아니며 무엇이 옳고 무엇은 안되~라는 글도 아니다.  이런것도 있고 같이 생각해보자는 글이다. 

 예외는 아시다시피 try ~catch 이다. 예외를 잡고 싶은 부분을 try 로 감싸고 예외를 잡았을 경우 catch 문 안에서 처리해주는 방식이다. 어떤 예외를 잡을지와 어떤식으로 처리 할 지에 대한 고민이 들어가야하는 부분이다.  처리는 catch 안에서 직접 할 수 도 있고 catch 안에서  처리할 책임을 그 함수를 호출한 이전 함수에게 공을 돌릴 수 도 있다. 그때 이전 함수는 그 예외를 처리 할 수도 있고 무시할 수도 있고 다시 그 이전 함수에게 공을 또 다시 돌릴 수도 있다. 어떤 언어는 예외라는게 없기도 하고 어떤 언어는 예외처리를 강제하기도 하며 어떤 언어는 예외를 예외가 발생한 근처에서 처리하길 유도하며 어떤 언어는 예외가 발생한 최대한 먼 지점에서 전지적인 시점에서 처리하게 유도하기도 한다. 또한 '고장나게 납둬라' 라는 전략도 있다. 물론 광고성 멘트이다. 어떻게든 고장난것에 대한 처리는 해야하니깐..

이러한 예외의 매커니즘들을 이 글에서는 6가지로 나누어서 화두를 던져본다.

 

1. 에러인가 예외인가? (처리 할 수 있는 것? 없는 것?) 

이런 말장난을 구분하는 것부터 문제이다. (언어에 따라서 exception키워드가 따로 없는 것도 있다. 그냥 error)  내가 당신에게 1부터 10까지의 숫자중 하나를 말해주세요 할때 100을 말하면 에러이며 갑자기 누군가 당신의 목을 졸라서 아무 말 안하거나 '으악' 이라는 소리를 듣게 되면 예외인가? 좀 더 SW 스러운 예제를 생각해보면 어떤 메소드가 있다고 하자. 파일을 열어서 그 안의 IPaddress: 이후의 값을 리턴하는 계약이 맺어진 메소드라고 할때 값이 192.168  ~ 이런게 아니라 "길라임" 이라면 이게 에러인가 예외인가?  혹은 파일을 누가 지워서 아예 아무것도 못하면 이게 에러인가? 예외인가?  그 메소드를 호출하는 호출자와 그 메소드의 계약관계에  '파일이 거기 있을 수도 있고 없을 수도 있다' 는 것이 포함되어 있다고 할 수 있을까 없을까? 

나는 전자 즉 길라임이 들어 있으면 에러라고 보고 , 후자라면 즉 파일이 없으면 예외라고 본다.  이 함수에서 나타날 수 있는 모든 예상 가능한것들은 예외라고 보며 그렇지 않은 경우 즉 '길라임' 일지 '순시리' 일지  알 수 없는 것 일때 에러라고 말하기도 한다. (물론 '길라임' 이 나오는 것도 예상가능하에 있다고 님은 본다면 이것도 예외이다.)  

더보기

예외 처리는 메커니즘이 정상 반환 값과 잘못된 반환 값을 구별한다는 점에서 반추상적 문제를 해결한다. C와 같은 내장 예외 처리가 없는 언어에서 루틴은 공통 반환 코드 및 오류 패턴과 같은 다른 방식으로 오류를 알려야 한다.[5] 넓은 관점에서, 오류는 예외의 적절한 부분 집합으로 간주될 수 있으며, 오류와 같은 명시적 오류 메커니즘은 예외 처리의 (상세한) 형태로 간주될 수 있다.[5] "예외"라는 용어는 어떤 것이 잘못되었다는 것을 의미하지 않기 때문에 "오류"보다 선호된다 - 한 프로시저나 프로그래머에 의해 오류로 간주되는 조건은 다른 프로시저에 의해 그렇게 보이지 않을 수 있다. "예외"라는 용어조차도 오해의 소지가 있을 수 있는데, 그 이유는 "특이"라는 전형적인 의미의 "특이"는 드문 일이나 특이한 일이 일어났다는 것을 의미하기 때문이다.[7] 예를 들어 키에 연결된 값이 없는 경우 연관 배열에 대한 조회 함수가 예외를 발생시킨다고 가정할때 컨텍스트에 따라 이 "키 없음" 예외가 성공적인 조회보다 훨씬 더 자주 발생할 수 있다. [8]  from 위키

 

그냥 자바언어에서는 에러를 무엇으로 보고 있는지 확인해보자.

자바에서는 Exception와 Error는 구분되는데 차이는 처리 할 수 있는 문제 인가? 없는 문제인가이다. 뭐 굉장히 명쾌한듯 보이지만 
처리 할 수 없는게 도대체 무엇인걸까? 자바에서 에러는 주로 시스템 리소스 부족으로 인해 발생하는 문제이다. 그것은 문제를 알아 바짜 어떻게 개발자가 할 수 없다고 보는 것인데, 실행 시간에 발생한다.  에러의 예로는 OutOfMemoryError, LinkingError, AssertionError 등이 있다.

비교점   Error Exception
패키지명 Java.lang.error Java.lang.exception
회복가능 회복될 수 없다. (돌이킬수 없다)  회복 될 여지가 있다. 
발생상황 실행시간에 발생된다. 실행시간과 컴파일 시간 모두 발생된다.
클래스명  OutOfMemoryError, IOError. NullPointerException, SqlException

 

2. 무조건 처리하고 넘어가야?  가능하면 처리 하고 넘어가야?  (Checked vs UnChecked) 

자바 창조자가 생각하는 반드시 처리해야하는 것은 무엇인고? 가능하면 처리 해야 한다고 생각하는 것은 무엇일까?

 

즉 강제적으로 처리 해야 하는것은 무엇인가에 관한 문제이다.

이 문제는 예외 처리의 아주 전통적인 시각차가 존재하는 화두이다. 가장 많이 사용되는 언어인 자바와 C# 의 창시자들도 서로 다른 시각을 가지고 있는데  C# 의 창시자 앤더스 하일스버그의 경우 자바의 체크드 예외 (강제적으로 호출한 함수에서  처리하게 만드는) 는 여러모로 문제점을 가지고 있는데 확장성이 그 중 하나로 본다. 즉 라이브러리를 사용하는 개발자의 코드가 라이브러리의 체크드 예외의 변화에 따라서 에러가 생길 여지가 있다는 것이다. 라이브러리에서 B 라는 예외를 추가했는데 사용자 코드에는 그것이 없으니 말이다. 이런 문제는 상속에서 생기는 것과 비슷한데  상위 클래스에 추상메소드를 함부러 넣는게 힘든 이유와 같다. (자바 같은 경우는 가상함수의 상속구현에 대한 강제적인 키워드가 없어서 뒤통수 맞을  소지가 많다.)  하일스버그는 또한 그런 강제적인 예외처리는 개발자에게 예외에 대한 피로감을 주게되어 그냥 모든 예외를 하나의 catch문에 때려박고 로깅한번하고 잊어버리자. 라는 유혹에 빠지게 한다고 말한다.개인적으로 자바의 체크드예외 시스템은 불필요 하다고 본다. Unchecked 예외들도 반드시 처리 해야할 예외라고 생각 할 수 있기 때문이다. 차라리 모두 checked 예외인게 더 나아보이기도 한다.  체크/언체크드로 구분되어 있는 자바에서는 웬지 언체크드는 신경쓰지 말아라라는 잘못된 시각으로 비추어 질 수도 있겠고..

참고)

자바에서의 체크드 예외에 대한 불편함과 불필요성을 느낀 코틀린 언어에서는 모든게 언체크드 예외이다. 만약 실행중인 함수에서 그냥 예외를 던저버리면, 그 함수를 사용하는 측에서는 날벼락 맞기 싶상이다. 소스 내부를 일일이 확인하지 않고서는 말이다. 그래서 함수를 사용하는 측에서 문제상황을 강제로 처리하게 하기 위해 (강제로 한다는건 실수를 줄이는 기법이기도 하다. 체크드 예외를 만든 철학처럼) 최근 언어에서 이름은 달리하여 대부분 지원하는 Result를 이용하여 리턴해주면 호출자측에서는 
onSuccess / onFailure, getOrNull, exceptionOrNull, getOrDefault, getOrElse 등을 통해서 요리 하면 된다. link to documentation.

 

3. 가까운 곳에서 즉시 처리할 것인가? 상위로 위임할 것인가?

2번에서 연장되는 얘기인데, A 라는 메소드에서 예외가 발생했다고 하자.  그 예외에 대해 그 스스로 처리할 것인가? 혹은 그 메소드를 호출한 근접메소드가 처리해야하나? 혹은 콜스택의 가장 상위에서 처리해야하나? 예외가 일어난 곳에서 가장 가까운 놈이 처리해야하는게 순리에 맞나? 가장 멀리 즉 전지적 시점에서 처리해야하는게 순리에 맞는것일까?  

예를들어 국내 원자력 발전을 통제하는 프로그램이 있다고 하자. A 발전소의  내일  발전량을  10->100 으로 바꾸는 기능이 있는데 100으로 바꾼후 Apply 버튼을 눌렀다고 했을때   a->b->c->d->d 라는 일들이 일어 난다고 하자.  근데 c 에서 무슨 문제가 생겼다.  c 에서만  처리해야하면 되나? a 를 호출하는 시점으로 거슬러 올라가서 전체적으로 관리해야하나?

문법적으로 보면 모든 개별 하위에서 catch 를 처리 할것인가 아니면 하위는 모두 finally 로 리소스에 대한 종결만 짓고 예외를 상위로 전파해서  상위에서만 각각의 예외에 대해서 구분 처리 하자에 대한 것이다. 각각 모든 메소드들에서 먼가를 처리 한다는것은 너무 복잡해진다는것을 의미하며 현실적으로 불가능하며 개발자에게 피로함만 가중시킨다고 보여 진다. 하지만 예외는 발생된 곳에서 처리하는게 분명하지 않겠나? 하는 입장도 맞을 수 있다. 혼자 개발하는게 아니라면 누가 상위를 개발하며 하위에서 일어난 혹은 일어날 일을 콘트롤 가능할까?

결국 프로그램의 특성에 따라서 달라 질 수 있는데 웹백엔드 개발에서 상당수는 상위로 이전하는게 나아 보인다.
그렇게 되면 서비스코드들은 깔끔해지며, 컨트롤러에서 AOP로 모두 묶어서 처리 할 수 있다. 

 

4. 죽일 것 인가? 살릴 것 인가? 

최근 개발에서 나는 예외에 대해 고민하길 포기해버렸다.  따라서 예외를 단순히 프로그램이 죽지 않게 하기 위해 예외처리를 한다. 잘죽는 부분은 이렇다.

* JSON 변환을 하는 부분  
* 소켓 처리부분, 대부분의 io 부분. (외부의 파일이 어떻게 될지 모름)
* 널포인터가 없을거라고 확신하지 못하는 부분 모두 (이건 좀 너무 광범위한데 C++ 로 개발할때  ASSERT 로 일단 도배한다.) 
* 여러 쓰레드가 접근되는 부분   
* 사용자가 주는 값에 대해 신뢰해선 안되는 부분 
* 컬렉션 처리중 먼가 냄새가 나는 부분

뭐 더 많겠지만 요즘 내가 짜는 프로그램은 이런거 같다. 이렇게 써 놓고 보니 예외를 예외로 생각하지 않고 프로그램 시퀀스의 일부분으로 좀 더 오버해서 즉 if 문 처럼 생각하고 쓰는게 아닌가 싶기도 한데 좀 더 고찰해 볼 시간은 없다. (리턴 값을 if 문으로 거르는것이 나쁜건 아니다. go언어는 이렇게 한다) 

암튼 위의 리스트에서 느껴지듯이 쓰레드,IO 등에서 문제가 생길 소지가 많은데 그래서 웹개발/서버개발에 있어서는 죽이지 않기 위해 예외처리를 하는 경우가 많은거 같다. 일처리 프로세스 과정이 복잡하지 않고 하나의 시퀀스에 대해 완료하지 못하더라도 큰 타격을 받지 않으며 어차피  다음에 시도하면 되는 것은 그냥 생활의 일부분이야 ~~그런 사소한 이유로 프로그램을 죽일 순 없어. 프로그램 죽는것은 내가 죽는것!!!  이런거다.

근데 그냥 빨리 죽여서 문제를 빨리 찾으려는 응용프로그램도 많으며 예러 발생해선 절대 안되는 프로그램이 있으며 , 예외도 거의 없어야 하는 프로그램도 있다. 공장이나 의료쪽에서 사용되는 응용프로그램들이 그러한데 이런 프로그램에서는 저 위의 예처럼 모든 경우에 대해 예외처리를 하여 자신도 모르게 넘어가면 안된다. 예외가 로그에 남겠지만 그것만으로 부족하다. 개발자에게  문제가 생겼다는것을 즉시 각인 시켜야한다. 프로그램을 그 즉시 죽임으로써 말이다. (개발시에는 즉시 죽게, 실제 상황에서는 상황에 따라서..)  그리고 최대한 에러/예외가 나지 발생하지  않도록 설계를 해야하며 오류를 잡아야한다. 사실 이런 프로그램 경우 웹이나 게임처럼 외부와의 잦은 커뮤니케이션이 없고 안정된 하드웨어 등 시스템  때문에  예외가 발생할 가능성은 크게 적다.  

 

5. 모두 되돌릴 것인가? 이미 벌어진 일은 무시,포기할 것인가? 

 그냥 살리는게 중요 포인트라면 예외 발생시 그냥 로그정도 출력하고  지나치면 된다. 그 메소드를 호출한 사람은 아마 한번 더 호출해 보겠지. 아니면 그 사람은 망하더라도 다른 모든 사람들에게는 서비스가 진행 될 수도 있고.. 하지만 되돌려야한다는 문제의식을 갖게되는 어플리케이션이라면 정말 거대한 도전이 된다. 트랜잭션,Redo,Undo,커맨드패턴 같은 단어들을  떠올려야 하기때문이다.

자 갤럭시 7 을 생산하는 공장에서 갤럭시 7 에 들어가는 전자기판(pcb)을 검사하는 프로그램이 있다고 해보자.  그 프로그램은 기판을 검사하기 위해 많은 지식이 사용자에 의해 학습되어야 한다. 그 기판에는 어떤 부품들이 있고 어떻게 생겼고 어떤 방식으로 불량이 아닌지를 확인하는등.. 이것을 학습된 검사조건들 이라고 하자.

이 검사조건 중 하나의 값을 30-> 50 으로 올릴때  발생하는  시나리오가 아래와 같이  흘러 간다고 하자.

a. 50을 입력받아서 
b. 50을 포함한 새로운 임시 객체를 만들어서 적용해 나간다.
c. 변경 된 데이터를 많은 뷰에 적용시키고 (즉 화면뷰에도 50으로 바뀌고 , 리스트뷰에도 바뀌고) 
d. 네트워킹을 통해 중앙저장소에도 바꾸어주고 
e. 검사조건을 모아놓은 메모리 자료구조를 수정한다. 
f. 로컬 xml 파일에 새로운 50을 써준다.
g.완료 (버튼 활성화)

이렇게 메소드들이 호출된다고 할때 갑자기  d에서 문제가 생기면 어떻게 될까?  메모리에는 이 어플리케이션이 갖는 최종적인 마지막 값이 50으로 갱신되지 못한 채 예외가 생겨서 30으로 남겨져 있다. 그리고 검사조건들을 저장해놓은 파일도 갱신되지 못하여 나중에 프로그램을 시작할때 30으로 읽어들일 것이다. 하지만 화면뷰와 중앙저장소의 값은 50인데??

먼가 문제가 생겼을때 돌이키는 방법으로는 메멘토패턴과 커맨드패턴을 주로 사용하는데 커맨드 패턴인 경우 undo / redo 를 처리 할때 execute 와 unexecute 함수를 가지고 내부에 이전정보,이후정보를 속성으로 가진 커맨드 객체를 이용한다. 근데 이때 unexecute 에서 처리해 줘야할 것들이 간단치 않다는게 문제이다.  저 전체를 한 묶음으로 묶어서 처리하는 트랜잭션 처리시  데이타베이스처럼 상대적이고 일관되고 한정된 로직에 있는 것도 아니고 메소드의 역할에 따라 다른 행동에 대해 어떻게 트랜잭션 처리를 일관되게 할 수 있을까?  맨붕이다..

 

6.  리턴으로 처리 또는 예외  도입 ?  좀 더  명시적인(강제적인) Optional , Try, Result 도입? 

지금까지 예외가 모든 언어의 필수발가결한 요소인듯 글이 작성 되었지만 사실 예외 시스템이 없는 언어도 있으며 대표적으로 C, 예전 파스칼언어, 현재 go 언어이다. 우리는 보통 즉 A 에서 B 라는 메소드(JDBC 를 이용하여 DB에서 데이터를 쿼리해서 결과를 돌려주는) 를 호출 했을때 , SQL예외가 당연히 일어날 것을 예상해서 컴파일하기전에 SQLException 에 대처하는 코드를 추가 해준다. 근데 이미 코딩시점에 db 관련 문제가 생길 수도 있음을 인지하고 있다면 , 그 문제가 생겼을때  return "disconnection fail"  혹은 return -1 이라고 리턴해주는 함수로 만들거나 리턴값 리스트를 조사해보면 되지 굳이 예외라는 키워드등을 배울 필요가 없지 않을까? 사용자가 필요로 하는 데이터는 모두 파라미터 (inout) 을이용해서 처리하고 리턴값은 단지 성공했는지 실패했는지 혹은 어떤식으로 실패했는지를 표시해서 처리하면 되지 않느냐는 말이다. 

 즉 예외 이전의 처리 방식은   (The C++ Programming Language 참고) 

* 프로그램을 종료하거나
* '에러' 를 나타내는 값을 반환하거나
* 정상적인 값을 반환하고 비정상적인 상태로 프로그램을 끝내거나
* '에러' 의 경우에 호출되도록 만들어 둔 함수를 호출한다.

이었는데 이거면 충분하지 않을까 하는 문제이다. 사실 자신이 하는 프로젝트에 따라서 충분할 수도 있다.세상의 모든것이 케이스바이케이스이지 않겠는가. 

예외처리는 저런 정해진 규칙이 모호한 개념보다는 좀 더 명확한 개념을 개발자에게 제공하므로써 좋은 코딩 스타일, 잘 구조화된 훌륭한 제품을 만들도록 유도하는데 도움을 준다. (스택풀기 같은 기술적인 부분은 중요치 않다) 자바의 인터페이스 처럼 말이다. C++ 은 그 비슷한것을 할 수 있긴 하지만 추상클래스를 사용해야한다. 추상클래스를 사용하다보면 상속과 인터페이스를 혼동하기 쉽다. 인터페이스는 상속과 전혀 상관이 없는 주제이며 일종의 프로토콜인데 말이다. (Swift 언어에서는 아예 그런 역할을 하는 키워드가 프로토콜. 스칼라는 trait 이다) 

 
 

마무리 

이렇게 예외는 try catch 문법을 공부하는것으로 그치지 않는 아주 어렵고 다양한 스토리가 있다. 기회가 될 때 전체 시스템에 대한 예외 처리 전략에 대해 종이에 스케치해보고  작성도 해본다면 단단한 프로그램을 만드는데 도움이 될 것이다. 물론 그것을 알아주는 사수와 갑을 만나길 바란다. 

개인적으로 try ~ catch 는 별로 안좋아하며, Result나 Try같은 오류내용을 포함한 명시적인 리턴을 우선적으로 고려한다. 

 

SW 개발현황을 플러그 꼽기에 비유 



"이상하네 테스트할 땐 문제없었는데..."






스타트업 정의 

많은 새내기/구직자들이 오해하는 경우가 있는데  스타트업 회사는 소규모 영세 si 회사와 다릅니다.
스타트업이란 기술기반의 아이디어 혹은 아이디어 기반의 기술을 바탕으로 한 신생기업입니다.

"혁신적 기술과 아이디어를 보유한 설립된 지 얼마 되지 않은 창업기업으로, 대규모 자금조달 전 단계라는 점에서 벤처와 차이가 있다. 1990년대 후반 닷컴버블로 창업 붐 때 생겨난 말로, 고위험ㆍ고성장ㆍ고수익 가능성을 지닌 기술ㆍ인터넷 기반의 기업을 지칭한다.."
라고도 합니다.

 창업 한지 얼마 되지 않은(사업을막 시작하는) 기업이 대규모 자금을 조달 받기 전(상장 전) 상태이지만 (아이디어와 기술을 통해) 급격한 성장을 기대할 수 있는 기업” 
라고도 합니다.

국내 상황

스타트업회사는 3년새에 6~80%가 접는다고 하지만, 저건  대학교들의 숫자에 집착한 지표일 뿐이고 사실은 99% 이상 접는다고 보면 되지 않을까 합니다. 목숨줄 간당간당 살아 있는게 접는것과 무엇이 다른지도 잘 모르겠고 ... 그 데스벨리를 넘는게 우리나라에서는 참 힘듭니다.창업에 대한 생태계가 잘 구축되어 있지 않습니다.  아이디어만으로 투자가 이루어지지 않고 있으며, 매출이 있어야하는데 ,보통 인건비가 그것을 상회하기때문에 CEO가 버틸수가 없습니다. ( 이때 SI의 유혹에 넘어가기 쉽습니다.이 유혹에 넘어가는 순간 스타트업으로서의 색깔을 잃어리고 수천의 영세SI기업으로 전락(?)합니다.) 참고로 영세소규모회사는 일감을 따오기만하면 착취되는 저렴한 노동력으로 끈질기게 살아남습니다.

우리나라는 창업 분야도 창의적이고 새로운 영역보다는 접근하기 쉬운 유통·서비스 등이 압도적으로 많다고 하며  이공계 분야라고 해봐야 대부분 모바일 관련 앱(응용프로그램)을 개발하는 스타트업만 우후죽순처럼 생긴다고 합니다. 물론 스타트업 생태계가 잘 구축되어 있지 않기때문이며 철밥통 공뭔, 재벌,대기업의 단단한 카르텔(?)  때문이겠지요. 순시리와 길라임 때문이기도 -.-+  미국은 커녕 중국에 비해서도 낙후된 후진국 수준이라 보면 됨.


개발자 스펙 

그런 척박한 환경에서도 스타트업회사가 개발자에게 요구하는 건 많습니다. (어찌보면 당연하지만..) 

- 영어가 되야합니다. ( 최신 기술이나 정보는 모두 영어입니다) 
- 특수(미래,수익창출이 기대되는)  분야에서  발군의 실력을 지녀야 합니다. (이 사람들은 키플레이어들이며 국내에 손가락에 꼽습니다. 가끔은  그 사람때문에 투자가 이루어 지기도 합니다.그러므로 이건 극히 예외되는 항목이라고 볼 수 있습니다.) 
- 위 정도는 아니더라도 자신의 주요분야에서 나름의 실력을 지녀야 합니다.(마음가짐이라도)
- 기술 쉬프트가 빨라야합니다. 이 기술 저 기술을 기민하게 대응해야합니다.
- 일을 즐겨야합니다. 일에 스스로 긍정적이어야 합니다. 주도적이어야 합니다.


장,단점


장점 :

- 다양한 기술, 선도적인 기술을 해 볼 기회가 상대적으로 많다.
- 어려움 속에 회사가 성공하게 되면 명예가 생긴다. 금전적 성공은 인센티브나 지분여하에 따라서 다르다. 
- 상대적으로 수평적이며 눈치볼일이 없고  사람간의 스트레스가 적다.
- 시간에 쪼드린다. (항상 그러진 않다. 오히려 성공한 스탓업들은 업무시간이 짧기도 하다. 짧고 굵게 ) 
- 좋은 사수 or 동료를 만나면 시너지가 듬뿍듬뿍 생긴다.


단점: 

- 위에 써있다사피 성공 할 확율이 거의 없으며, 성공해도 큰 돈은 1인자의 몫이 크다.
- 스타트업인지 알았는데 그냥 인력팔이 회사인 경우가 많다.
- 너무 다양한 업무를 맞게되어 그것에 적응하지 못하는 스타일일 경우 많이 힘들어진다.
- 안정과는 거리가 멀다. 돈도 쪼들린다.상황에 따라 안받을 각오도 해야한다.
- 책임감이 크게 다가온다. 많은 사람들이 북적북적한 일터에서는 간혹 뭍힐 수 도 있겠으나..



 개인적으로 생각하는 스타트업과 벤처의 차이 

0. 특정기준에 의한 벤처등록 및 법이 존재한다. 스타트업은 그런게 없다.

1.벤처와 의미가 거의 같다고 봐도 무관.

2.다만 벤처는 구시대적인 느낌이 있다. IOT 라든지 신조어가 사람,시장을 흥분시켜 확장하는데 유리하다.

3.벤처법에 "이러이러하면 벤처"인데 그 조건에 못미치는 더 초기의 아이디어 기업.특히 투자 받기전의 상태.(일정규모의 투자와 이익이 발생하면 벤처등록이 가능. 벤처등록을 의도적으로 안하기도) 투자받고서도 2번의 이유로 계속 스타트업 명함 유지.

4.모바일시대에 더 소규모,무규모 젊음이들의 창업이 빈번해짐. 그 특성을 반영하여 2번에 해당하는 신조어 확대

5.벤처가 기술이라면 스탓업은 아이디어 느낌. 물론 느낌적으로 그렇다는 것이고 둘 다 양쪽이 중요.


 스타트업 취업을 원하시는 분들에게 요약 한마디 

본인이 자기 주도적이지 않다면 스탓업은 어울리지 않습니다. 어떤 서브 체계(소스콘트롤,배포자동화등등) 가 없거나, 좋은 언어,프레임워크,기능이 없어서 필요하다고 느끼면 본인이 구축하고 전파시켜야 하는곳이 스탓업입니다. 따라서 스탓업에서 그러한 환경들이 없는것은 별로 문제가 안되는 반면 그런 논의를 즐겨하지 않고 ,수동적, 수직적, 야근 분위기가 조성된곳은 스탓업이 아니거나 이미 SI로 기울어 졌다고 생각하면 될꺼 같습니다.  조심하고 피해야합니다  




From terry 



강자와 약자 대신 빠른 자와 느린 자로 구분

 

21세기를 '광속시대또는 '속도의 경제시대'라고 르고 있고'스피드 경영' 확산되고 있다세계적인 래학자 앨빈 토플러는 이제는 강자와약  대신 빠른 (The Fast) 느린 (The Slow) 구분하는 세상으로 바뀌고 있다고 진단하였다

21세기 시간관리는 복합적 목표를 지향하고 있다지금까지 산업사회에서 우리가 배워온 시간관리는 관점이 비교 단순했다예를 들면 하루24시간을 어떻게 하면 뜰하게 보낼 것인가어떻게 낭비시간또는 놀고 쉬는 시간을 줄이고 업무시간을 늘일 것인가  생산성 향상 위한시간관리가 대부분이었다.

그러나 정보화사회에서의 시간관리는  목적 자체가 달라지고 있다어떻게 하면 적은 시간으로 성과를 내고 유시간을 창조할  있을까상대방(고객) 시간을 려주며 만족도를 높일  있는 방법은 어떤 것일까유시간을 어떻게 활용해야 재충전에 효과적일까이런 문을 해결하기 위한 시간관리가 바로 정보화사회의 새로운 관점이라고   있다사실 고객만족(CS) 높이 위해서는 물리적 시간보다 심리적 시간을고려해야 한다고객이 원하는 시간의 기준점을 파악하는 것이 중요하 때문이다

 

시간가치 계산을 통한 중요성 인식

 

'시간은 돈이다(Time is money)'라는 말은 분명한 진실이다시간의 경제적 가치를 따지는 방법은 여러 가지가 있다나는  간에 얼마  벌고 있나나는 한시간에 얼마  쓰고 있나지금  시간에  일을 안하고 다른 일을  얼마를   있나우선   가지 방법으로 간가치(Time value) 계산할  있다 번째 질문은 소득개념이고  번째 질문은 비용개념이다그리고  번째 질문은 시간의 기회비용을 따져보는 것이다.

시간의 경제적 가치를 따져보는 것은 시간자원의 중요성을 인식하는데 도움이  뿐만 아니라 실제로 시간자원을 배분하는데 판단의 기준이 되기 때문에 중요한 의미가 .

 

'속도의 경제' 생명으로 하는 디지털시대를 맞아 이제 우리의 '()테크'  차원 높아져야  것이다그래야 경쟁력도 높아지고 삶의 질도높일  있다바쁘게 사는 것은 누구에게나 가능하다사실 바쁘게 내는 것보다 쉬운 일은 없다중요한 것은 시간을 얼마 효율적으로그리고 효과적으로 쓰느냐는 것이다간관리는 이미 오래 전부터 개인과 조직의 생산성 향상을 위해 도입되고 실행해온 것이지만 특히 21세기 지식정보화 사회에서는 시간관리의 초점이 '스피드' '타이밍그리고 '우선순위'결정에 맞춰지고 있다.

 

스피드타이밍우선순위

 

우선 스피드는 '속도의 경제(Economies of Speed)'현상과 관련이 있다.

'빠른 자는 유리하고 느린 자는 불리하다', '시간단축이 바로 생산성 향상이다', '경쟁자보다 빨라야 선점 효과가 있다', '빠른 서비스가 고객을 만족시킨다이런 표현들은 모두 속도의 경제를 강조한 것이다.

오늘날 개인은 빠른 (The Fast) 느린 (The Slow) 나누어지고 있고기업은 빠른 기업(Fast Cycle Company) 느린 기업(Slow Cycle Company)으로 나누어지고 여기에서 경쟁력이 크게 갈라진다빠른 기업이 되기 위해서는 연구개발-생산--판매-서비스-철수  모든 활동영역에서 신속성이 보되어야 하고특히  활동 간의 연결부분에서 시간지 현상이 발생하지 않아야 한다.

개인이 빠른 자가 되기 위해서는 정보 입수-의사결정-무처리가 빨라야 한다개인의 경우 사용한 시간의 기록 통해서 시간 지체나 시간낭비가 나타나는 요인을 분석 내고 제가하는 기본기는 필수이다




자! 여기 우체국이 있습니다. ( 우체국 내부(OS) 는 알 필요 없고 외부 직원은 싱글쓰레드, 손님은 개별 유저라고 봅시다. )

1. 싱글쓰레드 - 동기 

우체국 하나가 여러 손님을 처리한다고 생각해 봅시다.
손님1 이 짐을 처리할때까지 손님 2 는 기다려야 합니다. 손님 3도 그 뒤에 기다리겠지요.
이게 싱글쓰레드-동기 처리입니다.
손님 1이 짐을 받을 때까지 손님2,3,4,5 는 아무것도 못합니다. 답답합니다..따라서 이 난국을 해결하고자

2. 멀티쓰레드 - 동기 
우체국을 손님 수 만큼 만듭니다. 
이제 손님1 은 우체국 1에서 몬가를 처리하고, 손님2 는 우체국 2에서 처리 한다고 칩시다.
이제 기다리지 않아도 됩니다만.. 먼가 깨림직하죠? 그렇습니다. 우체국을 너무 많이 만들다보니 성능이 망가집니다.
손님이 1000명이면 우체국도 1000개가 되야합니다. 이게 기존의 가장 대중적인 웹서버의 처리 방식이었습니다.

3.싱글쓰레드 - 비동기 
우체국은 1개이나 , 손님1이 티켓을 끊고 집에가서 기다립니다. 손님2 도 티켓 끊고 집에가서 기다립니다. 손님 100까지 모두 그러합니다. 우체국에 손님1의 우편이 도착하면 손님1에게 알려줍니다. 손님1은 우체국에 와서 처리합니다. 그 다음 손님 88에게 먼가가 생기면 알려줘서 처리합니다.네 우체국 1개 가지고 처리가 됩니다. 손님들이 우체국앞에서 하염없이 기다리지 않게 되었습니다. 우체국을 더 지을 필요도 없게 되었습니다. 기술적으로 이런 방식을 멀티플렉싱,Selector 라고 합니다. 
좀 더 기술적으로 들어가서 티켓의 종류는 (쓰기,읽기 등) 이 있는데 쓰기 티켓을 가지고 있는 손님에게는 우체국이 "너 이제 쓸 수 있어"라고 말해주면 손님은 와서 쓰게 됩니다. Reactor 라고 합니다. 일단 쓰고 난 후에 기다렸다가 우체국이 " 니가 쓰라고 했던거 다 썼다" 라고 말해주는것을 proactor라고 합니다. 윈도우에서 IOCP 가 이런 형태 입니다.

4. 멀티쓰레드 - 비동기
이 방식은 우체국을 1000개씩 마구마구 늘리는게 아니라, 위에 싱글쓰레드-비동기에서 처리하는 방식의 우체국을 대략 10개정도만 만들어서 각 우체국이 비동기로 처리하는 방식입니다. 기술적으로 상황에 따라서 cpu 갯수 * 1~4 정도로 잡으면 됩니다.
상식적으로 생각해봐도 가장 성능이 좋겠지요.

마지막으로 그렇다고 모두 멀티쓰레드-비동기로 할 필요는 없습니다. 
때와 상황에 맞춰서 그냥 싱글쓰레드-동기나 멀티쓰레드-동기로 해도 충분할 경우도 많습니다. 쓸 때 없이 복잡해질 필요 없죠.
웹개발에 있어서도 비동기(Reactive) 가 유행하면서 점점 복잡해 지고 있습니다. 우리나라 현실에서 그 파도에 올라타기까지는 꽤 오래 걸리겠지요.



가끔 개발자 커뮤니티보면 수학을 해야 하나요? 수학적 사고가 개발에 필수인가요? 등 수학 고민글이 보입니다.

전 그때마다 야구 선수가 100m 달리기 기록에 집착하는듯한 느낌을 받곤 합니다.


소프트웨어 개발자로써 학창시절이나 학원시절부터 지금까지 컴파일러구현을 못해봐서 혹은 나만의 정렬 알고리즘을 개발해보지 못한 불안감은 없으십니까? 객체지향설계/자료구조/알고리즘 직관력 부족에 스스로 자괴감이 들진 않으신가요. 왜 정작 소프트웨어개발자가 해야할 고민은 안하고 다른 고민에 불안을 느끼고 계신건가요.


진짜 수학이 필요한 일부 종목의 선수들은 아예 고민을 안하고 있어요. 공부를 하고 있죠. 그게 당연히 필요하니깐요.하지만 대부분의 소프트웨어개발에서는 필요가 없습니다. 필요한 대부분의 수학적 지식은 고교 수준도 안됩니다. 즉 사칙연산, 루트,시그마,표준편차,단순확률,단순미분(기울기) 정도 일 뿐입니다. 혹시 더 깊은 지식이 필요가 있을때 못한다고 해서 불안해하지 말아요. 현업에선 애초에 깊이있는 수학지식이 필요한 모듈에 대한 개발 지시를 하지 않을 것이며 ,  당당하게 못한다고 하거나 시간을 왕창 주세요 공부하게. 라고 말하면 됩니다. 부끄러운일이 아닙니다. 우리 주종목이 아니에요.


그 시간에 우리 주종목에 대해 소홀함이 없는가를 먼저 고민하세요. 자료구조,알고리즘,운영체제, 컴파일러,데이터베이스,객체지향같은 코어 및 재귀에 익숙해지기, 소프트웨어 트랜잭션은 어떻게 발전하는가? SSH 내부 작동은 ? JIT 란 무엇인가?  B-tree, R-Tree ? 우선 요소 5개 빨리 찾기 같은 알고리즘 등 요소기술에 더 관심을 갖길바라며  문제해결능력도 수학보다는 IQ퀴즈문제집들 이나 세상 돌아가는 신문을 보는게 더 낫습니다.  더 중요한건 자신이 지금 now  해결해야하는 문제 해결에 흠뻑 빠지는것이구요.


이제 한 문장으로 시원하게 고민 해결 해 드리겠습니다.

수학공부 안해도 됩니다.   재미로 하세요


p.s

이 글을 쓰고 바로 지울까도 생각했습니다.왜냐면 수학을 살짝  부정적인 시각으로 바라본 글이라 느껴서인데요..사실 수학은 단순 공식 외우는데에 있는게 아니라 세상이 돌아가는 모든 곳에 밀접한 연관이 있기 때문입니다. 그러기 때문에  소프트웨어 개발자가 아니라 모든 사람들은 수학을 가까이 두어야 합니다.  언론인, 중개업자, 정치인, 의사, 토목기술자들 , 가게주인..모두 자신이 하는 일에 수학적 사고방식이 필요하기때문에  사실 딱잘라 필요하다, 필요없다 말 할 수 없는 주제라는건 아시리라 믿고 그냥 냅둡니다..




웹퍼블리셔는 없어져야  할 이상한 직군이라 봅니다.
웹디자이너 혹은  웹프론트엔드개발자군 둘중 하나로 편입되야 하며 후자라면
HTML CSS  AJAX Javascript 및 bootstrap angularjs 등을 함께 다루어야 하는 직군입니다. 그래야 시너지가 생기며 , 예를들어 AngluarUI 는 그럼 누가 할까요?  그리고 전자 즉 웹디자이너라면 HTML ,CSS 쪽에 더 특화된 웹디자이너 인 겁니다. 프로젝트 규모와 특성에  따라서 그래픽스와 HTML, CSS 로 분업하는 것 일 뿐.  포토샵,일러스트 디자이너가 아니라 명색히  웹 디자이너라면  HTML, CSS  까지 그들이 맡아야하는 롤입니다. 회사 크기나 프로젝트 규모에 따라서 저걸 한 사람이 하든가, 분업을 하든가 하겠지요.  

혹자는 반응형 ,표준 관련 일이 늘어 났으니 생겨야 한다라고 말 하겠지만.. 이건 좀 웃기는 일이죠.
백엔드 개발에서 Reactive 개념이 뜬 다고 해서 Reactive 백엔드 개발자라는 직군이 새로 생겨 나나요? ㅎㅎ


즉 프로젝트 규모,특성과 상관없이 나는 퍼블리셔라 HTML  CSS 밖에 못해,안해는 잘못된것입니다.  중간에 모호한말을 만들어서 직업훈련을 시키니 문제가 생기는거죠. 



국책과제 및 응용,융합IT 분야 예를들어 사물인터넷 분야등에도 소프트웨어 감리가 적용되고 있다. 그냥 TTA 같은 소프트웨어 테스트는 필요하다고 본다. 또한 백번 양보해서 비슷한 반복 업무를 하는 SI 경우는 필요 할 수 있겠 다 싶다. 뭐 공무원/공기업 관리자들의 전문성 부족으로 인해 ( 당연히 관리자니깐 ) 그런걸 내세웠겠지만..지금 구조에선 현재의 감리회사들도 결국 한계가 크다.

그래도 감리는 기술사가 한다고? 소프트웨어 기술사..
의학기술사 자격증따면 모든 의학관련된것을 감리 할 수 있겠나? 치과의사가 심장외과 감리 할 수 있겠나? 더군다나 신성장 부분의 소프트웨어 분야는 하드웨어랑도 밀접하게 이어지며 그 기술적 너비가 의학을 못지 않다. 근데 어떻게 감리한다는 건지 모르겠다.


그 분들이 내용을 보고 뭘 판단 할 수 있을까? 문서형식에 필요한 어떤 어떤 목록이 빠졌네요 정도 라는건 뻔한거 아닌가...그 많은 테이블 정보를 그 문서형식에 맞춰 베끼며 형식 타령하는 동안 경쟁사 및 남들은 다 저 앞에 있는데?

게다가 SI 조차 계속 수정되는 플젝이 많을텐데 상용화/연구분야 및 스탓업분야는 미리 모든것을 준비한 상태에서 하는게 아니라 순환적이며 개발하면서 진화한다.(개인적으로 SI 도 어느정도는 그렇다고 본다.갑사 업무전문가들도 사람이다.) 요즘은 타이밍이과 반복되는 과정속에서의 참신한 아이디어 도출이 가장 중요하다는걸 모르는가? 언제 미리 다 정하고 시작하나?

지금까지 쓰고보니 그분들을 까는거 같지만 아니다. 그 분들의 능력이 없다는게 아니다.
단지 슈퍼맨이 아니라는 거다. 좀 더 전문화가 필요하단 거다. 국가는 작아지고 그들의 시장을 키워야 한다.

결국 기업이 가장 잘하는데로 냅두란 말이다..많은 부분을 민간화 하란 말이다. 형식을 보지말고 내용을 보며 성과를 판단하란 말이다.

이렇게된 가장 큰 문제는 우리나라는 정부가 너무 크며 넓다. 게다 깊게 관여 한다.해당 분야에 대해서 잘 아는사람들에게 좀 넘기고 결과에 대해서만 관리 했으면 한다. 어떻게 그 모든것을 선택하고, 돈주고 감독하고 다 하나? (덕분에 허튼 돈도 많이 사용되지 않나? 문서만 완벽하면 멀하나? 해당 과제로 인하여 성공한 기업이 없는데 ..)

정부는 정부지원과제를 선별/관리하는 분야별 전문 민간기업을 키워야 한다. 즉 분야별 전문감사/평가회사를 만들어야한다. 그래서 그들에게 맡기고 그들을 경쟁시켜야 한다. 나라에서 손에 다 잡고 있기엔 세상은 너무 복잡하며 빠르게 변하고 있다.

ps.

장기간에 걸친 투자/연구가 필요한 기초연구부분 정도만 국가가 이끌도록 하자.


+ Recent posts