천재를 자신의 모든것을 바쳐 부단히 탁월성을 추구하는 사람으로 정의한다면 아버지도 천재고 나도 천재다. 여러분도 부단히 노력할 마음만 있다면 천재다.

 

 

대학시절 동기들은 종종, 소프트웨어 개발에 자신들이 재능이 없음을 하소연 했다.

그럴때 마다 나는 “소프트웨어 개발은 서울 4년제 대학에 입학할 정도의 재능만 있다면 누군나 할 수 있는 일이다. 중요한 것은 내가 재능이 있는 여부를 확인할 만큼 해보는 것이다.” 진짜 끝까지 해보고 안되겠다고 하는 거냐? 그냥 힘드니까 그만 두고 싶은거냐 묻곤 했다.

 

나는 뭐든지 끝을 보는 것을 좋아했고 그런 삶을 추구 하며 살아왔다. 

 

재능의 벽을 느끼고 있는 당신, 무언가 돌파구가 있는 당신에게 추천하고 싶은 책.

얼마간의 시간이 지난 후에 이 책의 저자에게 부끄럽지 않도록 열심히 살아야 겠다는 생각을 한 책.

 

총점 : 100점 (소장해야 할 책) 

 

 

매일 하는 회의, 반가운 친구들과의 만남, 컨퍼런스, 사교모임 살아가면서 수 없이 많은 모임에 참석하고 주최한다.

너무 흔해서 특별하게 여겨지지 않는 모임에 대한 깊은 생각이 담긴 책.

모임을 주최 하는 것에 대해 체계적인 가이드를 제공 한다는 점도 참 좋다.

 

  • 모임의 목적을 명확히 하라.
  • 목적에 맞지 않는 것을 사려깊게 배제 하는 것이 모임의 다양성을 만든다. 
  • 인원수는 중요하다
    • 6명 : 깊은 유대감을 쌓기 좋다. CEO 들의 사교 모임에 적합하다.
    • 12명 : 건설적인 이질성 신비감과 호기심을 불러 일으킬수 있다.
    • 30명 : 파티같은 시끌벅적하고 활기 넘치는 분위기가 생긴다.
    • 150명: 이때 부터 참석자는 청중이 된다. 부족, 군중이 형성되는 시기이다.
  • 모임은 손님이 모임을 인지하는 순간 시작된다.
  • 변화를 일으키는 모임은 논쟁을 두려워 하지 않는다. 

우리는 모여야만 자신을 도울 사람을 만날 수 있다.
그런데도 우리는 모든것을 잘 통제하고 있는 것처럼 다음 사람의 도움은 필요 없는 것처럼 행동한다.

가장 좋았던 문구.

컨퍼런스향 자아를 내려 놓고 진실된 마음으로 대할때 변화가 찾아 올것이다.

 

총평 : 99점 (기회가 된때 마다 주위에 선물 하고 싶은 책)

 

 

제목 : 행동하지 않으면 인생은 바뀌지 않는다.

저자 : 켈리 최

 

짧은 생각

 

자기 계발 서적을 주기적으로 읽는 편인데, 여러 책들에게서 하는 이야기는 비슷비슷 한 경우가 많다. 

그럼에도 나는 왜 주기적으로 자기 계발 서적을 읽는 것일까? 아는 것과 실행하는 것에는 차이가 있고 이를 리마인드 하기 위해 또 한권의 자기 계발서를 읽었다.

이 책에 관심을 가지게 된것은 순전히 '행동'이라는 키워드 때문이었다. 약 2년간의 신사업 런칭에 실패 한 것은 행동력이 부족했으니까. 

 

총평

이 책은 좋은 책이다. 두 번 읽을 생각은 없지만 몇가지 문장은 가슴속에 새겨 둘것이다. 

 

- 실제 행동으로 옮기는 사람은 극 소수다. 재능이 충분한데도 불구하고 용기가 없거나 낙담해서 행동으로 옮기지 않는 사람이 정말 많다. 

- 나 자신의 첫번째 후원자가 되어라

- 당신은 무엇이든 배울 수 있다.

 

어떤 사람에게 추천하고 싶은가?

 

- 몇년째 만날때 마다 사업 준비중이라는 친구에게

- 사회에 첫발을 딛은 사촌 동생에게

나의 Manifesto 

 

나는 불가능한 것이 있다고 믿기를 거부한다. 

그리고 무엇보다 해야할 일을 중요시 한다. 

 

나는 가장으로써 나와 가족의 건강을 돌보며, 가정내의 행복을 추구한다.

나는 소프트웨어 개발자로써 소프트웨어 개발의 탁월성을 추구한다. 

나는 프로젝트 매니저로써 가치 있는 소프트웨어를 지속적으로 전달한다.

나는 리더로써 구성원들의 발전을 이끌어 낸다.

나는 경영진으로써 대표이사를 보좌하여 회사가 올바른 방향으로 나아갈 수 있도록 감시 조력한다.

 


매일 아침 일어나 가장 먼저 나의 선언문을 낭독 혹은 필사한다.

