소프트웨어는 어떻게 만들죠..? (나도 잘 모름)

이준석·2021년 3월 16일
2

글길

목록 보기
3/7
post-thumbnail

사진 출처 : 구글 (pinterest)

node.js 로 언제쯤 다시 돌아갈 수 있을까...😅😅

오늘 글로 남기는 주제는 갑자기 생각난 주제다.

대학시절 이야기

사실 아직도 대학생임 ㅎㅎ
나 5학년이니까 4학년 너네들 내 말 잘들어라.

내가 다니는 학과엔 타과 학생들도 알 정도로 유명한 교수님이 계신다.
과제는 물론, 수업 난이도도 빡셀 뿐더러 화도 엄청 내신다.

그리고 교수님께서는 커뮤니티를 굉장히 강조하셔서 코로나 이전엔 방학때마다 학생들을 불러서 남산을 올라가시고는 고기를 사주셨다.

그때 교수님과 술자리를 가지게 되었는데, 놀라웠던건 내 이름을 알고 계셨다.

별로 특출난 학생도 아니었고, 타과에서 전과한 학생이었다.

그러고는 왜 우리를 그렇게 혼내고 힘들게 가르치시는지에 대해서 설명을 해주셨는데, 요즘 젊은 친구들은(라떼 아니심..ㅎㅎ) 스트레스 내성이 너무나 없다는 것이었다.

그래서 스트레스 내성을 길러주기 위해 일부로 압박하고 기한 내에는 아무리 생각해도 할 수 없는 과제를 내주시는 것이었다. 그렇게 4년을 공부하고 나니 회사에 와서도 업무적으로 스트레스를 받은 적이 진짜 거의 없다.

그래서 대학 다니는동안 등록금은 비쌌지만 아깝지는 않았다. 그만큼 많이 배웠고 혼자서 살아갈 수 있도록 길을 만들어 주셨기 때문이다.

그리고는 수업때 배운 내용을 공유하자면 다음과 같다.

소프트웨어는 "생각"이다.

소프트웨어는 사람의 생각과 똑같다.
따라서 모호성을 가질 수 밖에 없다.

모호성을 나타내는 대표적인 단어들을 몇개 추려보면 다음과 같다.
빠르게, 안정적으로, 편하게, 신속하게 등이 있다.

처음에 소프트웨어 개발을 들어가기 전에 고객이 RFP를 제공해준다. 근데 고객이 컴퓨터공학 전공이어서 코딩에 대해 무척 잘 알고 있으면 조금 나을지도 모른다.

하지만 대부분의 고객들은 코딩에 대해 잘 모른다. 따라서 RFP를 보면

데이터를 가져올 때 "신속하게" 해주세요.

라는 문구와 같이 적혀있다. 여기서 신속하게 라는 단어는 굉장히 모호하다. 나는 3초까지는 신속하다고 느낄 수 있지만 다른 사람은 느린거라고 생각할 수 있다.

따라서 이러한 모호성을 제거하기 위해서 우리는 분석 을 한다.

모호성을 제거하자! - "분석"하기

분석(分石)에서의 분을 보면 나눌 분이다.
따라서 주어진 데이터를 나눠서 모호성을 제거하는 것을 분석이라고 한다.

분석 할 때 가장 많이 사용하는 두가지 방식이 있다.

MECE (Mutually Exclusive Collectively Exhaustive)

겹치지 않으면서 빠짐없이 나눈 것

MECE 는 두가지로 나눌 수 있다.

1. ME (Mutually Exclusive)

  • 주어진 데이터를 나눴을 때, 교집합이 없다.

2. CE (Collectively Exclusive)

  • 합치면 전체집합이 된다.

간단하게 생각하면 스무고개를 생각하면 된다. 우리가 스무고개를 하기 위해서 질문을 던질 때 겹치게 물어보지 않는다. 하지만 그 질문들을 전부 합쳤을 때는 답에 관한 전체 내용이 된다.

우리는 이렇게 어릴 때 부터 일상생활에서 게임을 통해 MECE 분석 기법을 이용하고 있었다.(조기교육 ㄷㄷ...)

Orthogonal

직교라는 뜻으로 수학적으로 "각 요소들이 서로 독립적임을 나타내는 용어"다.

