모든 질병에는 그 원인과 이유가 있고 그에 따라 피해야 할 음식과 가까이 해야 할 음식, 즉 식이처방 지침이 있다. 이번 호에는 집중력과 기억력 향상을 위한 식이지침과 하루 종일 책상에 앉아 일하면서 생기는 허리요통을 위한 식이지침, 전자파 차단과 시력 향상에 위한 식이지침 등 개발자들의 업무와 생활 패턴에 맞춘 음식과 건강 이야기를 다뤄본다.

예전에는 먹고 사는 것이 문제였다면 이제는 ‘어떻게 하면 잘 먹고 잘 살 수 있을까’가 중요한, 이른바 웰빙시대다. 사실 웰빙이라는 것이 어려운 개념이 아니다. 자기 몸에 맞는 음식을 먹고 마음 편하고 행복하게 살 수 있다면 그것이 바로 웰빙이다. 문제는 내 몸에 맞는 음식이 무엇인지를 찾는 것이다. 특히 하루하루 전쟁과 같은 일상을 치러 내는 개발자에게 있어 ‘딱 맞는 음식’을 찾는 것은 건강 그 이상의 의미가 있다고 해도 과언이 아니다.

일반적으로 개발자들의 업무 패턴을 보면 하루 종일 책상에 앉아 근무하고 컴퓨터와 씨름해야 하므로 복부비만과 허리요통, 전자파에 항시적으로 노출되어 있다. 또한 시간에 쫓기며 생활하다 보니 제 시간에 식사하기 힘들고 단기간에 고도의 집중력을 필요로 하기 때문에 각종 영양소를 골고루 섭취하는 것이 사실상 불가능하다. 해외의 경우 업무에 맞는 식이요법 지침을 처방해 직원들에게 제공하는 기업도 있는 것으로 알려져 있다. 그러나 우리나라의 경우는 어떠한가. 기업이 이런 역할을 하는 것은 기대하기 힘들고 오히려 각종 매체와 TV 홈쇼핑 등에 건강보조식품, 영양보충식품이 난무하고 있는 실정이다. 그러나 아무리 좋은 약도 음식으로 섭취하는 것보다는 좋지 않으며 오히려 자기 몸을 너무 생각해 많은 양의 건강보조식품을 먹다보면 영양과잉으로 각종 질병에 걸릴 수도 있다.

디스크와 요통엔 순두부로 맞서라
영양사인 필자가 개발자를 바라보는 시각은 기본적으로 전문직에 대한 존경심과 동시에 안타까운 마음이 앞서는 것도 사실이다. 특히 장시간 컴퓨터 앞에 앉아 업무를 보다보니 운동량 자체가 부족하고 잘못된 자세 때문에 허리통증을 갖고 있는 경우가 많다. 요통은 과거 노인병으로 치부됐으나 현재는 대부분의 직장인들이 갖고 있는 직업병이자 습관병이다. 전 국민의 80%가 요통으로 고통받고 있다는 통계도 있는데, 개발자들의 경우는 이보다 더하면 더했지 덜하지는 않을 것이다. 허리는 우리 몸을 지탱하는 대들보로 우리 몸에서 체중 부담이 가장 심한 부위이다. 비만환자들이 요통에 시달리는 것도 이 때문이다.

개발자에게 문제가 되는 것은 허리뿐만이 아니다. 요즘 정형외과 의사들은 휴대폰 문자메시지를 통해 대부분의 의사소통을 하는, 소위 ‘엄지족’의 등장으로 때 아닌 호황을 누리고 있다고 한다. ‘문자 메시지 통증(TMI, Text Message Injury)’이라는 새로운 증상도 생겨났는데 협소한 공간에서 엄지손가락을 빠르게 움직이며 혹사시키다 보니 혈액순환 장애로 손가락이 부어올라 병원을 찾는 이가 늘고 있는 것이다. 개발자도 마찬가지다. 하루 종일 키보드에 손가락을 올려놓고 있어야 하므로 손가락 관절의 디스크도 경계를 해야 한다.

이러한 자세와 관련된 질병을 예방하려면 바른 자세와 생활 습관 교정이 필수적이다. 먼저 의자에 앉을 때는 무릎의 높이를 엉덩이보다 약간 높게 하고 허리를 곧게 세운 후 목선과 어깨선이 일직선이 되도록 해야 한다. 혹시 지금 다리를 꼰 상태에서 약간 앞으로 숙인 자세로 앉아있진 않은가. 이는 앉은 자세 중 가장 나쁜 자세이다. 또한 외근으로 운전할 때는 운전석 바닥과 등받이의 각도는 110도 유지한 상태에서 편안한 자세가 좋으며 핸들을 잡고 상체를 숙인 자세는 피하는 것이 좋다. 스트레칭도 매우 유익하다. 하루 종일 책상 앞에서 컴퓨터와 씨름하는 개발자들이라면 한 시간에 한 번 정도 의자에서 일어나 간단한 스트레칭을 통해 뭉쳐있던 근육을 풀어주면 혈액순환에도 큰 도움이 된다.

나쁜 자세가 오랫동안 지속되면 체중이 한쪽으로 몰려 인체의 골격계나 근육 심지어는 신경계까지 영향을 미치게 되며 체중이 많이 실리는 뼈에 노화현상이 빨리 오고 관절 통증과 목, 허리 통증을 유발할 수 있다. 또 근육이 경직돼 더욱 나쁜 자세를 만들게 되며 이러한 생활이 계속되면 그에 따른 합병증으로 척추 질병과 무릎 관절 또는 족 관절에 병변을 일으키기 쉽다.

이러한 자세 교정과 함께 중요한 것이 음식이다. 자세를 교정하면서 뼈에 좋은 음식과 나쁜 음식을 가려 먹는다면 개발자라는 직업적인 불리함(?)에도 불구하고 건강을 유지할 수 있다. 필자가 추천하는 뼈에 좋은 음식은 콩이다. 콩에는 뼈를 튼튼하게 하는 아이소플라본이 많이 함유돼 있어 골밀도를 높이고 골다공증을 예방한다. 콩으로 만든 음식이라면 된장, 콩나물, 두유 등 모두가 좋지만 특히 순두부에는 아리소플라본이 가장 많이 함유돼 있으므로 즐겨 먹을 것을 권한다.

콩의 효능에 대한 이야기는 수없이 많다. 세종 14년에 명나라 사신으로 파견됐다 돌아온 박신생이 전한 명나라 임금의 서한에는 다음과 같은 내용이 들어 있었다고 한다. “조선에서 보낸 궁녀들의 음식 솜씨가 매우 좋으며 특히 두부 만드는 법과 그 요리 솜씨가 절묘하다. 앞으로도 두부 잘 만드는 궁녀를 골라 보내 달라.” 일본의 유명한 전통 두부인 고지현(高知縣)의 당인두부가 임진왜란 때 납치돼 그 곳에 살았던 경주 성장(城將) 박호인에 의해 시작됐다는 사실도 널리 알려진 일화이다.

우리나라 두부의 종류는 매우 다양하다. 새끼로 묶어서 들고 다닐 수 있을 만큼 단단한 막두부, 젊은 여성의 고운 손이 아니면 문드러진다는 연두부, 콩즙을 끓일 때 약간 태워 탄내가 나는 탄두부, 굳히기 전에 먹는 순두부, 속살을 예쁘게 한다는 약두부, 명주로 싸서 굳히는 비단두부, 기름에 튀겨 먹는 유부, 얼려 먹는 언두부, 두부콩을 끓일 때 생기는 두부피, 찌꺼기로 남는 막비지, 막비지를 띄운 띄운비지 등 헤아릴 수 없이 많다. 그리고 이들을 이용한 두부요리는 우리들 식탁에 일상적으로 오르고 있다. 두부는 이제 국제 식품이 되어 미국 백악관 식탁에까지 올랐다는 보도가 있었으며 미국에서도 대형 두부 공장이 계속 늘고 있고 병원식으로도 이용 빈도가 높이지고 있다. 또한 한의학에서 말하는 요통에 좋은 음식으로는 연, 부추, 참마, 쑥, 개다래 등을 꼽을 수 있다. 연은 연잎을 건조한 것으로 10~15g을 400cc 물에 넣어 그 양이 절반이 될 때까지 달인 후 이를 1일 3회 식전에 마시면 좋다. 마늘과 함께 2대 강정식품으로 꼽히는 부추는 혈액 순환을 좋게 하고 요통에도 효과가 있는 것으로 알려져 있다.

