기획자님. 복잡한 기능 요구시 최소한의 테스트 케이스는 작성해주세요

기획자가 복잡한 기능을 글(혹은 문서)로 써왔다.
근데 이 기능을 수식화(알고리즘) 하는 작업은.. 개발자가 해야하는 걸까? 기획자가 해야하는 걸까?

당연히 개발자가 수식화하겠지?
그럼 개발자가 수식화해서 코딩을 했다치자.

실제로 제대로된 결과값이 나오는걸 기획자가 검증할 수 있을까?
결과값이 ‘모’아니면 ‘도’처럼 제한되어 있다면 쉽게 검증하겠지만..
파라미터가 여러개고, 결과값 또한 여러 가지라면?

개발자가 테스트 코드를 작성했다고 하지만,
그건 개발자가 만든 것이다보니 기획자의 의도가 투영이 안되었을 수도 있다.

파라미터 A가 ’1′이고, 파라미터 B가 ‘철수’면
기획자의 의도대로는 ‘꺄~~~ 조인성!!’이 나와야 하지만
실제 작성된 코드로는 ‘송혜교 겁나 이뿌다’가 나올 수도 있다는 얘기.

그 겨울 바람이 분다. 조인성

결국은 기획자가 QA를 해야하는데, 그럼 수식은 기획자가 짜야하는걸까?
그건 아니다.

이때까지(고작 11년 밖에 안되는 짧은 시간이지만) 경험에 비추어 보면,
대부분의 경우 기획자는 그냥 툭 던지고 가버린다.

예를들어 지하철 노선도 프로그램을 만든다고 치자.

기획자는 “‘길찾기’기능 필요해요~”라고 툭 던지고 가고..
개발자는 그냥 열심히 만든다.
열심히..
뚝딱뚝딱..
밤을 새가며
키보드 부셔져라
코딩한다.
그래서 완성했다.

근데 ‘길찾기’ 검증은 어떻게 하지?

‘그걸 기획자가 왜 검증해?’라고 생각했다면
난 되묻고 싶다. ‘당신 기획자 맞습니까?’
제대로 동작하는지 당연히 확인해야지.

소소한것들은 잘도 쪽쪽 찝어서 테스크 생산 해주시는데 (예를들어 버튼이 좌측으로 1px 밀려있다. 응? 이건 디자이넌가? 암튼 뭐 이런것들)
복잡한 기능의 ‘검증’은 그냥 개발자를 믿어버리는(떠밀어버리는)것 같다.
종종 ‘검증’을 아에 잊어버린 것 같다고 느낄 때도 있다.

위에도 썼지만 기능을 기획한 사람이 검증도 할 수 있어야 한다.
옛말에 결자해지라고.. 쿨럭;;

그러므로 ‘이게 좀 복잡한 기능이다~’ 라고 생각이 들면 테스트 케이스를 미리 만드는것이 바람직하다.
만들기 귀찮다고?
그래도 만들어야한다. 우리는 완성도 높은 제품을 만드는 공통 목적을 가진 팀이 아닌가?

개발자 믿는다고?
개발자는 기본적으로 커뮤니케이션 능력이 떨어지는 경우가 많고, 기획서(암호문)를 구독(해독)해서 이해하는 능력도 떨어지는 경우가 많다. (이건에 대해서 별도의 포스팅을 할려고 하는데.. 뭐 봐서)
분명 서로 오해하는 경우가 생긴다.

“개발자를 이해시키면 안되요?” 라고 생각할 수도 있다.
개발자가 이해를 해야 개발에 들어갈 수 있으므로 설명은 당연히 해야하는 것이다.
기획서 휙 떤져주고 가면 안된다.

네비게이션 길찾기 처럼
파라미터와 결과값이 너무 방대한 경우라 하더라도 테스크 케이스는 만드는것이 좋다.
간략하게 본인집과 동사무소가는길, 본인집과 시골집가는길 등등으로 말이다.

만약 테스트 케이스 만들기가 너무 막막하다면
개발자에게 도움을 요청해서 함께 만들어 보는것도 괜찮은 방법이다.

개발시 테스트 케이스가 있다면
개발자는 불안감 없이 개발할 수 있고(검증을 믿을 수 있으니깐)
기획자 또한 빠른 시일내에 제대로 된 프로그램을 받아볼 수 있게 될 것이다.

