잊지 않겠습니다.

'시끌벅적'에 해당되는 글 43건

  1. 2009.01.07 삶이란..
  2. 2009.01.07 부가가치세 인상 1
  3. 2009.01.07 S/W 유지보수에 대하여
  4. 2009.01.07 Great PM이란?
  5. 2009.01.07 100도씨
  6. 2009.01.07 (펌) 하버드 학생의 연설문..
  7. 2009.01.07 (펌) 프로그래머가 반드시 알아야할 명언 50선
  8. 2009.01.07 0005. Jolly Jumper
  9. 2009.01.07 0004. Seven-Segment
  10. 2009.01.07 0003. The Trip

삶이란..

시끌벅적 2009. 1. 7. 12:49

: 무언가 생각을 하게 하는 글... 전부터 자주 생각하던 내용이기도 한데.. 무언가 여운을 갖기도 하고 과연 내가 사는 것이 이 방법이 맞는 것인지에 대한 여러 생각을 계속해서 하게 하는 글.

 

모든 건 다 너희들의 삶이다.
그리고 아직 갈길이 먼 너희들에게 정해지지 않은 앞 날이라는게 많이 무섭겠지.
먼지도 모르겠고. 

게다가 너희들은 학교에서 공부만 열심히 하라고 배우지 않았냐? 그럼 성공한다고.
근데 막상 너희가 대학에 들어가자 앞으론 다 너네가 알아서 해야한다고 하자. 
그때부터가 진짜 시작인데 말이다. 

뒤통수를 치는거야. 
얼마나 막막하냐. 

광활한 자유가. 

그래. 너흰 성년이다. 그리고 너희 인생은 너희가 선택해야한다. 
허나 어쩌면 너희들은 너희 스스로가 선택하는 법을 배운적이 없는지도 모른다. 
선택해 본 적이 없으니 누군가 '나는 성공했소. 나는 부자가 되었소' 하는 사람들의 말을 넙죽넙죽 따르는거야. 
좋은 차를 몰고.. 고기만 먹을 것 같은 사람들의 말을.

그 사람들 말이 그렇거든...
열심히 사세요.
목표를 세우고, 
아침에도 일찍 일어나고,
운동도 열심히 하고, 
영어도 하고,
뭣도 하고,
뭣도 하고.......... 다~ 하세요.

그래도 너넨 열심히 따른다. 
아주 열심히. 

때론 열심히 하지 않는 스스로를 경멸도 해가면서.
그렇게 힘든 하루를 말이다. 

왜 일까?? 

그럼 불안하지 않아도 되거든. 
그 무책임한 자유에서 벗어날 수 있거든.

그게 편한거다. 메뉴얼이 있다는게.

잠시 쉬어 청록의 나무를 바라보아라. 
또한 시간은 그리 빠르게 흘러가진 않는다. 
날이 좋지 않느냐.

연어는 자신이 '왜' 상류로 거슬러 올라가는지 알고 있다.
너희들은 너희들만의 '왜'를 알고 있는 것이냐?
반짝이는 이 순간 순간을 정작 너희들은 모르는 것 같아 안타깝구나. 

어떠냐?
터질 것 같이 너흴 뒤흔드는 무언가는 정녕 없었던게냐?


Posted by Y2K
,

정말로 도둑놈이 정권을 잡았구나.. 하는 생각이 무척 많이 들고 있다. -_-

  

고등학교때 세금제도에 대해서 배울때, 직접세가 높을 나라들이 대부분 부의 재분배를 잘 하고 있는 복지 국가고, 간접세가 높을 수록 부의 재분배를 잘 못하고 있는 나라로 배웠다.

  

실예로.. 부가가치세는 복지 제도가 잘 만들어진 나라들의 경우에는 다른 세금의 비율에 비해서 부가가치세가 낮고, 일본의 경우에는 5%밖에 되지 않는다. 왜냐면 이 부가가치세의 경우에는 언제나 모든 물건들마다 붙는 세금이기 때문에, 조금이라도 올리게 되면 바로 모든 경제 인구의 소득이 주는 것과 비슷한 효과를 가지고 오기 때문이다.

  

우리나라의 부가가치세는 10%. 지금 인상이 추진되고 있는 세금은 12.5%.

부동산 취득세며, 법인세는 깎아주는 마당에 서민들의 삶에 직접적으로 영향을 주는 부가가치세의 인상은 무엇을 의미하는가. -_-

  

기업들 돈 깎아주면서, 당연히 나올 세수 부족은 모두 국민들에게 깔아서 내라는 이런 정책이 또 다시 나오고 있다.도대체 어떤 국민들이 이런 인간을 뽑아줘서 이런 식으로 일을 몰고가는지 모르겠다는 생각도 들면서.. 민주주의에 대한 회의는 계속되게 만든다. -_-

  

도대체 누굴 위한 정부이고, 누굴 위한 제도인가...