한편 요통에 해로운 음식은 카페인 음료, 술, 담배, 패스트푸드 등이 있다. 목록을 보자마자 알 수 있겠지만 대부분의 개발자들이 즐겨 먹고, 마시고, 태우는 것들이다. 술과 담배의 해로움에 대해서는 여러 가지 알려진 사항들이 많지만 의외로 잘못 알려진 것들도 많다. 예를 들어 금연을 이야기했을 때 많은 사람들이 순한 담배라서 괜찮다고 피해가지만 실제로는 전혀 그렇지가 않다. 혹자는 이를 팩맨이라는 오래된 전자오락 게임에 비유하기도 하는데 뇌의 쾌락중추를 자극하기 위한 니코틴의 양은 일반적으로 정해져 있는데 니코틴 중독자는 어떤 방식으로든 하루에 필요한 양 만큼의 니코틴을 체내로 흡수하기 위해 마치 팩맨이 먹이를 찾아 끊임없이 이동하는 것처럼 순한 혹은 독한 담배를 소비하게 된다. 이 때문에 하루에 한 갑 피우는 사람이 흡연량을 줄이기 위해 5개피로 줄인다고 해도 몸은 한 갑 분량의 니코틴을 얻기 위해 이를 더 깊고 오래 피우게 되고 때때로 너무 깊은 흡연은 더 많은 타르와 독성물질을 흡입하는 역효과를 낳기도 한다. 결국 순한 담배라서 괜찮다는 말은 문자 그대로 핑계에 불과한 것이다.

스트레스, 피할 수 없다면 죽순을 먹고 견뎌라
“지금 스트레스 받고 있나요?” 직장인 열 명 가운데 아홉 명은 “네, 엄청난 스트레스에 시달리고 있어요”라고 대답할 것이다. 몇 주째 계속되는 기침과 오한, 원인을 알 수 없는 농포증(일종의 물집), 머리 한 쪽만을 집요하게 괴롭히는 편두통 등으로 병원을 찾으면 대부분의 의사들이 “스트레스 때문입니다. 스트레스 받지 말고 푹~ 쉬세요”라고 습관적으로 대꾸한다. 그러나 그것이 마음대로 된다면 이 세상에 스트레스를 받을 사람은 아무도 없지 않을까.

마인드 컨트롤로 안된다면 스트레스에 강해지는 음식으로 맞서보자. 피할 수 없는 스트레스라면 스트레스에 대한 내성을 키우는 것도 한 방법이다. 스트레스란 외부의 압력에 의해 내적으로 발생하는 긴장감을 말한다. 이는 삶을 살아가는 과정에서 자연스럽게 나타나는 것이므로 피할 수도, 거부할 수도 없으며 적당한 스트레스는 오히려 삶의 원동력이 되기도 한다. 그러나 이것이 지나치면 정신 건강을 해치고 신체적으로도 나쁜 결과를 초래한다. 스트레스에 강한 음식으로는 죽순, 마, 두릅, 연근, 청어, 조개류 등을 꼽을 수 있다. 이들 식품에 많이 함유돼 있는 티로신이라는 물질이 스트레스를 견디는데 긍정적인 효과를 나타내기 때문이다. 특히 죽순에 들어 있는 단백질에는 티로신이 많아 심리적으로 안정감을 주므로 학생이나 정신노동을 많이 하는 사람이 먹으면 좋고 변비 치료에도 효과가 있는 것으로 알려져 있다.

한편 스트레스가 심해졌을 때 나타날 수 있는 심리학적 증상의 하나는 바로 우울증이다. 우울증은 세계보건기구(WHO)와 하버드 대학의 연구 결과, 2020년 인류를 괴롭힐 3대 질병 중 하나로 꼽힐 만큼 치명적이며, 실제로 자살하는 사람의 80%가 우울증 환자이다. 미국 16대 대통령이었던 링컨은 친구에게 쓴 편지에 “인생을 하직하고 싶다”, “나는 너무 괴롭다”, “이 세상에 나보다 더 괴로운 사람이 있을까?”라는 글을 수없이 쓰면서 우울증에 시달렸고 네덜란드 출신 인상파 화가인 고호도 수많은 명작을 남겼지만 우울증에 시달리다 못해 결국은 자살하고 말았다.

우울감은 인간이 가진 기본적인 감정이지만 2주 이상 지속되면 정상적인 생활을 하지 못하게 된다. 우울증은 마음의 병이 아니라 뇌의 화학적 불균형으로 인한 질병이며 정상인은 신경전달 물질을 통해 희로애락을 느끼지만 우울증 환자는 신경전달 물질이 부족하거나 조화를 이루지 못해 감정의 기복이 심하다. 예를 들어 <화면 2>를 보면 정상인은 창밖을 보거나 날씨를 본다고 생각하지만 우울증 환자들은 벌을 받거나 인생이 너무 회의적이라고 생각한다. 일반적으로 우울증 증상은 3단계로 구분된다. 처음엔 우울하고 만사가 귀찮다가 2단계가 되면 ‘네 탓이야’라는 마음으로 분노와 적개심을 표출할 상대를 찾아 공격한다. 마지막 3단계가 되면 ‘내 탓이야’라는 생각에 적개심이 자기 자신을 향하게 되고 심한 경우 자살로 이어진다.

이처럼 극단적인 단계까지 치닫게 되면 전문가와의 상담이 필요하겠지만 평소 우울증에 좋은 음식을 꾸준히 먹어주는 것도 도움이 된다. 우울증을 개선하는데 효과가 있는 음식으로는 먼저 감자를 들 수 있다. 감자에는 비타민 C가 풍부하고 부신이라는 장기에서 생성되는 부신피질 호르몬의 생산을 촉진하는데 이 부신피질 호르몬은 우리 몸을 스트레스로부터 지켜주는 역할을 한다. 또 감자에는 판토텐산이라는 성분이 있어 부신에 비타민 C가 축적되는 것을 돕고 뇌의 작용을 정상적으로 지켜주는 비타민 B1도 풍부해 불안과 초조, 스트레스 등에 시달리는 개발자에게 권할 만한 식품이다. 특히 감자의 영양소는 열을 가해도 파괴되지 않는 것이 특징이다. 달래도 우울증에 좋다. 여기에는 비타민과 무기질이 골고루 함유되어 있으며 비타민 C와 칼슘이 풍부한 알카리성 식품이기 때문에 신경안정제와 같은 효과를 낸다. 된장국에 넣거나 나물로 먹어도 좋고 생즙을 내어 마시면 더욱 좋다. 이밖에 시금치는 칼륨이 풍부하고 초조함을 해소해 신경을 안정시키는 효능이 있으니 현기증이나 두통이 자주 일어나는 사람은 꾸준히 먹으면 좋다. 매일 우유를 마셔도 우울증을 예방할 수 있는데 우유에 포함된 칼슘이 중추신경의 기능을 촉진시키고 신경과 흥분을 진정시키기 때문이다.

