본문 바로가기

개발 Note/it 이야기

소프트웨어, 공학일까? - 재사용성

반응형

소프트웨어 개발 업을 하다보니,  주변에서 좀 경험이 있든 없든 간에 많은 개발자분들로부터 "S/W는 재사용하기 힘들다" 이 말을 정말 많이 듣는 것 같습니다.

왜 S/W는 재사용이 어려울까? 이런 저런 생각들을 하다보니 S/W 공학과 재사용이라는 용어와 그 내용에 대해서 다시한번 고민해보게 되었습니다.
흔히들 공학이라고 불리는 하드웨어적인 부분들은, 아날로그적인 부분들을 수학적 접근에 의해 원리와 개념을 설명하는 것입니다.

또 내구도등 기타 여러가지 요인에 의해  매번 측정마다 약간씩의 오차가 발생하게 됩니다.그래서 이런 오차를 줄이고, 정확한 측정을 위한 알고리즘을 찾고 적용하고 보정하는 것에 대한 것입니다. 

그런데, 이런 관점에서 생각해보면 S/W 는 사실  공학적 접근이 필요하다고 말에 어폐가 있어보입니다.

S/W는 1+1=2 가 오차 없이 항상 나오고 CD를 백만번 카피해도 CD의 물리적인 오류가 없는한은 똑같은 DATA를 백만번 카피 할수 있습니다.
전자공학이나 생명공학 기계공학에서는 있을 수 없는 일입니다.

S/W는 기대한 만큼 완벽하게 결과를 내 놓기 때문에 측정이나 측정기의 검증등이 필요 없을 수 밖에 없습니다.

즉, S/W는 Code로 이뤄져있고 Digital Data로 만들어지며 , 오차가 존재하지 않기 때문입니다.


이러한 특성을 보면, 공학 보다는 수학에 가깝게 느껴집니다.

불변의 진리, 논리적 완벽성, 무한, 항상성(같은 결과) 등등 의 특성들을 보면 말이죠.

그리고 실제로 수학적 증명에서 부터 시작한것이구요.

 

이렇게 따져 보면 어떤 다른 분야보다도 S/W는 제 사용성이 높은 것이 맞습니다.

카피 해서 사용하면 되는 것이니까요.

 

그러면 왜 ? 유독 코드의 재사용성에 대한 얘기가 많이 나올까요?

좀 큰 S/W를 개발하다보면 항상 나오는 이야기인데 "S/W 재사용" 얘기를 빼 놓을 수 없습니다.

종종 H/W 부품들과 빗대어 표현할때도 있는데요.

"H/W는 블럭을 잘 디자인하고 표준화 해서 잘 쓰고 있는데 왜? S/W는 그렇게 못하냐"

"부품 처럼 갈아 끼울수 있으면 좋을텐데" 이런식의 표현이죠.

참 이상하죠.. Code는 수학과 비슷해서 한번 완성이 되고 나면 항상 같은 결과를 내기 때문에 불량도 없고, 고칠 필요도 없는데 말이죠.

과연 무엇과 비교해서 재 사용성이 낮은 것일까요?


으흐흐.. 대부분 사람들이 이렇게 얘기하죠..
"하면 좋죠... 근데 S/W는 그렇게 하기 어렵습니다." 요렇게 대답하죠... 

 


왜 S/W는 어려울까요?

H/W와 S/W의 가장 큰 차이부터 얘기를 해야 합니다.
H/W는 물질적인 것이고 S/W는 논리적인 것입니다.

물질 적인것은 분명 크기나 무게 등 물리적인 한계가 있습니다.  또 하나를 만들어 내기 위해서는 자원이 필요합니다.
또 자원을 조립하는 기계가 필요합니다. 또 대량 생산을 위해서는 공장이 필요합니다.
이렇기 때문에 이 비용을 최소화 하기 위해 표준화하는 것입니다. 만약 표준화가 안되면 대량 생산이 안되겠죠...
이렇게 표준화된 부품들 때문에 제조회사들에서 덕을 좀 보긴 합니다.
핸드폰에서 사용하던 LCD칩을 가지고 D-TV를 만들때도 사용 하기도 하죠. 