정말 요즘은 뉴스 보기가 무서운 세상이다. -_- 노원구쪽 집값 올랐다는 이야기들으면서도 가슴 한편이 매우 아프고 말이야.. -_-

Posted by Y2K
,

'제품으로서의 소프트웨어'에서 '서비스로서의 소프트웨어(SaaS : Software as a Service)'로의 변화는 시대적 대세다. 이로써 고객은 더욱 양질의 서비스를 누릴 수 있고, 공급 업체는 안정적이고 새로운 비즈니스 모델을 확립할 수 있다.

이와 관련, IDC는 전 세계 소프트웨어 유지보수 서비스 매출액이 2008년이면 전체 소프트웨어 매출액 중 56.3%에 이를 것이라는 예측을 내놓은 바 있다. 국내 시장에서도 소프트웨어 지원 서비스(Support) 시장은 하드웨어 지원 서비스 시장의 연평균 성장률 5.4%보다 높은 9.1%의 성장률을 보이며 성장할 것이라고 전망했다.

하지만, 우리나라의 패키지 소프트웨어 업체의 전체 소프트웨어 사업 금액 중 유지보수(Maintenance & Support) 사업 금액의 비중은 21%. 이는 51%인 미국의 절반도 안 되는 수준이다. 심지어 공공 부문의 유지보수 사업은 소프트웨어 사업 수주 금액 대비 17%에 불과해 더 낮은 수준인 것으로 나타났다.

이 같은 조사는 한국소프트웨어진흥원이 2004년에 발표한 <패키지 SW 유지보수 서비스 실태 조사>자료에 따른 것으로, 2006년인 현재에도 이러한 상황이 크게 달라지지 않았다는 것이 업계의 공통된 시각이다.

유지보수율이 제자리를 찾지 못하는 한, 질높은 서비스도 요원할 것이다. 인식의 전환과 더불어 합리적인 기준을 적용한 유지보수 서비스를 하루빨리 시행해야 할 까닭이다.

업그레이드·기술 지원 포함한 '유지보수 서비스'

IDC는 소프트웨어 관련 서비스 중 '유지(Maintenance)'에 해당하는 서비스로 업데이트, 업그레이드, 패치 및 오류 수정, 일상 기술 지원을 포함하고 있다. 또 '지원(Support)'에는 전화, 원격 지원, 온사이트 지원, 예방·예측적 지원, 지원 관련 유지(maintenance)로 규정하고 있다.

정보통신부가 지난해 5월 발표한 <패키지 SW 유지보수 서비스 가이드라인>에서도 이와 비슷하게 규정하고 있다. 정통부는 △패치, 업데이트, 업그레이드 등 '제품 관련 서비스' △일상 지원을 포함한 장애 처리와 예방·예측 지원, 고객 맞춤 지원을 포함하는 '기술 지원 서비스' △운영자와 사용자에 대한 '교육 서비스'를 유지보수 서비스 범주에 넣었으며, 지원 매체는 전화, 온라인, 방문 지원 서비스로 구분했다.

현재 국내외 업체들이 규정하고 있는 유지보수(Maintenance & Support) 서비스의 개념도 여기서 크게 벗어나지 않는다.

하지만 기업별로 다소 차이가 있다. 예를 들어, 기존 제품의 기능을 일부 보완하는 '마이너 업그레이드'와 달리, 버전 자체가 크게 변하는 '메이저 업그레이드'가 유지보수 서비스에 포함되는 경우 서비스의 가격이 다소 높게 산정된다.

기술 지원 서비스도 지원 인력, 지원 시간, 방문 횟수나 지원 대상수에 따라 차등 적용되기도 한다.

유지보수 서비스 비용 '원칙대로 받기 힘들다'

2003년 말 오라클은 새로운 유지보수 정책에 따라 모든 제품에 대해 일괄적으로 제품 공급가의 '22%'라는 유지보수료를 적용하겠다고 발표했다. 당시 오라클은 국내 고객들로부터 수많은 질타를 받았고, 고객들을 설득하는 데 적잖은 어려움을 겪었다.

주요 고객인 금융권에서는 오라클의 정책에 강하게 반발, 당시에 200억 원 가까운 손해를 감수해야 했다. 결국 오라클은 금융권 고객과 협의를 통해 2004년부터 매년 1%씩 요율을 올려 3년 후에는 22%의 유지보수율을 지불하겠다는 데 합의했다.

당시 우여곡절을 겪었지만, 현재 오라클은 국내 모든 고객에게 22%의 유지보수율을 적용하고 있다. 유지보수 계약 비율도 타 업체에 비해 높은 편이라 이제는 어느 정도 자리를 잡았다는 평가를 하고 있다.

