쓸모없는 삽질 이야기.
오늘 주일 설교 예화중에 인생에 있어서 100점짜리 단어에 대한 이야기가 있었다. a 는 1점 , b 는 2점 c는 3점 이런식으로 환산해보면 , 아래와 같다.
luck(운) = 47점
love(사랑) = 54점
leadership(리더쉽) = 89점
hardwork(열심) = 98점
attitude(태도) = 100점
예화는 예화일뿐 공학적으로 너무 심각한 의미를 부여하지는 말자.
하지만, 나는 이과 공대생!
옆에 계셨던 분이 100점 짜리 단어가 attitude 만 있을까? 하는 질문을 주셨고, 나도 갑자기 궁금해져서 파이썬으로 프로그램을 짜보게 되었다.
과연 100점 짜리는 단어는 얼마나 있을까?
(입력 모수는 1800단어 고교 단어)
[가설]
확률적으로 약 1% 정도 존재할 것이며 attitude 만 있지는 않을꺼야.
[질문]
1. attitude 외에 100점 짜리 단어는 ?
2. 있다면 단어별 전체 분포도는?
[결론]
1. 약 1%의 확율로 영어단어중 100점 단어가 여러개 있다.
2. 분포도에서 75점이 제일 많고 50-110점 사이가 1-2% 대역에 분포해 있다.
3. useless 도 100점 이라는 사실!
[코드 소스]
import matplotlib.pyplot as plt
def cal_word(word):
val = 0
for i in word:
if ord(i) != 10:
#print(i, ord(i)-96, end=' ',)
val += ord(i)-96
return val
f=open('word_list.txt');
lines = f.readlines();
#개행 제거
lines = list(map(lambda s: s.strip(), lines))
def stack_word(n , is_show):
cnt = 0;
for x in lines:
if cal_word(x) == n:
cnt += 1
if is_show:
print(x)
return cnt
print('Word Cnt 100')
stack_word(100,1)
ps = [0 for i in range(200)]
for n in range(1,200) :
ps[n-1] = stack_word(n,0)
ps[n-1] = 100 * ps[n-1]/ len(lines)
plt.plot(ps)
plt.ylabel('probability(%)')
plt.xlabel('Word cnt')
plt.grid(True)
plt.show()
 

 

 

https://www.youtube.com/watch?v=jWqRqL4_mV0 

 

 

컴퓨터는 바보입니다. 

 

0 1 밖에 몰라요.

원리를 제대로 알려면 완전 기초부터 컴퓨터 구조론까지 배워야 하지만 간단히 설명하면 아래와 같습니다.

 

+ - 연산을 잘하는 매우 빠른 놈이 있는데 이 놈이 2진수밖에 모른다네요.

좀 이용을 해야지 생각합니다.

 

일단 숫자 10을 표현하자니 1010(2) 로 표현이 되는군요.

또 가만히 살펴보니 이 놈의 생각 저장 창고가 8bit (8칸 으로 된 2진수 로 되어 있네요)

 

즉, 저장 창고도 2진수인데 8개가 한 묶음이랍니다. 

2가지 정보를 저장할 수 있는 1bit 가 8 개 묶음, 8bit 를 1Byte 로 부르기로 합니다.

 

다시 돌아가서 1 bit 는 2가지의 경우의 수를 표현이 가능합니다.

0 또는 1 이니깐 2가지 표현이 가능하네요.

그럼 2 bit 는 00(2) 01(2) 10(2) 11(2) 아하 4가지가 표현이 가능하군요.

즉, bit 가 하나씩 증가할 때 마다 2의 승수개수로 표현이 가능한 종류가 늘어납니다.

그럼 1byte = 8 bit 는 2^8 승 즉 256가지의 종류를 표현할 수가 있겠군요.

계속 생각하면 2^10 은 1024byte 가 되고 이는 1KBye 로 부른다네요 .

 

아하 1KByte != 1000Byte 가 아니군요!

 

다시 1 byte 로 돌아가면 , 1byte 방이 옆으로 연결되서 쭉쭉 있는겁니다. 그 방에 호수도 있네요. 101호 102호...

아까도 말했지만 컴퓨터는 단순 연산만 한다는 거지요. 그 메모리 방에서 값을 꺼내서 더하기 빼기 옮기기 만 한다고 생각하시면 되요.

 

