소프트웨어 품질 희생의 일상화

"그렇게 하는 게 좋은 건 알겠는데, 개발이 느려지잖아."

소프트웨어 프로젝트에 있어서 빠른 개발 즉, 효율성이 중요하다는 것은 누구나 공감하는 사실일 것이다. 수많은 방법론들과 도구, 라이브러리, 프레임워크들은 한결같이 ‘효율성’을 강조한다. 그렇다면 소프트웨어 제품에 있어서 효율성이란 무엇인가? 시간당 코드 라인 수? 일주일에 구현하는 기능의 수?

가장 간단하게 정의한다면, 시간당 추가되는 소프트웨어의 기능과 품질이 될 것이다.* 하지만, 많은 사람들은 이 효율성이란 기준에서 품질을 무시한다. De Marco가 Peopleware에서 언급했듯이, time-to-market 압박에 가장 먼저 희생되는 것은 기능이 아니라 소프트웨어 품질이다. 소프트웨어의 품질**은 고객이나 매니저의 눈에 띄지도 않기 때문이다.

물론, 현실적으로 기능에 대비해 품질을 희생할 수 밖에 없는 상황은 비일비재하다. 어느 날 갑자기 사장이 인터뷰를 통해서 다음달에 어떤 소프트웨어 제품이 나올 거라고 공언해놓고, ‘자 이제부터 이러이러한 소프트웨어를 만들어라’ 하면서 일감을 던져주는 것을 받아본 경험은, 소프트웨어 개발자로서의 경험이 어느 정도 있는 사람이라면 한번 정도씩은 있을 것이다. 이러한 문제가 너무나 심각해서, 어떤 사람들은 품질을 희생하는 것이 아니라 오히려 기능을 희생해야 한다고 얘기하기도 한다. 무엇이 옳든 간에, 소프트웨어의 기능과 품질을 둘 다 만족시킬 수 없는 상황에서 이 문제는 전형적인 trade-off 문제가 된다. 현재 개발자 커뮤너티의 대체적인 의견은 이러한 trade-off에 의한 품질의 희생은 불가피하며 iterative development를 통해서 극복이 가능하다고 생각하는 편이다.

문제는, 효율성을 이유로 들어 소프트웨어 품질의 희생을 일상화하는 경우다. 소프트웨어 품질을 일상적으로 희생하게 되면, 소프트웨어 라이프사이클이 이어질수록 소프트웨어 효율성에 나쁜 영향을 미친다. 결국에는 그 소프트웨어를 버리거나 그냥 대충 때우는 것 외의 대안이 없는 상태가 되어버린다. 물론 모든 소프트웨어가 긴 수명을 가지지는 않는다. 학교에서의 소프트웨어 프로젝트와 같은 일시적으로 필요한 단순한 소프트웨어나, 빠르게 사용자 요구가 변화하고 사라지곤 하는 웹 어플리케이션과 같은 경우에는 품질을 희생하더라도 별 문제가 없을 수 있다. 하지만 반대로, 긴 수명을 가지는 소프트웨어도 존재한다. 그러한 소프트웨어를 매번 버리고 새로 만드는 것은 프로토타이핑의 목적이 아니라면 매우 비효율적이다. 설령 어떤 목적으로 (이를 테면, 경험이 부족한 도메인의 실험적인 프로젝트) 매번 버리고 새로 만든다 하더라도, 그럴 때마다 기존의 것을 가능한 한 재사용하는 방식을 추구해야 한다.

소프트웨어의 품질이 지속적으로 효율성에 영향을 미치는 장기적인 소프트웨어 프로젝트에서, 소프트웨어 품질의 희생을 일상적으로 받아들이는 태도는 잘못된 것이다. 마치 고급 아파트를 지을 때의 마감공사를 조립식 건물을 지을 때처럼 대충하는 것과 다를 바가 없다. 이러한 태도는 소프트웨어 품질 자체에 관해 무지하거나, 소프트웨어 프로젝트의 수명에 따라 품질에 대한 태도를 다르게 해야 한다***는 사실에 대해 무지하거나, 소프트웨어 프로젝트의 수명에 대해서 착각을 하고 있기 때문에 발생하는 것이다.