가장 중요한 것은, 검증은 기획자만 하는게 아니다.
기획자, 디자이너, 개발자 등 팀원 모두가 함께 해야하는 것이다.
소소한 것부터 복잡한 기능까지 모두 함께 하는 것이다.
우리는 완성도 높은 제품을 만드는 공통 목적을 가진 팀이고 거기서 보람을 느끼는 족속들이기 때문이다.

“팀웍이라는게 뭐야?
그저 도와주고, 막아주고 그런걸로 되는거야?”

“그렇게 생각하는 녀석들도 있겠지만 말야,
나에겐 입에 발린 말이라는 생각밖에 안들어.

각자가 자신이 할 수 있는 일을 죽을 각오로 한 뒤에,
‘난 다했다. 다음은 네 차례다. 못하면 죽여버릴거야!’
라고 말할 정도의 기합이 있고서야 비로써 팀웍이라는게 형성되는게 아닐까?

그렇게 생각하면 우리는 각자 한 마리의 외로운 늑대들이라고 해도 괜찮지 않을까?”

- 원피스, 조로와 쵸파의 대화 中

태그 지정됨 , , , , , , ,

Javascript로 링크 및 AJAX구현시 Fallback Link를 제공해야 하는 이유

f1e4ccf2bb4122e22aba7f35653d5494

Javascript로 행해지는 Action의 결과물이 서버(Server)로 요청(Request)하는 행위라면 Fallback Link를 함께 제공해주는것이 안전하다.

서버로 요청한다는것은, 단순히 UI를 위한 스크립트가 아니라는 말이다.
즉 페이지 이동 하거나, 값을 전송하기 위함인데
필자는 단순히 UI변경하는것보다, 서버로 값을 전송하는게 더 비중있는 일이라고 생각한다.
그 이유는 대다수의 경우 서버로 값을 전송하는것이 Action의 Goal인 경우가 많기 때문이다.
그러므로 난 Fallback Link를 제공해야 한다고 주장하는 것이다.

예를들어
로그인 버튼을 누를시 Javascript를 이용해 서버에 값을 전송하는 환경이라고 하자.
근데 어떠한 이유에 의해서 Javascript가 동작을 안한다면
이 유저는 로그인을 할 수 없게 되는것이다.

자, 그럼 Fallback Link는 무엇이냐?
아주 간단하다. javascript로 동작하는 a태그의 href에 유효한 url을 입력하는 것이다.
그러므로 Click 이벤트가 일어나는 모든것은 Clickable한 객체로 마크업을 하는것이 바람직하다.

Fallback Link는 언제 동작하는것이냐?
이것 또한 간단하다. Javascript가 동작하지 않는 상황을 대비하는것이다.

근데 솔직히 말하면 브라우저가 자바스크립트를 지원하지 않아서, 자바스크립트가 미구동되는 경우는 거의 없다.
하지만 자바스크립트 문법 에러가 나서 동작하지 않는 경우는 꽤 있으므로, 이에 대한 대비로 봐도 된다.
뭐 사실 갖다붙이면 여러가지 이유가 있겠지만..
결론적으로 말하면 자바스크립트 미구동에 대비하는걸로 인해 생기는 부수적인 효과들이다.

돌아와서 Fallback Link제공의 간단한 예를들면

<a onclick="like('comment', 1)" href="#">Like</a>

이렇게 된걸 아래와 같이 수정하는것이다.

<a href="/like" data-action="like" data-content-type="comment" data-content-id="1">Lik</a>

$("a[data-action='like']").click(function(e) {
    # do something
});

단순히 Fallback url을 제공했다고 끝나는게 아닌다.
해당 url이 실제로 동작을 해야 한다.

서버단에서 요청된 Header정보를 보고 Ajax인지 아닌지 판단하고,
여부에 따라서 응답을 달리 해주는 작업을 해줘야 한다.

무슨말인고하니,
보통의 경우 Ajax 응답만 작업했을것이고, 해당 코드는 아래와 같을것이다.

$("a[data-action='like'][data-content-type='comment'][data-content-id='1']").addClass("selected")