그리고 컴퓨터는 어셈블리라는 언어만 이해를 하는 절대 외국어를 안배우는 1개국어 사용자인데

( 어 그럼 C 나 java 는 뭐지?  -> 모든 언어가 결국 어셈블리로 변환되어 실행됩니다)

하나 예를 들면 mov a,b 하면

a 방에 있는 값을 b 방으로 옮겨라 는 뜻입니다. 근데 한번에 안 옮겨저요. 바보라서.

 

위 한줄을 읽고 (1클럭) , 일단 명령을 읽어야지요

그 한줄을 해석하고 (1클럭) , 어떤건지 실행 준비해야지요.

실행하고 (1클럭) ,  a 에 값을 빼와야지요

저장하고(1클럭) , b 에 쑤셔 넣어야지요.

 

흠 그러면 이명령은 CPU 가 1MHz 클럭 로 동작한다면 1 clock 이 1us 니깐 4us 만에 실행이 되겠군요.

아이고 느리네..하나 옮기는데 이정도면...

 

여기서 파이프라인 설명하려다 ..아차 여기는 초보용...이라 생략합니다.

OK . OK 여기까지...

 

정리하면

뭔가 이 바보 상자는 2진수로된 방에서 값을 꺼내서 계산하는데 

명령을 시키는 것은 asm 만 이해를 하고 

이것도 몇단계로 나누어서 실제 실행을 하는군.

 

좋아 숫자는 이해했어. 근데 지금 보는 이글자는 뭐야

hello world 나오는거 해봤는데, 그거는 어떻게 표현하는거지?

 

네 맞습니다. 컴퓨터는 'h' 인지 'e' 인지를 몰라요.  언급한 것처럼 단순히 0-255 개 를 1방안에 표현할 뿐이지요.

 

자 그럼 화면에 나오는 'A'  값은 어떻게 하는거지 , 숫자밖에 안들어가는데 'A' 는 뭔가 다르게 들어가나?

 

컴퓨터는 처음에 말했지만 바보 상자입니다.

 

그래서 정의를 해주었어요. 만약 이 방안에 값이 0x41(hex / 16진수 입니다) 이 값은 65란 값이기도 하고 

2진수로 0100 0001 입니다. 물리적인 셀공간에는 정말 0100 0001 로 저장되어 있겠지요.

그냥 전구 8개가 끄고 켜고 끄고 끄고 끄고 끄고 끄고 켜고 그렇게 있다고 생각하시면 되요.

 

자 그럼 'A' 값은 어떻게 표현하느냐!

 

이 0x41 값이 들어있으면 'A' 로 치자입니다.

 

이게 무슨 뚱딴지 같은 소리냐? 개소리 하지 마세요! 라고 할 수 있는데 이게 다입니다.

 

그럼 65 하고 'A' 하고 어떻게 구분해? 라고 하신다면 

계속 제가 이야기했지요. 컴퓨터는 바보 상자라구요..구분 못합니다. 그냥 저장된 65란 값이지요.

 

문자를 표현하기 위해서 ascii code 표라는 테이블을 만들고 그냥 정의해놓은겁니다.

'B' 는 다행스럽게도 하는 더해서 66 이군요. 고맙게도 순서대로 정의를 해놓았답니다.

 

다시 원래 질문!

65 하고 'A ' 는 컴퓨터 자체는 구분을 못합니다.

다만 사람이 사용하기에 따라서 'A' 로 사용하기도 65 란 값으로 사용하기도 하는겁니다.

 

이상하지요.

 

이상 바보 컴퓨터에 대한 설명이었습니다~~


거의 저의 경험이긴 한데 많은 도움이 되실겁니다.
아시는 분은 당연하지만 초보자들은 아마 헷갈리거나 모르시는 분들이 많을 거예요.

혹시나 제가 실수할 수도 있으니 잘못된 부분있으면 조언도 같이 부탁드려요~~

1. string 에서 마지막은 NULL 이고 실체가 있는 공간이다.
char buf[16];
sprintf(buf,"%s","hello");
여기에서 strlen(buf) 은 5이겠지요. 하지만 buf 를 차지하고 있는 공간은 6바이트입니다.
스트링에서 마지막에 항상 NULL 이 붙지요.