SAP는 5년간 17%의 유지보수율을 기본으로 서비스를 제공하고 기본 유지보수 기간이 끝나면 1년간 2%의 추가 비용으로 유지보수를 연장하도록 하고 있다. 1년 이후에는 4%의 추가 비용으로 2년간 또다시 연장 유지보수가 유지된다. 연장 유지보수 기간이 종료된 후에는 기존의 표준 유지보수 비용으로 서비스가 제공된다.

대표적인 소프트웨어 업체인 오라클과 SAP는 국내에서도 이러한 원칙을 고수, 예외 없이 적용하고 있다고 밝혔다.

하지만, 나머지 업체들의 사정은 그리 좋지 않은 것 같다. IBM, HP, CA 등 대부분의 외산 업체들은 20%대의 유지보수율을 적용하고 있지만, 실제 계약상에서는 원칙을 지키지 못하는 경우가 허다하기 때문이다.

한 외산 업체의 관계자는 "국내 실정상 본사의 20% 원칙을 고수하기는 쉽지 않다"면서 "국내 고객들은 유지보수 계약 자체를 꺼리는 경우가 많아 계약 금액에 따라 유연하게 계약을 하고 있어, 실제 적용되는 유지보수 가격과 유지보수 리스트 프라이스와는 큰 차이가 있는 게 현실"이라고 털어놓았다.

국산 소프트웨어 업체들의 사정도 나을 것은 없다. 오히려 외산 업체들과 비슷한 수준의 서비스를 제공하면서도 10∼15%의 비율을 유지하고 있다.

정부/공공 부문은 '평균 8%?'

그나마 일반 기업들은 인식 수준이나 비율이 나은 편이다. 정부/공공 부문에서는 '유지보수 요율 8%'가 거의 관행처럼 굳어져 있다.

포스코와도 22% 계약을 고수하는 오라클조차 공공 부문에서는 본사의 승인을 얻어 8%의 유지보수율을 적용하고 있을 정도다.

정부/공공 부문에 공급이 많은 핸디소프트의 경우, 외산 업체들보다 높은 12%의 유지보수 요율을 적용하고 있다. 하지만 속을 들여다보면 이것이 '높은' 비율이 아님을 알 수 있다.

핸디소프트의 기정수 과장은 "서비스 조건에 따라 10∼15%의 서비스 요율을 적용하고 있지만, 실제 내용에는 기능 보완이나 일부 수정이 아니라 '추가 개발'이라고 할 만한 요구 사항들이 많이 포함돼 있어 넉넉한 요율이라고 볼 수는 없다"고 밝혔다.

티맥스소프트의 홍장헌 차장도 "공공기관은 대체로 전년도 비용을 기반으로 다음 해의 예산을 미리 책정하기 때문에 요율을 변경하기가 쉽지 않다"고 말했다.

정부/공공 부문의 유지보수 요율이 비현실적이라는 것은 국내외 업체를 막론하고 심각한 수준이라는 것이 중론이다.

한 외산 업체 관계자는 "공공기관의 유지보수 요율이 너무나 비현실적이라 유지보수 전문 업체들은 편법을 써서 총액을 가이드라인에 맞추기도 하며, 서비스 수준의 저하를 가져오는 원인이 되기도 한다"고 전했다.

유지보수 비용이 턱없이 낮다보니 공급 업체로서는 일정 수준의 서비스를 제공할 수 없고, 서비스의 질이 떨어지는 것에 고객들은 만족하지 못해 유지보수에 대한 불만이 터져 나오는 것이다. '닭이 먼저냐, 달걀이 먼저냐'는 논란이 생기는 것이다.

유지보수 요율의 현실 '절실'

유지보수 요율이 고객에 따라 널뛰듯 달라지는 것은 소프트웨어 '서비스'에 대한 인식 부족이 가장 큰 원인으로 꼽히고 있다. 소프트웨어가 하드웨어에 '딸려오는 부속품' 정도라는 인식에서 벗어나지 못했다는 것이다.

한국오라클 기술서비스본부의 최상곤 본부장은 "공공기관의 유지보수 요율이 8%대로 묶여있는 것은 기존 하드웨어 중심의 사고방식에서 벗어나지 못한 때문"이라며, "소프트웨어의 서비스에는 하드웨어와 달리 새로운 제품의 개발과 지원까지 포함돼 있는데, 이러한 개발 비용과 원가를 무시하고 단순 지원 서비스로만 치부하기 때문"이라고 지적했다.

실제 오라클의 22% 서비스 요율 내에는 업그레이드를 위한 것이 15%, 일반적인 유지(maintenance) 비용이 7% 포함돼 있다. 하드웨어에 해당하는 유지보수는 7%에 해당하는 것이며, 버전 업까지 보장되는 업그레이드 관련 개발비와 원가가 15%에 해당한다. 제품 수명 주기가 2∼3년인 것을 고려하면 오히려 유지보수 서비스 구매 시 신제품 구입 비용이 절반으로 줄어드는 것이다.