어떤 사람은 소프트웨어 품질에 대한 태도가 단지 개발자 개개인의 ‘스타일’의 문제이고 이를 받아들여야 한다고 얘기한다. 물론, 특정 도메인에서 소프트웨어 개발을 지속적으로 해온 사람은 소프트웨어 품질에 대한 특정한 태도를 내면화하여 그것을 ‘스타일’로 가질 수는 있다. 하지만, 그것이 ‘스타일’이라고 해서 합리화될 수는 없는 것이다. 소프트웨어 품질에 대한 태도는 개발자에 따라 달라지는 것이 아니라 소프트웨어 제품 또는 프로젝트에 따라 달라져야 하는 것일 뿐이다. 여기서 ‘스타일’이라고 지칭되는 것은 사실상 ‘습관’에 불과한데, 대부분의 평범한 소프트웨어 개발자들은 자신의 습관에 따라 행동하고, 때로 특정한 도메인이나 특정한 소프트웨어 프로젝트에서는 그 습관을 통해 최고의 능력을 보여줄 수도 있다. 하지만, 뛰어난 개발자들은 그러한 습관을 내면적인 규칙(discipline)을 통해 극복하고, 도메인이나 소프트웨어 프로젝트에 따라 서로 다른 적절한 태도를 취하고, 어느 곳에서나 최고의 능력을 보여줄 수 있다.

결국, 장기적인 소프트웨어 프로젝트에서 조차도, 소프트웨어 품질 희생의 일상화를, 효율성을 근거로 하여, 합리화하기를 즐기는 사람들은 대체로 자신의 습관이나 부족한 능력에 대한 변명을 하고 있을 뿐이다. 정말로 뛰어난 개발자는 거의 항상 (최고가 아니라) 적절한 – 기능과 품질 양쪽 모두에서의 – 효율성을 성취할 수 있기 때문이다.

* 소프트웨어의 특성을 기능과 품질로 양분한 것은 논의의 간결함을 위한 것이다. 소프트웨어는 그 복잡성만큼이나 요구되는 특성들이 많다.
** 이 때, 소프트웨어의 품질이란, 소프트웨어라는 제품이 가지는 특성으로서의 품질이 아니라, 소프트웨어 자체의 품질, 굳이 예로 들자면 코드의 품질과 같은 내부적인 특성을 얘기한다.
*** 소프트웨어의 수명만이 소프트웨어 품질에 대해 요구되는 태도를 결정짓는 것은 아니다. 다양한 비즈니스적인 요구나 도메인에 대한 개발자의 지식 등 여러 가지 요소들이 모두 영향을 미칠 수 있다.

소프트웨어 품질 희생의 일상화 더 읽기"

An Interview with Tim Converse

Yahoo! Content group의 engineering manager인 Tim Converse가 Crawler trap과 redirection에 대해서 언급하고 있다.

Excerpted from An Interview with Tim Converse, part 2 (emphasis made by me):

JQ: You talked about comprehensiveness. There’s this perception that there’s the web that most of us see and then this dark web: the stuff that the crawlers don’t reach. How do we try to get that data into the index? Are there barriers that webmasters put up that they should avoid to help us better index the content?

A: At it’s simplest, webmasters aren’t aware of robots.txt and it’s uses. Redirection can also be problematic if people create content by creating lots of domains or hosts so we encourage people to organize their sites in many documents before they get a new host.

And of course, there’s also the issue of crawler traps which some people do intentionally but much more often, they’ve unintentionally created crawler traps….

JQ: …and a crawler trap is…

A: A crawler trap is something where you crawl a page and it has a link, usually in the same site that’s dynamically created and then you follow that link and it has another analogous link that’s dynamically created and often, just because people make mistakes, you’re attaching on another directory every time which doesn’t exist and takes you back to an automatically generated error page which has the same link. So you can fall into traps where there are an infinite number of pages that don’t have any content.