그래서 이런 실수를 합니다.
char buf[4];
char value = 5;
sprintf(buf,"%s","abcd”);
printf(“%d”, value);

이걸하고 나면 아마도 value 값이 0 이 됩니다. 이걸 처음본 뉴비들은 메모리 고장났다면서 컴퓨터에 대한 신뢰가
확 떨어지게 되지요. 하지만 당연한 일이기도 합니다.

제가 프로그램시 제일 좋아하는 격언이지요.

"아니 땐 굴뚝에 연기나랴"

만약, 아니땐 굴뚝에 연기가 난다면, 새벽에 굴뚝안에 맺혀진 이슬로 인해 낮에 온도가 오르면서 수증기로 변해서
불을 때지 않는데도 굴뚝에 연기가 나는 것으로 오인할 수 있는 것처럼 모든 일에는 원인이 확실히 있습니다.


2. memcpy 와 memmove 차이점 사용법 이해
- 메모리 간 복사를 위해서는 memcpy 사용하는데 단 하나의 제약이 있다면 자신으로 복사를 못한다는 겁니다.
더 정확히 말하면 의도치 않은 결과가 나옵니다. 대신에 memmove 를 사용해야지요.
- 아래는 컴파일시 에러가 없지요. 하지만 결과는 예상과 다르게 나옵니다.
char buf[24];
memcpy(buf+4, buf, 16);
--> memmove(buf+4, buf, 16);


- memcpy 구현 소스를 보신다면 왜 잘 못동작할지 이해가 될껍니다. memmove 소스랑 비교해보세요.
void *memcpy (void *dest, const void *src, size_t len)
{
char *d = dest;
const char *s = src;
while (len--)
*d++ = *s++;
return dest;
}
void *memmove (void *dest, const void *src, size_t len)
{
char *d = dest;
const char *s = src;
if (d < s)
while (len--)
*d++ = *s++;
else
{
char *lasts = s + (len-1);
char *lastd = d + (len-1);
while (len--)
*lastd-- = *lasts--;
}
return dest;
}

- 참고로 단순하게 모든 memcpy 대신에 안전하게 mommove 를 사용해도 됩니다만 그렇게 되면 발생하는 문제가 있지요. 이건 숙제!

- 한개더 memcpy 는 자기 자신을 복사못한다고만 알고있으면 안됩니다. 아래를 보세요. 이거는 잘동작해요.
memcpy(buf, buf+4, 16);


3. struct 를 sizeof 시 길이는 내부의 변수의 합과 다르다.
아래 참조.
https://www.geeksforgeeks.org/is-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member/
생각대로 1바이트 단위로 묶는 방법도 있다. 숙제!

4. C 에도 버전이 있고 문법이 다르다. 하지만 매우 큰차이는 없다.
ansi, c89 , c90 , c99, c11
애플의 swift 2,3,4,5 처럼 예전 코드가 컴파일 안되고 그러는 무지막지한 변화는 아니지만 차이는 알고 있어야 한다.
C 도 하위 호환이 안되는 문법을 사용하면 당연히 컴파일 에러가 발생한다.
그래서 이식성을 극도로 추구한다면 ansi 문법으로 작성해야 한다.

5. CPU 의 메모리 저장방식에는 little endian 과 big endian 이 있으며 , 메모리 복사시에 주의하여야 한다.
이것도 정확히 알고 넘어가야 하는 부분입니다. 이게 있는것 조차 모르시는 분들도 있더라구요.

요기까지 하겠습니다~~

 

안녕하세요.
 
이번에는 프로그램관 관련된 용어에 대하여 한번 개념 정리를 해볼까 합니다.
 
작년에 신입사원이 들어오고나서 교육하느라 이리저리 하다보니 나름 노하우가 생긴거 같아서
공유해보면 좋을 거 같네요.
 
가장 기본부터...
프로그램이 뭔지 물어보면 막상 다들 대답을 못합니다.
저의 면접에 빠지지 않는 질문이기도 하고요.
 
1. 프로그램 이란
  - 여기서는  computer programming 을 말합니다. 
     뭐 면접장에서 나올 것 같은 질문인데 아마 회사보다는 공대 면접장에서 교수들이 할 질문 같이 보이는 군요,
    위키에서 보면 아래와 같이 정의하고 있습니다.
 
        컴퓨터 프로그래밍(영어computer programming) 또는 간단히 프로그래밍(programming문화어: 
        프로그램 작성) 혹은 코딩(coding)은 하나 이상의 관련된 추상 알고리즘을 특정한 프로그래밍 언어를 
      이용해 구체적인 컴퓨터 프로그램으로 구현하는 기술을 말한다. 
 
  그럼 이제는 프로그램이 무언지 알기 위하여 "알고리즘" 이 무언지 "프로그래밍 언어" 가 무언지 알아야 겠군요,
 
2. 알고리즘 이란
  - 역시 위키에서 보면
    알고리즘(라틴어독일어: Algorithmus, 영어algorithm 알고리듬[*]IPA[ǽlɡərìðm])은 수학과 컴퓨터 과학
   언어학 또는 관련 분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법을 공식화한 
    형태로 표현한 것을 말한다.
  - 다시 말하면 "문제 해결을 위한 절차,방법을 공식화한 형태로 표현한 것" 이군요.
 
3. 프로그래밍 언어 란?
  - 위키 위키 위키~~~
   프로그래밍 언어는 컴퓨터 시스템을 구동시키는 소프트웨어를 작성하기 위한 형식언어이다. 
   고급 언어일수록 사람이 사용하는 언어에 가깝다.
  - 정리하면 "컴퓨터를 동작시키는 소프트웨어"
 
4. 따라서 프로그램이란
  - 어떤 문제 해결을 위하여 절차,방법을 공식화한 형태를 컴퓨터를 동작시키는 소프트웨어로 구현하는 기술
  - 로 정의할 수 있겠네요.
 - 더 쉬운말로 
    1) 해결하여야 할 문제가 있고
    2) 이를 해결할 공식화된 원칙을 설계하고
    3) 설계된 것을 프로그래밍 언어를 사용하여 구현하여 ,
    4) 문제를 해결하는 방법 또는 기술
 
