2009년 12월 31일 목요일

프로그래머의 생산성

IBM 소프트웨어 개발팀에서 조사한 월간 1인당 작성한 코드 수
 
  • 1     M/M의 경우  439라인
  • 10   M/M의 경우  220라인
  • 100  M/M의 경우  110라인
  • 1000M/M의 경우  55라인
 사람이 많이 투입된 큰프로젝트일 수록 개발자간의 의사소통경로가 많아져서 일이 지연된다는 의미. 이를 해결하기 위해서는 작은 팀 단위로 나누어야 한다.
 임베디드 시스템에 적용할때는 하나의 고성능 CPU에 온갖 프로그램을 전부 올리려 하지 말고, 작은 CPU로 분할된 개별 시스템을 각 소규모 팀에 할당해서 개발하라. 칩은 싸고 인건비는 비싸다.


  KLOC(Kilo Line of Code)로 구분된 프로젝트의 규모에 따라 숙련된 프로그래머(Best programmer)와 비숙련된 프로그래머의 생산성을 비교한 결과. 큰 프로젝트 일수록 수퍼스타들을 잠식해버린다. 끝없이 이어지는 회의와 메모들이 그들의 창조성을 위협한다.

프로그램의 크기(KLOC)
숙련된  프로그래머(월/KLOC)
비숙련된 프로그래머(월/KLOC)
1
1
6
8
2.5
7
64
6.5
11
512
17.5
21
2048
30
32

결론은 똑똑한 개발자들에게 작고 아주 중요한 일을 주라는 것.



(출처: The Art of Designing Embedded Systems 2nd Ed.)

2009년 2월 6일 금요일

컴퓨터 공학자의 미래

Computer Science Education: Where Are the Software Engineers of Tomorrow?

컴퓨터 공학의 미래가 어둡다라는 요지의 글.

배우기 쉬운 언어(JAVA) 사용 및 라이브러리 패키지를 사용, 그래픽 인터페이스에 길들여진 프로그래머들이 늘고 있는 것이 앞으로 문제가 될 것이다. 이러한 문제점을 인식하게 된 몇몇 대학에서는 JAVA를 수업용 언어로 사용하는 것을 제고하고 있다.


제대로 된 프로그래머는 언어에 구애받지 않는다.

ㅁ C언어가 중요한 이유 : C언어는 로우레벨 언어로써 모두가 알아야만 한다. C 언어는 어셈블리와 비슷하며, 하드웨어와 소프트웨어간의 관계를 명확히 이해하는 데 도움을 준다. 구문에 소요되는 자원비용이 명확해서 성능분석하기도 쉽다.

ㅁ C++이 중요한 이유 : C++은 C언어에 현대적인 소프트웨어 공학 개념을 추가했다(클래스와 네임스페이스의 캡슐화, protected 및 private 조작을 통한 데이터 은닉, 가상 method 및 클래스 상속을 통한 확장 등) 그리고 생성자와 파괴자를 사용한 메모리 관리방법을 적용했다.

ㅁ LISP가 중요한 이유 : LISP에서 작성되는 프로그램은 추상적인 문법을 사용하고, internal representation이라고 불리는 이 방법은 대부분의 컴파일러에서 구문해석 및 코드생성을 위해 사용하는 것이다. 따라서 LISP를 이해하는 것은 언어처리에 관련된 소프트웨어들이 어떻게 동작하는 지를 이해할 수 있는 탄탄한 기반이 된다.

ㅁ JAVA가 중요한 이유 : 첫 언어로써의 몇가지 단점에도 불구하고 자바는 컴퓨터 공학 교육에 있어 중요하다. 첫째는 쓰레드를 사용한 병렬처리에 대한 이해를 증진시킬 수 있고, 둘째는 동적으로 변화하는 환경에서 프로그램의 동작이 결정되어야 하고, 프로그램의 상태를 파악할 수 있도록 만들어 져야한다는 것을 알게 해준다.

using Excel

[엑셀 프로그램 열어서 값 넣기]

>>> import win32com.client
>>> xl = win32com.client.Dispatch("Excel.Application")
>>> xl.Visible = True
>>> xl.Workbooks.Add()

>>> exl = xl.ActiveWorkbook.ActiveSheet

>>> exl.Cells(1,1).Value = 'abc'


[엑셀의 레인지 설정]

>>> import win32com.client
>>> xl = win32com.client.Dispatch("Excel.Application")
>>> exl = xl.ActiveWorkbook.ActiveSheet

>>> print exl.Range("B2:D2")
((1.0, 2.0, 3.0),)
>>> print exl.Range("B2:F3")
((1.0, 2.0, 3.0, 4.0, 5.0), (u'a', u'b', u'c', u'd', u'e'))
>>> print exl.Range(exl.cells(2,2), exl.cells(2,5))
((1.0, 2.0, 3.0, 4.0),)


[셀 병합 하기]

>>> print exl.Range(exl.cells(4,2), exl.cells(4,5)).Merge()

wxPython

Best GUI toolkit for Python

http://www.wxpython.org/

파이썬에서 시리얼 통신하기

윈도환경에서 파이썬으로 시리얼 통신하기

필요한 것들:

1. python


2. python serial extension(pyserial) : http://sourceforge.net/projects/pyserial/


3. python win32 extension : http://starship.python.net/crew/mhammond/win32/


* 윈도환경에서 파이썬 프로그램 참고 서적: Python Programming On Win32(O'reilly)

[Open port 0 at "9600,8,N,1", no timeout]

>>> import serial
>>> ser = serial.Serial(0) # open first serial port
>>> print ser.portstr # check which port was really used
>>> ser.write("hello") # write a string
>>> ser.close() # close port

[Open named port at "19200,8,N,1", 1s timeout]

>>> ser = serial.Serial('com5', 19200, timeout=1)
>>> x = ser.read() # read one byte
>>> s = ser.read(10) # read up to ten bytes (timeout)
>>> line = ser.readline() # read a '\n' terminated line
>>> ser.close()