Another thing people can do to help us is, this is sort of geeky but, don’t make page not found pages that return a status 200.

JQ: I was just about to ask that. 404 pages back in the day, were these ugly grey things with block text that all looked the same and now they’re done up to look like regular pages to be more appealing to users.

A: We do actually have ways of detecting that but it’s a lot easier for us if a web server just says, "this page doesn’t exist" as opposed to creating a nice page for the user that to a crawler looks like any other page. In general, if the server tells us 404, then we discard it.

YQ: I worked for a company that used CIDs instead of cookies to follow users through the site and it turned out to be a disaster. We went from having pretty much every page indexed to hardly any. So what about CIDs and how they affect the crawlers?

A: If you have differences in the URL that don’t actually make a difference in the site, that can be hard for us to untangle. We’re getting better at it. One of the scenarios you’re talking about there would just create a lot of duplicates for us. So it’s nicer for us if we have one URL per actual content but we understand that you’re not designing this just for us. And we obviously do a lot of duplicate detection–actually, we do duplicate detection in a couple of different ways. Finding out if documents are the same; finding out if sites are mirrors of each other.

JQ: This question came up today on a mailing list that I’m on. The concern for this particular company is that they want to move their site to a new domain but they don’t want to become invisible for the next six months or year or however long it’ll take for people to point to their new website. What can we tell people like that?

A: We can tell them that in the future, if you actually want to move your site, you want to use a 301 redirect which will do as much of the right thing as we can.

YQ: What actually happens there? I’ve heard of companies who have used 301 redirects and yet their old pages continued to show up in the search engines anyway. Why is that?

A: The underlying problem is that people out there haven’t changed their links and search engines do pay attention to links.

I can’t give you a date, but we’re changing how we deal with redirects. The thing about redirects is that everyone thinks it’s obvious how a search engine should treat them and the obvious answer is not really that helpful. Any policy you develop with redirects is going to make someone unhappy but what we’re about to roll out we will pay better attention to 301 redirects and the exact problem you’re talking about should be less.

[In the time since we met with Tim, the team has rolled out a fix for 301/302 redirects. Documents will be handled by the new redirect policy as they are re-crawled and re-indexed and webmasters will start to see many of the sites change in the next couple of weeks. The index should be fully propagated within a month. See Tim Mayer’s Webmaster World presentation for details.]

An Interview with Tim Converse 더 읽기"

Sliding Gallery from Flickr

http://lastmind.net/beta/sliding_gallery/

팀 분위기도 어수선하고, 심심하고 해서, Kevin LeAjax-ready sliding gallery library를 이용해서 잡질을 약간 해보았습니다. Flickr (Flickr는 오늘도 다운타임이군요. 쯧쯧.)의 제 공개된 사진들을 연동하는 것이었는데요. 일단은 sliding gallery library를 활성화하고 데이터(즉, 사진들의 URL) 를 집어넣는, 그러니까 사용하는 js 파일을 생성하는 방식으로 만들어두었습니다. Flickr에서 데이터를 가져오는 부분은 Flickr.rb를 사용했습니다. (물론 ruby 라이브러리입니다.) 웹디자인은 그냥 라이브러리의 데모 페이지를 긁어왔으니 놀라시지는 않으시길 바랍니다.

동적으로 Flickr와 연동해주는 것이 최선이겠지만, 아직은 그럴 필요까지는 못 느끼고 있고, 귀찮은 면도 있어서, 적당히 돌아가는 것을 확인하는 정도로 그만두었습니다. 좀 더 public한 demo를 만들려면 물론 사용자 아이디를 입력받아주는 것이 좋겠지만, sliding gallery library 자체에도 몇가지 문제가 보이고 해서 일단은 hold하기로 했습니다. 당장 제 눈에 띈 library의 문제들은 다음과 같습니다.

  • 스크롤 크기가 static하게 정해져있어서, 사진 단위로 스크롤 되지 않는다.
  • Thumbnail 이미지들이 한꺼번에 로딩되서 수가 많아지면 페이지를 로딩하는데 한참 걸린다.
  • 처음 나올 큰 이미지가 html에 코딩되어있고, 적절한 Trigger를 발생시킬 지점이 없다. (전 직접 javascript로 코딩해넣었습니다.)
  • 클릭 이벤트 외에 스크롤 이벤트에 반응하도록 하는 콜백이 없다. (스크롤할 때 선택 이미지를 전환한다든가 하는 효과를 줄 수 없죠.)
  • 몇가지 버그들.