5. 계속 고찰해보면 
  1) 문제 발생 -> 무언거 해결해야할 문제가 있다는 거지요. 문제가 없다면 해결할 이유도 없음.
  2) 원칙을 설계 
    -> 근데 이게 무언가 규칙성을 찾아서 단순하게 바꾸어야 된다는 겁니다.
    -> 이게 설계인데 이 힘은 공학(물리,화학) 또는 수학을 통하여 길러지는 힘입니다.
    -> 수학이 바로 복잡한 자연현상 등을 숫자를 이용하여 한줄의 수식으로 설명하는 
        놀라운 알고리즘의 변환 과정을 경험하고 배울 수 있습니다.
    -> 수학 못하면 2) 번을 못하고 3)번만 할 줄 알게 됩니다. 주로 코더라고 부르죠.
  3) 프로그램 언어를 사용하여 구현
    -> 수학에서는 숫자를 이용하여 알고리즘을 표현하고
    -> 프로그래밍에서는 프로그램 언어를 사용합니다.
    -> 언어라는 것은 영어를 보면 알듯이 일단 단어암기 및 문장구조 규칙을 배워야 되죠.
    -> 신기한 것은 같은 단어와 문법구조를 가지고 사람을 마음을 감동시키는 대작을 쓰듯이,
        프로그램도 구현하는 사람에 따라 노벨문학상 못지 않은 대작을 구현하시는 분들도 있다는 겁니다.
   -> 저희 같은 범인들은 그냥 대가의 코드를 보면 눈물한번 찔끔하고 열심히 ctrl-c ,v!
 4) 이렇게 해서 문제를 해결해야죠.
 
6. 이게 "프로그래밍"입니다.
 
 이제 여러분들이 어떤 작업을 하고 계시는 지 내가 어디에 위치해 있는지 명확히 깨달으셨으면 합니다.
 
 어느 분야에서건 "용어 정의" 및 "용어 이해" 가 중요합니다.
 다음번엔 CPU,메모리,캐쉬 등으로 차례로 한번 용어에 대하여 적절한 예를 들어가면 설명해보겠습니다.
 
 지루한 내용일 수도 있는데 읽어주셔서 감사드립니다~~
안녕하세요.
 