전자파와 시력 저하를 막을 수 있는 음식들
기술이 발달하고 전자제품으로 둘러싸인 환경 속에 살게 되면서 전자파의 유해성도 하나하나 밝혀지고 있다. 전자파는 암까지도 유발할 수 있는 치명적인 것으로, 임신이나 태중의 아이에게까지 영향을 미쳐 유산과 기형아 출산을 유도한다는 보고도 있다. 개발자의 경우 사실상 전자파와 떨어져 살 수가 없는 상황이지만 몇 가지 전자파의 피해를 줄일 수 있는 방법은 있다. 먼저 컴퓨터로 일을 할 때는 최소한 60cm 이상 떨어지고 TV 또한 1.5m 이상은 떨어져서 시청해야 전자파로부터 덜 해롭다. 전자파의 에너지는 거리에 반비례해서 줄어들기 때문에 발생기로부터 멀리 떨어질수록 그 영향은 줄어든다. 멀리 할 수 없다면 노출 시간을 되도록 짧게 하는 것이 좋다. 그러나 개발자의 특성상 컴퓨터를 멀리할 수는 없는 법, 그렇다면 전자파를 해독할 수 있는 식품으로 스스로를 방어하는 것도 좋겠다.

주변에서 가장 쉽게 접할 수 있는 전자파 해독 식품은 녹차다. 여기에는 탄닌과 비타민 C, E 그리고 시스틴이 들어 있어 방사능에 대한 억제효과가 있는 것으로 알려져 있으며(이 때문에 원자력 시대의 가장 좋은 음료로 불리기도 한다) 전자파에 의한 인체보호 효과 가능성도 예견되고 있다. 이밖에 전자파 차단 선인장이나 숯을 책상에 하나 정도는 놓아두는 것도 좋다. 아직까지 전자파 차단, 해독효과에 대한 영양학적 연구결과는 없다. 그러나 전자파에 노출되어 있는 현대인의 눈에 좋은 음식은 주변에서 흔히 찾아볼 수 있다. 개발자들은 컴퓨터로 대부분 작업하여 시력 저하, 충혈, 안구건조증 등으로 고생하고 있다. 눈에 좋지 않은 음식은 간단하다. 대체로 미네랄이나 비타민이 함유되지 않은 음식은 눈에 좋지 않은데, 대표적인 음식이 술, 담배, 커피, 홍차, 아이스크림, 설탕, 콜라, 케이크, 정제된 밀가루가 들어간 음식 등이다.

이와 반대로 눈에 좋은 음식은 비타민, 미네랄 등의 영양소가 많은 음식이다. 비타민 A가 많은 당근, 고구마, 해바라기, 토마토, 해산물, 시금치, 파슬리 등은 야맹증을 예방하고 각막을 튼튼하게 해준다. 당근에는 체내에서 비타민 A로 바뀌는 카로틴이 풍부하게 들어 있는데 이 영양소는 눈의 피로를 풀어주는 작용을 한다. 카로틴은 기름을 넣으면 흡수율이 더욱 높아지므로 볶아 먹는 것이 효과적이다. 비타민 C는 눈의 피로를 덜어준다. 딸기, 감귤, 양배추, 피망, 양파 등 과일류와 채소류에 비타민 C가 많이 함유되어 있다는 사실은 다들 알고 있을 것이다. 눈의 조직을 보호하는 칼륨은 바나나, 사과, 꿀, 바나나 등에 많고 달걀, 생선, 치즈 등에 함유된 칼슘은 눈을 과다하게 깜박이는 증세, 눈의 염증, 결막염 등을 치료하는데 효과가 있는 것으로 알려져 있다.

집중력을 높이는 비법, 꽁치
개발자들은 업무 특성상 프로젝트 기간 중 일정 기간에 집중적으로 일을 해야 하는 경우도 다반사다. 이런 기간에는 밤샘도 예사롭지만 며칠씩 계속되는 밤샘과 철야 근무에 집중력은 점점 떨어진다. 이럴 때 자칫 예기치 못한 중요한 실수라도 하면 훗날 소프트웨어 테스트 과정에서 호된 곤욕을 치러야 한다. 집중력이 떨어지는 것은 개인적으로도 손해일 뿐만 아니라 오히려 나중에 더 큰 사고를 부를 수 있는 원인이 되는 것이다. 그렇다면 이런 때 단시간에 집중력을 높일 수 있는 비법은 무엇일까. 비밀은 철분이다.

철분은 혈액 중 헤모글로빈의 원료가 돼 뇌에 신선한 산소를 운반하는 역할을 한다. 산소는 포도당과 더불어 중요한 뇌의 활력소이기 때문에 철분이 부족하면 뇌의 활력이 떨어지고 집중력도 떨어지기 마련이다. 이럴 땐 꽁치에 주목해 보자. 꽁치는 불포화 지방산이 많고 단백질 함유량이 20%나 되며 붉은빛 근육에는 비타민 B1, B2, 철분이 다량 함유되어 있다. 또한 갑상선 기능을 좋게 하기 때문에 성격이 급하고 모든 일에 서두르는 사람에게 좋다.

집중력을 높이는 데는 ‘바다의 우유’라고 불리는 굴도 제격이다. 굴에는 다양한 영양 성분이 풍부하게 함유돼 있는데 철분, 아연, 칼슘 등이 고루 들어가 있어 간 기능을 개선하고 보혈 작용을 해 허약체질인 사람에게 좋은 것으로 알려져 있다. 그러나 생굴을 다량 섭취하면 비브리오균에 노출돼 식중독의 위험이 있으므로 주의해야 한다. 또한 비타민 E가 부족하면 기억력이 떨어지므로 잣, 땅콩 같은 견과류와 생무에 많이 든 아연이 기억력 향상에 도움이 된다. 또한 과식을 피하고 아침을 거르지 않아야 한다. 결국 기억력을 좋게 하려면 고르게 영양을 섭취하면서 과로와 폭음을 피하고 적당한 수면이 최선인 셈이다. 또한 레시틴이 다량 함유돼 있는 달걀 등도 효과가 있다. 그러나 곡류나 당질이 들어 있는 음식인 빵 등은 많이 먹지 않는 것이 좋다. 이런 식품은 혈액을 산성화시키고 비타민류를 대량 소비하기 때문에 쉽게 피로할 뿐만 아니라 안절부절 못하게 한다.

판단력과 지구력을 높이는 음식들
프로젝트의 막바지로 치닫을수록 개발자들의 일상은 하루하루가 중요한 판단의 연속이다. 꽁치 요리를 하루 세끼 식단으로 짤 수도 없는 노릇, 이럴 땐 올림픽 레슬링 금메달리스트인 심건호에 견줄 수 있다는 어린 아이들 체력이 부러울 뿐이다. 길고 긴 프로젝트의 막바지 판단력과 지구력이 중요한 순간, 우리의 몸은 이미 칼슘을 요구하고 있다.

칼슘은 눈이나 귀로 얻은 정보를 정확하게 뇌에 알리고 침착하게 판단을 내리는데 도움을 준다. 일반적으로 칼슘의 흡수를 돕는 역할을 하는 것이 비타민 D다. 이는 표고버섯에 다량 함유돼 있는 것으로 알려져 있으나 사실 일상적으로 햇볕을 쪼이면 피부 아래에서 자연스럽게 합성된다. 점심식사가 끝났을 때 햇볕을 쪼이며 하늘을 한 번 바라보는 생활의 여유가 중요한 것은 이 때문이다. 이렇게 칼슘이 보강된 상태에서 내려지는 판단은 기업의 이해에도 명확하게 부합된다는 사실을 적극 어필할 필요가 있다.