HP나 IBM, CA 등의 20%의 요율을 적용하는 외산 업체들은 유지보수 서비스 계약 내에 마이너 업그레이드뿐 아니라 메이저 업그레이드까지 포함돼 있으며, 패치와 일상적인 기술 지원 서비스, 장애 처리, 교육 등이 모두 포함돼 있다.

이보다 다소 낮은 요율의 국산 업체들은 메이저 업그레이드 시 할인해 주기는 하지만, 별도의 비용을 지불해야 하는 것을 제외하고는 외산 업체들과 비슷한 수준의 서비스를 제공하고 있다.

정당한 서비스 비용 지불이 질 높은 서비스 담보

유지보수 서비스 요율에 대한 문제는 공급 업체와 고객 모두에게 책임이 있다. 공급 업체들은 치열한 수주 경쟁을 벌이면서 라이선스 가격은 물론, 유지보수 요율도 일관되게 적용하지 못하고 있다.

고객들 역시 유지보수 서비스와 단순 '하자보수'의 차이를 명확히 구분하지 않고 '서비스=무료'라는 인식을 고수하는 것도 문제다.

그 중재 역할은 정부에게 돌아간다. 정부가 나서서 제대로 된 가이드라인을 제시하고 합리적인 서비스 요율에 대한 지침을 제시해야 하는 것이다.

정부에서도 이런 문제 의식 하에 올해 3월 말이나 4월 초쯤 새로운 가이드라인을 발표할 계획이다.

정통부 SW진흥팀의 윤현주 사무관은 "유지보수에 대해 '적절한' 대가를 지불해야 한다는 대원칙 하에 1분기 중에 관련 계획을 세우고 2분기부터 본격 시행할 계획"이라며, 요율에 대한 구체적인 수치도 제시할 수 있다는 입장을 밝혔다.

호텔에 가면 일정 금액의 서비스 비용을 지불하는 대신, 최대한의 편의를 정당하게 요구할 수 있다. 대부분 이것이 부당하다고 느끼지는 않는다. 제품도 마찬가지다. 서비스 대가는 분명 지불해야 하며, 그에 마땅한 수준의 서비스를 당당하게 요구할 수 있어야 할 것이다.

Posted by Y2K
,

Great PM이란?

시끌벅적 2009. 1. 7. 12:48

1. 팀원을 존중하고, 피드백을 주고 코칭을 하는 사람

2. 팀원에게 적절한 권한위임을 하는 사람

3. 바라는 결과를 명확히 알려주는 사람

4. 방법보다는 결과에 초점을 맞추는 사람

5. 실수했다는 것을 인정하는 사람

6. 팀원의 경력개발을 지원하는 사람

7. 팀원의 변화와 공헌을 알아차리고 감사하는 사람

8. 감정의 폭발에 반응하기 보다는 사건에 대응하는 사람

9. 조직의 상층부에 영향력을 행사할 수 있는 사람

10. 자기 자신을 관리하는 사람

Posted by Y2K
,

100도씨

시끌벅적 2009. 1. 7. 12:47

http://610.or.kr/museum/bbs/sub03e_000.html

  

예전부터 정치에도 관심이 많았고, 하는 지금 일 모두가 결국은 민주주의의 완성 아닌가.. 라는 생각이 드는 방법론들이 많이 나오는 이때에.. http://color.egloos.com/ 이곳 방문 했다가 업어온 글.

  

2MB의 당선. 그리고 지금 백골단의 부활. 우리나라의 역사의 수레바퀴는 어디로 굴러가고 있는 것일까.

Posted by Y2K
,

1960년대 한창 학생운동이 미국 대학가를 휩쓸고 있을 때였다.

하버드 법대의 한 학생이 졸업식에서 다음과 같은 연설을 했다.

"지금 우리나라는 혼란의 도가니에 빠져있다.

 대학가는 반란과 난동을 부리는 학생들로 가득 차 있으며 공산주의자들은 이 나라를 파괴하기 위해 열을 올리고 있다.

 위험이 도처에 도사리고 있지 않은가. 내부의 적과 외부의 적이 들끓고 있는 것이다.

 그렇다. 우리나라에게는 법과 질서가 필요하다. 법과 질서가 없다면 이 나라는 생존할 수 없다."

 

 우뢰와 같은 박수가 터져 나왔고 그것은 한참이나 그칠 줄 몰랐다.

 시국이 어수선한 중에도 하버드 법대 졸업생의 소신에 찬 뜨거운 졸업사라는 반응이었다.

 박수가 가라앉을 무렵 이 학생은 조용한 어조로 말을 이어나갔다.

 

 

 



 "방금 한 말은 1932년 아돌프 히틀러의 연설 내용이었다."

 

 

 

ps : 사실인지 아닌지는 모름.;;  

Posted by Y2K
,
1. "오늘까지"라는 말은 "내일 아침까지"라는 말이다.