더 바빠지기 전에 생각나는 부분을 한번 대략 정리해야 될거 같아서 글을 올립니다.
 
보통 프로그램을 잘 짜려면 문법을 알아야 하고
코딩을 잘해야 하고 그러는데 코딩을 잘한다는게 어떤건지 명확히 모를때가 많습니다.
-> 원래는 "공학적으로 사고하는 법" 이 글을 적는다고 하다가 엉뚱한 데로 빠져서 제목을 바꿉니다.
 
그냥 저의 과거를 돌아보면 이랬던 것 같습니다.
 
초보때는 미션이 주어지면 아래 순서로 작업하였습니다.
0. 뭘 해보라고 듣고 온다.
1. 에디터 창을 연다.
2. 무언가 생각나는 데로 코드를 써본다.
3. 뭔가 계속 꼬이고 생각이 안난다.
4. 문법을 몰라 인터넷 뒤져 본다.
5. 어디서 소스 주워서 복붙했는데 컴파일 오류가 나거나 잘 안된다.
6. 투덜거리며 다시 다른 소스 주워온다.
7. 몇번 하다가 안되면 다 지우고 내가 짜고 말지 하며 다시 혼자 짜기 시작한다.
8. 컴파일 오류로 한참 헤멘다.
9. 어찌 컴파일은 되었는데 출력은 원하는 결과가 아니다.
10. 중간마다 디버그 걸어서 어디서 문제인지 확인한다. (뒤부터 앞으로)
11. 당연히 맞다고 생각되었던 부분이 이상하게 오류였다. 스스로 꿀밤한번때리고
12. 이게 돌아깔까 하는 불안감과 누더기 소스를 물어볼데도 없이 혼자 릴리즈한다.
13. 신기하게도 현장에 돌아가는데 며칠 또는 몇달 뒤 큰 사고와 함께 1,번 부터 반복한다.
 
20년이 지나고는 이렇게 바뀌었습니다.
1. 한국말로 미션이 주어진다.
2. 짧은 한국말을 조건이 달린 긴 한국말로 바꾸어 되물어본다.
   - 이러이러해서 이런 조건에 이런 출력이 나오는 기능 말인가요?
3. 처음 미션이 바뀐다. 요청자도 자신의 요구사항을 정확히 모르는 상황이 발생함.
4. 1-2 과정을 반복해서 간단한 요구사항 문서를 만든다.
  - 컨펌하러 보내놓고 설계시작
5. 알고리즘을 말로 풀어서 종이에 써본다.
  - 조건 별로 나누어 본다.
6. UML 미스무리하게 나름데로 다이어그램 그려서 설계해본다.
7. 코딩 시작
9. 종이보고 코딩 , 종이보고 코딩, 한번 쓴 코드는 왠만해서는 다시 지울 필요가 없다.
11. 그동안 짜놓은 라이브러리가 많아서 그냥 복붙이다.
   - CTRL-c,v 만 반복하고 있는 내가 한심해지기 시작한다.
10. 필요함 함수가 생겨서 github 뒤져본다.
11. 제일 많이 사용되는 라이브러리 갖와서 복붙
  - 라이브러리 복사 전 별도 샘플 검증 테스트 (테스트 로직 작성)
12. 완성된 함수를 이용한 테스트 로직 작성하여 검증.
  - 입출력 데이터가 많다면 엑셀이든 db 든 데이터로 정리.
13. 검증된 함수 부분을 메인 함수에 복붙
14. 머신에 다운후 최종 테스트
15. 현장 릴리즈 후 아무 이상 없음에 약간 불안해 하며 무소식이 희소식이라고 생각하고 다음 미션을 한다.
16. 정말 전화 한통없다. 그래도 불안하다.
 
그냥 한번 생각나는데로 적어보았습니다.
ㅎㅎ
 
즐거운 주말 되세요~~
저는 다음주에 빠듯한 해외 출장으로 몸과 정신을 혹사하러 잠시 다녀오겠습니다. T.T
안녕하세요.
 
이제 점점 바닥이 드러나는 거 같네요. 
이 시리즈는 여기까지 입니다. ㅎㅎ
 
21. 컴파일 warning 탐구
  - 병적으로 warning 에 대해서 집착하지 않아도 되나, 이게 무슨 뜻인지는 
    조목조목 알고 있어야 함.     
  - warning 에 집착하는 것도 코딩 시간이 충분하다면 바람직.
 