시간이 나면 제작자에게 컨택해서 얘기해보거나 직접 고쳐볼 요량입니다만, 귀찮아서 말이죠.

최근 들어 javascript 언어 기반의 라이브러리나 프레임워크들이 상당히 많아지고 성숙되고 있는 듯 하군요. Sliding Gallery library 같은 경우도 아직은 순수하게 따로 제작된 것들이나 상용 솔루션들보다는 못하지만, 조금만 더 다듬으면 재사용이 쉽다는 이익을 통해 그런 것들을 넘어서는 것도 시간 문제인 것 같습니다.

Sliding Gallery from Flickr 더 읽기"

A Brief Look at C++0x

Bjarne Stroustrup의 글 A Brief Look at C++0x에서는 C++ 프로그래밍 언어의 다음번 표준안인 C++0x에 대해서 소개하고 있다. C++0x에서의 변경사항에 대한 기본 원칙들을 먼저 설명하고, 언어상의 변화, 그리고 라이브러리상의 변화 순으로 내용을 전개하고 있으므로, C++0x에 관심이 있는 사람이라면 반드시 한번 읽어봐야할 글이다.

C++0x에 들어갈 라이브러리상의 변화에 대해서는 이 블로그에 여러번 적었기 때문에 이 글에서는 언급하지 않기로 하고, 다만 언어상의 흥미로운 변경사항들에 대해서 간략하게 적어보기로 한다.

Template alias (a.k.a. template typedefs)

template<class T> using Vec = vector<T,My_alloc<T>>;

template을 많이 활용하기 시작하면서 가장 먼저 느끼게 되는 불편함 중의 하나가 특정 template의 특정specialization을 반복해서 사용해야하는 경우가 잦아진다는 것이다. C/C++ 프로그래머가 이 때 떠올리는 것은 typedef 시스템이다. 즉, template의 specialization은 typedef로 재정의할 수 없을까? C++0x에서는 typedef 키워드를 사용하지는 않았지만, using 키워드를 사용해서 이러한 요구를 반영하고 있다.

template parameter의 끝에 달라붙는 >가 반복될 경우에 space가 더이상 필요하지 않아진 것도 눈여겨볼 만한 점이다.

Sequence constructor

Vec<double> v = { 2.3, 1.2, 6.7, 4.5 };

n1711문서를 소개하는 글에서도 언급을 했지만, array나 struct 뿐만 아니라 일반적인 user-defined type도 initializer list를 사용한 construction이 가능해졌다. 이를 통해서 array를 써야하는 경우는 거의 없어지고, vector 등 container들의 활용 가치는 훨씬 높아지리라고 예상된다.

Concepts

template<Container C, Predicate Cmp>
    where Can_call_with<Cmp,typename C::value_type>
    void sort(C& c, Cmp less);

최근 부각되고 C#, D 등의 언어에서는 이미 활용되고 있는 programming constructs 중 하나인 concepts는 C++의 커다란 특징 중 하나인 template의 강점을 더욱더 강하게 만들어주는 특징이 될 것이다. C++ standard library나 체계적으로 만들어진 C++ 라이브러리들에서는 이미 concepts의 개념이 항상 문서화되어왔었고, C++0x에서는 다만 그것을 프로그램 상에서도 명시 그리고 강제를 할 수 있게 해준 것이다. 이를 통해서 프로그래머가 생각하는 바를 좀 더 명확하게 표현할 수 있고 오류에도 무엇이 문제인지 좀 더 명확하게 표현될 수 있을 것이다.