2. 프로그램은 내가 원하는대로 움직이지 않는다. 타이핑대로 움직인다.

3. 요구 사양은 프로그램을 완성한 후에 추가된다.
기본 사양은 완성품을 고객이 보고 나서 결정된다.
상세 사양은 사용자가 프로그램을 사용해 본 이후에 결정된다.

4. 소프트웨어 설계에는 두 개의 방법이 있다. 

하나는 결함이 있을 수 없을 정도로 단순하게 만드는 방법이다.
다른 하나는, 분명한 결함을 눈치채기 어려울 정도로 복잡하게 만드는 방법이다.

5. 코드는 개발 현장에서 사용하는 것이 아니라 납품처에서 사용하는 것이다.
디버그는 납기일까지 하는 것이 아니라, 납품된 이후에 하는 것이다.

6. 프로그래머를 죽이기 위해서는 칼이 필요없다. 프로그램의 요구조건을 3번만 바꾸면 된다.

7. 다른 사람을 믿으라. 그 사람이 해결해줄지도 모른다. 
주의사항 - 먼저 자신을 의심해라.

8. 개발에 마지막은 없다. 출시만이 있을 뿐이다.

9. 클라이언트의 요구사항이 제 아무리 뒤늦게 추가되어도 납기일은 변하지 않는다.
이것을「납기 불변의 법칙」이라고 한다.

10. 우리의 고객들은 물과 기능추가를 공짜라고 생각하고 있다.

11. 주머니가 짠 고객일수록 잔소리가 많다. 

12. 개발 스케줄은 산수를 무시하며 짜여진다. 영업과는 1+1=2를 이해하지 못하는 사람의 모임이다. 

13. 한 명이 쓰러지면 모두가 쓰러진다.

14. 버그가 너무 심하다? 걱정마라. 어느 순간 그것은 기본 사양이 될 것이다.

15. 좋은 설계는 한 명의 천재보다 세 명의 범재를 요구한다.
나쁜 설계는 백명의 범재보다 한 명의 천재를 요구한다.

16. 고객에게 시스템 엔지니어는 부하이며, 프로그래머는 가축이다.
시스템 엔지니어에게 고객은 돈이다.
프로그래머에게 고객은 보이지 않는 악성 바이러스다.

17. 돈과 시간만 있으면, 그 어떤 시스템이라도 만들 수 있다고 생각하는가?
웃어라. 그 기회는 영원히 주어지지 않는다.

18. 품질은 사양 변경의 수와 규모에 의해, 얼마나 열화될지 결정된다.

19. 영업과는 공상이 실현된다고 생각하는 몽상가이다.
시스템 엔지니어는 넘을 수 없는 벽이 없다고 믿는 모험가이다.
프로그래머와는 몽상가와 모험가에 의해 칠흑의 바다에 내던져진 표류자이다.

20. 유능한 프로그래머가 프로그램 설계개념도를 받아들고 최초로 하는 일은, 프로그램의 
목적을 이해하는 것이다. 그리고 그 다음으로 하는 일은, 지정된 방법과 시간 안에는 
도저히 그 목적을 완수할 수 없다는 사실을 시스템 엔지니어에게 이해시키는 일이다.

21. 프로그램이란, 운과 감에 의해서 작성되는 기적이다.
운과 감이 없다면, 그 기간 내에 그러한 목표를 실현될 수 있을 리 없다.
따라서 사양 변경은 기적에 트집을 잡는 건방진 행위이며, 사양 추가는 기적이 두 번
일어날 것으로 믿는 무모한 행위이다.

22. 시스템 엔지니어는 지구력, 프로그래머는 순발력.

23. 정시에 퇴근하면, 일이 늘어난다.

24. 완벽한 프로그램은 완벽한 시간과 돈을 필요로 한다. 
미국의 국가 예산을 무제한으로 사용하는 NASA마저도, 아직 시간과 돈이 부족하다고 한다.

25. 눈으로 훑어볼 틈이 있다면 움직여라. 뇌세포보다 CPU가 더 해석이 빠르다. 그리고, 그 사이, 
쉴 수 있다.

26. 불편함을 버그라고 부를 것인가, 사양 상의 제한 사항이라고 부를 것인가는 남겨진 개발일자와
납기일에 의해 결정된다.

27. 정장 대신 캐쥬얼을 입고 출근하는 "캐쥬얼 데이"를 세간에서는 휴일이나 공휴일이라고 부르는
것 같다. 

28. 프로그램은 머리로 기억하지 않는다. 몸으로 기억한다.

29. 내일 쉴 수 있다면 오늘 죽어도 괜찮다.

30. 고객은 거짓말을 한다.
영업은 꿈을 말한다.
시스템 엔지니어는 공상을 이야기한다.
프로그래머는 과묵해진다. (혼잣말은 많아진다)

31.「네, 할 수 있습니다」라고 말하기 전에 10초만 곰곰히 다시 생각해보라.