처음에 두줄이었던 선언문이 지금은 꽤 길어 졌다. 

 

20년 가까운 사회생활에 나의 R&R은 시작보다 훨씬 다양해졌고, 나의 욕구 역시 복잡해졌다. 

이런 점들이 때로는 서로 보완하여 발전적인 상태로 이끌기도 하지만, 대부분 충돌하여 혼란스러운 상태로 이끈다.

 

충돌이 발생할때마다 선언문을 곱씹으며, 각 Role이 가지는 근본적인 가치를 훼손하지 않는 선에서 의사 결정을 하도록 노력한다. 

 

책을 읽기 전에, 

내가 생각하는 프로덕트 오너의 정의

  • Product 에 대한 최상위 의사 결정권자
  • Product가 나가야할 방향을 설정하는 전략 수립가
  • PM이 없는 경우 Management도 해야 한다.

이 책을 읽고 나면 PO에 대한 개념이 좀더 명확해 질까? 

 

책을 읽고 나서, 

내가 읽기전에 생각했던 것과 별반 다르지 않았다.

회사의 사정에 따라 PO의 역할 범위에 차이가 있겠지만, PO의 주요 미션은 Product가 나아가야 할 방향을 설정하는 것이고, 이를 전파 하는 것에 있다. 

스타트업 혹은 소기업인 경우에는 CEO가 PO를 겸임 하는 것이 바람직할 것이며, 실제로 PO라는 용어를 사용하지 않을 뿐 현실세계에서도 그렇게 동작하고 있다. 

 

이 책은 PO가 해야하는 일, 그리고 알아야 하는 일들에 대한 INDEX를 제공하고 설명한다.

그렇기에 내용을 깊이 있게 다루지 않는 아쉬움이 있지만, 그 자체만으로도 충분한 가치가 있다. 

 

Product "Owner"라는 새로운 용어/직함이 권워적이기에 거부감을 느끼는 사람도 있겠지만, 나는 최상위 의사결정권자라는 것을 명시하기에 좋은 용어라고 생각된다.

 

PO vs PM 

업무가 상당히 겹쳐보이기 때문에 차이가 없다 생각할 수 있다. 실제로 현업에서는 구분되지 않는 경우도 많다. 

하지만 이 두 Position은 많이 다르다.

 

PO는 Product의 방향성을 설정하는 것이 주요 임무이고,

PM은 Product 개발,운영을 관리하여 올바르게 실행하도록 하는 것이 주요 업무이다. 

 

권하고 싶은 사람들

창업가 및 회사 경영진들에게 한번쯤 권하고 싶다.

그리고 리더 포지션의 모든 이들에게 교양서적으로 권하고 싶다.

 

 

.nvmrc를 통해 무엇을 할 수 있는가? 


.nvmrc는 NVM(node version manager)의 개별 프로젝트를 위한 설정 파일입니다.

.nvmrc를 통해 특정 프로젝트에 사용되는 버전을 기술 할 수 있으면 NVM을 이용해 프로젝트마다 상이할 수 있는 node version을 빠르게 전환 하도록 도와 줍니다.


.nvmrc 사용법 


1. .nvmrc 파일 생성 

echo "8.9.0" > .nvmrc 


*8.9.0 text는 사용하시는 버전으로 대치하여 사용하시면 됩니다.


2. 기술된 .node version 사용하기 


nvm use


+ 만약 기술된 node version이 설치가 되어 있지 않다면, 아래의 명령어를 통해 설치 할 수 있습니다. 자동으로 use 명령어가 호출 됩니다.


nvm install 




https://stackoverflow.com/a/47303840


* 이 글은 위의 링크를 요약 번역한 글입니다. 


application/x-www-form-urlencoded


Default Content Type으로써, 이 Content Type을 사용하는 Form은 아래와 같은 규칙을 따라 값을 Encoding 해서 전송해야 한다.


[RFC1837]에 기술된 reserved characters들 규칙에 따라 Escape해야 한다. 


application/x-www-form-urlencoded type message는 하나의 큰 query string 형태로 서버에 전송된다. 

name/value 짝은 &로 구분되고 이름과 value는 =로 구분된다. 


예시 : MyVariableOne=ValueOne&MyVariableTwo=ValueTwo


application/x-www-form-urlencoded 은 사이즈가 큰 binary data나 non-ASCII 를 포함한 text data를 보내기 부적합하며, 이런 경우에는 "multipart/form-data"를 사용해야 한다. 


multipart/form-data


Note. 하위호환성을 비롯한 "multipart/form-data"에 대한 추가적인 정보는 [RFC2388]을 참고 하시길 바란다.


"multipart/form-data"는 [RFC2045]에 규약된 MIME data stream Rule을 따른다.


"multipart/form-data" 메세지는 여러개의 파트로 나뉘어져 있으며, 파트안의 data stream 에는 boundray text 가 나타나서는 안된다.

모든 multipart MIME type의 각 파트들은 선택적으로 "Content-Type"을 가질 수 있으며, "text/plain"을 기본값으로 한다. 