칼슘을 쉽게 보충할 수 있는 식품으로는 우리가 흔히 먹는 해조류, 즉 미역을 들 수 있다. 미역에는 칼슘과 요오드, 나트륨, 비타민이 풍부한데 특히 칼슘의 함량이 높아 정서불안과 스트레스 해소에 큰 도움을 준다. 미역 표면의 미끈미끈한 성분인 알긴산은 변비 치료는 물론 중금속과 오염물질을 몸 밖으로 배출하는 역할을 하며 이밖에도 식이섬유가 풍부하고 인체의 골격과 치아를 형성하는데 필수적인 칼슘과 정신을 안정시키는 칼륨, 암 발생을 억제하는 셀레늄이 들어 있어 요즘 건강식으로 주목받고 있다.

본래 미역이라는 이름의 유래는 삼국사기에서 찾아볼 수 있다. 고구려 시대에는 ‘물’을 ‘매(買)’로 대응해 썼으며 모양새가 여뀌의 잎과 비슷하다고 해 ‘매역(물여뀌)’으로 썼을 것으로 추정되는데 이것이 후에 미역으로 바뀌어 전해졌다. 이런 흔적은 미역의 제주도 방언인 ‘매역’에서도 엿볼 수 있다. 우리 민족에게 있어서 미역은 산모와 뗄레야 뗄 수 없는 관계이다. ‘초학기’라는 문헌에 보면 ‘고래가 새끼를 낳은 뒤 미역을 뜯어먹고 산후의 상처를 낫게 하는 것을 보고 고려 사람들이 산모에게 미역을 먹였다’고 적혀 있다. 또한 산모에게 먹일 미역은 값을 깎지 않고 상인이 산모용 미역을 싸줄 때 꺾지 않고 새끼줄로 묶어주는 풍습은 지금도 전해지고 있는데 이는 미역의 값을 깎으면 태어나는 아기의 수명이 줄고 꺾어서 주면 산모가 난산을 한다는 속설 때문이다.

올바른 식사 습관을 위한 가이드
흔히 아침은 꼭 챙겨먹으라고 한다. 아침식사는 쌀밥과 같은 탄수화물 위주가 좋은데 탄수화물은 천천히 포도당으로 변해서 혈액에 흡수되기 때문에 뇌에 가장 좋은 영양을 줄 수 있다. 또한 아침식사를 하면 치아가 맞물리는 저작 활동이 신경을 자극해서 뇌를 활성화시켜 두뇌 회전에도 좋다.

아마 대부분의 개발자들이 아침은 거르고 점심은 시간이 없어 간단히 먹고 저녁에 하루 동안 먹여야 하는 음식을 대부분 먹으며 밤에는 간단하게 맥주 한 잔을 하지 않을까 싶다. 그러나 이러한 식습관은 비만으로 갈 수 있는 지름길이다. 복부비만의 기준은 일반적으로 여성은 허리둘레 32인치 이상, 남성은 36인치 이상을 말한다. 특히 남성은 여자에 비해 내장층의 지방이 2∼3배 많고 대부분 음주(와 흡연)를 평균치 이상으로 하는 경우가 많아 복부비만이 나타나기 쉽다. 주로 잘못된 식생활과 불규칙한 생활습관, 운동 결핍 등으로 인해 기초대사량이 저하되어 있는 중년 이후에 나타나며 식생활과 관해서는 음주, 흡연 그리고 고지방식과 밀접한 연관이 있다. 복부 비만은 생활 패턴의 개선이나 운동요법으로 충분히 예방할 수 있다. 야식을 절대 피하고 하루 종일 앉아 있어야 한다면 하루 30분 이상은 걷는 것이 좋다. 다음은 올바른 식습관 지침 몇 가지를 추린 것이다. 어릴 때부터 꾸준히 교육받아야 하는 게 사실이지만 최근 자신의 식습관을 되돌아 볼 수 있는 기준으로 삼기에는 무리가 없을 것이다.




1. 아침, 점심, 저녁 삼시 세끼는 거르지 않고 골고루 모두 먹는다.
2. 인스턴트, 패스트푸드와 같은 음식은 삼간다.
3. 매운 음식, 짠 음식, 단 음식은 자제한다.
4. 먹는 속도는 천천히 한다. 25~30분 정도로 한다.

5. 돼지고기, 닭고기, 쇠고기 등 기름기가 많은 육류는 자제한다
: 솔직히 고기류의 섭취를 자제하기는 쉽지 않다. 먹을 것이 무엇이 있냐고 물을 수도 있다. 여기서 의미하는 자제는 먹지 말라는 것이 아니라 많은 양을 섭취하지 말라는 것이다. 고기류는 단백질의 중요 공급원으로 없어서는 안 될 중요한 식품이다. 적당량을 섭취한다면 몸의 근육을 만드는 데도 도움이 된다.
6. 섬유소가 많이 든 음식을 즐겨 먹는다
: 얼마 전까지만 해도 섬유소가 이슈였다. 섬유소는 장운동을 활발하게 도와 대장암을 예방하고 포만감을 주므로 비만예방에 좋으며 수용성 식이 섬유소를 먹으면 소장에서 당의 흡수가 느려져 혈당이 천천히 증가하므로 인슐린이 덜 필요하게 된다. 즉 당뇨병 치료와 예방에 도움을 준다.

7. 야채와 과일은 되도록 많이 먹자.
8. 물을 많이 마시자.
9. 술, 담배 등 카페인 음료는 끊지 못한다면 줄이자 : 앞서 언급한 것처럼 술과 담배는 백해무익하다. 술이 혈액순환에 좋다는 일부 연구결과가 있지만 이 때 술은 포도주 1잔 정도이지 우리가 마시는 엄청난 양의 술은 절대 아니다.


모든 영양학의 결론은 ‘골고루 먹자’
가끔 사람들은 필자에게 어떤 음식이 몸에 좋느냐고 묻곤 한다. 그러면 필자는 “어떤 음식이든 편식하지 말고 골고루 적당량 섭취하면 그보다 더 좋은 것은 없다”라고 대답한다. 실제로 모든 영양학의 결론은 ‘모든 음식을 골고루 먹자’는 것이다. 지금은 어떤 음식이 몸에 좋다고 TV에 나오기만 하면 그 식품의 판매량이 평소의 5배가 넘고 영양보조식품의 경우 대중매체를 이용하기만 하면 날개돋인 듯 팔린다. 이처럼 전문가인 영양사보다 대중매체에 의존하는 현대인들의 모습을 보면 필자가 일을 제대로 하고 있는 것인지 부끄럽기까지 하다.

그러나 몸에 좋다고 무조건 많은 양을 섭취하면 영양과잉의 문제를 낳을 수 있다. 대표적인 영양소가 비타민 C와 요오드다. 비타민 C의 일일권장량은 70mg 정도이고 상한량은 2000mg이다. 그러나 우리가 흔히 마시는 비타민 음료는 대개 500~ 1000mg을 함유하고 있으므로 하루 두 병 이상 마시면 비타민 C의 상한량을 초과하게 된다. 비타민 C를 과잉섭취하면 구토와 복통, 설사를 유발할 수 있으며 통풍과 신장 결석 등이 생길 수도 있다. 특히 운동량이 적은 개발자에게 있어 영양과잉의 문제는 매우 심각한 결과를 초래할 수 있다.

최신 IT 기술의 선봉에 서 있는 개발자지만 자신의 몸을 돌보지 않으면 놀라운 신기술을 펼쳐볼 기회조차 가질 수 없게 된다. 이번 호에 살펴본 개별적인 음식들뿐만 아니라 평소에 건강의 중요성을 염두에 두고 새로운 기술 성과만큼이나 자기 자신을 사랑할 수 있기를 기대해 본다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2006/05/11 11:20 2006/05/11 11:20
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/1755

개발 언어를 선택하는 5가지 기준