32. 프로그래머는 1분 생각하고 1일을 코딩에 소비한다.
1시간 생각하고 1시간 코딩하는 대신에 말이다.

33. 납품 이후의 디버그는 버그를 부른다.

34. 세 개의 디버그는 하나의 버그를 낳는다. 이것을 버그의 엔드리스 루프라고 한다.

35. 안 좋은 예감은 반드시 적중한다. 그러나 프로그래머는 그 안 좋은 예감에 반응하지
않는다. 그것은 시스템 엔지니어의 일이다.

36. 아수라장을 해결할 수 있는 방법은 오직, 고객이 돈을 지불하는 것 뿐이다. 

37. 아마추어는 버그발견의 천재이다

38. 아, 그건 마이크로소프트에서만 가능한 주문입니다. 

39. 프로그래머가 불만이라고 생각하는 부분은 고객도 반드시 불만이라고 생각한다.

40. 건강하기 때문에, 건강을 해친다.

41. 그건, 당신이 말한 요구조건입니다만. 

42. 아, 개발실의 창문은 안 열립니다. 그 이유는 옛날에 한 프로그래머가 그 창문에서···

43. 고객은 최악의 사태를 믿지 않으며, 그 사태에 대한 준비를 악질적인 비용청구라고 생각한다.
시스템 엔지니어는 최악의 사태를 대비하고 준비하려 한다.
프로그래머는 최악의 사태를 누구보다 잘 예상하지만, 무시한다.

44. 만약 다른 직업을 갖게 된다면, 정시퇴근을「도망」이라고 부르지 않는 직업이 좋을 것 같다.

45. 시스템 엔지니어가 프로그래머에게 말하는「상식」은 3시간마다 변한다.

46. 최소한 자기가 쓴 시방서는 읽어주세요. 

47. 고객이 시스템 엔지니어에게 사랑받는 방법은, 시스템 개발에는 시간이 곧 돈이라는 사실을
깨닫고 빨리 최종요구조건을 확정하는 것이다. 

SE가 고객에게 사랑받는 방법은, 프로그래머에게 미움받는 것이다.

48. 납기일이란, 작업현장이 우리 회사에서 고객의 회사로 바뀌는 날을 의미한다.

49. 가끔 일어나는 버그는 버그가 아니다. 스펙이다. 

50. 개발비의 30%는 프로그램의 요구조건을 확정하는데 사용된다.
개발비의 30%는 프로그램의 요구조건을 변경하는데 사용된다.
개발비의 30%는 프로그램의 버그를 잡는데 사용된다.
개발비의 10%만이 프로그램의 개발에 사용된다.


출처: http://newkoman.mireene.com/tt/1456

======================================================================

다른데서 본건데, 개발자가 가장 많이 하는 거짓말은 "바꾼거 없는데요" 란다. ㅋㅋㅋ
Posted by Y2K
,

0005. Jolly Jumper

시끌벅적 2009. 1. 7. 12:02

require 'test/unit'

class JollyJumper
  attr_reader :values
 
  def initialize
    @values = []
  end
 
  def insert_value(value)
    @values << value
  end
 
  def print_values
    @values.each{ |value| print value.to_s + ' ' }
  end
 
  def calculate
    result = true
    @values.each_index do |index|
      first_value = (@values[index -1] - @values[index]).abs if @values[index-1] != nil
      second_value = (@values[index +1] - @values[index]).abs if @values[index+1] != nil   
      result &= values.member?(first_value) if first_value != nil
      result &= values.member?(second_value) if second_value != nil
    end
    result
  end 
end

class JollyJumperTest < Test::Unit::TestCase
  def test_case1
    jumper = JollyJumper.new
    assert_not_equal(nil, jumper)
    jumper.insert_value(4)
    jumper.insert_value(1)
    jumper.insert_value(4)
    jumper.insert_value(2)
    jumper.insert_value(3)   
    jumper.print_values()
    assert_equal(true, jumper.calculate)
  end
 
  def test_case2
    jumper = JollyJumper.new
    assert_not_equal(nil, jumper)
    jumper.insert_value(5)
    jumper.insert_value(1)
    jumper.insert_value(4)
    jumper.insert_value(2)
    jumper.insert_value(-1)   
    jumper.insert_value(6)   
    jumper.print_values()
    assert_equal(false, jumper.calculate)
  end
 
end

Posted by Y2K
,

0004. Seven-Segment

시끌벅적 2009. 1. 7. 12:01

import unittest
import os
import math

segment_enables = [
[True, True, True, False, True, True, True],
[False, False, True, False, False, True, False],
[True, False, True, True, True, False, True],
[True, False, True, True, False, True, True],
[False, True, True, True, False, True, False],
[True, True, False, True, False, True, True],
[False, True, False, True, True, True, True],
[True, True, True, False, False, True, True],
[True, True, True, True, True, True, True],
[True, True, True, True, False, True, True]
]