Automatic type deduction

for (auto p = v.begin(); p!=v.end(); ++p)
    cout << *p << endl;

static typing을 사용하는 언어라고 해서 불필요하게 변수의 타입을 선언해야하는 것은 아니다. 주어진 context에서 컴파일러는 타입을 deduce해낼 수 있기 때문이다. auto라는 키워드가 그리 마음에 들지는 않지만, 당연해 보이는 루프 변수의 타입 따위를 기억해내는 데 노력을 들일 필요가 없어진다는 것은 마음에 쏙 든다.

More Information

그동안 C++0x의 라이브러리상의 변화에만 관심을 기울여서 언어상의 변화에는 소홀했었는데, 여러가지 고무적인 변화가 많은 언어상의 변화쪽에 흥미가 생기기 시작했다. Draft와 Issue 리스트를 살펴봐야할 듯 하다.

A Brief Look at C++0x 더 읽기"

Vim 7의 새로운 기능 사용하기

Vim 7을 설치하더라도 기존 버전과 달라진 점을 쉽게 깨닫기는 힘들다. First look at Vim 7이라는 글을 참고하여 Vim 7의 새로운 기능을 쓰는 방법을 간단하게(?) 정리해보았다.

Spellcheck

:help spell
Spellcheck 기능에 대한 도움말.
:set spell spelllang=en_us
Spellcheck 기능 켜기.
zg
cursor 위치의 단어를 good word로 취급. (zug로 undo)
zw
cursor 위치의 단어를 wrong word로 취급. (zuw로 undo)
z=
cursor 위치의 단어를 대체하는 추천 단어를 리스팅.

Undo branches

특정 시간이나 변경수를 이용하여 undo/redo가 가능해진 기능. 자주 쓸모가 있을 것 같지는 않다.

:help undo-branches
Undo branches 기능에 대한 도움말.
:undolist
undo. 기존의 u와 동일.
g-
undo. 기존의 u와 동일.
g+
redo. 기존의 Ctrl-r과 동일.
earlier 3
3번의 변경 이전으로 undo.
later 3
3번의 변경 이후로 redo.
earlier 3s
3초 이전으로 undo.
later 3h
3시간 이후로 redo.

Tabs

탭기능.

:tabnew
새로운 탭 추가.
gt
다음 탭으로 이동.
:tabdo %s/oldvariable/newvariable/g
모든 탭에 특정 명령(replace) 수행.

Etc.

Ctrl-x Ctrl-o
code completion. html element 같은 경우에는 잘 동작하지만, 프로그래밍 언어에서는 어떻게 동작하는지 잘 모르겠다.
:sort
라인들을 알파벳순으로 정렬.

Vim 7의 새로운 기능 사용하기 더 읽기"

아기고래쿠아 클리어



아기고래쿠아 클리어, originally uploaded by Joseph Jang.

아기고래쿠아는 한때 인기를 끈 외국의 플래시 게임인 아쿠아리움이 생각나는 게임. 플레이 방식은 상당히 달라서 커서키를 사용해 먹이를 먹어야한다. 9레벨과 10레벨에 등장하는 상어를 피하는 것이 극악이긴 하지만, 운만 좋다면 클리어도 가능하다. 한번 도전해보시길.

아기고래쿠아 클리어 더 읽기"

Holly Cole – Make It Go Away

JukeonHolly Cole – Make It Go Away

Make it go away or make it better
Isn’t that what love’s supposed to do
Make it go away or make it better
Cause I would do either one for you

This is not the way you should see me
This is not the face I recognize
Could I lay my head down here for a moment
Would you sing to me like I’m your child
Cause I’m not angry I’m not crying
I’m just in over my head
You could be the angel that stayed on my shoulder
When all of the other angels left

Make it go away or make it better
Cause I am waking
This more then one should have to take
If you do this for me then I will promise
I’ll make it go away for you someday