세상에는 수많은 프로그래밍 언어가 존재한다. 각 프로그래밍 언어는 자신만의 독특한 장단점을 가지고 있기 때문에 모든 프로젝트에 적합한 최고의 프로그래밍 언어는 존재하지 않는다. 결국 프로젝트의 요구 사항과 성격, 개발자의 자질, 여러 환경 요소를 모두 고려하여 가장 적절한 프로그래밍 언어를 고르는 일이 중요하다. 이 글에서는 프로그래밍 언어를 선택할 때 어떤 요소들을 고려해야 하는지 알아보자.

소프트웨어 개발자들은 성경에 나오는 바벨탑의 교훈을 잊어버린 걸까? 세상에 존재하는 수많은 언어 때문에 존재하는 불편함을 잘 알고 있는 프로그래밍 언어 개발자들이 왜 각자 문법과 어휘가 다른 수많은 프로그래밍 언어를 만들어 냈을까? 프로그래밍 언어는 단순히 의사소통을 하기 위한 수단만은 아니다. 소프트웨어는 세상에 산재하는 수많은 도메인(domain)의 문제를 풀어야 하고, 이 모든 문제들을 쉽게 풀 수 있는 최적의 언어는 존재하기 힘들기 때문이다. 소프트웨어 개발자들은 자신이 개발해야 하는 소프트웨어의 성격에 따라 프로그래밍 언어를 달리해야 한다. 시스템 소프트웨어를 작성한다면 C 언어와 어셈블리 언어가 적합할 것이며, 간단히 자신의 알고리즘을 테스트해보거나 프로토타이핑을 한다면 인터프리팅(interpreting)되는 스크립트 언어가 적합하다.

비교적 간단한 프로그램을 작성해보는 것이라면 사실 어떤 언어를 사용해도 무방하다. 하지만 비교적 큰 프로젝트의 산출물은 여러 가지 요소에 의해서 그 품질이 결정되는데, 여기에는 적절한 프로그래밍 언어의 선택이 중요하다. 따라서 프로젝트 초기에 프로젝트를 계획하면서 개발 도구와 환경을 결정할 때 프로그래밍 언어를 정하는 과정도 반드시 포함되어야 한다. 이 과정에서 여러 개의 프로그래밍 언어를 후보로 올려놓고, 프로젝트의 성격에 따른 여러 기준을 적용하며 의사 결정을 하게 된다. 프로그래밍 언어를 고르는데 있어서 절대적인 잣대는 없지만, 이 글에서는 이 과정에서 사용할 수 있는 몇 가지 유용한 판단 기준을 제공하고자 한다.

컴파일 vs. 인터프리터
숙련된 프로그래머 중에서 컴파일되는 프로그래밍 언어와 인터프리터되는 프로그래밍 언어의 차이점을 모르는 사람은 없을 것이다. 인터프리터되는 언어는 비교적 빠른 속도로 프로그램을 짤 수 있고, 결과를 쉽게 확인할 수 있다. 반면 컴파일되는 언어는 수행 속도가 빠르다. 프로그래밍 언어를 선택할 때 가장 먼저 적용해봐야 할 잣대 중에 하나는 해당 언어의 컴파일러나 인터프리터가 존재하느냐는 것이다.

경우에 따라서는 컴파일러와 인터프리터가 모두 존재할 수도 있고, 두 가지가 혼합된 형태일 수도 있다. 예를 들어 자바의 경우 자바 프로그램이 바이트코드(bytecode)로 컴파일되고, 자바 가상 머신(Java Vir tual Machine)에 의해서 다시 인터프리트되는 것이 일반적이다. 그러나 모바일 컨텐츠나 게임을 만들 때는 자바로 프로그램을 만들고 수행 속도 향상을 위해 타겟 플랫폼에 맞춰 미리 컴파일(AOTC, Ahead Of Time Compilation)하는 경우가 흔한데, 이는 자바 언어의 컴파일러라고 볼 수 있다. 비슷한 예로, 수행되기 직전에 머신 코드로 컴파일되는 JIT(Just In Time) 컴파일 방법도 있다.

같은 언어로 프로그래밍되더라도 컴파일러냐 인터프리터냐에 따라 성능과 사용성이 크게 달라진다. 일반적으로 컴파일되는 프로그래밍 언어는 두 가지 장점이 있는데, 하나는 수행 속도 향상이고 또 하나는 소스코드의 암호화(obfuscation)이다. 컴파일러가 인터프리터에 비해 같은 프로그램을 빠른 속도로 수행하게 만드는 것은 분명하다. 컴파일 시간은 런타임과 별도로 한 번만 수행되면 되기 때문에 각종 최적화(optimization) 기술을 적용하기가 유리하다. 물론 최근에는 자바 가상 머신(JVM)이 이런 컴파일러의 최적화 기술을 빌려와 동적으로 머신 코드를 생성하는 기술(adaptive compilation or HotSpot)을 도입했지만, 일부 최적화 기술은 그 특성상 많은 시간이 걸리기 때문에 같은 언어를 컴파일하여 얻어진 프로그램보다 빠를 수는 없다.

또 하나의 차이점은 소스코드를 얼마나 알아보기 힘들게 만들 수 있는가이다. 컴파일된 프로그램의 경우 해당 고급 언어의 특징이 거의 사라진, 기계어로 번역되어 있기 때문에 머신 코드를 바탕으로 원본 소스코드를 복원해 낼 수 있는 가능성은 거의 없다. 반면에 인터프리터되는 언어는 수행을 위해 소스코드가 건네져야 하므로, 소스코드 공개 의사가 없는 상업적인 프로젝트의 경우 해결하기 힘든 문제에 봉착할 우려가 있다.

필자도 프로젝트를 수행하면서 소스코드의 비밀 유지 때문에 많은 문제를 겪었다. 필자는 디지털 텔레비전을 위한 미들웨어 플랫폼을 만드는 일을 했었는데, 여기서 하드웨어와 운영체제를 바탕으로 시스템을 빌드하는 일은 C 언어로 했지만, 해당 플랫폼이 자바를 기반으로 하기 때문에 API를 자바 기반으로 작성해야 했다. 문제는 이를 배포하기 위해 바이너리를 줘야 하는데, C 언어로 컴파일된 바이너리는 문제가 없었지만 자바로 작성한 클래스를 배포할 때 문제가 생겼다.

자바의 경우 일단 한 번 바이트코드로 컴파일된 후에 자바 가상 머신 위에서 인터프리트되지만, 바이트코드는 가상 머신에서 동작하는 일종의 기계어임에도 불구하고 실제 기계어인 인텔이나 ARM, PowerPC 등의 어셈블리 언어에 비해서는 대부분의 자바 심볼(symbol)을 보존하고 있는 고급 언어라 할 수 있다. 시중에는 자바의 클래스 파일을 바탕으로 원래의 자바 소스코드를 복원해주는 디컴파일러(decompiler)가 많이 존재한다. 따라서 자바로 만든 프로그램을 배포할 때는 이를 컴파일하여 클래스 파일만 배포하더라도 누군가가 소스코드를 엿볼 수 있다는 불안에 시달려야 하는 것이다.

필자의 회사에서 시도한 첫 번째 방법은 자바 소스코드를 뒤죽박죽으로 만들어 주는 프로그램(Java Obfuscator)을 이용하는 것이었다. 이 프로그램은 원래 자바 프로그램의 의미를 훼손시키지 않고, 단순히 변수 이름과 클래스 이름을 a, b, c 등의 의미 없는 이름으로 바꾸어서 해당 프로그램을 해독하기 힘들게 만들어 준다. 그러나 이 방법도 완벽하진 않았다. 클래스와 변수 이름을 이상하게 바꿀 수는 있어도, 외부로 참조해야 하는 API의 이름을 바꿀 수는 없을 뿐더러, 비교적 제한된 애플리케이션 범주라면 숙련된 자바 프로그래머의 경우 바이트코드에서 복원된 소스코드를 읽는 것이 어렵지 않기 때문이다.