22. Stackoverflow 정기 탐독

 - 하고 싶지 않아도 다들 자동적으로 하고 계실 껍니다.
 
23. o 과 0 , 1 과 l 이 구분되는 폰트 사용.
 
24. 코드 에디터 북마크 적극 활용
  - VScode 니 메모장이니 아무 관계없음. 자신에게 제일 잘 맞는 걸로.
  - 하지만 계속 좋은 게 나오니 요즘 분위기에 맞게 한번쯤 다른 걸 시도해 보는 것도 좋음
  - 저는 ultraeditor 15년 광신도였으나 요즘엔 eclipse, vscode, notepad++ 아무거나 
    손에 잡히는데로 쓰고 있습니다.
 
25. 음주 및 분쟁 후 코딩 금지.
  - 적절한 신체 활동과 깨끗한 멘탈 확보를 위한 선행과제 수행
  - 프로그램을 잘 짜기 위하여 헬스장에 다니는 사람은 없다고 생각되지만 저는 그 이유로 다닙니다 T.T
    나의 육체적 피곤함으로 인하여 고객의 프로그램에 누를 끼쳐서는 안된다는 말도 안되는 논리 ㅎㅎㅎ
 
26. 시뮬레이터는 남이 짜주는게 아니라 나의 의무이다!
  - 나만의 시뮬레이터 템플릿을 만들자. RS-232 든 랜이든 소스는 널려있음.
  - 간단한 시뮬레이터를 위한 윈도우 프로그래밍은 나의 몫! 남탓하지 말기.
 
27. 다른 사람에게 code review 요청. 선배 없으면 신입한테라도 검증
  - 아기라도 배울게 있음.
 
28. 겸손한 마음
  - 나는 바보다.
  - 내가 짠 코드는 무조건 틀렸다. 테스트 결과를 믿어라.
  - 논리적 관점에서는 컴퓨터가 나보다 더 위대하다.
  - 아니 땐 굴뚝에 연기나랴. 무조건 내 실수다!
 
29. 코딩시 생각이 잘 안날때는 러버덕코딩 기법
   - 농담아님. 매우 효과적임.
 
 
30. 버그 없는 코드는 절대 없다.
  - 정말 절대로! 입력과 출력에 대한 정의를 명확히 해야 한다.
 
정신없는 글 읽느라 수고 많으셨습니다 ^^
이어서 작성합니다.
 
11. switch 내부의 인수는 enum 으로!
switch (열거형변수){case 열거형값: 실행할코드; break;}
 
가독성이 높아집니다.
   case 0: -: 이러면 0 이 뭘 뜻하는지 또 살펴봐야지요.
 
11번을 마스터 하면 초보에서 레벨업하시는 겁니다.
 
12. 전역변수는 되도록 struct 안에
  -무조건 전역은 struct 안에 성질별로 그룹을 지으세요.
   전역변수의 100만개의 저주에서 탈출 가능합니다.
   int g_tmp; -> 이게 뭐하는 변수지? 글로벌변수이긴한데..
   int g_conv; -> 이게 뭐하는 변수지? 글로벌변수이긴한데..
   char g_terminal_increase;  -> 이게 뭐하는 변수지? 글로벌변수이긴한데..
 
   struct g_st_comm{
      int tmp; // 그냥 임시 변수지롱~~~
      int conv;
      char terminal_increase;
    } ;
  struct g_st_comm g_ST_COMM;
  g_ST_COMM.tmp; -> 뭔지는 모르겠지만 통신관련 글로벌 변수인거 같네. g_st_comm 구조체 가볼까?
  
13. 변수가 많으면 struct 안에 또 struct 로 변수 지정
   - 좀더 구조화 됩니다.
   struct st_comm{
      int tmp; // 그냥 임시 변수 메롱~~~
      int conv;
     strcut st_tmp {
      char terminal_increase;
      int tmp;
} tmp;
    } ;
   - 소속이 생기는 거죠. 엄마 아빠 난 누구의 자식이다! 덜 헷갈립니다. 이름 앞에 성이 붙는 것처럼.
 