There are reasons silver linings
There are lessons but I don’t care
Cause I just need a hand that I can hold onto
When it’s darker then death out there

I’m so cold
And so far away from my home
But tonight you’re
You’re where I belong
You’re everything right
When I’m everything wrong

Make it go away or make it better
Isn’t that what love’s supposed to do
Make it go away or make it better
Cause I would do either one for you

Make it go away or make it better
Isn’t that what love’s supposed to do
Make it go away or make it better
Cause I would do either one for you

Holly Cole – Make It Go Away 더 읽기"

Ghost Recon: Advanced Warfighter, First Look

Ghost Recon: Advanced Warfighter는 Ghost Recon 시리즈의 3번째 작품입니다. Ghost Recon은 기본적으로 FPS이지만, 명령을 통해 팀원을 컨트롤하고, 주로 야전을 중심으로 벌어지는 점이 특징이라 하겠습니다. 아무래도 개활지에서 전투가 이루어지다보니 적의 공격 방향을 알려주는 계기가 있었던 것도 특징이었죠. (물론 사운드만으로 적의 위치를 파악 가능하게 해주는 것이 최선이겠지만요.)

GRAW는, 전작이 고만고만한 그래픽으로 나왔던 것에 비해서, 상당히 훌륭한 그래픽을 자랑합니다. 또, 전작들이 연출에 거의 신경쓰지 않았던 반면, 급박한 상황을 잘 연출하고 있습니다. 특히, 이번 작품은 아예 2013년을 배경으로 하고 OICW나 XM8, UAV와 같은 여러가지 첨단 무기들이 등장합니다. 게임 진행 난이도는 Normal로 선택하더라도 상당히 어려운 편입니다. 저같은 경우에는 머신건 벙커를 못깨서 첫 미션에서 헤메고 있는 중이죠. 전작에서도 느꼈지만은 부하들 일일이 명령내리는 것은 너무 귀찮습니다. 자기가 머신건 벙커에 뛰어들어서 죽어버리면 체크포인트로 돌아가야하는 난감함이 발생한다죠.

Ghost Recon: Advanced Warfighter – Outnumbered and Outgunned

Ghost Recon: Advanced Warfighter Trailer

Ghost Recon: Advanced Warfighter, First Look 더 읽기"

Medical Specialty Apitude Test

Medical Specialty Apitude Test는 말그대로 Medical Specialty를 결정하기 위한 테스트입니다. 저랑은 별로 관련 없지만, 여자친구가 같이 해보자고 해서 해보았습니다. 왠지, 사람들이랑 잘 어울릴 필요가 없어보이는 과들로 결정이 된 듯한 느낌이…

RankSpecialtyScore
1radiology41
2neurology39
3neurosurgery39
4endocrinology39
5allergy & immunology39
6infectious disease38
7general internal med37
8dermatology36
9pulmonology36
10cardiology36
11nuclear med36
12plastic surgery36
13psychiatry36
14pathology35
15gastroenterology35
16preventive med34
17thoracic surgery33
18aerospace med33
19physical med & rehabilitation33
20hematology33
21nephrology32
22emergency med32
23otolaryngology32
24rheumatology32
25ophthalmology32
26pediatrics31
27urology31
28anesthesiology31
29radiation oncology30
30med oncology30
31orthopaedic surgery30
32obstetrics/gynecology30
33general surgery29
34occupational med29
35colon & rectal surgery29
36family practice28

Medical Specialty Apitude Test 더 읽기"

What is Your Perfect Major?



What is Your Perfect Major?, originally uploaded by Joseph Jang.

What is Your Perfect Major?란 테스트를 해본 결과. 말그대로 자신에게 적합한 전공이 무엇인가를 알려주는 테스트인데, 개인이 그냥 만든거라서 그다지 신뢰가 가지는 않는다. 어쨌든, 내 결과는 철학, 수학, 사회학 정도. 별로 마음에 들지는…

What is Your Perfect Major? 더 읽기"