이 미들웨어는 결국 자바 클래스 파일을 JAR가 아닌 별도의 암호화 방법으로 압축했다. 그리고 이 클래스를 읽는 방법은 비밀에 붙인 채, C 언어로 암호화된 클래스 파일을 해석하여 원래의 클래스로 복원하여 자바 가상 머신에 로딩해 주는 방법을 사용하게 되었다. 이와 달리 일반적인 애플리케이션의 경우 인터프리팅되는 언어를 사용한 프로그램의 소스코드가 공개되지 않기를 바란다면, 이는 패키지로 만들어서 서버에서 수행한 후 결과만 웹 브라우저를 통해 알려주는 서블릿(servlet) 형태가 되어야 할 것이다.

결국 프로젝트에 있어서 성능이 중요하거나 소스코드 유출 방지가 높은 우선순위를 차지한다면, 인터프리터 언어가 주는 유용성, 개발의 편리성을 감안하더라도 치러야 할 대가가 크다는 사실을 알 수 있다. 따라서 특정 프로그래밍 언어를 선택하기 위해서는 해당 프로그래밍 언어의 컴파일러가 존재하는지, 혹은 인터프리터가 존재하는지를 확인해보는 것이 필요하다.

언어간 통합 문제
완벽한 한 가지 프로그래밍 언어는 존재하지 않는다고 말했다. 프로그래밍 언어가 가지는 각각의 특징 때문에 한 프로젝트 안에서 2~3개 이상의 프로그래밍 언어를 사용해야 할 경우는 생각보다 빈번하다. 이 경우 각각의 프로그래밍 언어가 가지는 특징도 중요하지만, 두 언어가 얼마나 유기적으로 잘 융합되어 하나의 시스템을 만들 수 있는지도 중요한 판단 기준이 된다. 대부분의 소프트웨어를 C++로 작성하고, 일부 테스트 프로그램과 간단한 유틸리티를 파이썬으로 작성했다면 언어간 통합은 큰 문제가 아닐 수도 있다. 그러나 시스템의 특성상 2가지 이상의 언어가 서로 유기적으로 얽혀서 구성되어야 하는 경우 두 언어간 통합이 원활하지 않다면 이는 프로젝트의 위기로 연결될 수도 있다.

필자는 프로그래밍 언어간 통합 문제로 크게 고생을 한 적이 있다. 이미 언급했듯이 필자가 참여했던 DTV용 미들웨어 프로젝트는, 셋탑 박스에 올라가는 실시간 운영체제(Real-time OS) 위에 미들웨어를 올리고 미들웨어 응용 프로그램을 위한 자바 API을 제공해야만 했다. 즉 자바 API는 자바로 작성하되, 셋탑 박스(STB)의 하드웨어 자원에 접근해야 하는 경우 C 언어를 사용할 수밖에 없었다. 또한 셋탑 박스 또한 임베디드 환경이기 때문에 메모리가 한정되어 있고, CPU 속도가 충분치 않아 자바로 수행할 경우 속도가 느린 모듈은 C 언어로 내리는 작업도 병행해야 했다.

자바의 경우 “한 번 작성하고 모든 곳에서 사용한다(Write Once, Run Everywhere)”는 모토에 따라 시스템 의존적인 C 언어와 통합할 이유가 없을 것 같다. 하지만 실제로 임베디드 시스템의 경우 자바를 사용하더라도 하드웨어가 제공하는 고유의 기능에 접근하기 위해서는 C 언어로 된 시스템 API를 호출해야 하기 때문에 C 언어와의 통합이 필수적인 경우가 많다. 자바도 이 필요성을 인지하고 JNI(Java Native Inter face)라고 하여, 자바 메쏘드를 C 언어로 작성할 수 있는 표준 인터페이스를 정의해 놓았다.

C 언어와의 통합을 위한 표준 인터페이스까지 존재하는 언어인 자바는 C 언어와 통합이 필요한 경우 이상적인 언어라고 판단할 수도 있다. 사실 다른 언어와의 인터페이스를 표준화하거나 구체적으로 명시한 언어조차 드문 상황이다 보니, 이 정도면 언어간 통합 문제를 어느 정도 해결해주고 있지 않느냐는 결론을 내릴 수도 있다.
그러나 실제로 자바와 C를 사용하여 프로젝트를 수행한 필자의 경험에 따르면, 언어간 통합은 절대로 쉬운 일이 아니었다. 자바에서 C 언어로 작성된 라이브러리를 로드하고 이 메쏘드를 부르는 것은 물론이고, C 언어로 작성된 자바 메쏘드에서 자바 객체의 필드에 접근하고 자바 메쏘드를 호출하게 만드는 일이 결코 간단하지 않았다. JNI 자체가 프로그래머의 실수를 유도하기 쉽게 만들어진 면도 많았고, 숙련된 프로그래머조차 버그 없이 한 번에 C와 자바를 통합하는 일은 힘들었다.

이는 어떻게 생각해보면 당연한 일인지도 모른다. C 언어에서 자바 메쏘드를 호출하고 객체를 사용하기 위해서는 기존의 C 언어에는 존재하지 않는 개념인 클래스나 객체, 필드, 메쏘드 등 객체지향 프로그램 언어의 특징을 C 언어의 구조체(struct)나 함수 포인터(function pointer) 등을 이용해 표현해줘야 하고, 이를 이용하는 것도 자바처럼 간단하지 않다. 자바에서 지원하는 예외 처리(exception handling) 방법도 C 언어에서 일일이 특정 함수를 호출하여 확인한 후 적절히 리턴해줘야 하고, 자바의 메모리를 접근하기 위해서도 가비지 콜렉터(garbage collector)와의 연관 관계를 생각해야만 한다. 즉 자바가 가상 머신 속에 감추어둔 내부 구조가 C 언어로 건너오면서 노출되는 것이다.

좀 더 일반적으로 말하면 두 언어를 연결하기 위해서는 두 언어 중 하나의 언어가 다른 언어의 기능을 흉내내줘야 한다. 프로그래밍 언어가 처음 만들어질 때부터 다른 언어와의 연관 관계를 생각하지 않았다면 이런 기능을 바라는 것은 힘들 수도 있다. 이상적인 관점을 버리고 특정 언어가 최소한 C 언어와 얼마나 잘 통합될 수 있느냐만 보는 것도 현실적인 접근 방법이다. 왜냐하면 대부분의 라이브러리가 C 언어로 작성되어 있기 때문이다. 파이썬이 태생부터 다른 언어와의 접착성(glue)을 강조하며 나타났던 것도 이런 생각이 깔려 있으리라 짐작 된다.

이 문제를 근본적으로 접근하여 해결책을 제시한 것은 마이크로소프트(MS)였다. MS가 닷넷 플랫폼에서 강조한 내용 중에 하나가 교차 언어(cross-language) 플랫폼인데, 이 개념의 핵심은 서로 다른 언어로 작성한 모듈이나 클래스를 서로 호출하여 사용할 수 있음을 의미한다. 대표적인 예로 VB.NET으로 작성한 클래스를 아무런 수정 없이 C#에서 사용할 수 있다는 점을 들 수 있다. 물론 서로 기본형(primitive-types)과 기능이 다른 프로그래밍 언어가 아무런 제약 조건 없이 서로를 호출해 사용할 수는 없기 때문에 CLS(Common Language Specification)를 만들어 이에 부합해야만 교차 언어를 사용할 수 있다. 그러나 닷넷이 언어간 통합 문제를 어느 정도 해결한 것은 분명해 보인다.