class SevenSegmentNumber:
    def __init__(self, number, size):
        self.size = size
        self.number = number
        self.max_line = size * 2 + 3
    
    def printHorizontalLine(self, print_enable):
        lines = ' '
        for i in range(self.size):
            if print_enable:
                lines = lines + '-'
            else:
                lines = lines + ' '
        lines = lines + ' '
        return lines
   
    def printVerticalLine(self, print_first, print_last):
        lines = ''
        vert_size = self.size  + 2
        if print_first:
            lines = lines + '|'
        else:
            lines = lines + ' '
       
        for i in range(vert_size - 2):
            lines = lines + ' '

        if print_last:
             lines = lines + '|'
        else:
             lines = lines + ' '       
        return lines  
   
   
    def getLine(self, line):
        total_line = self.size * 2 + 3
        line_segment = (total_line - 3) / 2 + 1
        line_end = total_line - 1       
        out_line = ''      
        if line == 0:
            out_line = self.printHorizontalLine(segment_enables[self.number][0])
        elif 0 < line and line < line_segment:
            out_line = self.printVerticalLine(segment_enables[self.number][1], segment_enables[self.number][2])
        elif line == line_segment:
            out_line = self.printHorizontalLine(segment_enables[self.number][3])
        elif line_segment < line and line < line_end:
            out_line = self.printVerticalLine(segment_enables[self.number][4], segment_enables[self.number][5])
        elif line == line_end:
            out_line = self.printHorizontalLine(segment_enables[self.number][6])
        return out_line

class Numbers:   
    def __init__(self):
        self.numbers = []
        self.seven_segments = []

    def displayNumber(self, number, size):
        decimal = int(math.log(number) / math.log(10)) + 1
        self.numbers = []
        self.seven_segments = []
       
        for i in range(decimal):
            self.numbers.append(int(str(number)[i]))
            segment = SevenSegmentNumber(self.numbers[i], size)
            self.seven_segments.append(segment)
       
        max_line = self.seven_segments[0].max_line
        for i in range(max_line):
            line = ''
            for s in range(decimal):
                line = line + self.seven_segments[s].getLine(i) + ' '
            print line
       

class SevenSegmentNumberTest(unittest.TestCase):
    """
    def testDisplay(self):
        print 'Start'
        zero = SevenSegmentNumber(8, 3)
       
        for i in range(zero.max_line):
            print zero.getLine(i),
            print ""
    """
    def testNumber1(self):
        number = SevenSegmentNumber(8, 2)
        #print number.getLine(0)
        #self.assertEqual(number.max_line, 3 + 2 * 2)
        #self.assertEqual('    ', number.getLine(0))
        #self.assertEqual('   |', number.getLine(1))
       
        #for i in range(0, number.max_line):
        #    print number.getLine(i)
   
    def testOutputNumber(self):
        for i in range(10):
            number = SevenSegmentNumber(i, 2)
            for j in range(number.max_line):
                print number.getLine(j)
      
if __name__ == '__main__':
    #unittest.main()
    n = Numbers()
    n.displayNumber(1238, 3)

  

require 'test/unit'

class SevenSegment
    attr_reader :number, :size, :height, :width
    attr_writer :number, :size
   
    @@segment_enables = [
            [true, true, true, false, true, true, true],
            [false, false, true, false, false, true, false],
            [true, false, true, true, true, false, true],
            [true, false, true, true, false, true, true],
            [false, true, true, true, false, true, false],
            [true, true, false, true, false, true, true],
            [false, true, false, true, true, true, true],
            [true, true, true, false, false, true, false],
            [true, true, true, true, true, true, true],
            [true, true, true, true, false, true, true] ]
   
    def initialize(number, size)
        @number = number
        @size = size
        @height = size * 2 + 3
        @width = size + 2
    end
   
    def get_vertical_line(mark_first, mark_second)
        line = ''
        length = @size + 2
        
        line = line + '|' if mark_first
        line = line + ' ' if !mark_first

        @size.times { line = line + ' ' }
       
        line = line + '|' if mark_second
        line = line + ' ' if !mark_second
        line       
    end
   
    def get_horizontal_line(enable)       
        mark = ''
        mark = '-' if enable
        mark = ' ' if !enable
        length = self.size + 2

        line = ' '
        @size.times { line = line + mark }
        line = line + ' '
        line
    end
    
    def get_line(line_count)
        if line_count == 0 then self.get_horizontal_line(@@segment_enables[@number][0])
        elsif line_count > 0 and line_count < (@size+1) then self.get_vertical_line(@@segment_enables[@number][1], @@segment_enables[@number][2])
        elsif line_count == (@size+1) then self.get_horizontal_line(@@segment_enables[@number][3])
        elsif line_count > (@size+1) and line_count < (@size * 2 + 2) then self.get_vertical_line(@@segment_enables[@number][4], @@segment_enables[@number][5])           
        elsif line_count == (@size * 2 + 2) then self.get_horizontal_line(@@segment_enables[@number][6])                   
        end
    end   
