728x90
완전제곱이란?


인터넷 카페를 돌다가 누군가 완전제곱 판별 소스를 올려놓은 것을 봤다. 소스를 보면서 문제를 풀 때 바로 컴퓨터 앞에서 작성을 시작하는 것이 얼마나 위험한 일인지 다시 생각하게 되었다.
아래는 까페 관리자가 올린 소스다. 프로그래밍에 꽤 신경을 많이 쓰는 것이 보이는 사람인데 문제를 풀 때는 가끔 실수를 하기도 하니까.. 만약 이 글을 본다면 기분나쁘게 생각하지 말았으면 좋겠다.

좀 더 많은 수를 입력받을 수있게 하기 위해 unsigned long을 사용하고 있는 것을 알 수 있다.(int는 컴파일러에 따라 다른 결과를 가져올 수도 있다.)
무리하게 if문 내에 핵심내용을 기술하는 것 외에도 치명적인 실수가 있다. 프로그램이 실행되는 동안 불필요한 작업을 반복해서 하고 있는 부분이 있다. 도대체 어디가? 아래 글을 보기 전에 한번 차근자근 따져보기 바란다.


================================================================================
불필요한 작업은..

그래서 소스를 조금 수정해봤다.

이래놓고 봐도 도저히 마음에 들지 않는다. 이럴 땐 문제를 처음부터 다시 인식하는 과정이 필요하다.
완전제곱의 정의 : 다른 정수의 제곱으로 표현되는 정수
1조건 : 정수여야 한다.
2조건 : 다른 정수의 제곱으로 표현된다.(다시 말하면 기하평균이 정수다.)

이렇게 생각해보면 기하평균이 정수인지 확인해보면 되는 것이다. 기하평균이란 어떠한 수의 제곱근을 말하는 것으로 루트를 씌운 값이라고 생각하면 쉽다. 기하평균이 정수인지는 어떻게 판단하지? 난 아래와 같은 코드를 생각했다.

꽤 길고 복잡한 소스가 두줄로 줄었다. 심지어 이정도라면 함수를 따로 구현할 필요조차 없이 그냥 한줄로 넣어주면 된다. 문제를 제대로 인식하고 어떤 방법으로 접근할 것인가를 깊이 생각해보는 것은 프로그래머의 중요한 습관이다. 열심히 생각하고 노력하는 사람들도 실수를 많이 하는데 처음부터 함부러 뛰어드는 습관이 들어버린다면 당신은 프로그래머가 아니라 코더로 만족해야 한다.
728x90
728x90

익스트림 프로그래밍(XP, eXtreme Programming) 이라는 방법은 최근의
소프트웨어 개발 방법론 분야에 새로 등장했습니다.
많은 사람들이 "프로그래머들이 정말 원하는 방법"이라고 하는
익스트림 프로그래밍(XP)은 90년대 말에 등장했으며 2명으로 구성된 작은
회사에서 포드 자동차에 이르기까지 다양한 규모의 회사에서 쓰이고 있습니다
익스트림 프로그래밍(XP)의 가장 큰 장점은 막판에 스펙이 변경되는 일이 있어도
고객이 원하는 것을 고객이 원하는 기한에 맞춰서 제공할수 있다는 점입니다

익스트림 프로그래밍(XP)는 서로 조화롭게 쓸수 있도록 계획된 일련의 규칙이 있습니다
물론 그 가운데 일부만을 채택하고 있는 프로그래머도 많이 있긴 합니다.

이런 규칙들에는 다음과 같습니다

.조금씩, 하지만 자주 발표한다
.사이클을 반복해서 돌리면서 개발한다
.스팩에 없는 것은 절대 집어 넣지 않는다
.테스트 코드를 먼저 만든다
.야근을 하지 마라. 항상 정규 일과 시간에만 작업을 한다
.기회가 생기는 족족 언제 어디서든 코드를 개선한다
.모든 테그트를 통과 하기 전에는 어떤 것도 발표하지 않는다
.조금씩 발표하는 것을 기반으로 하여 현실적인 작업 계획을 만든다
.모든일을 단순하게 처리한다
.두명씩 팀을 편성하고 모든사람이 대부분의 코드를 알수 있도록 돌아가면서
작업한다.