비슷한 움직임으로 썬(Sun)에서도 자바 외에도 자바 바이트코드로 변환되어 실행되는 프로그래밍 언어의 표준화 작업을 시작했다. 일례로 그루비(Groovy)는 바이트코드로 변환되어 실행되는 스크립트 언어인데, 자바와 그루비 모두 바이트코드 형태로 변환되기 때문에 그루비는 자바로 짠 라이브러리와 API를 마음대로 접근하여 사용할 수 있는 특성이 있다. 언어 간의 통합 문제가 점차 더 큰 요구 사항이 된다면, 이러한 시도는 점차 확대되리라 생각한다.

얼마나 객체지향적인가
지난달에 기고했던 ‘프로그래밍 언어론을 배우자’에서 프로그래밍 언어의 4가지 패러다임에 대해 설명한 바가 있다. 프로그래밍 언어는 크게 지시형(procedural) 언어, 객체지향 언어, 함수형 언어, 선언형 언어로 나뉘고 각 패러다임에 따라 언어의 특징이 크게 다르다고 이야기했다. 그러나 프로젝트를 위한 프로그래밍 언어를 선정하는 시점에 오면 판단 기준은 한 가지로 집중된다. 얼마나 객체지향적인가?

함수형 언어나 선언형 언어는 프로그래밍 방법론에 있어서 여러 가지 가치있는 시사점을 전달해주고, 기존의 지시형 언어와 객체지향 언어에 많은 영향을 미친 것이 사실이지만, 그 자체로 함수형, 선언형 언어는 비교적 도메인에 제한적이고, 실제로 프로젝트에 사용되는 일이 드문 편이다. 결국 C와 C++로 대변되는 지시형 언어와 객체지향 언어의 사이에서 어느 지점을 택할 것인가가 가장 현실적인 문제로 남게 된다.

객체지향 언어의 장점은 잘 알려져 있다. 데이터의 캡슐화(encapsulation), 코드 재사용(code reuse), 상속(inheritance), 다형성(polymorphism) 등 기존의 지시형 언어가 가지지 못한 여러 장점을 선사한다. 그러나 좀 더 객체지향적일수록 프로젝트에 적합하다는 일반론은 옳지 않다. 순수 객체지향(OO)을 표방하는 언어들이 비교적 느린 수행 속도로 악명 높고, 실제로 객체지향적일 필요가 없는 코드까지 객체지향적으로 사고하도록 강요하는 경우도 있다. 간단히 몇 가지 일련의 명령을 수행하고 싶은데도, 이를 추상화하여 클래스로 만들고 객체를 생성하고 메쏘드를 호출해야 하는 것은 분명 장점만은 아니다. 또 순수 객체지향 언어일수록 비교적 수행 속도가 느리다는 단점도 안고 있다.

반대로 객체지향 언어의 특징 중 일부만 빌려와도 크게 생산성이 향상될 수 있는 경우도 있다. 임베디드 시스템의 경우 칩셋(chipset) 회사들이 보통 컴파일러까지 제공한다. C++나 다른 고급 언어 컴파일러도 제공하면 좋겠지만, 칩셋 회사들의 특성상 보통 C 언어 컴파일러를 제공한다. 따라서 이런 임베디드 시스템에서 프로그래밍을 한다면 할 수 없이 C 언어를 사용해야 하는 경우가 많다. 팜과 같은 초창기 임베디드 시스템의 API를 보면 프리픽스(prefix)만 달리한 수많은 함수의 나열에 기겁한 경험이 있을지도 모른다. 비슷한 기능을 하는 함수들을 묶어서 네임 스페이스만 달리 줄 수 있었어도, 이런 환경에서 프로그래밍하는 개발자의 생산성을 훨씬 높아졌을지도 모른다.

그 예로 비교적 성공한 OS로 평가받고 있는 스마트폰용 운영체제 시스템인 심비안(Symbian)이 있다. 심비안 OS의 API가 C++로 작성되어 있어서 기존의 C 언어 API에 비해 비교적 정리가 잘 되어 있고 개발도 용이한 편이다. 그러나 이 성공이 C++ 언어 전체의 기능 때문만은 아니다. C++의 특성 중 일부인 클래스를 이용한 네임 스페이스 분리, 예외 처리 등만 C에 추가되었어도 비슷한 효과를 얻었을 것이다.

객체지향과 관련하여 또 하나 언급하고 싶은 것은, 객체지향 언어의 기능 중 일부는 아직도 완전한 동의 없이 서로 다른 방법으로 구현되고 있다는 점이다. 대표적인 예가 다중 상속(multiple inheritance)이다. 다중 상속은 말도 많고 탈도 많은 기능 중 하나이다. 잘 사용하면 강력한 기능이 되기도 하지만, 코드를 복잡하고 이해하기 힘들게 만드는 주범 중에 하나이기도 하다. 자바는 C++의 다중 상속이 마음에 들지 않아 이를 인터페이스로 대체했고, 또 루비를 비롯한 일부 언어는 믹스인(mix-ins)이라는 방법을 이용하여 코드를 조합하여 사용하기도 한다. 또 일부 언어는 일반적인 상속 관계와 코드 재사용을 구분하여 코드 상속(code inheritance)을 따로 지원하기도 한다. 언어를 선택할 때 이런 논쟁적인 부분을 해당 언어에서는 어떤 접근 방법으로 해결하고 있는지를 잘 살펴보는 것도 중요하다.

부수적인 조건이 아닌 안정성
보통 프로그래밍 언어의 안정성(reliability)은 부수적인 요건으로 여겨졌다. 하지만 프로그래밍 언어의 안정성은 개발 속도와 버그 발생률, 디버깅의 편의성, 테스트 등에 모두 영향을 미치는 매우 중요한 요건이다. 안정성이나 테스트의 편의를 결정하는 프로그래밍 언어의 특징은 타입 시스템(type system), RTTI(Run Time Type Inspection), 가비지 컬렉션 등을 들 수 있다. C 언어는 비교적 약한 타입 시스템을 가진 언어이다. C 언어에서 데이터 형은 어떤 다른 형으로도 캐스팅될 수 있고, 이 점은 C 언어의 강력한 장점이자 가장 큰 문제점이기도 하다. C 언어 타입 시스템의 약점은 개발 후반에 재앙으로 나타날 수 있는데, 이는 해결하기 힘든 버그 중에 하나이다.

임베디드 시스템 개발에 C 언어를 사용하는 예를 들어보자. 이 경우 C는 최선의 대안임이 분명하지만, C 언어의 특징 때문에 여러 가지 문제가 일어난다. C 언어에서 가장 흔히 하는 실수는 배열의 인덱스가 잘못되어 잘못된 메모리에 값을 쓰는 경우, 포인터 연산이 잘못되어 잘못된 메모리의 값을 읽거나 쓰는 경우다. 임베디드 시스템이 사용하는 OS는 대부분 메모리 공간이 하나로, 커널과 유저 모드의 구분이 없다. 즉 잘못된 메모리에 접근하더라도 세그먼테이션 폴트(segmentation fault)가 나지 않는다. 즉 커널 영역의 메모리 주소에 잘못된 포인터 연산으로 특정 값을 쓰더라도 그 시점에는 아무런 문제없이 넘어간다. 문제는 그렇게 바뀐 메모리 주소를 나중에 읽으려고 할 때 잘못된 값을 읽어 와서 프로그램이 이상 동작할 경우이다. 이 경우 문제 시점과 원인의 발생 시점이 다르기 때문에 그 원인을 파악하는 게 사실상 거의 불가능해 진다.

만약 C 언어가 아니라 자바처럼 메모리 포인터가 없고, 배열의 경우 항상 배열의 경계값 검사를 해주는 프로그래밍 언어를 사용했다면 저런 문제는 절대 발생할 수 없었을 것이다. 즉 프로그래밍 언어의 타입 시스템에 따라 어떤 종류의 프로그램 버그는 원천 봉쇄할 수도 있다는 이야기다. 이러한 점은 프로그래밍 언어를 선택할 때 반드시 고려해야 한다.