end

class SevenSegments
    attr_reader :numbers, :size
    attr_writer :numbers, :size
   
    def initialize(size, number)
        @size = size
        self.set_number(number)
    end

    def set_number(number)
        @numbers = []
        string_numbers = number.to_s()
        string_numbers.length.times { |index| @numbers << string_numbers[index] - 48 }
    end

    def display_number
        puts ' '
        seven_segments = []
        @numbers.each { |n| seven_segments << SevenSegment.new(n, @size) }
        line = @size * 2 + 3

        line.times do |line_count|
            line = ''
            seven_segments.each do |seven_segment|
                line = line + seven_segment.get_line(line_count) + ' '
            end
            puts line
        end
       
    end
end

class SevenSegmentsTest < Test::Unit::TestCase
    def test_numbers
        s = SevenSegments.new(3, 987654321)
        print s.numbers[0]       
        s.display_number
        assert_equal(9, s.numbers[0])
    end
end

class SevenSegmentTest < Test::Unit::TestCase
    def test_number0
        s = SevenSegment.new(0,2)
        assert_equal(" -- ", s.get_line(0))
        assert_equal("|  |", s.get_line(1))
        assert_equal("|  |", s.get_line(2))
        assert_equal("    ", s.get_line(3))
        assert_equal("|  |", s.get_line(4))
        assert_equal("|  |", s.get_line(5))
        assert_equal(" -- ", s.get_line(6))
    end

    def test_number1
        s = SevenSegment.new(1,2)
        assert_equal("    ", s.get_line(0))
        assert_equal("   |", s.get_line(1))
        assert_equal("   |", s.get_line(2))
        assert_equal("    ", s.get_line(3))
        assert_equal("   |", s.get_line(4))
        assert_equal("   |", s.get_line(5))
        assert_equal("    ", s.get_line(6))
    end
    
    def test_number8
        s = SevenSegment.new(8,2)
        assert_equal(" -- ", s.get_line(0))
        assert_equal("|  |", s.get_line(1))
        assert_equal("|  |", s.get_line(2))
        assert_equal(" -- ", s.get_line(3))
        assert_equal("|  |", s.get_line(4))
        assert_equal("|  |", s.get_line(5))
        assert_equal(" -- ", s.get_line(6))
       
    end
end

Posted by Y2K
,

0003. The Trip

시끌벅적 2009. 1. 7. 11:59
import unittest

class TheTrip:
    def __init__(self, count):
        self.count = count
        self.costs = []
        pass
    def inputCost(self, cost):
        self.costs.append( float(cost * 100) )
    def calculateAverageCost(self):
        return float( sum(self.costs) / len(self.costs) ) / 100.00
    def calculateMinCharge(self):
        average = self.calculateAverageCost() * 100.00
        diff_values = []
        for value in self.costs:
            differ = average - value
            diff_values.append(abs(differ))
        return sum(diff_values) / 2.00 / 100.00

class TheTripTest(unittest.TestCase):
    def setUp(self):
        pass
    def testInsertValue(self):
        t = TheTrip(3)
        t.inputCost(10.00)
        t.inputCost(20.00)
        t.inputCost(30.00)
        self.assertEqual(20.00, t.calculateAverageCost())
        self.assertEqual(10.00, t.calculateMinCharge())
    def testInsertValue2(self):
        t = TheTrip(4)
        t.inputCost(15.00)
        t.inputCost(15.01)
        t.inputCost(3.00)
        t.inputCost(3.01)
        self.assertEqual(11.99, t.calculateMinCharge())
if __name__ == '__main__':
    unittest.main()


require 'test/unit'

class TheTrip
attr_reader :member, :costs, :average
attr_writer :member, :costs

    def initialize(number)
        self.member = number
        self.costs = []
    end

    def input_cost(cost)
        self.costs << cost
        @average = 0
        self.costs.each {|value| @average += value }
        @average /= self.costs.length
    end

    def get_min_charge()
        charges = 0.00
        self.costs.each { |value| charges += (value - self.average).abs }
        return charges / 2.00
    end
    
end

class TheTripTest < Test::Unit::TestCase
    def test_case1
        t = TheTrip.new(3)
        t.input_cost(10.00)
        t.input_cost(20.00)
        t.input_cost(30.00)
        assert_equal(20.00, t.average)
        assert_equal(10.00, t.get_min_charge())
    end

    def test_case2
        t = TheTrip.new(4)
        t.input_cost(15.00)
        t.input_cost(15.01)
        t.input_cost(3.00)
        t.input_cost(3.01)
        assert_equal(11.99, t.get_min_charge())
    end
end
Posted by Y2K
,