http://www.extremeprogramming.org/

http://agilemanifesto.org/

====================================
이거 내 머리에서 나온 말은 아니다. 익스트림 프로그래밍..확실히 개발속도가 향상될 것 같다. 하지만 체계는 좀 없어보인다.

728x90
728x90

기사원문

========================================================================
같은 소스를 컴파일해도 터키에서는 돌아가지 않는단다. 언어의 문화적 차이 때문이다.
소수점을 마침표(.)와 쉼표(,)로 구분하는 차이, ToLower, ToUpper등 언어의 인식 차이(미쿡에서는 ToUpper를 소문자에서 대문자로 바꾸는 것으로 인식하지만 터키에서는 글자의 크기를 크게 만드는 것으로 인식한다.)
같은 코드를 컴파일하면 에러가 발생하는데 그나마도 브라우저를 터키어로 맞추지 않으면 볼 수 없단다.
.NET에서는 그러한 문화적 차이를 표시해주는 코드가 포함되어 있는데 'Invariant'가 그것이란다.

한국도 마찬가지다. 많은 한국인들이 다분히 미쿡을 동경하지만 언어에 있어서는 한국어를 사랑한다. 일상생활에서 영어를 능숙하게 말하고 다니면 '어머 웬 잘난척? 즈질이야~'정도의 말을 듣는다.(나도 그런말 들어보고 싶다.) 한국어를 좋아하고 주로 사용하는 것은 좋은 현상이다. 그런데 상황에 맞게 사용해야 한다. 프로그래밍을 할 때 시간표시나 숫자표시등이 일치되지 않는 부분이 꽤 있다.
시간표현은 표현방식이 아주 다양하다.
24시표현, AM/PM, 오전/오후
시:분, 시/분, 시-분, 시 분
이렇게 다양한 표현을 모두 한국 문화에서 사용한다. 숫자표현은 어떤가? 그냥 숫자를 바로 사용하기도 한다. 그건 세계 공통이다. 하지만 숫자의 자릿수를 좀 더 명확히 하기위해 ,로 세자리 단위씩 끊어서 표현한다.
그리고 읽을 땐 4자리 단위로 읽는다. 한국에서 사용하는 숫자의 단위는 4단위다.
일, 만, 억, 조, 경, 해... 그런데 숫자는 3단위다. 미쿡에서는 숫자의 단위가 3단위다. 어렸을 적 새로운 단위가 제대로 정착되는데 혼란이 없다면 표기단위를 4단위로 하는 것이 좋을 것이라고 생각했었다.

글에서 문화적 차이를 뛰어넘으려면 ISO표준을 따르라고 권하고 있다.

물론 국제표준을 따르는 것이 가장 좋다. 그리고 그렇게 하지 못할 땐 입장을 확실하게 해야 한다. 무슨 말이냐면 한국식으로 하고싶으면 해당 scope내에서는 확실히 한국식으로 하고, 미쿡식으로 하고싶으면 확실히 미쿡식으로 하고 ISO대로 하고싶으면(ISO표준이 미쿡식은 아니다) ISO에 맞추어서 하란 말이다.
가끔 실무에서도 변수 이름으로 한국어발음을 억지로 영어로 적어놓은 경우를 자주 볼 수 있다.
(실제 이런 이름을 쓰진 않겠지만 굳이 예를 든다면 show, view, print등의 내용을 bogi(보기)와 같이 억지로 쓰는 경우가 있다.)

상대가 정 모르면 사전을 찾아서라도 알 수 있으면 그건 괜찮다. 자신이 있지도 않은 단어를 만들어버리는 도대체 어떻게 알아보란 거야? 이도 저도 아닌 어중간한 지점에서 타협하지 마라!!