우선 모든 데이터를 직교(90도)로 나누게 되면 데이터가 서로 영향을 미치지 않는다. 그 예로 함수 그래프 y=5 이면 x 가 무슨 값이든 y 축에 영향을 받지 않는다.
.
.
.

이런 분석 기법들이 있다는 것 정도만 알고가자. 좀 더 궁금하면 구글링 해보면 나오기는 하지만 읽어봐도 무슨말인지 잘 모르겠다..

따라서 분석을 끝마치게 되면 모호성이 전부 제거되어야 한다. 모호성이 제거되었기 때문에 이제 고객이 생각하는 신속하게 라는 의미와 개발자가 생각하는 신속하게 라는 의미가 동일해 진 것을 의미한다.

분석이 완료된 다음 "설계"를 하자.

모호성이 제거된 데이터를 바탕으로 소프트웨어 설계를 진행하자.

드디어 모호성이 제거되었기 때문에 분석한 데이터를 바탕으로 소프트웨어 구현을 위한 설계가 가능해졌다.

설계의 핵심은 추상화 (Abstract)

설계를 할 때 중요한 부분은 추상화 Abstract 이다. 추상화를 잘 해내면 해낼수록 좋은 품질의 코드가 나올 수 있다.

추상화라는 것도 어려운 내용은 아니다.

출처 : 텐바이텐

위의 이미지를 보고 떠오르는 동물을 생각해보자.

  • 다들 호랑이 라고 대답할 것이다.

그럼 위의 이미지가 실제 호랑이여서 호랑이라고 생각한 것인가?

  • 그렇지 않다. 위의 이미지는 인형이다.

그럼 우리는 왜 이미지를 보고 호랑이라고 생각했는가?

  • 나는 검은색 줄무늬털 색, 사족보행인 동물들로 비추었을 때와 호랑이를 직접 본 내 경험에서 호랑이라고 생각한 것이다. (검은 줄무늬를 가진 얼룩말을 호랑이라고 하지 않는 이유는 내가 실제 호랑이를 보았기 때문에 검은색 줄무늬가지고는 얼룩말이라고 하지 않는다.)

여기서 마지막 내용을 보면 "검은색 줄무늬, 털 색, 사족보행인 동물" 이런 단어들을 통해 호랑이를 머릿속에 추상화 한 것이다. 만약 추상화를 하지 않고 호랑이에 대한 정보를 넣는다면 호랑이의 몸 길이, 몸무게, 걷는 속도, 걷는 보폭, 눈매 등 넣어야 할 데이터가 너무 많다.

그렇다고 동물의 종이 적은 것도 아니고 기억해야 할 동물의 수는 넘쳐 흐른다. 이런 데이터가 전부 뇌로 들어간다면 아마 감당하지 못하고 터져버릴지도 모른다. 따라서 인간은 뇌를 효율적으로 사용하기 위해서 데이터를 추상화하는 것이고 코딩도 리소스를 효율적으로 사용하기 위해서 추상화를 진행한다.

Java 에는 Abstract 메서드를 이용해서 추상화를 할 수 있고, 비슷한 선언 방식으로는 Interface 가 있다. 따라서 한 번 큰 틀을 정의해두고, 다른 메서드에 상속해서 구체적으로 구현하는 방식을 사용한다.
.
.
.
여기까지 소프트웨어 개발 주기인 분석, 설계, 구현, 테스트 중 2가지가 끝났다.
추가적으로 빼먹은 부분이나 잘못된 부분은 수정할 예정이다.

혹시나 해당 글을 읽고 지적해줄 사항이 있다면 언제든지 지적해주시면 수정하고, 배우겠습니다.

다음엔 구현, 테스트에 대해서 다룰 내용이 생각나면 작성하고 조금씩 소프트웨어 지식을 공유하도록 하겠습니다.

두서 없는 글 읽어주셔서 감사합니다. 꾸벅🙇‍♂️

profile
호주 워홀중 https://blog.naver.com/wnstjrl96

4개의 댓글

comment-user-thumbnail
2021년 3월 17일

모호성 때문에 기획과 개발 사이에서 의견충돌이 자주 일어나는데 많이 공감되네요

1개의 답글
comment-user-thumbnail
2021년 3월 23일

소프트웨어는 생각이다..!! 이 말보다 더 쉽게 설명할 수는 없을 듯 하네요

1개의 답글