하지만, url을 타고 요청이 왔을 경우 유저는 하얀 화면 혹은 위 JS코드가 출력된(?) 화면을 보게 될 것이다.
이럴경우를 대비해야 한다는것이다.

기획단에서 어떤 페이지로 렌딩(Landing)할 것 인지, 먼저 정한 다음
해당 페이지를 렌더링(Rendering) 혹은 리다이렉트(ReDirect)해주면 된다.

Rails에서는 그냥 몇글자 추가해주면 되지만..
보편적인(?) PHP로 예를들면

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    // Ajax Process
}
else {
    // Page Redirect
}

이 정도?
PHP 코드 출처: http://davidwalsh.name/detect-ajax

사실 이런 내용은
Graceful Degradation, Unobtrusive Javascript
같은 방법론들이 얘기하는것과 일맥상통하기도 한다.

태그 지정됨 , ,

개발자에게 이런 질문(부탁) 하지마! 제발! 쫌!

본 포스팅은
반말로 작성되어 있습니다.
그리고 개발자 입장으로 편중된 글로 다소 싸가지없게공격적입니다.
그렇다고 맹목적으로 기획자와 디자이너를 까고자 하는 글은 아닙니다.
이 글의 쓴 의도는 기획자와 디자이너가 개발자를 이해하게 되고, 결론적으로 더 완성도 높은 프로덕트를 낼 수 있는데 도움이 되었으면 하는 마음에 쓴 글입니다.

서비스 오픈 할려는데 서버 구축 비용 얼마나 들어?


우녀: 이게 CPU에요?
중남: ㅋㅋㅋ
좌남: 뭐?
출처: http://article.joinsmsn.com/news/article/article.asp?total_id=3436698&cloc=

그럼 난 되묻고 싶다.

  • 평균적으로 한 페이지당 트래픽 얼마나 소모되?
  • 예상하는 UV는?

이 질문에 답할 수 없어?
그럼 그 만큼 서비스 준비를 안 했다는 반증이야.

시장 예측도 안 하고 무슨 서비스를 오픈해.
“일단 오픈부터 하고 보자”라고?
그래 린(lean)하게 가는건 좋아. 근데 이건 린하게 하는게 아니야.

서비스를 빨리 오픈하고자 하는 성급함 때문에
마땅히 준비해야 할 걸 준비 안한거야.

예상 유저수와 백단(서버)에서 어떤 프로세스가 돌아가는지 알아야
서버 스펙과 라인(트래픽)을 정하지.
그냥 서버 나와라 뚝딱 하면, 뚝딱 나오는거 같지? ㅋㅋ

위 질문은 마치 가정주부한테
“상하수도 공사하는데 비용 얼마나 들어?”
라고 밑도 끝도 없이 앞뒤 다 짤라먹고 질문하는거나 마찬가지야.
아니 가정주부가 그런걸 어떻게 알어 -_-;

얘기가 산으로 갔는데 돌아와서..

일단 개발자는 서버구축을 하는 사람이 아냐.
서버구축을 하는 분들이 있어. 우리는 이들을 SE라고 불러.

규모가 작은 회사는 어쩔 수 없이 개발자가 서버 구축도 하겠지만.
우리가 흔히 말하는 개발자의 일은 “소프트웨어 개발”이야.
그런 개발자에게 서버 구축 비용에 대해 물어본다?
근데 트래픽에 대한 준비도 안되어 있다?

그렇다면 이 질문을 한 기획자는 제대로 된 기획자가 아냐.
개발자가 무슨 일 하는지도 모르는데.. 그게 기획자야?
아 그래 그래. 개발자랑 친해서 그냥 참고나 할려고 물어본 거라고?

근데 말이야. 내가 위에 적은 2가지 질문있지.
그거에 대해서 스스로 답할 수 있다면 말이야.
그냥 본인이 직접 호스팅업체 홈페이지가서 견적 뽑아봐.
홈페이지 가면 다 나와있어. 괜히 개발자 괴롭히지 말고 말이야.
확실하게 알고 싶으면 홈페이지 잘 찾아보면 전화번호나 메일 주소가 있거든.
거기에다가 위에 적은 항목들을 말해주면, 그 쪽에서 스펙이랑 라인은 알아서 추천해줌과 동시에 비용도 알려줄꺼야.

