• 기독교의 핵심진리
    성경은 모든 인간은 죄인이라고 말합니다. 어쩔 수 없는 죄인입니다. 태어날 때부터 그렇습니다. 가만히 생각해보면 여러분도 지금까지 얼마나 많은 죄를 지었습니까? 동의할 수 없다고요? 남에게 피해를 주지 않는 죄까지 모두 포함해 보십시요. 사실 죄를 죄인지도 모르는 것이 더 문제이지요. 그럼 왜 나면서부터 죄인이냐고 묻는다면 원래 그렇다. 라고 말하고 싶네요. 억울하지만 원래 조상부터 죄인이라서 태생이 죄인이라는 것입니다. 흑인이 아무리 흰살을 갖고 싶다고 백인이 될 수 있습니까?(죄송합니다, 사실은 저도 피부가 까맣습니다. 오해 없으시길.. 그냥 비유) 그냥 저 깊숙히부터 존재론적으로 죄를 가지고 있다는 뜻이지요. 먼저 이것을 뼈저리게 깨닫는데서 모든 것이 시작됩니다. 다른 종교처럼 도를 닦은 사람은 어느 정도 완전하다고 하지 않습니다. 조금이라도 죄가 있으면 하나님 보시기에는 죄인입니다. 치사하게 죄의 양을 따지지 않는다는 것입니다. 어짜피 거기서 거기니까요. 모든 인간은 죄인이다. 이것이 첫번째 진리입니다. '죄'의 개념은 기독교에서 아주 중요한 개념입니다.(그런데 동양에서는 '죄'라는 것에 대해서 별로 생각하지 않는 것 같습니다. 그것이 의식과 문화에도 남아 있고요.)
    두번째 진리는 죄의 댓가는 죽음이라는 것입니다. 무섭지요? 기독교는 이렇게 무서운 종교입니다. 봐주는게 없습니다. 아무리 작은 죄를 지어도 미안하지만 죽어야 합니다. 완전하신 하나님 기준으로 보면 그렇습니다. 어느정도 죄가 없는 사람은 죽지않아도 된다고 하는 것은 너무 인간적이지 않습니까? 그럼 이제 큰일입니다. 모든 사람은 죄인이고 따라서 죽어야한다. 이 죽음이란 영원한 죽음입니다. 이 땅에서 생명이 그치는 것만을 의미하지 않습니다. 원래 인류의 시조가 죄를 짓지 않았다면 이 세상에는 죽음이라는 것이 없었을 것입니다. 그런데 기독교에는 커다란 원리로서 '대속'이라는 것이 있습니다. 내가 죽는 대신에 다른 사람이라도 죽으면 나의 죄의 댓가가 치러진다는 것입니다. 예수 그리스도가 세상에 오시기 전에는 유대인들은 자신의 죄를 씻시 위해서(속죄) 소나 양을 죽여서 그 피를 흘림으로 상징적으로 죄에 대해 용서를 받았습니다. 그러다가 메시야(예수님)가 오셔서 온 인류를 대신해서 십자가에 죄인으로 죽었습니다. 아주 처절하게 저주를 받아서 십자가에서 돌아가셨습니다. 하나님은 처음부터 이것을 계획하고 계셨습니다. 왜냐하면 죄가 이 세상에 들어온 것은 사탄에 의한 것인데 하나님의 공의(Justice)를 허물지 않으면서 인간들을 사탄에게서(죽음으로 향하는) 구하기 위한 방법으로 자신이(하나님의 아들) 직접 죽으신 것입니다. 그리고, 아주 신기하게도이것을 믿으면, 즉 예수님이 십자가에 돌아가신 것이 우리의 죄를 위한 것이다라고 이것을 믿으면 죄가 없다고 해 주시기로 약속하셨습니다. 이 혜택은 누구에게나 유효한 것입니다. 법적으로 효력이 있다는 것입니다. 그런데 하나님이 왜 그런 일을 하셨을까요? 하나님은 세상을 사랑하십니다. 성경에 의하면 하나님은 무서울 때도 있지만 감사하게도 우리 사람을 너무나 사랑하신다는 것입니다. 저를 포함해서 이렇게 형편없는 저희 인간들을 말입니다. 매일 신문에서 보이는 것을 보십시요. 사람이 얼마나 추할 수도 있다든 것을요.
    어쩌면 그냥 인간의 뇌에서 일어나는 현상인 '믿는다'라는 것이 인간의 구원과 관련되는지 신기하지요. 성경도 마찬가지 입니다. 인쇄술을 통해 하나님의 뜻이 전달된다는 것이니까요. 우리가 마음속으로 기도할 때 하나님이 들으신다는 것도 신기합니다. 하나님이 사람과 교통하시는 방법은 이런 것들입니다. 무슨 특별한 초자연적인 현상만을 통해서가 아니라 모든 사람이 이해할 수 있는 방법을 통해서입니다. 그런데 이 모든 것을 받아들이는 것은 결국 믿음의 문제입니다. 마음의 문제이지요. 제가 볼 때는 믿지 않는 사람들은 믿지 못해서가 아니라 믿지 '않는' 것이라고 생각합니다. 자연 만물을 보아도 하나님이, 창조자가 있다는 것을 알 수 있습니다. 우리가 비행기를 보았을 때 '참 훌륭하게 만들었구나, 설계를 잘 했다' 라고 생각하지요. 그렇지만 사과나무 씨앗을 보십시요. 누가 그것을 설계했습니까, 사실 알고보면 비행기보다 더 복잡합니다. 사람의 씨앗(정자,난자)도 그렇습니다. 질서있게 돌아가는 우주의 법칙이나 우주 만물도 그렇습니다. 누군가 그런 법을 만들지 않았을까요? 그런 복잡한 것들이 저절로 생겨났을까요?
    여러분도 예수 그리스도를 만나시길 바랍니다. 혹시 그 사람이 진짜 메시야일 수 있지 않을까 생각해 보십시요. 그분은 마음의 문만 열먼 누구에게나 오실 것입니다. 우리의 모든 약한 것을 아시는 분이십니다. 친히 사람의 몸으로 나셨던 분입니다. 마음 속으로 '예수님, 제가 아직 잘 믿어지지는 않지만 모든 사람의 죄를 대신해서 십자가에 돌아가신 것을 믿겠습니다. 제 마음 속에 들어 오시고, 앞으로 제 주인으로 모시겠습니다.' 하고 기도하면 되는 것입니다. 너무 간단해서 믿기 힘들지요? 가까운 교회에 등록하시고 신앙인이 되어 보십시요. 오늘은 시간이 없어서 이만 마치겠습니다.
  • ASIC 설계에 필요한 능력
    어느 web page에 갔다가 어느 학부생이 ASIC설계하는 일에 필요한 자질이 무엇이냐고 질문을 했더군요. 저는 이렇게 생각합니다.(어떤 사람은 '노가다'라고 깎아 내리던데..) 사실 어떤 일을 하건 기본은 '머리'입니다. 머리가 좋으면(타고난 것도 있고, 얼마나 머리를 쓰느냐에 따라 더 좋아진다고 생각) 무슨 일을 하건 빨리,정확하게 파악할 수 있으니까요, 제 생각에는 많은 경우에 이해(파악)가 부족해서 일을 잘하지 못하는 것 같습니다. 그 학생이 말한대로 영어를 잘하는 것은 대부분의 책,논문,설명서 들이 영어로 되어 있으므로 큰 도움이 됩니다. (영어는 아주 잘 할수록 좋겠지요, 저도 계속 노력하는 편이지만) 구체적으로는 ASIC 설계에 있어서는 규격을 파악하는 일과 상용 칩의 설명서를 보고 파악하는 일, CAD 사용법을 익히는데 영어실력이 큰 도움이 됩니다. (정확히 이해하고 '감'을 잡는다는 뜻입니다.) 다음에 학부에서 배우는 기본적인 지식을 잘 습득해야 합니다. 논리회로 설계, AND OR 뿐만 아니라 sequential 회로 부분의 여러 개념들(특히 state machine), 설계론 적인 것들 (top-down, 어떤 방식으로 구현할까 등..) 실습 모두 중요합니다. 제 생각에는 제대로만 배운 사람이라면 책으로만 배웠더라도 실무경험이 어느 정도 있는 사람보다 잘 할 수도 있다고 봅니다. 그리고 체력이나 투지도 있어야 합니다. 아무리 머리가 좋고 throughput이 높아도(제 생각에는 어떤 일에 있어서 사람의 능력이란 5배에서 10배까지 차이가 날 수 있다고 봅니다.) 보통은 오랜 기간 늦게까지 일할 수 밖에 없는 일이 ASIC 설계하는 일입니다. 끈기와 꼼꼼함이 필요합니다. 그렇지만 무엇보다 속도, 즉 원하는 기능을 헤메지 않고 빨리 '구현해 버리는'일이 가장 중요합니다. ASIC내부 도 중요하지만 점점 칩의 기능이 많아지고 복잡해 지면서 검증하는 일이 중요해지는데 testbench를 효과적이고 완벽하게 짜서 확인하는 것이 bug를 없애는 유일한 방법이 됩니다. 만약 어떤 기능을 빠른 속도로 coding할 수 없다면 아무리 좋은 idea가 있더라도 세월만 가는 것입니다. 요점을 말하면 idea를 code로 옮기는 기술, 이것이 속도인데 이것은 지능,지식,느낌 등이 총 동원되는 작업이기 때문에 한마디로 자기의 기본능력을 높이는 것이 가장 좋은 길이라고 저는 주장합니다.
  • TEST_BENCH 만들기
    testbench를 자동화한다? 이건 생각할 수 없습니다. 그 많은 기능을 test할 수 있는 testbench를 만드는 것은 DUT(Design Under Test) 자체 설계 만큼 (? 같은 만큼은 아니지만) 생각을 많이해서 설계하고 coding, simulation기능이 필요한 것입니다. 예를 들어 통신용 ASIC을 만든다고 하면
    0. 전체 simulation을 governing하는 process(CPU에서 해도 되고)
    1. DUT로 트래픽을 만들어주는 장치, (보통 단순 트래픽이 아니고 별도의 프로토콜을 담고 있는 여러개의 트래픽의 합)
    2. DUT로부터 트래픽을 받아 분석하는 장치,
    3. CPU의 행위를 흉내내는 process, (interrupt service routine 포함)
    4. 기타 DUT에 달라붙는 logic (외부 메모리 등)
    5. 기타 monitoring하는 장치 (CRC error를 본다든지, 예를들어 PCI 버스의 프로토콜을 검사한다든지)
    이런 것들을 일일이 만들어 주어야 합니다. 마치 계측기를 달고 하는 식으로 해 주어야 어느정도 믿을 만한 simulation이 되는 것입니다.
  • 수학에서 잘못된 이름 하나 : 유리수
    이 이름은 영어의 rational number에서 나온 것인데 이 때의 rational은 '비례의'(발음은 레이셔널)라는 뜻이지요. 즉 p/q, p,q는 integer, 의 형식으로 표현될 수 있다는 뜻입니다. 그런데 이것을 '합리적인, 이유가 있는'이라는 뜻을 가지는 같은 spelling의 rational(래셔널)로 이해하여서 어느 몰상식한 수학자(일본 수학자였을 것 같네요)가 유리수(有理數)로 옮겨 놓은 것입니다. 저는 학교다닐 때부터 이것이 잘못되었다고 생각했는데요, 고쳐져야 하겠지요?(my own idea)
  • 컴퓨터과학에서 잘못된 이름 하나 : 연상메모리
    이것도 잘못 지어진 이름 같습니다. 연상메모리(영어로 associative memory)는 어떤 값을 주었을 때 그것과 관련된, 그것과 associated된 다른 내용이 나온다는 의미에서 지어진 이름입니다. association이란 단어에는 '연상'(뭐를 보면 관련된 다른 것이 생각나는 현상)이라는 뜻외에도 '관련, 연결'이라는 뜻도 있지요. 어떻게 보면 서로 비슷한 뜻이지만 우리말의 '연상'이라는 말을 사용하는 것은 좀 부적당하지 않나 생각합니다. 저라면 연관메모리, 아니면 그냥 associative memory라고 하겠네요. ps- 어떤 사람들은 번지를 넣어주면 해당하는 데이타가 나오는 메모리라고 알고 있는데 이것은 연상메모리의 일부분 기능입니다. 연상메모리 내부에는 입력데이타와 자신의 데이타를 비교해서 일치되는 번지를 찾아 그 번지를 내어준다음 (여러개가 있으면 선택도 하지요) 그것을 번지로 사용해서 관련된 다른 데이타를 읽도록 되어 있습니다. CAM(Content Addressable Memory 라고도 하지요.
  • Design Compiler로 합성하기