14.  작은 함수 이름은 동사 다음에 명사 - 어느 방법이던 한쪽 방향으로 일관적으로
   int GetStatus(void);
   int Get_Status(void);
   int get_status(void);
 
15.  큰 그룹  함수 이름은 소속 뒤에 동사 명사
   void CommGetStatus(void);
   void CommInit(void);
   void CommSetVariable(void);
 
16. 쉬어가는 페이지 
   - 내 프로그램은 절대 보안을 위하여 외국인에게 해석될 수 없다! 세종대왕 만세!
   - 내 프로그램은 절대 국내용이다. 글로벌화 될 수 없다!
      어느 외국인이 내 코드를 수정하고자 하는가! 나는 결연히 반대한다.
    void ChoGiHwa(void); // 초기화함수
    int tae_i_ble: // 테이블
    char Imsisayong; // 임시사용
 
17. 뭔가 내용이  길어지면 함수로 
     안되면 { } 라도.
     기능을 주석으로 구분하지 마시고 함수로 만들던가 아니면 
 
  // 무슨 무슨 기능 
  {
    func1():
    func2():
   }
 
    func3():
    func4():
 
 // 5,6함수 호출해서 둘이서 뭔가 불꽃 튀기는 동작을 하거든요. 그래서 친구라서 보기 쉬우라고 한번 
 //  묶어주었어요.  이 둘사이에 절대 뭔가 끼워 넣으시면 큰일나요. 요거는 제발 분리하지 마세요~~~
  // 
   {
     func5():
     func6():
   }
      
18. crtl-s 는 나도 모르게 (이건 무의식의 세계)
 
19. 작명이 살길 영어공부 열심히. 자신만의 일관된 원칙
    do_chunchunhi(); // 천천히 동작 T.T slow 가 생각안나도 제발 이러시면.
    g_u8_comm_init_status: // 흠... 글로벌변수에 8비트 변수고 통신 초기화 상태 변수이군. 하하하
   
20. 레벨이 다른 두사람끼리 짝프로그래밍.
   - 레벨이 같거나 직급이 같으면 서로 멱살잡음. 개성은 소중하니깐요. ㅎㅎ
   - 해결안되는 버그가 있으면 짝 프로그래밍이 효과적입니다.
     후배는  설명하며코딩하고, 선배는 자세히 듣고.. (난 뒤 손가락에 회초리를 찰삭!)

 

 

안녕하세요.

사업으로 인해 2019년 상반기에 많이 바쁘기만 하여서 쓸만한 내용을 공유해야 되는데 그냥 미루고 있었네요.
어떤분이 제글을 기다린다고 쪽지도 주시고 해서 다시 한번 힘을 내보고자 합니다.
 
나름 제가 생각하는 저의 강점은 아래라고 생각하고 있습니다.
 
20년동안 검증된 결과이니 그냥 믿으셔도 될거 같습니다. ㅎㅎ
 
1. 남보다 2-3배 빨리
 
2. 남보다 2-3배 에러 없이
 
3. 코딩 실수로 인한 엄청난 결과(?) 압박감 속에 다운로드 횟수 조차 제약된,
   한방에 모든 기능이 성공해야 되는 상황 속에 긴장 코딩.
  ( 한번의 실수로 모든게 끝나는 인공위성 또는 인사사고 발생 가능성이 있는 장비에 
    비할 바는 아닙니다만 그래도 조금은 열악한 환경)
 
 
마침 이번에 인턴 사원이 들어와서 이야기했던 부분을 공유합니다.
코딩 하는 순서를 한번만 봐도 실력을 검증할 수 있는 하나의 방법이기도 합니다.
 
이유를 설명하려면 너무 길어져서 스스로 이해해 보시려고 하면 좋을거 같습니다.
해당 방법은 스타일과 습관이니 그렇다고 너무 집착 안해셔도 됩니다.
의도만 아시면 되요.
 
1. if 니 for 문 작성시 { 를 열면 자동으로 } 닫고 시작해라.
  요즘 코드 툴이 좋아서 이런거는 자동으로 해주는데 , notepad++ 를 쓰시거나 
  자동 코드 생성툴이 아니신 분들은 버릇을 들이셔야 합니다.
   왜 이게 좋은지는 다들 아실테니 설명하지 않겠습니다. 
 
  좋은 예)
    if(1) {
     }
  쓰고 다음에 안에 내용을 적는다.
    if(1) {
      func();
     }
 
 나쁜 예)
    if(1) {
     func():
  쓰고 다음에 } 를 한다.
    if(1) {
      func();
     }
 
 