User agent는 charset parameter를 포함하는 "Content-Type" header를 전달 해야 한다.

componentWillMount is deprecated.




React Native를 업그레이드 했더니, componentWillMount등이 deprecated 되었다는 메세지가 떴습니다.

공식 홈페이지에서 내용을 살펴 보니, 이번에 deprecated 된 lifecycle method목록은 다음과 같습니다. 


1. componentWillMount

2. componentWillReceiveProps

3. componentWillUpdate


공식 문서에 따르면 UNSAFE_componentWillMount로 이름을 바꿔서 사용할수 있다고 하지만, 16.x버전까지만 사용이 가능하며, 17버전 부터는 완전히 사용이 불가능하다고 합니다. 즉 UNSAFE_보다는 가이드 되는 Method들로 변경해주는것이 좋습니다.


Simulator 상에서 해당 Message를 클릭하면, 대응해서 사용할 수 있는 method를 안내 해주며, 각각 Method에 대응되는 Method는 아래와 같습니다.


1. componentWillMount -> componentDidMount

2. componentWillReceiveProps -> getDerivedStateFromProps

3. componentWillUpdate -> componentDidupdate



React Native 공식 문서 : 


https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html


Redux Thunk? https://github.com/gaearon/redux-thunk


Redux Thunk는 Redux Action Creator를 비동기(Async)으로 사용하게 해주는 Redux의 Middleware다.


Redux Action Creator를 생성할때는 아래와 같은 규칙을 반듯이 지켜야 한다.


Action creator는 Function 이어야 한다

 Action creator는 action(type property를 가지는 object)을 Return 해야한다.


Redux Thunk를 사용하면 여기에 한가지 규칙을 더 추가하여 Action creator를 작성 할 수 있다.


  Action creator는 Function 이어야 한다

  Action creator는 action(type property를 가지는 object)을 Return 해야한다.

 + Action Creator는 함수를 Return 할 수 있으며 'dispatch' argument와 함께 호출된다.


즉, Redux Thunk를 이용하면, action creator가 호출될때, API 호출등의 비동기적인 작업을 수행하고, 그 결과를 dispatch를 통해 전달 할수 있게 된다.



1. Redux Thunk 설치


npm install --save redux-thunk


2. Redux Thunk Middleware 적용하기.


import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers/index';

// Note: this API requires redux@>=3.1.0
const store = createStore(
  rootReducer,
  applyMiddleware(thunk)
);


3.Redux Thunk의 사용 


function incrementAsync() {
  return dispatch => {
    setTimeout(() => {
      // Yay! Can invoke sync or async actions with `dispatch`
      dispatch(increment());
    }, 1000);
  };
}


React.js (http://facebook.github.io/react/)

: Facebook, Instagram 에서 사용하는 View Library. Data binding 이 가능하고, Light-Weight 로 강력한 성능을 자랑합니다.

요녀석 한번 써보겠다고, 삽질 좀 했네요 ;ㅂ; 여차저차 세팅을 완료 하긴 했는데, 썩 만족스럽지는 않습니다 ㅠㅠ


JSX 지원.

React.js 에서는 Human-Readable 한 코드 작성을 위해 JSX 란 문법을 지원합니다. 이놈이 문젭니다 ㅠㅠ

Developing 중에는 JSXTransformer.js 를 통해서 실시간 Compiling 을 하는데요, Production 에서는 pre-complie 후에 배포 하길 권고 합니다. 


여기서 Dev와Production간의 설정이 달라집니다. 


1. JSXTranformer.js 를 include 해줘야함. 

2. 개발에는 JSX 파일, Production 에는 JS파일을 include해야함.

2-1 script path가 달라짐

2-2 include 시에 JSX 는 type="text/jsx", JS는 type="javascript"가 되어야함.

3. Package 시에 시에 JSX -> JS compile을 해줘야함.


자 그럼 하나씩 해결해볼까요 ㅠㅠㅠ


1. JSXTranformer.js 를 include 해줘야함.

maven-resource-plugin과 property configure를 통해 include 여부 결정

jsp 는 template engine (tiles)를 통해 골격을 관리하고 있기 때문에 base template에서만 들어 있으니 쉽게 해결. 


2-1 script path가 달라짐

2-2 include 시에 JSX 는 type="text/jsx", JS는 type="javascript"가 되어야함.

[1]번 과 같은 방법으로 해결하고자 했으나, 해당 코드는 base template 에서 사용되는게 아니라 화면별로 들어 가야 되서 삶이 고달파짐 ㅠㅠ

maven-resource-plugin 과 property 를 통해 DEV/PRODUCT을 분기 하고, custom taglib를 통해서 코드 생성토록 함. 


3 Package시에 JSX -> JS compile

Facebook에서 제공하는 jsx command 를 maven exec plugin 으로 실행하도록 함. 

bds 에서 build 할때 goal 을 clean package -> clean exec:exec package으로 변경하여 deploy 하도록함. 

* 이부분이 특히 마음에 안듬 ㅠㅠ






+ Recent posts