리플렉션(reflection)이라 불리는 언어의 기능은 테스트 프레임워크를 만드는데 많은 도움을 준다. 리플렉션은 런타임에 프로그래밍 언어의 타입을 동적으로 조사하고 이를 호출하여 사용할 수 있는 기능을 말한다. 즉 프로그램이 동작 중에 어떤 데이터 타입이 있는지 확인한 후에, 해당 메쏘드를 무작위로 불러보는 일이 가능해진다. 이 기능은 보통 자바로 작성된 API의 경우, API가 표준에 맞는 클래스 이름과 메쏘드 이름, 그리고 인자들을 가지고 있는지 동적으로 확인한다. 또 해당 시스템의 API를 무작위로 호출하여 시스템의 안정성을 테스트할 때 사용된다.

언어의 런타임이 가비지 컬렉션을 지원하느냐의 여부도 넓게 봐서 언어의 안정성에 포함된다. malloc/ free나 new/delete를 사용하는 프로그래밍 언어는 대부분 자원 관리를 적절히 하기 위해 엄청난 노력이 소요된다. malloc한 메모리는 반드시 어느 시점에서인가 free해줘야 하는데, 이를 여러 조건에 빠짐없이 처리해주는 것만으로 시스템의 복잡도가 상당히 올라감을 알 수 있다. 이를 실수하면 곧바로 메모리 누수(memory leak)로 이어지기 때문에 여간 신경쓰이는 일이 아니다. 가비지 컬렉션을 지원한다면 프로그래머를 이러한 자원 관리 문제에서 어느 정도 해방시키기 때문에 생산성이 향상되고, 자원 관리 문제로 인한 버그를 예방할 수 있는 장점이 있다.

얼마나 많은 라이브러리가 표준화되어 있나
프로그래밍 언어를 선택함에 있어서 가장 중요한 부분은 어쩌면 그 언어의 사용을 도와주는 얼마나 많은 지원이 있느냐 일지도 모른다. 여기서 지원은 각종 프로그래밍 언어 서적, 웹 사이트, 그 프로그래밍 언어를 사용하는 사람들의 숫자, 전문가, 바로 사용할 수 있는 라이브러리 등이다.

프로그래밍 언어도 네트워크와 마찬가지(network effect)로 사용하는 사람이 많을수록 그 언어를 사용하는 모든 사람이 이득을 얻는 특징이 있다. 사람들은 전문적인 지원이 없으면 그 언어의 선택을 꺼리는 경향이 있고 더 많은 사람들이 사용하는 언어를 선택하는 경향이 강하다. 컴퓨터 산업이 어느 정도 성숙되고 나서 상업적으로 성공한 언어가 대부분 MS나 썬과 같이 대기업의 전폭적인 지원이 있었다는 사실도 이를 보여준다. 수많은 책을 펴내고 그 언어의 사용을 장려하기 위해 여러 프로모션 정책을 펴는 것이 프로그래밍 언어의 성공에 있어서 생각보다 중요한 요소인 것이다.

이런 지원 중에서 가장 중요한 요소는 사용 가능한 라이브러리가 얼마나 많이 있느냐다. 자바의 성공은 자바 프로그래밍 언어의 특징에도 있었지만, 또 하나의 요소는 바로 사용 가능한(out-of-the-box) 표준 라이브러리가 언어의 런타임과 함께 배포되었다는 점이다. 프로그래밍 언어의 이러한 특징으로 인해 개발 작업은 새로운 것을 만들어내는 일에서 이미 작성된 라이브러리를 최대한 잘 활용하며 어떻게 조합하느냐로 바뀌었을 정도다. 이러한 변화를 잘 반영하는 말이 있다. 흔히 자바 프로그래밍을 처음 시작하는 사람에게 해주는 충고로 “어디에 있는지를 알아라!(Know Where)”라는 이야기를 많이 한다. 과거 프로그래밍은 언어의 기본적인 기능만으로 모든 것을 만들어 써야 하던 ‘Know What, Know How’의 시대였다면 현재의 프로그래밍은 자신이 사용하고자 하는 기능이 어떤 클래스에 어떻게 구현되어 있는지를 알고 이를 재빨리 찾아서 사용하는 것으로 바뀌었다. 따라서 얼마나 다양하고 많은 라이브러리를 제공하느냐는 프로그래밍 언어의 성패를 정하게 되었다.

여기서 주목해야 할 것은 단순히 얼마나 많은 라이브러리가 있느냐가 아니라 얼마나 많은 라이브러리가 표준화(standard library)되어 있느냐다. 사실 C 언어의 경우 정말 엄청난 양의 라이브러리가 존재하고, 상당수가 오픈소스로 존재하지만 서로 다른 컨벤션(convention)과 스타일을 사용하는 라이브러리를 자신의 구미에 맞게 요리하여 사용하기란 쉬운 일이 아니다. 남의 코드를 가져다 쓴다는 게 얼마나 어려운 일인지는 조그마한 라이브러리를 가져오려고 시도해 본 적이 있는 사람은 모두 공감할 것이다.

결국 프로그래밍 언어 자체가 이미 표준화된 라이브러리를 매우 풍부하게 제공하여 대부분의 기능한 제3자를 통하지 않고서도 직접 프로그래밍할 수 있는 환경을 만들어 주는 것이 중요하다. MS와 썬은 이미 이런 방향으로 자신들의 언어를 개발하고 있고 많은 성공을 거두었다. 우리가 프로젝트에서 어떤 언어를 선택한다면 그 언어의 특징은 물론 그 언어의 표준 라이브러리가 얼마나 잘 정리되었는지도 반드시 고려해야 할 것이다.

절대 기준은 없다
앞에서 프로그래밍 언어의 선택 기준을 몇 가지 언급했지만, 사실 프로그래밍 언어를 선택하는 절대적인 기준이란 없다. 바꿔 말하면 거의 모든 요소를 고려해도 부족하다는 말이 될 수도 있다. 언어의 특징을 규정짓는 요소들, 예컨대 가독성, 이식성(portability) 등도 모두 언어를 선택할 때 고려해야 할 요소들이고 각각의 생산성에 어떤 식으로든 영향을 미친다. 중요한 점은 프로젝트 시작에 앞서 몇 가지 선택된 기준을 바탕으로 몇 개의 프로그래밍 언어를 평가한 후에 프로젝트 언어를 결정하는 신중함을 가지라는 점이다. 프로젝트 초반의 시간 절약은 나중에 더욱 큰 화살이 되어 돌아올 수 있음을 항상 명심해야 한다. [maso]
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2006/05/11 11:03 2006/05/11 11:03
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/1754

장청소

나는 장청소가
예방의학에 있어서
매우 중대한 문제라고 생각한다.
장이 깨끗하면 육체는 튼튼해지고 인생도 잘 풀린다.
장이 막히면 하는 일마다 막힌다.


- 캐런 킹스턴의《아무것도 못 버리는 사람》중에서 -


* 저도 이따금 장청소를 합니다.
그러면서 '마음 청소'도 그에 못지 않게 중요하다는 사실을
깨닫습니다. 장속에, 마음속에 잡동사니 가득하면,
몸과 마음이 튼튼해 질 수 없습니다.
하는 일마다 막히고 꼬입니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기

Posted by 홍반장

2006/05/11 09:13 2006/05/11 09:13
Response
No Trackback , No Comment
RSS :
http://tcbs17.cafe24.com/tc/rss/response/1753


블로그 이미지

- 홍반장

Archives

Recent Trackbacks

Calendar

«   2006/05   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
Statistics Graph

Site Stats

Total hits:
241672
Today:
202
Yesterday:
1266