사실 우리들도 위 적은 정보들을 이용해서 각 업체 홈페이지들에 접속해서 알아보는거야.

프린터(인터넷)가 안되는데 어떻게 해?

아직까지 이런 기획자, 디자이너 심지어 개발자중에도 있더라.
개발자가 프린터 AS기사님이니?

토너(잉크)가 떨어졌는지, 용지가 떨어졌는지, 종이가 씹혔느지
직접 확인해봐. 그리고 직접 해결해볼려고 좀 해봐.

프린터가 안 잡혀?
프린터 제조사 홈페이지 가면 Driver있거든? 그거 다운받고 설치해

지들은 왕족이고, 개발자는 무슨 하인이냐?
문제만 생기면 다 개발자한테 부탁해.
개발은 언제 하라고?

본인들이 알아서 문제 해결할려고 노력이라도 해봐.
해보고 해보고 해봐도 안되면 그때 도움 요청해.
그리고 도움 요청할때 그냥 도와줘요! 하지 말고.

  • 어떻게 했더니 문제가 생겼다
  • 이러이러한 시도들을 했다
  • 원인은 xx인거 같다.

등등의 정보를 알려줘.
그래야 개발자든 아니든 도움을 받은 사람이 “아 이사람이 이 문제를 해결할려고 노력했구나”라고 생각하고 도와주고, 똑같은 작업 두번 반복 안 하게 되자나.

아.. 이렇게 반문하는 사람이 있을꺼야.
“쉽게 빨리 해결해 줄 수 있는 사람이 있는데, 그 사람한테 부탁해서 빨리 해결하는게 좋지 않냐? 그래야 시간도 아끼고”
그래.. 너의 시간은 소중하고 남의 시간은 안소중하냐?

개발자들은 몰입해서 코딩을 하는데..
하찮은 부탁 때문에 몰입이 깨지고,
그로인해 스트레스 받고,
짜증나지만 이런걸로 짜증내면 속좁은 사람으로 보일까봐 짜증도 못내고..
기껏 해결해줬더니, 또 다른거 해결해 달라고 하질 않나,
고맙다는 말이라도 들을 수 있을라나,
그렇게 더러운 기분으로 일할려고 자리에 앉으면 바로 일이 되겠니?
더군다가 다시 몰입하는게 쉬운 일도 아냐.

가장 지혜로운 해결책은, 각 회사마다 각종 기자재 관리하는 팀이 있을꺼야.
예를들면 총무팀? 이런곳에 문의해.
작은 회사라서 그런거 없다고? 그럼 본인이 해결할려고 노력 좀 해줬으면 좋겠어.

무능한 개발자로 만드는 질문들.

1_(2)

기술에 대한 이해도가 전혀 없이 질문을 하는 경우가 더러 있어.
그럼 개발자들은 대부분 짜증썩인 부정적 대답을 할 수밖에 없다~

“그거 못해요”, “못만들어요” 라는 말만 하게 되기 때문에
개발자의 자존감도 낮아지고.. 주변의 눈치를 보게 되.
무능한 개발자로 낙인 찍히면 누가 좋아하겠어?

“저 개발자한테 물어보면 맨날 안된데, 실력이 떨어지는거 아냐?”
이런 소문 돌까봐 속으로는 끙끙거릴 수도 있다는 말이야.

하지만 우리같이 순진한(?) 엔지니어들은
“기술에 대한 이해도 없이.. 터무니 없는걸 가져와서 만들어 달라고 하는거야!!”
라고 윽박지르거나 자신의 입장을 피력하지 못하는 경우가 대다수야.
왜냐고? 위에 적었자나.. 멍청순진해서 그래 ㅋㅋ

암튼 이런식으로 서로에 대한 감정의 골만 깊어지게 되면
결국 크게 한번 터져 걷잡을 수 없는 파국으로 치닫고 둘은 결혼해서 행복하게 살았습니다.
응? 뭐 암튼 그렇다는거야. 요지는 알겠지?