2. 1번과 유사한건데 open 하면 바로 아래에서 close 함수를 바로 호출하고 그 중간에 코딩해라.
   fopen();
   쓰고
   바로 아래에
   fopen();
   fclose();
   호출 한뒤
   fopen();
   fread();
   fclose();
   같이 중간에 필요한 코드를 끼워 넣으라 .입니다.
   이 역시 나중에 디버깅 시간을 획기적으로 줄여줍니다.
    new , delete 마찬가지 입니다.
   그냥 습관화.
   
 
 
3. 역시 1번과 유사 (이 순서로 코딩)
   func( 하면 다음에 바로 닫고 시작
   func();
   fucc(a,b,c);
 
4. 곱하기 나누기 보다는 더하기 빼기로 더하기 빼기 보다는 더하기로 변환.
   b = a/2;
  보다는 b = a>>1;
  
  if( a -b > 1) 보다는 if( a > 1+ b )
  - 보통 a 는 b 보다 크다고 가정하고 코딩합니다만 세상일은 내 맘대로 돌아가지가 않지요.
    이런 경우입니다.
    unsigned int a,b;
    a = 2;  b= 3;
    if( a -b > 1) 와 if( a > 1 + b) 결과가 다릅니다. 로직상으로 같아 보이는데 말이죠.
 
 
5. if 문안에서 == 비교시 상수는 왼쪽
   
 if( i == 0  )보다는    if( 0 == i  )
 - 하지만 가독성 측면에서 왼쪽을 선호합니다만 초보는 오른쪽이 컴파일 실수를 줄입니다.
   == 을 = 로 쓰는 실수를 많이하거든요.
 
6. if 문안에서 == 비교시 변수는 항상 타입 캐스팅
 int i =1 ;
 float j = 1;
 if( i == j) 보다는   if( (int)i == (int)j)
  - 일반적으로 문제가 없긴한데 오래된(?) 일부 컴파일러는 이상 동작을 보이기도 합니다.
 
 
7. if 문 반드시 else 첨부 또는 바로위 변수 초기화
   
  if(xxx) {
    a = 0;
  } // else 절대 빼지 말것
  else  {
    a = 1;
  }
 
  또는 
  a = 1;
  if(xxx) {
    a = 0;
  } 
  
 
8. if 보다는 switch
  if(xxx) {
    func1():
  }
  else if(xxx) {
    func2():
  }
  else if(xxx) {
    func3():
  } // else 빼지 말것 설사 아무것도 안해도
  else {
  func4():
 }
 보다는 
  switch(xxx) {
    case 0:
      func1();
       break;
    case 1:
      func2();
       break;
    case 3:
      func2();
       break;
   default: //  default  내에 함수 안써도 무조건 같이 사용. 다음에 쓸일이 생김
      func1();
       break;
  }
 
 
9. switch 내에 코딩이 길어질대는 무조건 함수로 정리하여 한눈에 switch 마지막이 보일 수 있도록 정리
  
    switch(xxx) {
    case 0:
      // 이부분이 길어져서 한페이지 넘어가면 곤란함.
      // 가독성 저하
      // 함수로 변환하여 처리 요
       break;
    case 1:
      func2();
       break;
    case 3:
      func2();
       break;
   default: //  default  내에 함수 안써도 무조건 같이 사용. 다음에 쓸일이 생김
      func1();
       break;
  }
 
   
10. 한 파일을 너무 크게 만들지 말것
    method.c 로 너무 길어지만
    귀찮아도 method2.c 로 파일 자체를 분리
   단, 기능 자체는 성질이 다른 것으로 정확하게 분리 필요.
    같은 기능 함수모음을 2개 파일로 분류할 필요는 없음.
 
11. 소스 파일이 많아지면 디렉토리 관리 필요
    ./group1
    ./group2
    ./lcd
    ./file
    ./data
    main.c
    
단순하게 생각나는 데로만 정리하였습니다.
 
도움이 되셨으면 합니다.

+ Recent posts