(그렇지만 조금만 생각해보면, 표준화된 칩을 사용하더라도 검증과 테스트에 많은 비용이 들어가죠, 오차, 오류 등등)
근데 이걸 보고 S/W도 이렇게 하라는 것인데요.

이런 관점에서는 소프트웨어는 표준화가 필요 없다는 것입니다.
소프트웨어는 이미 완성되는 순간 대량생산이 가능합니다. 어떻게? copy 명령어로 파일들 주루룩 카피하면 땡인것이죠..
근데 무슨 표준화가 필요하고 규격화할 필요가 있냔 것이죠.. 넌센스죠.

 

그런데 왜 업계에서 소프트웨어 재사용성이 어렵다고 하는지 이해하기 위해서는 먼저 소프트웨어를 어떻게 재사용하기를 기대하는지 먼저 정의할 필요가 있어보입니다.

- 구구단 어플리케이션의 계산 모듈을 스프레드쉬트 개발할때 사용하고 싶다.

- 구구단 어플리케이션을 다른 OS에서 사용하고 싶다.

- 구구단 어플리케이션의 GUI를 다른 어플리케이션에서 사용하고 싶다.

 

S/W의 재사용성에 대한 정의도 명확히 할  필요도 있습니다.

 

S/W의 재 사용성은 H/W와는 관점이 완전 다른것입니다.

한번 설계된 Code를 수정없이 다른 S/W(application이나 platform 등등) 에서 사용할수 있는가에 대한 것입니다.

소스 코드나 binary data는 다른 library를 사용하거나 제컴파일해서 사용하는 등 , 이식 작업때 환경의 변화가 발생하기 마련입니다.
Windows에서 사용하던 code를 Linux에서 사용한다거나, CPU가 변경된다거나, H/W가 변경되는 상황들이 발생하는 것이죠. 


또, 하나의 어플리케이션 내에서 여러 모듈들이 공동으로 사용하는 것을 공통된(Common) 한 모듈로 개발하는 것이 이 S/W의 표준화 목적이 될 수 있습니다.

 

하지만, 여기에 가장 큰 문제는 S/W는 너무 유연한 나머지 항상 변화하고 발전합니다. 

아무리 잘 만들어진 모듈이라 할지라도 몇년 지나면 기술에 뒤쳐지고 기능에서 뒤쳐지게 됩니다. 

가만히 있으면 아무도 사용하지 않는 모듈이 되는거죠. 그래서 늘 발전시키고 현재 필요한 기능들을 추가하고 보강하고 또는 삭제 하죠.

 

이렇게 변화하는 소프트웨어를 재사용성이라는 틀로 고정시키기에는 무리가 있을 것입니다.

 

어려운일이죠. 틀에 고정시키면 경쟁력을 잃고 자유롭게 하면 재사용이 어렵고 말이죠.

하지만 저는 Code의 제사용이라는 부분에 대해서는 아직도 많은 시도를 해볼 여지가 있다고 생각합니다.

 

제가 생각하는 미래의 소프트웨어 개발

(2024년 추가)

 

코드 재사용

코드의 재사용은 이제 더이상 문제가 안될것입니다. 인터페이스와 목적만 잘 기술 하면 AI가 코드를 작성해주니까요.

코딩

더이상 개발자가 텍스트 에디터를 열어서 코딩하지 않을것입니다.

소프트웨어 구성 모듈들을 그리고 나면 코드가 생성될 것입니다.

전체 아키텍쳐를 그릴 수 있는 사람이 중요해 지겠죠.

이 아키텍쳐를 그리는 것 조차 AI와 대화하면서 이뤄질 것입니다.

 

바로 앞까지 왔습니다.

 

#해피코딩