사람마다 다르겠지만 대다수의 개발자가 그래.
못믿겠다고? 그럼 이때까지 일한 개발자들을 떠올리며 생각해봐.
곰곰히 생각해봤는데 아냐? 그럼 우수한 개발자와 일하고 있는거야.
감사의 마음을 담아서 커피나 한잔 사줘봐봐 ㅋ
개발자들은 대다수 공돌이들이라 커뮤니케이션 능력이 딸리거든
당신은 축복받은거야.

결론은.
기획 및 디자이너들이여 제발 기술에 대해 이해를 하고 기획하고 그림을 그려라!

최소한의 기술은 좀 익히자.

응?

그래. 얘기 나온 김에 좀 더 해보자.
한 자동차 디자이너가 있어.
이 디자이너가 겁니 예술적으로 쌈빡하게 차를 디자인 했어.

그런데 이 사람의 디자인대로 차를 만들면..
엔진 놓을 곳이 없고, 사람은 운전자 한명도 간신히 타며, 에어로다이네믹은 전혀 고려가 안된 차량이 된다면…
이 사람을 디자이너라고 할 수 있을까?
그래 예술가라고 할 수 있을지는 몰라도, 산업 디자이너는 절대 아니라고 생각해.

자동차 디자이너가 LSD의 작동원리와 세팅법, 서스펜션의 bar와 스프링 장력의 관계 등등 같은건 몰라도 되.
하지만 자동차를 디자인하기 위해서 최소한으로 알아야 할 것들이 있는것 아니겠어?
예를들면 FF, FR, MR, RR, 쿠페, 세단 뭐 이런거? (주변에 자동차 디자이너가 없어서 적절한 예인지 모르겠지만..)

웹도 마찬가지야. 최소한으로 알아야 할 것들이 있어.

javascript 바라지도 않어.
html, css코드 작성은 아니더라도 원리 정도는 이해해줘.
코드를 읽을 줄 알면 더 좋지만 여기까지도 안바래.(적어도 나의 경우엔 말이지)
inspector같은 툴도 자유자재로 사용할 줄 알고 말이야.

이 정도도 힘들어? 그럼 개발자 그만 괴롭히고 다른 직업 찾아봐줬으면 좋겠어.

사실 이것들 말고도 수없이 많어. 알고 있지? ㅋㅋㅋ
하지만 이 정도만 할께.
뭐 소스들이 계속 모이면 시즌2로 돌아올 수도 있지만, 안그랬으면 좋겠어.

아무튼, 제발 우리한테 이런 무리한 요구는 하지 말아줘!!

우리는 톰 크루즈도 아니고, 톰 크루즈가 되고픈 마음도 없어!

태그 지정됨 , , ,

Sorcery로 OAuth시 Landing page

왕복선을 엎은 747기 착륙 모습Sorcery를 이용해서 Facebook 로그인을 하는데..

로그인 성공 후 로그인한 페이지를 landing page로 할려고 하는데.. 이게 안되는거야.

session에 referer를 넣어놓았는데.. 값이 계속 초기화되.

이상하다 싶어서 Sorcery 까보니깐.. 아니나 다를까.

Sorcery가 reset_session을 하고 있었어 -_-;

https://github.com/NoamB/sorcery/blob/master/lib/sorcery/controller/submodules/external.rb#L58

그리고 위 코드 보면 알겠지만 session[:return_to_url]에 담아서 return url을 관리하고 있어.

우린 그냥 편하게 redirect_back_or_to만 사용하면 끝나.

정리를 하자면..

이건 그냥 Sample 코드니깐. 알아서 적용하고.

핵심은

  • store_location 위치 및 하는 일
  • session[:return_to_url]
  • redirect_back_or_to

사실 읽어보고 별거 없네? 생각했지?

근데말이야.. 이 내용 문서에 언급이 안되어있어 -_-

그리고 지금 생각난건데, 꽤 오래전에 이 이슈로 삽질했던게 이제서야 기억났어. -_-

쩝. 암튼 이 내용 Github wiki에 올렸는데 아마 짤리겠지? ㅋㅋㅋ

태그 지정됨 , , , , , ,

현재 운영중인 Rails(3.x) Project에 Ruby 2.0.0 적용하기

설치는 ruby 2.0.0-P0 설치하고 rbenv에 적용하기. 참고.

우선 Bundler를 업데이트 해줘야 한다.

$ gem install bundler --pre