728x90
728x90
사용자 삽입 이미지
역시 내 머리는 체계적이지 못해서 'Code Craft'란 책의 힘을 빌리기로 했다. 그런데 이거 원서를 읽기는 부담스럽고 번역서를 읽자니 번역이 엉망이다. 일단 샀으니 열심히 보겠다만 번역한 사람이 어디서 굴러먹던 프리렌서인지 몰라도 번역 후 자기 글을 얼마나 열심히 읽었는지 알 수가 없다. 내용은 좋은 책이니 나한테 필요한 부분만 골라서 열심히 정리해보자

기본 습관 : 에러체크, 테스트, 디버깅
에러체크 : 코드를 작성하는 도중에 발생가능한 에러를 체크하고 막는 과정
테스트 : 발생가능한 에러가 있는지 찾아보는 과정(일단 테스트할 부분은 완성되었다고 가정)
디버깅 : 찾아낸 에러를 수정하는 과정이다.(말 그대로 버그잡기, 글로 따지면 퇴고다.)

코드 작성을 서두르지 마라.
gotcha : 문법적으로는 맞지만 원하는 것과 다르제 작동하는 것. ==를 =로 잘못 타이핑 하는 것등.

아무도 믿지마라.
당신의 코드가 사용되는 곳은 다음과 같다
* 우연히 엉터리 데이터를 입력하거나, 프로그램을 잘못 작동하는 정직한 사용자
* 의식적으로 프로그램에 오작동을 일으키는 악의적인 사용자
* 잘못된 파라미터(주1)를 가지고 함수를 호출하거나 모순된 데이터를 입력하는 클라이언트 코드
* 프로그램에 적절한 서비스를 제공하지 못하는 실행환경(OS등)
* 오작동을 하거나, 당신이 의존하는 인터페이스 규격을 따르지 않는 외부 라이브러리

짧은 코드가 아니라 명료한 코드를 작성하라
코드는 한눈에 들어와야 한다. 함수나 method는 20~30줄을 넘지 않는 것이 좋다. 그렇지만 짧다고 좋은 코드는 아니다. x += ++y; 이딴 식의 복잡한 수식은 절대 쓰지마라.
++y;
x = x + y;
이렇게 두줄이면 충분할 것을 괜히 줄인다고 복잡한 수식을 사용하면 알아보기가 어렵다. 당신이 연산자 우선순위를 잘 알고있다는 것은 자랑할 수 있지만 아무도 같이 일하려 들지 않을 것이다. 극단적인 경우 지나치게 복잡한 연산식 때문에 컴파일러가 잘못된 코드를 생성할 수도 있다.(최적화 과정에서 발생하는 에러는 이러한 경우가 많다. 컴파일러를 거치고 난 어셈블러를 분석해보면 원래코드랑 조금 다른 것을 볼 수 있다. 그건 최적화를 거쳐서 그렇다.)

어설프게 만지면 안되는 것은 아무도 못 만지게 하라
* 객체지향언어에서는 맴버변수를 모두 private로 한다.
* 모든 변수는 그 변수가 속할 수 있는 가장 좁은 범위(scope)안에 둬라.
-- 무지하게 잘난 인간이 아니면 전역은 쓰지마라.
-- 루프안에 선언해도 되는 변수는 루프안에 선언해라.
-- method 내에서만 사용해도 되는 변수를 맴버변수로 올리지 마라.

경고를 무시하지 마라.
컴파일하면 경고(warning)이 뜨는 경우가 있다. 위험하다고 경고하는 거다. 그냥 넘어가면 안된다.
만약 특정 경고가 당신에게 중요치 않더라도 그대로 두지 마라. 나중에 그로인해 정말 중요한 경고가 눈에 안 띄게 될수도 있다.
728x90

+ Recent posts