–pre옵션은 현재 기준이고, 어느정도 시간이 지나면 필요 없을 수 도 있다.

설치된 bundler 버전은 ~> 1.3.0이면 된다.

 

그리고 난 후 bundle install을 할려고 하면 아래와 같은 에러 메세지가 나올 확률이 높다.

bundle install시 open SSL에러 메세지

/Users/hiphapis/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:917:in `connect’: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

openSSL이 때문인가 해서 openssl과 curl-ca-bundle를 최신버전으로 설치해줬는데

여전히 똑같은 에러메세지가 난다.

흠. 나에겐 이 문제를 해결할 만큼의 시간적 여유가 없다.

그냥 우회하자.

Gemfile을 열어보면 최상단에 source가 지정되어 있는데.

여기 프로토콜이 https이다. 이걸 그냥 http로 바꿔버린다.

Gemfile Before


source 'https://rubygems.org'

Gemfile After


source 'http://rubygems.org'

그리고 나서 bundle install 하고 나서 rails s띄워보면 별 문제 없이 잘 뜨는걸 확인할 수 있다.

ruby 2.0.0 깔고 rails s 성공

dyld: Library not loaded: /usr/local/lib/libltdl.7.dylib

brew upgrade하고 났더니..
곧곧에서 문제가 터지고 있는데 ㅋㅋ

dyld: Library not loaded: /usr/local/lib/libltdl.7.dylib
  Referenced from: /usr/local/bin/identify
  Reason: image not found
Trace/BPT trap: 5

아래와 같은 메세지가 Rails log에 계속 쌓이고..
이 프로세스 때문에 서버 속도도 느려지는 문제가 생겼다.

일단 ImageMagick문제인건 알겠는데..

convert 명령시 에러남.

검색을 해보니 유사한 케이스도 별로 없고..
그나마 최신것 중에 검색결과가

http://issues.collectionspace.org/browse/CSPACE-5884

이 녀석이다.

여기서 하는 말은 별다른거 없고

  1. XCode 설치하고
  2. Command Line 설치하고
  3. XQuartz 설치하고
  4. brew 설치하고
  5. brew로 libtool 설치하고
  6. brew에서 imageMagick 지우고, 다시 설치해라

인데..

이때까지 아무문제 없이 잘 쓰고 있던 나로썬 당황스러울 수 밖에.

brew upgrade를 할려고 했더니 XQuartz가 구버전이라 최신버전으로 업데이트 했었는데.

고로 의심이 가는건 세가지.

  • brew upgrade
  • XQuartz 최신 버전 설치
  • imageMagick 최신 버전

뭐 암튼 엄청난 삽질을 했는데,  생각외로 간단하게 해결했다.

그냥 imageMagick 버전을 예전에 문제없이 잘 쓰던것으로 바꿔줬다.

brew info imagemagick

로 설치되어 있는 버전들 확인

brew info imagemagick

과거 문제 없이 사용하던 6.7.7-6 로 스위칭!

후 imageMagick 문제없이 잘 되는지 확인!

brew switch imagemagick 6.7.7-6

convert

사실 궁극적인 해결은 아니다.
좀 더 집중적으로 파서 무엇이 문제인지 알아내야 겠지만..
일단 문제는 해결되었고, 그럴 시간도 없다.
그저 imageMagick, Homebrew 중 한놈의 버그라는 추정밖에 -ㅅ-

태그 지정됨 , , ,

brew upgrade시 XQuartz때문에 upgrade가 안될때

brew upgrade했더니 XQuartz 에러나면서 upgrade가 안될때가 있다.

Unsatisfied dependency: XQuartz
Homebrew does not package XQuartz. Installers may be found at:

https://xquartz.macosforge.org

Error: An unsatisfied requirement failed this build.

이미지

이리저리 둘러보니깐 산사자(Mountain Lion)때 생기는 이슈인듯 하다.

해결방법은 간단하다. 최신버젼 XQuartz를 설치하면 된다

최신버전은 https://xquartz.macosforge.org/landing/ 에서 다운받을 수 있다.

참고링크: https://github.com/mxcl/homebrew/issues/14851


		
태그 지정됨 , ,
팔로우

모든 새 글을 수신함으로 전달 받으세요.

%d bloggers like this: